From 4d3b6bf5165940cc0b96ea03046cb968af999e65 Mon Sep 17 00:00:00 2001 From: vezenovm Date: Tue, 22 Feb 2022 00:46:53 -0500 Subject: [PATCH 1/3] added cli command for deposit, and changed method of decoding deposit and execute function signatures for registering a generic resource --- .../cli/bridge/register-generic-resource.go | 35 +++++- chains/evm/cli/centrifuge/centrifuge.go | 1 + chains/evm/cli/centrifuge/deposit.go | 115 ++++++++++++++++++ chains/evm/cli/centrifuge/flagVars.go | 20 ++- 4 files changed, 163 insertions(+), 8 deletions(-) create mode 100644 chains/evm/cli/centrifuge/deposit.go diff --git a/chains/evm/cli/bridge/register-generic-resource.go b/chains/evm/cli/bridge/register-generic-resource.go index c9413908..8cfe8f12 100644 --- a/chains/evm/cli/bridge/register-generic-resource.go +++ b/chains/evm/cli/bridge/register-generic-resource.go @@ -60,8 +60,8 @@ func BindRegisterGenericResourceFlags(cmd *cobra.Command) { cmd.Flags().StringVar(&ResourceID, "resource", "", "Resource ID to query") cmd.Flags().StringVar(&Bridge, "bridge", "", "Bridge contract address") cmd.Flags().StringVar(&Target, "target", "", "Contract address or hash storage to be registered") - cmd.Flags().StringVar(&Deposit, "deposit", "0x00000000", "Deposit function signature") - cmd.Flags().StringVar(&Execute, "execute", "0x00000000", "Execute proposal function signature") + cmd.Flags().StringVar(&Deposit, "deposit", "00000000", "Deposit function signature") + cmd.Flags().StringVar(&Execute, "execute", "00000000", "Execute proposal function signature") cmd.Flags().BoolVar(&Hash, "hash", false, "Treat signature inputs as function prototype strings, hash and take the first 4 bytes") flags.MarkFlagsAsRequired(cmd, "handler", "resource", "bridge", "target") } @@ -103,19 +103,46 @@ func ProcessRegisterGenericResourceFlags(cmd *cobra.Command, args []string) erro ResourceIdBytesArr = callsUtil.SliceTo32Bytes(resourceIdBytes) if Hash { + // We must check whether both a deposit and execute function signature is provide or else + // an invalid hash of 0x00000000 will be taken and set as a function selector in the handler DepositSigBytes = callsUtil.GetSolidityFunctionSig([]byte(Deposit)) ExecuteSigBytes = callsUtil.GetSolidityFunctionSig([]byte(Execute)) + if Deposit == "00000000" { + DepositSigBytes = [4]byte{} + } + if Execute == "00000000" { + ExecuteSigBytes = [4]byte{} + } } else { - copy(DepositSigBytes[:], []byte(Deposit)[:]) - copy(ExecuteSigBytes[:], []byte(Execute)[:]) + depositBytes, err := hex.DecodeString(Deposit) + if err != nil { + panic(err) + } + copy(DepositSigBytes[:], depositBytes[:]) + + executeBytes, err := hex.DecodeString(Execute) + if err != nil { + panic(err) + } + copy(ExecuteSigBytes[:], executeBytes[:]) } + log.Debug().Msgf("DepositSigBytes: %x\n", DepositSigBytes[:]) + log.Debug().Msgf("ExecuteSigBytes: %x\n", ExecuteSigBytes[:]) + return nil } func RegisterGenericResource(cmd *cobra.Command, args []string, contract *bridge.BridgeContract) error { log.Info().Msgf("Registering contract %s with resource ID %s on handler %s", TargetContractAddr, ResourceID, HandlerAddr) + log.Info().Msgf("handlerAddr: %s, resourceId: %s, targetcontract: %s, depositsigbytes: %s, depositerOffset: %s, executeSigBytes: %s", + HandlerAddr, + ResourceIdBytesArr, + TargetContractAddr, + string(DepositSigBytes[:]), + big.NewInt(int64(DepositerOffset)), + string(DepositSigBytes[:])) h, err := contract.AdminSetGenericResource( HandlerAddr, ResourceIdBytesArr, diff --git a/chains/evm/cli/centrifuge/centrifuge.go b/chains/evm/cli/centrifuge/centrifuge.go index e80cfafe..58e3ff2d 100644 --- a/chains/evm/cli/centrifuge/centrifuge.go +++ b/chains/evm/cli/centrifuge/centrifuge.go @@ -25,4 +25,5 @@ var CentrifugeCmd = &cobra.Command{ func init() { CentrifugeCmd.AddCommand(deployCmd) CentrifugeCmd.AddCommand(getHashCmd) + CentrifugeCmd.AddCommand(depositCmd) } diff --git a/chains/evm/cli/centrifuge/deposit.go b/chains/evm/cli/centrifuge/deposit.go new file mode 100644 index 00000000..b073ce64 --- /dev/null +++ b/chains/evm/cli/centrifuge/deposit.go @@ -0,0 +1,115 @@ +package centrifuge + +import ( + "encoding/hex" + "fmt" + + "github.com/ChainSafe/chainbridge-core/chains/evm/calls/contracts/bridge" + "github.com/ChainSafe/chainbridge-core/chains/evm/calls/evmtransaction" + "github.com/ChainSafe/chainbridge-core/chains/evm/calls/transactor" + "github.com/ChainSafe/chainbridge-core/chains/evm/cli/flags" + "github.com/ChainSafe/chainbridge-core/chains/evm/cli/initialize" + "github.com/ChainSafe/chainbridge-core/chains/evm/cli/logger" + "github.com/ChainSafe/chainbridge-core/util" + "github.com/ethereum/go-ethereum/common" + "github.com/rs/zerolog/log" + "github.com/spf13/cobra" +) + +var depositCmd = &cobra.Command{ + Use: "deposit", + Short: "Deposit a generic data hash", + Long: "The deposit subcommand creates a new generic data deposit on the bridge contract", + PreRun: func(cmd *cobra.Command, args []string) { + logger.LoggerMetadata(cmd.Name(), cmd.Flags()) + }, + PersistentPreRunE: func(cmd *cobra.Command, args []string) error { + return util.CallPersistentPreRun(cmd, args) + }, + RunE: func(cmd *cobra.Command, args []string) error { + c, err := initialize.InitializeClient(url, senderKeyPair) + if err != nil { + return err + } + t, err := initialize.InitializeTransactor(gasPrice, evmtransaction.NewTransaction, c, prepare) + if err != nil { + return err + } + return DepositCmd(cmd, args, bridge.NewBridgeContract(c, BridgeAddr, t)) + }, + Args: func(cmd *cobra.Command, args []string) error { + err := ValidateDepositFlags(cmd, args) + if err != nil { + return err + } + + err = ProcessDepositFlags(cmd, args) + if err != nil { + return err + } + return nil + }, +} + +func init() { + BindDepositFlags(depositCmd) +} + +func BindDepositFlags(cmd *cobra.Command) { + cmd.Flags().StringVar(&Recipient, "recipient", "", "Address of contract to receive generic data") + cmd.Flags().StringVar(&Bridge, "bridge", "", "Address of bridge contract") + cmd.Flags().StringVar(&Metadata, "metadata", "", "Piece of data (hex) to transfer") + cmd.Flags().Uint8Var(&DomainID, "domain", 0, "Destination domain ID") + cmd.Flags().StringVar(&ResourceID, "resource", "", "Resource ID for transfer") + cmd.Flags().StringVar(&Priority, "priority", "none", "Transaction priority speed") + flags.MarkFlagsAsRequired(cmd, "recipient", "bridge", "metadata", "domain", "resource") +} + +func ValidateDepositFlags(cmd *cobra.Command, args []string) error { + if !common.IsHexAddress(Recipient) { + return fmt.Errorf("invalid recipient address %s", Recipient) + } + if !common.IsHexAddress(Bridge) { + return fmt.Errorf("invalid bridge address %s", Bridge) + } + switch Priority { + case "none", "slow", "medium", "fast": + return nil + default: + return fmt.Errorf("invalid priority value %s, supported priorities: \"slow|medium|fast\"", Priority) + } +} + +func ProcessDepositFlags(cmd *cobra.Command, args []string) error { + var err error + + RecipientAddr = common.HexToAddress(Recipient) + BridgeAddr = common.HexToAddress(Bridge) + ResourceIdBytesArr, err = flags.ProcessResourceID(ResourceID) + + MetadataBytes, err = hex.DecodeString(Metadata) + if err != nil { + panic(err) + } + + return err +} + +func DepositCmd(cmd *cobra.Command, args []string, bridgeContract *bridge.BridgeContract) error { + txHash, err := bridgeContract.GenericDeposit( + []byte(Metadata), ResourceIdBytesArr, uint8(DomainID), transactor.TransactOptions{GasLimit: gasLimit, Priority: transactor.TxPriorities[Priority]}, + ) + if err != nil { + return err + } + + log.Info().Msgf( + `Generic deposit hash: %s + %s metadata was transferred to %s from %s`, + txHash.Hex(), + Metadata, + RecipientAddr.Hex(), + senderKeyPair.CommonAddress().String(), + ) + return nil +} diff --git a/chains/evm/cli/centrifuge/flagVars.go b/chains/evm/cli/centrifuge/flagVars.go index 49713458..b2603fb6 100644 --- a/chains/evm/cli/centrifuge/flagVars.go +++ b/chains/evm/cli/centrifuge/flagVars.go @@ -4,25 +4,37 @@ import ( "math/big" "github.com/ChainSafe/chainbridge-core/crypto/secp256k1" + "github.com/ChainSafe/chainbridge-core/types" "github.com/ethereum/go-ethereum/common" ) //flag vars var ( - Hash string - Address string + Hash string + Address string + Metadata string + Recipient string + Bridge string + DomainID uint8 + ResourceID string + Priority string ) //processed flag vars var ( - StoreAddr common.Address - ByteHash [32]byte + StoreAddr common.Address + ByteHash [32]byte + MetadataBytes []byte + RecipientAddr common.Address + BridgeAddr common.Address + ResourceIdBytesArr types.ResourceID ) // global flags var ( url string gasPrice *big.Int + gasLimit uint64 senderKeyPair *secp256k1.Keypair prepare bool ) From cb2f279c80d2d7fe69d3eb0ba6f2c9bdb251ad02 Mon Sep 17 00:00:00 2001 From: vezenovm Date: Tue, 22 Feb 2022 11:41:45 -0500 Subject: [PATCH 2/3] linter fix and cleanup --- chains/evm/cli/bridge/register-generic-resource.go | 4 ++-- chains/evm/cli/centrifuge/deposit.go | 7 +++++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/chains/evm/cli/bridge/register-generic-resource.go b/chains/evm/cli/bridge/register-generic-resource.go index 8cfe8f12..ddd23393 100644 --- a/chains/evm/cli/bridge/register-generic-resource.go +++ b/chains/evm/cli/bridge/register-generic-resource.go @@ -116,13 +116,13 @@ func ProcessRegisterGenericResourceFlags(cmd *cobra.Command, args []string) erro } else { depositBytes, err := hex.DecodeString(Deposit) if err != nil { - panic(err) + return err } copy(DepositSigBytes[:], depositBytes[:]) executeBytes, err := hex.DecodeString(Execute) if err != nil { - panic(err) + return err } copy(ExecuteSigBytes[:], executeBytes[:]) } diff --git a/chains/evm/cli/centrifuge/deposit.go b/chains/evm/cli/centrifuge/deposit.go index b073ce64..a5669538 100644 --- a/chains/evm/cli/centrifuge/deposit.go +++ b/chains/evm/cli/centrifuge/deposit.go @@ -86,10 +86,13 @@ func ProcessDepositFlags(cmd *cobra.Command, args []string) error { RecipientAddr = common.HexToAddress(Recipient) BridgeAddr = common.HexToAddress(Bridge) ResourceIdBytesArr, err = flags.ProcessResourceID(ResourceID) + if err != nil { + return err + } MetadataBytes, err = hex.DecodeString(Metadata) if err != nil { - panic(err) + return err } return err @@ -97,7 +100,7 @@ func ProcessDepositFlags(cmd *cobra.Command, args []string) error { func DepositCmd(cmd *cobra.Command, args []string, bridgeContract *bridge.BridgeContract) error { txHash, err := bridgeContract.GenericDeposit( - []byte(Metadata), ResourceIdBytesArr, uint8(DomainID), transactor.TransactOptions{GasLimit: gasLimit, Priority: transactor.TxPriorities[Priority]}, + MetadataBytes, ResourceIdBytesArr, uint8(DomainID), transactor.TransactOptions{GasLimit: gasLimit, Priority: transactor.TxPriorities[Priority]}, ) if err != nil { return err From 93c15edba13907159c4eefae926fd69d0ef74bae Mon Sep 17 00:00:00 2001 From: vezenovm Date: Tue, 26 Apr 2022 00:36:47 -0400 Subject: [PATCH 3/3] add depositer offset flag parsing --- chains/evm/cli/bridge/register-generic-resource.go | 6 ++++-- chains/evm/cli/centrifuge/deposit.go | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/chains/evm/cli/bridge/register-generic-resource.go b/chains/evm/cli/bridge/register-generic-resource.go index ddd23393..6d6ce8b8 100644 --- a/chains/evm/cli/bridge/register-generic-resource.go +++ b/chains/evm/cli/bridge/register-generic-resource.go @@ -61,6 +61,7 @@ func BindRegisterGenericResourceFlags(cmd *cobra.Command) { cmd.Flags().StringVar(&Bridge, "bridge", "", "Bridge contract address") cmd.Flags().StringVar(&Target, "target", "", "Contract address or hash storage to be registered") cmd.Flags().StringVar(&Deposit, "deposit", "00000000", "Deposit function signature") + cmd.Flags().Uint64Var(&DepositerOffset, "depositerOffset", 0, "Offset to find the bridge tx depositer address inside the metadata sent on a deposit") cmd.Flags().StringVar(&Execute, "execute", "00000000", "Execute proposal function signature") cmd.Flags().BoolVar(&Hash, "hash", false, "Treat signature inputs as function prototype strings, hash and take the first 4 bytes") flags.MarkFlagsAsRequired(cmd, "handler", "resource", "bridge", "target") @@ -136,19 +137,20 @@ func ProcessRegisterGenericResourceFlags(cmd *cobra.Command, args []string) erro func RegisterGenericResource(cmd *cobra.Command, args []string, contract *bridge.BridgeContract) error { log.Info().Msgf("Registering contract %s with resource ID %s on handler %s", TargetContractAddr, ResourceID, HandlerAddr) + depositerOffsetBigInt := new(big.Int).SetUint64(DepositerOffset) log.Info().Msgf("handlerAddr: %s, resourceId: %s, targetcontract: %s, depositsigbytes: %s, depositerOffset: %s, executeSigBytes: %s", HandlerAddr, ResourceIdBytesArr, TargetContractAddr, string(DepositSigBytes[:]), - big.NewInt(int64(DepositerOffset)), + depositerOffsetBigInt, string(DepositSigBytes[:])) h, err := contract.AdminSetGenericResource( HandlerAddr, ResourceIdBytesArr, TargetContractAddr, DepositSigBytes, - big.NewInt(int64(DepositerOffset)), + depositerOffsetBigInt, ExecuteSigBytes, transactor.TransactOptions{GasLimit: gasLimit}, ) diff --git a/chains/evm/cli/centrifuge/deposit.go b/chains/evm/cli/centrifuge/deposit.go index a5669538..57f0f174 100644 --- a/chains/evm/cli/centrifuge/deposit.go +++ b/chains/evm/cli/centrifuge/deposit.go @@ -58,7 +58,7 @@ func init() { func BindDepositFlags(cmd *cobra.Command) { cmd.Flags().StringVar(&Recipient, "recipient", "", "Address of contract to receive generic data") cmd.Flags().StringVar(&Bridge, "bridge", "", "Address of bridge contract") - cmd.Flags().StringVar(&Metadata, "metadata", "", "Piece of data (hex) to transfer") + cmd.Flags().StringVar(&Metadata, "metadata", "", "Data (hex bytes) representing params for previously registered functions. Params should be encoded as 32 bytes each") cmd.Flags().Uint8Var(&DomainID, "domain", 0, "Destination domain ID") cmd.Flags().StringVar(&ResourceID, "resource", "", "Resource ID for transfer") cmd.Flags().StringVar(&Priority, "priority", "none", "Transaction priority speed")