diff --git a/contracts/solidity/precompiles/testutil/contracts/StakingReverter.sol b/contracts/solidity/precompiles/testutil/contracts/StakingReverter.sol index 469267cb4..aef5d526b 100644 --- a/contracts/solidity/precompiles/testutil/contracts/StakingReverter.sol +++ b/contracts/solidity/precompiles/testutil/contracts/StakingReverter.sol @@ -49,6 +49,36 @@ contract StakingReverter { STAKING_CONTRACT.delegate(address(this), validatorAddress, 10); } + /// @dev nestedTryCatchDelegations performs nested try/catch calls to precompile + /// where inner calls revert intentionally. Only the successful delegations + /// outside the reverting scope should persist. + /// + /// Expected successful delegations: 1 (before loop) + outerTimes (after each catch) + 1 (after loop) + function nestedTryCatchDelegations(uint outerTimes, uint innerTimes, string calldata validatorAddress) external { + // Initial successful delegate before any nested reverts + STAKING_CONTRACT.delegate(address(this), validatorAddress, 10); + + for (uint i = 0; i < outerTimes; i++) { + // Outer call that will revert and be caught + try StakingReverter(address(this)).performDelegation(validatorAddress) { + // no-op + } catch { + // After catching the revert, perform a successful delegate + STAKING_CONTRACT.delegate(address(this), validatorAddress, 10); + + // Inner nested loop of reverting calls + for (uint j = 0; j < innerTimes; j++) { + try StakingReverter(address(this)).performDelegation(validatorAddress) { + // no-op + } catch {} + } + } + } + + // Final successful delegate after the loops + STAKING_CONTRACT.delegate(address(this), validatorAddress, 10); + } + function performDelegation(string calldata validatorAddress) external { STAKING_CONTRACT.delegate(address(this), validatorAddress, 10); revert(); diff --git a/precompiles/testutil/contracts/StakingReverter.json b/precompiles/testutil/contracts/StakingReverter.json index 9b4bc012f..c0ae8d765 100644 --- a/precompiles/testutil/contracts/StakingReverter.json +++ b/precompiles/testutil/contracts/StakingReverter.json @@ -161,6 +161,29 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "outerTimes", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "innerTimes", + "type": "uint256" + }, + { + "internalType": "string", + "name": "validatorAddress", + "type": "string" + } + ], + "name": "nestedTryCatchDelegations", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { @@ -193,8 +216,8 @@ "type": "function" } ], - "bytecode": "0x6080604052600080556111b7806100176000396000f3fe608060405234801561001057600080fd5b50600436106100625760003560e01c80634e5a8fe51461006757806352fce7b114610083578063668f452b1461009f578063922a4b67146100d0578063cbc367d4146100ec578063f66013d71461011c575b600080fd5b610081600480360381019061007c919061072a565b610138565b005b61009d6004803603810190610098919061072a565b6101da565b005b6100b960048036038101906100b4919061078a565b610282565b6040516100c79291906108c2565b60405180910390f35b6100ea60048036038101906100e5919061072a565b61031c565b005b61010660048036038101906101019190610950565b6104b3565b6040516101139190610b3b565b60405180910390f35b6101366004803603810190610131919061078a565b610563565b005b60008081548092919061014a90610b8c565b919050555060005b838110156101d4573073ffffffffffffffffffffffffffffffffffffffff1663f66013d784846040518363ffffffff1660e01b8152600401610195929190610c21565b600060405180830381600087803b1580156101af57600080fd5b505af19250505080156101c0575060015b5080806101cc90610b8c565b915050610152565b50505050565b6000808154809291906101ec90610b8c565b919050555060005b8381101561027c573073ffffffffffffffffffffffffffffffffffffffff1663f66013d784846040518363ffffffff1660e01b8152600401610237929190610c21565b600060405180830381600087803b15801561025157600080fd5b505af1158015610265573d6000803e3d6000fd5b50505050808061027490610b8c565b9150506101f4565b50505050565b600061028c6105ed565b61080073ffffffffffffffffffffffffffffffffffffffff1663241774e63086866040518463ffffffff1660e01b81526004016102cb93929190610c54565b600060405180830381865afa1580156102e8573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906103119190610e32565b915091509250929050565b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb308484600a6040518563ffffffff1660e01b815260040161035e9493929190610ed3565b6020604051808303816000875af115801561037d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103a19190610f3f565b5060005b83811015610427573073ffffffffffffffffffffffffffffffffffffffff1663f66013d784846040518363ffffffff1660e01b81526004016103e8929190610c21565b600060405180830381600087803b15801561040257600080fd5b505af1925050508015610413575060015b50808061041f90610b8c565b9150506103a5565b5061080073ffffffffffffffffffffffffffffffffffffffff166353266bbb308484600a6040518563ffffffff1660e01b815260040161046a9493929190610ed3565b6020604051808303816000875af1158015610489573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104ad9190610f3f565b50505050565b6104bb610607565b60005b8381101561055c5761080073ffffffffffffffffffffffffffffffffffffffff1663223b3b7a846040518263ffffffff1660e01b81526004016105019190610f6c565b600060405180830381865afa15801561051e573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906105479190611138565b9150808061055490610b8c565b9150506104be565b5092915050565b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb308484600a6040518563ffffffff1660e01b81526004016105a59493929190610ed3565b6020604051808303816000875af11580156105c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105e89190610f3f565b600080fd5b604051806040016040528060608152602001600081525090565b60405180610160016040528060608152602001606081526020016000151581526020016000600381111561063e5761063d6109ab565b5b8152602001600081526020016000815260200160608152602001600060070b8152602001600060070b815260200160008152602001600081525090565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b6106a28161068f565b81146106ad57600080fd5b50565b6000813590506106bf81610699565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126106ea576106e96106c5565b5b8235905067ffffffffffffffff811115610707576107066106ca565b5b602083019150836001820283011115610723576107226106cf565b5b9250929050565b60008060006040848603121561074357610742610685565b5b6000610751868287016106b0565b935050602084013567ffffffffffffffff8111156107725761077161068a565b5b61077e868287016106d4565b92509250509250925092565b600080602083850312156107a1576107a0610685565b5b600083013567ffffffffffffffff8111156107bf576107be61068a565b5b6107cb858286016106d4565b92509250509250929050565b6107e08161068f565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610820578082015181840152602081019050610805565b60008484015250505050565b6000601f19601f8301169050919050565b6000610848826107e6565b61085281856107f1565b9350610862818560208601610802565b61086b8161082c565b840191505092915050565b61087f8161068f565b82525050565b600060408301600083015184820360008601526108a2828261083d565b91505060208301516108b76020860182610876565b508091505092915050565b60006040820190506108d760008301856107d7565b81810360208301526108e98184610885565b90509392505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061091d826108f2565b9050919050565b61092d81610912565b811461093857600080fd5b50565b60008135905061094a81610924565b92915050565b6000806040838503121561096757610966610685565b5b6000610975858286016106b0565b92505060206109868582860161093b565b9150509250929050565b60008115159050919050565b6109a581610990565b82525050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600481106109eb576109ea6109ab565b5b50565b60008190506109fc826109da565b919050565b6000610a0c826109ee565b9050919050565b610a1c81610a01565b82525050565b60008160070b9050919050565b610a3881610a22565b82525050565b6000610160830160008301518482036000860152610a5c828261083d565b91505060208301518482036020860152610a76828261083d565b9150506040830151610a8b604086018261099c565b506060830151610a9e6060860182610a13565b506080830151610ab16080860182610876565b5060a0830151610ac460a0860182610876565b5060c083015184820360c0860152610adc828261083d565b91505060e0830151610af160e0860182610a2f565b50610100830151610b06610100860182610a2f565b50610120830151610b1b610120860182610876565b50610140830151610b30610140860182610876565b508091505092915050565b60006020820190508181036000830152610b558184610a3e565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610b978261068f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610bc957610bc8610b5d565b5b600182019050919050565b600082825260208201905092915050565b82818337600083830152505050565b6000610c008385610bd4565b9350610c0d838584610be5565b610c168361082c565b840190509392505050565b60006020820190508181036000830152610c3c818486610bf4565b90509392505050565b610c4e81610912565b82525050565b6000604082019050610c696000830186610c45565b8181036020830152610c7c818486610bf4565b9050949350505050565b600081519050610c9581610699565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610cd88261082c565b810181811067ffffffffffffffff82111715610cf757610cf6610ca0565b5b80604052505050565b6000610d0a61067b565b9050610d168282610ccf565b919050565b600080fd5b600080fd5b600067ffffffffffffffff821115610d4057610d3f610ca0565b5b610d498261082c565b9050602081019050919050565b6000610d69610d6484610d25565b610d00565b905082815260208101848484011115610d8557610d84610d20565b5b610d90848285610802565b509392505050565b600082601f830112610dad57610dac6106c5565b5b8151610dbd848260208601610d56565b91505092915050565b600060408284031215610ddc57610ddb610c9b565b5b610de66040610d00565b9050600082015167ffffffffffffffff811115610e0657610e05610d1b565b5b610e1284828501610d98565b6000830152506020610e2684828501610c86565b60208301525092915050565b60008060408385031215610e4957610e48610685565b5b6000610e5785828601610c86565b925050602083015167ffffffffffffffff811115610e7857610e7761068a565b5b610e8485828601610dc6565b9150509250929050565b6000819050919050565b6000819050919050565b6000610ebd610eb8610eb384610e8e565b610e98565b61068f565b9050919050565b610ecd81610ea2565b82525050565b6000606082019050610ee86000830187610c45565b8181036020830152610efb818587610bf4565b9050610f0a6040830184610ec4565b95945050505050565b610f1c81610990565b8114610f2757600080fd5b50565b600081519050610f3981610f13565b92915050565b600060208284031215610f5557610f54610685565b5b6000610f6384828501610f2a565b91505092915050565b6000602082019050610f816000830184610c45565b92915050565b60048110610f9457600080fd5b50565b600081519050610fa681610f87565b92915050565b610fb581610a22565b8114610fc057600080fd5b50565b600081519050610fd281610fac565b92915050565b60006101608284031215610fef57610fee610c9b565b5b610ffa610160610d00565b9050600082015167ffffffffffffffff81111561101a57611019610d1b565b5b61102684828501610d98565b600083015250602082015167ffffffffffffffff81111561104a57611049610d1b565b5b61105684828501610d98565b602083015250604061106a84828501610f2a565b604083015250606061107e84828501610f97565b606083015250608061109284828501610c86565b60808301525060a06110a684828501610c86565b60a08301525060c082015167ffffffffffffffff8111156110ca576110c9610d1b565b5b6110d684828501610d98565b60c08301525060e06110ea84828501610fc3565b60e0830152506101006110ff84828501610fc3565b6101008301525061012061111584828501610c86565b6101208301525061014061112b84828501610c86565b6101408301525092915050565b60006020828403121561114e5761114d610685565b5b600082015167ffffffffffffffff81111561116c5761116b61068a565b5b61117884828501610fd8565b9150509291505056fea2646970667358221220f5f833c34bff960673e6df4fad50cb2e0deb7da5035552189c3d4e09281dd21264736f6c63430008140033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100625760003560e01c80634e5a8fe51461006757806352fce7b114610083578063668f452b1461009f578063922a4b67146100d0578063cbc367d4146100ec578063f66013d71461011c575b600080fd5b610081600480360381019061007c919061072a565b610138565b005b61009d6004803603810190610098919061072a565b6101da565b005b6100b960048036038101906100b4919061078a565b610282565b6040516100c79291906108c2565b60405180910390f35b6100ea60048036038101906100e5919061072a565b61031c565b005b61010660048036038101906101019190610950565b6104b3565b6040516101139190610b3b565b60405180910390f35b6101366004803603810190610131919061078a565b610563565b005b60008081548092919061014a90610b8c565b919050555060005b838110156101d4573073ffffffffffffffffffffffffffffffffffffffff1663f66013d784846040518363ffffffff1660e01b8152600401610195929190610c21565b600060405180830381600087803b1580156101af57600080fd5b505af19250505080156101c0575060015b5080806101cc90610b8c565b915050610152565b50505050565b6000808154809291906101ec90610b8c565b919050555060005b8381101561027c573073ffffffffffffffffffffffffffffffffffffffff1663f66013d784846040518363ffffffff1660e01b8152600401610237929190610c21565b600060405180830381600087803b15801561025157600080fd5b505af1158015610265573d6000803e3d6000fd5b50505050808061027490610b8c565b9150506101f4565b50505050565b600061028c6105ed565b61080073ffffffffffffffffffffffffffffffffffffffff1663241774e63086866040518463ffffffff1660e01b81526004016102cb93929190610c54565b600060405180830381865afa1580156102e8573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906103119190610e32565b915091509250929050565b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb308484600a6040518563ffffffff1660e01b815260040161035e9493929190610ed3565b6020604051808303816000875af115801561037d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103a19190610f3f565b5060005b83811015610427573073ffffffffffffffffffffffffffffffffffffffff1663f66013d784846040518363ffffffff1660e01b81526004016103e8929190610c21565b600060405180830381600087803b15801561040257600080fd5b505af1925050508015610413575060015b50808061041f90610b8c565b9150506103a5565b5061080073ffffffffffffffffffffffffffffffffffffffff166353266bbb308484600a6040518563ffffffff1660e01b815260040161046a9493929190610ed3565b6020604051808303816000875af1158015610489573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104ad9190610f3f565b50505050565b6104bb610607565b60005b8381101561055c5761080073ffffffffffffffffffffffffffffffffffffffff1663223b3b7a846040518263ffffffff1660e01b81526004016105019190610f6c565b600060405180830381865afa15801561051e573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906105479190611138565b9150808061055490610b8c565b9150506104be565b5092915050565b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb308484600a6040518563ffffffff1660e01b81526004016105a59493929190610ed3565b6020604051808303816000875af11580156105c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105e89190610f3f565b600080fd5b604051806040016040528060608152602001600081525090565b60405180610160016040528060608152602001606081526020016000151581526020016000600381111561063e5761063d6109ab565b5b8152602001600081526020016000815260200160608152602001600060070b8152602001600060070b815260200160008152602001600081525090565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b6106a28161068f565b81146106ad57600080fd5b50565b6000813590506106bf81610699565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126106ea576106e96106c5565b5b8235905067ffffffffffffffff811115610707576107066106ca565b5b602083019150836001820283011115610723576107226106cf565b5b9250929050565b60008060006040848603121561074357610742610685565b5b6000610751868287016106b0565b935050602084013567ffffffffffffffff8111156107725761077161068a565b5b61077e868287016106d4565b92509250509250925092565b600080602083850312156107a1576107a0610685565b5b600083013567ffffffffffffffff8111156107bf576107be61068a565b5b6107cb858286016106d4565b92509250509250929050565b6107e08161068f565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610820578082015181840152602081019050610805565b60008484015250505050565b6000601f19601f8301169050919050565b6000610848826107e6565b61085281856107f1565b9350610862818560208601610802565b61086b8161082c565b840191505092915050565b61087f8161068f565b82525050565b600060408301600083015184820360008601526108a2828261083d565b91505060208301516108b76020860182610876565b508091505092915050565b60006040820190506108d760008301856107d7565b81810360208301526108e98184610885565b90509392505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061091d826108f2565b9050919050565b61092d81610912565b811461093857600080fd5b50565b60008135905061094a81610924565b92915050565b6000806040838503121561096757610966610685565b5b6000610975858286016106b0565b92505060206109868582860161093b565b9150509250929050565b60008115159050919050565b6109a581610990565b82525050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600481106109eb576109ea6109ab565b5b50565b60008190506109fc826109da565b919050565b6000610a0c826109ee565b9050919050565b610a1c81610a01565b82525050565b60008160070b9050919050565b610a3881610a22565b82525050565b6000610160830160008301518482036000860152610a5c828261083d565b91505060208301518482036020860152610a76828261083d565b9150506040830151610a8b604086018261099c565b506060830151610a9e6060860182610a13565b506080830151610ab16080860182610876565b5060a0830151610ac460a0860182610876565b5060c083015184820360c0860152610adc828261083d565b91505060e0830151610af160e0860182610a2f565b50610100830151610b06610100860182610a2f565b50610120830151610b1b610120860182610876565b50610140830151610b30610140860182610876565b508091505092915050565b60006020820190508181036000830152610b558184610a3e565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610b978261068f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610bc957610bc8610b5d565b5b600182019050919050565b600082825260208201905092915050565b82818337600083830152505050565b6000610c008385610bd4565b9350610c0d838584610be5565b610c168361082c565b840190509392505050565b60006020820190508181036000830152610c3c818486610bf4565b90509392505050565b610c4e81610912565b82525050565b6000604082019050610c696000830186610c45565b8181036020830152610c7c818486610bf4565b9050949350505050565b600081519050610c9581610699565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610cd88261082c565b810181811067ffffffffffffffff82111715610cf757610cf6610ca0565b5b80604052505050565b6000610d0a61067b565b9050610d168282610ccf565b919050565b600080fd5b600080fd5b600067ffffffffffffffff821115610d4057610d3f610ca0565b5b610d498261082c565b9050602081019050919050565b6000610d69610d6484610d25565b610d00565b905082815260208101848484011115610d8557610d84610d20565b5b610d90848285610802565b509392505050565b600082601f830112610dad57610dac6106c5565b5b8151610dbd848260208601610d56565b91505092915050565b600060408284031215610ddc57610ddb610c9b565b5b610de66040610d00565b9050600082015167ffffffffffffffff811115610e0657610e05610d1b565b5b610e1284828501610d98565b6000830152506020610e2684828501610c86565b60208301525092915050565b60008060408385031215610e4957610e48610685565b5b6000610e5785828601610c86565b925050602083015167ffffffffffffffff811115610e7857610e7761068a565b5b610e8485828601610dc6565b9150509250929050565b6000819050919050565b6000819050919050565b6000610ebd610eb8610eb384610e8e565b610e98565b61068f565b9050919050565b610ecd81610ea2565b82525050565b6000606082019050610ee86000830187610c45565b8181036020830152610efb818587610bf4565b9050610f0a6040830184610ec4565b95945050505050565b610f1c81610990565b8114610f2757600080fd5b50565b600081519050610f3981610f13565b92915050565b600060208284031215610f5557610f54610685565b5b6000610f6384828501610f2a565b91505092915050565b6000602082019050610f816000830184610c45565b92915050565b60048110610f9457600080fd5b50565b600081519050610fa681610f87565b92915050565b610fb581610a22565b8114610fc057600080fd5b50565b600081519050610fd281610fac565b92915050565b60006101608284031215610fef57610fee610c9b565b5b610ffa610160610d00565b9050600082015167ffffffffffffffff81111561101a57611019610d1b565b5b61102684828501610d98565b600083015250602082015167ffffffffffffffff81111561104a57611049610d1b565b5b61105684828501610d98565b602083015250604061106a84828501610f2a565b604083015250606061107e84828501610f97565b606083015250608061109284828501610c86565b60808301525060a06110a684828501610c86565b60a08301525060c082015167ffffffffffffffff8111156110ca576110c9610d1b565b5b6110d684828501610d98565b60c08301525060e06110ea84828501610fc3565b60e0830152506101006110ff84828501610fc3565b6101008301525061012061111584828501610c86565b6101208301525061014061112b84828501610c86565b6101408301525092915050565b60006020828403121561114e5761114d610685565b5b600082015167ffffffffffffffff81111561116c5761116b61068a565b5b61117884828501610fd8565b9150509291505056fea2646970667358221220f5f833c34bff960673e6df4fad50cb2e0deb7da5035552189c3d4e09281dd21264736f6c63430008140033", + "bytecode": "0x60806040526000805561150f806100176000396000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c8063668f452b1161005b578063668f452b146100d6578063922a4b6714610107578063cbc367d414610123578063f66013d7146101535761007d565b80634d9db92b146100825780634e5a8fe51461009e57806352fce7b1146100ba575b600080fd5b61009c60048036038101906100979190610a0e565b61016f565b005b6100b860048036038101906100b39190610a82565b61041c565b005b6100d460048036038101906100cf9190610a82565b6104be565b005b6100f060048036038101906100eb9190610ae2565b610566565b6040516100fe929190610c1a565b60405180910390f35b610121600480360381019061011c9190610a82565b610600565b005b61013d60048036038101906101389190610ca8565b610797565b60405161014a9190610e93565b60405180910390f35b61016d60048036038101906101689190610ae2565b610847565b005b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb308484600a6040518563ffffffff1660e01b81526004016101b19493929190610f56565b6020604051808303816000875af11580156101d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f49190610fc2565b5060005b8481101561038f573073ffffffffffffffffffffffffffffffffffffffff1663f66013d784846040518363ffffffff1660e01b815260040161023b929190610fef565b600060405180830381600087803b15801561025557600080fd5b505af1925050508015610266575060015b61037b5761080073ffffffffffffffffffffffffffffffffffffffff166353266bbb308585600a6040518563ffffffff1660e01b81526004016102ac9493929190610f56565b6020604051808303816000875af11580156102cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102ef9190610fc2565b5060005b84811015610375573073ffffffffffffffffffffffffffffffffffffffff1663f66013d785856040518363ffffffff1660e01b8152600401610336929190610fef565b600060405180830381600087803b15801561035057600080fd5b505af1925050508015610361575060015b50808061036d90611042565b9150506102f3565b5061037c565b5b808061038790611042565b9150506101f8565b5061080073ffffffffffffffffffffffffffffffffffffffff166353266bbb308484600a6040518563ffffffff1660e01b81526004016103d29493929190610f56565b6020604051808303816000875af11580156103f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104159190610fc2565b5050505050565b60008081548092919061042e90611042565b919050555060005b838110156104b8573073ffffffffffffffffffffffffffffffffffffffff1663f66013d784846040518363ffffffff1660e01b8152600401610479929190610fef565b600060405180830381600087803b15801561049357600080fd5b505af19250505080156104a4575060015b5080806104b090611042565b915050610436565b50505050565b6000808154809291906104d090611042565b919050555060005b83811015610560573073ffffffffffffffffffffffffffffffffffffffff1663f66013d784846040518363ffffffff1660e01b815260040161051b929190610fef565b600060405180830381600087803b15801561053557600080fd5b505af1158015610549573d6000803e3d6000fd5b50505050808061055890611042565b9150506104d8565b50505050565b60006105706108d1565b61080073ffffffffffffffffffffffffffffffffffffffff1663241774e63086866040518463ffffffff1660e01b81526004016105af9392919061108a565b600060405180830381865afa1580156105cc573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906105f59190611268565b915091509250929050565b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb308484600a6040518563ffffffff1660e01b81526004016106429493929190610f56565b6020604051808303816000875af1158015610661573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106859190610fc2565b5060005b8381101561070b573073ffffffffffffffffffffffffffffffffffffffff1663f66013d784846040518363ffffffff1660e01b81526004016106cc929190610fef565b600060405180830381600087803b1580156106e657600080fd5b505af19250505080156106f7575060015b50808061070390611042565b915050610689565b5061080073ffffffffffffffffffffffffffffffffffffffff166353266bbb308484600a6040518563ffffffff1660e01b815260040161074e9493929190610f56565b6020604051808303816000875af115801561076d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107919190610fc2565b50505050565b61079f6108eb565b60005b838110156108405761080073ffffffffffffffffffffffffffffffffffffffff1663223b3b7a846040518263ffffffff1660e01b81526004016107e591906112c4565b600060405180830381865afa158015610802573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061082b9190611490565b9150808061083890611042565b9150506107a2565b5092915050565b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb308484600a6040518563ffffffff1660e01b81526004016108899493929190610f56565b6020604051808303816000875af11580156108a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108cc9190610fc2565b600080fd5b604051806040016040528060608152602001600081525090565b60405180610160016040528060608152602001606081526020016000151581526020016000600381111561092257610921610d03565b5b8152602001600081526020016000815260200160608152602001600060070b8152602001600060070b815260200160008152602001600081525090565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b61098681610973565b811461099157600080fd5b50565b6000813590506109a38161097d565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126109ce576109cd6109a9565b5b8235905067ffffffffffffffff8111156109eb576109ea6109ae565b5b602083019150836001820283011115610a0757610a066109b3565b5b9250929050565b60008060008060608587031215610a2857610a27610969565b5b6000610a3687828801610994565b9450506020610a4787828801610994565b935050604085013567ffffffffffffffff811115610a6857610a6761096e565b5b610a74878288016109b8565b925092505092959194509250565b600080600060408486031215610a9b57610a9a610969565b5b6000610aa986828701610994565b935050602084013567ffffffffffffffff811115610aca57610ac961096e565b5b610ad6868287016109b8565b92509250509250925092565b60008060208385031215610af957610af8610969565b5b600083013567ffffffffffffffff811115610b1757610b1661096e565b5b610b23858286016109b8565b92509250509250929050565b610b3881610973565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610b78578082015181840152602081019050610b5d565b60008484015250505050565b6000601f19601f8301169050919050565b6000610ba082610b3e565b610baa8185610b49565b9350610bba818560208601610b5a565b610bc381610b84565b840191505092915050565b610bd781610973565b82525050565b60006040830160008301518482036000860152610bfa8282610b95565b9150506020830151610c0f6020860182610bce565b508091505092915050565b6000604082019050610c2f6000830185610b2f565b8181036020830152610c418184610bdd565b90509392505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610c7582610c4a565b9050919050565b610c8581610c6a565b8114610c9057600080fd5b50565b600081359050610ca281610c7c565b92915050565b60008060408385031215610cbf57610cbe610969565b5b6000610ccd85828601610994565b9250506020610cde85828601610c93565b9150509250929050565b60008115159050919050565b610cfd81610ce8565b82525050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60048110610d4357610d42610d03565b5b50565b6000819050610d5482610d32565b919050565b6000610d6482610d46565b9050919050565b610d7481610d59565b82525050565b60008160070b9050919050565b610d9081610d7a565b82525050565b6000610160830160008301518482036000860152610db48282610b95565b91505060208301518482036020860152610dce8282610b95565b9150506040830151610de36040860182610cf4565b506060830151610df66060860182610d6b565b506080830151610e096080860182610bce565b5060a0830151610e1c60a0860182610bce565b5060c083015184820360c0860152610e348282610b95565b91505060e0830151610e4960e0860182610d87565b50610100830151610e5e610100860182610d87565b50610120830151610e73610120860182610bce565b50610140830151610e88610140860182610bce565b508091505092915050565b60006020820190508181036000830152610ead8184610d96565b905092915050565b610ebe81610c6a565b82525050565b600082825260208201905092915050565b82818337600083830152505050565b6000610ef08385610ec4565b9350610efd838584610ed5565b610f0683610b84565b840190509392505050565b6000819050919050565b6000819050919050565b6000610f40610f3b610f3684610f11565b610f1b565b610973565b9050919050565b610f5081610f25565b82525050565b6000606082019050610f6b6000830187610eb5565b8181036020830152610f7e818587610ee4565b9050610f8d6040830184610f47565b95945050505050565b610f9f81610ce8565b8114610faa57600080fd5b50565b600081519050610fbc81610f96565b92915050565b600060208284031215610fd857610fd7610969565b5b6000610fe684828501610fad565b91505092915050565b6000602082019050818103600083015261100a818486610ee4565b90509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061104d82610973565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361107f5761107e611013565b5b600182019050919050565b600060408201905061109f6000830186610eb5565b81810360208301526110b2818486610ee4565b9050949350505050565b6000815190506110cb8161097d565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61110e82610b84565b810181811067ffffffffffffffff8211171561112d5761112c6110d6565b5b80604052505050565b600061114061095f565b905061114c8282611105565b919050565b600080fd5b600080fd5b600067ffffffffffffffff821115611176576111756110d6565b5b61117f82610b84565b9050602081019050919050565b600061119f61119a8461115b565b611136565b9050828152602081018484840111156111bb576111ba611156565b5b6111c6848285610b5a565b509392505050565b600082601f8301126111e3576111e26109a9565b5b81516111f384826020860161118c565b91505092915050565b600060408284031215611212576112116110d1565b5b61121c6040611136565b9050600082015167ffffffffffffffff81111561123c5761123b611151565b5b611248848285016111ce565b600083015250602061125c848285016110bc565b60208301525092915050565b6000806040838503121561127f5761127e610969565b5b600061128d858286016110bc565b925050602083015167ffffffffffffffff8111156112ae576112ad61096e565b5b6112ba858286016111fc565b9150509250929050565b60006020820190506112d96000830184610eb5565b92915050565b600481106112ec57600080fd5b50565b6000815190506112fe816112df565b92915050565b61130d81610d7a565b811461131857600080fd5b50565b60008151905061132a81611304565b92915050565b60006101608284031215611347576113466110d1565b5b611352610160611136565b9050600082015167ffffffffffffffff81111561137257611371611151565b5b61137e848285016111ce565b600083015250602082015167ffffffffffffffff8111156113a2576113a1611151565b5b6113ae848285016111ce565b60208301525060406113c284828501610fad565b60408301525060606113d6848285016112ef565b60608301525060806113ea848285016110bc565b60808301525060a06113fe848285016110bc565b60a08301525060c082015167ffffffffffffffff81111561142257611421611151565b5b61142e848285016111ce565b60c08301525060e06114428482850161131b565b60e0830152506101006114578482850161131b565b6101008301525061012061146d848285016110bc565b61012083015250610140611483848285016110bc565b6101408301525092915050565b6000602082840312156114a6576114a5610969565b5b600082015167ffffffffffffffff8111156114c4576114c361096e565b5b6114d084828501611330565b9150509291505056fea2646970667358221220909639086b03bb38b32aaba32e58073b8f74fe67a6fa3e21df62be2b2faddaed64736f6c63430008140033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061007d5760003560e01c8063668f452b1161005b578063668f452b146100d6578063922a4b6714610107578063cbc367d414610123578063f66013d7146101535761007d565b80634d9db92b146100825780634e5a8fe51461009e57806352fce7b1146100ba575b600080fd5b61009c60048036038101906100979190610a0e565b61016f565b005b6100b860048036038101906100b39190610a82565b61041c565b005b6100d460048036038101906100cf9190610a82565b6104be565b005b6100f060048036038101906100eb9190610ae2565b610566565b6040516100fe929190610c1a565b60405180910390f35b610121600480360381019061011c9190610a82565b610600565b005b61013d60048036038101906101389190610ca8565b610797565b60405161014a9190610e93565b60405180910390f35b61016d60048036038101906101689190610ae2565b610847565b005b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb308484600a6040518563ffffffff1660e01b81526004016101b19493929190610f56565b6020604051808303816000875af11580156101d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f49190610fc2565b5060005b8481101561038f573073ffffffffffffffffffffffffffffffffffffffff1663f66013d784846040518363ffffffff1660e01b815260040161023b929190610fef565b600060405180830381600087803b15801561025557600080fd5b505af1925050508015610266575060015b61037b5761080073ffffffffffffffffffffffffffffffffffffffff166353266bbb308585600a6040518563ffffffff1660e01b81526004016102ac9493929190610f56565b6020604051808303816000875af11580156102cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102ef9190610fc2565b5060005b84811015610375573073ffffffffffffffffffffffffffffffffffffffff1663f66013d785856040518363ffffffff1660e01b8152600401610336929190610fef565b600060405180830381600087803b15801561035057600080fd5b505af1925050508015610361575060015b50808061036d90611042565b9150506102f3565b5061037c565b5b808061038790611042565b9150506101f8565b5061080073ffffffffffffffffffffffffffffffffffffffff166353266bbb308484600a6040518563ffffffff1660e01b81526004016103d29493929190610f56565b6020604051808303816000875af11580156103f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104159190610fc2565b5050505050565b60008081548092919061042e90611042565b919050555060005b838110156104b8573073ffffffffffffffffffffffffffffffffffffffff1663f66013d784846040518363ffffffff1660e01b8152600401610479929190610fef565b600060405180830381600087803b15801561049357600080fd5b505af19250505080156104a4575060015b5080806104b090611042565b915050610436565b50505050565b6000808154809291906104d090611042565b919050555060005b83811015610560573073ffffffffffffffffffffffffffffffffffffffff1663f66013d784846040518363ffffffff1660e01b815260040161051b929190610fef565b600060405180830381600087803b15801561053557600080fd5b505af1158015610549573d6000803e3d6000fd5b50505050808061055890611042565b9150506104d8565b50505050565b60006105706108d1565b61080073ffffffffffffffffffffffffffffffffffffffff1663241774e63086866040518463ffffffff1660e01b81526004016105af9392919061108a565b600060405180830381865afa1580156105cc573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906105f59190611268565b915091509250929050565b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb308484600a6040518563ffffffff1660e01b81526004016106429493929190610f56565b6020604051808303816000875af1158015610661573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106859190610fc2565b5060005b8381101561070b573073ffffffffffffffffffffffffffffffffffffffff1663f66013d784846040518363ffffffff1660e01b81526004016106cc929190610fef565b600060405180830381600087803b1580156106e657600080fd5b505af19250505080156106f7575060015b50808061070390611042565b915050610689565b5061080073ffffffffffffffffffffffffffffffffffffffff166353266bbb308484600a6040518563ffffffff1660e01b815260040161074e9493929190610f56565b6020604051808303816000875af115801561076d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107919190610fc2565b50505050565b61079f6108eb565b60005b838110156108405761080073ffffffffffffffffffffffffffffffffffffffff1663223b3b7a846040518263ffffffff1660e01b81526004016107e591906112c4565b600060405180830381865afa158015610802573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061082b9190611490565b9150808061083890611042565b9150506107a2565b5092915050565b61080073ffffffffffffffffffffffffffffffffffffffff166353266bbb308484600a6040518563ffffffff1660e01b81526004016108899493929190610f56565b6020604051808303816000875af11580156108a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108cc9190610fc2565b600080fd5b604051806040016040528060608152602001600081525090565b60405180610160016040528060608152602001606081526020016000151581526020016000600381111561092257610921610d03565b5b8152602001600081526020016000815260200160608152602001600060070b8152602001600060070b815260200160008152602001600081525090565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b61098681610973565b811461099157600080fd5b50565b6000813590506109a38161097d565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126109ce576109cd6109a9565b5b8235905067ffffffffffffffff8111156109eb576109ea6109ae565b5b602083019150836001820283011115610a0757610a066109b3565b5b9250929050565b60008060008060608587031215610a2857610a27610969565b5b6000610a3687828801610994565b9450506020610a4787828801610994565b935050604085013567ffffffffffffffff811115610a6857610a6761096e565b5b610a74878288016109b8565b925092505092959194509250565b600080600060408486031215610a9b57610a9a610969565b5b6000610aa986828701610994565b935050602084013567ffffffffffffffff811115610aca57610ac961096e565b5b610ad6868287016109b8565b92509250509250925092565b60008060208385031215610af957610af8610969565b5b600083013567ffffffffffffffff811115610b1757610b1661096e565b5b610b23858286016109b8565b92509250509250929050565b610b3881610973565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610b78578082015181840152602081019050610b5d565b60008484015250505050565b6000601f19601f8301169050919050565b6000610ba082610b3e565b610baa8185610b49565b9350610bba818560208601610b5a565b610bc381610b84565b840191505092915050565b610bd781610973565b82525050565b60006040830160008301518482036000860152610bfa8282610b95565b9150506020830151610c0f6020860182610bce565b508091505092915050565b6000604082019050610c2f6000830185610b2f565b8181036020830152610c418184610bdd565b90509392505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610c7582610c4a565b9050919050565b610c8581610c6a565b8114610c9057600080fd5b50565b600081359050610ca281610c7c565b92915050565b60008060408385031215610cbf57610cbe610969565b5b6000610ccd85828601610994565b9250506020610cde85828601610c93565b9150509250929050565b60008115159050919050565b610cfd81610ce8565b82525050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60048110610d4357610d42610d03565b5b50565b6000819050610d5482610d32565b919050565b6000610d6482610d46565b9050919050565b610d7481610d59565b82525050565b60008160070b9050919050565b610d9081610d7a565b82525050565b6000610160830160008301518482036000860152610db48282610b95565b91505060208301518482036020860152610dce8282610b95565b9150506040830151610de36040860182610cf4565b506060830151610df66060860182610d6b565b506080830151610e096080860182610bce565b5060a0830151610e1c60a0860182610bce565b5060c083015184820360c0860152610e348282610b95565b91505060e0830151610e4960e0860182610d87565b50610100830151610e5e610100860182610d87565b50610120830151610e73610120860182610bce565b50610140830151610e88610140860182610bce565b508091505092915050565b60006020820190508181036000830152610ead8184610d96565b905092915050565b610ebe81610c6a565b82525050565b600082825260208201905092915050565b82818337600083830152505050565b6000610ef08385610ec4565b9350610efd838584610ed5565b610f0683610b84565b840190509392505050565b6000819050919050565b6000819050919050565b6000610f40610f3b610f3684610f11565b610f1b565b610973565b9050919050565b610f5081610f25565b82525050565b6000606082019050610f6b6000830187610eb5565b8181036020830152610f7e818587610ee4565b9050610f8d6040830184610f47565b95945050505050565b610f9f81610ce8565b8114610faa57600080fd5b50565b600081519050610fbc81610f96565b92915050565b600060208284031215610fd857610fd7610969565b5b6000610fe684828501610fad565b91505092915050565b6000602082019050818103600083015261100a818486610ee4565b90509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061104d82610973565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361107f5761107e611013565b5b600182019050919050565b600060408201905061109f6000830186610eb5565b81810360208301526110b2818486610ee4565b9050949350505050565b6000815190506110cb8161097d565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61110e82610b84565b810181811067ffffffffffffffff8211171561112d5761112c6110d6565b5b80604052505050565b600061114061095f565b905061114c8282611105565b919050565b600080fd5b600080fd5b600067ffffffffffffffff821115611176576111756110d6565b5b61117f82610b84565b9050602081019050919050565b600061119f61119a8461115b565b611136565b9050828152602081018484840111156111bb576111ba611156565b5b6111c6848285610b5a565b509392505050565b600082601f8301126111e3576111e26109a9565b5b81516111f384826020860161118c565b91505092915050565b600060408284031215611212576112116110d1565b5b61121c6040611136565b9050600082015167ffffffffffffffff81111561123c5761123b611151565b5b611248848285016111ce565b600083015250602061125c848285016110bc565b60208301525092915050565b6000806040838503121561127f5761127e610969565b5b600061128d858286016110bc565b925050602083015167ffffffffffffffff8111156112ae576112ad61096e565b5b6112ba858286016111fc565b9150509250929050565b60006020820190506112d96000830184610eb5565b92915050565b600481106112ec57600080fd5b50565b6000815190506112fe816112df565b92915050565b61130d81610d7a565b811461131857600080fd5b50565b60008151905061132a81611304565b92915050565b60006101608284031215611347576113466110d1565b5b611352610160611136565b9050600082015167ffffffffffffffff81111561137257611371611151565b5b61137e848285016111ce565b600083015250602082015167ffffffffffffffff8111156113a2576113a1611151565b5b6113ae848285016111ce565b60208301525060406113c284828501610fad565b60408301525060606113d6848285016112ef565b60608301525060806113ea848285016110bc565b60808301525060a06113fe848285016110bc565b60a08301525060c082015167ffffffffffffffff81111561142257611421611151565b5b61142e848285016111ce565b60c08301525060e06114428482850161131b565b60e0830152506101006114578482850161131b565b6101008301525061012061146d848285016110bc565b61012083015250610140611483848285016110bc565b6101408301525092915050565b6000602082840312156114a6576114a5610969565b5b600082015167ffffffffffffffff8111156114c4576114c361096e565b5b6114d084828501611330565b9150509291505056fea2646970667358221220909639086b03bb38b32aaba32e58073b8f74fe67a6fa3e21df62be2b2faddaed64736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/precompiles/testutil/contracts/StakingReverter.sol b/precompiles/testutil/contracts/StakingReverter.sol index 469267cb4..aef5d526b 100644 --- a/precompiles/testutil/contracts/StakingReverter.sol +++ b/precompiles/testutil/contracts/StakingReverter.sol @@ -49,6 +49,36 @@ contract StakingReverter { STAKING_CONTRACT.delegate(address(this), validatorAddress, 10); } + /// @dev nestedTryCatchDelegations performs nested try/catch calls to precompile + /// where inner calls revert intentionally. Only the successful delegations + /// outside the reverting scope should persist. + /// + /// Expected successful delegations: 1 (before loop) + outerTimes (after each catch) + 1 (after loop) + function nestedTryCatchDelegations(uint outerTimes, uint innerTimes, string calldata validatorAddress) external { + // Initial successful delegate before any nested reverts + STAKING_CONTRACT.delegate(address(this), validatorAddress, 10); + + for (uint i = 0; i < outerTimes; i++) { + // Outer call that will revert and be caught + try StakingReverter(address(this)).performDelegation(validatorAddress) { + // no-op + } catch { + // After catching the revert, perform a successful delegate + STAKING_CONTRACT.delegate(address(this), validatorAddress, 10); + + // Inner nested loop of reverting calls + for (uint j = 0; j < innerTimes; j++) { + try StakingReverter(address(this)).performDelegation(validatorAddress) { + // no-op + } catch {} + } + } + } + + // Final successful delegate after the loops + STAKING_CONTRACT.delegate(address(this), validatorAddress, 10); + } + function performDelegation(string calldata validatorAddress) external { STAKING_CONTRACT.delegate(address(this), validatorAddress, 10); revert(); diff --git a/tests/integration/precompiles/staking/test_integration.go b/tests/integration/precompiles/staking/test_integration.go index 7d49f82df..13e48e60c 100644 --- a/tests/integration/precompiles/staking/test_integration.go +++ b/tests/integration/precompiles/staking/test_integration.go @@ -1896,6 +1896,58 @@ func TestPrecompileIntegrationTestSuite(t *testing.T, create network.CreateEvmAp txSenderFinalBal := balRes.Balance Expect(txSenderFinalBal.Amount).To(Equal(txSenderInitialBal.Amount.Sub(fees)), "expected tx sender balance to be deducted by fees") }) + It("should test nested precompile calls with revert", func() { + outerTimes := int64(3) + innerTimes := int64(2) + expectedDelegations := outerTimes + 2 // 1 before + outerTimes after catches + 1 after loop + expectedDelegationAmount := math.NewInt(10).MulRaw(expectedDelegations) + + callArgs := testutiltypes.CallArgs{ + ContractABI: stakingReverterContract.ABI, + MethodName: "nestedTryCatchDelegations", + Args: []interface{}{ + big.NewInt(outerTimes), big.NewInt(innerTimes), s.network.GetValidators()[0].OperatorAddress, + }, + } + + expEvents := make([]string, 0, expectedDelegations) + for range expectedDelegations { + expEvents = append(expEvents, staking.EventTypeDelegate) + } + delegateCheck := passCheck.WithExpEvents(expEvents...) + + res, _, err := s.factory.CallContractAndCheckLogs( + s.keyring.GetPrivKey(0), + evmtypes.EvmTxArgs{ + To: &stkReverterAddr, + GasPrice: gasPrice.BigInt(), + }, + callArgs, + delegateCheck, + ) + Expect(err).To(BeNil(), "error while calling the smart contract: %v", err) + Expect(s.network.NextBlock()).To(BeNil()) + + fees := gasPrice.MulRaw(res.GasUsed) + + // delegation should have been created with expected shares + qRes, err := s.grpcHandler.GetDelegation(sdk.AccAddress(stkReverterAddr.Bytes()).String(), s.network.GetValidators()[0].OperatorAddress) + Expect(err).To(BeNil()) + Expect(qRes.DelegationResponse.Delegation.GetDelegatorAddr()).To(Equal(sdk.AccAddress(stkReverterAddr.Bytes()).String())) + Expect(qRes.DelegationResponse.Delegation.GetShares().BigInt()).To(Equal(expectedDelegationAmount.BigInt())) + + // contract balance should be deducted by total delegation amount + balRes, err := s.grpcHandler.GetBalanceFromBank(stkReverterAddr.Bytes(), s.bondDenom) + Expect(err).To(BeNil()) + contractFinalBalance := balRes.Balance + Expect(contractFinalBalance.Amount).To(Equal(contractInitialBalance.Amount.Sub(expectedDelegationAmount))) + + // fees deducted on tx sender only + balRes, err = s.grpcHandler.GetBalanceFromBank(s.keyring.GetAccAddr(0), s.bondDenom) + Expect(err).To(BeNil()) + txSenderFinalBal := balRes.Balance + Expect(txSenderFinalBal.Amount).To(Equal(txSenderInitialBal.Amount.Sub(fees))) + }) }) Context("Table-driven tests for Delegate method", func() { diff --git a/x/vm/types/call.go b/x/vm/types/call.go index 957084736..7c665180d 100644 --- a/x/vm/types/call.go +++ b/x/vm/types/call.go @@ -12,4 +12,4 @@ const ( // MaxPrecompileCalls is the maximum number of precompile // calls within a transaction. We want to limit this because // for each precompile tx we're creating a cached context -const MaxPrecompileCalls uint8 = 7 +const MaxPrecompileCalls uint8 = 20