From 44711ca5725a694913ecf8a3443f4cdeab83d38d Mon Sep 17 00:00:00 2001 From: skosito Date: Tue, 10 Sep 2024 19:34:29 +0200 Subject: [PATCH 1/5] emit events from staking precompile --- cmd/zetae2e/local/config.go | 9 - cmd/zetae2e/local/local.go | 4 +- e2e/contracts/teststaking/TestStaking.abi | 81 +++ e2e/contracts/teststaking/TestStaking.bin | 2 +- e2e/contracts/teststaking/TestStaking.go | 475 +++++++++++++++++- e2e/contracts/teststaking/TestStaking.json | 83 ++- e2e/contracts/teststaking/TestStaking.sol | 19 + ...st_precompiles_staking_through_contract.go | 42 +- precompiles/staking/IStaking.abi | 81 +++ precompiles/staking/IStaking.go | 473 ++++++++++++++++- precompiles/staking/IStaking.json | 81 +++ precompiles/staking/IStaking.sol | 32 ++ precompiles/staking/logs.go | 162 ++++++ precompiles/staking/staking.go | 23 +- precompiles/staking/staking_test.go | 26 +- 15 files changed, 1558 insertions(+), 35 deletions(-) create mode 100644 precompiles/staking/logs.go diff --git a/cmd/zetae2e/local/config.go b/cmd/zetae2e/local/config.go index 2f4386e7b0..8b2fb68ac3 100644 --- a/cmd/zetae2e/local/config.go +++ b/cmd/zetae2e/local/config.go @@ -4,10 +4,8 @@ import ( "fmt" "path/filepath" - sdk "github.com/cosmos/cosmos-sdk/types" "github.com/spf13/cobra" - "github.com/zeta-chain/node/app" "github.com/zeta-chain/node/e2e/config" ) @@ -25,10 +23,3 @@ func GetConfig(cmd *cobra.Command) (config.Config, error) { return config.ReadConfig(configFile) } - -// setCosmosConfig set account prefix to zeta -func setCosmosConfig() { - cosmosConf := sdk.GetConfig() - cosmosConf.SetBech32PrefixForAccount(app.Bech32PrefixAccAddr, app.Bech32PrefixAccPub) - cosmosConf.Seal() -} diff --git a/cmd/zetae2e/local/local.go b/cmd/zetae2e/local/local.go index 8ffc8228b4..098d8dab5c 100644 --- a/cmd/zetae2e/local/local.go +++ b/cmd/zetae2e/local/local.go @@ -11,6 +11,7 @@ import ( "github.com/spf13/cobra" "golang.org/x/sync/errgroup" + "github.com/zeta-chain/node/app" zetae2econfig "github.com/zeta-chain/node/cmd/zetae2e/config" "github.com/zeta-chain/node/e2e/config" "github.com/zeta-chain/node/e2e/e2etests" @@ -143,8 +144,7 @@ func localE2ETest(cmd *cobra.Command, _ []string) { noError(utils.WaitForBlockHeight(ctx, waitForHeight, conf.RPCs.ZetaCoreRPC, logger)) } - // set account prefix to zeta - setCosmosConfig() + app.SetConfig() zetaTxServer, err := txserver.NewZetaTxServer( conf.RPCs.ZetaCoreRPC, diff --git a/e2e/contracts/teststaking/TestStaking.abi b/e2e/contracts/teststaking/TestStaking.abi index 69003af87f..5c793c4c7f 100644 --- a/e2e/contracts/teststaking/TestStaking.abi +++ b/e2e/contracts/teststaking/TestStaking.abi @@ -10,6 +10,87 @@ "stateMutability": "nonpayable", "type": "constructor" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "staker", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "validatorSrc", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "validatorDst", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "MoveStake", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "staker", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "validator", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Stake", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "staker", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "validator", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Unstake", + "type": "event" + }, { "stateMutability": "payable", "type": "fallback" diff --git a/e2e/contracts/teststaking/TestStaking.bin b/e2e/contracts/teststaking/TestStaking.bin index 35c4198862..14751519ee 100644 --- a/e2e/contracts/teststaking/TestStaking.bin +++ b/e2e/contracts/teststaking/TestStaking.bin @@ -1 +1 @@ -608060405260666000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060006003553480156200005757600080fd5b506040516200192d3803806200192d83398181016040528101906200007d919062000170565b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050620001a2565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000138826200010b565b9050919050565b6200014a816200012b565b81146200015657600080fd5b50565b6000815190506200016a816200013f565b92915050565b60006020828403121562000189576200018862000106565b5b6000620001998482850162000159565b91505092915050565b61177b80620001b26000396000f3fe6080604052600436106100955760003560e01c806390b8436f1161005957806390b8436f1461018a5780639a0fb673146101c7578063bca8f527146101f0578063d11a93d01461022d578063f3513a371461026a5761009c565b80630d1b3daf1461009e5780632c5d24ae146100db57806357c6ea3e146100e557806361bc221a146101225780636be8916c1461014d5761009c565b3661009c57005b005b3480156100aa57600080fd5b506100c560048036038101906100c09190610d08565b610295565b6040516100d29190610d7d565b60405180910390f35b6100e361033c565b005b3480156100f157600080fd5b5061010c60048036038101906101079190610dc4565b61041b565b6040516101199190610e4f565b60405180910390f35b34801561012e57600080fd5b50610137610520565b6040516101449190610d7d565b60405180910390f35b34801561015957600080fd5b50610174600480360381019061016f9190610dc4565b610526565b6040516101819190610e85565b60405180910390f35b34801561019657600080fd5b506101b160048036038101906101ac9190610dc4565b61065c565b6040516101be9190610e85565b60405180910390f35b3480156101d357600080fd5b506101ee60048036038101906101e99190610ea0565b610761565b005b3480156101fc57600080fd5b5061021760048036038101906102129190610dc4565b61084b565b6040516102249190610e85565b60405180910390f35b34801561023957600080fd5b50610254600480360381019061024f9190610ecd565b6109ad565b6040516102619190610e4f565b60405180910390f35b34801561027657600080fd5b5061027f610ab5565b60405161028c91906111a6565b60405180910390f35b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630d1b3daf84846040518363ffffffff1660e01b81526004016102f3929190611221565b602060405180830381865afa158015610310573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103349190611266565b905092915050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461039657600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561040057600080fd5b505af1158015610414573d6000803e3d6000fd5b5050505050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461047757600080fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166357c6ea3e8585856040518463ffffffff1660e01b81526004016104d493929190611293565b6020604051808303816000875af11580156104f3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051791906112fd565b90509392505050565b60035481565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461058257600080fd5b60016003546105919190611359565b60038190555060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166390b8436f8686866040518463ffffffff1660e01b81526004016105f793929190611293565b6020604051808303816000875af1158015610616573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061063a91906113db565b9050600160035461064b9190611359565b600381905550809150509392505050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146106b857600080fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166390b8436f8585856040518463ffffffff1660e01b815260040161071593929190611293565b6020604051808303816000875af1158015610734573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061075891906113db565b90509392505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146107bb57600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d826040518263ffffffff1660e01b81526004016108169190610d7d565b600060405180830381600087803b15801561083057600080fd5b505af1158015610844573d6000803e3d6000fd5b5050505050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146108a757600080fd5b60016003546108b69190611359565b60038190555060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166390b8436f8585856040518463ffffffff1660e01b815260040161091993929190611293565b6020604051808303816000875af1158015610938573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061095c91906113db565b50600160035461096c9190611359565b6003819055506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a490611454565b60405180910390fd5b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a0957600080fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d11a93d0868686866040518563ffffffff1660e01b8152600401610a689493929190611474565b6020604051808303816000875af1158015610a87573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aab91906112fd565b9050949350505050565b606060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f3513a376040518163ffffffff1660e01b8152600401600060405180830381865afa158015610b22573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610b4b91906116fc565b905090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610b8f82610b64565b9050919050565b610b9f81610b84565b8114610baa57600080fd5b50565b600081359050610bbc81610b96565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610c1582610bcc565b810181811067ffffffffffffffff82111715610c3457610c33610bdd565b5b80604052505050565b6000610c47610b50565b9050610c538282610c0c565b919050565b600067ffffffffffffffff821115610c7357610c72610bdd565b5b610c7c82610bcc565b9050602081019050919050565b82818337600083830152505050565b6000610cab610ca684610c58565b610c3d565b905082815260208101848484011115610cc757610cc6610bc7565b5b610cd2848285610c89565b509392505050565b600082601f830112610cef57610cee610bc2565b5b8135610cff848260208601610c98565b91505092915050565b60008060408385031215610d1f57610d1e610b5a565b5b6000610d2d85828601610bad565b925050602083013567ffffffffffffffff811115610d4e57610d4d610b5f565b5b610d5a85828601610cda565b9150509250929050565b6000819050919050565b610d7781610d64565b82525050565b6000602082019050610d926000830184610d6e565b92915050565b610da181610d64565b8114610dac57600080fd5b50565b600081359050610dbe81610d98565b92915050565b600080600060608486031215610ddd57610ddc610b5a565b5b6000610deb86828701610bad565b935050602084013567ffffffffffffffff811115610e0c57610e0b610b5f565b5b610e1886828701610cda565b9250506040610e2986828701610daf565b9150509250925092565b60008160070b9050919050565b610e4981610e33565b82525050565b6000602082019050610e646000830184610e40565b92915050565b60008115159050919050565b610e7f81610e6a565b82525050565b6000602082019050610e9a6000830184610e76565b92915050565b600060208284031215610eb657610eb5610b5a565b5b6000610ec484828501610daf565b91505092915050565b60008060008060808587031215610ee757610ee6610b5a565b5b6000610ef587828801610bad565b945050602085013567ffffffffffffffff811115610f1657610f15610b5f565b5b610f2287828801610cda565b935050604085013567ffffffffffffffff811115610f4357610f42610b5f565b5b610f4f87828801610cda565b9250506060610f6087828801610daf565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610fd2578082015181840152602081019050610fb7565b83811115610fe1576000848401525b50505050565b6000610ff282610f98565b610ffc8185610fa3565b935061100c818560208601610fb4565b61101581610bcc565b840191505092915050565b61102981610e6a565b82525050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6004811061106f5761106e61102f565b5b50565b60008190506110808261105e565b919050565b600061109082611072565b9050919050565b6110a081611085565b82525050565b600060808301600083015184820360008601526110c38282610fe7565b915050602083015184820360208601526110dd8282610fe7565b91505060408301516110f26040860182611020565b5060608301516111056060860182611097565b508091505092915050565b600061111c83836110a6565b905092915050565b6000602082019050919050565b600061113c82610f6c565b6111468185610f77565b93508360208202850161115885610f88565b8060005b8581101561119457848403895281516111758582611110565b945061118083611124565b925060208a0199505060018101905061115c565b50829750879550505050505092915050565b600060208201905081810360008301526111c08184611131565b905092915050565b6111d181610b84565b82525050565b600082825260208201905092915050565b60006111f382610f98565b6111fd81856111d7565b935061120d818560208601610fb4565b61121681610bcc565b840191505092915050565b600060408201905061123660008301856111c8565b818103602083015261124881846111e8565b90509392505050565b60008151905061126081610d98565b92915050565b60006020828403121561127c5761127b610b5a565b5b600061128a84828501611251565b91505092915050565b60006060820190506112a860008301866111c8565b81810360208301526112ba81856111e8565b90506112c96040830184610d6e565b949350505050565b6112da81610e33565b81146112e557600080fd5b50565b6000815190506112f7816112d1565b92915050565b60006020828403121561131357611312610b5a565b5b6000611321848285016112e8565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061136482610d64565b915061136f83610d64565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156113a4576113a361132a565b5b828201905092915050565b6113b881610e6a565b81146113c357600080fd5b50565b6000815190506113d5816113af565b92915050565b6000602082840312156113f1576113f0610b5a565b5b60006113ff848285016113c6565b91505092915050565b7f7465737472657665727400000000000000000000000000000000000000000000600082015250565b600061143e600a836111d7565b915061144982611408565b602082019050919050565b6000602082019050818103600083015261146d81611431565b9050919050565b600060808201905061148960008301876111c8565b818103602083015261149b81866111e8565b905081810360408301526114af81856111e8565b90506114be6060830184610d6e565b95945050505050565b600067ffffffffffffffff8211156114e2576114e1610bdd565b5b602082029050602081019050919050565b600080fd5b600080fd5b600080fd5b600061151561151084610c58565b610c3d565b90508281526020810184848401111561153157611530610bc7565b5b61153c848285610fb4565b509392505050565b600082601f83011261155957611558610bc2565b5b8151611569848260208601611502565b91505092915050565b6004811061157f57600080fd5b50565b60008151905061159181611572565b92915050565b6000608082840312156115ad576115ac6114f8565b5b6115b76080610c3d565b9050600082015167ffffffffffffffff8111156115d7576115d66114fd565b5b6115e384828501611544565b600083015250602082015167ffffffffffffffff811115611607576116066114fd565b5b61161384828501611544565b6020830152506040611627848285016113c6565b604083015250606061163b84828501611582565b60608301525092915050565b600061165a611655846114c7565b610c3d565b9050808382526020820190506020840283018581111561167d5761167c6114f3565b5b835b818110156116c457805167ffffffffffffffff8111156116a2576116a1610bc2565b5b8086016116af8982611597565b8552602085019450505060208101905061167f565b5050509392505050565b600082601f8301126116e3576116e2610bc2565b5b81516116f3848260208601611647565b91505092915050565b60006020828403121561171257611711610b5a565b5b600082015167ffffffffffffffff8111156117305761172f610b5f565b5b61173c848285016116ce565b9150509291505056fea2646970667358221220fbbd8da0d7360633653761cbde3d46828949fcca1b71279d79140864c678daeb64736f6c634300080a0033 +608060405260666000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060006003553480156200005757600080fd5b506040516200192d3803806200192d83398181016040528101906200007d919062000170565b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050620001a2565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000138826200010b565b9050919050565b6200014a816200012b565b81146200015657600080fd5b50565b6000815190506200016a816200013f565b92915050565b60006020828403121562000189576200018862000106565b5b6000620001998482850162000159565b91505092915050565b61177b80620001b26000396000f3fe6080604052600436106100955760003560e01c806390b8436f1161005957806390b8436f1461018a5780639a0fb673146101c7578063bca8f527146101f0578063d11a93d01461022d578063f3513a371461026a5761009c565b80630d1b3daf1461009e5780632c5d24ae146100db57806357c6ea3e146100e557806361bc221a146101225780636be8916c1461014d5761009c565b3661009c57005b005b3480156100aa57600080fd5b506100c560048036038101906100c09190610d08565b610295565b6040516100d29190610d7d565b60405180910390f35b6100e361033c565b005b3480156100f157600080fd5b5061010c60048036038101906101079190610dc4565b61041b565b6040516101199190610e4f565b60405180910390f35b34801561012e57600080fd5b50610137610520565b6040516101449190610d7d565b60405180910390f35b34801561015957600080fd5b50610174600480360381019061016f9190610dc4565b610526565b6040516101819190610e85565b60405180910390f35b34801561019657600080fd5b506101b160048036038101906101ac9190610dc4565b61065c565b6040516101be9190610e85565b60405180910390f35b3480156101d357600080fd5b506101ee60048036038101906101e99190610ea0565b610761565b005b3480156101fc57600080fd5b5061021760048036038101906102129190610dc4565b61084b565b6040516102249190610e85565b60405180910390f35b34801561023957600080fd5b50610254600480360381019061024f9190610ecd565b6109ad565b6040516102619190610e4f565b60405180910390f35b34801561027657600080fd5b5061027f610ab5565b60405161028c91906111a6565b60405180910390f35b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630d1b3daf84846040518363ffffffff1660e01b81526004016102f3929190611221565b602060405180830381865afa158015610310573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103349190611266565b905092915050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461039657600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561040057600080fd5b505af1158015610414573d6000803e3d6000fd5b5050505050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461047757600080fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166357c6ea3e8585856040518463ffffffff1660e01b81526004016104d493929190611293565b6020604051808303816000875af11580156104f3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051791906112fd565b90509392505050565b60035481565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461058257600080fd5b60016003546105919190611359565b60038190555060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166390b8436f8686866040518463ffffffff1660e01b81526004016105f793929190611293565b6020604051808303816000875af1158015610616573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061063a91906113db565b9050600160035461064b9190611359565b600381905550809150509392505050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146106b857600080fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166390b8436f8585856040518463ffffffff1660e01b815260040161071593929190611293565b6020604051808303816000875af1158015610734573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061075891906113db565b90509392505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146107bb57600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d826040518263ffffffff1660e01b81526004016108169190610d7d565b600060405180830381600087803b15801561083057600080fd5b505af1158015610844573d6000803e3d6000fd5b5050505050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146108a757600080fd5b60016003546108b69190611359565b60038190555060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166390b8436f8585856040518463ffffffff1660e01b815260040161091993929190611293565b6020604051808303816000875af1158015610938573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061095c91906113db565b50600160035461096c9190611359565b6003819055506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a490611454565b60405180910390fd5b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a0957600080fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d11a93d0868686866040518563ffffffff1660e01b8152600401610a689493929190611474565b6020604051808303816000875af1158015610a87573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aab91906112fd565b9050949350505050565b606060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f3513a376040518163ffffffff1660e01b8152600401600060405180830381865afa158015610b22573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610b4b91906116fc565b905090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610b8f82610b64565b9050919050565b610b9f81610b84565b8114610baa57600080fd5b50565b600081359050610bbc81610b96565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610c1582610bcc565b810181811067ffffffffffffffff82111715610c3457610c33610bdd565b5b80604052505050565b6000610c47610b50565b9050610c538282610c0c565b919050565b600067ffffffffffffffff821115610c7357610c72610bdd565b5b610c7c82610bcc565b9050602081019050919050565b82818337600083830152505050565b6000610cab610ca684610c58565b610c3d565b905082815260208101848484011115610cc757610cc6610bc7565b5b610cd2848285610c89565b509392505050565b600082601f830112610cef57610cee610bc2565b5b8135610cff848260208601610c98565b91505092915050565b60008060408385031215610d1f57610d1e610b5a565b5b6000610d2d85828601610bad565b925050602083013567ffffffffffffffff811115610d4e57610d4d610b5f565b5b610d5a85828601610cda565b9150509250929050565b6000819050919050565b610d7781610d64565b82525050565b6000602082019050610d926000830184610d6e565b92915050565b610da181610d64565b8114610dac57600080fd5b50565b600081359050610dbe81610d98565b92915050565b600080600060608486031215610ddd57610ddc610b5a565b5b6000610deb86828701610bad565b935050602084013567ffffffffffffffff811115610e0c57610e0b610b5f565b5b610e1886828701610cda565b9250506040610e2986828701610daf565b9150509250925092565b60008160070b9050919050565b610e4981610e33565b82525050565b6000602082019050610e646000830184610e40565b92915050565b60008115159050919050565b610e7f81610e6a565b82525050565b6000602082019050610e9a6000830184610e76565b92915050565b600060208284031215610eb657610eb5610b5a565b5b6000610ec484828501610daf565b91505092915050565b60008060008060808587031215610ee757610ee6610b5a565b5b6000610ef587828801610bad565b945050602085013567ffffffffffffffff811115610f1657610f15610b5f565b5b610f2287828801610cda565b935050604085013567ffffffffffffffff811115610f4357610f42610b5f565b5b610f4f87828801610cda565b9250506060610f6087828801610daf565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610fd2578082015181840152602081019050610fb7565b83811115610fe1576000848401525b50505050565b6000610ff282610f98565b610ffc8185610fa3565b935061100c818560208601610fb4565b61101581610bcc565b840191505092915050565b61102981610e6a565b82525050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6004811061106f5761106e61102f565b5b50565b60008190506110808261105e565b919050565b600061109082611072565b9050919050565b6110a081611085565b82525050565b600060808301600083015184820360008601526110c38282610fe7565b915050602083015184820360208601526110dd8282610fe7565b91505060408301516110f26040860182611020565b5060608301516111056060860182611097565b508091505092915050565b600061111c83836110a6565b905092915050565b6000602082019050919050565b600061113c82610f6c565b6111468185610f77565b93508360208202850161115885610f88565b8060005b8581101561119457848403895281516111758582611110565b945061118083611124565b925060208a0199505060018101905061115c565b50829750879550505050505092915050565b600060208201905081810360008301526111c08184611131565b905092915050565b6111d181610b84565b82525050565b600082825260208201905092915050565b60006111f382610f98565b6111fd81856111d7565b935061120d818560208601610fb4565b61121681610bcc565b840191505092915050565b600060408201905061123660008301856111c8565b818103602083015261124881846111e8565b90509392505050565b60008151905061126081610d98565b92915050565b60006020828403121561127c5761127b610b5a565b5b600061128a84828501611251565b91505092915050565b60006060820190506112a860008301866111c8565b81810360208301526112ba81856111e8565b90506112c96040830184610d6e565b949350505050565b6112da81610e33565b81146112e557600080fd5b50565b6000815190506112f7816112d1565b92915050565b60006020828403121561131357611312610b5a565b5b6000611321848285016112e8565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061136482610d64565b915061136f83610d64565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156113a4576113a361132a565b5b828201905092915050565b6113b881610e6a565b81146113c357600080fd5b50565b6000815190506113d5816113af565b92915050565b6000602082840312156113f1576113f0610b5a565b5b60006113ff848285016113c6565b91505092915050565b7f7465737472657665727400000000000000000000000000000000000000000000600082015250565b600061143e600a836111d7565b915061144982611408565b602082019050919050565b6000602082019050818103600083015261146d81611431565b9050919050565b600060808201905061148960008301876111c8565b818103602083015261149b81866111e8565b905081810360408301526114af81856111e8565b90506114be6060830184610d6e565b95945050505050565b600067ffffffffffffffff8211156114e2576114e1610bdd565b5b602082029050602081019050919050565b600080fd5b600080fd5b600080fd5b600061151561151084610c58565b610c3d565b90508281526020810184848401111561153157611530610bc7565b5b61153c848285610fb4565b509392505050565b600082601f83011261155957611558610bc2565b5b8151611569848260208601611502565b91505092915050565b6004811061157f57600080fd5b50565b60008151905061159181611572565b92915050565b6000608082840312156115ad576115ac6114f8565b5b6115b76080610c3d565b9050600082015167ffffffffffffffff8111156115d7576115d66114fd565b5b6115e384828501611544565b600083015250602082015167ffffffffffffffff811115611607576116066114fd565b5b61161384828501611544565b6020830152506040611627848285016113c6565b604083015250606061163b84828501611582565b60608301525092915050565b600061165a611655846114c7565b610c3d565b9050808382526020820190506020840283018581111561167d5761167c6114f3565b5b835b818110156116c457805167ffffffffffffffff8111156116a2576116a1610bc2565b5b8086016116af8982611597565b8552602085019450505060208101905061167f565b5050509392505050565b600082601f8301126116e3576116e2610bc2565b5b81516116f3848260208601611647565b91505092915050565b60006020828403121561171257611711610b5a565b5b600082015167ffffffffffffffff8111156117305761172f610b5f565b5b61173c848285016116ce565b9150509291505056fea26469706673582212201d48926082b046ce0a5b741a926eefe8bb0873c1d992ea4a6c4210a133dbaae764736f6c634300080a0033 diff --git a/e2e/contracts/teststaking/TestStaking.go b/e2e/contracts/teststaking/TestStaking.go index 2251253862..300f874b31 100644 --- a/e2e/contracts/teststaking/TestStaking.go +++ b/e2e/contracts/teststaking/TestStaking.go @@ -39,8 +39,8 @@ type Validator struct { // TestStakingMetaData contains all meta data concerning the TestStaking contract. var TestStakingMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_wzeta\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"inputs\":[],\"name\":\"counter\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"depositWZETA\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllValidators\",\"outputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"operatorAddress\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"consensusPubKey\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"jailed\",\"type\":\"bool\"},{\"internalType\":\"enumBondStatus\",\"name\":\"bondStatus\",\"type\":\"uint8\"}],\"internalType\":\"structValidator[]\",\"name\":\"validators\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"validator\",\"type\":\"string\"}],\"name\":\"getShares\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"shares\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"validatorSrc\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"validatorDst\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"moveStake\",\"outputs\":[{\"internalType\":\"int64\",\"name\":\"completionTime\",\"type\":\"int64\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"validator\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"stake\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"validator\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"stakeAndRevert\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"validator\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"stakeWithStateUpdate\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"validator\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"unstake\",\"outputs\":[{\"internalType\":\"int64\",\"name\":\"completionTime\",\"type\":\"int64\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"wad\",\"type\":\"uint256\"}],\"name\":\"withdrawWZETA\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", - Bin: "0x608060405260666000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060006003553480156200005757600080fd5b506040516200192d3803806200192d83398181016040528101906200007d919062000170565b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050620001a2565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000138826200010b565b9050919050565b6200014a816200012b565b81146200015657600080fd5b50565b6000815190506200016a816200013f565b92915050565b60006020828403121562000189576200018862000106565b5b6000620001998482850162000159565b91505092915050565b61177b80620001b26000396000f3fe6080604052600436106100955760003560e01c806390b8436f1161005957806390b8436f1461018a5780639a0fb673146101c7578063bca8f527146101f0578063d11a93d01461022d578063f3513a371461026a5761009c565b80630d1b3daf1461009e5780632c5d24ae146100db57806357c6ea3e146100e557806361bc221a146101225780636be8916c1461014d5761009c565b3661009c57005b005b3480156100aa57600080fd5b506100c560048036038101906100c09190610d08565b610295565b6040516100d29190610d7d565b60405180910390f35b6100e361033c565b005b3480156100f157600080fd5b5061010c60048036038101906101079190610dc4565b61041b565b6040516101199190610e4f565b60405180910390f35b34801561012e57600080fd5b50610137610520565b6040516101449190610d7d565b60405180910390f35b34801561015957600080fd5b50610174600480360381019061016f9190610dc4565b610526565b6040516101819190610e85565b60405180910390f35b34801561019657600080fd5b506101b160048036038101906101ac9190610dc4565b61065c565b6040516101be9190610e85565b60405180910390f35b3480156101d357600080fd5b506101ee60048036038101906101e99190610ea0565b610761565b005b3480156101fc57600080fd5b5061021760048036038101906102129190610dc4565b61084b565b6040516102249190610e85565b60405180910390f35b34801561023957600080fd5b50610254600480360381019061024f9190610ecd565b6109ad565b6040516102619190610e4f565b60405180910390f35b34801561027657600080fd5b5061027f610ab5565b60405161028c91906111a6565b60405180910390f35b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630d1b3daf84846040518363ffffffff1660e01b81526004016102f3929190611221565b602060405180830381865afa158015610310573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103349190611266565b905092915050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461039657600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561040057600080fd5b505af1158015610414573d6000803e3d6000fd5b5050505050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461047757600080fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166357c6ea3e8585856040518463ffffffff1660e01b81526004016104d493929190611293565b6020604051808303816000875af11580156104f3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051791906112fd565b90509392505050565b60035481565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461058257600080fd5b60016003546105919190611359565b60038190555060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166390b8436f8686866040518463ffffffff1660e01b81526004016105f793929190611293565b6020604051808303816000875af1158015610616573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061063a91906113db565b9050600160035461064b9190611359565b600381905550809150509392505050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146106b857600080fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166390b8436f8585856040518463ffffffff1660e01b815260040161071593929190611293565b6020604051808303816000875af1158015610734573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061075891906113db565b90509392505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146107bb57600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d826040518263ffffffff1660e01b81526004016108169190610d7d565b600060405180830381600087803b15801561083057600080fd5b505af1158015610844573d6000803e3d6000fd5b5050505050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146108a757600080fd5b60016003546108b69190611359565b60038190555060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166390b8436f8585856040518463ffffffff1660e01b815260040161091993929190611293565b6020604051808303816000875af1158015610938573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061095c91906113db565b50600160035461096c9190611359565b6003819055506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a490611454565b60405180910390fd5b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a0957600080fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d11a93d0868686866040518563ffffffff1660e01b8152600401610a689493929190611474565b6020604051808303816000875af1158015610a87573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aab91906112fd565b9050949350505050565b606060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f3513a376040518163ffffffff1660e01b8152600401600060405180830381865afa158015610b22573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610b4b91906116fc565b905090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610b8f82610b64565b9050919050565b610b9f81610b84565b8114610baa57600080fd5b50565b600081359050610bbc81610b96565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610c1582610bcc565b810181811067ffffffffffffffff82111715610c3457610c33610bdd565b5b80604052505050565b6000610c47610b50565b9050610c538282610c0c565b919050565b600067ffffffffffffffff821115610c7357610c72610bdd565b5b610c7c82610bcc565b9050602081019050919050565b82818337600083830152505050565b6000610cab610ca684610c58565b610c3d565b905082815260208101848484011115610cc757610cc6610bc7565b5b610cd2848285610c89565b509392505050565b600082601f830112610cef57610cee610bc2565b5b8135610cff848260208601610c98565b91505092915050565b60008060408385031215610d1f57610d1e610b5a565b5b6000610d2d85828601610bad565b925050602083013567ffffffffffffffff811115610d4e57610d4d610b5f565b5b610d5a85828601610cda565b9150509250929050565b6000819050919050565b610d7781610d64565b82525050565b6000602082019050610d926000830184610d6e565b92915050565b610da181610d64565b8114610dac57600080fd5b50565b600081359050610dbe81610d98565b92915050565b600080600060608486031215610ddd57610ddc610b5a565b5b6000610deb86828701610bad565b935050602084013567ffffffffffffffff811115610e0c57610e0b610b5f565b5b610e1886828701610cda565b9250506040610e2986828701610daf565b9150509250925092565b60008160070b9050919050565b610e4981610e33565b82525050565b6000602082019050610e646000830184610e40565b92915050565b60008115159050919050565b610e7f81610e6a565b82525050565b6000602082019050610e9a6000830184610e76565b92915050565b600060208284031215610eb657610eb5610b5a565b5b6000610ec484828501610daf565b91505092915050565b60008060008060808587031215610ee757610ee6610b5a565b5b6000610ef587828801610bad565b945050602085013567ffffffffffffffff811115610f1657610f15610b5f565b5b610f2287828801610cda565b935050604085013567ffffffffffffffff811115610f4357610f42610b5f565b5b610f4f87828801610cda565b9250506060610f6087828801610daf565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610fd2578082015181840152602081019050610fb7565b83811115610fe1576000848401525b50505050565b6000610ff282610f98565b610ffc8185610fa3565b935061100c818560208601610fb4565b61101581610bcc565b840191505092915050565b61102981610e6a565b82525050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6004811061106f5761106e61102f565b5b50565b60008190506110808261105e565b919050565b600061109082611072565b9050919050565b6110a081611085565b82525050565b600060808301600083015184820360008601526110c38282610fe7565b915050602083015184820360208601526110dd8282610fe7565b91505060408301516110f26040860182611020565b5060608301516111056060860182611097565b508091505092915050565b600061111c83836110a6565b905092915050565b6000602082019050919050565b600061113c82610f6c565b6111468185610f77565b93508360208202850161115885610f88565b8060005b8581101561119457848403895281516111758582611110565b945061118083611124565b925060208a0199505060018101905061115c565b50829750879550505050505092915050565b600060208201905081810360008301526111c08184611131565b905092915050565b6111d181610b84565b82525050565b600082825260208201905092915050565b60006111f382610f98565b6111fd81856111d7565b935061120d818560208601610fb4565b61121681610bcc565b840191505092915050565b600060408201905061123660008301856111c8565b818103602083015261124881846111e8565b90509392505050565b60008151905061126081610d98565b92915050565b60006020828403121561127c5761127b610b5a565b5b600061128a84828501611251565b91505092915050565b60006060820190506112a860008301866111c8565b81810360208301526112ba81856111e8565b90506112c96040830184610d6e565b949350505050565b6112da81610e33565b81146112e557600080fd5b50565b6000815190506112f7816112d1565b92915050565b60006020828403121561131357611312610b5a565b5b6000611321848285016112e8565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061136482610d64565b915061136f83610d64565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156113a4576113a361132a565b5b828201905092915050565b6113b881610e6a565b81146113c357600080fd5b50565b6000815190506113d5816113af565b92915050565b6000602082840312156113f1576113f0610b5a565b5b60006113ff848285016113c6565b91505092915050565b7f7465737472657665727400000000000000000000000000000000000000000000600082015250565b600061143e600a836111d7565b915061144982611408565b602082019050919050565b6000602082019050818103600083015261146d81611431565b9050919050565b600060808201905061148960008301876111c8565b818103602083015261149b81866111e8565b905081810360408301526114af81856111e8565b90506114be6060830184610d6e565b95945050505050565b600067ffffffffffffffff8211156114e2576114e1610bdd565b5b602082029050602081019050919050565b600080fd5b600080fd5b600080fd5b600061151561151084610c58565b610c3d565b90508281526020810184848401111561153157611530610bc7565b5b61153c848285610fb4565b509392505050565b600082601f83011261155957611558610bc2565b5b8151611569848260208601611502565b91505092915050565b6004811061157f57600080fd5b50565b60008151905061159181611572565b92915050565b6000608082840312156115ad576115ac6114f8565b5b6115b76080610c3d565b9050600082015167ffffffffffffffff8111156115d7576115d66114fd565b5b6115e384828501611544565b600083015250602082015167ffffffffffffffff811115611607576116066114fd565b5b61161384828501611544565b6020830152506040611627848285016113c6565b604083015250606061163b84828501611582565b60608301525092915050565b600061165a611655846114c7565b610c3d565b9050808382526020820190506020840283018581111561167d5761167c6114f3565b5b835b818110156116c457805167ffffffffffffffff8111156116a2576116a1610bc2565b5b8086016116af8982611597565b8552602085019450505060208101905061167f565b5050509392505050565b600082601f8301126116e3576116e2610bc2565b5b81516116f3848260208601611647565b91505092915050565b60006020828403121561171257611711610b5a565b5b600082015167ffffffffffffffff8111156117305761172f610b5f565b5b61173c848285016116ce565b9150509291505056fea2646970667358221220fbbd8da0d7360633653761cbde3d46828949fcca1b71279d79140864c678daeb64736f6c634300080a0033", + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_wzeta\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"validatorSrc\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"validatorDst\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"MoveStake\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"validator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Stake\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"validator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Unstake\",\"type\":\"event\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"inputs\":[],\"name\":\"counter\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"depositWZETA\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllValidators\",\"outputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"operatorAddress\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"consensusPubKey\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"jailed\",\"type\":\"bool\"},{\"internalType\":\"enumBondStatus\",\"name\":\"bondStatus\",\"type\":\"uint8\"}],\"internalType\":\"structValidator[]\",\"name\":\"validators\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"validator\",\"type\":\"string\"}],\"name\":\"getShares\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"shares\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"validatorSrc\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"validatorDst\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"moveStake\",\"outputs\":[{\"internalType\":\"int64\",\"name\":\"completionTime\",\"type\":\"int64\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"validator\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"stake\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"validator\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"stakeAndRevert\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"validator\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"stakeWithStateUpdate\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"validator\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"unstake\",\"outputs\":[{\"internalType\":\"int64\",\"name\":\"completionTime\",\"type\":\"int64\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"wad\",\"type\":\"uint256\"}],\"name\":\"withdrawWZETA\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", + Bin: "0x608060405260666000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060006003553480156200005757600080fd5b506040516200192d3803806200192d83398181016040528101906200007d919062000170565b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050620001a2565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000138826200010b565b9050919050565b6200014a816200012b565b81146200015657600080fd5b50565b6000815190506200016a816200013f565b92915050565b60006020828403121562000189576200018862000106565b5b6000620001998482850162000159565b91505092915050565b61177b80620001b26000396000f3fe6080604052600436106100955760003560e01c806390b8436f1161005957806390b8436f1461018a5780639a0fb673146101c7578063bca8f527146101f0578063d11a93d01461022d578063f3513a371461026a5761009c565b80630d1b3daf1461009e5780632c5d24ae146100db57806357c6ea3e146100e557806361bc221a146101225780636be8916c1461014d5761009c565b3661009c57005b005b3480156100aa57600080fd5b506100c560048036038101906100c09190610d08565b610295565b6040516100d29190610d7d565b60405180910390f35b6100e361033c565b005b3480156100f157600080fd5b5061010c60048036038101906101079190610dc4565b61041b565b6040516101199190610e4f565b60405180910390f35b34801561012e57600080fd5b50610137610520565b6040516101449190610d7d565b60405180910390f35b34801561015957600080fd5b50610174600480360381019061016f9190610dc4565b610526565b6040516101819190610e85565b60405180910390f35b34801561019657600080fd5b506101b160048036038101906101ac9190610dc4565b61065c565b6040516101be9190610e85565b60405180910390f35b3480156101d357600080fd5b506101ee60048036038101906101e99190610ea0565b610761565b005b3480156101fc57600080fd5b5061021760048036038101906102129190610dc4565b61084b565b6040516102249190610e85565b60405180910390f35b34801561023957600080fd5b50610254600480360381019061024f9190610ecd565b6109ad565b6040516102619190610e4f565b60405180910390f35b34801561027657600080fd5b5061027f610ab5565b60405161028c91906111a6565b60405180910390f35b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630d1b3daf84846040518363ffffffff1660e01b81526004016102f3929190611221565b602060405180830381865afa158015610310573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103349190611266565b905092915050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461039657600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561040057600080fd5b505af1158015610414573d6000803e3d6000fd5b5050505050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461047757600080fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166357c6ea3e8585856040518463ffffffff1660e01b81526004016104d493929190611293565b6020604051808303816000875af11580156104f3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051791906112fd565b90509392505050565b60035481565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461058257600080fd5b60016003546105919190611359565b60038190555060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166390b8436f8686866040518463ffffffff1660e01b81526004016105f793929190611293565b6020604051808303816000875af1158015610616573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061063a91906113db565b9050600160035461064b9190611359565b600381905550809150509392505050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146106b857600080fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166390b8436f8585856040518463ffffffff1660e01b815260040161071593929190611293565b6020604051808303816000875af1158015610734573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061075891906113db565b90509392505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146107bb57600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d826040518263ffffffff1660e01b81526004016108169190610d7d565b600060405180830381600087803b15801561083057600080fd5b505af1158015610844573d6000803e3d6000fd5b5050505050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146108a757600080fd5b60016003546108b69190611359565b60038190555060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166390b8436f8585856040518463ffffffff1660e01b815260040161091993929190611293565b6020604051808303816000875af1158015610938573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061095c91906113db565b50600160035461096c9190611359565b6003819055506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a490611454565b60405180910390fd5b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a0957600080fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d11a93d0868686866040518563ffffffff1660e01b8152600401610a689493929190611474565b6020604051808303816000875af1158015610a87573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aab91906112fd565b9050949350505050565b606060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f3513a376040518163ffffffff1660e01b8152600401600060405180830381865afa158015610b22573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610b4b91906116fc565b905090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610b8f82610b64565b9050919050565b610b9f81610b84565b8114610baa57600080fd5b50565b600081359050610bbc81610b96565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610c1582610bcc565b810181811067ffffffffffffffff82111715610c3457610c33610bdd565b5b80604052505050565b6000610c47610b50565b9050610c538282610c0c565b919050565b600067ffffffffffffffff821115610c7357610c72610bdd565b5b610c7c82610bcc565b9050602081019050919050565b82818337600083830152505050565b6000610cab610ca684610c58565b610c3d565b905082815260208101848484011115610cc757610cc6610bc7565b5b610cd2848285610c89565b509392505050565b600082601f830112610cef57610cee610bc2565b5b8135610cff848260208601610c98565b91505092915050565b60008060408385031215610d1f57610d1e610b5a565b5b6000610d2d85828601610bad565b925050602083013567ffffffffffffffff811115610d4e57610d4d610b5f565b5b610d5a85828601610cda565b9150509250929050565b6000819050919050565b610d7781610d64565b82525050565b6000602082019050610d926000830184610d6e565b92915050565b610da181610d64565b8114610dac57600080fd5b50565b600081359050610dbe81610d98565b92915050565b600080600060608486031215610ddd57610ddc610b5a565b5b6000610deb86828701610bad565b935050602084013567ffffffffffffffff811115610e0c57610e0b610b5f565b5b610e1886828701610cda565b9250506040610e2986828701610daf565b9150509250925092565b60008160070b9050919050565b610e4981610e33565b82525050565b6000602082019050610e646000830184610e40565b92915050565b60008115159050919050565b610e7f81610e6a565b82525050565b6000602082019050610e9a6000830184610e76565b92915050565b600060208284031215610eb657610eb5610b5a565b5b6000610ec484828501610daf565b91505092915050565b60008060008060808587031215610ee757610ee6610b5a565b5b6000610ef587828801610bad565b945050602085013567ffffffffffffffff811115610f1657610f15610b5f565b5b610f2287828801610cda565b935050604085013567ffffffffffffffff811115610f4357610f42610b5f565b5b610f4f87828801610cda565b9250506060610f6087828801610daf565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610fd2578082015181840152602081019050610fb7565b83811115610fe1576000848401525b50505050565b6000610ff282610f98565b610ffc8185610fa3565b935061100c818560208601610fb4565b61101581610bcc565b840191505092915050565b61102981610e6a565b82525050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6004811061106f5761106e61102f565b5b50565b60008190506110808261105e565b919050565b600061109082611072565b9050919050565b6110a081611085565b82525050565b600060808301600083015184820360008601526110c38282610fe7565b915050602083015184820360208601526110dd8282610fe7565b91505060408301516110f26040860182611020565b5060608301516111056060860182611097565b508091505092915050565b600061111c83836110a6565b905092915050565b6000602082019050919050565b600061113c82610f6c565b6111468185610f77565b93508360208202850161115885610f88565b8060005b8581101561119457848403895281516111758582611110565b945061118083611124565b925060208a0199505060018101905061115c565b50829750879550505050505092915050565b600060208201905081810360008301526111c08184611131565b905092915050565b6111d181610b84565b82525050565b600082825260208201905092915050565b60006111f382610f98565b6111fd81856111d7565b935061120d818560208601610fb4565b61121681610bcc565b840191505092915050565b600060408201905061123660008301856111c8565b818103602083015261124881846111e8565b90509392505050565b60008151905061126081610d98565b92915050565b60006020828403121561127c5761127b610b5a565b5b600061128a84828501611251565b91505092915050565b60006060820190506112a860008301866111c8565b81810360208301526112ba81856111e8565b90506112c96040830184610d6e565b949350505050565b6112da81610e33565b81146112e557600080fd5b50565b6000815190506112f7816112d1565b92915050565b60006020828403121561131357611312610b5a565b5b6000611321848285016112e8565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061136482610d64565b915061136f83610d64565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156113a4576113a361132a565b5b828201905092915050565b6113b881610e6a565b81146113c357600080fd5b50565b6000815190506113d5816113af565b92915050565b6000602082840312156113f1576113f0610b5a565b5b60006113ff848285016113c6565b91505092915050565b7f7465737472657665727400000000000000000000000000000000000000000000600082015250565b600061143e600a836111d7565b915061144982611408565b602082019050919050565b6000602082019050818103600083015261146d81611431565b9050919050565b600060808201905061148960008301876111c8565b818103602083015261149b81866111e8565b905081810360408301526114af81856111e8565b90506114be6060830184610d6e565b95945050505050565b600067ffffffffffffffff8211156114e2576114e1610bdd565b5b602082029050602081019050919050565b600080fd5b600080fd5b600080fd5b600061151561151084610c58565b610c3d565b90508281526020810184848401111561153157611530610bc7565b5b61153c848285610fb4565b509392505050565b600082601f83011261155957611558610bc2565b5b8151611569848260208601611502565b91505092915050565b6004811061157f57600080fd5b50565b60008151905061159181611572565b92915050565b6000608082840312156115ad576115ac6114f8565b5b6115b76080610c3d565b9050600082015167ffffffffffffffff8111156115d7576115d66114fd565b5b6115e384828501611544565b600083015250602082015167ffffffffffffffff811115611607576116066114fd565b5b61161384828501611544565b6020830152506040611627848285016113c6565b604083015250606061163b84828501611582565b60608301525092915050565b600061165a611655846114c7565b610c3d565b9050808382526020820190506020840283018581111561167d5761167c6114f3565b5b835b818110156116c457805167ffffffffffffffff8111156116a2576116a1610bc2565b5b8086016116af8982611597565b8552602085019450505060208101905061167f565b5050509392505050565b600082601f8301126116e3576116e2610bc2565b5b81516116f3848260208601611647565b91505092915050565b60006020828403121561171257611711610b5a565b5b600082015167ffffffffffffffff8111156117305761172f610b5f565b5b61173c848285016116ce565b9150509291505056fea26469706673582212201d48926082b046ce0a5b741a926eefe8bb0873c1d992ea4a6c4210a133dbaae764736f6c634300080a0033", } // TestStakingABI is the input ABI used to generate the binding from. @@ -491,3 +491,474 @@ func (_TestStaking *TestStakingSession) Receive() (*types.Transaction, error) { func (_TestStaking *TestStakingTransactorSession) Receive() (*types.Transaction, error) { return _TestStaking.Contract.Receive(&_TestStaking.TransactOpts) } + +// TestStakingMoveStakeIterator is returned from FilterMoveStake and is used to iterate over the raw logs and unpacked data for MoveStake events raised by the TestStaking contract. +type TestStakingMoveStakeIterator struct { + Event *TestStakingMoveStake // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *TestStakingMoveStakeIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(TestStakingMoveStake) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(TestStakingMoveStake) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *TestStakingMoveStakeIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *TestStakingMoveStakeIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// TestStakingMoveStake represents a MoveStake event raised by the TestStaking contract. +type TestStakingMoveStake struct { + Staker common.Address + ValidatorSrc common.Address + ValidatorDst common.Address + Amount *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterMoveStake is a free log retrieval operation binding the contract event 0x4dda2c731d442025256e6e47fbb109592bcd8baf3cf25996ebd09f1da7ec902b. +// +// Solidity: event MoveStake(address indexed staker, address indexed validatorSrc, address indexed validatorDst, uint256 amount) +func (_TestStaking *TestStakingFilterer) FilterMoveStake(opts *bind.FilterOpts, staker []common.Address, validatorSrc []common.Address, validatorDst []common.Address) (*TestStakingMoveStakeIterator, error) { + + var stakerRule []interface{} + for _, stakerItem := range staker { + stakerRule = append(stakerRule, stakerItem) + } + var validatorSrcRule []interface{} + for _, validatorSrcItem := range validatorSrc { + validatorSrcRule = append(validatorSrcRule, validatorSrcItem) + } + var validatorDstRule []interface{} + for _, validatorDstItem := range validatorDst { + validatorDstRule = append(validatorDstRule, validatorDstItem) + } + + logs, sub, err := _TestStaking.contract.FilterLogs(opts, "MoveStake", stakerRule, validatorSrcRule, validatorDstRule) + if err != nil { + return nil, err + } + return &TestStakingMoveStakeIterator{contract: _TestStaking.contract, event: "MoveStake", logs: logs, sub: sub}, nil +} + +// WatchMoveStake is a free log subscription operation binding the contract event 0x4dda2c731d442025256e6e47fbb109592bcd8baf3cf25996ebd09f1da7ec902b. +// +// Solidity: event MoveStake(address indexed staker, address indexed validatorSrc, address indexed validatorDst, uint256 amount) +func (_TestStaking *TestStakingFilterer) WatchMoveStake(opts *bind.WatchOpts, sink chan<- *TestStakingMoveStake, staker []common.Address, validatorSrc []common.Address, validatorDst []common.Address) (event.Subscription, error) { + + var stakerRule []interface{} + for _, stakerItem := range staker { + stakerRule = append(stakerRule, stakerItem) + } + var validatorSrcRule []interface{} + for _, validatorSrcItem := range validatorSrc { + validatorSrcRule = append(validatorSrcRule, validatorSrcItem) + } + var validatorDstRule []interface{} + for _, validatorDstItem := range validatorDst { + validatorDstRule = append(validatorDstRule, validatorDstItem) + } + + logs, sub, err := _TestStaking.contract.WatchLogs(opts, "MoveStake", stakerRule, validatorSrcRule, validatorDstRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(TestStakingMoveStake) + if err := _TestStaking.contract.UnpackLog(event, "MoveStake", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseMoveStake is a log parse operation binding the contract event 0x4dda2c731d442025256e6e47fbb109592bcd8baf3cf25996ebd09f1da7ec902b. +// +// Solidity: event MoveStake(address indexed staker, address indexed validatorSrc, address indexed validatorDst, uint256 amount) +func (_TestStaking *TestStakingFilterer) ParseMoveStake(log types.Log) (*TestStakingMoveStake, error) { + event := new(TestStakingMoveStake) + if err := _TestStaking.contract.UnpackLog(event, "MoveStake", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// TestStakingStakeIterator is returned from FilterStake and is used to iterate over the raw logs and unpacked data for Stake events raised by the TestStaking contract. +type TestStakingStakeIterator struct { + Event *TestStakingStake // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *TestStakingStakeIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(TestStakingStake) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(TestStakingStake) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *TestStakingStakeIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *TestStakingStakeIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// TestStakingStake represents a Stake event raised by the TestStaking contract. +type TestStakingStake struct { + Staker common.Address + Validator common.Address + Amount *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterStake is a free log retrieval operation binding the contract event 0x99039fcf0a98f484616c5196ee8b2ecfa971babf0b519848289ea4db381f85f7. +// +// Solidity: event Stake(address indexed staker, address indexed validator, uint256 amount) +func (_TestStaking *TestStakingFilterer) FilterStake(opts *bind.FilterOpts, staker []common.Address, validator []common.Address) (*TestStakingStakeIterator, error) { + + var stakerRule []interface{} + for _, stakerItem := range staker { + stakerRule = append(stakerRule, stakerItem) + } + var validatorRule []interface{} + for _, validatorItem := range validator { + validatorRule = append(validatorRule, validatorItem) + } + + logs, sub, err := _TestStaking.contract.FilterLogs(opts, "Stake", stakerRule, validatorRule) + if err != nil { + return nil, err + } + return &TestStakingStakeIterator{contract: _TestStaking.contract, event: "Stake", logs: logs, sub: sub}, nil +} + +// WatchStake is a free log subscription operation binding the contract event 0x99039fcf0a98f484616c5196ee8b2ecfa971babf0b519848289ea4db381f85f7. +// +// Solidity: event Stake(address indexed staker, address indexed validator, uint256 amount) +func (_TestStaking *TestStakingFilterer) WatchStake(opts *bind.WatchOpts, sink chan<- *TestStakingStake, staker []common.Address, validator []common.Address) (event.Subscription, error) { + + var stakerRule []interface{} + for _, stakerItem := range staker { + stakerRule = append(stakerRule, stakerItem) + } + var validatorRule []interface{} + for _, validatorItem := range validator { + validatorRule = append(validatorRule, validatorItem) + } + + logs, sub, err := _TestStaking.contract.WatchLogs(opts, "Stake", stakerRule, validatorRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(TestStakingStake) + if err := _TestStaking.contract.UnpackLog(event, "Stake", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseStake is a log parse operation binding the contract event 0x99039fcf0a98f484616c5196ee8b2ecfa971babf0b519848289ea4db381f85f7. +// +// Solidity: event Stake(address indexed staker, address indexed validator, uint256 amount) +func (_TestStaking *TestStakingFilterer) ParseStake(log types.Log) (*TestStakingStake, error) { + event := new(TestStakingStake) + if err := _TestStaking.contract.UnpackLog(event, "Stake", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// TestStakingUnstakeIterator is returned from FilterUnstake and is used to iterate over the raw logs and unpacked data for Unstake events raised by the TestStaking contract. +type TestStakingUnstakeIterator struct { + Event *TestStakingUnstake // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *TestStakingUnstakeIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(TestStakingUnstake) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(TestStakingUnstake) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *TestStakingUnstakeIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *TestStakingUnstakeIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// TestStakingUnstake represents a Unstake event raised by the TestStaking contract. +type TestStakingUnstake struct { + Staker common.Address + Validator common.Address + Amount *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterUnstake is a free log retrieval operation binding the contract event 0x390b1276974b9463e5d66ab10df69b6f3d7b930eb066a0e66df327edd2cc811c. +// +// Solidity: event Unstake(address indexed staker, address indexed validator, uint256 amount) +func (_TestStaking *TestStakingFilterer) FilterUnstake(opts *bind.FilterOpts, staker []common.Address, validator []common.Address) (*TestStakingUnstakeIterator, error) { + + var stakerRule []interface{} + for _, stakerItem := range staker { + stakerRule = append(stakerRule, stakerItem) + } + var validatorRule []interface{} + for _, validatorItem := range validator { + validatorRule = append(validatorRule, validatorItem) + } + + logs, sub, err := _TestStaking.contract.FilterLogs(opts, "Unstake", stakerRule, validatorRule) + if err != nil { + return nil, err + } + return &TestStakingUnstakeIterator{contract: _TestStaking.contract, event: "Unstake", logs: logs, sub: sub}, nil +} + +// WatchUnstake is a free log subscription operation binding the contract event 0x390b1276974b9463e5d66ab10df69b6f3d7b930eb066a0e66df327edd2cc811c. +// +// Solidity: event Unstake(address indexed staker, address indexed validator, uint256 amount) +func (_TestStaking *TestStakingFilterer) WatchUnstake(opts *bind.WatchOpts, sink chan<- *TestStakingUnstake, staker []common.Address, validator []common.Address) (event.Subscription, error) { + + var stakerRule []interface{} + for _, stakerItem := range staker { + stakerRule = append(stakerRule, stakerItem) + } + var validatorRule []interface{} + for _, validatorItem := range validator { + validatorRule = append(validatorRule, validatorItem) + } + + logs, sub, err := _TestStaking.contract.WatchLogs(opts, "Unstake", stakerRule, validatorRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(TestStakingUnstake) + if err := _TestStaking.contract.UnpackLog(event, "Unstake", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseUnstake is a log parse operation binding the contract event 0x390b1276974b9463e5d66ab10df69b6f3d7b930eb066a0e66df327edd2cc811c. +// +// Solidity: event Unstake(address indexed staker, address indexed validator, uint256 amount) +func (_TestStaking *TestStakingFilterer) ParseUnstake(log types.Log) (*TestStakingUnstake, error) { + event := new(TestStakingUnstake) + if err := _TestStaking.contract.UnpackLog(event, "Unstake", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/e2e/contracts/teststaking/TestStaking.json b/e2e/contracts/teststaking/TestStaking.json index fbfc23ab37..6fde4261f5 100644 --- a/e2e/contracts/teststaking/TestStaking.json +++ b/e2e/contracts/teststaking/TestStaking.json @@ -11,6 +11,87 @@ "stateMutability": "nonpayable", "type": "constructor" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "staker", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "validatorSrc", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "validatorDst", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "MoveStake", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "staker", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "validator", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Stake", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "staker", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "validator", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Unstake", + "type": "event" + }, { "stateMutability": "payable", "type": "fallback" @@ -262,5 +343,5 @@ "type": "receive" } ], - "bin": "608060405260666000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060006003553480156200005757600080fd5b506040516200192d3803806200192d83398181016040528101906200007d919062000170565b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050620001a2565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000138826200010b565b9050919050565b6200014a816200012b565b81146200015657600080fd5b50565b6000815190506200016a816200013f565b92915050565b60006020828403121562000189576200018862000106565b5b6000620001998482850162000159565b91505092915050565b61177b80620001b26000396000f3fe6080604052600436106100955760003560e01c806390b8436f1161005957806390b8436f1461018a5780639a0fb673146101c7578063bca8f527146101f0578063d11a93d01461022d578063f3513a371461026a5761009c565b80630d1b3daf1461009e5780632c5d24ae146100db57806357c6ea3e146100e557806361bc221a146101225780636be8916c1461014d5761009c565b3661009c57005b005b3480156100aa57600080fd5b506100c560048036038101906100c09190610d08565b610295565b6040516100d29190610d7d565b60405180910390f35b6100e361033c565b005b3480156100f157600080fd5b5061010c60048036038101906101079190610dc4565b61041b565b6040516101199190610e4f565b60405180910390f35b34801561012e57600080fd5b50610137610520565b6040516101449190610d7d565b60405180910390f35b34801561015957600080fd5b50610174600480360381019061016f9190610dc4565b610526565b6040516101819190610e85565b60405180910390f35b34801561019657600080fd5b506101b160048036038101906101ac9190610dc4565b61065c565b6040516101be9190610e85565b60405180910390f35b3480156101d357600080fd5b506101ee60048036038101906101e99190610ea0565b610761565b005b3480156101fc57600080fd5b5061021760048036038101906102129190610dc4565b61084b565b6040516102249190610e85565b60405180910390f35b34801561023957600080fd5b50610254600480360381019061024f9190610ecd565b6109ad565b6040516102619190610e4f565b60405180910390f35b34801561027657600080fd5b5061027f610ab5565b60405161028c91906111a6565b60405180910390f35b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630d1b3daf84846040518363ffffffff1660e01b81526004016102f3929190611221565b602060405180830381865afa158015610310573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103349190611266565b905092915050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461039657600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561040057600080fd5b505af1158015610414573d6000803e3d6000fd5b5050505050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461047757600080fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166357c6ea3e8585856040518463ffffffff1660e01b81526004016104d493929190611293565b6020604051808303816000875af11580156104f3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051791906112fd565b90509392505050565b60035481565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461058257600080fd5b60016003546105919190611359565b60038190555060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166390b8436f8686866040518463ffffffff1660e01b81526004016105f793929190611293565b6020604051808303816000875af1158015610616573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061063a91906113db565b9050600160035461064b9190611359565b600381905550809150509392505050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146106b857600080fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166390b8436f8585856040518463ffffffff1660e01b815260040161071593929190611293565b6020604051808303816000875af1158015610734573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061075891906113db565b90509392505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146107bb57600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d826040518263ffffffff1660e01b81526004016108169190610d7d565b600060405180830381600087803b15801561083057600080fd5b505af1158015610844573d6000803e3d6000fd5b5050505050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146108a757600080fd5b60016003546108b69190611359565b60038190555060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166390b8436f8585856040518463ffffffff1660e01b815260040161091993929190611293565b6020604051808303816000875af1158015610938573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061095c91906113db565b50600160035461096c9190611359565b6003819055506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a490611454565b60405180910390fd5b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a0957600080fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d11a93d0868686866040518563ffffffff1660e01b8152600401610a689493929190611474565b6020604051808303816000875af1158015610a87573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aab91906112fd565b9050949350505050565b606060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f3513a376040518163ffffffff1660e01b8152600401600060405180830381865afa158015610b22573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610b4b91906116fc565b905090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610b8f82610b64565b9050919050565b610b9f81610b84565b8114610baa57600080fd5b50565b600081359050610bbc81610b96565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610c1582610bcc565b810181811067ffffffffffffffff82111715610c3457610c33610bdd565b5b80604052505050565b6000610c47610b50565b9050610c538282610c0c565b919050565b600067ffffffffffffffff821115610c7357610c72610bdd565b5b610c7c82610bcc565b9050602081019050919050565b82818337600083830152505050565b6000610cab610ca684610c58565b610c3d565b905082815260208101848484011115610cc757610cc6610bc7565b5b610cd2848285610c89565b509392505050565b600082601f830112610cef57610cee610bc2565b5b8135610cff848260208601610c98565b91505092915050565b60008060408385031215610d1f57610d1e610b5a565b5b6000610d2d85828601610bad565b925050602083013567ffffffffffffffff811115610d4e57610d4d610b5f565b5b610d5a85828601610cda565b9150509250929050565b6000819050919050565b610d7781610d64565b82525050565b6000602082019050610d926000830184610d6e565b92915050565b610da181610d64565b8114610dac57600080fd5b50565b600081359050610dbe81610d98565b92915050565b600080600060608486031215610ddd57610ddc610b5a565b5b6000610deb86828701610bad565b935050602084013567ffffffffffffffff811115610e0c57610e0b610b5f565b5b610e1886828701610cda565b9250506040610e2986828701610daf565b9150509250925092565b60008160070b9050919050565b610e4981610e33565b82525050565b6000602082019050610e646000830184610e40565b92915050565b60008115159050919050565b610e7f81610e6a565b82525050565b6000602082019050610e9a6000830184610e76565b92915050565b600060208284031215610eb657610eb5610b5a565b5b6000610ec484828501610daf565b91505092915050565b60008060008060808587031215610ee757610ee6610b5a565b5b6000610ef587828801610bad565b945050602085013567ffffffffffffffff811115610f1657610f15610b5f565b5b610f2287828801610cda565b935050604085013567ffffffffffffffff811115610f4357610f42610b5f565b5b610f4f87828801610cda565b9250506060610f6087828801610daf565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610fd2578082015181840152602081019050610fb7565b83811115610fe1576000848401525b50505050565b6000610ff282610f98565b610ffc8185610fa3565b935061100c818560208601610fb4565b61101581610bcc565b840191505092915050565b61102981610e6a565b82525050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6004811061106f5761106e61102f565b5b50565b60008190506110808261105e565b919050565b600061109082611072565b9050919050565b6110a081611085565b82525050565b600060808301600083015184820360008601526110c38282610fe7565b915050602083015184820360208601526110dd8282610fe7565b91505060408301516110f26040860182611020565b5060608301516111056060860182611097565b508091505092915050565b600061111c83836110a6565b905092915050565b6000602082019050919050565b600061113c82610f6c565b6111468185610f77565b93508360208202850161115885610f88565b8060005b8581101561119457848403895281516111758582611110565b945061118083611124565b925060208a0199505060018101905061115c565b50829750879550505050505092915050565b600060208201905081810360008301526111c08184611131565b905092915050565b6111d181610b84565b82525050565b600082825260208201905092915050565b60006111f382610f98565b6111fd81856111d7565b935061120d818560208601610fb4565b61121681610bcc565b840191505092915050565b600060408201905061123660008301856111c8565b818103602083015261124881846111e8565b90509392505050565b60008151905061126081610d98565b92915050565b60006020828403121561127c5761127b610b5a565b5b600061128a84828501611251565b91505092915050565b60006060820190506112a860008301866111c8565b81810360208301526112ba81856111e8565b90506112c96040830184610d6e565b949350505050565b6112da81610e33565b81146112e557600080fd5b50565b6000815190506112f7816112d1565b92915050565b60006020828403121561131357611312610b5a565b5b6000611321848285016112e8565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061136482610d64565b915061136f83610d64565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156113a4576113a361132a565b5b828201905092915050565b6113b881610e6a565b81146113c357600080fd5b50565b6000815190506113d5816113af565b92915050565b6000602082840312156113f1576113f0610b5a565b5b60006113ff848285016113c6565b91505092915050565b7f7465737472657665727400000000000000000000000000000000000000000000600082015250565b600061143e600a836111d7565b915061144982611408565b602082019050919050565b6000602082019050818103600083015261146d81611431565b9050919050565b600060808201905061148960008301876111c8565b818103602083015261149b81866111e8565b905081810360408301526114af81856111e8565b90506114be6060830184610d6e565b95945050505050565b600067ffffffffffffffff8211156114e2576114e1610bdd565b5b602082029050602081019050919050565b600080fd5b600080fd5b600080fd5b600061151561151084610c58565b610c3d565b90508281526020810184848401111561153157611530610bc7565b5b61153c848285610fb4565b509392505050565b600082601f83011261155957611558610bc2565b5b8151611569848260208601611502565b91505092915050565b6004811061157f57600080fd5b50565b60008151905061159181611572565b92915050565b6000608082840312156115ad576115ac6114f8565b5b6115b76080610c3d565b9050600082015167ffffffffffffffff8111156115d7576115d66114fd565b5b6115e384828501611544565b600083015250602082015167ffffffffffffffff811115611607576116066114fd565b5b61161384828501611544565b6020830152506040611627848285016113c6565b604083015250606061163b84828501611582565b60608301525092915050565b600061165a611655846114c7565b610c3d565b9050808382526020820190506020840283018581111561167d5761167c6114f3565b5b835b818110156116c457805167ffffffffffffffff8111156116a2576116a1610bc2565b5b8086016116af8982611597565b8552602085019450505060208101905061167f565b5050509392505050565b600082601f8301126116e3576116e2610bc2565b5b81516116f3848260208601611647565b91505092915050565b60006020828403121561171257611711610b5a565b5b600082015167ffffffffffffffff8111156117305761172f610b5f565b5b61173c848285016116ce565b9150509291505056fea2646970667358221220fbbd8da0d7360633653761cbde3d46828949fcca1b71279d79140864c678daeb64736f6c634300080a0033" + "bin": "608060405260666000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060006003553480156200005757600080fd5b506040516200192d3803806200192d83398181016040528101906200007d919062000170565b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050620001a2565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000138826200010b565b9050919050565b6200014a816200012b565b81146200015657600080fd5b50565b6000815190506200016a816200013f565b92915050565b60006020828403121562000189576200018862000106565b5b6000620001998482850162000159565b91505092915050565b61177b80620001b26000396000f3fe6080604052600436106100955760003560e01c806390b8436f1161005957806390b8436f1461018a5780639a0fb673146101c7578063bca8f527146101f0578063d11a93d01461022d578063f3513a371461026a5761009c565b80630d1b3daf1461009e5780632c5d24ae146100db57806357c6ea3e146100e557806361bc221a146101225780636be8916c1461014d5761009c565b3661009c57005b005b3480156100aa57600080fd5b506100c560048036038101906100c09190610d08565b610295565b6040516100d29190610d7d565b60405180910390f35b6100e361033c565b005b3480156100f157600080fd5b5061010c60048036038101906101079190610dc4565b61041b565b6040516101199190610e4f565b60405180910390f35b34801561012e57600080fd5b50610137610520565b6040516101449190610d7d565b60405180910390f35b34801561015957600080fd5b50610174600480360381019061016f9190610dc4565b610526565b6040516101819190610e85565b60405180910390f35b34801561019657600080fd5b506101b160048036038101906101ac9190610dc4565b61065c565b6040516101be9190610e85565b60405180910390f35b3480156101d357600080fd5b506101ee60048036038101906101e99190610ea0565b610761565b005b3480156101fc57600080fd5b5061021760048036038101906102129190610dc4565b61084b565b6040516102249190610e85565b60405180910390f35b34801561023957600080fd5b50610254600480360381019061024f9190610ecd565b6109ad565b6040516102619190610e4f565b60405180910390f35b34801561027657600080fd5b5061027f610ab5565b60405161028c91906111a6565b60405180910390f35b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630d1b3daf84846040518363ffffffff1660e01b81526004016102f3929190611221565b602060405180830381865afa158015610310573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103349190611266565b905092915050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461039657600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561040057600080fd5b505af1158015610414573d6000803e3d6000fd5b5050505050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461047757600080fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166357c6ea3e8585856040518463ffffffff1660e01b81526004016104d493929190611293565b6020604051808303816000875af11580156104f3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051791906112fd565b90509392505050565b60035481565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461058257600080fd5b60016003546105919190611359565b60038190555060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166390b8436f8686866040518463ffffffff1660e01b81526004016105f793929190611293565b6020604051808303816000875af1158015610616573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061063a91906113db565b9050600160035461064b9190611359565b600381905550809150509392505050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146106b857600080fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166390b8436f8585856040518463ffffffff1660e01b815260040161071593929190611293565b6020604051808303816000875af1158015610734573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061075891906113db565b90509392505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146107bb57600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d826040518263ffffffff1660e01b81526004016108169190610d7d565b600060405180830381600087803b15801561083057600080fd5b505af1158015610844573d6000803e3d6000fd5b5050505050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146108a757600080fd5b60016003546108b69190611359565b60038190555060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166390b8436f8585856040518463ffffffff1660e01b815260040161091993929190611293565b6020604051808303816000875af1158015610938573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061095c91906113db565b50600160035461096c9190611359565b6003819055506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a490611454565b60405180910390fd5b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a0957600080fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d11a93d0868686866040518563ffffffff1660e01b8152600401610a689493929190611474565b6020604051808303816000875af1158015610a87573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aab91906112fd565b9050949350505050565b606060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f3513a376040518163ffffffff1660e01b8152600401600060405180830381865afa158015610b22573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610b4b91906116fc565b905090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610b8f82610b64565b9050919050565b610b9f81610b84565b8114610baa57600080fd5b50565b600081359050610bbc81610b96565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610c1582610bcc565b810181811067ffffffffffffffff82111715610c3457610c33610bdd565b5b80604052505050565b6000610c47610b50565b9050610c538282610c0c565b919050565b600067ffffffffffffffff821115610c7357610c72610bdd565b5b610c7c82610bcc565b9050602081019050919050565b82818337600083830152505050565b6000610cab610ca684610c58565b610c3d565b905082815260208101848484011115610cc757610cc6610bc7565b5b610cd2848285610c89565b509392505050565b600082601f830112610cef57610cee610bc2565b5b8135610cff848260208601610c98565b91505092915050565b60008060408385031215610d1f57610d1e610b5a565b5b6000610d2d85828601610bad565b925050602083013567ffffffffffffffff811115610d4e57610d4d610b5f565b5b610d5a85828601610cda565b9150509250929050565b6000819050919050565b610d7781610d64565b82525050565b6000602082019050610d926000830184610d6e565b92915050565b610da181610d64565b8114610dac57600080fd5b50565b600081359050610dbe81610d98565b92915050565b600080600060608486031215610ddd57610ddc610b5a565b5b6000610deb86828701610bad565b935050602084013567ffffffffffffffff811115610e0c57610e0b610b5f565b5b610e1886828701610cda565b9250506040610e2986828701610daf565b9150509250925092565b60008160070b9050919050565b610e4981610e33565b82525050565b6000602082019050610e646000830184610e40565b92915050565b60008115159050919050565b610e7f81610e6a565b82525050565b6000602082019050610e9a6000830184610e76565b92915050565b600060208284031215610eb657610eb5610b5a565b5b6000610ec484828501610daf565b91505092915050565b60008060008060808587031215610ee757610ee6610b5a565b5b6000610ef587828801610bad565b945050602085013567ffffffffffffffff811115610f1657610f15610b5f565b5b610f2287828801610cda565b935050604085013567ffffffffffffffff811115610f4357610f42610b5f565b5b610f4f87828801610cda565b9250506060610f6087828801610daf565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610fd2578082015181840152602081019050610fb7565b83811115610fe1576000848401525b50505050565b6000610ff282610f98565b610ffc8185610fa3565b935061100c818560208601610fb4565b61101581610bcc565b840191505092915050565b61102981610e6a565b82525050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6004811061106f5761106e61102f565b5b50565b60008190506110808261105e565b919050565b600061109082611072565b9050919050565b6110a081611085565b82525050565b600060808301600083015184820360008601526110c38282610fe7565b915050602083015184820360208601526110dd8282610fe7565b91505060408301516110f26040860182611020565b5060608301516111056060860182611097565b508091505092915050565b600061111c83836110a6565b905092915050565b6000602082019050919050565b600061113c82610f6c565b6111468185610f77565b93508360208202850161115885610f88565b8060005b8581101561119457848403895281516111758582611110565b945061118083611124565b925060208a0199505060018101905061115c565b50829750879550505050505092915050565b600060208201905081810360008301526111c08184611131565b905092915050565b6111d181610b84565b82525050565b600082825260208201905092915050565b60006111f382610f98565b6111fd81856111d7565b935061120d818560208601610fb4565b61121681610bcc565b840191505092915050565b600060408201905061123660008301856111c8565b818103602083015261124881846111e8565b90509392505050565b60008151905061126081610d98565b92915050565b60006020828403121561127c5761127b610b5a565b5b600061128a84828501611251565b91505092915050565b60006060820190506112a860008301866111c8565b81810360208301526112ba81856111e8565b90506112c96040830184610d6e565b949350505050565b6112da81610e33565b81146112e557600080fd5b50565b6000815190506112f7816112d1565b92915050565b60006020828403121561131357611312610b5a565b5b6000611321848285016112e8565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061136482610d64565b915061136f83610d64565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156113a4576113a361132a565b5b828201905092915050565b6113b881610e6a565b81146113c357600080fd5b50565b6000815190506113d5816113af565b92915050565b6000602082840312156113f1576113f0610b5a565b5b60006113ff848285016113c6565b91505092915050565b7f7465737472657665727400000000000000000000000000000000000000000000600082015250565b600061143e600a836111d7565b915061144982611408565b602082019050919050565b6000602082019050818103600083015261146d81611431565b9050919050565b600060808201905061148960008301876111c8565b818103602083015261149b81866111e8565b905081810360408301526114af81856111e8565b90506114be6060830184610d6e565b95945050505050565b600067ffffffffffffffff8211156114e2576114e1610bdd565b5b602082029050602081019050919050565b600080fd5b600080fd5b600080fd5b600061151561151084610c58565b610c3d565b90508281526020810184848401111561153157611530610bc7565b5b61153c848285610fb4565b509392505050565b600082601f83011261155957611558610bc2565b5b8151611569848260208601611502565b91505092915050565b6004811061157f57600080fd5b50565b60008151905061159181611572565b92915050565b6000608082840312156115ad576115ac6114f8565b5b6115b76080610c3d565b9050600082015167ffffffffffffffff8111156115d7576115d66114fd565b5b6115e384828501611544565b600083015250602082015167ffffffffffffffff811115611607576116066114fd565b5b61161384828501611544565b6020830152506040611627848285016113c6565b604083015250606061163b84828501611582565b60608301525092915050565b600061165a611655846114c7565b610c3d565b9050808382526020820190506020840283018581111561167d5761167c6114f3565b5b835b818110156116c457805167ffffffffffffffff8111156116a2576116a1610bc2565b5b8086016116af8982611597565b8552602085019450505060208101905061167f565b5050509392505050565b600082601f8301126116e3576116e2610bc2565b5b81516116f3848260208601611647565b91505092915050565b60006020828403121561171257611711610b5a565b5b600082015167ffffffffffffffff8111156117305761172f610b5f565b5b61173c848285016116ce565b9150509291505056fea26469706673582212201d48926082b046ce0a5b741a926eefe8bb0873c1d992ea4a6c4210a133dbaae764736f6c634300080a0033" } diff --git a/e2e/contracts/teststaking/TestStaking.sol b/e2e/contracts/teststaking/TestStaking.sol index a92786519b..48a3837100 100644 --- a/e2e/contracts/teststaking/TestStaking.sol +++ b/e2e/contracts/teststaking/TestStaking.sol @@ -48,6 +48,25 @@ interface WZETA { // @dev Purpose of this contract is to call staking precompile contract TestStaking { + event Stake( + address indexed staker, + address indexed validator, + uint256 amount + ); + + event Unstake( + address indexed staker, + address indexed validator, + uint256 amount + ); + + event MoveStake( + address indexed staker, + address indexed validatorSrc, + address indexed validatorDst, + uint256 amount + ); + IStaking staking = IStaking(0x0000000000000000000000000000000000000066); WZETA wzeta; address owner; diff --git a/e2e/e2etests/test_precompiles_staking_through_contract.go b/e2e/e2etests/test_precompiles_staking_through_contract.go index a9112f5b6e..93b065a770 100644 --- a/e2e/e2etests/test_precompiles_staking_through_contract.go +++ b/e2e/e2etests/test_precompiles_staking_through_contract.go @@ -7,6 +7,7 @@ import ( banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" "github.com/stretchr/testify/require" "github.com/zeta-chain/node/cmd/zetacored/config" @@ -99,7 +100,16 @@ func TestPrecompilesStakingThroughContract(r *runner.E2ERunner, args []string) { // stake 1 to validator1 using testStaking smart contract without smart contract state update tx, err = testStaking.Stake(r.ZEVMAuth, testStakingAddr, validators[0].OperatorAddress, big.NewInt(1)) require.NoError(r, err) - utils.MustWaitForTxReceipt(r.Ctx, r.ZEVMClient, tx, r.Logger, r.ReceiptTimeout) + receipt := utils.MustWaitForTxReceipt(r.Ctx, r.ZEVMClient, tx, r.Logger, r.ReceiptTimeout) + + // check that stake event was emitted + stakeEvent, err := testStaking.ParseStake(*receipt.Logs[0]) + require.NoError(r, err) + expectedValAddr, err := sdk.ValAddressFromBech32(validators[0].OperatorAddress) + require.NoError(r, err) + require.Equal(r, big.NewInt(1).Uint64(), stakeEvent.Amount.Uint64()) + require.Equal(r, common.BytesToAddress(expectedValAddr.Bytes()), stakeEvent.Validator) + require.Equal(r, testStakingAddr, stakeEvent.Staker) // check that bank balance is reduced by 1 balanceAfterStake, err := r.BankClient.Balance(r.Ctx, &banktypes.QueryBalanceRequest{ @@ -117,7 +127,14 @@ func TestPrecompilesStakingThroughContract(r *runner.E2ERunner, args []string) { big.NewInt(2), ) require.NoError(r, err) - utils.MustWaitForTxReceipt(r.Ctx, r.ZEVMClient, tx, r.Logger, r.ReceiptTimeout) + receipt = utils.MustWaitForTxReceipt(r.Ctx, r.ZEVMClient, tx, r.Logger, r.ReceiptTimeout) + + // check that stake event was emitted + stakeEvent, err = testStaking.ParseStake(*receipt.Logs[0]) + require.NoError(r, err) + require.Equal(r, big.NewInt(2).Uint64(), stakeEvent.Amount.Uint64()) + require.Equal(r, common.BytesToAddress(expectedValAddr.Bytes()), stakeEvent.Validator) + require.Equal(r, testStakingAddr, stakeEvent.Staker) // check that bank balance is reduced by 2 more, 3 in total balanceAfterStake, err = r.BankClient.Balance(r.Ctx, &banktypes.QueryBalanceRequest{ @@ -148,7 +165,14 @@ func TestPrecompilesStakingThroughContract(r *runner.E2ERunner, args []string) { // unstake 1 from validator1 tx, err = testStaking.Unstake(r.ZEVMAuth, testStakingAddr, validators[0].OperatorAddress, big.NewInt(1)) require.NoError(r, err) - utils.MustWaitForTxReceipt(r.Ctx, r.ZEVMClient, tx, r.Logger, r.ReceiptTimeout) + receipt = utils.MustWaitForTxReceipt(r.Ctx, r.ZEVMClient, tx, r.Logger, r.ReceiptTimeout) + + // check that unstake event was emitted + unstakeEvent, err := testStaking.ParseUnstake(*receipt.Logs[0]) + require.NoError(r, err) + require.Equal(r, big.NewInt(1).Uint64(), unstakeEvent.Amount.Uint64()) + require.Equal(r, common.BytesToAddress(expectedValAddr.Bytes()), unstakeEvent.Validator) + require.Equal(r, testStakingAddr, unstakeEvent.Staker) // check shares are set to 2 sharesAfterVal1, err = testStaking.GetShares(&bind.CallOpts{}, testStakingAddr, validators[0].OperatorAddress) @@ -172,7 +196,17 @@ func TestPrecompilesStakingThroughContract(r *runner.E2ERunner, args []string) { big.NewInt(1), ) require.NoError(r, err) - utils.MustWaitForTxReceipt(r.Ctx, r.ZEVMClient, tx, r.Logger, r.ReceiptTimeout) + receipt = utils.MustWaitForTxReceipt(r.Ctx, r.ZEVMClient, tx, r.Logger, r.ReceiptTimeout) + + // check that moveStake event was emitted + moveStake, err := testStaking.ParseMoveStake(*receipt.Logs[0]) + require.NoError(r, err) + require.Equal(r, big.NewInt(1).Uint64(), moveStake.Amount.Uint64()) + expectedValDstAddr, err := sdk.ValAddressFromBech32(validators[1].OperatorAddress) + require.NoError(r, err) + require.Equal(r, common.BytesToAddress(expectedValAddr.Bytes()), moveStake.ValidatorSrc) + require.Equal(r, common.BytesToAddress(expectedValDstAddr.Bytes()), moveStake.ValidatorDst) + require.Equal(r, testStakingAddr, moveStake.Staker) // check shares for both validator1 and validator2 are 1 sharesAfterVal1, err = testStaking.GetShares(&bind.CallOpts{}, testStakingAddr, validators[0].OperatorAddress) diff --git a/precompiles/staking/IStaking.abi b/precompiles/staking/IStaking.abi index f8ee31e062..fceba4d682 100644 --- a/precompiles/staking/IStaking.abi +++ b/precompiles/staking/IStaking.abi @@ -1,4 +1,85 @@ [ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "staker", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "validatorSrc", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "validatorDst", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "MoveStake", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "staker", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "validator", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Stake", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "staker", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "validator", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Unstake", + "type": "event" + }, { "inputs": [], "name": "getAllValidators", diff --git a/precompiles/staking/IStaking.go b/precompiles/staking/IStaking.go index ec3143f41f..01226d4ecf 100644 --- a/precompiles/staking/IStaking.go +++ b/precompiles/staking/IStaking.go @@ -39,7 +39,7 @@ type Validator struct { // IStakingMetaData contains all meta data concerning the IStaking contract. var IStakingMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[],\"name\":\"getAllValidators\",\"outputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"operatorAddress\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"consensusPubKey\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"jailed\",\"type\":\"bool\"},{\"internalType\":\"enumBondStatus\",\"name\":\"bondStatus\",\"type\":\"uint8\"}],\"internalType\":\"structValidator[]\",\"name\":\"validators\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"validator\",\"type\":\"string\"}],\"name\":\"getShares\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"shares\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"validatorSrc\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"validatorDst\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"moveStake\",\"outputs\":[{\"internalType\":\"int64\",\"name\":\"completionTime\",\"type\":\"int64\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"validator\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"stake\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"validator\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"unstake\",\"outputs\":[{\"internalType\":\"int64\",\"name\":\"completionTime\",\"type\":\"int64\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", + ABI: "[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"validatorSrc\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"validatorDst\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"MoveStake\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"validator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Stake\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"validator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Unstake\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"getAllValidators\",\"outputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"operatorAddress\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"consensusPubKey\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"jailed\",\"type\":\"bool\"},{\"internalType\":\"enumBondStatus\",\"name\":\"bondStatus\",\"type\":\"uint8\"}],\"internalType\":\"structValidator[]\",\"name\":\"validators\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"validator\",\"type\":\"string\"}],\"name\":\"getShares\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"shares\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"validatorSrc\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"validatorDst\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"moveStake\",\"outputs\":[{\"internalType\":\"int64\",\"name\":\"completionTime\",\"type\":\"int64\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"validator\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"stake\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"validator\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"unstake\",\"outputs\":[{\"internalType\":\"int64\",\"name\":\"completionTime\",\"type\":\"int64\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", } // IStakingABI is the input ABI used to generate the binding from. @@ -312,3 +312,474 @@ func (_IStaking *IStakingSession) Unstake(staker common.Address, validator strin func (_IStaking *IStakingTransactorSession) Unstake(staker common.Address, validator string, amount *big.Int) (*types.Transaction, error) { return _IStaking.Contract.Unstake(&_IStaking.TransactOpts, staker, validator, amount) } + +// IStakingMoveStakeIterator is returned from FilterMoveStake and is used to iterate over the raw logs and unpacked data for MoveStake events raised by the IStaking contract. +type IStakingMoveStakeIterator struct { + Event *IStakingMoveStake // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *IStakingMoveStakeIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(IStakingMoveStake) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(IStakingMoveStake) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *IStakingMoveStakeIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *IStakingMoveStakeIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// IStakingMoveStake represents a MoveStake event raised by the IStaking contract. +type IStakingMoveStake struct { + Staker common.Address + ValidatorSrc common.Address + ValidatorDst common.Address + Amount *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterMoveStake is a free log retrieval operation binding the contract event 0x4dda2c731d442025256e6e47fbb109592bcd8baf3cf25996ebd09f1da7ec902b. +// +// Solidity: event MoveStake(address indexed staker, address indexed validatorSrc, address indexed validatorDst, uint256 amount) +func (_IStaking *IStakingFilterer) FilterMoveStake(opts *bind.FilterOpts, staker []common.Address, validatorSrc []common.Address, validatorDst []common.Address) (*IStakingMoveStakeIterator, error) { + + var stakerRule []interface{} + for _, stakerItem := range staker { + stakerRule = append(stakerRule, stakerItem) + } + var validatorSrcRule []interface{} + for _, validatorSrcItem := range validatorSrc { + validatorSrcRule = append(validatorSrcRule, validatorSrcItem) + } + var validatorDstRule []interface{} + for _, validatorDstItem := range validatorDst { + validatorDstRule = append(validatorDstRule, validatorDstItem) + } + + logs, sub, err := _IStaking.contract.FilterLogs(opts, "MoveStake", stakerRule, validatorSrcRule, validatorDstRule) + if err != nil { + return nil, err + } + return &IStakingMoveStakeIterator{contract: _IStaking.contract, event: "MoveStake", logs: logs, sub: sub}, nil +} + +// WatchMoveStake is a free log subscription operation binding the contract event 0x4dda2c731d442025256e6e47fbb109592bcd8baf3cf25996ebd09f1da7ec902b. +// +// Solidity: event MoveStake(address indexed staker, address indexed validatorSrc, address indexed validatorDst, uint256 amount) +func (_IStaking *IStakingFilterer) WatchMoveStake(opts *bind.WatchOpts, sink chan<- *IStakingMoveStake, staker []common.Address, validatorSrc []common.Address, validatorDst []common.Address) (event.Subscription, error) { + + var stakerRule []interface{} + for _, stakerItem := range staker { + stakerRule = append(stakerRule, stakerItem) + } + var validatorSrcRule []interface{} + for _, validatorSrcItem := range validatorSrc { + validatorSrcRule = append(validatorSrcRule, validatorSrcItem) + } + var validatorDstRule []interface{} + for _, validatorDstItem := range validatorDst { + validatorDstRule = append(validatorDstRule, validatorDstItem) + } + + logs, sub, err := _IStaking.contract.WatchLogs(opts, "MoveStake", stakerRule, validatorSrcRule, validatorDstRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(IStakingMoveStake) + if err := _IStaking.contract.UnpackLog(event, "MoveStake", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseMoveStake is a log parse operation binding the contract event 0x4dda2c731d442025256e6e47fbb109592bcd8baf3cf25996ebd09f1da7ec902b. +// +// Solidity: event MoveStake(address indexed staker, address indexed validatorSrc, address indexed validatorDst, uint256 amount) +func (_IStaking *IStakingFilterer) ParseMoveStake(log types.Log) (*IStakingMoveStake, error) { + event := new(IStakingMoveStake) + if err := _IStaking.contract.UnpackLog(event, "MoveStake", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// IStakingStakeIterator is returned from FilterStake and is used to iterate over the raw logs and unpacked data for Stake events raised by the IStaking contract. +type IStakingStakeIterator struct { + Event *IStakingStake // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *IStakingStakeIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(IStakingStake) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(IStakingStake) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *IStakingStakeIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *IStakingStakeIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// IStakingStake represents a Stake event raised by the IStaking contract. +type IStakingStake struct { + Staker common.Address + Validator common.Address + Amount *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterStake is a free log retrieval operation binding the contract event 0x99039fcf0a98f484616c5196ee8b2ecfa971babf0b519848289ea4db381f85f7. +// +// Solidity: event Stake(address indexed staker, address indexed validator, uint256 amount) +func (_IStaking *IStakingFilterer) FilterStake(opts *bind.FilterOpts, staker []common.Address, validator []common.Address) (*IStakingStakeIterator, error) { + + var stakerRule []interface{} + for _, stakerItem := range staker { + stakerRule = append(stakerRule, stakerItem) + } + var validatorRule []interface{} + for _, validatorItem := range validator { + validatorRule = append(validatorRule, validatorItem) + } + + logs, sub, err := _IStaking.contract.FilterLogs(opts, "Stake", stakerRule, validatorRule) + if err != nil { + return nil, err + } + return &IStakingStakeIterator{contract: _IStaking.contract, event: "Stake", logs: logs, sub: sub}, nil +} + +// WatchStake is a free log subscription operation binding the contract event 0x99039fcf0a98f484616c5196ee8b2ecfa971babf0b519848289ea4db381f85f7. +// +// Solidity: event Stake(address indexed staker, address indexed validator, uint256 amount) +func (_IStaking *IStakingFilterer) WatchStake(opts *bind.WatchOpts, sink chan<- *IStakingStake, staker []common.Address, validator []common.Address) (event.Subscription, error) { + + var stakerRule []interface{} + for _, stakerItem := range staker { + stakerRule = append(stakerRule, stakerItem) + } + var validatorRule []interface{} + for _, validatorItem := range validator { + validatorRule = append(validatorRule, validatorItem) + } + + logs, sub, err := _IStaking.contract.WatchLogs(opts, "Stake", stakerRule, validatorRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(IStakingStake) + if err := _IStaking.contract.UnpackLog(event, "Stake", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseStake is a log parse operation binding the contract event 0x99039fcf0a98f484616c5196ee8b2ecfa971babf0b519848289ea4db381f85f7. +// +// Solidity: event Stake(address indexed staker, address indexed validator, uint256 amount) +func (_IStaking *IStakingFilterer) ParseStake(log types.Log) (*IStakingStake, error) { + event := new(IStakingStake) + if err := _IStaking.contract.UnpackLog(event, "Stake", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// IStakingUnstakeIterator is returned from FilterUnstake and is used to iterate over the raw logs and unpacked data for Unstake events raised by the IStaking contract. +type IStakingUnstakeIterator struct { + Event *IStakingUnstake // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *IStakingUnstakeIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(IStakingUnstake) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(IStakingUnstake) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *IStakingUnstakeIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *IStakingUnstakeIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// IStakingUnstake represents a Unstake event raised by the IStaking contract. +type IStakingUnstake struct { + Staker common.Address + Validator common.Address + Amount *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterUnstake is a free log retrieval operation binding the contract event 0x390b1276974b9463e5d66ab10df69b6f3d7b930eb066a0e66df327edd2cc811c. +// +// Solidity: event Unstake(address indexed staker, address indexed validator, uint256 amount) +func (_IStaking *IStakingFilterer) FilterUnstake(opts *bind.FilterOpts, staker []common.Address, validator []common.Address) (*IStakingUnstakeIterator, error) { + + var stakerRule []interface{} + for _, stakerItem := range staker { + stakerRule = append(stakerRule, stakerItem) + } + var validatorRule []interface{} + for _, validatorItem := range validator { + validatorRule = append(validatorRule, validatorItem) + } + + logs, sub, err := _IStaking.contract.FilterLogs(opts, "Unstake", stakerRule, validatorRule) + if err != nil { + return nil, err + } + return &IStakingUnstakeIterator{contract: _IStaking.contract, event: "Unstake", logs: logs, sub: sub}, nil +} + +// WatchUnstake is a free log subscription operation binding the contract event 0x390b1276974b9463e5d66ab10df69b6f3d7b930eb066a0e66df327edd2cc811c. +// +// Solidity: event Unstake(address indexed staker, address indexed validator, uint256 amount) +func (_IStaking *IStakingFilterer) WatchUnstake(opts *bind.WatchOpts, sink chan<- *IStakingUnstake, staker []common.Address, validator []common.Address) (event.Subscription, error) { + + var stakerRule []interface{} + for _, stakerItem := range staker { + stakerRule = append(stakerRule, stakerItem) + } + var validatorRule []interface{} + for _, validatorItem := range validator { + validatorRule = append(validatorRule, validatorItem) + } + + logs, sub, err := _IStaking.contract.WatchLogs(opts, "Unstake", stakerRule, validatorRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(IStakingUnstake) + if err := _IStaking.contract.UnpackLog(event, "Unstake", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseUnstake is a log parse operation binding the contract event 0x390b1276974b9463e5d66ab10df69b6f3d7b930eb066a0e66df327edd2cc811c. +// +// Solidity: event Unstake(address indexed staker, address indexed validator, uint256 amount) +func (_IStaking *IStakingFilterer) ParseUnstake(log types.Log) (*IStakingUnstake, error) { + event := new(IStakingUnstake) + if err := _IStaking.contract.UnpackLog(event, "Unstake", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/precompiles/staking/IStaking.json b/precompiles/staking/IStaking.json index bd89798977..cff6a7a365 100644 --- a/precompiles/staking/IStaking.json +++ b/precompiles/staking/IStaking.json @@ -1,5 +1,86 @@ { "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "staker", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "validatorSrc", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "validatorDst", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "MoveStake", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "staker", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "validator", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Stake", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "staker", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "validator", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Unstake", + "type": "event" + }, { "inputs": [], "name": "getAllValidators", diff --git a/precompiles/staking/IStaking.sol b/precompiles/staking/IStaking.sol index 0163c50651..c6b2642a4c 100644 --- a/precompiles/staking/IStaking.sol +++ b/precompiles/staking/IStaking.sol @@ -26,6 +26,38 @@ struct Validator { } interface IStaking { + /// @notice Stake event is emitted when stake function is called + /// @param staker Staker address + /// @param validator Validator address + /// @param amount Coins amount + event Stake( + address indexed staker, + address indexed validator, + uint256 amount + ); + + /// @notice Unstake event is emitted when unstake function is called + /// @param staker Staker address + /// @param validator Validator address + /// @param amount Coins amount + event Unstake( + address indexed staker, + address indexed validator, + uint256 amount + ); + + /// @notice MoveStake event is emitted when moveStake function is called + /// @param staker Staker address + /// @param validatorSrc Validator from address + /// @param validatorDst Validator to address + /// @param amount Coins amount + event MoveStake( + address indexed staker, + address indexed validatorSrc, + address indexed validatorDst, + uint256 amount + ); + /// @notice Stake coins to validator /// @param staker Staker address /// @param validator Validator address diff --git a/precompiles/staking/logs.go b/precompiles/staking/logs.go new file mode 100644 index 0000000000..0dd566507d --- /dev/null +++ b/precompiles/staking/logs.go @@ -0,0 +1,162 @@ +package staking + +import ( + "math/big" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/core/vm" +) + +func (c *Contract) AddStakeLog( + ctx sdk.Context, + stateDB vm.StateDB, + staker common.Address, + validator string, + amount *big.Int, +) error { + event := c.Abi().Events["Stake"] + topics := []common.Hash{event.ID} + valAddr, err := sdk.ValAddressFromBech32(validator) + if err != nil { + return err + } + + // staker and validator are indexed event params + topicsRes, err := abi.MakeTopics( + []interface{}{staker}, + []interface{}{common.BytesToAddress(valAddr.Bytes())}, + ) + if err != nil { + return err + } + + for _, topic := range topicsRes { + topics = append(topics, topic[0]) + } + + // amount is part of event data + data, err := packAmount(amount) + if err != nil { + return err + } + + stateDB.AddLog(&types.Log{ + Address: c.Address(), + Topics: topics, + Data: data, + BlockNumber: uint64(ctx.BlockHeight()), + }) + + return nil +} + +func (c *Contract) AddUnstakeLog( + ctx sdk.Context, + stateDB vm.StateDB, + staker common.Address, + validator string, + amount *big.Int, +) error { + event := c.Abi().Events["Unstake"] + topics := []common.Hash{event.ID} + valAddr, err := sdk.ValAddressFromBech32(validator) + if err != nil { + return err + } + + // staker and validator are indexed event params + topicsRes, err := abi.MakeTopics( + []interface{}{staker}, + []interface{}{common.BytesToAddress(valAddr.Bytes())}, + ) + if err != nil { + return err + } + + for _, topic := range topicsRes { + topics = append(topics, topic[0]) + } + + // amount is part of event data + data, err := packAmount(amount) + if err != nil { + return err + } + + stateDB.AddLog(&types.Log{ + Address: c.Address(), + Topics: topics, + Data: data, + BlockNumber: uint64(ctx.BlockHeight()), + }) + + return nil +} + +func (c *Contract) AddMoveStakeLog( + ctx sdk.Context, + stateDB vm.StateDB, + staker common.Address, + validatorSrc string, + validatorDst string, + amount *big.Int, +) error { + event := c.Abi().Events["MoveStake"] + topics := []common.Hash{event.ID} + validatorSrcAddr, err := sdk.ValAddressFromBech32(validatorSrc) + if err != nil { + return err + } + + validatorDstAddr, err := sdk.ValAddressFromBech32(validatorDst) + if err != nil { + return err + } + + // staker and validators are indexed event params + topicsRes, err := abi.MakeTopics( + []interface{}{staker}, + []interface{}{common.BytesToAddress(validatorSrcAddr.Bytes())}, + []interface{}{common.BytesToAddress(validatorDstAddr.Bytes())}, + ) + if err != nil { + return err + } + + for _, topic := range topicsRes { + topics = append(topics, topic[0]) + } + + // amount is part of event data + data, err := packAmount(amount) + if err != nil { + return err + } + + stateDB.AddLog(&types.Log{ + Address: c.Address(), + Topics: topics, + Data: data, + BlockNumber: uint64(ctx.BlockHeight()), + }) + + return nil +} + +// helper function to pack a uint256 amount +func packAmount(amount *big.Int) ([]byte, error) { + uint256Type, err := abi.NewType("uint256", "", nil) + if err != nil { + return nil, err + } + + arguments := abi.Arguments{ + { + Type: uint256Type, + }, + } + return arguments.Pack(amount) +} diff --git a/precompiles/staking/staking.go b/precompiles/staking/staking.go index e800bf7d88..7ef467b039 100644 --- a/precompiles/staking/staking.go +++ b/precompiles/staking/staking.go @@ -240,11 +240,17 @@ func (c *Contract) Stake( stateDB.SubBalance(stakerAddress, amount) } + err = c.AddStakeLog(ctx, stateDB, stakerAddress, validatorAddress, amount) + if err != nil { + return nil, err + } + return method.Outputs.Pack(true) } func (c *Contract) Unstake( ctx sdk.Context, + evm *vm.EVM, contract *vm.Contract, method *abi.Method, args []interface{}, @@ -294,11 +300,18 @@ func (c *Contract) Unstake( return nil, err } + stateDB := evm.StateDB.(ptypes.ExtStateDB) + err = c.AddUnstakeLog(ctx, stateDB, stakerAddress, validatorAddress, amount) + if err != nil { + return nil, err + } + return method.Outputs.Pack(res.GetCompletionTime().UTC().Unix()) } func (c *Contract) MoveStake( ctx sdk.Context, + evm *vm.EVM, contract *vm.Contract, method *abi.Method, args []interface{}, @@ -356,6 +369,12 @@ func (c *Contract) MoveStake( return nil, err } + stateDB := evm.StateDB.(ptypes.ExtStateDB) + err = c.AddMoveStakeLog(ctx, stateDB, stakerAddress, validatorSrcAddress, validatorDstAddress, amount) + if err != nil { + return nil, err + } + return method.Outputs.Pack(res.GetCompletionTime().UTC().Unix()) } @@ -408,7 +427,7 @@ func (c *Contract) Run(evm *vm.EVM, contract *vm.Contract, _ bool) ([]byte, erro case UnstakeMethodName: var res []byte execErr := stateDB.ExecuteNativeAction(contract.Address(), nil, func(ctx sdk.Context) error { - res, err = c.Unstake(ctx, contract, method, args) + res, err = c.Unstake(ctx, evm, contract, method, args) return err }) if execErr != nil { @@ -418,7 +437,7 @@ func (c *Contract) Run(evm *vm.EVM, contract *vm.Contract, _ bool) ([]byte, erro case MoveStakeMethodName: var res []byte execErr := stateDB.ExecuteNativeAction(contract.Address(), nil, func(ctx sdk.Context) error { - res, err = c.MoveStake(ctx, contract, method, args) + res, err = c.MoveStake(ctx, evm, contract, method, args) return err }) if execErr != nil { diff --git a/precompiles/staking/staking_test.go b/precompiles/staking/staking_test.go index b71316887f..94c1a432c1 100644 --- a/precompiles/staking/staking_test.go +++ b/precompiles/staking/staking_test.go @@ -614,7 +614,7 @@ func Test_Unstake(t *testing.T) { t.Run("should fail if wrong args amount", func(t *testing.T) { // ARRANGE - ctx, contract, abi, sdkKeepers, _, _ := setup(t) + ctx, contract, abi, sdkKeepers, mockEVM, _ := setup(t) methodID := abi.Methods[UnstakeMethodName] r := rand.New(rand.NewSource(42)) validator := sample.Validator(t, r) @@ -633,7 +633,7 @@ func Test_Unstake(t *testing.T) { args := []interface{}{stakerEthAddr, validator.OperatorAddress} // ACT - _, err = contract.Unstake(ctx, &vm.Contract{CallerAddress: stakerAddr}, &methodID, args) + _, err = contract.Unstake(ctx, mockEVM, &vm.Contract{CallerAddress: stakerAddr}, &methodID, args) // ASSERT require.Error(t, err) @@ -641,7 +641,7 @@ func Test_Unstake(t *testing.T) { t.Run("should fail if staker is not eth addr", func(t *testing.T) { // ARRANGE - ctx, contract, abi, sdkKeepers, _, _ := setup(t) + ctx, contract, abi, sdkKeepers, mockEVM, _ := setup(t) methodID := abi.Methods[UnstakeMethodName] r := rand.New(rand.NewSource(42)) validator := sample.Validator(t, r) @@ -659,7 +659,7 @@ func Test_Unstake(t *testing.T) { args := []interface{}{staker, validator.OperatorAddress, coins.AmountOf(config.BaseDenom).BigInt()} // ACT - _, err = contract.Unstake(ctx, &vm.Contract{CallerAddress: stakerAddr}, &methodID, args) + _, err = contract.Unstake(ctx, mockEVM, &vm.Contract{CallerAddress: stakerAddr}, &methodID, args) // ASSERT require.Error(t, err) @@ -667,7 +667,7 @@ func Test_Unstake(t *testing.T) { t.Run("should fail if validator is not valid string", func(t *testing.T) { // ARRANGE - ctx, contract, abi, sdkKeepers, _, _ := setup(t) + ctx, contract, abi, sdkKeepers, mockEVM, _ := setup(t) methodID := abi.Methods[UnstakeMethodName] r := rand.New(rand.NewSource(42)) validator := sample.Validator(t, r) @@ -686,7 +686,7 @@ func Test_Unstake(t *testing.T) { args := []interface{}{stakerEthAddr, 42, coins.AmountOf(config.BaseDenom).BigInt()} // ACT - _, err = contract.Unstake(ctx, &vm.Contract{CallerAddress: stakerAddr}, &methodID, args) + _, err = contract.Unstake(ctx, mockEVM, &vm.Contract{CallerAddress: stakerAddr}, &methodID, args) // ASSERT require.Error(t, err) @@ -694,7 +694,7 @@ func Test_Unstake(t *testing.T) { t.Run("should fail if amount is not int64", func(t *testing.T) { // ARRANGE - ctx, contract, abi, sdkKeepers, _, _ := setup(t) + ctx, contract, abi, sdkKeepers, mockEVM, _ := setup(t) methodID := abi.Methods[UnstakeMethodName] r := rand.New(rand.NewSource(42)) validator := sample.Validator(t, r) @@ -713,7 +713,7 @@ func Test_Unstake(t *testing.T) { args := []interface{}{stakerEthAddr, validator.OperatorAddress, coins.AmountOf(config.BaseDenom).Uint64()} // ACT - _, err = contract.Unstake(ctx, &vm.Contract{CallerAddress: stakerAddr}, &methodID, args) + _, err = contract.Unstake(ctx, mockEVM, &vm.Contract{CallerAddress: stakerAddr}, &methodID, args) // ASSERT require.Error(t, err) @@ -855,7 +855,7 @@ func Test_MoveStake(t *testing.T) { } // ACT - _, err = contract.MoveStake(ctx, &vm.Contract{CallerAddress: stakerAddr}, &methodID, argsMoveStake) + _, err = contract.MoveStake(ctx, mockEVM, &vm.Contract{CallerAddress: stakerAddr}, &methodID, argsMoveStake) // ASSERT require.Error(t, err) @@ -900,7 +900,7 @@ func Test_MoveStake(t *testing.T) { } // ACT - _, err = contract.MoveStake(ctx, &vm.Contract{CallerAddress: stakerAddr}, &methodID, argsMoveStake) + _, err = contract.MoveStake(ctx, mockEVM, &vm.Contract{CallerAddress: stakerAddr}, &methodID, argsMoveStake) // ASSERT require.Error(t, err) @@ -945,7 +945,7 @@ func Test_MoveStake(t *testing.T) { } // ACT - _, err = contract.MoveStake(ctx, &vm.Contract{CallerAddress: stakerAddr}, &methodID, argsMoveStake) + _, err = contract.MoveStake(ctx, mockEVM, &vm.Contract{CallerAddress: stakerAddr}, &methodID, argsMoveStake) // ASSERT require.Error(t, err) @@ -990,7 +990,7 @@ func Test_MoveStake(t *testing.T) { } // ACT - _, err = contract.MoveStake(ctx, &vm.Contract{CallerAddress: stakerAddr}, &methodID, argsMoveStake) + _, err = contract.MoveStake(ctx, mockEVM, &vm.Contract{CallerAddress: stakerAddr}, &methodID, argsMoveStake) // ASSERT require.Error(t, err) @@ -1030,7 +1030,7 @@ func Test_MoveStake(t *testing.T) { argsMoveStake := []interface{}{stakerEthAddr, validatorSrc.OperatorAddress, validatorDest.OperatorAddress} // ACT - _, err = contract.MoveStake(ctx, &vm.Contract{CallerAddress: stakerAddr}, &methodID, argsMoveStake) + _, err = contract.MoveStake(ctx, mockEVM, &vm.Contract{CallerAddress: stakerAddr}, &methodID, argsMoveStake) // ASSERT require.Error(t, err) From b2085744c2749977264c5799f2f8cc72f66b46fb Mon Sep 17 00:00:00 2001 From: skosito Date: Tue, 10 Sep 2024 19:43:37 +0200 Subject: [PATCH 2/5] refactor logs file a bit --- precompiles/staking/logs.go | 66 ++++++++++++++++--------------------- 1 file changed, 29 insertions(+), 37 deletions(-) diff --git a/precompiles/staking/logs.go b/precompiles/staking/logs.go index 0dd566507d..cf37640ed5 100644 --- a/precompiles/staking/logs.go +++ b/precompiles/staking/logs.go @@ -18,37 +18,25 @@ func (c *Contract) AddStakeLog( amount *big.Int, ) error { event := c.Abi().Events["Stake"] - topics := []common.Hash{event.ID} + valAddr, err := sdk.ValAddressFromBech32(validator) if err != nil { return err } // staker and validator are indexed event params - topicsRes, err := abi.MakeTopics( - []interface{}{staker}, - []interface{}{common.BytesToAddress(valAddr.Bytes())}, - ) + topics, err := makeTopics(event, []interface{}{staker}, []interface{}{common.BytesToAddress(valAddr.Bytes())}) if err != nil { return err } - for _, topic := range topicsRes { - topics = append(topics, topic[0]) - } - // amount is part of event data data, err := packAmount(amount) if err != nil { return err } - stateDB.AddLog(&types.Log{ - Address: c.Address(), - Topics: topics, - Data: data, - BlockNumber: uint64(ctx.BlockHeight()), - }) + c.addLog(ctx, stateDB, topics, data) return nil } @@ -61,37 +49,24 @@ func (c *Contract) AddUnstakeLog( amount *big.Int, ) error { event := c.Abi().Events["Unstake"] - topics := []common.Hash{event.ID} valAddr, err := sdk.ValAddressFromBech32(validator) if err != nil { return err } // staker and validator are indexed event params - topicsRes, err := abi.MakeTopics( - []interface{}{staker}, - []interface{}{common.BytesToAddress(valAddr.Bytes())}, - ) + topics, err := makeTopics(event, []interface{}{staker}, []interface{}{common.BytesToAddress(valAddr.Bytes())}) if err != nil { return err } - for _, topic := range topicsRes { - topics = append(topics, topic[0]) - } - // amount is part of event data data, err := packAmount(amount) if err != nil { return err } - stateDB.AddLog(&types.Log{ - Address: c.Address(), - Topics: topics, - Data: data, - BlockNumber: uint64(ctx.BlockHeight()), - }) + c.addLog(ctx, stateDB, topics, data) return nil } @@ -105,7 +80,6 @@ func (c *Contract) AddMoveStakeLog( amount *big.Int, ) error { event := c.Abi().Events["MoveStake"] - topics := []common.Hash{event.ID} validatorSrcAddr, err := sdk.ValAddressFromBech32(validatorSrc) if err != nil { return err @@ -117,7 +91,8 @@ func (c *Contract) AddMoveStakeLog( } // staker and validators are indexed event params - topicsRes, err := abi.MakeTopics( + topics, err := makeTopics( + event, []interface{}{staker}, []interface{}{common.BytesToAddress(validatorSrcAddr.Bytes())}, []interface{}{common.BytesToAddress(validatorDstAddr.Bytes())}, @@ -126,24 +101,41 @@ func (c *Contract) AddMoveStakeLog( return err } - for _, topic := range topicsRes { - topics = append(topics, topic[0]) - } - // amount is part of event data data, err := packAmount(amount) if err != nil { return err } + c.addLog(ctx, stateDB, topics, data) + + return nil +} + +func (c *Contract) addLog(ctx sdk.Context, stateDB vm.StateDB, topics []common.Hash, data []byte) { stateDB.AddLog(&types.Log{ Address: c.Address(), Topics: topics, Data: data, BlockNumber: uint64(ctx.BlockHeight()), }) +} - return nil +func makeTopics(event abi.Event, query ...[]interface{}) ([]common.Hash, error) { + topics := []common.Hash{event.ID} + + topicsRes, err := abi.MakeTopics( + query..., + ) + if err != nil { + return nil, err + } + + for _, topic := range topicsRes { + topics = append(topics, topic[0]) + } + + return topics, nil } // helper function to pack a uint256 amount From 19f072c2f138ae0e24888f942975bdacafa88103 Mon Sep 17 00:00:00 2001 From: skosito Date: Wed, 11 Sep 2024 00:52:17 +0200 Subject: [PATCH 3/5] PR comments --- precompiles/logs/logs.go | 55 ++++++++++++++++++++++++++++++++ precompiles/staking/logs.go | 63 +++++++------------------------------ 2 files changed, 66 insertions(+), 52 deletions(-) create mode 100644 precompiles/logs/logs.go diff --git a/precompiles/logs/logs.go b/precompiles/logs/logs.go new file mode 100644 index 0000000000..f168e33da4 --- /dev/null +++ b/precompiles/logs/logs.go @@ -0,0 +1,55 @@ +package logs + +import ( + "math/big" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/core/vm" +) + +// AddLog adds log to stateDB +func AddLog(ctx sdk.Context, precompileAddr common.Address, stateDB vm.StateDB, topics []common.Hash, data []byte) { + stateDB.AddLog(&types.Log{ + Address: precompileAddr, + Topics: topics, + Data: data, + BlockNumber: uint64(ctx.BlockHeight()), + }) +} + +// MakeTopics creates topics for log as wrapper around geth abi.MakeTopics function +func MakeTopics(event abi.Event, query ...[]interface{}) ([]common.Hash, error) { + topics := []common.Hash{event.ID} + + topicsRes, err := abi.MakeTopics( + query..., + ) + if err != nil { + return nil, err + } + + for _, topic := range topicsRes { + topics = append(topics, topic[0]) + } + + return topics, nil +} + +// PackBigInt is a helper function to pack a uint256 amount +func PackBigInt(amount *big.Int) ([]byte, error) { + uint256Type, err := abi.NewType("uint256", "", nil) + if err != nil { + return nil, err + } + + arguments := abi.Arguments{ + { + Type: uint256Type, + }, + } + + return arguments.Pack(amount) +} diff --git a/precompiles/staking/logs.go b/precompiles/staking/logs.go index cf37640ed5..e8770864e2 100644 --- a/precompiles/staking/logs.go +++ b/precompiles/staking/logs.go @@ -4,10 +4,10 @@ import ( "math/big" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" + + "github.com/zeta-chain/node/precompiles/logs" ) func (c *Contract) AddStakeLog( @@ -25,18 +25,18 @@ func (c *Contract) AddStakeLog( } // staker and validator are indexed event params - topics, err := makeTopics(event, []interface{}{staker}, []interface{}{common.BytesToAddress(valAddr.Bytes())}) + topics, err := logs.MakeTopics(event, []interface{}{staker}, []interface{}{common.BytesToAddress(valAddr.Bytes())}) if err != nil { return err } // amount is part of event data - data, err := packAmount(amount) + data, err := logs.PackBigInt(amount) if err != nil { return err } - c.addLog(ctx, stateDB, topics, data) + logs.AddLog(ctx, c.Address(), stateDB, topics, data) return nil } @@ -55,18 +55,18 @@ func (c *Contract) AddUnstakeLog( } // staker and validator are indexed event params - topics, err := makeTopics(event, []interface{}{staker}, []interface{}{common.BytesToAddress(valAddr.Bytes())}) + topics, err := logs.MakeTopics(event, []interface{}{staker}, []interface{}{common.BytesToAddress(valAddr.Bytes())}) if err != nil { return err } // amount is part of event data - data, err := packAmount(amount) + data, err := logs.PackBigInt(amount) if err != nil { return err } - c.addLog(ctx, stateDB, topics, data) + logs.AddLog(ctx, c.Address(), stateDB, topics, data) return nil } @@ -91,7 +91,7 @@ func (c *Contract) AddMoveStakeLog( } // staker and validators are indexed event params - topics, err := makeTopics( + topics, err := logs.MakeTopics( event, []interface{}{staker}, []interface{}{common.BytesToAddress(validatorSrcAddr.Bytes())}, @@ -102,53 +102,12 @@ func (c *Contract) AddMoveStakeLog( } // amount is part of event data - data, err := packAmount(amount) + data, err := logs.PackBigInt(amount) if err != nil { return err } - c.addLog(ctx, stateDB, topics, data) + logs.AddLog(ctx, c.Address(), stateDB, topics, data) return nil } - -func (c *Contract) addLog(ctx sdk.Context, stateDB vm.StateDB, topics []common.Hash, data []byte) { - stateDB.AddLog(&types.Log{ - Address: c.Address(), - Topics: topics, - Data: data, - BlockNumber: uint64(ctx.BlockHeight()), - }) -} - -func makeTopics(event abi.Event, query ...[]interface{}) ([]common.Hash, error) { - topics := []common.Hash{event.ID} - - topicsRes, err := abi.MakeTopics( - query..., - ) - if err != nil { - return nil, err - } - - for _, topic := range topicsRes { - topics = append(topics, topic[0]) - } - - return topics, nil -} - -// helper function to pack a uint256 amount -func packAmount(amount *big.Int) ([]byte, error) { - uint256Type, err := abi.NewType("uint256", "", nil) - if err != nil { - return nil, err - } - - arguments := abi.Arguments{ - { - Type: uint256Type, - }, - } - return arguments.Pack(amount) -} From a717c0f90b47d6e1ca89ac30d105db0775cb0de8 Mon Sep 17 00:00:00 2001 From: skosito Date: Wed, 11 Sep 2024 01:25:00 +0200 Subject: [PATCH 4/5] changelog --- changelog.md | 1 + 1 file changed, 1 insertion(+) diff --git a/changelog.md b/changelog.md index 091479dea1..2d0edbe190 100644 --- a/changelog.md +++ b/changelog.md @@ -18,6 +18,7 @@ * [2788](https://github.com/zeta-chain/node/pull/2788) - add common importable zetacored rpc package * [2784](https://github.com/zeta-chain/node/pull/2784) - staking precompiled contract * [2795](https://github.com/zeta-chain/node/pull/2795) - support restricted address in Solana +* [2861](https://github.com/zeta-chain/node/pull/2861) - emit events from staking precompile ### Refactor From ead617344776935b98d362303938b6ae68b76aeb Mon Sep 17 00:00:00 2001 From: skosito Date: Wed, 11 Sep 2024 18:39:54 +0200 Subject: [PATCH 5/5] add constants for events names --- precompiles/staking/logs.go | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/precompiles/staking/logs.go b/precompiles/staking/logs.go index e8770864e2..165dd91aa3 100644 --- a/precompiles/staking/logs.go +++ b/precompiles/staking/logs.go @@ -10,6 +10,12 @@ import ( "github.com/zeta-chain/node/precompiles/logs" ) +const ( + StakeEventName = "Stake" + UnstakeEventName = "Unstake" + MoveStakeEventName = "MoveStake" +) + func (c *Contract) AddStakeLog( ctx sdk.Context, stateDB vm.StateDB, @@ -17,7 +23,7 @@ func (c *Contract) AddStakeLog( validator string, amount *big.Int, ) error { - event := c.Abi().Events["Stake"] + event := c.Abi().Events[StakeEventName] valAddr, err := sdk.ValAddressFromBech32(validator) if err != nil { @@ -48,7 +54,7 @@ func (c *Contract) AddUnstakeLog( validator string, amount *big.Int, ) error { - event := c.Abi().Events["Unstake"] + event := c.Abi().Events[UnstakeEventName] valAddr, err := sdk.ValAddressFromBech32(validator) if err != nil { return err @@ -79,7 +85,7 @@ func (c *Contract) AddMoveStakeLog( validatorDst string, amount *big.Int, ) error { - event := c.Abi().Events["MoveStake"] + event := c.Abi().Events[MoveStakeEventName] validatorSrcAddr, err := sdk.ValAddressFromBech32(validatorSrc) if err != nil { return err