From 9c3123ef11d370bc46d462dacd1d36bad4742f04 Mon Sep 17 00:00:00 2001 From: Marketen Date: Mon, 20 Jan 2025 19:22:53 +0100 Subject: [PATCH 1/7] update abi & contract --- contract/abi.abi | 2 +- contract/contract.go | 333 ++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 333 insertions(+), 2 deletions(-) diff --git a/contract/abi.abi b/contract/abi.abi index 4c172be..7cf1a81 100644 --- a/contract/abi.abi +++ b/contract/abi.abi @@ -1 +1 @@ -[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newGovernance","type":"address"}],"name":"AcceptGovernance","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newOracleMember","type":"address"}],"name":"AddOracleMember","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"withdrawalAddress","type":"address"},{"indexed":false,"internalType":"address","name":"rewardAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"claimableBalance","type":"uint256"}],"name":"ClaimRewards","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"donationAmount","type":"uint256"}],"name":"EtherReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"initialSmoothingPoolSlot","type":"uint64"}],"name":"InitSmoothingPool","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oracleMemberRemoved","type":"address"}],"name":"RemoveOracleMember","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"slotNumber","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"newRewardsRoot","type":"bytes32"}],"name":"ReportConsolidated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"withdrawalAddress","type":"address"},{"indexed":false,"internalType":"address","name":"poolRecipient","type":"address"}],"name":"SetRewardRecipient","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"slotNumber","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"newRewardsRoot","type":"bytes32"},{"indexed":false,"internalType":"address","name":"oracleMember","type":"address"}],"name":"SubmitReport","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"subscriptionCollateral","type":"uint256"},{"indexed":false,"internalType":"uint64","name":"validatorID","type":"uint64"}],"name":"SubscribeValidator","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newPendingGovernance","type":"address"}],"name":"TransferGovernance","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint64","name":"validatorID","type":"uint64"}],"name":"UnsubscribeValidator","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"newCheckpointSlotSize","type":"uint64"}],"name":"UpdateCheckpointSlotSize","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newPoolFee","type":"uint256"}],"name":"UpdatePoolFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newPoolFeeRecipient","type":"address"}],"name":"UpdatePoolFeeRecipient","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"newQuorum","type":"uint64"}],"name":"UpdateQuorum","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newSubscriptionCollateral","type":"uint256"}],"name":"UpdateSubscriptionCollateral","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"INITIAL_REPORT_HASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOracleMember","type":"address"}],"name":"addOracleMember","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressToVotedReportHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"checkpointSlotSize","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"withdrawalAddress","type":"address"},{"internalType":"uint256","name":"accumulatedBalance","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"claimRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deploymentBlockNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAllOracleMembers","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"oracleMember","type":"address"}],"name":"getOracleMemberIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOracleMembersCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"_slot","type":"uint64"},{"internalType":"bytes32","name":"_rewardsRoot","type":"bytes32"}],"name":"getReportHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"governance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"initialSmoothingPoolSlot","type":"uint64"}],"name":"initSmoothingPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_governance","type":"address"},{"internalType":"uint256","name":"_subscriptionCollateral","type":"uint256"},{"internalType":"uint256","name":"_poolFee","type":"uint256"},{"internalType":"address","name":"_poolFeeRecipient","type":"address"},{"internalType":"uint64","name":"_checkpointSlotSize","type":"uint64"},{"internalType":"uint64","name":"_quorum","type":"uint64"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lastConsolidatedSlot","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"oracleMembers","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingGovernance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolFeeRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"quorum","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"oracleMemberAddress","type":"address"},{"internalType":"uint256","name":"oracleMemberIndex","type":"uint256"}],"name":"removeOracleMember","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"reportHashToReport","outputs":[{"internalType":"uint64","name":"slot","type":"uint64"},{"internalType":"uint64","name":"votes","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewardRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"rewardAddress","type":"address"}],"name":"setRewardRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"slotNumber","type":"uint64"},{"internalType":"bytes32","name":"proposedRewardsRoot","type":"bytes32"}],"name":"submitReport","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"validatorID","type":"uint64"}],"name":"subscribeValidator","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint64[]","name":"validatorIDArray","type":"uint64[]"}],"name":"subscribeValidators","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"subscriptionCollateral","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newPendingGovernance","type":"address"}],"name":"transferGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"validatorID","type":"uint64"}],"name":"unsubscribeValidator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"newCheckpointSlotSize","type":"uint64"}],"name":"updateCheckpointSlotSize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newSubscriptionCollateral","type":"uint256"}],"name":"updateCollateral","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPoolFee","type":"uint256"}],"name":"updatePoolFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newPoolFeeRecipient","type":"address"}],"name":"updatePoolFeeRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"newQuorum","type":"uint64"}],"name":"updateQuorum","outputs":[],"stateMutability":"nonpayable","type":"function"}] \ No newline at end of file +[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newGovernance","type":"address"}],"name":"AcceptGovernance","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newOracleMember","type":"address"}],"name":"AddOracleMember","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"validatorID","type":"uint64"}],"name":"BanValidator","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"withdrawalAddress","type":"address"},{"indexed":false,"internalType":"address","name":"rewardAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"claimableBalance","type":"uint256"}],"name":"ClaimRewards","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"donationAmount","type":"uint256"}],"name":"EtherReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"initialSmoothingPoolSlot","type":"uint64"}],"name":"InitSmoothingPool","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oracleMemberRemoved","type":"address"}],"name":"RemoveOracleMember","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"slotNumber","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"newRewardsRoot","type":"bytes32"}],"name":"ReportConsolidated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"withdrawalAddress","type":"address"},{"indexed":false,"internalType":"address","name":"poolRecipient","type":"address"}],"name":"SetRewardRecipient","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"slotNumber","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"newRewardsRoot","type":"bytes32"},{"indexed":false,"internalType":"address","name":"oracleMember","type":"address"}],"name":"SubmitReport","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"subscriptionCollateral","type":"uint256"},{"indexed":false,"internalType":"uint64","name":"validatorID","type":"uint64"}],"name":"SubscribeValidator","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newPendingGovernance","type":"address"}],"name":"TransferGovernance","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"validatorID","type":"uint64"}],"name":"UnbanValidator","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint64","name":"validatorID","type":"uint64"}],"name":"UnsubscribeValidator","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"newCheckpointSlotSize","type":"uint64"}],"name":"UpdateCheckpointSlotSize","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newPoolFee","type":"uint256"}],"name":"UpdatePoolFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newPoolFeeRecipient","type":"address"}],"name":"UpdatePoolFeeRecipient","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"newQuorum","type":"uint64"}],"name":"UpdateQuorum","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newSubscriptionCollateral","type":"uint256"}],"name":"UpdateSubscriptionCollateral","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"INITIAL_REPORT_HASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOracleMember","type":"address"}],"name":"addOracleMember","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressToVotedReportHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64[]","name":"validatorIDArray","type":"uint64[]"}],"name":"banValidators","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"checkpointSlotSize","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"withdrawalAddress","type":"address"},{"internalType":"uint256","name":"accumulatedBalance","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"claimRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deploymentBlockNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAllOracleMembers","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"oracleMember","type":"address"}],"name":"getOracleMemberIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOracleMembersCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"_slot","type":"uint64"},{"internalType":"bytes32","name":"_rewardsRoot","type":"bytes32"}],"name":"getReportHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"governance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"initialSmoothingPoolSlot","type":"uint64"}],"name":"initSmoothingPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_governance","type":"address"},{"internalType":"uint256","name":"_subscriptionCollateral","type":"uint256"},{"internalType":"uint256","name":"_poolFee","type":"uint256"},{"internalType":"address","name":"_poolFeeRecipient","type":"address"},{"internalType":"uint64","name":"_checkpointSlotSize","type":"uint64"},{"internalType":"uint64","name":"_quorum","type":"uint64"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lastConsolidatedSlot","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"oracleMembers","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingGovernance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolFeeRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"quorum","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"oracleMemberAddress","type":"address"},{"internalType":"uint256","name":"oracleMemberIndex","type":"uint256"}],"name":"removeOracleMember","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"reportHashToReport","outputs":[{"internalType":"uint64","name":"slot","type":"uint64"},{"internalType":"uint64","name":"votes","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewardRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"rewardAddress","type":"address"}],"name":"setRewardRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"slotNumber","type":"uint64"},{"internalType":"bytes32","name":"proposedRewardsRoot","type":"bytes32"}],"name":"submitReport","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"validatorID","type":"uint64"}],"name":"subscribeValidator","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint64[]","name":"validatorIDArray","type":"uint64[]"}],"name":"subscribeValidators","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"subscriptionCollateral","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newPendingGovernance","type":"address"}],"name":"transferGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64[]","name":"validatorIDArray","type":"uint64[]"}],"name":"unbanValidators","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"validatorID","type":"uint64"}],"name":"unsubscribeValidator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64[]","name":"validatorIDArray","type":"uint64[]"}],"name":"unsubscribeValidators","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"newCheckpointSlotSize","type":"uint64"}],"name":"updateCheckpointSlotSize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newSubscriptionCollateral","type":"uint256"}],"name":"updateCollateral","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPoolFee","type":"uint256"}],"name":"updatePoolFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newPoolFeeRecipient","type":"address"}],"name":"updatePoolFeeRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"newQuorum","type":"uint64"}],"name":"updateQuorum","outputs":[],"stateMutability":"nonpayable","type":"function"}] \ No newline at end of file diff --git a/contract/contract.go b/contract/contract.go index a53025c..eeaf090 100644 --- a/contract/contract.go +++ b/contract/contract.go @@ -31,7 +31,7 @@ var ( // ContractMetaData contains all meta data concerning the Contract contract. var ContractMetaData = &bind.MetaData{ - ABI: "[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newGovernance\",\"type\":\"address\"}],\"name\":\"AcceptGovernance\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newOracleMember\",\"type\":\"address\"}],\"name\":\"AddOracleMember\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"withdrawalAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"rewardAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"claimableBalance\",\"type\":\"uint256\"}],\"name\":\"ClaimRewards\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"donationAmount\",\"type\":\"uint256\"}],\"name\":\"EtherReceived\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"initialSmoothingPoolSlot\",\"type\":\"uint64\"}],\"name\":\"InitSmoothingPool\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oracleMemberRemoved\",\"type\":\"address\"}],\"name\":\"RemoveOracleMember\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"slotNumber\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"newRewardsRoot\",\"type\":\"bytes32\"}],\"name\":\"ReportConsolidated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"withdrawalAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"poolRecipient\",\"type\":\"address\"}],\"name\":\"SetRewardRecipient\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"slotNumber\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"newRewardsRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oracleMember\",\"type\":\"address\"}],\"name\":\"SubmitReport\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"subscriptionCollateral\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"validatorID\",\"type\":\"uint64\"}],\"name\":\"SubscribeValidator\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newPendingGovernance\",\"type\":\"address\"}],\"name\":\"TransferGovernance\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"validatorID\",\"type\":\"uint64\"}],\"name\":\"UnsubscribeValidator\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"newCheckpointSlotSize\",\"type\":\"uint64\"}],\"name\":\"UpdateCheckpointSlotSize\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newPoolFee\",\"type\":\"uint256\"}],\"name\":\"UpdatePoolFee\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newPoolFeeRecipient\",\"type\":\"address\"}],\"name\":\"UpdatePoolFeeRecipient\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"newQuorum\",\"type\":\"uint64\"}],\"name\":\"UpdateQuorum\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newSubscriptionCollateral\",\"type\":\"uint256\"}],\"name\":\"UpdateSubscriptionCollateral\",\"type\":\"event\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"inputs\":[],\"name\":\"INITIAL_REPORT_HASH\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptGovernance\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOracleMember\",\"type\":\"address\"}],\"name\":\"addOracleMember\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"addressToVotedReportHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"checkpointSlotSize\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"withdrawalAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"accumulatedBalance\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"merkleProof\",\"type\":\"bytes32[]\"}],\"name\":\"claimRewards\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"claimedBalance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"deploymentBlockNumber\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllOracleMembers\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"oracleMember\",\"type\":\"address\"}],\"name\":\"getOracleMemberIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getOracleMembersCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"_slot\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"_rewardsRoot\",\"type\":\"bytes32\"}],\"name\":\"getReportHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"governance\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"initialSmoothingPoolSlot\",\"type\":\"uint64\"}],\"name\":\"initSmoothingPool\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_governance\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_subscriptionCollateral\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_poolFee\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_poolFeeRecipient\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"_checkpointSlotSize\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"_quorum\",\"type\":\"uint64\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastConsolidatedSlot\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"oracleMembers\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pendingGovernance\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"poolFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"poolFeeRecipient\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"quorum\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"oracleMemberAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"oracleMemberIndex\",\"type\":\"uint256\"}],\"name\":\"removeOracleMember\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"reportHashToReport\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"slot\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"votes\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"rewardRecipient\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rewardsRoot\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"rewardAddress\",\"type\":\"address\"}],\"name\":\"setRewardRecipient\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"slotNumber\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"proposedRewardsRoot\",\"type\":\"bytes32\"}],\"name\":\"submitReport\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"validatorID\",\"type\":\"uint64\"}],\"name\":\"subscribeValidator\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64[]\",\"name\":\"validatorIDArray\",\"type\":\"uint64[]\"}],\"name\":\"subscribeValidators\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"subscriptionCollateral\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newPendingGovernance\",\"type\":\"address\"}],\"name\":\"transferGovernance\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"validatorID\",\"type\":\"uint64\"}],\"name\":\"unsubscribeValidator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"newCheckpointSlotSize\",\"type\":\"uint64\"}],\"name\":\"updateCheckpointSlotSize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newSubscriptionCollateral\",\"type\":\"uint256\"}],\"name\":\"updateCollateral\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newPoolFee\",\"type\":\"uint256\"}],\"name\":\"updatePoolFee\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newPoolFeeRecipient\",\"type\":\"address\"}],\"name\":\"updatePoolFeeRecipient\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"newQuorum\",\"type\":\"uint64\"}],\"name\":\"updateQuorum\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", + ABI: "[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newGovernance\",\"type\":\"address\"}],\"name\":\"AcceptGovernance\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newOracleMember\",\"type\":\"address\"}],\"name\":\"AddOracleMember\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"validatorID\",\"type\":\"uint64\"}],\"name\":\"BanValidator\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"withdrawalAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"rewardAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"claimableBalance\",\"type\":\"uint256\"}],\"name\":\"ClaimRewards\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"donationAmount\",\"type\":\"uint256\"}],\"name\":\"EtherReceived\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"initialSmoothingPoolSlot\",\"type\":\"uint64\"}],\"name\":\"InitSmoothingPool\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oracleMemberRemoved\",\"type\":\"address\"}],\"name\":\"RemoveOracleMember\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"slotNumber\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"newRewardsRoot\",\"type\":\"bytes32\"}],\"name\":\"ReportConsolidated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"withdrawalAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"poolRecipient\",\"type\":\"address\"}],\"name\":\"SetRewardRecipient\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"slotNumber\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"newRewardsRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oracleMember\",\"type\":\"address\"}],\"name\":\"SubmitReport\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"subscriptionCollateral\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"validatorID\",\"type\":\"uint64\"}],\"name\":\"SubscribeValidator\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newPendingGovernance\",\"type\":\"address\"}],\"name\":\"TransferGovernance\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"validatorID\",\"type\":\"uint64\"}],\"name\":\"UnbanValidator\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"validatorID\",\"type\":\"uint64\"}],\"name\":\"UnsubscribeValidator\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"newCheckpointSlotSize\",\"type\":\"uint64\"}],\"name\":\"UpdateCheckpointSlotSize\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newPoolFee\",\"type\":\"uint256\"}],\"name\":\"UpdatePoolFee\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newPoolFeeRecipient\",\"type\":\"address\"}],\"name\":\"UpdatePoolFeeRecipient\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"newQuorum\",\"type\":\"uint64\"}],\"name\":\"UpdateQuorum\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newSubscriptionCollateral\",\"type\":\"uint256\"}],\"name\":\"UpdateSubscriptionCollateral\",\"type\":\"event\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"inputs\":[],\"name\":\"INITIAL_REPORT_HASH\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptGovernance\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOracleMember\",\"type\":\"address\"}],\"name\":\"addOracleMember\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"addressToVotedReportHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64[]\",\"name\":\"validatorIDArray\",\"type\":\"uint64[]\"}],\"name\":\"banValidators\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"checkpointSlotSize\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"withdrawalAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"accumulatedBalance\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"merkleProof\",\"type\":\"bytes32[]\"}],\"name\":\"claimRewards\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"claimedBalance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"deploymentBlockNumber\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllOracleMembers\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"oracleMember\",\"type\":\"address\"}],\"name\":\"getOracleMemberIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getOracleMembersCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"_slot\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"_rewardsRoot\",\"type\":\"bytes32\"}],\"name\":\"getReportHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"governance\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"initialSmoothingPoolSlot\",\"type\":\"uint64\"}],\"name\":\"initSmoothingPool\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_governance\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_subscriptionCollateral\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_poolFee\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_poolFeeRecipient\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"_checkpointSlotSize\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"_quorum\",\"type\":\"uint64\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastConsolidatedSlot\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"oracleMembers\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pendingGovernance\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"poolFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"poolFeeRecipient\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"quorum\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"oracleMemberAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"oracleMemberIndex\",\"type\":\"uint256\"}],\"name\":\"removeOracleMember\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"reportHashToReport\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"slot\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"votes\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"rewardRecipient\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rewardsRoot\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"rewardAddress\",\"type\":\"address\"}],\"name\":\"setRewardRecipient\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"slotNumber\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"proposedRewardsRoot\",\"type\":\"bytes32\"}],\"name\":\"submitReport\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"validatorID\",\"type\":\"uint64\"}],\"name\":\"subscribeValidator\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64[]\",\"name\":\"validatorIDArray\",\"type\":\"uint64[]\"}],\"name\":\"subscribeValidators\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"subscriptionCollateral\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newPendingGovernance\",\"type\":\"address\"}],\"name\":\"transferGovernance\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64[]\",\"name\":\"validatorIDArray\",\"type\":\"uint64[]\"}],\"name\":\"unbanValidators\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"validatorID\",\"type\":\"uint64\"}],\"name\":\"unsubscribeValidator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64[]\",\"name\":\"validatorIDArray\",\"type\":\"uint64[]\"}],\"name\":\"unsubscribeValidators\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"newCheckpointSlotSize\",\"type\":\"uint64\"}],\"name\":\"updateCheckpointSlotSize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newSubscriptionCollateral\",\"type\":\"uint256\"}],\"name\":\"updateCollateral\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newPoolFee\",\"type\":\"uint256\"}],\"name\":\"updatePoolFee\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newPoolFeeRecipient\",\"type\":\"address\"}],\"name\":\"updatePoolFeeRecipient\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"newQuorum\",\"type\":\"uint64\"}],\"name\":\"updateQuorum\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", } // ContractABI is the input ABI used to generate the binding from. @@ -887,6 +887,27 @@ func (_Contract *ContractTransactorSession) AddOracleMember(newOracleMember comm return _Contract.Contract.AddOracleMember(&_Contract.TransactOpts, newOracleMember) } +// BanValidators is a paid mutator transaction binding the contract method 0x17a6863f. +// +// Solidity: function banValidators(uint64[] validatorIDArray) returns() +func (_Contract *ContractTransactor) BanValidators(opts *bind.TransactOpts, validatorIDArray []uint64) (*types.Transaction, error) { + return _Contract.contract.Transact(opts, "banValidators", validatorIDArray) +} + +// BanValidators is a paid mutator transaction binding the contract method 0x17a6863f. +// +// Solidity: function banValidators(uint64[] validatorIDArray) returns() +func (_Contract *ContractSession) BanValidators(validatorIDArray []uint64) (*types.Transaction, error) { + return _Contract.Contract.BanValidators(&_Contract.TransactOpts, validatorIDArray) +} + +// BanValidators is a paid mutator transaction binding the contract method 0x17a6863f. +// +// Solidity: function banValidators(uint64[] validatorIDArray) returns() +func (_Contract *ContractTransactorSession) BanValidators(validatorIDArray []uint64) (*types.Transaction, error) { + return _Contract.Contract.BanValidators(&_Contract.TransactOpts, validatorIDArray) +} + // ClaimRewards is a paid mutator transaction binding the contract method 0xd64bc331. // // Solidity: function claimRewards(address withdrawalAddress, uint256 accumulatedBalance, bytes32[] merkleProof) returns() @@ -1118,6 +1139,27 @@ func (_Contract *ContractTransactorSession) TransferOwnership(newOwner common.Ad return _Contract.Contract.TransferOwnership(&_Contract.TransactOpts, newOwner) } +// UnbanValidators is a paid mutator transaction binding the contract method 0x0008900a. +// +// Solidity: function unbanValidators(uint64[] validatorIDArray) returns() +func (_Contract *ContractTransactor) UnbanValidators(opts *bind.TransactOpts, validatorIDArray []uint64) (*types.Transaction, error) { + return _Contract.contract.Transact(opts, "unbanValidators", validatorIDArray) +} + +// UnbanValidators is a paid mutator transaction binding the contract method 0x0008900a. +// +// Solidity: function unbanValidators(uint64[] validatorIDArray) returns() +func (_Contract *ContractSession) UnbanValidators(validatorIDArray []uint64) (*types.Transaction, error) { + return _Contract.Contract.UnbanValidators(&_Contract.TransactOpts, validatorIDArray) +} + +// UnbanValidators is a paid mutator transaction binding the contract method 0x0008900a. +// +// Solidity: function unbanValidators(uint64[] validatorIDArray) returns() +func (_Contract *ContractTransactorSession) UnbanValidators(validatorIDArray []uint64) (*types.Transaction, error) { + return _Contract.Contract.UnbanValidators(&_Contract.TransactOpts, validatorIDArray) +} + // UnsubscribeValidator is a paid mutator transaction binding the contract method 0xc1542c52. // // Solidity: function unsubscribeValidator(uint64 validatorID) returns() @@ -1139,6 +1181,27 @@ func (_Contract *ContractTransactorSession) UnsubscribeValidator(validatorID uin return _Contract.Contract.UnsubscribeValidator(&_Contract.TransactOpts, validatorID) } +// UnsubscribeValidators is a paid mutator transaction binding the contract method 0x3ae15892. +// +// Solidity: function unsubscribeValidators(uint64[] validatorIDArray) returns() +func (_Contract *ContractTransactor) UnsubscribeValidators(opts *bind.TransactOpts, validatorIDArray []uint64) (*types.Transaction, error) { + return _Contract.contract.Transact(opts, "unsubscribeValidators", validatorIDArray) +} + +// UnsubscribeValidators is a paid mutator transaction binding the contract method 0x3ae15892. +// +// Solidity: function unsubscribeValidators(uint64[] validatorIDArray) returns() +func (_Contract *ContractSession) UnsubscribeValidators(validatorIDArray []uint64) (*types.Transaction, error) { + return _Contract.Contract.UnsubscribeValidators(&_Contract.TransactOpts, validatorIDArray) +} + +// UnsubscribeValidators is a paid mutator transaction binding the contract method 0x3ae15892. +// +// Solidity: function unsubscribeValidators(uint64[] validatorIDArray) returns() +func (_Contract *ContractTransactorSession) UnsubscribeValidators(validatorIDArray []uint64) (*types.Transaction, error) { + return _Contract.Contract.UnsubscribeValidators(&_Contract.TransactOpts, validatorIDArray) +} + // UpdateCheckpointSlotSize is a paid mutator transaction binding the contract method 0x38d092b9. // // Solidity: function updateCheckpointSlotSize(uint64 newCheckpointSlotSize) returns() @@ -1533,6 +1596,140 @@ func (_Contract *ContractFilterer) ParseAddOracleMember(log types.Log) (*Contrac return event, nil } +// ContractBanValidatorIterator is returned from FilterBanValidator and is used to iterate over the raw logs and unpacked data for BanValidator events raised by the Contract contract. +type ContractBanValidatorIterator struct { + Event *ContractBanValidator // 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 *ContractBanValidatorIterator) 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(ContractBanValidator) + 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(ContractBanValidator) + 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 *ContractBanValidatorIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ContractBanValidatorIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ContractBanValidator represents a BanValidator event raised by the Contract contract. +type ContractBanValidator struct { + ValidatorID uint64 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterBanValidator is a free log retrieval operation binding the contract event 0xb6978e4c15338f096fdd02b00c667cb63eeedd4df4f2243213e9371dbc5d1ca7. +// +// Solidity: event BanValidator(uint64 validatorID) +func (_Contract *ContractFilterer) FilterBanValidator(opts *bind.FilterOpts) (*ContractBanValidatorIterator, error) { + + logs, sub, err := _Contract.contract.FilterLogs(opts, "BanValidator") + if err != nil { + return nil, err + } + return &ContractBanValidatorIterator{contract: _Contract.contract, event: "BanValidator", logs: logs, sub: sub}, nil +} + +// WatchBanValidator is a free log subscription operation binding the contract event 0xb6978e4c15338f096fdd02b00c667cb63eeedd4df4f2243213e9371dbc5d1ca7. +// +// Solidity: event BanValidator(uint64 validatorID) +func (_Contract *ContractFilterer) WatchBanValidator(opts *bind.WatchOpts, sink chan<- *ContractBanValidator) (event.Subscription, error) { + + logs, sub, err := _Contract.contract.WatchLogs(opts, "BanValidator") + 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(ContractBanValidator) + if err := _Contract.contract.UnpackLog(event, "BanValidator", 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 +} + +// ParseBanValidator is a log parse operation binding the contract event 0xb6978e4c15338f096fdd02b00c667cb63eeedd4df4f2243213e9371dbc5d1ca7. +// +// Solidity: event BanValidator(uint64 validatorID) +func (_Contract *ContractFilterer) ParseBanValidator(log types.Log) (*ContractBanValidator, error) { + event := new(ContractBanValidator) + if err := _Contract.contract.UnpackLog(event, "BanValidator", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + // ContractClaimRewardsIterator is returned from FilterClaimRewards and is used to iterate over the raw logs and unpacked data for ClaimRewards events raised by the Contract contract. type ContractClaimRewardsIterator struct { Event *ContractClaimRewards // Event containing the contract specifics and raw log @@ -3035,6 +3232,140 @@ func (_Contract *ContractFilterer) ParseTransferGovernance(log types.Log) (*Cont return event, nil } +// ContractUnbanValidatorIterator is returned from FilterUnbanValidator and is used to iterate over the raw logs and unpacked data for UnbanValidator events raised by the Contract contract. +type ContractUnbanValidatorIterator struct { + Event *ContractUnbanValidator // 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 *ContractUnbanValidatorIterator) 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(ContractUnbanValidator) + 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(ContractUnbanValidator) + 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 *ContractUnbanValidatorIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ContractUnbanValidatorIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ContractUnbanValidator represents a UnbanValidator event raised by the Contract contract. +type ContractUnbanValidator struct { + ValidatorID uint64 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterUnbanValidator is a free log retrieval operation binding the contract event 0xaa0f7dc1145b1a2a0195373eca47d4c7a42be75b0579288456153a416494a581. +// +// Solidity: event UnbanValidator(uint64 validatorID) +func (_Contract *ContractFilterer) FilterUnbanValidator(opts *bind.FilterOpts) (*ContractUnbanValidatorIterator, error) { + + logs, sub, err := _Contract.contract.FilterLogs(opts, "UnbanValidator") + if err != nil { + return nil, err + } + return &ContractUnbanValidatorIterator{contract: _Contract.contract, event: "UnbanValidator", logs: logs, sub: sub}, nil +} + +// WatchUnbanValidator is a free log subscription operation binding the contract event 0xaa0f7dc1145b1a2a0195373eca47d4c7a42be75b0579288456153a416494a581. +// +// Solidity: event UnbanValidator(uint64 validatorID) +func (_Contract *ContractFilterer) WatchUnbanValidator(opts *bind.WatchOpts, sink chan<- *ContractUnbanValidator) (event.Subscription, error) { + + logs, sub, err := _Contract.contract.WatchLogs(opts, "UnbanValidator") + 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(ContractUnbanValidator) + if err := _Contract.contract.UnpackLog(event, "UnbanValidator", 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 +} + +// ParseUnbanValidator is a log parse operation binding the contract event 0xaa0f7dc1145b1a2a0195373eca47d4c7a42be75b0579288456153a416494a581. +// +// Solidity: event UnbanValidator(uint64 validatorID) +func (_Contract *ContractFilterer) ParseUnbanValidator(log types.Log) (*ContractUnbanValidator, error) { + event := new(ContractUnbanValidator) + if err := _Contract.contract.UnpackLog(event, "UnbanValidator", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + // ContractUnsubscribeValidatorIterator is returned from FilterUnsubscribeValidator and is used to iterate over the raw logs and unpacked data for UnsubscribeValidator events raised by the Contract contract. type ContractUnsubscribeValidatorIterator struct { Event *ContractUnsubscribeValidator // Event containing the contract specifics and raw log From a113ca9eb241d77ed9980145b52df9b2cd7f2405 Mon Sep 17 00:00:00 2001 From: Marketen Date: Mon, 20 Jan 2025 21:39:05 +0100 Subject: [PATCH 2/7] handle manual bans/unbans --- oracle/onchain.go | 86 ++++++++++++++++++++++++++++++++++++++++- oracle/oracle.go | 97 +++++++++++++++++++++++++++++++++++++++++++++++ oracle/types.go | 4 ++ 3 files changed, 185 insertions(+), 2 deletions(-) diff --git a/oracle/onchain.go b/oracle/onchain.go index 93e25b1..d993351 100644 --- a/oracle/onchain.go +++ b/oracle/onchain.go @@ -357,7 +357,6 @@ func (o *Onchain) GetSetOfValidators(valIndices []phase0.ValidatorIndex, slot st return nil, errors.New("Error: no validators found onchain for the given indices") } - // Sanity checks - Ensure all requested validators are found for _, idx := range valIndices { if _, found := validators.Data[idx]; !found { @@ -368,7 +367,6 @@ func (o *Onchain) GetSetOfValidators(valIndices []phase0.ValidatorIndex, slot st return validators.Data, nil } - func (o *Onchain) BlockByNumber(blockNumber *big.Int, opts ...retry.Option) (*types.Block, error) { var err error var block *types.Block @@ -919,6 +917,16 @@ func (o *Onchain) FetchFullBlock(slot uint64, oracle *Oracle, opt ...bool) *Full log.Fatal("failed getting update subscription collateral events: ", err) } + banValidator, err := o.GetBanValidatorEvents(fullBlock.GetBlockNumber()) + if err != nil { + log.Fatal("failed getting ban validator events: ", err) + } + + unbanValidator, err := o.GetUnbanValidatorEvents(fullBlock.GetBlockNumber()) + if err != nil { + log.Fatal("failed getting unban validator events: ", err) + } + // Not all events are fetched as they are not needed events := &Events{ EtherReceived: etherReceived, @@ -938,6 +946,8 @@ func (o *Onchain) FetchFullBlock(slot uint64, oracle *Oracle, opt ...bool) *Full //RemoveOracleMember: removeOracleMember, //TransferGovernance: transferGovernance, //AcceptGovernance: acceptGovernance, + BanValidator: banValidator, + UnbanValidator: unbanValidator, } // Add the events to the block @@ -1302,6 +1312,78 @@ func (o *Onchain) GetUnsubscribeValidatorEvents( return events, nil } +func (o *Onchain) GetBanValidatorEvents( + blockNumber uint64, + opts ...retry.Option) ([]*contract.ContractBanValidator, error) { + + startBlock := uint64(blockNumber) + endBlock := uint64(blockNumber) + + filterOpts := &bind.FilterOpts{Context: context.Background(), Start: startBlock, End: &endBlock} + + var err error + var itr *contract.ContractBanValidatorIterator + + err = retry.Do(func() error { + itr, err = o.Contract.FilterBanValidator(filterOpts) + if err != nil { + log.Warn("Failed attempt GetBanValidatorEvents for block ", strconv.FormatUint(blockNumber, 10), ": ", err.Error(), " Retrying...") + return err + } + return nil + }, o.GetRetryOpts(opts)...) + + if err != nil { + return nil, errors.Wrap(err, "could not get BanValidator events") + } + + var events []*contract.ContractBanValidator + for itr.Next() { + events = append(events, itr.Event) + } + err = itr.Close() + if err != nil { + return nil, errors.Wrap(err, "could not close BanValidator iterator") + } + return events, nil +} + +func (o *Onchain) GetUnbanValidatorEvents( + blockNumber uint64, + opts ...retry.Option) ([]*contract.ContractUnbanValidator, error) { + + startBlock := uint64(blockNumber) + endBlock := uint64(blockNumber) + + filterOpts := &bind.FilterOpts{Context: context.Background(), Start: startBlock, End: &endBlock} + + var err error + var itr *contract.ContractUnbanValidatorIterator + + err = retry.Do(func() error { + itr, err = o.Contract.FilterUnbanValidator(filterOpts) + if err != nil { + log.Warn("Failed attempt GetUnbanValidatorEvents for block ", strconv.FormatUint(blockNumber, 10), ": ", err.Error(), " Retrying...") + return err + } + return nil + }, o.GetRetryOpts(opts)...) + + if err != nil { + return nil, errors.Wrap(err, "could not get UnbanValidator events") + } + + var events []*contract.ContractUnbanValidator + for itr.Next() { + events = append(events, itr.Event) + } + err = itr.Close() + if err != nil { + return nil, errors.Wrap(err, "could not close UnbanValidator iterator") + } + return events, nil +} + func (o *Onchain) GetInitSmoothingPoolEvents( blockNumber uint64, opts ...retry.Option) ([]*contract.ContractInitSmoothingPool, error) { diff --git a/oracle/oracle.go b/oracle/oracle.go index 1b3e5e2..4087d19 100644 --- a/oracle/oracle.go +++ b/oracle/oracle.go @@ -206,6 +206,14 @@ func (or *Oracle) AdvanceStateToNextSlot(fullBlock *FullBlock) (uint64, error) { // Handle the donations from this block or.handleDonations(blockDonations) + // Manual bans/unbans should always be the last thing to be processed in each block, since + // we want to ensure they persist to the next block + // Handle manual bans + or.handleManualBans(fullBlock.Events.BanValidator) + + // Handle manual unbans + or.handleManualUnbans(fullBlock.Events.UnbanValidator) + // Handle validator cleanup: redisitribute the pending rewards of validators subscribed to the pool // that are not in the beacon chain anymore (exited/slashed). We dont run this on every slot because // its expensive. Runs every 4 hours. @@ -1211,6 +1219,57 @@ func (or *Oracle) handleManualUnsubscriptions( } } +func (or *Oracle) handleManualBans( + banEvents []*contract.ContractBanValidator) { + + // FIRST: healthy checks, ensure the bans events are okay. + + // Ensure the bans events are from the same block + if len(banEvents) > 0 { + blockReference := banEvents[0].Raw.BlockNumber + for _, ban := range banEvents { + if ban.Raw.BlockNumber != blockReference { + log.Fatal("Handling manual bans from different blocks is not possible: ", + ban.Raw.BlockNumber, " vs ", blockReference) + } + } + } + + totalPending := big.NewInt(0) + // SECOND: iterate over the ban events. + // - Advance state machine of all banned validators (move them to Banned state). + // - Sum all the pending rewards of the banned validators and share them among the rest. + + for _, ban := range banEvents { + or.advanceStateMachine(ban.ValidatorID, ManualBan) + totalPending.Add(totalPending, or.state.Validators[ban.ValidatorID].PendingRewardsWei) + + } + // THIRD: share the pending rewards of the banned validators among the rest + or.increaseAllPendingRewards(totalPending) +} + +func (or *Oracle) handleManualUnbans( + unbanEvents []*contract.ContractUnbanValidator) { + + // FIRST: healthy checks, ensure the unbans events are okay. + if len(unbanEvents) > 0 { + blockReference := unbanEvents[0].Raw.BlockNumber + for _, ban := range unbanEvents { + if ban.Raw.BlockNumber != blockReference { + log.Fatal("Handling manual unbans from different blocks is not possible: ", + ban.Raw.BlockNumber, " vs ", blockReference) + } + } + } + + // SECOND: iterate over the unban events. + // - Advance state machine of all unbanned validators (move them to Active state). + for _, unban := range unbanEvents { + or.advanceStateMachine(unban.ValidatorID, ManualUnban) + } +} + // Banning a validator implies sharing its pending rewards among the rest // of the validators and setting its pending to zero. func (or *Oracle) handleBanValidator(block SummarizedBlock) { @@ -1525,6 +1584,15 @@ func (or *Oracle) advanceStateMachine(valIndex uint64, event Event) { "Slot": or.state.NextSlotToProcess, }).Info("Validator state change") or.state.Validators[valIndex].ValidatorStatus = NotSubscribed + case ManualBan: + log.WithFields(log.Fields{ + "Event": "ManualBan", + "StateChange": "Active -> Banned", + "ValidatorIndex": valIndex, + "Slot": or.state.NextSlotToProcess, + }).Info("Validator state change") + or.state.Validators[valIndex].ValidatorStatus = Banned + } case YellowCard: switch event { @@ -1560,6 +1628,14 @@ func (or *Oracle) advanceStateMachine(valIndex uint64, event Event) { "Slot": or.state.NextSlotToProcess, }).Info("Validator state change") or.state.Validators[valIndex].ValidatorStatus = NotSubscribed + case ManualBan: + log.WithFields(log.Fields{ + "Event": "ManualBan", + "StateChange": "YellowCard -> Banned", + "ValidatorIndex": valIndex, + "Slot": or.state.NextSlotToProcess, + }).Info("Validator state change") + or.state.Validators[valIndex].ValidatorStatus = Banned } case RedCard: switch event { @@ -1595,6 +1671,14 @@ func (or *Oracle) advanceStateMachine(valIndex uint64, event Event) { "Slot": or.state.NextSlotToProcess, }).Info("Validator state change") or.state.Validators[valIndex].ValidatorStatus = NotSubscribed + case ManualBan: + log.WithFields(log.Fields{ + "Event": "ManualBan", + "StateChange": "RedCard -> Banned", + "ValidatorIndex": valIndex, + "Slot": or.state.NextSlotToProcess, + }).Info("Validator state change") + or.state.Validators[valIndex].ValidatorStatus = Banned } case NotSubscribed: switch event { @@ -1615,5 +1699,18 @@ func (or *Oracle) advanceStateMachine(valIndex uint64, event Event) { }).Info("Validator state change") or.state.Validators[valIndex].ValidatorStatus = Active } + // TODO: A validator could return to the state it was after being banned, but we + // return it always to the Active state for the sake of simplicity. + case Banned: + switch event { + case ManualUnban: + log.WithFields(log.Fields{ + "Event": "ManualUnban", + "StateChange": "Banned -> Active", + "ValidatorIndex": valIndex, + "Slot": or.state.NextSlotToProcess, + }).Info("Validator state change") + or.state.Validators[valIndex].ValidatorStatus = Active + } } } diff --git a/oracle/types.go b/oracle/types.go index 0981eeb..5b47d55 100644 --- a/oracle/types.go +++ b/oracle/types.go @@ -48,6 +48,8 @@ const ( ManualSubscription Event = 4 AutoSubscription Event = 5 Unsubscribe Event = 6 + ManualBan Event = 7 + ManualUnban Event = 8 ) // Block type @@ -113,6 +115,8 @@ type Events struct { RemoveOracleMember []*contract.ContractRemoveOracleMember `json:"remove_oracle_member_events"` TransferGovernance []*contract.ContractTransferGovernance `json:"transfer_governance_events"` AcceptGovernance []*contract.ContractAcceptGovernance `json:"accept_governance_events"` + BanValidator []*contract.ContractBanValidator `json:"ban_validator_events"` + UnbanValidator []*contract.ContractUnbanValidator `json:"unban_validator_events"` } // Information of every block from the blockchain. Some fields are optional From ec1e9058205291c5c4e3ff4ff02ee6b145d7d0f2 Mon Sep 17 00:00:00 2001 From: Marc Date: Tue, 21 Jan 2025 16:50:28 +0100 Subject: [PATCH 3/7] reset pending rewards of banned validators --- oracle/oracle.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/oracle/oracle.go b/oracle/oracle.go index 4087d19..988dafc 100644 --- a/oracle/oracle.go +++ b/oracle/oracle.go @@ -1247,6 +1247,11 @@ func (or *Oracle) handleManualBans( } // THIRD: share the pending rewards of the banned validators among the rest or.increaseAllPendingRewards(totalPending) + + // FOURTH: reset the pending rewards of the banned validators + for _, ban := range banEvents { + or.resetPendingRewards(ban.ValidatorID) + } } func (or *Oracle) handleManualUnbans( From 0ce997c3d44987f06b640dc0d619214c160fbad4 Mon Sep 17 00:00:00 2001 From: Marc Date: Wed, 22 Jan 2025 15:12:36 +0100 Subject: [PATCH 4/7] improve ban/unban logs --- oracle/oracle.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/oracle/oracle.go b/oracle/oracle.go index 988dafc..ef61361 100644 --- a/oracle/oracle.go +++ b/oracle/oracle.go @@ -1241,6 +1241,11 @@ func (or *Oracle) handleManualBans( // - Sum all the pending rewards of the banned validators and share them among the rest. for _, ban := range banEvents { + log.WithFields(log.Fields{ + "BlockNumber": ban.Raw.BlockNumber, + "TxHash": ban.Raw.TxHash, + "ValidatorIndex": ban.ValidatorID, + }).Info("[Ban] Ban event received") or.advanceStateMachine(ban.ValidatorID, ManualBan) totalPending.Add(totalPending, or.state.Validators[ban.ValidatorID].PendingRewardsWei) @@ -1271,6 +1276,11 @@ func (or *Oracle) handleManualUnbans( // SECOND: iterate over the unban events. // - Advance state machine of all unbanned validators (move them to Active state). for _, unban := range unbanEvents { + log.WithFields(log.Fields{ + "BlockNumber": unban.Raw.BlockNumber, + "TxHash": unban.Raw.TxHash, + "ValidatorIndex": unban.ValidatorID, + }).Info("[Unban] Unban event received") or.advanceStateMachine(unban.ValidatorID, ManualUnban) } } From 66e35bf3f522c6e810bdb91004c49b2cf4e0dbf8 Mon Sep 17 00:00:00 2001 From: Marc Date: Thu, 23 Jan 2025 12:24:46 +0100 Subject: [PATCH 5/7] unit test bans --- oracle/oracle_test.go | 188 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 188 insertions(+) diff --git a/oracle/oracle_test.go b/oracle/oracle_test.go index 9567496..4f208e0 100644 --- a/oracle/oracle_test.go +++ b/oracle/oracle_test.go @@ -1231,6 +1231,194 @@ func Test_BannedValidatorAutoSubs(t *testing.T) { oracle.handleCorrectBlockProposal(block3) } +func Test_ManualBanUnbanValidators(t *testing.T) { + + oracle := NewOracle(&Config{ + CollateralInWei: big.NewInt(1000), + Network: "mainnet", + }) + + vals := []*v1.Validator{ + &v1.Validator{ + Index: 33, + Status: v1.ValidatorStateActiveOngoing, + Validator: &phase0.Validator{ + // Valid eth1 address: 0x9427a30991170f917d7b83def6e44d26577871ed + WithdrawalCredentials: []byte{1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 148, 39, 163, 9, 145, 23, 15, 145, 125, 123, 131, 222, 246, 228, 77, 38, 87, 120, 113, 237}, + // Valdator pubkey: 0x81aae709e6aee7ed49cd15b941d85b967afcc8b844ee20bc7e13962e8484572c1b43d4be75652119ec353c1a32443e0d + PublicKey: phase0.BLSPubKey{129, 170, 231, 9, 230, 174, 231, 237, 73, 205, 21, 185, 65, 216, 91, 150, 122, 252, 200, 184, 68, 238, 32, 188, 126, 19, 150, 46, 132, 132, 87, 44, 27, 67, 212, 190, 117, 101, 33, 25, 236, 53, 60, 26, 50, 68, 62, 13}, + }, + }, + } + + // Now subscribe (but it was already auto subscribed) + subs := []*contract.ContractSubscribeValidator{ + &contract.ContractSubscribeValidator{ + ValidatorID: 33, + SubscriptionCollateral: big.NewInt(1000), + Raw: types.Log{TxHash: [32]byte{0x1}}, + Sender: common.Address{148, 39, 163, 9, 145, 23, 15, 145, 125, 123, 131, 222, 246, 228, 77, 38, 87, 120, 113, 237}, + }, + } + + oracle.handleManualSubscriptions(subs, vals) + require.Equal(t, Active, oracle.state.Validators[33].ValidatorStatus) + + bans := []*contract.ContractBanValidator{ + &contract.ContractBanValidator{ + ValidatorID: 33, + Raw: types.Log{TxHash: [32]byte{0x1}, BlockNumber: 1}, + }, + } + + oracle.handleManualBans(bans) + require.Equal(t, Banned, oracle.state.Validators[33].ValidatorStatus) + + unbans := []*contract.ContractUnbanValidator{ + &contract.ContractUnbanValidator{ + ValidatorID: 33, + Raw: types.Log{TxHash: [32]byte{0x1}, BlockNumber: 1}, + }, + } + + oracle.handleManualUnbans(unbans) + require.Equal(t, Active, oracle.state.Validators[33].ValidatorStatus) +} + + +func TestBanUnbanWithRewards(t *testing.T) { + + oracle := NewOracle(&Config{ + CollateralInWei: big.NewInt(0), + Network: "mainnet", + PoolFeesPercentOver10000: 0, // No fees for the sake of test simplicity + }) + + vals := []*v1.Validator{ + &v1.Validator{ + Index: 33, + Status: v1.ValidatorStateActiveOngoing, + Validator: &phase0.Validator{ + WithdrawalCredentials: []byte{1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 148, 39, 163, 9, 145, 23, 15, 145, 125, 123, 131, 222, 246, 228, 77, 38, 87, 120, 113, 237}, + PublicKey: phase0.BLSPubKey{129, 170, 231, 9, 230, 174, 231, 237, 73, 205, 21, 185, 65, 216, 91, 150, 122, 252, 200, 184, 68, 238, 32, 188, 126, 19, 150, 46, 132, 132, 87, 44, 27, 67, 212, 190, 117, 101, 33, 25, 236, 53, 60, 26, 50, 68, 62, 13}, + }, + }, + &v1.Validator{ + Index: 34, + Status: v1.ValidatorStateActiveOngoing, + Validator: &phase0.Validator{ + WithdrawalCredentials: []byte{1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 149, 39, 163, 9, 145, 23, 15, 145, 125, 123, 131, 222, 246, 228, 77, 38, 87, 120, 113, 237}, + PublicKey: phase0.BLSPubKey{128, 170, 231, 9, 230, 174, 231, 237, 73, 205, 21, 185, 65, 216, 91, 150, 122, 252, 200, 184, 68, 238, 32, 188, 126, 19, 150, 46, 132, 132, 87, 44, 27, 67, 212, 190, 117, 101, 33, 25, 236, 53, 60, 26, 50, 68, 62, 13}, + }, + }, + &v1.Validator{ + Index: 35, + Status: v1.ValidatorStateActiveOngoing, + Validator: &phase0.Validator{ + WithdrawalCredentials: []byte{1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 150, 39, 163, 9, 145, 23, 15, 145, 125, 123, 131, 222, 246, 228, 77, 38, 87, 120, 113, 237}, + PublicKey: phase0.BLSPubKey{127, 170, 231, 9, 230, 174, 231, 237, 73, 205, 21, 185, 65, 216, 91, 150, 122, 252, 200, 184, 68, 238, 32, 188, 126, 19, 150, 46, 132, 132, 87, 44, 27, 67, 212, 190, 117, 101, 33, 25, 236, 53, 60, 26, 50, 68, 62, 13}, + }, + }, + + &v1.Validator{ + Index: 36, + Status: v1.ValidatorStateActiveOngoing, + Validator: &phase0.Validator{ + WithdrawalCredentials: []byte{1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 151, 39, 163, 9, 145, 23, 15, 145, 125, 123, 131, 222, 246, 228, 77, 38, 87, 120, 113, 237}, + PublicKey: phase0.BLSPubKey{127, 170, 231, 9, 230, 174, 231, 237, 73, 205, 21, 185, 65, 216, 91, 150, 122, 252, 200, 184, 68, 238, 32, 188, 126, 19, 150, 46, 132, 132, 87, 44, 27, 67, 212, 190, 117, 101, 33, 25, 236, 53, 60, 26, 50, 68, 62, 13}, + }, + }, + } + + subs := []*contract.ContractSubscribeValidator{ + &contract.ContractSubscribeValidator{ + ValidatorID: 33, + SubscriptionCollateral: big.NewInt(0), + Raw: types.Log{TxHash: [32]byte{0x1}}, + Sender: common.Address{148, 39, 163, 9, 145, 23, 15, 145, 125, 123, 131, 222, 246, 228, 77, 38, 87, 120, 113, 237}, + }, + &contract.ContractSubscribeValidator{ + ValidatorID: 34, + SubscriptionCollateral: big.NewInt(0), + Raw: types.Log{TxHash: [32]byte{0x1}}, + Sender: common.Address{149, 39, 163, 9, 145, 23, 15, 145, 125, 123, 131, 222, 246, 228, 77, 38, 87, 120, 113, 237}, + }, + &contract.ContractSubscribeValidator{ + ValidatorID: 35, + SubscriptionCollateral: big.NewInt(0), + Raw: types.Log{TxHash: [32]byte{0x1}}, + Sender: common.Address{150, 39, 163, 9, 145, 23, 15, 145, 125, 123, 131, 222, 246, 228, 77, 38, 87, 120, 113, 237}, + }, + &contract.ContractSubscribeValidator{ + ValidatorID: 36, + SubscriptionCollateral: big.NewInt(0), + Raw: types.Log{TxHash: [32]byte{0x1}}, + Sender: common.Address{151, 39, 163, 9, 145, 23, 15, 145, 125, 123, 131, 222, 246, 228, 77, 38, 87, 120, 113, 237}, + }, + } + + oracle.handleManualSubscriptions(subs, vals) + require.Equal(t, Active, oracle.state.Validators[33].ValidatorStatus) + require.Equal(t, Active, oracle.state.Validators[34].ValidatorStatus) + require.Equal(t, Active, oracle.state.Validators[35].ValidatorStatus) + require.Equal(t, Active, oracle.state.Validators[36].ValidatorStatus) + + // Give rewards to all validators. + oracle.increaseValidatorAccumulatedRewards(33, big.NewInt(110000)) + oracle.increaseValidatorPendingRewards(33, big.NewInt(10000)) + + oracle.increaseValidatorAccumulatedRewards(34, big.NewInt(120000)) + oracle.increaseValidatorPendingRewards(34, big.NewInt(10000)) + + oracle.increaseValidatorAccumulatedRewards(35, big.NewInt(130000)) + oracle.increaseValidatorPendingRewards(35, big.NewInt(10000)) + + oracle.increaseValidatorAccumulatedRewards(36, big.NewInt(140000)) + oracle.increaseValidatorPendingRewards(36, big.NewInt(10000)) + + bans := []*contract.ContractBanValidator{ + &contract.ContractBanValidator{ + ValidatorID: 33, + Raw: types.Log{TxHash: [32]byte{0x1}, BlockNumber: 1}, + }, + &contract.ContractBanValidator{ + ValidatorID: 34, + Raw: types.Log{TxHash: [32]byte{0x1}, BlockNumber: 1}, + }, + } + + oracle.handleManualBans(bans) + require.Equal(t, Banned, oracle.state.Validators[33].ValidatorStatus) + + // Test rewards after the validator ban. + require.Equal(t, big.NewInt(110000), oracle.state.Validators[33].AccumulatedRewardsWei) + require.Equal(t, big.NewInt(0), oracle.state.Validators[33].PendingRewardsWei) + + require.Equal(t, big.NewInt(120000), oracle.state.Validators[34].AccumulatedRewardsWei) + require.Equal(t, big.NewInt(0), oracle.state.Validators[34].PendingRewardsWei) + + require.Equal(t, big.NewInt(130000), oracle.state.Validators[35].AccumulatedRewardsWei) + require.Equal(t, big.NewInt(20000), oracle.state.Validators[35].PendingRewardsWei) + + require.Equal(t, big.NewInt(140000), oracle.state.Validators[36].AccumulatedRewardsWei) + require.Equal(t, big.NewInt(20000), oracle.state.Validators[36].PendingRewardsWei) + + unbans := []*contract.ContractUnbanValidator{ + &contract.ContractUnbanValidator{ + ValidatorID: 33, + Raw: types.Log{TxHash: [32]byte{0x1}, BlockNumber: 1}, + }, + } + + oracle.handleManualUnbans(unbans) + require.Equal(t, Active, oracle.state.Validators[33].ValidatorStatus) + require.Equal(t, big.NewInt(0), oracle.state.Validators[33].PendingRewardsWei) + require.Equal(t, big.NewInt(110000), oracle.state.Validators[33].AccumulatedRewardsWei) + +} + + + func Test_handleManualSubscriptions_AlreadySubscribed_WithBalance(t *testing.T) { // Test a subscription to an already subscribed validator, that already // has some balance. Assert that the existing balance is not touched and the From 349b965503877994b666d1a5d21e2ede83584342 Mon Sep 17 00:00:00 2001 From: Marketen Date: Tue, 28 Jan 2025 12:41:14 +0100 Subject: [PATCH 6/7] eigenlayer support WIP --- config/config.go | 80 +- eigenLayer/manager/eigenpodmanager.abi | 1 + eigenLayer/manager/eigenpodmanager.go | 2368 ++++++++++++++++++++++ eigenLayer/pod/eigenpod.abi | 1 + eigenLayer/pod/eigenpod.go | 2485 ++++++++++++++++++++++++ main.go | 1 + oracle/onchain.go | 64 +- oracle/oracle.go | 31 + 8 files changed, 4978 insertions(+), 53 deletions(-) create mode 100644 eigenLayer/manager/eigenpodmanager.abi create mode 100644 eigenLayer/manager/eigenpodmanager.go create mode 100644 eigenLayer/pod/eigenpod.abi create mode 100644 eigenLayer/pod/eigenpod.go diff --git a/config/config.go b/config/config.go index e371736..7abfde2 100644 --- a/config/config.go +++ b/config/config.go @@ -12,18 +12,19 @@ import ( ) type CliConfig struct { - DryRun bool - UpdaterKeyFile string - UpdaterKeyPass string - NumRetries int - ConsensusEndpoint string - ExecutionEndpoint string - PoolAddress string - LogLevel string - ApiPort int - MetricsPort int - CheckPointSyncUrl string - RelayersEndpoints []string + DryRun bool + UpdaterKeyFile string + UpdaterKeyPass string + NumRetries int + ConsensusEndpoint string + ExecutionEndpoint string + PoolAddress string + EigenManagerAddress string + LogLevel string + ApiPort int + MetricsPort int + CheckPointSyncUrl string + RelayersEndpoints []string } // By default the release is a custom build. CI takes care of upgrading it with @@ -46,6 +47,7 @@ func NewCliConfig() (*CliConfig, error) { var consensusEndpoint = flag.String("consensus-endpoint", "", "Ethereum consensus endpoint") var executionEndpoint = flag.String("execution-endpoint", "", "Ethereum execution endpoint") var poolAddress = flag.String("pool-address", "", "Address of the smoothing pool contract") + var eigenManagerAddress = flag.String("eigen-manager-address", "", "Address of the eigen manager contract") var relayersEndpointsStr = flag.String("relayers-endpoints", "", "Comma-separated list of relayers endpoints") flag.Parse() @@ -77,6 +79,10 @@ func NewCliConfig() (*CliConfig, error) { return nil, errors.New("pool-address: " + *poolAddress + " is not a valid address") } + if !common.IsHexAddress(*eigenManagerAddress) { + return nil, errors.New("eigen-manager-address: " + *eigenManagerAddress + " is not a valid address") + } + // Post process the relayers endpoints, make it a slice relayersEndpoints := strings.Split(*relayersEndpointsStr, ",") @@ -98,18 +104,19 @@ func NewCliConfig() (*CliConfig, error) { } cliConf := &CliConfig{ - DryRun: *dryRun, - UpdaterKeyFile: *updaterKeystoreFile, - UpdaterKeyPass: *updaterKeystorePass, - NumRetries: *numRetries, - ConsensusEndpoint: *consensusEndpoint, - ExecutionEndpoint: *executionEndpoint, - PoolAddress: *poolAddress, - LogLevel: *logLevel, - ApiPort: *apiPort, - MetricsPort: *metricsPort, - CheckPointSyncUrl: *checkPointSyncUrl, - RelayersEndpoints: relayersEndpoints, + DryRun: *dryRun, + UpdaterKeyFile: *updaterKeystoreFile, + UpdaterKeyPass: *updaterKeystorePass, + NumRetries: *numRetries, + ConsensusEndpoint: *consensusEndpoint, + ExecutionEndpoint: *executionEndpoint, + PoolAddress: *poolAddress, + EigenManagerAddress: *eigenManagerAddress, + LogLevel: *logLevel, + ApiPort: *apiPort, + MetricsPort: *metricsPort, + CheckPointSyncUrl: *checkPointSyncUrl, + RelayersEndpoints: relayersEndpoints, } logConfig(cliConf) return cliConf, nil @@ -117,17 +124,18 @@ func NewCliConfig() (*CliConfig, error) { func logConfig(cfg *CliConfig) { log.WithFields(log.Fields{ - "DryRun": cfg.DryRun, - "UpdaterKeyFile": cfg.UpdaterKeyFile, - "UpdaterKeyPass": "hidden", - "NumRetries": cfg.NumRetries, - "ConsensusEndpoint": cfg.ConsensusEndpoint, - "ExecutionEndpoint": cfg.ExecutionEndpoint, - "PoolAddress": cfg.PoolAddress, - "LogLevel": cfg.LogLevel, - "ApiPort": cfg.ApiPort, - "MetricsPort": cfg.MetricsPort, - "CheckPointSyncUrl": cfg.CheckPointSyncUrl, - "RelayersEndpoints": cfg.RelayersEndpoints, + "DryRun": cfg.DryRun, + "UpdaterKeyFile": cfg.UpdaterKeyFile, + "UpdaterKeyPass": "hidden", + "NumRetries": cfg.NumRetries, + "ConsensusEndpoint": cfg.ConsensusEndpoint, + "ExecutionEndpoint": cfg.ExecutionEndpoint, + "PoolAddress": cfg.PoolAddress, + "EigenManagerAddress": cfg.EigenManagerAddress, + "LogLevel": cfg.LogLevel, + "ApiPort": cfg.ApiPort, + "MetricsPort": cfg.MetricsPort, + "CheckPointSyncUrl": cfg.CheckPointSyncUrl, + "RelayersEndpoints": cfg.RelayersEndpoints, }).Info("Cli Config:") } diff --git a/eigenLayer/manager/eigenpodmanager.abi b/eigenLayer/manager/eigenpodmanager.abi new file mode 100644 index 0000000..9455abe --- /dev/null +++ b/eigenLayer/manager/eigenpodmanager.abi @@ -0,0 +1 @@ +[{"inputs":[{"internalType":"contract IETHPOSDeposit","name":"_ethPOS","type":"address"},{"internalType":"contract IBeacon","name":"_eigenPodBeacon","type":"address"},{"internalType":"contract IStrategyManager","name":"_strategyManager","type":"address"},{"internalType":"contract ISlasher","name":"_slasher","type":"address"},{"internalType":"contract IDelegationManager","name":"_delegationManager","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"podOwner","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BeaconChainETHDeposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"podOwner","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"},{"indexed":false,"internalType":"uint96","name":"nonce","type":"uint96"},{"indexed":false,"internalType":"address","name":"delegatedAddress","type":"address"},{"indexed":false,"internalType":"address","name":"withdrawer","type":"address"},{"indexed":false,"internalType":"bytes32","name":"withdrawalRoot","type":"bytes32"}],"name":"BeaconChainETHWithdrawalCompleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"podOwner","type":"address"},{"indexed":false,"internalType":"int256","name":"newTotalShares","type":"int256"}],"name":"NewTotalShares","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"newPausedStatus","type":"uint256"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"contract IPauserRegistry","name":"pauserRegistry","type":"address"},{"indexed":false,"internalType":"contract IPauserRegistry","name":"newPauserRegistry","type":"address"}],"name":"PauserRegistrySet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"eigenPod","type":"address"},{"indexed":true,"internalType":"address","name":"podOwner","type":"address"}],"name":"PodDeployed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"podOwner","type":"address"},{"indexed":false,"internalType":"int256","name":"sharesDelta","type":"int256"}],"name":"PodSharesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"newPausedStatus","type":"uint256"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address","name":"podOwner","type":"address"},{"internalType":"uint256","name":"shares","type":"uint256"}],"name":"addShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"beaconChainETHStrategy","outputs":[{"internalType":"contract IStrategy","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"createPod","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"delegationManager","outputs":[{"internalType":"contract IDelegationManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"eigenPodBeacon","outputs":[{"internalType":"contract IBeacon","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ethPOS","outputs":[{"internalType":"contract IETHPOSDeposit","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"podOwner","type":"address"}],"name":"getPod","outputs":[{"internalType":"contract IEigenPod","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"podOwner","type":"address"}],"name":"hasPod","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"initialOwner","type":"address"},{"internalType":"contract IPauserRegistry","name":"_pauserRegistry","type":"address"},{"internalType":"uint256","name":"_initPausedStatus","type":"uint256"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"numPods","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"ownerToPod","outputs":[{"internalType":"contract IEigenPod","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPausedStatus","type":"uint256"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pauseAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"index","type":"uint8"}],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pauserRegistry","outputs":[{"internalType":"contract IPauserRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"podOwnerShares","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"podOwner","type":"address"},{"internalType":"int256","name":"sharesDelta","type":"int256"}],"name":"recordBeaconChainETHBalanceUpdate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"podOwner","type":"address"},{"internalType":"uint256","name":"shares","type":"uint256"}],"name":"removeShares","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IPauserRegistry","name":"newPauserRegistry","type":"address"}],"name":"setPauserRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"slasher","outputs":[{"internalType":"contract ISlasher","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"pubkey","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"bytes32","name":"depositDataRoot","type":"bytes32"}],"name":"stake","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"strategyManager","outputs":[{"internalType":"contract IStrategyManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPausedStatus","type":"uint256"}],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"podOwner","type":"address"},{"internalType":"address","name":"destination","type":"address"},{"internalType":"uint256","name":"shares","type":"uint256"}],"name":"withdrawSharesAsTokens","outputs":[],"stateMutability":"nonpayable","type":"function"}] \ No newline at end of file diff --git a/eigenLayer/manager/eigenpodmanager.go b/eigenLayer/manager/eigenpodmanager.go new file mode 100644 index 0000000..2fcec92 --- /dev/null +++ b/eigenLayer/manager/eigenpodmanager.go @@ -0,0 +1,2368 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package manager + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// ManagerMetaData contains all meta data concerning the Manager contract. +var ManagerMetaData = &bind.MetaData{ + ABI: "[{\"inputs\":[{\"internalType\":\"contractIETHPOSDeposit\",\"name\":\"_ethPOS\",\"type\":\"address\"},{\"internalType\":\"contractIBeacon\",\"name\":\"_eigenPodBeacon\",\"type\":\"address\"},{\"internalType\":\"contractIStrategyManager\",\"name\":\"_strategyManager\",\"type\":\"address\"},{\"internalType\":\"contractISlasher\",\"name\":\"_slasher\",\"type\":\"address\"},{\"internalType\":\"contractIDelegationManager\",\"name\":\"_delegationManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"podOwner\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"BeaconChainETHDeposited\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"podOwner\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"shares\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint96\",\"name\":\"nonce\",\"type\":\"uint96\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"delegatedAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"withdrawer\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"withdrawalRoot\",\"type\":\"bytes32\"}],\"name\":\"BeaconChainETHWithdrawalCompleted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"podOwner\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"int256\",\"name\":\"newTotalShares\",\"type\":\"int256\"}],\"name\":\"NewTotalShares\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newPausedStatus\",\"type\":\"uint256\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"contractIPauserRegistry\",\"name\":\"pauserRegistry\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"contractIPauserRegistry\",\"name\":\"newPauserRegistry\",\"type\":\"address\"}],\"name\":\"PauserRegistrySet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"eigenPod\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"podOwner\",\"type\":\"address\"}],\"name\":\"PodDeployed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"podOwner\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"int256\",\"name\":\"sharesDelta\",\"type\":\"int256\"}],\"name\":\"PodSharesUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newPausedStatus\",\"type\":\"uint256\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"podOwner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"shares\",\"type\":\"uint256\"}],\"name\":\"addShares\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"beaconChainETHStrategy\",\"outputs\":[{\"internalType\":\"contractIStrategy\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"createPod\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"delegationManager\",\"outputs\":[{\"internalType\":\"contractIDelegationManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"eigenPodBeacon\",\"outputs\":[{\"internalType\":\"contractIBeacon\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ethPOS\",\"outputs\":[{\"internalType\":\"contractIETHPOSDeposit\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"podOwner\",\"type\":\"address\"}],\"name\":\"getPod\",\"outputs\":[{\"internalType\":\"contractIEigenPod\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"podOwner\",\"type\":\"address\"}],\"name\":\"hasPod\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"initialOwner\",\"type\":\"address\"},{\"internalType\":\"contractIPauserRegistry\",\"name\":\"_pauserRegistry\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_initPausedStatus\",\"type\":\"uint256\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"numPods\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"ownerToPod\",\"outputs\":[{\"internalType\":\"contractIEigenPod\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newPausedStatus\",\"type\":\"uint256\"}],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pauseAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"index\",\"type\":\"uint8\"}],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pauserRegistry\",\"outputs\":[{\"internalType\":\"contractIPauserRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"podOwnerShares\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"podOwner\",\"type\":\"address\"},{\"internalType\":\"int256\",\"name\":\"sharesDelta\",\"type\":\"int256\"}],\"name\":\"recordBeaconChainETHBalanceUpdate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"podOwner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"shares\",\"type\":\"uint256\"}],\"name\":\"removeShares\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contractIPauserRegistry\",\"name\":\"newPauserRegistry\",\"type\":\"address\"}],\"name\":\"setPauserRegistry\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"slasher\",\"outputs\":[{\"internalType\":\"contractISlasher\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"pubkey\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"depositDataRoot\",\"type\":\"bytes32\"}],\"name\":\"stake\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"strategyManager\",\"outputs\":[{\"internalType\":\"contractIStrategyManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newPausedStatus\",\"type\":\"uint256\"}],\"name\":\"unpause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"podOwner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"destination\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"shares\",\"type\":\"uint256\"}],\"name\":\"withdrawSharesAsTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", +} + +// ManagerABI is the input ABI used to generate the binding from. +// Deprecated: Use ManagerMetaData.ABI instead. +var ManagerABI = ManagerMetaData.ABI + +// Manager is an auto generated Go binding around an Ethereum contract. +type Manager struct { + ManagerCaller // Read-only binding to the contract + ManagerTransactor // Write-only binding to the contract + ManagerFilterer // Log filterer for contract events +} + +// ManagerCaller is an auto generated read-only Go binding around an Ethereum contract. +type ManagerCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ManagerTransactor is an auto generated write-only Go binding around an Ethereum contract. +type ManagerTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ManagerFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type ManagerFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ManagerSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type ManagerSession struct { + Contract *Manager // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// ManagerCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type ManagerCallerSession struct { + Contract *ManagerCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// ManagerTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type ManagerTransactorSession struct { + Contract *ManagerTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// ManagerRaw is an auto generated low-level Go binding around an Ethereum contract. +type ManagerRaw struct { + Contract *Manager // Generic contract binding to access the raw methods on +} + +// ManagerCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type ManagerCallerRaw struct { + Contract *ManagerCaller // Generic read-only contract binding to access the raw methods on +} + +// ManagerTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type ManagerTransactorRaw struct { + Contract *ManagerTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewManager creates a new instance of Manager, bound to a specific deployed contract. +func NewManager(address common.Address, backend bind.ContractBackend) (*Manager, error) { + contract, err := bindManager(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &Manager{ManagerCaller: ManagerCaller{contract: contract}, ManagerTransactor: ManagerTransactor{contract: contract}, ManagerFilterer: ManagerFilterer{contract: contract}}, nil +} + +// NewManagerCaller creates a new read-only instance of Manager, bound to a specific deployed contract. +func NewManagerCaller(address common.Address, caller bind.ContractCaller) (*ManagerCaller, error) { + contract, err := bindManager(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &ManagerCaller{contract: contract}, nil +} + +// NewManagerTransactor creates a new write-only instance of Manager, bound to a specific deployed contract. +func NewManagerTransactor(address common.Address, transactor bind.ContractTransactor) (*ManagerTransactor, error) { + contract, err := bindManager(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &ManagerTransactor{contract: contract}, nil +} + +// NewManagerFilterer creates a new log filterer instance of Manager, bound to a specific deployed contract. +func NewManagerFilterer(address common.Address, filterer bind.ContractFilterer) (*ManagerFilterer, error) { + contract, err := bindManager(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &ManagerFilterer{contract: contract}, nil +} + +// bindManager binds a generic wrapper to an already deployed contract. +func bindManager(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := ManagerMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_Manager *ManagerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _Manager.Contract.ManagerCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_Manager *ManagerRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Manager.Contract.ManagerTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_Manager *ManagerRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _Manager.Contract.ManagerTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_Manager *ManagerCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _Manager.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_Manager *ManagerTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Manager.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_Manager *ManagerTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _Manager.Contract.contract.Transact(opts, method, params...) +} + +// BeaconChainETHStrategy is a free data retrieval call binding the contract method 0x9104c319. +// +// Solidity: function beaconChainETHStrategy() view returns(address) +func (_Manager *ManagerCaller) BeaconChainETHStrategy(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _Manager.contract.Call(opts, &out, "beaconChainETHStrategy") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// BeaconChainETHStrategy is a free data retrieval call binding the contract method 0x9104c319. +// +// Solidity: function beaconChainETHStrategy() view returns(address) +func (_Manager *ManagerSession) BeaconChainETHStrategy() (common.Address, error) { + return _Manager.Contract.BeaconChainETHStrategy(&_Manager.CallOpts) +} + +// BeaconChainETHStrategy is a free data retrieval call binding the contract method 0x9104c319. +// +// Solidity: function beaconChainETHStrategy() view returns(address) +func (_Manager *ManagerCallerSession) BeaconChainETHStrategy() (common.Address, error) { + return _Manager.Contract.BeaconChainETHStrategy(&_Manager.CallOpts) +} + +// DelegationManager is a free data retrieval call binding the contract method 0xea4d3c9b. +// +// Solidity: function delegationManager() view returns(address) +func (_Manager *ManagerCaller) DelegationManager(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _Manager.contract.Call(opts, &out, "delegationManager") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// DelegationManager is a free data retrieval call binding the contract method 0xea4d3c9b. +// +// Solidity: function delegationManager() view returns(address) +func (_Manager *ManagerSession) DelegationManager() (common.Address, error) { + return _Manager.Contract.DelegationManager(&_Manager.CallOpts) +} + +// DelegationManager is a free data retrieval call binding the contract method 0xea4d3c9b. +// +// Solidity: function delegationManager() view returns(address) +func (_Manager *ManagerCallerSession) DelegationManager() (common.Address, error) { + return _Manager.Contract.DelegationManager(&_Manager.CallOpts) +} + +// EigenPodBeacon is a free data retrieval call binding the contract method 0x292b7b2b. +// +// Solidity: function eigenPodBeacon() view returns(address) +func (_Manager *ManagerCaller) EigenPodBeacon(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _Manager.contract.Call(opts, &out, "eigenPodBeacon") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// EigenPodBeacon is a free data retrieval call binding the contract method 0x292b7b2b. +// +// Solidity: function eigenPodBeacon() view returns(address) +func (_Manager *ManagerSession) EigenPodBeacon() (common.Address, error) { + return _Manager.Contract.EigenPodBeacon(&_Manager.CallOpts) +} + +// EigenPodBeacon is a free data retrieval call binding the contract method 0x292b7b2b. +// +// Solidity: function eigenPodBeacon() view returns(address) +func (_Manager *ManagerCallerSession) EigenPodBeacon() (common.Address, error) { + return _Manager.Contract.EigenPodBeacon(&_Manager.CallOpts) +} + +// EthPOS is a free data retrieval call binding the contract method 0x74cdd798. +// +// Solidity: function ethPOS() view returns(address) +func (_Manager *ManagerCaller) EthPOS(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _Manager.contract.Call(opts, &out, "ethPOS") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// EthPOS is a free data retrieval call binding the contract method 0x74cdd798. +// +// Solidity: function ethPOS() view returns(address) +func (_Manager *ManagerSession) EthPOS() (common.Address, error) { + return _Manager.Contract.EthPOS(&_Manager.CallOpts) +} + +// EthPOS is a free data retrieval call binding the contract method 0x74cdd798. +// +// Solidity: function ethPOS() view returns(address) +func (_Manager *ManagerCallerSession) EthPOS() (common.Address, error) { + return _Manager.Contract.EthPOS(&_Manager.CallOpts) +} + +// GetPod is a free data retrieval call binding the contract method 0xa38406a3. +// +// Solidity: function getPod(address podOwner) view returns(address) +func (_Manager *ManagerCaller) GetPod(opts *bind.CallOpts, podOwner common.Address) (common.Address, error) { + var out []interface{} + err := _Manager.contract.Call(opts, &out, "getPod", podOwner) + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// GetPod is a free data retrieval call binding the contract method 0xa38406a3. +// +// Solidity: function getPod(address podOwner) view returns(address) +func (_Manager *ManagerSession) GetPod(podOwner common.Address) (common.Address, error) { + return _Manager.Contract.GetPod(&_Manager.CallOpts, podOwner) +} + +// GetPod is a free data retrieval call binding the contract method 0xa38406a3. +// +// Solidity: function getPod(address podOwner) view returns(address) +func (_Manager *ManagerCallerSession) GetPod(podOwner common.Address) (common.Address, error) { + return _Manager.Contract.GetPod(&_Manager.CallOpts, podOwner) +} + +// HasPod is a free data retrieval call binding the contract method 0xf6848d24. +// +// Solidity: function hasPod(address podOwner) view returns(bool) +func (_Manager *ManagerCaller) HasPod(opts *bind.CallOpts, podOwner common.Address) (bool, error) { + var out []interface{} + err := _Manager.contract.Call(opts, &out, "hasPod", podOwner) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// HasPod is a free data retrieval call binding the contract method 0xf6848d24. +// +// Solidity: function hasPod(address podOwner) view returns(bool) +func (_Manager *ManagerSession) HasPod(podOwner common.Address) (bool, error) { + return _Manager.Contract.HasPod(&_Manager.CallOpts, podOwner) +} + +// HasPod is a free data retrieval call binding the contract method 0xf6848d24. +// +// Solidity: function hasPod(address podOwner) view returns(bool) +func (_Manager *ManagerCallerSession) HasPod(podOwner common.Address) (bool, error) { + return _Manager.Contract.HasPod(&_Manager.CallOpts, podOwner) +} + +// NumPods is a free data retrieval call binding the contract method 0xa6a509be. +// +// Solidity: function numPods() view returns(uint256) +func (_Manager *ManagerCaller) NumPods(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _Manager.contract.Call(opts, &out, "numPods") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// NumPods is a free data retrieval call binding the contract method 0xa6a509be. +// +// Solidity: function numPods() view returns(uint256) +func (_Manager *ManagerSession) NumPods() (*big.Int, error) { + return _Manager.Contract.NumPods(&_Manager.CallOpts) +} + +// NumPods is a free data retrieval call binding the contract method 0xa6a509be. +// +// Solidity: function numPods() view returns(uint256) +func (_Manager *ManagerCallerSession) NumPods() (*big.Int, error) { + return _Manager.Contract.NumPods(&_Manager.CallOpts) +} + +// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. +// +// Solidity: function owner() view returns(address) +func (_Manager *ManagerCaller) Owner(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _Manager.contract.Call(opts, &out, "owner") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. +// +// Solidity: function owner() view returns(address) +func (_Manager *ManagerSession) Owner() (common.Address, error) { + return _Manager.Contract.Owner(&_Manager.CallOpts) +} + +// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. +// +// Solidity: function owner() view returns(address) +func (_Manager *ManagerCallerSession) Owner() (common.Address, error) { + return _Manager.Contract.Owner(&_Manager.CallOpts) +} + +// OwnerToPod is a free data retrieval call binding the contract method 0x9ba06275. +// +// Solidity: function ownerToPod(address ) view returns(address) +func (_Manager *ManagerCaller) OwnerToPod(opts *bind.CallOpts, arg0 common.Address) (common.Address, error) { + var out []interface{} + err := _Manager.contract.Call(opts, &out, "ownerToPod", arg0) + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// OwnerToPod is a free data retrieval call binding the contract method 0x9ba06275. +// +// Solidity: function ownerToPod(address ) view returns(address) +func (_Manager *ManagerSession) OwnerToPod(arg0 common.Address) (common.Address, error) { + return _Manager.Contract.OwnerToPod(&_Manager.CallOpts, arg0) +} + +// OwnerToPod is a free data retrieval call binding the contract method 0x9ba06275. +// +// Solidity: function ownerToPod(address ) view returns(address) +func (_Manager *ManagerCallerSession) OwnerToPod(arg0 common.Address) (common.Address, error) { + return _Manager.Contract.OwnerToPod(&_Manager.CallOpts, arg0) +} + +// Paused is a free data retrieval call binding the contract method 0x5ac86ab7. +// +// Solidity: function paused(uint8 index) view returns(bool) +func (_Manager *ManagerCaller) Paused(opts *bind.CallOpts, index uint8) (bool, error) { + var out []interface{} + err := _Manager.contract.Call(opts, &out, "paused", index) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// Paused is a free data retrieval call binding the contract method 0x5ac86ab7. +// +// Solidity: function paused(uint8 index) view returns(bool) +func (_Manager *ManagerSession) Paused(index uint8) (bool, error) { + return _Manager.Contract.Paused(&_Manager.CallOpts, index) +} + +// Paused is a free data retrieval call binding the contract method 0x5ac86ab7. +// +// Solidity: function paused(uint8 index) view returns(bool) +func (_Manager *ManagerCallerSession) Paused(index uint8) (bool, error) { + return _Manager.Contract.Paused(&_Manager.CallOpts, index) +} + +// Paused0 is a free data retrieval call binding the contract method 0x5c975abb. +// +// Solidity: function paused() view returns(uint256) +func (_Manager *ManagerCaller) Paused0(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _Manager.contract.Call(opts, &out, "paused0") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// Paused0 is a free data retrieval call binding the contract method 0x5c975abb. +// +// Solidity: function paused() view returns(uint256) +func (_Manager *ManagerSession) Paused0() (*big.Int, error) { + return _Manager.Contract.Paused0(&_Manager.CallOpts) +} + +// Paused0 is a free data retrieval call binding the contract method 0x5c975abb. +// +// Solidity: function paused() view returns(uint256) +func (_Manager *ManagerCallerSession) Paused0() (*big.Int, error) { + return _Manager.Contract.Paused0(&_Manager.CallOpts) +} + +// PauserRegistry is a free data retrieval call binding the contract method 0x886f1195. +// +// Solidity: function pauserRegistry() view returns(address) +func (_Manager *ManagerCaller) PauserRegistry(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _Manager.contract.Call(opts, &out, "pauserRegistry") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// PauserRegistry is a free data retrieval call binding the contract method 0x886f1195. +// +// Solidity: function pauserRegistry() view returns(address) +func (_Manager *ManagerSession) PauserRegistry() (common.Address, error) { + return _Manager.Contract.PauserRegistry(&_Manager.CallOpts) +} + +// PauserRegistry is a free data retrieval call binding the contract method 0x886f1195. +// +// Solidity: function pauserRegistry() view returns(address) +func (_Manager *ManagerCallerSession) PauserRegistry() (common.Address, error) { + return _Manager.Contract.PauserRegistry(&_Manager.CallOpts) +} + +// PodOwnerShares is a free data retrieval call binding the contract method 0x60f4062b. +// +// Solidity: function podOwnerShares(address ) view returns(int256) +func (_Manager *ManagerCaller) PodOwnerShares(opts *bind.CallOpts, arg0 common.Address) (*big.Int, error) { + var out []interface{} + err := _Manager.contract.Call(opts, &out, "podOwnerShares", arg0) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// PodOwnerShares is a free data retrieval call binding the contract method 0x60f4062b. +// +// Solidity: function podOwnerShares(address ) view returns(int256) +func (_Manager *ManagerSession) PodOwnerShares(arg0 common.Address) (*big.Int, error) { + return _Manager.Contract.PodOwnerShares(&_Manager.CallOpts, arg0) +} + +// PodOwnerShares is a free data retrieval call binding the contract method 0x60f4062b. +// +// Solidity: function podOwnerShares(address ) view returns(int256) +func (_Manager *ManagerCallerSession) PodOwnerShares(arg0 common.Address) (*big.Int, error) { + return _Manager.Contract.PodOwnerShares(&_Manager.CallOpts, arg0) +} + +// Slasher is a free data retrieval call binding the contract method 0xb1344271. +// +// Solidity: function slasher() view returns(address) +func (_Manager *ManagerCaller) Slasher(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _Manager.contract.Call(opts, &out, "slasher") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// Slasher is a free data retrieval call binding the contract method 0xb1344271. +// +// Solidity: function slasher() view returns(address) +func (_Manager *ManagerSession) Slasher() (common.Address, error) { + return _Manager.Contract.Slasher(&_Manager.CallOpts) +} + +// Slasher is a free data retrieval call binding the contract method 0xb1344271. +// +// Solidity: function slasher() view returns(address) +func (_Manager *ManagerCallerSession) Slasher() (common.Address, error) { + return _Manager.Contract.Slasher(&_Manager.CallOpts) +} + +// StrategyManager is a free data retrieval call binding the contract method 0x39b70e38. +// +// Solidity: function strategyManager() view returns(address) +func (_Manager *ManagerCaller) StrategyManager(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _Manager.contract.Call(opts, &out, "strategyManager") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// StrategyManager is a free data retrieval call binding the contract method 0x39b70e38. +// +// Solidity: function strategyManager() view returns(address) +func (_Manager *ManagerSession) StrategyManager() (common.Address, error) { + return _Manager.Contract.StrategyManager(&_Manager.CallOpts) +} + +// StrategyManager is a free data retrieval call binding the contract method 0x39b70e38. +// +// Solidity: function strategyManager() view returns(address) +func (_Manager *ManagerCallerSession) StrategyManager() (common.Address, error) { + return _Manager.Contract.StrategyManager(&_Manager.CallOpts) +} + +// AddShares is a paid mutator transaction binding the contract method 0x0e81073c. +// +// Solidity: function addShares(address podOwner, uint256 shares) returns(uint256) +func (_Manager *ManagerTransactor) AddShares(opts *bind.TransactOpts, podOwner common.Address, shares *big.Int) (*types.Transaction, error) { + return _Manager.contract.Transact(opts, "addShares", podOwner, shares) +} + +// AddShares is a paid mutator transaction binding the contract method 0x0e81073c. +// +// Solidity: function addShares(address podOwner, uint256 shares) returns(uint256) +func (_Manager *ManagerSession) AddShares(podOwner common.Address, shares *big.Int) (*types.Transaction, error) { + return _Manager.Contract.AddShares(&_Manager.TransactOpts, podOwner, shares) +} + +// AddShares is a paid mutator transaction binding the contract method 0x0e81073c. +// +// Solidity: function addShares(address podOwner, uint256 shares) returns(uint256) +func (_Manager *ManagerTransactorSession) AddShares(podOwner common.Address, shares *big.Int) (*types.Transaction, error) { + return _Manager.Contract.AddShares(&_Manager.TransactOpts, podOwner, shares) +} + +// CreatePod is a paid mutator transaction binding the contract method 0x84d81062. +// +// Solidity: function createPod() returns(address) +func (_Manager *ManagerTransactor) CreatePod(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Manager.contract.Transact(opts, "createPod") +} + +// CreatePod is a paid mutator transaction binding the contract method 0x84d81062. +// +// Solidity: function createPod() returns(address) +func (_Manager *ManagerSession) CreatePod() (*types.Transaction, error) { + return _Manager.Contract.CreatePod(&_Manager.TransactOpts) +} + +// CreatePod is a paid mutator transaction binding the contract method 0x84d81062. +// +// Solidity: function createPod() returns(address) +func (_Manager *ManagerTransactorSession) CreatePod() (*types.Transaction, error) { + return _Manager.Contract.CreatePod(&_Manager.TransactOpts) +} + +// Initialize is a paid mutator transaction binding the contract method 0x1794bb3c. +// +// Solidity: function initialize(address initialOwner, address _pauserRegistry, uint256 _initPausedStatus) returns() +func (_Manager *ManagerTransactor) Initialize(opts *bind.TransactOpts, initialOwner common.Address, _pauserRegistry common.Address, _initPausedStatus *big.Int) (*types.Transaction, error) { + return _Manager.contract.Transact(opts, "initialize", initialOwner, _pauserRegistry, _initPausedStatus) +} + +// Initialize is a paid mutator transaction binding the contract method 0x1794bb3c. +// +// Solidity: function initialize(address initialOwner, address _pauserRegistry, uint256 _initPausedStatus) returns() +func (_Manager *ManagerSession) Initialize(initialOwner common.Address, _pauserRegistry common.Address, _initPausedStatus *big.Int) (*types.Transaction, error) { + return _Manager.Contract.Initialize(&_Manager.TransactOpts, initialOwner, _pauserRegistry, _initPausedStatus) +} + +// Initialize is a paid mutator transaction binding the contract method 0x1794bb3c. +// +// Solidity: function initialize(address initialOwner, address _pauserRegistry, uint256 _initPausedStatus) returns() +func (_Manager *ManagerTransactorSession) Initialize(initialOwner common.Address, _pauserRegistry common.Address, _initPausedStatus *big.Int) (*types.Transaction, error) { + return _Manager.Contract.Initialize(&_Manager.TransactOpts, initialOwner, _pauserRegistry, _initPausedStatus) +} + +// Pause is a paid mutator transaction binding the contract method 0x136439dd. +// +// Solidity: function pause(uint256 newPausedStatus) returns() +func (_Manager *ManagerTransactor) Pause(opts *bind.TransactOpts, newPausedStatus *big.Int) (*types.Transaction, error) { + return _Manager.contract.Transact(opts, "pause", newPausedStatus) +} + +// Pause is a paid mutator transaction binding the contract method 0x136439dd. +// +// Solidity: function pause(uint256 newPausedStatus) returns() +func (_Manager *ManagerSession) Pause(newPausedStatus *big.Int) (*types.Transaction, error) { + return _Manager.Contract.Pause(&_Manager.TransactOpts, newPausedStatus) +} + +// Pause is a paid mutator transaction binding the contract method 0x136439dd. +// +// Solidity: function pause(uint256 newPausedStatus) returns() +func (_Manager *ManagerTransactorSession) Pause(newPausedStatus *big.Int) (*types.Transaction, error) { + return _Manager.Contract.Pause(&_Manager.TransactOpts, newPausedStatus) +} + +// PauseAll is a paid mutator transaction binding the contract method 0x595c6a67. +// +// Solidity: function pauseAll() returns() +func (_Manager *ManagerTransactor) PauseAll(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Manager.contract.Transact(opts, "pauseAll") +} + +// PauseAll is a paid mutator transaction binding the contract method 0x595c6a67. +// +// Solidity: function pauseAll() returns() +func (_Manager *ManagerSession) PauseAll() (*types.Transaction, error) { + return _Manager.Contract.PauseAll(&_Manager.TransactOpts) +} + +// PauseAll is a paid mutator transaction binding the contract method 0x595c6a67. +// +// Solidity: function pauseAll() returns() +func (_Manager *ManagerTransactorSession) PauseAll() (*types.Transaction, error) { + return _Manager.Contract.PauseAll(&_Manager.TransactOpts) +} + +// RecordBeaconChainETHBalanceUpdate is a paid mutator transaction binding the contract method 0xc2c51c40. +// +// Solidity: function recordBeaconChainETHBalanceUpdate(address podOwner, int256 sharesDelta) returns() +func (_Manager *ManagerTransactor) RecordBeaconChainETHBalanceUpdate(opts *bind.TransactOpts, podOwner common.Address, sharesDelta *big.Int) (*types.Transaction, error) { + return _Manager.contract.Transact(opts, "recordBeaconChainETHBalanceUpdate", podOwner, sharesDelta) +} + +// RecordBeaconChainETHBalanceUpdate is a paid mutator transaction binding the contract method 0xc2c51c40. +// +// Solidity: function recordBeaconChainETHBalanceUpdate(address podOwner, int256 sharesDelta) returns() +func (_Manager *ManagerSession) RecordBeaconChainETHBalanceUpdate(podOwner common.Address, sharesDelta *big.Int) (*types.Transaction, error) { + return _Manager.Contract.RecordBeaconChainETHBalanceUpdate(&_Manager.TransactOpts, podOwner, sharesDelta) +} + +// RecordBeaconChainETHBalanceUpdate is a paid mutator transaction binding the contract method 0xc2c51c40. +// +// Solidity: function recordBeaconChainETHBalanceUpdate(address podOwner, int256 sharesDelta) returns() +func (_Manager *ManagerTransactorSession) RecordBeaconChainETHBalanceUpdate(podOwner common.Address, sharesDelta *big.Int) (*types.Transaction, error) { + return _Manager.Contract.RecordBeaconChainETHBalanceUpdate(&_Manager.TransactOpts, podOwner, sharesDelta) +} + +// RemoveShares is a paid mutator transaction binding the contract method 0xbeffbb89. +// +// Solidity: function removeShares(address podOwner, uint256 shares) returns() +func (_Manager *ManagerTransactor) RemoveShares(opts *bind.TransactOpts, podOwner common.Address, shares *big.Int) (*types.Transaction, error) { + return _Manager.contract.Transact(opts, "removeShares", podOwner, shares) +} + +// RemoveShares is a paid mutator transaction binding the contract method 0xbeffbb89. +// +// Solidity: function removeShares(address podOwner, uint256 shares) returns() +func (_Manager *ManagerSession) RemoveShares(podOwner common.Address, shares *big.Int) (*types.Transaction, error) { + return _Manager.Contract.RemoveShares(&_Manager.TransactOpts, podOwner, shares) +} + +// RemoveShares is a paid mutator transaction binding the contract method 0xbeffbb89. +// +// Solidity: function removeShares(address podOwner, uint256 shares) returns() +func (_Manager *ManagerTransactorSession) RemoveShares(podOwner common.Address, shares *big.Int) (*types.Transaction, error) { + return _Manager.Contract.RemoveShares(&_Manager.TransactOpts, podOwner, shares) +} + +// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. +// +// Solidity: function renounceOwnership() returns() +func (_Manager *ManagerTransactor) RenounceOwnership(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Manager.contract.Transact(opts, "renounceOwnership") +} + +// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. +// +// Solidity: function renounceOwnership() returns() +func (_Manager *ManagerSession) RenounceOwnership() (*types.Transaction, error) { + return _Manager.Contract.RenounceOwnership(&_Manager.TransactOpts) +} + +// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. +// +// Solidity: function renounceOwnership() returns() +func (_Manager *ManagerTransactorSession) RenounceOwnership() (*types.Transaction, error) { + return _Manager.Contract.RenounceOwnership(&_Manager.TransactOpts) +} + +// SetPauserRegistry is a paid mutator transaction binding the contract method 0x10d67a2f. +// +// Solidity: function setPauserRegistry(address newPauserRegistry) returns() +func (_Manager *ManagerTransactor) SetPauserRegistry(opts *bind.TransactOpts, newPauserRegistry common.Address) (*types.Transaction, error) { + return _Manager.contract.Transact(opts, "setPauserRegistry", newPauserRegistry) +} + +// SetPauserRegistry is a paid mutator transaction binding the contract method 0x10d67a2f. +// +// Solidity: function setPauserRegistry(address newPauserRegistry) returns() +func (_Manager *ManagerSession) SetPauserRegistry(newPauserRegistry common.Address) (*types.Transaction, error) { + return _Manager.Contract.SetPauserRegistry(&_Manager.TransactOpts, newPauserRegistry) +} + +// SetPauserRegistry is a paid mutator transaction binding the contract method 0x10d67a2f. +// +// Solidity: function setPauserRegistry(address newPauserRegistry) returns() +func (_Manager *ManagerTransactorSession) SetPauserRegistry(newPauserRegistry common.Address) (*types.Transaction, error) { + return _Manager.Contract.SetPauserRegistry(&_Manager.TransactOpts, newPauserRegistry) +} + +// Stake is a paid mutator transaction binding the contract method 0x9b4e4634. +// +// Solidity: function stake(bytes pubkey, bytes signature, bytes32 depositDataRoot) payable returns() +func (_Manager *ManagerTransactor) Stake(opts *bind.TransactOpts, pubkey []byte, signature []byte, depositDataRoot [32]byte) (*types.Transaction, error) { + return _Manager.contract.Transact(opts, "stake", pubkey, signature, depositDataRoot) +} + +// Stake is a paid mutator transaction binding the contract method 0x9b4e4634. +// +// Solidity: function stake(bytes pubkey, bytes signature, bytes32 depositDataRoot) payable returns() +func (_Manager *ManagerSession) Stake(pubkey []byte, signature []byte, depositDataRoot [32]byte) (*types.Transaction, error) { + return _Manager.Contract.Stake(&_Manager.TransactOpts, pubkey, signature, depositDataRoot) +} + +// Stake is a paid mutator transaction binding the contract method 0x9b4e4634. +// +// Solidity: function stake(bytes pubkey, bytes signature, bytes32 depositDataRoot) payable returns() +func (_Manager *ManagerTransactorSession) Stake(pubkey []byte, signature []byte, depositDataRoot [32]byte) (*types.Transaction, error) { + return _Manager.Contract.Stake(&_Manager.TransactOpts, pubkey, signature, depositDataRoot) +} + +// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. +// +// Solidity: function transferOwnership(address newOwner) returns() +func (_Manager *ManagerTransactor) TransferOwnership(opts *bind.TransactOpts, newOwner common.Address) (*types.Transaction, error) { + return _Manager.contract.Transact(opts, "transferOwnership", newOwner) +} + +// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. +// +// Solidity: function transferOwnership(address newOwner) returns() +func (_Manager *ManagerSession) TransferOwnership(newOwner common.Address) (*types.Transaction, error) { + return _Manager.Contract.TransferOwnership(&_Manager.TransactOpts, newOwner) +} + +// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. +// +// Solidity: function transferOwnership(address newOwner) returns() +func (_Manager *ManagerTransactorSession) TransferOwnership(newOwner common.Address) (*types.Transaction, error) { + return _Manager.Contract.TransferOwnership(&_Manager.TransactOpts, newOwner) +} + +// Unpause is a paid mutator transaction binding the contract method 0xfabc1cbc. +// +// Solidity: function unpause(uint256 newPausedStatus) returns() +func (_Manager *ManagerTransactor) Unpause(opts *bind.TransactOpts, newPausedStatus *big.Int) (*types.Transaction, error) { + return _Manager.contract.Transact(opts, "unpause", newPausedStatus) +} + +// Unpause is a paid mutator transaction binding the contract method 0xfabc1cbc. +// +// Solidity: function unpause(uint256 newPausedStatus) returns() +func (_Manager *ManagerSession) Unpause(newPausedStatus *big.Int) (*types.Transaction, error) { + return _Manager.Contract.Unpause(&_Manager.TransactOpts, newPausedStatus) +} + +// Unpause is a paid mutator transaction binding the contract method 0xfabc1cbc. +// +// Solidity: function unpause(uint256 newPausedStatus) returns() +func (_Manager *ManagerTransactorSession) Unpause(newPausedStatus *big.Int) (*types.Transaction, error) { + return _Manager.Contract.Unpause(&_Manager.TransactOpts, newPausedStatus) +} + +// WithdrawSharesAsTokens is a paid mutator transaction binding the contract method 0x387b1300. +// +// Solidity: function withdrawSharesAsTokens(address podOwner, address destination, uint256 shares) returns() +func (_Manager *ManagerTransactor) WithdrawSharesAsTokens(opts *bind.TransactOpts, podOwner common.Address, destination common.Address, shares *big.Int) (*types.Transaction, error) { + return _Manager.contract.Transact(opts, "withdrawSharesAsTokens", podOwner, destination, shares) +} + +// WithdrawSharesAsTokens is a paid mutator transaction binding the contract method 0x387b1300. +// +// Solidity: function withdrawSharesAsTokens(address podOwner, address destination, uint256 shares) returns() +func (_Manager *ManagerSession) WithdrawSharesAsTokens(podOwner common.Address, destination common.Address, shares *big.Int) (*types.Transaction, error) { + return _Manager.Contract.WithdrawSharesAsTokens(&_Manager.TransactOpts, podOwner, destination, shares) +} + +// WithdrawSharesAsTokens is a paid mutator transaction binding the contract method 0x387b1300. +// +// Solidity: function withdrawSharesAsTokens(address podOwner, address destination, uint256 shares) returns() +func (_Manager *ManagerTransactorSession) WithdrawSharesAsTokens(podOwner common.Address, destination common.Address, shares *big.Int) (*types.Transaction, error) { + return _Manager.Contract.WithdrawSharesAsTokens(&_Manager.TransactOpts, podOwner, destination, shares) +} + +// ManagerBeaconChainETHDepositedIterator is returned from FilterBeaconChainETHDeposited and is used to iterate over the raw logs and unpacked data for BeaconChainETHDeposited events raised by the Manager contract. +type ManagerBeaconChainETHDepositedIterator struct { + Event *ManagerBeaconChainETHDeposited // 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 *ManagerBeaconChainETHDepositedIterator) 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(ManagerBeaconChainETHDeposited) + 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(ManagerBeaconChainETHDeposited) + 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 *ManagerBeaconChainETHDepositedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ManagerBeaconChainETHDepositedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ManagerBeaconChainETHDeposited represents a BeaconChainETHDeposited event raised by the Manager contract. +type ManagerBeaconChainETHDeposited struct { + PodOwner common.Address + Amount *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterBeaconChainETHDeposited is a free log retrieval operation binding the contract event 0x35a85cabc603f48abb2b71d9fbd8adea7c449d7f0be900ae7a2986ea369c3d0d. +// +// Solidity: event BeaconChainETHDeposited(address indexed podOwner, uint256 amount) +func (_Manager *ManagerFilterer) FilterBeaconChainETHDeposited(opts *bind.FilterOpts, podOwner []common.Address) (*ManagerBeaconChainETHDepositedIterator, error) { + + var podOwnerRule []interface{} + for _, podOwnerItem := range podOwner { + podOwnerRule = append(podOwnerRule, podOwnerItem) + } + + logs, sub, err := _Manager.contract.FilterLogs(opts, "BeaconChainETHDeposited", podOwnerRule) + if err != nil { + return nil, err + } + return &ManagerBeaconChainETHDepositedIterator{contract: _Manager.contract, event: "BeaconChainETHDeposited", logs: logs, sub: sub}, nil +} + +// WatchBeaconChainETHDeposited is a free log subscription operation binding the contract event 0x35a85cabc603f48abb2b71d9fbd8adea7c449d7f0be900ae7a2986ea369c3d0d. +// +// Solidity: event BeaconChainETHDeposited(address indexed podOwner, uint256 amount) +func (_Manager *ManagerFilterer) WatchBeaconChainETHDeposited(opts *bind.WatchOpts, sink chan<- *ManagerBeaconChainETHDeposited, podOwner []common.Address) (event.Subscription, error) { + + var podOwnerRule []interface{} + for _, podOwnerItem := range podOwner { + podOwnerRule = append(podOwnerRule, podOwnerItem) + } + + logs, sub, err := _Manager.contract.WatchLogs(opts, "BeaconChainETHDeposited", podOwnerRule) + 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(ManagerBeaconChainETHDeposited) + if err := _Manager.contract.UnpackLog(event, "BeaconChainETHDeposited", 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 +} + +// ParseBeaconChainETHDeposited is a log parse operation binding the contract event 0x35a85cabc603f48abb2b71d9fbd8adea7c449d7f0be900ae7a2986ea369c3d0d. +// +// Solidity: event BeaconChainETHDeposited(address indexed podOwner, uint256 amount) +func (_Manager *ManagerFilterer) ParseBeaconChainETHDeposited(log types.Log) (*ManagerBeaconChainETHDeposited, error) { + event := new(ManagerBeaconChainETHDeposited) + if err := _Manager.contract.UnpackLog(event, "BeaconChainETHDeposited", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ManagerBeaconChainETHWithdrawalCompletedIterator is returned from FilterBeaconChainETHWithdrawalCompleted and is used to iterate over the raw logs and unpacked data for BeaconChainETHWithdrawalCompleted events raised by the Manager contract. +type ManagerBeaconChainETHWithdrawalCompletedIterator struct { + Event *ManagerBeaconChainETHWithdrawalCompleted // 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 *ManagerBeaconChainETHWithdrawalCompletedIterator) 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(ManagerBeaconChainETHWithdrawalCompleted) + 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(ManagerBeaconChainETHWithdrawalCompleted) + 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 *ManagerBeaconChainETHWithdrawalCompletedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ManagerBeaconChainETHWithdrawalCompletedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ManagerBeaconChainETHWithdrawalCompleted represents a BeaconChainETHWithdrawalCompleted event raised by the Manager contract. +type ManagerBeaconChainETHWithdrawalCompleted struct { + PodOwner common.Address + Shares *big.Int + Nonce *big.Int + DelegatedAddress common.Address + Withdrawer common.Address + WithdrawalRoot [32]byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterBeaconChainETHWithdrawalCompleted is a free log retrieval operation binding the contract event 0xa6bab1d55a361fcea2eee2bc9491e4f01e6cf333df03c9c4f2c144466429f7d6. +// +// Solidity: event BeaconChainETHWithdrawalCompleted(address indexed podOwner, uint256 shares, uint96 nonce, address delegatedAddress, address withdrawer, bytes32 withdrawalRoot) +func (_Manager *ManagerFilterer) FilterBeaconChainETHWithdrawalCompleted(opts *bind.FilterOpts, podOwner []common.Address) (*ManagerBeaconChainETHWithdrawalCompletedIterator, error) { + + var podOwnerRule []interface{} + for _, podOwnerItem := range podOwner { + podOwnerRule = append(podOwnerRule, podOwnerItem) + } + + logs, sub, err := _Manager.contract.FilterLogs(opts, "BeaconChainETHWithdrawalCompleted", podOwnerRule) + if err != nil { + return nil, err + } + return &ManagerBeaconChainETHWithdrawalCompletedIterator{contract: _Manager.contract, event: "BeaconChainETHWithdrawalCompleted", logs: logs, sub: sub}, nil +} + +// WatchBeaconChainETHWithdrawalCompleted is a free log subscription operation binding the contract event 0xa6bab1d55a361fcea2eee2bc9491e4f01e6cf333df03c9c4f2c144466429f7d6. +// +// Solidity: event BeaconChainETHWithdrawalCompleted(address indexed podOwner, uint256 shares, uint96 nonce, address delegatedAddress, address withdrawer, bytes32 withdrawalRoot) +func (_Manager *ManagerFilterer) WatchBeaconChainETHWithdrawalCompleted(opts *bind.WatchOpts, sink chan<- *ManagerBeaconChainETHWithdrawalCompleted, podOwner []common.Address) (event.Subscription, error) { + + var podOwnerRule []interface{} + for _, podOwnerItem := range podOwner { + podOwnerRule = append(podOwnerRule, podOwnerItem) + } + + logs, sub, err := _Manager.contract.WatchLogs(opts, "BeaconChainETHWithdrawalCompleted", podOwnerRule) + 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(ManagerBeaconChainETHWithdrawalCompleted) + if err := _Manager.contract.UnpackLog(event, "BeaconChainETHWithdrawalCompleted", 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 +} + +// ParseBeaconChainETHWithdrawalCompleted is a log parse operation binding the contract event 0xa6bab1d55a361fcea2eee2bc9491e4f01e6cf333df03c9c4f2c144466429f7d6. +// +// Solidity: event BeaconChainETHWithdrawalCompleted(address indexed podOwner, uint256 shares, uint96 nonce, address delegatedAddress, address withdrawer, bytes32 withdrawalRoot) +func (_Manager *ManagerFilterer) ParseBeaconChainETHWithdrawalCompleted(log types.Log) (*ManagerBeaconChainETHWithdrawalCompleted, error) { + event := new(ManagerBeaconChainETHWithdrawalCompleted) + if err := _Manager.contract.UnpackLog(event, "BeaconChainETHWithdrawalCompleted", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ManagerInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the Manager contract. +type ManagerInitializedIterator struct { + Event *ManagerInitialized // 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 *ManagerInitializedIterator) 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(ManagerInitialized) + 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(ManagerInitialized) + 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 *ManagerInitializedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ManagerInitializedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ManagerInitialized represents a Initialized event raised by the Manager contract. +type ManagerInitialized struct { + Version uint8 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterInitialized is a free log retrieval operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498. +// +// Solidity: event Initialized(uint8 version) +func (_Manager *ManagerFilterer) FilterInitialized(opts *bind.FilterOpts) (*ManagerInitializedIterator, error) { + + logs, sub, err := _Manager.contract.FilterLogs(opts, "Initialized") + if err != nil { + return nil, err + } + return &ManagerInitializedIterator{contract: _Manager.contract, event: "Initialized", logs: logs, sub: sub}, nil +} + +// WatchInitialized is a free log subscription operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498. +// +// Solidity: event Initialized(uint8 version) +func (_Manager *ManagerFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *ManagerInitialized) (event.Subscription, error) { + + logs, sub, err := _Manager.contract.WatchLogs(opts, "Initialized") + 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(ManagerInitialized) + if err := _Manager.contract.UnpackLog(event, "Initialized", 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 +} + +// ParseInitialized is a log parse operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498. +// +// Solidity: event Initialized(uint8 version) +func (_Manager *ManagerFilterer) ParseInitialized(log types.Log) (*ManagerInitialized, error) { + event := new(ManagerInitialized) + if err := _Manager.contract.UnpackLog(event, "Initialized", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ManagerNewTotalSharesIterator is returned from FilterNewTotalShares and is used to iterate over the raw logs and unpacked data for NewTotalShares events raised by the Manager contract. +type ManagerNewTotalSharesIterator struct { + Event *ManagerNewTotalShares // 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 *ManagerNewTotalSharesIterator) 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(ManagerNewTotalShares) + 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(ManagerNewTotalShares) + 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 *ManagerNewTotalSharesIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ManagerNewTotalSharesIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ManagerNewTotalShares represents a NewTotalShares event raised by the Manager contract. +type ManagerNewTotalShares struct { + PodOwner common.Address + NewTotalShares *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterNewTotalShares is a free log retrieval operation binding the contract event 0xd4def76d6d2bed6f14d5cd9af73cc2913d618d00edde42432e81c09bfe077098. +// +// Solidity: event NewTotalShares(address indexed podOwner, int256 newTotalShares) +func (_Manager *ManagerFilterer) FilterNewTotalShares(opts *bind.FilterOpts, podOwner []common.Address) (*ManagerNewTotalSharesIterator, error) { + + var podOwnerRule []interface{} + for _, podOwnerItem := range podOwner { + podOwnerRule = append(podOwnerRule, podOwnerItem) + } + + logs, sub, err := _Manager.contract.FilterLogs(opts, "NewTotalShares", podOwnerRule) + if err != nil { + return nil, err + } + return &ManagerNewTotalSharesIterator{contract: _Manager.contract, event: "NewTotalShares", logs: logs, sub: sub}, nil +} + +// WatchNewTotalShares is a free log subscription operation binding the contract event 0xd4def76d6d2bed6f14d5cd9af73cc2913d618d00edde42432e81c09bfe077098. +// +// Solidity: event NewTotalShares(address indexed podOwner, int256 newTotalShares) +func (_Manager *ManagerFilterer) WatchNewTotalShares(opts *bind.WatchOpts, sink chan<- *ManagerNewTotalShares, podOwner []common.Address) (event.Subscription, error) { + + var podOwnerRule []interface{} + for _, podOwnerItem := range podOwner { + podOwnerRule = append(podOwnerRule, podOwnerItem) + } + + logs, sub, err := _Manager.contract.WatchLogs(opts, "NewTotalShares", podOwnerRule) + 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(ManagerNewTotalShares) + if err := _Manager.contract.UnpackLog(event, "NewTotalShares", 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 +} + +// ParseNewTotalShares is a log parse operation binding the contract event 0xd4def76d6d2bed6f14d5cd9af73cc2913d618d00edde42432e81c09bfe077098. +// +// Solidity: event NewTotalShares(address indexed podOwner, int256 newTotalShares) +func (_Manager *ManagerFilterer) ParseNewTotalShares(log types.Log) (*ManagerNewTotalShares, error) { + event := new(ManagerNewTotalShares) + if err := _Manager.contract.UnpackLog(event, "NewTotalShares", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ManagerOwnershipTransferredIterator is returned from FilterOwnershipTransferred and is used to iterate over the raw logs and unpacked data for OwnershipTransferred events raised by the Manager contract. +type ManagerOwnershipTransferredIterator struct { + Event *ManagerOwnershipTransferred // 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 *ManagerOwnershipTransferredIterator) 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(ManagerOwnershipTransferred) + 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(ManagerOwnershipTransferred) + 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 *ManagerOwnershipTransferredIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ManagerOwnershipTransferredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ManagerOwnershipTransferred represents a OwnershipTransferred event raised by the Manager contract. +type ManagerOwnershipTransferred struct { + PreviousOwner common.Address + NewOwner common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterOwnershipTransferred is a free log retrieval operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. +// +// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +func (_Manager *ManagerFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, previousOwner []common.Address, newOwner []common.Address) (*ManagerOwnershipTransferredIterator, error) { + + var previousOwnerRule []interface{} + for _, previousOwnerItem := range previousOwner { + previousOwnerRule = append(previousOwnerRule, previousOwnerItem) + } + var newOwnerRule []interface{} + for _, newOwnerItem := range newOwner { + newOwnerRule = append(newOwnerRule, newOwnerItem) + } + + logs, sub, err := _Manager.contract.FilterLogs(opts, "OwnershipTransferred", previousOwnerRule, newOwnerRule) + if err != nil { + return nil, err + } + return &ManagerOwnershipTransferredIterator{contract: _Manager.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil +} + +// WatchOwnershipTransferred is a free log subscription operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. +// +// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +func (_Manager *ManagerFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *ManagerOwnershipTransferred, previousOwner []common.Address, newOwner []common.Address) (event.Subscription, error) { + + var previousOwnerRule []interface{} + for _, previousOwnerItem := range previousOwner { + previousOwnerRule = append(previousOwnerRule, previousOwnerItem) + } + var newOwnerRule []interface{} + for _, newOwnerItem := range newOwner { + newOwnerRule = append(newOwnerRule, newOwnerItem) + } + + logs, sub, err := _Manager.contract.WatchLogs(opts, "OwnershipTransferred", previousOwnerRule, newOwnerRule) + 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(ManagerOwnershipTransferred) + if err := _Manager.contract.UnpackLog(event, "OwnershipTransferred", 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 +} + +// ParseOwnershipTransferred is a log parse operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. +// +// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +func (_Manager *ManagerFilterer) ParseOwnershipTransferred(log types.Log) (*ManagerOwnershipTransferred, error) { + event := new(ManagerOwnershipTransferred) + if err := _Manager.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ManagerPausedIterator is returned from FilterPaused and is used to iterate over the raw logs and unpacked data for Paused events raised by the Manager contract. +type ManagerPausedIterator struct { + Event *ManagerPaused // 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 *ManagerPausedIterator) 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(ManagerPaused) + 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(ManagerPaused) + 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 *ManagerPausedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ManagerPausedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ManagerPaused represents a Paused event raised by the Manager contract. +type ManagerPaused struct { + Account common.Address + NewPausedStatus *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterPaused is a free log retrieval operation binding the contract event 0xab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d. +// +// Solidity: event Paused(address indexed account, uint256 newPausedStatus) +func (_Manager *ManagerFilterer) FilterPaused(opts *bind.FilterOpts, account []common.Address) (*ManagerPausedIterator, error) { + + var accountRule []interface{} + for _, accountItem := range account { + accountRule = append(accountRule, accountItem) + } + + logs, sub, err := _Manager.contract.FilterLogs(opts, "Paused", accountRule) + if err != nil { + return nil, err + } + return &ManagerPausedIterator{contract: _Manager.contract, event: "Paused", logs: logs, sub: sub}, nil +} + +// WatchPaused is a free log subscription operation binding the contract event 0xab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d. +// +// Solidity: event Paused(address indexed account, uint256 newPausedStatus) +func (_Manager *ManagerFilterer) WatchPaused(opts *bind.WatchOpts, sink chan<- *ManagerPaused, account []common.Address) (event.Subscription, error) { + + var accountRule []interface{} + for _, accountItem := range account { + accountRule = append(accountRule, accountItem) + } + + logs, sub, err := _Manager.contract.WatchLogs(opts, "Paused", accountRule) + 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(ManagerPaused) + if err := _Manager.contract.UnpackLog(event, "Paused", 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 +} + +// ParsePaused is a log parse operation binding the contract event 0xab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d. +// +// Solidity: event Paused(address indexed account, uint256 newPausedStatus) +func (_Manager *ManagerFilterer) ParsePaused(log types.Log) (*ManagerPaused, error) { + event := new(ManagerPaused) + if err := _Manager.contract.UnpackLog(event, "Paused", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ManagerPauserRegistrySetIterator is returned from FilterPauserRegistrySet and is used to iterate over the raw logs and unpacked data for PauserRegistrySet events raised by the Manager contract. +type ManagerPauserRegistrySetIterator struct { + Event *ManagerPauserRegistrySet // 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 *ManagerPauserRegistrySetIterator) 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(ManagerPauserRegistrySet) + 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(ManagerPauserRegistrySet) + 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 *ManagerPauserRegistrySetIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ManagerPauserRegistrySetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ManagerPauserRegistrySet represents a PauserRegistrySet event raised by the Manager contract. +type ManagerPauserRegistrySet struct { + PauserRegistry common.Address + NewPauserRegistry common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterPauserRegistrySet is a free log retrieval operation binding the contract event 0x6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6. +// +// Solidity: event PauserRegistrySet(address pauserRegistry, address newPauserRegistry) +func (_Manager *ManagerFilterer) FilterPauserRegistrySet(opts *bind.FilterOpts) (*ManagerPauserRegistrySetIterator, error) { + + logs, sub, err := _Manager.contract.FilterLogs(opts, "PauserRegistrySet") + if err != nil { + return nil, err + } + return &ManagerPauserRegistrySetIterator{contract: _Manager.contract, event: "PauserRegistrySet", logs: logs, sub: sub}, nil +} + +// WatchPauserRegistrySet is a free log subscription operation binding the contract event 0x6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6. +// +// Solidity: event PauserRegistrySet(address pauserRegistry, address newPauserRegistry) +func (_Manager *ManagerFilterer) WatchPauserRegistrySet(opts *bind.WatchOpts, sink chan<- *ManagerPauserRegistrySet) (event.Subscription, error) { + + logs, sub, err := _Manager.contract.WatchLogs(opts, "PauserRegistrySet") + 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(ManagerPauserRegistrySet) + if err := _Manager.contract.UnpackLog(event, "PauserRegistrySet", 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 +} + +// ParsePauserRegistrySet is a log parse operation binding the contract event 0x6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6. +// +// Solidity: event PauserRegistrySet(address pauserRegistry, address newPauserRegistry) +func (_Manager *ManagerFilterer) ParsePauserRegistrySet(log types.Log) (*ManagerPauserRegistrySet, error) { + event := new(ManagerPauserRegistrySet) + if err := _Manager.contract.UnpackLog(event, "PauserRegistrySet", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ManagerPodDeployedIterator is returned from FilterPodDeployed and is used to iterate over the raw logs and unpacked data for PodDeployed events raised by the Manager contract. +type ManagerPodDeployedIterator struct { + Event *ManagerPodDeployed // 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 *ManagerPodDeployedIterator) 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(ManagerPodDeployed) + 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(ManagerPodDeployed) + 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 *ManagerPodDeployedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ManagerPodDeployedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ManagerPodDeployed represents a PodDeployed event raised by the Manager contract. +type ManagerPodDeployed struct { + EigenPod common.Address + PodOwner common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterPodDeployed is a free log retrieval operation binding the contract event 0x21c99d0db02213c32fff5b05cf0a718ab5f858802b91498f80d82270289d856a. +// +// Solidity: event PodDeployed(address indexed eigenPod, address indexed podOwner) +func (_Manager *ManagerFilterer) FilterPodDeployed(opts *bind.FilterOpts, eigenPod []common.Address, podOwner []common.Address) (*ManagerPodDeployedIterator, error) { + + var eigenPodRule []interface{} + for _, eigenPodItem := range eigenPod { + eigenPodRule = append(eigenPodRule, eigenPodItem) + } + var podOwnerRule []interface{} + for _, podOwnerItem := range podOwner { + podOwnerRule = append(podOwnerRule, podOwnerItem) + } + + logs, sub, err := _Manager.contract.FilterLogs(opts, "PodDeployed", eigenPodRule, podOwnerRule) + if err != nil { + return nil, err + } + return &ManagerPodDeployedIterator{contract: _Manager.contract, event: "PodDeployed", logs: logs, sub: sub}, nil +} + +// WatchPodDeployed is a free log subscription operation binding the contract event 0x21c99d0db02213c32fff5b05cf0a718ab5f858802b91498f80d82270289d856a. +// +// Solidity: event PodDeployed(address indexed eigenPod, address indexed podOwner) +func (_Manager *ManagerFilterer) WatchPodDeployed(opts *bind.WatchOpts, sink chan<- *ManagerPodDeployed, eigenPod []common.Address, podOwner []common.Address) (event.Subscription, error) { + + var eigenPodRule []interface{} + for _, eigenPodItem := range eigenPod { + eigenPodRule = append(eigenPodRule, eigenPodItem) + } + var podOwnerRule []interface{} + for _, podOwnerItem := range podOwner { + podOwnerRule = append(podOwnerRule, podOwnerItem) + } + + logs, sub, err := _Manager.contract.WatchLogs(opts, "PodDeployed", eigenPodRule, podOwnerRule) + 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(ManagerPodDeployed) + if err := _Manager.contract.UnpackLog(event, "PodDeployed", 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 +} + +// ParsePodDeployed is a log parse operation binding the contract event 0x21c99d0db02213c32fff5b05cf0a718ab5f858802b91498f80d82270289d856a. +// +// Solidity: event PodDeployed(address indexed eigenPod, address indexed podOwner) +func (_Manager *ManagerFilterer) ParsePodDeployed(log types.Log) (*ManagerPodDeployed, error) { + event := new(ManagerPodDeployed) + if err := _Manager.contract.UnpackLog(event, "PodDeployed", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ManagerPodSharesUpdatedIterator is returned from FilterPodSharesUpdated and is used to iterate over the raw logs and unpacked data for PodSharesUpdated events raised by the Manager contract. +type ManagerPodSharesUpdatedIterator struct { + Event *ManagerPodSharesUpdated // 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 *ManagerPodSharesUpdatedIterator) 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(ManagerPodSharesUpdated) + 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(ManagerPodSharesUpdated) + 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 *ManagerPodSharesUpdatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ManagerPodSharesUpdatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ManagerPodSharesUpdated represents a PodSharesUpdated event raised by the Manager contract. +type ManagerPodSharesUpdated struct { + PodOwner common.Address + SharesDelta *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterPodSharesUpdated is a free log retrieval operation binding the contract event 0x4e2b791dedccd9fb30141b088cabf5c14a8912b52f59375c95c010700b8c6193. +// +// Solidity: event PodSharesUpdated(address indexed podOwner, int256 sharesDelta) +func (_Manager *ManagerFilterer) FilterPodSharesUpdated(opts *bind.FilterOpts, podOwner []common.Address) (*ManagerPodSharesUpdatedIterator, error) { + + var podOwnerRule []interface{} + for _, podOwnerItem := range podOwner { + podOwnerRule = append(podOwnerRule, podOwnerItem) + } + + logs, sub, err := _Manager.contract.FilterLogs(opts, "PodSharesUpdated", podOwnerRule) + if err != nil { + return nil, err + } + return &ManagerPodSharesUpdatedIterator{contract: _Manager.contract, event: "PodSharesUpdated", logs: logs, sub: sub}, nil +} + +// WatchPodSharesUpdated is a free log subscription operation binding the contract event 0x4e2b791dedccd9fb30141b088cabf5c14a8912b52f59375c95c010700b8c6193. +// +// Solidity: event PodSharesUpdated(address indexed podOwner, int256 sharesDelta) +func (_Manager *ManagerFilterer) WatchPodSharesUpdated(opts *bind.WatchOpts, sink chan<- *ManagerPodSharesUpdated, podOwner []common.Address) (event.Subscription, error) { + + var podOwnerRule []interface{} + for _, podOwnerItem := range podOwner { + podOwnerRule = append(podOwnerRule, podOwnerItem) + } + + logs, sub, err := _Manager.contract.WatchLogs(opts, "PodSharesUpdated", podOwnerRule) + 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(ManagerPodSharesUpdated) + if err := _Manager.contract.UnpackLog(event, "PodSharesUpdated", 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 +} + +// ParsePodSharesUpdated is a log parse operation binding the contract event 0x4e2b791dedccd9fb30141b088cabf5c14a8912b52f59375c95c010700b8c6193. +// +// Solidity: event PodSharesUpdated(address indexed podOwner, int256 sharesDelta) +func (_Manager *ManagerFilterer) ParsePodSharesUpdated(log types.Log) (*ManagerPodSharesUpdated, error) { + event := new(ManagerPodSharesUpdated) + if err := _Manager.contract.UnpackLog(event, "PodSharesUpdated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ManagerUnpausedIterator is returned from FilterUnpaused and is used to iterate over the raw logs and unpacked data for Unpaused events raised by the Manager contract. +type ManagerUnpausedIterator struct { + Event *ManagerUnpaused // 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 *ManagerUnpausedIterator) 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(ManagerUnpaused) + 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(ManagerUnpaused) + 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 *ManagerUnpausedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ManagerUnpausedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ManagerUnpaused represents a Unpaused event raised by the Manager contract. +type ManagerUnpaused struct { + Account common.Address + NewPausedStatus *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterUnpaused is a free log retrieval operation binding the contract event 0x3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c. +// +// Solidity: event Unpaused(address indexed account, uint256 newPausedStatus) +func (_Manager *ManagerFilterer) FilterUnpaused(opts *bind.FilterOpts, account []common.Address) (*ManagerUnpausedIterator, error) { + + var accountRule []interface{} + for _, accountItem := range account { + accountRule = append(accountRule, accountItem) + } + + logs, sub, err := _Manager.contract.FilterLogs(opts, "Unpaused", accountRule) + if err != nil { + return nil, err + } + return &ManagerUnpausedIterator{contract: _Manager.contract, event: "Unpaused", logs: logs, sub: sub}, nil +} + +// WatchUnpaused is a free log subscription operation binding the contract event 0x3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c. +// +// Solidity: event Unpaused(address indexed account, uint256 newPausedStatus) +func (_Manager *ManagerFilterer) WatchUnpaused(opts *bind.WatchOpts, sink chan<- *ManagerUnpaused, account []common.Address) (event.Subscription, error) { + + var accountRule []interface{} + for _, accountItem := range account { + accountRule = append(accountRule, accountItem) + } + + logs, sub, err := _Manager.contract.WatchLogs(opts, "Unpaused", accountRule) + 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(ManagerUnpaused) + if err := _Manager.contract.UnpackLog(event, "Unpaused", 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 +} + +// ParseUnpaused is a log parse operation binding the contract event 0x3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c. +// +// Solidity: event Unpaused(address indexed account, uint256 newPausedStatus) +func (_Manager *ManagerFilterer) ParseUnpaused(log types.Log) (*ManagerUnpaused, error) { + event := new(ManagerUnpaused) + if err := _Manager.contract.UnpackLog(event, "Unpaused", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/eigenLayer/pod/eigenpod.abi b/eigenLayer/pod/eigenpod.abi new file mode 100644 index 0000000..90a5831 --- /dev/null +++ b/eigenLayer/pod/eigenpod.abi @@ -0,0 +1 @@ +[{"inputs":[{"internalType":"contract IETHPOSDeposit","name":"_ethPOS","type":"address"},{"internalType":"contract IEigenPodManager","name":"_eigenPodManager","type":"address"},{"internalType":"uint64","name":"_GENESIS_TIME","type":"uint64"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint64","name":"checkpointTimestamp","type":"uint64"},{"indexed":true,"internalType":"bytes32","name":"beaconBlockRoot","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"validatorCount","type":"uint256"}],"name":"CheckpointCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint64","name":"checkpointTimestamp","type":"uint64"},{"indexed":false,"internalType":"int256","name":"totalShareDeltaWei","type":"int256"}],"name":"CheckpointFinalized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes","name":"pubkey","type":"bytes"}],"name":"EigenPodStaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amountReceived","type":"uint256"}],"name":"NonBeaconChainETHReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"prevProofSubmitter","type":"address"},{"indexed":false,"internalType":"address","name":"newProofSubmitter","type":"address"}],"name":"ProofSubmitterUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RestakedBeaconChainETHWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint40","name":"validatorIndex","type":"uint40"},{"indexed":false,"internalType":"uint64","name":"balanceTimestamp","type":"uint64"},{"indexed":false,"internalType":"uint64","name":"newValidatorBalanceGwei","type":"uint64"}],"name":"ValidatorBalanceUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint64","name":"checkpointTimestamp","type":"uint64"},{"indexed":true,"internalType":"uint40","name":"validatorIndex","type":"uint40"}],"name":"ValidatorCheckpointed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint40","name":"validatorIndex","type":"uint40"}],"name":"ValidatorRestaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint64","name":"checkpointTimestamp","type":"uint64"},{"indexed":true,"internalType":"uint40","name":"validatorIndex","type":"uint40"}],"name":"ValidatorWithdrawn","type":"event"},{"inputs":[],"name":"GENESIS_TIME","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"activeValidatorCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"","type":"uint64"}],"name":"checkpointBalanceExitedGwei","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentCheckpoint","outputs":[{"components":[{"internalType":"bytes32","name":"beaconBlockRoot","type":"bytes32"},{"internalType":"uint24","name":"proofsRemaining","type":"uint24"},{"internalType":"uint64","name":"podBalanceGwei","type":"uint64"},{"internalType":"int128","name":"balanceDeltasGwei","type":"int128"}],"internalType":"struct IEigenPod.Checkpoint","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentCheckpointTimestamp","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"eigenPodManager","outputs":[{"internalType":"contract IEigenPodManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ethPOS","outputs":[{"internalType":"contract IETHPOSDeposit","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"timestamp","type":"uint64"}],"name":"getParentBlockRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_podOwner","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lastCheckpointTimestamp","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"podOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proofSubmitter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20[]","name":"tokenList","type":"address[]"},{"internalType":"uint256[]","name":"amountsToWithdraw","type":"uint256[]"},{"internalType":"address","name":"recipient","type":"address"}],"name":"recoverTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newProofSubmitter","type":"address"}],"name":"setProofSubmitter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"pubkey","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"bytes32","name":"depositDataRoot","type":"bytes32"}],"name":"stake","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bool","name":"revertIfNoBalance","type":"bool"}],"name":"startCheckpoint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"validatorPubkeyHash","type":"bytes32"}],"name":"validatorPubkeyHashToInfo","outputs":[{"components":[{"internalType":"uint64","name":"validatorIndex","type":"uint64"},{"internalType":"uint64","name":"restakedBalanceGwei","type":"uint64"},{"internalType":"uint64","name":"lastCheckpointedAt","type":"uint64"},{"internalType":"enum IEigenPod.VALIDATOR_STATUS","name":"status","type":"uint8"}],"internalType":"struct IEigenPod.ValidatorInfo","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"validatorPubkey","type":"bytes"}],"name":"validatorPubkeyToInfo","outputs":[{"components":[{"internalType":"uint64","name":"validatorIndex","type":"uint64"},{"internalType":"uint64","name":"restakedBalanceGwei","type":"uint64"},{"internalType":"uint64","name":"lastCheckpointedAt","type":"uint64"},{"internalType":"enum IEigenPod.VALIDATOR_STATUS","name":"status","type":"uint8"}],"internalType":"struct IEigenPod.ValidatorInfo","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"validatorPubkey","type":"bytes"}],"name":"validatorStatus","outputs":[{"internalType":"enum IEigenPod.VALIDATOR_STATUS","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"pubkeyHash","type":"bytes32"}],"name":"validatorStatus","outputs":[{"internalType":"enum IEigenPod.VALIDATOR_STATUS","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"bytes32","name":"balanceContainerRoot","type":"bytes32"},{"internalType":"bytes","name":"proof","type":"bytes"}],"internalType":"struct BeaconChainProofs.BalanceContainerProof","name":"balanceContainerProof","type":"tuple"},{"components":[{"internalType":"bytes32","name":"pubkeyHash","type":"bytes32"},{"internalType":"bytes32","name":"balanceRoot","type":"bytes32"},{"internalType":"bytes","name":"proof","type":"bytes"}],"internalType":"struct BeaconChainProofs.BalanceProof[]","name":"proofs","type":"tuple[]"}],"name":"verifyCheckpointProofs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"beaconTimestamp","type":"uint64"},{"components":[{"internalType":"bytes32","name":"beaconStateRoot","type":"bytes32"},{"internalType":"bytes","name":"proof","type":"bytes"}],"internalType":"struct BeaconChainProofs.StateRootProof","name":"stateRootProof","type":"tuple"},{"components":[{"internalType":"bytes32[]","name":"validatorFields","type":"bytes32[]"},{"internalType":"bytes","name":"proof","type":"bytes"}],"internalType":"struct BeaconChainProofs.ValidatorProof","name":"proof","type":"tuple"}],"name":"verifyStaleBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"beaconTimestamp","type":"uint64"},{"components":[{"internalType":"bytes32","name":"beaconStateRoot","type":"bytes32"},{"internalType":"bytes","name":"proof","type":"bytes"}],"internalType":"struct BeaconChainProofs.StateRootProof","name":"stateRootProof","type":"tuple"},{"internalType":"uint40[]","name":"validatorIndices","type":"uint40[]"},{"internalType":"bytes[]","name":"validatorFieldsProofs","type":"bytes[]"},{"internalType":"bytes32[][]","name":"validatorFields","type":"bytes32[][]"}],"name":"verifyWithdrawalCredentials","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amountWei","type":"uint256"}],"name":"withdrawRestakedBeaconChainETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawableRestakedExecutionLayerGwei","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}] \ No newline at end of file diff --git a/eigenLayer/pod/eigenpod.go b/eigenLayer/pod/eigenpod.go new file mode 100644 index 0000000..c281ecb --- /dev/null +++ b/eigenLayer/pod/eigenpod.go @@ -0,0 +1,2485 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package pod + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// BeaconChainProofsBalanceContainerProof is an auto generated low-level Go binding around an user-defined struct. +type BeaconChainProofsBalanceContainerProof struct { + BalanceContainerRoot [32]byte + Proof []byte +} + +// BeaconChainProofsBalanceProof is an auto generated low-level Go binding around an user-defined struct. +type BeaconChainProofsBalanceProof struct { + PubkeyHash [32]byte + BalanceRoot [32]byte + Proof []byte +} + +// BeaconChainProofsStateRootProof is an auto generated low-level Go binding around an user-defined struct. +type BeaconChainProofsStateRootProof struct { + BeaconStateRoot [32]byte + Proof []byte +} + +// BeaconChainProofsValidatorProof is an auto generated low-level Go binding around an user-defined struct. +type BeaconChainProofsValidatorProof struct { + ValidatorFields [][32]byte + Proof []byte +} + +// IEigenPodCheckpoint is an auto generated low-level Go binding around an user-defined struct. +type IEigenPodCheckpoint struct { + BeaconBlockRoot [32]byte + ProofsRemaining *big.Int + PodBalanceGwei uint64 + BalanceDeltasGwei *big.Int +} + +// IEigenPodValidatorInfo is an auto generated low-level Go binding around an user-defined struct. +type IEigenPodValidatorInfo struct { + ValidatorIndex uint64 + RestakedBalanceGwei uint64 + LastCheckpointedAt uint64 + Status uint8 +} + +// PodMetaData contains all meta data concerning the Pod contract. +var PodMetaData = &bind.MetaData{ + ABI: "[{\"inputs\":[{\"internalType\":\"contractIETHPOSDeposit\",\"name\":\"_ethPOS\",\"type\":\"address\"},{\"internalType\":\"contractIEigenPodManager\",\"name\":\"_eigenPodManager\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"_GENESIS_TIME\",\"type\":\"uint64\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"checkpointTimestamp\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"validatorCount\",\"type\":\"uint256\"}],\"name\":\"CheckpointCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"checkpointTimestamp\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"int256\",\"name\":\"totalShareDeltaWei\",\"type\":\"int256\"}],\"name\":\"CheckpointFinalized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"pubkey\",\"type\":\"bytes\"}],\"name\":\"EigenPodStaked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amountReceived\",\"type\":\"uint256\"}],\"name\":\"NonBeaconChainETHReceived\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"prevProofSubmitter\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newProofSubmitter\",\"type\":\"address\"}],\"name\":\"ProofSubmitterUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"RestakedBeaconChainETHWithdrawn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint40\",\"name\":\"validatorIndex\",\"type\":\"uint40\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"balanceTimestamp\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"newValidatorBalanceGwei\",\"type\":\"uint64\"}],\"name\":\"ValidatorBalanceUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"checkpointTimestamp\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"uint40\",\"name\":\"validatorIndex\",\"type\":\"uint40\"}],\"name\":\"ValidatorCheckpointed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint40\",\"name\":\"validatorIndex\",\"type\":\"uint40\"}],\"name\":\"ValidatorRestaked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"checkpointTimestamp\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"uint40\",\"name\":\"validatorIndex\",\"type\":\"uint40\"}],\"name\":\"ValidatorWithdrawn\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"GENESIS_TIME\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"activeValidatorCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"checkpointBalanceExitedGwei\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"currentCheckpoint\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint24\",\"name\":\"proofsRemaining\",\"type\":\"uint24\"},{\"internalType\":\"uint64\",\"name\":\"podBalanceGwei\",\"type\":\"uint64\"},{\"internalType\":\"int128\",\"name\":\"balanceDeltasGwei\",\"type\":\"int128\"}],\"internalType\":\"structIEigenPod.Checkpoint\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"currentCheckpointTimestamp\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"eigenPodManager\",\"outputs\":[{\"internalType\":\"contractIEigenPodManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ethPOS\",\"outputs\":[{\"internalType\":\"contractIETHPOSDeposit\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"timestamp\",\"type\":\"uint64\"}],\"name\":\"getParentBlockRoot\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_podOwner\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastCheckpointTimestamp\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"podOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proofSubmitter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contractIERC20[]\",\"name\":\"tokenList\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amountsToWithdraw\",\"type\":\"uint256[]\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"}],\"name\":\"recoverTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newProofSubmitter\",\"type\":\"address\"}],\"name\":\"setProofSubmitter\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"pubkey\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"depositDataRoot\",\"type\":\"bytes32\"}],\"name\":\"stake\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"revertIfNoBalance\",\"type\":\"bool\"}],\"name\":\"startCheckpoint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\"}],\"name\":\"validatorPubkeyHashToInfo\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"validatorIndex\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"restakedBalanceGwei\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"lastCheckpointedAt\",\"type\":\"uint64\"},{\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\",\"name\":\"status\",\"type\":\"uint8\"}],\"internalType\":\"structIEigenPod.ValidatorInfo\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"validatorPubkey\",\"type\":\"bytes\"}],\"name\":\"validatorPubkeyToInfo\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"validatorIndex\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"restakedBalanceGwei\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"lastCheckpointedAt\",\"type\":\"uint64\"},{\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\",\"name\":\"status\",\"type\":\"uint8\"}],\"internalType\":\"structIEigenPod.ValidatorInfo\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"validatorPubkey\",\"type\":\"bytes\"}],\"name\":\"validatorStatus\",\"outputs\":[{\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"pubkeyHash\",\"type\":\"bytes32\"}],\"name\":\"validatorStatus\",\"outputs\":[{\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"balanceContainerRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"}],\"internalType\":\"structBeaconChainProofs.BalanceContainerProof\",\"name\":\"balanceContainerProof\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"pubkeyHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"balanceRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"}],\"internalType\":\"structBeaconChainProofs.BalanceProof[]\",\"name\":\"proofs\",\"type\":\"tuple[]\"}],\"name\":\"verifyCheckpointProofs\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"beaconTimestamp\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"beaconStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"}],\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"name\":\"stateRootProof\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bytes32[]\",\"name\":\"validatorFields\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"}],\"internalType\":\"structBeaconChainProofs.ValidatorProof\",\"name\":\"proof\",\"type\":\"tuple\"}],\"name\":\"verifyStaleBalance\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"beaconTimestamp\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"beaconStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"}],\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"name\":\"stateRootProof\",\"type\":\"tuple\"},{\"internalType\":\"uint40[]\",\"name\":\"validatorIndices\",\"type\":\"uint40[]\"},{\"internalType\":\"bytes[]\",\"name\":\"validatorFieldsProofs\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32[][]\",\"name\":\"validatorFields\",\"type\":\"bytes32[][]\"}],\"name\":\"verifyWithdrawalCredentials\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amountWei\",\"type\":\"uint256\"}],\"name\":\"withdrawRestakedBeaconChainETH\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"withdrawableRestakedExecutionLayerGwei\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", +} + +// PodABI is the input ABI used to generate the binding from. +// Deprecated: Use PodMetaData.ABI instead. +var PodABI = PodMetaData.ABI + +// Pod is an auto generated Go binding around an Ethereum contract. +type Pod struct { + PodCaller // Read-only binding to the contract + PodTransactor // Write-only binding to the contract + PodFilterer // Log filterer for contract events +} + +// PodCaller is an auto generated read-only Go binding around an Ethereum contract. +type PodCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// PodTransactor is an auto generated write-only Go binding around an Ethereum contract. +type PodTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// PodFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type PodFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// PodSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type PodSession struct { + Contract *Pod // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// PodCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type PodCallerSession struct { + Contract *PodCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// PodTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type PodTransactorSession struct { + Contract *PodTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// PodRaw is an auto generated low-level Go binding around an Ethereum contract. +type PodRaw struct { + Contract *Pod // Generic contract binding to access the raw methods on +} + +// PodCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type PodCallerRaw struct { + Contract *PodCaller // Generic read-only contract binding to access the raw methods on +} + +// PodTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type PodTransactorRaw struct { + Contract *PodTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewPod creates a new instance of Pod, bound to a specific deployed contract. +func NewPod(address common.Address, backend bind.ContractBackend) (*Pod, error) { + contract, err := bindPod(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &Pod{PodCaller: PodCaller{contract: contract}, PodTransactor: PodTransactor{contract: contract}, PodFilterer: PodFilterer{contract: contract}}, nil +} + +// NewPodCaller creates a new read-only instance of Pod, bound to a specific deployed contract. +func NewPodCaller(address common.Address, caller bind.ContractCaller) (*PodCaller, error) { + contract, err := bindPod(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &PodCaller{contract: contract}, nil +} + +// NewPodTransactor creates a new write-only instance of Pod, bound to a specific deployed contract. +func NewPodTransactor(address common.Address, transactor bind.ContractTransactor) (*PodTransactor, error) { + contract, err := bindPod(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &PodTransactor{contract: contract}, nil +} + +// NewPodFilterer creates a new log filterer instance of Pod, bound to a specific deployed contract. +func NewPodFilterer(address common.Address, filterer bind.ContractFilterer) (*PodFilterer, error) { + contract, err := bindPod(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &PodFilterer{contract: contract}, nil +} + +// bindPod binds a generic wrapper to an already deployed contract. +func bindPod(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := PodMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_Pod *PodRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _Pod.Contract.PodCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_Pod *PodRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Pod.Contract.PodTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_Pod *PodRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _Pod.Contract.PodTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_Pod *PodCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _Pod.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_Pod *PodTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Pod.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_Pod *PodTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _Pod.Contract.contract.Transact(opts, method, params...) +} + +// GENESISTIME is a free data retrieval call binding the contract method 0xf2882461. +// +// Solidity: function GENESIS_TIME() view returns(uint64) +func (_Pod *PodCaller) GENESISTIME(opts *bind.CallOpts) (uint64, error) { + var out []interface{} + err := _Pod.contract.Call(opts, &out, "GENESIS_TIME") + + if err != nil { + return *new(uint64), err + } + + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) + + return out0, err + +} + +// GENESISTIME is a free data retrieval call binding the contract method 0xf2882461. +// +// Solidity: function GENESIS_TIME() view returns(uint64) +func (_Pod *PodSession) GENESISTIME() (uint64, error) { + return _Pod.Contract.GENESISTIME(&_Pod.CallOpts) +} + +// GENESISTIME is a free data retrieval call binding the contract method 0xf2882461. +// +// Solidity: function GENESIS_TIME() view returns(uint64) +func (_Pod *PodCallerSession) GENESISTIME() (uint64, error) { + return _Pod.Contract.GENESISTIME(&_Pod.CallOpts) +} + +// ActiveValidatorCount is a free data retrieval call binding the contract method 0x2340e8d3. +// +// Solidity: function activeValidatorCount() view returns(uint256) +func (_Pod *PodCaller) ActiveValidatorCount(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _Pod.contract.Call(opts, &out, "activeValidatorCount") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// ActiveValidatorCount is a free data retrieval call binding the contract method 0x2340e8d3. +// +// Solidity: function activeValidatorCount() view returns(uint256) +func (_Pod *PodSession) ActiveValidatorCount() (*big.Int, error) { + return _Pod.Contract.ActiveValidatorCount(&_Pod.CallOpts) +} + +// ActiveValidatorCount is a free data retrieval call binding the contract method 0x2340e8d3. +// +// Solidity: function activeValidatorCount() view returns(uint256) +func (_Pod *PodCallerSession) ActiveValidatorCount() (*big.Int, error) { + return _Pod.Contract.ActiveValidatorCount(&_Pod.CallOpts) +} + +// CheckpointBalanceExitedGwei is a free data retrieval call binding the contract method 0x52396a59. +// +// Solidity: function checkpointBalanceExitedGwei(uint64 ) view returns(uint64) +func (_Pod *PodCaller) CheckpointBalanceExitedGwei(opts *bind.CallOpts, arg0 uint64) (uint64, error) { + var out []interface{} + err := _Pod.contract.Call(opts, &out, "checkpointBalanceExitedGwei", arg0) + + if err != nil { + return *new(uint64), err + } + + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) + + return out0, err + +} + +// CheckpointBalanceExitedGwei is a free data retrieval call binding the contract method 0x52396a59. +// +// Solidity: function checkpointBalanceExitedGwei(uint64 ) view returns(uint64) +func (_Pod *PodSession) CheckpointBalanceExitedGwei(arg0 uint64) (uint64, error) { + return _Pod.Contract.CheckpointBalanceExitedGwei(&_Pod.CallOpts, arg0) +} + +// CheckpointBalanceExitedGwei is a free data retrieval call binding the contract method 0x52396a59. +// +// Solidity: function checkpointBalanceExitedGwei(uint64 ) view returns(uint64) +func (_Pod *PodCallerSession) CheckpointBalanceExitedGwei(arg0 uint64) (uint64, error) { + return _Pod.Contract.CheckpointBalanceExitedGwei(&_Pod.CallOpts, arg0) +} + +// CurrentCheckpoint is a free data retrieval call binding the contract method 0x47d28372. +// +// Solidity: function currentCheckpoint() view returns((bytes32,uint24,uint64,int128)) +func (_Pod *PodCaller) CurrentCheckpoint(opts *bind.CallOpts) (IEigenPodCheckpoint, error) { + var out []interface{} + err := _Pod.contract.Call(opts, &out, "currentCheckpoint") + + if err != nil { + return *new(IEigenPodCheckpoint), err + } + + out0 := *abi.ConvertType(out[0], new(IEigenPodCheckpoint)).(*IEigenPodCheckpoint) + + return out0, err + +} + +// CurrentCheckpoint is a free data retrieval call binding the contract method 0x47d28372. +// +// Solidity: function currentCheckpoint() view returns((bytes32,uint24,uint64,int128)) +func (_Pod *PodSession) CurrentCheckpoint() (IEigenPodCheckpoint, error) { + return _Pod.Contract.CurrentCheckpoint(&_Pod.CallOpts) +} + +// CurrentCheckpoint is a free data retrieval call binding the contract method 0x47d28372. +// +// Solidity: function currentCheckpoint() view returns((bytes32,uint24,uint64,int128)) +func (_Pod *PodCallerSession) CurrentCheckpoint() (IEigenPodCheckpoint, error) { + return _Pod.Contract.CurrentCheckpoint(&_Pod.CallOpts) +} + +// CurrentCheckpointTimestamp is a free data retrieval call binding the contract method 0x42ecff2a. +// +// Solidity: function currentCheckpointTimestamp() view returns(uint64) +func (_Pod *PodCaller) CurrentCheckpointTimestamp(opts *bind.CallOpts) (uint64, error) { + var out []interface{} + err := _Pod.contract.Call(opts, &out, "currentCheckpointTimestamp") + + if err != nil { + return *new(uint64), err + } + + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) + + return out0, err + +} + +// CurrentCheckpointTimestamp is a free data retrieval call binding the contract method 0x42ecff2a. +// +// Solidity: function currentCheckpointTimestamp() view returns(uint64) +func (_Pod *PodSession) CurrentCheckpointTimestamp() (uint64, error) { + return _Pod.Contract.CurrentCheckpointTimestamp(&_Pod.CallOpts) +} + +// CurrentCheckpointTimestamp is a free data retrieval call binding the contract method 0x42ecff2a. +// +// Solidity: function currentCheckpointTimestamp() view returns(uint64) +func (_Pod *PodCallerSession) CurrentCheckpointTimestamp() (uint64, error) { + return _Pod.Contract.CurrentCheckpointTimestamp(&_Pod.CallOpts) +} + +// EigenPodManager is a free data retrieval call binding the contract method 0x4665bcda. +// +// Solidity: function eigenPodManager() view returns(address) +func (_Pod *PodCaller) EigenPodManager(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _Pod.contract.Call(opts, &out, "eigenPodManager") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// EigenPodManager is a free data retrieval call binding the contract method 0x4665bcda. +// +// Solidity: function eigenPodManager() view returns(address) +func (_Pod *PodSession) EigenPodManager() (common.Address, error) { + return _Pod.Contract.EigenPodManager(&_Pod.CallOpts) +} + +// EigenPodManager is a free data retrieval call binding the contract method 0x4665bcda. +// +// Solidity: function eigenPodManager() view returns(address) +func (_Pod *PodCallerSession) EigenPodManager() (common.Address, error) { + return _Pod.Contract.EigenPodManager(&_Pod.CallOpts) +} + +// EthPOS is a free data retrieval call binding the contract method 0x74cdd798. +// +// Solidity: function ethPOS() view returns(address) +func (_Pod *PodCaller) EthPOS(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _Pod.contract.Call(opts, &out, "ethPOS") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// EthPOS is a free data retrieval call binding the contract method 0x74cdd798. +// +// Solidity: function ethPOS() view returns(address) +func (_Pod *PodSession) EthPOS() (common.Address, error) { + return _Pod.Contract.EthPOS(&_Pod.CallOpts) +} + +// EthPOS is a free data retrieval call binding the contract method 0x74cdd798. +// +// Solidity: function ethPOS() view returns(address) +func (_Pod *PodCallerSession) EthPOS() (common.Address, error) { + return _Pod.Contract.EthPOS(&_Pod.CallOpts) +} + +// GetParentBlockRoot is a free data retrieval call binding the contract method 0x6c0d2d5a. +// +// Solidity: function getParentBlockRoot(uint64 timestamp) view returns(bytes32) +func (_Pod *PodCaller) GetParentBlockRoot(opts *bind.CallOpts, timestamp uint64) ([32]byte, error) { + var out []interface{} + err := _Pod.contract.Call(opts, &out, "getParentBlockRoot", timestamp) + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// GetParentBlockRoot is a free data retrieval call binding the contract method 0x6c0d2d5a. +// +// Solidity: function getParentBlockRoot(uint64 timestamp) view returns(bytes32) +func (_Pod *PodSession) GetParentBlockRoot(timestamp uint64) ([32]byte, error) { + return _Pod.Contract.GetParentBlockRoot(&_Pod.CallOpts, timestamp) +} + +// GetParentBlockRoot is a free data retrieval call binding the contract method 0x6c0d2d5a. +// +// Solidity: function getParentBlockRoot(uint64 timestamp) view returns(bytes32) +func (_Pod *PodCallerSession) GetParentBlockRoot(timestamp uint64) ([32]byte, error) { + return _Pod.Contract.GetParentBlockRoot(&_Pod.CallOpts, timestamp) +} + +// LastCheckpointTimestamp is a free data retrieval call binding the contract method 0xee94d67c. +// +// Solidity: function lastCheckpointTimestamp() view returns(uint64) +func (_Pod *PodCaller) LastCheckpointTimestamp(opts *bind.CallOpts) (uint64, error) { + var out []interface{} + err := _Pod.contract.Call(opts, &out, "lastCheckpointTimestamp") + + if err != nil { + return *new(uint64), err + } + + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) + + return out0, err + +} + +// LastCheckpointTimestamp is a free data retrieval call binding the contract method 0xee94d67c. +// +// Solidity: function lastCheckpointTimestamp() view returns(uint64) +func (_Pod *PodSession) LastCheckpointTimestamp() (uint64, error) { + return _Pod.Contract.LastCheckpointTimestamp(&_Pod.CallOpts) +} + +// LastCheckpointTimestamp is a free data retrieval call binding the contract method 0xee94d67c. +// +// Solidity: function lastCheckpointTimestamp() view returns(uint64) +func (_Pod *PodCallerSession) LastCheckpointTimestamp() (uint64, error) { + return _Pod.Contract.LastCheckpointTimestamp(&_Pod.CallOpts) +} + +// PodOwner is a free data retrieval call binding the contract method 0x0b18ff66. +// +// Solidity: function podOwner() view returns(address) +func (_Pod *PodCaller) PodOwner(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _Pod.contract.Call(opts, &out, "podOwner") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// PodOwner is a free data retrieval call binding the contract method 0x0b18ff66. +// +// Solidity: function podOwner() view returns(address) +func (_Pod *PodSession) PodOwner() (common.Address, error) { + return _Pod.Contract.PodOwner(&_Pod.CallOpts) +} + +// PodOwner is a free data retrieval call binding the contract method 0x0b18ff66. +// +// Solidity: function podOwner() view returns(address) +func (_Pod *PodCallerSession) PodOwner() (common.Address, error) { + return _Pod.Contract.PodOwner(&_Pod.CallOpts) +} + +// ProofSubmitter is a free data retrieval call binding the contract method 0x58753357. +// +// Solidity: function proofSubmitter() view returns(address) +func (_Pod *PodCaller) ProofSubmitter(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _Pod.contract.Call(opts, &out, "proofSubmitter") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// ProofSubmitter is a free data retrieval call binding the contract method 0x58753357. +// +// Solidity: function proofSubmitter() view returns(address) +func (_Pod *PodSession) ProofSubmitter() (common.Address, error) { + return _Pod.Contract.ProofSubmitter(&_Pod.CallOpts) +} + +// ProofSubmitter is a free data retrieval call binding the contract method 0x58753357. +// +// Solidity: function proofSubmitter() view returns(address) +func (_Pod *PodCallerSession) ProofSubmitter() (common.Address, error) { + return _Pod.Contract.ProofSubmitter(&_Pod.CallOpts) +} + +// ValidatorPubkeyHashToInfo is a free data retrieval call binding the contract method 0x6fcd0e53. +// +// Solidity: function validatorPubkeyHashToInfo(bytes32 validatorPubkeyHash) view returns((uint64,uint64,uint64,uint8)) +func (_Pod *PodCaller) ValidatorPubkeyHashToInfo(opts *bind.CallOpts, validatorPubkeyHash [32]byte) (IEigenPodValidatorInfo, error) { + var out []interface{} + err := _Pod.contract.Call(opts, &out, "validatorPubkeyHashToInfo", validatorPubkeyHash) + + if err != nil { + return *new(IEigenPodValidatorInfo), err + } + + out0 := *abi.ConvertType(out[0], new(IEigenPodValidatorInfo)).(*IEigenPodValidatorInfo) + + return out0, err + +} + +// ValidatorPubkeyHashToInfo is a free data retrieval call binding the contract method 0x6fcd0e53. +// +// Solidity: function validatorPubkeyHashToInfo(bytes32 validatorPubkeyHash) view returns((uint64,uint64,uint64,uint8)) +func (_Pod *PodSession) ValidatorPubkeyHashToInfo(validatorPubkeyHash [32]byte) (IEigenPodValidatorInfo, error) { + return _Pod.Contract.ValidatorPubkeyHashToInfo(&_Pod.CallOpts, validatorPubkeyHash) +} + +// ValidatorPubkeyHashToInfo is a free data retrieval call binding the contract method 0x6fcd0e53. +// +// Solidity: function validatorPubkeyHashToInfo(bytes32 validatorPubkeyHash) view returns((uint64,uint64,uint64,uint8)) +func (_Pod *PodCallerSession) ValidatorPubkeyHashToInfo(validatorPubkeyHash [32]byte) (IEigenPodValidatorInfo, error) { + return _Pod.Contract.ValidatorPubkeyHashToInfo(&_Pod.CallOpts, validatorPubkeyHash) +} + +// ValidatorPubkeyToInfo is a free data retrieval call binding the contract method 0xb522538a. +// +// Solidity: function validatorPubkeyToInfo(bytes validatorPubkey) view returns((uint64,uint64,uint64,uint8)) +func (_Pod *PodCaller) ValidatorPubkeyToInfo(opts *bind.CallOpts, validatorPubkey []byte) (IEigenPodValidatorInfo, error) { + var out []interface{} + err := _Pod.contract.Call(opts, &out, "validatorPubkeyToInfo", validatorPubkey) + + if err != nil { + return *new(IEigenPodValidatorInfo), err + } + + out0 := *abi.ConvertType(out[0], new(IEigenPodValidatorInfo)).(*IEigenPodValidatorInfo) + + return out0, err + +} + +// ValidatorPubkeyToInfo is a free data retrieval call binding the contract method 0xb522538a. +// +// Solidity: function validatorPubkeyToInfo(bytes validatorPubkey) view returns((uint64,uint64,uint64,uint8)) +func (_Pod *PodSession) ValidatorPubkeyToInfo(validatorPubkey []byte) (IEigenPodValidatorInfo, error) { + return _Pod.Contract.ValidatorPubkeyToInfo(&_Pod.CallOpts, validatorPubkey) +} + +// ValidatorPubkeyToInfo is a free data retrieval call binding the contract method 0xb522538a. +// +// Solidity: function validatorPubkeyToInfo(bytes validatorPubkey) view returns((uint64,uint64,uint64,uint8)) +func (_Pod *PodCallerSession) ValidatorPubkeyToInfo(validatorPubkey []byte) (IEigenPodValidatorInfo, error) { + return _Pod.Contract.ValidatorPubkeyToInfo(&_Pod.CallOpts, validatorPubkey) +} + +// ValidatorStatus is a free data retrieval call binding the contract method 0x58eaee79. +// +// Solidity: function validatorStatus(bytes validatorPubkey) view returns(uint8) +func (_Pod *PodCaller) ValidatorStatus(opts *bind.CallOpts, validatorPubkey []byte) (uint8, error) { + var out []interface{} + err := _Pod.contract.Call(opts, &out, "validatorStatus", validatorPubkey) + + if err != nil { + return *new(uint8), err + } + + out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) + + return out0, err + +} + +// ValidatorStatus is a free data retrieval call binding the contract method 0x58eaee79. +// +// Solidity: function validatorStatus(bytes validatorPubkey) view returns(uint8) +func (_Pod *PodSession) ValidatorStatus(validatorPubkey []byte) (uint8, error) { + return _Pod.Contract.ValidatorStatus(&_Pod.CallOpts, validatorPubkey) +} + +// ValidatorStatus is a free data retrieval call binding the contract method 0x58eaee79. +// +// Solidity: function validatorStatus(bytes validatorPubkey) view returns(uint8) +func (_Pod *PodCallerSession) ValidatorStatus(validatorPubkey []byte) (uint8, error) { + return _Pod.Contract.ValidatorStatus(&_Pod.CallOpts, validatorPubkey) +} + +// ValidatorStatus0 is a free data retrieval call binding the contract method 0x7439841f. +// +// Solidity: function validatorStatus(bytes32 pubkeyHash) view returns(uint8) +func (_Pod *PodCaller) ValidatorStatus0(opts *bind.CallOpts, pubkeyHash [32]byte) (uint8, error) { + var out []interface{} + err := _Pod.contract.Call(opts, &out, "validatorStatus0", pubkeyHash) + + if err != nil { + return *new(uint8), err + } + + out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) + + return out0, err + +} + +// ValidatorStatus0 is a free data retrieval call binding the contract method 0x7439841f. +// +// Solidity: function validatorStatus(bytes32 pubkeyHash) view returns(uint8) +func (_Pod *PodSession) ValidatorStatus0(pubkeyHash [32]byte) (uint8, error) { + return _Pod.Contract.ValidatorStatus0(&_Pod.CallOpts, pubkeyHash) +} + +// ValidatorStatus0 is a free data retrieval call binding the contract method 0x7439841f. +// +// Solidity: function validatorStatus(bytes32 pubkeyHash) view returns(uint8) +func (_Pod *PodCallerSession) ValidatorStatus0(pubkeyHash [32]byte) (uint8, error) { + return _Pod.Contract.ValidatorStatus0(&_Pod.CallOpts, pubkeyHash) +} + +// WithdrawableRestakedExecutionLayerGwei is a free data retrieval call binding the contract method 0x3474aa16. +// +// Solidity: function withdrawableRestakedExecutionLayerGwei() view returns(uint64) +func (_Pod *PodCaller) WithdrawableRestakedExecutionLayerGwei(opts *bind.CallOpts) (uint64, error) { + var out []interface{} + err := _Pod.contract.Call(opts, &out, "withdrawableRestakedExecutionLayerGwei") + + if err != nil { + return *new(uint64), err + } + + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) + + return out0, err + +} + +// WithdrawableRestakedExecutionLayerGwei is a free data retrieval call binding the contract method 0x3474aa16. +// +// Solidity: function withdrawableRestakedExecutionLayerGwei() view returns(uint64) +func (_Pod *PodSession) WithdrawableRestakedExecutionLayerGwei() (uint64, error) { + return _Pod.Contract.WithdrawableRestakedExecutionLayerGwei(&_Pod.CallOpts) +} + +// WithdrawableRestakedExecutionLayerGwei is a free data retrieval call binding the contract method 0x3474aa16. +// +// Solidity: function withdrawableRestakedExecutionLayerGwei() view returns(uint64) +func (_Pod *PodCallerSession) WithdrawableRestakedExecutionLayerGwei() (uint64, error) { + return _Pod.Contract.WithdrawableRestakedExecutionLayerGwei(&_Pod.CallOpts) +} + +// Initialize is a paid mutator transaction binding the contract method 0xc4d66de8. +// +// Solidity: function initialize(address _podOwner) returns() +func (_Pod *PodTransactor) Initialize(opts *bind.TransactOpts, _podOwner common.Address) (*types.Transaction, error) { + return _Pod.contract.Transact(opts, "initialize", _podOwner) +} + +// Initialize is a paid mutator transaction binding the contract method 0xc4d66de8. +// +// Solidity: function initialize(address _podOwner) returns() +func (_Pod *PodSession) Initialize(_podOwner common.Address) (*types.Transaction, error) { + return _Pod.Contract.Initialize(&_Pod.TransactOpts, _podOwner) +} + +// Initialize is a paid mutator transaction binding the contract method 0xc4d66de8. +// +// Solidity: function initialize(address _podOwner) returns() +func (_Pod *PodTransactorSession) Initialize(_podOwner common.Address) (*types.Transaction, error) { + return _Pod.Contract.Initialize(&_Pod.TransactOpts, _podOwner) +} + +// RecoverTokens is a paid mutator transaction binding the contract method 0xdda3346c. +// +// Solidity: function recoverTokens(address[] tokenList, uint256[] amountsToWithdraw, address recipient) returns() +func (_Pod *PodTransactor) RecoverTokens(opts *bind.TransactOpts, tokenList []common.Address, amountsToWithdraw []*big.Int, recipient common.Address) (*types.Transaction, error) { + return _Pod.contract.Transact(opts, "recoverTokens", tokenList, amountsToWithdraw, recipient) +} + +// RecoverTokens is a paid mutator transaction binding the contract method 0xdda3346c. +// +// Solidity: function recoverTokens(address[] tokenList, uint256[] amountsToWithdraw, address recipient) returns() +func (_Pod *PodSession) RecoverTokens(tokenList []common.Address, amountsToWithdraw []*big.Int, recipient common.Address) (*types.Transaction, error) { + return _Pod.Contract.RecoverTokens(&_Pod.TransactOpts, tokenList, amountsToWithdraw, recipient) +} + +// RecoverTokens is a paid mutator transaction binding the contract method 0xdda3346c. +// +// Solidity: function recoverTokens(address[] tokenList, uint256[] amountsToWithdraw, address recipient) returns() +func (_Pod *PodTransactorSession) RecoverTokens(tokenList []common.Address, amountsToWithdraw []*big.Int, recipient common.Address) (*types.Transaction, error) { + return _Pod.Contract.RecoverTokens(&_Pod.TransactOpts, tokenList, amountsToWithdraw, recipient) +} + +// SetProofSubmitter is a paid mutator transaction binding the contract method 0xd06d5587. +// +// Solidity: function setProofSubmitter(address newProofSubmitter) returns() +func (_Pod *PodTransactor) SetProofSubmitter(opts *bind.TransactOpts, newProofSubmitter common.Address) (*types.Transaction, error) { + return _Pod.contract.Transact(opts, "setProofSubmitter", newProofSubmitter) +} + +// SetProofSubmitter is a paid mutator transaction binding the contract method 0xd06d5587. +// +// Solidity: function setProofSubmitter(address newProofSubmitter) returns() +func (_Pod *PodSession) SetProofSubmitter(newProofSubmitter common.Address) (*types.Transaction, error) { + return _Pod.Contract.SetProofSubmitter(&_Pod.TransactOpts, newProofSubmitter) +} + +// SetProofSubmitter is a paid mutator transaction binding the contract method 0xd06d5587. +// +// Solidity: function setProofSubmitter(address newProofSubmitter) returns() +func (_Pod *PodTransactorSession) SetProofSubmitter(newProofSubmitter common.Address) (*types.Transaction, error) { + return _Pod.Contract.SetProofSubmitter(&_Pod.TransactOpts, newProofSubmitter) +} + +// Stake is a paid mutator transaction binding the contract method 0x9b4e4634. +// +// Solidity: function stake(bytes pubkey, bytes signature, bytes32 depositDataRoot) payable returns() +func (_Pod *PodTransactor) Stake(opts *bind.TransactOpts, pubkey []byte, signature []byte, depositDataRoot [32]byte) (*types.Transaction, error) { + return _Pod.contract.Transact(opts, "stake", pubkey, signature, depositDataRoot) +} + +// Stake is a paid mutator transaction binding the contract method 0x9b4e4634. +// +// Solidity: function stake(bytes pubkey, bytes signature, bytes32 depositDataRoot) payable returns() +func (_Pod *PodSession) Stake(pubkey []byte, signature []byte, depositDataRoot [32]byte) (*types.Transaction, error) { + return _Pod.Contract.Stake(&_Pod.TransactOpts, pubkey, signature, depositDataRoot) +} + +// Stake is a paid mutator transaction binding the contract method 0x9b4e4634. +// +// Solidity: function stake(bytes pubkey, bytes signature, bytes32 depositDataRoot) payable returns() +func (_Pod *PodTransactorSession) Stake(pubkey []byte, signature []byte, depositDataRoot [32]byte) (*types.Transaction, error) { + return _Pod.Contract.Stake(&_Pod.TransactOpts, pubkey, signature, depositDataRoot) +} + +// StartCheckpoint is a paid mutator transaction binding the contract method 0x88676cad. +// +// Solidity: function startCheckpoint(bool revertIfNoBalance) returns() +func (_Pod *PodTransactor) StartCheckpoint(opts *bind.TransactOpts, revertIfNoBalance bool) (*types.Transaction, error) { + return _Pod.contract.Transact(opts, "startCheckpoint", revertIfNoBalance) +} + +// StartCheckpoint is a paid mutator transaction binding the contract method 0x88676cad. +// +// Solidity: function startCheckpoint(bool revertIfNoBalance) returns() +func (_Pod *PodSession) StartCheckpoint(revertIfNoBalance bool) (*types.Transaction, error) { + return _Pod.Contract.StartCheckpoint(&_Pod.TransactOpts, revertIfNoBalance) +} + +// StartCheckpoint is a paid mutator transaction binding the contract method 0x88676cad. +// +// Solidity: function startCheckpoint(bool revertIfNoBalance) returns() +func (_Pod *PodTransactorSession) StartCheckpoint(revertIfNoBalance bool) (*types.Transaction, error) { + return _Pod.Contract.StartCheckpoint(&_Pod.TransactOpts, revertIfNoBalance) +} + +// VerifyCheckpointProofs is a paid mutator transaction binding the contract method 0xf074ba62. +// +// Solidity: function verifyCheckpointProofs((bytes32,bytes) balanceContainerProof, (bytes32,bytes32,bytes)[] proofs) returns() +func (_Pod *PodTransactor) VerifyCheckpointProofs(opts *bind.TransactOpts, balanceContainerProof BeaconChainProofsBalanceContainerProof, proofs []BeaconChainProofsBalanceProof) (*types.Transaction, error) { + return _Pod.contract.Transact(opts, "verifyCheckpointProofs", balanceContainerProof, proofs) +} + +// VerifyCheckpointProofs is a paid mutator transaction binding the contract method 0xf074ba62. +// +// Solidity: function verifyCheckpointProofs((bytes32,bytes) balanceContainerProof, (bytes32,bytes32,bytes)[] proofs) returns() +func (_Pod *PodSession) VerifyCheckpointProofs(balanceContainerProof BeaconChainProofsBalanceContainerProof, proofs []BeaconChainProofsBalanceProof) (*types.Transaction, error) { + return _Pod.Contract.VerifyCheckpointProofs(&_Pod.TransactOpts, balanceContainerProof, proofs) +} + +// VerifyCheckpointProofs is a paid mutator transaction binding the contract method 0xf074ba62. +// +// Solidity: function verifyCheckpointProofs((bytes32,bytes) balanceContainerProof, (bytes32,bytes32,bytes)[] proofs) returns() +func (_Pod *PodTransactorSession) VerifyCheckpointProofs(balanceContainerProof BeaconChainProofsBalanceContainerProof, proofs []BeaconChainProofsBalanceProof) (*types.Transaction, error) { + return _Pod.Contract.VerifyCheckpointProofs(&_Pod.TransactOpts, balanceContainerProof, proofs) +} + +// VerifyStaleBalance is a paid mutator transaction binding the contract method 0x039157d2. +// +// Solidity: function verifyStaleBalance(uint64 beaconTimestamp, (bytes32,bytes) stateRootProof, (bytes32[],bytes) proof) returns() +func (_Pod *PodTransactor) VerifyStaleBalance(opts *bind.TransactOpts, beaconTimestamp uint64, stateRootProof BeaconChainProofsStateRootProof, proof BeaconChainProofsValidatorProof) (*types.Transaction, error) { + return _Pod.contract.Transact(opts, "verifyStaleBalance", beaconTimestamp, stateRootProof, proof) +} + +// VerifyStaleBalance is a paid mutator transaction binding the contract method 0x039157d2. +// +// Solidity: function verifyStaleBalance(uint64 beaconTimestamp, (bytes32,bytes) stateRootProof, (bytes32[],bytes) proof) returns() +func (_Pod *PodSession) VerifyStaleBalance(beaconTimestamp uint64, stateRootProof BeaconChainProofsStateRootProof, proof BeaconChainProofsValidatorProof) (*types.Transaction, error) { + return _Pod.Contract.VerifyStaleBalance(&_Pod.TransactOpts, beaconTimestamp, stateRootProof, proof) +} + +// VerifyStaleBalance is a paid mutator transaction binding the contract method 0x039157d2. +// +// Solidity: function verifyStaleBalance(uint64 beaconTimestamp, (bytes32,bytes) stateRootProof, (bytes32[],bytes) proof) returns() +func (_Pod *PodTransactorSession) VerifyStaleBalance(beaconTimestamp uint64, stateRootProof BeaconChainProofsStateRootProof, proof BeaconChainProofsValidatorProof) (*types.Transaction, error) { + return _Pod.Contract.VerifyStaleBalance(&_Pod.TransactOpts, beaconTimestamp, stateRootProof, proof) +} + +// VerifyWithdrawalCredentials is a paid mutator transaction binding the contract method 0x3f65cf19. +// +// Solidity: function verifyWithdrawalCredentials(uint64 beaconTimestamp, (bytes32,bytes) stateRootProof, uint40[] validatorIndices, bytes[] validatorFieldsProofs, bytes32[][] validatorFields) returns() +func (_Pod *PodTransactor) VerifyWithdrawalCredentials(opts *bind.TransactOpts, beaconTimestamp uint64, stateRootProof BeaconChainProofsStateRootProof, validatorIndices []*big.Int, validatorFieldsProofs [][]byte, validatorFields [][][32]byte) (*types.Transaction, error) { + return _Pod.contract.Transact(opts, "verifyWithdrawalCredentials", beaconTimestamp, stateRootProof, validatorIndices, validatorFieldsProofs, validatorFields) +} + +// VerifyWithdrawalCredentials is a paid mutator transaction binding the contract method 0x3f65cf19. +// +// Solidity: function verifyWithdrawalCredentials(uint64 beaconTimestamp, (bytes32,bytes) stateRootProof, uint40[] validatorIndices, bytes[] validatorFieldsProofs, bytes32[][] validatorFields) returns() +func (_Pod *PodSession) VerifyWithdrawalCredentials(beaconTimestamp uint64, stateRootProof BeaconChainProofsStateRootProof, validatorIndices []*big.Int, validatorFieldsProofs [][]byte, validatorFields [][][32]byte) (*types.Transaction, error) { + return _Pod.Contract.VerifyWithdrawalCredentials(&_Pod.TransactOpts, beaconTimestamp, stateRootProof, validatorIndices, validatorFieldsProofs, validatorFields) +} + +// VerifyWithdrawalCredentials is a paid mutator transaction binding the contract method 0x3f65cf19. +// +// Solidity: function verifyWithdrawalCredentials(uint64 beaconTimestamp, (bytes32,bytes) stateRootProof, uint40[] validatorIndices, bytes[] validatorFieldsProofs, bytes32[][] validatorFields) returns() +func (_Pod *PodTransactorSession) VerifyWithdrawalCredentials(beaconTimestamp uint64, stateRootProof BeaconChainProofsStateRootProof, validatorIndices []*big.Int, validatorFieldsProofs [][]byte, validatorFields [][][32]byte) (*types.Transaction, error) { + return _Pod.Contract.VerifyWithdrawalCredentials(&_Pod.TransactOpts, beaconTimestamp, stateRootProof, validatorIndices, validatorFieldsProofs, validatorFields) +} + +// WithdrawRestakedBeaconChainETH is a paid mutator transaction binding the contract method 0xc4907442. +// +// Solidity: function withdrawRestakedBeaconChainETH(address recipient, uint256 amountWei) returns() +func (_Pod *PodTransactor) WithdrawRestakedBeaconChainETH(opts *bind.TransactOpts, recipient common.Address, amountWei *big.Int) (*types.Transaction, error) { + return _Pod.contract.Transact(opts, "withdrawRestakedBeaconChainETH", recipient, amountWei) +} + +// WithdrawRestakedBeaconChainETH is a paid mutator transaction binding the contract method 0xc4907442. +// +// Solidity: function withdrawRestakedBeaconChainETH(address recipient, uint256 amountWei) returns() +func (_Pod *PodSession) WithdrawRestakedBeaconChainETH(recipient common.Address, amountWei *big.Int) (*types.Transaction, error) { + return _Pod.Contract.WithdrawRestakedBeaconChainETH(&_Pod.TransactOpts, recipient, amountWei) +} + +// WithdrawRestakedBeaconChainETH is a paid mutator transaction binding the contract method 0xc4907442. +// +// Solidity: function withdrawRestakedBeaconChainETH(address recipient, uint256 amountWei) returns() +func (_Pod *PodTransactorSession) WithdrawRestakedBeaconChainETH(recipient common.Address, amountWei *big.Int) (*types.Transaction, error) { + return _Pod.Contract.WithdrawRestakedBeaconChainETH(&_Pod.TransactOpts, recipient, amountWei) +} + +// Receive is a paid mutator transaction binding the contract receive function. +// +// Solidity: receive() payable returns() +func (_Pod *PodTransactor) Receive(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Pod.contract.RawTransact(opts, nil) // calldata is disallowed for receive function +} + +// Receive is a paid mutator transaction binding the contract receive function. +// +// Solidity: receive() payable returns() +func (_Pod *PodSession) Receive() (*types.Transaction, error) { + return _Pod.Contract.Receive(&_Pod.TransactOpts) +} + +// Receive is a paid mutator transaction binding the contract receive function. +// +// Solidity: receive() payable returns() +func (_Pod *PodTransactorSession) Receive() (*types.Transaction, error) { + return _Pod.Contract.Receive(&_Pod.TransactOpts) +} + +// PodCheckpointCreatedIterator is returned from FilterCheckpointCreated and is used to iterate over the raw logs and unpacked data for CheckpointCreated events raised by the Pod contract. +type PodCheckpointCreatedIterator struct { + Event *PodCheckpointCreated // 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 *PodCheckpointCreatedIterator) 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(PodCheckpointCreated) + 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(PodCheckpointCreated) + 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 *PodCheckpointCreatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *PodCheckpointCreatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// PodCheckpointCreated represents a CheckpointCreated event raised by the Pod contract. +type PodCheckpointCreated struct { + CheckpointTimestamp uint64 + BeaconBlockRoot [32]byte + ValidatorCount *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterCheckpointCreated is a free log retrieval operation binding the contract event 0x575796133bbed337e5b39aa49a30dc2556a91e0c6c2af4b7b886ae77ebef1076. +// +// Solidity: event CheckpointCreated(uint64 indexed checkpointTimestamp, bytes32 indexed beaconBlockRoot, uint256 validatorCount) +func (_Pod *PodFilterer) FilterCheckpointCreated(opts *bind.FilterOpts, checkpointTimestamp []uint64, beaconBlockRoot [][32]byte) (*PodCheckpointCreatedIterator, error) { + + var checkpointTimestampRule []interface{} + for _, checkpointTimestampItem := range checkpointTimestamp { + checkpointTimestampRule = append(checkpointTimestampRule, checkpointTimestampItem) + } + var beaconBlockRootRule []interface{} + for _, beaconBlockRootItem := range beaconBlockRoot { + beaconBlockRootRule = append(beaconBlockRootRule, beaconBlockRootItem) + } + + logs, sub, err := _Pod.contract.FilterLogs(opts, "CheckpointCreated", checkpointTimestampRule, beaconBlockRootRule) + if err != nil { + return nil, err + } + return &PodCheckpointCreatedIterator{contract: _Pod.contract, event: "CheckpointCreated", logs: logs, sub: sub}, nil +} + +// WatchCheckpointCreated is a free log subscription operation binding the contract event 0x575796133bbed337e5b39aa49a30dc2556a91e0c6c2af4b7b886ae77ebef1076. +// +// Solidity: event CheckpointCreated(uint64 indexed checkpointTimestamp, bytes32 indexed beaconBlockRoot, uint256 validatorCount) +func (_Pod *PodFilterer) WatchCheckpointCreated(opts *bind.WatchOpts, sink chan<- *PodCheckpointCreated, checkpointTimestamp []uint64, beaconBlockRoot [][32]byte) (event.Subscription, error) { + + var checkpointTimestampRule []interface{} + for _, checkpointTimestampItem := range checkpointTimestamp { + checkpointTimestampRule = append(checkpointTimestampRule, checkpointTimestampItem) + } + var beaconBlockRootRule []interface{} + for _, beaconBlockRootItem := range beaconBlockRoot { + beaconBlockRootRule = append(beaconBlockRootRule, beaconBlockRootItem) + } + + logs, sub, err := _Pod.contract.WatchLogs(opts, "CheckpointCreated", checkpointTimestampRule, beaconBlockRootRule) + 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(PodCheckpointCreated) + if err := _Pod.contract.UnpackLog(event, "CheckpointCreated", 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 +} + +// ParseCheckpointCreated is a log parse operation binding the contract event 0x575796133bbed337e5b39aa49a30dc2556a91e0c6c2af4b7b886ae77ebef1076. +// +// Solidity: event CheckpointCreated(uint64 indexed checkpointTimestamp, bytes32 indexed beaconBlockRoot, uint256 validatorCount) +func (_Pod *PodFilterer) ParseCheckpointCreated(log types.Log) (*PodCheckpointCreated, error) { + event := new(PodCheckpointCreated) + if err := _Pod.contract.UnpackLog(event, "CheckpointCreated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// PodCheckpointFinalizedIterator is returned from FilterCheckpointFinalized and is used to iterate over the raw logs and unpacked data for CheckpointFinalized events raised by the Pod contract. +type PodCheckpointFinalizedIterator struct { + Event *PodCheckpointFinalized // 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 *PodCheckpointFinalizedIterator) 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(PodCheckpointFinalized) + 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(PodCheckpointFinalized) + 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 *PodCheckpointFinalizedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *PodCheckpointFinalizedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// PodCheckpointFinalized represents a CheckpointFinalized event raised by the Pod contract. +type PodCheckpointFinalized struct { + CheckpointTimestamp uint64 + TotalShareDeltaWei *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterCheckpointFinalized is a free log retrieval operation binding the contract event 0x525408c201bc1576eb44116f6478f1c2a54775b19a043bcfdc708364f74f8e44. +// +// Solidity: event CheckpointFinalized(uint64 indexed checkpointTimestamp, int256 totalShareDeltaWei) +func (_Pod *PodFilterer) FilterCheckpointFinalized(opts *bind.FilterOpts, checkpointTimestamp []uint64) (*PodCheckpointFinalizedIterator, error) { + + var checkpointTimestampRule []interface{} + for _, checkpointTimestampItem := range checkpointTimestamp { + checkpointTimestampRule = append(checkpointTimestampRule, checkpointTimestampItem) + } + + logs, sub, err := _Pod.contract.FilterLogs(opts, "CheckpointFinalized", checkpointTimestampRule) + if err != nil { + return nil, err + } + return &PodCheckpointFinalizedIterator{contract: _Pod.contract, event: "CheckpointFinalized", logs: logs, sub: sub}, nil +} + +// WatchCheckpointFinalized is a free log subscription operation binding the contract event 0x525408c201bc1576eb44116f6478f1c2a54775b19a043bcfdc708364f74f8e44. +// +// Solidity: event CheckpointFinalized(uint64 indexed checkpointTimestamp, int256 totalShareDeltaWei) +func (_Pod *PodFilterer) WatchCheckpointFinalized(opts *bind.WatchOpts, sink chan<- *PodCheckpointFinalized, checkpointTimestamp []uint64) (event.Subscription, error) { + + var checkpointTimestampRule []interface{} + for _, checkpointTimestampItem := range checkpointTimestamp { + checkpointTimestampRule = append(checkpointTimestampRule, checkpointTimestampItem) + } + + logs, sub, err := _Pod.contract.WatchLogs(opts, "CheckpointFinalized", checkpointTimestampRule) + 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(PodCheckpointFinalized) + if err := _Pod.contract.UnpackLog(event, "CheckpointFinalized", 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 +} + +// ParseCheckpointFinalized is a log parse operation binding the contract event 0x525408c201bc1576eb44116f6478f1c2a54775b19a043bcfdc708364f74f8e44. +// +// Solidity: event CheckpointFinalized(uint64 indexed checkpointTimestamp, int256 totalShareDeltaWei) +func (_Pod *PodFilterer) ParseCheckpointFinalized(log types.Log) (*PodCheckpointFinalized, error) { + event := new(PodCheckpointFinalized) + if err := _Pod.contract.UnpackLog(event, "CheckpointFinalized", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// PodEigenPodStakedIterator is returned from FilterEigenPodStaked and is used to iterate over the raw logs and unpacked data for EigenPodStaked events raised by the Pod contract. +type PodEigenPodStakedIterator struct { + Event *PodEigenPodStaked // 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 *PodEigenPodStakedIterator) 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(PodEigenPodStaked) + 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(PodEigenPodStaked) + 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 *PodEigenPodStakedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *PodEigenPodStakedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// PodEigenPodStaked represents a EigenPodStaked event raised by the Pod contract. +type PodEigenPodStaked struct { + Pubkey []byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterEigenPodStaked is a free log retrieval operation binding the contract event 0x606865b7934a25d4aed43f6cdb426403353fa4b3009c4d228407474581b01e23. +// +// Solidity: event EigenPodStaked(bytes pubkey) +func (_Pod *PodFilterer) FilterEigenPodStaked(opts *bind.FilterOpts) (*PodEigenPodStakedIterator, error) { + + logs, sub, err := _Pod.contract.FilterLogs(opts, "EigenPodStaked") + if err != nil { + return nil, err + } + return &PodEigenPodStakedIterator{contract: _Pod.contract, event: "EigenPodStaked", logs: logs, sub: sub}, nil +} + +// WatchEigenPodStaked is a free log subscription operation binding the contract event 0x606865b7934a25d4aed43f6cdb426403353fa4b3009c4d228407474581b01e23. +// +// Solidity: event EigenPodStaked(bytes pubkey) +func (_Pod *PodFilterer) WatchEigenPodStaked(opts *bind.WatchOpts, sink chan<- *PodEigenPodStaked) (event.Subscription, error) { + + logs, sub, err := _Pod.contract.WatchLogs(opts, "EigenPodStaked") + 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(PodEigenPodStaked) + if err := _Pod.contract.UnpackLog(event, "EigenPodStaked", 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 +} + +// ParseEigenPodStaked is a log parse operation binding the contract event 0x606865b7934a25d4aed43f6cdb426403353fa4b3009c4d228407474581b01e23. +// +// Solidity: event EigenPodStaked(bytes pubkey) +func (_Pod *PodFilterer) ParseEigenPodStaked(log types.Log) (*PodEigenPodStaked, error) { + event := new(PodEigenPodStaked) + if err := _Pod.contract.UnpackLog(event, "EigenPodStaked", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// PodInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the Pod contract. +type PodInitializedIterator struct { + Event *PodInitialized // 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 *PodInitializedIterator) 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(PodInitialized) + 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(PodInitialized) + 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 *PodInitializedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *PodInitializedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// PodInitialized represents a Initialized event raised by the Pod contract. +type PodInitialized struct { + Version uint8 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterInitialized is a free log retrieval operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498. +// +// Solidity: event Initialized(uint8 version) +func (_Pod *PodFilterer) FilterInitialized(opts *bind.FilterOpts) (*PodInitializedIterator, error) { + + logs, sub, err := _Pod.contract.FilterLogs(opts, "Initialized") + if err != nil { + return nil, err + } + return &PodInitializedIterator{contract: _Pod.contract, event: "Initialized", logs: logs, sub: sub}, nil +} + +// WatchInitialized is a free log subscription operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498. +// +// Solidity: event Initialized(uint8 version) +func (_Pod *PodFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *PodInitialized) (event.Subscription, error) { + + logs, sub, err := _Pod.contract.WatchLogs(opts, "Initialized") + 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(PodInitialized) + if err := _Pod.contract.UnpackLog(event, "Initialized", 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 +} + +// ParseInitialized is a log parse operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498. +// +// Solidity: event Initialized(uint8 version) +func (_Pod *PodFilterer) ParseInitialized(log types.Log) (*PodInitialized, error) { + event := new(PodInitialized) + if err := _Pod.contract.UnpackLog(event, "Initialized", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// PodNonBeaconChainETHReceivedIterator is returned from FilterNonBeaconChainETHReceived and is used to iterate over the raw logs and unpacked data for NonBeaconChainETHReceived events raised by the Pod contract. +type PodNonBeaconChainETHReceivedIterator struct { + Event *PodNonBeaconChainETHReceived // 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 *PodNonBeaconChainETHReceivedIterator) 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(PodNonBeaconChainETHReceived) + 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(PodNonBeaconChainETHReceived) + 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 *PodNonBeaconChainETHReceivedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *PodNonBeaconChainETHReceivedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// PodNonBeaconChainETHReceived represents a NonBeaconChainETHReceived event raised by the Pod contract. +type PodNonBeaconChainETHReceived struct { + AmountReceived *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterNonBeaconChainETHReceived is a free log retrieval operation binding the contract event 0x6fdd3dbdb173299608c0aa9f368735857c8842b581f8389238bf05bd04b3bf49. +// +// Solidity: event NonBeaconChainETHReceived(uint256 amountReceived) +func (_Pod *PodFilterer) FilterNonBeaconChainETHReceived(opts *bind.FilterOpts) (*PodNonBeaconChainETHReceivedIterator, error) { + + logs, sub, err := _Pod.contract.FilterLogs(opts, "NonBeaconChainETHReceived") + if err != nil { + return nil, err + } + return &PodNonBeaconChainETHReceivedIterator{contract: _Pod.contract, event: "NonBeaconChainETHReceived", logs: logs, sub: sub}, nil +} + +// WatchNonBeaconChainETHReceived is a free log subscription operation binding the contract event 0x6fdd3dbdb173299608c0aa9f368735857c8842b581f8389238bf05bd04b3bf49. +// +// Solidity: event NonBeaconChainETHReceived(uint256 amountReceived) +func (_Pod *PodFilterer) WatchNonBeaconChainETHReceived(opts *bind.WatchOpts, sink chan<- *PodNonBeaconChainETHReceived) (event.Subscription, error) { + + logs, sub, err := _Pod.contract.WatchLogs(opts, "NonBeaconChainETHReceived") + 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(PodNonBeaconChainETHReceived) + if err := _Pod.contract.UnpackLog(event, "NonBeaconChainETHReceived", 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 +} + +// ParseNonBeaconChainETHReceived is a log parse operation binding the contract event 0x6fdd3dbdb173299608c0aa9f368735857c8842b581f8389238bf05bd04b3bf49. +// +// Solidity: event NonBeaconChainETHReceived(uint256 amountReceived) +func (_Pod *PodFilterer) ParseNonBeaconChainETHReceived(log types.Log) (*PodNonBeaconChainETHReceived, error) { + event := new(PodNonBeaconChainETHReceived) + if err := _Pod.contract.UnpackLog(event, "NonBeaconChainETHReceived", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// PodProofSubmitterUpdatedIterator is returned from FilterProofSubmitterUpdated and is used to iterate over the raw logs and unpacked data for ProofSubmitterUpdated events raised by the Pod contract. +type PodProofSubmitterUpdatedIterator struct { + Event *PodProofSubmitterUpdated // 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 *PodProofSubmitterUpdatedIterator) 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(PodProofSubmitterUpdated) + 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(PodProofSubmitterUpdated) + 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 *PodProofSubmitterUpdatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *PodProofSubmitterUpdatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// PodProofSubmitterUpdated represents a ProofSubmitterUpdated event raised by the Pod contract. +type PodProofSubmitterUpdated struct { + PrevProofSubmitter common.Address + NewProofSubmitter common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterProofSubmitterUpdated is a free log retrieval operation binding the contract event 0xfb8129080a19d34dceac04ba253fc50304dc86c729bd63cdca4a969ad19a5eac. +// +// Solidity: event ProofSubmitterUpdated(address prevProofSubmitter, address newProofSubmitter) +func (_Pod *PodFilterer) FilterProofSubmitterUpdated(opts *bind.FilterOpts) (*PodProofSubmitterUpdatedIterator, error) { + + logs, sub, err := _Pod.contract.FilterLogs(opts, "ProofSubmitterUpdated") + if err != nil { + return nil, err + } + return &PodProofSubmitterUpdatedIterator{contract: _Pod.contract, event: "ProofSubmitterUpdated", logs: logs, sub: sub}, nil +} + +// WatchProofSubmitterUpdated is a free log subscription operation binding the contract event 0xfb8129080a19d34dceac04ba253fc50304dc86c729bd63cdca4a969ad19a5eac. +// +// Solidity: event ProofSubmitterUpdated(address prevProofSubmitter, address newProofSubmitter) +func (_Pod *PodFilterer) WatchProofSubmitterUpdated(opts *bind.WatchOpts, sink chan<- *PodProofSubmitterUpdated) (event.Subscription, error) { + + logs, sub, err := _Pod.contract.WatchLogs(opts, "ProofSubmitterUpdated") + 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(PodProofSubmitterUpdated) + if err := _Pod.contract.UnpackLog(event, "ProofSubmitterUpdated", 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 +} + +// ParseProofSubmitterUpdated is a log parse operation binding the contract event 0xfb8129080a19d34dceac04ba253fc50304dc86c729bd63cdca4a969ad19a5eac. +// +// Solidity: event ProofSubmitterUpdated(address prevProofSubmitter, address newProofSubmitter) +func (_Pod *PodFilterer) ParseProofSubmitterUpdated(log types.Log) (*PodProofSubmitterUpdated, error) { + event := new(PodProofSubmitterUpdated) + if err := _Pod.contract.UnpackLog(event, "ProofSubmitterUpdated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// PodRestakedBeaconChainETHWithdrawnIterator is returned from FilterRestakedBeaconChainETHWithdrawn and is used to iterate over the raw logs and unpacked data for RestakedBeaconChainETHWithdrawn events raised by the Pod contract. +type PodRestakedBeaconChainETHWithdrawnIterator struct { + Event *PodRestakedBeaconChainETHWithdrawn // 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 *PodRestakedBeaconChainETHWithdrawnIterator) 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(PodRestakedBeaconChainETHWithdrawn) + 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(PodRestakedBeaconChainETHWithdrawn) + 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 *PodRestakedBeaconChainETHWithdrawnIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *PodRestakedBeaconChainETHWithdrawnIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// PodRestakedBeaconChainETHWithdrawn represents a RestakedBeaconChainETHWithdrawn event raised by the Pod contract. +type PodRestakedBeaconChainETHWithdrawn struct { + Recipient common.Address + Amount *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterRestakedBeaconChainETHWithdrawn is a free log retrieval operation binding the contract event 0x8947fd2ce07ef9cc302c4e8f0461015615d91ce851564839e91cc804c2f49d8e. +// +// Solidity: event RestakedBeaconChainETHWithdrawn(address indexed recipient, uint256 amount) +func (_Pod *PodFilterer) FilterRestakedBeaconChainETHWithdrawn(opts *bind.FilterOpts, recipient []common.Address) (*PodRestakedBeaconChainETHWithdrawnIterator, error) { + + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) + } + + logs, sub, err := _Pod.contract.FilterLogs(opts, "RestakedBeaconChainETHWithdrawn", recipientRule) + if err != nil { + return nil, err + } + return &PodRestakedBeaconChainETHWithdrawnIterator{contract: _Pod.contract, event: "RestakedBeaconChainETHWithdrawn", logs: logs, sub: sub}, nil +} + +// WatchRestakedBeaconChainETHWithdrawn is a free log subscription operation binding the contract event 0x8947fd2ce07ef9cc302c4e8f0461015615d91ce851564839e91cc804c2f49d8e. +// +// Solidity: event RestakedBeaconChainETHWithdrawn(address indexed recipient, uint256 amount) +func (_Pod *PodFilterer) WatchRestakedBeaconChainETHWithdrawn(opts *bind.WatchOpts, sink chan<- *PodRestakedBeaconChainETHWithdrawn, recipient []common.Address) (event.Subscription, error) { + + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) + } + + logs, sub, err := _Pod.contract.WatchLogs(opts, "RestakedBeaconChainETHWithdrawn", recipientRule) + 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(PodRestakedBeaconChainETHWithdrawn) + if err := _Pod.contract.UnpackLog(event, "RestakedBeaconChainETHWithdrawn", 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 +} + +// ParseRestakedBeaconChainETHWithdrawn is a log parse operation binding the contract event 0x8947fd2ce07ef9cc302c4e8f0461015615d91ce851564839e91cc804c2f49d8e. +// +// Solidity: event RestakedBeaconChainETHWithdrawn(address indexed recipient, uint256 amount) +func (_Pod *PodFilterer) ParseRestakedBeaconChainETHWithdrawn(log types.Log) (*PodRestakedBeaconChainETHWithdrawn, error) { + event := new(PodRestakedBeaconChainETHWithdrawn) + if err := _Pod.contract.UnpackLog(event, "RestakedBeaconChainETHWithdrawn", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// PodValidatorBalanceUpdatedIterator is returned from FilterValidatorBalanceUpdated and is used to iterate over the raw logs and unpacked data for ValidatorBalanceUpdated events raised by the Pod contract. +type PodValidatorBalanceUpdatedIterator struct { + Event *PodValidatorBalanceUpdated // 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 *PodValidatorBalanceUpdatedIterator) 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(PodValidatorBalanceUpdated) + 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(PodValidatorBalanceUpdated) + 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 *PodValidatorBalanceUpdatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *PodValidatorBalanceUpdatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// PodValidatorBalanceUpdated represents a ValidatorBalanceUpdated event raised by the Pod contract. +type PodValidatorBalanceUpdated struct { + ValidatorIndex *big.Int + BalanceTimestamp uint64 + NewValidatorBalanceGwei uint64 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterValidatorBalanceUpdated is a free log retrieval operation binding the contract event 0x0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df. +// +// Solidity: event ValidatorBalanceUpdated(uint40 validatorIndex, uint64 balanceTimestamp, uint64 newValidatorBalanceGwei) +func (_Pod *PodFilterer) FilterValidatorBalanceUpdated(opts *bind.FilterOpts) (*PodValidatorBalanceUpdatedIterator, error) { + + logs, sub, err := _Pod.contract.FilterLogs(opts, "ValidatorBalanceUpdated") + if err != nil { + return nil, err + } + return &PodValidatorBalanceUpdatedIterator{contract: _Pod.contract, event: "ValidatorBalanceUpdated", logs: logs, sub: sub}, nil +} + +// WatchValidatorBalanceUpdated is a free log subscription operation binding the contract event 0x0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df. +// +// Solidity: event ValidatorBalanceUpdated(uint40 validatorIndex, uint64 balanceTimestamp, uint64 newValidatorBalanceGwei) +func (_Pod *PodFilterer) WatchValidatorBalanceUpdated(opts *bind.WatchOpts, sink chan<- *PodValidatorBalanceUpdated) (event.Subscription, error) { + + logs, sub, err := _Pod.contract.WatchLogs(opts, "ValidatorBalanceUpdated") + 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(PodValidatorBalanceUpdated) + if err := _Pod.contract.UnpackLog(event, "ValidatorBalanceUpdated", 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 +} + +// ParseValidatorBalanceUpdated is a log parse operation binding the contract event 0x0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df. +// +// Solidity: event ValidatorBalanceUpdated(uint40 validatorIndex, uint64 balanceTimestamp, uint64 newValidatorBalanceGwei) +func (_Pod *PodFilterer) ParseValidatorBalanceUpdated(log types.Log) (*PodValidatorBalanceUpdated, error) { + event := new(PodValidatorBalanceUpdated) + if err := _Pod.contract.UnpackLog(event, "ValidatorBalanceUpdated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// PodValidatorCheckpointedIterator is returned from FilterValidatorCheckpointed and is used to iterate over the raw logs and unpacked data for ValidatorCheckpointed events raised by the Pod contract. +type PodValidatorCheckpointedIterator struct { + Event *PodValidatorCheckpointed // 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 *PodValidatorCheckpointedIterator) 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(PodValidatorCheckpointed) + 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(PodValidatorCheckpointed) + 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 *PodValidatorCheckpointedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *PodValidatorCheckpointedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// PodValidatorCheckpointed represents a ValidatorCheckpointed event raised by the Pod contract. +type PodValidatorCheckpointed struct { + CheckpointTimestamp uint64 + ValidatorIndex *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterValidatorCheckpointed is a free log retrieval operation binding the contract event 0xa91c59033c3423e18b54d0acecebb4972f9ea95aedf5f4cae3b677b02eaf3a3f. +// +// Solidity: event ValidatorCheckpointed(uint64 indexed checkpointTimestamp, uint40 indexed validatorIndex) +func (_Pod *PodFilterer) FilterValidatorCheckpointed(opts *bind.FilterOpts, checkpointTimestamp []uint64, validatorIndex []*big.Int) (*PodValidatorCheckpointedIterator, error) { + + var checkpointTimestampRule []interface{} + for _, checkpointTimestampItem := range checkpointTimestamp { + checkpointTimestampRule = append(checkpointTimestampRule, checkpointTimestampItem) + } + var validatorIndexRule []interface{} + for _, validatorIndexItem := range validatorIndex { + validatorIndexRule = append(validatorIndexRule, validatorIndexItem) + } + + logs, sub, err := _Pod.contract.FilterLogs(opts, "ValidatorCheckpointed", checkpointTimestampRule, validatorIndexRule) + if err != nil { + return nil, err + } + return &PodValidatorCheckpointedIterator{contract: _Pod.contract, event: "ValidatorCheckpointed", logs: logs, sub: sub}, nil +} + +// WatchValidatorCheckpointed is a free log subscription operation binding the contract event 0xa91c59033c3423e18b54d0acecebb4972f9ea95aedf5f4cae3b677b02eaf3a3f. +// +// Solidity: event ValidatorCheckpointed(uint64 indexed checkpointTimestamp, uint40 indexed validatorIndex) +func (_Pod *PodFilterer) WatchValidatorCheckpointed(opts *bind.WatchOpts, sink chan<- *PodValidatorCheckpointed, checkpointTimestamp []uint64, validatorIndex []*big.Int) (event.Subscription, error) { + + var checkpointTimestampRule []interface{} + for _, checkpointTimestampItem := range checkpointTimestamp { + checkpointTimestampRule = append(checkpointTimestampRule, checkpointTimestampItem) + } + var validatorIndexRule []interface{} + for _, validatorIndexItem := range validatorIndex { + validatorIndexRule = append(validatorIndexRule, validatorIndexItem) + } + + logs, sub, err := _Pod.contract.WatchLogs(opts, "ValidatorCheckpointed", checkpointTimestampRule, validatorIndexRule) + 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(PodValidatorCheckpointed) + if err := _Pod.contract.UnpackLog(event, "ValidatorCheckpointed", 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 +} + +// ParseValidatorCheckpointed is a log parse operation binding the contract event 0xa91c59033c3423e18b54d0acecebb4972f9ea95aedf5f4cae3b677b02eaf3a3f. +// +// Solidity: event ValidatorCheckpointed(uint64 indexed checkpointTimestamp, uint40 indexed validatorIndex) +func (_Pod *PodFilterer) ParseValidatorCheckpointed(log types.Log) (*PodValidatorCheckpointed, error) { + event := new(PodValidatorCheckpointed) + if err := _Pod.contract.UnpackLog(event, "ValidatorCheckpointed", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// PodValidatorRestakedIterator is returned from FilterValidatorRestaked and is used to iterate over the raw logs and unpacked data for ValidatorRestaked events raised by the Pod contract. +type PodValidatorRestakedIterator struct { + Event *PodValidatorRestaked // 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 *PodValidatorRestakedIterator) 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(PodValidatorRestaked) + 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(PodValidatorRestaked) + 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 *PodValidatorRestakedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *PodValidatorRestakedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// PodValidatorRestaked represents a ValidatorRestaked event raised by the Pod contract. +type PodValidatorRestaked struct { + ValidatorIndex *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterValidatorRestaked is a free log retrieval operation binding the contract event 0x2d0800bbc377ea54a08c5db6a87aafff5e3e9c8fead0eda110e40e0c10441449. +// +// Solidity: event ValidatorRestaked(uint40 validatorIndex) +func (_Pod *PodFilterer) FilterValidatorRestaked(opts *bind.FilterOpts) (*PodValidatorRestakedIterator, error) { + + logs, sub, err := _Pod.contract.FilterLogs(opts, "ValidatorRestaked") + if err != nil { + return nil, err + } + return &PodValidatorRestakedIterator{contract: _Pod.contract, event: "ValidatorRestaked", logs: logs, sub: sub}, nil +} + +// WatchValidatorRestaked is a free log subscription operation binding the contract event 0x2d0800bbc377ea54a08c5db6a87aafff5e3e9c8fead0eda110e40e0c10441449. +// +// Solidity: event ValidatorRestaked(uint40 validatorIndex) +func (_Pod *PodFilterer) WatchValidatorRestaked(opts *bind.WatchOpts, sink chan<- *PodValidatorRestaked) (event.Subscription, error) { + + logs, sub, err := _Pod.contract.WatchLogs(opts, "ValidatorRestaked") + 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(PodValidatorRestaked) + if err := _Pod.contract.UnpackLog(event, "ValidatorRestaked", 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 +} + +// ParseValidatorRestaked is a log parse operation binding the contract event 0x2d0800bbc377ea54a08c5db6a87aafff5e3e9c8fead0eda110e40e0c10441449. +// +// Solidity: event ValidatorRestaked(uint40 validatorIndex) +func (_Pod *PodFilterer) ParseValidatorRestaked(log types.Log) (*PodValidatorRestaked, error) { + event := new(PodValidatorRestaked) + if err := _Pod.contract.UnpackLog(event, "ValidatorRestaked", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// PodValidatorWithdrawnIterator is returned from FilterValidatorWithdrawn and is used to iterate over the raw logs and unpacked data for ValidatorWithdrawn events raised by the Pod contract. +type PodValidatorWithdrawnIterator struct { + Event *PodValidatorWithdrawn // 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 *PodValidatorWithdrawnIterator) 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(PodValidatorWithdrawn) + 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(PodValidatorWithdrawn) + 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 *PodValidatorWithdrawnIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *PodValidatorWithdrawnIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// PodValidatorWithdrawn represents a ValidatorWithdrawn event raised by the Pod contract. +type PodValidatorWithdrawn struct { + CheckpointTimestamp uint64 + ValidatorIndex *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterValidatorWithdrawn is a free log retrieval operation binding the contract event 0x2a02361ffa66cf2c2da4682c2355a6adcaa9f6c227b6e6563e68480f9587626a. +// +// Solidity: event ValidatorWithdrawn(uint64 indexed checkpointTimestamp, uint40 indexed validatorIndex) +func (_Pod *PodFilterer) FilterValidatorWithdrawn(opts *bind.FilterOpts, checkpointTimestamp []uint64, validatorIndex []*big.Int) (*PodValidatorWithdrawnIterator, error) { + + var checkpointTimestampRule []interface{} + for _, checkpointTimestampItem := range checkpointTimestamp { + checkpointTimestampRule = append(checkpointTimestampRule, checkpointTimestampItem) + } + var validatorIndexRule []interface{} + for _, validatorIndexItem := range validatorIndex { + validatorIndexRule = append(validatorIndexRule, validatorIndexItem) + } + + logs, sub, err := _Pod.contract.FilterLogs(opts, "ValidatorWithdrawn", checkpointTimestampRule, validatorIndexRule) + if err != nil { + return nil, err + } + return &PodValidatorWithdrawnIterator{contract: _Pod.contract, event: "ValidatorWithdrawn", logs: logs, sub: sub}, nil +} + +// WatchValidatorWithdrawn is a free log subscription operation binding the contract event 0x2a02361ffa66cf2c2da4682c2355a6adcaa9f6c227b6e6563e68480f9587626a. +// +// Solidity: event ValidatorWithdrawn(uint64 indexed checkpointTimestamp, uint40 indexed validatorIndex) +func (_Pod *PodFilterer) WatchValidatorWithdrawn(opts *bind.WatchOpts, sink chan<- *PodValidatorWithdrawn, checkpointTimestamp []uint64, validatorIndex []*big.Int) (event.Subscription, error) { + + var checkpointTimestampRule []interface{} + for _, checkpointTimestampItem := range checkpointTimestamp { + checkpointTimestampRule = append(checkpointTimestampRule, checkpointTimestampItem) + } + var validatorIndexRule []interface{} + for _, validatorIndexItem := range validatorIndex { + validatorIndexRule = append(validatorIndexRule, validatorIndexItem) + } + + logs, sub, err := _Pod.contract.WatchLogs(opts, "ValidatorWithdrawn", checkpointTimestampRule, validatorIndexRule) + 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(PodValidatorWithdrawn) + if err := _Pod.contract.UnpackLog(event, "ValidatorWithdrawn", 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 +} + +// ParseValidatorWithdrawn is a log parse operation binding the contract event 0x2a02361ffa66cf2c2da4682c2355a6adcaa9f6c227b6e6563e68480f9587626a. +// +// Solidity: event ValidatorWithdrawn(uint64 indexed checkpointTimestamp, uint40 indexed validatorIndex) +func (_Pod *PodFilterer) ParseValidatorWithdrawn(log types.Log) (*PodValidatorWithdrawn, error) { + event := new(PodValidatorWithdrawn) + if err := _Pod.contract.UnpackLog(event, "ValidatorWithdrawn", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/main.go b/main.go index 16c45b9..a194c6b 100644 --- a/main.go +++ b/main.go @@ -129,6 +129,7 @@ func main() { // Create the oracle instance oracleInstance := oracle.NewOracle(cfg) oracleInstance.SetGetSetOfValidatorsFunc(onchain.GetSetOfValidators) + oracleInstance.SetOwnerToPodFunc(onchain.GetOwnerToPod) // If checkpoint sync url is provided, load state from it if cliCfg.CheckPointSyncUrl != "" { diff --git a/oracle/onchain.go b/oracle/onchain.go index d993351..1ce7445 100644 --- a/oracle/onchain.go +++ b/oracle/onchain.go @@ -23,6 +23,7 @@ import ( "github.com/dappnode/mev-sp-oracle/config" "github.com/dappnode/mev-sp-oracle/constants" "github.com/dappnode/mev-sp-oracle/contract" + "github.com/dappnode/mev-sp-oracle/eigenLayer/manager" "github.com/dappnode/mev-sp-oracle/utils" "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/accounts/abi/bind" @@ -53,15 +54,16 @@ type EpochDuties struct { var ProposalDutyCache EpochDuties type Onchain struct { - ConsensusClient *http.Service - ExecutionClient *ethclient.Client - Contract *contract.Contract - NumRetries int - updaterKey *ecdsa.PrivateKey - UpdaterAddress common.Address - PoolAddress string - ChainId uint64 - validators map[phase0.ValidatorIndex]*v1.Validator + ConsensusClient *http.Service + ExecutionClient *ethclient.Client + Contract *contract.Contract + EigenManagerContract *manager.ManagerCaller + NumRetries int + updaterKey *ecdsa.PrivateKey + UpdaterAddress common.Address + PoolAddress string + ChainId uint64 + validators map[phase0.ValidatorIndex]*v1.Validator } func NewOnchain(cliCfg *config.CliConfig, updaterKey *ecdsa.PrivateKey) (*Onchain, error) { @@ -138,23 +140,51 @@ func NewOnchain(cliCfg *config.CliConfig, updaterKey *ecdsa.PrivateKey) (*Onchai return nil, errors.Wrap(err, "Error instantiating contract") } + // Instantiate the EigenManager contract to run get/set operations on it + eigenManagerAddress := common.HexToAddress(cliCfg.EigenManagerAddress) + eigenManagerContract, err := manager.NewManagerCaller(eigenManagerAddress, executionClient) + if err != nil { + return nil, errors.Wrap(err, "Error instantiating EigenManager contract") + } + var updaterAddress common.Address if updaterKey != nil { updaterAddress = crypto.PubkeyToAddress(updaterKey.PublicKey) } return &Onchain{ - ConsensusClient: consensusClient, - ExecutionClient: executionClient, - PoolAddress: cliCfg.PoolAddress, - Contract: contract, - NumRetries: cliCfg.NumRetries, - ChainId: uint64(chainId.Int64()), - updaterKey: updaterKey, - UpdaterAddress: updaterAddress, + ConsensusClient: consensusClient, + ExecutionClient: executionClient, + PoolAddress: cliCfg.PoolAddress, + Contract: contract, + EigenManagerContract: eigenManagerContract, + NumRetries: cliCfg.NumRetries, + ChainId: uint64(chainId.Int64()), + updaterKey: updaterKey, + UpdaterAddress: updaterAddress, }, nil } +// Gets the Pod from a given owner address. If no pods are found, returns an empty address +func (o *Onchain) GetOwnerToPod(address common.Address, opts ...retry.Option) (common.Address, error) { + var podAddress common.Address + err := retry.Do( + func() error { + callOpts := &bind.CallOpts{Context: context.Background(), Pending: false} + var err error + podAddress, err = o.EigenManagerContract.OwnerToPod(callOpts, address) + if err != nil { + log.Warn("Failed attempt to get pod from contract: ", err.Error(), " Retrying...") + return errors.New("could not get pod from contract: " + err.Error()) + } + return nil + }, o.GetRetryOpts(opts)...) + if err != nil { + return common.Address{}, errors.New("could not get pod from contract: " + err.Error()) + } + return podAddress, nil +} + func (o *Onchain) AreNodesInSync(opts ...retry.Option) (bool, error) { var err error var execSync *ethereum.SyncProgress diff --git a/oracle/oracle.go b/oracle/oracle.go index ef61361..caa0f11 100644 --- a/oracle/oracle.go +++ b/oracle/oracle.go @@ -20,6 +20,7 @@ import ( "github.com/attestantio/go-eth2-client/spec/phase0" "github.com/dappnode/mev-sp-oracle/contract" "github.com/dappnode/mev-sp-oracle/utils" + "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" log "github.com/sirupsen/logrus" ) @@ -29,12 +30,14 @@ var StateFolder = "oracle-data" var StateJsonName = "state.json" type GetSetOfValidatorsFunc func(valIndices []phase0.ValidatorIndex, slot string, opts ...retry.Option) (map[phase0.ValidatorIndex]*v1.Validator, error) +type GetOwnerToPodFunc func(address common.Address, opts ...retry.Option) (common.Address, error) type Oracle struct { cfg *Config state *OracleState mutex sync.RWMutex getSetOfValidators GetSetOfValidatorsFunc + getOwnerToPod GetOwnerToPodFunc } // Fork 1 changes two things: @@ -77,6 +80,7 @@ func NewOracle(cfg *Config) *Oracle { cfg: cfg, state: state, getSetOfValidators: nil, + getOwnerToPod: nil, } return oracle @@ -86,6 +90,10 @@ func (or *Oracle) SetGetSetOfValidatorsFunc(oc GetSetOfValidatorsFunc) { or.getSetOfValidators = oc } +func (or *Oracle) SetOwnerToPodFunc(oc GetOwnerToPodFunc) { + or.getOwnerToPod = oc +} + // Returns the state of the oracle, containing all the information about the // validatores, with their state, balances, etc func (or *Oracle) State() *OracleState { @@ -1015,7 +1023,30 @@ func (or *Oracle) handleManualSubscriptions( } // Subscription received from an address that is not the validator withdrawal address + // AND sender is not the owner of a pod which staked validators include this transaction validator index if !utils.Equals(sender, validatorWithdrawal) { + + // Check if the sender is the owner of a pod which staked validators include this transaction validator index + // If it is, we allow the subscription + podAddress, err := or.getOwnerToPod(sub.Sender) + if err != nil { + log.Fatal("Error getting pod address from owner: ", err) + } + if podAddress == (common.Address{}) { + log.WithFields(log.Fields{ + "BlockNumber": sub.Raw.BlockNumber, + "Collateral": sub.SubscriptionCollateral, + "TxHash": sub.Raw.TxHash, + "ValidatorIndex": valIdx, + "Sender": sender, + "ValidatorWithdrawal": validatorWithdrawal, + }).Warn("[Subscription] Sender is not validator withdrawal and has no EigenPod") + or.sendRewardToPool(collateral) + continue + } + + //TODO: filter events of eigenPod contract at address "podAddress" by ValidatorRestaked event + log.WithFields(log.Fields{ "BlockNumber": sub.Raw.BlockNumber, "Collateral": sub.SubscriptionCollateral, From a25333b4c6f5ab755947797c99f1d04ce525117c Mon Sep 17 00:00:00 2001 From: Marketen Date: Tue, 28 Jan 2025 20:35:52 +0100 Subject: [PATCH 7/7] filter validatorRestaked events --- main.go | 1 + oracle/onchain.go | 60 ++++++++++++++++++++++++++++++++++++++++++++++ oracle/oracle.go | 61 +++++++++++++++++++++++++++++++---------------- 3 files changed, 102 insertions(+), 20 deletions(-) diff --git a/main.go b/main.go index a194c6b..2360e81 100644 --- a/main.go +++ b/main.go @@ -130,6 +130,7 @@ func main() { oracleInstance := oracle.NewOracle(cfg) oracleInstance.SetGetSetOfValidatorsFunc(onchain.GetSetOfValidators) oracleInstance.SetOwnerToPodFunc(onchain.GetOwnerToPod) + oracleInstance.SetValidatorRestakedEventsFunc(onchain.GetValidatorRestakedEvents) // If checkpoint sync url is provided, load state from it if cliCfg.CheckPointSyncUrl != "" { diff --git a/oracle/onchain.go b/oracle/onchain.go index 1ce7445..f534560 100644 --- a/oracle/onchain.go +++ b/oracle/onchain.go @@ -24,6 +24,7 @@ import ( "github.com/dappnode/mev-sp-oracle/constants" "github.com/dappnode/mev-sp-oracle/contract" "github.com/dappnode/mev-sp-oracle/eigenLayer/manager" + "github.com/dappnode/mev-sp-oracle/eigenLayer/pod" "github.com/dappnode/mev-sp-oracle/utils" "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/accounts/abi/bind" @@ -185,6 +186,65 @@ func (o *Onchain) GetOwnerToPod(address common.Address, opts ...retry.Option) (c return podAddress, nil } +// GetValidatorRestakedEvents fetches all "ValidatorRestaked" events from the Pod +// contract at podAddress, returning a slice of the validator indices. +// TODO: think if we could filter by a specific validator index. +func (o *Onchain) GetValidatorRestakedEvents( + podAddress common.Address, + opts ...retry.Option, +) ([]*big.Int, error) { + + var validatorIndices []*big.Int + + // Retry logic in case of timeouts or transient failures + err := retry.Do( + func() error { + // Instantiate the Pod contract + podContract, err := pod.NewPod(podAddress, o.ExecutionClient) + if err != nil { + log.Warn("Failed to instantiate Pod contract: ", err) + return errors.Wrap(err, "failed to instantiate Pod contract") + } + + // Filter from block 0 up to the latest block (nil) + filterOpts := &bind.FilterOpts{ + Start: 0, + End: nil, + Context: context.Background(), + } + + iter, err := podContract.FilterValidatorRestaked(filterOpts) + if err != nil { + log.Warn("Failed to filter ValidatorRestaked events: ", err) + return errors.Wrap(err, "failed to filter ValidatorRestaked events") + } + defer iter.Close() + + // Iterate over all events found + for iter.Next() { + event := iter.Event + // Collect the validator index + validatorIndices = append(validatorIndices, event.ValidatorIndex) + } + + // Check for iteration errors + if err := iter.Error(); err != nil { + log.Warn("Error iterating over ValidatorRestaked events: ", err) + return errors.Wrap(err, "error iterating over ValidatorRestaked events") + } + + return nil + }, + o.GetRetryOpts(opts)..., + ) + + if err != nil { + return nil, err + } + + return validatorIndices, nil +} + func (o *Onchain) AreNodesInSync(opts ...retry.Option) (bool, error) { var err error var execSync *ethereum.SyncProgress diff --git a/oracle/oracle.go b/oracle/oracle.go index caa0f11..5993dfd 100644 --- a/oracle/oracle.go +++ b/oracle/oracle.go @@ -31,13 +31,14 @@ var StateJsonName = "state.json" type GetSetOfValidatorsFunc func(valIndices []phase0.ValidatorIndex, slot string, opts ...retry.Option) (map[phase0.ValidatorIndex]*v1.Validator, error) type GetOwnerToPodFunc func(address common.Address, opts ...retry.Option) (common.Address, error) - +type GetValidatorRestakedEvents func(podAddress common.Address, opts ...retry.Option) ([]*big.Int, error) type Oracle struct { - cfg *Config - state *OracleState - mutex sync.RWMutex - getSetOfValidators GetSetOfValidatorsFunc - getOwnerToPod GetOwnerToPodFunc + cfg *Config + state *OracleState + mutex sync.RWMutex + getSetOfValidators GetSetOfValidatorsFunc + getOwnerToPod GetOwnerToPodFunc + getValidatorRestakedEvents GetValidatorRestakedEvents } // Fork 1 changes two things: @@ -94,6 +95,10 @@ func (or *Oracle) SetOwnerToPodFunc(oc GetOwnerToPodFunc) { or.getOwnerToPod = oc } +func (or *Oracle) SetValidatorRestakedEventsFunc(oc GetValidatorRestakedEvents) { + or.getValidatorRestakedEvents = oc +} + // Returns the state of the oracle, containing all the information about the // validatores, with their state, balances, etc func (or *Oracle) State() *OracleState { @@ -1032,6 +1037,8 @@ func (or *Oracle) handleManualSubscriptions( if err != nil { log.Fatal("Error getting pod address from owner: ", err) } + + // if returned address is null, means the sender is not the owner of a pod if podAddress == (common.Address{}) { log.WithFields(log.Fields{ "BlockNumber": sub.Raw.BlockNumber, @@ -1040,24 +1047,38 @@ func (or *Oracle) handleManualSubscriptions( "ValidatorIndex": valIdx, "Sender": sender, "ValidatorWithdrawal": validatorWithdrawal, - }).Warn("[Subscription] Sender is not validator withdrawal and has no EigenPod") + }).Warn("[Subscription] TX Sender is not the validator withdrawal address and has no EigenPod ownership, skipping") or.sendRewardToPool(collateral) continue } + //filter events of eigenPod contract at address "podAddress" by ValidatorRestaked event and return the validators found + validators, err := or.getValidatorRestakedEvents(podAddress) + if err != nil { + log.Fatal("Error getting ValidatorRestaked events: ", err) + } + // Check if the sender is the owner of a pod which staked validators include this transaction validator index + // If it is, we allow the subscription. valIdx is uint64 and returned validators is an array of bigints, so we need to convert + isOwner := false + for _, v := range validators { + if valIdx == v.Uint64() { + isOwner = true + break + } + } - //TODO: filter events of eigenPod contract at address "podAddress" by ValidatorRestaked event - - log.WithFields(log.Fields{ - "BlockNumber": sub.Raw.BlockNumber, - "Collateral": sub.SubscriptionCollateral, - "TxHash": sub.Raw.TxHash, - "ValidatorIndex": valIdx, - "Sender": sender, - "ValidatorWithdrawal": validatorWithdrawal, - }).Warn("[Subscription]: but tx sender is not the validator withdrawal address, skipping") - // Fees go to the pool. - or.sendRewardToPool(collateral) - continue + if !isOwner { + log.WithFields(log.Fields{ + "BlockNumber": sub.Raw.BlockNumber, + "Collateral": sub.SubscriptionCollateral, + "TxHash": sub.Raw.TxHash, + "ValidatorIndex": valIdx, + "Sender": sender, + "ValidatorWithdrawal": validatorWithdrawal, + }).Warn("[Subscription]: TX sender not the validator withdrawal address and it's pod does not own the validator, skipping") + // Fees go to the pool. + or.sendRewardToPool(collateral) + continue + } } // Subscription received for a banned validator