diff --git a/bridges/ethMultiversX/bridgeExecutor.go b/bridges/ethMultiversX/bridgeExecutor.go index 2570dda8..5b2280d9 100644 --- a/bridges/ethMultiversX/bridgeExecutor.go +++ b/bridges/ethMultiversX/bridgeExecutor.go @@ -3,11 +3,13 @@ package ethmultiversx import ( "context" "fmt" + "math/big" "time" "github.com/ethereum/go-ethereum/common" "github.com/multiversx/mx-bridge-eth-go/clients" "github.com/multiversx/mx-bridge-eth-go/core" + "github.com/multiversx/mx-bridge-eth-go/core/batchProcessor" "github.com/multiversx/mx-chain-core-go/core/check" logger "github.com/multiversx/mx-chain-logger-go" ) @@ -178,7 +180,7 @@ func (executor *bridgeExecutor) GetLastExecutedEthBatchIDFromMultiversX(ctx cont return batchID, err } -// VerifyLastDepositNonceExecutedOnEthereumBatch will check the deposit nonces from the fetched batch from Ethereum client +// VerifyLastDepositNonceExecutedOnEthereumBatch will check the deposit Nonces from the fetched batch from Ethereum client func (executor *bridgeExecutor) VerifyLastDepositNonceExecutedOnEthereumBatch(ctx context.Context) error { if executor.batch == nil { return ErrNilBatch @@ -403,6 +405,7 @@ func (executor *bridgeExecutor) PerformActionOnMultiversX(ctx context.Context) e return ErrNilBatch } + // TODO: check mintBurn balances before performing the action hash, err := executor.multiversXClient.PerformAction(ctx, executor.actionID, executor.batch) if err != nil { return err @@ -467,7 +470,12 @@ func (executor *bridgeExecutor) SignTransferOnEthereum() error { return ErrNilBatch } - hash, err := executor.ethereumClient.GenerateMessageHash(executor.batch) + argLists, err := batchProcessor.ExtractList(executor.batch) + if err != nil { + return err + } + + hash, err := executor.ethereumClient.GenerateMessageHash(argLists, executor.batch.ID) if err != nil { return err } @@ -493,7 +501,19 @@ func (executor *bridgeExecutor) PerformTransferOnEthereum(ctx context.Context) e executor.log.Debug("fetched quorum size", "quorum", quorumSize.Int64()) - hash, err := executor.ethereumClient.ExecuteTransfer(ctx, executor.msgHash, executor.batch, int(quorumSize.Int64())) + argLists, err := batchProcessor.ExtractList(executor.batch) + if err != nil { + return err + } + + err = executor.checkAvailableTokensOnEthereum(ctx, argLists.Tokens, argLists.ConvertedTokenBytes, argLists.Amounts) + if err != nil { + return err + } + + executor.log.Info("executing transfer " + executor.batch.String()) + + hash, err := executor.ethereumClient.ExecuteTransfer(ctx, executor.msgHash, argLists, executor.batch.ID, int(quorumSize.Int64())) if err != nil { return err } @@ -504,6 +524,103 @@ func (executor *bridgeExecutor) PerformTransferOnEthereum(ctx context.Context) e return nil } +func (executor *bridgeExecutor) checkCumulatedTransfers(ctx context.Context, tokens []common.Address, convertedTokens [][]byte, amounts []*big.Int) error { + for i, token := range tokens { + err := executor.checkToken(ctx, token, convertedTokens[i], amounts[i]) + if err != nil { + return err + } + } + return nil +} + +func (executor *bridgeExecutor) checkToken(ctx context.Context, token common.Address, convertedToken []byte, amount *big.Int) error { + isMintBurnToken, err := executor.isMintBurnToken(ctx, token, convertedToken) + if err != nil { + return err + } + + if isMintBurnToken { + return executor.checkRequiredMintBurnBalance(ctx, token, convertedToken) + } + + return executor.ethereumClient.CheckRequiredBalance(ctx, token, amount) +} + +func (executor *bridgeExecutor) isMintBurnToken(ctx context.Context, token common.Address, convertedToken []byte) (bool, error) { + isMintBurnOnEthereum := executor.isMintBurnOnEthereum(ctx, token) + isMintBurnOnMultiversX := executor.isMintBurnOnMultiversX(ctx, convertedToken) + if isMintBurnOnEthereum != isMintBurnOnMultiversX { + return false, fmt.Errorf("%w isMintBurnOnEthereum = %v, isMintBurnOnMultiversX = %v", ErrInvalidSetupMintBurnToken, isMintBurnOnEthereum, isMintBurnOnMultiversX) + } + return isMintBurnOnEthereum, nil +} + +func (executor *bridgeExecutor) checkRequiredMintBurnBalance(ctx context.Context, token common.Address, convertedToken []byte) error { + mintedBalance, err := executor.ethereumClient.TokenMintedBalances(ctx, token) + if err != nil { + return err + } + + burntBalance, err := executor.multiversXClient.AccumulatedBurnedTokens(ctx, convertedToken) + if err != nil { + return err + } + if mintedBalance.Cmp(burntBalance) != 0 { + return fmt.Errorf("%w, minted: %s, burnt: %s for ERC20 token %s/ ESDT token %s", + ErrMintBurnBalance, mintedBalance.String(), burntBalance.String(), token.String(), convertedToken) + } + return nil +} + +func (executor *bridgeExecutor) isMintBurnOnEthereum(ctx context.Context, erc20Address common.Address) bool { + isMintBurn, err := executor.ethereumClient.WhitelistedTokensMintBurn(ctx, erc20Address) + if err != nil { + return false + } + return isMintBurn +} + +func (executor *bridgeExecutor) isMintBurnOnMultiversX(ctx context.Context, token []byte) bool { + + isMintBurn, err := executor.multiversXClient.IsMintBurnAllowed(ctx, token) + if err != nil { + return false + } + return isMintBurn +} + +func (executor *bridgeExecutor) checkAvailableTokensOnEthereum(ctx context.Context, tokens []common.Address, convertedTokens [][]byte, amounts []*big.Int) error { + tokens, convertedTokens, amounts = executor.getCumulatedTransfers(tokens, convertedTokens, amounts) + + return executor.checkCumulatedTransfers(ctx, tokens, convertedTokens, amounts) +} + +func (executor *bridgeExecutor) getCumulatedTransfers(tokens []common.Address, convertedTokens [][]byte, amounts []*big.Int) ([]common.Address, [][]byte, []*big.Int) { + cumulatedAmounts := make(map[common.Address]*big.Int) + uniqueTokens := make([]common.Address, 0) + uniqueConvertedTokens := make([][]byte, 0) + + for i, token := range tokens { + existingValue, exists := cumulatedAmounts[token] + if exists { + existingValue.Add(existingValue, amounts[i]) + continue + } + + cumulatedAmounts[token] = amounts[i] + uniqueTokens = append(uniqueTokens, token) + uniqueConvertedTokens = append(uniqueConvertedTokens, convertedTokens[i]) + } + + finalAmounts := make([]*big.Int, len(uniqueTokens)) + for i, token := range uniqueTokens { + finalAmounts[i] = cumulatedAmounts[token] + } + + return uniqueTokens, uniqueConvertedTokens, finalAmounts +} + // ProcessQuorumReachedOnEthereum returns true if the proposed transfer reached the set quorum func (executor *bridgeExecutor) ProcessQuorumReachedOnEthereum(ctx context.Context) (bool, error) { return executor.ethereumClient.IsQuorumReached(ctx, executor.msgHash) diff --git a/bridges/ethMultiversX/bridgeExecutor_test.go b/bridges/ethMultiversX/bridgeExecutor_test.go index 3cfc5421..49f3cfa2 100644 --- a/bridges/ethMultiversX/bridgeExecutor_test.go +++ b/bridges/ethMultiversX/bridgeExecutor_test.go @@ -12,6 +12,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/multiversx/mx-bridge-eth-go/clients" "github.com/multiversx/mx-bridge-eth-go/core" + "github.com/multiversx/mx-bridge-eth-go/core/batchProcessor" "github.com/multiversx/mx-bridge-eth-go/testsCommon" bridgeTests "github.com/multiversx/mx-bridge-eth-go/testsCommon/bridge" "github.com/multiversx/mx-chain-core-go/core/check" @@ -1083,7 +1084,7 @@ func TestMultiversXToEthBridgeExecutor_SignTransferOnEthereum(t *testing.T) { args := createMockExecutorArgs() args.EthereumClient = &bridgeTests.EthereumClientStub{ - GenerateMessageHashCalled: func(batch *clients.TransferBatch) (common.Hash, error) { + GenerateMessageHashCalled: func(batch *batchProcessor.ArgListsBatch, batchID uint64) (common.Hash, error) { return common.Hash{}, expectedErr }, } @@ -1100,7 +1101,7 @@ func TestMultiversXToEthBridgeExecutor_SignTransferOnEthereum(t *testing.T) { wasCalledBroadcastSignatureForMessageHashCalled := false args := createMockExecutorArgs() args.EthereumClient = &bridgeTests.EthereumClientStub{ - GenerateMessageHashCalled: func(batch *clients.TransferBatch) (common.Hash, error) { + GenerateMessageHashCalled: func(batch *batchProcessor.ArgListsBatch, batchID uint64) (common.Hash, error) { wasCalledGenerateMessageHashCalled = true return common.Hash{}, nil }, @@ -1153,7 +1154,7 @@ func TestMultiversXToEthBridgeExecutor_PerformTransferOnEthereum(t *testing.T) { GetQuorumSizeCalled: func(ctx context.Context) (*big.Int, error) { return big.NewInt(0), nil }, - ExecuteTransferCalled: func(ctx context.Context, msgHash common.Hash, batch *clients.TransferBatch, quorum int) (string, error) { + ExecuteTransferCalled: func(ctx context.Context, msgHash common.Hash, batch *batchProcessor.ArgListsBatch, batchId uint64, quorum int) (string, error) { return "", expectedErr }, } @@ -1176,9 +1177,16 @@ func TestMultiversXToEthBridgeExecutor_PerformTransferOnEthereum(t *testing.T) { wasCalledGetQuorumSizeCalled = true return big.NewInt(int64(providedQuorum)), nil }, - ExecuteTransferCalled: func(ctx context.Context, msgHash common.Hash, batch *clients.TransferBatch, quorum int) (string, error) { + ExecuteTransferCalled: func(ctx context.Context, msgHash common.Hash, batch *batchProcessor.ArgListsBatch, batchId uint64, quorum int) (string, error) { assert.True(t, providedHash == msgHash) - assert.True(t, providedBatch == batch) + assert.True(t, providedBatch.ID == batchId) + for i := 0; i < len(providedBatch.Deposits); i++ { + assert.Equal(t, providedBatch.Deposits[i].Amount, batch.Amounts[i]) + assert.Equal(t, providedBatch.Deposits[i].Nonce, batch.Nonces[i].Uint64()) + assert.Equal(t, providedBatch.Deposits[i].ToBytes, batch.Recipients[i].Bytes()) + assert.Equal(t, providedBatch.Deposits[i].TokenBytes, batch.Tokens[i].Bytes()) + assert.Equal(t, providedBatch.Deposits[i].ConvertedTokenBytes, batch.ConvertedTokenBytes[i]) + } assert.True(t, providedQuorum == quorum) wasCalledExecuteTransferCalled = true diff --git a/bridges/ethMultiversX/errors.go b/bridges/ethMultiversX/errors.go index 9749d127..0fbe868c 100644 --- a/bridges/ethMultiversX/errors.go +++ b/bridges/ethMultiversX/errors.go @@ -40,3 +40,9 @@ var ErrNilSignaturesHolder = errors.New("nil signatures holder") // ErrNilBatchValidator signals that a nil batch validator was provided var ErrNilBatchValidator = errors.New("nil batch validator") + +// ErrInvalidSetupMintBurnToken signals that an invalid setup mint burn token was provided +var ErrInvalidSetupMintBurnToken = errors.New("invalid setup mint burn token") + +// ErrMintBurnBalance signals that the mint burn balances are not expected +var ErrMintBurnBalance = errors.New("mint burn balances are not expected") diff --git a/bridges/ethMultiversX/interface.go b/bridges/ethMultiversX/interface.go index 63a6f706..d6120ea6 100644 --- a/bridges/ethMultiversX/interface.go +++ b/bridges/ethMultiversX/interface.go @@ -6,6 +6,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/multiversx/mx-bridge-eth-go/clients" + "github.com/multiversx/mx-bridge-eth-go/core/batchProcessor" ) // MultiversXClient defines the behavior of the MultiversX client able to communicate with the MultiversX chain @@ -29,6 +30,8 @@ type MultiversXClient interface { WasSigned(ctx context.Context, actionID uint64) (bool, error) PerformAction(ctx context.Context, actionID uint64, batch *clients.TransferBatch) (string, error) CheckClientAvailability(ctx context.Context) error + IsMintBurnAllowed(ctx context.Context, token []byte) (bool, error) + AccumulatedBurnedTokens(ctx context.Context, token []byte) (*big.Int, error) Close() error IsInterfaceNil() bool } @@ -37,14 +40,17 @@ type MultiversXClient interface { type EthereumClient interface { GetBatch(ctx context.Context, nonce uint64) (*clients.TransferBatch, error) WasExecuted(ctx context.Context, batchID uint64) (bool, error) - GenerateMessageHash(batch *clients.TransferBatch) (common.Hash, error) + GenerateMessageHash(batch *batchProcessor.ArgListsBatch, batchId uint64) (common.Hash, error) BroadcastSignatureForMessageHash(msgHash common.Hash) - ExecuteTransfer(ctx context.Context, msgHash common.Hash, batch *clients.TransferBatch, quorum int) (string, error) + ExecuteTransfer(ctx context.Context, msgHash common.Hash, batch *batchProcessor.ArgListsBatch, batchId uint64, quorum int) (string, error) GetTransactionsStatuses(ctx context.Context, batchId uint64) ([]byte, error) GetQuorumSize(ctx context.Context) (*big.Int, error) IsQuorumReached(ctx context.Context, msgHash common.Hash) (bool, error) CheckClientAvailability(ctx context.Context) error + CheckRequiredBalance(ctx context.Context, erc20Address common.Address, value *big.Int) error + TokenMintedBalances(ctx context.Context, token common.Address) (*big.Int, error) + WhitelistedTokensMintBurn(ctx context.Context, token common.Address) (bool, error) IsInterfaceNil() bool } diff --git a/clients/ethereum/client.go b/clients/ethereum/client.go index 9062c3f3..c46bddbb 100644 --- a/clients/ethereum/client.go +++ b/clients/ethereum/client.go @@ -14,6 +14,7 @@ import ( "github.com/multiversx/mx-bridge-eth-go/bridges/ethMultiversX" "github.com/multiversx/mx-bridge-eth-go/clients" "github.com/multiversx/mx-bridge-eth-go/core" + "github.com/multiversx/mx-bridge-eth-go/core/batchProcessor" chainCore "github.com/multiversx/mx-chain-core-go/core" "github.com/multiversx/mx-chain-core-go/core/check" ) @@ -24,13 +25,6 @@ const ( minAllowedDelta = 1 ) -type argListsBatch struct { - tokens []common.Address - recipients []common.Address - amounts []*big.Int - nonces []*big.Int -} - // ArgsEthereumClient is the DTO used in the ethereum's client constructor type ArgsEthereumClient struct { ClientWrapper ClientWrapper @@ -221,7 +215,7 @@ func (c *client) BroadcastSignatureForMessageHash(msgHash common.Hash) { } // GenerateMessageHash will generate the message hash based on the provided batch -func (c *client) GenerateMessageHash(batch *clients.TransferBatch) (common.Hash, error) { +func (c *client) GenerateMessageHash(batch *batchProcessor.ArgListsBatch, batchId uint64) (common.Hash, error) { if batch == nil { return common.Hash{}, clients.ErrNilBatch } @@ -231,12 +225,7 @@ func (c *client) GenerateMessageHash(batch *clients.TransferBatch) (common.Hash, return common.Hash{}, err } - argLists, err := c.extractList(batch) - if err != nil { - return common.Hash{}, err - } - - pack, err := args.Pack(argLists.recipients, argLists.tokens, argLists.amounts, argLists.nonces, big.NewInt(0).SetUint64(batch.ID), "ExecuteBatchedTransfer") + pack, err := args.Pack(batch.Recipients, batch.Tokens, batch.Amounts, batch.Nonces, big.NewInt(0).SetUint64(batchId), "ExecuteBatchedTransfer") if err != nil { return common.Hash{}, err } @@ -276,34 +265,15 @@ func generateTransferArgs() (abi.Arguments, error) { }, nil } -func (c *client) extractList(batch *clients.TransferBatch) (argListsBatch, error) { - arg := argListsBatch{} - - for _, dt := range batch.Deposits { - recipient := common.BytesToAddress(dt.ToBytes) - arg.recipients = append(arg.recipients, recipient) - - token := common.BytesToAddress(dt.ConvertedTokenBytes) - arg.tokens = append(arg.tokens, token) - - amount := big.NewInt(0).Set(dt.Amount) - arg.amounts = append(arg.amounts, amount) - - nonce := big.NewInt(0).SetUint64(dt.Nonce) - arg.nonces = append(arg.nonces, nonce) - } - - return arg, nil -} - // ExecuteTransfer will initiate and send the transaction from the transfer batch struct func (c *client) ExecuteTransfer( ctx context.Context, msgHash common.Hash, - batch *clients.TransferBatch, + argLists *batchProcessor.ArgListsBatch, + batchId uint64, quorum int, ) (string, error) { - if batch == nil { + if argLists == nil { return "", clients.ErrNilBatch } @@ -315,8 +285,6 @@ func (c *client) ExecuteTransfer( return "", fmt.Errorf("%w in client.ExecuteTransfer", clients.ErrMultisigContractPaused) } - c.log.Info("executing transfer " + batch.String()) - fromAddress := crypto.PubkeyToAddress(*c.publicKey) nonce, err := c.getNonce(ctx, fromAddress) @@ -341,7 +309,7 @@ func (c *client) ExecuteTransfer( auth.Nonce = big.NewInt(nonce) auth.Value = big.NewInt(0) - auth.GasLimit = c.transferGasLimitBase + uint64(len(batch.Deposits))*c.transferGasLimitForEach + auth.GasLimit = c.transferGasLimitBase + uint64(len(argLists.Tokens))*c.transferGasLimitForEach auth.Context = ctx auth.GasPrice = gasPrice @@ -355,16 +323,6 @@ func (c *client) ExecuteTransfer( signatures = signatures[:quorum] } - argLists, err := c.extractList(batch) - if err != nil { - return "", err - } - - err = c.checkAvailableTokens(ctx, argLists.tokens, argLists.amounts) - if err != nil { - return "", err - } - minimumForFee := big.NewInt(int64(auth.GasLimit)) minimumForFee.Mul(minimumForFee, auth.GasPrice) err = c.checkRelayerFundsForFee(ctx, minimumForFee) @@ -372,8 +330,8 @@ func (c *client) ExecuteTransfer( return "", err } - batchID := big.NewInt(0).SetUint64(batch.ID) - tx, err := c.clientWrapper.ExecuteTransfer(auth, argLists.tokens, argLists.recipients, argLists.amounts, argLists.nonces, batchID, signatures) + batchID := big.NewInt(0).SetUint64(batchId) + tx, err := c.clientWrapper.ExecuteTransfer(auth, argLists.Tokens, argLists.Recipients, argLists.Amounts, argLists.Nonces, batchID, signatures) if err != nil { return "", err } @@ -426,47 +384,35 @@ func (c *client) setStatusForAvailabilityCheck(status ethmultiversx.ClientStatus c.clientWrapper.SetIntMetric(core.MetricLastBlockNonce, int(nonce)) } -func (c *client) checkAvailableTokens(ctx context.Context, tokens []common.Address, amounts []*big.Int) error { - transfers := c.getCumulatedTransfers(tokens, amounts) - - return c.checkCumulatedTransfers(ctx, transfers) -} - -func (c *client) getCumulatedTransfers(tokens []common.Address, amounts []*big.Int) map[common.Address]*big.Int { - transfers := make(map[common.Address]*big.Int) - for i, token := range tokens { - existing, found := transfers[token] - if !found { - existing = big.NewInt(0) - transfers[token] = existing - } - - existing.Add(existing, amounts[i]) +// CheckRequiredBalance will check if the safe has enough balance for the transfer +func (c *client) CheckRequiredBalance(ctx context.Context, erc20Address common.Address, value *big.Int) error { + existingBalance, err := c.erc20ContractsHandler.BalanceOf(ctx, erc20Address, c.safeContractAddress) + if err != nil { + return fmt.Errorf("%w for address %s for ERC20 token %s", err, c.safeContractAddress.String(), erc20Address.String()) } - return transfers -} + if value.Cmp(existingBalance) > 0 { + return fmt.Errorf("%w, existing: %s, required: %s for ERC20 token %s and address %s", + errInsufficientErc20Balance, existingBalance.String(), value.String(), erc20Address.String(), c.safeContractAddress.String()) + } -func (c *client) checkCumulatedTransfers(ctx context.Context, transfers map[common.Address]*big.Int) error { - for erc20Address, value := range transfers { - existingBalance, err := c.erc20ContractsHandler.BalanceOf(ctx, erc20Address, c.safeContractAddress) - if err != nil { - return fmt.Errorf("%w for address %s for ERC20 token %s", err, c.safeContractAddress.String(), erc20Address.String()) - } + c.log.Debug("checked ERC20 balance", + "ERC20 token", erc20Address.String(), + "address", c.safeContractAddress.String(), + "existing balance", existingBalance.String(), + "needed", value.String()) - if value.Cmp(existingBalance) > 0 { - return fmt.Errorf("%w, existing: %s, required: %s for ERC20 token %s and address %s", - errInsufficientErc20Balance, existingBalance.String(), value.String(), erc20Address.String(), c.safeContractAddress.String()) - } + return nil +} - c.log.Debug("checked ERC20 balance", - "ERC20 token", erc20Address.String(), - "address", c.safeContractAddress.String(), - "existing balance", existingBalance.String(), - "needed", value.String()) - } +// TokenMintedBalances returns the minted balance of the given token +func (c *client) TokenMintedBalances(ctx context.Context, token common.Address) (*big.Int, error) { + return c.clientWrapper.TokenMintedBalances(ctx, token) +} - return nil +// WhitelistedTokensMintBurn returns true if the token is whitelisted as a mintBurn token +func (c *client) WhitelistedTokensMintBurn(ctx context.Context, token common.Address) (bool, error) { + return c.clientWrapper.WhitelistedTokensMintBurn(ctx, token) } func (c *client) checkRelayerFundsForFee(ctx context.Context, transferFee *big.Int) error { diff --git a/clients/ethereum/client_test.go b/clients/ethereum/client_test.go index 0e7aa2e4..12229078 100644 --- a/clients/ethereum/client_test.go +++ b/clients/ethereum/client_test.go @@ -17,6 +17,7 @@ import ( "github.com/multiversx/mx-bridge-eth-go/clients" "github.com/multiversx/mx-bridge-eth-go/clients/ethereum/contract" bridgeCore "github.com/multiversx/mx-bridge-eth-go/core" + "github.com/multiversx/mx-bridge-eth-go/core/batchProcessor" "github.com/multiversx/mx-bridge-eth-go/core/converters" "github.com/multiversx/mx-bridge-eth-go/testsCommon" bridgeTests "github.com/multiversx/mx-bridge-eth-go/testsCommon/bridge" @@ -317,7 +318,7 @@ func TestClient_GetBatch(t *testing.T) { { Nonce: 10, ToBytes: recipient1.AddressBytes(), - DisplayableTo: recipient1.AddressAsBech32String(), + DisplayableTo: c.addressConverter.ToBech32String(recipient1.AddressBytes()), FromBytes: from1[:], DisplayableFrom: hex.EncodeToString(from1[:]), TokenBytes: token1[:], @@ -328,7 +329,7 @@ func TestClient_GetBatch(t *testing.T) { { Nonce: 30, ToBytes: recipient2.AddressBytes(), - DisplayableTo: recipient2.AddressAsBech32String(), + DisplayableTo: c.addressConverter.ToBech32String(recipient2.AddressBytes()), FromBytes: from2[:], DisplayableFrom: hex.EncodeToString(from2[:]), TokenBytes: token2[:], @@ -355,20 +356,20 @@ func TestClient_GenerateMessageHash(t *testing.T) { t.Run("nil batch should error", func(t *testing.T) { c, _ := NewEthereumClient(args) - h, err := c.GenerateMessageHash(nil) + h, err := c.GenerateMessageHash(nil, 0) assert.Equal(t, common.Hash{}, h) assert.True(t, errors.Is(err, clients.ErrNilBatch)) }) t.Run("should work", func(t *testing.T) { c, _ := NewEthereumClient(args) - argLists, _ := c.extractList(batch) - assert.Equal(t, expectedAmounts, argLists.amounts) - assert.Equal(t, expectedTokens, argLists.tokens) - assert.Equal(t, expectedRecipients, argLists.recipients) - assert.Equal(t, expectedNonces, argLists.nonces) + argLists, _ := batchProcessor.ExtractList(batch) + assert.Equal(t, expectedAmounts, argLists.Amounts) + assert.Equal(t, expectedTokens, argLists.Tokens) + assert.Equal(t, expectedRecipients, argLists.Recipients) + assert.Equal(t, expectedNonces, argLists.Nonces) - h, err := c.GenerateMessageHash(batch) + h, err := c.GenerateMessageHash(argLists, batch.ID) assert.Nil(t, err) assert.Equal(t, "c68190e0a3b8d7c6bd966272a11d618ceddc4b38662b0a1610621f4d30ec07ca", hex.EncodeToString(h.Bytes())) }) @@ -420,6 +421,7 @@ func TestClient_ExecuteTransfer(t *testing.T) { args := createMockEthereumClientArgs() batch := createMockTransferBatch() + argLists, _ := batchProcessor.ExtractList(batch) signatures := make([][]byte, 10) for i := range signatures { signatures[i] = []byte(fmt.Sprintf("sig %d", i)) @@ -427,7 +429,7 @@ func TestClient_ExecuteTransfer(t *testing.T) { t.Run("nil batch", func(t *testing.T) { c, _ := NewEthereumClient(args) - hash, err := c.ExecuteTransfer(context.Background(), common.Hash{}, nil, 10) + hash, err := c.ExecuteTransfer(context.Background(), common.Hash{}, nil, 0, 10) assert.Equal(t, "", hash) assert.True(t, errors.Is(err, clients.ErrNilBatch)) }) @@ -439,7 +441,7 @@ func TestClient_ExecuteTransfer(t *testing.T) { return false, expectedErr }, } - hash, err := c.ExecuteTransfer(context.Background(), common.Hash{}, batch, 10) + hash, err := c.ExecuteTransfer(context.Background(), common.Hash{}, argLists, batch.ID, 10) assert.Equal(t, "", hash) assert.True(t, errors.Is(err, expectedErr)) }) @@ -450,7 +452,7 @@ func TestClient_ExecuteTransfer(t *testing.T) { return true, nil }, } - hash, err := c.ExecuteTransfer(context.Background(), common.Hash{}, batch, 10) + hash, err := c.ExecuteTransfer(context.Background(), common.Hash{}, argLists, batch.ID, 10) assert.Equal(t, "", hash) assert.True(t, errors.Is(err, clients.ErrMultisigContractPaused)) }) @@ -462,7 +464,7 @@ func TestClient_ExecuteTransfer(t *testing.T) { return 0, expectedErr }, } - hash, err := c.ExecuteTransfer(context.Background(), common.Hash{}, batch, 10) + hash, err := c.ExecuteTransfer(context.Background(), common.Hash{}, argLists, batch.ID, 10) assert.Equal(t, "", hash) assert.True(t, errors.Is(err, expectedErr)) }) @@ -474,7 +476,7 @@ func TestClient_ExecuteTransfer(t *testing.T) { return 0, expectedErr }, } - hash, err := c.ExecuteTransfer(context.Background(), common.Hash{}, batch, 10) + hash, err := c.ExecuteTransfer(context.Background(), common.Hash{}, argLists, batch.ID, 10) assert.Equal(t, "", hash) assert.True(t, errors.Is(err, expectedErr)) }) @@ -486,7 +488,7 @@ func TestClient_ExecuteTransfer(t *testing.T) { return big.NewInt(0), expectedErr }, } - hash, err := c.ExecuteTransfer(context.Background(), common.Hash{}, batch, 10) + hash, err := c.ExecuteTransfer(context.Background(), common.Hash{}, argLists, batch.ID, 10) assert.Equal(t, "", hash) assert.True(t, errors.Is(err, expectedErr)) }) @@ -498,7 +500,7 @@ func TestClient_ExecuteTransfer(t *testing.T) { return nil, expectedErr }, } - hash, err := c.ExecuteTransfer(context.Background(), common.Hash{}, batch, 10) + hash, err := c.ExecuteTransfer(context.Background(), common.Hash{}, argLists, batch.ID, 10) assert.Equal(t, "", hash) assert.True(t, errors.Is(err, expectedErr)) }) @@ -509,7 +511,7 @@ func TestClient_ExecuteTransfer(t *testing.T) { return signatures[:9] }, } - hash, err := c.ExecuteTransfer(context.Background(), common.Hash{}, batch, 10) + hash, err := c.ExecuteTransfer(context.Background(), common.Hash{}, argLists, batch.ID, 10) assert.Equal(t, "", hash) assert.True(t, errors.Is(err, errQuorumNotReached)) assert.True(t, strings.Contains(err.Error(), "num signatures: 9, quorum: 10")) @@ -548,65 +550,11 @@ func TestClient_ExecuteTransfer(t *testing.T) { Amount: big.NewInt(80), ConvertedTokenBytes: []byte("ERC20token1"), }) - - hash, err := c.ExecuteTransfer(context.Background(), common.Hash{}, newBatch, 9) + newArgLists, _ := batchProcessor.ExtractList(newBatch) + hash, err := c.ExecuteTransfer(context.Background(), common.Hash{}, newArgLists, newBatch.ID, 9) assert.Equal(t, "", hash) assert.True(t, errors.Is(err, errInsufficientBalance)) }) - t.Run("not enough erc20 balance", func(t *testing.T) { - c, _ := NewEthereumClient(args) - c.signatureHolder = &testsCommon.SignaturesHolderStub{ - SignaturesCalled: func(messageHash []byte) [][]byte { - return signatures[:9] - }, - } - c.erc20ContractsHandler = &bridgeTests.ERC20ContractsHolderStub{ - BalanceOfCalled: func(ctx context.Context, erc20Address common.Address, address common.Address) (*big.Int, error) { - assert.Equal(t, c.safeContractAddress, address) - tokenErc20 := common.BytesToAddress([]byte("ERC20token1")) - if erc20Address.String() == tokenErc20.String() { - return big.NewInt(99), nil - } - - return big.NewInt(1000000), nil - }, - } - - newBatch := batch.Clone() - newBatch.Deposits = append(newBatch.Deposits, &clients.DepositTransfer{ - Nonce: 40, - ToBytes: []byte("to3"), - DisplayableTo: "to3", - FromBytes: []byte("from3"), - DisplayableFrom: "from3", - TokenBytes: []byte("token1"), - DisplayableToken: "token1", - Amount: big.NewInt(80), - ConvertedTokenBytes: []byte("ERC20token1"), - }) - - hash, err := c.ExecuteTransfer(context.Background(), common.Hash{}, newBatch, 9) - assert.Equal(t, "", hash) - assert.True(t, errors.Is(err, errInsufficientErc20Balance)) - }) - t.Run("erc20 balance of errors", func(t *testing.T) { - expectedErr := errors.New("expected error erc20 balance of") - c, _ := NewEthereumClient(args) - c.signatureHolder = &testsCommon.SignaturesHolderStub{ - SignaturesCalled: func(messageHash []byte) [][]byte { - return signatures[:9] - }, - } - c.erc20ContractsHandler = &bridgeTests.ERC20ContractsHolderStub{ - BalanceOfCalled: func(ctx context.Context, erc20Address common.Address, address common.Address) (*big.Int, error) { - return nil, expectedErr - }, - } - - hash, err := c.ExecuteTransfer(context.Background(), common.Hash{}, batch, 9) - assert.Equal(t, "", hash) - assert.True(t, errors.Is(err, expectedErr)) - }) t.Run("execute transfer errors", func(t *testing.T) { expectedErr := errors.New("expected error execute transfer") c, _ := NewEthereumClient(args) @@ -626,7 +574,7 @@ func TestClient_ExecuteTransfer(t *testing.T) { }, } - hash, err := c.ExecuteTransfer(context.Background(), common.Hash{}, batch, 9) + hash, err := c.ExecuteTransfer(context.Background(), common.Hash{}, argLists, batch.ID, 9) assert.Equal(t, "", hash) assert.Equal(t, expectedErr, err) }) @@ -660,7 +608,7 @@ func TestClient_ExecuteTransfer(t *testing.T) { }, } - hash, err := c.ExecuteTransfer(context.Background(), common.Hash{}, batch, 9) + hash, err := c.ExecuteTransfer(context.Background(), common.Hash{}, argLists, batch.ID, 9) assert.Equal(t, "0xc5b2c658f5fa236c598a6e7fbf7f21413dc42e2a41dd982eb772b30707cba2eb", hash) assert.Nil(t, err) assert.True(t, wasCalled) @@ -695,13 +643,130 @@ func TestClient_ExecuteTransfer(t *testing.T) { }, } - hash, err := c.ExecuteTransfer(context.Background(), common.Hash{}, batch, 5) + hash, err := c.ExecuteTransfer(context.Background(), common.Hash{}, argLists, batch.ID, 5) assert.Equal(t, "0xc5b2c658f5fa236c598a6e7fbf7f21413dc42e2a41dd982eb772b30707cba2eb", hash) assert.Nil(t, err) assert.True(t, wasCalled) }) } +func TestClient_CheckRequiredBalance(t *testing.T) { + t.Parallel() + args := createMockEthereumClientArgs() + + tokenErc20 := common.BytesToAddress([]byte("ERC20token1")) + balance := big.NewInt(1000000) + t.Run("not enough erc20 balance", func(t *testing.T) { + c, _ := NewEthereumClient(args) + c.erc20ContractsHandler = &bridgeTests.ERC20ContractsHolderStub{ + BalanceOfCalled: func(ctx context.Context, erc20Address common.Address, address common.Address) (*big.Int, error) { + assert.Equal(t, c.safeContractAddress, address) + + return balance, nil + }, + } + err := c.CheckRequiredBalance(context.Background(), tokenErc20, big.NewInt(0).Add(balance, big.NewInt(1))) + assert.True(t, errors.Is(err, errInsufficientErc20Balance)) + }) + t.Run("erc20 balance of errors", func(t *testing.T) { + expectedErr := errors.New("expected error erc20 balance of") + c, _ := NewEthereumClient(args) + c.erc20ContractsHandler = &bridgeTests.ERC20ContractsHolderStub{ + BalanceOfCalled: func(ctx context.Context, erc20Address common.Address, address common.Address) (*big.Int, error) { + return nil, expectedErr + }, + } + + err := c.CheckRequiredBalance(context.Background(), tokenErc20, balance) + assert.True(t, errors.Is(err, expectedErr)) + }) + t.Run("should work", func(t *testing.T) { + c, _ := NewEthereumClient(args) + c.erc20ContractsHandler = &bridgeTests.ERC20ContractsHolderStub{ + BalanceOfCalled: func(ctx context.Context, erc20Address common.Address, address common.Address) (*big.Int, error) { + assert.Equal(t, c.safeContractAddress, address) + + return balance, nil + }, + } + err := c.CheckRequiredBalance(context.Background(), tokenErc20, balance) + assert.Nil(t, err) + }) +} + +func TestClient_TokenMintedBalances(t *testing.T) { + t.Parallel() + + t.Run("error while getting token minted balances", func(t *testing.T) { + t.Parallel() + + expectedErr := errors.New("expected error") + args := createMockEthereumClientArgs() + args.ClientWrapper = &bridgeTests.EthereumClientWrapperStub{ + TokenMintedBalancesCalled: func(ctx context.Context, token common.Address) (*big.Int, error) { + return nil, expectedErr + }, + } + c, _ := NewEthereumClient(args) + + balances, err := c.TokenMintedBalances(context.Background(), common.Address{}) + assert.Nil(t, balances) + assert.True(t, errors.Is(err, expectedErr)) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() + + providedBalance := big.NewInt(100) + args := createMockEthereumClientArgs() + args.ClientWrapper = &bridgeTests.EthereumClientWrapperStub{ + TokenMintedBalancesCalled: func(ctx context.Context, token common.Address) (*big.Int, error) { + return providedBalance, nil + }, + } + c, _ := NewEthereumClient(args) + + balances, err := c.TokenMintedBalances(context.Background(), common.Address{}) + assert.Nil(t, err) + assert.Equal(t, providedBalance, balances) + }) +} + +func TestClient_WhitelistedTokensMintBurn(t *testing.T) { + t.Parallel() + + t.Run("error while getting whitelisted tokens mint burn", func(t *testing.T) { + t.Parallel() + + expectedErr := errors.New("expected error") + args := createMockEthereumClientArgs() + args.ClientWrapper = &bridgeTests.EthereumClientWrapperStub{ + WhitelistedTokensMintBurnCalled: func(ctx context.Context, token common.Address) (bool, error) { + return false, expectedErr + }, + } + c, _ := NewEthereumClient(args) + + isWhitelisted, err := c.WhitelistedTokensMintBurn(context.Background(), common.Address{}) + assert.False(t, isWhitelisted) + assert.True(t, errors.Is(err, expectedErr)) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() + + args := createMockEthereumClientArgs() + args.ClientWrapper = &bridgeTests.EthereumClientWrapperStub{ + WhitelistedTokensMintBurnCalled: func(ctx context.Context, token common.Address) (bool, error) { + return true, nil + }, + } + c, _ := NewEthereumClient(args) + + isWhitelisted, err := c.WhitelistedTokensMintBurn(context.Background(), common.Address{}) + assert.Nil(t, err) + assert.True(t, isWhitelisted) + }) +} + func TestClient_GetTransactionsStatuses(t *testing.T) { t.Parallel() diff --git a/clients/ethereum/contract/safe.go b/clients/ethereum/contract/safe.go new file mode 100644 index 00000000..0c9f1043 --- /dev/null +++ b/clients/ethereum/contract/safe.go @@ -0,0 +1,1698 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package contract + +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 +) + +// ContractMetaData contains all meta data concerning the Contract contract. +var ContractMetaData = &bind.MetaData{ + ABI: "[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousAdmin\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminRoleTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousBridge\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newBridge\",\"type\":\"address\"}],\"name\":\"BridgeTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint112\",\"name\":\"depositNonce\",\"type\":\"uint112\"},{\"indexed\":false,\"internalType\":\"uint112\",\"name\":\"batchId\",\"type\":\"uint112\"}],\"name\":\"ERC20Deposit\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"admin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"batchBlockLimit\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"batchDeposits\",\"outputs\":[{\"internalType\":\"uint112\",\"name\":\"nonce\",\"type\":\"uint112\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"depositor\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"recipient\",\"type\":\"bytes32\"},{\"internalType\":\"enumDepositStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"batchSettleLimit\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"batchSize\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"batches\",\"outputs\":[{\"internalType\":\"uint112\",\"name\":\"nonce\",\"type\":\"uint112\"},{\"internalType\":\"uint64\",\"name\":\"blockNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"lastUpdatedBlockNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint16\",\"name\":\"depositsCount\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"batchesCount\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"bridge\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"recipientAddress\",\"type\":\"bytes32\"}],\"name\":\"deposit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"depositsCount\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchNonce\",\"type\":\"uint256\"}],\"name\":\"getBatch\",\"outputs\":[{\"components\":[{\"internalType\":\"uint112\",\"name\":\"nonce\",\"type\":\"uint112\"},{\"internalType\":\"uint64\",\"name\":\"blockNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"lastUpdatedBlockNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint16\",\"name\":\"depositsCount\",\"type\":\"uint16\"}],\"internalType\":\"structBatch\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchNonce\",\"type\":\"uint256\"}],\"name\":\"getDeposits\",\"outputs\":[{\"components\":[{\"internalType\":\"uint112\",\"name\":\"nonce\",\"type\":\"uint112\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"depositor\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"recipient\",\"type\":\"bytes32\"},{\"internalType\":\"enumDepositStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"internalType\":\"structDeposit[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getTokenMaxLimit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getTokenMinLimit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"initSupply\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isAnyBatchInProgress\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"isTokenWhitelisted\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"recoverLostFunds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"removeTokenFromWhitelist\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"newBatchBlockLimit\",\"type\":\"uint8\"}],\"name\":\"setBatchBlockLimit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"newBatchSettleLimit\",\"type\":\"uint8\"}],\"name\":\"setBatchSettleLimit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"newBatchSize\",\"type\":\"uint16\"}],\"name\":\"setBatchSize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newBridge\",\"type\":\"address\"}],\"name\":\"setBridge\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"setTokenMaxLimit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"setTokenMinLimit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"tokenBalances\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"tokenMaxLimits\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"tokenMinLimits\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"tokenMintedBalances\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"recipientAddress\",\"type\":\"address\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"transferAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unpause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"minimumAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maximumAmount\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"mintBurn\",\"type\":\"bool\"}],\"name\":\"whitelistToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"whitelistedTokens\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"whitelistedTokensMintBurn\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", +} + +// ContractABI is the input ABI used to generate the binding from. +// Deprecated: Use ContractMetaData.ABI instead. +var ContractABI = ContractMetaData.ABI + +// Contract is an auto generated Go binding around an Ethereum contract. +type Contract struct { + ContractCaller // Read-only binding to the contract + ContractTransactor // Write-only binding to the contract + ContractFilterer // Log filterer for contract events +} + +// ContractCaller is an auto generated read-only Go binding around an Ethereum contract. +type ContractCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ContractTransactor is an auto generated write-only Go binding around an Ethereum contract. +type ContractTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ContractFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type ContractFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ContractSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type ContractSession struct { + Contract *Contract // 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 +} + +// ContractCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type ContractCallerSession struct { + Contract *ContractCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// ContractTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type ContractTransactorSession struct { + Contract *ContractTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// ContractRaw is an auto generated low-level Go binding around an Ethereum contract. +type ContractRaw struct { + Contract *Contract // Generic contract binding to access the raw methods on +} + +// ContractCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type ContractCallerRaw struct { + Contract *ContractCaller // Generic read-only contract binding to access the raw methods on +} + +// ContractTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type ContractTransactorRaw struct { + Contract *ContractTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewContract creates a new instance of Contract, bound to a specific deployed contract. +func NewContract(address common.Address, backend bind.ContractBackend) (*Contract, error) { + contract, err := bindContract(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &Contract{ContractCaller: ContractCaller{contract: contract}, ContractTransactor: ContractTransactor{contract: contract}, ContractFilterer: ContractFilterer{contract: contract}}, nil +} + +// NewContractCaller creates a new read-only instance of Contract, bound to a specific deployed contract. +func NewContractCaller(address common.Address, caller bind.ContractCaller) (*ContractCaller, error) { + contract, err := bindContract(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &ContractCaller{contract: contract}, nil +} + +// NewContractTransactor creates a new write-only instance of Contract, bound to a specific deployed contract. +func NewContractTransactor(address common.Address, transactor bind.ContractTransactor) (*ContractTransactor, error) { + contract, err := bindContract(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &ContractTransactor{contract: contract}, nil +} + +// NewContractFilterer creates a new log filterer instance of Contract, bound to a specific deployed contract. +func NewContractFilterer(address common.Address, filterer bind.ContractFilterer) (*ContractFilterer, error) { + contract, err := bindContract(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &ContractFilterer{contract: contract}, nil +} + +// bindContract binds a generic wrapper to an already deployed contract. +func bindContract(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := ContractMetaData.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 (_Contract *ContractRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _Contract.Contract.ContractCaller.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 (_Contract *ContractRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Contract.Contract.ContractTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_Contract *ContractRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _Contract.Contract.ContractTransactor.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 (_Contract *ContractCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _Contract.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 (_Contract *ContractTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Contract.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_Contract *ContractTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _Contract.Contract.contract.Transact(opts, method, params...) +} + +// Admin is a free data retrieval call binding the contract method 0xf851a440. +// +// Solidity: function admin() view returns(address) +func (_Contract *ContractCaller) Admin(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _Contract.contract.Call(opts, &out, "admin") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// Admin is a free data retrieval call binding the contract method 0xf851a440. +// +// Solidity: function admin() view returns(address) +func (_Contract *ContractSession) Admin() (common.Address, error) { + return _Contract.Contract.Admin(&_Contract.CallOpts) +} + +// Admin is a free data retrieval call binding the contract method 0xf851a440. +// +// Solidity: function admin() view returns(address) +func (_Contract *ContractCallerSession) Admin() (common.Address, error) { + return _Contract.Contract.Admin(&_Contract.CallOpts) +} + +// BatchBlockLimit is a free data retrieval call binding the contract method 0x9ab7cfaa. +// +// Solidity: function batchBlockLimit() view returns(uint8) +func (_Contract *ContractCaller) BatchBlockLimit(opts *bind.CallOpts) (uint8, error) { + var out []interface{} + err := _Contract.contract.Call(opts, &out, "batchBlockLimit") + + if err != nil { + return *new(uint8), err + } + + out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) + + return out0, err + +} + +// BatchBlockLimit is a free data retrieval call binding the contract method 0x9ab7cfaa. +// +// Solidity: function batchBlockLimit() view returns(uint8) +func (_Contract *ContractSession) BatchBlockLimit() (uint8, error) { + return _Contract.Contract.BatchBlockLimit(&_Contract.CallOpts) +} + +// BatchBlockLimit is a free data retrieval call binding the contract method 0x9ab7cfaa. +// +// Solidity: function batchBlockLimit() view returns(uint8) +func (_Contract *ContractCallerSession) BatchBlockLimit() (uint8, error) { + return _Contract.Contract.BatchBlockLimit(&_Contract.CallOpts) +} + +// BatchDeposits is a free data retrieval call binding the contract method 0x284c0c44. +// +// Solidity: function batchDeposits(uint256 , uint256 ) view returns(uint112 nonce, address tokenAddress, uint256 amount, address depositor, bytes32 recipient, uint8 status) +func (_Contract *ContractCaller) BatchDeposits(opts *bind.CallOpts, arg0 *big.Int, arg1 *big.Int) (struct { + Nonce *big.Int + TokenAddress common.Address + Amount *big.Int + Depositor common.Address + Recipient [32]byte + Status uint8 +}, error) { + var out []interface{} + err := _Contract.contract.Call(opts, &out, "batchDeposits", arg0, arg1) + + outstruct := new(struct { + Nonce *big.Int + TokenAddress common.Address + Amount *big.Int + Depositor common.Address + Recipient [32]byte + Status uint8 + }) + if err != nil { + return *outstruct, err + } + + outstruct.Nonce = *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + outstruct.TokenAddress = *abi.ConvertType(out[1], new(common.Address)).(*common.Address) + outstruct.Amount = *abi.ConvertType(out[2], new(*big.Int)).(**big.Int) + outstruct.Depositor = *abi.ConvertType(out[3], new(common.Address)).(*common.Address) + outstruct.Recipient = *abi.ConvertType(out[4], new([32]byte)).(*[32]byte) + outstruct.Status = *abi.ConvertType(out[5], new(uint8)).(*uint8) + + return *outstruct, err + +} + +// BatchDeposits is a free data retrieval call binding the contract method 0x284c0c44. +// +// Solidity: function batchDeposits(uint256 , uint256 ) view returns(uint112 nonce, address tokenAddress, uint256 amount, address depositor, bytes32 recipient, uint8 status) +func (_Contract *ContractSession) BatchDeposits(arg0 *big.Int, arg1 *big.Int) (struct { + Nonce *big.Int + TokenAddress common.Address + Amount *big.Int + Depositor common.Address + Recipient [32]byte + Status uint8 +}, error) { + return _Contract.Contract.BatchDeposits(&_Contract.CallOpts, arg0, arg1) +} + +// BatchDeposits is a free data retrieval call binding the contract method 0x284c0c44. +// +// Solidity: function batchDeposits(uint256 , uint256 ) view returns(uint112 nonce, address tokenAddress, uint256 amount, address depositor, bytes32 recipient, uint8 status) +func (_Contract *ContractCallerSession) BatchDeposits(arg0 *big.Int, arg1 *big.Int) (struct { + Nonce *big.Int + TokenAddress common.Address + Amount *big.Int + Depositor common.Address + Recipient [32]byte + Status uint8 +}, error) { + return _Contract.Contract.BatchDeposits(&_Contract.CallOpts, arg0, arg1) +} + +// BatchSettleLimit is a free data retrieval call binding the contract method 0x2325b5f7. +// +// Solidity: function batchSettleLimit() view returns(uint8) +func (_Contract *ContractCaller) BatchSettleLimit(opts *bind.CallOpts) (uint8, error) { + var out []interface{} + err := _Contract.contract.Call(opts, &out, "batchSettleLimit") + + if err != nil { + return *new(uint8), err + } + + out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) + + return out0, err + +} + +// BatchSettleLimit is a free data retrieval call binding the contract method 0x2325b5f7. +// +// Solidity: function batchSettleLimit() view returns(uint8) +func (_Contract *ContractSession) BatchSettleLimit() (uint8, error) { + return _Contract.Contract.BatchSettleLimit(&_Contract.CallOpts) +} + +// BatchSettleLimit is a free data retrieval call binding the contract method 0x2325b5f7. +// +// Solidity: function batchSettleLimit() view returns(uint8) +func (_Contract *ContractCallerSession) BatchSettleLimit() (uint8, error) { + return _Contract.Contract.BatchSettleLimit(&_Contract.CallOpts) +} + +// BatchSize is a free data retrieval call binding the contract method 0xf4daaba1. +// +// Solidity: function batchSize() view returns(uint16) +func (_Contract *ContractCaller) BatchSize(opts *bind.CallOpts) (uint16, error) { + var out []interface{} + err := _Contract.contract.Call(opts, &out, "batchSize") + + if err != nil { + return *new(uint16), err + } + + out0 := *abi.ConvertType(out[0], new(uint16)).(*uint16) + + return out0, err + +} + +// BatchSize is a free data retrieval call binding the contract method 0xf4daaba1. +// +// Solidity: function batchSize() view returns(uint16) +func (_Contract *ContractSession) BatchSize() (uint16, error) { + return _Contract.Contract.BatchSize(&_Contract.CallOpts) +} + +// BatchSize is a free data retrieval call binding the contract method 0xf4daaba1. +// +// Solidity: function batchSize() view returns(uint16) +func (_Contract *ContractCallerSession) BatchSize() (uint16, error) { + return _Contract.Contract.BatchSize(&_Contract.CallOpts) +} + +// Batches is a free data retrieval call binding the contract method 0xb32c4d8d. +// +// Solidity: function batches(uint256 ) view returns(uint112 nonce, uint64 blockNumber, uint64 lastUpdatedBlockNumber, uint16 depositsCount) +func (_Contract *ContractCaller) Batches(opts *bind.CallOpts, arg0 *big.Int) (struct { + Nonce *big.Int + BlockNumber uint64 + LastUpdatedBlockNumber uint64 + DepositsCount uint16 +}, error) { + var out []interface{} + err := _Contract.contract.Call(opts, &out, "batches", arg0) + + outstruct := new(struct { + Nonce *big.Int + BlockNumber uint64 + LastUpdatedBlockNumber uint64 + DepositsCount uint16 + }) + if err != nil { + return *outstruct, err + } + + outstruct.Nonce = *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + outstruct.BlockNumber = *abi.ConvertType(out[1], new(uint64)).(*uint64) + outstruct.LastUpdatedBlockNumber = *abi.ConvertType(out[2], new(uint64)).(*uint64) + outstruct.DepositsCount = *abi.ConvertType(out[3], new(uint16)).(*uint16) + + return *outstruct, err + +} + +// Batches is a free data retrieval call binding the contract method 0xb32c4d8d. +// +// Solidity: function batches(uint256 ) view returns(uint112 nonce, uint64 blockNumber, uint64 lastUpdatedBlockNumber, uint16 depositsCount) +func (_Contract *ContractSession) Batches(arg0 *big.Int) (struct { + Nonce *big.Int + BlockNumber uint64 + LastUpdatedBlockNumber uint64 + DepositsCount uint16 +}, error) { + return _Contract.Contract.Batches(&_Contract.CallOpts, arg0) +} + +// Batches is a free data retrieval call binding the contract method 0xb32c4d8d. +// +// Solidity: function batches(uint256 ) view returns(uint112 nonce, uint64 blockNumber, uint64 lastUpdatedBlockNumber, uint16 depositsCount) +func (_Contract *ContractCallerSession) Batches(arg0 *big.Int) (struct { + Nonce *big.Int + BlockNumber uint64 + LastUpdatedBlockNumber uint64 + DepositsCount uint16 +}, error) { + return _Contract.Contract.Batches(&_Contract.CallOpts, arg0) +} + +// BatchesCount is a free data retrieval call binding the contract method 0x87ea0961. +// +// Solidity: function batchesCount() view returns(uint64) +func (_Contract *ContractCaller) BatchesCount(opts *bind.CallOpts) (uint64, error) { + var out []interface{} + err := _Contract.contract.Call(opts, &out, "batchesCount") + + if err != nil { + return *new(uint64), err + } + + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) + + return out0, err + +} + +// BatchesCount is a free data retrieval call binding the contract method 0x87ea0961. +// +// Solidity: function batchesCount() view returns(uint64) +func (_Contract *ContractSession) BatchesCount() (uint64, error) { + return _Contract.Contract.BatchesCount(&_Contract.CallOpts) +} + +// BatchesCount is a free data retrieval call binding the contract method 0x87ea0961. +// +// Solidity: function batchesCount() view returns(uint64) +func (_Contract *ContractCallerSession) BatchesCount() (uint64, error) { + return _Contract.Contract.BatchesCount(&_Contract.CallOpts) +} + +// Bridge is a free data retrieval call binding the contract method 0xe78cea92. +// +// Solidity: function bridge() view returns(address) +func (_Contract *ContractCaller) Bridge(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _Contract.contract.Call(opts, &out, "bridge") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// Bridge is a free data retrieval call binding the contract method 0xe78cea92. +// +// Solidity: function bridge() view returns(address) +func (_Contract *ContractSession) Bridge() (common.Address, error) { + return _Contract.Contract.Bridge(&_Contract.CallOpts) +} + +// Bridge is a free data retrieval call binding the contract method 0xe78cea92. +// +// Solidity: function bridge() view returns(address) +func (_Contract *ContractCallerSession) Bridge() (common.Address, error) { + return _Contract.Contract.Bridge(&_Contract.CallOpts) +} + +// DepositsCount is a free data retrieval call binding the contract method 0x4506e935. +// +// Solidity: function depositsCount() view returns(uint64) +func (_Contract *ContractCaller) DepositsCount(opts *bind.CallOpts) (uint64, error) { + var out []interface{} + err := _Contract.contract.Call(opts, &out, "depositsCount") + + if err != nil { + return *new(uint64), err + } + + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) + + return out0, err + +} + +// DepositsCount is a free data retrieval call binding the contract method 0x4506e935. +// +// Solidity: function depositsCount() view returns(uint64) +func (_Contract *ContractSession) DepositsCount() (uint64, error) { + return _Contract.Contract.DepositsCount(&_Contract.CallOpts) +} + +// DepositsCount is a free data retrieval call binding the contract method 0x4506e935. +// +// Solidity: function depositsCount() view returns(uint64) +func (_Contract *ContractCallerSession) DepositsCount() (uint64, error) { + return _Contract.Contract.DepositsCount(&_Contract.CallOpts) +} + +// GetBatch is a free data retrieval call binding the contract method 0x5ac44282. +// +// Solidity: function getBatch(uint256 batchNonce) view returns((uint112,uint64,uint64,uint16)) +func (_Contract *ContractCaller) GetBatch(opts *bind.CallOpts, batchNonce *big.Int) (Batch, error) { + var out []interface{} + err := _Contract.contract.Call(opts, &out, "getBatch", batchNonce) + + if err != nil { + return *new(Batch), err + } + + out0 := *abi.ConvertType(out[0], new(Batch)).(*Batch) + + return out0, err + +} + +// GetBatch is a free data retrieval call binding the contract method 0x5ac44282. +// +// Solidity: function getBatch(uint256 batchNonce) view returns((uint112,uint64,uint64,uint16)) +func (_Contract *ContractSession) GetBatch(batchNonce *big.Int) (Batch, error) { + return _Contract.Contract.GetBatch(&_Contract.CallOpts, batchNonce) +} + +// GetBatch is a free data retrieval call binding the contract method 0x5ac44282. +// +// Solidity: function getBatch(uint256 batchNonce) view returns((uint112,uint64,uint64,uint16)) +func (_Contract *ContractCallerSession) GetBatch(batchNonce *big.Int) (Batch, error) { + return _Contract.Contract.GetBatch(&_Contract.CallOpts, batchNonce) +} + +// GetDeposits is a free data retrieval call binding the contract method 0x085c967f. +// +// Solidity: function getDeposits(uint256 batchNonce) view returns((uint112,address,uint256,address,bytes32,uint8)[]) +func (_Contract *ContractCaller) GetDeposits(opts *bind.CallOpts, batchNonce *big.Int) ([]Deposit, error) { + var out []interface{} + err := _Contract.contract.Call(opts, &out, "getDeposits", batchNonce) + + if err != nil { + return *new([]Deposit), err + } + + out0 := *abi.ConvertType(out[0], new([]Deposit)).(*[]Deposit) + + return out0, err + +} + +// GetDeposits is a free data retrieval call binding the contract method 0x085c967f. +// +// Solidity: function getDeposits(uint256 batchNonce) view returns((uint112,address,uint256,address,bytes32,uint8)[]) +func (_Contract *ContractSession) GetDeposits(batchNonce *big.Int) ([]Deposit, error) { + return _Contract.Contract.GetDeposits(&_Contract.CallOpts, batchNonce) +} + +// GetDeposits is a free data retrieval call binding the contract method 0x085c967f. +// +// Solidity: function getDeposits(uint256 batchNonce) view returns((uint112,address,uint256,address,bytes32,uint8)[]) +func (_Contract *ContractCallerSession) GetDeposits(batchNonce *big.Int) ([]Deposit, error) { + return _Contract.Contract.GetDeposits(&_Contract.CallOpts, batchNonce) +} + +// GetTokenMaxLimit is a free data retrieval call binding the contract method 0xc652a0b5. +// +// Solidity: function getTokenMaxLimit(address token) view returns(uint256) +func (_Contract *ContractCaller) GetTokenMaxLimit(opts *bind.CallOpts, token common.Address) (*big.Int, error) { + var out []interface{} + err := _Contract.contract.Call(opts, &out, "getTokenMaxLimit", token) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetTokenMaxLimit is a free data retrieval call binding the contract method 0xc652a0b5. +// +// Solidity: function getTokenMaxLimit(address token) view returns(uint256) +func (_Contract *ContractSession) GetTokenMaxLimit(token common.Address) (*big.Int, error) { + return _Contract.Contract.GetTokenMaxLimit(&_Contract.CallOpts, token) +} + +// GetTokenMaxLimit is a free data retrieval call binding the contract method 0xc652a0b5. +// +// Solidity: function getTokenMaxLimit(address token) view returns(uint256) +func (_Contract *ContractCallerSession) GetTokenMaxLimit(token common.Address) (*big.Int, error) { + return _Contract.Contract.GetTokenMaxLimit(&_Contract.CallOpts, token) +} + +// GetTokenMinLimit is a free data retrieval call binding the contract method 0x9f0ebb93. +// +// Solidity: function getTokenMinLimit(address token) view returns(uint256) +func (_Contract *ContractCaller) GetTokenMinLimit(opts *bind.CallOpts, token common.Address) (*big.Int, error) { + var out []interface{} + err := _Contract.contract.Call(opts, &out, "getTokenMinLimit", token) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetTokenMinLimit is a free data retrieval call binding the contract method 0x9f0ebb93. +// +// Solidity: function getTokenMinLimit(address token) view returns(uint256) +func (_Contract *ContractSession) GetTokenMinLimit(token common.Address) (*big.Int, error) { + return _Contract.Contract.GetTokenMinLimit(&_Contract.CallOpts, token) +} + +// GetTokenMinLimit is a free data retrieval call binding the contract method 0x9f0ebb93. +// +// Solidity: function getTokenMinLimit(address token) view returns(uint256) +func (_Contract *ContractCallerSession) GetTokenMinLimit(token common.Address) (*big.Int, error) { + return _Contract.Contract.GetTokenMinLimit(&_Contract.CallOpts, token) +} + +// IsAnyBatchInProgress is a free data retrieval call binding the contract method 0x82146138. +// +// Solidity: function isAnyBatchInProgress() view returns(bool) +func (_Contract *ContractCaller) IsAnyBatchInProgress(opts *bind.CallOpts) (bool, error) { + var out []interface{} + err := _Contract.contract.Call(opts, &out, "isAnyBatchInProgress") + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// IsAnyBatchInProgress is a free data retrieval call binding the contract method 0x82146138. +// +// Solidity: function isAnyBatchInProgress() view returns(bool) +func (_Contract *ContractSession) IsAnyBatchInProgress() (bool, error) { + return _Contract.Contract.IsAnyBatchInProgress(&_Contract.CallOpts) +} + +// IsAnyBatchInProgress is a free data retrieval call binding the contract method 0x82146138. +// +// Solidity: function isAnyBatchInProgress() view returns(bool) +func (_Contract *ContractCallerSession) IsAnyBatchInProgress() (bool, error) { + return _Contract.Contract.IsAnyBatchInProgress(&_Contract.CallOpts) +} + +// IsTokenWhitelisted is a free data retrieval call binding the contract method 0xb5af090f. +// +// Solidity: function isTokenWhitelisted(address token) view returns(bool) +func (_Contract *ContractCaller) IsTokenWhitelisted(opts *bind.CallOpts, token common.Address) (bool, error) { + var out []interface{} + err := _Contract.contract.Call(opts, &out, "isTokenWhitelisted", token) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// IsTokenWhitelisted is a free data retrieval call binding the contract method 0xb5af090f. +// +// Solidity: function isTokenWhitelisted(address token) view returns(bool) +func (_Contract *ContractSession) IsTokenWhitelisted(token common.Address) (bool, error) { + return _Contract.Contract.IsTokenWhitelisted(&_Contract.CallOpts, token) +} + +// IsTokenWhitelisted is a free data retrieval call binding the contract method 0xb5af090f. +// +// Solidity: function isTokenWhitelisted(address token) view returns(bool) +func (_Contract *ContractCallerSession) IsTokenWhitelisted(token common.Address) (bool, error) { + return _Contract.Contract.IsTokenWhitelisted(&_Contract.CallOpts, token) +} + +// Paused is a free data retrieval call binding the contract method 0x5c975abb. +// +// Solidity: function paused() view returns(bool) +func (_Contract *ContractCaller) Paused(opts *bind.CallOpts) (bool, error) { + var out []interface{} + err := _Contract.contract.Call(opts, &out, "paused") + + 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 0x5c975abb. +// +// Solidity: function paused() view returns(bool) +func (_Contract *ContractSession) Paused() (bool, error) { + return _Contract.Contract.Paused(&_Contract.CallOpts) +} + +// Paused is a free data retrieval call binding the contract method 0x5c975abb. +// +// Solidity: function paused() view returns(bool) +func (_Contract *ContractCallerSession) Paused() (bool, error) { + return _Contract.Contract.Paused(&_Contract.CallOpts) +} + +// TokenBalances is a free data retrieval call binding the contract method 0x523fba7f. +// +// Solidity: function tokenBalances(address ) view returns(uint256) +func (_Contract *ContractCaller) TokenBalances(opts *bind.CallOpts, arg0 common.Address) (*big.Int, error) { + var out []interface{} + err := _Contract.contract.Call(opts, &out, "tokenBalances", arg0) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// TokenBalances is a free data retrieval call binding the contract method 0x523fba7f. +// +// Solidity: function tokenBalances(address ) view returns(uint256) +func (_Contract *ContractSession) TokenBalances(arg0 common.Address) (*big.Int, error) { + return _Contract.Contract.TokenBalances(&_Contract.CallOpts, arg0) +} + +// TokenBalances is a free data retrieval call binding the contract method 0x523fba7f. +// +// Solidity: function tokenBalances(address ) view returns(uint256) +func (_Contract *ContractCallerSession) TokenBalances(arg0 common.Address) (*big.Int, error) { + return _Contract.Contract.TokenBalances(&_Contract.CallOpts, arg0) +} + +// TokenMaxLimits is a free data retrieval call binding the contract method 0xc639651d. +// +// Solidity: function tokenMaxLimits(address ) view returns(uint256) +func (_Contract *ContractCaller) TokenMaxLimits(opts *bind.CallOpts, arg0 common.Address) (*big.Int, error) { + var out []interface{} + err := _Contract.contract.Call(opts, &out, "tokenMaxLimits", arg0) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// TokenMaxLimits is a free data retrieval call binding the contract method 0xc639651d. +// +// Solidity: function tokenMaxLimits(address ) view returns(uint256) +func (_Contract *ContractSession) TokenMaxLimits(arg0 common.Address) (*big.Int, error) { + return _Contract.Contract.TokenMaxLimits(&_Contract.CallOpts, arg0) +} + +// TokenMaxLimits is a free data retrieval call binding the contract method 0xc639651d. +// +// Solidity: function tokenMaxLimits(address ) view returns(uint256) +func (_Contract *ContractCallerSession) TokenMaxLimits(arg0 common.Address) (*big.Int, error) { + return _Contract.Contract.TokenMaxLimits(&_Contract.CallOpts, arg0) +} + +// TokenMinLimits is a free data retrieval call binding the contract method 0xf6246ea1. +// +// Solidity: function tokenMinLimits(address ) view returns(uint256) +func (_Contract *ContractCaller) TokenMinLimits(opts *bind.CallOpts, arg0 common.Address) (*big.Int, error) { + var out []interface{} + err := _Contract.contract.Call(opts, &out, "tokenMinLimits", arg0) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// TokenMinLimits is a free data retrieval call binding the contract method 0xf6246ea1. +// +// Solidity: function tokenMinLimits(address ) view returns(uint256) +func (_Contract *ContractSession) TokenMinLimits(arg0 common.Address) (*big.Int, error) { + return _Contract.Contract.TokenMinLimits(&_Contract.CallOpts, arg0) +} + +// TokenMinLimits is a free data retrieval call binding the contract method 0xf6246ea1. +// +// Solidity: function tokenMinLimits(address ) view returns(uint256) +func (_Contract *ContractCallerSession) TokenMinLimits(arg0 common.Address) (*big.Int, error) { + return _Contract.Contract.TokenMinLimits(&_Contract.CallOpts, arg0) +} + +// TokenMintedBalances is a free data retrieval call binding the contract method 0x34ae3850. +// +// Solidity: function tokenMintedBalances(address ) view returns(uint256) +func (_Contract *ContractCaller) TokenMintedBalances(opts *bind.CallOpts, arg0 common.Address) (*big.Int, error) { + var out []interface{} + err := _Contract.contract.Call(opts, &out, "tokenMintedBalances", arg0) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// TokenMintedBalances is a free data retrieval call binding the contract method 0x34ae3850. +// +// Solidity: function tokenMintedBalances(address ) view returns(uint256) +func (_Contract *ContractSession) TokenMintedBalances(arg0 common.Address) (*big.Int, error) { + return _Contract.Contract.TokenMintedBalances(&_Contract.CallOpts, arg0) +} + +// TokenMintedBalances is a free data retrieval call binding the contract method 0x34ae3850. +// +// Solidity: function tokenMintedBalances(address ) view returns(uint256) +func (_Contract *ContractCallerSession) TokenMintedBalances(arg0 common.Address) (*big.Int, error) { + return _Contract.Contract.TokenMintedBalances(&_Contract.CallOpts, arg0) +} + +// WhitelistedTokens is a free data retrieval call binding the contract method 0xdaf9c210. +// +// Solidity: function whitelistedTokens(address ) view returns(bool) +func (_Contract *ContractCaller) WhitelistedTokens(opts *bind.CallOpts, arg0 common.Address) (bool, error) { + var out []interface{} + err := _Contract.contract.Call(opts, &out, "whitelistedTokens", arg0) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// WhitelistedTokens is a free data retrieval call binding the contract method 0xdaf9c210. +// +// Solidity: function whitelistedTokens(address ) view returns(bool) +func (_Contract *ContractSession) WhitelistedTokens(arg0 common.Address) (bool, error) { + return _Contract.Contract.WhitelistedTokens(&_Contract.CallOpts, arg0) +} + +// WhitelistedTokens is a free data retrieval call binding the contract method 0xdaf9c210. +// +// Solidity: function whitelistedTokens(address ) view returns(bool) +func (_Contract *ContractCallerSession) WhitelistedTokens(arg0 common.Address) (bool, error) { + return _Contract.Contract.WhitelistedTokens(&_Contract.CallOpts, arg0) +} + +// WhitelistedTokensMintBurn is a free data retrieval call binding the contract method 0x48db2fca. +// +// Solidity: function whitelistedTokensMintBurn(address ) view returns(bool) +func (_Contract *ContractCaller) WhitelistedTokensMintBurn(opts *bind.CallOpts, arg0 common.Address) (bool, error) { + var out []interface{} + err := _Contract.contract.Call(opts, &out, "whitelistedTokensMintBurn", arg0) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// WhitelistedTokensMintBurn is a free data retrieval call binding the contract method 0x48db2fca. +// +// Solidity: function whitelistedTokensMintBurn(address ) view returns(bool) +func (_Contract *ContractSession) WhitelistedTokensMintBurn(arg0 common.Address) (bool, error) { + return _Contract.Contract.WhitelistedTokensMintBurn(&_Contract.CallOpts, arg0) +} + +// WhitelistedTokensMintBurn is a free data retrieval call binding the contract method 0x48db2fca. +// +// Solidity: function whitelistedTokensMintBurn(address ) view returns(bool) +func (_Contract *ContractCallerSession) WhitelistedTokensMintBurn(arg0 common.Address) (bool, error) { + return _Contract.Contract.WhitelistedTokensMintBurn(&_Contract.CallOpts, arg0) +} + +// Deposit is a paid mutator transaction binding the contract method 0x26b3293f. +// +// Solidity: function deposit(address tokenAddress, uint256 amount, bytes32 recipientAddress) returns() +func (_Contract *ContractTransactor) Deposit(opts *bind.TransactOpts, tokenAddress common.Address, amount *big.Int, recipientAddress [32]byte) (*types.Transaction, error) { + return _Contract.contract.Transact(opts, "deposit", tokenAddress, amount, recipientAddress) +} + +// Deposit is a paid mutator transaction binding the contract method 0x26b3293f. +// +// Solidity: function deposit(address tokenAddress, uint256 amount, bytes32 recipientAddress) returns() +func (_Contract *ContractSession) Deposit(tokenAddress common.Address, amount *big.Int, recipientAddress [32]byte) (*types.Transaction, error) { + return _Contract.Contract.Deposit(&_Contract.TransactOpts, tokenAddress, amount, recipientAddress) +} + +// Deposit is a paid mutator transaction binding the contract method 0x26b3293f. +// +// Solidity: function deposit(address tokenAddress, uint256 amount, bytes32 recipientAddress) returns() +func (_Contract *ContractTransactorSession) Deposit(tokenAddress common.Address, amount *big.Int, recipientAddress [32]byte) (*types.Transaction, error) { + return _Contract.Contract.Deposit(&_Contract.TransactOpts, tokenAddress, amount, recipientAddress) +} + +// InitSupply is a paid mutator transaction binding the contract method 0x4013c89c. +// +// Solidity: function initSupply(address tokenAddress, uint256 amount) returns() +func (_Contract *ContractTransactor) InitSupply(opts *bind.TransactOpts, tokenAddress common.Address, amount *big.Int) (*types.Transaction, error) { + return _Contract.contract.Transact(opts, "initSupply", tokenAddress, amount) +} + +// InitSupply is a paid mutator transaction binding the contract method 0x4013c89c. +// +// Solidity: function initSupply(address tokenAddress, uint256 amount) returns() +func (_Contract *ContractSession) InitSupply(tokenAddress common.Address, amount *big.Int) (*types.Transaction, error) { + return _Contract.Contract.InitSupply(&_Contract.TransactOpts, tokenAddress, amount) +} + +// InitSupply is a paid mutator transaction binding the contract method 0x4013c89c. +// +// Solidity: function initSupply(address tokenAddress, uint256 amount) returns() +func (_Contract *ContractTransactorSession) InitSupply(tokenAddress common.Address, amount *big.Int) (*types.Transaction, error) { + return _Contract.Contract.InitSupply(&_Contract.TransactOpts, tokenAddress, amount) +} + +// Pause is a paid mutator transaction binding the contract method 0x8456cb59. +// +// Solidity: function pause() returns() +func (_Contract *ContractTransactor) Pause(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Contract.contract.Transact(opts, "pause") +} + +// Pause is a paid mutator transaction binding the contract method 0x8456cb59. +// +// Solidity: function pause() returns() +func (_Contract *ContractSession) Pause() (*types.Transaction, error) { + return _Contract.Contract.Pause(&_Contract.TransactOpts) +} + +// Pause is a paid mutator transaction binding the contract method 0x8456cb59. +// +// Solidity: function pause() returns() +func (_Contract *ContractTransactorSession) Pause() (*types.Transaction, error) { + return _Contract.Contract.Pause(&_Contract.TransactOpts) +} + +// RecoverLostFunds is a paid mutator transaction binding the contract method 0x770be784. +// +// Solidity: function recoverLostFunds(address tokenAddress) returns() +func (_Contract *ContractTransactor) RecoverLostFunds(opts *bind.TransactOpts, tokenAddress common.Address) (*types.Transaction, error) { + return _Contract.contract.Transact(opts, "recoverLostFunds", tokenAddress) +} + +// RecoverLostFunds is a paid mutator transaction binding the contract method 0x770be784. +// +// Solidity: function recoverLostFunds(address tokenAddress) returns() +func (_Contract *ContractSession) RecoverLostFunds(tokenAddress common.Address) (*types.Transaction, error) { + return _Contract.Contract.RecoverLostFunds(&_Contract.TransactOpts, tokenAddress) +} + +// RecoverLostFunds is a paid mutator transaction binding the contract method 0x770be784. +// +// Solidity: function recoverLostFunds(address tokenAddress) returns() +func (_Contract *ContractTransactorSession) RecoverLostFunds(tokenAddress common.Address) (*types.Transaction, error) { + return _Contract.Contract.RecoverLostFunds(&_Contract.TransactOpts, tokenAddress) +} + +// RemoveTokenFromWhitelist is a paid mutator transaction binding the contract method 0x306275be. +// +// Solidity: function removeTokenFromWhitelist(address token) returns() +func (_Contract *ContractTransactor) RemoveTokenFromWhitelist(opts *bind.TransactOpts, token common.Address) (*types.Transaction, error) { + return _Contract.contract.Transact(opts, "removeTokenFromWhitelist", token) +} + +// RemoveTokenFromWhitelist is a paid mutator transaction binding the contract method 0x306275be. +// +// Solidity: function removeTokenFromWhitelist(address token) returns() +func (_Contract *ContractSession) RemoveTokenFromWhitelist(token common.Address) (*types.Transaction, error) { + return _Contract.Contract.RemoveTokenFromWhitelist(&_Contract.TransactOpts, token) +} + +// RemoveTokenFromWhitelist is a paid mutator transaction binding the contract method 0x306275be. +// +// Solidity: function removeTokenFromWhitelist(address token) returns() +func (_Contract *ContractTransactorSession) RemoveTokenFromWhitelist(token common.Address) (*types.Transaction, error) { + return _Contract.Contract.RemoveTokenFromWhitelist(&_Contract.TransactOpts, token) +} + +// RenounceAdmin is a paid mutator transaction binding the contract method 0x8bad0c0a. +// +// Solidity: function renounceAdmin() returns() +func (_Contract *ContractTransactor) RenounceAdmin(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Contract.contract.Transact(opts, "renounceAdmin") +} + +// RenounceAdmin is a paid mutator transaction binding the contract method 0x8bad0c0a. +// +// Solidity: function renounceAdmin() returns() +func (_Contract *ContractSession) RenounceAdmin() (*types.Transaction, error) { + return _Contract.Contract.RenounceAdmin(&_Contract.TransactOpts) +} + +// RenounceAdmin is a paid mutator transaction binding the contract method 0x8bad0c0a. +// +// Solidity: function renounceAdmin() returns() +func (_Contract *ContractTransactorSession) RenounceAdmin() (*types.Transaction, error) { + return _Contract.Contract.RenounceAdmin(&_Contract.TransactOpts) +} + +// SetBatchBlockLimit is a paid mutator transaction binding the contract method 0xe8a70ee2. +// +// Solidity: function setBatchBlockLimit(uint8 newBatchBlockLimit) returns() +func (_Contract *ContractTransactor) SetBatchBlockLimit(opts *bind.TransactOpts, newBatchBlockLimit uint8) (*types.Transaction, error) { + return _Contract.contract.Transact(opts, "setBatchBlockLimit", newBatchBlockLimit) +} + +// SetBatchBlockLimit is a paid mutator transaction binding the contract method 0xe8a70ee2. +// +// Solidity: function setBatchBlockLimit(uint8 newBatchBlockLimit) returns() +func (_Contract *ContractSession) SetBatchBlockLimit(newBatchBlockLimit uint8) (*types.Transaction, error) { + return _Contract.Contract.SetBatchBlockLimit(&_Contract.TransactOpts, newBatchBlockLimit) +} + +// SetBatchBlockLimit is a paid mutator transaction binding the contract method 0xe8a70ee2. +// +// Solidity: function setBatchBlockLimit(uint8 newBatchBlockLimit) returns() +func (_Contract *ContractTransactorSession) SetBatchBlockLimit(newBatchBlockLimit uint8) (*types.Transaction, error) { + return _Contract.Contract.SetBatchBlockLimit(&_Contract.TransactOpts, newBatchBlockLimit) +} + +// SetBatchSettleLimit is a paid mutator transaction binding the contract method 0xf2e0ec48. +// +// Solidity: function setBatchSettleLimit(uint8 newBatchSettleLimit) returns() +func (_Contract *ContractTransactor) SetBatchSettleLimit(opts *bind.TransactOpts, newBatchSettleLimit uint8) (*types.Transaction, error) { + return _Contract.contract.Transact(opts, "setBatchSettleLimit", newBatchSettleLimit) +} + +// SetBatchSettleLimit is a paid mutator transaction binding the contract method 0xf2e0ec48. +// +// Solidity: function setBatchSettleLimit(uint8 newBatchSettleLimit) returns() +func (_Contract *ContractSession) SetBatchSettleLimit(newBatchSettleLimit uint8) (*types.Transaction, error) { + return _Contract.Contract.SetBatchSettleLimit(&_Contract.TransactOpts, newBatchSettleLimit) +} + +// SetBatchSettleLimit is a paid mutator transaction binding the contract method 0xf2e0ec48. +// +// Solidity: function setBatchSettleLimit(uint8 newBatchSettleLimit) returns() +func (_Contract *ContractTransactorSession) SetBatchSettleLimit(newBatchSettleLimit uint8) (*types.Transaction, error) { + return _Contract.Contract.SetBatchSettleLimit(&_Contract.TransactOpts, newBatchSettleLimit) +} + +// SetBatchSize is a paid mutator transaction binding the contract method 0xd4673de9. +// +// Solidity: function setBatchSize(uint16 newBatchSize) returns() +func (_Contract *ContractTransactor) SetBatchSize(opts *bind.TransactOpts, newBatchSize uint16) (*types.Transaction, error) { + return _Contract.contract.Transact(opts, "setBatchSize", newBatchSize) +} + +// SetBatchSize is a paid mutator transaction binding the contract method 0xd4673de9. +// +// Solidity: function setBatchSize(uint16 newBatchSize) returns() +func (_Contract *ContractSession) SetBatchSize(newBatchSize uint16) (*types.Transaction, error) { + return _Contract.Contract.SetBatchSize(&_Contract.TransactOpts, newBatchSize) +} + +// SetBatchSize is a paid mutator transaction binding the contract method 0xd4673de9. +// +// Solidity: function setBatchSize(uint16 newBatchSize) returns() +func (_Contract *ContractTransactorSession) SetBatchSize(newBatchSize uint16) (*types.Transaction, error) { + return _Contract.Contract.SetBatchSize(&_Contract.TransactOpts, newBatchSize) +} + +// SetBridge is a paid mutator transaction binding the contract method 0x8dd14802. +// +// Solidity: function setBridge(address newBridge) returns() +func (_Contract *ContractTransactor) SetBridge(opts *bind.TransactOpts, newBridge common.Address) (*types.Transaction, error) { + return _Contract.contract.Transact(opts, "setBridge", newBridge) +} + +// SetBridge is a paid mutator transaction binding the contract method 0x8dd14802. +// +// Solidity: function setBridge(address newBridge) returns() +func (_Contract *ContractSession) SetBridge(newBridge common.Address) (*types.Transaction, error) { + return _Contract.Contract.SetBridge(&_Contract.TransactOpts, newBridge) +} + +// SetBridge is a paid mutator transaction binding the contract method 0x8dd14802. +// +// Solidity: function setBridge(address newBridge) returns() +func (_Contract *ContractTransactorSession) SetBridge(newBridge common.Address) (*types.Transaction, error) { + return _Contract.Contract.SetBridge(&_Contract.TransactOpts, newBridge) +} + +// SetTokenMaxLimit is a paid mutator transaction binding the contract method 0x7d7763ce. +// +// Solidity: function setTokenMaxLimit(address token, uint256 amount) returns() +func (_Contract *ContractTransactor) SetTokenMaxLimit(opts *bind.TransactOpts, token common.Address, amount *big.Int) (*types.Transaction, error) { + return _Contract.contract.Transact(opts, "setTokenMaxLimit", token, amount) +} + +// SetTokenMaxLimit is a paid mutator transaction binding the contract method 0x7d7763ce. +// +// Solidity: function setTokenMaxLimit(address token, uint256 amount) returns() +func (_Contract *ContractSession) SetTokenMaxLimit(token common.Address, amount *big.Int) (*types.Transaction, error) { + return _Contract.Contract.SetTokenMaxLimit(&_Contract.TransactOpts, token, amount) +} + +// SetTokenMaxLimit is a paid mutator transaction binding the contract method 0x7d7763ce. +// +// Solidity: function setTokenMaxLimit(address token, uint256 amount) returns() +func (_Contract *ContractTransactorSession) SetTokenMaxLimit(token common.Address, amount *big.Int) (*types.Transaction, error) { + return _Contract.Contract.SetTokenMaxLimit(&_Contract.TransactOpts, token, amount) +} + +// SetTokenMinLimit is a paid mutator transaction binding the contract method 0x920b0308. +// +// Solidity: function setTokenMinLimit(address token, uint256 amount) returns() +func (_Contract *ContractTransactor) SetTokenMinLimit(opts *bind.TransactOpts, token common.Address, amount *big.Int) (*types.Transaction, error) { + return _Contract.contract.Transact(opts, "setTokenMinLimit", token, amount) +} + +// SetTokenMinLimit is a paid mutator transaction binding the contract method 0x920b0308. +// +// Solidity: function setTokenMinLimit(address token, uint256 amount) returns() +func (_Contract *ContractSession) SetTokenMinLimit(token common.Address, amount *big.Int) (*types.Transaction, error) { + return _Contract.Contract.SetTokenMinLimit(&_Contract.TransactOpts, token, amount) +} + +// SetTokenMinLimit is a paid mutator transaction binding the contract method 0x920b0308. +// +// Solidity: function setTokenMinLimit(address token, uint256 amount) returns() +func (_Contract *ContractTransactorSession) SetTokenMinLimit(token common.Address, amount *big.Int) (*types.Transaction, error) { + return _Contract.Contract.SetTokenMinLimit(&_Contract.TransactOpts, token, amount) +} + +// Transfer is a paid mutator transaction binding the contract method 0xdbba0f01. +// +// Solidity: function transfer(address tokenAddress, uint256 amount, address recipientAddress) returns(bool) +func (_Contract *ContractTransactor) Transfer(opts *bind.TransactOpts, tokenAddress common.Address, amount *big.Int, recipientAddress common.Address) (*types.Transaction, error) { + return _Contract.contract.Transact(opts, "transfer", tokenAddress, amount, recipientAddress) +} + +// Transfer is a paid mutator transaction binding the contract method 0xdbba0f01. +// +// Solidity: function transfer(address tokenAddress, uint256 amount, address recipientAddress) returns(bool) +func (_Contract *ContractSession) Transfer(tokenAddress common.Address, amount *big.Int, recipientAddress common.Address) (*types.Transaction, error) { + return _Contract.Contract.Transfer(&_Contract.TransactOpts, tokenAddress, amount, recipientAddress) +} + +// Transfer is a paid mutator transaction binding the contract method 0xdbba0f01. +// +// Solidity: function transfer(address tokenAddress, uint256 amount, address recipientAddress) returns(bool) +func (_Contract *ContractTransactorSession) Transfer(tokenAddress common.Address, amount *big.Int, recipientAddress common.Address) (*types.Transaction, error) { + return _Contract.Contract.Transfer(&_Contract.TransactOpts, tokenAddress, amount, recipientAddress) +} + +// TransferAdmin is a paid mutator transaction binding the contract method 0x75829def. +// +// Solidity: function transferAdmin(address newAdmin) returns() +func (_Contract *ContractTransactor) TransferAdmin(opts *bind.TransactOpts, newAdmin common.Address) (*types.Transaction, error) { + return _Contract.contract.Transact(opts, "transferAdmin", newAdmin) +} + +// TransferAdmin is a paid mutator transaction binding the contract method 0x75829def. +// +// Solidity: function transferAdmin(address newAdmin) returns() +func (_Contract *ContractSession) TransferAdmin(newAdmin common.Address) (*types.Transaction, error) { + return _Contract.Contract.TransferAdmin(&_Contract.TransactOpts, newAdmin) +} + +// TransferAdmin is a paid mutator transaction binding the contract method 0x75829def. +// +// Solidity: function transferAdmin(address newAdmin) returns() +func (_Contract *ContractTransactorSession) TransferAdmin(newAdmin common.Address) (*types.Transaction, error) { + return _Contract.Contract.TransferAdmin(&_Contract.TransactOpts, newAdmin) +} + +// Unpause is a paid mutator transaction binding the contract method 0x3f4ba83a. +// +// Solidity: function unpause() returns() +func (_Contract *ContractTransactor) Unpause(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Contract.contract.Transact(opts, "unpause") +} + +// Unpause is a paid mutator transaction binding the contract method 0x3f4ba83a. +// +// Solidity: function unpause() returns() +func (_Contract *ContractSession) Unpause() (*types.Transaction, error) { + return _Contract.Contract.Unpause(&_Contract.TransactOpts) +} + +// Unpause is a paid mutator transaction binding the contract method 0x3f4ba83a. +// +// Solidity: function unpause() returns() +func (_Contract *ContractTransactorSession) Unpause() (*types.Transaction, error) { + return _Contract.Contract.Unpause(&_Contract.TransactOpts) +} + +// WhitelistToken is a paid mutator transaction binding the contract method 0x5fd94707. +// +// Solidity: function whitelistToken(address token, uint256 minimumAmount, uint256 maximumAmount, bool mintBurn) returns() +func (_Contract *ContractTransactor) WhitelistToken(opts *bind.TransactOpts, token common.Address, minimumAmount *big.Int, maximumAmount *big.Int, mintBurn bool) (*types.Transaction, error) { + return _Contract.contract.Transact(opts, "whitelistToken", token, minimumAmount, maximumAmount, mintBurn) +} + +// WhitelistToken is a paid mutator transaction binding the contract method 0x5fd94707. +// +// Solidity: function whitelistToken(address token, uint256 minimumAmount, uint256 maximumAmount, bool mintBurn) returns() +func (_Contract *ContractSession) WhitelistToken(token common.Address, minimumAmount *big.Int, maximumAmount *big.Int, mintBurn bool) (*types.Transaction, error) { + return _Contract.Contract.WhitelistToken(&_Contract.TransactOpts, token, minimumAmount, maximumAmount, mintBurn) +} + +// WhitelistToken is a paid mutator transaction binding the contract method 0x5fd94707. +// +// Solidity: function whitelistToken(address token, uint256 minimumAmount, uint256 maximumAmount, bool mintBurn) returns() +func (_Contract *ContractTransactorSession) WhitelistToken(token common.Address, minimumAmount *big.Int, maximumAmount *big.Int, mintBurn bool) (*types.Transaction, error) { + return _Contract.Contract.WhitelistToken(&_Contract.TransactOpts, token, minimumAmount, maximumAmount, mintBurn) +} + +// ContractAdminRoleTransferredIterator is returned from FilterAdminRoleTransferred and is used to iterate over the raw logs and unpacked data for AdminRoleTransferred events raised by the Contract contract. +type ContractAdminRoleTransferredIterator struct { + Event *ContractAdminRoleTransferred // 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 *ContractAdminRoleTransferredIterator) 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(ContractAdminRoleTransferred) + 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(ContractAdminRoleTransferred) + 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 *ContractAdminRoleTransferredIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ContractAdminRoleTransferredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ContractAdminRoleTransferred represents a AdminRoleTransferred event raised by the Contract contract. +type ContractAdminRoleTransferred struct { + PreviousAdmin common.Address + NewAdmin common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterAdminRoleTransferred is a free log retrieval operation binding the contract event 0xe379ac64de02d8184ca1a871ac486cb8137de77e485ede140e97057b9c765ffd. +// +// Solidity: event AdminRoleTransferred(address indexed previousAdmin, address indexed newAdmin) +func (_Contract *ContractFilterer) FilterAdminRoleTransferred(opts *bind.FilterOpts, previousAdmin []common.Address, newAdmin []common.Address) (*ContractAdminRoleTransferredIterator, error) { + + var previousAdminRule []interface{} + for _, previousAdminItem := range previousAdmin { + previousAdminRule = append(previousAdminRule, previousAdminItem) + } + var newAdminRule []interface{} + for _, newAdminItem := range newAdmin { + newAdminRule = append(newAdminRule, newAdminItem) + } + + logs, sub, err := _Contract.contract.FilterLogs(opts, "AdminRoleTransferred", previousAdminRule, newAdminRule) + if err != nil { + return nil, err + } + return &ContractAdminRoleTransferredIterator{contract: _Contract.contract, event: "AdminRoleTransferred", logs: logs, sub: sub}, nil +} + +// WatchAdminRoleTransferred is a free log subscription operation binding the contract event 0xe379ac64de02d8184ca1a871ac486cb8137de77e485ede140e97057b9c765ffd. +// +// Solidity: event AdminRoleTransferred(address indexed previousAdmin, address indexed newAdmin) +func (_Contract *ContractFilterer) WatchAdminRoleTransferred(opts *bind.WatchOpts, sink chan<- *ContractAdminRoleTransferred, previousAdmin []common.Address, newAdmin []common.Address) (event.Subscription, error) { + + var previousAdminRule []interface{} + for _, previousAdminItem := range previousAdmin { + previousAdminRule = append(previousAdminRule, previousAdminItem) + } + var newAdminRule []interface{} + for _, newAdminItem := range newAdmin { + newAdminRule = append(newAdminRule, newAdminItem) + } + + logs, sub, err := _Contract.contract.WatchLogs(opts, "AdminRoleTransferred", previousAdminRule, newAdminRule) + 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(ContractAdminRoleTransferred) + if err := _Contract.contract.UnpackLog(event, "AdminRoleTransferred", 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 +} + +// ParseAdminRoleTransferred is a log parse operation binding the contract event 0xe379ac64de02d8184ca1a871ac486cb8137de77e485ede140e97057b9c765ffd. +// +// Solidity: event AdminRoleTransferred(address indexed previousAdmin, address indexed newAdmin) +func (_Contract *ContractFilterer) ParseAdminRoleTransferred(log types.Log) (*ContractAdminRoleTransferred, error) { + event := new(ContractAdminRoleTransferred) + if err := _Contract.contract.UnpackLog(event, "AdminRoleTransferred", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ContractBridgeTransferredIterator is returned from FilterBridgeTransferred and is used to iterate over the raw logs and unpacked data for BridgeTransferred events raised by the Contract contract. +type ContractBridgeTransferredIterator struct { + Event *ContractBridgeTransferred // 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 *ContractBridgeTransferredIterator) 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(ContractBridgeTransferred) + 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(ContractBridgeTransferred) + 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 *ContractBridgeTransferredIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ContractBridgeTransferredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ContractBridgeTransferred represents a BridgeTransferred event raised by the Contract contract. +type ContractBridgeTransferred struct { + PreviousBridge common.Address + NewBridge common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterBridgeTransferred is a free log retrieval operation binding the contract event 0xcca5fddab921a878ddbd4edb737a2cf3ac6df70864f108606647d1b37a5e07a0. +// +// Solidity: event BridgeTransferred(address indexed previousBridge, address indexed newBridge) +func (_Contract *ContractFilterer) FilterBridgeTransferred(opts *bind.FilterOpts, previousBridge []common.Address, newBridge []common.Address) (*ContractBridgeTransferredIterator, error) { + + var previousBridgeRule []interface{} + for _, previousBridgeItem := range previousBridge { + previousBridgeRule = append(previousBridgeRule, previousBridgeItem) + } + var newBridgeRule []interface{} + for _, newBridgeItem := range newBridge { + newBridgeRule = append(newBridgeRule, newBridgeItem) + } + + logs, sub, err := _Contract.contract.FilterLogs(opts, "BridgeTransferred", previousBridgeRule, newBridgeRule) + if err != nil { + return nil, err + } + return &ContractBridgeTransferredIterator{contract: _Contract.contract, event: "BridgeTransferred", logs: logs, sub: sub}, nil +} + +// WatchBridgeTransferred is a free log subscription operation binding the contract event 0xcca5fddab921a878ddbd4edb737a2cf3ac6df70864f108606647d1b37a5e07a0. +// +// Solidity: event BridgeTransferred(address indexed previousBridge, address indexed newBridge) +func (_Contract *ContractFilterer) WatchBridgeTransferred(opts *bind.WatchOpts, sink chan<- *ContractBridgeTransferred, previousBridge []common.Address, newBridge []common.Address) (event.Subscription, error) { + + var previousBridgeRule []interface{} + for _, previousBridgeItem := range previousBridge { + previousBridgeRule = append(previousBridgeRule, previousBridgeItem) + } + var newBridgeRule []interface{} + for _, newBridgeItem := range newBridge { + newBridgeRule = append(newBridgeRule, newBridgeItem) + } + + logs, sub, err := _Contract.contract.WatchLogs(opts, "BridgeTransferred", previousBridgeRule, newBridgeRule) + 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(ContractBridgeTransferred) + if err := _Contract.contract.UnpackLog(event, "BridgeTransferred", 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 +} + +// ParseBridgeTransferred is a log parse operation binding the contract event 0xcca5fddab921a878ddbd4edb737a2cf3ac6df70864f108606647d1b37a5e07a0. +// +// Solidity: event BridgeTransferred(address indexed previousBridge, address indexed newBridge) +func (_Contract *ContractFilterer) ParseBridgeTransferred(log types.Log) (*ContractBridgeTransferred, error) { + event := new(ContractBridgeTransferred) + if err := _Contract.contract.UnpackLog(event, "BridgeTransferred", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ContractERC20DepositIterator is returned from FilterERC20Deposit and is used to iterate over the raw logs and unpacked data for ERC20Deposit events raised by the Contract contract. +type ContractERC20DepositIterator struct { + Event *ContractERC20Deposit // 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 *ContractERC20DepositIterator) 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(ContractERC20Deposit) + 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(ContractERC20Deposit) + 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 *ContractERC20DepositIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ContractERC20DepositIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ContractERC20Deposit represents a ERC20Deposit event raised by the Contract contract. +type ContractERC20Deposit struct { + DepositNonce *big.Int + BatchId *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterERC20Deposit is a free log retrieval operation binding the contract event 0x6c15ce44793c685a79cde26a0bd5419ef4f3a337991f156be7b365962001b4a7. +// +// Solidity: event ERC20Deposit(uint112 depositNonce, uint112 batchId) +func (_Contract *ContractFilterer) FilterERC20Deposit(opts *bind.FilterOpts) (*ContractERC20DepositIterator, error) { + + logs, sub, err := _Contract.contract.FilterLogs(opts, "ERC20Deposit") + if err != nil { + return nil, err + } + return &ContractERC20DepositIterator{contract: _Contract.contract, event: "ERC20Deposit", logs: logs, sub: sub}, nil +} + +// WatchERC20Deposit is a free log subscription operation binding the contract event 0x6c15ce44793c685a79cde26a0bd5419ef4f3a337991f156be7b365962001b4a7. +// +// Solidity: event ERC20Deposit(uint112 depositNonce, uint112 batchId) +func (_Contract *ContractFilterer) WatchERC20Deposit(opts *bind.WatchOpts, sink chan<- *ContractERC20Deposit) (event.Subscription, error) { + + logs, sub, err := _Contract.contract.WatchLogs(opts, "ERC20Deposit") + 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(ContractERC20Deposit) + if err := _Contract.contract.UnpackLog(event, "ERC20Deposit", 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 +} + +// ParseERC20Deposit is a log parse operation binding the contract event 0x6c15ce44793c685a79cde26a0bd5419ef4f3a337991f156be7b365962001b4a7. +// +// Solidity: event ERC20Deposit(uint112 depositNonce, uint112 batchId) +func (_Contract *ContractFilterer) ParseERC20Deposit(log types.Log) (*ContractERC20Deposit, error) { + event := new(ContractERC20Deposit) + if err := _Contract.contract.UnpackLog(event, "ERC20Deposit", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/clients/ethereum/interface.go b/clients/ethereum/interface.go index ae1d5aa9..d3ee7602 100644 --- a/clients/ethereum/interface.go +++ b/clients/ethereum/interface.go @@ -27,6 +27,8 @@ type ClientWrapper interface { Quorum(ctx context.Context) (*big.Int, error) GetStatusesAfterExecution(ctx context.Context, batchID *big.Int) ([]byte, error) BalanceAt(ctx context.Context, account common.Address, blockNumber *big.Int) (*big.Int, error) + TokenMintedBalances(ctx context.Context, token common.Address) (*big.Int, error) + WhitelistedTokensMintBurn(ctx context.Context, token common.Address) (bool, error) IsPaused(ctx context.Context) (bool, error) } diff --git a/clients/ethereum/wrappers/errors.go b/clients/ethereum/wrappers/errors.go index 8efee102..6a5cd7b3 100644 --- a/clients/ethereum/wrappers/errors.go +++ b/clients/ethereum/wrappers/errors.go @@ -6,4 +6,5 @@ var ( errNilErc20Contract = errors.New("nil ERC20 contract") errNilBlockchainClient = errors.New("nil blockchain client") errNilMultiSigContract = errors.New("nil multi sig contract") + errNilSafeContract = errors.New("nil safe contract") ) diff --git a/clients/ethereum/wrappers/ethereumChainWrapper.go b/clients/ethereum/wrappers/ethereumChainWrapper.go index 599bf3ac..02e1c53e 100644 --- a/clients/ethereum/wrappers/ethereumChainWrapper.go +++ b/clients/ethereum/wrappers/ethereumChainWrapper.go @@ -17,12 +17,14 @@ import ( type ArgsEthereumChainWrapper struct { StatusHandler core.StatusHandler MultiSigContract multiSigContract + SafeContract safeContract BlockchainClient blockchainClient } type ethereumChainWrapper struct { core.StatusHandler multiSigContract multiSigContract + safeContract safeContract blockchainClient blockchainClient } @@ -36,6 +38,7 @@ func NewEthereumChainWrapper(args ArgsEthereumChainWrapper) (*ethereumChainWrapp return ðereumChainWrapper{ StatusHandler: args.StatusHandler, multiSigContract: args.MultiSigContract, + safeContract: args.SafeContract, blockchainClient: args.BlockchainClient, }, nil } @@ -47,6 +50,9 @@ func checkArgs(args ArgsEthereumChainWrapper) error { if check.IfNilReflect(args.MultiSigContract) { return errNilMultiSigContract } + if check.IfNilReflect(args.SafeContract) { + return errNilSafeContract + } if check.IfNilReflect(args.BlockchainClient) { return errNilBlockchainClient } @@ -128,6 +134,18 @@ func (wrapper *ethereumChainWrapper) BalanceAt(ctx context.Context, account comm return wrapper.blockchainClient.BalanceAt(ctx, account, blockNumber) } +// TokenMintedBalances retuns the minted balance of the given token +func (wrapper *ethereumChainWrapper) TokenMintedBalances(ctx context.Context, token common.Address) (*big.Int, error) { + wrapper.AddIntMetric(core.MetricNumEthClientRequests, 1) + return wrapper.safeContract.TokenMintedBalances(&bind.CallOpts{Context: ctx}, token) +} + +// WhitelistedTokensMintBurn returns true if the token is whitelisted as a mintBurn token +func (wrapper *ethereumChainWrapper) WhitelistedTokensMintBurn(ctx context.Context, token common.Address) (bool, error) { + wrapper.AddIntMetric(core.MetricNumEthClientRequests, 1) + return wrapper.safeContract.WhitelistedTokensMintBurn(&bind.CallOpts{Context: ctx}, token) +} + // IsPaused returns true if the multisig contract is paused func (wrapper *ethereumChainWrapper) IsPaused(ctx context.Context) (bool, error) { return wrapper.multiSigContract.Paused(&bind.CallOpts{Context: ctx}) diff --git a/clients/ethereum/wrappers/ethereumChainWrapper_test.go b/clients/ethereum/wrappers/ethereumChainWrapper_test.go index 9473e933..7bb468d0 100644 --- a/clients/ethereum/wrappers/ethereumChainWrapper_test.go +++ b/clients/ethereum/wrappers/ethereumChainWrapper_test.go @@ -24,6 +24,7 @@ func createMockArgsEthereumChainWrapper() (ArgsEthereumChainWrapper, *testsCommo return ArgsEthereumChainWrapper{ MultiSigContract: &bridgeTests.MultiSigContractStub{}, + SafeContract: &bridgeTests.SafeContractStub{}, BlockchainClient: &interactors.BlockchainClientStub{}, StatusHandler: statusHandler, }, statusHandler diff --git a/clients/ethereum/wrappers/interface.go b/clients/ethereum/wrappers/interface.go index 6537ed82..bb41a6f6 100644 --- a/clients/ethereum/wrappers/interface.go +++ b/clients/ethereum/wrappers/interface.go @@ -25,6 +25,11 @@ type multiSigContract interface { Paused(opts *bind.CallOpts) (bool, error) } +type safeContract interface { + TokenMintedBalances(opts *bind.CallOpts, arg0 common.Address) (*big.Int, error) + WhitelistedTokensMintBurn(opts *bind.CallOpts, arg0 common.Address) (bool, error) +} + type blockchainClient interface { BlockNumber(ctx context.Context) (uint64, error) NonceAt(ctx context.Context, account common.Address, blockNumber *big.Int) (uint64, error) diff --git a/clients/multiversx/client.go b/clients/multiversx/client.go index ae940d80..9d47907f 100644 --- a/clients/multiversx/client.go +++ b/clients/multiversx/client.go @@ -111,7 +111,7 @@ func NewClient(args ClientArgs) (*client, error) { txHandler: &transactionHandler{ proxy: args.Proxy, relayerAddress: relayerAddress, - multisigAddressAsBech32: args.MultisigContractAddress.AddressAsBech32String(), + multisigAddressAsBech32: addressConverter.ToBech32String(args.MultisigContractAddress.AddressBytes()), nonceTxHandler: nonceTxsHandler, relayerPrivateKey: args.RelayerPrivateKey, singleSigner: &singlesig.Ed25519Signer{}, @@ -130,8 +130,8 @@ func NewClient(args ClientArgs) (*client, error) { } c.log.Info("NewMultiversXClient", - "relayer address", relayerAddress.AddressAsBech32String(), - "safe contract address", args.MultisigContractAddress.AddressAsBech32String()) + "relayer address", addressConverter.ToBech32String(relayerAddress.AddressBytes()), + "safe contract address", addressConverter.ToBech32String(args.MultisigContractAddress.AddressBytes())) return c, nil } @@ -373,6 +373,16 @@ func (c *client) checkIsPaused(ctx context.Context) error { return nil } +// IsMintBurnAllowed returns true if the provided token is whitelisted for mint/burn operations +func (c *client) IsMintBurnAllowed(ctx context.Context, token []byte) (bool, error) { + return c.isMintBurnAllowed(ctx, token) +} + +// AccumulatedBurnedTokens returns the accumulated burned tokens +func (c *client) AccumulatedBurnedTokens(ctx context.Context, token []byte) (*big.Int, error) { + return c.getAccumulatedBurnedTokens(ctx, token) +} + // CheckClientAvailability will check the client availability and will set the metric accordingly func (c *client) CheckClientAvailability(ctx context.Context) error { c.mut.Lock() diff --git a/clients/multiversx/mxClientDataGetter.go b/clients/multiversx/mxClientDataGetter.go index 90018d09..48e70cea 100644 --- a/clients/multiversx/mxClientDataGetter.go +++ b/clients/multiversx/mxClientDataGetter.go @@ -33,6 +33,8 @@ const ( signedFuncName = "signed" getAllStakedRelayersFuncName = "getAllStakedRelayers" isPausedFuncName = "isPaused" + isMintBurnAllowedFuncName = "isMintBurnAllowed" + getAccumulatedBurnedTokensFuncName = "getAccumulatedBurnedTokens" ) // ArgsMXClientDataGetter is the arguments DTO used in the NewMXClientDataGetter constructor @@ -200,6 +202,24 @@ func (dataGetter *mxClientDataGetter) ExecuteQueryReturningUint64(ctx context.Co return num, nil } +// ExecuteQueryReturningBigInt will try to execute the provided query and return the result as big.Int +func (dataGetter *mxClientDataGetter) ExecuteQueryReturningBigInt(ctx context.Context, request *data.VmValueRequest) (*big.Int, error) { + response, err := dataGetter.ExecuteQueryReturningBytes(ctx, request) + if err != nil { + return nil, err + } + + if len(response) == 0 { + return big.NewInt(0), nil + } + if len(response[0]) == 0 { + return big.NewInt(0), nil + } + + num := big.NewInt(0).SetBytes(response[0]) + return num, nil +} + func parseUInt64FromByteSlice(bytes []byte) (uint64, error) { num := big.NewInt(0).SetBytes(bytes) if !num.IsUint64() { @@ -227,6 +247,15 @@ func (dataGetter *mxClientDataGetter) executeQueryUint64FromBuilder(ctx context. return dataGetter.ExecuteQueryReturningUint64(ctx, vmValuesRequest) } +func (dataGetter *mxClientDataGetter) executeQueryBigIntFromBuilder(ctx context.Context, builder builders.VMQueryBuilder) (*big.Int, error) { + vmValuesRequest, err := builder.ToVmValueRequest() + if err != nil { + return nil, err + } + + return dataGetter.ExecuteQueryReturningBigInt(ctx, vmValuesRequest) +} + func (dataGetter *mxClientDataGetter) executeQueryBoolFromBuilder(ctx context.Context, builder builders.VMQueryBuilder) (bool, error) { vmValuesRequest, err := builder.ToVmValueRequest() if err != nil { @@ -411,6 +440,20 @@ func (dataGetter *mxClientDataGetter) IsPaused(ctx context.Context) (bool, error return dataGetter.executeQueryBoolFromBuilder(ctx, builder) } +func (dataGetter *mxClientDataGetter) isMintBurnAllowed(ctx context.Context, token []byte) (bool, error) { + builder := dataGetter.createDefaultVmQueryBuilder() + builder.Function(isMintBurnAllowedFuncName).ArgBytes(token) + + return dataGetter.executeQueryBoolFromBuilder(ctx, builder) +} + +func (dataGetter *mxClientDataGetter) getAccumulatedBurnedTokens(ctx context.Context, token []byte) (*big.Int, error) { + builder := dataGetter.createDefaultVmQueryBuilder() + builder.Function(getAccumulatedBurnedTokensFuncName).ArgBytes(token) + + return dataGetter.executeQueryBigIntFromBuilder(ctx, builder) +} + func getStatusFromBuff(buff []byte) (byte, error) { if len(buff) == 0 { return 0, errMalformedBatchResponse diff --git a/clients/multiversx/mxClientDataGetter_test.go b/clients/multiversx/mxClientDataGetter_test.go index fab0bdb8..b111f519 100644 --- a/clients/multiversx/mxClientDataGetter_test.go +++ b/clients/multiversx/mxClientDataGetter_test.go @@ -378,6 +378,60 @@ func TestMXClientDataGetter_ExecuteQueryReturningUint64(t *testing.T) { }) } +func TestMXClientDataGetter_ExecuteQueryReturningBigInt(t *testing.T) { + t.Parallel() + + args := createMockArgsMXClientDataGetter() + t.Run("nil request", func(t *testing.T) { + t.Parallel() + + dg, _ := NewMXClientDataGetter(args) + + result, err := dg.ExecuteQueryReturningBigInt(context.Background(), nil) + assert.Nil(t, result) + assert.Equal(t, errNilRequest, err) + }) + t.Run("empty response", func(t *testing.T) { + t.Parallel() + + dg, _ := NewMXClientDataGetter(args) + dg.proxy = createMockProxy(make([][]byte, 0)) + + result, err := dg.ExecuteQueryReturningBigInt(context.Background(), &data.VmValueRequest{}) + assert.Equal(t, big.NewInt(0), result) + assert.Nil(t, err) + }) + t.Run("empty byte slice on first element", func(t *testing.T) { + t.Parallel() + + dg, _ := NewMXClientDataGetter(args) + dg.proxy = createMockProxy([][]byte{make([]byte, 0)}) + + result, err := dg.ExecuteQueryReturningBigInt(context.Background(), &data.VmValueRequest{}) + assert.Equal(t, big.NewInt(0), result) + assert.Nil(t, err) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() + + dg, _ := NewMXClientDataGetter(args) + largeNumber := new(big.Int) + largeNumber.SetString("18446744073709551616", 10) + dg.proxy = createMockProxy([][]byte{largeNumber.Bytes()}) + + result, err := dg.ExecuteQueryReturningBigInt(context.Background(), &data.VmValueRequest{}) + assert.Equal(t, largeNumber, result) + assert.Nil(t, err) + + dg.proxy = createMockProxy([][]byte{{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}}) + + result, err = dg.ExecuteQueryReturningBigInt(context.Background(), &data.VmValueRequest{}) + largeNumber.SetString("79228162514264337593543950335", 10) + assert.Equal(t, largeNumber, result) + assert.Nil(t, err) + }) +} + func TestMXClientDataGetter_GetCurrentBatchAsDataBytes(t *testing.T) { t.Parallel() diff --git a/cmd/bridge/main.go b/cmd/bridge/main.go index 6bb2083f..d6adc687 100644 --- a/cmd/bridge/main.go +++ b/cmd/bridge/main.go @@ -184,6 +184,12 @@ func startRelay(ctx *cli.Context, version string) error { return err } + safeEthAddress := ethCommon.HexToAddress(cfg.Eth.SafeContractAddress) + safeInstance, err := contract.NewContract(safeEthAddress, ethClient) + if err != nil { + return err + } + argsContractsHolder := ethereum.ArgsErc20SafeContractsHolder{ EthClient: ethClient, EthClientStatusHandler: ethClientStatusHandler, @@ -212,6 +218,7 @@ func startRelay(ctx *cli.Context, version string) error { argsClientWrapper := wrappers.ArgsEthereumChainWrapper{ StatusHandler: ethClientStatusHandler, MultiSigContract: multiSigInstance, + SafeContract: safeInstance, BlockchainClient: ethClient, } @@ -352,6 +359,9 @@ func buildNetMessenger(cfg config.Config, marshalizer marshal.Marshalizer) (p2p. Port: cfg.P2P.Port, MaximumExpectedPeerCount: 0, ThresholdMinConnectedPeers: 0, + Transports: p2pConfig.P2PTransportConfig{ + TCP: cfg.P2P.Transport, + }, } peerDiscoveryConfig := p2pConfig.KadDhtPeerDiscoveryConfig{ Enabled: true, diff --git a/config/config.go b/config/config.go index 0c3cf741..c8556847 100644 --- a/config/config.go +++ b/config/config.go @@ -62,6 +62,7 @@ type ConfigP2P struct { ProtocolID string Transports p2pConfig.P2PTransportConfig AntifloodConfig config.AntifloodConfig + Transport p2pConfig.P2PTCPTransport } // ConfigRelayer configuration for general relayer configuration diff --git a/core/batchProcessor/batchProcessor.go b/core/batchProcessor/batchProcessor.go new file mode 100644 index 00000000..3d7240cd --- /dev/null +++ b/core/batchProcessor/batchProcessor.go @@ -0,0 +1,39 @@ +package batchProcessor + +import ( + "github.com/ethereum/go-ethereum/common" + "github.com/multiversx/mx-bridge-eth-go/clients" + "math/big" +) + +// ArgListsBatch is a struct that contains the batch data in a format that is easy to use +type ArgListsBatch struct { + Tokens []common.Address + Recipients []common.Address + ConvertedTokenBytes [][]byte + Amounts []*big.Int + Nonces []*big.Int +} + +// ExtractList will extract the batch data into a format that is easy to use +func ExtractList(batch *clients.TransferBatch) (*ArgListsBatch, error) { + arg := ArgListsBatch{} + + for _, dt := range batch.Deposits { + recipient := common.BytesToAddress(dt.ToBytes) + arg.Recipients = append(arg.Recipients, recipient) + + token := common.BytesToAddress(dt.ConvertedTokenBytes) + arg.Tokens = append(arg.Tokens, token) + + amount := big.NewInt(0).Set(dt.Amount) + arg.Amounts = append(arg.Amounts, amount) + + nonce := big.NewInt(0).SetUint64(dt.Nonce) + arg.Nonces = append(arg.Nonces, nonce) + + arg.ConvertedTokenBytes = append(arg.ConvertedTokenBytes, dt.ConvertedTokenBytes) + } + + return &arg, nil +} diff --git a/go.mod b/go.mod index bcf3ff34..b06f9a1e 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.20 require ( github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792 - github.com/ethereum/go-ethereum v1.10.26 + github.com/ethereum/go-ethereum v1.13.5 github.com/gin-contrib/cors v1.4.0 github.com/gin-contrib/pprof v1.4.0 github.com/gin-gonic/gin v1.9.1 @@ -14,31 +14,39 @@ require ( github.com/multiversx/mx-chain-logger-go v1.0.11 github.com/multiversx/mx-chain-p2p-go v1.0.18 github.com/multiversx/mx-sdk-go v1.3.6-rc1 + github.com/pelletier/go-toml v1.9.3 github.com/stretchr/testify v1.8.4 github.com/urfave/cli v1.22.10 ) require ( + github.com/Microsoft/go-winio v0.6.1 // indirect github.com/beevik/ntp v0.3.0 // indirect github.com/benbjohnson/clock v1.3.5 // indirect github.com/beorn7/perks v1.0.1 // indirect + github.com/bits-and-blooms/bitset v1.7.0 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect github.com/btcsuite/btcd/btcutil v1.1.3 // indirect github.com/bytedance/sonic v1.9.1 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect + github.com/consensys/bavard v0.1.13 // indirect + github.com/consensys/gnark-crypto v0.12.1 // indirect github.com/containerd/cgroups v1.1.0 // indirect github.com/coreos/go-systemd/v22 v22.5.0 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect + github.com/crate-crypto/go-kzg-4844 v0.7.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c // indirect - github.com/deckarep/golang-set v1.8.0 // indirect + github.com/deckarep/golang-set/v2 v2.1.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect github.com/denisbrodbeck/machineid v1.0.1 // indirect github.com/docker/go-units v0.5.0 // indirect github.com/elastic/gosigar v0.14.2 // indirect + github.com/ethereum/c-kzg-4844 v0.4.0 // indirect github.com/flynn/noise v1.0.0 // indirect github.com/francoispqt/gojay v1.2.13 // indirect + github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/gabriel-vasile/mimetype v1.4.2 // indirect github.com/gin-contrib/sse v0.1.0 // indirect github.com/go-logr/logr v1.2.4 // indirect @@ -47,14 +55,14 @@ require ( github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect github.com/go-playground/validator/v10 v10.14.0 // indirect - github.com/go-stack/stack v1.8.0 // indirect + github.com/go-stack/stack v1.8.1 // indirect github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect github.com/goccy/go-json v0.10.2 // indirect github.com/godbus/dbus/v5 v5.1.0 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/mock v1.6.0 // indirect github.com/golang/protobuf v1.5.3 // indirect - github.com/golang/snappy v0.0.4 // indirect + github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect github.com/google/gopacket v1.1.19 // indirect github.com/google/pprof v0.0.0-20230602150820-91b7bce49751 // indirect github.com/google/uuid v1.3.0 // indirect @@ -63,7 +71,8 @@ require ( github.com/hashicorp/go-multierror v1.1.1 // indirect github.com/hashicorp/golang-lru v0.6.0 // indirect github.com/hashicorp/golang-lru/v2 v2.0.2 // indirect - github.com/huin/goupnp v1.2.0 // indirect + github.com/holiman/uint256 v1.2.3 // indirect + github.com/huin/goupnp v1.3.0 // indirect github.com/ipfs/boxo v0.8.1 // indirect github.com/ipfs/go-cid v0.4.1 // indirect github.com/ipfs/go-datastore v0.6.0 // indirect @@ -99,6 +108,7 @@ require ( github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b // indirect github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc // indirect github.com/minio/sha256-simd v1.0.1 // indirect + github.com/mmcloughlin/addchain v0.4.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/mr-tron/base58 v1.2.0 // indirect @@ -120,7 +130,6 @@ require ( github.com/opentracing/opentracing-go v1.2.0 // indirect github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 // indirect github.com/pborman/uuid v1.2.1 // indirect - github.com/pelletier/go-toml v1.9.3 // indirect github.com/pelletier/go-toml/v2 v2.0.8 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect @@ -135,14 +144,14 @@ require ( github.com/quic-go/quic-go v0.33.0 // indirect github.com/quic-go/webtransport-go v0.5.3 // indirect github.com/raulk/go-watchdog v1.3.0 // indirect - github.com/rjeczalik/notify v0.9.1 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect github.com/smartystreets/assertions v1.13.1 // indirect github.com/spaolacci/murmur3 v1.1.0 // indirect + github.com/supranational/blst v0.3.11 // indirect github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 // indirect - github.com/tklauser/go-sysconf v0.3.5 // indirect - github.com/tklauser/numcpus v0.2.2 // indirect + github.com/tklauser/go-sysconf v0.3.12 // indirect + github.com/tklauser/numcpus v0.6.1 // indirect github.com/twitchyliquid64/golang-asm v0.15.1 // indirect github.com/tyler-smith/go-bip39 v1.1.0 // indirect github.com/ugorji/go/codec v1.2.11 // indirect @@ -158,17 +167,17 @@ require ( go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.24.0 // indirect golang.org/x/arch v0.3.0 // indirect - golang.org/x/crypto v0.9.0 // indirect - golang.org/x/exp v0.0.0-20230321023759-10a507213a29 // indirect - golang.org/x/mod v0.10.0 // indirect - golang.org/x/net v0.10.0 // indirect - golang.org/x/sync v0.2.0 // indirect - golang.org/x/sys v0.8.0 // indirect - golang.org/x/text v0.9.0 // indirect - golang.org/x/tools v0.9.1 // indirect + golang.org/x/crypto v0.14.0 // indirect + golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect + golang.org/x/mod v0.12.0 // indirect + golang.org/x/net v0.17.0 // indirect + golang.org/x/sync v0.3.0 // indirect + golang.org/x/sys v0.13.0 // indirect + golang.org/x/text v0.13.0 // indirect + golang.org/x/tools v0.13.0 // indirect gonum.org/v1/gonum v0.11.0 // indirect google.golang.org/protobuf v1.30.0 // indirect - gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect gopkg.in/yaml.v3 v3.0.1 // indirect lukechampine.com/blake3 v1.2.1 // indirect + rsc.io/tmplfunc v0.0.3 // indirect ) diff --git a/go.sum b/go.sum index f36f1542..76ab7132 100644 --- a/go.sum +++ b/go.sum @@ -8,7 +8,10 @@ dmitri.shuralyov.com/service/change v0.0.0-20181023043359-a85b471d5412/go.mod h1 dmitri.shuralyov.com/state v0.0.0-20180228185332-28bcc343414c/go.mod h1:0PRwlb0D6DFvNNtx+9ybjezNCa8XF0xaYcETyp6rHWU= git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/VictoriaMetrics/fastcache v1.6.0 h1:C/3Oi3EiBCqufydp1neRZkqcwmEiuRT9c3fqvvgKm5o= +github.com/DataDog/zstd v1.4.5 h1:EndNeuB0l9syBZhut0wns3gV1hL8zX8LIu6ZiVHWLIQ= +github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= +github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= +github.com/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bwt3uRKnkZU40= github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= github.com/beevik/ntp v0.3.0 h1:xzVrPrE4ziasFXgBVBZJDP0Wg/KpMwk2KHJ4Ba8GrDw= @@ -20,6 +23,8 @@ github.com/benbjohnson/clock v1.3.5/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZx github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bits-and-blooms/bitset v1.7.0 h1:YjAGVd3XmtK9ktAbX8Zg2g2PwLIMjGREZJHlV4j7NEo= +github.com/bits-and-blooms/bitset v1.7.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g= github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= github.com/btcsuite/btcd v0.22.0-beta.0.20220111032746-97732e52810c/go.mod h1:tjmYdS6MLJ5/s0Fj4DbLgSbDHbEqLJrtnHecBFkdz5M= @@ -60,6 +65,16 @@ github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583j github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cockroachdb/errors v1.8.1 h1:A5+txlVZfOqFBDa4mGz2bUWSp0aHElvHX2bKkdbQu+Y= +github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f h1:o/kfcElHqOiXqcou5a3rIlMc7oJbMQkeLk0VQJ7zgqY= +github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 h1:aPEJyR4rPBvDmeyi+l/FS/VtA00IWvjeFvjen1m1l1A= +github.com/cockroachdb/redact v1.0.8 h1:8QG/764wK+vmEYoOlfobpe12EQcS81ukx/a4hdVMxNw= +github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2 h1:IKgmqgMQlVJIZj19CdocBeSfSaiCbEBZGKODaixqtHM= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= +github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= +github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= +github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= +github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= github.com/containerd/cgroups v0.0.0-20201119153540-4cbc285b3327/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE= github.com/containerd/cgroups v1.1.0 h1:v8rEWFl6EoqHB+swVNjVoCJE8o3jX7e8nqBGPLaDFBM= github.com/containerd/cgroups v1.1.0/go.mod h1:6ppBcbh/NOOUU+dMKrykgaBnK9lCIBxHqJDGwsa1mIw= @@ -71,6 +86,8 @@ github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:ma github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/crate-crypto/go-kzg-4844 v0.7.0 h1:C0vgZRk4q4EZ/JgPfzuSoxdCq3C3mOZMBShovmncxvA= +github.com/crate-crypto/go-kzg-4844 v0.7.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -78,8 +95,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c h1:pFUpOrbxDR6AkioZ1ySsx5yxlDQZ8stG2b88gTPxgJU= github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c/go.mod h1:6UhI8N9EjYm1c2odKpFpAYeR8dsBeM7PtzQhRgxRr9U= -github.com/deckarep/golang-set v1.8.0 h1:sk9/l/KqpunDwP7pSjUg0keiOOLEnOBHzykLrsPppp4= -github.com/deckarep/golang-set v1.8.0/go.mod h1:5nI87KwE7wgsBU1F4GKAw2Qod7p5kyS383rP6+o6qqo= +github.com/deckarep/golang-set/v2 v2.1.0 h1:g47V4Or+DUdzbs8FxCCmgb6VYd+ptPAngjM6dtGktsI= +github.com/deckarep/golang-set/v2 v2.1.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= @@ -92,7 +109,6 @@ github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDD github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/edsrzf/mmap-go v1.0.0 h1:CEBF7HpRnUCSJgGUb5h1Gm7e3VkmVDrR8lvWVLtrOFw= github.com/elastic/gosigar v0.12.0/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= github.com/elastic/gosigar v0.14.2 h1:Dg80n8cr90OZ7x+bAax/QjoW/XqTI11RmA79ZwIm9/4= github.com/elastic/gosigar v0.14.2/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= @@ -100,8 +116,10 @@ github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymF github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/ethereum/go-ethereum v1.10.26 h1:i/7d9RBBwiXCEuyduBQzJw/mKmnvzsN14jqBmytw72s= -github.com/ethereum/go-ethereum v1.10.26/go.mod h1:EYFyF19u3ezGLD4RqOkLq+ZCXzYbLoNDdZlMt7kyKFg= +github.com/ethereum/c-kzg-4844 v0.4.0 h1:3MS1s4JtA868KpJxroZoepdV0ZKBp3u/O5HcZ7R3nlY= +github.com/ethereum/c-kzg-4844 v0.4.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= +github.com/ethereum/go-ethereum v1.13.5 h1:U6TCRciCqZRe4FPXmy1sMGxTfuk8P7u2UoinF3VbaFk= +github.com/ethereum/go-ethereum v1.13.5/go.mod h1:yMTu38GSuyxaYzQMViqNmQ1s3cE84abZexQmTgenWk0= github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5 h1:FtmdgXiUlNeRsoNMFlKLDt+S+6hbjVMEW6RGQ7aUf7c= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= github.com/flynn/noise v1.0.0 h1:DlTHqmzmvcEiKj+4RYo/imoswx/4r6iBlCMfVtrMXpQ= @@ -112,6 +130,7 @@ github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0X github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff h1:tY80oXqGNY4FhTFhk+o9oFHGINQ/+vhlm8HFzi6znCI= @@ -145,8 +164,8 @@ github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91 github.com/go-playground/validator/v10 v10.10.0/go.mod h1:74x4gJWsvQexRdW8Pn3dXSGrTK4nAUsbPlLADvpJkos= github.com/go-playground/validator/v10 v10.14.0 h1:vgvQWe3XCz3gIeFDm/HnTIbj6UGmg/+t63MyGU2n5js= github.com/go-playground/validator/v10 v10.14.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= -github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= +github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= github.com/go-yaml/yaml v2.1.0+incompatible/go.mod h1:w2MrLa16VYP0jy6N7M5kHaCkaLENm+P+Tv+MfurjSw0= @@ -157,11 +176,12 @@ github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5x github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-jwt/jwt/v4 v4.3.0 h1:kHL1vqdqWNfATmA0FNMdmZNMyZI1U6O31X4rlIPoBog= +github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= @@ -184,8 +204,9 @@ github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= +github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -206,6 +227,7 @@ github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OI github.com/google/pprof v0.0.0-20230602150820-91b7bce49751 h1:hR7/MlvK23p6+lIw9SN1TigNLn9ZnF3W4SYRKq2gAHs= github.com/google/pprof v0.0.0-20230602150820-91b7bce49751/go.mod h1:Jh3hGz2jkYak8qXPD19ryItVnUgpgeqzdkY/D0EaeuA= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= @@ -229,11 +251,13 @@ github.com/hashicorp/golang-lru v0.6.0/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uG github.com/hashicorp/golang-lru/v2 v2.0.2 h1:Dwmkdr5Nc/oBiXgJS3CDHNhJtIHkuZ3DZF5twqnfBdU= github.com/hashicorp/golang-lru/v2 v2.0.2/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= github.com/herumi/bls-go-binary v1.0.0 h1:PRPF6vPd35zyDy+tp86HwNnGdufCH2lZL0wZGxYvkRs= +github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7 h1:3JQNjnMRil1yD0IfZKHF9GxxWKDJGj8I0IqOUol//sw= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= -github.com/holiman/uint256 v1.2.0 h1:gpSYcPLWGv4sG43I2mVLiDZCNDh/EpGjSk8tmtxitHM= +github.com/holiman/uint256 v1.2.3 h1:K8UWO1HUJpRMXBxbmaY1Y8IAMZC/RsKB+ArEnnK4l5o= +github.com/holiman/uint256 v1.2.3/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/huin/goupnp v1.2.0 h1:uOKW26NG1hsSSbXIZ1IR7XP9Gjd1U8pnLaCMgntmkmY= -github.com/huin/goupnp v1.2.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= +github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= +github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= github.com/ipfs/boxo v0.8.1 h1:3DkKBCK+3rdEB5t77WDShUXXhktYwH99mkAsgajsKrU= github.com/ipfs/boxo v0.8.1/go.mod h1:xJ2hVb4La5WyD7GvKYE0lq2g1rmQZoCD2K4WNrV6aZI= github.com/ipfs/go-cid v0.4.1 h1:A/T3qGvxi4kpKWWcPC/PgbvDA2bjVLO7n4UeVwnbs/s= @@ -287,6 +311,8 @@ github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= @@ -323,11 +349,11 @@ github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd h1:br0buuQ854V8u83wA0rVZ8ttrq5CpaPZdvrK0LP2lOk= github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd/go.mod h1:QuCEs1Nt24+FYQEqAAncTDPJIuGs+LxK1MCiFL25pMU= -github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= +github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= @@ -347,6 +373,9 @@ github.com/minio/sha256-simd v1.0.1 h1:6kaan5IFmwTNynnKKpDHe6FWHohJOHhCPchzK49dz github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5xJjtbRSN8= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/pointerstructure v1.2.0 h1:O+i9nHnXS3l/9Wu7r4NrEdwA2VFTicjUEN1uBnDo34A= +github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= +github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= +github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -450,7 +479,6 @@ github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI= github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY= -github.com/prometheus/tsdb v0.7.1 h1:YZcsG11NqnK4czYLrWd9mpEuAJIHVQLwdrleYfszMAA= github.com/quic-go/qpack v0.4.0 h1:Cr9BXA1sQS2SmDUWjSofMPNKmvF6IiIfDRmgU0w1ZCo= github.com/quic-go/qpack v0.4.0/go.mod h1:UZVnYIfi5GRk+zI9UMaCPsmZ2xKJP7XBUvVyT1Knj9A= github.com/quic-go/qtls-go1-19 v0.3.3 h1:wznEHvJwd+2X3PqftRha0SUKmGsnb6dfArMhy9PeJVE= @@ -463,8 +491,7 @@ github.com/quic-go/webtransport-go v0.5.3 h1:5XMlzemqB4qmOlgIus5zB45AcZ2kCgCy2Ep github.com/quic-go/webtransport-go v0.5.3/go.mod h1:OhmmgJIzTTqXK5xvtuX0oBpLV2GkLWNDA+UeTGJXErU= github.com/raulk/go-watchdog v1.3.0 h1:oUmdlHxdkXRJlwfG0O9omj8ukerm8MEQavSiDTEtBsk= github.com/raulk/go-watchdog v1.3.0/go.mod h1:fIvOnLbF0b0ZwkB9YU4mOW9Did//4vPZtDqv66NfsMU= -github.com/rjeczalik/notify v0.9.1 h1:CLCKso/QK1snAlnhNR/CNvNiFU2saUtjV0bx3EwNeCE= -github.com/rjeczalik/notify v0.9.1/go.mod h1:rKwnCoCGeuQnwBtTSPL9Dad03Vh2n40ePRrjvIXnJho= +github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= @@ -510,7 +537,7 @@ github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d/go.mod h1:Udh github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e/go.mod h1:HuIsMU8RRBOtsCgI77wP899iHVBQpCmg4ErYMZB+2IA= github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/status-im/keycard-go v0.0.0-20190316090335-8537d3370df4 h1:Gb2Tyox57NRNuZ2d3rmvB3pcmbu7O1RS3m8WRx7ilrg= +github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobtDnDzA= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= @@ -526,13 +553,15 @@ github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= +github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= -github.com/tklauser/go-sysconf v0.3.5 h1:uu3Xl4nkLzQfXNsWn15rPc/HQCJKObbt1dKJeWp3vU4= -github.com/tklauser/go-sysconf v0.3.5/go.mod h1:MkWzOF4RMCshBAMXuhXJs64Rte09mITnppBXY/rYEFI= -github.com/tklauser/numcpus v0.2.2 h1:oyhllyrScuYI6g+h/zUvNXNp1wy7x8qQy3t/piefldA= -github.com/tklauser/numcpus v0.2.2/go.mod h1:x3qojaO3uyYt0i56EW/VUYs7uBvdl2fkfZFu0T9wgjM= +github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= +github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= +github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= +github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= @@ -544,7 +573,7 @@ github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZ github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli v1.22.10 h1:p8Fspmz3iTctJstry1PYS3HVdllxnEzTEsgIgtxTrCk= github.com/urfave/cli v1.22.10/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli/v2 v2.10.2 h1:x3p8awjp/2arX+Nl/G2040AZpOCHS/eMJJ1/a+mye4Y= +github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs= github.com/viant/assertly v0.4.8/go.mod h1:aGifi++jvCrUaklKEKT0BU95igDNaqkvz+49uaYMPRU= github.com/viant/toolbox v0.24.0/go.mod h1:OxMCG57V0PXuIP2HNQrtJf2CjqdmbrOx5EkMILuUhzM= github.com/warpfork/go-wish v0.0.0-20220906213052-39a1cc7a02d0 h1:GDDkbFiaK8jsSDJfjId/PEGEShv6ugrt4kYsC5UIDaQ= @@ -601,11 +630,11 @@ golang.org/x/crypto v0.0.0-20200602180216-279210d13fed/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g= -golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= +golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= +golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20230321023759-10a507213a29 h1:ooxPy7fPvB4kwsA2h+iBNHkAbp/4JxTSwCmvdjEYmug= -golang.org/x/exp v0.0.0-20230321023759-10a507213a29/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= +golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= +golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= @@ -617,8 +646,8 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.10.0 h1:lFO9qtOdlre5W1jxS3r/4szv2/6iXxScdzjoBMXNhYk= -golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= +golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -639,8 +668,8 @@ golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= -golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -654,8 +683,8 @@ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.2.0 h1:PUR+T4wwASmuSTYdKjYHI5TD22Wy5ogLU5qZCOLxBrI= -golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sys v0.0.0-20180810173357-98c5dad5d1a0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -676,27 +705,29 @@ golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210316164454-77fc1eacc6aa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= -golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba h1:O8mE0/t419eoIwhTFpKVkHiTs/Igowgfkj25AcZrtiE= +golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030000716-a0a13e073c7b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -715,8 +746,8 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.9.1 h1:8WMNJAz3zrtPmnYC7ISf5dEn3MT0gY7jBJfw27yrrLo= -golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= +golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -766,8 +797,7 @@ gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EV gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU= -gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= +gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -790,5 +820,7 @@ honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt lukechampine.com/blake3 v1.2.1 h1:YuqqRuaqsGV71BV/nm9xlI0MKUv4QC54jQnBChWbGnI= lukechampine.com/blake3 v1.2.1/go.mod h1:0OFRp7fBtAylGVCO40o87sbupkyIGgbpv1+M1k1LM6k= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= +rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= +rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= sourcegraph.com/sourcegraph/go-diff v0.5.0/go.mod h1:kuch7UrkMzY0X+p9CRK03kfuPQ2zzQcaEFbx8wA8rck= sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0= diff --git a/integrationTests/mock/ethereumChainMock.go b/integrationTests/mock/ethereumChainMock.go index f47dafee..a212334d 100644 --- a/integrationTests/mock/ethereumChainMock.go +++ b/integrationTests/mock/ethereumChainMock.go @@ -257,6 +257,16 @@ func (mock *EthereumChainMock) IsPaused(_ context.Context) (bool, error) { return false, nil } +// TokenMintedBalances - +func (mock *EthereumChainMock) TokenMintedBalances(_ context.Context, _ common.Address) (*big.Int, error) { + return big.NewInt(0), nil +} + +// WhitelistedTokensMintBurn - +func (mock *EthereumChainMock) WhitelistedTokensMintBurn(_ context.Context, _ common.Address) (bool, error) { + return false, nil +} + // IsInterfaceNil - func (mock *EthereumChainMock) IsInterfaceNil() bool { return mock == nil diff --git a/integrationTests/mock/multiversXContractStateMock.go b/integrationTests/mock/multiversXContractStateMock.go index 2df2e30f..f1258168 100644 --- a/integrationTests/mock/multiversXContractStateMock.go +++ b/integrationTests/mock/multiversXContractStateMock.go @@ -248,6 +248,8 @@ func (mock *multiversXContractStateMock) processVmRequests(vmRequest *data.VmVal return mock.vmRequestSigned(vmRequest), nil case "isPaused": return mock.vmRequestIsPaused(vmRequest), nil + case "isMintBurnAllowed": + return mock.vmRequestIsMintBurnAllowed(vmRequest), nil } panic("unimplemented function: " + vmRequest.FuncName) @@ -455,6 +457,10 @@ func (mock *multiversXContractStateMock) vmRequestIsPaused(_ *data.VmValueReques return createOkVmResponse([][]byte{BoolToByteSlice(false)}) } +func (mock *multiversXContractStateMock) vmRequestIsMintBurnAllowed(_ *data.VmValueRequest) *data.VmValuesResponseData { + return createOkVmResponse([][]byte{BoolToByteSlice(false)}) +} + func getActionIDFromString(data string) *big.Int { buff, err := hex.DecodeString(data) if err != nil { diff --git a/testsCommon/bridge/ethereumClientStub.go b/testsCommon/bridge/ethereumClientStub.go index f715fc95..76e6310d 100644 --- a/testsCommon/bridge/ethereumClientStub.go +++ b/testsCommon/bridge/ethereumClientStub.go @@ -6,19 +6,23 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/multiversx/mx-bridge-eth-go/clients" + "github.com/multiversx/mx-bridge-eth-go/core/batchProcessor" ) // EthereumClientStub - type EthereumClientStub struct { GetBatchCalled func(ctx context.Context, nonce uint64) (*clients.TransferBatch, error) WasExecutedCalled func(ctx context.Context, batchID uint64) (bool, error) - GenerateMessageHashCalled func(batch *clients.TransferBatch) (common.Hash, error) + GenerateMessageHashCalled func(batch *batchProcessor.ArgListsBatch, batchID uint64) (common.Hash, error) BroadcastSignatureForMessageHashCalled func(msgHash common.Hash) - ExecuteTransferCalled func(ctx context.Context, msgHash common.Hash, batch *clients.TransferBatch, quorum int) (string, error) + ExecuteTransferCalled func(ctx context.Context, msgHash common.Hash, batch *batchProcessor.ArgListsBatch, batchId uint64, quorum int) (string, error) CheckClientAvailabilityCalled func(ctx context.Context) error GetTransactionsStatusesCalled func(ctx context.Context, batchId uint64) ([]byte, error) GetQuorumSizeCalled func(ctx context.Context) (*big.Int, error) IsQuorumReachedCalled func(ctx context.Context, msgHash common.Hash) (bool, error) + CheckRequiredBalanceCalled func(ctx context.Context, erc20Address common.Address, value *big.Int) error + TokenMintedBalancesCalled func(ctx context.Context, token common.Address) (*big.Int, error) + WhitelistedTokensMintBurnCalled func(ctx context.Context, token common.Address) (bool, error) } // GetBatch - @@ -40,9 +44,9 @@ func (stub *EthereumClientStub) WasExecuted(ctx context.Context, batchID uint64) } // GenerateMessageHash - -func (stub *EthereumClientStub) GenerateMessageHash(batch *clients.TransferBatch) (common.Hash, error) { +func (stub *EthereumClientStub) GenerateMessageHash(batch *batchProcessor.ArgListsBatch, batchID uint64) (common.Hash, error) { if stub.GenerateMessageHashCalled != nil { - return stub.GenerateMessageHashCalled(batch) + return stub.GenerateMessageHashCalled(batch, batchID) } return common.Hash{}, errNotImplemented @@ -56,9 +60,9 @@ func (stub *EthereumClientStub) BroadcastSignatureForMessageHash(msgHash common. } // ExecuteTransfer - -func (stub *EthereumClientStub) ExecuteTransfer(ctx context.Context, msgHash common.Hash, batch *clients.TransferBatch, quorum int) (string, error) { +func (stub *EthereumClientStub) ExecuteTransfer(ctx context.Context, msgHash common.Hash, batch *batchProcessor.ArgListsBatch, batchId uint64, quorum int) (string, error) { if stub.ExecuteTransferCalled != nil { - return stub.ExecuteTransferCalled(ctx, msgHash, batch, quorum) + return stub.ExecuteTransferCalled(ctx, msgHash, batch, batchId, quorum) } return "", errNotImplemented @@ -100,6 +104,33 @@ func (stub *EthereumClientStub) IsQuorumReached(ctx context.Context, msgHash com return false, errNotImplemented } +// CheckRequiredBalance - +func (stub *EthereumClientStub) CheckRequiredBalance(ctx context.Context, erc20Address common.Address, value *big.Int) error { + if stub.CheckRequiredBalanceCalled != nil { + return stub.CheckRequiredBalanceCalled(ctx, erc20Address, value) + } + + return nil +} + +// TokenMintedBalances - +func (stub *EthereumClientStub) TokenMintedBalances(ctx context.Context, token common.Address) (*big.Int, error) { + if stub.TokenMintedBalancesCalled != nil { + return stub.TokenMintedBalancesCalled(ctx, token) + } + + return nil, nil +} + +// WhitelistedTokensMintBurn - +func (stub *EthereumClientStub) WhitelistedTokensMintBurn(ctx context.Context, token common.Address) (bool, error) { + if stub.WhitelistedTokensMintBurnCalled != nil { + return stub.WhitelistedTokensMintBurnCalled(ctx, token) + } + + return false, nil +} + // IsInterfaceNil - func (stub *EthereumClientStub) IsInterfaceNil() bool { return stub == nil diff --git a/testsCommon/bridge/ethereumClientWrapperStub.go b/testsCommon/bridge/ethereumClientWrapperStub.go index 1a476500..c9db506c 100644 --- a/testsCommon/bridge/ethereumClientWrapperStub.go +++ b/testsCommon/bridge/ethereumClientWrapperStub.go @@ -27,6 +27,8 @@ type EthereumClientWrapperStub struct { QuorumCalled func(ctx context.Context) (*big.Int, error) GetStatusesAfterExecutionCalled func(ctx context.Context, batchID *big.Int) ([]byte, error) BalanceAtCalled func(ctx context.Context, account common.Address, blockNumber *big.Int) (*big.Int, error) + TokenMintedBalancesCalled func(ctx context.Context, token common.Address) (*big.Int, error) + WhitelistedTokensMintBurnCalled func(ctx context.Context, token common.Address) (bool, error) SetIntMetricCalled func(metric string, value int) AddIntMetricCalled func(metric string, delta int) @@ -198,6 +200,22 @@ func (stub *EthereumClientWrapperStub) IsPaused(ctx context.Context) (bool, erro return false, nil } +// TokenMintedBalances - +func (stub *EthereumClientWrapperStub) TokenMintedBalances(ctx context.Context, token common.Address) (*big.Int, error) { + if stub.TokenMintedBalancesCalled != nil { + return stub.TokenMintedBalancesCalled(ctx, token) + } + return big.NewInt(0), nil +} + +// WhitelistedTokensMintBurn - +func (stub *EthereumClientWrapperStub) WhitelistedTokensMintBurn(ctx context.Context, token common.Address) (bool, error) { + if stub.WhitelistedTokensMintBurnCalled != nil { + return stub.WhitelistedTokensMintBurnCalled(ctx, token) + } + return false, nil +} + // IsInterfaceNil - func (stub *EthereumClientWrapperStub) IsInterfaceNil() bool { return stub == nil diff --git a/testsCommon/bridge/multiversxClientStub.go b/testsCommon/bridge/multiversxClientStub.go index 6c9a66ef..b5d37a1d 100644 --- a/testsCommon/bridge/multiversxClientStub.go +++ b/testsCommon/bridge/multiversxClientStub.go @@ -3,8 +3,8 @@ package bridge import ( "context" "errors" - "github.com/multiversx/mx-bridge-eth-go/clients" + "math/big" ) var errNotImplemented = errors.New("not implemented") @@ -30,6 +30,8 @@ type MultiversXClientStub struct { WasSignedCalled func(ctx context.Context, actionID uint64) (bool, error) PerformActionCalled func(ctx context.Context, actionID uint64, batch *clients.TransferBatch) (string, error) CheckClientAvailabilityCalled func(ctx context.Context) error + IsMintBurnAllowedCalled func(ctx context.Context, token []byte) (bool, error) + AccumulatedBurnedTokensCalled func(ctx context.Context, token []byte) (*big.Int, error) CloseCalled func() error } @@ -195,6 +197,22 @@ func (stub *MultiversXClientStub) CheckClientAvailability(ctx context.Context) e return nil } +// IsMintBurnAllowed - +func (stub *MultiversXClientStub) IsMintBurnAllowed(ctx context.Context, token []byte) (bool, error) { + if stub.IsMintBurnAllowedCalled != nil { + return stub.IsMintBurnAllowedCalled(ctx, token) + } + return false, nil +} + +// AccumulatedBurnedTokens - +func (stub *MultiversXClientStub) AccumulatedBurnedTokens(ctx context.Context, token []byte) (*big.Int, error) { + if stub.AccumulatedBurnedTokensCalled != nil { + return stub.AccumulatedBurnedTokensCalled(ctx, token) + } + return big.NewInt(0), nil +} + // Close - func (stub *MultiversXClientStub) Close() error { if stub.CloseCalled != nil { diff --git a/testsCommon/bridge/safeContractStub.go b/testsCommon/bridge/safeContractStub.go new file mode 100644 index 00000000..4ab40d38 --- /dev/null +++ b/testsCommon/bridge/safeContractStub.go @@ -0,0 +1,30 @@ +package bridge + +import ( + "math/big" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" +) + +// SafeContractStub - +type SafeContractStub struct { + TokenMintedBalancesCalled func(opts *bind.CallOpts, arg0 common.Address) (*big.Int, error) + WhitelistedTokensMintBurnCalled func(opts *bind.CallOpts, arg0 common.Address) (bool, error) +} + +// TokenMintedBalances - +func (stub *SafeContractStub) TokenMintedBalances(opts *bind.CallOpts, arg0 common.Address) (*big.Int, error) { + if stub.TokenMintedBalancesCalled != nil { + return stub.TokenMintedBalancesCalled(opts, arg0) + } + return big.NewInt(0), nil // or any other default value +} + +// WhitelistedTokensMintBurn - +func (stub *SafeContractStub) WhitelistedTokensMintBurn(opts *bind.CallOpts, arg0 common.Address) (bool, error) { + if stub.WhitelistedTokensMintBurnCalled != nil { + return stub.WhitelistedTokensMintBurnCalled(opts, arg0) + } + return false, nil // or any other default value +}