From 0b1d4afe0346a4569478d4796c1c39421fc5ea0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20N=C3=BA=C3=B1ez?= Date: Thu, 5 Sep 2024 08:51:42 +0200 Subject: [PATCH 1/6] GPL code can be used in a AGPL repo --- contracts/contracts/coordination/ReimbursementPool.sol | 1 - 1 file changed, 1 deletion(-) diff --git a/contracts/contracts/coordination/ReimbursementPool.sol b/contracts/contracts/coordination/ReimbursementPool.sol index cc681d11..970e97b5 100644 --- a/contracts/contracts/coordination/ReimbursementPool.sol +++ b/contracts/contracts/coordination/ReimbursementPool.sol @@ -1,5 +1,4 @@ // SPDX-License-Identifier: GPL-3.0-only -// TODO: What about license? Original is GPL but ours is AGPL pragma solidity ^0.8.0; From 45d000d3a976cd80ad78d6633e769c4e390da7c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20N=C3=BA=C3=B1ez?= Date: Thu, 5 Sep 2024 08:54:39 +0200 Subject: [PATCH 2/6] Reference original authors (thanks @dimpar, @pdyraga !) --- contracts/contracts/coordination/ReimbursementPool.sol | 1 + 1 file changed, 1 insertion(+) diff --git a/contracts/contracts/coordination/ReimbursementPool.sol b/contracts/contracts/coordination/ReimbursementPool.sol index 970e97b5..8d9f2ee8 100644 --- a/contracts/contracts/coordination/ReimbursementPool.sol +++ b/contracts/contracts/coordination/ReimbursementPool.sol @@ -9,6 +9,7 @@ import "./IReimbursementPool.sol"; /** * @title ReimbursementPool contract * @dev Original source: https://github.com/keep-network/keep-core/blob/main/solidity/random-beacon/contracts/ReimbursementPool.sol + * @author Dmitry Paremski (@dimpar), Piotr Dyraga (@pdyraga) */ contract ReimbursementPool is Ownable, ReentrancyGuard, IReimbursementPool { /// @notice Authorized contracts that can interact with the reimbursment pool. From 71299c76705a35d2f4e222b8777594513d698e55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20N=C3=BA=C3=B1ez?= Date: Tue, 10 Sep 2024 17:07:07 +0200 Subject: [PATCH 3/6] Polygon Mainnet params for ReimbursementPool --- .../mainnet/reimbursement-pool.yml | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 deployment/constructor_params/mainnet/reimbursement-pool.yml diff --git a/deployment/constructor_params/mainnet/reimbursement-pool.yml b/deployment/constructor_params/mainnet/reimbursement-pool.yml new file mode 100644 index 00000000..578c757f --- /dev/null +++ b/deployment/constructor_params/mainnet/reimbursement-pool.yml @@ -0,0 +1,21 @@ +deployment: + name: reimbursement-mainnet + chain_id: 137 + +artifacts: + dir: ./deployment/artifacts/ + filename: reimbursement-mainnet.json + +constants: + # Approx avg cost according to Keep tests (see e.g. https://github.com/keep-network/keep-core/actions/runs/10783327230/job/29905024826). + # Also current value used for tBTC ReimbursementPool on Ethereum Mainnet (see https://etherscan.io/address/0x8adF3f35dBE4026112bCFc078872bcb967732Ea8#readContract#F4) + STATIC_GAS: 40800 + # 110 gwei, so we cap refunds for each 30-size ritual to 10 POL (0.33 POL per node) + MAX_GAS_PRICE: 110000000000 + +contracts: + - ReimbursementPool: + constructor: + _staticGas: $STATIC_GAS + _maxGasPrice: $MAX_GAS_PRICE + \ No newline at end of file From 81e05917bf53248744cf9417a6e9a46b9d2cf3ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20N=C3=BA=C3=B1ez?= Date: Tue, 10 Sep 2024 17:08:03 +0200 Subject: [PATCH 4/6] Deployment script for ReimbursementPool on Polygon Mainnet --- scripts/mainnet/deploy_reimbursement_pool.py | 30 ++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 scripts/mainnet/deploy_reimbursement_pool.py diff --git a/scripts/mainnet/deploy_reimbursement_pool.py b/scripts/mainnet/deploy_reimbursement_pool.py new file mode 100644 index 00000000..91222418 --- /dev/null +++ b/scripts/mainnet/deploy_reimbursement_pool.py @@ -0,0 +1,30 @@ +#!/usr/bin/python3 + +from ape import project, networks + +from deployment.constants import ( + CONSTRUCTOR_PARAMS_DIR, ARTIFACTS_DIR, +) +from deployment.params import Deployer +from deployment.registry import contracts_from_registry + +VERIFY = False +CONSTRUCTOR_PARAMS_FILEPATH = CONSTRUCTOR_PARAMS_DIR / "mainnet" / "reimbursement-pool.yml" +MAINNET_REGISTRY = ARTIFACTS_DIR / "mainnet.json" + + +def main(): + deployer = Deployer.from_yaml(filepath=CONSTRUCTOR_PARAMS_FILEPATH, verify=VERIFY) + + deployments = contracts_from_registry( + filepath=MAINNET_REGISTRY, chain_id=networks.active_provider.chain_id + ) + coordinator = deployments[project.Coordinator.contract_type.name] + + reimbursement_pool = deployer.deploy(project.ReimbursementPool) + + deployments = [reimbursement_pool] + + deployer.finalize(deployments=deployments) + + deployer.transact(reimbursement_pool.authorize, coordinator.address) From b232c3ce5471c078ca186b886bd7c16d34c41fba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20N=C3=BA=C3=B1ez?= Date: Wed, 11 Sep 2024 14:27:14 +0200 Subject: [PATCH 5/6] Deployment artifact for ReimbursementPool on Polygon Mainnet --- .../artifacts/reimbursement-mainnet.json | 347 ++++++++++++++++++ 1 file changed, 347 insertions(+) create mode 100644 deployment/artifacts/reimbursement-mainnet.json diff --git a/deployment/artifacts/reimbursement-mainnet.json b/deployment/artifacts/reimbursement-mainnet.json new file mode 100644 index 00000000..2a01ff60 --- /dev/null +++ b/deployment/artifacts/reimbursement-mainnet.json @@ -0,0 +1,347 @@ +{ + "137": { + "ReimbursementPool": { + "address": "0x65849eaDc5cE348EaA131Fdbd35aeC9235688EEB", + "abi": [ + { + "type": "constructor", + "stateMutability": "nonpayable", + "inputs": [ + { + "name": "_staticGas", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "_maxGasPrice", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "OwnableInvalidOwner", + "inputs": [ + { + "name": "owner", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "OwnableUnauthorizedAccount", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "ReentrancyGuardReentrantCall", + "inputs": [] + }, + { + "type": "event", + "name": "AuthorizedContract", + "inputs": [ + { + "name": "thirdPartyContract", + "type": "address", + "internalType": "address", + "indexed": false + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "FundsWithdrawn", + "inputs": [ + { + "name": "withdrawnAmount", + "type": "uint256", + "internalType": "uint256", + "indexed": false + }, + { + "name": "receiver", + "type": "address", + "internalType": "address", + "indexed": false + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "MaxGasPriceUpdated", + "inputs": [ + { + "name": "newMaxGasPrice", + "type": "uint256", + "internalType": "uint256", + "indexed": false + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OwnershipTransferred", + "inputs": [ + { + "name": "previousOwner", + "type": "address", + "internalType": "address", + "indexed": true + }, + { + "name": "newOwner", + "type": "address", + "internalType": "address", + "indexed": true + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "SendingEtherFailed", + "inputs": [ + { + "name": "refundAmount", + "type": "uint256", + "internalType": "uint256", + "indexed": false + }, + { + "name": "receiver", + "type": "address", + "internalType": "address", + "indexed": false + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "StaticGasUpdated", + "inputs": [ + { + "name": "newStaticGas", + "type": "uint256", + "internalType": "uint256", + "indexed": false + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "UnauthorizedContract", + "inputs": [ + { + "name": "thirdPartyContract", + "type": "address", + "internalType": "address", + "indexed": false + } + ], + "anonymous": false + }, + { + "type": "function", + "name": "authorize", + "stateMutability": "nonpayable", + "inputs": [ + { + "name": "_contract", + "type": "address", + "internalType": "address" + } + ], + "outputs": [] + }, + { + "type": "function", + "name": "isAuthorized", + "stateMutability": "view", + "inputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ] + }, + { + "type": "function", + "name": "maxGasPrice", + "stateMutability": "view", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "function", + "name": "owner", + "stateMutability": "view", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "function", + "name": "refund", + "stateMutability": "nonpayable", + "inputs": [ + { + "name": "gasSpent", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "receiver", + "type": "address", + "internalType": "address" + } + ], + "outputs": [] + }, + { + "type": "function", + "name": "renounceOwnership", + "stateMutability": "nonpayable", + "inputs": [], + "outputs": [] + }, + { + "type": "function", + "name": "setMaxGasPrice", + "stateMutability": "nonpayable", + "inputs": [ + { + "name": "_maxGasPrice", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [] + }, + { + "type": "function", + "name": "setStaticGas", + "stateMutability": "nonpayable", + "inputs": [ + { + "name": "_staticGas", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [] + }, + { + "type": "function", + "name": "staticGas", + "stateMutability": "view", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "function", + "name": "transferOwnership", + "stateMutability": "nonpayable", + "inputs": [ + { + "name": "newOwner", + "type": "address", + "internalType": "address" + } + ], + "outputs": [] + }, + { + "type": "function", + "name": "unauthorize", + "stateMutability": "nonpayable", + "inputs": [ + { + "name": "_contract", + "type": "address", + "internalType": "address" + } + ], + "outputs": [] + }, + { + "type": "function", + "name": "withdraw", + "stateMutability": "nonpayable", + "inputs": [ + { + "name": "amount", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "receiver", + "type": "address", + "internalType": "address" + } + ], + "outputs": [] + }, + { + "type": "function", + "name": "withdrawAll", + "stateMutability": "nonpayable", + "inputs": [ + { + "name": "receiver", + "type": "address", + "internalType": "address" + } + ], + "outputs": [] + }, + { + "type": "receive", + "stateMutability": "payable" + } + ], + "tx_hash": "0x0d7daede5ac88a093b3da7d0428c5753e01a04d7ab9f8c9533d1893c1682d776", + "block_number": 61687846, + "deployer": "0x1591165F1BF8B73de7053A6BE6f239BC15076879" + } + } +} \ No newline at end of file From f7062913b86c47d8f9d298509e2abf34b099edd8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20N=C3=BA=C3=B1ez?= Date: Mon, 16 Sep 2024 12:16:37 +0200 Subject: [PATCH 6/6] Merge deployment info into mainnet registry --- deployment/artifacts/mainnet.json | 343 +++++++++++++++++ .../artifacts/reimbursement-mainnet.json | 347 ------------------ 2 files changed, 343 insertions(+), 347 deletions(-) delete mode 100644 deployment/artifacts/reimbursement-mainnet.json diff --git a/deployment/artifacts/mainnet.json b/deployment/artifacts/mainnet.json index da5cfafa..bb622619 100644 --- a/deployment/artifacts/mainnet.json +++ b/deployment/artifacts/mainnet.json @@ -4946,6 +4946,349 @@ "block_number": 50816123, "deployer": "0x1591165F1BF8B73de7053A6BE6f239BC15076879" }, + "ReimbursementPool": { + "address": "0x65849eaDc5cE348EaA131Fdbd35aeC9235688EEB", + "abi": [ + { + "type": "constructor", + "stateMutability": "nonpayable", + "inputs": [ + { + "name": "_staticGas", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "_maxGasPrice", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "OwnableInvalidOwner", + "inputs": [ + { + "name": "owner", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "OwnableUnauthorizedAccount", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "ReentrancyGuardReentrantCall", + "inputs": [] + }, + { + "type": "event", + "name": "AuthorizedContract", + "inputs": [ + { + "name": "thirdPartyContract", + "type": "address", + "internalType": "address", + "indexed": false + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "FundsWithdrawn", + "inputs": [ + { + "name": "withdrawnAmount", + "type": "uint256", + "internalType": "uint256", + "indexed": false + }, + { + "name": "receiver", + "type": "address", + "internalType": "address", + "indexed": false + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "MaxGasPriceUpdated", + "inputs": [ + { + "name": "newMaxGasPrice", + "type": "uint256", + "internalType": "uint256", + "indexed": false + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OwnershipTransferred", + "inputs": [ + { + "name": "previousOwner", + "type": "address", + "internalType": "address", + "indexed": true + }, + { + "name": "newOwner", + "type": "address", + "internalType": "address", + "indexed": true + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "SendingEtherFailed", + "inputs": [ + { + "name": "refundAmount", + "type": "uint256", + "internalType": "uint256", + "indexed": false + }, + { + "name": "receiver", + "type": "address", + "internalType": "address", + "indexed": false + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "StaticGasUpdated", + "inputs": [ + { + "name": "newStaticGas", + "type": "uint256", + "internalType": "uint256", + "indexed": false + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "UnauthorizedContract", + "inputs": [ + { + "name": "thirdPartyContract", + "type": "address", + "internalType": "address", + "indexed": false + } + ], + "anonymous": false + }, + { + "type": "function", + "name": "authorize", + "stateMutability": "nonpayable", + "inputs": [ + { + "name": "_contract", + "type": "address", + "internalType": "address" + } + ], + "outputs": [] + }, + { + "type": "function", + "name": "isAuthorized", + "stateMutability": "view", + "inputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ] + }, + { + "type": "function", + "name": "maxGasPrice", + "stateMutability": "view", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "function", + "name": "owner", + "stateMutability": "view", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "function", + "name": "refund", + "stateMutability": "nonpayable", + "inputs": [ + { + "name": "gasSpent", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "receiver", + "type": "address", + "internalType": "address" + } + ], + "outputs": [] + }, + { + "type": "function", + "name": "renounceOwnership", + "stateMutability": "nonpayable", + "inputs": [], + "outputs": [] + }, + { + "type": "function", + "name": "setMaxGasPrice", + "stateMutability": "nonpayable", + "inputs": [ + { + "name": "_maxGasPrice", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [] + }, + { + "type": "function", + "name": "setStaticGas", + "stateMutability": "nonpayable", + "inputs": [ + { + "name": "_staticGas", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [] + }, + { + "type": "function", + "name": "staticGas", + "stateMutability": "view", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "function", + "name": "transferOwnership", + "stateMutability": "nonpayable", + "inputs": [ + { + "name": "newOwner", + "type": "address", + "internalType": "address" + } + ], + "outputs": [] + }, + { + "type": "function", + "name": "unauthorize", + "stateMutability": "nonpayable", + "inputs": [ + { + "name": "_contract", + "type": "address", + "internalType": "address" + } + ], + "outputs": [] + }, + { + "type": "function", + "name": "withdraw", + "stateMutability": "nonpayable", + "inputs": [ + { + "name": "amount", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "receiver", + "type": "address", + "internalType": "address" + } + ], + "outputs": [] + }, + { + "type": "function", + "name": "withdrawAll", + "stateMutability": "nonpayable", + "inputs": [ + { + "name": "receiver", + "type": "address", + "internalType": "address" + } + ], + "outputs": [] + }, + { + "type": "receive", + "stateMutability": "payable" + } + ], + "tx_hash": "0x0d7daede5ac88a093b3da7d0428c5753e01a04d7ab9f8c9533d1893c1682d776", + "block_number": 61687846, + "deployer": "0x1591165F1BF8B73de7053A6BE6f239BC15076879" + }, "SubscriptionManager": { "address": "0xB0194073421192F6Cf38d72c791Be8729721A0b3", "abi": [ diff --git a/deployment/artifacts/reimbursement-mainnet.json b/deployment/artifacts/reimbursement-mainnet.json deleted file mode 100644 index 2a01ff60..00000000 --- a/deployment/artifacts/reimbursement-mainnet.json +++ /dev/null @@ -1,347 +0,0 @@ -{ - "137": { - "ReimbursementPool": { - "address": "0x65849eaDc5cE348EaA131Fdbd35aeC9235688EEB", - "abi": [ - { - "type": "constructor", - "stateMutability": "nonpayable", - "inputs": [ - { - "name": "_staticGas", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "_maxGasPrice", - "type": "uint256", - "internalType": "uint256" - } - ] - }, - { - "type": "error", - "name": "OwnableInvalidOwner", - "inputs": [ - { - "name": "owner", - "type": "address", - "internalType": "address" - } - ] - }, - { - "type": "error", - "name": "OwnableUnauthorizedAccount", - "inputs": [ - { - "name": "account", - "type": "address", - "internalType": "address" - } - ] - }, - { - "type": "error", - "name": "ReentrancyGuardReentrantCall", - "inputs": [] - }, - { - "type": "event", - "name": "AuthorizedContract", - "inputs": [ - { - "name": "thirdPartyContract", - "type": "address", - "internalType": "address", - "indexed": false - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "FundsWithdrawn", - "inputs": [ - { - "name": "withdrawnAmount", - "type": "uint256", - "internalType": "uint256", - "indexed": false - }, - { - "name": "receiver", - "type": "address", - "internalType": "address", - "indexed": false - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "MaxGasPriceUpdated", - "inputs": [ - { - "name": "newMaxGasPrice", - "type": "uint256", - "internalType": "uint256", - "indexed": false - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "OwnershipTransferred", - "inputs": [ - { - "name": "previousOwner", - "type": "address", - "internalType": "address", - "indexed": true - }, - { - "name": "newOwner", - "type": "address", - "internalType": "address", - "indexed": true - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "SendingEtherFailed", - "inputs": [ - { - "name": "refundAmount", - "type": "uint256", - "internalType": "uint256", - "indexed": false - }, - { - "name": "receiver", - "type": "address", - "internalType": "address", - "indexed": false - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "StaticGasUpdated", - "inputs": [ - { - "name": "newStaticGas", - "type": "uint256", - "internalType": "uint256", - "indexed": false - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "UnauthorizedContract", - "inputs": [ - { - "name": "thirdPartyContract", - "type": "address", - "internalType": "address", - "indexed": false - } - ], - "anonymous": false - }, - { - "type": "function", - "name": "authorize", - "stateMutability": "nonpayable", - "inputs": [ - { - "name": "_contract", - "type": "address", - "internalType": "address" - } - ], - "outputs": [] - }, - { - "type": "function", - "name": "isAuthorized", - "stateMutability": "view", - "inputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "outputs": [ - { - "name": "", - "type": "bool", - "internalType": "bool" - } - ] - }, - { - "type": "function", - "name": "maxGasPrice", - "stateMutability": "view", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ] - }, - { - "type": "function", - "name": "owner", - "stateMutability": "view", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ] - }, - { - "type": "function", - "name": "refund", - "stateMutability": "nonpayable", - "inputs": [ - { - "name": "gasSpent", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "receiver", - "type": "address", - "internalType": "address" - } - ], - "outputs": [] - }, - { - "type": "function", - "name": "renounceOwnership", - "stateMutability": "nonpayable", - "inputs": [], - "outputs": [] - }, - { - "type": "function", - "name": "setMaxGasPrice", - "stateMutability": "nonpayable", - "inputs": [ - { - "name": "_maxGasPrice", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [] - }, - { - "type": "function", - "name": "setStaticGas", - "stateMutability": "nonpayable", - "inputs": [ - { - "name": "_staticGas", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [] - }, - { - "type": "function", - "name": "staticGas", - "stateMutability": "view", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ] - }, - { - "type": "function", - "name": "transferOwnership", - "stateMutability": "nonpayable", - "inputs": [ - { - "name": "newOwner", - "type": "address", - "internalType": "address" - } - ], - "outputs": [] - }, - { - "type": "function", - "name": "unauthorize", - "stateMutability": "nonpayable", - "inputs": [ - { - "name": "_contract", - "type": "address", - "internalType": "address" - } - ], - "outputs": [] - }, - { - "type": "function", - "name": "withdraw", - "stateMutability": "nonpayable", - "inputs": [ - { - "name": "amount", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "receiver", - "type": "address", - "internalType": "address" - } - ], - "outputs": [] - }, - { - "type": "function", - "name": "withdrawAll", - "stateMutability": "nonpayable", - "inputs": [ - { - "name": "receiver", - "type": "address", - "internalType": "address" - } - ], - "outputs": [] - }, - { - "type": "receive", - "stateMutability": "payable" - } - ], - "tx_hash": "0x0d7daede5ac88a093b3da7d0428c5753e01a04d7ab9f8c9533d1893c1682d776", - "block_number": 61687846, - "deployer": "0x1591165F1BF8B73de7053A6BE6f239BC15076879" - } - } -} \ No newline at end of file