diff --git a/.changeset/unlucky-berries-cover.md b/.changeset/unlucky-berries-cover.md new file mode 100644 index 00000000..fdedae1e --- /dev/null +++ b/.changeset/unlucky-berries-cover.md @@ -0,0 +1,5 @@ +--- +'@fuel-bridge/solidity-contracts': patch +--- + +Upgraded portal implementations diff --git a/packages/solidity-contracts/.openzeppelin/sepolia.json b/packages/solidity-contracts/.openzeppelin/sepolia.json index 888425b5..cf8fc19e 100644 --- a/packages/solidity-contracts/.openzeppelin/sepolia.json +++ b/packages/solidity-contracts/.openzeppelin/sepolia.json @@ -4512,6 +4512,293 @@ "0xf96DD2dA09A67c37CE79671923af1999b3553414", "0x5F9eAEB3b7ec396F01617e9BAd787D0A6f93B7a3" ] + }, + "13685e0abb15104bf2ba2e66a106e0ce94aa6ad997592dd16284652712c16645": { + "address": "0xF8F2AEdde6AEBB164f804f78Cc95FBCCc3d642A1", + "txHash": "0xee6a584c4d1e63672798749961aa118671ac1a3f1788f664c2a230b8d6e4a5c6", + "layout": { + "solcVersion": "0.8.24", + "storage": [ + { + "label": "_initialized", + "offset": 0, + "slot": "0", + "type": "t_uint8", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:63", + "retypedFrom": "bool" + }, + { + "label": "_initializing", + "offset": 1, + "slot": "0", + "type": "t_bool", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:68" + }, + { + "label": "__gap", + "offset": 0, + "slot": "1", + "type": "t_array(t_uint256)50_storage", + "contract": "ContextUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol:40" + }, + { + "label": "_paused", + "offset": 0, + "slot": "51", + "type": "t_bool", + "contract": "PausableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol:29" + }, + { + "label": "__gap", + "offset": 0, + "slot": "52", + "type": "t_array(t_uint256)49_storage", + "contract": "PausableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol:116" + }, + { + "label": "__gap", + "offset": 0, + "slot": "101", + "type": "t_array(t_uint256)50_storage", + "contract": "ERC165Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol:41" + }, + { + "label": "_roles", + "offset": 0, + "slot": "151", + "type": "t_mapping(t_bytes32,t_struct(RoleData)23_storage)", + "contract": "AccessControlUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol:57" + }, + { + "label": "__gap", + "offset": 0, + "slot": "152", + "type": "t_array(t_uint256)49_storage", + "contract": "AccessControlUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol:260" + }, + { + "label": "_status", + "offset": 0, + "slot": "201", + "type": "t_uint256", + "contract": "ReentrancyGuardTransientUpgradable", + "src": "contracts/security/ReentrancyGuardTransientUpgradable.sol:23" + }, + { + "label": "__gap", + "offset": 0, + "slot": "202", + "type": "t_array(t_uint256)49_storage", + "contract": "ReentrancyGuardTransientUpgradable", + "src": "contracts/security/ReentrancyGuardTransientUpgradable.sol:81" + }, + { + "label": "__gap", + "offset": 0, + "slot": "251", + "type": "t_array(t_uint256)50_storage", + "contract": "ERC1967UpgradeUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/proxy/ERC1967/ERC1967UpgradeUpgradeable.sol:169" + }, + { + "label": "__gap", + "offset": 0, + "slot": "301", + "type": "t_array(t_uint256)50_storage", + "contract": "UUPSUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol:111" + }, + { + "label": "_incomingMessageSender", + "offset": 0, + "slot": "351", + "type": "t_bytes32", + "contract": "FuelMessagePortal", + "src": "contracts/fuelchain/FuelMessagePortal.sol:96" + }, + { + "label": "_fuelChainState", + "offset": 0, + "slot": "352", + "type": "t_contract(FuelChainState)3301", + "contract": "FuelMessagePortal", + "src": "contracts/fuelchain/FuelMessagePortal.sol:99" + }, + { + "label": "_outgoingMessageNonce", + "offset": 0, + "slot": "353", + "type": "t_uint256", + "contract": "FuelMessagePortal", + "src": "contracts/fuelchain/FuelMessagePortal.sol:102" + }, + { + "label": "_incomingMessageSuccessful", + "offset": 0, + "slot": "354", + "type": "t_mapping(t_bytes32,t_bool)", + "contract": "FuelMessagePortal", + "src": "contracts/fuelchain/FuelMessagePortal.sol:105" + }, + { + "label": "__gap", + "offset": 0, + "slot": "355", + "type": "t_array(t_uint256)49_storage", + "contract": "FuelMessagePortal", + "src": "contracts/fuelchain/FuelMessagePortal.sol:337" + }, + { + "label": "totalDeposited", + "offset": 0, + "slot": "404", + "type": "t_uint256", + "contract": "FuelMessagePortalV2", + "src": "contracts/fuelchain/FuelMessagePortal/v2/FuelMessagePortalV2.sol:14" + }, + { + "label": "__gap", + "offset": 0, + "slot": "405", + "type": "t_array(t_uint256)49_storage", + "contract": "FuelMessagePortalV2", + "src": "contracts/fuelchain/FuelMessagePortal/v2/FuelMessagePortalV2.sol:108" + }, + { + "label": "withdrawalsPaused", + "offset": 0, + "slot": "454", + "type": "t_bool", + "contract": "FuelMessagePortalV3", + "src": "contracts/fuelchain/FuelMessagePortal/v3/FuelMessagePortalV3.sol:31" + }, + { + "label": "messageIsBlacklisted", + "offset": 0, + "slot": "455", + "type": "t_mapping(t_bytes32,t_bool)", + "contract": "FuelMessagePortalV3", + "src": "contracts/fuelchain/FuelMessagePortal/v3/FuelMessagePortalV3.sol:33" + }, + { + "label": "currentPeriodAmount", + "offset": 0, + "slot": "456", + "type": "t_uint256", + "contract": "FuelMessagePortalV3", + "src": "contracts/fuelchain/FuelMessagePortal/v3/FuelMessagePortalV3.sol:36" + }, + { + "label": "currentPeriodEnd", + "offset": 0, + "slot": "457", + "type": "t_uint256", + "contract": "FuelMessagePortalV3", + "src": "contracts/fuelchain/FuelMessagePortal/v3/FuelMessagePortalV3.sol:39" + }, + { + "label": "limitAmount", + "offset": 0, + "slot": "458", + "type": "t_uint256", + "contract": "FuelMessagePortalV3", + "src": "contracts/fuelchain/FuelMessagePortal/v3/FuelMessagePortalV3.sol:42" + }, + { + "label": "rateLimitEnabled", + "offset": 0, + "slot": "459", + "type": "t_bool", + "contract": "FuelMessagePortalV3", + "src": "contracts/fuelchain/FuelMessagePortal/v3/FuelMessagePortalV3.sol:45" + }, + { + "label": "__gap", + "offset": 0, + "slot": "460", + "type": "t_array(t_uint256)48_storage", + "contract": "FuelMessagePortalV3", + "src": "contracts/fuelchain/FuelMessagePortal/v3/FuelMessagePortalV3.sol:266" + } + ], + "types": { + "t_address": { + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_uint256)48_storage": { + "label": "uint256[48]", + "numberOfBytes": "1536" + }, + "t_array(t_uint256)49_storage": { + "label": "uint256[49]", + "numberOfBytes": "1568" + }, + "t_array(t_uint256)50_storage": { + "label": "uint256[50]", + "numberOfBytes": "1600" + }, + "t_bool": { + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes32": { + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_contract(FuelChainState)3301": { + "label": "contract FuelChainState", + "numberOfBytes": "20" + }, + "t_mapping(t_address,t_bool)": { + "label": "mapping(address => bool)", + "numberOfBytes": "32" + }, + "t_mapping(t_bytes32,t_bool)": { + "label": "mapping(bytes32 => bool)", + "numberOfBytes": "32" + }, + "t_mapping(t_bytes32,t_struct(RoleData)23_storage)": { + "label": "mapping(bytes32 => struct AccessControlUpgradeable.RoleData)", + "numberOfBytes": "32" + }, + "t_struct(RoleData)23_storage": { + "label": "struct AccessControlUpgradeable.RoleData", + "members": [ + { + "label": "members", + "type": "t_mapping(t_address,t_bool)", + "offset": 0, + "slot": "0" + }, + { + "label": "adminRole", + "type": "t_bytes32", + "offset": 0, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint8": { + "label": "uint8", + "numberOfBytes": "1" + } + }, + "namespaces": {} + } } } } diff --git a/packages/solidity-contracts/deploy/devnet/018.portal_upgrade.ts b/packages/solidity-contracts/deploy/devnet/018.portal_upgrade.ts new file mode 100644 index 00000000..036f9b81 --- /dev/null +++ b/packages/solidity-contracts/deploy/devnet/018.portal_upgrade.ts @@ -0,0 +1,60 @@ +import { MaxUint256, type TransactionResponse } from 'ethers'; +import type { HardhatRuntimeEnvironment } from 'hardhat/types'; +import type { DeployFunction } from 'hardhat-deploy/dist/types'; + +import { FuelMessagePortalV3__factory as FuelMessagePortalV3 } from '../../typechain'; + +const RATE_LIMIT_DURATION = 3600 * 24 * 7; +const RATE_LIMIT_AMOUNT = 0n; + +const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { + const { + ethers, + upgrades: { upgradeProxy, prepareUpgrade }, + deployments: { get, save }, + } = hre; + const [deployer] = await ethers.getSigners(); + + const fuelMessagePortal = await get('FuelMessagePortal'); + const constructorArgs = [MaxUint256, RATE_LIMIT_DURATION]; + const tx = (await prepareUpgrade( + fuelMessagePortal.address, + new FuelMessagePortalV3(deployer), + { + constructorArgs, + getTxResponse: true, + unsafeSkipStorageCheck: true, + } + )) as TransactionResponse; + const receipt = await tx.wait(); + + const implementation = receipt?.contractAddress; + + if (!implementation) { + throw new Error('No contract in receipt'); + } + + await upgradeProxy( + fuelMessagePortal.address, + new FuelMessagePortalV3(deployer), + { + unsafeAllow: ['constructor'], + constructorArgs, + call: { fn: 'reinitializeV3', args: [RATE_LIMIT_AMOUNT] }, + unsafeSkipStorageCheck: true, + } + ); + + console.log('Upgraded FuelMessagePortal to', implementation); + await save('FuelMessagePortal', { + address: fuelMessagePortal.address, + abi: [...FuelMessagePortalV3.abi], + implementation, + }); + + return true; +}; + +func.tags = ['018_portal_upgrade']; +func.id = '018_portal_upgrade'; +export default func; diff --git a/packages/solidity-contracts/deploy/testnet/019.portal_upgrade.ts b/packages/solidity-contracts/deploy/testnet/019.portal_upgrade.ts new file mode 100644 index 00000000..50d8bc89 --- /dev/null +++ b/packages/solidity-contracts/deploy/testnet/019.portal_upgrade.ts @@ -0,0 +1,60 @@ +import { MaxUint256, type TransactionResponse } from 'ethers'; +import type { HardhatRuntimeEnvironment } from 'hardhat/types'; +import type { DeployFunction } from 'hardhat-deploy/dist/types'; + +import { FuelMessagePortalV3__factory as FuelMessagePortalV3 } from '../../typechain'; + +const RATE_LIMIT_DURATION = 3600 * 24 * 7; +const RATE_LIMIT_AMOUNT = 0n; + +const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { + const { + ethers, + upgrades: { upgradeProxy, prepareUpgrade }, + deployments: { get, save }, + } = hre; + const [deployer] = await ethers.getSigners(); + + const fuelMessagePortal = await get('FuelMessagePortal'); + const constructorArgs = [MaxUint256, RATE_LIMIT_DURATION]; + const tx = (await prepareUpgrade( + fuelMessagePortal.address, + new FuelMessagePortalV3(deployer), + { + constructorArgs, + getTxResponse: true, + unsafeSkipStorageCheck: true, + } + )) as TransactionResponse; + const receipt = await tx.wait(); + + const implementation = receipt?.contractAddress; + + if (!implementation) { + throw new Error('No contract in receipt'); + } + + await upgradeProxy( + fuelMessagePortal.address, + new FuelMessagePortalV3(deployer), + { + unsafeAllow: ['constructor'], + constructorArgs, + call: { fn: 'reinitializeV3', args: [RATE_LIMIT_AMOUNT] }, + unsafeSkipStorageCheck: true, + } + ); + + console.log('Upgraded FuelMessagePortal to', implementation); + await save('FuelMessagePortal', { + address: fuelMessagePortal.address, + abi: [...FuelMessagePortalV3.abi], + implementation, + }); + + return true; +}; + +func.tags = ['019_portal_upgrade']; +func.id = '019_portal_upgrade'; +export default func; diff --git a/packages/solidity-contracts/deployments/devnet/.migrations.json b/packages/solidity-contracts/deployments/devnet/.migrations.json index 42d0aa0b..f2999604 100644 --- a/packages/solidity-contracts/deployments/devnet/.migrations.json +++ b/packages/solidity-contracts/deployments/devnet/.migrations.json @@ -16,5 +16,6 @@ "portal_upgrade_2": 1723815805, "portal_set_chain_state": 1723815819, "gateway_redeploy": 1725036878, - "set_asset_issuer_redeploy": 1725036904 + "set_asset_issuer_redeploy": 1725036904, + "018_portal_upgrade": 1739815665 } \ No newline at end of file diff --git a/packages/solidity-contracts/deployments/devnet/FuelMessagePortal.json b/packages/solidity-contracts/deployments/devnet/FuelMessagePortal.json index 965bcc9b..0b9f14aa 100644 --- a/packages/solidity-contracts/deployments/devnet/FuelMessagePortal.json +++ b/packages/solidity-contracts/deployments/devnet/FuelMessagePortal.json @@ -7,6 +7,11 @@ "internalType": "uint256", "name": "_depositLimitGlobal", "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_rateLimitDuration", + "type": "uint256" } ], "stateMutability": "nonpayable", @@ -62,6 +67,21 @@ "name": "MessageRelayFailed", "type": "error" }, + { + "inputs": [], + "name": "NotSupported", + "type": "error" + }, + { + "inputs": [], + "name": "RateLimitExceeded", + "type": "error" + }, + { + "inputs": [], + "name": "ReentrancyGuardReentrantCall", + "type": "error" + }, { "inputs": [], "name": "UnfinalizedBlock", @@ -223,6 +243,32 @@ "name": "Paused", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bool", + "name": "status", + "type": "bool" + } + ], + "name": "RateLimitStatusUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "ResetRateLimit", + "type": "event" + }, { "anonymous": false, "inputs": [ @@ -402,6 +448,32 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "RATE_LIMIT_DURATION", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "SET_RATE_LIMITER_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -415,6 +487,32 @@ "stateMutability": "payable", "type": "function" }, + { + "inputs": [], + "name": "currentPeriodAmount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "currentPeriodEnd", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -564,7 +662,7 @@ "inputs": [ { "internalType": "contract FuelChainState", - "name": "fuelChainState", + "name": "", "type": "address" } ], @@ -573,6 +671,37 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [ + { + "internalType": "contract FuelChainState", + "name": "fuelChainState", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_limitAmount", + "type": "uint256" + } + ], + "name": "initializerV3", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "limitAmount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -645,6 +774,32 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "rateLimitEnabled", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_limitAmount", + "type": "uint256" + } + ], + "name": "reinitializeV3", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { @@ -839,6 +994,19 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "resetRateLimitAmount", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { @@ -934,6 +1102,19 @@ "stateMutability": "payable", "type": "function" }, + { + "inputs": [ + { + "internalType": "bool", + "name": "value", + "type": "bool" + } + ], + "name": "updateRateLimitStatus", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { @@ -979,6 +1160,6 @@ "type": "function" } ], - "numDeployments": 4, - "implementation": "0x6A541330221BE3df4aD6D696Cd3513c0cBFB4752" + "numDeployments": 5, + "implementation": "0xF8F2AEdde6AEBB164f804f78Cc95FBCCc3d642A1" } \ No newline at end of file diff --git a/packages/solidity-contracts/deployments/testnet/.migrations.json b/packages/solidity-contracts/deployments/testnet/.migrations.json index 25f675d8..21e5802d 100644 --- a/packages/solidity-contracts/deployments/testnet/.migrations.json +++ b/packages/solidity-contracts/deployments/testnet/.migrations.json @@ -15,5 +15,6 @@ "portal_set_chain_state": 1724078476, "gateway_redeploy": 1725380413, "set_asset_issuer_redeploy": 1725380833, - "gateway_upgrade": 1727974351 + "gateway_upgrade": 1727974351, + "019_portal_upgrade": 1740045969 } \ No newline at end of file diff --git a/packages/solidity-contracts/deployments/testnet/FuelMessagePortal.json b/packages/solidity-contracts/deployments/testnet/FuelMessagePortal.json index 2c4a1902..ef39c4fb 100644 --- a/packages/solidity-contracts/deployments/testnet/FuelMessagePortal.json +++ b/packages/solidity-contracts/deployments/testnet/FuelMessagePortal.json @@ -7,6 +7,11 @@ "internalType": "uint256", "name": "_depositLimitGlobal", "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_rateLimitDuration", + "type": "uint256" } ], "stateMutability": "nonpayable", @@ -62,6 +67,21 @@ "name": "MessageRelayFailed", "type": "error" }, + { + "inputs": [], + "name": "NotSupported", + "type": "error" + }, + { + "inputs": [], + "name": "RateLimitExceeded", + "type": "error" + }, + { + "inputs": [], + "name": "ReentrancyGuardReentrantCall", + "type": "error" + }, { "inputs": [], "name": "UnfinalizedBlock", @@ -223,6 +243,32 @@ "name": "Paused", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bool", + "name": "status", + "type": "bool" + } + ], + "name": "RateLimitStatusUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "ResetRateLimit", + "type": "event" + }, { "anonymous": false, "inputs": [ @@ -402,6 +448,32 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "RATE_LIMIT_DURATION", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "SET_RATE_LIMITER_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -415,6 +487,32 @@ "stateMutability": "payable", "type": "function" }, + { + "inputs": [], + "name": "currentPeriodAmount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "currentPeriodEnd", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -564,7 +662,7 @@ "inputs": [ { "internalType": "contract FuelChainState", - "name": "fuelChainState", + "name": "", "type": "address" } ], @@ -573,6 +671,37 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [ + { + "internalType": "contract FuelChainState", + "name": "fuelChainState", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_limitAmount", + "type": "uint256" + } + ], + "name": "initializerV3", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "limitAmount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -645,6 +774,32 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "rateLimitEnabled", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_limitAmount", + "type": "uint256" + } + ], + "name": "reinitializeV3", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { @@ -839,6 +994,19 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "resetRateLimitAmount", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { @@ -934,6 +1102,19 @@ "stateMutability": "payable", "type": "function" }, + { + "inputs": [ + { + "internalType": "bool", + "name": "value", + "type": "bool" + } + ], + "name": "updateRateLimitStatus", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { @@ -979,6 +1160,6 @@ "type": "function" } ], - "numDeployments": 3, - "implementation": "0x6A541330221BE3df4aD6D696Cd3513c0cBFB4752" + "numDeployments": 4, + "implementation": "0xF8F2AEdde6AEBB164f804f78Cc95FBCCc3d642A1" } \ No newline at end of file