2021-11-30 11:45:40 +00:00
|
|
|
package morph
|
2021-11-30 11:57:58 +00:00
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
2022-08-29 19:31:32 +00:00
|
|
|
"math/big"
|
2021-11-30 11:57:58 +00:00
|
|
|
"strconv"
|
|
|
|
|
|
|
|
"github.com/nspcc-dev/neo-go/cli/input"
|
|
|
|
"github.com/nspcc-dev/neo-go/pkg/core/transaction"
|
|
|
|
"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
|
|
|
|
"github.com/nspcc-dev/neo-go/pkg/encoding/address"
|
2022-08-29 19:31:32 +00:00
|
|
|
"github.com/nspcc-dev/neo-go/pkg/rpcclient/actor"
|
2022-11-23 14:44:03 +00:00
|
|
|
"github.com/nspcc-dev/neo-go/pkg/rpcclient/gas"
|
2022-08-29 19:31:32 +00:00
|
|
|
"github.com/nspcc-dev/neo-go/pkg/rpcclient/nep17"
|
2022-11-23 14:44:03 +00:00
|
|
|
"github.com/nspcc-dev/neo-go/pkg/rpcclient/notary"
|
2021-11-30 11:57:58 +00:00
|
|
|
"github.com/nspcc-dev/neo-go/pkg/wallet"
|
|
|
|
"github.com/spf13/cobra"
|
|
|
|
"github.com/spf13/viper"
|
|
|
|
)
|
|
|
|
|
|
|
|
// defaultNotaryDepositLifetime is an amount of blocks notary deposit stays valid.
|
|
|
|
// https://github.com/nspcc-dev/neo-go/blob/master/pkg/core/native/notary.go#L48
|
|
|
|
const defaultNotaryDepositLifetime = 5760
|
|
|
|
|
|
|
|
func depositNotary(cmd *cobra.Command, _ []string) error {
|
|
|
|
p, err := cmd.Flags().GetString(storageWalletFlag)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
} else if p == "" {
|
|
|
|
return fmt.Errorf("missing wallet path (use '--%s <out.json>')", storageWalletFlag)
|
|
|
|
}
|
|
|
|
|
|
|
|
w, err := wallet.NewWalletFromFile(p)
|
|
|
|
if err != nil {
|
|
|
|
return fmt.Errorf("can't open wallet: %v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
accHash := w.GetChangeAddress()
|
|
|
|
if addr, err := cmd.Flags().GetString(walletAccountFlag); err == nil {
|
|
|
|
accHash, err = address.StringToUint160(addr)
|
|
|
|
if err != nil {
|
|
|
|
return fmt.Errorf("invalid address: %s", addr)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
acc := w.GetAccount(accHash)
|
|
|
|
if acc == nil {
|
|
|
|
return fmt.Errorf("can't find account for %s", accHash)
|
|
|
|
}
|
|
|
|
|
|
|
|
prompt := fmt.Sprintf("Enter password for %s >", address.Uint160ToString(accHash))
|
|
|
|
pass, err := input.ReadPassword(prompt)
|
|
|
|
if err != nil {
|
|
|
|
return fmt.Errorf("can't get password: %v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
err = acc.Decrypt(pass, keys.NEP2ScryptParams())
|
|
|
|
if err != nil {
|
|
|
|
return fmt.Errorf("can't unlock account: %v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
gasStr, err := cmd.Flags().GetString(refillGasAmountFlag)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
gasAmount, err := parseGASAmount(gasStr)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
till := int64(defaultNotaryDepositLifetime)
|
|
|
|
tillStr, err := cmd.Flags().GetString(notaryDepositTillFlag)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
if tillStr != "" {
|
|
|
|
till, err = strconv.ParseInt(tillStr, 10, 64)
|
|
|
|
if err != nil || till <= 0 {
|
|
|
|
return fmt.Errorf("notary deposit lifetime must be a positive integer")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
c, err := getN3Client(viper.GetViper())
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
2022-11-23 14:44:03 +00:00
|
|
|
if err := checkNotaryEnabled(c); err != nil {
|
|
|
|
return err
|
2021-11-30 11:57:58 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
height, err := c.GetBlockCount()
|
|
|
|
if err != nil {
|
|
|
|
return fmt.Errorf("can't get current height: %v", err)
|
|
|
|
}
|
|
|
|
|
2022-08-29 19:31:32 +00:00
|
|
|
act, err := actor.New(c, []actor.SignerAccount{{
|
2021-11-30 11:57:58 +00:00
|
|
|
Signer: transaction.Signer{
|
|
|
|
Account: acc.Contract.ScriptHash(),
|
|
|
|
Scopes: transaction.Global,
|
|
|
|
},
|
|
|
|
Account: acc,
|
|
|
|
}})
|
|
|
|
if err != nil {
|
2022-08-29 19:31:32 +00:00
|
|
|
return fmt.Errorf("could not create actor: %w", err)
|
2021-11-30 11:57:58 +00:00
|
|
|
}
|
|
|
|
|
2022-11-23 14:44:03 +00:00
|
|
|
gasActor := nep17.New(act, gas.Hash)
|
2022-03-27 17:30:08 +00:00
|
|
|
|
2022-11-23 14:44:03 +00:00
|
|
|
txHash, vub, err := gasActor.Transfer(
|
2022-08-29 19:31:32 +00:00
|
|
|
accHash,
|
2022-11-23 14:44:03 +00:00
|
|
|
notary.Hash,
|
2022-08-29 19:31:32 +00:00
|
|
|
big.NewInt(int64(gasAmount)),
|
|
|
|
[]interface{}{nil, int64(height) + till},
|
|
|
|
)
|
2021-11-30 11:57:58 +00:00
|
|
|
if err != nil {
|
2022-08-29 19:31:32 +00:00
|
|
|
return fmt.Errorf("could not send tx: %w", err)
|
2021-11-30 11:57:58 +00:00
|
|
|
}
|
|
|
|
|
2022-09-14 10:11:53 +00:00
|
|
|
return awaitTx(cmd, c, []hashVUBPair{{hash: txHash, vub: vub}})
|
2021-11-30 11:57:58 +00:00
|
|
|
}
|