From 292f220346c9f72ea5d42d6e960f67633f5d9bd1 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Fri, 14 Feb 2025 21:31:24 +0400 Subject: [PATCH 001/186] feat: add contract version --- contracts/AddressResolver.sol | 10 +++++-- contracts/AsyncPromise.sol | 7 +++-- contracts/Forwarder.sol | 7 +++-- .../app-gateway/AuctionManager.sol | 7 +++-- .../app-gateway/DeliveryHelper.sol | 7 +++-- .../app-gateway/FeesManager.sol | 8 ++++- contracts/socket/utils/SignatureVerifier.sol | 5 +++- .../watcherPrecompile/WatcherPrecompile.sol | 8 +++-- hardhat-scripts/constants/constants.ts | 1 + hardhat-scripts/deploy/1.deploy.ts | 30 +++++++++++-------- test/DeliveryHelper.t.sol | 9 ++++-- test/MockWatcherPrecompileImpl.sol | 3 +- test/SetupTest.t.sol | 12 +++++--- 13 files changed, 77 insertions(+), 37 deletions(-) diff --git a/contracts/AddressResolver.sol b/contracts/AddressResolver.sol index b8820060..43460cc3 100644 --- a/contracts/AddressResolver.sol +++ b/contracts/AddressResolver.sol @@ -28,6 +28,7 @@ contract AddressResolver is OwnableTwoStep, IAddressResolver, Initializable { address[] internal _promises; uint256 public asyncPromiseCounter; + uint64 public version; // contracts to gateway map mapping(address => address) public override contractsToGateways; @@ -48,7 +49,8 @@ contract AddressResolver is OwnableTwoStep, IAddressResolver, Initializable { /// @notice Initializer to replace constructor for upgradeable contracts /// @param owner_ The address of the contract owner - function initialize(address owner_) public reinitializer(1) { + function initialize(address owner_, uint64 version_) public reinitializer(version_) { + version = version_; _claimOwner(owner_); forwarderImplementation = address(new Forwarder()); @@ -98,7 +100,8 @@ contract AddressResolver is OwnableTwoStep, IAddressResolver, Initializable { Forwarder.initialize.selector, chainSlug_, chainContractAddress_, - address(this) + address(this), + version ); salt = keccak256(constructorArgs); } @@ -111,7 +114,8 @@ contract AddressResolver is OwnableTwoStep, IAddressResolver, Initializable { AsyncPromise.initialize.selector, invoker_, msg.sender, - address(this) + address(this), + version ); salt = keccak256(abi.encodePacked(constructorArgs, asyncPromiseCounter)); diff --git a/contracts/AsyncPromise.sol b/contracts/AsyncPromise.sol index a3f45114..cf506d23 100644 --- a/contracts/AsyncPromise.sol +++ b/contracts/AsyncPromise.sol @@ -37,6 +37,7 @@ contract AsyncPromise is IPromise, Initializable, AddressResolverUtil { /// @notice The callback data to be used when the promise is resolved. bytes public callbackData; + uint64 public version; /// @notice Error thrown when attempting to resolve an already resolved promise. error PromiseAlreadyResolved(); @@ -58,8 +59,10 @@ contract AsyncPromise is IPromise, Initializable, AddressResolverUtil { function initialize( address invoker_, address forwarder_, - address addressResolver_ - ) public reinitializer(1) { + address addressResolver_, + uint64 version_ + ) public reinitializer(version_) { + version = version_; _setAddressResolver(addressResolver_); localInvoker = invoker_; forwarder = forwarder_; diff --git a/contracts/Forwarder.sol b/contracts/Forwarder.sol index d1993af0..2cb21ee0 100644 --- a/contracts/Forwarder.sol +++ b/contracts/Forwarder.sol @@ -23,6 +23,7 @@ contract Forwarder is IForwarder, Initializable { /// @notice caches the latest async promise address for the last call address public latestAsyncPromise; + uint64 public version; constructor() { _disableInitializers(); // disable for implementation @@ -35,8 +36,10 @@ contract Forwarder is IForwarder, Initializable { function initialize( uint32 chainSlug_, address onChainAddress_, - address addressResolver_ - ) public reinitializer(1) { + address addressResolver_, + uint64 version_ + ) public reinitializer(version_) { + version = version_; chainSlug = chainSlug_; onChainAddress = onChainAddress_; addressResolver = addressResolver_; diff --git a/contracts/apps/payload-delivery/app-gateway/AuctionManager.sol b/contracts/apps/payload-delivery/app-gateway/AuctionManager.sol index 484e0add..d72bf380 100644 --- a/contracts/apps/payload-delivery/app-gateway/AuctionManager.sol +++ b/contracts/apps/payload-delivery/app-gateway/AuctionManager.sol @@ -21,6 +21,7 @@ contract AuctionManager is AddressResolverUtil, OwnableTwoStep, IAuctionManager, mapping(bytes32 => bool) public override auctionStarted; uint256 public auctionEndDelaySeconds; + uint64 public version; /// @notice Error thrown when trying to start or bid a closed auction error AuctionClosed(); @@ -46,10 +47,12 @@ contract AuctionManager is AddressResolverUtil, OwnableTwoStep, IAuctionManager, uint256 auctionEndDelaySeconds_, address addressResolver_, SignatureVerifier signatureVerifier_, - address owner_ - ) public reinitializer(1) { + address owner_, + uint64 version_ + ) public reinitializer(version_) { _setAddressResolver(addressResolver_); _claimOwner(owner_); + version = version_; vmChainSlug = vmChainSlug_; signatureVerifier = signatureVerifier_; auctionEndDelaySeconds = auctionEndDelaySeconds_; diff --git a/contracts/apps/payload-delivery/app-gateway/DeliveryHelper.sol b/contracts/apps/payload-delivery/app-gateway/DeliveryHelper.sol index 59e44cf9..a8151dca 100644 --- a/contracts/apps/payload-delivery/app-gateway/DeliveryHelper.sol +++ b/contracts/apps/payload-delivery/app-gateway/DeliveryHelper.sol @@ -11,6 +11,7 @@ import "solady/utils/Initializable.sol"; contract DeliveryHelper is BatchAsync, OwnableTwoStep, Initializable { event CallBackReverted(bytes32 asyncId_, bytes32 payloadId_); + uint64 public version; constructor() { _disableInitializers(); // disable for implementation @@ -24,9 +25,11 @@ contract DeliveryHelper is BatchAsync, OwnableTwoStep, Initializable { address addressResolver_, address feesManager_, address owner_, - uint256 bidTimeout_ - ) public reinitializer(1) { + uint256 bidTimeout_, + uint64 version_ + ) public reinitializer(version_) { _setAddressResolver(addressResolver_); + version = version_; feesManager = feesManager_; bidTimeout = bidTimeout_; _claimOwner(owner_); diff --git a/contracts/apps/payload-delivery/app-gateway/FeesManager.sol b/contracts/apps/payload-delivery/app-gateway/FeesManager.sol index 193730e2..46037e00 100644 --- a/contracts/apps/payload-delivery/app-gateway/FeesManager.sol +++ b/contracts/apps/payload-delivery/app-gateway/FeesManager.sol @@ -16,6 +16,7 @@ import "solady/utils/Initializable.sol"; contract FeesManager is IFeesManager, AddressResolverUtil, OwnableTwoStep, Initializable { uint256 public feesCounter; mapping(uint32 => uint256) public feeCollectionGasLimit; + uint64 public version; /// @notice Struct containing fee amounts and status struct TokenBalance { @@ -99,7 +100,12 @@ contract FeesManager is IFeesManager, AddressResolverUtil, OwnableTwoStep, Initi /// @notice Initializer function to replace constructor /// @param addressResolver_ The address of the address resolver /// @param owner_ The address of the owner - function initialize(address addressResolver_, address owner_) public reinitializer(1) { + function initialize( + address addressResolver_, + address owner_, + uint64 version_ + ) public reinitializer(version_) { + version = version_; _setAddressResolver(addressResolver_); _claimOwner(owner_); } diff --git a/contracts/socket/utils/SignatureVerifier.sol b/contracts/socket/utils/SignatureVerifier.sol index 1ed682c0..6391bd13 100644 --- a/contracts/socket/utils/SignatureVerifier.sol +++ b/contracts/socket/utils/SignatureVerifier.sol @@ -14,6 +14,8 @@ import "solady/utils/Initializable.sol"; * @dev This contract is modular component in socket to support different signing algorithms. */ contract SignatureVerifier is ISignatureVerifier, AccessControl, Initializable { + uint64 public version; + /* * @dev Error thrown when signature length is invalid */ @@ -23,7 +25,8 @@ contract SignatureVerifier is ISignatureVerifier, AccessControl, Initializable { * @notice initializes and grants RESCUE_ROLE to owner. * @param owner_ The address of the owner of the contract. */ - function initialize(address owner_) public reinitializer(1) { + function initialize(address owner_, uint64 version_) public reinitializer(version_) { + version = version_; _claimOwner(owner_); _grantRole(RESCUE_ROLE, owner_); } diff --git a/contracts/watcherPrecompile/WatcherPrecompile.sol b/contracts/watcherPrecompile/WatcherPrecompile.sol index 263b87c6..32d8054f 100644 --- a/contracts/watcherPrecompile/WatcherPrecompile.sol +++ b/contracts/watcherPrecompile/WatcherPrecompile.sol @@ -37,6 +37,8 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { /// @dev callId => bool mapping(bytes32 => bool) public appGatewayCalled; + uint64 public version; + /// @notice Error thrown when an invalid chain slug is provided error InvalidChainSlug(); /// @notice Error thrown when an invalid app gateway reaches a plug @@ -97,10 +99,12 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { function initialize( address owner_, address addressResolver_, - uint256 maxLimit_ - ) public reinitializer(1) { + uint256 maxLimit_, + uint64 version_ + ) public reinitializer(version_) { _setAddressResolver(addressResolver_); _claimOwner(owner_); + version = version_; maxTimeoutDelayInSeconds = 24 * 60 * 60; // 24 hours LIMIT_DECIMALS = 18; diff --git a/hardhat-scripts/constants/constants.ts b/hardhat-scripts/constants/constants.ts index b908f2ea..df871a12 100644 --- a/hardhat-scripts/constants/constants.ts +++ b/hardhat-scripts/constants/constants.ts @@ -14,3 +14,4 @@ export const BASE_SEPOLIA_CHAIN_ID = 84532; export const EVMX_CHAIN_ID = 7625382; export const MAX_LIMIT = 100; export const BID_TIMEOUT = 1000; +export const VERSION = 1; diff --git a/hardhat-scripts/deploy/1.deploy.ts b/hardhat-scripts/deploy/1.deploy.ts index 44cfbb34..5985a8bc 100644 --- a/hardhat-scripts/deploy/1.deploy.ts +++ b/hardhat-scripts/deploy/1.deploy.ts @@ -13,7 +13,12 @@ import { getProviderFromChainSlug } from "../constants"; import { ethers } from "hardhat"; import dev_addresses from "../../deployments/dev_addresses.json"; import { auctionEndDelaySeconds, chains } from "./config"; -import { MAX_LIMIT, EVMX_CHAIN_ID, BID_TIMEOUT } from "../constants/constants"; +import { + MAX_LIMIT, + EVMX_CHAIN_ID, + BID_TIMEOUT, + VERSION, +} from "../constants/constants"; import { CORE_CONTRACTS, OffChainVMCoreContracts } from "../../src"; let offChainVMOwner: string; @@ -213,7 +218,7 @@ const deployWatcherVMContracts = async () => { deployUtils = await deployContractWithProxy( OffChainVMCoreContracts.SignatureVerifier, `contracts/socket/utils/SignatureVerifier.sol`, - [offChainVMOwner], + [offChainVMOwner, VERSION], proxyFactory, deployUtils ); @@ -221,7 +226,7 @@ const deployWatcherVMContracts = async () => { deployUtils = await deployContractWithProxy( OffChainVMCoreContracts.AddressResolver, `contracts/AddressResolver.sol`, - [offChainVMOwner], + [offChainVMOwner, VERSION], proxyFactory, deployUtils ); @@ -234,7 +239,7 @@ const deployWatcherVMContracts = async () => { deployUtils = await deployContractWithProxy( OffChainVMCoreContracts.WatcherPrecompile, `contracts/watcherPrecompile/WatcherPrecompile.sol`, - [offChainVMOwner, addressResolver.address, MAX_LIMIT], + [offChainVMOwner, addressResolver.address, MAX_LIMIT, VERSION], proxyFactory, deployUtils ); @@ -242,7 +247,7 @@ const deployWatcherVMContracts = async () => { deployUtils = await deployContractWithProxy( OffChainVMCoreContracts.FeesManager, `contracts/apps/payload-delivery/app-gateway/FeesManager.sol`, - [addressResolver.address, offChainVMOwner], + [addressResolver.address, offChainVMOwner, VERSION], proxyFactory, deployUtils ); @@ -257,6 +262,7 @@ const deployWatcherVMContracts = async () => { feesManagerAddress, offChainVMOwner, BID_TIMEOUT, + VERSION, ], proxyFactory, deployUtils @@ -271,6 +277,7 @@ const deployWatcherVMContracts = async () => { addressResolver.address, deployUtils.addresses[OffChainVMCoreContracts.SignatureVerifier], offChainVMOwner, + VERSION, ], proxyFactory, deployUtils @@ -378,15 +385,12 @@ const deployContractWithProxy = async ( if (deployUtils.addresses[contractName] !== undefined) return deployUtils; // Deploy transparent proxy - const tx = await proxyFactory.connect(deployUtils.signer).deployAndCall( - implementation.address, - offChainVMOwner, - initData - ); + const tx = await proxyFactory + .connect(deployUtils.signer) + .deployAndCall(implementation.address, offChainVMOwner, initData); const receipt = await tx.wait(); - const proxyAddress = receipt.events?.find( - (e) => e.event === "Deployed" - )?.args?.proxy; + const proxyAddress = receipt.events?.find((e) => e.event === "Deployed")?.args + ?.proxy; deployUtils.addresses[contractName] = proxyAddress; return deployUtils; diff --git a/test/DeliveryHelper.t.sol b/test/DeliveryHelper.t.sol index 5532d35f..e3ba294b 100644 --- a/test/DeliveryHelper.t.sol +++ b/test/DeliveryHelper.t.sol @@ -49,7 +49,8 @@ contract DeliveryHelperTest is SetupTest { bytes memory feesManagerData = abi.encodeWithSelector( FeesManager.initialize.selector, address(addressResolver), - owner + owner, + version ); vm.expectEmit(true, true, true, false); @@ -65,7 +66,8 @@ contract DeliveryHelperTest is SetupTest { address(addressResolver), address(feesManagerProxy), owner, - bidTimeout + bidTimeout, + version ); vm.expectEmit(true, true, true, false); @@ -82,7 +84,8 @@ contract DeliveryHelperTest is SetupTest { auctionEndDelaySeconds, address(addressResolver), signatureVerifier, - owner + owner, + version ); vm.expectEmit(true, true, true, false); emit Initialized(1); diff --git a/test/MockWatcherPrecompileImpl.sol b/test/MockWatcherPrecompileImpl.sol index feddf807..86ad1243 100644 --- a/test/MockWatcherPrecompileImpl.sol +++ b/test/MockWatcherPrecompileImpl.sol @@ -18,8 +18,7 @@ contract MockWatcherPrecompileImpl is WatcherPrecompile { // limit per day maxLimit = maxLimit_ * 10 ** LIMIT_DECIMALS; - // limit per second + // limit per second ratePerSecond = maxLimit / (24 * 60 * 60); } } - diff --git a/test/SetupTest.t.sol b/test/SetupTest.t.sol index 99f0c851..f4f55018 100644 --- a/test/SetupTest.t.sol +++ b/test/SetupTest.t.sol @@ -43,6 +43,7 @@ contract SetupTest is Test { uint256 public maxLimit = 1000; bytes public asyncPromiseBytecode = type(AsyncPromise).creationCode; + uint64 public version = 1; struct SocketContracts { uint32 chainSlug; @@ -69,7 +70,7 @@ contract SetupTest is Test { function deploySocket(uint32 chainSlug_) internal returns (SocketContracts memory) { SignatureVerifier verifier = new SignatureVerifier(); - verifier.initialize(owner); + verifier.initialize(owner, version); Hasher hasher = new Hasher(owner); Socket socket = new Socket(chainSlug_, address(hasher), address(verifier), owner, "test"); @@ -112,7 +113,8 @@ contract SetupTest is Test { // Deploy and initialize proxies bytes memory signatureVerifierData = abi.encodeWithSelector( SignatureVerifier.initialize.selector, - owner + owner, + version ); vm.expectEmit(true, true, true, false); @@ -125,7 +127,8 @@ contract SetupTest is Test { bytes memory addressResolverData = abi.encodeWithSelector( AddressResolver.initialize.selector, - watcherEOA + watcherEOA, + version ); vm.expectEmit(true, true, true, false); emit Initialized(1); @@ -139,7 +142,8 @@ contract SetupTest is Test { WatcherPrecompile.initialize.selector, watcherEOA, address(addressResolverProxy), - maxLimit + maxLimit, + version ); vm.expectEmit(true, true, true, false); emit Initialized(1); From b3bb10e27b08cd1a4199c27d4f393778b63c212d Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Fri, 14 Feb 2025 21:31:51 +0400 Subject: [PATCH 002/186] fix: lint --- deployments/dev_addresses.json | 36 ++++++------ deployments/dev_verification.json | 65 +-------------------- hardhat-scripts/deploy/3.upgradeManagers.ts | 4 +- hardhat-scripts/deploy/4.connect.ts | 4 +- hardhat-scripts/deploy/5.upload.ts | 5 +- hardhat-scripts/deploy/6.setupEnv.ts | 4 +- hardhat-scripts/deploy/utils/utils.ts | 2 +- hardhat-scripts/deploy/verify.ts | 5 +- 8 files changed, 27 insertions(+), 98 deletions(-) diff --git a/deployments/dev_addresses.json b/deployments/dev_addresses.json index e9b64f59..ffe2d9bc 100644 --- a/deployments/dev_addresses.json +++ b/deployments/dev_addresses.json @@ -1,38 +1,38 @@ { "421614": { - "SignatureVerifier": "0x5e5CF700c97BC8B3F6215D98E65f85D4A44d7D06", + "ContractFactoryPlug": "0x87cC19AedD434ebD3B74FfdC073CAeC7dC1E92EA", + "FastSwitchboard": "0x5aA84ffE5eCCB5263d1AE6aEd5682EAb39Bc7036", + "FeesPlug": "0x63d3F60Db6a7Eb2fa730F850dA247C73aD162656", "Hasher": "0x6A8e801B3299FeB96D0607A01a62Db8A9239Bdc0", + "SignatureVerifier": "0x5e5CF700c97BC8B3F6215D98E65f85D4A44d7D06", "Socket": "0xa09217Cfc47F399C382E982778f6128685e13aD4", "SocketBatcher": "0x80568677f2B092bd974657FE47Fc8531bfE5DBDC", - "FastSwitchboard": "0x5aA84ffE5eCCB5263d1AE6aEd5682EAb39Bc7036", - "FeesPlug": "0x63d3F60Db6a7Eb2fa730F850dA247C73aD162656", - "ContractFactoryPlug": "0x87cC19AedD434ebD3B74FfdC073CAeC7dC1E92EA", "startBlock": 123791225 }, "7625382": { - "SignatureVerifierImpl": "0xCd44A8068117d888fb44Eb4fDe49bc9B7085189E", + "AddressResolver": "0xF2bb0cA7Eab6a2c4ed64793959Ac4401159D5D13", "AddressResolverImpl": "0xBCF275473fdECEf5AFe22D1c771Cb79317be58dB", + "AuctionManager": "0xE5A00A99C5C8E40d1C6Ec817bc808d71b1d4369b", + "AuctionManagerImpl": "0x6B94BfF71631f21166946e80967774F3f45e9A0b", + "DeliveryHelper": "0xc0560207cBDBc5301E8343C51f8A7da339596969", + "DeliveryHelperImpl": "0xAEE7D460fD1d8c4be069443a65187BC50A0BA89A", "ERC1967Factory": "0xaAF245274e877795B01671602a753AafAc459297", + "FeesManager": "0x4D29076a0590909F3Bda7f85466cd8Ee291A1247", + "FeesManagerImpl": "0x3Ee25f844976888B29A921443b34374d9eCC466d", "SignatureVerifier": "0x2eF8A7768c42342927B9e41E468CC2984835DC58", - "AddressResolver": "0xF2bb0cA7Eab6a2c4ed64793959Ac4401159D5D13", - "WatcherPrecompileImpl": "0x345c85aCc495E6FeDCf52987BDc0636A12F8AEd7", + "SignatureVerifierImpl": "0xCd44A8068117d888fb44Eb4fDe49bc9B7085189E", + "startBlock": 5424, "WatcherPrecompile": "0x376AdA81749a64e9C2439025f475D1a7E004fcC1", - "FeesManagerImpl": "0x3Ee25f844976888B29A921443b34374d9eCC466d", - "FeesManager": "0x4D29076a0590909F3Bda7f85466cd8Ee291A1247", - "DeliveryHelperImpl": "0xAEE7D460fD1d8c4be069443a65187BC50A0BA89A", - "DeliveryHelper": "0xc0560207cBDBc5301E8343C51f8A7da339596969", - "AuctionManagerImpl": "0x6B94BfF71631f21166946e80967774F3f45e9A0b", - "AuctionManager": "0xE5A00A99C5C8E40d1C6Ec817bc808d71b1d4369b", - "startBlock": 5424 + "WatcherPrecompileImpl": "0x345c85aCc495E6FeDCf52987BDc0636A12F8AEd7" }, "11155420": { - "SignatureVerifier": "0x36AC527afA283c95EA7dD11c8E93225d9F139028", + "ContractFactoryPlug": "0x0E0F673C9b34d08b99407F1947A10Fe73aa17928", + "FastSwitchboard": "0x688cf2744cd66F00E34f8BbAd15C8fb2438D62be", + "FeesPlug": "0xc13eb89675c12efF5faf5bE9B4773F9ed9192107", "Hasher": "0xd36C1Dcb65CB09b7fCFABf153D7cdd42312C782E", + "SignatureVerifier": "0x36AC527afA283c95EA7dD11c8E93225d9F139028", "Socket": "0xB0e1D8536ed769860f344Cf795f2B4fAaa41F0C8", "SocketBatcher": "0x5fef21aD7Dc13CB1b7Cb9EAD404e3EA38d153348", - "FastSwitchboard": "0x688cf2744cd66F00E34f8BbAd15C8fb2438D62be", - "FeesPlug": "0xc13eb89675c12efF5faf5bE9B4773F9ed9192107", - "ContractFactoryPlug": "0x0E0F673C9b34d08b99407F1947A10Fe73aa17928", "startBlock": 23870487 } } diff --git a/deployments/dev_verification.json b/deployments/dev_verification.json index ac69d1ce..fcc31340 100644 --- a/deployments/dev_verification.json +++ b/deployments/dev_verification.json @@ -1,14 +1,5 @@ { "421614": [ - [ - "0x87cC19AedD434ebD3B74FfdC073CAeC7dC1E92EA", - "ContractFactoryPlug", - "contracts/apps/payload-delivery/ContractFactoryPlug.sol", - [ - "0xa09217Cfc47F399C382E982778f6128685e13aD4", - "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18" - ] - ], [ "0x63d3F60Db6a7Eb2fa730F850dA247C73aD162656", "FeesPlug", @@ -17,58 +8,6 @@ "0xa09217Cfc47F399C382E982778f6128685e13aD4", "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18" ] - ], - [ - "0x5aA84ffE5eCCB5263d1AE6aEd5682EAb39Bc7036", - "FastSwitchboard", - "contracts/socket/switchboard/FastSwitchboard.sol", - [ - 421614, - "0xa09217Cfc47F399C382E982778f6128685e13aD4", - "0x5e5CF700c97BC8B3F6215D98E65f85D4A44d7D06", - "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18" - ] - ], - [ - "0x80568677f2B092bd974657FE47Fc8531bfE5DBDC", - "SocketBatcher", - "contracts/socket/SocketBatcher.sol", - [ - "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18", - "0xa09217Cfc47F399C382E982778f6128685e13aD4" - ] - ], - [ - "0xa09217Cfc47F399C382E982778f6128685e13aD4", - "Socket", - "contracts/socket/Socket.sol", - [ - 421614, - "0x6A8e801B3299FeB96D0607A01a62Db8A9239Bdc0", - "0x5e5CF700c97BC8B3F6215D98E65f85D4A44d7D06", - "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18", - "OFF_CHAIN_VM" - ] - ], - [ - "0x6A8e801B3299FeB96D0607A01a62Db8A9239Bdc0", - "Hasher", - "contracts/socket/utils/Hasher.sol", - [ - "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18" - ] - ], - [ - "0x5e5CF700c97BC8B3F6215D98E65f85D4A44d7D06", - "SignatureVerifier", - "contracts/socket/utils/SignatureVerifier.sol", - [] - ], - [ - "0xBB4Bca54f566fc04b7A7489fF00265a1cE38b929", - "SignatureVerifier", - "contracts/socket/utils/SignatureVerifier.sol", - [] ] ], "7625382": [ @@ -182,9 +121,7 @@ "0xd36C1Dcb65CB09b7fCFABf153D7cdd42312C782E", "Hasher", "contracts/socket/utils/Hasher.sol", - [ - "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18" - ] + ["0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18"] ], [ "0x36AC527afA283c95EA7dD11c8E93225d9F139028", diff --git a/hardhat-scripts/deploy/3.upgradeManagers.ts b/hardhat-scripts/deploy/3.upgradeManagers.ts index 23371d40..5589b2fb 100644 --- a/hardhat-scripts/deploy/3.upgradeManagers.ts +++ b/hardhat-scripts/deploy/3.upgradeManagers.ts @@ -62,9 +62,7 @@ export const main = async () => { }; async function setSwitchboard(sbAddress, chain, addresses) { - const providerInstance = getProviderFromChainSlug( - EVMX_CHAIN_ID as ChainSlug - ); + const providerInstance = getProviderFromChainSlug(EVMX_CHAIN_ID as ChainSlug); const signer: Wallet = new ethers.Wallet( process.env.WATCHER_PRIVATE_KEY as string, providerInstance diff --git a/hardhat-scripts/deploy/4.connect.ts b/hardhat-scripts/deploy/4.connect.ts index e66da43c..5ac20c3e 100644 --- a/hardhat-scripts/deploy/4.connect.ts +++ b/hardhat-scripts/deploy/4.connect.ts @@ -25,9 +25,7 @@ export const getAppGateway = (plug: string, addresses: DeploymentAddresses) => { OffChainVMCoreContracts.DeliveryHelper ]; case CORE_CONTRACTS.FeesPlug: - return addresses?.[EVMX_CHAIN_ID]?.[ - OffChainVMCoreContracts.FeesManager - ]; + return addresses?.[EVMX_CHAIN_ID]?.[OffChainVMCoreContracts.FeesManager]; default: throw new Error(`Unknown plug: ${plug}`); } diff --git a/hardhat-scripts/deploy/5.upload.ts b/hardhat-scripts/deploy/5.upload.ts index 00be4c95..b174760c 100644 --- a/hardhat-scripts/deploy/5.upload.ts +++ b/hardhat-scripts/deploy/5.upload.ts @@ -2,10 +2,7 @@ import fs from "fs"; import path from "path"; import { S3Client, PutObjectCommand } from "@aws-sdk/client-s3"; import { config as dotenvConfig } from "dotenv"; -import { - BASE_SEPOLIA_CHAIN_ID, - EVMX_CHAIN_ID, -} from "../constants/constants"; +import { BASE_SEPOLIA_CHAIN_ID, EVMX_CHAIN_ID } from "../constants/constants"; import { ChainSlug } from "@socket.tech/dl-core"; // import applicationGateway from "../../artifacts/abi/SuperTokenApp.json"; diff --git a/hardhat-scripts/deploy/6.setupEnv.ts b/hardhat-scripts/deploy/6.setupEnv.ts index 92e52dda..93396386 100644 --- a/hardhat-scripts/deploy/6.setupEnv.ts +++ b/hardhat-scripts/deploy/6.setupEnv.ts @@ -33,7 +33,9 @@ const updatedLines = lines.map((line) => { dev_addresses[ChainSlug.ARBITRUM_SEPOLIA]["FastSwitchboard"] }`; } else if (line.startsWith("ARBITRUM_FEES_PLUG=")) { - return `ARBITRUM_FEES_PLUG=${dev_addresses[ChainSlug.ARBITRUM_SEPOLIA]["FeesPlug"]}`; + return `ARBITRUM_FEES_PLUG=${ + dev_addresses[ChainSlug.ARBITRUM_SEPOLIA]["FeesPlug"] + }`; } return line; // Return the line unchanged if it doesn't match any of the above }); diff --git a/hardhat-scripts/deploy/utils/utils.ts b/hardhat-scripts/deploy/utils/utils.ts index d952e5c6..6ddbb529 100644 --- a/hardhat-scripts/deploy/utils/utils.ts +++ b/hardhat-scripts/deploy/utils/utils.ts @@ -306,7 +306,7 @@ export const getAddresses = async ( return deploymentAddresses[chainSlug]; }; -export const createObj = function( +export const createObj = function ( obj: ChainSocketAddresses, keys: string[], value: any diff --git a/hardhat-scripts/deploy/verify.ts b/hardhat-scripts/deploy/verify.ts index b43a67d5..d9c54417 100644 --- a/hardhat-scripts/deploy/verify.ts +++ b/hardhat-scripts/deploy/verify.ts @@ -8,10 +8,7 @@ import { } from "@socket.tech/dl-core"; import path from "path"; import fs from "fs"; -import { - BASE_SEPOLIA_CHAIN_ID, - EVMX_CHAIN_ID, -} from "../constants/constants"; +import { BASE_SEPOLIA_CHAIN_ID, EVMX_CHAIN_ID } from "../constants/constants"; export type VerifyParams = { [chain in HardhatChainName]?: VerifyArgs[]; From 9c1b42fe75fc23117a5ce9a76be2d09db0b0eb9f Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Sat, 15 Feb 2025 14:30:23 +0400 Subject: [PATCH 003/186] test: beacon upgrade --- test/Migration.t.sol | 132 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 132 insertions(+) diff --git a/test/Migration.t.sol b/test/Migration.t.sol index 1b495f40..394b3a5b 100644 --- a/test/Migration.t.sol +++ b/test/Migration.t.sol @@ -5,16 +5,26 @@ import "./SetupTest.t.sol"; import "../contracts/socket/utils/SignatureVerifier.sol"; import "../contracts/AddressResolver.sol"; import "../contracts/watcherPrecompile/WatcherPrecompile.sol"; +import "../contracts/Forwarder.sol"; +import "../contracts/AsyncPromise.sol"; import "./MockWatcherPrecompileImpl.sol"; contract MigrationTest is SetupTest { // ERC1967Factory emits this event with both proxy and implementation addresses event Upgraded(address indexed proxy, address indexed implementation); + event ImplementationUpdated(string contractName, address newImplementation); // ERC1967 implementation slot bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; + // Beacon implementation slot + uint256 internal constant _BEACON_IMPLEMENTATION_SLOT = 0x911c5a209f08d5ec5e; + + // Beacon slot in ERC1967 + bytes32 internal constant _BEACON_SLOT = + 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50; + // Error selector for Unauthorized error bytes4 internal constant UNAUTHORIZED_SELECTOR = 0x82b42900; // bytes4(keccak256("Unauthorized()")) @@ -27,6 +37,16 @@ contract MigrationTest is SetupTest { return address(uint160(uint256(value))); } + function getBeaconImplementation(address beacon) internal view returns (address) { + bytes32 value = vm.load(beacon, bytes32(_BEACON_IMPLEMENTATION_SLOT)); + return address(uint160(uint256(value))); + } + + function getBeacon(address proxy) internal view returns (address) { + bytes32 value = vm.load(proxy, _BEACON_SLOT); + return address(uint160(uint256(value))); + } + function testSignatureVerifierUpgrade() public { // Deploy new implementation SignatureVerifier newImpl = new SignatureVerifier(); @@ -156,4 +176,116 @@ contract MigrationTest is SetupTest { "Implementation should not have changed" ); } + + function testForwarderBeaconUpgrade() public { + // Deploy new implementation + Forwarder newImpl = new Forwarder(); + + // Get current implementation from beacon + address oldImpl = getBeaconImplementation(address(addressResolver.forwarderBeacon())); + + // Upgrade beacon to new implementation + vm.startPrank(watcherEOA); + vm.expectEmit(true, true, true, true, address(addressResolver)); + emit ImplementationUpdated("Forwarder", address(newImpl)); + addressResolver.setForwarderImplementation(address(newImpl)); + vm.stopPrank(); + + // Verify upgrade was successful + address newImplAddr = getBeaconImplementation(address(addressResolver.forwarderBeacon())); + assertNotEq(oldImpl, newImplAddr, "Implementation should have changed"); + assertEq(newImplAddr, address(newImpl), "New implementation not set correctly"); + + // Deploy a new forwarder and verify it uses the correct beacon + address newForwarder = addressResolver.getOrDeployForwarderContract( + address(this), + address(0x123), + 1 + ); + address beacon = getBeacon(newForwarder); + assertEq( + beacon, + address(addressResolver.forwarderBeacon()), + "Beacon address not set correctly" + ); + + // Get implementation from beacon and verify it matches + address implFromBeacon = getBeaconImplementation(beacon); + assertEq( + implFromBeacon, + address(newImpl), + "Beacon implementation should match new implementation" + ); + } + + function testAsyncPromiseBeaconUpgrade() public { + // Deploy new implementation + AsyncPromise newImpl = new AsyncPromise(); + + // Get current implementation from beacon + address oldImpl = getBeaconImplementation(address(addressResolver.asyncPromiseBeacon())); + + // Upgrade beacon to new implementation + vm.startPrank(watcherEOA); + vm.expectEmit(true, true, true, true, address(addressResolver)); + emit ImplementationUpdated("AsyncPromise", address(newImpl)); + addressResolver.setAsyncPromiseImplementation(address(newImpl)); + vm.stopPrank(); + + // Verify upgrade was successful + address newImplAddr = getBeaconImplementation( + address(addressResolver.asyncPromiseBeacon()) + ); + assertNotEq(oldImpl, newImplAddr, "Implementation should have changed"); + assertEq(newImplAddr, address(newImpl), "New implementation not set correctly"); + + // Deploy a new async promise and verify it uses the correct beacon + address newPromise = addressResolver.deployAsyncPromiseContract(address(this)); + address beacon = getBeacon(newPromise); + assertEq( + beacon, + address(addressResolver.asyncPromiseBeacon()), + "Beacon address not set correctly" + ); + + // Get implementation from beacon and verify it matches + address implFromBeacon = getBeaconImplementation(beacon); + assertEq( + implFromBeacon, + address(newImpl), + "Beacon implementation should match new implementation" + ); + } + + function testUnauthorizedBeaconUpgrade() public { + // Deploy new implementations + Forwarder newForwarderImpl = new Forwarder(); + AsyncPromise newAsyncPromiseImpl = new AsyncPromise(); + + // Try to upgrade from unauthorized account + address unauthorizedUser = address(0xBEEF); + + vm.startPrank(unauthorizedUser); + // Try upgrading forwarder beacon + vm.expectRevert(abi.encodeWithSignature("OnlyOwner()")); + addressResolver.setForwarderImplementation(address(newForwarderImpl)); + + // Try upgrading async promise beacon + vm.expectRevert(abi.encodeWithSignature("OnlyOwner()")); + addressResolver.setAsyncPromiseImplementation(address(newAsyncPromiseImpl)); + + vm.stopPrank(); + + // Verify implementations were not changed + assertNotEq( + getBeaconImplementation(address(addressResolver.forwarderBeacon())), + address(newForwarderImpl), + "Forwarder implementation should not have changed" + ); + assertNotEq( + getBeaconImplementation(address(addressResolver.asyncPromiseBeacon())), + address(newAsyncPromiseImpl), + "AsyncPromise implementation should not have changed" + ); + } } From ffa369963d16e34e69646f140a4534d8390f7082 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Sat, 15 Feb 2025 16:45:27 +0400 Subject: [PATCH 004/186] feat: migrate script --- hardhat-scripts/deploy/1.deploy.ts | 2 +- hardhat-scripts/deploy/migrate-proxies.ts | 95 ----------- .../deploy/migration/migrate-proxies.ts | 154 ++++++++++++++++++ 3 files changed, 155 insertions(+), 96 deletions(-) delete mode 100644 hardhat-scripts/deploy/migrate-proxies.ts create mode 100644 hardhat-scripts/deploy/migration/migrate-proxies.ts diff --git a/hardhat-scripts/deploy/1.deploy.ts b/hardhat-scripts/deploy/1.deploy.ts index 5985a8bc..a78375d0 100644 --- a/hardhat-scripts/deploy/1.deploy.ts +++ b/hardhat-scripts/deploy/1.deploy.ts @@ -375,6 +375,7 @@ const deployContractWithProxy = async ( deployUtils ); deployUtils.addresses[keyName] = implementation.address; + if (deployUtils.addresses[contractName] !== undefined) return deployUtils; // Create initialization data const initializeFn = implementation.interface.getFunction("initialize"); @@ -382,7 +383,6 @@ const deployContractWithProxy = async ( initializeFn, initParams ); - if (deployUtils.addresses[contractName] !== undefined) return deployUtils; // Deploy transparent proxy const tx = await proxyFactory diff --git a/hardhat-scripts/deploy/migrate-proxies.ts b/hardhat-scripts/deploy/migrate-proxies.ts deleted file mode 100644 index 3c31c7d3..00000000 --- a/hardhat-scripts/deploy/migrate-proxies.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { ethers, upgrades } from "hardhat"; -import * as fs from "fs"; -import * as path from "path"; -import { EVMX_CHAIN_ID } from "../constants/constants"; - -const upgradeableContracts = [ - "SignatureVerifier", - "AddressResolver", - "WatcherPrecompile", - "FeesManager", - "DeliveryHelper", - "AuctionManager", -]; - -async function main() { - // Read addresses from JSON file - const addressesPath = path.join( - __dirname, - "../../deployments/dev_addresses.json" - ); - const addresses = JSON.parse(fs.readFileSync(addressesPath, "utf8")); - - if (!addresses[EVMX_CHAIN_ID]) { - throw new Error(`No addresses found for chain ID ${EVMX_CHAIN_ID}`); - } - - // Loop through each upgradeable contract - for (const contractName of upgradeableContracts) { - console.log(`\nProcessing ${contractName}...`); - - // Get the new implementation contract factory - const NewImplementation = await ethers.getContractFactory(contractName); - - // Get proxy address from JSON - const PROXY_ADDRESS = addresses[EVMX_CHAIN_ID][contractName]; - if (!PROXY_ADDRESS) { - console.log(`Contract address not found for ${contractName}`); - continue; - } - - try { - // Try to get current implementation address - const currentImplAddress = - await upgrades.erc1967.getImplementationAddress(PROXY_ADDRESS); - console.log( - `Current implementation address for ${contractName}: ${currentImplAddress}` - ); - - // Get the implementation address from JSON - const newImplementation = - addresses[EVMX_CHAIN_ID][`${contractName}Impl`]; - if (!newImplementation) { - console.log(`No implementation address found for ${contractName}`); - continue; - } - - if ( - currentImplAddress.toLowerCase() === newImplementation.toLowerCase() - ) { - console.log("Implementation is already up to date"); - continue; - } - - // Upgrade the proxy to point to the new implementation - console.log("Upgrading proxy..."); - const upgraded = await upgrades.upgradeProxy( - PROXY_ADDRESS, - NewImplementation - ); - await upgraded.deployed(); - - console.log("Proxy upgraded successfully"); - - // Verify the new implementation address - const updatedImplAddress = - await upgrades.erc1967.getImplementationAddress(PROXY_ADDRESS); - console.log("Updated implementation address:", updatedImplAddress); - } catch (error) { - if (error.message.includes("doesn't look like an ERC 1967 proxy")) { - console.log( - `${contractName} at ${PROXY_ADDRESS} is not a proxy contract, skipping...` - ); - continue; - } - throw error; - } - } -} - -main() - .then(() => process.exit(0)) - .catch((error) => { - console.error(error); - process.exit(1); - }); diff --git a/hardhat-scripts/deploy/migration/migrate-proxies.ts b/hardhat-scripts/deploy/migration/migrate-proxies.ts new file mode 100644 index 00000000..470760fe --- /dev/null +++ b/hardhat-scripts/deploy/migration/migrate-proxies.ts @@ -0,0 +1,154 @@ +import { ethers } from "hardhat"; +import { Contract, utils, Wallet } from "ethers"; +import * as fs from "fs"; +import * as path from "path"; +import { EVMX_CHAIN_ID } from "../../constants/constants"; +import { getProviderFromChainSlug } from "../../constants"; +import { ChainSlug } from "@socket.tech/dl-core"; + +// Implementation slot from ERC1967 +const IMPLEMENTATION_SLOT = + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"; + +const upgradeableContracts = [ + "SignatureVerifier", + "AddressResolver", + "WatcherPrecompile", + "FeesManager", + "DeliveryHelper", + "AuctionManager", +]; + +async function getImplementationAddress(proxyAddress: string): Promise { + const customProvider = new ethers.providers.JsonRpcProvider( + process.env.EVMX_RPC as string + ); + + // Fallback to standard storage slot for other proxy types + const implHex = await customProvider.getStorageAt( + proxyAddress, + IMPLEMENTATION_SLOT + ); + + return utils.getAddress("0x" + implHex.slice(-40)); +} + +async function main() { + // @ts-ignore - Hardhat Runtime Environment will be injected by hardhat + + // Read addresses from JSON file + const addressesPath = path.join( + __dirname, + "../../../deployments/dev_addresses.json" + ); + const addresses = JSON.parse(fs.readFileSync(addressesPath, "utf8")); + + if (!addresses[EVMX_CHAIN_ID]) { + throw new Error(`No addresses found for chain ID ${EVMX_CHAIN_ID}`); + } + + const providerInstance = getProviderFromChainSlug(EVMX_CHAIN_ID as ChainSlug); + const signer: Wallet = new ethers.Wallet( + process.env.WATCHER_PRIVATE_KEY as string, + providerInstance + ); + + + // Get the proxy factory + let proxyFactory = await ethers.getContractAt( + "ERC1967Factory", + addresses[EVMX_CHAIN_ID].ERC1967Factory + ); + proxyFactory = proxyFactory.connect(signer); + + // Loop through each upgradeable contract + for (const contractName of upgradeableContracts) { + console.log(`\nProcessing ${contractName}...`); + + const PROXY_ADDRESS = addresses[EVMX_CHAIN_ID][contractName]; + if (!PROXY_ADDRESS) { + console.log(`Contract address not found for ${contractName}`); + continue; + } + + try { + // Get current implementation + const currentImplAddress = await getImplementationAddress(PROXY_ADDRESS); + console.log( + `Current implementation for ${contractName}: ${currentImplAddress}` + ); + + // Get new implementation address + const newImplementation = addresses[EVMX_CHAIN_ID][`${contractName}Impl`]; + if (!newImplementation) { + console.log(`No implementation address found for ${contractName}`); + continue; + } + + // Get contract instance for state verification + let contract = await ethers.getContractAt(contractName, PROXY_ADDRESS); + contract = contract.connect(signer); + + let version; + try { + version = await contract.version(); + console.log("Version on contract before upgrade:", version); + } catch (error) { + console.log("version variable not found"); + } + + if ( + currentImplAddress.toLowerCase() === newImplementation.toLowerCase() + ) { + console.log("Implementation is already up to date"); + continue; + } + + // Upgrade proxy + console.log("Upgrading proxy..."); + + version = 2; + const initializeFn = contract.interface.getFunction("initialize"); + const initData = contract.interface.encodeFunctionData( + initializeFn, + [version] + ); + + const tx = await proxyFactory.upgradeAndCall( + PROXY_ADDRESS, + newImplementation, + initData + ); + console.log("tx", tx.hash); + await tx.wait(); + + // Verify upgrade + const updatedImplAddress = await getImplementationAddress(PROXY_ADDRESS); + console.log("New implementation:", updatedImplAddress); + + if ( + updatedImplAddress.toLowerCase() !== newImplementation.toLowerCase() + ) { + throw new Error( + "Upgrade verification failed - implementation mismatch" + ); + } + + version = await contract.version(); + console.log("Version on contract after upgrade:", version); + console.log("Upgrade successful and verified"); + } catch (error) { + console.error(`Error upgrading ${contractName}:`, error); + process.exit(1); + } + } +} + +// We recommend this pattern to be able to use async/await everywhere +// and properly handle errors. +main() + .then(() => process.exit(0)) + .catch((error) => { + console.error(error); + process.exit(1); + }); From 7994d06aadbbf7658b4f966c6b6086363cad8e90 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Sat, 15 Feb 2025 16:46:30 +0400 Subject: [PATCH 005/186] feat: remove reinit for beacon --- contracts/AsyncPromise.sol | 7 ++----- contracts/Forwarder.sol | 6 ++---- hardhat-scripts/deploy/migration/migrate-proxies.ts | 5 ++--- 3 files changed, 6 insertions(+), 12 deletions(-) diff --git a/contracts/AsyncPromise.sol b/contracts/AsyncPromise.sol index cf506d23..3c84131a 100644 --- a/contracts/AsyncPromise.sol +++ b/contracts/AsyncPromise.sol @@ -37,7 +37,6 @@ contract AsyncPromise is IPromise, Initializable, AddressResolverUtil { /// @notice The callback data to be used when the promise is resolved. bytes public callbackData; - uint64 public version; /// @notice Error thrown when attempting to resolve an already resolved promise. error PromiseAlreadyResolved(); @@ -59,10 +58,8 @@ contract AsyncPromise is IPromise, Initializable, AddressResolverUtil { function initialize( address invoker_, address forwarder_, - address addressResolver_, - uint64 version_ - ) public reinitializer(version_) { - version = version_; + address addressResolver_ + ) public initializer { _setAddressResolver(addressResolver_); localInvoker = invoker_; forwarder = forwarder_; diff --git a/contracts/Forwarder.sol b/contracts/Forwarder.sol index 2cb21ee0..43e4656e 100644 --- a/contracts/Forwarder.sol +++ b/contracts/Forwarder.sol @@ -36,10 +36,8 @@ contract Forwarder is IForwarder, Initializable { function initialize( uint32 chainSlug_, address onChainAddress_, - address addressResolver_, - uint64 version_ - ) public reinitializer(version_) { - version = version_; + address addressResolver_ + ) public initializer { chainSlug = chainSlug_; onChainAddress = onChainAddress_; addressResolver = addressResolver_; diff --git a/hardhat-scripts/deploy/migration/migrate-proxies.ts b/hardhat-scripts/deploy/migration/migrate-proxies.ts index 470760fe..344dce46 100644 --- a/hardhat-scripts/deploy/migration/migrate-proxies.ts +++ b/hardhat-scripts/deploy/migration/migrate-proxies.ts @@ -2,7 +2,7 @@ import { ethers } from "hardhat"; import { Contract, utils, Wallet } from "ethers"; import * as fs from "fs"; import * as path from "path"; -import { EVMX_CHAIN_ID } from "../../constants/constants"; +import { EVMX_CHAIN_ID, VERSION } from "../../constants/constants"; import { getProviderFromChainSlug } from "../../constants"; import { ChainSlug } from "@socket.tech/dl-core"; @@ -107,11 +107,10 @@ async function main() { // Upgrade proxy console.log("Upgrading proxy..."); - version = 2; const initializeFn = contract.interface.getFunction("initialize"); const initData = contract.interface.encodeFunctionData( initializeFn, - [version] + [VERSION] ); const tx = await proxyFactory.upgradeAndCall( From 4c3121d210f7bc595df3cc9c0b465fb28c5c9262 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Sat, 15 Feb 2025 17:09:28 +0400 Subject: [PATCH 006/186] feat: verify beacon upgrade --- .../deploy/migration/migrate-proxies.ts | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/hardhat-scripts/deploy/migration/migrate-proxies.ts b/hardhat-scripts/deploy/migration/migrate-proxies.ts index 344dce46..9370036b 100644 --- a/hardhat-scripts/deploy/migration/migrate-proxies.ts +++ b/hardhat-scripts/deploy/migration/migrate-proxies.ts @@ -97,6 +97,8 @@ async function main() { console.log("version variable not found"); } + if (contractName === "AddressResolver") await verifyBeaconImplementation(contract, signer); + if ( currentImplAddress.toLowerCase() === newImplementation.toLowerCase() ) { @@ -135,6 +137,11 @@ async function main() { version = await contract.version(); console.log("Version on contract after upgrade:", version); + + if (contractName === "AddressResolver") { + await verifyBeaconImplementation(contract, signer); + } + console.log("Upgrade successful and verified"); } catch (error) { console.error(`Error upgrading ${contractName}:`, error); @@ -143,6 +150,33 @@ async function main() { } } +async function verifyBeaconImplementation(contract: Contract, signer: Wallet) { + console.log("Verifying beacon implementations..."); + const forwarderBeaconAddress = await contract.forwarderBeacon(); + const forwarderImplementationAddress = await contract.forwarderImplementation(); + const asyncPromiseBeaconAddress = await contract.asyncPromiseBeacon(); + const asyncPromiseImplementationAddress = await contract.asyncPromiseImplementation(); + + const upgradeableBeaconAbi = [ + "function implementation() view returns (address)", + ]; + + const forwarderBeacon = new ethers.Contract(forwarderBeaconAddress, upgradeableBeaconAbi); + const asyncPromiseBeacon = new ethers.Contract(asyncPromiseBeaconAddress, upgradeableBeaconAbi); + + // Verify forwarder beacon implementation + const forwarderBeaconImplementation = await forwarderBeacon.connect(signer).implementation(); + if (forwarderBeaconImplementation.toLowerCase() !== forwarderImplementationAddress.toLowerCase()) { + throw new Error("Forwarder beacon implementation mismatch"); + } + + // Verify async promise beacon implementation + const asyncPromiseBeaconImplementation = await asyncPromiseBeacon.connect(signer).implementation(); + if (asyncPromiseBeaconImplementation.toLowerCase() !== asyncPromiseImplementationAddress.toLowerCase()) { + throw new Error("Async promise beacon implementation mismatch"); + } + +} // We recommend this pattern to be able to use async/await everywhere // and properly handle errors. main() From b7e523c41163b90daa5d2ddc79b1b063cce3601d Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Sat, 15 Feb 2025 17:16:33 +0400 Subject: [PATCH 007/186] rm: oz --- package.json | 1 - remappings.txt | 1 - 2 files changed, 2 deletions(-) diff --git a/package.json b/package.json index 04c54997..8aefdcc1 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,6 @@ "devDependencies": { "@nomiclabs/hardhat-ethers": "2.2.3", "@nomicfoundation/hardhat-verify": "^2.0.12", - "@openzeppelin/hardhat-upgrades": "1.22.1", "@socket.tech/dl-core": "^2.35.0", "@typechain/ethers-v5": "^10.0.0", "@typechain/hardhat": "6.0.0", diff --git a/remappings.txt b/remappings.txt index ab585aad..1cf3bb7d 100644 --- a/remappings.txt +++ b/remappings.txt @@ -1,5 +1,4 @@ ds-test/=lib/forge-std/lib/ds-test/src/ forge-std/=lib/forge-std/src/ solmate/=lib/solmate/src/ -openzeppelin-contracts/=lib/openzeppelin-contracts/ solady/=lib/solady/src/ \ No newline at end of file From c8f4f0005664c6acf6420b7c04ff0da9db8c85bc Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Sat, 15 Feb 2025 17:17:35 +0400 Subject: [PATCH 008/186] chore: node settings --- hardhat-scripts/constants/overrides.ts | 6 +- hardhat.config.ts | 1 + yarn.lock | 102 ++----------------------- 3 files changed, 9 insertions(+), 100 deletions(-) diff --git a/hardhat-scripts/constants/overrides.ts b/hardhat-scripts/constants/overrides.ts index 63159ee8..f79babc2 100644 --- a/hardhat-scripts/constants/overrides.ts +++ b/hardhat-scripts/constants/overrides.ts @@ -27,9 +27,9 @@ export const chainOverrides: { // gasPrice: 212_000_000_000, }, [EVMX_CHAIN_ID as ChainSlug]: { - // type: 1, - gasLimit: 1_000_000_000, - // gasPrice: 212_000_000_000, + type: 0, + // gasLimit: 1_000_000_000, + gasPrice: 0, }, }; diff --git a/hardhat.config.ts b/hardhat.config.ts index 02f369b9..6b43f156 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -162,6 +162,7 @@ const config: HardhatUserConfig = { solidity: { version: "0.8.22", settings: { + evmVersion: "paris", optimizer: { enabled: true, runs: 999999, diff --git a/yarn.lock b/yarn.lock index 1bc37561..0a85c6fe 100644 --- a/yarn.lock +++ b/yarn.lock @@ -602,11 +602,6 @@ "@smithy/types" "^3.5.0" tslib "^2.6.2" -"@bytecodealliance/preview2-shim@0.17.0": - version "0.17.0" - resolved "https://registry.yarnpkg.com/@bytecodealliance/preview2-shim/-/preview2-shim-0.17.0.tgz#9bc1cadbb9f86c446c6f579d3431c08a06a6672e" - integrity sha512-JorcEwe4ud0x5BS/Ar2aQWOQoFzjq/7jcnxYXCvSMh0oRm0dQXzOA+hqLDBnOMks1LLBA7dmiLLsEBl09Yd6iQ== - "@cspotcode/source-map-support@^0.8.0": version "0.8.1" resolved "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz" @@ -1487,13 +1482,6 @@ table "^6.8.0" undici "^5.14.0" -"@nomicfoundation/slang@^0.18.3": - version "0.18.3" - resolved "https://registry.yarnpkg.com/@nomicfoundation/slang/-/slang-0.18.3.tgz#976b6c3820081cebf050afbea434038aac9313cc" - integrity sha512-YqAWgckqbHM0/CZxi9Nlf4hjk9wUNLC9ngWCWBiqMxPIZmzsVKYuChdlrfeBPQyvQQBoOhbx+7C1005kLVQDZQ== - dependencies: - "@bytecodealliance/preview2-shim" "0.17.0" - "@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.2": version "0.1.2" resolved "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.2.tgz" @@ -1547,32 +1535,6 @@ resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.2.3.tgz#b41053e360c31a32c2640c9a45ee981a7e603fe0" integrity sha512-YhzPdzb612X591FOe68q+qXVXGG2ANZRvDo0RRUtimev85rCrAlv/TLMEZw5c+kq9AbzocLTVX/h2jVIFPL9Xg== -"@openzeppelin/hardhat-upgrades@1.22.1": - version "1.22.1" - resolved "https://registry.yarnpkg.com/@openzeppelin/hardhat-upgrades/-/hardhat-upgrades-1.22.1.tgz#93e2b3f870c57b00a1ae8a330a2cdd9c2d634eb8" - integrity sha512-MdoitCTLl4zwMU8MeE/bCj+7JMWBEvd38XqJkw36PkJrXlbv6FedDVCPoumMAhpmtymm0nTwTYYklYG+L6WiiQ== - dependencies: - "@openzeppelin/upgrades-core" "^1.20.0" - chalk "^4.1.0" - debug "^4.1.1" - proper-lockfile "^4.1.1" - -"@openzeppelin/upgrades-core@^1.20.0": - version "1.42.1" - resolved "https://registry.yarnpkg.com/@openzeppelin/upgrades-core/-/upgrades-core-1.42.1.tgz#a2784e8d9c09f4a79b7e5cbb11933062ad709835" - integrity sha512-8qnz2XfQrco8R8u9NjV+KiSLrVn7DnWFd+3BuhTUjhVy0bzCSu2SMKCVpZLtXbxf4f2dpz8jYPQYRa6s23PhLA== - dependencies: - "@nomicfoundation/slang" "^0.18.3" - cbor "^10.0.0" - chalk "^4.1.0" - compare-versions "^6.0.0" - debug "^4.1.1" - ethereumjs-util "^7.0.3" - minimatch "^9.0.5" - minimist "^1.2.7" - proper-lockfile "^4.1.1" - solidity-ast "^0.4.51" - "@scure/base@~1.1.0": version "1.1.9" resolved "https://registry.npmjs.org/@scure/base/-/base-1.1.9.tgz" @@ -2485,7 +2447,7 @@ bn.js@^4.11.0, bn.js@^4.11.8, bn.js@^4.11.9: resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz" integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== -bn.js@^5.1.2, bn.js@^5.2.0, bn.js@^5.2.1: +bn.js@^5.2.0, bn.js@^5.2.1: version "5.2.1" resolved "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz" integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== @@ -2609,13 +2571,6 @@ catering@^2.1.0, catering@^2.1.1: resolved "https://registry.npmjs.org/catering/-/catering-2.1.1.tgz" integrity sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w== -cbor@^10.0.0: - version "10.0.3" - resolved "https://registry.yarnpkg.com/cbor/-/cbor-10.0.3.tgz#202d79cd696f408700af51b0c9771577048a860e" - integrity sha512-72Jnj81xMsqepqdcSdf2+fflz/UDsThOHy5hj2MW5F5xzHL8Oa0KQ6I6V9CwVUPxg5pf+W9xp6W2KilaRXWWtw== - dependencies: - nofilter "^3.0.2" - cbor@^8.1.0: version "8.1.0" resolved "https://registry.npmjs.org/cbor/-/cbor-8.1.0.tgz" @@ -2763,11 +2718,6 @@ commander@3.0.2: resolved "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz" integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow== -compare-versions@^6.0.0: - version "6.1.1" - resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-6.1.1.tgz#7af3cc1099ba37d244b3145a9af5201b629148a9" - integrity sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg== - concat-map@0.0.1: version "0.0.1" resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" @@ -3023,17 +2973,6 @@ ethereumjs-util@^6.0.0, ethereumjs-util@^6.2.1: ethjs-util "0.1.6" rlp "^2.2.3" -ethereumjs-util@^7.0.3: - version "7.1.5" - resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz#9ecf04861e4fbbeed7465ece5f23317ad1129181" - integrity sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg== - dependencies: - "@types/bn.js" "^5.1.0" - bn.js "^5.1.2" - create-hash "^1.1.2" - ethereum-cryptography "^0.1.3" - rlp "^2.2.4" - ethers@5.6.6: version "5.6.6" resolved "https://registry.npmjs.org/ethers/-/ethers-5.6.6.tgz" @@ -3338,7 +3277,7 @@ gopd@^1.0.1: dependencies: get-intrinsic "^1.1.3" -graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.4: +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0: version "4.2.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== @@ -3895,14 +3834,7 @@ minimatch@^5.0.1, minimatch@^5.1.6: dependencies: brace-expansion "^2.0.1" -minimatch@^9.0.5: - version "9.0.5" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" - integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== - dependencies: - brace-expansion "^2.0.1" - -minimist@^1.2.0, minimist@^1.2.6, minimist@^1.2.7: +minimist@^1.2.0, minimist@^1.2.6: version "1.2.8" resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== @@ -3986,7 +3918,7 @@ node-gyp-build@^4.2.0, node-gyp-build@^4.3.0: resolved "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.2.tgz" integrity sha512-IRUxE4BVsHWXkV/SFOut4qTlagw2aM8T5/vnTsmrHJvVoKueJHRc/JaFND7QDDc61kLYUJ6qlZM3sqTSyx2dTw== -nofilter@^3.0.2, nofilter@^3.1.0: +nofilter@^3.1.0: version "3.1.0" resolved "https://registry.npmjs.org/nofilter/-/nofilter-3.1.0.tgz" integrity sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g== @@ -4158,15 +4090,6 @@ prompts@^2.4.2: kleur "^3.0.3" sisteransi "^1.0.5" -proper-lockfile@^4.1.1: - version "4.1.2" - resolved "https://registry.yarnpkg.com/proper-lockfile/-/proper-lockfile-4.1.2.tgz#c8b9de2af6b2f1601067f98e01ac66baa223141f" - integrity sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA== - dependencies: - graceful-fs "^4.2.4" - retry "^0.12.0" - signal-exit "^3.0.2" - proxy-from-env@^1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz" @@ -4262,11 +4185,6 @@ resolve@1.17.0: dependencies: path-parse "^1.0.6" -retry@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" - integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== - rimraf@^2.2.8, rimraf@^2.6.2: version "2.7.1" resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz" @@ -4282,7 +4200,7 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: hash-base "^3.0.0" inherits "^2.0.1" -rlp@^2.2.3, rlp@^2.2.4: +rlp@^2.2.3: version "2.2.7" resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.7.tgz#33f31c4afac81124ac4b283e2bd4d9720b30beaf" integrity sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ== @@ -4409,11 +4327,6 @@ side-channel@^1.0.6: get-intrinsic "^1.2.4" object-inspect "^1.13.1" -signal-exit@^3.0.2: - version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== - sisteransi@^1.0.5: version "1.0.5" resolved "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz" @@ -4443,11 +4356,6 @@ solc@0.7.3: semver "^5.5.0" tmp "0.0.33" -solidity-ast@^0.4.51: - version "0.4.59" - resolved "https://registry.yarnpkg.com/solidity-ast/-/solidity-ast-0.4.59.tgz#290a2815aef70a61092591ab3e991da080ae5931" - integrity sha512-I+CX0wrYUN9jDfYtcgWSe+OAowaXy8/1YQy7NS4ni5IBDmIYBq7ZzaP/7QqouLjzZapmQtvGLqCaYgoUWqBo5g== - source-map-support@^0.5.13: version "0.5.21" resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" From e9fcf3aaf1e0a6665d7863e35699a854d878ab0c Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Sat, 15 Feb 2025 17:34:35 +0400 Subject: [PATCH 009/186] feat: deployments --- deployments/dev_addresses.json | 60 +++++++-------- deployments/dev_verification.json | 113 +++++++++++++++++++---------- hardhat-scripts/deploy/1.deploy.ts | 26 ++++++- hardhat.config.ts | 4 +- 4 files changed, 133 insertions(+), 70 deletions(-) diff --git a/deployments/dev_addresses.json b/deployments/dev_addresses.json index ffe2d9bc..9498b9b1 100644 --- a/deployments/dev_addresses.json +++ b/deployments/dev_addresses.json @@ -1,38 +1,38 @@ { "421614": { - "ContractFactoryPlug": "0x87cC19AedD434ebD3B74FfdC073CAeC7dC1E92EA", - "FastSwitchboard": "0x5aA84ffE5eCCB5263d1AE6aEd5682EAb39Bc7036", - "FeesPlug": "0x63d3F60Db6a7Eb2fa730F850dA247C73aD162656", - "Hasher": "0x6A8e801B3299FeB96D0607A01a62Db8A9239Bdc0", - "SignatureVerifier": "0x5e5CF700c97BC8B3F6215D98E65f85D4A44d7D06", - "Socket": "0xa09217Cfc47F399C382E982778f6128685e13aD4", - "SocketBatcher": "0x80568677f2B092bd974657FE47Fc8531bfE5DBDC", - "startBlock": 123791225 + "ContractFactoryPlug": "0x1dc20d27F06876cA74ee4e2E9a4724f06a4a5E54", + "FastSwitchboard": "0xaFFfaD81e6DDE509Bd83Ab2024225b2FF537BeA7", + "FeesPlug": "0xb2B779ab8FC851bCE986d25B2824933B0Cd101d9", + "Hasher": "0x49f24A72e738Fe86263Aa26696370972e049498B", + "SignatureVerifier": "0xb6d39d1dB2cB14043182a008EfFC079A9C578208", + "Socket": "0x9B06e2Dae351ed8B1112C036e5c306E8fBe4C9c5", + "SocketBatcher": "0xd627BFe7d2fCAC1147c996a6F2CAaB2E1e1bD344", + "startBlock": 124035386 }, "7625382": { - "AddressResolver": "0xF2bb0cA7Eab6a2c4ed64793959Ac4401159D5D13", - "AddressResolverImpl": "0xBCF275473fdECEf5AFe22D1c771Cb79317be58dB", - "AuctionManager": "0xE5A00A99C5C8E40d1C6Ec817bc808d71b1d4369b", - "AuctionManagerImpl": "0x6B94BfF71631f21166946e80967774F3f45e9A0b", - "DeliveryHelper": "0xc0560207cBDBc5301E8343C51f8A7da339596969", - "DeliveryHelperImpl": "0xAEE7D460fD1d8c4be069443a65187BC50A0BA89A", - "ERC1967Factory": "0xaAF245274e877795B01671602a753AafAc459297", - "FeesManager": "0x4D29076a0590909F3Bda7f85466cd8Ee291A1247", - "FeesManagerImpl": "0x3Ee25f844976888B29A921443b34374d9eCC466d", - "SignatureVerifier": "0x2eF8A7768c42342927B9e41E468CC2984835DC58", - "SignatureVerifierImpl": "0xCd44A8068117d888fb44Eb4fDe49bc9B7085189E", - "startBlock": 5424, - "WatcherPrecompile": "0x376AdA81749a64e9C2439025f475D1a7E004fcC1", - "WatcherPrecompileImpl": "0x345c85aCc495E6FeDCf52987BDc0636A12F8AEd7" + "AddressResolver": "0x1287D33646d763Ff8237Aa7BE7d92Fc918c66589", + "AddressResolverImpl": "0x8662FC08dEC7c61Dd3432fAF45a5bC024BB60B00", + "AuctionManager": "0xE3806Bc41FEAFCAA2480E702fF02dA14F767bF0F", + "AuctionManagerImpl": "0x4C68058509d754Cc0dE474eBC20aE94e4787E704", + "DeliveryHelper": "0x4D8Fb6e8a5294ed0644f462b5723ee228ecf9958", + "DeliveryHelperImpl": "0x3c9f5172feb0dDfC06176cE67B566EFbb01CCe98", + "ERC1967Factory": "0xbBfb525ADc6eC38Ef0D4b807d327c2Dd1C286de1", + "FeesManager": "0x886682a69D6c0240EB850cc2e42c5B4B74449e82", + "FeesManagerImpl": "0xF4D3BDe438416938217d4624c82AEbEb46CeD371", + "SignatureVerifier": "0x366Dea9AC69fb9D45b6756587D2fE9B4c14197F6", + "SignatureVerifierImpl": "0x3cf47Ad0F040dFF1208E649C8f8e23e6B5A08916", + "startBlock": 18, + "WatcherPrecompile": "0xaCf94Cd4A7e70304F5CA6294CDAe3CBe78Ea6A86", + "WatcherPrecompileImpl": "0x8F18fC10a8b40b548C6F04Fb252481c783A9ace0" }, "11155420": { - "ContractFactoryPlug": "0x0E0F673C9b34d08b99407F1947A10Fe73aa17928", - "FastSwitchboard": "0x688cf2744cd66F00E34f8BbAd15C8fb2438D62be", - "FeesPlug": "0xc13eb89675c12efF5faf5bE9B4773F9ed9192107", - "Hasher": "0xd36C1Dcb65CB09b7fCFABf153D7cdd42312C782E", - "SignatureVerifier": "0x36AC527afA283c95EA7dD11c8E93225d9F139028", - "Socket": "0xB0e1D8536ed769860f344Cf795f2B4fAaa41F0C8", - "SocketBatcher": "0x5fef21aD7Dc13CB1b7Cb9EAD404e3EA38d153348", - "startBlock": 23870487 + "ContractFactoryPlug": "0x0EE19F0D0e34Cdd2eb4F61E24DC837b0b7c34e69", + "FastSwitchboard": "0x70bfB36F8b8de7763F1D52d954225ae88F6Ed595", + "FeesPlug": "0x7F5D263572469Fdf1875Cd858D557B45e9FC7f23", + "Hasher": "0xe37D675646A6FEEC3E41A0FF9535E0E716f5cD89", + "SignatureVerifier": "0x0452225B52Ef6134499232CbBEDF05fD8cc38530", + "Socket": "0x0BAAD473580c9F7Ca8b2758759aF3ce5E3154bC6", + "SocketBatcher": "0xCf731f35EFd775F692fe24e650e75Fd64bBaD810", + "startBlock": 23911773 } } diff --git a/deployments/dev_verification.json b/deployments/dev_verification.json index fcc31340..9bcd055f 100644 --- a/deployments/dev_verification.json +++ b/deployments/dev_verification.json @@ -1,66 +1,103 @@ { "421614": [ [ - "0x63d3F60Db6a7Eb2fa730F850dA247C73aD162656", + "0x1dc20d27F06876cA74ee4e2E9a4724f06a4a5E54", + "ContractFactoryPlug", + "contracts/apps/payload-delivery/ContractFactoryPlug.sol", + [ + "0x9B06e2Dae351ed8B1112C036e5c306E8fBe4C9c5", + "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18" + ] + ], + [ + "0xb2B779ab8FC851bCE986d25B2824933B0Cd101d9", "FeesPlug", "contracts/apps/payload-delivery/FeesPlug.sol", [ - "0xa09217Cfc47F399C382E982778f6128685e13aD4", + "0x9B06e2Dae351ed8B1112C036e5c306E8fBe4C9c5", + "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18" + ] + ], + [ + "0xaFFfaD81e6DDE509Bd83Ab2024225b2FF537BeA7", + "FastSwitchboard", + "contracts/socket/switchboard/FastSwitchboard.sol", + [ + 421614, + "0x9B06e2Dae351ed8B1112C036e5c306E8fBe4C9c5", + "0xb6d39d1dB2cB14043182a008EfFC079A9C578208", + "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18" + ] + ], + [ + "0xd627BFe7d2fCAC1147c996a6F2CAaB2E1e1bD344", + "SocketBatcher", + "contracts/socket/SocketBatcher.sol", + [ + "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18", + "0x9B06e2Dae351ed8B1112C036e5c306E8fBe4C9c5" + ] + ], + [ + "0x9B06e2Dae351ed8B1112C036e5c306E8fBe4C9c5", + "Socket", + "contracts/socket/Socket.sol", + [ + 421614, + "0x49f24A72e738Fe86263Aa26696370972e049498B", + "0xb6d39d1dB2cB14043182a008EfFC079A9C578208", + "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18", + "EVMX" + ] + ], + [ + "0x49f24A72e738Fe86263Aa26696370972e049498B", + "Hasher", + "contracts/socket/utils/Hasher.sol", + [ "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18" ] ] ], "7625382": [ [ - "0x6B94BfF71631f21166946e80967774F3f45e9A0b", + "0x4C68058509d754Cc0dE474eBC20aE94e4787E704", "AuctionManager", "contracts/apps/payload-delivery/app-gateway/AuctionManager.sol", [] ], [ - "0xAEE7D460fD1d8c4be069443a65187BC50A0BA89A", + "0x3c9f5172feb0dDfC06176cE67B566EFbb01CCe98", "DeliveryHelper", "contracts/apps/payload-delivery/app-gateway/DeliveryHelper.sol", [] ], [ - "0x3Ee25f844976888B29A921443b34374d9eCC466d", + "0xF4D3BDe438416938217d4624c82AEbEb46CeD371", "FeesManager", "contracts/apps/payload-delivery/app-gateway/FeesManager.sol", [] ], [ - "0x345c85aCc495E6FeDCf52987BDc0636A12F8AEd7", + "0x8F18fC10a8b40b548C6F04Fb252481c783A9ace0", "WatcherPrecompile", "contracts/watcherPrecompile/WatcherPrecompile.sol", [] ], [ - "0xaAF245274e877795B01671602a753AafAc459297", - "ERC1967Factory", - "lib/solady/src/utils/ERC1967Factory.sol", - [] - ], - [ - "0x8AAE7259Fd08cb555076A384bc228c8B20BcC4a7", - "ERC1967Factory", - "lib/solady/src/utils/ERC1967Factory.sol", - [] - ], - [ - "0xBCF275473fdECEf5AFe22D1c771Cb79317be58dB", + "0x8662FC08dEC7c61Dd3432fAF45a5bC024BB60B00", "AddressResolver", "contracts/AddressResolver.sol", [] ], [ - "0xCd44A8068117d888fb44Eb4fDe49bc9B7085189E", + "0x3cf47Ad0F040dFF1208E649C8f8e23e6B5A08916", "SignatureVerifier", "contracts/socket/utils/SignatureVerifier.sol", [] ], [ - "0xa93B1119677f02445DAb5034841FC6C937340900", + "0xbBfb525ADc6eC38Ef0D4b807d327c2Dd1C286de1", "ERC1967Factory", "lib/solady/src/utils/ERC1967Factory.sol", [] @@ -68,63 +105,65 @@ ], "11155420": [ [ - "0x0E0F673C9b34d08b99407F1947A10Fe73aa17928", + "0x0EE19F0D0e34Cdd2eb4F61E24DC837b0b7c34e69", "ContractFactoryPlug", "contracts/apps/payload-delivery/ContractFactoryPlug.sol", [ - "0xB0e1D8536ed769860f344Cf795f2B4fAaa41F0C8", + "0x0BAAD473580c9F7Ca8b2758759aF3ce5E3154bC6", "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18" ] ], [ - "0xc13eb89675c12efF5faf5bE9B4773F9ed9192107", + "0x7F5D263572469Fdf1875Cd858D557B45e9FC7f23", "FeesPlug", "contracts/apps/payload-delivery/FeesPlug.sol", [ - "0xB0e1D8536ed769860f344Cf795f2B4fAaa41F0C8", + "0x0BAAD473580c9F7Ca8b2758759aF3ce5E3154bC6", "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18" ] ], [ - "0x688cf2744cd66F00E34f8BbAd15C8fb2438D62be", + "0x70bfB36F8b8de7763F1D52d954225ae88F6Ed595", "FastSwitchboard", "contracts/socket/switchboard/FastSwitchboard.sol", [ 11155420, - "0xB0e1D8536ed769860f344Cf795f2B4fAaa41F0C8", - "0x36AC527afA283c95EA7dD11c8E93225d9F139028", + "0x0BAAD473580c9F7Ca8b2758759aF3ce5E3154bC6", + "0x0452225B52Ef6134499232CbBEDF05fD8cc38530", "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18" ] ], [ - "0x5fef21aD7Dc13CB1b7Cb9EAD404e3EA38d153348", + "0xCf731f35EFd775F692fe24e650e75Fd64bBaD810", "SocketBatcher", "contracts/socket/SocketBatcher.sol", [ "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18", - "0xB0e1D8536ed769860f344Cf795f2B4fAaa41F0C8" + "0x0BAAD473580c9F7Ca8b2758759aF3ce5E3154bC6" ] ], [ - "0xB0e1D8536ed769860f344Cf795f2B4fAaa41F0C8", + "0x0BAAD473580c9F7Ca8b2758759aF3ce5E3154bC6", "Socket", "contracts/socket/Socket.sol", [ 11155420, - "0xd36C1Dcb65CB09b7fCFABf153D7cdd42312C782E", - "0x36AC527afA283c95EA7dD11c8E93225d9F139028", + "0xe37D675646A6FEEC3E41A0FF9535E0E716f5cD89", + "0x0452225B52Ef6134499232CbBEDF05fD8cc38530", "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18", - "OFF_CHAIN_VM" + "EVMX" ] ], [ - "0xd36C1Dcb65CB09b7fCFABf153D7cdd42312C782E", + "0xe37D675646A6FEEC3E41A0FF9535E0E716f5cD89", "Hasher", "contracts/socket/utils/Hasher.sol", - ["0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18"] + [ + "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18" + ] ], [ - "0x36AC527afA283c95EA7dD11c8E93225d9F139028", + "0x0452225B52Ef6134499232CbBEDF05fD8cc38530", "SignatureVerifier", "contracts/socket/utils/SignatureVerifier.sol", [] diff --git a/hardhat-scripts/deploy/1.deploy.ts b/hardhat-scripts/deploy/1.deploy.ts index a78375d0..dcff8d4e 100644 --- a/hardhat-scripts/deploy/1.deploy.ts +++ b/hardhat-scripts/deploy/1.deploy.ts @@ -66,11 +66,12 @@ const main = async () => { ); deployUtils.addresses[contractName] = signatureVerifier.address; - await updateContractSettings( + await initializeSigVerifier( signatureVerifier, "owner", "initialize", socketOwner, + [socketOwner, VERSION], deployUtils.signer ); @@ -329,6 +330,29 @@ const deployWatcherVMContracts = async () => { } }; +async function initializeSigVerifier( + contract: Contract, + getterMethod: string, + setterMethod: string, + requiredAddress: string, + initParams: any[], + signer: Signer +) { + const currentValue = await contract.connect(signer)[getterMethod](); + + if (currentValue.toLowerCase() !== requiredAddress.toLowerCase()) { + console.log({ + setterMethod, + current: currentValue, + required: requiredAddress, + }); + const tx = await contract.connect(signer)[setterMethod](...initParams); + console.log(`Setting ${getterMethod} for ${contract.address} to`, tx.hash); + await tx.wait(); + } +} + + async function updateContractSettings( contract: Contract, getterMethod: string, diff --git a/hardhat.config.ts b/hardhat.config.ts index 6b43f156..7bd01929 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -133,8 +133,8 @@ const config: HardhatUserConfig = { network: "offChainVM", chainId: EVMX_CHAIN_ID, urls: { - apiURL: "https://explorer-socket-composer-testnet.t.conduit.xyz/api", - browserURL: "https://explorer-socket-composer-testnet.t.conduit.xyz", + apiURL: "", + browserURL: "", }, }, ], From 6b9541feb9c24039a2a141c87b88ec25d4c1b01b Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Sat, 15 Feb 2025 17:38:46 +0400 Subject: [PATCH 010/186] chore: contracts verified --- deployments/dev_verification.json | 128 +----------------------------- 1 file changed, 2 insertions(+), 126 deletions(-) diff --git a/deployments/dev_verification.json b/deployments/dev_verification.json index 9bcd055f..fba8d887 100644 --- a/deployments/dev_verification.json +++ b/deployments/dev_verification.json @@ -1,64 +1,5 @@ { - "421614": [ - [ - "0x1dc20d27F06876cA74ee4e2E9a4724f06a4a5E54", - "ContractFactoryPlug", - "contracts/apps/payload-delivery/ContractFactoryPlug.sol", - [ - "0x9B06e2Dae351ed8B1112C036e5c306E8fBe4C9c5", - "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18" - ] - ], - [ - "0xb2B779ab8FC851bCE986d25B2824933B0Cd101d9", - "FeesPlug", - "contracts/apps/payload-delivery/FeesPlug.sol", - [ - "0x9B06e2Dae351ed8B1112C036e5c306E8fBe4C9c5", - "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18" - ] - ], - [ - "0xaFFfaD81e6DDE509Bd83Ab2024225b2FF537BeA7", - "FastSwitchboard", - "contracts/socket/switchboard/FastSwitchboard.sol", - [ - 421614, - "0x9B06e2Dae351ed8B1112C036e5c306E8fBe4C9c5", - "0xb6d39d1dB2cB14043182a008EfFC079A9C578208", - "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18" - ] - ], - [ - "0xd627BFe7d2fCAC1147c996a6F2CAaB2E1e1bD344", - "SocketBatcher", - "contracts/socket/SocketBatcher.sol", - [ - "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18", - "0x9B06e2Dae351ed8B1112C036e5c306E8fBe4C9c5" - ] - ], - [ - "0x9B06e2Dae351ed8B1112C036e5c306E8fBe4C9c5", - "Socket", - "contracts/socket/Socket.sol", - [ - 421614, - "0x49f24A72e738Fe86263Aa26696370972e049498B", - "0xb6d39d1dB2cB14043182a008EfFC079A9C578208", - "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18", - "EVMX" - ] - ], - [ - "0x49f24A72e738Fe86263Aa26696370972e049498B", - "Hasher", - "contracts/socket/utils/Hasher.sol", - [ - "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18" - ] - ] - ], + "421614": [], "7625382": [ [ "0x4C68058509d754Cc0dE474eBC20aE94e4787E704", @@ -103,70 +44,5 @@ [] ] ], - "11155420": [ - [ - "0x0EE19F0D0e34Cdd2eb4F61E24DC837b0b7c34e69", - "ContractFactoryPlug", - "contracts/apps/payload-delivery/ContractFactoryPlug.sol", - [ - "0x0BAAD473580c9F7Ca8b2758759aF3ce5E3154bC6", - "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18" - ] - ], - [ - "0x7F5D263572469Fdf1875Cd858D557B45e9FC7f23", - "FeesPlug", - "contracts/apps/payload-delivery/FeesPlug.sol", - [ - "0x0BAAD473580c9F7Ca8b2758759aF3ce5E3154bC6", - "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18" - ] - ], - [ - "0x70bfB36F8b8de7763F1D52d954225ae88F6Ed595", - "FastSwitchboard", - "contracts/socket/switchboard/FastSwitchboard.sol", - [ - 11155420, - "0x0BAAD473580c9F7Ca8b2758759aF3ce5E3154bC6", - "0x0452225B52Ef6134499232CbBEDF05fD8cc38530", - "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18" - ] - ], - [ - "0xCf731f35EFd775F692fe24e650e75Fd64bBaD810", - "SocketBatcher", - "contracts/socket/SocketBatcher.sol", - [ - "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18", - "0x0BAAD473580c9F7Ca8b2758759aF3ce5E3154bC6" - ] - ], - [ - "0x0BAAD473580c9F7Ca8b2758759aF3ce5E3154bC6", - "Socket", - "contracts/socket/Socket.sol", - [ - 11155420, - "0xe37D675646A6FEEC3E41A0FF9535E0E716f5cD89", - "0x0452225B52Ef6134499232CbBEDF05fD8cc38530", - "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18", - "EVMX" - ] - ], - [ - "0xe37D675646A6FEEC3E41A0FF9535E0E716f5cD89", - "Hasher", - "contracts/socket/utils/Hasher.sol", - [ - "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18" - ] - ], - [ - "0x0452225B52Ef6134499232CbBEDF05fD8cc38530", - "SignatureVerifier", - "contracts/socket/utils/SignatureVerifier.sol", - [] - ] - ] + "11155420": [] } From 0a82ee2a096ef296f8638078a246294280fb9790 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Mon, 17 Feb 2025 16:13:41 +0400 Subject: [PATCH 011/186] + @socket.tech/socket-protocol@1.0.9 --- hardhat-scripts/deploy/1.deploy.ts | 1 - .../deploy/migration/migrate-proxies.ts | 46 +++++++++++++------ package.json | 2 +- 3 files changed, 32 insertions(+), 17 deletions(-) diff --git a/hardhat-scripts/deploy/1.deploy.ts b/hardhat-scripts/deploy/1.deploy.ts index dcff8d4e..e2ed176f 100644 --- a/hardhat-scripts/deploy/1.deploy.ts +++ b/hardhat-scripts/deploy/1.deploy.ts @@ -352,7 +352,6 @@ async function initializeSigVerifier( } } - async function updateContractSettings( contract: Contract, getterMethod: string, diff --git a/hardhat-scripts/deploy/migration/migrate-proxies.ts b/hardhat-scripts/deploy/migration/migrate-proxies.ts index 9370036b..7a44eca4 100644 --- a/hardhat-scripts/deploy/migration/migrate-proxies.ts +++ b/hardhat-scripts/deploy/migration/migrate-proxies.ts @@ -53,7 +53,6 @@ async function main() { providerInstance ); - // Get the proxy factory let proxyFactory = await ethers.getContractAt( "ERC1967Factory", @@ -97,7 +96,8 @@ async function main() { console.log("version variable not found"); } - if (contractName === "AddressResolver") await verifyBeaconImplementation(contract, signer); + if (contractName === "AddressResolver") + await verifyBeaconImplementation(contract, signer); if ( currentImplAddress.toLowerCase() === newImplementation.toLowerCase() @@ -110,10 +110,9 @@ async function main() { console.log("Upgrading proxy..."); const initializeFn = contract.interface.getFunction("initialize"); - const initData = contract.interface.encodeFunctionData( - initializeFn, - [VERSION] - ); + const initData = contract.interface.encodeFunctionData(initializeFn, [ + VERSION, + ]); const tx = await proxyFactory.upgradeAndCall( PROXY_ADDRESS, @@ -153,29 +152,46 @@ async function main() { async function verifyBeaconImplementation(contract: Contract, signer: Wallet) { console.log("Verifying beacon implementations..."); const forwarderBeaconAddress = await contract.forwarderBeacon(); - const forwarderImplementationAddress = await contract.forwarderImplementation(); + const forwarderImplementationAddress = + await contract.forwarderImplementation(); const asyncPromiseBeaconAddress = await contract.asyncPromiseBeacon(); - const asyncPromiseImplementationAddress = await contract.asyncPromiseImplementation(); + const asyncPromiseImplementationAddress = + await contract.asyncPromiseImplementation(); const upgradeableBeaconAbi = [ "function implementation() view returns (address)", ]; - const forwarderBeacon = new ethers.Contract(forwarderBeaconAddress, upgradeableBeaconAbi); - const asyncPromiseBeacon = new ethers.Contract(asyncPromiseBeaconAddress, upgradeableBeaconAbi); + const forwarderBeacon = new ethers.Contract( + forwarderBeaconAddress, + upgradeableBeaconAbi + ); + const asyncPromiseBeacon = new ethers.Contract( + asyncPromiseBeaconAddress, + upgradeableBeaconAbi + ); // Verify forwarder beacon implementation - const forwarderBeaconImplementation = await forwarderBeacon.connect(signer).implementation(); - if (forwarderBeaconImplementation.toLowerCase() !== forwarderImplementationAddress.toLowerCase()) { + const forwarderBeaconImplementation = await forwarderBeacon + .connect(signer) + .implementation(); + if ( + forwarderBeaconImplementation.toLowerCase() !== + forwarderImplementationAddress.toLowerCase() + ) { throw new Error("Forwarder beacon implementation mismatch"); } // Verify async promise beacon implementation - const asyncPromiseBeaconImplementation = await asyncPromiseBeacon.connect(signer).implementation(); - if (asyncPromiseBeaconImplementation.toLowerCase() !== asyncPromiseImplementationAddress.toLowerCase()) { + const asyncPromiseBeaconImplementation = await asyncPromiseBeacon + .connect(signer) + .implementation(); + if ( + asyncPromiseBeaconImplementation.toLowerCase() !== + asyncPromiseImplementationAddress.toLowerCase() + ) { throw new Error("Async promise beacon implementation mismatch"); } - } // We recommend this pattern to be able to use async/await everywhere // and properly handle errors. diff --git a/package.json b/package.json index 8aefdcc1..c7668da8 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "publishConfig": { "access": "public" }, - "version": "1.0.8", + "version": "1.0.9", "description": "socket protocol", "scripts": { "build": "hardhat export-abi && tsc --project lib.tsconfig.json", From 1a95e31b4ca498c02fa779bc2988901df8ddf5b1 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Mon, 17 Feb 2025 16:38:58 +0400 Subject: [PATCH 012/186] feat: composer deployment --- deployments/dev_addresses.json | 60 ++++++++++++++--------------- deployments/dev_addresses_geth.json | 38 ++++++++++++++++++ deployments/dev_verification.json | 14 +++---- 3 files changed, 75 insertions(+), 37 deletions(-) create mode 100644 deployments/dev_addresses_geth.json diff --git a/deployments/dev_addresses.json b/deployments/dev_addresses.json index 9498b9b1..04d10cda 100644 --- a/deployments/dev_addresses.json +++ b/deployments/dev_addresses.json @@ -1,38 +1,38 @@ { "421614": { - "ContractFactoryPlug": "0x1dc20d27F06876cA74ee4e2E9a4724f06a4a5E54", - "FastSwitchboard": "0xaFFfaD81e6DDE509Bd83Ab2024225b2FF537BeA7", - "FeesPlug": "0xb2B779ab8FC851bCE986d25B2824933B0Cd101d9", - "Hasher": "0x49f24A72e738Fe86263Aa26696370972e049498B", - "SignatureVerifier": "0xb6d39d1dB2cB14043182a008EfFC079A9C578208", - "Socket": "0x9B06e2Dae351ed8B1112C036e5c306E8fBe4C9c5", - "SocketBatcher": "0xd627BFe7d2fCAC1147c996a6F2CAaB2E1e1bD344", - "startBlock": 124035386 + "ContractFactoryPlug": "0xE86EdC6457Bf25434b6D23AdbE2F8D3D975e67FC", + "FastSwitchboard": "0xFF0A8a7BBB3a1C7Fb64318B1f3Cff50c52530370", + "FeesPlug": "0x78aE0a397Bb16d08956F040f97182fdcC19200DD", + "Hasher": "0x491B2365BB79520F0f4884e6e022287683671245", + "SignatureVerifier": "0x99DC5Cb4DadbDF09cc46E7F6e0B514094e928f9a", + "Socket": "0x82dC1E9882CDCB071B1940503585E9E6be527511", + "SocketBatcher": "0x75111143CbfdE7F8C5e558ad78AB4141ED3DbE6b", + "startBlock": 124608724 }, "7625382": { - "AddressResolver": "0x1287D33646d763Ff8237Aa7BE7d92Fc918c66589", - "AddressResolverImpl": "0x8662FC08dEC7c61Dd3432fAF45a5bC024BB60B00", - "AuctionManager": "0xE3806Bc41FEAFCAA2480E702fF02dA14F767bF0F", - "AuctionManagerImpl": "0x4C68058509d754Cc0dE474eBC20aE94e4787E704", - "DeliveryHelper": "0x4D8Fb6e8a5294ed0644f462b5723ee228ecf9958", - "DeliveryHelperImpl": "0x3c9f5172feb0dDfC06176cE67B566EFbb01CCe98", - "ERC1967Factory": "0xbBfb525ADc6eC38Ef0D4b807d327c2Dd1C286de1", - "FeesManager": "0x886682a69D6c0240EB850cc2e42c5B4B74449e82", - "FeesManagerImpl": "0xF4D3BDe438416938217d4624c82AEbEb46CeD371", - "SignatureVerifier": "0x366Dea9AC69fb9D45b6756587D2fE9B4c14197F6", - "SignatureVerifierImpl": "0x3cf47Ad0F040dFF1208E649C8f8e23e6B5A08916", - "startBlock": 18, - "WatcherPrecompile": "0xaCf94Cd4A7e70304F5CA6294CDAe3CBe78Ea6A86", - "WatcherPrecompileImpl": "0x8F18fC10a8b40b548C6F04Fb252481c783A9ace0" + "AddressResolver": "0x83b9f8829870989c233eD457FEBf5E2852F6f7e6", + "AddressResolverImpl": "0xE6C9cf66F57f6aF78585235E36E94007020e3746", + "AuctionManager": "0xE285dA5E0Af241148196045a8D0c554e9dCfdc5B", + "AuctionManagerImpl": "0xb888e3a8F9cC8F0281796958B01862427417b0Ea", + "DeliveryHelper": "0x96DD7A17d8BB599365d437ab0F34d7505187F9E8", + "DeliveryHelperImpl": "0x5bA4C527883F7D9e12d71Da5Cd170f26eCF2F901", + "ERC1967Factory": "0x494660a4bDcafC43a5522B98117D678654c6D3d5", + "FeesManager": "0x1B0d860ffC6D42Bc0Bd6C4b5bCe39F6694392AF5", + "FeesManagerImpl": "0x731f609cae8C9B6862B4c1D43dE29d4759f878F8", + "SignatureVerifier": "0x050433b2288F24FE6d87D3081343038D3BfBe39E", + "SignatureVerifierImpl": "0x70BA68CbDFc530E1AD62d9aFAf43a40B87D0730b", + "startBlock": 5488, + "WatcherPrecompile": "0xB588980Af36d5b718eBd4FCe3170Ee5Dd04A57D8", + "WatcherPrecompileImpl": "0x32D3c608405b9b037A574550a40477F8Ea1f8B5B" }, "11155420": { - "ContractFactoryPlug": "0x0EE19F0D0e34Cdd2eb4F61E24DC837b0b7c34e69", - "FastSwitchboard": "0x70bfB36F8b8de7763F1D52d954225ae88F6Ed595", - "FeesPlug": "0x7F5D263572469Fdf1875Cd858D557B45e9FC7f23", - "Hasher": "0xe37D675646A6FEEC3E41A0FF9535E0E716f5cD89", - "SignatureVerifier": "0x0452225B52Ef6134499232CbBEDF05fD8cc38530", - "Socket": "0x0BAAD473580c9F7Ca8b2758759aF3ce5E3154bC6", - "SocketBatcher": "0xCf731f35EFd775F692fe24e650e75Fd64bBaD810", - "startBlock": 23911773 + "ContractFactoryPlug": "0x6EF9c18c1A69417625f4Cb3c634124a71025C3A9", + "FastSwitchboard": "0x1E407363aec8952bff0ff35A596997d11b32f9c4", + "FeesPlug": "0x70B9067056b533A4e780C5E64228C60defFbC558", + "Hasher": "0xb34DB19C7FAeECf14B3D0336C6E34f7dc1336968", + "SignatureVerifier": "0xF86B89B5c689c170BfD2734254228D6d2db5a672", + "Socket": "0xfBa932AaE9Ae2777aEC77832FC0C2D9059C8E905", + "SocketBatcher": "0xdd7b56968a3505D1A10181F2880cAA65a89E4750", + "startBlock": 23996336 } } diff --git a/deployments/dev_addresses_geth.json b/deployments/dev_addresses_geth.json new file mode 100644 index 00000000..9498b9b1 --- /dev/null +++ b/deployments/dev_addresses_geth.json @@ -0,0 +1,38 @@ +{ + "421614": { + "ContractFactoryPlug": "0x1dc20d27F06876cA74ee4e2E9a4724f06a4a5E54", + "FastSwitchboard": "0xaFFfaD81e6DDE509Bd83Ab2024225b2FF537BeA7", + "FeesPlug": "0xb2B779ab8FC851bCE986d25B2824933B0Cd101d9", + "Hasher": "0x49f24A72e738Fe86263Aa26696370972e049498B", + "SignatureVerifier": "0xb6d39d1dB2cB14043182a008EfFC079A9C578208", + "Socket": "0x9B06e2Dae351ed8B1112C036e5c306E8fBe4C9c5", + "SocketBatcher": "0xd627BFe7d2fCAC1147c996a6F2CAaB2E1e1bD344", + "startBlock": 124035386 + }, + "7625382": { + "AddressResolver": "0x1287D33646d763Ff8237Aa7BE7d92Fc918c66589", + "AddressResolverImpl": "0x8662FC08dEC7c61Dd3432fAF45a5bC024BB60B00", + "AuctionManager": "0xE3806Bc41FEAFCAA2480E702fF02dA14F767bF0F", + "AuctionManagerImpl": "0x4C68058509d754Cc0dE474eBC20aE94e4787E704", + "DeliveryHelper": "0x4D8Fb6e8a5294ed0644f462b5723ee228ecf9958", + "DeliveryHelperImpl": "0x3c9f5172feb0dDfC06176cE67B566EFbb01CCe98", + "ERC1967Factory": "0xbBfb525ADc6eC38Ef0D4b807d327c2Dd1C286de1", + "FeesManager": "0x886682a69D6c0240EB850cc2e42c5B4B74449e82", + "FeesManagerImpl": "0xF4D3BDe438416938217d4624c82AEbEb46CeD371", + "SignatureVerifier": "0x366Dea9AC69fb9D45b6756587D2fE9B4c14197F6", + "SignatureVerifierImpl": "0x3cf47Ad0F040dFF1208E649C8f8e23e6B5A08916", + "startBlock": 18, + "WatcherPrecompile": "0xaCf94Cd4A7e70304F5CA6294CDAe3CBe78Ea6A86", + "WatcherPrecompileImpl": "0x8F18fC10a8b40b548C6F04Fb252481c783A9ace0" + }, + "11155420": { + "ContractFactoryPlug": "0x0EE19F0D0e34Cdd2eb4F61E24DC837b0b7c34e69", + "FastSwitchboard": "0x70bfB36F8b8de7763F1D52d954225ae88F6Ed595", + "FeesPlug": "0x7F5D263572469Fdf1875Cd858D557B45e9FC7f23", + "Hasher": "0xe37D675646A6FEEC3E41A0FF9535E0E716f5cD89", + "SignatureVerifier": "0x0452225B52Ef6134499232CbBEDF05fD8cc38530", + "Socket": "0x0BAAD473580c9F7Ca8b2758759aF3ce5E3154bC6", + "SocketBatcher": "0xCf731f35EFd775F692fe24e650e75Fd64bBaD810", + "startBlock": 23911773 + } +} diff --git a/deployments/dev_verification.json b/deployments/dev_verification.json index fba8d887..2c945377 100644 --- a/deployments/dev_verification.json +++ b/deployments/dev_verification.json @@ -2,43 +2,43 @@ "421614": [], "7625382": [ [ - "0x4C68058509d754Cc0dE474eBC20aE94e4787E704", + "0xb888e3a8F9cC8F0281796958B01862427417b0Ea", "AuctionManager", "contracts/apps/payload-delivery/app-gateway/AuctionManager.sol", [] ], [ - "0x3c9f5172feb0dDfC06176cE67B566EFbb01CCe98", + "0x5bA4C527883F7D9e12d71Da5Cd170f26eCF2F901", "DeliveryHelper", "contracts/apps/payload-delivery/app-gateway/DeliveryHelper.sol", [] ], [ - "0xF4D3BDe438416938217d4624c82AEbEb46CeD371", + "0x731f609cae8C9B6862B4c1D43dE29d4759f878F8", "FeesManager", "contracts/apps/payload-delivery/app-gateway/FeesManager.sol", [] ], [ - "0x8F18fC10a8b40b548C6F04Fb252481c783A9ace0", + "0x32D3c608405b9b037A574550a40477F8Ea1f8B5B", "WatcherPrecompile", "contracts/watcherPrecompile/WatcherPrecompile.sol", [] ], [ - "0x8662FC08dEC7c61Dd3432fAF45a5bC024BB60B00", + "0xE6C9cf66F57f6aF78585235E36E94007020e3746", "AddressResolver", "contracts/AddressResolver.sol", [] ], [ - "0x3cf47Ad0F040dFF1208E649C8f8e23e6B5A08916", + "0x70BA68CbDFc530E1AD62d9aFAf43a40B87D0730b", "SignatureVerifier", "contracts/socket/utils/SignatureVerifier.sol", [] ], [ - "0xbBfb525ADc6eC38Ef0D4b807d327c2Dd1C286de1", + "0x494660a4bDcafC43a5522B98117D678654c6D3d5", "ERC1967Factory", "lib/solady/src/utils/ERC1967Factory.sol", [] From a5867f9463751bd8cd7852b849732bdf17ea293e Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Mon, 17 Feb 2025 16:46:43 +0400 Subject: [PATCH 013/186] feat: implement overloaded override setters --- contracts/apps/counter/CounterAppGateway.sol | 6 +- .../ParallelCounterAppGateway.sol | 3 +- .../ParallelCounterDeployer.sol | 3 +- .../SuperTokenLockableAppGateway.sol | 4 +- contracts/base/AppGatewayBase.sol | 85 +++++++++++++++---- contracts/interfaces/IAppGateway.sol | 2 + 6 files changed, 75 insertions(+), 28 deletions(-) diff --git a/contracts/apps/counter/CounterAppGateway.sol b/contracts/apps/counter/CounterAppGateway.sol index ffeb3100..76c73726 100644 --- a/contracts/apps/counter/CounterAppGateway.sol +++ b/contracts/apps/counter/CounterAppGateway.sol @@ -32,15 +32,13 @@ contract CounterAppGateway is AppGatewayBase { function readCounters(address[] memory instances_) public async { // the increase function is called on given list of instances // this - _readCallOn(); - _setIsCallSequential(false); + _setOverrides(true); for (uint256 i = 0; i < instances_.length; i++) { uint32 chainSlug = IForwarder(instances_[i]).getChainSlug(); ICounter(instances_[i]).getCounter(); IPromise(instances_[i]).then(this.setCounterValues.selector, abi.encode(chainSlug)); } - _readCallOff(); - _setIsCallSequential(true); + _setOverrides(false); ICounter(instances_[0]).increase(); } diff --git a/contracts/apps/parallel-counter/ParallelCounterAppGateway.sol b/contracts/apps/parallel-counter/ParallelCounterAppGateway.sol index 1f42d779..6fd2d703 100644 --- a/contracts/apps/parallel-counter/ParallelCounterAppGateway.sol +++ b/contracts/apps/parallel-counter/ParallelCounterAppGateway.sol @@ -12,8 +12,7 @@ contract ParallelCounterAppGateway is AppGatewayBase { Fees memory fees_ ) AppGatewayBase(addressResolver_, auctionManager_) { addressResolver__.setContractsToGateways(deployerContract_); - _setFees(fees_); - _setIsCallSequential(false); + _setOverrides(false, true, 1000000, fees_); } function incrementCounters(address[] memory instances_) public async { diff --git a/contracts/apps/parallel-counter/ParallelCounterDeployer.sol b/contracts/apps/parallel-counter/ParallelCounterDeployer.sol index eeca0663..d5506213 100644 --- a/contracts/apps/parallel-counter/ParallelCounterDeployer.sol +++ b/contracts/apps/parallel-counter/ParallelCounterDeployer.sol @@ -17,8 +17,7 @@ contract ParallelCounterDeployer is AppDeployerBase, OwnableTwoStep { ) AppDeployerBase(addressResolver_, auctionManager_, sbType_) { creationCodeWithArgs[counter1] = abi.encodePacked(type(Counter).creationCode); creationCodeWithArgs[counter2] = abi.encodePacked(type(Counter).creationCode); - _setFees(fees_); - _setIsCallSequential(false); + _setOverrides(false, false, 1000000, fees_); _claimOwner(msg.sender); } diff --git a/contracts/apps/super-token-lockable/SuperTokenLockableAppGateway.sol b/contracts/apps/super-token-lockable/SuperTokenLockableAppGateway.sol index 133541be..339f0c23 100644 --- a/contracts/apps/super-token-lockable/SuperTokenLockableAppGateway.sol +++ b/contracts/apps/super-token-lockable/SuperTokenLockableAppGateway.sol @@ -49,12 +49,12 @@ contract SuperTokenLockableAppGateway is AppGatewayBase, OwnableTwoStep { asyncId_ = _getCurrentAsyncId(); ISuperToken(order.srcToken).lockTokens(order.user, order.srcAmount); - _readCallOn(); + _setOverrides(true); // goes to forwarder and deploys promise and stores it ISuperToken(order.srcToken).balanceOf(order.user); IPromise(order.srcToken).then(this.checkBalance.selector, abi.encode(order, asyncId_)); - _readCallOff(); + _setOverrides(false); ISuperToken(order.dstToken).mint(order.user, order.srcAmount); ISuperToken(order.srcToken).burn(order.user, order.srcAmount); diff --git a/contracts/base/AppGatewayBase.sol b/contracts/base/AppGatewayBase.sol index 85b3f6ee..b47f0470 100644 --- a/contracts/base/AppGatewayBase.sol +++ b/contracts/base/AppGatewayBase.sol @@ -14,6 +14,8 @@ import {InvalidPromise, FeesNotSet} from "../common/Errors.sol"; abstract contract AppGatewayBase is AddressResolverUtil, IAppGateway, FeesPlugin { bool public override isReadCall; bool public override isCallSequential; + uint256 public override gasLimit; + address public auctionManager; bytes public onCompleteData; bytes32 public sbType; @@ -47,10 +49,63 @@ abstract contract AppGatewayBase is AddressResolverUtil, IAppGateway, FeesPlugin isCallSequential = true; } - function _setIsCallSequential(bool isCallSequential_) internal { + //////////////////////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////// OVERRIDE HELPERS /////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////////////////// + + /// @notice Sets multiple overrides in one call + /// @param isReadCall_ The read call flag + /// @param fees_ The fees configuration + /// @param gasLimit_ The gas limit + /// @param isCallSequential_ The sequential call flag + function _setOverrides( + bool isReadCall_, + bool isCallSequential_, + uint256 gasLimit_, + Fees memory fees_ + ) internal { + isReadCall = isReadCall_; + isCallSequential = isCallSequential_; + gasLimit = gasLimit_; + _setFees(fees_); + } + + /// @notice Sets isReadCall, fees and gasLimit overrides + /// @param isReadCall_ The read call flag + /// @param isCallSequential_ The sequential call flag + /// @param gasLimit_ The gas limit + function _setOverrides(bool isReadCall_, bool isCallSequential_, uint256 gasLimit_) internal { + isReadCall = isReadCall_; + isCallSequential = isCallSequential_; + gasLimit = gasLimit_; + } + + /// @notice Sets isReadCall and isCallSequential overrides + /// @param isReadCall_ The read call flag + /// @param isCallSequential_ The sequential call flag + function _setOverrides(bool isReadCall_, bool isCallSequential_) internal { + isReadCall = isReadCall_; isCallSequential = isCallSequential_; } + /// @notice Sets isReadCall and gasLimit overrides + /// @param isReadCall_ The read call flag + function _setOverrides(bool isReadCall_) internal { + isReadCall = isReadCall_; + } + + /// @notice Sets gasLimit overrides + /// @param gasLimit_ The gas limit + function _setOverrides(uint256 gasLimit_) internal { + gasLimit = gasLimit_; + } + + /// @notice Sets fees overrides + /// @param fees_ The fees configuration + function _setOverrides(Fees memory fees_) internal { + _setFees(fees_); + } + /// @notice Creates a contract ID /// @param contractName_ The contract name /// @return bytes32 The contract ID @@ -64,16 +119,6 @@ abstract contract AppGatewayBase is AddressResolverUtil, IAppGateway, FeesPlugin auctionManager = auctionManager_; } - /// @notice Sets the read call flag - function _readCallOn() internal { - isReadCall = true; - } - - /// @notice Turns off the read call flag - function _readCallOff() internal { - isReadCall = false; - } - /// @notice Marks the promises as valid function _markValidPromises() internal { address[] memory promises = addressResolver__.getPromises(); @@ -96,16 +141,10 @@ abstract contract AppGatewayBase is AddressResolverUtil, IAppGateway, FeesPlugin /// @notice increases the transaction fees /// @param asyncId_ The async ID - function increaseFees(bytes32 asyncId_, uint256 newMaxFees_) internal { + function _increaseFees(bytes32 asyncId_, uint256 newMaxFees_) internal { deliveryHelper().increaseFees(asyncId_, newMaxFees_); } - /// @notice hook to handle the revert in callbacks or onchain executions - /// @dev can be overridden by the app gateway to add custom logic - /// @param asyncId_ The async ID - /// @param payloadId_ The payload ID - function handleRevert(bytes32 asyncId_, bytes32 payloadId_) external override onlyPromises {} - /// @notice Withdraws fee tokens /// @param chainSlug_ The chain slug /// @param token_ The token address @@ -120,6 +159,10 @@ abstract contract AppGatewayBase is AddressResolverUtil, IAppGateway, FeesPlugin deliveryHelper().withdrawTo(chainSlug_, token_, amount_, receiver_, auctionManager, fees); } + //////////////////////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////// OVERRIDE HOOKS ///////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////////////////// + /// @notice Callback in pd promise to be called after all contracts are deployed /// @param asyncId_ The async ID /// @param payloadBatch_ The payload batch @@ -134,4 +177,10 @@ abstract contract AppGatewayBase is AddressResolverUtil, IAppGateway, FeesPlugin bytes calldata payload_, bytes32 params_ ) external virtual onlyWatcherPrecompile {} + + /// @notice hook to handle the revert in callbacks or onchain executions + /// @dev can be overridden by the app gateway to add custom logic + /// @param asyncId_ The async ID + /// @param payloadId_ The payload ID + function handleRevert(bytes32 asyncId_, bytes32 payloadId_) external override onlyPromises {} } diff --git a/contracts/interfaces/IAppGateway.sol b/contracts/interfaces/IAppGateway.sol index e4c6fcd0..8cf706e2 100644 --- a/contracts/interfaces/IAppGateway.sol +++ b/contracts/interfaces/IAppGateway.sol @@ -8,6 +8,8 @@ interface IAppGateway { function isCallSequential() external view returns (bool); + function gasLimit() external view returns (uint256); + function onBatchComplete(bytes32 asyncId_, PayloadBatch memory payloadBatch_) external; function callFromInbox( From 683d58ddbcb954f14e1c46ac2039676606c8dfc1 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Mon, 17 Feb 2025 16:46:59 +0400 Subject: [PATCH 014/186] fix: lint --- hardhat-scripts/deploy/1.deploy.ts | 1 - .../deploy/migration/migrate-proxies.ts | 46 +++++++++++++------ 2 files changed, 31 insertions(+), 16 deletions(-) diff --git a/hardhat-scripts/deploy/1.deploy.ts b/hardhat-scripts/deploy/1.deploy.ts index dcff8d4e..e2ed176f 100644 --- a/hardhat-scripts/deploy/1.deploy.ts +++ b/hardhat-scripts/deploy/1.deploy.ts @@ -352,7 +352,6 @@ async function initializeSigVerifier( } } - async function updateContractSettings( contract: Contract, getterMethod: string, diff --git a/hardhat-scripts/deploy/migration/migrate-proxies.ts b/hardhat-scripts/deploy/migration/migrate-proxies.ts index 9370036b..7a44eca4 100644 --- a/hardhat-scripts/deploy/migration/migrate-proxies.ts +++ b/hardhat-scripts/deploy/migration/migrate-proxies.ts @@ -53,7 +53,6 @@ async function main() { providerInstance ); - // Get the proxy factory let proxyFactory = await ethers.getContractAt( "ERC1967Factory", @@ -97,7 +96,8 @@ async function main() { console.log("version variable not found"); } - if (contractName === "AddressResolver") await verifyBeaconImplementation(contract, signer); + if (contractName === "AddressResolver") + await verifyBeaconImplementation(contract, signer); if ( currentImplAddress.toLowerCase() === newImplementation.toLowerCase() @@ -110,10 +110,9 @@ async function main() { console.log("Upgrading proxy..."); const initializeFn = contract.interface.getFunction("initialize"); - const initData = contract.interface.encodeFunctionData( - initializeFn, - [VERSION] - ); + const initData = contract.interface.encodeFunctionData(initializeFn, [ + VERSION, + ]); const tx = await proxyFactory.upgradeAndCall( PROXY_ADDRESS, @@ -153,29 +152,46 @@ async function main() { async function verifyBeaconImplementation(contract: Contract, signer: Wallet) { console.log("Verifying beacon implementations..."); const forwarderBeaconAddress = await contract.forwarderBeacon(); - const forwarderImplementationAddress = await contract.forwarderImplementation(); + const forwarderImplementationAddress = + await contract.forwarderImplementation(); const asyncPromiseBeaconAddress = await contract.asyncPromiseBeacon(); - const asyncPromiseImplementationAddress = await contract.asyncPromiseImplementation(); + const asyncPromiseImplementationAddress = + await contract.asyncPromiseImplementation(); const upgradeableBeaconAbi = [ "function implementation() view returns (address)", ]; - const forwarderBeacon = new ethers.Contract(forwarderBeaconAddress, upgradeableBeaconAbi); - const asyncPromiseBeacon = new ethers.Contract(asyncPromiseBeaconAddress, upgradeableBeaconAbi); + const forwarderBeacon = new ethers.Contract( + forwarderBeaconAddress, + upgradeableBeaconAbi + ); + const asyncPromiseBeacon = new ethers.Contract( + asyncPromiseBeaconAddress, + upgradeableBeaconAbi + ); // Verify forwarder beacon implementation - const forwarderBeaconImplementation = await forwarderBeacon.connect(signer).implementation(); - if (forwarderBeaconImplementation.toLowerCase() !== forwarderImplementationAddress.toLowerCase()) { + const forwarderBeaconImplementation = await forwarderBeacon + .connect(signer) + .implementation(); + if ( + forwarderBeaconImplementation.toLowerCase() !== + forwarderImplementationAddress.toLowerCase() + ) { throw new Error("Forwarder beacon implementation mismatch"); } // Verify async promise beacon implementation - const asyncPromiseBeaconImplementation = await asyncPromiseBeacon.connect(signer).implementation(); - if (asyncPromiseBeaconImplementation.toLowerCase() !== asyncPromiseImplementationAddress.toLowerCase()) { + const asyncPromiseBeaconImplementation = await asyncPromiseBeacon + .connect(signer) + .implementation(); + if ( + asyncPromiseBeaconImplementation.toLowerCase() !== + asyncPromiseImplementationAddress.toLowerCase() + ) { throw new Error("Async promise beacon implementation mismatch"); } - } // We recommend this pattern to be able to use async/await everywhere // and properly handle errors. From c209fdb943d80d9267e360c0abfe7b964996d7b4 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Mon, 17 Feb 2025 16:49:51 +0400 Subject: [PATCH 015/186] fix: remove separate fees setter --- .../counter-inbox/CounterInboxAppGateway.sol | 2 +- contracts/apps/counter/CounterAppGateway.sol | 6 +- contracts/apps/counter/CounterDeployer.sol | 2 +- contracts/apps/cron/CronAppGateway.sol | 2 +- .../SuperTokenLockableAppGateway.sol | 2 +- .../SuperTokenLockableDeployer.sol | 2 +- .../apps/super-token/SuperTokenAppGateway.sol | 2 +- .../apps/super-token/SuperTokenDeployer.sol | 2 +- contracts/base/AppGatewayBase.sol | 64 ++++++++++--------- contracts/utils/FeesPlugin.sol | 9 --- 10 files changed, 44 insertions(+), 49 deletions(-) diff --git a/contracts/apps/counter-inbox/CounterInboxAppGateway.sol b/contracts/apps/counter-inbox/CounterInboxAppGateway.sol index 9193eadb..d759a543 100644 --- a/contracts/apps/counter-inbox/CounterInboxAppGateway.sol +++ b/contracts/apps/counter-inbox/CounterInboxAppGateway.sol @@ -14,7 +14,7 @@ contract CounterInboxAppGateway is AppGatewayBase { Fees memory fees_ ) AppGatewayBase(addressResolver_, auctionManager_) { watcherPrecompile__().setIsValidInboxCaller(chainSlug_, address(counterInbox_), true); - _setFees(fees_); + _setOverrides(fees_); } function callFromInbox( diff --git a/contracts/apps/counter/CounterAppGateway.sol b/contracts/apps/counter/CounterAppGateway.sol index 76c73726..68d98b25 100644 --- a/contracts/apps/counter/CounterAppGateway.sol +++ b/contracts/apps/counter/CounterAppGateway.sol @@ -18,7 +18,7 @@ contract CounterAppGateway is AppGatewayBase { Fees memory fees_ ) AppGatewayBase(addressResolver_, auctionManager_) { addressResolver__.setContractsToGateways(deployerContract_); - _setFees(fees_); + _setOverrides(fees_); } function incrementCounters(address[] memory instances_) public async { @@ -32,13 +32,13 @@ contract CounterAppGateway is AppGatewayBase { function readCounters(address[] memory instances_) public async { // the increase function is called on given list of instances // this - _setOverrides(true); + _setOverrides(false, true); for (uint256 i = 0; i < instances_.length; i++) { uint32 chainSlug = IForwarder(instances_[i]).getChainSlug(); ICounter(instances_[i]).getCounter(); IPromise(instances_[i]).then(this.setCounterValues.selector, abi.encode(chainSlug)); } - _setOverrides(false); + _setOverrides(false, false); ICounter(instances_[0]).increase(); } diff --git a/contracts/apps/counter/CounterDeployer.sol b/contracts/apps/counter/CounterDeployer.sol index 18bef28a..a546c48f 100644 --- a/contracts/apps/counter/CounterDeployer.sol +++ b/contracts/apps/counter/CounterDeployer.sol @@ -15,7 +15,7 @@ contract CounterDeployer is AppDeployerBase, OwnableTwoStep { Fees memory fees_ ) AppDeployerBase(addressResolver_, auctionManager_, sbType_) { creationCodeWithArgs[counter] = abi.encodePacked(type(Counter).creationCode); - _setFees(fees_); + _setOverrides(fees_); _claimOwner(msg.sender); } diff --git a/contracts/apps/cron/CronAppGateway.sol b/contracts/apps/cron/CronAppGateway.sol index 2a649e5c..9b50abf5 100644 --- a/contracts/apps/cron/CronAppGateway.sol +++ b/contracts/apps/cron/CronAppGateway.sol @@ -13,7 +13,7 @@ contract CronAppGateway is AppGatewayBase { Fees memory fees_ ) AppGatewayBase(addressResolver_, auctionManager_) { addressResolver__.setContractsToGateways(deployerContract_); - _setFees(fees_); + _setOverrides(fees_); } function setTimeout(uint256 delayInSeconds_) public { diff --git a/contracts/apps/super-token-lockable/SuperTokenLockableAppGateway.sol b/contracts/apps/super-token-lockable/SuperTokenLockableAppGateway.sol index 339f0c23..ce282d4c 100644 --- a/contracts/apps/super-token-lockable/SuperTokenLockableAppGateway.sol +++ b/contracts/apps/super-token-lockable/SuperTokenLockableAppGateway.sol @@ -25,7 +25,7 @@ contract SuperTokenLockableAppGateway is AppGatewayBase, OwnableTwoStep { Fees memory fees_ ) AppGatewayBase(addressResolver_, auctionManager_) { addressResolver__.setContractsToGateways(deployerContract_); - _setFees(fees_); + _setOverrides(fees_); _claimOwner(msg.sender); } diff --git a/contracts/apps/super-token-lockable/SuperTokenLockableDeployer.sol b/contracts/apps/super-token-lockable/SuperTokenLockableDeployer.sol index d9bd242e..fd8dfad5 100644 --- a/contracts/apps/super-token-lockable/SuperTokenLockableDeployer.sol +++ b/contracts/apps/super-token-lockable/SuperTokenLockableDeployer.sol @@ -44,7 +44,7 @@ contract SuperTokenLockableDeployer is AppDeployerBase, OwnableTwoStep { abi.encode(params._burnLimit, params._mintLimit) ); - _setFees(fees_); + _setOverrides(fees_); _claimOwner(owner_); } diff --git a/contracts/apps/super-token/SuperTokenAppGateway.sol b/contracts/apps/super-token/SuperTokenAppGateway.sol index fa5f5e14..f51fef59 100644 --- a/contracts/apps/super-token/SuperTokenAppGateway.sol +++ b/contracts/apps/super-token/SuperTokenAppGateway.sol @@ -27,7 +27,7 @@ contract SuperTokenAppGateway is AppGatewayBase, OwnableTwoStep { // sets the fees data like max fees, chain and token for all transfers // they can be updated for each transfer as well - _setFees(fees_); + _setOverrides(fees_); _claimOwner(msg.sender); } diff --git a/contracts/apps/super-token/SuperTokenDeployer.sol b/contracts/apps/super-token/SuperTokenDeployer.sol index 0e814dcd..9dc3a2f4 100644 --- a/contracts/apps/super-token/SuperTokenDeployer.sol +++ b/contracts/apps/super-token/SuperTokenDeployer.sol @@ -34,7 +34,7 @@ contract SuperTokenDeployer is AppDeployerBase, OwnableTwoStep { params_.initialSupply_ ) ); - _setFees(fees_); + _setOverrides(fees_); } function deployContracts(uint32 chainSlug_) external async { diff --git a/contracts/base/AppGatewayBase.sol b/contracts/base/AppGatewayBase.sol index b47f0470..d88a7ff8 100644 --- a/contracts/base/AppGatewayBase.sol +++ b/contracts/base/AppGatewayBase.sol @@ -49,8 +49,35 @@ abstract contract AppGatewayBase is AddressResolverUtil, IAppGateway, FeesPlugin isCallSequential = true; } + /// @notice Creates a contract ID + /// @param contractName_ The contract name + /// @return bytes32 The contract ID + function _createContractId(string memory contractName_) internal pure returns (bytes32) { + return keccak256(abi.encode(contractName_)); + } + + /// @notice Gets the current async ID + /// @return bytes32 The current async ID + function _getCurrentAsyncId() internal view returns (bytes32) { + return deliveryHelper().getCurrentAsyncId(); + } + + /// @notice Sets the auction manager + /// @param auctionManager_ The auction manager + function _setAuctionManager(address auctionManager_) internal { + auctionManager = auctionManager_; + } + + /// @notice Marks the promises as valid + function _markValidPromises() internal { + address[] memory promises = addressResolver__.getPromises(); + for (uint256 i = 0; i < promises.length; i++) { + isValidPromise[promises[i]] = true; + } + } + //////////////////////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////// OVERRIDE HELPERS /////////////////////////////////////////////////// + ///////////////////////////////// TX OVERRIDE HELPERS /////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////// /// @notice Sets multiple overrides in one call @@ -67,7 +94,7 @@ abstract contract AppGatewayBase is AddressResolverUtil, IAppGateway, FeesPlugin isReadCall = isReadCall_; isCallSequential = isCallSequential_; gasLimit = gasLimit_; - _setFees(fees_); + fees = fees_; } /// @notice Sets isReadCall, fees and gasLimit overrides @@ -103,35 +130,12 @@ abstract contract AppGatewayBase is AddressResolverUtil, IAppGateway, FeesPlugin /// @notice Sets fees overrides /// @param fees_ The fees configuration function _setOverrides(Fees memory fees_) internal { - _setFees(fees_); + fees = fees_; } - /// @notice Creates a contract ID - /// @param contractName_ The contract name - /// @return bytes32 The contract ID - function _createContractId(string memory contractName_) internal pure returns (bytes32) { - return keccak256(abi.encode(contractName_)); - } - - /// @notice Sets the auction manager - /// @param auctionManager_ The auction manager - function _setAuctionManager(address auctionManager_) internal { - auctionManager = auctionManager_; - } - - /// @notice Marks the promises as valid - function _markValidPromises() internal { - address[] memory promises = addressResolver__.getPromises(); - for (uint256 i = 0; i < promises.length; i++) { - isValidPromise[promises[i]] = true; - } - } - - /// @notice Gets the current async ID - /// @return bytes32 The current async ID - function _getCurrentAsyncId() internal view returns (bytes32) { - return deliveryHelper().getCurrentAsyncId(); - } + //////////////////////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////// ASYNC BATCH HELPERS ///////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////////////////// /// @notice Reverts the transaction /// @param asyncId_ The async ID @@ -160,7 +164,7 @@ abstract contract AppGatewayBase is AddressResolverUtil, IAppGateway, FeesPlugin } //////////////////////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////// OVERRIDE HOOKS ///////////////////////////////////////////////// + ///////////////////////////////// HOOKS ///////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////// /// @notice Callback in pd promise to be called after all contracts are deployed diff --git a/contracts/utils/FeesPlugin.sol b/contracts/utils/FeesPlugin.sol index 943187ac..90c34f8f 100644 --- a/contracts/utils/FeesPlugin.sol +++ b/contracts/utils/FeesPlugin.sol @@ -11,15 +11,6 @@ abstract contract FeesPlugin { /// @dev Contains fee parameters like rates, limits, and recipient addresses Fees public fees; - /// @notice Updates the fee configuration - /// @param fees_ New fee configuration to be set - /// @dev Internal function to be called by inheriting contracts - /// @dev Should be protected with appropriate access control in implementing contracts - function _setFees(Fees memory fees_) internal { - // Update the fee configuration with new parameters - fees = fees_; - } - /// @notice Retrieves the current fee configuration /// @return Current fee configuration struct /// @dev Public view function accessible to any caller From e6253fbe620a005f87956bfdb75cbb5239fbafdd Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Mon, 17 Feb 2025 17:41:59 +0400 Subject: [PATCH 016/186] feat: remove local ownable --- contracts/AddressResolver.sol | 8 +- contracts/apps/counter-inbox/CounterInbox.sol | 8 +- contracts/apps/counter/Counter.sol | 8 +- contracts/apps/counter/CounterDeployer.sol | 6 +- .../ParallelCounterDeployer.sol | 6 +- .../payload-delivery/ContractFactoryPlug.sol | 6 +- contracts/apps/payload-delivery/FeesPlug.sol | 7 +- .../app-gateway/AuctionManager.sol | 6 +- .../app-gateway/DeliveryHelper.sol | 6 +- .../app-gateway/FeesManager.sol | 6 +- .../apps/super-token-lockable/LimitHook.sol | 8 +- .../SuperTokenLockable.sol | 8 +- .../SuperTokenLockableAppGateway.sol | 6 +- .../SuperTokenLockableDeployer.sol | 6 +- contracts/apps/super-token/SuperToken.sol | 8 +- .../apps/super-token/SuperTokenAppGateway.sol | 6 +- .../apps/super-token/SuperTokenDeployer.sol | 6 +- contracts/socket/SocketBase.sol | 2 +- contracts/socket/SocketBatcher.sol | 6 +- .../socket/switchboard/SwitchboardBase.sol | 2 +- contracts/socket/utils/AccessControl.sol | 4 +- contracts/socket/utils/Hasher.sol | 2 +- contracts/socket/utils/SignatureVerifier.sol | 2 +- contracts/utils/OwnableTwoStep.sol | 73 ------------------- .../watcherPrecompile/WatcherPrecompile.sol | 2 +- .../WatcherPrecompileLimits.sol | 4 +- test/Migration.t.sol | 4 +- test/MockWatcherPrecompileImpl.sol | 2 +- 28 files changed, 73 insertions(+), 145 deletions(-) delete mode 100644 contracts/utils/OwnableTwoStep.sol diff --git a/contracts/AddressResolver.sol b/contracts/AddressResolver.sol index 43460cc3..064c04c8 100644 --- a/contracts/AddressResolver.sol +++ b/contracts/AddressResolver.sol @@ -4,15 +4,15 @@ pragma solidity ^0.8.21; import "./interfaces/IAddressResolver.sol"; import {Forwarder} from "./Forwarder.sol"; import {AsyncPromise} from "./AsyncPromise.sol"; -import {OwnableTwoStep} from "./utils/OwnableTwoStep.sol"; +import {Ownable} from "solady/auth/Ownable.sol"; import {LibClone} from "solady/utils/LibClone.sol"; import {UpgradeableBeacon} from "solady/utils/UpgradeableBeacon.sol"; import {Initializable} from "solady/utils/Initializable.sol"; /// @title AddressResolver Contract /// @notice This contract is responsible for fetching latest core addresses and deploying Forwarder and AsyncPromise contracts. -/// @dev Inherits the OwnableTwoStep contract and implements the IAddressResolver interface. -contract AddressResolver is OwnableTwoStep, IAddressResolver, Initializable { +/// @dev Inherits the Ownable contract and implements the IAddressResolver interface. +contract AddressResolver is Ownable, IAddressResolver, Initializable { IWatcherPrecompile public override watcherPrecompile__; address public override deliveryHelper; address public override feesManager; @@ -51,7 +51,7 @@ contract AddressResolver is OwnableTwoStep, IAddressResolver, Initializable { /// @param owner_ The address of the contract owner function initialize(address owner_, uint64 version_) public reinitializer(version_) { version = version_; - _claimOwner(owner_); + _initializeOwner(owner_); forwarderImplementation = address(new Forwarder()); asyncPromiseImplementation = address(new AsyncPromise()); diff --git a/contracts/apps/counter-inbox/CounterInbox.sol b/contracts/apps/counter-inbox/CounterInbox.sol index 458b2aa4..483d67ac 100644 --- a/contracts/apps/counter-inbox/CounterInbox.sol +++ b/contracts/apps/counter-inbox/CounterInbox.sol @@ -1,12 +1,12 @@ // SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.7.0 <0.9.0; -import "../../utils/OwnableTwoStep.sol"; +import "solady/auth/Ownable.sol"; import "../../base/PlugBase.sol"; -contract CounterInbox is OwnableTwoStep, PlugBase { +contract CounterInbox is Ownable, PlugBase { constructor() PlugBase(msg.sender) { - _claimOwner(msg.sender); + _initializeOwner(msg.sender); } function increaseOnGateway(uint256 value_) external returns (bytes32) { @@ -14,7 +14,7 @@ contract CounterInbox is OwnableTwoStep, PlugBase { } function connectSocket(address appGateway_, address socket_, address switchboard_) external { - _claimOwner(socket_); + _initializeOwner(socket_); _connectSocket(appGateway_, socket_, switchboard_); } } diff --git a/contracts/apps/counter/Counter.sol b/contracts/apps/counter/Counter.sol index 2e8f3a71..db0e6446 100644 --- a/contracts/apps/counter/Counter.sol +++ b/contracts/apps/counter/Counter.sol @@ -1,14 +1,14 @@ // SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.7.0 <0.9.0; -import "../../utils/OwnableTwoStep.sol"; +import "solady/auth/Ownable.sol"; import "../../base/PlugBase.sol"; -contract Counter is OwnableTwoStep, PlugBase { +contract Counter is Ownable, PlugBase { uint256 public counter; constructor() PlugBase(msg.sender) { - _claimOwner(msg.sender); + _initializeOwner(msg.sender); } function increase() external onlySocket { @@ -20,7 +20,7 @@ contract Counter is OwnableTwoStep, PlugBase { address socket_, address switchboard_ ) external onlyOwner { - _claimOwner(socket_); + _initializeOwner(socket_); _connectSocket(appGateway_, socket_, switchboard_); } diff --git a/contracts/apps/counter/CounterDeployer.sol b/contracts/apps/counter/CounterDeployer.sol index a546c48f..93d7f115 100644 --- a/contracts/apps/counter/CounterDeployer.sol +++ b/contracts/apps/counter/CounterDeployer.sol @@ -3,9 +3,9 @@ pragma solidity >=0.7.0 <0.9.0; import "./Counter.sol"; import "../../base/AppDeployerBase.sol"; -import "../../utils/OwnableTwoStep.sol"; +import "solady/auth/Ownable.sol"; -contract CounterDeployer is AppDeployerBase, OwnableTwoStep { +contract CounterDeployer is AppDeployerBase, Ownable { bytes32 public counter = _createContractId("counter"); constructor( @@ -16,7 +16,7 @@ contract CounterDeployer is AppDeployerBase, OwnableTwoStep { ) AppDeployerBase(addressResolver_, auctionManager_, sbType_) { creationCodeWithArgs[counter] = abi.encodePacked(type(Counter).creationCode); _setOverrides(fees_); - _claimOwner(msg.sender); + _initializeOwner(msg.sender); } function deployContracts(uint32 chainSlug_) external async { diff --git a/contracts/apps/parallel-counter/ParallelCounterDeployer.sol b/contracts/apps/parallel-counter/ParallelCounterDeployer.sol index d5506213..9321a1a9 100644 --- a/contracts/apps/parallel-counter/ParallelCounterDeployer.sol +++ b/contracts/apps/parallel-counter/ParallelCounterDeployer.sol @@ -1,11 +1,11 @@ // SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.7.0 <0.9.0; +import "solady/auth/Ownable.sol"; import "../counter/Counter.sol"; import "../../base/AppDeployerBase.sol"; -import "../../utils/OwnableTwoStep.sol"; -contract ParallelCounterDeployer is AppDeployerBase, OwnableTwoStep { +contract ParallelCounterDeployer is AppDeployerBase, Ownable { bytes32 public counter1 = _createContractId("counter1"); bytes32 public counter2 = _createContractId("counter2"); @@ -18,7 +18,7 @@ contract ParallelCounterDeployer is AppDeployerBase, OwnableTwoStep { creationCodeWithArgs[counter1] = abi.encodePacked(type(Counter).creationCode); creationCodeWithArgs[counter2] = abi.encodePacked(type(Counter).creationCode); _setOverrides(false, false, 1000000, fees_); - _claimOwner(msg.sender); + _initializeOwner(msg.sender); } function deployContracts(uint32 chainSlug_) external async { diff --git a/contracts/apps/payload-delivery/ContractFactoryPlug.sol b/contracts/apps/payload-delivery/ContractFactoryPlug.sol index 0f7a3742..df7a82d6 100644 --- a/contracts/apps/payload-delivery/ContractFactoryPlug.sol +++ b/contracts/apps/payload-delivery/ContractFactoryPlug.sol @@ -2,19 +2,19 @@ pragma solidity ^0.8.21; import "../../base/PlugBase.sol"; -import {OwnableTwoStep} from "../../utils/OwnableTwoStep.sol"; +import {Ownable} from "solady/auth/Ownable.sol"; import {NotSocket} from "../../common/Errors.sol"; /// @title ContractFactory /// @notice Abstract contract for deploying contracts -contract ContractFactoryPlug is PlugBase, OwnableTwoStep { +contract ContractFactoryPlug is PlugBase, Ownable { event Deployed(address addr, bytes32 salt); /// @notice Error thrown if it failed to deploy the create2 contract error DeploymentFailed(); constructor(address socket_, address owner_) PlugBase(socket_) { - _claimOwner(owner_); + _initializeOwner(owner_); } function deployContract( diff --git a/contracts/apps/payload-delivery/FeesPlug.sol b/contracts/apps/payload-delivery/FeesPlug.sol index 040a0930..ce148308 100644 --- a/contracts/apps/payload-delivery/FeesPlug.sol +++ b/contracts/apps/payload-delivery/FeesPlug.sol @@ -3,11 +3,12 @@ pragma solidity ^0.8.21; import "solmate/utils/SafeTransferLib.sol"; import "../../base/PlugBase.sol"; -import {OwnableTwoStep} from "../../utils/OwnableTwoStep.sol"; +import {Ownable} from "solady/auth/Ownable.sol"; import {ETH_ADDRESS} from "../../common/Constants.sol"; + /// @title FeesManager /// @notice Abstract contract for managing fees -contract FeesPlug is PlugBase, OwnableTwoStep { +contract FeesPlug is PlugBase, Ownable { mapping(address => uint256) public balanceOf; mapping(bytes32 => bool) public feesRedeemed; @@ -30,7 +31,7 @@ contract FeesPlug is PlugBase, OwnableTwoStep { } constructor(address socket_, address owner_) PlugBase(socket_) { - _claimOwner(owner_); + _initializeOwner(owner_); } function distributeFee( diff --git a/contracts/apps/payload-delivery/app-gateway/AuctionManager.sol b/contracts/apps/payload-delivery/app-gateway/AuctionManager.sol index d72bf380..6dd5d809 100644 --- a/contracts/apps/payload-delivery/app-gateway/AuctionManager.sol +++ b/contracts/apps/payload-delivery/app-gateway/AuctionManager.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -import {OwnableTwoStep} from "../../../utils/OwnableTwoStep.sol"; +import {Ownable} from "solady/auth/Ownable.sol"; import {SignatureVerifier} from "../../../socket/utils/SignatureVerifier.sol"; import {AddressResolverUtil} from "../../../utils/AddressResolverUtil.sol"; import {Fees, Bid, PayloadBatch} from "../../../common/Structs.sol"; @@ -12,7 +12,7 @@ import "solady/utils/Initializable.sol"; /// @title AuctionManager /// @notice Contract for managing auctions and placing bids -contract AuctionManager is AddressResolverUtil, OwnableTwoStep, IAuctionManager, Initializable { +contract AuctionManager is AddressResolverUtil, Ownable, IAuctionManager, Initializable { SignatureVerifier public signatureVerifier; uint32 public vmChainSlug; mapping(bytes32 => Bid) public winningBids; @@ -51,7 +51,7 @@ contract AuctionManager is AddressResolverUtil, OwnableTwoStep, IAuctionManager, uint64 version_ ) public reinitializer(version_) { _setAddressResolver(addressResolver_); - _claimOwner(owner_); + _initializeOwner(owner_); version = version_; vmChainSlug = vmChainSlug_; signatureVerifier = signatureVerifier_; diff --git a/contracts/apps/payload-delivery/app-gateway/DeliveryHelper.sol b/contracts/apps/payload-delivery/app-gateway/DeliveryHelper.sol index a8151dca..4ed0cbd5 100644 --- a/contracts/apps/payload-delivery/app-gateway/DeliveryHelper.sol +++ b/contracts/apps/payload-delivery/app-gateway/DeliveryHelper.sol @@ -2,14 +2,14 @@ pragma solidity ^0.8.0; import {IAppGateway} from "../../../interfaces/IAppGateway.sol"; -import {OwnableTwoStep} from "../../../utils/OwnableTwoStep.sol"; +import {Ownable} from "solady/auth/Ownable.sol"; import {Bid, PayloadBatch, Fees, PayloadDetails, FinalizeParams} from "../../../common/Structs.sol"; import {DISTRIBUTE_FEE, DEPLOY} from "../../../common/Constants.sol"; import {PromisesNotResolved} from "../../../common/Errors.sol"; import "./BatchAsync.sol"; import "solady/utils/Initializable.sol"; -contract DeliveryHelper is BatchAsync, OwnableTwoStep, Initializable { +contract DeliveryHelper is BatchAsync, Ownable, Initializable { event CallBackReverted(bytes32 asyncId_, bytes32 payloadId_); uint64 public version; @@ -32,7 +32,7 @@ contract DeliveryHelper is BatchAsync, OwnableTwoStep, Initializable { version = version_; feesManager = feesManager_; bidTimeout = bidTimeout_; - _claimOwner(owner_); + _initializeOwner(owner_); } function startBatchProcessing( diff --git a/contracts/apps/payload-delivery/app-gateway/FeesManager.sol b/contracts/apps/payload-delivery/app-gateway/FeesManager.sol index 46037e00..d153f513 100644 --- a/contracts/apps/payload-delivery/app-gateway/FeesManager.sol +++ b/contracts/apps/payload-delivery/app-gateway/FeesManager.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -import {OwnableTwoStep} from "../../../utils/OwnableTwoStep.sol"; +import {Ownable} from "solady/auth/Ownable.sol"; import {SignatureVerifier} from "../../../socket/utils/SignatureVerifier.sol"; import {AddressResolverUtil} from "../../../utils/AddressResolverUtil.sol"; import {Bid, Fees, PayloadDetails, CallType, FinalizeParams, PayloadBatch} from "../../../common/Structs.sol"; @@ -13,7 +13,7 @@ import "solady/utils/Initializable.sol"; /// @title FeesManager /// @notice Contract for managing fees -contract FeesManager is IFeesManager, AddressResolverUtil, OwnableTwoStep, Initializable { +contract FeesManager is IFeesManager, AddressResolverUtil, Ownable, Initializable { uint256 public feesCounter; mapping(uint32 => uint256) public feeCollectionGasLimit; uint64 public version; @@ -107,7 +107,7 @@ contract FeesManager is IFeesManager, AddressResolverUtil, OwnableTwoStep, Initi ) public reinitializer(version_) { version = version_; _setAddressResolver(addressResolver_); - _claimOwner(owner_); + _initializeOwner(owner_); } /// @notice Returns available (unblocked) fees for a gateway diff --git a/contracts/apps/super-token-lockable/LimitHook.sol b/contracts/apps/super-token-lockable/LimitHook.sol index aaa2dcff..375d9608 100644 --- a/contracts/apps/super-token-lockable/LimitHook.sol +++ b/contracts/apps/super-token-lockable/LimitHook.sol @@ -1,10 +1,10 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -import {OwnableTwoStep} from "../../utils/OwnableTwoStep.sol"; +import {Ownable} from "solady/auth/Ownable.sol"; import "../../base/PlugBase.sol"; -contract LimitHook is OwnableTwoStep, PlugBase { +contract LimitHook is Ownable, PlugBase { // Define any state variables or functions for the LimitHook contract here uint256 public burnLimit; uint256 public mintLimit; @@ -15,7 +15,7 @@ contract LimitHook is OwnableTwoStep, PlugBase { constructor(uint256 _burnLimit_, uint256 _mintLimit_) PlugBase(msg.sender) { burnLimit = _burnLimit_; mintLimit = _mintLimit_; - _claimOwner(msg.sender); + _initializeOwner(msg.sender); } function setLimits(uint256 _burnLimit_, uint256 _mintLimit_) external onlyOwner { @@ -36,7 +36,7 @@ contract LimitHook is OwnableTwoStep, PlugBase { address socket_, address switchboard_ ) external onlyOwner { - _claimOwner(socket_); + _initializeOwner(socket_); _connectSocket(appGateway_, socket_, switchboard_); } } diff --git a/contracts/apps/super-token-lockable/SuperTokenLockable.sol b/contracts/apps/super-token-lockable/SuperTokenLockable.sol index 1f95666b..fcc7ffdd 100644 --- a/contracts/apps/super-token-lockable/SuperTokenLockable.sol +++ b/contracts/apps/super-token-lockable/SuperTokenLockable.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.21; import "solmate/tokens/ERC20.sol"; -import {OwnableTwoStep} from "../../utils/OwnableTwoStep.sol"; +import {Ownable} from "solady/auth/Ownable.sol"; import {LimitHook} from "./LimitHook.sol"; import "../../base/PlugBase.sol"; @@ -10,7 +10,7 @@ import "../../base/PlugBase.sol"; * @title SuperToken * @notice An ERC20 contract which enables bridging a token to its sibling chains. */ -contract SuperTokenLockable is ERC20, OwnableTwoStep, PlugBase { +contract SuperTokenLockable is ERC20, Ownable, PlugBase { LimitHook public limitHook__; mapping(address => uint256) public lockedTokens; @@ -25,7 +25,7 @@ contract SuperTokenLockable is ERC20, OwnableTwoStep, PlugBase { uint256 initialSupply_ ) ERC20(name_, symbol_, decimals_) PlugBase(msg.sender) { _mint(initialSupplyHolder_, initialSupply_); - _claimOwner(msg.sender); + _initializeOwner(msg.sender); } function lockTokens(address user_, uint256 amount_) external onlySocket { @@ -64,7 +64,7 @@ contract SuperTokenLockable is ERC20, OwnableTwoStep, PlugBase { address socket_, address switchboard_ ) external onlyOwner { - _claimOwner(socket_); + _initializeOwner(socket_); _connectSocket(appGateway_, socket_, switchboard_); } } diff --git a/contracts/apps/super-token-lockable/SuperTokenLockableAppGateway.sol b/contracts/apps/super-token-lockable/SuperTokenLockableAppGateway.sol index ce282d4c..2e42ed5a 100644 --- a/contracts/apps/super-token-lockable/SuperTokenLockableAppGateway.sol +++ b/contracts/apps/super-token-lockable/SuperTokenLockableAppGateway.sol @@ -3,9 +3,9 @@ pragma solidity ^0.8.21; import "../../base/AppGatewayBase.sol"; import {ISuperToken} from "../../interfaces/ISuperToken.sol"; -import "../../utils/OwnableTwoStep.sol"; +import "solady/auth/Ownable.sol"; -contract SuperTokenLockableAppGateway is AppGatewayBase, OwnableTwoStep { +contract SuperTokenLockableAppGateway is AppGatewayBase, Ownable { uint256 public idCounter; event Bridged(bytes32 asyncId); @@ -26,7 +26,7 @@ contract SuperTokenLockableAppGateway is AppGatewayBase, OwnableTwoStep { ) AppGatewayBase(addressResolver_, auctionManager_) { addressResolver__.setContractsToGateways(deployerContract_); _setOverrides(fees_); - _claimOwner(msg.sender); + _initializeOwner(msg.sender); } function checkBalance(bytes memory data_, bytes memory returnData_) external onlyPromises { diff --git a/contracts/apps/super-token-lockable/SuperTokenLockableDeployer.sol b/contracts/apps/super-token-lockable/SuperTokenLockableDeployer.sol index fd8dfad5..04dc2202 100644 --- a/contracts/apps/super-token-lockable/SuperTokenLockableDeployer.sol +++ b/contracts/apps/super-token-lockable/SuperTokenLockableDeployer.sol @@ -4,9 +4,9 @@ pragma solidity ^0.8.21; import "./SuperTokenLockable.sol"; import "./LimitHook.sol"; import "../../base/AppDeployerBase.sol"; -import "../../utils/OwnableTwoStep.sol"; +import "solady/auth/Ownable.sol"; -contract SuperTokenLockableDeployer is AppDeployerBase, OwnableTwoStep { +contract SuperTokenLockableDeployer is AppDeployerBase, Ownable { bytes32 public superTokenLockable = _createContractId("superTokenLockable"); bytes32 public limitHook = _createContractId("limitHook"); @@ -45,7 +45,7 @@ contract SuperTokenLockableDeployer is AppDeployerBase, OwnableTwoStep { ); _setOverrides(fees_); - _claimOwner(owner_); + _initializeOwner(owner_); } function deployContracts(uint32 chainSlug_) external async { diff --git a/contracts/apps/super-token/SuperToken.sol b/contracts/apps/super-token/SuperToken.sol index 53882d81..5ec90b0c 100644 --- a/contracts/apps/super-token/SuperToken.sol +++ b/contracts/apps/super-token/SuperToken.sol @@ -2,14 +2,14 @@ pragma solidity ^0.8.21; import "solmate/tokens/ERC20.sol"; -import {OwnableTwoStep} from "../../utils/OwnableTwoStep.sol"; +import {Ownable} from "solady/auth/Ownable.sol"; import "../../base/PlugBase.sol"; /** * @title SuperToken * @notice An ERC20 contract which enables bridging a token to its sibling chains. */ -contract SuperToken is ERC20, OwnableTwoStep, PlugBase { +contract SuperToken is ERC20, Ownable, PlugBase { mapping(address => uint256) public lockedTokens; constructor( @@ -20,7 +20,7 @@ contract SuperToken is ERC20, OwnableTwoStep, PlugBase { uint256 initialSupply_ ) ERC20(name_, symbol_, decimals_) PlugBase(msg.sender) { _mint(initialSupplyHolder_, initialSupply_); - _claimOwner(msg.sender); + _initializeOwner(msg.sender); } function mint(address receiver_, uint256 amount_) external onlySocket { @@ -40,7 +40,7 @@ contract SuperToken is ERC20, OwnableTwoStep, PlugBase { address socket_, address switchboard_ ) external onlyOwner { - _claimOwner(socket_); + _initializeOwner(socket_); _connectSocket(appGateway_, socket_, switchboard_); } } diff --git a/contracts/apps/super-token/SuperTokenAppGateway.sol b/contracts/apps/super-token/SuperTokenAppGateway.sol index f51fef59..2527ab7e 100644 --- a/contracts/apps/super-token/SuperTokenAppGateway.sol +++ b/contracts/apps/super-token/SuperTokenAppGateway.sol @@ -3,9 +3,9 @@ pragma solidity ^0.8.21; import "../../base/AppGatewayBase.sol"; import "../../interfaces/ISuperToken.sol"; -import "../../utils/OwnableTwoStep.sol"; +import "solady/auth/Ownable.sol"; -contract SuperTokenAppGateway is AppGatewayBase, OwnableTwoStep { +contract SuperTokenAppGateway is AppGatewayBase, Ownable { event Transferred(bytes32 asyncId); struct TransferOrder { @@ -28,7 +28,7 @@ contract SuperTokenAppGateway is AppGatewayBase, OwnableTwoStep { // sets the fees data like max fees, chain and token for all transfers // they can be updated for each transfer as well _setOverrides(fees_); - _claimOwner(msg.sender); + _initializeOwner(msg.sender); } function transfer(bytes memory order_) external async { diff --git a/contracts/apps/super-token/SuperTokenDeployer.sol b/contracts/apps/super-token/SuperTokenDeployer.sol index 9dc3a2f4..d1e9d51e 100644 --- a/contracts/apps/super-token/SuperTokenDeployer.sol +++ b/contracts/apps/super-token/SuperTokenDeployer.sol @@ -3,9 +3,9 @@ pragma solidity ^0.8.21; import "./SuperToken.sol"; import "../../base/AppDeployerBase.sol"; -import "../../utils/OwnableTwoStep.sol"; +import "solady/auth/Ownable.sol"; -contract SuperTokenDeployer is AppDeployerBase, OwnableTwoStep { +contract SuperTokenDeployer is AppDeployerBase, Ownable { bytes32 public superToken = _createContractId("superToken"); struct ConstructorParams { string name_; @@ -23,7 +23,7 @@ contract SuperTokenDeployer is AppDeployerBase, OwnableTwoStep { ConstructorParams memory params_, Fees memory fees_ ) AppDeployerBase(addressResolver_, auctionManager_, sbType_) { - _claimOwner(owner_); + _initializeOwner(owner_); creationCodeWithArgs[superToken] = abi.encodePacked( type(SuperToken).creationCode, abi.encode( diff --git a/contracts/socket/SocketBase.sol b/contracts/socket/SocketBase.sol index cbd6b809..87d1af8b 100644 --- a/contracts/socket/SocketBase.sol +++ b/contracts/socket/SocketBase.sol @@ -36,7 +36,7 @@ abstract contract SocketBase is SocketConfig { signatureVerifier__ = ISignatureVerifier(signatureVerifier_); chainSlug = chainSlug_; version = keccak256(bytes(version_)); - _claimOwner(owner_); + _initializeOwner(owner_); } //////////////////////////////////////////////////////// diff --git a/contracts/socket/SocketBatcher.sol b/contracts/socket/SocketBatcher.sol index 7e21baf9..2ccfda5a 100644 --- a/contracts/socket/SocketBatcher.sol +++ b/contracts/socket/SocketBatcher.sol @@ -1,9 +1,9 @@ // SPDX-License-Identifier: GPL-3.0-only pragma solidity ^0.8.21; +import "solady/auth/Ownable.sol"; import "../interfaces/ISocket.sol"; import "../interfaces/ISwitchboard.sol"; -import "../utils/OwnableTwoStep.sol"; import "../libraries/RescueFundsLib.sol"; import {ExecutePayloadParams} from "../common/Structs.sol"; @@ -11,7 +11,7 @@ import {ExecutePayloadParams} from "../common/Structs.sol"; * @title SocketBatcher * @notice The SocketBatcher contract is responsible for batching payloads and transmitting them to the destination chain */ -contract SocketBatcher is OwnableTwoStep { +contract SocketBatcher is Ownable { // socket contract ISocket public immutable socket__; @@ -22,7 +22,7 @@ contract SocketBatcher is OwnableTwoStep { */ constructor(address owner_, ISocket socket_) { socket__ = socket_; - _claimOwner(owner_); + _initializeOwner(owner_); } function attestAndExecute( diff --git a/contracts/socket/switchboard/SwitchboardBase.sol b/contracts/socket/switchboard/SwitchboardBase.sol index db0160e7..d2cbf165 100644 --- a/contracts/socket/switchboard/SwitchboardBase.sol +++ b/contracts/socket/switchboard/SwitchboardBase.sol @@ -42,6 +42,6 @@ abstract contract SwitchboardBase is ISwitchboard, AccessControl { chainSlug = chainSlug_; socket__ = socket_; signatureVerifier__ = signatureVerifier_; - _claimOwner(owner_); + _initializeOwner(owner_); } } diff --git a/contracts/socket/utils/AccessControl.sol b/contracts/socket/utils/AccessControl.sol index 72c42c8f..1f050375 100644 --- a/contracts/socket/utils/AccessControl.sol +++ b/contracts/socket/utils/AccessControl.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: GPL-3.0-only pragma solidity ^0.8.21; -import "../../utils/OwnableTwoStep.sol"; +import "solady/auth/Ownable.sol"; /** * @title AccessControl @@ -9,7 +9,7 @@ import "../../utils/OwnableTwoStep.sol"; * Each role can have one or more addresses associated with it, which are granted * permission to execute functions with the onlyRole modifier. */ -abstract contract AccessControl is OwnableTwoStep { +abstract contract AccessControl is Ownable { /** * @dev A mapping of roles to a mapping of addresses to boolean values indicating whether or not they have the role. */ diff --git a/contracts/socket/utils/Hasher.sol b/contracts/socket/utils/Hasher.sol index d6c82bf2..8b5c6263 100644 --- a/contracts/socket/utils/Hasher.sol +++ b/contracts/socket/utils/Hasher.sol @@ -20,7 +20,7 @@ contract Hasher is IHasher, AccessControl { * @param owner_ The address of the owner of the contract. */ constructor(address owner_) { - _claimOwner(owner_); + _initializeOwner(owner_); _grantRole(RESCUE_ROLE, owner_); } diff --git a/contracts/socket/utils/SignatureVerifier.sol b/contracts/socket/utils/SignatureVerifier.sol index 6391bd13..96a20d13 100644 --- a/contracts/socket/utils/SignatureVerifier.sol +++ b/contracts/socket/utils/SignatureVerifier.sol @@ -27,7 +27,7 @@ contract SignatureVerifier is ISignatureVerifier, AccessControl, Initializable { */ function initialize(address owner_, uint64 version_) public reinitializer(version_) { version = version_; - _claimOwner(owner_); + _initializeOwner(owner_); _grantRole(RESCUE_ROLE, owner_); } diff --git a/contracts/utils/OwnableTwoStep.sol b/contracts/utils/OwnableTwoStep.sol deleted file mode 100644 index 78e9eb95..00000000 --- a/contracts/utils/OwnableTwoStep.sol +++ /dev/null @@ -1,73 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0-only -pragma solidity ^0.8.21; - -/** - * @title OwnableTwoStep - * @dev The OwnableTwoStep contract provides a simple way to manage ownership of a contract - * and allows for ownership to be transferred to a nominated address. - */ -abstract contract OwnableTwoStep { - address private _owner; - address private _nominee; - - error OnlyOwner(); - error OnlyNominee(); - - event OwnerNominated(address indexed nominee); - event OwnerClaimed(address indexed claimer); - - /** - * @dev Modifier that restricts access to only the contract's owner. - * Throws an error if the caller is not the owner. - */ - modifier onlyOwner() { - if (msg.sender != _owner) revert OnlyOwner(); - _; - } - - /** - * @dev Returns the current owner of the contract. - */ - function owner() external view returns (address) { - return _owner; - } - - /** - * @dev Returns the current nominee for ownership of the contract. - */ - function nominee() external view returns (address) { - return _nominee; - } - - /** - * @dev Allows the current owner to nominate a new owner for the contract. - * Throws an error if the caller is not the owner. - * Emits an `OwnerNominated` event with the address of the nominee. - */ - function nominateOwner(address nominee_) external { - if (msg.sender != _owner) revert OnlyOwner(); - _nominee = nominee_; - emit OwnerNominated(_nominee); - } - - /** - * @dev Allows the nominated owner to claim ownership of the contract. - * Throws an error if the caller is not the nominee. - * Sets the nominated owner as the new owner of the contract. - * Emits an `OwnerClaimed` event with the address of the new owner. - */ - function claimOwner() external { - if (msg.sender != _nominee) revert OnlyNominee(); - _claimOwner(msg.sender); - } - - /** - * @dev Internal function that sets the owner of the contract to the specified address - * and sets the nominee to address(0). - */ - function _claimOwner(address claimer_) internal { - _owner = claimer_; - _nominee = address(0); - emit OwnerClaimed(claimer_); - } -} diff --git a/contracts/watcherPrecompile/WatcherPrecompile.sol b/contracts/watcherPrecompile/WatcherPrecompile.sol index 32d8054f..48d7d04f 100644 --- a/contracts/watcherPrecompile/WatcherPrecompile.sol +++ b/contracts/watcherPrecompile/WatcherPrecompile.sol @@ -103,7 +103,7 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { uint64 version_ ) public reinitializer(version_) { _setAddressResolver(addressResolver_); - _claimOwner(owner_); + _initializeOwner(owner_); version = version_; maxTimeoutDelayInSeconds = 24 * 60 * 60; // 24 hours diff --git a/contracts/watcherPrecompile/WatcherPrecompileLimits.sol b/contracts/watcherPrecompile/WatcherPrecompileLimits.sol index 0dc0cc68..298f9c8c 100644 --- a/contracts/watcherPrecompile/WatcherPrecompileLimits.sol +++ b/contracts/watcherPrecompile/WatcherPrecompileLimits.sol @@ -5,13 +5,13 @@ import {Gauge} from "../utils/Gauge.sol"; import {LimitParams, UpdateLimitParams} from "../common/Structs.sol"; import {AddressResolverUtil} from "../utils/AddressResolverUtil.sol"; import "../interfaces/IWatcherPrecompile.sol"; -import {OwnableTwoStep} from "../utils/OwnableTwoStep.sol"; +import {Ownable} from "solady/auth/Ownable.sol"; import {QUERY, FINALIZE, SCHEDULE} from "../common/Constants.sol"; abstract contract WatcherPrecompileLimits is Gauge, AddressResolverUtil, - OwnableTwoStep, + Ownable, IWatcherPrecompile { /// @notice Maximum limit value for any app gateway diff --git a/test/Migration.t.sol b/test/Migration.t.sol index 394b3a5b..07c7fec0 100644 --- a/test/Migration.t.sol +++ b/test/Migration.t.sol @@ -267,11 +267,11 @@ contract MigrationTest is SetupTest { vm.startPrank(unauthorizedUser); // Try upgrading forwarder beacon - vm.expectRevert(abi.encodeWithSignature("OnlyOwner()")); + vm.expectRevert(abi.encodeWithSelector(Ownable.Unauthorized.selector)); addressResolver.setForwarderImplementation(address(newForwarderImpl)); // Try upgrading async promise beacon - vm.expectRevert(abi.encodeWithSignature("OnlyOwner()")); + vm.expectRevert(abi.encodeWithSelector(Ownable.Unauthorized.selector)); addressResolver.setAsyncPromiseImplementation(address(newAsyncPromiseImpl)); vm.stopPrank(); diff --git a/test/MockWatcherPrecompileImpl.sol b/test/MockWatcherPrecompileImpl.sol index 86ad1243..2799ec20 100644 --- a/test/MockWatcherPrecompileImpl.sol +++ b/test/MockWatcherPrecompileImpl.sol @@ -11,7 +11,7 @@ contract MockWatcherPrecompileImpl is WatcherPrecompile { uint256 maxLimit_ ) external reinitializer(2) { _setAddressResolver(addressResolver_); - _claimOwner(owner_); + _initializeOwner(owner_); maxTimeoutDelayInSeconds = 24 * 60 * 60; // 24 hours LIMIT_DECIMALS = 18; From 412ae831513da0d77d7e50a2d82470eeb640ec27 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Mon, 17 Feb 2025 18:06:18 +0400 Subject: [PATCH 017/186] fix: version bug in initialize --- contracts/AddressResolver.sol | 4 ++-- .../app-gateway/AuctionManager.sol | 7 +++---- .../app-gateway/DeliveryHelper.sol | 7 +++---- .../app-gateway/FeesManager.sol | 8 ++------ contracts/socket/utils/SignatureVerifier.sol | 4 ++-- .../watcherPrecompile/WatcherPrecompile.sol | 7 +++---- hardhat-scripts/constants/constants.ts | 1 - hardhat-scripts/deploy/1.deploy.ts | 19 ++++++++----------- test/DeliveryHelper.t.sol | 12 +++++------- test/SetupTest.t.sol | 17 +++++++---------- 10 files changed, 35 insertions(+), 51 deletions(-) diff --git a/contracts/AddressResolver.sol b/contracts/AddressResolver.sol index 064c04c8..045142cf 100644 --- a/contracts/AddressResolver.sol +++ b/contracts/AddressResolver.sol @@ -49,8 +49,8 @@ contract AddressResolver is Ownable, IAddressResolver, Initializable { /// @notice Initializer to replace constructor for upgradeable contracts /// @param owner_ The address of the contract owner - function initialize(address owner_, uint64 version_) public reinitializer(version_) { - version = version_; + function initialize(address owner_) public reinitializer(1) { + version = 1; _initializeOwner(owner_); forwarderImplementation = address(new Forwarder()); diff --git a/contracts/apps/payload-delivery/app-gateway/AuctionManager.sol b/contracts/apps/payload-delivery/app-gateway/AuctionManager.sol index 6dd5d809..0755ed34 100644 --- a/contracts/apps/payload-delivery/app-gateway/AuctionManager.sol +++ b/contracts/apps/payload-delivery/app-gateway/AuctionManager.sol @@ -47,12 +47,11 @@ contract AuctionManager is AddressResolverUtil, Ownable, IAuctionManager, Initia uint256 auctionEndDelaySeconds_, address addressResolver_, SignatureVerifier signatureVerifier_, - address owner_, - uint64 version_ - ) public reinitializer(version_) { + address owner_ + ) public reinitializer(1) { _setAddressResolver(addressResolver_); _initializeOwner(owner_); - version = version_; + version = 1; vmChainSlug = vmChainSlug_; signatureVerifier = signatureVerifier_; auctionEndDelaySeconds = auctionEndDelaySeconds_; diff --git a/contracts/apps/payload-delivery/app-gateway/DeliveryHelper.sol b/contracts/apps/payload-delivery/app-gateway/DeliveryHelper.sol index 4ed0cbd5..4ab7c8de 100644 --- a/contracts/apps/payload-delivery/app-gateway/DeliveryHelper.sol +++ b/contracts/apps/payload-delivery/app-gateway/DeliveryHelper.sol @@ -25,11 +25,10 @@ contract DeliveryHelper is BatchAsync, Ownable, Initializable { address addressResolver_, address feesManager_, address owner_, - uint256 bidTimeout_, - uint64 version_ - ) public reinitializer(version_) { + uint256 bidTimeout_ + ) public reinitializer(1) { _setAddressResolver(addressResolver_); - version = version_; + version = 1; feesManager = feesManager_; bidTimeout = bidTimeout_; _initializeOwner(owner_); diff --git a/contracts/apps/payload-delivery/app-gateway/FeesManager.sol b/contracts/apps/payload-delivery/app-gateway/FeesManager.sol index d153f513..4e6e21f2 100644 --- a/contracts/apps/payload-delivery/app-gateway/FeesManager.sol +++ b/contracts/apps/payload-delivery/app-gateway/FeesManager.sol @@ -100,12 +100,8 @@ contract FeesManager is IFeesManager, AddressResolverUtil, Ownable, Initializabl /// @notice Initializer function to replace constructor /// @param addressResolver_ The address of the address resolver /// @param owner_ The address of the owner - function initialize( - address addressResolver_, - address owner_, - uint64 version_ - ) public reinitializer(version_) { - version = version_; + function initialize(address addressResolver_, address owner_) public reinitializer(1) { + version = 1; _setAddressResolver(addressResolver_); _initializeOwner(owner_); } diff --git a/contracts/socket/utils/SignatureVerifier.sol b/contracts/socket/utils/SignatureVerifier.sol index 96a20d13..1052c07f 100644 --- a/contracts/socket/utils/SignatureVerifier.sol +++ b/contracts/socket/utils/SignatureVerifier.sol @@ -25,8 +25,8 @@ contract SignatureVerifier is ISignatureVerifier, AccessControl, Initializable { * @notice initializes and grants RESCUE_ROLE to owner. * @param owner_ The address of the owner of the contract. */ - function initialize(address owner_, uint64 version_) public reinitializer(version_) { - version = version_; + function initialize(address owner_) public reinitializer(1) { + version = 1; _initializeOwner(owner_); _grantRole(RESCUE_ROLE, owner_); } diff --git a/contracts/watcherPrecompile/WatcherPrecompile.sol b/contracts/watcherPrecompile/WatcherPrecompile.sol index 48d7d04f..9c8b0537 100644 --- a/contracts/watcherPrecompile/WatcherPrecompile.sol +++ b/contracts/watcherPrecompile/WatcherPrecompile.sol @@ -99,12 +99,11 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { function initialize( address owner_, address addressResolver_, - uint256 maxLimit_, - uint64 version_ - ) public reinitializer(version_) { + uint256 maxLimit_ + ) public reinitializer(1) { _setAddressResolver(addressResolver_); _initializeOwner(owner_); - version = version_; + version = 1; maxTimeoutDelayInSeconds = 24 * 60 * 60; // 24 hours LIMIT_DECIMALS = 18; diff --git a/hardhat-scripts/constants/constants.ts b/hardhat-scripts/constants/constants.ts index df871a12..b908f2ea 100644 --- a/hardhat-scripts/constants/constants.ts +++ b/hardhat-scripts/constants/constants.ts @@ -14,4 +14,3 @@ export const BASE_SEPOLIA_CHAIN_ID = 84532; export const EVMX_CHAIN_ID = 7625382; export const MAX_LIMIT = 100; export const BID_TIMEOUT = 1000; -export const VERSION = 1; diff --git a/hardhat-scripts/deploy/1.deploy.ts b/hardhat-scripts/deploy/1.deploy.ts index e2ed176f..c4b3e4f4 100644 --- a/hardhat-scripts/deploy/1.deploy.ts +++ b/hardhat-scripts/deploy/1.deploy.ts @@ -16,8 +16,7 @@ import { auctionEndDelaySeconds, chains } from "./config"; import { MAX_LIMIT, EVMX_CHAIN_ID, - BID_TIMEOUT, - VERSION, + BID_TIMEOUT } from "../constants/constants"; import { CORE_CONTRACTS, OffChainVMCoreContracts } from "../../src"; @@ -71,7 +70,7 @@ const main = async () => { "owner", "initialize", socketOwner, - [socketOwner, VERSION], + [socketOwner], deployUtils.signer ); @@ -219,7 +218,7 @@ const deployWatcherVMContracts = async () => { deployUtils = await deployContractWithProxy( OffChainVMCoreContracts.SignatureVerifier, `contracts/socket/utils/SignatureVerifier.sol`, - [offChainVMOwner, VERSION], + [offChainVMOwner], proxyFactory, deployUtils ); @@ -227,7 +226,7 @@ const deployWatcherVMContracts = async () => { deployUtils = await deployContractWithProxy( OffChainVMCoreContracts.AddressResolver, `contracts/AddressResolver.sol`, - [offChainVMOwner, VERSION], + [offChainVMOwner], proxyFactory, deployUtils ); @@ -240,7 +239,7 @@ const deployWatcherVMContracts = async () => { deployUtils = await deployContractWithProxy( OffChainVMCoreContracts.WatcherPrecompile, `contracts/watcherPrecompile/WatcherPrecompile.sol`, - [offChainVMOwner, addressResolver.address, MAX_LIMIT, VERSION], + [offChainVMOwner, addressResolver.address, MAX_LIMIT], proxyFactory, deployUtils ); @@ -248,7 +247,7 @@ const deployWatcherVMContracts = async () => { deployUtils = await deployContractWithProxy( OffChainVMCoreContracts.FeesManager, `contracts/apps/payload-delivery/app-gateway/FeesManager.sol`, - [addressResolver.address, offChainVMOwner, VERSION], + [addressResolver.address, offChainVMOwner], proxyFactory, deployUtils ); @@ -262,8 +261,7 @@ const deployWatcherVMContracts = async () => { addressResolver.address, feesManagerAddress, offChainVMOwner, - BID_TIMEOUT, - VERSION, + BID_TIMEOUT ], proxyFactory, deployUtils @@ -277,8 +275,7 @@ const deployWatcherVMContracts = async () => { auctionEndDelaySeconds, addressResolver.address, deployUtils.addresses[OffChainVMCoreContracts.SignatureVerifier], - offChainVMOwner, - VERSION, + offChainVMOwner ], proxyFactory, deployUtils diff --git a/test/DeliveryHelper.t.sol b/test/DeliveryHelper.t.sol index e3ba294b..133f6638 100644 --- a/test/DeliveryHelper.t.sol +++ b/test/DeliveryHelper.t.sol @@ -49,12 +49,11 @@ contract DeliveryHelperTest is SetupTest { bytes memory feesManagerData = abi.encodeWithSelector( FeesManager.initialize.selector, address(addressResolver), - owner, - version + owner ); vm.expectEmit(true, true, true, false); - emit Initialized(1); + emit Initialized(version); address feesManagerProxy = proxyFactory.deployAndCall( address(feesManagerImpl), watcherEOA, @@ -66,12 +65,11 @@ contract DeliveryHelperTest is SetupTest { address(addressResolver), address(feesManagerProxy), owner, - bidTimeout, - version + bidTimeout ); vm.expectEmit(true, true, true, false); - emit Initialized(1); + emit Initialized(version); address deliveryHelperProxy = proxyFactory.deployAndCall( address(deliveryHelperImpl), watcherEOA, @@ -88,7 +86,7 @@ contract DeliveryHelperTest is SetupTest { version ); vm.expectEmit(true, true, true, false); - emit Initialized(1); + emit Initialized(version); address auctionManagerProxy = proxyFactory.deployAndCall( address(auctionManagerImpl), watcherEOA, diff --git a/test/SetupTest.t.sol b/test/SetupTest.t.sol index f4f55018..85bf06cf 100644 --- a/test/SetupTest.t.sol +++ b/test/SetupTest.t.sol @@ -70,7 +70,7 @@ contract SetupTest is Test { function deploySocket(uint32 chainSlug_) internal returns (SocketContracts memory) { SignatureVerifier verifier = new SignatureVerifier(); - verifier.initialize(owner, version); + verifier.initialize(owner); Hasher hasher = new Hasher(owner); Socket socket = new Socket(chainSlug_, address(hasher), address(verifier), owner, "test"); @@ -113,12 +113,11 @@ contract SetupTest is Test { // Deploy and initialize proxies bytes memory signatureVerifierData = abi.encodeWithSelector( SignatureVerifier.initialize.selector, - owner, - version + owner ); vm.expectEmit(true, true, true, false); - emit Initialized(1); + emit Initialized(version); address signatureVerifierProxy = proxyFactory.deployAndCall( address(signatureVerifierImpl), watcherEOA, @@ -127,11 +126,10 @@ contract SetupTest is Test { bytes memory addressResolverData = abi.encodeWithSelector( AddressResolver.initialize.selector, - watcherEOA, - version + watcherEOA ); vm.expectEmit(true, true, true, false); - emit Initialized(1); + emit Initialized(version); address addressResolverProxy = proxyFactory.deployAndCall( address(addressResolverImpl), watcherEOA, @@ -142,11 +140,10 @@ contract SetupTest is Test { WatcherPrecompile.initialize.selector, watcherEOA, address(addressResolverProxy), - maxLimit, - version + maxLimit ); vm.expectEmit(true, true, true, false); - emit Initialized(1); + emit Initialized(version); address watcherPrecompileProxy = proxyFactory.deployAndCall( address(watcherPrecompileImpl), watcherEOA, From 56a05d0b11b6999fa58d738ae3a2e8e9b83d519a Mon Sep 17 00:00:00 2001 From: Rookmate <14072042+rookmate@users.noreply.github.com> Date: Mon, 17 Feb 2025 14:34:18 +0000 Subject: [PATCH 018/186] Remove outdated images folder --- images/architecture.png | Bin 48040 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 images/architecture.png diff --git a/images/architecture.png b/images/architecture.png deleted file mode 100644 index 60f1cf5c0e4cc7a1e027f354a573737398b1a3ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48040 zcmeFZXHb;U^DYQD!hn*Kf=Ctx0RaV(oDn1{IVnLhC^=_Ea*~{L&N&Py3P>J6G7K4p zoQ9nCjKBZgyZ7#X+S=OMy0srH3*LFp^y$;5!}D|#q^u}|k4J@vfq{YlT2@jO0|N^M z{;5K-!EZ_uRaU@%nD(kN;uvKE57sd-=rCSOioJ8u-%7=4Ad?#VN?0IE7Wz1Y;k|fA zP4H9fH}|-3`Y^>h0-(k3G2ZxO+#3rp)Fj0w)8N7&(Y;l&NX3Q8uo~bO{cgU^VEUJc z?#_xLGHqk;_;3${N6oPa@mB51@u)D#qVqN;R1^b?=#T%80fAkQ(-N)fvLdbOkNt@} zro4lUY_B!MGr*4{YyHW5-nFCZ)F&(P22QsqAaoeMy14IpU(m19VSpv*W+B>jR<2!t z3*Qb}jpX(FS(d}<;>>C+$2n$|v8=8Fa7kN+rNgL>e$D^%AGaPY8lBy3y|7usP*5g= z&_ya^LC*tT#eEb5qClfXv!%m?CqDhc=c9V|UQ|!gBhr|SbF=*p=jC~-Gs4yJ@^ruJ zdnbcBkfDJ@6y7yz|Cbtz$VW5?D%+R-sT~);ym_aoR^FI|N7z@Mqj5R@$=ke8Y5}LM zC{bSw2%YkMOo))@E${{ggq1ntS@JD{m-7`r{c-ppG1OS4I`!9%$6J$xZ<2YpAMm~S z!3v=xas=`fxPLoG%lAqC{rYgO{OlOr${4v$+gh4?FxJV|_mkU6gqZ5c^;_s==^`n8 zkH&Ot;f48WQ|9wOd@WaFqkj96noZYj?>cUd37MdfL%(iureM)y_)d_{n~NNC$13==pr2Dgz{1978OfOlg<^{qQGv zh%;C-PeP2koz2JyAyEPk|Nl4t-_Q{B9eglNXu9=cM_?LUkW!o3rrR2#7%E1?vc*ur|N0NY7v~|ev|y8dA&d{Pcg>l}>B~NZXtXyS zj8mW494$5#azj2aZx8KYY`1T}=hr$0!MZgAz4ma+pb)cG5>({WwQ zD`_mfBls;DX?VTO?3B*rcrK1_pG0T6_qA4G#$cJoudn#9K)pz-IUHy0dfAUZI{qgnl!qC?r@84-n^38dS=mZTCcs6d9H4Cbg zvsDLk{=C{OZ*!xTQxdsy7%6Jtt&v;aY=#|A^^*1`MkXJyp{6j3Nk5S(&9!-ZEB&#I z*^H8TXui}Lc4)Q!_kOPV--02$wVt&q@$#@T?Jwme`XB;_)oY!E3+(JY)F)Fa7m2mT z8|Y%U3hoc2FsF~?KnLZspc_*3TuyXbvAf7`|a1(==eKM3vEY0tsV?`D&9r94J!MK}*Q{RB)w4`x0 zDbI+fR*CN09Wh#nRF97+H~2)%x`sA7VWfkCozgwVeuwQROczOZ%NK(7Rq(>+xM*J` z3StnZ@7=6>5KkhqC%3S=fi)}T8JLr!zlaV>hxE_5r+goJ?jx#t7eXQnWEagJWMu~Ow?&~^!t z#1Nw;`a>5i2FDSL;--sy10*y)k5&JdQTl;ppuw22z8Qp2rVdd$Umzi_1FM1`$kd34 zz%rtA{*ST$SKlba_hWyO0`Sn9hfdp5w^bgPkcqu-55NW2HGiGwW1pFdB$x3Q3f@jADf`qNT{hEgCQ>OC;fqCYY^;At6%`OBO(e?=%rF`zKaIBL0MU%sF^~8- z^jlo!z>Z6WK~l3ypCD@z1-70n?0tRtrFpBW_Xo%_gd^pk&#AD89)H8|Yo)U?M(-EH z7Yi4uQFMOl$`W@qTmQo@D?!0}Qi7ACuf(8zib4wU7u?f5aG%%l&=-qN84v4zC7TXO zvv)^4(}}A4(R`NEqwSx}jr!RpMBknO!QRlw)Y1dNe*1`ie4+0xKanT)C*E0p6+hrN zY^t2?wJozD9KR5h3Fu0|gLXt5eW1CIB9|+Y3^hrj-`*8E08TL$=yrr3y+KjB$5`ff zil2O?rswZ~Gjc-cDjuNYFBZ@`1|*nXR8xTqbuDuFH8N%KWi&Nb;Ui#RwHM}s=*{`z z5~;s^)+EP65=|=jRxUu475J353m>U)(F;Gr3K)fawadLt9Q~GRK+{*00X!vLkfy>! zKYa(D1_am3eJFW=%(QAN{n! zFBt5H=-XY)b_<53U^zB%Sw)nmBtE?|H+USK*-3e8BSW5%0fL zSiZn~ar~mh(VPAqhwrQ<9fISUgDe`^ji(Vr0Dm^gKrzJf!Dyaz;M>Wn4l4TwxJ zzK943lx{+K-UexC8PTOhH|i0GJDXti^`h)M#JVBEM@ z^v}gB0dbabLzmgW<3L4B-vn@YU4K8nLs!~9N6LC5wuxjKF)u(7# ziNNuYGUx{Dhhxz5J3xWWfK6g6W(A{<)&r~xC)XvRW9nk|w32ww3@(lXA=+AOaAlcH z)Wz6}aX-AU@eDX3$0Z|)j*&MAd;ts;1MC$O{s#+vgmhTLZXjMbSkP9~QkiMt_oNMuHiSPFYPh{QTI3$9=l5jx)of z3VdrUIG>Rh=+pV0CMrE){M3@;QAr-k>xZEWgcYw_rOmsikBV;N*Da;)btYhg`E%w# zp82>R!+3p4k97)nHI9ENpC{kJdQGn^%#^RB{%eP?`fbdx@)Ra!JlGq@x)D&AETivD z;-r%n{!K@p&4C7T?)%^uT>)`+MBE<8O*<_C2?qLk8sRg%6b|-6t$| zow^pIjlYGab><@*>j?VXA9-eE>*Inub#Q=%{%Gr9Py|254_|fcMuQWVx@ZKGw$4`6#`r}!#@Ri!; z`THL}O*1d$gN3U)Ia>DG%jaCzQZ>3FXuaPUv%T&}A$gDZ6f6?mnaIbm9w*24B_krf zt$-b(E+@*jLaO*ObHQ<3ub#JnE>dAWTAt&~r04sSrOt2~cP3--D<4UJR&k8zS0)lhWOD{IIIr`hw~9;nf1tGVRro4XJzzzPE77a9N=xp`z1u*52hh^*c|pWg;FD6grT; zN66OS9GVLqN(;E}{%ko<@zpS-Gq@N3aYW3%c?!vj%^+b;W<(ZC#-2l(xSTisnxBW>=h4o2 zDBXkk%r>Xx*7A_YYM9`Ae!1WbXUM~9B4`4}=L*bQ3U;4Ii(KD|9C}Bmrszy3@YyX% zvMSu`qmJ6ad4r5{B8>GH9e^}&t%U{$%p|Pe62@G`ZxSDXfDcNqFwy%VaGgTMffdap z+>%L}!D{3Jg{x~_s4Jt=dvnEs7GmpNMr8IjtpyGM4L=zT#FDMMI4aWqA$pI<;9N#0 z0X(cMxWp*M3L`QsU()%`2QP=0DgK1S>{l?gJ*z^}Znx9yD-)0FO55g$tX&JQPq zxiU`a%fMx(Mg9_CHImGCrm#I3t`t|Ieg7p*IFb)&6Y)nb2~*5Kb>^PGs2Nx^GgCqT z=S)J(+6b1;?-muhhUXuR5Z~&?iBUtxgth*nWoWI)1v`|$M{qPV^9h#~z;5`eqCbkl z4>PnqGo0>8qfGvm(OZ`P;l9jK{>)E6Zo>W9U-1IR}$NFk!+YYeT~r!G;Ao; zKM2tk0BmbvB{}zrP|O`+T+je%klj*EEtB_!@w*DMS4j0y-}aL?;zg^3=KoohJYElT z1?cDTtn=I?xT|Jp+@>}>Cj<&aB>o(5Ve#Doks#vT>Un*(R=3l%IrVC@WU2Ltt?*}g z+x15OXN6?mT2SV^7XDRjXbmm|Fw zLo&3J0G3J9@XU%!ptk=jxL6|0oXF>OeP$}KSyH_PT#?Qg{OWjm5Zu^@mH-Bs4;z>G z<$ZHu@DFw3xCr5Ftr$oZmr*vf@0p=wd2~UuN+&FSFbO2ZD*SttJ%t1xIYO_+ccNzIZc|l z&LuE6C;MsaW=R=mM7bIP zfVmE!JrmK)@>>Qs=ka`j9+&%F=(<{`#ibGkYB^sCm(@hm7Jl<{)Vgad%xs9k7V`tp zRAsVl>m(Jgl^Lzao-d8p=|Y~AAK3I98+*BOv#Z+h2g6nTz&-nCVHty%B(Ld+ZeeB4 zC6qU9uu{KrDCh@Sbfel%e!AC`4*u?Fas2BoP$`V&y-8dQLeNWm)dX$~>|4JY^A`5g zW_o}O79*UM1os2#4~|AP3?@y}JwE~mR|igOXs7MQYxk=g_`OcdBZV!5`))0O#=1zC zdQPTo+a`lp(#+xwyc+9&Rs)l9I-WFjx5bkVe_)P7>rt`Z|C4_$rMl0NRj1gm=;l$f z)uK=+8ZjrOJl9<*0~Ndz@RP~<^=;sQ(>Jjbk@rH3t>K7K@`3%fTzpO6`SwnY^!-OrfHN&%c7LF z6*fz4+cKmMVAqipmgyvcse0Spe(NG<4krMn5(+FwN^AijtscO069AoIux%ZhDZ;_4 zbOWF$>0_W`c|C87`Hvc7QJzNRSIzZ;JLmTJ z-nalKQ2Yq`axAofi&ajCq~y>wtF;)d0w~si)5HfH9q+3np-N8xj7|d0ncA-n)B<~$ zbbr>c6fPj>TNZoGGbm`UrFCD7Gn1Y^GugWm3jloB(^nY5+pjP^V=oT`JTr;?<9}VpJW!}_`s%8ekS2}{r9cXQK!8>Hh!E? zfMw{DEh#MB5GWei1en>G*ixz6(Z(_0nOqLTf1ex}t&gkVZmNsE$)AP<31kCS?Nl+xerV`5c-TJt? zTn?3-kRbt{CPtnU6(0~-zMZg#*w3Y3n3}X7)R;xmWaZ;H;cnxSK5{V!us@D1*COy; z=`0oYwZ(Pj1H*ppWz9PqwOX!fWm6?*QitIb7|+#@q(w8s?@&D5Ll9YrEdnu*T1TjZ z08iL;haB(15CKj8^m&C58L}i}1C{(DisbuPs>|je%@?sH&t}p@Tw2w`is)An=e1w| zm`nZ%cgqUs_1($NYHp`h2eeAP3S;ru1zYn6MlalAd?pSs%h{6TjskF=~;Zer?mRfXx|ZQ`3`8 z&O7_Q7VBg^Ki#d^iG;d-#xA6bZu~rOwh*`@g_pc5z#YjZSV)`$;L_N#w04a983_W9 zhyMyS0*f&w%*N*Glk2dSq)$S-#$^Lqhq+7Y^ruX!7Id!ovx&*p(8haJ|&@V$YD!| z($FXBYV-o<-g(03I{8Zl;r9iCd(}c=*JHUjn5B`gQEZ*+gxrBNP6@!JZB-Atm3JH# zdQZ@Nqqd(2Fna5SJp4+5Q8#TPu#2g;z?CRp3@0gZ+f)1V?cpVlyFTixyrE9=Br`Hr zdci{*cYMP^8g9AM9k8$V2+8chM!kvWJ|r$G4d29+pm%Z`sT-1}W-l)O-LyE)jI3oX zA9WRKDb{my&rdix@bfZpI-<)k5^!`2Z~scxR!#~-(Pf=__A^?PACs(?`ai^YK4=1g zH3WTuz+4_%6_8OLN&`=;H7|_cwAI{-hb-_pp%1$w{Z<7^9|mS9}1K5(_P@y z_8fW59UL`|7sngB@u-mWDOpz5J(bdo&AdX7DY|@(F_P6Lb2T89m^#}&ep2t809j)stHT{lj27&5WGpA4f4Jz_aEK)*B_jp+Vp)O4OckJ9HeH* z=gB`Z5hR(`Kr^x(U+`HxjKc3&E51&8JLRF~ZaoKY_B$)E#Ub+}9X`8` zdAUE9%<}o_NbFL1ab0tVbE&h#h2C_DwqA~A7edOZ-${)%xSXWij0^0QnQl*NWO=!* z|KcU64}5=QB*SL_ql(8+aYwz+eBShWGy0o`>;QAT?&7FHd^-*ZWD}{u|7EDJSMgzq zBddyGQGL046sZK+mDzmOBB1x8B&vy~3AvLO(Q^kuR>v+OtMIzhuAT z9dis06-QPneH-!*q`=~CGs@gA<#U+g$qux`^(q~+%+-%auolp07mic+=x(v5BS>*tdR}QmC)%NZE`v)p^4&HUa_%*+Y-WFA=#PIzpke#` zNX9;f116;mHC{dKQANF34O3O-n8EgI{p7S9Ao?Bp9o6|D_bZNGd}zjCNy(Z{tKk=N z=W=R~)zfB=UZ{Z3e}W+>u_qcf%7ZsFnqIVp-s5U_$6&pAPxjG1fv-JB$72$DzIb01 z3z8)Yida#7xa**H={VsOnVmULy5f@Z%%_iz6_IxBeZRu^-!xUSCc84K?{ITIeT{?v zcvc|D_-R$$!0CU-7BOTJ)No_;XoQ+;GvqWt zVX2FH{*(m`Jbhq@O60PYY@?<_X74guKz&(p|3|uql{AKK6auP|#dMj_d;4(I`pBUC z3n-OsAGL#@F2Em`<$Cm9L0|&MnqNiXkhpL_>}%!{Qdw5@FcR=;UEj@k(MOFb`o@j8 zk9z3jnV;~vaMo9%KS83!>ZLoNHEp#L(ClULZ?Q>o!$kq5-g*yESN3o76@}Ow!}5QU z1N1P%=$(|0Yc{L+(CI@lT6_`ZJ5Y%Ddw+c1)A{8XrGNM%wlA41eGomo*?HF$l&5YV zKu?(rbDqj`CL*v)-}i5f>HDbnKePD>3%6$Fp}!u`!ubz9QA0H7fNY+%@~LM^JBH3$aK%19EAN$KozpLuNyZW9B1yj@zTfAcn%#M|v^XH1WE!j41IwIovGHJ!*>^Z~Vv9U|{hBq{p#bYr-b`HxBi~Uq(vZ=#Lvp0Yr<II0;_K#_61JR5MC3vLYAbZzW63xsE?dWmn29i2OZ(C~PU_x_30WD!dkl#pD;3HZW zIcR0K@;k}FA+|?xqMKlHAt2QObz2)SO1~4p=Q;&>TQE8@Y`X^22l z9$=Td0WGccmDc<=_yH;cbmfMv+153Qi^RF2%yYTj5!$4cd~$0dxZ@YO$e-GRU)JY+&DY%6p&~T zc?^2mr%H1EqDi=P2P0daQv|+(;BFlHNU1{KiTfC_tW$xt3Zd_6&(t$LFOwV!TYPDt zk^#WD7{W8CDw!hLmwA$P8>2dhW8YC>RkB3#i{)4K*QZpFx>JsTFINOw+4T{<2FKT( zejl*3zQd${DE6&d*@e8Hif0%DIhZBFG9g6pewAW_rk76Km;|}FM6&ci>u-?`Nhuy+ zqstcw6cjQ(r>BdjQGoaQCX6ZR^^czb91P$xp%B(b%EH2Fr*GZxz&0OYS+y#})SFvw zf#WjT6{jM4hPk+O3tR3p*oq^qDLVU@;XE#{{ufVs zzTd%wGR2Cjv21<%{!tZJErSF&mirpY#5mxNIAhSnfOS}*#^tN_?TW0rii~=|lQri= zSZjbyewKRJ3?3)pR-EznBl5R1!Lz{N_;yBVplPl^Wg2jHM-Za3!d)y3=zkhWz7v}O z`ciUI0Q2v5k?DYiMz!>|MEp~&suR{xbuF0o(MEB<&U4ckjNm+QVsaVB8%M&0wc6V^ z9G6Bvx8^ANuNsvCGp*=K6F#XW+Xi(L)|jell7Lf;nU|VUCiXq(Qnb4zt1068X_#HF zEm@$r%c8hM-`gKs0kkxAetp5Mpj)rM6i^$t%H;clu+7UvzTMokJ=-QvGNs|i3#=gyCx_%ECg~6p@IiS71!@am?@v|EYlwYn@g zS&mzyy3`e>O1`>8e3>pVz71j8YfI;`T#%V-QK=Ryb=>9mPPcr8$!d!=$&l7x@4Cb& zp^6rJ@%2>ZYfnO236Y!A*9A=9ev~eqKd9UrJo8U38O^#LQx|% z&9zKsc=bCHHou>~u_3cP?>g_rTLtzg6?6eLdmvw)ck2)`?U9a^6=E;6>1-4kV_5&z< z5q+fzMO1p*phUFkRcRTqXKKacFF)>-=JxB7Goabhw#a8-3Xvr8ldL%V`zm|Uzh3E{y@}6dr>?JK zr>=F`IGdptF5eK|D?v^+i@D=|K&t0=$&-`nqu7>swuHmOiMYwz9vNVGw9UD)sxvv9jL89g_qgB( zmhUrM{BBKg@YyBK$(x7DaR6$JN4a8uq}DF8`PF~9r4(F zb%|steD~kd-gt&-Tk3tXOTM!stKO?Rn^XjxA5~1--~56LmSo4bGr2^lCr+*Yd8Uuj ztVZq=4_Zp#5CmntE*-E(c#sK6r0NpW#UaRDS)7WeJaqJHZU+16B>oEQtL20;AQ@M} zB{d$o535L+CQX7|M@hk<*j!g1axOHIyPH%yE)ZeFde|<#NJa$binCw6a`?SMv-5tR z@%A;x_-`v>1FyqUFM7S=tHe!f9-}s?^K&Q{>Itebj$kA{ru^%+Pg$4@xf}8n-wy=V$`8zYCSiQsyk+_pjIFUSROb{0F z0ahtB%}h=i*Pnj36>J+<;x+++wMOH0zMj9DSY8jfq@es1yWo0mI{@9)yMvai7vDk$ zH3mK`w146820spVSSq!s73#y0uJ_&fOaEF-sTS! z08H-0SM@H1Re;j`*uLjOD^2fg(w9Zt9%Gu{C^5gxzDe7^bf?^PHY#=*O_@@c&d`K$ zSxr<30s5y(cmIXum~I1T;7kgmdQk;Xj=QrYK8hhB2vPWj#D}3QDRxRueUA+=7@_p6 zS{lqFRD&j{XQWc!eJ*)C&mAnMYSzbftSUQx$;WeeHYldP!rNR3=JNf?sf*g5ORAr< znso~^n!zg~@SVq%g}0qeB9+`~+Pn_u<@0~5l0fBb{}vvOH)0-bj{oCAE>6&-LGyN< z&XeRA7oE>T)KE7bKqT&c1D#&)<9`tdl&CDaf3%}MwU}%59DnfK46fd7ZFr#5`8l@x zgp2)YCr_pY&qTLve{8|A~PrFq!q8LUXd^(TK zyiIWLPRfr0mF!hC^~s6anmjD{aVP&rG&&oB@JJiV`5YpRHeR+(A;VlQIGc}E{!$lG zpzK%s%weE69bx!UfH^-ox0zYu>)pg^KolKq4d?ditv@0j9AiW-t@ByvQGp;g{E6Tf zo*U!cBAedOB!p~jM!JaiwIfj4_IjQCdm%Hd(IPc!T|jnSQazs_`5u_TiD~=>bQbvu z*Ol?0q&+txy+&>MXto?SzvK-%-*Qw>@vJuV@jVQ~}Ud>zendxPHBheK$> zH2co<#M2b;8URM#2!m`%&@&YAEq~6g)bZWFx4{?XIc`l<^2@wkoibU9QIvUuPb=)< z23F;FelBctXc3$dk@%~?<~2H13l?~0gbe$kEM1lX2~<%vh#qaSiY zD1E{3fw$p!ncmUJgf15Y2!c`71s2`tFAWzY@<)b=K9jDCEI@*05#wekIa{=7Tb04k zhy=ApD2Q-I%TJ56?ZB}_GZOx$^AjctRpDSFabv9Y^8$N2sWl&2{r>obXhWUMSN3j2 zmUd)&-+%g#*8Vj$6v;A6+Di7&e0cZh-%G9F9OXg%Nb=R_2@e2(4)C60JvLOk4e>0Q zkus47?-&@)V%5RDV*QYh;9%VV3m79 zj8Zv}-g68JM#z?Cn2x*drM{A5mNxN`3VQuu!!IMkKfWNF4WwQg%OTYvh{xduf9?M% z310o0c|#(n;aqBkT=R3Otbq;0^V~x*#GVC!LaA!sRkQfAmc!;ZNyuTKX%Z;;*!N+87AJs1`7|}ZBXQH@Nekh0UfC-6CglCuuI+~a~9uqR+P3F?Q+?n zR0zc+fGeAIBW4Xl*h?e=2@vVdbDrbqkqLL;=WeZ!uBF(A!$9W>+jqxV$MH!p8A9?c z%_NNlT-C+ zLELh#6?U{cHwUKC%)PJA@?i%(Y1Lg5>^znV6nv+O&u^IM^-;iB@+Vk7Ou&Pp@0#Wal)yg=Rd+r!7-!B z{JP1H)Db26m^3c)zD|IT*9Ma`@wn%p`KQP0>PSNX3<1C#0Be-Pu37N|O(9NlUWnc>Y|pVg1!@5>h@x?ixvDr2>i9`W6WK4eHjru!Chw}N z2VV6O2y8v07WQbU1)~JuI-3Bdz6tG)oWKqec%7_31UUws^%FqBrlu*Mzn;9$LZRnC zwt*khcOTPp)^i8#5L=)}ppw@6a_CO+Is(=_3wR-3r!7s(iHgklysa16_2T8n1$yAt z*L5uddFvGTX8&5wwOt=^?k*Su8r});T-dxD*;TKZE3k8O=pdeQ4-|OrfXl@RO+I|{ z0qTarcFXqYQndb~5ZOGy<97`@Nh-hy!xWj{;XyCwbcUG!7MMJ#;J06WN{RwhU4Ffx z_kIVZdn^2AZ7_W|XnjOcpdXC3@K{dQl?omFVLS$tGA@fA*?l01yP-g)xlou_)g{^Yj+uW!5wTPBpb-+Px3GPCqD>utjVX3A$Av zhq41T>K@95zuI^#aP;@BP^O3jQW@Q*zXb^E!+=xJ0Ar0F|A?2#(lbF~E`Sldy{TGY z$kU*`WhGXp-bN4Im}L#R&yL{|gsy}TfJ0TFc`x3XPZ9z<4NF_|{)7Zpi&Ai$uT?p> z>4BG{HsS)!d%*2oZe;PnsdJHyh2$tP8`W;;xmDnk%asJ9@crLqhDaWIzF1th(zT-*(}tIPxX9HeU!QHh{$fv^Tf4y!|i=! z1}&FizSsU{ZtMgq^b=xow!q*9L0&Uof|TVl?TRmhEd~8 z&EYoUl9_hnNxS}uj$Q!1?@Hw6OvzSC=K~ASZ$te?spbA+M;b=?8@L9AT{W1!ayN7Xb7@CCL%|K| z#h^!UH#VOS8?;PRo}@nHZF1VSaI2>CWv}!GBxT|hePx;3lh9SrTe62>cpNI7CCG?0 z9Y`_P(Ea>HBW_FIuA6zROiy67jEyoH?3<-ig% zuvnZ3AqDq7rRC_x5nlqH4UTI?MgoLIV9;z}paxq{AI>HywWy`Bi+~Abwrtl;Cn*-H zJPuZG@jhQ?5xCs@bx47t)cxekQWUEZuRc$XBl2nf2l+!HroOhDYxiV9*D6yDS2PJ( zY|z%qvPaIF6X*}-R(nHSHFR4Im)S^A+KJ=0{KXv{o?J?2N(Vl4D>zvdbtSJZmnXz> zdzSFRlEP0o?Ia&=5tc!S&wiT)4J4&0O4=smQ^Tnjj^{uat>7zs2j+gV4$wn1Ec0ge zCE`X*Ipk^CFYP+YE!A`~`AL?}%HWnS^r+ul9B*$5JvMXn0^@gkioc( zK&*_6^M-*GgF0xgrGUI|Grs&j3T%uriZ_&Ohi1e}0&mStR*jxKp)wl{fMrw6gAcG;ue zrQeG0>fvDyZ(LGYmQ?y>jIX}}xpBIw4k0XW()rU6iw%xx+c(pG<)qRoBHl;>68Hn+~NpCh?P{1?9($a z>@|7EAgW;SWL#aXHT?U#yKUhueG`A`)8xt(N({WOYAG4A-H?yvV$spATsdXq3ba$X zZV#Kknv8Fce#hboZZu51C|cto8qs8kx%Us|h=KylLI(bX{~azY>J}49+9pyxnzhzX z_>Tgsl>5&)NOASLqhOA>T8(yD>_y*xoY;iy+xr1CzelE_=Pu`A+VLQPYJHyKU+0H_ zCYjargam_hUZ%hRJ=<{%1aT{#nF=VPjqh=G6c+FQtVgcc_<7qGYl{(i$45HuFUWkm zMn+XgQCZ&*&>BuDadg^=)3_-Jw-NgwM*QtJ#+@QA^CviB=@d#M1L7c`x|6voOz8Ft zMkrn;2INIwr{s6yJCDf>FnrNbH)Er4!0%tDzXv(mGPW50duB(6v_H}e7%}Iukjmtr zdQhxTYJPY6!&|EWfi1bBujoT5a5M+sA^(ftjO{fE3K>T3F7q!Lh4t#KH7Zi%r#dA$ zbA#|GxRiRMKXe4z)h3_hrz~DU-<`>etfJ68Olv*)+rd2;^3*4W(;*q0adc-fAS3E1 zOAxk=(Lvlu zYY0+dk6j5J3wis&_aCWkTB1gEvdcWVk4P`<_tW(eanm&=RiOa$84*51l5(bc`DdMd z?1z17jX>O(Y0+4WmRTo1x79Y$vR~_~eN@~hgT(`i1$VK(w}srY zkzVA$a)CZq^wxq^1VA$OFF#|Ma-_IIw_iDK{N0zl=IVN|bcOu;G1>Yfn73^{VSGn| zI?tUH^T(b99W*;a5VOb~kYSFM8;I;`7&0${L4V}RHb`tnOLfM>MXp`I@NW-yr7&oC z0wb;QEaxWjEBN=he>b~opc)7IBaq}lm=r3!QKi72@{J=GJd>qM?c`HpH}XF4O$p;{ z8wGB86)4;+mm9=*9pn<%ovA06*OUYq8Pt`rI2{ewAZlx84}U+?dFJhVRXVBIdoWt4 z)1`m0r>5fwT4A-v*l*cZ3VfYue5%m4c`>QN@*vS!XE*^9SXDVXto$bnP(kDzfNrrV zlX$(=j)Bci7~uG)K*G9nRT_H;8gXWJK!)6A)2SqE&WCWxWH`FUWAvvqcug7Gy2T`&X{AC9>6LdyS?$vrc zWf`B9zG}_LTK?mp%%z71T(V7!4!rXVo3=shBkHaD0>u|vP6&|!y}|`~&W1i|;a9`* z_S^mAQ<+^4s(`0;cE+c*@V3?X?2^$su3LRVZ~>A}kHCz<{?XoCaX2LgJC+t4Bmt@p z5)jWPkJrp4+AljO4QjwNfGa=9DJ-YKj<=dN%MN)PEKFb^twJ~hGViF}oCyhHiFfmI zw0wzPbDMYz4gaUa!m36>%5t(Pm^;2)eM)@4LRk*)m^>qy_2t zSgt%}F_>BSl0FV5(g(+4AGyBcE&QHW+YJK5V1N9iU+Z?7^>&Gk>FW2&v() z^%&_`Qw8}rM9Q^u_x>avm=4%!xh z(QtF`KD)VU@${I@7D?#&jF!|BlkaHrK1~DV6WY8-_0|s822TPSA?_o2-W}N%vAS%l zuWCOo|A{(AH-XV}H31&aNJGytmIYbMT@I)E@)xPv&VFSY`{t!U3)2t#roc&`wKtqlMTeWaTt2oe-triz#6F{s7e*FnvcOb!~oT6;F9YKv)Hm!tH(I@T>E zN*C8z6q1%p=h;4jzfv%G@{j~o)RHwAD-uje&!>Wt8+8CUD|4`a z4V)0a6g#uqEtpEMa8L&4?G-^QbZ>FebMvaFIger-!Jq5M!!JfR<+0SUD5fAiYXST| z1?q}L+;dQ{b=Pp0l6&fb@xFcao^y~i1s(L^!CKL6ODC?Ys+#>E{X|+0MC1r@uQE^pJ?RB+zE%R7^i2}6xd zkhj}Z{j#n(zdn~KpJXjA0~c*~D!Vw$#Vml5+8fCgI91DMP%SQjxR`Sv+xJ;&8N9&X zvGjDid~pLV@FBmSu(P6y{CzdC2n4hwU-DmEmT?_-<0+%f*M^{74@q5=G#9O60 zj_pIvdN{s}BLj=S*XhIDdZRbOd=`(7w4BajJ=5epX>x*oW7xxYG?OLaYpbnv5ZKeB zSLN|n7yG7y*%7VJX6g_&n=7o5G&c4dllj_%!a{ML=`?oPVYMMQx>nA!9`Pqv-xJ@K zeC!{MXWRT*Y*X=}9%1D6?B4Yy#gHr|C7n=_RmCv%ExPE|Yc zdJVe#;JlSWU1#cMR&OE-`zcU*97wBeLK|C|ZTFh^o45;`I@s}?rIuFF?!(fl$t_yb z=^)dT_cTfZ0|Yki&-_~D%GuKaqs>zBjY-B<@;5QP8Y8RQEiu|?|0iSYn7kcLD+UE% ze#2%NkH4-eYw1aC5yGZfNGP+kBDwNyr%Rh>CY!*Fv8{L$cy#}hNasDT=b!DW8n(yP<6qTwdt zqUHgKE&D>&SFE?5s=;rWJq4frHtDBN|5V4SRx0*B;igN%x@5|M#v?N6bP>S~`e~;w zYZwzy175AlABAJJsEju2J!_}U`RNv8+X0tf7NggjWTl(u1XUNi4Rd4KrtHak1CZnw z_7q_A5v2(Li~1*pt>phv3XrY+M~dQGTYv6V->sU4osg~aKAo+KU?0RZh4l{5fZQ2Y<+`Q&%aXgc8k{2eadvi z6s%=`WLHRpx-A+aN`aDwq!1aBXJzpbq3B;FW~Gw6e_QhQ^2>dYXmzs7igAYgCoCH` z)%ywW&*CCf8WU+_hKXaGh0e!6ju$~-ts({6KY8uX-%OYP@^bp6H$DyONfCkl$e5NA zLZQP9>-rHV;0$J3#91MpzVi=ECEx;1qNl5j08e5=F12n7US8jKzY}%uePzDpA~v{L zw;tAHXuJ$y*f1&o>TKk-(`JUw zwt)n#=5a;FJx_ITGwsjbp@(4_2fiRaZTrHvW&T}FfW@H*cK(XK)A!~7LL{*Sgi4{P z$rwM|ceie#L252uEGt%$di)vLD%#qb3dY2ycxa!3OTsuR9E^k6j(? z=yQR0FGDjpL*M?j%jC;ije5UH`VYbzEB{VGjHNP}LqhzZvJk*@d>XgektVf=m8mcT z_gI(olWDZSN{w&O>d1Exk8{IY2w2#NhCjlR%{$Q^2kV8CLJ|?wyUPcu48S^UT?1T zp~^JPWsHOWBzmQ_`J%G9q<_cyfC6irh5PQR{t&S`{c-Jup3XP@JSCnqQ zYH`|YY5xUN0Eb`R0kDUgM1xJ9g9Ze&E%Ba%criB^>$yb%2Bp%e>%|8$HM-YONDDpp zOLA(1>*1oy0d{T9iwOb4gYEsgo}%Jqc4S+^*_Z9MUd-MDN8z?=$4$?lRX2?Pr!)Gr zjmAs0;Iyq^5Rm1UBTsHKgL0{Mtr0+$t{T`bCfLz^Bz!hs@Xqbs(~L|F9Gr5c-O{}a zg{~$HMCjCpIJ-WY>NdR3+-~TeYl&bzA1X3B*)`j3yJ|hT0#R6Jr~gOE;KxZ!YXVej z^Lc0S)?PSUT0}Z^kON4cx<=+e;vi%Dd&H4{^goKe205_hDTujV6PXf$FYFKQ1uaU> zZ-Qy``ck#xvA&mTNli)g$o1Pq1puEHPJ`Wo5i7N=Xm0*N0$|;ZUyfRBfPd|QC7^7= z|2OvDGbqZYTNfrt5J@74*;S+v<S%uBhG5`gwdZy{EX0A40XizfEF5cETg8;nS%lPR?oZBU| zp!+dyp7+|?;G4&~0G=KQqhgW%bqpY&QXXYZr>Hu>5OvtEVdG(q0C7h>dhllY5m3`J z+6a_|%2omn)vOUL=<1I${Zp?lK$JL^;EN{!_O3cDCuK<4lqmY6n>*$$;54W12+cKk zvyGNpw^IxNu;Cv7=`X=yOn(LK&a^84e8_1T@HQVRVAtJim~lCJ>wt^1@Y!{xbHWQT zALwJFB1d;W3UJ7I18g)Uf$>)`10j{j<|tf@jmIJAvl#U|G2qw5bE<3qSuD)n2}mX4 z#i}1EKa7jWuj@?HaswYFJi1R#@CQI-wNk*ZDTrPGRf%j4XF3-NK;T1(SpAUtoe1z% zOqS{xN5UguvGaXDo)SF;KH}Es36-zFHMOQ?LKtF%OY4~qd=9b!K1#sXlO=kA^M_w< z=y;L>4sIyuHS1S71ptO1d74zgo*)2xWpj}=~%^#tPMRpH(}NOftt;88~XS4&N=UVSHLQU7VIwm5=U z&0F2z%k92h57A3$RCl4Z888Qb3tDJ4#RkH6iA0O6AzEoudivBCEpQXa*Nfk9R*^~v z_%4-bkuBty|GpCA%2aZI2WwJZ3^F((9uD3rWHihI28eY2cENhUL^Rqc{LSJ%ZKOoxMCM{b~Y^c@0T|?|O;K^i6Oi+hS`SmkxqN z8)o3Y7e)LIxBNd~D_HfE(5g;yn~XBk%yFZ8kn4Bb=Rdx6s+wHlqRo4_)ql6v^{ zy;{)f_NFGpGr=^;~rHa0$4r|eB}o{s?6x+#CPgz8*g?z)N(%gYW>k7 zG{{cWKab$oomN;;debKhWJe9Nf~9Qx1GUK+=vlT5445YrA^(0dV-F(`M5TPA5}^PNydet)G+J@K3cE}p5q8>@t6t@ZGbsJ?uvjQ z8BoX(8O3`C&!z~L12Ogu>bA(>)8VaHm`4`{26iS|IfQAm^i{ANfzCibV>>NFEp&); zAY+#N$L+oJ96(ru54*&k^!W4^B|Mo6ShTp$%y&nMO4R~#v%k095^d;$GLCyk1x|c5 zG^0Al8r+yoYBn<5j9H%06dg<6WU?7rPCyAJl8##;<9$$#Zx5J+NI!lA4uSky z5qeQzH>F7l1dWZ^*BdOeofQQoz}R_9Cdc92=P+b=01r5Jel_(r67?+9+!@ZaVEe?TXV&HEU0No7`pa)7Rn0nv6}v9oJm(?Cj3%O|usnLZ;P=9F0n3O6p!$ z$Fcf^X5Q)h#)~xYKNLDGDj>z1JEjv%n0jzo#FmmbxX?osXb6syUxHmHQyENcSs+E- zlox9IZExF#<`HFD28*4YDA_SyFxeKQPaR^24La(#o;)jQTUaOeX1ViKtxIc**_T2$ z%Zf{(Y{HJu^yf)IS~~IP?6w6y(+(&cTO;1sxI<;rL{r=7c>7XA`B!8ywGqIjBF94X zpPKi1a1MjXK;H}6j6EIQD#2pW2~6QDF(Q@ldj=(gJ3eY(6UQgpE#+lrz!+&--Mm8l zt@pcXT~_?uMxi+xKb56#D_C;3+_YI3f!{)us%drJ+>LrUQY1`t4z4)wS;QAM8p7O>5< z%XN7Ho)J<&YdA)`ljwn8{qp(brN|C+k3y#d^qAD7?}16-F29w5Bft8;`JW+7o#>Y+ zN{ut8YA3m?QnK4XY9w%9Ye9juUp^pSSl|rEoyhUP2dT`4eUo&W!LiA;a+B{S4FMR9 zN^bhkRGD|r-`fLU(%_OD5=0eCpDk1zokWroB;I{+a6vx*dTzPJ03free-|aid9XB* zwAUb2$trC(5X2+>g8;$-un-_sO7jWSBR^A7Lw-k_*h9``mNlRGpOmuAt$d@Hm~QL^ zk_1Q9Wyq(gLL3S7V4ske#W^5GKb_0g4FzHX8lK>Jmqm7>Y{Jbr^@lCYAzhC9M5TV~ z#a<^n#aFBIg7K!JXJ+|f@<(Jb8Pe#DspDoCE+Mk!((CSqqfq`2Os^t+~zX#Q*tGkeUkpP;(Msx zyJHpC@=_d3fc3ljRvBb|ek{0GEo(o9cKg5xkdPg;8kP-Q+MgmLg=W25(*HPelssd= z2Re=XN2fe3zPP#?RW~vhGh4U7j6qxvlJp7)yn3#r8xK?$MKZu4_yalE@q0T?O@GEU zF!Su#+0|fqH_}Gznu9wmN5s%THRN-} zPwY#555g}gnduNI+Ls?`fke8C2f8x< zVWA?B{&F;Dj7@I>oS*`s$&F8<%Q_DBWFc#$pCy<*NQs*Mza>8;`lSo@Zq>4@cATBA zb{wrgC%BIfB%3ElIS0jla#-l-2_Ry5oa}Ztc)mONdGHp%71tKyqjRJDoy@!Kl1%w~ z--3=QFsI}N3xlQ~ROAb$0;DcSa();V1+j`8KRtHZo_-5xncLsHEGKfh<2@A!9=ODO z6cj(7Dcc!asAXk>yj@d!{gvx8-33*1z*T%s(4}7$W6@~9eON`u(?9XR%C0@i1V z+<`2a%B;{wBhkx+gaeOeq zkpmp9xBgNn@xLh){a?gf>0{22a>o|uU?R1Jo917$0}Kj9Yb zlKSt9c0l$dSnb`;^duajFTZ|IR0h0r+yr+FxVBXfAzSb5oyRjXXJ4!8+f@Z4UPHVr zL)Lhia0!1l;qsw>Ee`EJ7AL1g3^G20Jrl9b6^l2NhXAfZFRBr0kiEM~g)@an8a_=G zUDLIgfFnEQC$?;<7|-a9D1ioDfCk(CYVg+o)*uKX-ibY<7TvLkQzsX_{55Nb_%u~b zM~&`>j~|1}UPGd<=L4t}HS-jpeb2~nhYICCR5^ga6TT~fU7#a75rTLXV6W(GGt|nE z*ttn~g+!Xu3y3Hhp^`q;Y8+N&e2OPJGeotMD7TjN3R0FDo#>1xxU;xC|A&s9k5 z@pXdqAZjoQzXPA&aL_=7IcQbo&D1=6I(>>Ba+;mqq|-4&v?q4nkmIa@;|jA7t$a;~ z{6cJNyO+_S@Wya5L7WcT3%AJK0Lp(fapSd8{riSsj}Bg5y6fWkG@<_wYX7OI%q*O{ zP{!u{8sNRP7JIM+ij>6Hr>8IPd%oF>UbvS`otice6HtLxW1AjdLg@1MY$1f`fhym# z5P>B#kZ<)Bz(^38*j}M|`lr93!Zr{6Rf6G#c3CKb^|%9tE=C{+kG^4{B6NA`Gco`w z@8rh{FqDM>YJ%_ek2$O$<&CiTiLB?gvOL0?a{OlDO>VqCR%pWodUoe;ETG6sr< zOZR$M3FZ&uJD3d(=AAGbS{GEr87QxZOHy3$U0!f(&y=iM@y9Y_SvH#v zNb^KU>R!QWF~1!?=#8G zl5RWJP#`{4w#G^nH3y{m0;ke-z=Gh-G;fu{5sOEgs}LLQnyG}-K9OJIPNyiIDj0e4 z4z^n(!IePrX$lNif1$s`6AfU@6?CXC164g`EBEL?Tt7>8)J1#4hBmQ97aY_) zMp1EdxgM2F=HAh_)8pvYH~+XHiOqu3I)^O%j>SETs)`ad=z@_KXFme-!{6&wRP)5! z5LRlBr}Ao(J3rJ1`B}}qZechROJeKR2HGclFK#ZFgag>aXtg?H;J7U5sZYs&c~orYsR*8n=(kK16i zcz@rcA#OyNy{_(^mnGQ_Vp8rZS0h2Yb zU~UO6Szf8sf(`|g#ulocb2jVWU3E9kU8vlhu%k;V+sUlpdg$ES8a*X~^qXy?MCBnEWPz z4KY8Bq2c6 zLGBY1(lB5iXjo^Ssr}i(&TW03M6<08&P_^4)+GgBOFyvMyLQQ)ZCfD!_I zPO{=$c6Ee?@I)IVcSN&#OZ5ZZ+nA$7imEZNyPr<-3{Xov=F{q*E;O+NVUw?H&5G92 zEpx`aO-cqpu8@zyEp*Fzg`W-Ucv4u5FXRobY*m+Jrl>ekCzD)#>h9_P#lmoW*7#v^ zGX7O`Tol%0qI2XpWUlinE+}R@hc5G~bcI9sc%W$F-W2@4WGdt;ZA8cT@Vp{R>evFC zQpom^4w_>waiyIcL~UP+wLXo9+^@D+0+pKG7~Oiq8)kdb~$Z^P>LFlR@#{8l{F zc1o!?w3wjgOvweA$oj-0uK+l}64`P3Li`VXdG27B7l z7u%vR`l9XoNELomJrBHi@wVX!mmyzGE?Yxc0&CVNE%Iw5!I%z{)roV~P+1N6lqbdX zy)~eZ)|>LqM7^Q~!_-JA>t~NSiH$gCpK$%VBs%dPP5{<_2=G7F_W!sJ|0jM>B**5& zqspAC>QT|kYmigByKhYU;24*|{YRf{g1-*!{K6H)1MZo&3BhLU@X=}UwfmcQS93%v z4ItGK>2t3k=5R+QQGZxy^_Y02FJv4J2leLdm8DJ10VY4I?-Tn@yu90gxnw{i)Zzfx zGa1Iu3x1*iYe?64BueI4(v5Y3yy@GmdN!?J_<3O--Yiz>%zO}4`IOiwvq^RC-=5~- zUz@K$k?4v8GQI#8e^luT@d6?*_h}I?;l*Fm<(whpeY-BA{=M)xu}Tw&R|Cus+yfU9 zHf_RATjnAhAYEz38lnw+4r^E1q7B_}af!+yTU(145XZFpL+#q544_dfuEkVJ8*Z;WEh`R3|NR& z#sQ@SgYfK=4nHl?%XxVJ*|jSk$as;XCsYf&B;RI{wG>_9R{E&&55%j)`Akt%uek5w5Sz3J3{&b z6Bo)IuR%Sb$rd@U!_E1(fe=q~`kN1TF?330ks&`J1`F_@`?TAps8E>sR1_x3mj7rc zr3t^b4SvhM(&1WYkgzC|Gh{kgW?}%FNSLA{@dq!uKC+PQ-!41`cOL|#Id{hzbkLoC zp}uW?{cGYAYzBY_-T;oXg<@dCl?E@Ef2Q=yiDhe`UK!%#~oe2b8uH7)iE9N=G0BN>V@YRnK%M< zxC1S-3AZRZi>jKSNuCy%>4wK4+aVQNb%0$ZeW6lx?5FM1;7GWe4)F@O8w$Go$V?Qt zmh}#Q-744`sOiV8TEat|ok2NZIEb)<(871+!ARu{?Haxr^pDtz>mA=;0qyUAQ?gW{ zu7K!Qw*31Om;9IJy)34Ht#l?7oogtIu7*^nz=jM8)_F$@0&d8Kf@f%xWj~dZo=ocZ-bW4(-4&l>D4yk*r|0xb7g_=R(D#xq^JST4KHATrrAii`m;s23 z{~IAG2TbU;du9q37uQkhG}kkR?u~BoU(ih+t=|$Yi!H0mW-F_ItydBTQ}q03ScF8a z8JD8T9<&_Usr>bV60VgaE&u_GH)Q`#PKOL(C`kBl(<(R_M;ZGsK!8E&L4+)J6aTH15MCVW-%37;|L>Lf>u=X?7Cs-mZNxhDLNVBUL&WvgSeQH!>8oa5 zs4Jfd5wj8LjgAN{xy@{SsZpc4JV9}(dOaP-`f!iPkh zia2bG<{#MBZ-8(E6rq{dL;a2v2V<$S{~gAnRsv!K4AQZDN&sC4uy>h509)<~JKb=z zyy#nXAT8sK^t_MHA8C&|Kf7~uw?{id@##8;PUn|G?d$iS-A(je=gN_~!}u|mH~*dX zYk=|P8Mdyb$#O$3>$v$cv+~TsAK_lMgTh!MrX1u3>T^zt1Iz5>9Ns8#u31F{ry6lk zD-b>26n?0K8O!LW1D1hHJqCHxth^@lps1sjP^CiSaB5T||S!y~46-&b;t?@M{HW0-?V< zbH#!k@JERc#DiJ!=<#Z)TUhak@z1GS2=PjP?&y^b5xc~M0=?fV=4J_(mjp&d70Hqx zPW_IPV3~=yI7KkGjAW4?PYF-^?{47P!`B_0oBmvpj& zFM#iotg*R)S4$%=>hCK5VxaXvG}shh{o3F{ioY0M&~{361dtzT`C9n;lhahag3ESzzRmUG&3`Ngq?-A5sv~_ofUc8728hRC|^XTG0nL?R85*WqL5N z14jrgJRg>pYP|7D8}v;X#sOy33SJDMHcg8gp68o3s5<8ttnLe)@{A_!S7|<_uNf7g z0>NiDX)gC@6H&=tfnQe~L20X2#LViP0C7LC8u5io`PI~<__!g*Bnak0$2I+}qsYng zmbkY_2(9=us~$hX1YFka<58+5U~6_iGJNajzP+Kn+l<$&MvZ=mCypoC-5-y*_PI!7 zG<~?87b>lY7`2;Weq4+V#}{Z9(xs&LB7X|zpk@VhtNkVUYfhps5jfq7wpH7FTJbb( zpxo2e34KEbdUa1G67%JjB6zgFYJ)DBdp8+BGrPML%Da}5VWT*Z;mnY=p}6EO1BL|> zE9L~K#gPWCD{zyDE?V8ZPsAA&ObR@$z*7}2Pf87FrB#?CSs)i4g7DQft1p3)UQik7 zfmtusD2=;FySr{H&}%L4uJTT;4OC8LQsp>=VK}Gpwr($-=&b8$bI5C zW;lzc-!oFu5U7`oo?116e2JGROx~Ikr=R;%nu7tD?~k9|c#8T#^wct=wr_ovs1-Ze z|3>RBGIDYV9Zj2fq2q-G{X`_>q=pP8{dUKH(AuA4C&pU7CMeObAr0@-GN(R}qU0Rk zC=Ge$O0;UlNTVoETB|G{HZQ2_rwMfYoand2jhOe2WKDUTBM=`_&(bWF6&25Q`0?V7 zuoJ7M0Ck~hAJGNRq1_M4orli`l*68#l6JRNbg7Gl$>(yiD_Rz&7{bEkF{JODSL3b6 z1y`SKR?_ER@1#k1dq)CzD1{(VK|T!h@Y{zkitHZ1M+^_%lQ!WGQoR58_6~u?i*R`& zoSJ+d%CDd%CBv!74Gu+TJdgk4(0DhrdpUM9p)%&kE9#zI*dasqAZmWNqj66Xr} zw6Wck`EC9t0qwzk%9|9ytO?y9GAVS9o-WHS10I4TKl(R=%3}Qz?WfeK7t#KPWmiS> ztPPH^Z%^9;`6T)Dr<%T4@3jdAwSJ&WgZW$&cbu%k6k5Xy->il6Oz7J^dU5ALY^cCJFY%csajz;&Kaz)~y`+${dnn^f*S+6u2MpE@XK zRJ-yUO|A9s{B&Rdm0d$56O;O@a!?2LtP9$2{b-tG@1k?01`AWw0IWm1TKfSoqNTla zeroIi{jbfMd(AWiOi_c8Eu^3y2`F6*GhmL$+7zrx{7GM)CWid zI!O!`gl5@85?4m&rBx67upP09fnQs@F^ki|pbs zSLvaa?xJAVr@>xu=p8MQ(|9Yqn3P+G6z!)sb0r*u@qTxqI+*c-5@}nzSC+pPVfY`i z#cZW1p_gm#yfe-RRUb#7xfozB`M*cOq1QyDhhNAzKW-)BMCz3521$P_{X~~FKs7Kp zvF|qEpFvp!lb|fJ6hzi{Dl2?Qab<(blr1PnB50F99j6@vSkj=d&OvY}i3sD(4v8Dn zPs8Tf&+(%)gQR-b@d?;|6=LGG{Of!6Wisip{e_Izm0AJ zGqSPr+w-l+G1bJCPzwpr%pLR9e(D4KXbrg#)^eZs|D+|!G`X5(`3h$C) z9+Apkbs_;S2<(v4M5y{$w=EKjAo z+QL%+HuODgF2TI=U^9nG5@X3Q{YEyZPB@ zP`3u1p~y--!%_?X83WsDff~0H)F)!c<>>Bf?qJpAPb3$^)$djKoeZ7!Et#+um2312 z;Kho2bLyMa;^}Y-1CRMe{e6FXf(Y{wfo*q(e~Ia={Wk49lE*5_*@qwx5&JmY`SI1) zm2?hgU!U#nh19Y-kAXQaBmdtaW4)Eu=4Tss8nY#SKcVWSA`h~Zelw1q^O|#=8447V zM7|ifrkvlp6QR*qY0>v=L*h;CKq-xmRJA<_+ke}k<~Kcy^X}wk2dVc%136p9jh$p0@;c(1x&SW;7hs*gD+vL=2W^ z@ldD~CpO0ipj~458nVkgn2sY>Rsz1hWjcEKXRQp$2j-x~l<1<}p z7P{}$4?e%azrgFGsI@Wej4x6bufnh{s&ruBv@Kaz##$}g9tiRDA*X4592>! zklM;vi7(VMCD%Px;kNd5INF^e6q5N8=ljNOoEQj&hf6x3x3v6ft`>$(_schoSI)h;rNsVWOvmVj?hGZ{Yct!Ym#ZoFm zd(R?Yx*TYQ&7bM$))Kr}WHV;ca`zZd2ya%LJXdMGiQ0+OYAl)u`I}AVTc2bpg6;FI z3`k{xg@C3^xkYQrNk8(tR}@7PWF#Ezaz~grOgRi>ro?A3{ksKRQ4x8rV&I~@z4YKP zHuNr1;zrK7ZSObFGsAw@{D7|HigEL0MaVy>T$oAh7*HZ=;kS(i-I0v(aZ=`{LHDN$`{87sN(tNl!rRchd&l8|` zl^A?$np~=hgs5b3k%Rc+U5@5NI>=`Y@>@*~T*NEDEH^BD zPI3f1I4gZ{YKDC2K`?Dw37QfscYA z#Ft7Bv8=((PL^hV)(pQ47>9ggVC5c64B{*X+JVu5U0h7V|%%{^x@^%j7?A`MgitiKTTmoDOHaRzDsP%RjX<%A0ji|ZX zLHw%J5E7lKzG=SoL*E&xBx>bEf{c|hi6^0{4d4E_S8QEO0TL*z znVE0LIi;=J*0Of)&`nxCtvv^(tfy_mU!;e zKSA%*rzLr9;$%CXv1;2UcI8Jh{{cW}7ODjiR_=(Bsr!N5$k`D&?I>`0ks+$n9B|Fh z6Ya+veYlZ&{i2#*F-JJ`{>d5}mf%A;lsn0n*tG2dn1|MH`?>um2*bKvd}QS(HAVL5 z!(DzSPGoaiQKtsS;&7|3CH-@W8^SRj(jT8}Yrr0WGNj4uYCw$fO$U^eQs^fDT6{O+ zM&mWuRXve#v(()kYwgFIFyqiDnf=`#n5Z?_N`iF5%jFHQ^_d)B!;h5-C84ey%jKq5 zhGFyMxAw$W**aQ1w%E4bxiPG7JXaimrUKmz46st#iX{`{r>;zS?>^oPj5H!pXJ2e< z%_K{k`SwR*I&3LC@o8jC{ydU=<*OZ=a(wA+`shO7#Tf~otK^NLwdstXt}80CE(>_F z$CGc*cgn!7JzIOOC$TlTW_3qtqC3dc5$XTP1yGwEZW4t+uqR==Pw_m2wqZL`I*OlPXfzlT`?`9EC{vBFbbPK)6inrSg9df zJP2Do7V&-g1v*`~uf&YTujWaek0vHjEO+41M7VX3rs}2|_sO>nyW2|7<5xrEjn@5X zP_i)$kM&hppyu@q{syH{*Jqq=hjklu^LDg8tIuVhxlNpNR{!y1YWk_N9V%P|ap^p? z{I0&x!X2FHHa#Vof2i}y=U_?M7dap&!sv~xW1TqJjl9|(@2X1m{{7m{vu$n8>9+{h zkgzXKW(ak*d5Ne#Lii)=dO4A7112#vO8YHLFD+Xt%QRY8{rAH~O~gAX>AZh;7@Eb$ z-;3!YR3cd(nS#COL~6OT8VkB&+l3d?R!ppcr_m3mg-U0ReL@FNjCvDMkf6awx!$FB zk*j`+7pgYs_H?Ld7L!|$9ebyZH7nHq0Wa5g2|3Ix!QJL1`tQZJ3+u!(Z3Ssi0{G7Y47%VCAdJ`{Dt?arD?SSPtwd@EC#Y`iiI-c>#GCVu`3p_Jjp;))`RTp-X zW8Z~AYwJoUIFPIq$Bmz!s&0;aKs|_oeemOJPMnY=?JI$BA}^+fQm1=^uykFl^}^Gc zu9T&9TVBr#%LSX$Fl0iq4Rrkt`TX_s31^pYM4Plg)g026bF_k5p!QVIwYgV}iimYv znqQwTy7^Ub8*{uELugw)eciSUX9hinI&yX zqVL3{_>BO@$9;{t2h@H)I+z|G?KhygkeI}M*`zKd>B04=wb2Y#=-m^u04}WS(qWuq z|MmBS8#l6`bO_jn7ymOU%!+fg@=8~e6utXKK&)EXc1Ybqzhch5dGR~jSd*%u<8lAN z%|WgQdr9#R>^J3O0(NcHT3@qib*AYkJ@7!f`>g-eF=~93OLr~n93wLcQ{bAF^0>ju zBzL2oXVZ+q-jpbCkZtEZM#wBX?W?|ZMH^R_;(&gB>| z-O+^>FDe4ELtALoJ{)l*QobuHP^{=y_>s@x5t9- zo~U7H?6KV**?-owDfV6}1E<_MKN-hiED&oU4a6|4k13|H6wlnX%QL&UPG6^K=p$!& z+;0C8R!_2cR4VbJ?b3N=hy>AId%yBy2E)(%g4VRl{|WvaY>=j7r0{*$ug7W zo_n`w-(pRG({pKU;`2y{q4gyT-?}XcjE_gkXqFTFJpu67M6&%Y0SgGWC{Q)Gk>kf8 zS627Cer$I@(wsh7IfuN@B7^8FKcuClf z|6GXPfb4BTlv%u|!^D?~y|>Yn9i`?C#HwP&lqySgypqN9teZi-@|pgJ$!W+|Ni(

aiDmSSjsD=qEP z8Ye&h!rgzs$>%7MMp=5-62?(lpBwMF=(+Vl*}x`CVyb);ylEBV_o7&=-^Z$Y!ZVfb zDsVB7DsPxoKWa{C;B6Tfg2hTuT`Ho%e7gBbf0e|X)1JxCOwS&j@zRf5Mf~oWi=v4J zG$?3s*0C?a2;i;g1lVr}&1j>~Fh%B2vYE->>#>UQ&rv zASP7LggW<(c^J*KJ9l+m{nF;41q&7tVpQGpmcKEj44z_J{3v|_oTG_O6>ZtsPEeliU%2-c_5qeX! z1Eb0k)~Jr4L4SHgpKZLAq zXGKEgl$;f^n863K54W2+6=CP8*OU{_)WfoUk0QlEjD}`2z4kBHj%f)q*7{Wtagrt0_1mS>3qE;{UL zzqxn4_%3`!EEinOBJ_*V!(fbiwg_uvJ16AUIkoX}C4!>1u>I+{wE||m_O&Qr&f2Od z4iJ_%;zwQ}(H}ONs6cP;sfwwllFyjb^$5VdSy6-Th0niNC~q!&LeianHte+3#DXh40E&338#HX6gr1)OTo5@NaHwGe=a|PCp^Rg2VXXW~vX-3`w3* z7v7UyIp-=tN*x^mIXQT#Rmz*@1h&f}--ZP&eznw}*eiF#&{{U z0U><;?ZUV6kRkk#r#UfpD;f+q5HeobqcNdxeTRn#-sBUJ@W(QTuc`eU<(dnX5xj$Z zDSK>6A{bxn9JsKU{*#TK=_$HCgKm_rpYEOV=WbzqOD=h3<*AzRFTXI8hN58r$=#L$poT?CAE z8TF0U?NDypp51r6qtFb{I_Y=YzPM=aSsG;Q3$p-!E$3M|IZ5y1xb~yACwGx|zr8*e z$!1a1`Z8O;C$;G^zcwzpXc%@ewlo0FFnPRbr;h!N;vJ=O-&pL12)c}vye(hRYzVgT z-!!jTu1d}6(3C+$?f9K^{S?&fIrpv}sAMi{Jh&z9I2#PB{q3&wa|}YtU1|@ zvP>0F*%6&y*-6jIQ(b5{m>Isy;EG@wKPgIYj%Yj5mtOf;ONM<_MaZ-w?ntt6uOxqul#n7OM9l+dl)2Xoi|S}u zXxweDpUtbN#qx%Ot{=(c$5a$-VSi}nJH{mD zzagLXI(zbb)|JQ1b11#`q<=}WRG(?*^xM^rL>n{?e1~ctnp*XFk?uz{y%6uSx<5#< zRiTOb%%4HACZ4i2Z-&qL$Go!1&%U+t(xPm1oxkpNgE3F*$a0|{#ZC0QtJ9(8wH>##Sz_|l`3u5$`Z}n!`5GH#qA?tc-9*^@axWi8?XX45Z3WJF=Zgp<#?%G zU`Lh3+lbmq=d)kX4TW90-qe*AmB<%E!pDM&Q1xSjS2Ifl{5jYa<7glQeU?Tt&vxZk z7-()Hp$v8r7jqKGjnu*Dx{i{`6=Z#JP`IiU*Ty7X!m~Tjy8`{0ST=D*t)|RZP3|BE zQ7d#>j=QR*Sd$8S@8NFM`Il4NVQxT?@tB>2L@kaeJbW;TI>kf2nDhnMf`QWd!m;1E zb~#jZ@Mu+3+j?fNm|u_0-<6s1`NBLWasVX4s3jYKg{)&1E-kGhqv(eAhEM4e%j&%; zGNG>xGu>P1=#90`&MfIMF|FRSF{wGwwtBDRwb0(u>TQtpw#AOj4S~k&v5RhF`@hB$ z?=W@mWgwU|@J9110J-L&dg;~Jq5Rq*QNcwP#M-R~mjN-swvU;~RMhS`-* zPM0(?jM>=TNw1j7nuEy@P2oHknfW%mc1!5ejB~T%RRqaOWZl9S`>JiD>RpM(%XOpK z@k*xovNns zjT_+gja}-Aks!{56`xbHy8y<;q5sxe9>BQVb#}2+)uTNXo%q2^j5XVZ>b}yWfeWb-3fnsVkAZz2HM2I3 z9q|`Z{>l37!bC?51KB@pKK=5UPIqKXdTaaE0GZu4()wgubX|!!jF{~GPD9ES!$7|r zas+spr^~CwxPUqQ#9_kZweZe(i6AGkF%lC8ns^ECZl!K zBpsA`k>2!|1-ZP3n84*rgi$me{k*z65^7?yCHrzAi+Ee~s2M-)>O{RfYoZGj@2UrR ziP1WaVu{j-9h9+DTGx=-+BPh*7;#V9PGK70==;_x?^KrvwR!nrd0<@%ydgB%@Tqgd z4pILlek4AI- z&@T%)qN^4>L7=4%KPZ#ye6{!7Nf4Y_!(x4oB45o{h+#1PT)=-as7g$eRIZoJ?2`9v zA=gjR_3kyMx?ef|9F#*&ajs7ths-JElyn}&Lup3PnR}Z<$JQ$Uk_DdkxPC20-iTRX zgVM%Wy*qvw$iMCUH8olB@o;0CZA!&P&{y4 zZV~T@W#MA{Y!F=Wn(yWSeH)sYOzAw|#t4YnG-(kVR6_om)bLOX1{@9^7ky|rys@Vj zZlmNhci#x5r^A6Pr3Y-0VG7n&S|K#o6VHIuuZJ5lzg4b<*~&%_GO-Zf+`mm=?fL+Q zN}VqKcPqVzhA%$7<3!RE+}(S|y`W*SjPG_4+2G1FswZ^C#S65N_y5y|-G{;B;MV|l zdTp%gNzWfQbTWO2@SZpL!FB(z>>Y&cl}*^A*zDm0t^S>^d=6^Te$n-lBF61k$? zA^&A@t8AuMwSc+P^67UjP9&DGeXmqS7it#u#;Qf5$Ykly*tWwE7`Pn8o{UJWf^rQ9|-y-c&vx~-tPQubFr{+$S zcJl3xoztVC`(1~r_scB8Fl;YB`kjj<^{uj%Q-1W{awbM|u_dbPtczk|_=J{9sk>d9 zy~n)7sptf95mMWEh)-v6&27+x#+Lc_4N)N9AC77Z(|W<}ySo3IwK-#qCSEhw^HCvgaW znfJiP$~ngORKs!d;P!M4hI1vk#i#pZ71w~E1^?sL1pUlmMU8dSKfa6W`SkCQCY;2FrdJzgk9rd%G&xc&)cU z6fiKoFo~7Up9*=KtqD%7Y$E=eE4G8xUzOrcvybZEL=$4KJZvAFrrye-NqZDHUx5g+ zK-s|57%jId3kM$|#H=p@_T8ROddcAM7LTS?0e-unp8PY{ldpR?Jo9jC^gTU3bR*BX z{0vl8{^A0WCcQ=YOY-pfPH$;D@myRPEHlooGw5BjTn>67AD{!PRb zheKh9%J=cU?*&R?`eMS+NLotO$`wrk&RH`C7gg)A9y;Z{?{B|B%xz@ER#G4jf)iv(|#+n=!(P|CLndGIsDI;o%IkOgg9Cpa7xcLcV8WaFoRWws)_@#+U zsn+JBxRDEe>ER0PY&EFKFHhy*8K$!F(3!pJft|&&$d?Z?F1O{FwD8*GH~nYsi~Azf zyTMT#gI(R=M&{$@Y5>OPZ|r0|b15BYpt`29c`1uNd<&%ExUQ#nNz8(rxyR&rsm~88 z5m3zQ!-@%K;NhcQ#awOqXFgAj(%hEw>uc{K5sjFKrL~JU8j+`6g$>vcpY=l>pOdcz zf{Ngcj56&i6HfutQ>OVq_u^#fOKN4y-(F z)^^`a=g;wM4)|Ziedk|OP1kM$2;rtTLFo`c1SujVbb_Er6A%SKrD+7EBM@p3kRrV! z5I~TsRB1{_=_Vi|(tGc{!#nYQ&hL58`3FwE&7R5LYu2n;Ywc^UnJt^up=7bji8!{7 zV)`!q`lcLsw!j|gPt=qccO@-6B=7(G3j=h5d7R$DkP0q#I$oXv@)m0CwkN!D@4~m<) zU%9q*t$T&?y=9(iwPQ9XER!9f3_{fw(2{cbM=m*yHz`>bmE^ALe=N*a%OT@FyMX7qf-sI?HopmdBxTQxTpV!oNA} z%gm2s6GS?#c=Us`QCzeemP69b~dP`JvX;4_F~IEA9x$38kMDb02)siW0oZMS}vN*NK1zH zcuE%3THiX`q>0#~v2Qh~Cm^qH%}RE&nx(fqUtD-=&GpkGEcJ#J_;6I4tznMVAd~OM z!b`z-$vZClg$~E391pw+UoN;;AXBouxO_3V=R?yrgH7 z@CcD@7V*YL>M5EnC{(+B=?&j(9fw~XwVbYa|48j^)o_}jkuWyoDMx}*g-`kzCi=N zrXqplx(is;#DONw0T?Af8b9`bQS_-5Qxe=WZ{yW3#6%!G2IKKybPh?Qy7OS zqadD8_wRQ0f{=)iE@*1hfj2p309revAHg9J05r%wArTz@fAL?826o5j=kTnx-vdSx`F0t_Vrg9)h~R^1?=ZS=vW0E z!G6|99qwuh66|csuFv$KbsX|=h;EPF7N_j=7}~gW^KNwX@vG3PoDv9xm0#ng%00ox zQ6h|Ao7CR;@{qjM%Ms{amM_naPsWmN3IkL==63WYTWMco9)%qH*Lmx668Thr2{z#)#hC zDGDdd7?1Tg{txLhBZpYp1MOF^Fku`?<308ql5wkB!x}#uNH-qxtX5scw7nGBX2rCv z=AGJwOjyN}th*C6mb->J{1THWDu&fLGF0Ek^t!1}C8xAHy{~(!#v0?^2b~|ji6v2} z$)@+1ue$D9FJIMML^^SE_E0XZh!etn#=k#gYOQd1+aYZ|sK`U`+K+Qso7uRtfF zTsOdPQm?|%T<%UOJO;&B-=NNPtL}US@u?zyD+FP)%cYU13(EfnKNx^tr?Vqid>wr?+&|R8IR%&9<T@**ehyqq5sqbdgW;HqO5k2fe7?mz>~iC>Y>FCKotI zCMS?y_%zocQ2P?+kZ(1kvZ!ZacRDt|zm{&{a3Zee2hDJmdiF|ZqD<&p z32fpBAud~-%Mi0*x|{}Fg=MHdQ%&<&=liUU0*#z8u^?=|c;9Lq>)9&1oZ2&e{kQpo z(m0!=g*a2mqU<1IGb`-d*HjQ}X)$(ck|{ol$6>m?qx>P8-d6yTp^2{T5SskY*Q^sT3=?|-aRK(Y@xAsd=%!=)=3ix{`F6h%%pPhyD znXnu0bJ2Nht3F-oP8VBG9OwLcIN~ptJiw2lvQPt5RzxH*Ua0k(l6)JV71dmev_AQ1 z!d^w(>Wbplu~e-z=kdJ9E&?nPrH_dm=E)0l}x{1 zXcj$c^pCva`NyT0Ecf%(Cw9xsLmX~g#iRz}!HwCXbDs{DhSjpx)_&gTd{Ea)&=aNX z&CrFUgIn&9-3JV!hosvo=vWSa|B+K&krOHE;wr1lV)lau9Z(Pn*pv;JxM|f%T*Rc< z?uTgjIDCXD+tI-jYSLX*BTORl}VQv5lkF;kSj-R1S+ z+e9VLX+(JHH7n=N83BYVfgd`K*?8|7cG5y2^9ux2MsNq+$$OT_Mm8ep@T0t^gP*EA zc2*Lo(0Rt+Aw*%g#6hR7;q_J58|(TJP9f}>iM~mk5#n1k+h%u&xuaf#DDftMHkghG z@G)ha&mVgJdO4Eu#c7eaayd?P?iAtM(V1ws^d~r|KkKo@tp#h^!=M`TOA_Z|WZ7^E zKS~gxUOb2SC2{vS@5FJwcbcb$|#2(Fwl7klwc8O8)0&VTLCA$G7S#!?*uZn z9(|xPaI>?sys8vXZZlqouB1raGw;Er(p+hKNVLa!(1rDWAIA~Om6As__fJKwyG6NL zGruJe2;uBl@!d!>mAD(+69mu5%(Y0zO)E*_Auo1_Rk~l?a8z>SIbCwp|31gZYUdh{ z5L4&a@Oc^U7d7?GpG@J`GEoDwoF8Z)qS)Y4Uw3Ha5G@fF1g3StR2wZ=02x$(9^DQ# z9Jrc0=J{1jz9Rw!l zDw69CY-ID>XB2=w9CP09jv0mPwe2gVeRWwqYPdL#Ml<+CBO>_r0>;GOowN*3nsA*> zUVCn%4RgnUF(BhAAm^raCHX?>QH*~a@A^^Bw`0ro{DE8XQxjXmXSsD(4ev#G3%=n+ zICjq9=Rcj#4#YndiW@#EY$(ki9!-m6V|M*IpZTPT*24mR-fo-CSmHZFnq)%`R$FMbbDXGNIz=1=X-HjGz0PCsEi8~bc`?DW)g zzkVX>LG$|*yayv=rf#eL*`$vZQ;BainTGB^ei%Xm274Yt2QoI;O_(2`^U{??-(w;a z89_=`+{8r!b~Dlvfrq0L@1vfx8G6KctL?xPndj}}H6M|B)ZFVxD z%1i?IBgrd&B|vg90W%3F|Jy16$Q>C~nq5F>#l;0$5feSM_}lJ3nShNd3`k2W3aX}` z>h7uod6K{?BBwKPq32)e*uX9D&>Mz-yPgCR)-lGd7$HJ0V4^^v$%^nBe`S6728=3c zAmKsEuxwyr#p2wAR>8EO72WlOf0YHUz`T`}HN*b)hypydPFc_PufC=NK~?Qa{un_X zXHa8lXZA{$Al-jW4yX%i092fUeC+gBt&?CgoMLTd^s~RR{vZs~e8!(k%KMZBwj>)0 z7#fIIO4iX+$PV#_0LH}WC2vH3CsE!%X5^T7J{N}WRd}H$_h5?$?dgN-#lwku>_ms(y4F94CcT5{nJaZu2Rq6FT_+Oemq8fa%Z?q}6n?!Sja`8sZk*Y?o^d*RvX)3s zIy}nM_y~g2>@~l~bETiSv5ekDj;IlSy#I-Q9YM;N_LH{pGyM{l2vc2FvZhc;JuJ|V z7E)O%u3$DK8@D4_s-b$ZovB+!8>2MfyStyqNP~g3EHC|db*{y z)!!Z7dn68KKkW{*A!{3^Uj|8QSn+QC;+2=ziT|)e#w~@{AzbOV`IjPE<)BGWvtqbD z_GDxc^0>rTli6B{weiK?dL(4Q>Rehw{%wnSHE+EV=E)BvllLMpw$J9*Gf^IGZx|&P zv*A%~P!`gOPT{ZI$a7IMEd-C?d~=5&5Ip7E%=r_~*V8;p(#Mkq&{}Y>RrTw-$5vaP zf*9~FT3U}EK}OO)jP6v^!u|pCEh8#{t%1$~c1q=%Eo(T|@4A!JJ9oZql8hNvl2w`0 zm@?kGu#t8;eqI`)c;4ZXjsLl@djnG*bB4W~iFzm|LGp0W3vMvLBFt+ou$ZgZw@OxX z*R1m@MaP*X)RIBY5eR<6+ByLH(77cJnOmqk;TpzdQ>7HWvYi=V&wI<7IZ!Mjt16Z!cu zk*la@d>uUbb0kgIz9fh2#23=9N?q6p`t%@Ozmn9s0`5E;TLl@^kwy9nV3uuP))+1_ z9?=SD%w2HuQxm?<6m+6QHqmX$bYFp+76N7}6eCRM$94B|rcx7sw)0B4UW7ip8?aNkyUez@`UM&jXy5)p5(WuUmUJYL?`E`}=)vNhGG?H%}2`WH&@~ zZ_Xsszw2bU(mALx=ean`IOsJH3Ej9kb?O>%YH~Hx%|ZL|mF(qajXlrPOOUW30p@y5 zQ5}*dyFPUN$tO`{y3!k;&l7KYBsjyPFW7O%M3wL8oN&@VxmXlzTwT|SL@u#?23vMV zoIFP#t86RVZACzs$#@xJhXTF@ILCP>1->QLG0hJYa)_C>+3QRR($eVBa50uK=bujy z(1n}cJrVsO5fP>fxq&N@Op2s(E#+N$>Hn2oUO7IZ$Jyc|#l&Mz9v7EoiRYdT<@mXzElyP$%4hUhDqg=9++( z`5p3G;x#sP4fz`9w(Iqk6DM~qzQ>u{$%?0>ecy`@Vn{E8BQCk}f%peQ&EAUi__}@W zNo!zlhsgVr#}@R%m0%x<^-v51ryVuXTLAS-A{{oVR3D1UE#! z&vGui^P>ahqqw~;QYN5?@{FM%l@)Y@$Uq%-SG6ptfpL@bp2_RsUC~((feRdSPZ`rG zFiTS8t}un&nJGUL2c?sa#TwrOy}y$@h6<=d_}3*$qBLfJ*1{G zj`Q5Fn7W znh8z0@R)VM`3!;a#1WPHMjvUX`S{+I26{ivHB*TPC$w_3t!^yDie9;;9OL1Xait~N zK{L+GU$gylYRtOW9haIE6|KAGxy_fF()?UC!edgmrC3Ff)vCC2SG#lYc@*55R7gWC z3ZIjwMC_NIqnAK&1#7}pPr0B+vjrjLs3CqILk5IJW9BXUt&r&+f8Yp(fLuI+T>Smo z%-3k)m>c}e>g>1Qqx~s(=@y+9(t>@Rbj~=)+fKgQ1;^6qwrtA13dXLZiJ1=|d%}%gH!C-I5%1!F?}Zd0Q@*dgN{s6^7Ux z>2T9GYp3g@^B}EAWgR-e`Si_^QQ9Dkq3|_o0f(6_r;uMM0SAgtz2oIUY{D}rrxzsN zTu5#?t4J&KcKf*-i!%(-y5y*Xm0LoP$)<(C*)!)!BqaG(-_+Q4J5HPT^wHA=TD?wR zD=CVNy@kZ9wIWTRMXhOpep#{QmBD|KV5uv=?*P~aCY-9lONWo7pJOBa( zJQd{Y+?XA1!KeRR;axd7hv&c-I~E1PjJDNT)VB|nNKq_C7LG6lfBly!PebcWez?Tp zS55G2(K;UF;}T(U0?aw(TT7O|Q8w0JnqdgHW&?^{{LU!j+B@e5SQVMQ$hR~(AzLMd z+tT#*B3en8TfUQ_iQGi0`=Ua6By8j4{hexrCP~WOpD4JoR`cR9yjdq5fg}DXs%qlK zj0}bhtu_;+n9KVQuVLOYtF!z;ipI_y@~^hW`qV-fOHxg5%O)=;MDz%7uEE7;1HKU} zyJ*FrV?2U(aydAhTqeIYg!`U9J3QSc%kqe;6t(jm(J~?5!b&2eLhor2<6#+XGP;vW3!?|| zkgGRASc&e+>Rn+CzVS%-f|lSb5x8VXsIIUsps_du~^Mh%v z4naYrE<9CLIkkrcF+X{+XbEBNz%xlDRqMykpyyi2qp^U71l72F#CtXW^0Ygg%;{Q5 z@u;?NBe3-2US5(8zzVA5M^km`=ulk!F_a8Dt=wx9l?f5|7JPNx(#7vEcCk`Fy~3Fh zJq+a)18+J1fPC{-)19BaR74->JSrz^Ba;Snc-FnFq8c{sYyI8?-PUkPX2s>zsV=ay zA7IV0)8NV0IXG_PdI|T51bCuV;`)G=^pMz8+G3iT(~n_SeToo7*5YDldGKv!N?u3Q zRpIeIuk)O>_o(IsW>nmc_|>yDw))v3MYo&|vTC`BR6U0w9mT>7nrmM!{os@5MWzd2 z6b%*67>R)pq*(q z-$_Pq3&VHhg=bPDav$SH%W>N$BT@ot^ChPuwxr|4cmxLv1i5Vq$1X?L_MJqcGjG^)TRkI`2E&CVyf)8-I58NL~P-LA_ zc5l`!ulzFF%I;|IN);A4^gNo&3fsC8gKcJOJ0XR zYGzxlg$_HlDx3BWS>KjFVtIztRY+5aKB27)KN@k;#!b8Z#M~KDr<#Yw z-4BcaPB=3XbFk9@N8^(e7dah#e?KQ&Un zj$RU*mK&?tc#S@aYjf%UX=l{+`|1c{j`}(RVqksgx#gr>3I$ocTg}3R--y=tWQrL3 z8ppM&d5gfs9G#5Fk=LAcGhZX2*Ri4wBC}l7C(m$~O=#0+4`tSV3C;4GbmgEQ2aFNZ zdOzm@st5@YdZdm+m%IrQT@)LUwQ@6PsLMs; z8m}J%LFOO$12Hdvw|%7gflM_5qq?Axk(OedcYWL+7cP9_b{##hMg@QWu|?i}th?C_ z<4jJJK3@xv;Bn}Qy<*n{6HU@q4C%Z=+qOmRvv-JTN~_I(G)U1&ubX#%P`fGz_oC0{ zXdjE3Y2#2RPxr>7lYe>&=q`rHn+`;-Di0ksBy)m zxv@><&%4vzaE}~sB|^(*zK#!4k8_(sHd?eEGtcc9DCJc1Gw-F)?ffd_Gnmcg-SK(@ z72XS6&8-|BQwzB9$XOhn6Q(u_j25-KeQi% zPkSk(l065XdRW>?$IEhBSbf!j;6=UKDcZ@~sj90pj zn}K*?WyNT3E7bNhiH`8}7l94X-Aut{wFU{pPGL*VLShwSOWlQBx@E*_9ag_CSPv_r7JE!su?|iht}`^OZBzJy$;G zj%s|Fp5QuO*5rC!mfn>Bq;N+qJMPzGC!C#;TT=_4a<_>yZ z$9x3@7cKy7)q<+XM1_7 Date: Mon, 17 Feb 2025 14:38:39 +0000 Subject: [PATCH 019/186] Move tasks/accounts.ts to hardhat-scripts/utils --- {tasks => hardhat-scripts/utils}/accounts.ts | 0 hardhat.config.ts | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename {tasks => hardhat-scripts/utils}/accounts.ts (100%) diff --git a/tasks/accounts.ts b/hardhat-scripts/utils/accounts.ts similarity index 100% rename from tasks/accounts.ts rename to hardhat-scripts/utils/accounts.ts diff --git a/hardhat.config.ts b/hardhat.config.ts index 02f369b9..6debe775 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -14,7 +14,7 @@ import type { import { resolve } from "path"; import fs from "fs"; -import "./tasks/accounts"; +import "./hardhat-scripts/utils/accounts"; import { getJsonRpcUrl } from "./hardhat-scripts/constants/networks"; import { ChainId, From 175f0a9fb363e2547d3d2c60369f48dadab468b0 Mon Sep 17 00:00:00 2001 From: Rookmate <14072042+rookmate@users.noreply.github.com> Date: Mon, 17 Feb 2025 14:46:49 +0000 Subject: [PATCH 020/186] Rename OffChainVMCoreContracts to EVMxCoreContracts --- hardhat-scripts/deploy/1.deploy.ts | 28 ++++++++++----------- hardhat-scripts/deploy/3.upgradeManagers.ts | 4 +-- hardhat-scripts/deploy/4.connect.ts | 18 ++++++------- src/index.ts | 2 +- 4 files changed, 26 insertions(+), 26 deletions(-) diff --git a/hardhat-scripts/deploy/1.deploy.ts b/hardhat-scripts/deploy/1.deploy.ts index 44cfbb34..5516568b 100644 --- a/hardhat-scripts/deploy/1.deploy.ts +++ b/hardhat-scripts/deploy/1.deploy.ts @@ -14,7 +14,7 @@ import { ethers } from "hardhat"; import dev_addresses from "../../deployments/dev_addresses.json"; import { auctionEndDelaySeconds, chains } from "./config"; import { MAX_LIMIT, EVMX_CHAIN_ID, BID_TIMEOUT } from "../constants/constants"; -import { CORE_CONTRACTS, OffChainVMCoreContracts } from "../../src"; +import { CORE_CONTRACTS, EVMxCoreContracts } from "../../src"; let offChainVMOwner: string; const main = async () => { @@ -177,7 +177,7 @@ const deployWatcherVMContracts = async () => { }; const chain = EVMX_CHAIN_ID; try { - console.log("Deploying OffChainVM contracts"); + console.log("Deploying EVMx contracts"); addresses = dev_addresses as unknown as DeploymentAddresses; let chainAddresses: ChainSocketAddresses = addresses[chain] ? (addresses[chain] as ChainSocketAddresses) @@ -211,7 +211,7 @@ const deployWatcherVMContracts = async () => { deployUtils.addresses[contractName] = proxyFactory.address; deployUtils = await deployContractWithProxy( - OffChainVMCoreContracts.SignatureVerifier, + EVMxCoreContracts.SignatureVerifier, `contracts/socket/utils/SignatureVerifier.sol`, [offChainVMOwner], proxyFactory, @@ -219,7 +219,7 @@ const deployWatcherVMContracts = async () => { ); deployUtils = await deployContractWithProxy( - OffChainVMCoreContracts.AddressResolver, + EVMxCoreContracts.AddressResolver, `contracts/AddressResolver.sol`, [offChainVMOwner], proxyFactory, @@ -227,12 +227,12 @@ const deployWatcherVMContracts = async () => { ); const addressResolver = await ethers.getContractAt( - OffChainVMCoreContracts.AddressResolver, - deployUtils.addresses[OffChainVMCoreContracts.AddressResolver] + EVMxCoreContracts.AddressResolver, + deployUtils.addresses[EVMxCoreContracts.AddressResolver] ); deployUtils = await deployContractWithProxy( - OffChainVMCoreContracts.WatcherPrecompile, + EVMxCoreContracts.WatcherPrecompile, `contracts/watcherPrecompile/WatcherPrecompile.sol`, [offChainVMOwner, addressResolver.address, MAX_LIMIT], proxyFactory, @@ -240,17 +240,17 @@ const deployWatcherVMContracts = async () => { ); deployUtils = await deployContractWithProxy( - OffChainVMCoreContracts.FeesManager, + EVMxCoreContracts.FeesManager, `contracts/apps/payload-delivery/app-gateway/FeesManager.sol`, [addressResolver.address, offChainVMOwner], proxyFactory, deployUtils ); const feesManagerAddress = - deployUtils.addresses[OffChainVMCoreContracts.FeesManager]; + deployUtils.addresses[EVMxCoreContracts.FeesManager]; deployUtils = await deployContractWithProxy( - OffChainVMCoreContracts.DeliveryHelper, + EVMxCoreContracts.DeliveryHelper, `contracts/apps/payload-delivery/app-gateway/DeliveryHelper.sol`, [ addressResolver.address, @@ -263,13 +263,13 @@ const deployWatcherVMContracts = async () => { ); deployUtils = await deployContractWithProxy( - OffChainVMCoreContracts.AuctionManager, + EVMxCoreContracts.AuctionManager, `contracts/apps/payload-delivery/app-gateway/AuctionManager.sol`, [ EVMX_CHAIN_ID, auctionEndDelaySeconds, addressResolver.address, - deployUtils.addresses[OffChainVMCoreContracts.SignatureVerifier], + deployUtils.addresses[EVMxCoreContracts.SignatureVerifier], offChainVMOwner, ], proxyFactory, @@ -280,7 +280,7 @@ const deployWatcherVMContracts = async () => { addressResolver, "deliveryHelper", "setDeliveryHelper", - deployUtils.addresses[OffChainVMCoreContracts.DeliveryHelper], + deployUtils.addresses[EVMxCoreContracts.DeliveryHelper], deployUtils.signer ); @@ -296,7 +296,7 @@ const deployWatcherVMContracts = async () => { addressResolver, "watcherPrecompile__", "setWatcherPrecompile", - deployUtils.addresses[OffChainVMCoreContracts.WatcherPrecompile], + deployUtils.addresses[EVMxCoreContracts.WatcherPrecompile], deployUtils.signer ); diff --git a/hardhat-scripts/deploy/3.upgradeManagers.ts b/hardhat-scripts/deploy/3.upgradeManagers.ts index 23371d40..9e939ee1 100644 --- a/hardhat-scripts/deploy/3.upgradeManagers.ts +++ b/hardhat-scripts/deploy/3.upgradeManagers.ts @@ -15,7 +15,7 @@ import { chains } from "./config"; import { getProviderFromChainSlug } from "../constants"; import { Wallet } from "ethers"; import { getInstance, storeAddresses } from "./utils"; -import { OffChainVMCoreContracts } from "../../src"; +import { EVMxCoreContracts } from "../../src"; import { EVMX_CHAIN_ID } from "../constants/constants"; export const main = async () => { @@ -73,7 +73,7 @@ async function setSwitchboard(sbAddress, chain, addresses) { const watcherPrecompile = ( await getInstance( "contracts/watcherPrecompile/WatcherPrecompile.sol:WatcherPrecompile", - watcherVMaddr[OffChainVMCoreContracts.WatcherPrecompile] + watcherVMaddr[EVMxCoreContracts.WatcherPrecompile] ) ).connect(signer); diff --git a/hardhat-scripts/deploy/4.connect.ts b/hardhat-scripts/deploy/4.connect.ts index e66da43c..dbdd8c59 100644 --- a/hardhat-scripts/deploy/4.connect.ts +++ b/hardhat-scripts/deploy/4.connect.ts @@ -8,7 +8,7 @@ import { getInstance } from "./utils"; import { chains } from "./config"; import dev_addresses from "../../deployments/dev_addresses.json"; import { EVMX_CHAIN_ID } from "../constants/constants"; -import { CORE_CONTRACTS, OffChainVMCoreContracts } from "../../src"; +import { CORE_CONTRACTS, EVMxCoreContracts } from "../../src"; const plugs = [CORE_CONTRACTS.ContractFactoryPlug, CORE_CONTRACTS.FeesPlug]; export type AppGatewayConfig = { @@ -22,11 +22,11 @@ export const getAppGateway = (plug: string, addresses: DeploymentAddresses) => { switch (plug) { case CORE_CONTRACTS.ContractFactoryPlug: return addresses?.[EVMX_CHAIN_ID]?.[ - OffChainVMCoreContracts.DeliveryHelper + EVMxCoreContracts.DeliveryHelper ]; case CORE_CONTRACTS.FeesPlug: return addresses?.[EVMX_CHAIN_ID]?.[ - OffChainVMCoreContracts.FeesManager + EVMxCoreContracts.FeesManager ]; default: throw new Error(`Unknown plug: ${plug}`); @@ -54,9 +54,9 @@ export const isConfigSetOnSocket = async ( const plugConfigRegistered = await socket.getPlugConfig(plug.address); return ( plugConfigRegistered.appGateway.toLowerCase() === - appGateway?.toLowerCase() && + appGateway?.toLowerCase() && plugConfigRegistered.switchboard__.toLowerCase() === - switchboard.toLowerCase() + switchboard.toLowerCase() ); }; @@ -140,7 +140,7 @@ export const isConfigSetOnWatcherVM = async ( // Configure plugs on the Watcher VM export const updateConfigWatcherVM = async () => { try { - console.log("Connecting plugs on OffChainVM"); + console.log("Connecting plugs on EVMx"); const addresses = dev_addresses as unknown as DeploymentAddresses; const appConfigs: AppGatewayConfig[] = []; @@ -155,8 +155,8 @@ export const updateConfigWatcherVM = async () => { const watcherVMaddr = addresses[EVMX_CHAIN_ID]!; const watcher = ( await getInstance( - OffChainVMCoreContracts.WatcherPrecompile, - watcherVMaddr[OffChainVMCoreContracts.WatcherPrecompile] + EVMxCoreContracts.WatcherPrecompile, + watcherVMaddr[EVMxCoreContracts.WatcherPrecompile] ) ).connect(signer); @@ -198,7 +198,7 @@ export const updateConfigWatcherVM = async () => { if (appConfigs.length > 0) { console.log({ appConfigs }); const tx = await watcher.setAppGateways(appConfigs); - console.log(`Updating OffChainVM Config tx hash: ${tx.hash}`); + console.log(`Updating EVMx Config tx hash: ${tx.hash}`); await tx.wait(); } } catch (error) { diff --git a/src/index.ts b/src/index.ts index d96eafbe..dbeff774 100644 --- a/src/index.ts +++ b/src/index.ts @@ -8,7 +8,7 @@ export enum CORE_CONTRACTS { ContractFactoryPlug = "ContractFactoryPlug", } -export enum OffChainVMCoreContracts { +export enum EVMxCoreContracts { SignatureVerifier = "SignatureVerifier", WatcherPrecompile = "WatcherPrecompile", AuctionManager = "AuctionManager", From fb34493fa74d1e3b0d89b11ecc3cec4b128574e4 Mon Sep 17 00:00:00 2001 From: Rookmate <14072042+rookmate@users.noreply.github.com> Date: Mon, 17 Feb 2025 14:49:18 +0000 Subject: [PATCH 021/186] Delete unused constant --- src/index.ts | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/index.ts b/src/index.ts index dbeff774..7b8b5cea 100644 --- a/src/index.ts +++ b/src/index.ts @@ -18,8 +18,3 @@ export enum EVMxCoreContracts { AsyncPromise = "AsyncPromise", AddressResolver = "AddressResolver", } - -export enum AppContracts { - SuperTokenApp = "SuperTokenApp", - SuperTokenDeployer = "SuperTokenDeployer", -} From 63d5821eaaee0f8afec204b9a31f3436cad715fd Mon Sep 17 00:00:00 2001 From: Rookmate <14072042+rookmate@users.noreply.github.com> Date: Mon, 17 Feb 2025 14:54:42 +0000 Subject: [PATCH 022/186] Move src/index.ts to hardhat-scripts/constants/protocolConstants.ts --- src/index.ts => hardhat-scripts/constants/protocolConstants.ts | 0 hardhat-scripts/deploy/1.deploy.ts | 2 +- hardhat-scripts/deploy/3.upgradeManagers.ts | 2 +- hardhat-scripts/deploy/4.connect.ts | 2 +- 4 files changed, 3 insertions(+), 3 deletions(-) rename src/index.ts => hardhat-scripts/constants/protocolConstants.ts (100%) diff --git a/src/index.ts b/hardhat-scripts/constants/protocolConstants.ts similarity index 100% rename from src/index.ts rename to hardhat-scripts/constants/protocolConstants.ts diff --git a/hardhat-scripts/deploy/1.deploy.ts b/hardhat-scripts/deploy/1.deploy.ts index 5516568b..a6b40d23 100644 --- a/hardhat-scripts/deploy/1.deploy.ts +++ b/hardhat-scripts/deploy/1.deploy.ts @@ -14,7 +14,7 @@ import { ethers } from "hardhat"; import dev_addresses from "../../deployments/dev_addresses.json"; import { auctionEndDelaySeconds, chains } from "./config"; import { MAX_LIMIT, EVMX_CHAIN_ID, BID_TIMEOUT } from "../constants/constants"; -import { CORE_CONTRACTS, EVMxCoreContracts } from "../../src"; +import { CORE_CONTRACTS, EVMxCoreContracts } from "../constants/protocolConstants"; let offChainVMOwner: string; const main = async () => { diff --git a/hardhat-scripts/deploy/3.upgradeManagers.ts b/hardhat-scripts/deploy/3.upgradeManagers.ts index 9e939ee1..5e426613 100644 --- a/hardhat-scripts/deploy/3.upgradeManagers.ts +++ b/hardhat-scripts/deploy/3.upgradeManagers.ts @@ -15,7 +15,7 @@ import { chains } from "./config"; import { getProviderFromChainSlug } from "../constants"; import { Wallet } from "ethers"; import { getInstance, storeAddresses } from "./utils"; -import { EVMxCoreContracts } from "../../src"; +import { EVMxCoreContracts } from "../constants/protocolConstants"; import { EVMX_CHAIN_ID } from "../constants/constants"; export const main = async () => { diff --git a/hardhat-scripts/deploy/4.connect.ts b/hardhat-scripts/deploy/4.connect.ts index dbdd8c59..86b607d3 100644 --- a/hardhat-scripts/deploy/4.connect.ts +++ b/hardhat-scripts/deploy/4.connect.ts @@ -8,7 +8,7 @@ import { getInstance } from "./utils"; import { chains } from "./config"; import dev_addresses from "../../deployments/dev_addresses.json"; import { EVMX_CHAIN_ID } from "../constants/constants"; -import { CORE_CONTRACTS, EVMxCoreContracts } from "../../src"; +import { CORE_CONTRACTS, EVMxCoreContracts } from "../constants/protocolConstants"; const plugs = [CORE_CONTRACTS.ContractFactoryPlug, CORE_CONTRACTS.FeesPlug]; export type AppGatewayConfig = { From 7aee6e31d336de6188ebbf985ac8f190150c45c9 Mon Sep 17 00:00:00 2001 From: Rookmate <14072042+rookmate@users.noreply.github.com> Date: Mon, 17 Feb 2025 16:06:35 +0000 Subject: [PATCH 023/186] Remove old custom errors file --- ERROR.md | 28 ---------------------------- 1 file changed, 28 deletions(-) delete mode 100644 ERROR.md diff --git a/ERROR.md b/ERROR.md deleted file mode 100644 index 8329313b..00000000 --- a/ERROR.md +++ /dev/null @@ -1,28 +0,0 @@ -# List of Errors in Socket Protocol - -| Error Name | Selector | -| --------------------------------------------- | ---------- | -| AppGatewayContractAlreadySetByDifferentSender | 0x6c0f1f28 | -| FeesAlreadyPaid | 0x0a6cc8e7 | -| AllPayloadsExecuted | 0x8c9b6d30 | -| NotFromForwarder | 0x7c307758 | -| CallFailed | 0x3b9a49a0 | -| BurnLimitExceeded | 0x1d1d5c1a | -| MintLimitExceeded | 0x8f05c4b9 | -| NotController | 0x75b238fc | -| NotAuthorized | 0x7a18c059 | -| NotBridge | 0x9d9c2c1c | -| NotSocket | 0x8d0c1f96 | -| ConnectorUnavailable | 0x8c1f1e42 | -| InvalidTokenContract | 0x2ee6fd0b | -| ZeroAddressReceiver | 0x9f9a4f4e | -| ZeroAddress | 0xd92e233d | -| ZeroAmount | 0x1087e3eb | -| InsufficientFunds | 0x356680b7 | -| InvalidSigner | 0x815e1d64 | -| InvalidFunction | 0x8436aa02 | -| InvalidTokenAddress | 0x8149c6aa | -| NoPermit | 0x4e831acb | -| OnlyOwner | 0x5fc483c5 | -| OnlyNominee | 0x4e2d3edf | -| InvalidGateway | 0x0b0e8fed | From 46327d5110990caa6027b9d2a088e00103659df6 Mon Sep 17 00:00:00 2001 From: Rookmate <14072042+rookmate@users.noreply.github.com> Date: Mon, 17 Feb 2025 16:11:28 +0000 Subject: [PATCH 024/186] Remove old implementation addresses --- impAddresses.json | 5 ----- remappings.txt | 2 +- 2 files changed, 1 insertion(+), 6 deletions(-) delete mode 100644 impAddresses.json diff --git a/impAddresses.json b/impAddresses.json deleted file mode 100644 index 3ca3b357..00000000 --- a/impAddresses.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "watcher": "0xb62505feacC486e809392c65614Ce4d7b051923b", - "socketContractsDeployer": "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18", - "transmitter": "0x138e9840861c983dc0bb9b3e941fb7c0e9ade320" -} diff --git a/remappings.txt b/remappings.txt index ab585aad..bb1d8588 100644 --- a/remappings.txt +++ b/remappings.txt @@ -2,4 +2,4 @@ ds-test/=lib/forge-std/lib/ds-test/src/ forge-std/=lib/forge-std/src/ solmate/=lib/solmate/src/ openzeppelin-contracts/=lib/openzeppelin-contracts/ -solady/=lib/solady/src/ \ No newline at end of file +solady/=lib/solady/src/ From fb1098838631b71303b2c8e1554f5a1a95dd65ca Mon Sep 17 00:00:00 2001 From: Rookmate <14072042+rookmate@users.noreply.github.com> Date: Mon, 17 Feb 2025 16:21:27 +0000 Subject: [PATCH 025/186] Rename to EVMx on hardhat/config.ts --- hardhat.config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hardhat.config.ts b/hardhat.config.ts index 6debe775..fd9f5028 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -130,7 +130,7 @@ const config: HardhatUserConfig = { }, }, { - network: "offChainVM", + network: "EVMx", chainId: EVMX_CHAIN_ID, urls: { apiURL: "https://explorer-socket-composer-testnet.t.conduit.xyz/api", From 42e331a3069273ba3b8f611c36f6f7bb060a1dab Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Mon, 17 Feb 2025 20:30:41 +0400 Subject: [PATCH 026/186] feat: moved payload delivery out --- contracts/{apps => }/payload-delivery/ContractFactoryPlug.sol | 2 +- contracts/{apps => }/payload-delivery/FeesPlug.sol | 0 .../payload-delivery/app-gateway/AuctionManager.sol | 0 .../{apps => }/payload-delivery/app-gateway/BatchAsync.sol | 4 ++-- .../payload-delivery/app-gateway/DeliveryHelper.sol | 0 .../{apps => }/payload-delivery/app-gateway/FeesManager.sol | 0 .../{apps => }/payload-delivery/app-gateway/QueueAsync.sol | 0 7 files changed, 3 insertions(+), 3 deletions(-) rename contracts/{apps => }/payload-delivery/ContractFactoryPlug.sol (96%) rename contracts/{apps => }/payload-delivery/FeesPlug.sol (100%) rename contracts/{apps => }/payload-delivery/app-gateway/AuctionManager.sol (100%) rename contracts/{apps => }/payload-delivery/app-gateway/BatchAsync.sol (98%) rename contracts/{apps => }/payload-delivery/app-gateway/DeliveryHelper.sol (100%) rename contracts/{apps => }/payload-delivery/app-gateway/FeesManager.sol (100%) rename contracts/{apps => }/payload-delivery/app-gateway/QueueAsync.sol (100%) diff --git a/contracts/apps/payload-delivery/ContractFactoryPlug.sol b/contracts/payload-delivery/ContractFactoryPlug.sol similarity index 96% rename from contracts/apps/payload-delivery/ContractFactoryPlug.sol rename to contracts/payload-delivery/ContractFactoryPlug.sol index df7a82d6..4a82da82 100644 --- a/contracts/apps/payload-delivery/ContractFactoryPlug.sol +++ b/contracts/payload-delivery/ContractFactoryPlug.sol @@ -36,7 +36,7 @@ contract ContractFactoryPlug is PlugBase, Ownable { } } - IPlug(addr).connectSocket(appGateway_, msg.sender, switchboard_); + IPlug(addr).initSocket(appGateway_, msg.sender, switchboard_); emit Deployed(addr, salt_); return addr; } diff --git a/contracts/apps/payload-delivery/FeesPlug.sol b/contracts/payload-delivery/FeesPlug.sol similarity index 100% rename from contracts/apps/payload-delivery/FeesPlug.sol rename to contracts/payload-delivery/FeesPlug.sol diff --git a/contracts/apps/payload-delivery/app-gateway/AuctionManager.sol b/contracts/payload-delivery/app-gateway/AuctionManager.sol similarity index 100% rename from contracts/apps/payload-delivery/app-gateway/AuctionManager.sol rename to contracts/payload-delivery/app-gateway/AuctionManager.sol diff --git a/contracts/apps/payload-delivery/app-gateway/BatchAsync.sol b/contracts/payload-delivery/app-gateway/BatchAsync.sol similarity index 98% rename from contracts/apps/payload-delivery/app-gateway/BatchAsync.sol rename to contracts/payload-delivery/app-gateway/BatchAsync.sol index 4cd0529d..efe0c60b 100644 --- a/contracts/apps/payload-delivery/app-gateway/BatchAsync.sol +++ b/contracts/payload-delivery/app-gateway/BatchAsync.sol @@ -182,7 +182,7 @@ abstract contract BatchAsync is QueueAsync { if (payloadDetails_[i].callType == CallType.DEPLOY) { // contract factory plug deploys new contracts - payloadDetails_[i].target = getPlugAddress( + payloadDetails_[i].target = getDeliveryHelperPlugAddress( address(this), payloadDetails_[i].chainSlug ); @@ -273,7 +273,7 @@ abstract contract BatchAsync is QueueAsync { /// @notice Gets the payload delivery plug address /// @param chainSlug_ The chain identifier /// @return address The address of the payload delivery plug - function getPlugAddress(address appGateway_, uint32 chainSlug_) public view returns (address) { + function getDeliveryHelperPlugAddress(address appGateway_, uint32 chainSlug_) public view returns (address) { return watcherPrecompile__().appGatewayPlugs(appGateway_, chainSlug_); } diff --git a/contracts/apps/payload-delivery/app-gateway/DeliveryHelper.sol b/contracts/payload-delivery/app-gateway/DeliveryHelper.sol similarity index 100% rename from contracts/apps/payload-delivery/app-gateway/DeliveryHelper.sol rename to contracts/payload-delivery/app-gateway/DeliveryHelper.sol diff --git a/contracts/apps/payload-delivery/app-gateway/FeesManager.sol b/contracts/payload-delivery/app-gateway/FeesManager.sol similarity index 100% rename from contracts/apps/payload-delivery/app-gateway/FeesManager.sol rename to contracts/payload-delivery/app-gateway/FeesManager.sol diff --git a/contracts/apps/payload-delivery/app-gateway/QueueAsync.sol b/contracts/payload-delivery/app-gateway/QueueAsync.sol similarity index 100% rename from contracts/apps/payload-delivery/app-gateway/QueueAsync.sol rename to contracts/payload-delivery/app-gateway/QueueAsync.sol From ae32660ce60a7aab5da39f8f3a96541770a35b48 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Mon, 17 Feb 2025 20:36:27 +0400 Subject: [PATCH 027/186] feat: enum instead of bools in override for readability --- contracts/apps/counter/CounterAppGateway.sol | 4 +- .../ParallelCounterAppGateway.sol | 2 +- .../ParallelCounterDeployer.sol | 2 +- .../SuperTokenLockableAppGateway.sol | 4 +- contracts/base/AppGatewayBase.sol | 44 ++++++++++++++----- 5 files changed, 38 insertions(+), 18 deletions(-) diff --git a/contracts/apps/counter/CounterAppGateway.sol b/contracts/apps/counter/CounterAppGateway.sol index 68d98b25..0a588432 100644 --- a/contracts/apps/counter/CounterAppGateway.sol +++ b/contracts/apps/counter/CounterAppGateway.sol @@ -32,13 +32,13 @@ contract CounterAppGateway is AppGatewayBase { function readCounters(address[] memory instances_) public async { // the increase function is called on given list of instances // this - _setOverrides(false, true); + _setOverrides(Sequential.TRUE); for (uint256 i = 0; i < instances_.length; i++) { uint32 chainSlug = IForwarder(instances_[i]).getChainSlug(); ICounter(instances_[i]).getCounter(); IPromise(instances_[i]).then(this.setCounterValues.selector, abi.encode(chainSlug)); } - _setOverrides(false, false); + _setOverrides(Sequential.FALSE); ICounter(instances_[0]).increase(); } diff --git a/contracts/apps/parallel-counter/ParallelCounterAppGateway.sol b/contracts/apps/parallel-counter/ParallelCounterAppGateway.sol index 6fd2d703..54dfda68 100644 --- a/contracts/apps/parallel-counter/ParallelCounterAppGateway.sol +++ b/contracts/apps/parallel-counter/ParallelCounterAppGateway.sol @@ -12,7 +12,7 @@ contract ParallelCounterAppGateway is AppGatewayBase { Fees memory fees_ ) AppGatewayBase(addressResolver_, auctionManager_) { addressResolver__.setContractsToGateways(deployerContract_); - _setOverrides(false, true, 1000000, fees_); + _setOverrides(Read.OFF, Sequential.TRUE, 1000000, fees_); } function incrementCounters(address[] memory instances_) public async { diff --git a/contracts/apps/parallel-counter/ParallelCounterDeployer.sol b/contracts/apps/parallel-counter/ParallelCounterDeployer.sol index d5506213..cb7e7762 100644 --- a/contracts/apps/parallel-counter/ParallelCounterDeployer.sol +++ b/contracts/apps/parallel-counter/ParallelCounterDeployer.sol @@ -17,7 +17,7 @@ contract ParallelCounterDeployer is AppDeployerBase, OwnableTwoStep { ) AppDeployerBase(addressResolver_, auctionManager_, sbType_) { creationCodeWithArgs[counter1] = abi.encodePacked(type(Counter).creationCode); creationCodeWithArgs[counter2] = abi.encodePacked(type(Counter).creationCode); - _setOverrides(false, false, 1000000, fees_); + _setOverrides(Read.OFF, Sequential.FALSE, 1000000, fees_); _claimOwner(msg.sender); } diff --git a/contracts/apps/super-token-lockable/SuperTokenLockableAppGateway.sol b/contracts/apps/super-token-lockable/SuperTokenLockableAppGateway.sol index ce282d4c..acd2c2e3 100644 --- a/contracts/apps/super-token-lockable/SuperTokenLockableAppGateway.sol +++ b/contracts/apps/super-token-lockable/SuperTokenLockableAppGateway.sol @@ -49,12 +49,12 @@ contract SuperTokenLockableAppGateway is AppGatewayBase, OwnableTwoStep { asyncId_ = _getCurrentAsyncId(); ISuperToken(order.srcToken).lockTokens(order.user, order.srcAmount); - _setOverrides(true); + _setOverrides(Read.ON); // goes to forwarder and deploys promise and stores it ISuperToken(order.srcToken).balanceOf(order.user); IPromise(order.srcToken).then(this.checkBalance.selector, abi.encode(order, asyncId_)); - _setOverrides(false); + _setOverrides(Read.OFF); ISuperToken(order.dstToken).mint(order.user, order.srcAmount); ISuperToken(order.srcToken).burn(order.user, order.srcAmount); diff --git a/contracts/base/AppGatewayBase.sol b/contracts/base/AppGatewayBase.sol index d88a7ff8..e276a2e1 100644 --- a/contracts/base/AppGatewayBase.sol +++ b/contracts/base/AppGatewayBase.sol @@ -20,6 +20,16 @@ abstract contract AppGatewayBase is AddressResolverUtil, IAppGateway, FeesPlugin bytes public onCompleteData; bytes32 public sbType; + enum Read { + ON, + OFF + } + + enum Sequential { + TRUE, + FALSE + } + mapping(address => bool) public isValidPromise; /// @notice Modifier to treat functions async @@ -86,13 +96,13 @@ abstract contract AppGatewayBase is AddressResolverUtil, IAppGateway, FeesPlugin /// @param gasLimit_ The gas limit /// @param isCallSequential_ The sequential call flag function _setOverrides( - bool isReadCall_, - bool isCallSequential_, + Read isReadCall_, + Sequential isCallSequential_, uint256 gasLimit_, Fees memory fees_ ) internal { - isReadCall = isReadCall_; - isCallSequential = isCallSequential_; + isReadCall = isReadCall_ == Read.ON; + isCallSequential = isCallSequential_ == Sequential.TRUE; gasLimit = gasLimit_; fees = fees_; } @@ -101,24 +111,34 @@ abstract contract AppGatewayBase is AddressResolverUtil, IAppGateway, FeesPlugin /// @param isReadCall_ The read call flag /// @param isCallSequential_ The sequential call flag /// @param gasLimit_ The gas limit - function _setOverrides(bool isReadCall_, bool isCallSequential_, uint256 gasLimit_) internal { - isReadCall = isReadCall_; - isCallSequential = isCallSequential_; + function _setOverrides( + Read isReadCall_, + Sequential isCallSequential_, + uint256 gasLimit_ + ) internal { + isReadCall = isReadCall_ == Read.ON; + isCallSequential = isCallSequential_ == Sequential.TRUE; gasLimit = gasLimit_; } /// @notice Sets isReadCall and isCallSequential overrides /// @param isReadCall_ The read call flag /// @param isCallSequential_ The sequential call flag - function _setOverrides(bool isReadCall_, bool isCallSequential_) internal { - isReadCall = isReadCall_; - isCallSequential = isCallSequential_; + function _setOverrides(Read isReadCall_, Sequential isCallSequential_) internal { + isReadCall = isReadCall_ == Read.ON; + isCallSequential = isCallSequential_ == Sequential.TRUE; + } + + /// @notice Sets isReadCall and gasLimit overrides + /// @param isCallSequential_ The sequential call flag + function _setOverrides(Sequential isCallSequential_) internal { + isCallSequential = isCallSequential_ == Sequential.TRUE; } /// @notice Sets isReadCall and gasLimit overrides /// @param isReadCall_ The read call flag - function _setOverrides(bool isReadCall_) internal { - isReadCall = isReadCall_; + function _setOverrides(Read isReadCall_) internal { + isReadCall = isReadCall_ == Read.ON; } /// @notice Sets gasLimit overrides From e5f2f70577a740adb3f14bd1e0041c5cadba1818 Mon Sep 17 00:00:00 2001 From: Rookmate <14072042+rookmate@users.noreply.github.com> Date: Mon, 17 Feb 2025 16:38:38 +0000 Subject: [PATCH 028/186] Add staging PR checks --- .github/workflows/forge-test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/forge-test.yml b/.github/workflows/forge-test.yml index fb0ba844..bd4002dc 100644 --- a/.github/workflows/forge-test.yml +++ b/.github/workflows/forge-test.yml @@ -2,7 +2,7 @@ name: PR Checks on: pull_request: - branches: [ master ] + branches: [ master, staging ] env: FOUNDRY_PROFILE: ci From f61081635304a7ce2779b7929f4f9e40be71d103 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Mon, 17 Feb 2025 20:50:58 +0400 Subject: [PATCH 029/186] fix: block bid amount instead of fees amount --- .../payload-delivery/app-gateway/AuctionManager.sol | 2 ++ .../payload-delivery/app-gateway/FeesManager.sol | 13 +++++++++---- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/contracts/apps/payload-delivery/app-gateway/AuctionManager.sol b/contracts/apps/payload-delivery/app-gateway/AuctionManager.sol index d72bf380..1034093c 100644 --- a/contracts/apps/payload-delivery/app-gateway/AuctionManager.sol +++ b/contracts/apps/payload-delivery/app-gateway/AuctionManager.sol @@ -99,9 +99,11 @@ contract AuctionManager is AddressResolverUtil, OwnableTwoStep, IAuctionManager, if (fee < winningBids[asyncId_].fee) return; winningBids[asyncId_] = newBid; + IFeesManager(addressResolver__.feesManager()).blockFees( payloadBatch.appGateway, payloadBatch.fees, + newBid, asyncId_ ); diff --git a/contracts/apps/payload-delivery/app-gateway/FeesManager.sol b/contracts/apps/payload-delivery/app-gateway/FeesManager.sol index 46037e00..48013621 100644 --- a/contracts/apps/payload-delivery/app-gateway/FeesManager.sol +++ b/contracts/apps/payload-delivery/app-gateway/FeesManager.sol @@ -158,7 +158,12 @@ contract FeesManager is IFeesManager, AddressResolverUtil, OwnableTwoStep, Initi /// @param fees_ The fees data struct /// @param asyncId_ The batch identifier /// @dev Only callable by delivery helper - function blockFees(address appGateway_, Fees memory fees_, bytes32 asyncId_) external { + function blockFees( + address appGateway_, + Fees memory fees_, + Bid memory winningBid_, + bytes32 asyncId_ + ) external { // todo: only auction manager can call this address appGateway = _getCoreAppGateway(appGateway_); // Block fees @@ -167,15 +172,15 @@ contract FeesManager is IFeesManager, AddressResolverUtil, OwnableTwoStep, Initi appGateway, fees_.feePoolToken ); - if (availableFees < fees_.amount) revert InsufficientFeesAvailable(); + if (availableFees < winningBid_.fee) revert InsufficientFeesAvailable(); TokenBalance storage tokenBalance = appGatewayFeeBalances[appGateway][fees_.feePoolChain][ fees_.feePoolToken ]; - tokenBalance.blocked += fees_.amount; + tokenBalance.blocked += winningBid_.fee; asyncIdBlockedFees[asyncId_] = fees_; - emit FeesBlocked(asyncId_, fees_.feePoolChain, fees_.feePoolToken, fees_.amount); + emit FeesBlocked(asyncId_, fees_.feePoolChain, fees_.feePoolToken, winningBid_.fee); } function updateTransmitterFees( From d3d545fa8594d664caf9d0b36423107b22e60fc3 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Mon, 17 Feb 2025 21:03:41 +0400 Subject: [PATCH 030/186] feat: redeploy --- contracts/interfaces/IFeesManager.sol | 7 ++++++- deployments/dev_addresses.json | 8 ++++---- deployments/dev_verification.json | 18 ++++++++++++++++++ 3 files changed, 28 insertions(+), 5 deletions(-) diff --git a/contracts/interfaces/IFeesManager.sol b/contracts/interfaces/IFeesManager.sol index 4e135fec..8990f08d 100644 --- a/contracts/interfaces/IFeesManager.sol +++ b/contracts/interfaces/IFeesManager.sol @@ -4,7 +4,12 @@ pragma solidity ^0.8.3; import {Fees, Bid, PayloadDetails} from "../common/Structs.sol"; interface IFeesManager { - function blockFees(address appGateway_, Fees memory fees_, bytes32 asyncId_) external; + function blockFees( + address appGateway_, + Fees memory fees_, + Bid memory winningBid_, + bytes32 asyncId_ + ) external; function updateTransmitterFees( Bid memory winningBid_, diff --git a/deployments/dev_addresses.json b/deployments/dev_addresses.json index 04d10cda..6f7556e7 100644 --- a/deployments/dev_addresses.json +++ b/deployments/dev_addresses.json @@ -12,13 +12,13 @@ "7625382": { "AddressResolver": "0x83b9f8829870989c233eD457FEBf5E2852F6f7e6", "AddressResolverImpl": "0xE6C9cf66F57f6aF78585235E36E94007020e3746", - "AuctionManager": "0xE285dA5E0Af241148196045a8D0c554e9dCfdc5B", - "AuctionManagerImpl": "0xb888e3a8F9cC8F0281796958B01862427417b0Ea", + "AuctionManager": "0x1C09134d2d75034Cd7ec7A401B053d1217693f1B", + "AuctionManagerImpl": "0xA894Fa3dab8897ED038e2B15DBc8d61ccb25eEec", "DeliveryHelper": "0x96DD7A17d8BB599365d437ab0F34d7505187F9E8", "DeliveryHelperImpl": "0x5bA4C527883F7D9e12d71Da5Cd170f26eCF2F901", "ERC1967Factory": "0x494660a4bDcafC43a5522B98117D678654c6D3d5", - "FeesManager": "0x1B0d860ffC6D42Bc0Bd6C4b5bCe39F6694392AF5", - "FeesManagerImpl": "0x731f609cae8C9B6862B4c1D43dE29d4759f878F8", + "FeesManager": "0x178ED38fB5f08816378d614901cc2FB117883C32", + "FeesManagerImpl": "0xa495982D3402B98c3EBA3cdA1Be72495A510FC40", "SignatureVerifier": "0x050433b2288F24FE6d87D3081343038D3BfBe39E", "SignatureVerifierImpl": "0x70BA68CbDFc530E1AD62d9aFAf43a40B87D0730b", "startBlock": 5488, diff --git a/deployments/dev_verification.json b/deployments/dev_verification.json index 2c945377..addff298 100644 --- a/deployments/dev_verification.json +++ b/deployments/dev_verification.json @@ -1,6 +1,24 @@ { "421614": [], "7625382": [ + [ + "0xA894Fa3dab8897ED038e2B15DBc8d61ccb25eEec", + "AuctionManager", + "contracts/apps/payload-delivery/app-gateway/AuctionManager.sol", + [] + ], + [ + "0xa495982D3402B98c3EBA3cdA1Be72495A510FC40", + "FeesManager", + "contracts/apps/payload-delivery/app-gateway/FeesManager.sol", + [] + ], + [ + "0xD9981f14e70825818ffd0B29C7057a1ca441Cf33", + "FeesManager", + "contracts/apps/payload-delivery/app-gateway/FeesManager.sol", + [] + ], [ "0xb888e3a8F9cC8F0281796958B01862427417b0Ea", "AuctionManager", From fed30560342c40013419ad9ae8ca84e6103d0d66 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Tue, 18 Feb 2025 15:33:24 +0400 Subject: [PATCH 031/186] feat: migrate delivery helper --- .../app-gateway/BatchAsync.sol | 13 +- .../app-gateway/DeliveryHelper.sol | 5 +- .../app-gateway/QueueAsync.sol | 1 - deployments/dev_addresses.json | 2 +- deployments/dev_verification.json | 6 + hardhat-scripts/constants/overrides.ts | 6 +- hardhat-scripts/deploy/1.deploy.ts | 37 ++- hardhat-scripts/deploy/config.ts | 2 +- .../deploy/migration/migrate-proxies.ts | 231 ++++++++++-------- hardhat.config.ts | 2 +- 10 files changed, 184 insertions(+), 121 deletions(-) diff --git a/contracts/apps/payload-delivery/app-gateway/BatchAsync.sol b/contracts/apps/payload-delivery/app-gateway/BatchAsync.sol index 4cd0529d..ec6efb10 100644 --- a/contracts/apps/payload-delivery/app-gateway/BatchAsync.sol +++ b/contracts/apps/payload-delivery/app-gateway/BatchAsync.sol @@ -91,7 +91,9 @@ abstract contract BatchAsync is QueueAsync { bytes32 asyncId = getCurrentAsyncId(); asyncCounter++; - if (!IFeesManager(feesManager).isFeesEnough(msg.sender, fees_)) revert InsufficientFees(); + + if (!IFeesManager(addressResolver__.feesManager()).isFeesEnough(msg.sender, fees_)) + revert InsufficientFees(); // Handle initial read operations first uint256 readEndIndex = _processReadOperations(payloadDetails_, asyncId); @@ -245,13 +247,16 @@ abstract contract BatchAsync is QueueAsync { _payloadBatches[asyncId_].isBatchCancelled = true; if (_payloadBatches[asyncId_].winningBid.transmitter != address(0)) { - IFeesManager(feesManager).unblockAndAssignFees( + IFeesManager(addressResolver__.feesManager()).unblockAndAssignFees( asyncId_, _payloadBatches[asyncId_].winningBid.transmitter, _payloadBatches[asyncId_].appGateway ); } else { - IFeesManager(feesManager).unblockFees(asyncId_, _payloadBatches[asyncId_].appGateway); + IFeesManager(addressResolver__.feesManager()).unblockFees( + asyncId_, + _payloadBatches[asyncId_].appGateway + ); } emit BatchCancelled(asyncId_); @@ -298,7 +303,7 @@ abstract contract BatchAsync is QueueAsync { Fees memory fees_ ) external { PayloadDetails[] memory payloadDetailsArray = new PayloadDetails[](1); - payloadDetailsArray[0] = IFeesManager(feesManager).getWithdrawToPayload( + payloadDetailsArray[0] = IFeesManager(addressResolver__.feesManager()).getWithdrawToPayload( msg.sender, chainSlug_, token_, diff --git a/contracts/apps/payload-delivery/app-gateway/DeliveryHelper.sol b/contracts/apps/payload-delivery/app-gateway/DeliveryHelper.sol index a8151dca..7b3a2909 100644 --- a/contracts/apps/payload-delivery/app-gateway/DeliveryHelper.sol +++ b/contracts/apps/payload-delivery/app-gateway/DeliveryHelper.sol @@ -30,7 +30,6 @@ contract DeliveryHelper is BatchAsync, OwnableTwoStep, Initializable { ) public reinitializer(version_) { _setAddressResolver(addressResolver_); version = version_; - feesManager = feesManager_; bidTimeout = bidTimeout_; _claimOwner(owner_); } @@ -42,7 +41,7 @@ contract DeliveryHelper is BatchAsync, OwnableTwoStep, Initializable { _payloadBatches[asyncId_].winningBid = winningBid_; // update fees - IFeesManager(feesManager).updateTransmitterFees( + IFeesManager(addressResolver__.feesManager()).updateTransmitterFees( winningBid_, asyncId_, _payloadBatches[asyncId_].appGateway @@ -92,7 +91,7 @@ contract DeliveryHelper is BatchAsync, OwnableTwoStep, Initializable { } function _finishBatch(bytes32 asyncId_, PayloadBatch storage payloadBatch_) internal { - IFeesManager(feesManager).unblockAndAssignFees( + IFeesManager(addressResolver__.feesManager()).unblockAndAssignFees( asyncId_, payloadBatch_.winningBid.transmitter, payloadBatch_.appGateway diff --git a/contracts/apps/payload-delivery/app-gateway/QueueAsync.sol b/contracts/apps/payload-delivery/app-gateway/QueueAsync.sol index 9bfa2890..b0711645 100644 --- a/contracts/apps/payload-delivery/app-gateway/QueueAsync.sol +++ b/contracts/apps/payload-delivery/app-gateway/QueueAsync.sol @@ -15,7 +15,6 @@ import {IDeliveryHelper} from "../../../interfaces/IDeliveryHelper.sol"; abstract contract QueueAsync is AddressResolverUtil, IDeliveryHelper { uint256 public saltCounter; uint256 public asyncCounter; - address public feesManager; uint256 public bidTimeout; diff --git a/deployments/dev_addresses.json b/deployments/dev_addresses.json index 6f7556e7..30f2c1ae 100644 --- a/deployments/dev_addresses.json +++ b/deployments/dev_addresses.json @@ -15,7 +15,7 @@ "AuctionManager": "0x1C09134d2d75034Cd7ec7A401B053d1217693f1B", "AuctionManagerImpl": "0xA894Fa3dab8897ED038e2B15DBc8d61ccb25eEec", "DeliveryHelper": "0x96DD7A17d8BB599365d437ab0F34d7505187F9E8", - "DeliveryHelperImpl": "0x5bA4C527883F7D9e12d71Da5Cd170f26eCF2F901", + "DeliveryHelperImpl": "0x16F3caAF1Dd731A058B96FbA737b181D070803ee", "ERC1967Factory": "0x494660a4bDcafC43a5522B98117D678654c6D3d5", "FeesManager": "0x178ED38fB5f08816378d614901cc2FB117883C32", "FeesManagerImpl": "0xa495982D3402B98c3EBA3cdA1Be72495A510FC40", diff --git a/deployments/dev_verification.json b/deployments/dev_verification.json index addff298..df13943b 100644 --- a/deployments/dev_verification.json +++ b/deployments/dev_verification.json @@ -1,6 +1,12 @@ { "421614": [], "7625382": [ + [ + "0x16F3caAF1Dd731A058B96FbA737b181D070803ee", + "DeliveryHelper", + "contracts/apps/payload-delivery/app-gateway/DeliveryHelper.sol", + [] + ], [ "0xA894Fa3dab8897ED038e2B15DBc8d61ccb25eEec", "AuctionManager", diff --git a/hardhat-scripts/constants/overrides.ts b/hardhat-scripts/constants/overrides.ts index f79babc2..8a6d8ce7 100644 --- a/hardhat-scripts/constants/overrides.ts +++ b/hardhat-scripts/constants/overrides.ts @@ -27,9 +27,9 @@ export const chainOverrides: { // gasPrice: 212_000_000_000, }, [EVMX_CHAIN_ID as ChainSlug]: { - type: 0, - // gasLimit: 1_000_000_000, - gasPrice: 0, + // type: 0, + gasLimit: 1_000_000_000, + // gasPrice: 0, }, }; diff --git a/hardhat-scripts/deploy/1.deploy.ts b/hardhat-scripts/deploy/1.deploy.ts index e2ed176f..0aca7c5e 100644 --- a/hardhat-scripts/deploy/1.deploy.ts +++ b/hardhat-scripts/deploy/1.deploy.ts @@ -20,6 +20,7 @@ import { VERSION, } from "../constants/constants"; import { CORE_CONTRACTS, OffChainVMCoreContracts } from "../../src"; +import { getImplementationAddress } from "./migration/migrate-proxies"; let offChainVMOwner: string; const main = async () => { @@ -255,16 +256,12 @@ const deployWatcherVMContracts = async () => { const feesManagerAddress = deployUtils.addresses[OffChainVMCoreContracts.FeesManager]; + console.log("Deploying DeliveryHelper"); + deployUtils = await deployContractWithProxy( OffChainVMCoreContracts.DeliveryHelper, `contracts/apps/payload-delivery/app-gateway/DeliveryHelper.sol`, - [ - addressResolver.address, - feesManagerAddress, - offChainVMOwner, - BID_TIMEOUT, - VERSION, - ], + [addressResolver.address, offChainVMOwner, BID_TIMEOUT, VERSION], proxyFactory, deployUtils ); @@ -398,7 +395,31 @@ const deployContractWithProxy = async ( deployUtils ); deployUtils.addresses[keyName] = implementation.address; - if (deployUtils.addresses[contractName] !== undefined) return deployUtils; + + if (deployUtils.addresses[contractName] !== undefined) { + const currentImplAddress = await getImplementationAddress( + deployUtils.addresses[contractName] + ); + const newImplementation = implementation.address; + + console.log("Current implementation:", currentImplAddress); + console.log("New implementation:", newImplementation); + + if (currentImplAddress.toLowerCase() === newImplementation.toLowerCase()) + return deployUtils; + + console.log("Upgrading contract"); + + const tx = await proxyFactory + .connect(deployUtils.signer) + .upgrade(deployUtils.addresses[contractName], newImplementation); + + console.log("Upgraded contract", tx.hash); + + await tx.wait(); + + return deployUtils; + } // Create initialization data const initializeFn = implementation.interface.getFunction("initialize"); diff --git a/hardhat-scripts/deploy/config.ts b/hardhat-scripts/deploy/config.ts index ad00e942..29ef9197 100644 --- a/hardhat-scripts/deploy/config.ts +++ b/hardhat-scripts/deploy/config.ts @@ -35,7 +35,7 @@ export const chains: Array = [ export const capacitorType = 1; export const maxPacketLength = 1; export const initialPacketCount = 0; -export const auctionEndDelaySeconds = 5; +export const auctionEndDelaySeconds = 0; const MSG_VALUE_MAX_THRESHOLD = utils.parseEther("0.001"); export const msgValueMaxThreshold = (chain: ChainSlug): BigNumberish => { diff --git a/hardhat-scripts/deploy/migration/migrate-proxies.ts b/hardhat-scripts/deploy/migration/migrate-proxies.ts index 7a44eca4..01de4ff4 100644 --- a/hardhat-scripts/deploy/migration/migrate-proxies.ts +++ b/hardhat-scripts/deploy/migration/migrate-proxies.ts @@ -19,7 +19,9 @@ const upgradeableContracts = [ "AuctionManager", ]; -async function getImplementationAddress(proxyAddress: string): Promise { +export async function getImplementationAddress( + proxyAddress: string +): Promise { const customProvider = new ethers.providers.JsonRpcProvider( process.env.EVMX_RPC as string ); @@ -33,10 +35,7 @@ async function getImplementationAddress(proxyAddress: string): Promise { return utils.getAddress("0x" + implHex.slice(-40)); } -async function main() { - // @ts-ignore - Hardhat Runtime Environment will be injected by hardhat - - // Read addresses from JSON file +async function loadAddresses() { const addressesPath = path.join( __dirname, "../../../deployments/dev_addresses.json" @@ -47,106 +46,137 @@ async function main() { throw new Error(`No addresses found for chain ID ${EVMX_CHAIN_ID}`); } + return addresses; +} + +async function setupSigner() { const providerInstance = getProviderFromChainSlug(EVMX_CHAIN_ID as ChainSlug); - const signer: Wallet = new ethers.Wallet( + return new ethers.Wallet( process.env.WATCHER_PRIVATE_KEY as string, providerInstance ); +} - // Get the proxy factory +async function setupProxyFactory(addresses: any, signer: Wallet) { let proxyFactory = await ethers.getContractAt( "ERC1967Factory", addresses[EVMX_CHAIN_ID].ERC1967Factory ); - proxyFactory = proxyFactory.connect(signer); + return proxyFactory.connect(signer); +} - // Loop through each upgradeable contract - for (const contractName of upgradeableContracts) { - console.log(`\nProcessing ${contractName}...`); +async function upgradeContract( + contractName: string, + addresses: any, + proxyFactory: Contract, + signer: Wallet +) { + console.log(`\nProcessing ${contractName}...`); + + const PROXY_ADDRESS = addresses[EVMX_CHAIN_ID][contractName]; + if (!PROXY_ADDRESS) { + console.log(`Contract address not found for ${contractName}`); + return; + } - const PROXY_ADDRESS = addresses[EVMX_CHAIN_ID][contractName]; - if (!PROXY_ADDRESS) { - console.log(`Contract address not found for ${contractName}`); - continue; - } + try { + const currentImplAddress = await getImplementationAddress(PROXY_ADDRESS); + console.log( + `Current implementation for ${contractName}: ${currentImplAddress}` + ); - try { - // Get current implementation - const currentImplAddress = await getImplementationAddress(PROXY_ADDRESS); - console.log( - `Current implementation for ${contractName}: ${currentImplAddress}` - ); - - // Get new implementation address - const newImplementation = addresses[EVMX_CHAIN_ID][`${contractName}Impl`]; - if (!newImplementation) { - console.log(`No implementation address found for ${contractName}`); - continue; - } - - // Get contract instance for state verification - let contract = await ethers.getContractAt(contractName, PROXY_ADDRESS); - contract = contract.connect(signer); - - let version; - try { - version = await contract.version(); - console.log("Version on contract before upgrade:", version); - } catch (error) { - console.log("version variable not found"); - } - - if (contractName === "AddressResolver") - await verifyBeaconImplementation(contract, signer); - - if ( - currentImplAddress.toLowerCase() === newImplementation.toLowerCase() - ) { - console.log("Implementation is already up to date"); - continue; - } - - // Upgrade proxy - console.log("Upgrading proxy..."); - - const initializeFn = contract.interface.getFunction("initialize"); - const initData = contract.interface.encodeFunctionData(initializeFn, [ - VERSION, - ]); - - const tx = await proxyFactory.upgradeAndCall( - PROXY_ADDRESS, - newImplementation, - initData - ); - console.log("tx", tx.hash); - await tx.wait(); - - // Verify upgrade - const updatedImplAddress = await getImplementationAddress(PROXY_ADDRESS); - console.log("New implementation:", updatedImplAddress); - - if ( - updatedImplAddress.toLowerCase() !== newImplementation.toLowerCase() - ) { - throw new Error( - "Upgrade verification failed - implementation mismatch" - ); - } - - version = await contract.version(); - console.log("Version on contract after upgrade:", version); - - if (contractName === "AddressResolver") { - await verifyBeaconImplementation(contract, signer); - } - - console.log("Upgrade successful and verified"); - } catch (error) { - console.error(`Error upgrading ${contractName}:`, error); - process.exit(1); + const newImplementation = addresses[EVMX_CHAIN_ID][`${contractName}Impl`]; + if (!newImplementation) { + console.log(`No implementation address found for ${contractName}`); + return; } + + let contract = await ethers.getContractAt(contractName, PROXY_ADDRESS); + contract = contract.connect(signer); + + await verifyAndUpgradeContract( + contract, + contractName, + currentImplAddress, + newImplementation, + proxyFactory, + signer + ); + } catch (error) { + console.error(`Error upgrading ${contractName}:`, error); + process.exit(1); + } +} + +async function verifyAndUpgradeContract( + contract: Contract, + contractName: string, + currentImplAddress: string, + newImplementation: string, + proxyFactory: Contract, + signer: Wallet +) { + let version; + try { + version = await contract.version(); + console.log("Version on contract before upgrade:", version); + } catch (error) { + console.log("version variable not found"); } + + if (contractName === "AddressResolver") + await verifyBeaconImplementation(contract, signer); + + if (currentImplAddress.toLowerCase() === newImplementation.toLowerCase()) { + console.log("Implementation is already up to date"); + return; + } + + await performUpgrade(contract, proxyFactory, newImplementation); + await verifyUpgrade(contract, newImplementation, contractName, signer); +} + +async function performUpgrade( + contract: Contract, + proxyFactory: Contract, + newImplementation: string +) { + console.log("Upgrading proxy..."); + const initializeFn = contract.interface.getFunction("initialize"); + const initData = contract.interface.encodeFunctionData(initializeFn, [ + VERSION, + ]); + + const tx = await proxyFactory.upgradeAndCall( + contract.address, + newImplementation, + initData + ); + console.log("tx", tx.hash); + await tx.wait(); +} + +async function verifyUpgrade( + contract: Contract, + newImplementation: string, + contractName: string, + signer: Wallet +) { + const updatedImplAddress = await getImplementationAddress(contract.address); + console.log("New implementation:", updatedImplAddress); + + if (updatedImplAddress.toLowerCase() !== newImplementation.toLowerCase()) { + throw new Error("Upgrade verification failed - implementation mismatch"); + } + + const version = await contract.version(); + console.log("Version on contract after upgrade:", version); + + if (contractName === "AddressResolver") { + await verifyBeaconImplementation(contract, signer); + } + + console.log("Upgrade successful and verified"); } async function verifyBeaconImplementation(contract: Contract, signer: Wallet) { @@ -193,11 +223,14 @@ async function verifyBeaconImplementation(contract: Contract, signer: Wallet) { throw new Error("Async promise beacon implementation mismatch"); } } -// We recommend this pattern to be able to use async/await everywhere -// and properly handle errors. -main() - .then(() => process.exit(0)) - .catch((error) => { - console.error(error); - process.exit(1); - }); + +async function main() { + // @ts-ignore - Hardhat Runtime Environment will be injected by hardhat + const addresses = await loadAddresses(); + const signer = await setupSigner(); + const proxyFactory = await setupProxyFactory(addresses, signer); + + for (const contractName of upgradeableContracts) { + await upgradeContract(contractName, addresses, proxyFactory, signer); + } +} diff --git a/hardhat.config.ts b/hardhat.config.ts index 7bd01929..7d0afbd6 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -165,7 +165,7 @@ const config: HardhatUserConfig = { evmVersion: "paris", optimizer: { enabled: true, - runs: 999999, + runs: 999, details: { yul: true, yulDetails: { From 4d1e2ac2fe0e595b626c4509945182db1977c74e Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Tue, 18 Feb 2025 15:37:42 +0400 Subject: [PATCH 032/186] fix: auction manager --- .../apps/payload-delivery/app-gateway/AuctionManager.sol | 9 ++++++--- .../apps/payload-delivery/app-gateway/DeliveryHelper.sol | 2 -- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/contracts/apps/payload-delivery/app-gateway/AuctionManager.sol b/contracts/apps/payload-delivery/app-gateway/AuctionManager.sol index 1034093c..e42e0eaf 100644 --- a/contracts/apps/payload-delivery/app-gateway/AuctionManager.sol +++ b/contracts/apps/payload-delivery/app-gateway/AuctionManager.sol @@ -31,6 +31,8 @@ contract AuctionManager is AddressResolverUtil, OwnableTwoStep, IAuctionManager, error BidExceedsMaxFees(); /// @notice Error thrown if winning bid is assigned to an invalid transmitter error InvalidTransmitter(); + /// @notice Error thrown if a lower bid already exists + error LowerBidAlreadyExists(); constructor() { _disableInitializers(); // disable for implementation @@ -96,10 +98,11 @@ contract AuctionManager is AddressResolverUtil, OwnableTwoStep, IAuctionManager, PayloadBatch memory payloadBatch = IDeliveryHelper(addressResolver__.deliveryHelper()) .payloadBatches(asyncId_); if (fee > payloadBatch.fees.amount) revert BidExceedsMaxFees(); - if (fee < winningBids[asyncId_].fee) return; - winningBids[asyncId_] = newBid; + if (winningBids[asyncId_].transmitter != address(0) && fee >= winningBids[asyncId_].fee) + revert LowerBidAlreadyExists(); + winningBids[asyncId_] = newBid; IFeesManager(addressResolver__.feesManager()).blockFees( payloadBatch.appGateway, payloadBatch.fees, @@ -126,7 +129,7 @@ contract AuctionManager is AddressResolverUtil, OwnableTwoStep, IAuctionManager, /// @notice Ends an auction /// @param asyncId_ The ID of the auction - function endAuction(bytes32 asyncId_) external onlyDeliveryHelper { + function endAuction(bytes32 asyncId_) external onlyWatcherPrecompile { _endAuction(asyncId_); } diff --git a/contracts/apps/payload-delivery/app-gateway/DeliveryHelper.sol b/contracts/apps/payload-delivery/app-gateway/DeliveryHelper.sol index 7b3a2909..a4042a09 100644 --- a/contracts/apps/payload-delivery/app-gateway/DeliveryHelper.sol +++ b/contracts/apps/payload-delivery/app-gateway/DeliveryHelper.sol @@ -19,11 +19,9 @@ contract DeliveryHelper is BatchAsync, OwnableTwoStep, Initializable { /// @notice Initializer function to replace constructor /// @param addressResolver_ The address resolver contract - /// @param feesManager_ The fees manager contract /// @param owner_ The owner address function initialize( address addressResolver_, - address feesManager_, address owner_, uint256 bidTimeout_, uint64 version_ From b32b54e8af4c04d6e0ac3dc848ed118fc8f90786 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Tue, 18 Feb 2025 16:17:13 +0400 Subject: [PATCH 033/186] feat: remove hasher --- contracts/interfaces/IHasher.sol | 22 ----------- contracts/socket/Socket.sol | 6 +-- contracts/socket/SocketBase.sol | 56 +++++++++++++++------------ contracts/socket/utils/Hasher.sol | 62 ------------------------------ hardhat-scripts/deploy/1.deploy.ts | 11 ------ hardhat-scripts/deploy/5.upload.ts | 1 - src/index.ts | 1 - test/SetupTest.t.sol | 8 ++-- 8 files changed, 38 insertions(+), 129 deletions(-) delete mode 100644 contracts/interfaces/IHasher.sol delete mode 100644 contracts/socket/utils/Hasher.sol diff --git a/contracts/interfaces/IHasher.sol b/contracts/interfaces/IHasher.sol deleted file mode 100644 index ffec5195..00000000 --- a/contracts/interfaces/IHasher.sol +++ /dev/null @@ -1,22 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0-only -pragma solidity ^0.8.21; - -import "./ISocket.sol"; - -/** - * @title IHasher - * @notice Interface for hasher contract that calculates the packed payload - */ -interface IHasher { - /** - * @notice returns the bytes32 hash of the payload packed - */ - function packPayload( - bytes32 payloadId_, - address appGateway_, - address transmitter_, - address target_, - uint256 executionGasLimit_, - bytes memory payload_ - ) external returns (bytes32); -} diff --git a/contracts/socket/Socket.sol b/contracts/socket/Socket.sol index 31726da5..200a384d 100644 --- a/contracts/socket/Socket.sol +++ b/contracts/socket/Socket.sol @@ -4,6 +4,7 @@ pragma solidity ^0.8.21; import "../interfaces/IPlug.sol"; import "./SocketBase.sol"; import {PlugDisconnected, InvalidAppGateway} from "../common/Errors.sol"; + /** * @title SocketDst * @dev SocketDst is an abstract contract that inherits from SocketBase and @@ -53,11 +54,10 @@ contract Socket is SocketBase { constructor( uint32 chainSlug_, - address hasher_, address signatureVerifier_, address owner_, string memory version_ - ) SocketBase(chainSlug_, hasher_, signatureVerifier_, owner_, version_) {} + ) SocketBase(chainSlug_, signatureVerifier_, owner_, version_) {} //////////////////////////////////////////////////////// ////////////////////// OPERATIONS ////////////////////////// @@ -121,7 +121,7 @@ contract Socket is SocketBase { ); // create packed payload - bytes32 root = hasher__.packPayload( + bytes32 root = _packPayload( payloadId_, appGateway_, transmitter, diff --git a/contracts/socket/SocketBase.sol b/contracts/socket/SocketBase.sol index 87d1af8b..ccef2a8a 100644 --- a/contracts/socket/SocketBase.sol +++ b/contracts/socket/SocketBase.sol @@ -1,7 +1,6 @@ // SPDX-License-Identifier: GPL-3.0-only pragma solidity ^0.8.21; -import "../interfaces/IHasher.sol"; import "../interfaces/ISignatureVerifier.sol"; import "../libraries/RescueFundsLib.sol"; @@ -21,18 +20,15 @@ abstract contract SocketBase is SocketConfig { /* * @notice constructor for creating a new Socket contract instance. * @param chainSlug_ The unique identifier of the chain this socket is deployed on. - * @param hasher_ The address of the Hasher contract used to pack the payload before executing them. * @param owner_ The address of the owner who has the initial admin role. * @param version_ The version string which is hashed and stored in socket. */ constructor( uint32 chainSlug_, - address hasher_, address signatureVerifier_, address owner_, string memory version_ ) { - hasher__ = IHasher(hasher_); signatureVerifier__ = ISignatureVerifier(signatureVerifier_); chainSlug = chainSlug_; version = keccak256(bytes(version_)); @@ -43,8 +39,6 @@ abstract contract SocketBase is SocketConfig { //////////// PERIPHERY CONTRACT CONNECTORS //////////// //////////////////////////////////////////////////////// - // Hasher contract - IHasher public hasher__; // Signature Verifier contract ISignatureVerifier public signatureVerifier__; @@ -60,12 +54,6 @@ abstract contract SocketBase is SocketConfig { //////////////////////////////////////////////////////// ////////////////////// EVENTS ////////////////////////// //////////////////////////////////////////////////////// - /** - * @notice An event that is emitted when the hasher is updated. - * @param hasher The address of the new hasher. - */ - event HasherSet(address hasher); - /** * @notice An event that is emitted when a new signatureVerifier contract is set * @param signatureVerifier address of new signatureVerifier contract @@ -75,19 +63,8 @@ abstract contract SocketBase is SocketConfig { ////////////////////////////////////////////////// //////////// GOV Permissioned setters //////////// ////////////////////////////////////////////////// - /** - * @notice updates hasher__ - * @dev Only governance can call this function - * @param hasher_ address of hasher - */ - function setHasher(address hasher_) external onlyRole(GOVERNANCE_ROLE) { - hasher__ = IHasher(hasher_); - emit HasherSet(hasher_); - } - - /** - * @notice updates hasher__ + * @notice updates signatureVerifier__ * @dev Only governance can call this function * @param signatureVerifier_ address of signatureVerifier */ @@ -96,6 +73,37 @@ abstract contract SocketBase is SocketConfig { emit SignatureVerifierSet(signatureVerifier_); } + /** + * @notice Packs the payload into a bytes32 hash + * @param payloadId_ The ID of the payload + * @param appGateway_ The address of the application gateway + * @param transmitter_ The address of the transmitter + * @param target_ The address of the target contract + * @param executionGasLimit_ The gas limit for the execution + * @param payload_ The payload to be packed + * @return The packed payload as a bytes32 hash + */ + function _packPayload( + bytes32 payloadId_, + address appGateway_, + address transmitter_, + address target_, + uint256 executionGasLimit_, + bytes memory payload_ + ) internal pure returns (bytes32) { + return + keccak256( + abi.encode( + payloadId_, + appGateway_, + transmitter_, + target_, + executionGasLimit_, + payload_ + ) + ); + } + ////////////////////////////////////////////// //////////// Rescue role actions //////////// ///////////////////////////////////////////// diff --git a/contracts/socket/utils/Hasher.sol b/contracts/socket/utils/Hasher.sol deleted file mode 100644 index 8b5c6263..00000000 --- a/contracts/socket/utils/Hasher.sol +++ /dev/null @@ -1,62 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0-only -pragma solidity ^0.8.21; - -import "../../interfaces/IHasher.sol"; -import "../../interfaces/ISocket.sol"; -import "../../libraries/RescueFundsLib.sol"; - -import "./AccessControl.sol"; -import {RESCUE_ROLE} from "./AccessRoles.sol"; - -/** - * @title Hasher - * @notice contract for hasher contract that calculates the packed payload - * @dev This contract is modular component in socket to support different payload packing algorithms in case of blockchains - * not supporting this type of packing. - */ -contract Hasher is IHasher, AccessControl { - /** - * @notice initializes and grants RESCUE_ROLE to owner. - * @param owner_ The address of the owner of the contract. - */ - constructor(address owner_) { - _initializeOwner(owner_); - _grantRole(RESCUE_ROLE, owner_); - } - - /// @inheritdoc IHasher - function packPayload( - bytes32 payloadId_, - address appGateway_, - address transmitter_, - address target_, - uint256 executionGasLimit_, - bytes memory payload_ - ) external pure override returns (bytes32) { - return - keccak256( - abi.encode( - payloadId_, - appGateway_, - transmitter_, - target_, - executionGasLimit_, - payload_ - ) - ); - } - - /** - * @notice Rescues funds from the contract if they are locked by mistake. - * @param token_ The address of the token contract. - * @param rescueTo_ The address where rescued tokens need to be sent. - * @param amount_ The amount of tokens to be rescued. - */ - function rescueFunds( - address token_, - address rescueTo_, - uint256 amount_ - ) external onlyRole(RESCUE_ROLE) { - RescueFundsLib._rescueFunds(token_, rescueTo_, amount_); - } -} diff --git a/hardhat-scripts/deploy/1.deploy.ts b/hardhat-scripts/deploy/1.deploy.ts index c4b3e4f4..c1f95aa1 100644 --- a/hardhat-scripts/deploy/1.deploy.ts +++ b/hardhat-scripts/deploy/1.deploy.ts @@ -74,16 +74,6 @@ const main = async () => { deployUtils.signer ); - contractName = CORE_CONTRACTS.Hasher; - const hasher: Contract = await getOrDeploy( - contractName, - contractName, - `contracts/socket/utils/${contractName}.sol`, - [socketOwner], - deployUtils - ); - deployUtils.addresses[contractName] = hasher.address; - contractName = CORE_CONTRACTS.Socket; const socket: Contract = await getOrDeploy( contractName, @@ -91,7 +81,6 @@ const main = async () => { `contracts/socket/${contractName}.sol`, [ chain as ChainSlug, - hasher.address, signatureVerifier.address, socketOwner, "EVMX", diff --git a/hardhat-scripts/deploy/5.upload.ts b/hardhat-scripts/deploy/5.upload.ts index b174760c..41179d9d 100644 --- a/hardhat-scripts/deploy/5.upload.ts +++ b/hardhat-scripts/deploy/5.upload.ts @@ -39,7 +39,6 @@ type ConfigEntry = { eventBlockRange: number; addresses?: { SignatureVerifier: string; - Hasher: string; Socket: string; FastSwitchboard: string; SocketBatcher: string; diff --git a/src/index.ts b/src/index.ts index d96eafbe..c0f4e709 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,5 +1,4 @@ export enum CORE_CONTRACTS { - Hasher = "Hasher", SignatureVerifier = "SignatureVerifier", Socket = "Socket", SocketBatcher = "SocketBatcher", diff --git a/test/SetupTest.t.sol b/test/SetupTest.t.sol index 85bf06cf..d5ed4092 100644 --- a/test/SetupTest.t.sol +++ b/test/SetupTest.t.sol @@ -9,12 +9,11 @@ import "../contracts/interfaces/IForwarder.sol"; import "../contracts/socket/utils/AccessRoles.sol"; import {Socket} from "../contracts/socket/Socket.sol"; import {SignatureVerifier} from "../contracts/socket/utils/SignatureVerifier.sol"; -import {Hasher} from "../contracts/socket/utils/Hasher.sol"; import "../contracts/socket/switchboard/FastSwitchboard.sol"; import "../contracts/socket/SocketBatcher.sol"; import "../contracts/AddressResolver.sol"; -import {ContractFactoryPlug} from "../contracts/apps/payload-delivery/ContractFactoryPlug.sol"; -import {FeesPlug} from "../contracts/apps/payload-delivery/FeesPlug.sol"; +import {ContractFactoryPlug} from "../contracts/payload-delivery/ContractFactoryPlug.sol"; +import {FeesPlug} from "../contracts/payload-delivery/FeesPlug.sol"; import {ETH_ADDRESS} from "../contracts/common/Constants.sol"; import {ResolvedPromises} from "../contracts/common/Structs.sol"; @@ -72,8 +71,7 @@ contract SetupTest is Test { SignatureVerifier verifier = new SignatureVerifier(); verifier.initialize(owner); - Hasher hasher = new Hasher(owner); - Socket socket = new Socket(chainSlug_, address(hasher), address(verifier), owner, "test"); + Socket socket = new Socket(chainSlug_, address(verifier), owner, "test"); SocketBatcher socketBatcher = new SocketBatcher(owner, socket); FastSwitchboard switchboard = new FastSwitchboard(chainSlug_, socket, verifier, owner); From a8eba8afd6a4aa106fbc1a33e4fd68318cc07e48 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Tue, 18 Feb 2025 16:17:18 +0400 Subject: [PATCH 034/186] fix: test --- .../payload-delivery/ContractFactoryPlug.sol | 6 +++--- contracts/payload-delivery/FeesPlug.sol | 4 ++-- .../app-gateway/AuctionManager.sol | 12 ++++++------ .../app-gateway/BatchAsync.sol | 16 ++++++++-------- .../app-gateway/DeliveryHelper.sol | 8 ++++---- .../app-gateway/FeesManager.sol | 14 +++++++------- .../app-gateway/QueueAsync.sol | 18 +++++++++--------- script/PayFeesInArbitrumETH.s.sol | 2 +- .../counter/WithdrawFeesArbitrumFeesPlug.s.sol | 2 +- test/DeliveryHelper.t.sol | 6 +++--- 10 files changed, 44 insertions(+), 44 deletions(-) diff --git a/contracts/payload-delivery/ContractFactoryPlug.sol b/contracts/payload-delivery/ContractFactoryPlug.sol index 4a82da82..3d4b50a4 100644 --- a/contracts/payload-delivery/ContractFactoryPlug.sol +++ b/contracts/payload-delivery/ContractFactoryPlug.sol @@ -1,9 +1,9 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.21; -import "../../base/PlugBase.sol"; +import "../base/PlugBase.sol"; import {Ownable} from "solady/auth/Ownable.sol"; -import {NotSocket} from "../../common/Errors.sol"; +import {NotSocket} from "../common/Errors.sol"; /// @title ContractFactory /// @notice Abstract contract for deploying contracts @@ -36,7 +36,7 @@ contract ContractFactoryPlug is PlugBase, Ownable { } } - IPlug(addr).initSocket(appGateway_, msg.sender, switchboard_); + IPlug(addr).connectSocket(appGateway_, msg.sender, switchboard_); emit Deployed(addr, salt_); return addr; } diff --git a/contracts/payload-delivery/FeesPlug.sol b/contracts/payload-delivery/FeesPlug.sol index ce148308..9e9c1f85 100644 --- a/contracts/payload-delivery/FeesPlug.sol +++ b/contracts/payload-delivery/FeesPlug.sol @@ -2,9 +2,9 @@ pragma solidity ^0.8.21; import "solmate/utils/SafeTransferLib.sol"; -import "../../base/PlugBase.sol"; +import "../base/PlugBase.sol"; import {Ownable} from "solady/auth/Ownable.sol"; -import {ETH_ADDRESS} from "../../common/Constants.sol"; +import {ETH_ADDRESS} from "../common/Constants.sol"; /// @title FeesManager /// @notice Abstract contract for managing fees diff --git a/contracts/payload-delivery/app-gateway/AuctionManager.sol b/contracts/payload-delivery/app-gateway/AuctionManager.sol index 0755ed34..640ce145 100644 --- a/contracts/payload-delivery/app-gateway/AuctionManager.sol +++ b/contracts/payload-delivery/app-gateway/AuctionManager.sol @@ -2,12 +2,12 @@ pragma solidity ^0.8.0; import {Ownable} from "solady/auth/Ownable.sol"; -import {SignatureVerifier} from "../../../socket/utils/SignatureVerifier.sol"; -import {AddressResolverUtil} from "../../../utils/AddressResolverUtil.sol"; -import {Fees, Bid, PayloadBatch} from "../../../common/Structs.sol"; -import {IDeliveryHelper} from "../../../interfaces/IDeliveryHelper.sol"; -import {IFeesManager} from "../../../interfaces/IFeesManager.sol"; -import "../../../interfaces/IAuctionManager.sol"; +import {SignatureVerifier} from "../../socket/utils/SignatureVerifier.sol"; +import {AddressResolverUtil} from "../../utils/AddressResolverUtil.sol"; +import {Fees, Bid, PayloadBatch} from "../../common/Structs.sol"; +import {IDeliveryHelper} from "../../interfaces/IDeliveryHelper.sol"; +import {IFeesManager} from "../../interfaces/IFeesManager.sol"; +import {IAuctionManager} from "../../interfaces/IAuctionManager.sol"; import "solady/utils/Initializable.sol"; /// @title AuctionManager diff --git a/contracts/payload-delivery/app-gateway/BatchAsync.sol b/contracts/payload-delivery/app-gateway/BatchAsync.sol index efe0c60b..af12156d 100644 --- a/contracts/payload-delivery/app-gateway/BatchAsync.sol +++ b/contracts/payload-delivery/app-gateway/BatchAsync.sol @@ -3,14 +3,14 @@ pragma solidity ^0.8.21; import "./QueueAsync.sol"; -import {IDeliveryHelper} from "../../../interfaces/IDeliveryHelper.sol"; -import {IAppGateway} from "../../../interfaces/IAppGateway.sol"; -import {IAddressResolver} from "../../../interfaces/IAddressResolver.sol"; -import {IAuctionManager} from "../../../interfaces/IAuctionManager.sol"; -import {IFeesManager} from "../../../interfaces/IFeesManager.sol"; - -import {Bid, PayloadBatch, Fees, PayloadDetails} from "../../../common/Structs.sol"; -import {FORWARD_CALL, DISTRIBUTE_FEE, DEPLOY, WITHDRAW, QUERY, FINALIZE} from "../../../common/Constants.sol"; +import {IDeliveryHelper} from "../../interfaces/IDeliveryHelper.sol"; +import {IAppGateway} from "../../interfaces/IAppGateway.sol"; +import {IAddressResolver} from "../../interfaces/IAddressResolver.sol"; +import {IAuctionManager} from "../../interfaces/IAuctionManager.sol"; +import {IFeesManager} from "../../interfaces/IFeesManager.sol"; + +import {Bid, PayloadBatch, Fees, PayloadDetails} from "../../common/Structs.sol"; +import {FORWARD_CALL, DISTRIBUTE_FEE, DEPLOY, WITHDRAW, QUERY, FINALIZE} from "../../common/Constants.sol"; /// @title BatchAsync /// @notice Abstract contract for managing asynchronous payload batches diff --git a/contracts/payload-delivery/app-gateway/DeliveryHelper.sol b/contracts/payload-delivery/app-gateway/DeliveryHelper.sol index 4ab7c8de..8b10dd4d 100644 --- a/contracts/payload-delivery/app-gateway/DeliveryHelper.sol +++ b/contracts/payload-delivery/app-gateway/DeliveryHelper.sol @@ -1,11 +1,11 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -import {IAppGateway} from "../../../interfaces/IAppGateway.sol"; +import {IAppGateway} from "../../interfaces/IAppGateway.sol"; import {Ownable} from "solady/auth/Ownable.sol"; -import {Bid, PayloadBatch, Fees, PayloadDetails, FinalizeParams} from "../../../common/Structs.sol"; -import {DISTRIBUTE_FEE, DEPLOY} from "../../../common/Constants.sol"; -import {PromisesNotResolved} from "../../../common/Errors.sol"; +import {Bid, PayloadBatch, Fees, PayloadDetails, FinalizeParams} from "../../common/Structs.sol"; +import {DISTRIBUTE_FEE, DEPLOY} from "../../common/Constants.sol"; +import {PromisesNotResolved} from "../../common/Errors.sol"; import "./BatchAsync.sol"; import "solady/utils/Initializable.sol"; diff --git a/contracts/payload-delivery/app-gateway/FeesManager.sol b/contracts/payload-delivery/app-gateway/FeesManager.sol index 4e6e21f2..e6f5708c 100644 --- a/contracts/payload-delivery/app-gateway/FeesManager.sol +++ b/contracts/payload-delivery/app-gateway/FeesManager.sol @@ -2,13 +2,13 @@ pragma solidity ^0.8.0; import {Ownable} from "solady/auth/Ownable.sol"; -import {SignatureVerifier} from "../../../socket/utils/SignatureVerifier.sol"; -import {AddressResolverUtil} from "../../../utils/AddressResolverUtil.sol"; -import {Bid, Fees, PayloadDetails, CallType, FinalizeParams, PayloadBatch} from "../../../common/Structs.sol"; -import {IDeliveryHelper} from "../../../interfaces/IDeliveryHelper.sol"; -import {FORWARD_CALL, DISTRIBUTE_FEE, DEPLOY, WITHDRAW} from "../../../common/Constants.sol"; -import {IFeesPlug} from "../../../interfaces/IFeesPlug.sol"; -import {IFeesManager} from "../../../interfaces/IFeesManager.sol"; +import {SignatureVerifier} from "../../socket/utils/SignatureVerifier.sol"; +import {AddressResolverUtil} from "../../utils/AddressResolverUtil.sol"; +import {Bid, Fees, PayloadDetails, CallType, FinalizeParams, PayloadBatch} from "../../common/Structs.sol"; +import {IDeliveryHelper} from "../../interfaces/IDeliveryHelper.sol"; +import {FORWARD_CALL, DISTRIBUTE_FEE, DEPLOY, WITHDRAW} from "../../common/Constants.sol"; +import {IFeesPlug} from "../../interfaces/IFeesPlug.sol"; +import {IFeesManager} from "../../interfaces/IFeesManager.sol"; import "solady/utils/Initializable.sol"; /// @title FeesManager diff --git a/contracts/payload-delivery/app-gateway/QueueAsync.sol b/contracts/payload-delivery/app-gateway/QueueAsync.sol index 9bfa2890..d7ecc30e 100644 --- a/contracts/payload-delivery/app-gateway/QueueAsync.sol +++ b/contracts/payload-delivery/app-gateway/QueueAsync.sol @@ -1,15 +1,15 @@ // SPDX-License-Identifier: Unlicense pragma solidity ^0.8.21; -import {AddressResolverUtil} from "../../../utils/AddressResolverUtil.sol"; -import {CallParams, Fees, PayloadDetails, CallType, Bid, PayloadBatch} from "../../../common/Structs.sol"; -import {NotAuctionManager, InvalidPromise, InvalidIndex} from "../../../common/Errors.sol"; -import {AsyncPromise} from "../../../AsyncPromise.sol"; -import {IPromise} from "../../../interfaces/IPromise.sol"; -import {IAppDeployer} from "../../../interfaces/IAppDeployer.sol"; -import {IAddressResolver} from "../../../interfaces/IAddressResolver.sol"; -import {IContractFactoryPlug} from "../../../interfaces/IContractFactoryPlug.sol"; -import {IDeliveryHelper} from "../../../interfaces/IDeliveryHelper.sol"; +import {AddressResolverUtil} from "../../utils/AddressResolverUtil.sol"; +import {CallParams, Fees, PayloadDetails, CallType, Bid, PayloadBatch} from "../../common/Structs.sol"; +import {NotAuctionManager, InvalidPromise, InvalidIndex} from "../../common/Errors.sol"; +import {AsyncPromise} from "../../AsyncPromise.sol"; +import {IPromise} from "../../interfaces/IPromise.sol"; +import {IAppDeployer} from "../../interfaces/IAppDeployer.sol"; +import {IAddressResolver} from "../../interfaces/IAddressResolver.sol"; +import {IContractFactoryPlug} from "../../interfaces/IContractFactoryPlug.sol"; +import {IDeliveryHelper} from "../../interfaces/IDeliveryHelper.sol"; /// @notice Abstract contract for managing asynchronous payloads abstract contract QueueAsync is AddressResolverUtil, IDeliveryHelper { diff --git a/script/PayFeesInArbitrumETH.s.sol b/script/PayFeesInArbitrumETH.s.sol index e7bcc760..15472b22 100644 --- a/script/PayFeesInArbitrumETH.s.sol +++ b/script/PayFeesInArbitrumETH.s.sol @@ -3,7 +3,7 @@ pragma solidity ^0.8.0; import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/Console.sol"; -import {FeesPlug} from "../contracts/apps/payload-delivery/FeesPlug.sol"; +import {FeesPlug} from "../contracts/payload-delivery/FeesPlug.sol"; import {Fees} from "../contracts/common/Structs.sol"; import {ETH_ADDRESS} from "../contracts/common/Constants.sol"; diff --git a/script/counter/WithdrawFeesArbitrumFeesPlug.s.sol b/script/counter/WithdrawFeesArbitrumFeesPlug.s.sol index d9c49f1f..a46195d5 100644 --- a/script/counter/WithdrawFeesArbitrumFeesPlug.s.sol +++ b/script/counter/WithdrawFeesArbitrumFeesPlug.s.sol @@ -3,7 +3,7 @@ pragma solidity ^0.8.0; import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/Console.sol"; -import {FeesPlug} from "../../contracts/apps/payload-delivery/FeesPlug.sol"; +import {FeesPlug} from "../../contracts/payload-delivery/FeesPlug.sol"; import {ETH_ADDRESS} from "../../contracts/common/Constants.sol"; import {CounterAppGateway} from "../../contracts/apps/counter/CounterAppGateway.sol"; diff --git a/test/DeliveryHelper.t.sol b/test/DeliveryHelper.t.sol index 133f6638..f0aef928 100644 --- a/test/DeliveryHelper.t.sol +++ b/test/DeliveryHelper.t.sol @@ -1,9 +1,9 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -import "../contracts/apps/payload-delivery/app-gateway/DeliveryHelper.sol"; -import "../contracts/apps/payload-delivery/app-gateway/FeesManager.sol"; -import "../contracts/apps/payload-delivery/app-gateway/AuctionManager.sol"; +import "../contracts/payload-delivery/app-gateway/DeliveryHelper.sol"; +import "../contracts/payload-delivery/app-gateway/FeesManager.sol"; +import "../contracts/payload-delivery/app-gateway/AuctionManager.sol"; import "../contracts/Forwarder.sol"; import "../contracts/interfaces/IAppDeployer.sol"; From ec4c8c549d6e3d30925a559ef8a4b7f2aecb8cde Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Tue, 18 Feb 2025 16:36:12 +0400 Subject: [PATCH 035/186] feat: merged sig verifier --- Errors.md | 14 -- contracts/interfaces/ISignatureVerifier.sol | 16 -- contracts/libraries/ECDSA.sol | 192 ------------------ .../app-gateway/AuctionManager.sol | 17 +- .../app-gateway/BatchAsync.sol | 5 +- .../app-gateway/FeesManager.sol | 1 - contracts/socket/Socket.sol | 5 +- contracts/socket/SocketBase.sol | 49 +---- .../socket/switchboard/FastSwitchboard.sol | 9 +- .../socket/switchboard/SwitchboardBase.sol | 24 +-- contracts/socket/utils/SignatureVerifier.sol | 62 ------ deployments/dev_addresses.json | 5 - deployments/dev_verification.json | 6 - hardhat-scripts/deploy/1.deploy.ts | 54 +---- hardhat-scripts/deploy/5.upload.ts | 1 - .../deploy/migration/migrate-proxies.ts | 1 - src/index.ts | 2 - test/DeliveryHelper.t.sol | 1 - test/Migration.t.sol | 29 +-- test/SetupTest.t.sol | 25 +-- 20 files changed, 54 insertions(+), 464 deletions(-) delete mode 100644 contracts/interfaces/ISignatureVerifier.sol delete mode 100644 contracts/libraries/ECDSA.sol delete mode 100644 contracts/socket/utils/SignatureVerifier.sol diff --git a/Errors.md b/Errors.md index 6ed5971b..93712470 100644 --- a/Errors.md +++ b/Errors.md @@ -101,14 +101,6 @@ | `InvalidIndex()` | `0x63df8171` | | `FeesNotSet()` | `0x2a831034` | -## libraries/ECDSA.sol - -| Error | Signature | -| -------------------------------------- | ------------ | -| `ECDSAInvalidSignature()` | `0xf645eedf` | -| `ECDSAInvalidSignatureLength(uint256)` | `0xfce698f7` | -| `ECDSAInvalidSignatureS(bytes32)` | `0xd78bce0c` | - ## libraries/RescueFundsLib.sol | Error | Signature | @@ -175,12 +167,6 @@ | ------------------- | ------------ | | `NoPermit(bytes32)` | `0x962f6333` | -## socket/utils/SignatureVerifier.sol - -| Error | Signature | -| -------------------- | ------------ | -| `InvalidSigLength()` | `0xd2453293` | - ## utils/AddressResolverUtil.sol | Error | Signature | diff --git a/contracts/interfaces/ISignatureVerifier.sol b/contracts/interfaces/ISignatureVerifier.sol deleted file mode 100644 index 8a878851..00000000 --- a/contracts/interfaces/ISignatureVerifier.sol +++ /dev/null @@ -1,16 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0-only -pragma solidity ^0.8.21; - -/** - * @title Signature Verifier - * @notice Verifies the signatures and returns the address of signer recovered from the input signature or digest. - */ -interface ISignatureVerifier { - /** - * @notice returns the address of signer recovered from input signature and digest - */ - function recoverSigner( - bytes32 digest_, - bytes memory signature_ - ) external pure returns (address signer); -} diff --git a/contracts/libraries/ECDSA.sol b/contracts/libraries/ECDSA.sol deleted file mode 100644 index b5295cf4..00000000 --- a/contracts/libraries/ECDSA.sol +++ /dev/null @@ -1,192 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v5.0.0) (utils/cryptography/ECDSA.sol) - -pragma solidity ^0.8.21; - -/** - * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. - * - * These functions can be used to verify that a payload was signed by the holder - * of the private keys of a given address. - */ -library ECDSA { - enum RecoverError { - NoError, - InvalidSignature, - InvalidSignatureLength, - InvalidSignatureS - } - - /** - * @dev The signature derives the `address(0)`. - */ - error ECDSAInvalidSignature(); - - /** - * @dev The signature has an invalid length. - */ - error ECDSAInvalidSignatureLength(uint256 length); - - /** - * @dev The signature has an S value that is in the upper half order. - */ - error ECDSAInvalidSignatureS(bytes32 s); - - /** - * @dev Returns the address that signed a hashed message (`hash`) with `signature` or an error. This will not - * return address(0) without also returning an error description. Errors are documented using an enum (error type) - * and a bytes32 providing additional information about the error. - * - * If no error is returned, then the address can be used for verification purposes. - * - * The `ecrecover` EVM precompile allows for malleable (non-unique) signatures: - * this function rejects them by requiring the `s` value to be in the lower - * half order, and the `v` value to be either 27 or 28. - * - * IMPORTANT: `hash` _must_ be the result of a hash operation for the - * verification to be secure: it is possible to craft signatures that - * recover to arbitrary addresses for non-hashed data. A safe way to ensure - * this is by receiving a hash of the original message (which may otherwise - * be too long), and then calling {MessageHashUtils-toEthSignedMessageHash} on it. - * - * Documentation for signature generation: - * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] - * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] - */ - function _tryRecover( - bytes32 hash_, - bytes memory signature_ - ) internal pure returns (address, RecoverError, bytes32) { - if (signature_.length == 65) { - bytes32 r; - bytes32 s; - uint8 v; - // ecrecover takes the signature parameters, and the only way to get them - // currently is to use assembly. - /// @solidity memory-safe-assembly - assembly { - r := mload(add(signature_, 0x20)) - s := mload(add(signature_, 0x40)) - v := byte(0, mload(add(signature_, 0x60))) - } - return _tryRecover(hash_, v, r, s); - } else { - return (address(0), RecoverError.InvalidSignatureLength, bytes32(signature_.length)); - } - } - - /** - * @dev Returns the address that signed a hashed message (`hash`) with - * `signature`. This address can then be used for verification purposes. - * - * The `ecrecover` EVM precompile allows for malleable (non-unique) signatures: - * this function rejects them by requiring the `s` value to be in the lower - * half order, and the `v` value to be either 27 or 28. - * - * IMPORTANT: `hash` _must_ be the result of a hash operation for the - * verification to be secure: it is possible to craft signatures that - * recover to arbitrary addresses for non-hashed data. A safe way to ensure - * this is by receiving a hash of the original message (which may otherwise - * be too long), and then calling {MessageHashUtils-toEthSignedMessageHash} on it. - */ - function _recover(bytes32 hash_, bytes memory signature_) internal pure returns (address) { - (address recovered, RecoverError error, bytes32 errorArg) = _tryRecover(hash_, signature_); - _throwError(error, errorArg); - return recovered; - } - - /** - * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. - * - * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] - */ - function _tryRecover( - bytes32 hash_, - bytes32 r_, - bytes32 vs_ - ) internal pure returns (address, RecoverError, bytes32) { - unchecked { - bytes32 s_ = vs_ & - bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); - // We do not check for an overflow here since the shift operation results in 0 or 1. - uint8 v_ = uint8((uint256(vs_) >> 255) + 27); - return _tryRecover(hash_, v_, r_, s_); - } - } - - /** - * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. - */ - function _recover(bytes32 hash_, bytes32 r_, bytes32 vs_) internal pure returns (address) { - (address recovered, RecoverError error, bytes32 errorArg) = _tryRecover(hash_, r_, vs_); - _throwError(error, errorArg); - return recovered; - } - - /** - * @dev Overload of {ECDSA-tryRecover} that receives the `v`, - * `r` and `s` signature fields separately. - */ - function _tryRecover( - bytes32 hash_, - uint8 v_, - bytes32 r_, - bytes32 s_ - ) internal pure returns (address, RecoverError, bytes32) { - // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature - // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines - // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most - // signatures from current libraries generate a unique signature with an s-value in the lower half order. - // - // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value - // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or - // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept - // these malleable signatures as well. - if (uint256(s_) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { - return (address(0), RecoverError.InvalidSignatureS, s_); - } - - // If the signature is valid (and not malleable), return the signer address - address signer_ = ecrecover(hash_, v_, r_, s_); - if (signer_ == address(0)) { - return (address(0), RecoverError.InvalidSignature, bytes32(0)); - } - - return (signer_, RecoverError.NoError, bytes32(0)); - } - - /** - * @dev Overload of {ECDSA-recover} that receives the `v`, - * `r` and `s` signature fields separately. - */ - function _recover( - bytes32 hash_, - uint8 v_, - bytes32 r_, - bytes32 s_ - ) internal pure returns (address) { - (address recovered_, RecoverError error_, bytes32 errorArg_) = _tryRecover( - hash_, - v_, - r_, - s_ - ); - _throwError(error_, errorArg_); - return recovered_; - } - - /** - * @dev Optionally reverts with the corresponding custom error according to the `error` argument provided. - */ - function _throwError(RecoverError error_, bytes32 errorArg_) private pure { - if (error_ == RecoverError.NoError) { - return; // no error: do nothing - } else if (error_ == RecoverError.InvalidSignature) { - revert ECDSAInvalidSignature(); - } else if (error_ == RecoverError.InvalidSignatureLength) { - revert ECDSAInvalidSignatureLength(uint256(errorArg_)); - } else if (error_ == RecoverError.InvalidSignatureS) { - revert ECDSAInvalidSignatureS(errorArg_); - } - } -} diff --git a/contracts/payload-delivery/app-gateway/AuctionManager.sol b/contracts/payload-delivery/app-gateway/AuctionManager.sol index 640ce145..f335246a 100644 --- a/contracts/payload-delivery/app-gateway/AuctionManager.sol +++ b/contracts/payload-delivery/app-gateway/AuctionManager.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.0; import {Ownable} from "solady/auth/Ownable.sol"; -import {SignatureVerifier} from "../../socket/utils/SignatureVerifier.sol"; +import {ECDSA} from "solady/utils/ECDSA.sol"; import {AddressResolverUtil} from "../../utils/AddressResolverUtil.sol"; import {Fees, Bid, PayloadBatch} from "../../common/Structs.sol"; import {IDeliveryHelper} from "../../interfaces/IDeliveryHelper.sol"; @@ -13,7 +13,6 @@ import "solady/utils/Initializable.sol"; /// @title AuctionManager /// @notice Contract for managing auctions and placing bids contract AuctionManager is AddressResolverUtil, Ownable, IAuctionManager, Initializable { - SignatureVerifier public signatureVerifier; uint32 public vmChainSlug; mapping(bytes32 => Bid) public winningBids; // asyncId => auction status @@ -40,20 +39,17 @@ contract AuctionManager is AddressResolverUtil, Ownable, IAuctionManager, Initia /// @param vmChainSlug_ The chain slug for the VM /// @param auctionEndDelaySeconds_ The delay in seconds before an auction can end /// @param addressResolver_ The address of the address resolver - /// @param signatureVerifier_ The address of the signature verifier /// @param owner_ The address of the contract owner function initialize( uint32 vmChainSlug_, uint256 auctionEndDelaySeconds_, address addressResolver_, - SignatureVerifier signatureVerifier_, address owner_ ) public reinitializer(1) { _setAddressResolver(addressResolver_); _initializeOwner(owner_); version = 1; vmChainSlug = vmChainSlug_; - signatureVerifier = signatureVerifier_; auctionEndDelaySeconds = auctionEndDelaySeconds_; } @@ -85,7 +81,7 @@ contract AuctionManager is AddressResolverUtil, Ownable, IAuctionManager, Initia ) external { if (auctionClosed[asyncId_]) revert AuctionClosed(); - address transmitter = signatureVerifier.recoverSigner( + address transmitter = _recoverSigner( keccak256(abi.encode(address(this), vmChainSlug, asyncId_, fee, extraData)), transmitterSignature ); @@ -162,4 +158,13 @@ contract AuctionManager is AddressResolverUtil, Ownable, IAuctionManager, Initia winningBids[asyncId_] = Bid({fee: 0, transmitter: address(0), extraData: ""}); auctionClosed[asyncId_] = false; } + + function _recoverSigner( + bytes32 digest_, + bytes memory signature_ + ) internal view returns (address signer) { + bytes32 digest = keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", digest_)); + // recovered signer is checked for the valid roles later + signer = ECDSA.recover(digest, signature_); + } } diff --git a/contracts/payload-delivery/app-gateway/BatchAsync.sol b/contracts/payload-delivery/app-gateway/BatchAsync.sol index af12156d..4f0dff6d 100644 --- a/contracts/payload-delivery/app-gateway/BatchAsync.sol +++ b/contracts/payload-delivery/app-gateway/BatchAsync.sol @@ -273,7 +273,10 @@ abstract contract BatchAsync is QueueAsync { /// @notice Gets the payload delivery plug address /// @param chainSlug_ The chain identifier /// @return address The address of the payload delivery plug - function getDeliveryHelperPlugAddress(address appGateway_, uint32 chainSlug_) public view returns (address) { + function getDeliveryHelperPlugAddress( + address appGateway_, + uint32 chainSlug_ + ) public view returns (address) { return watcherPrecompile__().appGatewayPlugs(appGateway_, chainSlug_); } diff --git a/contracts/payload-delivery/app-gateway/FeesManager.sol b/contracts/payload-delivery/app-gateway/FeesManager.sol index e6f5708c..e1343cf2 100644 --- a/contracts/payload-delivery/app-gateway/FeesManager.sol +++ b/contracts/payload-delivery/app-gateway/FeesManager.sol @@ -2,7 +2,6 @@ pragma solidity ^0.8.0; import {Ownable} from "solady/auth/Ownable.sol"; -import {SignatureVerifier} from "../../socket/utils/SignatureVerifier.sol"; import {AddressResolverUtil} from "../../utils/AddressResolverUtil.sol"; import {Bid, Fees, PayloadDetails, CallType, FinalizeParams, PayloadBatch} from "../../common/Structs.sol"; import {IDeliveryHelper} from "../../interfaces/IDeliveryHelper.sol"; diff --git a/contracts/socket/Socket.sol b/contracts/socket/Socket.sol index 200a384d..a0a24f3c 100644 --- a/contracts/socket/Socket.sol +++ b/contracts/socket/Socket.sol @@ -54,10 +54,9 @@ contract Socket is SocketBase { constructor( uint32 chainSlug_, - address signatureVerifier_, address owner_, string memory version_ - ) SocketBase(chainSlug_, signatureVerifier_, owner_, version_) {} + ) SocketBase(chainSlug_, owner_, version_) {} //////////////////////////////////////////////////////// ////////////////////// OPERATIONS ////////////////////////// @@ -115,7 +114,7 @@ contract Socket is SocketBase { if (localSlug != chainSlug) revert InvalidSlug(); - address transmitter = signatureVerifier__.recoverSigner( + address transmitter = _recoverSigner( keccak256(abi.encode(address(this), payloadId_)), transmitterSignature_ ); diff --git a/contracts/socket/SocketBase.sol b/contracts/socket/SocketBase.sol index ccef2a8a..d6b5b221 100644 --- a/contracts/socket/SocketBase.sol +++ b/contracts/socket/SocketBase.sol @@ -1,10 +1,9 @@ // SPDX-License-Identifier: GPL-3.0-only pragma solidity ^0.8.21; -import "../interfaces/ISignatureVerifier.sol"; - import "../libraries/RescueFundsLib.sol"; import "./SocketConfig.sol"; +import {ECDSA} from "solady/utils/ECDSA.sol"; /** * @title SocketBase @@ -23,25 +22,12 @@ abstract contract SocketBase is SocketConfig { * @param owner_ The address of the owner who has the initial admin role. * @param version_ The version string which is hashed and stored in socket. */ - constructor( - uint32 chainSlug_, - address signatureVerifier_, - address owner_, - string memory version_ - ) { - signatureVerifier__ = ISignatureVerifier(signatureVerifier_); + constructor(uint32 chainSlug_, address owner_, string memory version_) { chainSlug = chainSlug_; version = keccak256(bytes(version_)); _initializeOwner(owner_); } - //////////////////////////////////////////////////////// - //////////// PERIPHERY CONTRACT CONNECTORS //////////// - //////////////////////////////////////////////////////// - - // Signature Verifier contract - ISignatureVerifier public signatureVerifier__; - //////////////////////////////////////////////////////// ////////////////////// ERRORS ////////////////////////// //////////////////////////////////////////////////////// @@ -51,28 +37,6 @@ abstract contract SocketBase is SocketConfig { */ error InvalidTransmitter(); - //////////////////////////////////////////////////////// - ////////////////////// EVENTS ////////////////////////// - //////////////////////////////////////////////////////// - /** - * @notice An event that is emitted when a new signatureVerifier contract is set - * @param signatureVerifier address of new signatureVerifier contract - */ - event SignatureVerifierSet(address signatureVerifier); - - ////////////////////////////////////////////////// - //////////// GOV Permissioned setters //////////// - ////////////////////////////////////////////////// - /** - * @notice updates signatureVerifier__ - * @dev Only governance can call this function - * @param signatureVerifier_ address of signatureVerifier - */ - function setSignatureVerifier(address signatureVerifier_) external onlyRole(GOVERNANCE_ROLE) { - signatureVerifier__ = ISignatureVerifier(signatureVerifier_); - emit SignatureVerifierSet(signatureVerifier_); - } - /** * @notice Packs the payload into a bytes32 hash * @param payloadId_ The ID of the payload @@ -104,6 +68,15 @@ abstract contract SocketBase is SocketConfig { ); } + function _recoverSigner( + bytes32 digest_, + bytes memory signature_ + ) internal view returns (address signer) { + bytes32 digest = keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", digest_)); + // recovered signer is checked for the valid roles later + signer = ECDSA.recover(digest, signature_); + } + ////////////////////////////////////////////// //////////// Rescue role actions //////////// ///////////////////////////////////////////// diff --git a/contracts/socket/switchboard/FastSwitchboard.sol b/contracts/socket/switchboard/FastSwitchboard.sol index fa49bbcd..74e8451e 100644 --- a/contracts/socket/switchboard/FastSwitchboard.sol +++ b/contracts/socket/switchboard/FastSwitchboard.sol @@ -22,14 +22,12 @@ contract FastSwitchboard is SwitchboardBase { /** * @dev Constructor function for the FastSwitchboard contract * @param chainSlug_ Chain slug of the chain where the contract is deployed - * @param signatureVerifier_ The address of the signature verifier contract */ constructor( uint32 chainSlug_, ISocket socket_, - ISignatureVerifier signatureVerifier_, address owner_ - ) SwitchboardBase(chainSlug_, socket_, signatureVerifier_, owner_) {} + ) SwitchboardBase(chainSlug_, socket_, owner_) {} /** * @dev Function to attest a packet @@ -41,10 +39,7 @@ contract FastSwitchboard is SwitchboardBase { * with same root, we are storing attestations against root instead of packetId and proposalCount. */ function attest(bytes32 payloadId_, bytes32 root_, bytes calldata signature_) external { - address watcher = signatureVerifier__.recoverSigner( - keccak256(abi.encode(address(this), root_)), - signature_ - ); + address watcher = _recoverSigner(keccak256(abi.encode(address(this), root_)), signature_); if (isAttested[root_]) revert AlreadyAttested(); if (!_hasRole(WATCHER_ROLE, watcher)) revert WatcherNotFound(); diff --git a/contracts/socket/switchboard/SwitchboardBase.sol b/contracts/socket/switchboard/SwitchboardBase.sol index d2cbf165..3f6279b7 100644 --- a/contracts/socket/switchboard/SwitchboardBase.sol +++ b/contracts/socket/switchboard/SwitchboardBase.sol @@ -2,14 +2,11 @@ pragma solidity ^0.8.21; import "../../interfaces/ISwitchboard.sol"; -import "../../interfaces/ISignatureVerifier.sol"; import "../../interfaces/ISocket.sol"; import "../utils/AccessControl.sol"; +import {ECDSA} from "solady/utils/ECDSA.sol"; abstract contract SwitchboardBase is ISwitchboard, AccessControl { - // signature verifier contract - ISignatureVerifier public immutable signatureVerifier__; - ISocket public immutable socket__; // chain slug of deployed chain @@ -31,17 +28,20 @@ abstract contract SwitchboardBase is ISwitchboard, AccessControl { /** * @dev Constructor of SwitchboardBase * @param chainSlug_ Chain slug of deployment chain - * @param signatureVerifier_ signatureVerifier_ contract + * @param socket_ socket_ contract */ - constructor( - uint32 chainSlug_, - ISocket socket_, - ISignatureVerifier signatureVerifier_, - address owner_ - ) { + constructor(uint32 chainSlug_, ISocket socket_, address owner_) { chainSlug = chainSlug_; socket__ = socket_; - signatureVerifier__ = signatureVerifier_; _initializeOwner(owner_); } + + function _recoverSigner( + bytes32 digest_, + bytes memory signature_ + ) internal view returns (address signer) { + bytes32 digest = keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", digest_)); + // recovered signer is checked for the valid roles later + signer = ECDSA.recover(digest, signature_); + } } diff --git a/contracts/socket/utils/SignatureVerifier.sol b/contracts/socket/utils/SignatureVerifier.sol deleted file mode 100644 index 1052c07f..00000000 --- a/contracts/socket/utils/SignatureVerifier.sol +++ /dev/null @@ -1,62 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0-only -pragma solidity ^0.8.21; - -import "../../libraries/ECDSA.sol"; -import "../../interfaces/ISignatureVerifier.sol"; -import "../../libraries/RescueFundsLib.sol"; -import "../utils/AccessControl.sol"; -import {RESCUE_ROLE} from "../utils/AccessRoles.sol"; -import "solady/utils/Initializable.sol"; - -/** - * @title Signature Verifier - * @notice Verifies the signatures and returns the address of signer recovered from the input signature or digest. - * @dev This contract is modular component in socket to support different signing algorithms. - */ -contract SignatureVerifier is ISignatureVerifier, AccessControl, Initializable { - uint64 public version; - - /* - * @dev Error thrown when signature length is invalid - */ - error InvalidSigLength(); - - /** - * @notice initializes and grants RESCUE_ROLE to owner. - * @param owner_ The address of the owner of the contract. - */ - function initialize(address owner_) public reinitializer(1) { - version = 1; - _initializeOwner(owner_); - _grantRole(RESCUE_ROLE, owner_); - } - - /** - * @notice returns the address of signer recovered from input signature and digest - * @param digest_ The payload digest to be signed - * @param signature_ The signature to be verified - * @return signer The address of the signer - */ - function recoverSigner( - bytes32 digest_, - bytes memory signature_ - ) public pure override returns (address signer) { - bytes32 digest = keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", digest_)); - // recovered signer is checked for the valid roles later - signer = ECDSA._recover(digest, signature_); - } - - /** - * @notice Rescues funds from the contract if they are locked by mistake. - * @param token_ The address of the token contract. - * @param rescueTo_ The address where rescued tokens need to be sent. - * @param amount_ The amount of tokens to be rescued. - */ - function rescueFunds( - address token_, - address rescueTo_, - uint256 amount_ - ) external onlyRole(RESCUE_ROLE) { - RescueFundsLib._rescueFunds(token_, rescueTo_, amount_); - } -} diff --git a/deployments/dev_addresses.json b/deployments/dev_addresses.json index 9498b9b1..87819d75 100644 --- a/deployments/dev_addresses.json +++ b/deployments/dev_addresses.json @@ -3,8 +3,6 @@ "ContractFactoryPlug": "0x1dc20d27F06876cA74ee4e2E9a4724f06a4a5E54", "FastSwitchboard": "0xaFFfaD81e6DDE509Bd83Ab2024225b2FF537BeA7", "FeesPlug": "0xb2B779ab8FC851bCE986d25B2824933B0Cd101d9", - "Hasher": "0x49f24A72e738Fe86263Aa26696370972e049498B", - "SignatureVerifier": "0xb6d39d1dB2cB14043182a008EfFC079A9C578208", "Socket": "0x9B06e2Dae351ed8B1112C036e5c306E8fBe4C9c5", "SocketBatcher": "0xd627BFe7d2fCAC1147c996a6F2CAaB2E1e1bD344", "startBlock": 124035386 @@ -19,8 +17,6 @@ "ERC1967Factory": "0xbBfb525ADc6eC38Ef0D4b807d327c2Dd1C286de1", "FeesManager": "0x886682a69D6c0240EB850cc2e42c5B4B74449e82", "FeesManagerImpl": "0xF4D3BDe438416938217d4624c82AEbEb46CeD371", - "SignatureVerifier": "0x366Dea9AC69fb9D45b6756587D2fE9B4c14197F6", - "SignatureVerifierImpl": "0x3cf47Ad0F040dFF1208E649C8f8e23e6B5A08916", "startBlock": 18, "WatcherPrecompile": "0xaCf94Cd4A7e70304F5CA6294CDAe3CBe78Ea6A86", "WatcherPrecompileImpl": "0x8F18fC10a8b40b548C6F04Fb252481c783A9ace0" @@ -30,7 +26,6 @@ "FastSwitchboard": "0x70bfB36F8b8de7763F1D52d954225ae88F6Ed595", "FeesPlug": "0x7F5D263572469Fdf1875Cd858D557B45e9FC7f23", "Hasher": "0xe37D675646A6FEEC3E41A0FF9535E0E716f5cD89", - "SignatureVerifier": "0x0452225B52Ef6134499232CbBEDF05fD8cc38530", "Socket": "0x0BAAD473580c9F7Ca8b2758759aF3ce5E3154bC6", "SocketBatcher": "0xCf731f35EFd775F692fe24e650e75Fd64bBaD810", "startBlock": 23911773 diff --git a/deployments/dev_verification.json b/deployments/dev_verification.json index fba8d887..a1f1532e 100644 --- a/deployments/dev_verification.json +++ b/deployments/dev_verification.json @@ -31,12 +31,6 @@ "contracts/AddressResolver.sol", [] ], - [ - "0x3cf47Ad0F040dFF1208E649C8f8e23e6B5A08916", - "SignatureVerifier", - "contracts/socket/utils/SignatureVerifier.sol", - [] - ], [ "0xbBfb525ADc6eC38Ef0D4b807d327c2Dd1C286de1", "ERC1967Factory", diff --git a/hardhat-scripts/deploy/1.deploy.ts b/hardhat-scripts/deploy/1.deploy.ts index c1f95aa1..67dd7eb9 100644 --- a/hardhat-scripts/deploy/1.deploy.ts +++ b/hardhat-scripts/deploy/1.deploy.ts @@ -13,11 +13,7 @@ import { getProviderFromChainSlug } from "../constants"; import { ethers } from "hardhat"; import dev_addresses from "../../deployments/dev_addresses.json"; import { auctionEndDelaySeconds, chains } from "./config"; -import { - MAX_LIMIT, - EVMX_CHAIN_ID, - BID_TIMEOUT -} from "../constants/constants"; +import { MAX_LIMIT, EVMX_CHAIN_ID, BID_TIMEOUT } from "../constants/constants"; import { CORE_CONTRACTS, OffChainVMCoreContracts } from "../../src"; let offChainVMOwner: string; @@ -55,36 +51,12 @@ const main = async () => { currentChainSlug: chain as ChainSlug, }; - let contractName: string = CORE_CONTRACTS.SignatureVerifier; - const signatureVerifier: Contract = await getOrDeploy( - contractName, - contractName, - `contracts/socket/utils/${contractName}.sol`, - [], - deployUtils - ); - deployUtils.addresses[contractName] = signatureVerifier.address; - - await initializeSigVerifier( - signatureVerifier, - "owner", - "initialize", - socketOwner, - [socketOwner], - deployUtils.signer - ); - - contractName = CORE_CONTRACTS.Socket; + let contractName = CORE_CONTRACTS.Socket; const socket: Contract = await getOrDeploy( contractName, contractName, `contracts/socket/${contractName}.sol`, - [ - chain as ChainSlug, - signatureVerifier.address, - socketOwner, - "EVMX", - ], + [chain as ChainSlug, socketOwner, "EVMX"], deployUtils ); deployUtils.addresses[contractName] = socket.address; @@ -104,12 +76,7 @@ const main = async () => { contractName, contractName, `contracts/socket/switchboard/${contractName}.sol`, - [ - chain as ChainSlug, - socket.address, - signatureVerifier.address, - socketOwner, - ], + [chain as ChainSlug, socket.address, socketOwner], deployUtils ); deployUtils.addresses[contractName] = sb.address; @@ -204,14 +171,6 @@ const deployWatcherVMContracts = async () => { ); deployUtils.addresses[contractName] = proxyFactory.address; - deployUtils = await deployContractWithProxy( - OffChainVMCoreContracts.SignatureVerifier, - `contracts/socket/utils/SignatureVerifier.sol`, - [offChainVMOwner], - proxyFactory, - deployUtils - ); - deployUtils = await deployContractWithProxy( OffChainVMCoreContracts.AddressResolver, `contracts/AddressResolver.sol`, @@ -250,7 +209,7 @@ const deployWatcherVMContracts = async () => { addressResolver.address, feesManagerAddress, offChainVMOwner, - BID_TIMEOUT + BID_TIMEOUT, ], proxyFactory, deployUtils @@ -263,8 +222,7 @@ const deployWatcherVMContracts = async () => { EVMX_CHAIN_ID, auctionEndDelaySeconds, addressResolver.address, - deployUtils.addresses[OffChainVMCoreContracts.SignatureVerifier], - offChainVMOwner + offChainVMOwner, ], proxyFactory, deployUtils diff --git a/hardhat-scripts/deploy/5.upload.ts b/hardhat-scripts/deploy/5.upload.ts index 41179d9d..c6e2925f 100644 --- a/hardhat-scripts/deploy/5.upload.ts +++ b/hardhat-scripts/deploy/5.upload.ts @@ -38,7 +38,6 @@ type ConfigEntry = { confirmations: number; eventBlockRange: number; addresses?: { - SignatureVerifier: string; Socket: string; FastSwitchboard: string; SocketBatcher: string; diff --git a/hardhat-scripts/deploy/migration/migrate-proxies.ts b/hardhat-scripts/deploy/migration/migrate-proxies.ts index 7a44eca4..a50dbda2 100644 --- a/hardhat-scripts/deploy/migration/migrate-proxies.ts +++ b/hardhat-scripts/deploy/migration/migrate-proxies.ts @@ -11,7 +11,6 @@ const IMPLEMENTATION_SLOT = "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"; const upgradeableContracts = [ - "SignatureVerifier", "AddressResolver", "WatcherPrecompile", "FeesManager", diff --git a/src/index.ts b/src/index.ts index c0f4e709..48f2336a 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,5 +1,4 @@ export enum CORE_CONTRACTS { - SignatureVerifier = "SignatureVerifier", Socket = "Socket", SocketBatcher = "SocketBatcher", FastSwitchboard = "FastSwitchboard", @@ -8,7 +7,6 @@ export enum CORE_CONTRACTS { } export enum OffChainVMCoreContracts { - SignatureVerifier = "SignatureVerifier", WatcherPrecompile = "WatcherPrecompile", AuctionManager = "AuctionManager", FeesManager = "FeesManager", diff --git a/test/DeliveryHelper.t.sol b/test/DeliveryHelper.t.sol index f0aef928..8887fd27 100644 --- a/test/DeliveryHelper.t.sol +++ b/test/DeliveryHelper.t.sol @@ -81,7 +81,6 @@ contract DeliveryHelperTest is SetupTest { vmChainSlug, auctionEndDelaySeconds, address(addressResolver), - signatureVerifier, owner, version ); diff --git a/test/Migration.t.sol b/test/Migration.t.sol index 07c7fec0..ec7f5ac1 100644 --- a/test/Migration.t.sol +++ b/test/Migration.t.sol @@ -2,7 +2,6 @@ pragma solidity ^0.8.0; import "./SetupTest.t.sol"; -import "../contracts/socket/utils/SignatureVerifier.sol"; import "../contracts/AddressResolver.sol"; import "../contracts/watcherPrecompile/WatcherPrecompile.sol"; import "../contracts/Forwarder.sol"; @@ -47,26 +46,6 @@ contract MigrationTest is SetupTest { return address(uint160(uint256(value))); } - function testSignatureVerifierUpgrade() public { - // Deploy new implementation - SignatureVerifier newImpl = new SignatureVerifier(); - - // Store old implementation address - address oldImpl = getImplementation(address(signatureVerifier)); - - // Upgrade proxy to new implementation - vm.startPrank(watcherEOA); - vm.expectEmit(true, true, true, true, address(proxyFactory)); - emit Upgraded(address(signatureVerifier), address(newImpl)); - proxyFactory.upgradeAndCall(address(signatureVerifier), address(newImpl), ""); - vm.stopPrank(); - - // Verify upgrade was successful - address newImplAddr = getImplementation(address(signatureVerifier)); - assertNotEq(oldImpl, newImplAddr, "Implementation should have changed"); - assertEq(newImplAddr, address(newImpl), "New implementation not set correctly"); - } - function testAddressResolverUpgrade() public { // Deploy new implementation AddressResolver newImpl = new AddressResolver(); @@ -160,19 +139,19 @@ contract MigrationTest is SetupTest { function testUnauthorizedUpgrade() public { // Deploy new implementation - SignatureVerifier newImpl = new SignatureVerifier(); + WatcherPrecompile newImpl = new WatcherPrecompile(); // Try to upgrade from unauthorized account address unauthorizedUser = address(0xBEEF); vm.startPrank(unauthorizedUser); vm.expectRevert(UNAUTHORIZED_SELECTOR); - proxyFactory.upgradeAndCall(address(signatureVerifier), address(newImpl), ""); + proxyFactory.upgradeAndCall(address(watcherPrecompile), address(newImpl), ""); vm.stopPrank(); // Verify implementation was not changed assertEq( - getImplementation(address(signatureVerifier)), - address(signatureVerifierImpl), + getImplementation(address(watcherPrecompile)), + address(watcherPrecompileImpl), "Implementation should not have changed" ); } diff --git a/test/SetupTest.t.sol b/test/SetupTest.t.sol index d5ed4092..159cff8c 100644 --- a/test/SetupTest.t.sol +++ b/test/SetupTest.t.sol @@ -8,7 +8,6 @@ import "../contracts/watcherPrecompile/WatcherPrecompile.sol"; import "../contracts/interfaces/IForwarder.sol"; import "../contracts/socket/utils/AccessRoles.sol"; import {Socket} from "../contracts/socket/Socket.sol"; -import {SignatureVerifier} from "../contracts/socket/utils/SignatureVerifier.sol"; import "../contracts/socket/switchboard/FastSwitchboard.sol"; import "../contracts/socket/SocketBatcher.sol"; import "../contracts/AddressResolver.sol"; @@ -55,25 +54,20 @@ contract SetupTest is Test { AddressResolver public addressResolver; WatcherPrecompile public watcherPrecompile; - SignatureVerifier public signatureVerifier; SocketContracts public arbConfig; SocketContracts public optConfig; // Add new variables for proxy admin and implementation contracts WatcherPrecompile public watcherPrecompileImpl; AddressResolver public addressResolverImpl; - SignatureVerifier public signatureVerifierImpl; ERC1967Factory public proxyFactory; event Initialized(uint64 version); function deploySocket(uint32 chainSlug_) internal returns (SocketContracts memory) { - SignatureVerifier verifier = new SignatureVerifier(); - verifier.initialize(owner); - - Socket socket = new Socket(chainSlug_, address(verifier), owner, "test"); + Socket socket = new Socket(chainSlug_, owner, "test"); SocketBatcher socketBatcher = new SocketBatcher(owner, socket); - FastSwitchboard switchboard = new FastSwitchboard(chainSlug_, socket, verifier, owner); + FastSwitchboard switchboard = new FastSwitchboard(chainSlug_, socket, owner); FeesPlug feesPlug = new FeesPlug(address(socket), owner); ContractFactoryPlug contractFactoryPlug = new ContractFactoryPlug(address(socket), owner); @@ -103,25 +97,11 @@ contract SetupTest is Test { function deployOffChainVMCore() internal { // Deploy implementations - signatureVerifierImpl = new SignatureVerifier(); addressResolverImpl = new AddressResolver(); watcherPrecompileImpl = new WatcherPrecompile(); proxyFactory = new ERC1967Factory(); // Deploy and initialize proxies - bytes memory signatureVerifierData = abi.encodeWithSelector( - SignatureVerifier.initialize.selector, - owner - ); - - vm.expectEmit(true, true, true, false); - emit Initialized(version); - address signatureVerifierProxy = proxyFactory.deployAndCall( - address(signatureVerifierImpl), - watcherEOA, - signatureVerifierData - ); - bytes memory addressResolverData = abi.encodeWithSelector( AddressResolver.initialize.selector, watcherEOA @@ -149,7 +129,6 @@ contract SetupTest is Test { ); // Assign proxy addresses to public variables - signatureVerifier = SignatureVerifier(address(signatureVerifierProxy)); addressResolver = AddressResolver(address(addressResolverProxy)); watcherPrecompile = WatcherPrecompile(address(watcherPrecompileProxy)); From 4e43c562f05ef820524ecf91caa2e6e3449ce84d Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Tue, 18 Feb 2025 16:56:02 +0400 Subject: [PATCH 036/186] feat: add rescue support --- .../payload-delivery/ContractFactoryPlug.sol | 21 +++++++++++++++-- contracts/payload-delivery/FeesPlug.sol | 21 +++++++++++++++-- contracts/socket/SocketConfig.sol | 4 ++-- .../socket/switchboard/SwitchboardBase.sol | 23 ++++++++++++++++++- .../{socket => }/utils/AccessControl.sol | 0 contracts/{socket => }/utils/AccessRoles.sol | 0 deployments/dev_addresses.json | 1 - test/SetupTest.t.sol | 2 +- 8 files changed, 63 insertions(+), 9 deletions(-) rename contracts/{socket => }/utils/AccessControl.sol (100%) rename contracts/{socket => }/utils/AccessRoles.sol (100%) diff --git a/contracts/payload-delivery/ContractFactoryPlug.sol b/contracts/payload-delivery/ContractFactoryPlug.sol index 3d4b50a4..3b107ed6 100644 --- a/contracts/payload-delivery/ContractFactoryPlug.sol +++ b/contracts/payload-delivery/ContractFactoryPlug.sol @@ -2,12 +2,14 @@ pragma solidity ^0.8.21; import "../base/PlugBase.sol"; -import {Ownable} from "solady/auth/Ownable.sol"; +import "../utils/AccessControl.sol"; +import {RESCUE_ROLE} from "../utils/AccessRoles.sol"; +import "../libraries/RescueFundsLib.sol"; import {NotSocket} from "../common/Errors.sol"; /// @title ContractFactory /// @notice Abstract contract for deploying contracts -contract ContractFactoryPlug is PlugBase, Ownable { +contract ContractFactoryPlug is PlugBase, AccessControl { event Deployed(address addr, bytes32 salt); /// @notice Error thrown if it failed to deploy the create2 contract @@ -60,4 +62,19 @@ contract ContractFactoryPlug is PlugBase, Ownable { ) external onlyOwner { _connectSocket(appGateway_, socket_, switchboard_); } + + /** + * @notice Rescues funds from the contract if they are locked by mistake. This contract does not + * theoretically need this function but it is added for safety. + * @param token_ The address of the token contract. + * @param rescueTo_ The address where rescued tokens need to be sent. + * @param amount_ The amount of tokens to be rescued. + */ + function rescueFunds( + address token_, + address rescueTo_, + uint256 amount_ + ) external onlyRole(RESCUE_ROLE) { + RescueFundsLib._rescueFunds(token_, rescueTo_, amount_); + } } diff --git a/contracts/payload-delivery/FeesPlug.sol b/contracts/payload-delivery/FeesPlug.sol index 9e9c1f85..921baa9d 100644 --- a/contracts/payload-delivery/FeesPlug.sol +++ b/contracts/payload-delivery/FeesPlug.sol @@ -3,12 +3,14 @@ pragma solidity ^0.8.21; import "solmate/utils/SafeTransferLib.sol"; import "../base/PlugBase.sol"; -import {Ownable} from "solady/auth/Ownable.sol"; +import "../utils/AccessControl.sol"; +import {RESCUE_ROLE} from "../utils/AccessRoles.sol"; +import "../libraries/RescueFundsLib.sol"; import {ETH_ADDRESS} from "../common/Constants.sol"; /// @title FeesManager /// @notice Abstract contract for managing fees -contract FeesPlug is PlugBase, Ownable { +contract FeesPlug is PlugBase, AccessControl { mapping(address => uint256) public balanceOf; mapping(bytes32 => bool) public feesRedeemed; @@ -98,6 +100,21 @@ contract FeesPlug is PlugBase, Ownable { _connectSocket(appGateway_, socket_, switchboard_); } + /** + * @notice Rescues funds from the contract if they are locked by mistake. This contract does not + * theoretically need this function but it is added for safety. + * @param token_ The address of the token contract. + * @param rescueTo_ The address where rescued tokens need to be sent. + * @param amount_ The amount of tokens to be rescued. + */ + function rescueFunds( + address token_, + address rescueTo_, + uint256 amount_ + ) external onlyRole(RESCUE_ROLE) { + RescueFundsLib._rescueFunds(token_, rescueTo_, amount_); + } + fallback() external payable {} receive() external payable {} diff --git a/contracts/socket/SocketConfig.sol b/contracts/socket/SocketConfig.sol index 2eb5f8e7..fb978424 100644 --- a/contracts/socket/SocketConfig.sol +++ b/contracts/socket/SocketConfig.sol @@ -3,8 +3,8 @@ pragma solidity ^0.8.21; import "../interfaces/ISocket.sol"; import "../interfaces/ISwitchboard.sol"; -import "./utils/AccessControl.sol"; -import "./utils/AccessRoles.sol"; +import "../utils/AccessControl.sol"; +import {RESCUE_ROLE} from "../utils/AccessRoles.sol"; /** * @title SocketConfig diff --git a/contracts/socket/switchboard/SwitchboardBase.sol b/contracts/socket/switchboard/SwitchboardBase.sol index 3f6279b7..6b6b3753 100644 --- a/contracts/socket/switchboard/SwitchboardBase.sol +++ b/contracts/socket/switchboard/SwitchboardBase.sol @@ -3,7 +3,9 @@ pragma solidity ^0.8.21; import "../../interfaces/ISwitchboard.sol"; import "../../interfaces/ISocket.sol"; -import "../utils/AccessControl.sol"; +import "../../utils/AccessControl.sol"; +import {RESCUE_ROLE} from "../../utils/AccessRoles.sol"; +import "../../libraries/RescueFundsLib.sol"; import {ECDSA} from "solady/utils/ECDSA.sol"; abstract contract SwitchboardBase is ISwitchboard, AccessControl { @@ -44,4 +46,23 @@ abstract contract SwitchboardBase is ISwitchboard, AccessControl { // recovered signer is checked for the valid roles later signer = ECDSA.recover(digest, signature_); } + + ////////////////////////////////////////////// + //////////// Rescue role actions //////////// + ///////////////////////////////////////////// + + /** + * @notice Rescues funds from the contract if they are locked by mistake. This contract does not + * theoretically need this function but it is added for safety. + * @param token_ The address of the token contract. + * @param rescueTo_ The address where rescued tokens need to be sent. + * @param amount_ The amount of tokens to be rescued. + */ + function rescueFunds( + address token_, + address rescueTo_, + uint256 amount_ + ) external onlyRole(RESCUE_ROLE) { + RescueFundsLib._rescueFunds(token_, rescueTo_, amount_); + } } diff --git a/contracts/socket/utils/AccessControl.sol b/contracts/utils/AccessControl.sol similarity index 100% rename from contracts/socket/utils/AccessControl.sol rename to contracts/utils/AccessControl.sol diff --git a/contracts/socket/utils/AccessRoles.sol b/contracts/utils/AccessRoles.sol similarity index 100% rename from contracts/socket/utils/AccessRoles.sol rename to contracts/utils/AccessRoles.sol diff --git a/deployments/dev_addresses.json b/deployments/dev_addresses.json index 87819d75..7f4625ae 100644 --- a/deployments/dev_addresses.json +++ b/deployments/dev_addresses.json @@ -25,7 +25,6 @@ "ContractFactoryPlug": "0x0EE19F0D0e34Cdd2eb4F61E24DC837b0b7c34e69", "FastSwitchboard": "0x70bfB36F8b8de7763F1D52d954225ae88F6Ed595", "FeesPlug": "0x7F5D263572469Fdf1875Cd858D557B45e9FC7f23", - "Hasher": "0xe37D675646A6FEEC3E41A0FF9535E0E716f5cD89", "Socket": "0x0BAAD473580c9F7Ca8b2758759aF3ce5E3154bC6", "SocketBatcher": "0xCf731f35EFd775F692fe24e650e75Fd64bBaD810", "startBlock": 23911773 diff --git a/test/SetupTest.t.sol b/test/SetupTest.t.sol index 159cff8c..7e5e01f2 100644 --- a/test/SetupTest.t.sol +++ b/test/SetupTest.t.sol @@ -6,7 +6,7 @@ import "../contracts/common/Structs.sol"; import "../contracts/common/Constants.sol"; import "../contracts/watcherPrecompile/WatcherPrecompile.sol"; import "../contracts/interfaces/IForwarder.sol"; -import "../contracts/socket/utils/AccessRoles.sol"; +import "../contracts/utils/AccessRoles.sol"; import {Socket} from "../contracts/socket/Socket.sol"; import "../contracts/socket/switchboard/FastSwitchboard.sol"; import "../contracts/socket/SocketBatcher.sol"; From d78c05286f0c8fce9348fdfe0f83437c0b31528d Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Tue, 18 Feb 2025 16:59:17 +0400 Subject: [PATCH 037/186] fix: update script --- hardhat-scripts/deploy/2.roles.ts | 66 +++++++++++++------------------ 1 file changed, 28 insertions(+), 38 deletions(-) diff --git a/hardhat-scripts/deploy/2.roles.ts b/hardhat-scripts/deploy/2.roles.ts index d276adbe..d007ac94 100644 --- a/hardhat-scripts/deploy/2.roles.ts +++ b/hardhat-scripts/deploy/2.roles.ts @@ -16,8 +16,10 @@ import { Wallet } from "ethers"; import { getInstance, getRoleHash } from "./utils"; export const REQUIRED_ROLES = { - FastSwitchboard: ROLES.WATCHER_ROLE, - Socket: ROLES.GOVERNANCE_ROLE, + FastSwitchboard: [ROLES.WATCHER_ROLE, ROLES.RESCUE_ROLE], + Socket: [ROLES.GOVERNANCE_ROLE, ROLES.RESCUE_ROLE], + FeesPlug: [ROLES.RESCUE_ROLE], + ContractFactoryPlug: [ROLES.RESCUE_ROLE], }; export const main = async () => { @@ -37,47 +39,35 @@ export const main = async () => { providerInstance ); - let socket = await getInstance( - CORE_CONTRACTS.Socket, - chainAddresses[CORE_CONTRACTS.Socket]! - ); - socket = socket.connect(signer); + for (const [contractName, roleHash] of Object.entries(REQUIRED_ROLES)) { + if (!chainAddresses[contractName as keyof ChainSocketAddresses]) continue; - const hasGovRole = await socket.callStatic["hasRole(bytes32,address)"]( - getRoleHash(REQUIRED_ROLES.Socket), - signer.address, - { - from: signer.address, - } - ); - - if (!hasGovRole) { - const tx = await socket.grantRole( - getRoleHash(REQUIRED_ROLES.Socket), - signer.address + let contract = await getInstance( + contractName as CORE_CONTRACTS, + chainAddresses[contractName as keyof ChainSocketAddresses]! ); - console.log("granting gov role", chain, tx.hash); - await tx.wait(); - } + contract = contract.connect(signer); - let sb = await getInstance( - CORE_CONTRACTS.FastSwitchboard, - chainAddresses[CORE_CONTRACTS.FastSwitchboard]! - ); - sb = sb.connect(signer); + const targetAddress = contractName === CORE_CONTRACTS.FastSwitchboard ? watcher : signer.address; - const hasRole = await sb.callStatic["hasRole(bytes32,address)"]( - getRoleHash(REQUIRED_ROLES.FastSwitchboard), - watcher, - { - from: signer.address, - } - ); + const hasRole = await contract.callStatic["hasRole(bytes32,address)"]( + getRoleHash(roleHash), + targetAddress, + { + from: signer.address, + } + ); - if (!hasRole) { - const tx = await sb.grantWatcherRole(watcher); - console.log("granting role to watcher", chain, tx.hash); - await tx.wait(); + if (!hasRole) { + let tx; + if (contractName === CORE_CONTRACTS.FastSwitchboard) { + tx = await contract.grantWatcherRole(targetAddress); + } else { + tx = await contract.grantRole(getRoleHash(roleHash), targetAddress); + } + console.log(`granting ${roleHash} role to ${targetAddress} for ${contractName}`, chain, tx.hash); + await tx.wait(); + } } } } catch (error) { From ef44185fb7832f0bbaf3a38dfc6fde6f1e89b93f Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Tue, 18 Feb 2025 17:22:18 +0400 Subject: [PATCH 038/186] feat: update folder structure --- contracts/base/AppDeployerBase.sol | 2 +- contracts/base/AppGatewayBase.sol | 8 +++--- contracts/base/PlugBase.sol | 2 +- contracts/interfaces/IAppGateway.sol | 2 +- contracts/interfaces/IAuctionManager.sol | 2 +- contracts/interfaces/IDeliveryHelper.sol | 2 +- contracts/interfaces/IFeesManager.sol | 2 +- contracts/interfaces/ISocketBatcher.sol | 2 +- contracts/interfaces/IWatcherPrecompile.sol | 2 +- contracts/mock/MockSocket.sol | 2 +- contracts/mock/MockWatcherPrecompile.sol | 6 ++--- contracts/{ => protocol}/AddressResolver.sol | 6 ++--- contracts/{ => protocol}/AsyncPromise.sol | 4 +-- contracts/{ => protocol}/Forwarder.sol | 10 +++---- .../payload-delivery/ContractFactoryPlug.sol | 8 +++--- .../payload-delivery/FeesPlug.sol | 8 +++--- .../app-gateway/AuctionManager.sol | 8 +++--- .../app-gateway/BatchAsync.sol | 16 ++++++------ .../app-gateway/DeliveryHelper.sol | 11 ++++---- .../app-gateway/FeesManager.sol | 13 +++++----- .../app-gateway/QueueAsync.sol | 16 ++++++------ contracts/{ => protocol}/socket/Socket.sol | 4 +-- .../{ => protocol}/socket/SocketBase.sol | 2 +- .../{ => protocol}/socket/SocketBatcher.sol | 8 +++--- .../{ => protocol}/socket/SocketConfig.sol | 6 ++--- .../socket/switchboard/FastSwitchboard.sol | 0 .../socket/switchboard/SwitchboardBase.sol | 8 +++--- .../{ => protocol}/utils/AccessControl.sol | 0 .../utils/AddressResolverUtil.sol | 6 ++--- contracts/{ => protocol}/utils/FeesPlugin.sol | 2 +- contracts/{ => protocol}/utils/Gauge.sol | 4 +-- .../utils}/RescueFundsLib.sol | 4 +-- .../utils/common}/AccessRoles.sol | 0 .../{ => protocol/utils}/common/Constants.sol | 0 .../{ => protocol/utils}/common/Errors.sol | 0 .../{ => protocol/utils}/common/Structs.sol | 0 .../watcherPrecompile/WatcherPrecompile.sol | 10 +++---- .../WatcherPrecompileConfig.sol | 0 .../WatcherPrecompileLimits.sol | 8 +++--- script/PayFeesInArbitrumETH.s.sol | 6 ++--- script/admin/CheckAppEVMxLimits.s.sol | 6 ++--- script/admin/UpdateAppEVMxLimits.s.sol | 6 ++--- .../DeployCounterAndGateway.s.sol | 4 +-- script/counter-inbox/Increment.s.sol | 4 +-- .../WithdrawFeesArbitrumFeesPlug.s.sol | 4 +-- script/counter/deployEVMxCounterApp.s.sol | 4 +-- script/counter/deployOnchainCounters.s.sol | 2 +- script/cron/DeployGateway.s.sol | 4 +-- script/mock/FinalizeAndExecution.s.sol | 2 +- script/parallel-counter/deployOffchain.s.sol | 4 +-- script/parallel-counter/deployOnchain.s.sol | 2 +- .../DeployContracts.s.sol | 4 +-- .../super-token-lockable/DeployGateway.s.sol | 4 +-- script/super-token/DeployContracts.s.sol | 4 +-- script/super-token/DeployGateway.s.sol | 4 +-- test/DeliveryHelper.t.sol | 8 +++--- test/Migration.t.sol | 8 +++--- test/MockWatcherPrecompileImpl.sol | 2 +- test/SetupTest.t.sol | 26 +++++++++---------- test/apps/SuperToken.t.sol | 2 +- test/apps/SuperTokenLockable.t.sol | 2 +- 61 files changed, 154 insertions(+), 152 deletions(-) rename contracts/{ => protocol}/AddressResolver.sol (99%) rename contracts/{ => protocol}/AsyncPromise.sol (97%) rename contracts/{ => protocol}/Forwarder.sol (94%) rename contracts/{ => protocol}/payload-delivery/ContractFactoryPlug.sol (93%) rename contracts/{ => protocol}/payload-delivery/FeesPlug.sol (95%) rename contracts/{ => protocol}/payload-delivery/app-gateway/AuctionManager.sol (95%) rename contracts/{ => protocol}/payload-delivery/app-gateway/BatchAsync.sol (95%) rename contracts/{ => protocol}/payload-delivery/app-gateway/DeliveryHelper.sol (96%) rename contracts/{ => protocol}/payload-delivery/app-gateway/FeesManager.sol (97%) rename contracts/{ => protocol}/payload-delivery/app-gateway/QueueAsync.sol (91%) rename contracts/{ => protocol}/socket/Socket.sol (98%) rename contracts/{ => protocol}/socket/SocketBase.sol (98%) rename contracts/{ => protocol}/socket/SocketBatcher.sol (87%) rename contracts/{ => protocol}/socket/SocketConfig.sol (94%) rename contracts/{ => protocol}/socket/switchboard/FastSwitchboard.sol (100%) rename contracts/{ => protocol}/socket/switchboard/SwitchboardBase.sol (92%) rename contracts/{ => protocol}/utils/AccessControl.sol (100%) rename contracts/{ => protocol}/utils/AddressResolverUtil.sol (95%) rename contracts/{ => protocol}/utils/FeesPlugin.sol (93%) rename contracts/{ => protocol}/utils/Gauge.sol (93%) rename contracts/{libraries => protocol/utils}/RescueFundsLib.sol (90%) rename contracts/{utils => protocol/utils/common}/AccessRoles.sol (100%) rename contracts/{ => protocol/utils}/common/Constants.sol (100%) rename contracts/{ => protocol/utils}/common/Errors.sol (100%) rename contracts/{ => protocol/utils}/common/Structs.sol (100%) rename contracts/{ => protocol}/watcherPrecompile/WatcherPrecompile.sol (98%) rename contracts/{ => protocol}/watcherPrecompile/WatcherPrecompileConfig.sol (100%) rename contracts/{ => protocol}/watcherPrecompile/WatcherPrecompileLimits.sol (97%) diff --git a/contracts/base/AppDeployerBase.sol b/contracts/base/AppDeployerBase.sol index ce88c123..2affe3ee 100644 --- a/contracts/base/AppDeployerBase.sol +++ b/contracts/base/AppDeployerBase.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: Unlicense pragma solidity ^0.8.21; -import {DeployParams, Fees, CallType, PayloadBatch} from "../common/Structs.sol"; +import {DeployParams, Fees, CallType, PayloadBatch} from "../protocol/utils/common/Structs.sol"; import {AppGatewayBase} from "./AppGatewayBase.sol"; import {IForwarder} from "../interfaces/IForwarder.sol"; import {IPromise} from "../interfaces/IPromise.sol"; diff --git a/contracts/base/AppGatewayBase.sol b/contracts/base/AppGatewayBase.sol index d88a7ff8..58969b8f 100644 --- a/contracts/base/AppGatewayBase.sol +++ b/contracts/base/AppGatewayBase.sol @@ -1,13 +1,13 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.3; -import "../utils/AddressResolverUtil.sol"; +import "../protocol/utils/AddressResolverUtil.sol"; import "../interfaces/IDeliveryHelper.sol"; import "../interfaces/IAppGateway.sol"; import "../interfaces/IPromise.sol"; -import {Fees} from "../common/Structs.sol"; -import {FeesPlugin} from "../utils/FeesPlugin.sol"; -import {InvalidPromise, FeesNotSet} from "../common/Errors.sol"; +import {Fees} from "../protocol/utils/common/Structs.sol"; +import {FeesPlugin} from "../protocol/utils/FeesPlugin.sol"; +import {InvalidPromise, FeesNotSet} from "../protocol/utils/common/Errors.sol"; /// @title AppGatewayBase /// @notice Abstract contract for the app gateway diff --git a/contracts/base/PlugBase.sol b/contracts/base/PlugBase.sol index 9b23d366..2c155ba8 100644 --- a/contracts/base/PlugBase.sol +++ b/contracts/base/PlugBase.sol @@ -4,7 +4,7 @@ pragma solidity ^0.8.21; import {SafeTransferLib} from "solmate/utils/SafeTransferLib.sol"; import {ISocket} from "../interfaces/ISocket.sol"; import {IPlug} from "../interfaces/IPlug.sol"; -import {NotSocket} from "../common/Errors.sol"; +import {NotSocket} from "../protocol/utils/common/Errors.sol"; /// @title PlugBase /// @notice Abstract contract for plugs diff --git a/contracts/interfaces/IAppGateway.sol b/contracts/interfaces/IAppGateway.sol index 8cf706e2..fdf655d6 100644 --- a/contracts/interfaces/IAppGateway.sol +++ b/contracts/interfaces/IAppGateway.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: Unlicense pragma solidity ^0.8.21; -import {PayloadBatch} from "../common/Structs.sol"; +import {PayloadBatch} from "../protocol/utils/common/Structs.sol"; interface IAppGateway { function isReadCall() external view returns (bool); diff --git a/contracts/interfaces/IAuctionManager.sol b/contracts/interfaces/IAuctionManager.sol index eeb3a8a8..69b38a72 100644 --- a/contracts/interfaces/IAuctionManager.sol +++ b/contracts/interfaces/IAuctionManager.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.3; -import {Bid, Fees} from "../common/Structs.sol"; +import {Bid, Fees} from "../protocol/utils/common/Structs.sol"; interface IAuctionManager { function bid( diff --git a/contracts/interfaces/IDeliveryHelper.sol b/contracts/interfaces/IDeliveryHelper.sol index 15830cd3..5038c199 100644 --- a/contracts/interfaces/IDeliveryHelper.sol +++ b/contracts/interfaces/IDeliveryHelper.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.3; -import {PayloadDetails, Bid, Fees, DeployParams, CallType, PayloadBatch} from "../common/Structs.sol"; +import {PayloadDetails, Bid, Fees, DeployParams, CallType, PayloadBatch} from "../protocol/utils/common/Structs.sol"; interface IDeliveryHelper { event BidPlaced( diff --git a/contracts/interfaces/IFeesManager.sol b/contracts/interfaces/IFeesManager.sol index 4e135fec..2d4b1b49 100644 --- a/contracts/interfaces/IFeesManager.sol +++ b/contracts/interfaces/IFeesManager.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.3; -import {Fees, Bid, PayloadDetails} from "../common/Structs.sol"; +import {Fees, Bid, PayloadDetails} from "../protocol/utils/common/Structs.sol"; interface IFeesManager { function blockFees(address appGateway_, Fees memory fees_, bytes32 asyncId_) external; diff --git a/contracts/interfaces/ISocketBatcher.sol b/contracts/interfaces/ISocketBatcher.sol index fdb90a6e..513687b5 100644 --- a/contracts/interfaces/ISocketBatcher.sol +++ b/contracts/interfaces/ISocketBatcher.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: GPL-3.0-only pragma solidity ^0.8.21; -import "../common/Structs.sol"; +import "../protocol/utils/common/Structs.sol"; interface ISocketBatcher { function attestAndExecute( diff --git a/contracts/interfaces/IWatcherPrecompile.sol b/contracts/interfaces/IWatcherPrecompile.sol index acb59c7b..a5d374b2 100644 --- a/contracts/interfaces/IWatcherPrecompile.sol +++ b/contracts/interfaces/IWatcherPrecompile.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: Unlicense pragma solidity ^0.8.21; -import {PayloadDetails, AsyncRequest, FinalizeParams, PayloadRootParams, AppGatewayConfig, PlugConfig, ResolvedPromises} from "../common/Structs.sol"; +import {PayloadDetails, AsyncRequest, FinalizeParams, PayloadRootParams, AppGatewayConfig, PlugConfig, ResolvedPromises} from "../protocol/utils/common/Structs.sol"; /// @title IWatcherPrecompile /// @notice Interface for the Watcher Precompile system that handles payload verification and execution diff --git a/contracts/mock/MockSocket.sol b/contracts/mock/MockSocket.sol index b087d9d1..bff6dc6d 100644 --- a/contracts/mock/MockSocket.sol +++ b/contracts/mock/MockSocket.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.21; import "../interfaces/IPlug.sol"; -import {PlugDisconnected, InvalidAppGateway} from "../common/Errors.sol"; +import {PlugDisconnected, InvalidAppGateway} from "../protocol/utils/common/Errors.sol"; import "../interfaces/ISwitchboard.sol"; import "../interfaces/ISocket.sol"; diff --git a/contracts/mock/MockWatcherPrecompile.sol b/contracts/mock/MockWatcherPrecompile.sol index 80da10e6..3fe4c2ef 100644 --- a/contracts/mock/MockWatcherPrecompile.sol +++ b/contracts/mock/MockWatcherPrecompile.sol @@ -5,9 +5,9 @@ import "../interfaces/IAppGateway.sol"; import "../interfaces/IWatcherPrecompile.sol"; import "../interfaces/IPromise.sol"; -import {PayloadRootParams, AsyncRequest, FinalizeParams, TimeoutRequest, CallFromInboxParams, PlugConfig, ResolvedPromises, AppGatewayConfig} from "../common/Structs.sol"; -import {QUERY, FINALIZE, SCHEDULE} from "../common/Constants.sol"; -import {TimeoutDelayTooLarge, TimeoutAlreadyResolved, InvalidInboxCaller, ResolvingTimeoutTooEarly, CallFailed, AppGatewayAlreadyCalled} from "../common/Errors.sol"; +import {PayloadRootParams, AsyncRequest, FinalizeParams, TimeoutRequest, CallFromInboxParams, PlugConfig, ResolvedPromises, AppGatewayConfig} from "../protocol/utils/common/Structs.sol"; +import {QUERY, FINALIZE, SCHEDULE} from "../protocol/utils/common/Constants.sol"; +import {TimeoutDelayTooLarge, TimeoutAlreadyResolved, InvalidInboxCaller, ResolvingTimeoutTooEarly, CallFailed, AppGatewayAlreadyCalled} from "../protocol/utils/common/Errors.sol"; import "solady/utils/ERC1967Factory.sol"; /// @title WatcherPrecompile diff --git a/contracts/AddressResolver.sol b/contracts/protocol/AddressResolver.sol similarity index 99% rename from contracts/AddressResolver.sol rename to contracts/protocol/AddressResolver.sol index 045142cf..d6bcf3e3 100644 --- a/contracts/AddressResolver.sol +++ b/contracts/protocol/AddressResolver.sol @@ -1,13 +1,13 @@ // SPDX-License-Identifier: Unlicense pragma solidity ^0.8.21; -import "./interfaces/IAddressResolver.sol"; -import {Forwarder} from "./Forwarder.sol"; -import {AsyncPromise} from "./AsyncPromise.sol"; import {Ownable} from "solady/auth/Ownable.sol"; import {LibClone} from "solady/utils/LibClone.sol"; import {UpgradeableBeacon} from "solady/utils/UpgradeableBeacon.sol"; import {Initializable} from "solady/utils/Initializable.sol"; +import "../interfaces/IAddressResolver.sol"; +import {Forwarder} from "./Forwarder.sol"; +import {AsyncPromise} from "./AsyncPromise.sol"; /// @title AddressResolver Contract /// @notice This contract is responsible for fetching latest core addresses and deploying Forwarder and AsyncPromise contracts. diff --git a/contracts/AsyncPromise.sol b/contracts/protocol/AsyncPromise.sol similarity index 97% rename from contracts/AsyncPromise.sol rename to contracts/protocol/AsyncPromise.sol index 3c84131a..99f5e08e 100644 --- a/contracts/AsyncPromise.sol +++ b/contracts/protocol/AsyncPromise.sol @@ -2,8 +2,8 @@ pragma solidity ^0.8.21; import {AddressResolverUtil} from "./utils/AddressResolverUtil.sol"; -import {IPromise} from "./interfaces/IPromise.sol"; -import {IAppGateway} from "./interfaces/IAppGateway.sol"; +import {IPromise} from "../interfaces/IPromise.sol"; +import {IAppGateway} from "../interfaces/IAppGateway.sol"; import {Initializable} from "solady/utils/Initializable.sol"; /// @notice The state of the async promise diff --git a/contracts/Forwarder.sol b/contracts/protocol/Forwarder.sol similarity index 94% rename from contracts/Forwarder.sol rename to contracts/protocol/Forwarder.sol index 43e4656e..dbe2c807 100644 --- a/contracts/Forwarder.sol +++ b/contracts/protocol/Forwarder.sol @@ -1,12 +1,12 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.21; -import "./interfaces/IAddressResolver.sol"; -import "./interfaces/IDeliveryHelper.sol"; -import "./interfaces/IAppGateway.sol"; -import "./interfaces/IPromise.sol"; +import "../interfaces/IAddressResolver.sol"; +import "../interfaces/IDeliveryHelper.sol"; +import "../interfaces/IAppGateway.sol"; +import "../interfaces/IPromise.sol"; import "./AsyncPromise.sol"; -import "./interfaces/IForwarder.sol"; +import "../interfaces/IForwarder.sol"; import "solady/utils/Initializable.sol"; /// @title Forwarder Contract diff --git a/contracts/payload-delivery/ContractFactoryPlug.sol b/contracts/protocol/payload-delivery/ContractFactoryPlug.sol similarity index 93% rename from contracts/payload-delivery/ContractFactoryPlug.sol rename to contracts/protocol/payload-delivery/ContractFactoryPlug.sol index 3b107ed6..c1cb1c98 100644 --- a/contracts/payload-delivery/ContractFactoryPlug.sol +++ b/contracts/protocol/payload-delivery/ContractFactoryPlug.sol @@ -1,11 +1,11 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.21; -import "../base/PlugBase.sol"; import "../utils/AccessControl.sol"; -import {RESCUE_ROLE} from "../utils/AccessRoles.sol"; -import "../libraries/RescueFundsLib.sol"; -import {NotSocket} from "../common/Errors.sol"; +import {RESCUE_ROLE} from "../utils/common/AccessRoles.sol"; +import "../utils/RescueFundsLib.sol"; +import {NotSocket} from "../utils/common/Errors.sol"; +import "../../base/PlugBase.sol"; /// @title ContractFactory /// @notice Abstract contract for deploying contracts diff --git a/contracts/payload-delivery/FeesPlug.sol b/contracts/protocol/payload-delivery/FeesPlug.sol similarity index 95% rename from contracts/payload-delivery/FeesPlug.sol rename to contracts/protocol/payload-delivery/FeesPlug.sol index 921baa9d..ced1b5c2 100644 --- a/contracts/payload-delivery/FeesPlug.sol +++ b/contracts/protocol/payload-delivery/FeesPlug.sol @@ -2,11 +2,11 @@ pragma solidity ^0.8.21; import "solmate/utils/SafeTransferLib.sol"; -import "../base/PlugBase.sol"; +import "../../base/PlugBase.sol"; import "../utils/AccessControl.sol"; -import {RESCUE_ROLE} from "../utils/AccessRoles.sol"; -import "../libraries/RescueFundsLib.sol"; -import {ETH_ADDRESS} from "../common/Constants.sol"; +import {RESCUE_ROLE} from "../utils/common/AccessRoles.sol"; +import "../utils/RescueFundsLib.sol"; +import {ETH_ADDRESS} from "../utils/common/Constants.sol"; /// @title FeesManager /// @notice Abstract contract for managing fees diff --git a/contracts/payload-delivery/app-gateway/AuctionManager.sol b/contracts/protocol/payload-delivery/app-gateway/AuctionManager.sol similarity index 95% rename from contracts/payload-delivery/app-gateway/AuctionManager.sol rename to contracts/protocol/payload-delivery/app-gateway/AuctionManager.sol index f335246a..92df15eb 100644 --- a/contracts/payload-delivery/app-gateway/AuctionManager.sol +++ b/contracts/protocol/payload-delivery/app-gateway/AuctionManager.sol @@ -4,10 +4,10 @@ pragma solidity ^0.8.0; import {Ownable} from "solady/auth/Ownable.sol"; import {ECDSA} from "solady/utils/ECDSA.sol"; import {AddressResolverUtil} from "../../utils/AddressResolverUtil.sol"; -import {Fees, Bid, PayloadBatch} from "../../common/Structs.sol"; -import {IDeliveryHelper} from "../../interfaces/IDeliveryHelper.sol"; -import {IFeesManager} from "../../interfaces/IFeesManager.sol"; -import {IAuctionManager} from "../../interfaces/IAuctionManager.sol"; +import {Fees, Bid, PayloadBatch} from "../../utils/common/Structs.sol"; +import {IDeliveryHelper} from "../../../interfaces/IDeliveryHelper.sol"; +import {IFeesManager} from "../../../interfaces/IFeesManager.sol"; +import {IAuctionManager} from "../../../interfaces/IAuctionManager.sol"; import "solady/utils/Initializable.sol"; /// @title AuctionManager diff --git a/contracts/payload-delivery/app-gateway/BatchAsync.sol b/contracts/protocol/payload-delivery/app-gateway/BatchAsync.sol similarity index 95% rename from contracts/payload-delivery/app-gateway/BatchAsync.sol rename to contracts/protocol/payload-delivery/app-gateway/BatchAsync.sol index 4f0dff6d..ddb21313 100644 --- a/contracts/payload-delivery/app-gateway/BatchAsync.sol +++ b/contracts/protocol/payload-delivery/app-gateway/BatchAsync.sol @@ -3,14 +3,14 @@ pragma solidity ^0.8.21; import "./QueueAsync.sol"; -import {IDeliveryHelper} from "../../interfaces/IDeliveryHelper.sol"; -import {IAppGateway} from "../../interfaces/IAppGateway.sol"; -import {IAddressResolver} from "../../interfaces/IAddressResolver.sol"; -import {IAuctionManager} from "../../interfaces/IAuctionManager.sol"; -import {IFeesManager} from "../../interfaces/IFeesManager.sol"; - -import {Bid, PayloadBatch, Fees, PayloadDetails} from "../../common/Structs.sol"; -import {FORWARD_CALL, DISTRIBUTE_FEE, DEPLOY, WITHDRAW, QUERY, FINALIZE} from "../../common/Constants.sol"; +import {IDeliveryHelper} from "../../../interfaces/IDeliveryHelper.sol"; +import {IAppGateway} from "../../../interfaces/IAppGateway.sol"; +import {IAddressResolver} from "../../../interfaces/IAddressResolver.sol"; +import {IAuctionManager} from "../../../interfaces/IAuctionManager.sol"; +import {IFeesManager} from "../../../interfaces/IFeesManager.sol"; + +import {Bid, PayloadBatch, Fees, PayloadDetails} from "../../../protocol/utils/common/Structs.sol"; +import {FORWARD_CALL, DISTRIBUTE_FEE, DEPLOY, WITHDRAW, QUERY, FINALIZE} from "../../../protocol/utils/common/Constants.sol"; /// @title BatchAsync /// @notice Abstract contract for managing asynchronous payload batches diff --git a/contracts/payload-delivery/app-gateway/DeliveryHelper.sol b/contracts/protocol/payload-delivery/app-gateway/DeliveryHelper.sol similarity index 96% rename from contracts/payload-delivery/app-gateway/DeliveryHelper.sol rename to contracts/protocol/payload-delivery/app-gateway/DeliveryHelper.sol index 8b10dd4d..b3192f96 100644 --- a/contracts/payload-delivery/app-gateway/DeliveryHelper.sol +++ b/contracts/protocol/payload-delivery/app-gateway/DeliveryHelper.sol @@ -1,14 +1,15 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -import {IAppGateway} from "../../interfaces/IAppGateway.sol"; import {Ownable} from "solady/auth/Ownable.sol"; -import {Bid, PayloadBatch, Fees, PayloadDetails, FinalizeParams} from "../../common/Structs.sol"; -import {DISTRIBUTE_FEE, DEPLOY} from "../../common/Constants.sol"; -import {PromisesNotResolved} from "../../common/Errors.sol"; -import "./BatchAsync.sol"; import "solady/utils/Initializable.sol"; +import {IAppGateway} from "../../../interfaces/IAppGateway.sol"; +import {Bid, PayloadBatch, Fees, PayloadDetails, FinalizeParams} from "../../../protocol/utils/common/Structs.sol"; +import {DISTRIBUTE_FEE, DEPLOY} from "../../../protocol/utils/common/Constants.sol"; +import {PromisesNotResolved} from "../../../protocol/utils/common/Errors.sol"; +import "./BatchAsync.sol"; + contract DeliveryHelper is BatchAsync, Ownable, Initializable { event CallBackReverted(bytes32 asyncId_, bytes32 payloadId_); uint64 public version; diff --git a/contracts/payload-delivery/app-gateway/FeesManager.sol b/contracts/protocol/payload-delivery/app-gateway/FeesManager.sol similarity index 97% rename from contracts/payload-delivery/app-gateway/FeesManager.sol rename to contracts/protocol/payload-delivery/app-gateway/FeesManager.sol index e1343cf2..c168b51d 100644 --- a/contracts/payload-delivery/app-gateway/FeesManager.sol +++ b/contracts/protocol/payload-delivery/app-gateway/FeesManager.sol @@ -2,14 +2,15 @@ pragma solidity ^0.8.0; import {Ownable} from "solady/auth/Ownable.sol"; -import {AddressResolverUtil} from "../../utils/AddressResolverUtil.sol"; -import {Bid, Fees, PayloadDetails, CallType, FinalizeParams, PayloadBatch} from "../../common/Structs.sol"; -import {IDeliveryHelper} from "../../interfaces/IDeliveryHelper.sol"; -import {FORWARD_CALL, DISTRIBUTE_FEE, DEPLOY, WITHDRAW} from "../../common/Constants.sol"; -import {IFeesPlug} from "../../interfaces/IFeesPlug.sol"; -import {IFeesManager} from "../../interfaces/IFeesManager.sol"; import "solady/utils/Initializable.sol"; +import {AddressResolverUtil} from "../../../protocol/utils/AddressResolverUtil.sol"; +import {Bid, Fees, PayloadDetails, CallType, FinalizeParams, PayloadBatch} from "../../../protocol/utils/common/Structs.sol"; +import {IDeliveryHelper} from "../../../interfaces/IDeliveryHelper.sol"; +import {FORWARD_CALL, DISTRIBUTE_FEE, DEPLOY, WITHDRAW} from "../../../protocol/utils/common/Constants.sol"; +import {IFeesPlug} from "../../../interfaces/IFeesPlug.sol"; +import {IFeesManager} from "../../../interfaces/IFeesManager.sol"; + /// @title FeesManager /// @notice Contract for managing fees contract FeesManager is IFeesManager, AddressResolverUtil, Ownable, Initializable { diff --git a/contracts/payload-delivery/app-gateway/QueueAsync.sol b/contracts/protocol/payload-delivery/app-gateway/QueueAsync.sol similarity index 91% rename from contracts/payload-delivery/app-gateway/QueueAsync.sol rename to contracts/protocol/payload-delivery/app-gateway/QueueAsync.sol index d7ecc30e..32b9520a 100644 --- a/contracts/payload-delivery/app-gateway/QueueAsync.sol +++ b/contracts/protocol/payload-delivery/app-gateway/QueueAsync.sol @@ -1,15 +1,15 @@ // SPDX-License-Identifier: Unlicense pragma solidity ^0.8.21; -import {AddressResolverUtil} from "../../utils/AddressResolverUtil.sol"; -import {CallParams, Fees, PayloadDetails, CallType, Bid, PayloadBatch} from "../../common/Structs.sol"; -import {NotAuctionManager, InvalidPromise, InvalidIndex} from "../../common/Errors.sol"; +import {AddressResolverUtil} from "../../../protocol/utils/AddressResolverUtil.sol"; +import {CallParams, Fees, PayloadDetails, CallType, Bid, PayloadBatch} from "../../../protocol/utils/common/Structs.sol"; +import {NotAuctionManager, InvalidPromise, InvalidIndex} from "../../../protocol/utils/common/Errors.sol"; import {AsyncPromise} from "../../AsyncPromise.sol"; -import {IPromise} from "../../interfaces/IPromise.sol"; -import {IAppDeployer} from "../../interfaces/IAppDeployer.sol"; -import {IAddressResolver} from "../../interfaces/IAddressResolver.sol"; -import {IContractFactoryPlug} from "../../interfaces/IContractFactoryPlug.sol"; -import {IDeliveryHelper} from "../../interfaces/IDeliveryHelper.sol"; +import {IPromise} from "../../../interfaces/IPromise.sol"; +import {IAppDeployer} from "../../../interfaces/IAppDeployer.sol"; +import {IAddressResolver} from "../../../interfaces/IAddressResolver.sol"; +import {IContractFactoryPlug} from "../../../interfaces/IContractFactoryPlug.sol"; +import {IDeliveryHelper} from "../../../interfaces/IDeliveryHelper.sol"; /// @notice Abstract contract for managing asynchronous payloads abstract contract QueueAsync is AddressResolverUtil, IDeliveryHelper { diff --git a/contracts/socket/Socket.sol b/contracts/protocol/socket/Socket.sol similarity index 98% rename from contracts/socket/Socket.sol rename to contracts/protocol/socket/Socket.sol index a0a24f3c..7102c533 100644 --- a/contracts/socket/Socket.sol +++ b/contracts/protocol/socket/Socket.sol @@ -1,9 +1,9 @@ // SPDX-License-Identifier: GPL-3.0-only pragma solidity ^0.8.21; -import "../interfaces/IPlug.sol"; +import "../../interfaces/IPlug.sol"; import "./SocketBase.sol"; -import {PlugDisconnected, InvalidAppGateway} from "../common/Errors.sol"; +import {PlugDisconnected, InvalidAppGateway} from "../utils/common/Errors.sol"; /** * @title SocketDst diff --git a/contracts/socket/SocketBase.sol b/contracts/protocol/socket/SocketBase.sol similarity index 98% rename from contracts/socket/SocketBase.sol rename to contracts/protocol/socket/SocketBase.sol index d6b5b221..7bc97d69 100644 --- a/contracts/socket/SocketBase.sol +++ b/contracts/protocol/socket/SocketBase.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: GPL-3.0-only pragma solidity ^0.8.21; -import "../libraries/RescueFundsLib.sol"; +import "../utils/RescueFundsLib.sol"; import "./SocketConfig.sol"; import {ECDSA} from "solady/utils/ECDSA.sol"; diff --git a/contracts/socket/SocketBatcher.sol b/contracts/protocol/socket/SocketBatcher.sol similarity index 87% rename from contracts/socket/SocketBatcher.sol rename to contracts/protocol/socket/SocketBatcher.sol index 2ccfda5a..685e2111 100644 --- a/contracts/socket/SocketBatcher.sol +++ b/contracts/protocol/socket/SocketBatcher.sol @@ -2,10 +2,10 @@ pragma solidity ^0.8.21; import "solady/auth/Ownable.sol"; -import "../interfaces/ISocket.sol"; -import "../interfaces/ISwitchboard.sol"; -import "../libraries/RescueFundsLib.sol"; -import {ExecutePayloadParams} from "../common/Structs.sol"; +import "../../interfaces/ISocket.sol"; +import "../../interfaces/ISwitchboard.sol"; +import "../utils/RescueFundsLib.sol"; +import {ExecutePayloadParams} from "../../protocol/utils/common/Structs.sol"; /** * @title SocketBatcher diff --git a/contracts/socket/SocketConfig.sol b/contracts/protocol/socket/SocketConfig.sol similarity index 94% rename from contracts/socket/SocketConfig.sol rename to contracts/protocol/socket/SocketConfig.sol index fb978424..50a56f35 100644 --- a/contracts/socket/SocketConfig.sol +++ b/contracts/protocol/socket/SocketConfig.sol @@ -1,10 +1,10 @@ // SPDX-License-Identifier: GPL-3.0-only pragma solidity ^0.8.21; -import "../interfaces/ISocket.sol"; -import "../interfaces/ISwitchboard.sol"; +import "../../interfaces/ISocket.sol"; +import "../../interfaces/ISwitchboard.sol"; import "../utils/AccessControl.sol"; -import {RESCUE_ROLE} from "../utils/AccessRoles.sol"; +import {RESCUE_ROLE} from "../utils/common/AccessRoles.sol"; /** * @title SocketConfig diff --git a/contracts/socket/switchboard/FastSwitchboard.sol b/contracts/protocol/socket/switchboard/FastSwitchboard.sol similarity index 100% rename from contracts/socket/switchboard/FastSwitchboard.sol rename to contracts/protocol/socket/switchboard/FastSwitchboard.sol diff --git a/contracts/socket/switchboard/SwitchboardBase.sol b/contracts/protocol/socket/switchboard/SwitchboardBase.sol similarity index 92% rename from contracts/socket/switchboard/SwitchboardBase.sol rename to contracts/protocol/socket/switchboard/SwitchboardBase.sol index 6b6b3753..e628bb20 100644 --- a/contracts/socket/switchboard/SwitchboardBase.sol +++ b/contracts/protocol/socket/switchboard/SwitchboardBase.sol @@ -1,11 +1,11 @@ // SPDX-License-Identifier: GPL-3.0-only pragma solidity ^0.8.21; -import "../../interfaces/ISwitchboard.sol"; -import "../../interfaces/ISocket.sol"; +import "../../../interfaces/ISwitchboard.sol"; +import "../../../interfaces/ISocket.sol"; import "../../utils/AccessControl.sol"; -import {RESCUE_ROLE} from "../../utils/AccessRoles.sol"; -import "../../libraries/RescueFundsLib.sol"; +import {RESCUE_ROLE} from "../../utils/common/AccessRoles.sol"; +import "../../utils/RescueFundsLib.sol"; import {ECDSA} from "solady/utils/ECDSA.sol"; abstract contract SwitchboardBase is ISwitchboard, AccessControl { diff --git a/contracts/utils/AccessControl.sol b/contracts/protocol/utils/AccessControl.sol similarity index 100% rename from contracts/utils/AccessControl.sol rename to contracts/protocol/utils/AccessControl.sol diff --git a/contracts/utils/AddressResolverUtil.sol b/contracts/protocol/utils/AddressResolverUtil.sol similarity index 95% rename from contracts/utils/AddressResolverUtil.sol rename to contracts/protocol/utils/AddressResolverUtil.sol index 92fced3e..6172427b 100644 --- a/contracts/utils/AddressResolverUtil.sol +++ b/contracts/protocol/utils/AddressResolverUtil.sol @@ -1,9 +1,9 @@ // SPDX-License-Identifier: Unlicense pragma solidity ^0.8.21; -import "../interfaces/IAddressResolver.sol"; -import "../interfaces/IDeliveryHelper.sol"; -import "../interfaces/IWatcherPrecompile.sol"; +import "../../interfaces/IAddressResolver.sol"; +import "../../interfaces/IDeliveryHelper.sol"; +import "../../interfaces/IWatcherPrecompile.sol"; /// @title AddressResolverUtil /// @notice Utility contract for resolving system contract addresses diff --git a/contracts/utils/FeesPlugin.sol b/contracts/protocol/utils/FeesPlugin.sol similarity index 93% rename from contracts/utils/FeesPlugin.sol rename to contracts/protocol/utils/FeesPlugin.sol index 90c34f8f..a5320f38 100644 --- a/contracts/utils/FeesPlugin.sol +++ b/contracts/protocol/utils/FeesPlugin.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.21; -import {Fees} from "../common/Structs.sol"; +import {Fees} from "../utils/common/Structs.sol"; /// @title FeesPlugin /// @notice Abstract contract for managing fee configurations diff --git a/contracts/utils/Gauge.sol b/contracts/protocol/utils/Gauge.sol similarity index 93% rename from contracts/utils/Gauge.sol rename to contracts/protocol/utils/Gauge.sol index 80a2bf6d..1aa4cebe 100644 --- a/contracts/utils/Gauge.sol +++ b/contracts/protocol/utils/Gauge.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.21; -import {LimitParams} from "../common/Structs.sol"; -import {LimitReached} from "../common/Errors.sol"; +import {LimitParams} from "../utils/common/Structs.sol"; +import {LimitReached} from "../utils/common/Errors.sol"; abstract contract Gauge { function _getCurrentLimit(LimitParams storage params_) internal view returns (uint256 _limit) { diff --git a/contracts/libraries/RescueFundsLib.sol b/contracts/protocol/utils/RescueFundsLib.sol similarity index 90% rename from contracts/libraries/RescueFundsLib.sol rename to contracts/protocol/utils/RescueFundsLib.sol index 7a633ae0..a2355bc6 100644 --- a/contracts/libraries/RescueFundsLib.sol +++ b/contracts/protocol/utils/RescueFundsLib.sol @@ -3,8 +3,8 @@ pragma solidity ^0.8.21; import "solmate/utils/SafeTransferLib.sol"; import "solmate/tokens/ERC20.sol"; -import {ZeroAddress} from "../common/Errors.sol"; -import {ETH_ADDRESS} from "../common/Constants.sol"; +import {ZeroAddress} from "../utils/common/Errors.sol"; +import {ETH_ADDRESS} from "../utils/common/Constants.sol"; /** * @title RescueFundsLib diff --git a/contracts/utils/AccessRoles.sol b/contracts/protocol/utils/common/AccessRoles.sol similarity index 100% rename from contracts/utils/AccessRoles.sol rename to contracts/protocol/utils/common/AccessRoles.sol diff --git a/contracts/common/Constants.sol b/contracts/protocol/utils/common/Constants.sol similarity index 100% rename from contracts/common/Constants.sol rename to contracts/protocol/utils/common/Constants.sol diff --git a/contracts/common/Errors.sol b/contracts/protocol/utils/common/Errors.sol similarity index 100% rename from contracts/common/Errors.sol rename to contracts/protocol/utils/common/Errors.sol diff --git a/contracts/common/Structs.sol b/contracts/protocol/utils/common/Structs.sol similarity index 100% rename from contracts/common/Structs.sol rename to contracts/protocol/utils/common/Structs.sol diff --git a/contracts/watcherPrecompile/WatcherPrecompile.sol b/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol similarity index 98% rename from contracts/watcherPrecompile/WatcherPrecompile.sol rename to contracts/protocol/watcherPrecompile/WatcherPrecompile.sol index 9c8b0537..6482f0ed 100644 --- a/contracts/watcherPrecompile/WatcherPrecompile.sol +++ b/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol @@ -2,13 +2,13 @@ pragma solidity ^0.8.21; import "./WatcherPrecompileConfig.sol"; -import "../interfaces/IAppGateway.sol"; -import "../interfaces/IPromise.sol"; -import "../interfaces/IFeesManager.sol"; +import "../../interfaces/IAppGateway.sol"; +import "../../interfaces/IPromise.sol"; +import "../../interfaces/IFeesManager.sol"; import "solady/utils/Initializable.sol"; -import {PayloadRootParams, AsyncRequest, FinalizeParams, TimeoutRequest, CallFromInboxParams} from "../common/Structs.sol"; -import {TimeoutDelayTooLarge, TimeoutAlreadyResolved, InvalidInboxCaller, ResolvingTimeoutTooEarly, CallFailed, AppGatewayAlreadyCalled} from "../common/Errors.sol"; +import {PayloadRootParams, AsyncRequest, FinalizeParams, TimeoutRequest, CallFromInboxParams} from "../utils/common/Structs.sol"; +import {TimeoutDelayTooLarge, TimeoutAlreadyResolved, InvalidInboxCaller, ResolvingTimeoutTooEarly, CallFailed, AppGatewayAlreadyCalled} from "../utils/common/Errors.sol"; /// @title WatcherPrecompile /// @notice Contract that handles payload verification, execution and app configurations diff --git a/contracts/watcherPrecompile/WatcherPrecompileConfig.sol b/contracts/protocol/watcherPrecompile/WatcherPrecompileConfig.sol similarity index 100% rename from contracts/watcherPrecompile/WatcherPrecompileConfig.sol rename to contracts/protocol/watcherPrecompile/WatcherPrecompileConfig.sol diff --git a/contracts/watcherPrecompile/WatcherPrecompileLimits.sol b/contracts/protocol/watcherPrecompile/WatcherPrecompileLimits.sol similarity index 97% rename from contracts/watcherPrecompile/WatcherPrecompileLimits.sol rename to contracts/protocol/watcherPrecompile/WatcherPrecompileLimits.sol index 298f9c8c..b4f6a857 100644 --- a/contracts/watcherPrecompile/WatcherPrecompileLimits.sol +++ b/contracts/protocol/watcherPrecompile/WatcherPrecompileLimits.sol @@ -1,12 +1,12 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.21; +import {Ownable} from "solady/auth/Ownable.sol"; import {Gauge} from "../utils/Gauge.sol"; -import {LimitParams, UpdateLimitParams} from "../common/Structs.sol"; +import {LimitParams, UpdateLimitParams} from "../utils/common/Structs.sol"; import {AddressResolverUtil} from "../utils/AddressResolverUtil.sol"; -import "../interfaces/IWatcherPrecompile.sol"; -import {Ownable} from "solady/auth/Ownable.sol"; -import {QUERY, FINALIZE, SCHEDULE} from "../common/Constants.sol"; +import {QUERY, FINALIZE, SCHEDULE} from "../utils/common/Constants.sol"; +import "../../interfaces/IWatcherPrecompile.sol"; abstract contract WatcherPrecompileLimits is Gauge, diff --git a/script/PayFeesInArbitrumETH.s.sol b/script/PayFeesInArbitrumETH.s.sol index 15472b22..a4932825 100644 --- a/script/PayFeesInArbitrumETH.s.sol +++ b/script/PayFeesInArbitrumETH.s.sol @@ -3,9 +3,9 @@ pragma solidity ^0.8.0; import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/Console.sol"; -import {FeesPlug} from "../contracts/payload-delivery/FeesPlug.sol"; -import {Fees} from "../contracts/common/Structs.sol"; -import {ETH_ADDRESS} from "../contracts/common/Constants.sol"; +import {FeesPlug} from "../contracts/protocol/payload-delivery/FeesPlug.sol"; +import {Fees} from "../contracts/protocol/utils/common/Structs.sol"; +import {ETH_ADDRESS} from "../contracts/protocol/utils/common/Constants.sol"; contract DepositFees is Script { function run() external { diff --git a/script/admin/CheckAppEVMxLimits.s.sol b/script/admin/CheckAppEVMxLimits.s.sol index aa69a949..c61f0719 100644 --- a/script/admin/CheckAppEVMxLimits.s.sol +++ b/script/admin/CheckAppEVMxLimits.s.sol @@ -2,9 +2,9 @@ pragma solidity ^0.8.13; import "forge-std/Script.sol"; -import {WatcherPrecompile} from "../../contracts/watcherPrecompile/WatcherPrecompile.sol"; -import {LimitParams} from "../../contracts/common/Structs.sol"; -import {SCHEDULE, QUERY, FINALIZE} from "../../contracts/common/Constants.sol"; +import {WatcherPrecompile} from "../../contracts/protocol/watcherPrecompile/WatcherPrecompile.sol"; +import {LimitParams} from "../../contracts/protocol/utils/common/Structs.sol"; +import {SCHEDULE, QUERY, FINALIZE} from "../../contracts/protocol/utils/common/Constants.sol"; contract CheckLimitsScript is Script { function run() external { diff --git a/script/admin/UpdateAppEVMxLimits.s.sol b/script/admin/UpdateAppEVMxLimits.s.sol index a3e005b9..94b52c09 100644 --- a/script/admin/UpdateAppEVMxLimits.s.sol +++ b/script/admin/UpdateAppEVMxLimits.s.sol @@ -2,9 +2,9 @@ pragma solidity ^0.8.13; import "forge-std/Script.sol"; -import {WatcherPrecompile} from "../../contracts/watcherPrecompile/WatcherPrecompile.sol"; -import {UpdateLimitParams} from "../../contracts/common/Structs.sol"; -import {SCHEDULE, QUERY, FINALIZE} from "../../contracts/common/Constants.sol"; +import {WatcherPrecompile} from "../../contracts/protocol/watcherPrecompile/WatcherPrecompile.sol"; +import {UpdateLimitParams} from "../../contracts/protocol/utils/common/Structs.sol"; +import {SCHEDULE, QUERY, FINALIZE} from "../../contracts/protocol/utils/common/Constants.sol"; contract UpdateLimitsScript is Script { function run() external { diff --git a/script/counter-inbox/DeployCounterAndGateway.s.sol b/script/counter-inbox/DeployCounterAndGateway.s.sol index d18d6987..09341af4 100644 --- a/script/counter-inbox/DeployCounterAndGateway.s.sol +++ b/script/counter-inbox/DeployCounterAndGateway.s.sol @@ -5,8 +5,8 @@ import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/console.sol"; import {CounterInbox} from "../../contracts/apps/counter-inbox/CounterInbox.sol"; import {CounterInboxAppGateway} from "../../contracts/apps/counter-inbox/CounterInboxAppGateway.sol"; -import {Fees} from "../../contracts/common/Structs.sol"; -import {ETH_ADDRESS, FAST} from "../../contracts/common/Constants.sol"; +import {Fees} from "../../contracts/protocol/utils/common/Structs.sol"; +import {ETH_ADDRESS} from "../../contracts/protocol/utils/common/Constants.sol"; contract DeployCounterAndGateway is Script { function run() external { diff --git a/script/counter-inbox/Increment.s.sol b/script/counter-inbox/Increment.s.sol index 537ac5d6..de4f6f45 100644 --- a/script/counter-inbox/Increment.s.sol +++ b/script/counter-inbox/Increment.s.sol @@ -5,8 +5,8 @@ import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/console.sol"; import {CounterInbox} from "../../contracts/apps/counter-inbox/CounterInbox.sol"; import {CounterInboxAppGateway} from "../../contracts/apps/counter-inbox/CounterInboxAppGateway.sol"; -import {Fees} from "../../contracts/common/Structs.sol"; -import {ETH_ADDRESS, FAST} from "../../contracts/common/Constants.sol"; +import {Fees} from "../../contracts/protocol/utils/common/Structs.sol"; +import {ETH_ADDRESS, FAST} from "../../contracts/protocol/utils/common/Constants.sol"; contract Increment is Script { function run() external { diff --git a/script/counter/WithdrawFeesArbitrumFeesPlug.s.sol b/script/counter/WithdrawFeesArbitrumFeesPlug.s.sol index a46195d5..151496b4 100644 --- a/script/counter/WithdrawFeesArbitrumFeesPlug.s.sol +++ b/script/counter/WithdrawFeesArbitrumFeesPlug.s.sol @@ -3,8 +3,8 @@ pragma solidity ^0.8.0; import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/Console.sol"; -import {FeesPlug} from "../../contracts/payload-delivery/FeesPlug.sol"; -import {ETH_ADDRESS} from "../../contracts/common/Constants.sol"; +import {FeesPlug} from "../../contracts/protocol/payload-delivery/FeesPlug.sol"; +import {ETH_ADDRESS} from "../../contracts/protocol/utils/common/Constants.sol"; import {CounterAppGateway} from "../../contracts/apps/counter/CounterAppGateway.sol"; contract WithdrawFees is Script { diff --git a/script/counter/deployEVMxCounterApp.s.sol b/script/counter/deployEVMxCounterApp.s.sol index 656a74e2..97d4f68d 100644 --- a/script/counter/deployEVMxCounterApp.s.sol +++ b/script/counter/deployEVMxCounterApp.s.sol @@ -5,8 +5,8 @@ import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/console.sol"; import {CounterAppGateway} from "../../contracts/apps//counter/CounterAppGateway.sol"; import {CounterDeployer} from "../../contracts/apps//counter/CounterDeployer.sol"; -import {Fees} from "../../contracts/common/Structs.sol"; -import {ETH_ADDRESS, FAST} from "../../contracts/common/Constants.sol"; +import {Fees} from "../../contracts/protocol/utils/common/Structs.sol"; +import {ETH_ADDRESS, FAST} from "../../contracts/protocol/utils/common/Constants.sol"; contract CounterDeploy is Script { function run() external { diff --git a/script/counter/deployOnchainCounters.s.sol b/script/counter/deployOnchainCounters.s.sol index 6989bdbe..4279c13a 100644 --- a/script/counter/deployOnchainCounters.s.sol +++ b/script/counter/deployOnchainCounters.s.sol @@ -4,7 +4,7 @@ pragma solidity ^0.8.0; import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/console.sol"; import {CounterDeployer} from "../../contracts/apps//counter/CounterDeployer.sol"; -import {ETH_ADDRESS} from "../../contracts/common/Constants.sol"; +import {ETH_ADDRESS} from "../../contracts/protocol/utils/common/Constants.sol"; contract CounterDeployOnchain is Script { function run() external { diff --git a/script/cron/DeployGateway.s.sol b/script/cron/DeployGateway.s.sol index 624703db..32bd6eb1 100644 --- a/script/cron/DeployGateway.s.sol +++ b/script/cron/DeployGateway.s.sol @@ -4,8 +4,8 @@ pragma solidity ^0.8.0; import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/console.sol"; import {CronAppGateway} from "../../contracts/apps/cron/CronAppGateway.sol"; -import {Fees} from "../../contracts/common/Structs.sol"; -import {ETH_ADDRESS} from "../../contracts/common/Constants.sol"; +import {Fees} from "../../contracts/protocol/utils/common/Structs.sol"; +import {ETH_ADDRESS} from "../../contracts/protocol/utils/common/Constants.sol"; contract DeployGateway is Script { function run() external { diff --git a/script/mock/FinalizeAndExecution.s.sol b/script/mock/FinalizeAndExecution.s.sol index 042daadc..542a8214 100644 --- a/script/mock/FinalizeAndExecution.s.sol +++ b/script/mock/FinalizeAndExecution.s.sol @@ -5,7 +5,7 @@ import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/console.sol"; import {MockWatcherPrecompile} from "../../contracts/mock/MockWatcherPrecompile.sol"; import {MockSocket} from "../../contracts/mock/MockSocket.sol"; -import {CallType, FinalizeParams, PayloadDetails} from "../../contracts/common/Structs.sol"; +import {CallType, FinalizeParams, PayloadDetails} from "../../contracts/protocol/utils/common/Structs.sol"; contract InboxTest is Script { function run() external { string memory arbRpc = vm.envString("ARBITRUM_SEPOLIA_RPC"); diff --git a/script/parallel-counter/deployOffchain.s.sol b/script/parallel-counter/deployOffchain.s.sol index d18348fe..9cbe0350 100644 --- a/script/parallel-counter/deployOffchain.s.sol +++ b/script/parallel-counter/deployOffchain.s.sol @@ -5,8 +5,8 @@ import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/console.sol"; import {ParallelCounterAppGateway} from "../../contracts/apps/parallel-counter/ParallelCounterAppGateway.sol"; import {ParallelCounterDeployer} from "../../contracts/apps/parallel-counter/ParallelCounterDeployer.sol"; -import {Fees} from "../../contracts/common/Structs.sol"; -import {ETH_ADDRESS, FAST} from "../../contracts/common/Constants.sol"; +import {Fees} from "../../contracts/protocol/utils/common/Structs.sol"; +import {ETH_ADDRESS, FAST} from "../../contracts/protocol/utils/common/Constants.sol"; contract CounterDeploy is Script { function run() external { diff --git a/script/parallel-counter/deployOnchain.s.sol b/script/parallel-counter/deployOnchain.s.sol index ed8dd9c0..ba05c9c9 100644 --- a/script/parallel-counter/deployOnchain.s.sol +++ b/script/parallel-counter/deployOnchain.s.sol @@ -4,7 +4,7 @@ pragma solidity ^0.8.0; import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/console.sol"; import {ParallelCounterDeployer} from "../../contracts/apps/parallel-counter/ParallelCounterDeployer.sol"; -import {ETH_ADDRESS} from "../../contracts/common/Constants.sol"; +import {ETH_ADDRESS} from "../../contracts/protocol/utils/common/Constants.sol"; contract CounterDeployOnchain is Script { function run() external { diff --git a/script/super-token-lockable/DeployContracts.s.sol b/script/super-token-lockable/DeployContracts.s.sol index 9ab757b8..168c4592 100644 --- a/script/super-token-lockable/DeployContracts.s.sol +++ b/script/super-token-lockable/DeployContracts.s.sol @@ -6,8 +6,8 @@ import {console} from "forge-std/Console.sol"; import {SuperTokenLockableAppGateway} from "../../contracts/apps/super-token-lockable/SuperTokenLockableAppGateway.sol"; import {SuperTokenLockableDeployer} from "../../contracts/apps/super-token-lockable/SuperTokenLockableDeployer.sol"; import {SuperTokenLockable} from "../../contracts/apps/super-token-lockable/SuperTokenLockable.sol"; -import {Fees} from "../../contracts/common/Structs.sol"; -import {ETH_ADDRESS} from "../../contracts/common/Constants.sol"; +import {Fees} from "../../contracts/protocol/utils/common/Structs.sol"; +import {ETH_ADDRESS} from "../../contracts/protocol/utils/common/Constants.sol"; contract DeployContracts is Script { function run() external { diff --git a/script/super-token-lockable/DeployGateway.s.sol b/script/super-token-lockable/DeployGateway.s.sol index 8389a937..6145026f 100644 --- a/script/super-token-lockable/DeployGateway.s.sol +++ b/script/super-token-lockable/DeployGateway.s.sol @@ -6,8 +6,8 @@ import {console} from "forge-std/Console.sol"; import {SuperTokenLockableAppGateway} from "../../contracts/apps/super-token-lockable/SuperTokenLockableAppGateway.sol"; import {SuperTokenLockableDeployer} from "../../contracts/apps/super-token-lockable/SuperTokenLockableDeployer.sol"; import {SuperTokenLockable} from "../../contracts/apps/super-token-lockable/SuperTokenLockable.sol"; -import {Fees} from "../../contracts/common/Structs.sol"; -import {ETH_ADDRESS, FAST} from "../../contracts/common/Constants.sol"; +import {Fees} from "../../contracts/protocol/utils/common/Structs.sol"; +import {ETH_ADDRESS, FAST} from "../../contracts/protocol/utils/common/Constants.sol"; contract DeployGateway is Script { function run() external { diff --git a/script/super-token/DeployContracts.s.sol b/script/super-token/DeployContracts.s.sol index 79e37224..0b74d2eb 100644 --- a/script/super-token/DeployContracts.s.sol +++ b/script/super-token/DeployContracts.s.sol @@ -6,8 +6,8 @@ import {console} from "forge-std/Console.sol"; import {SuperTokenAppGateway} from "../../contracts/apps/super-token/SuperTokenAppGateway.sol"; import {SuperTokenDeployer} from "../../contracts/apps/super-token/SuperTokenDeployer.sol"; import {SuperToken} from "../../contracts/apps/super-token/SuperToken.sol"; -import {Fees} from "../../contracts/common/Structs.sol"; -import {ETH_ADDRESS} from "../../contracts/common/Constants.sol"; +import {Fees} from "../../contracts/protocol/utils/common/Structs.sol"; +import {ETH_ADDRESS} from "../../contracts/protocol/utils/common/Constants.sol"; contract DeployContracts is Script { function run() external { diff --git a/script/super-token/DeployGateway.s.sol b/script/super-token/DeployGateway.s.sol index 5f3fea2c..2771f878 100644 --- a/script/super-token/DeployGateway.s.sol +++ b/script/super-token/DeployGateway.s.sol @@ -6,8 +6,8 @@ import {console} from "forge-std/Console.sol"; import {SuperTokenAppGateway} from "../../contracts/apps/super-token/SuperTokenAppGateway.sol"; import {SuperTokenDeployer} from "../../contracts/apps/super-token/SuperTokenDeployer.sol"; import {SuperToken} from "../../contracts/apps/super-token/SuperToken.sol"; -import {Fees} from "../../contracts/common/Structs.sol"; -import {ETH_ADDRESS, FAST} from "../../contracts/common/Constants.sol"; +import {Fees} from "../../contracts/protocol/utils/common/Structs.sol"; +import {ETH_ADDRESS, FAST} from "../../contracts/protocol/utils/common/Constants.sol"; contract DeployGateway is Script { function run() external { diff --git a/test/DeliveryHelper.t.sol b/test/DeliveryHelper.t.sol index 8887fd27..63cc0a9f 100644 --- a/test/DeliveryHelper.t.sol +++ b/test/DeliveryHelper.t.sol @@ -1,11 +1,11 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -import "../contracts/payload-delivery/app-gateway/DeliveryHelper.sol"; -import "../contracts/payload-delivery/app-gateway/FeesManager.sol"; -import "../contracts/payload-delivery/app-gateway/AuctionManager.sol"; +import "../contracts/protocol/payload-delivery/app-gateway/DeliveryHelper.sol"; +import "../contracts/protocol/payload-delivery/app-gateway/FeesManager.sol"; +import "../contracts/protocol/payload-delivery/app-gateway/AuctionManager.sol"; -import "../contracts/Forwarder.sol"; +import "../contracts/protocol/Forwarder.sol"; import "../contracts/interfaces/IAppDeployer.sol"; import "../contracts/interfaces/IMultiChainAppDeployer.sol"; diff --git a/test/Migration.t.sol b/test/Migration.t.sol index ec7f5ac1..075b7344 100644 --- a/test/Migration.t.sol +++ b/test/Migration.t.sol @@ -2,10 +2,10 @@ pragma solidity ^0.8.0; import "./SetupTest.t.sol"; -import "../contracts/AddressResolver.sol"; -import "../contracts/watcherPrecompile/WatcherPrecompile.sol"; -import "../contracts/Forwarder.sol"; -import "../contracts/AsyncPromise.sol"; +import "../contracts/protocol/AddressResolver.sol"; +import "../contracts/protocol/watcherPrecompile/WatcherPrecompile.sol"; +import "../contracts/protocol/Forwarder.sol"; +import "../contracts/protocol/AsyncPromise.sol"; import "./MockWatcherPrecompileImpl.sol"; contract MigrationTest is SetupTest { diff --git a/test/MockWatcherPrecompileImpl.sol b/test/MockWatcherPrecompileImpl.sol index 2799ec20..1cf94136 100644 --- a/test/MockWatcherPrecompileImpl.sol +++ b/test/MockWatcherPrecompileImpl.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -import "../contracts/watcherPrecompile/WatcherPrecompile.sol"; +import "../contracts/protocol/watcherPrecompile/WatcherPrecompile.sol"; contract MockWatcherPrecompileImpl is WatcherPrecompile { // Mock function to test reinitialization with version 2 diff --git a/test/SetupTest.t.sol b/test/SetupTest.t.sol index 7e5e01f2..193e0ec6 100644 --- a/test/SetupTest.t.sol +++ b/test/SetupTest.t.sol @@ -2,20 +2,20 @@ pragma solidity ^0.8.0; import "forge-std/Test.sol"; -import "../contracts/common/Structs.sol"; -import "../contracts/common/Constants.sol"; -import "../contracts/watcherPrecompile/WatcherPrecompile.sol"; +import "../contracts/protocol/utils/common/Structs.sol"; +import "../contracts/protocol/utils/common/Constants.sol"; +import "../contracts/protocol/watcherPrecompile/WatcherPrecompile.sol"; import "../contracts/interfaces/IForwarder.sol"; -import "../contracts/utils/AccessRoles.sol"; -import {Socket} from "../contracts/socket/Socket.sol"; -import "../contracts/socket/switchboard/FastSwitchboard.sol"; -import "../contracts/socket/SocketBatcher.sol"; -import "../contracts/AddressResolver.sol"; -import {ContractFactoryPlug} from "../contracts/payload-delivery/ContractFactoryPlug.sol"; -import {FeesPlug} from "../contracts/payload-delivery/FeesPlug.sol"; - -import {ETH_ADDRESS} from "../contracts/common/Constants.sol"; -import {ResolvedPromises} from "../contracts/common/Structs.sol"; +import "../contracts/protocol/utils/common/AccessRoles.sol"; +import {Socket} from "../contracts/protocol/socket/Socket.sol"; +import "../contracts/protocol/socket/switchboard/FastSwitchboard.sol"; +import "../contracts/protocol/socket/SocketBatcher.sol"; +import "../contracts/protocol/AddressResolver.sol"; +import {ContractFactoryPlug} from "../contracts/protocol/payload-delivery/ContractFactoryPlug.sol"; +import {FeesPlug} from "../contracts/protocol/payload-delivery/FeesPlug.sol"; + +import {ETH_ADDRESS} from "../contracts/protocol/utils/common/Constants.sol"; +import {ResolvedPromises} from "../contracts/protocol/utils/common/Structs.sol"; import "solady/utils/ERC1967Factory.sol"; diff --git a/test/apps/SuperToken.t.sol b/test/apps/SuperToken.t.sol index 50448a31..56066ed9 100644 --- a/test/apps/SuperToken.t.sol +++ b/test/apps/SuperToken.t.sol @@ -5,7 +5,7 @@ import {SuperTokenDeployer} from "../../contracts/apps/super-token/SuperTokenDep import {SuperTokenAppGateway} from "../../contracts/apps/super-token/SuperTokenAppGateway.sol"; import {SuperToken} from "../../contracts/apps/super-token/SuperToken.sol"; import "../DeliveryHelper.t.sol"; -import {QUERY, FINALIZE, SCHEDULE} from "../../contracts/common/Constants.sol"; +import {QUERY, FINALIZE, SCHEDULE} from "../../contracts/protocol/utils/common/Constants.sol"; /** * @title SuperToken Test diff --git a/test/apps/SuperTokenLockable.t.sol b/test/apps/SuperTokenLockable.t.sol index 12811795..f832a162 100644 --- a/test/apps/SuperTokenLockable.t.sol +++ b/test/apps/SuperTokenLockable.t.sol @@ -4,7 +4,7 @@ pragma solidity ^0.8.0; import {SuperTokenLockableDeployer} from "../../contracts/apps/super-token-lockable/SuperTokenLockableDeployer.sol"; import {SuperTokenLockableAppGateway} from "../../contracts/apps/super-token-lockable/SuperTokenLockableAppGateway.sol"; import {SuperTokenLockable} from "../../contracts/apps/super-token-lockable/SuperTokenLockable.sol"; -import {QUERY, FINALIZE, SCHEDULE} from "../../contracts/common/Constants.sol"; +import {QUERY, FINALIZE, SCHEDULE} from "../../contracts/protocol/utils/common/Constants.sol"; import "../DeliveryHelper.t.sol"; From 4501448e236b25a3c6340ec39a3a50864e31f074 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Tue, 18 Feb 2025 18:02:59 +0400 Subject: [PATCH 039/186] fix: rename --- contracts/Forwarder.sol | 8 +-- contracts/apps/counter/CounterAppGateway.sol | 3 +- .../ParallelCounterAppGateway.sol | 2 +- .../ParallelCounterDeployer.sol | 2 +- .../app-gateway/BatchAsync.sol | 2 +- .../app-gateway/DeliveryHelper.sol | 4 +- .../app-gateway/FeesManager.sol | 4 +- .../app-gateway/QueueAsync.sol | 8 +-- contracts/base/AppDeployerBase.sol | 7 +-- contracts/base/AppGatewayBase.sol | 59 +++++++------------ contracts/common/Structs.sol | 14 ++++- contracts/interfaces/IAppGateway.sol | 6 +- contracts/interfaces/IDeliveryHelper.sol | 4 +- script/mock/FinalizeAndExecution.s.sol | 4 +- test/DeliveryHelper.t.sol | 2 +- 15 files changed, 61 insertions(+), 68 deletions(-) diff --git a/contracts/Forwarder.sol b/contracts/Forwarder.sol index 43e4656e..e0d0d86c 100644 --- a/contracts/Forwarder.sol +++ b/contracts/Forwarder.sol @@ -81,16 +81,16 @@ contract Forwarder is IForwarder, Initializable { ); // Determine if the call is a read or write operation. - bool isReadCall = IAppGateway(msg.sender).isReadCall(); - bool isCallSequential = IAppGateway(msg.sender).isCallSequential(); + Read isReadCall = IAppGateway(msg.sender).isReadCall(); + Parallel isParallelCall = IAppGateway(msg.sender).isParallelCall(); // Queue the call in the auction house. IDeliveryHelper(deliveryHelper).queue( - isCallSequential, + isParallelCall, chainSlug, onChainAddress, latestAsyncPromise, - isReadCall ? CallType.READ : CallType.WRITE, + isReadCall == Read.ON ? CallType.READ : CallType.WRITE, msg.data ); } diff --git a/contracts/apps/counter/CounterAppGateway.sol b/contracts/apps/counter/CounterAppGateway.sol index 0a588432..f0998e58 100644 --- a/contracts/apps/counter/CounterAppGateway.sol +++ b/contracts/apps/counter/CounterAppGateway.sol @@ -32,13 +32,12 @@ contract CounterAppGateway is AppGatewayBase { function readCounters(address[] memory instances_) public async { // the increase function is called on given list of instances // this - _setOverrides(Sequential.TRUE); for (uint256 i = 0; i < instances_.length; i++) { uint32 chainSlug = IForwarder(instances_[i]).getChainSlug(); ICounter(instances_[i]).getCounter(); IPromise(instances_[i]).then(this.setCounterValues.selector, abi.encode(chainSlug)); } - _setOverrides(Sequential.FALSE); + _setOverrides(Parallel.ON); ICounter(instances_[0]).increase(); } diff --git a/contracts/apps/parallel-counter/ParallelCounterAppGateway.sol b/contracts/apps/parallel-counter/ParallelCounterAppGateway.sol index 54dfda68..bdd1d3ea 100644 --- a/contracts/apps/parallel-counter/ParallelCounterAppGateway.sol +++ b/contracts/apps/parallel-counter/ParallelCounterAppGateway.sol @@ -12,7 +12,7 @@ contract ParallelCounterAppGateway is AppGatewayBase { Fees memory fees_ ) AppGatewayBase(addressResolver_, auctionManager_) { addressResolver__.setContractsToGateways(deployerContract_); - _setOverrides(Read.OFF, Sequential.TRUE, 1000000, fees_); + _setOverrides(Read.OFF, Parallel.OFF, 1000000, fees_); } function incrementCounters(address[] memory instances_) public async { diff --git a/contracts/apps/parallel-counter/ParallelCounterDeployer.sol b/contracts/apps/parallel-counter/ParallelCounterDeployer.sol index cb7e7762..e83e27bf 100644 --- a/contracts/apps/parallel-counter/ParallelCounterDeployer.sol +++ b/contracts/apps/parallel-counter/ParallelCounterDeployer.sol @@ -17,7 +17,7 @@ contract ParallelCounterDeployer is AppDeployerBase, OwnableTwoStep { ) AppDeployerBase(addressResolver_, auctionManager_, sbType_) { creationCodeWithArgs[counter1] = abi.encodePacked(type(Counter).creationCode); creationCodeWithArgs[counter2] = abi.encodePacked(type(Counter).creationCode); - _setOverrides(Read.OFF, Sequential.FALSE, 1000000, fees_); + _setOverrides(Read.OFF, Parallel.ON, 1000000, fees_); _claimOwner(msg.sender); } diff --git a/contracts/apps/payload-delivery/app-gateway/BatchAsync.sol b/contracts/apps/payload-delivery/app-gateway/BatchAsync.sol index 4cd0529d..2d432184 100644 --- a/contracts/apps/payload-delivery/app-gateway/BatchAsync.sol +++ b/contracts/apps/payload-delivery/app-gateway/BatchAsync.sol @@ -133,7 +133,7 @@ abstract contract BatchAsync is QueueAsync { while ( readEndIndex < payloadDetails_.length && payloadDetails_[readEndIndex].callType == CallType.READ && - !payloadDetails_[readEndIndex].isSequential + payloadDetails_[readEndIndex].isParallel == Parallel.ON ) { readEndIndex++; } diff --git a/contracts/apps/payload-delivery/app-gateway/DeliveryHelper.sol b/contracts/apps/payload-delivery/app-gateway/DeliveryHelper.sol index a8151dca..6c83d7e4 100644 --- a/contracts/apps/payload-delivery/app-gateway/DeliveryHelper.sol +++ b/contracts/apps/payload-delivery/app-gateway/DeliveryHelper.sol @@ -121,7 +121,7 @@ contract DeliveryHelper is BatchAsync, OwnableTwoStep, Initializable { IPromise(batchPromise).then(this.callback.selector, abi.encode(asyncId_)); // Handle batch processing based on type - if (!payloads[currentIndex].isSequential) { + if (payloads[currentIndex].isParallel == Parallel.ON) { _processParallelCalls(asyncId_, payloadBatch_, payloads, currentIndex, batchPromise); } else { _processSequentialCall( @@ -181,7 +181,7 @@ contract DeliveryHelper is BatchAsync, OwnableTwoStep, Initializable { if (startIndex_ >= payloads_.length) revert InvalidIndex(); uint256 endIndex = startIndex_; - while (endIndex + 1 < payloads_.length && !payloads_[endIndex + 1].isSequential) { + while (endIndex + 1 < payloads_.length && payloads_[endIndex + 1].isParallel == Parallel.ON) { endIndex++; } diff --git a/contracts/apps/payload-delivery/app-gateway/FeesManager.sol b/contracts/apps/payload-delivery/app-gateway/FeesManager.sol index 46037e00..d0aca1e2 100644 --- a/contracts/apps/payload-delivery/app-gateway/FeesManager.sol +++ b/contracts/apps/payload-delivery/app-gateway/FeesManager.sol @@ -4,7 +4,7 @@ pragma solidity ^0.8.0; import {OwnableTwoStep} from "../../../utils/OwnableTwoStep.sol"; import {SignatureVerifier} from "../../../socket/utils/SignatureVerifier.sol"; import {AddressResolverUtil} from "../../../utils/AddressResolverUtil.sol"; -import {Bid, Fees, PayloadDetails, CallType, FinalizeParams, PayloadBatch} from "../../../common/Structs.sol"; +import {Bid, Fees, PayloadDetails, CallType, FinalizeParams, PayloadBatch, Parallel} from "../../../common/Structs.sol"; import {IDeliveryHelper} from "../../../interfaces/IDeliveryHelper.sol"; import {FORWARD_CALL, DISTRIBUTE_FEE, DEPLOY, WITHDRAW} from "../../../common/Constants.sol"; import {IFeesPlug} from "../../../interfaces/IFeesPlug.sol"; @@ -299,7 +299,7 @@ contract FeesManager is IFeesManager, AddressResolverUtil, OwnableTwoStep, Initi callType: callType_, executionGasLimit: 1000000, next: new address[](2), - isSequential: true + isParallel: Parallel.OFF }); } diff --git a/contracts/apps/payload-delivery/app-gateway/QueueAsync.sol b/contracts/apps/payload-delivery/app-gateway/QueueAsync.sol index 9bfa2890..0b3d222c 100644 --- a/contracts/apps/payload-delivery/app-gateway/QueueAsync.sol +++ b/contracts/apps/payload-delivery/app-gateway/QueueAsync.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.21; import {AddressResolverUtil} from "../../../utils/AddressResolverUtil.sol"; -import {CallParams, Fees, PayloadDetails, CallType, Bid, PayloadBatch} from "../../../common/Structs.sol"; +import {CallParams, Fees, PayloadDetails, CallType, Bid, PayloadBatch, Parallel} from "../../../common/Structs.sol"; import {NotAuctionManager, InvalidPromise, InvalidIndex} from "../../../common/Errors.sol"; import {AsyncPromise} from "../../../AsyncPromise.sol"; import {IPromise} from "../../../interfaces/IPromise.sol"; @@ -66,7 +66,7 @@ abstract contract QueueAsync is AddressResolverUtil, IDeliveryHelper { /// @param callType_ The call type /// @param payload_ The payload function queue( - bool isSequential_, + Parallel isParallel_, uint32 chainSlug_, address target_, address asyncPromise_, @@ -82,7 +82,7 @@ abstract contract QueueAsync is AddressResolverUtil, IDeliveryHelper { target: target_, payload: payload_, gasLimit: 10000000, - isSequential: isSequential_ + isParallel: isParallel_ }) ); } @@ -148,7 +148,7 @@ abstract contract QueueAsync is AddressResolverUtil, IDeliveryHelper { callType: params_.callType, executionGasLimit: params_.gasLimit == 0 ? 1_000_000 : params_.gasLimit, next: next, - isSequential: params_.isSequential + isParallel: params_.isParallel }); } diff --git a/contracts/base/AppDeployerBase.sol b/contracts/base/AppDeployerBase.sol index ce88c123..14753fd8 100644 --- a/contracts/base/AppDeployerBase.sol +++ b/contracts/base/AppDeployerBase.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.21; import {DeployParams, Fees, CallType, PayloadBatch} from "../common/Structs.sol"; -import {AppGatewayBase} from "./AppGatewayBase.sol"; +import "./AppGatewayBase.sol"; import {IForwarder} from "../interfaces/IForwarder.sol"; import {IPromise} from "../interfaces/IPromise.sol"; import {IAppDeployer} from "../interfaces/IAppDeployer.sol"; @@ -32,7 +32,7 @@ abstract contract AppDeployerBase is AppGatewayBase, IAppDeployer { onCompleteData = abi.encode(chainSlug_); IDeliveryHelper(deliveryHelper()).queue( - isCallSequential, + isParallelCall, chainSlug_, address(0), asyncPromise, @@ -68,8 +68,7 @@ abstract contract AppDeployerBase is AppGatewayBase, IAppDeployer { return address(0); } - onChainAddress = IForwarder(forwarderAddresses[contractId_][chainSlug_]) - .getOnChainAddress(); + onChainAddress = IForwarder(forwarderAddresses[contractId_][chainSlug_]).getOnChainAddress(); } /// @notice Callback in pd promise to be called after all contracts are deployed diff --git a/contracts/base/AppGatewayBase.sol b/contracts/base/AppGatewayBase.sol index e276a2e1..6091f765 100644 --- a/contracts/base/AppGatewayBase.sol +++ b/contracts/base/AppGatewayBase.sol @@ -5,31 +5,21 @@ import "../utils/AddressResolverUtil.sol"; import "../interfaces/IDeliveryHelper.sol"; import "../interfaces/IAppGateway.sol"; import "../interfaces/IPromise.sol"; -import {Fees} from "../common/Structs.sol"; +import {Fees, Read, Parallel} from "../common/Structs.sol"; import {FeesPlugin} from "../utils/FeesPlugin.sol"; import {InvalidPromise, FeesNotSet} from "../common/Errors.sol"; /// @title AppGatewayBase /// @notice Abstract contract for the app gateway abstract contract AppGatewayBase is AddressResolverUtil, IAppGateway, FeesPlugin { - bool public override isReadCall; - bool public override isCallSequential; + Read public override isReadCall; + Parallel public override isParallelCall; uint256 public override gasLimit; address public auctionManager; bytes public onCompleteData; bytes32 public sbType; - enum Read { - ON, - OFF - } - - enum Sequential { - TRUE, - FALSE - } - mapping(address => bool) public isValidPromise; /// @notice Modifier to treat functions async @@ -56,7 +46,6 @@ abstract contract AppGatewayBase is AddressResolverUtil, IAppGateway, FeesPlugin constructor(address addressResolver_, address auctionManager_) { _setAddressResolver(addressResolver_); auctionManager = auctionManager_; - isCallSequential = true; } /// @notice Creates a contract ID @@ -94,51 +83,47 @@ abstract contract AppGatewayBase is AddressResolverUtil, IAppGateway, FeesPlugin /// @param isReadCall_ The read call flag /// @param fees_ The fees configuration /// @param gasLimit_ The gas limit - /// @param isCallSequential_ The sequential call flag + /// @param isParallelCall_ The sequential call flag function _setOverrides( Read isReadCall_, - Sequential isCallSequential_, + Parallel isParallelCall_, uint256 gasLimit_, Fees memory fees_ ) internal { - isReadCall = isReadCall_ == Read.ON; - isCallSequential = isCallSequential_ == Sequential.TRUE; + isReadCall = isReadCall_; + isParallelCall = isParallelCall_; gasLimit = gasLimit_; fees = fees_; } /// @notice Sets isReadCall, fees and gasLimit overrides /// @param isReadCall_ The read call flag - /// @param isCallSequential_ The sequential call flag + /// @param isParallelCall_ The sequential call flag /// @param gasLimit_ The gas limit - function _setOverrides( - Read isReadCall_, - Sequential isCallSequential_, - uint256 gasLimit_ - ) internal { - isReadCall = isReadCall_ == Read.ON; - isCallSequential = isCallSequential_ == Sequential.TRUE; + function _setOverrides(Read isReadCall_, Parallel isParallelCall_, uint256 gasLimit_) internal { + isReadCall = isReadCall_; + isParallelCall = isParallelCall_; gasLimit = gasLimit_; } - /// @notice Sets isReadCall and isCallSequential overrides + /// @notice Sets isReadCall and isParallelCall overrides /// @param isReadCall_ The read call flag - /// @param isCallSequential_ The sequential call flag - function _setOverrides(Read isReadCall_, Sequential isCallSequential_) internal { - isReadCall = isReadCall_ == Read.ON; - isCallSequential = isCallSequential_ == Sequential.TRUE; + /// @param isParallelCall_ The sequential call flag + function _setOverrides(Read isReadCall_, Parallel isParallelCall_) internal { + isReadCall = isReadCall_; + isParallelCall = isParallelCall_; } - /// @notice Sets isReadCall and gasLimit overrides - /// @param isCallSequential_ The sequential call flag - function _setOverrides(Sequential isCallSequential_) internal { - isCallSequential = isCallSequential_ == Sequential.TRUE; + /// @notice Sets isParallelCall overrides + /// @param isParallelCall_ The sequential call flag + function _setOverrides(Parallel isParallelCall_) internal { + isParallelCall = isParallelCall_; } - /// @notice Sets isReadCall and gasLimit overrides + /// @notice Sets isReadCall overrides /// @param isReadCall_ The read call flag function _setOverrides(Read isReadCall_) internal { - isReadCall = isReadCall_ == Read.ON; + isReadCall = isReadCall_; } /// @notice Sets gasLimit overrides diff --git a/contracts/common/Structs.sol b/contracts/common/Structs.sol index f32318b6..cfb05a6b 100644 --- a/contracts/common/Structs.sol +++ b/contracts/common/Structs.sol @@ -8,6 +8,16 @@ enum CallType { WITHDRAW } +enum Read { + OFF, + ON +} + +enum Parallel { + OFF, + ON +} + struct AppGatewayConfig { address plug; address appGateway; @@ -47,7 +57,7 @@ struct CallParams { address target; uint32 chainSlug; CallType callType; - bool isSequential; + Parallel isParallel; uint256 gasLimit; bytes payload; } @@ -104,7 +114,7 @@ struct PayloadDetails { address appGateway; address target; uint32 chainSlug; - bool isSequential; + Parallel isParallel; CallType callType; uint256 executionGasLimit; bytes payload; diff --git a/contracts/interfaces/IAppGateway.sol b/contracts/interfaces/IAppGateway.sol index 8cf706e2..ef83f275 100644 --- a/contracts/interfaces/IAppGateway.sol +++ b/contracts/interfaces/IAppGateway.sol @@ -1,12 +1,12 @@ // SPDX-License-Identifier: Unlicense pragma solidity ^0.8.21; -import {PayloadBatch} from "../common/Structs.sol"; +import {PayloadBatch, Read, Parallel} from "../common/Structs.sol"; interface IAppGateway { - function isReadCall() external view returns (bool); + function isReadCall() external view returns (Read); - function isCallSequential() external view returns (bool); + function isParallelCall() external view returns (Parallel); function gasLimit() external view returns (uint256); diff --git a/contracts/interfaces/IDeliveryHelper.sol b/contracts/interfaces/IDeliveryHelper.sol index 15830cd3..2d9c8c29 100644 --- a/contracts/interfaces/IDeliveryHelper.sol +++ b/contracts/interfaces/IDeliveryHelper.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.3; -import {PayloadDetails, Bid, Fees, DeployParams, CallType, PayloadBatch} from "../common/Structs.sol"; +import {PayloadDetails, Bid, Fees, DeployParams, CallType, PayloadBatch, Parallel} from "../common/Structs.sol"; interface IDeliveryHelper { event BidPlaced( @@ -20,7 +20,7 @@ interface IDeliveryHelper { function clearQueue() external; function queue( - bool isSequential_, + Parallel isParallel_, uint32 chainSlug_, address target_, address asyncPromise_, diff --git a/script/mock/FinalizeAndExecution.s.sol b/script/mock/FinalizeAndExecution.s.sol index 042daadc..e77210d0 100644 --- a/script/mock/FinalizeAndExecution.s.sol +++ b/script/mock/FinalizeAndExecution.s.sol @@ -5,7 +5,7 @@ import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/console.sol"; import {MockWatcherPrecompile} from "../../contracts/mock/MockWatcherPrecompile.sol"; import {MockSocket} from "../../contracts/mock/MockSocket.sol"; -import {CallType, FinalizeParams, PayloadDetails} from "../../contracts/common/Structs.sol"; +import {CallType, FinalizeParams, PayloadDetails, Parallel} from "../../contracts/common/Structs.sol"; contract InboxTest is Script { function run() external { string memory arbRpc = vm.envString("ARBITRUM_SEPOLIA_RPC"); @@ -29,7 +29,7 @@ contract InboxTest is Script { callType: CallType.WRITE, executionGasLimit: 1000000, next: new address[](0), - isSequential: true + isParallel: Parallel.OFF }); FinalizeParams memory finalizeParams = FinalizeParams({ payloadDetails: payloadDetails, diff --git a/test/DeliveryHelper.t.sol b/test/DeliveryHelper.t.sol index e3ba294b..22b9cba2 100644 --- a/test/DeliveryHelper.t.sol +++ b/test/DeliveryHelper.t.sol @@ -456,7 +456,7 @@ contract DeliveryHelperTest is SetupTest { callType: callType_, executionGasLimit: executionGasLimit_, next: next_, - isSequential: false + isParallel: Parallel.ON }); } From 3104d25a3fb216805ea6be5d62f980fc01a84ecd Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Tue, 18 Feb 2025 18:11:22 +0400 Subject: [PATCH 040/186] merge master --- .../apps/payload-delivery/app-gateway/DeliveryHelper.sol | 4 +++- contracts/base/AppDeployerBase.sol | 3 ++- lib/forge-std | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/contracts/apps/payload-delivery/app-gateway/DeliveryHelper.sol b/contracts/apps/payload-delivery/app-gateway/DeliveryHelper.sol index 6c83d7e4..c6c1c5b2 100644 --- a/contracts/apps/payload-delivery/app-gateway/DeliveryHelper.sol +++ b/contracts/apps/payload-delivery/app-gateway/DeliveryHelper.sol @@ -181,7 +181,9 @@ contract DeliveryHelper is BatchAsync, OwnableTwoStep, Initializable { if (startIndex_ >= payloads_.length) revert InvalidIndex(); uint256 endIndex = startIndex_; - while (endIndex + 1 < payloads_.length && payloads_[endIndex + 1].isParallel == Parallel.ON) { + while ( + endIndex + 1 < payloads_.length && payloads_[endIndex + 1].isParallel == Parallel.ON + ) { endIndex++; } diff --git a/contracts/base/AppDeployerBase.sol b/contracts/base/AppDeployerBase.sol index 14753fd8..9c85bebf 100644 --- a/contracts/base/AppDeployerBase.sol +++ b/contracts/base/AppDeployerBase.sol @@ -68,7 +68,8 @@ abstract contract AppDeployerBase is AppGatewayBase, IAppDeployer { return address(0); } - onChainAddress = IForwarder(forwarderAddresses[contractId_][chainSlug_]).getOnChainAddress(); + onChainAddress = IForwarder(forwarderAddresses[contractId_][chainSlug_]) + .getOnChainAddress(); } /// @notice Callback in pd promise to be called after all contracts are deployed diff --git a/lib/forge-std b/lib/forge-std index 1eea5bae..bf909b22 160000 --- a/lib/forge-std +++ b/lib/forge-std @@ -1 +1 @@ -Subproject commit 1eea5bae12ae557d589f9f0f0edae2faa47cb262 +Subproject commit bf909b22fa55e244796dfa920c9639fdffa1c545 From e59253a4756a6ccab88fd314028596906b5daa97 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Tue, 18 Feb 2025 18:15:15 +0400 Subject: [PATCH 041/186] Merge branch 'staging' into overrides --- contracts/interfaces/IFeesManager.sol | 2 +- lib/solady | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/interfaces/IFeesManager.sol b/contracts/interfaces/IFeesManager.sol index 4e135fec..e686c2b7 100644 --- a/contracts/interfaces/IFeesManager.sol +++ b/contracts/interfaces/IFeesManager.sol @@ -4,7 +4,7 @@ pragma solidity ^0.8.3; import {Fees, Bid, PayloadDetails} from "../common/Structs.sol"; interface IFeesManager { - function blockFees(address appGateway_, Fees memory fees_, bytes32 asyncId_) external; + function blockFees(address appGateway_, Fees memory fees_, Bid memory winningBid_, bytes32 asyncId_) external; function updateTransmitterFees( Bid memory winningBid_, diff --git a/lib/solady b/lib/solady index 6c2d0da6..8583a6e3 160000 --- a/lib/solady +++ b/lib/solady @@ -1 +1 @@ -Subproject commit 6c2d0da6397e3c016aabc3f298de1b92c6ce7405 +Subproject commit 8583a6e386b897f3db142a541f86d5953eccd835 From 3d8d939fddf3b3f4afee14807e8007440ee1a31e Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Mon, 17 Feb 2025 20:36:27 +0400 Subject: [PATCH 042/186] feat: enum instead of bools in override for readability --- contracts/apps/counter/CounterAppGateway.sol | 4 +- .../ParallelCounterAppGateway.sol | 2 +- .../ParallelCounterDeployer.sol | 2 +- .../SuperTokenLockableAppGateway.sol | 4 +- contracts/base/AppGatewayBase.sol | 44 ++++++++++++++----- 5 files changed, 38 insertions(+), 18 deletions(-) diff --git a/contracts/apps/counter/CounterAppGateway.sol b/contracts/apps/counter/CounterAppGateway.sol index 68d98b25..0a588432 100644 --- a/contracts/apps/counter/CounterAppGateway.sol +++ b/contracts/apps/counter/CounterAppGateway.sol @@ -32,13 +32,13 @@ contract CounterAppGateway is AppGatewayBase { function readCounters(address[] memory instances_) public async { // the increase function is called on given list of instances // this - _setOverrides(false, true); + _setOverrides(Sequential.TRUE); for (uint256 i = 0; i < instances_.length; i++) { uint32 chainSlug = IForwarder(instances_[i]).getChainSlug(); ICounter(instances_[i]).getCounter(); IPromise(instances_[i]).then(this.setCounterValues.selector, abi.encode(chainSlug)); } - _setOverrides(false, false); + _setOverrides(Sequential.FALSE); ICounter(instances_[0]).increase(); } diff --git a/contracts/apps/parallel-counter/ParallelCounterAppGateway.sol b/contracts/apps/parallel-counter/ParallelCounterAppGateway.sol index 6fd2d703..54dfda68 100644 --- a/contracts/apps/parallel-counter/ParallelCounterAppGateway.sol +++ b/contracts/apps/parallel-counter/ParallelCounterAppGateway.sol @@ -12,7 +12,7 @@ contract ParallelCounterAppGateway is AppGatewayBase { Fees memory fees_ ) AppGatewayBase(addressResolver_, auctionManager_) { addressResolver__.setContractsToGateways(deployerContract_); - _setOverrides(false, true, 1000000, fees_); + _setOverrides(Read.OFF, Sequential.TRUE, 1000000, fees_); } function incrementCounters(address[] memory instances_) public async { diff --git a/contracts/apps/parallel-counter/ParallelCounterDeployer.sol b/contracts/apps/parallel-counter/ParallelCounterDeployer.sol index 9321a1a9..344495e2 100644 --- a/contracts/apps/parallel-counter/ParallelCounterDeployer.sol +++ b/contracts/apps/parallel-counter/ParallelCounterDeployer.sol @@ -17,7 +17,7 @@ contract ParallelCounterDeployer is AppDeployerBase, Ownable { ) AppDeployerBase(addressResolver_, auctionManager_, sbType_) { creationCodeWithArgs[counter1] = abi.encodePacked(type(Counter).creationCode); creationCodeWithArgs[counter2] = abi.encodePacked(type(Counter).creationCode); - _setOverrides(false, false, 1000000, fees_); + _setOverrides(Read.OFF, Sequential.FALSE, 1000000, fees_); _initializeOwner(msg.sender); } diff --git a/contracts/apps/super-token-lockable/SuperTokenLockableAppGateway.sol b/contracts/apps/super-token-lockable/SuperTokenLockableAppGateway.sol index 2e42ed5a..92a96e06 100644 --- a/contracts/apps/super-token-lockable/SuperTokenLockableAppGateway.sol +++ b/contracts/apps/super-token-lockable/SuperTokenLockableAppGateway.sol @@ -49,12 +49,12 @@ contract SuperTokenLockableAppGateway is AppGatewayBase, Ownable { asyncId_ = _getCurrentAsyncId(); ISuperToken(order.srcToken).lockTokens(order.user, order.srcAmount); - _setOverrides(true); + _setOverrides(Read.ON); // goes to forwarder and deploys promise and stores it ISuperToken(order.srcToken).balanceOf(order.user); IPromise(order.srcToken).then(this.checkBalance.selector, abi.encode(order, asyncId_)); - _setOverrides(false); + _setOverrides(Read.OFF); ISuperToken(order.dstToken).mint(order.user, order.srcAmount); ISuperToken(order.srcToken).burn(order.user, order.srcAmount); diff --git a/contracts/base/AppGatewayBase.sol b/contracts/base/AppGatewayBase.sol index d88a7ff8..e276a2e1 100644 --- a/contracts/base/AppGatewayBase.sol +++ b/contracts/base/AppGatewayBase.sol @@ -20,6 +20,16 @@ abstract contract AppGatewayBase is AddressResolverUtil, IAppGateway, FeesPlugin bytes public onCompleteData; bytes32 public sbType; + enum Read { + ON, + OFF + } + + enum Sequential { + TRUE, + FALSE + } + mapping(address => bool) public isValidPromise; /// @notice Modifier to treat functions async @@ -86,13 +96,13 @@ abstract contract AppGatewayBase is AddressResolverUtil, IAppGateway, FeesPlugin /// @param gasLimit_ The gas limit /// @param isCallSequential_ The sequential call flag function _setOverrides( - bool isReadCall_, - bool isCallSequential_, + Read isReadCall_, + Sequential isCallSequential_, uint256 gasLimit_, Fees memory fees_ ) internal { - isReadCall = isReadCall_; - isCallSequential = isCallSequential_; + isReadCall = isReadCall_ == Read.ON; + isCallSequential = isCallSequential_ == Sequential.TRUE; gasLimit = gasLimit_; fees = fees_; } @@ -101,24 +111,34 @@ abstract contract AppGatewayBase is AddressResolverUtil, IAppGateway, FeesPlugin /// @param isReadCall_ The read call flag /// @param isCallSequential_ The sequential call flag /// @param gasLimit_ The gas limit - function _setOverrides(bool isReadCall_, bool isCallSequential_, uint256 gasLimit_) internal { - isReadCall = isReadCall_; - isCallSequential = isCallSequential_; + function _setOverrides( + Read isReadCall_, + Sequential isCallSequential_, + uint256 gasLimit_ + ) internal { + isReadCall = isReadCall_ == Read.ON; + isCallSequential = isCallSequential_ == Sequential.TRUE; gasLimit = gasLimit_; } /// @notice Sets isReadCall and isCallSequential overrides /// @param isReadCall_ The read call flag /// @param isCallSequential_ The sequential call flag - function _setOverrides(bool isReadCall_, bool isCallSequential_) internal { - isReadCall = isReadCall_; - isCallSequential = isCallSequential_; + function _setOverrides(Read isReadCall_, Sequential isCallSequential_) internal { + isReadCall = isReadCall_ == Read.ON; + isCallSequential = isCallSequential_ == Sequential.TRUE; + } + + /// @notice Sets isReadCall and gasLimit overrides + /// @param isCallSequential_ The sequential call flag + function _setOverrides(Sequential isCallSequential_) internal { + isCallSequential = isCallSequential_ == Sequential.TRUE; } /// @notice Sets isReadCall and gasLimit overrides /// @param isReadCall_ The read call flag - function _setOverrides(bool isReadCall_) internal { - isReadCall = isReadCall_; + function _setOverrides(Read isReadCall_) internal { + isReadCall = isReadCall_ == Read.ON; } /// @notice Sets gasLimit overrides From 380b5f0e662bc29d4968a5b0e1ffae2c642c7145 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Tue, 18 Feb 2025 18:02:59 +0400 Subject: [PATCH 043/186] fix: rename --- contracts/Forwarder.sol | 8 +-- contracts/apps/counter/CounterAppGateway.sol | 3 +- .../ParallelCounterAppGateway.sol | 2 +- contracts/base/AppDeployerBase.sol | 7 +-- contracts/base/AppGatewayBase.sol | 59 +++++++------------ contracts/common/Structs.sol | 14 ++++- contracts/interfaces/IAppGateway.sol | 6 +- contracts/interfaces/IDeliveryHelper.sol | 4 +- .../app-gateway/BatchAsync.sol | 2 +- .../app-gateway/DeliveryHelper.sol | 4 +- .../app-gateway/FeesManager.sol | 2 +- .../app-gateway/QueueAsync.sol | 6 +- script/mock/FinalizeAndExecution.s.sol | 4 +- test/DeliveryHelper.t.sol | 2 +- 14 files changed, 58 insertions(+), 65 deletions(-) diff --git a/contracts/Forwarder.sol b/contracts/Forwarder.sol index 43e4656e..e0d0d86c 100644 --- a/contracts/Forwarder.sol +++ b/contracts/Forwarder.sol @@ -81,16 +81,16 @@ contract Forwarder is IForwarder, Initializable { ); // Determine if the call is a read or write operation. - bool isReadCall = IAppGateway(msg.sender).isReadCall(); - bool isCallSequential = IAppGateway(msg.sender).isCallSequential(); + Read isReadCall = IAppGateway(msg.sender).isReadCall(); + Parallel isParallelCall = IAppGateway(msg.sender).isParallelCall(); // Queue the call in the auction house. IDeliveryHelper(deliveryHelper).queue( - isCallSequential, + isParallelCall, chainSlug, onChainAddress, latestAsyncPromise, - isReadCall ? CallType.READ : CallType.WRITE, + isReadCall == Read.ON ? CallType.READ : CallType.WRITE, msg.data ); } diff --git a/contracts/apps/counter/CounterAppGateway.sol b/contracts/apps/counter/CounterAppGateway.sol index 0a588432..f0998e58 100644 --- a/contracts/apps/counter/CounterAppGateway.sol +++ b/contracts/apps/counter/CounterAppGateway.sol @@ -32,13 +32,12 @@ contract CounterAppGateway is AppGatewayBase { function readCounters(address[] memory instances_) public async { // the increase function is called on given list of instances // this - _setOverrides(Sequential.TRUE); for (uint256 i = 0; i < instances_.length; i++) { uint32 chainSlug = IForwarder(instances_[i]).getChainSlug(); ICounter(instances_[i]).getCounter(); IPromise(instances_[i]).then(this.setCounterValues.selector, abi.encode(chainSlug)); } - _setOverrides(Sequential.FALSE); + _setOverrides(Parallel.ON); ICounter(instances_[0]).increase(); } diff --git a/contracts/apps/parallel-counter/ParallelCounterAppGateway.sol b/contracts/apps/parallel-counter/ParallelCounterAppGateway.sol index 54dfda68..bdd1d3ea 100644 --- a/contracts/apps/parallel-counter/ParallelCounterAppGateway.sol +++ b/contracts/apps/parallel-counter/ParallelCounterAppGateway.sol @@ -12,7 +12,7 @@ contract ParallelCounterAppGateway is AppGatewayBase { Fees memory fees_ ) AppGatewayBase(addressResolver_, auctionManager_) { addressResolver__.setContractsToGateways(deployerContract_); - _setOverrides(Read.OFF, Sequential.TRUE, 1000000, fees_); + _setOverrides(Read.OFF, Parallel.OFF, 1000000, fees_); } function incrementCounters(address[] memory instances_) public async { diff --git a/contracts/base/AppDeployerBase.sol b/contracts/base/AppDeployerBase.sol index ce88c123..14753fd8 100644 --- a/contracts/base/AppDeployerBase.sol +++ b/contracts/base/AppDeployerBase.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.21; import {DeployParams, Fees, CallType, PayloadBatch} from "../common/Structs.sol"; -import {AppGatewayBase} from "./AppGatewayBase.sol"; +import "./AppGatewayBase.sol"; import {IForwarder} from "../interfaces/IForwarder.sol"; import {IPromise} from "../interfaces/IPromise.sol"; import {IAppDeployer} from "../interfaces/IAppDeployer.sol"; @@ -32,7 +32,7 @@ abstract contract AppDeployerBase is AppGatewayBase, IAppDeployer { onCompleteData = abi.encode(chainSlug_); IDeliveryHelper(deliveryHelper()).queue( - isCallSequential, + isParallelCall, chainSlug_, address(0), asyncPromise, @@ -68,8 +68,7 @@ abstract contract AppDeployerBase is AppGatewayBase, IAppDeployer { return address(0); } - onChainAddress = IForwarder(forwarderAddresses[contractId_][chainSlug_]) - .getOnChainAddress(); + onChainAddress = IForwarder(forwarderAddresses[contractId_][chainSlug_]).getOnChainAddress(); } /// @notice Callback in pd promise to be called after all contracts are deployed diff --git a/contracts/base/AppGatewayBase.sol b/contracts/base/AppGatewayBase.sol index e276a2e1..6091f765 100644 --- a/contracts/base/AppGatewayBase.sol +++ b/contracts/base/AppGatewayBase.sol @@ -5,31 +5,21 @@ import "../utils/AddressResolverUtil.sol"; import "../interfaces/IDeliveryHelper.sol"; import "../interfaces/IAppGateway.sol"; import "../interfaces/IPromise.sol"; -import {Fees} from "../common/Structs.sol"; +import {Fees, Read, Parallel} from "../common/Structs.sol"; import {FeesPlugin} from "../utils/FeesPlugin.sol"; import {InvalidPromise, FeesNotSet} from "../common/Errors.sol"; /// @title AppGatewayBase /// @notice Abstract contract for the app gateway abstract contract AppGatewayBase is AddressResolverUtil, IAppGateway, FeesPlugin { - bool public override isReadCall; - bool public override isCallSequential; + Read public override isReadCall; + Parallel public override isParallelCall; uint256 public override gasLimit; address public auctionManager; bytes public onCompleteData; bytes32 public sbType; - enum Read { - ON, - OFF - } - - enum Sequential { - TRUE, - FALSE - } - mapping(address => bool) public isValidPromise; /// @notice Modifier to treat functions async @@ -56,7 +46,6 @@ abstract contract AppGatewayBase is AddressResolverUtil, IAppGateway, FeesPlugin constructor(address addressResolver_, address auctionManager_) { _setAddressResolver(addressResolver_); auctionManager = auctionManager_; - isCallSequential = true; } /// @notice Creates a contract ID @@ -94,51 +83,47 @@ abstract contract AppGatewayBase is AddressResolverUtil, IAppGateway, FeesPlugin /// @param isReadCall_ The read call flag /// @param fees_ The fees configuration /// @param gasLimit_ The gas limit - /// @param isCallSequential_ The sequential call flag + /// @param isParallelCall_ The sequential call flag function _setOverrides( Read isReadCall_, - Sequential isCallSequential_, + Parallel isParallelCall_, uint256 gasLimit_, Fees memory fees_ ) internal { - isReadCall = isReadCall_ == Read.ON; - isCallSequential = isCallSequential_ == Sequential.TRUE; + isReadCall = isReadCall_; + isParallelCall = isParallelCall_; gasLimit = gasLimit_; fees = fees_; } /// @notice Sets isReadCall, fees and gasLimit overrides /// @param isReadCall_ The read call flag - /// @param isCallSequential_ The sequential call flag + /// @param isParallelCall_ The sequential call flag /// @param gasLimit_ The gas limit - function _setOverrides( - Read isReadCall_, - Sequential isCallSequential_, - uint256 gasLimit_ - ) internal { - isReadCall = isReadCall_ == Read.ON; - isCallSequential = isCallSequential_ == Sequential.TRUE; + function _setOverrides(Read isReadCall_, Parallel isParallelCall_, uint256 gasLimit_) internal { + isReadCall = isReadCall_; + isParallelCall = isParallelCall_; gasLimit = gasLimit_; } - /// @notice Sets isReadCall and isCallSequential overrides + /// @notice Sets isReadCall and isParallelCall overrides /// @param isReadCall_ The read call flag - /// @param isCallSequential_ The sequential call flag - function _setOverrides(Read isReadCall_, Sequential isCallSequential_) internal { - isReadCall = isReadCall_ == Read.ON; - isCallSequential = isCallSequential_ == Sequential.TRUE; + /// @param isParallelCall_ The sequential call flag + function _setOverrides(Read isReadCall_, Parallel isParallelCall_) internal { + isReadCall = isReadCall_; + isParallelCall = isParallelCall_; } - /// @notice Sets isReadCall and gasLimit overrides - /// @param isCallSequential_ The sequential call flag - function _setOverrides(Sequential isCallSequential_) internal { - isCallSequential = isCallSequential_ == Sequential.TRUE; + /// @notice Sets isParallelCall overrides + /// @param isParallelCall_ The sequential call flag + function _setOverrides(Parallel isParallelCall_) internal { + isParallelCall = isParallelCall_; } - /// @notice Sets isReadCall and gasLimit overrides + /// @notice Sets isReadCall overrides /// @param isReadCall_ The read call flag function _setOverrides(Read isReadCall_) internal { - isReadCall = isReadCall_ == Read.ON; + isReadCall = isReadCall_; } /// @notice Sets gasLimit overrides diff --git a/contracts/common/Structs.sol b/contracts/common/Structs.sol index f32318b6..cfb05a6b 100644 --- a/contracts/common/Structs.sol +++ b/contracts/common/Structs.sol @@ -8,6 +8,16 @@ enum CallType { WITHDRAW } +enum Read { + OFF, + ON +} + +enum Parallel { + OFF, + ON +} + struct AppGatewayConfig { address plug; address appGateway; @@ -47,7 +57,7 @@ struct CallParams { address target; uint32 chainSlug; CallType callType; - bool isSequential; + Parallel isParallel; uint256 gasLimit; bytes payload; } @@ -104,7 +114,7 @@ struct PayloadDetails { address appGateway; address target; uint32 chainSlug; - bool isSequential; + Parallel isParallel; CallType callType; uint256 executionGasLimit; bytes payload; diff --git a/contracts/interfaces/IAppGateway.sol b/contracts/interfaces/IAppGateway.sol index 8cf706e2..ef83f275 100644 --- a/contracts/interfaces/IAppGateway.sol +++ b/contracts/interfaces/IAppGateway.sol @@ -1,12 +1,12 @@ // SPDX-License-Identifier: Unlicense pragma solidity ^0.8.21; -import {PayloadBatch} from "../common/Structs.sol"; +import {PayloadBatch, Read, Parallel} from "../common/Structs.sol"; interface IAppGateway { - function isReadCall() external view returns (bool); + function isReadCall() external view returns (Read); - function isCallSequential() external view returns (bool); + function isParallelCall() external view returns (Parallel); function gasLimit() external view returns (uint256); diff --git a/contracts/interfaces/IDeliveryHelper.sol b/contracts/interfaces/IDeliveryHelper.sol index 15830cd3..2d9c8c29 100644 --- a/contracts/interfaces/IDeliveryHelper.sol +++ b/contracts/interfaces/IDeliveryHelper.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.3; -import {PayloadDetails, Bid, Fees, DeployParams, CallType, PayloadBatch} from "../common/Structs.sol"; +import {PayloadDetails, Bid, Fees, DeployParams, CallType, PayloadBatch, Parallel} from "../common/Structs.sol"; interface IDeliveryHelper { event BidPlaced( @@ -20,7 +20,7 @@ interface IDeliveryHelper { function clearQueue() external; function queue( - bool isSequential_, + Parallel isParallel_, uint32 chainSlug_, address target_, address asyncPromise_, diff --git a/contracts/payload-delivery/app-gateway/BatchAsync.sol b/contracts/payload-delivery/app-gateway/BatchAsync.sol index 4f0dff6d..6470c0f4 100644 --- a/contracts/payload-delivery/app-gateway/BatchAsync.sol +++ b/contracts/payload-delivery/app-gateway/BatchAsync.sol @@ -133,7 +133,7 @@ abstract contract BatchAsync is QueueAsync { while ( readEndIndex < payloadDetails_.length && payloadDetails_[readEndIndex].callType == CallType.READ && - !payloadDetails_[readEndIndex].isSequential + payloadDetails_[readEndIndex].isParallel == Parallel.ON ) { readEndIndex++; } diff --git a/contracts/payload-delivery/app-gateway/DeliveryHelper.sol b/contracts/payload-delivery/app-gateway/DeliveryHelper.sol index 8b10dd4d..7b19a9fa 100644 --- a/contracts/payload-delivery/app-gateway/DeliveryHelper.sol +++ b/contracts/payload-delivery/app-gateway/DeliveryHelper.sol @@ -120,7 +120,7 @@ contract DeliveryHelper is BatchAsync, Ownable, Initializable { IPromise(batchPromise).then(this.callback.selector, abi.encode(asyncId_)); // Handle batch processing based on type - if (!payloads[currentIndex].isSequential) { + if (payloads[currentIndex].isParallel == Parallel.ON) { _processParallelCalls(asyncId_, payloadBatch_, payloads, currentIndex, batchPromise); } else { _processSequentialCall( @@ -180,7 +180,7 @@ contract DeliveryHelper is BatchAsync, Ownable, Initializable { if (startIndex_ >= payloads_.length) revert InvalidIndex(); uint256 endIndex = startIndex_; - while (endIndex + 1 < payloads_.length && !payloads_[endIndex + 1].isSequential) { + while (endIndex + 1 < payloads_.length && payloads_[endIndex + 1].isParallel == Parallel.ON) { endIndex++; } diff --git a/contracts/payload-delivery/app-gateway/FeesManager.sol b/contracts/payload-delivery/app-gateway/FeesManager.sol index e1343cf2..25d15907 100644 --- a/contracts/payload-delivery/app-gateway/FeesManager.sol +++ b/contracts/payload-delivery/app-gateway/FeesManager.sol @@ -294,7 +294,7 @@ contract FeesManager is IFeesManager, AddressResolverUtil, Ownable, Initializabl callType: callType_, executionGasLimit: 1000000, next: new address[](2), - isSequential: true + isParallel: Parallel.OFF }); } diff --git a/contracts/payload-delivery/app-gateway/QueueAsync.sol b/contracts/payload-delivery/app-gateway/QueueAsync.sol index d7ecc30e..2e45e6bc 100644 --- a/contracts/payload-delivery/app-gateway/QueueAsync.sol +++ b/contracts/payload-delivery/app-gateway/QueueAsync.sol @@ -66,7 +66,7 @@ abstract contract QueueAsync is AddressResolverUtil, IDeliveryHelper { /// @param callType_ The call type /// @param payload_ The payload function queue( - bool isSequential_, + Parallel isParallel_, uint32 chainSlug_, address target_, address asyncPromise_, @@ -82,7 +82,7 @@ abstract contract QueueAsync is AddressResolverUtil, IDeliveryHelper { target: target_, payload: payload_, gasLimit: 10000000, - isSequential: isSequential_ + isParallel: isParallel_ }) ); } @@ -148,7 +148,7 @@ abstract contract QueueAsync is AddressResolverUtil, IDeliveryHelper { callType: params_.callType, executionGasLimit: params_.gasLimit == 0 ? 1_000_000 : params_.gasLimit, next: next, - isSequential: params_.isSequential + isParallel: params_.isParallel }); } diff --git a/script/mock/FinalizeAndExecution.s.sol b/script/mock/FinalizeAndExecution.s.sol index 042daadc..e77210d0 100644 --- a/script/mock/FinalizeAndExecution.s.sol +++ b/script/mock/FinalizeAndExecution.s.sol @@ -5,7 +5,7 @@ import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/console.sol"; import {MockWatcherPrecompile} from "../../contracts/mock/MockWatcherPrecompile.sol"; import {MockSocket} from "../../contracts/mock/MockSocket.sol"; -import {CallType, FinalizeParams, PayloadDetails} from "../../contracts/common/Structs.sol"; +import {CallType, FinalizeParams, PayloadDetails, Parallel} from "../../contracts/common/Structs.sol"; contract InboxTest is Script { function run() external { string memory arbRpc = vm.envString("ARBITRUM_SEPOLIA_RPC"); @@ -29,7 +29,7 @@ contract InboxTest is Script { callType: CallType.WRITE, executionGasLimit: 1000000, next: new address[](0), - isSequential: true + isParallel: Parallel.OFF }); FinalizeParams memory finalizeParams = FinalizeParams({ payloadDetails: payloadDetails, diff --git a/test/DeliveryHelper.t.sol b/test/DeliveryHelper.t.sol index 8887fd27..8836112d 100644 --- a/test/DeliveryHelper.t.sol +++ b/test/DeliveryHelper.t.sol @@ -453,7 +453,7 @@ contract DeliveryHelperTest is SetupTest { callType: callType_, executionGasLimit: executionGasLimit_, next: next_, - isSequential: false + isParallel: Parallel.ON }); } From 1d48287741f4501bfbe9e7f9df0c15cc2b5b6fcc Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Tue, 18 Feb 2025 18:11:22 +0400 Subject: [PATCH 044/186] merge master --- contracts/base/AppDeployerBase.sol | 3 ++- contracts/payload-delivery/app-gateway/DeliveryHelper.sol | 4 +++- lib/forge-std | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/contracts/base/AppDeployerBase.sol b/contracts/base/AppDeployerBase.sol index 14753fd8..9c85bebf 100644 --- a/contracts/base/AppDeployerBase.sol +++ b/contracts/base/AppDeployerBase.sol @@ -68,7 +68,8 @@ abstract contract AppDeployerBase is AppGatewayBase, IAppDeployer { return address(0); } - onChainAddress = IForwarder(forwarderAddresses[contractId_][chainSlug_]).getOnChainAddress(); + onChainAddress = IForwarder(forwarderAddresses[contractId_][chainSlug_]) + .getOnChainAddress(); } /// @notice Callback in pd promise to be called after all contracts are deployed diff --git a/contracts/payload-delivery/app-gateway/DeliveryHelper.sol b/contracts/payload-delivery/app-gateway/DeliveryHelper.sol index 7b19a9fa..ac838985 100644 --- a/contracts/payload-delivery/app-gateway/DeliveryHelper.sol +++ b/contracts/payload-delivery/app-gateway/DeliveryHelper.sol @@ -180,7 +180,9 @@ contract DeliveryHelper is BatchAsync, Ownable, Initializable { if (startIndex_ >= payloads_.length) revert InvalidIndex(); uint256 endIndex = startIndex_; - while (endIndex + 1 < payloads_.length && payloads_[endIndex + 1].isParallel == Parallel.ON) { + while ( + endIndex + 1 < payloads_.length && payloads_[endIndex + 1].isParallel == Parallel.ON + ) { endIndex++; } diff --git a/lib/forge-std b/lib/forge-std index 1eea5bae..bf909b22 160000 --- a/lib/forge-std +++ b/lib/forge-std @@ -1 +1 @@ -Subproject commit 1eea5bae12ae557d589f9f0f0edae2faa47cb262 +Subproject commit bf909b22fa55e244796dfa920c9639fdffa1c545 From 099794596f896854ac417cbf254b3c8bc132aa6e Mon Sep 17 00:00:00 2001 From: Rookmate <14072042+rookmate@users.noreply.github.com> Date: Fri, 14 Feb 2025 16:58:08 +0000 Subject: [PATCH 045/186] Enforce checks on PRs to master --- .github/workflows/forge-test.yml | 63 ++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 .github/workflows/forge-test.yml diff --git a/.github/workflows/forge-test.yml b/.github/workflows/forge-test.yml new file mode 100644 index 00000000..9d11cd23 --- /dev/null +++ b/.github/workflows/forge-test.yml @@ -0,0 +1,63 @@ +name: PR Checks + +on: + pull_request: + branches: [ master ] + +env: + FOUNDRY_PROFILE: ci + +jobs: + check: + strategy: + fail-fast: true + + name: Build and Test + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '18' + cache: 'yarn' + + - name: Install dependencies + run: yarn install --frozen-lockfile + + - name: Install Foundry + uses: foundry-rs/foundry-toolchain@v1 + with: + version: nightly + + - name: Show Forge version + run: | + forge --version + + - name: Run Forge fmt + run: | + forge fmt --check + id: fmt + + - name: Run Forge build + run: | + forge build --sizes + id: build + + - name: Run Forge tests + run: | + forge test -vvv + id: test + + - name: Run coverage + run: | + forge coverage + id: coverage + + - name: Run snapshot + run: | + forge snapshot + id: snapshot From c550e10f9a5162e7d7e916c8db963d1b62059dd4 Mon Sep 17 00:00:00 2001 From: Rookmate <14072042+rookmate@users.noreply.github.com> Date: Fri, 14 Feb 2025 17:19:14 +0000 Subject: [PATCH 046/186] Remove forge fmt from checks --- .github/workflows/forge-test.yml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/.github/workflows/forge-test.yml b/.github/workflows/forge-test.yml index 9d11cd23..fb0ba844 100644 --- a/.github/workflows/forge-test.yml +++ b/.github/workflows/forge-test.yml @@ -37,11 +37,6 @@ jobs: run: | forge --version - - name: Run Forge fmt - run: | - forge fmt --check - id: fmt - - name: Run Forge build run: | forge build --sizes From 2b00d78400bb822281d6633bf07a0e1d18c80d37 Mon Sep 17 00:00:00 2001 From: Rookmate <14072042+rookmate@users.noreply.github.com> Date: Fri, 14 Feb 2025 17:23:00 +0000 Subject: [PATCH 047/186] Fix dependency on PayFeesInArbitrumETH --- script/PayFeesInArbitrumETH.s.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/script/PayFeesInArbitrumETH.s.sol b/script/PayFeesInArbitrumETH.s.sol index 15472b22..efcbea1f 100644 --- a/script/PayFeesInArbitrumETH.s.sol +++ b/script/PayFeesInArbitrumETH.s.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.0; import {Script} from "forge-std/Script.sol"; -import {console} from "forge-std/Console.sol"; +import {console} from "forge-std/console.sol"; import {FeesPlug} from "../contracts/payload-delivery/FeesPlug.sol"; import {Fees} from "../contracts/common/Structs.sol"; import {ETH_ADDRESS} from "../contracts/common/Constants.sol"; From 85eeccc4f674b0b1883e94deb7e02ce770a91ab2 Mon Sep 17 00:00:00 2001 From: Rookmate <14072042+rookmate@users.noreply.github.com> Date: Fri, 14 Feb 2025 17:25:53 +0000 Subject: [PATCH 048/186] Fix dependency on WithdrawFeesArbitrumFeesPlug --- script/counter/WithdrawFeesArbitrumFeesPlug.s.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/script/counter/WithdrawFeesArbitrumFeesPlug.s.sol b/script/counter/WithdrawFeesArbitrumFeesPlug.s.sol index a46195d5..2ca9f206 100644 --- a/script/counter/WithdrawFeesArbitrumFeesPlug.s.sol +++ b/script/counter/WithdrawFeesArbitrumFeesPlug.s.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.0; import {Script} from "forge-std/Script.sol"; -import {console} from "forge-std/Console.sol"; +import {console} from "forge-std/console.sol"; import {FeesPlug} from "../../contracts/payload-delivery/FeesPlug.sol"; import {ETH_ADDRESS} from "../../contracts/common/Constants.sol"; import {CounterAppGateway} from "../../contracts/apps/counter/CounterAppGateway.sol"; From ff57e35a2a7f3a62cceb6c4db41a06008a2f6e97 Mon Sep 17 00:00:00 2001 From: Rookmate <14072042+rookmate@users.noreply.github.com> Date: Fri, 14 Feb 2025 17:28:17 +0000 Subject: [PATCH 049/186] Fix Console to console --- script/super-token-lockable/DeployContracts.s.sol | 2 +- script/super-token-lockable/DeployGateway.s.sol | 2 +- script/super-token/DeployContracts.s.sol | 2 +- script/super-token/DeployGateway.s.sol | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/script/super-token-lockable/DeployContracts.s.sol b/script/super-token-lockable/DeployContracts.s.sol index 9ab757b8..be463a84 100644 --- a/script/super-token-lockable/DeployContracts.s.sol +++ b/script/super-token-lockable/DeployContracts.s.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.0; import {Script} from "forge-std/Script.sol"; -import {console} from "forge-std/Console.sol"; +import {console} from "forge-std/console.sol"; import {SuperTokenLockableAppGateway} from "../../contracts/apps/super-token-lockable/SuperTokenLockableAppGateway.sol"; import {SuperTokenLockableDeployer} from "../../contracts/apps/super-token-lockable/SuperTokenLockableDeployer.sol"; import {SuperTokenLockable} from "../../contracts/apps/super-token-lockable/SuperTokenLockable.sol"; diff --git a/script/super-token-lockable/DeployGateway.s.sol b/script/super-token-lockable/DeployGateway.s.sol index 8389a937..8032264a 100644 --- a/script/super-token-lockable/DeployGateway.s.sol +++ b/script/super-token-lockable/DeployGateway.s.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.0; import {Script} from "forge-std/Script.sol"; -import {console} from "forge-std/Console.sol"; +import {console} from "forge-std/console.sol"; import {SuperTokenLockableAppGateway} from "../../contracts/apps/super-token-lockable/SuperTokenLockableAppGateway.sol"; import {SuperTokenLockableDeployer} from "../../contracts/apps/super-token-lockable/SuperTokenLockableDeployer.sol"; import {SuperTokenLockable} from "../../contracts/apps/super-token-lockable/SuperTokenLockable.sol"; diff --git a/script/super-token/DeployContracts.s.sol b/script/super-token/DeployContracts.s.sol index 79e37224..30ad5d88 100644 --- a/script/super-token/DeployContracts.s.sol +++ b/script/super-token/DeployContracts.s.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.0; import {Script} from "forge-std/Script.sol"; -import {console} from "forge-std/Console.sol"; +import {console} from "forge-std/console.sol"; import {SuperTokenAppGateway} from "../../contracts/apps/super-token/SuperTokenAppGateway.sol"; import {SuperTokenDeployer} from "../../contracts/apps/super-token/SuperTokenDeployer.sol"; import {SuperToken} from "../../contracts/apps/super-token/SuperToken.sol"; diff --git a/script/super-token/DeployGateway.s.sol b/script/super-token/DeployGateway.s.sol index 5f3fea2c..f57a841d 100644 --- a/script/super-token/DeployGateway.s.sol +++ b/script/super-token/DeployGateway.s.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.0; import {Script} from "forge-std/Script.sol"; -import {console} from "forge-std/Console.sol"; +import {console} from "forge-std/console.sol"; import {SuperTokenAppGateway} from "../../contracts/apps/super-token/SuperTokenAppGateway.sol"; import {SuperTokenDeployer} from "../../contracts/apps/super-token/SuperTokenDeployer.sol"; import {SuperToken} from "../../contracts/apps/super-token/SuperToken.sol"; From 7997540fcb3ec7c6347667a86f2b6aea695a0505 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Fri, 14 Feb 2025 21:36:04 +0400 Subject: [PATCH 050/186] fix: remove extra function --- contracts/AddressResolver.sol | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/contracts/AddressResolver.sol b/contracts/AddressResolver.sol index 045142cf..acc51261 100644 --- a/contracts/AddressResolver.sol +++ b/contracts/AddressResolver.sol @@ -57,12 +57,8 @@ contract AddressResolver is Ownable, IAddressResolver, Initializable { asyncPromiseImplementation = address(new AsyncPromise()); // Deploy beacons with initial implementations - forwarderBeacon = _deployBeacon(forwarderImplementation); - asyncPromiseBeacon = _deployBeacon(asyncPromiseImplementation); - } - - function _deployBeacon(address implementation_) internal returns (UpgradeableBeacon) { - return new UpgradeableBeacon(address(this), implementation_); + forwarderBeacon = new UpgradeableBeacon(address(this), forwarderImplementation); + asyncPromiseBeacon = new UpgradeableBeacon(address(this), asyncPromiseImplementation); } /// @notice Gets or deploys a Forwarder proxy contract From c8e06d148d21ccafeb4ff05c23411c7fc8f803cc Mon Sep 17 00:00:00 2001 From: Rookmate <14072042+rookmate@users.noreply.github.com> Date: Fri, 14 Feb 2025 17:40:39 +0000 Subject: [PATCH 051/186] forge install: solady v0.0.288 --- .gitmodules | 3 +++ lib/solady | 1 + 2 files changed, 4 insertions(+) create mode 160000 lib/solady diff --git a/.gitmodules b/.gitmodules index c59f396e..dbd0a97b 100644 --- a/.gitmodules +++ b/.gitmodules @@ -4,3 +4,6 @@ [submodule "lib/solmate"] path = lib/solmate url = https://github.com/transmissions11/solmate +[submodule "lib/solady"] + path = lib/solady + url = https://github.com/vectorized/solady diff --git a/lib/solady b/lib/solady new file mode 160000 index 00000000..6c2d0da6 --- /dev/null +++ b/lib/solady @@ -0,0 +1 @@ +Subproject commit 6c2d0da6397e3c016aabc3f298de1b92c6ce7405 From bc27030d179c6df0927c5e1b683a9b9abbe7d235 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Mon, 17 Feb 2025 16:13:41 +0400 Subject: [PATCH 052/186] + @socket.tech/socket-protocol@1.0.9 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8aefdcc1..c7668da8 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "publishConfig": { "access": "public" }, - "version": "1.0.8", + "version": "1.0.9", "description": "socket protocol", "scripts": { "build": "hardhat export-abi && tsc --project lib.tsconfig.json", From a3663c800076090c3b43290668c8c34963bbb541 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Mon, 17 Feb 2025 16:38:58 +0400 Subject: [PATCH 053/186] feat: composer deployment --- deployments/dev_addresses_geth.json | 38 +++++++++++++++++++++++++++++ deployments/dev_verification.json | 10 ++++---- 2 files changed, 43 insertions(+), 5 deletions(-) create mode 100644 deployments/dev_addresses_geth.json diff --git a/deployments/dev_addresses_geth.json b/deployments/dev_addresses_geth.json new file mode 100644 index 00000000..9498b9b1 --- /dev/null +++ b/deployments/dev_addresses_geth.json @@ -0,0 +1,38 @@ +{ + "421614": { + "ContractFactoryPlug": "0x1dc20d27F06876cA74ee4e2E9a4724f06a4a5E54", + "FastSwitchboard": "0xaFFfaD81e6DDE509Bd83Ab2024225b2FF537BeA7", + "FeesPlug": "0xb2B779ab8FC851bCE986d25B2824933B0Cd101d9", + "Hasher": "0x49f24A72e738Fe86263Aa26696370972e049498B", + "SignatureVerifier": "0xb6d39d1dB2cB14043182a008EfFC079A9C578208", + "Socket": "0x9B06e2Dae351ed8B1112C036e5c306E8fBe4C9c5", + "SocketBatcher": "0xd627BFe7d2fCAC1147c996a6F2CAaB2E1e1bD344", + "startBlock": 124035386 + }, + "7625382": { + "AddressResolver": "0x1287D33646d763Ff8237Aa7BE7d92Fc918c66589", + "AddressResolverImpl": "0x8662FC08dEC7c61Dd3432fAF45a5bC024BB60B00", + "AuctionManager": "0xE3806Bc41FEAFCAA2480E702fF02dA14F767bF0F", + "AuctionManagerImpl": "0x4C68058509d754Cc0dE474eBC20aE94e4787E704", + "DeliveryHelper": "0x4D8Fb6e8a5294ed0644f462b5723ee228ecf9958", + "DeliveryHelperImpl": "0x3c9f5172feb0dDfC06176cE67B566EFbb01CCe98", + "ERC1967Factory": "0xbBfb525ADc6eC38Ef0D4b807d327c2Dd1C286de1", + "FeesManager": "0x886682a69D6c0240EB850cc2e42c5B4B74449e82", + "FeesManagerImpl": "0xF4D3BDe438416938217d4624c82AEbEb46CeD371", + "SignatureVerifier": "0x366Dea9AC69fb9D45b6756587D2fE9B4c14197F6", + "SignatureVerifierImpl": "0x3cf47Ad0F040dFF1208E649C8f8e23e6B5A08916", + "startBlock": 18, + "WatcherPrecompile": "0xaCf94Cd4A7e70304F5CA6294CDAe3CBe78Ea6A86", + "WatcherPrecompileImpl": "0x8F18fC10a8b40b548C6F04Fb252481c783A9ace0" + }, + "11155420": { + "ContractFactoryPlug": "0x0EE19F0D0e34Cdd2eb4F61E24DC837b0b7c34e69", + "FastSwitchboard": "0x70bfB36F8b8de7763F1D52d954225ae88F6Ed595", + "FeesPlug": "0x7F5D263572469Fdf1875Cd858D557B45e9FC7f23", + "Hasher": "0xe37D675646A6FEEC3E41A0FF9535E0E716f5cD89", + "SignatureVerifier": "0x0452225B52Ef6134499232CbBEDF05fD8cc38530", + "Socket": "0x0BAAD473580c9F7Ca8b2758759aF3ce5E3154bC6", + "SocketBatcher": "0xCf731f35EFd775F692fe24e650e75Fd64bBaD810", + "startBlock": 23911773 + } +} diff --git a/deployments/dev_verification.json b/deployments/dev_verification.json index a1f1532e..75548eea 100644 --- a/deployments/dev_verification.json +++ b/deployments/dev_verification.json @@ -2,31 +2,31 @@ "421614": [], "7625382": [ [ - "0x4C68058509d754Cc0dE474eBC20aE94e4787E704", + "0xb888e3a8F9cC8F0281796958B01862427417b0Ea", "AuctionManager", "contracts/apps/payload-delivery/app-gateway/AuctionManager.sol", [] ], [ - "0x3c9f5172feb0dDfC06176cE67B566EFbb01CCe98", + "0x5bA4C527883F7D9e12d71Da5Cd170f26eCF2F901", "DeliveryHelper", "contracts/apps/payload-delivery/app-gateway/DeliveryHelper.sol", [] ], [ - "0xF4D3BDe438416938217d4624c82AEbEb46CeD371", + "0x731f609cae8C9B6862B4c1D43dE29d4759f878F8", "FeesManager", "contracts/apps/payload-delivery/app-gateway/FeesManager.sol", [] ], [ - "0x8F18fC10a8b40b548C6F04Fb252481c783A9ace0", + "0x32D3c608405b9b037A574550a40477F8Ea1f8B5B", "WatcherPrecompile", "contracts/watcherPrecompile/WatcherPrecompile.sol", [] ], [ - "0x8662FC08dEC7c61Dd3432fAF45a5bC024BB60B00", + "0xE6C9cf66F57f6aF78585235E36E94007020e3746", "AddressResolver", "contracts/AddressResolver.sol", [] From a2c7ae7f68ccc94d7fd886ed4666df34846b0950 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Mon, 17 Feb 2025 20:50:58 +0400 Subject: [PATCH 054/186] fix: block bid amount instead of fees amount --- .../payload-delivery/app-gateway/AuctionManager.sol | 2 ++ .../payload-delivery/app-gateway/FeesManager.sol | 13 +++++++++---- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/contracts/payload-delivery/app-gateway/AuctionManager.sol b/contracts/payload-delivery/app-gateway/AuctionManager.sol index f335246a..d1ee0a3d 100644 --- a/contracts/payload-delivery/app-gateway/AuctionManager.sol +++ b/contracts/payload-delivery/app-gateway/AuctionManager.sol @@ -94,9 +94,11 @@ contract AuctionManager is AddressResolverUtil, Ownable, IAuctionManager, Initia if (fee < winningBids[asyncId_].fee) return; winningBids[asyncId_] = newBid; + IFeesManager(addressResolver__.feesManager()).blockFees( payloadBatch.appGateway, payloadBatch.fees, + newBid, asyncId_ ); diff --git a/contracts/payload-delivery/app-gateway/FeesManager.sol b/contracts/payload-delivery/app-gateway/FeesManager.sol index 25d15907..4676c918 100644 --- a/contracts/payload-delivery/app-gateway/FeesManager.sol +++ b/contracts/payload-delivery/app-gateway/FeesManager.sol @@ -153,7 +153,12 @@ contract FeesManager is IFeesManager, AddressResolverUtil, Ownable, Initializabl /// @param fees_ The fees data struct /// @param asyncId_ The batch identifier /// @dev Only callable by delivery helper - function blockFees(address appGateway_, Fees memory fees_, bytes32 asyncId_) external { + function blockFees( + address appGateway_, + Fees memory fees_, + Bid memory winningBid_, + bytes32 asyncId_ + ) external { // todo: only auction manager can call this address appGateway = _getCoreAppGateway(appGateway_); // Block fees @@ -162,15 +167,15 @@ contract FeesManager is IFeesManager, AddressResolverUtil, Ownable, Initializabl appGateway, fees_.feePoolToken ); - if (availableFees < fees_.amount) revert InsufficientFeesAvailable(); + if (availableFees < winningBid_.fee) revert InsufficientFeesAvailable(); TokenBalance storage tokenBalance = appGatewayFeeBalances[appGateway][fees_.feePoolChain][ fees_.feePoolToken ]; - tokenBalance.blocked += fees_.amount; + tokenBalance.blocked += winningBid_.fee; asyncIdBlockedFees[asyncId_] = fees_; - emit FeesBlocked(asyncId_, fees_.feePoolChain, fees_.feePoolToken, fees_.amount); + emit FeesBlocked(asyncId_, fees_.feePoolChain, fees_.feePoolToken, winningBid_.fee); } function updateTransmitterFees( From 7ea8d34f80a166da617dc99821d3907314fb533f Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Tue, 18 Feb 2025 18:15:15 +0400 Subject: [PATCH 055/186] Merge branch 'staging' into overrides --- contracts/interfaces/IFeesManager.sol | 2 +- lib/solady | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/interfaces/IFeesManager.sol b/contracts/interfaces/IFeesManager.sol index 4e135fec..e686c2b7 100644 --- a/contracts/interfaces/IFeesManager.sol +++ b/contracts/interfaces/IFeesManager.sol @@ -4,7 +4,7 @@ pragma solidity ^0.8.3; import {Fees, Bid, PayloadDetails} from "../common/Structs.sol"; interface IFeesManager { - function blockFees(address appGateway_, Fees memory fees_, bytes32 asyncId_) external; + function blockFees(address appGateway_, Fees memory fees_, Bid memory winningBid_, bytes32 asyncId_) external; function updateTransmitterFees( Bid memory winningBid_, diff --git a/lib/solady b/lib/solady index 6c2d0da6..8583a6e3 160000 --- a/lib/solady +++ b/lib/solady @@ -1 +1 @@ -Subproject commit 6c2d0da6397e3c016aabc3f298de1b92c6ce7405 +Subproject commit 8583a6e386b897f3db142a541f86d5953eccd835 From 43086b45369228fddb89a95c49c7f77ae006df28 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Mon, 17 Feb 2025 17:41:59 +0400 Subject: [PATCH 056/186] feat: remove local ownable --- contracts/apps/parallel-counter/ParallelCounterDeployer.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/apps/parallel-counter/ParallelCounterDeployer.sol b/contracts/apps/parallel-counter/ParallelCounterDeployer.sol index 344495e2..c9c2f15c 100644 --- a/contracts/apps/parallel-counter/ParallelCounterDeployer.sol +++ b/contracts/apps/parallel-counter/ParallelCounterDeployer.sol @@ -17,7 +17,7 @@ contract ParallelCounterDeployer is AppDeployerBase, Ownable { ) AppDeployerBase(addressResolver_, auctionManager_, sbType_) { creationCodeWithArgs[counter1] = abi.encodePacked(type(Counter).creationCode); creationCodeWithArgs[counter2] = abi.encodePacked(type(Counter).creationCode); - _setOverrides(Read.OFF, Sequential.FALSE, 1000000, fees_); + _setOverrides(Read.OFF, Parallel.ON, 1000000, fees_); _initializeOwner(msg.sender); } From b6cd0bc87dc0287ed2412ff571e1c3c0061b29a5 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Mon, 17 Feb 2025 20:30:41 +0400 Subject: [PATCH 057/186] feat: moved payload delivery out --- contracts/payload-delivery/ContractFactoryPlug.sol | 2 +- contracts/payload-delivery/app-gateway/BatchAsync.sol | 5 +---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/contracts/payload-delivery/ContractFactoryPlug.sol b/contracts/payload-delivery/ContractFactoryPlug.sol index 3b107ed6..78ebb554 100644 --- a/contracts/payload-delivery/ContractFactoryPlug.sol +++ b/contracts/payload-delivery/ContractFactoryPlug.sol @@ -38,7 +38,7 @@ contract ContractFactoryPlug is PlugBase, AccessControl { } } - IPlug(addr).connectSocket(appGateway_, msg.sender, switchboard_); + IPlug(addr).initSocket(appGateway_, msg.sender, switchboard_); emit Deployed(addr, salt_); return addr; } diff --git a/contracts/payload-delivery/app-gateway/BatchAsync.sol b/contracts/payload-delivery/app-gateway/BatchAsync.sol index 6470c0f4..06d373e4 100644 --- a/contracts/payload-delivery/app-gateway/BatchAsync.sol +++ b/contracts/payload-delivery/app-gateway/BatchAsync.sol @@ -273,10 +273,7 @@ abstract contract BatchAsync is QueueAsync { /// @notice Gets the payload delivery plug address /// @param chainSlug_ The chain identifier /// @return address The address of the payload delivery plug - function getDeliveryHelperPlugAddress( - address appGateway_, - uint32 chainSlug_ - ) public view returns (address) { + function getDeliveryHelperPlugAddress(address appGateway_, uint32 chainSlug_) public view returns (address) { return watcherPrecompile__().appGatewayPlugs(appGateway_, chainSlug_); } From 04fdb1ffd2920b70057b019e1086367712a4f1ee Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Tue, 18 Feb 2025 16:17:18 +0400 Subject: [PATCH 058/186] fix: test --- contracts/payload-delivery/ContractFactoryPlug.sol | 2 +- contracts/payload-delivery/app-gateway/QueueAsync.sol | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/payload-delivery/ContractFactoryPlug.sol b/contracts/payload-delivery/ContractFactoryPlug.sol index 78ebb554..3b107ed6 100644 --- a/contracts/payload-delivery/ContractFactoryPlug.sol +++ b/contracts/payload-delivery/ContractFactoryPlug.sol @@ -38,7 +38,7 @@ contract ContractFactoryPlug is PlugBase, AccessControl { } } - IPlug(addr).initSocket(appGateway_, msg.sender, switchboard_); + IPlug(addr).connectSocket(appGateway_, msg.sender, switchboard_); emit Deployed(addr, salt_); return addr; } diff --git a/contracts/payload-delivery/app-gateway/QueueAsync.sol b/contracts/payload-delivery/app-gateway/QueueAsync.sol index 2e45e6bc..e462f2b4 100644 --- a/contracts/payload-delivery/app-gateway/QueueAsync.sol +++ b/contracts/payload-delivery/app-gateway/QueueAsync.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.21; import {AddressResolverUtil} from "../../utils/AddressResolverUtil.sol"; -import {CallParams, Fees, PayloadDetails, CallType, Bid, PayloadBatch} from "../../common/Structs.sol"; +import {CallParams, Fees, PayloadDetails, CallType, Bid, PayloadBatch, Parallel} from "../../common/Structs.sol"; import {NotAuctionManager, InvalidPromise, InvalidIndex} from "../../common/Errors.sol"; import {AsyncPromise} from "../../AsyncPromise.sol"; import {IPromise} from "../../interfaces/IPromise.sol"; From 9d67b609a1cbf9b6d2014c5438380a5ace3ebb56 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Tue, 18 Feb 2025 16:36:12 +0400 Subject: [PATCH 059/186] feat: merged sig verifier --- contracts/payload-delivery/app-gateway/BatchAsync.sol | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/contracts/payload-delivery/app-gateway/BatchAsync.sol b/contracts/payload-delivery/app-gateway/BatchAsync.sol index 06d373e4..6470c0f4 100644 --- a/contracts/payload-delivery/app-gateway/BatchAsync.sol +++ b/contracts/payload-delivery/app-gateway/BatchAsync.sol @@ -273,7 +273,10 @@ abstract contract BatchAsync is QueueAsync { /// @notice Gets the payload delivery plug address /// @param chainSlug_ The chain identifier /// @return address The address of the payload delivery plug - function getDeliveryHelperPlugAddress(address appGateway_, uint32 chainSlug_) public view returns (address) { + function getDeliveryHelperPlugAddress( + address appGateway_, + uint32 chainSlug_ + ) public view returns (address) { return watcherPrecompile__().appGatewayPlugs(appGateway_, chainSlug_); } From 7dc15e6b74394186abb0e1ace1ff848f8b5da40d Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Tue, 18 Feb 2025 18:31:58 +0400 Subject: [PATCH 060/186] fix: build --- contracts/payload-delivery/app-gateway/FeesManager.sol | 2 +- lib/forge-std | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/payload-delivery/app-gateway/FeesManager.sol b/contracts/payload-delivery/app-gateway/FeesManager.sol index 4676c918..2dcbb571 100644 --- a/contracts/payload-delivery/app-gateway/FeesManager.sol +++ b/contracts/payload-delivery/app-gateway/FeesManager.sol @@ -3,7 +3,7 @@ pragma solidity ^0.8.0; import {Ownable} from "solady/auth/Ownable.sol"; import {AddressResolverUtil} from "../../utils/AddressResolverUtil.sol"; -import {Bid, Fees, PayloadDetails, CallType, FinalizeParams, PayloadBatch} from "../../common/Structs.sol"; +import {Bid, Fees, PayloadDetails, CallType, FinalizeParams, PayloadBatch, Parallel} from "../../common/Structs.sol"; import {IDeliveryHelper} from "../../interfaces/IDeliveryHelper.sol"; import {FORWARD_CALL, DISTRIBUTE_FEE, DEPLOY, WITHDRAW} from "../../common/Constants.sol"; import {IFeesPlug} from "../../interfaces/IFeesPlug.sol"; diff --git a/lib/forge-std b/lib/forge-std index bf909b22..1eea5bae 160000 --- a/lib/forge-std +++ b/lib/forge-std @@ -1 +1 @@ -Subproject commit bf909b22fa55e244796dfa920c9639fdffa1c545 +Subproject commit 1eea5bae12ae557d589f9f0f0edae2faa47cb262 From ca7da66efd644e6c0901e5f0f01e22caf6f73784 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Tue, 18 Feb 2025 18:59:22 +0400 Subject: [PATCH 061/186] fix: build --- contracts/base/AppDeployerBase.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/base/AppDeployerBase.sol b/contracts/base/AppDeployerBase.sol index cf3d33bb..acde6807 100644 --- a/contracts/base/AppDeployerBase.sol +++ b/contracts/base/AppDeployerBase.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.21; import {DeployParams, Fees, CallType, PayloadBatch} from "../protocol/utils/common/Structs.sol"; -import {AppGatewayBase} from "./AppGatewayBase.sol"; +import "./AppGatewayBase.sol"; import {IForwarder} from "../interfaces/IForwarder.sol"; import {IPromise} from "../interfaces/IPromise.sol"; import {IAppDeployer} from "../interfaces/IAppDeployer.sol"; From 19ceef4c5f6294e64163de160efaf063487d261d Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Tue, 18 Feb 2025 19:11:11 +0400 Subject: [PATCH 062/186] rename: maxLimit to defaultLimit --- .../watcherPrecompile/WatcherPrecompile.sol | 6 +++--- .../WatcherPrecompileLimits.sol | 18 +++++++++--------- test/Migration.t.sol | 18 +++++++++++------- test/MockWatcherPrecompileImpl.sol | 6 +++--- test/SetupTest.t.sol | 4 ++-- 5 files changed, 28 insertions(+), 24 deletions(-) diff --git a/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol b/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol index 6482f0ed..3c1f7cde 100644 --- a/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol +++ b/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol @@ -99,7 +99,7 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { function initialize( address owner_, address addressResolver_, - uint256 maxLimit_ + uint256 defaultLimit_ ) public reinitializer(1) { _setAddressResolver(addressResolver_); _initializeOwner(owner_); @@ -109,9 +109,9 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { LIMIT_DECIMALS = 18; // limit per day - maxLimit = maxLimit_ * 10 ** LIMIT_DECIMALS; + defaultLimit = defaultLimit_ * 10 ** LIMIT_DECIMALS; // limit per second - ratePerSecond = maxLimit / (24 * 60 * 60); + ratePerSecond = defaultLimit / (24 * 60 * 60); } // ================== Timeout functions ================== diff --git a/contracts/protocol/watcherPrecompile/WatcherPrecompileLimits.sol b/contracts/protocol/watcherPrecompile/WatcherPrecompileLimits.sol index b4f6a857..c90e1213 100644 --- a/contracts/protocol/watcherPrecompile/WatcherPrecompileLimits.sol +++ b/contracts/protocol/watcherPrecompile/WatcherPrecompileLimits.sol @@ -14,8 +14,8 @@ abstract contract WatcherPrecompileLimits is Ownable, IWatcherPrecompile { - /// @notice Maximum limit value for any app gateway - uint256 public maxLimit; + /// @notice Default limit value for any app gateway + uint256 public defaultLimit; /// @notice Rate at which limit replenishes per second uint256 public ratePerSecond; /// @notice Number of decimals used in limit calculations @@ -131,10 +131,10 @@ abstract contract WatcherPrecompileLimits is // Initialize limit if not active if (!_activeAppGateways[appGateway]) { LimitParams memory limitParam = LimitParams({ - maxLimit: maxLimit, + maxLimit: defaultLimit, ratePerSecond: ratePerSecond, lastUpdateTimestamp: block.timestamp, - lastUpdateLimit: maxLimit + lastUpdateLimit: defaultLimit }); _limitParams[appGateway][QUERY] = limitParam; @@ -142,7 +142,7 @@ abstract contract WatcherPrecompileLimits is _limitParams[appGateway][SCHEDULE] = limitParam; _activeAppGateways[appGateway] = true; - emit AppGatewayActivated(appGateway, maxLimit, ratePerSecond); + emit AppGatewayActivated(appGateway, defaultLimit, ratePerSecond); } // Update the limit @@ -163,11 +163,11 @@ abstract contract WatcherPrecompileLimits is } /** - * @notice Set the maximum limit value - * @param maxLimit_ The new maximum limit value + * @notice Set the default limit value + * @param defaultLimit_ The new default limit value */ - function setMaxLimit(uint256 maxLimit_) external onlyOwner { - maxLimit = maxLimit_; + function setDefaultLimit(uint256 defaultLimit_) external onlyOwner { + defaultLimit = defaultLimit_; } /** diff --git a/test/Migration.t.sol b/test/Migration.t.sol index 075b7344..f29eceda 100644 --- a/test/Migration.t.sol +++ b/test/Migration.t.sol @@ -100,7 +100,11 @@ contract MigrationTest is SetupTest { address(addressResolver), "AddressResolver should be preserved" ); - assertEq(watcherPrecompile.maxLimit(), maxLimit * 10 ** 18, "MaxLimit should be preserved"); + assertEq( + watcherPrecompile.defaultLimit(), + defaultLimit * 10 ** 18, + "DefaultLimit should be preserved" + ); } function testUpgradeWithInitializationData() public { @@ -110,13 +114,13 @@ contract MigrationTest is SetupTest { // Store old implementation address for verification address oldImpl = getImplementation(address(watcherPrecompile)); - // Prepare initialization data with new maxLimit - uint256 newMaxLimit = 2000; + // Prepare initialization data with new defaultLimit + uint256 newDefaultLimit = 2000; bytes memory initData = abi.encodeWithSelector( MockWatcherPrecompileImpl.mockReinitialize.selector, watcherEOA, address(addressResolver), - newMaxLimit + newDefaultLimit ); // Upgrade proxy with initialization data @@ -131,9 +135,9 @@ contract MigrationTest is SetupTest { assertNotEq(oldImpl, newImplAddr, "Implementation should have changed"); assertEq(newImplAddr, address(newImpl), "New implementation not set correctly"); assertEq( - watcherPrecompile.maxLimit(), - newMaxLimit * 10 ** 18, - "MaxLimit should be updated" + watcherPrecompile.defaultLimit(), + newDefaultLimit * 10 ** 18, + "DefaultLimit should be updated" ); } diff --git a/test/MockWatcherPrecompileImpl.sol b/test/MockWatcherPrecompileImpl.sol index 1cf94136..ca34b9f8 100644 --- a/test/MockWatcherPrecompileImpl.sol +++ b/test/MockWatcherPrecompileImpl.sol @@ -8,7 +8,7 @@ contract MockWatcherPrecompileImpl is WatcherPrecompile { function mockReinitialize( address owner_, address addressResolver_, - uint256 maxLimit_ + uint256 defaultLimit_ ) external reinitializer(2) { _setAddressResolver(addressResolver_); _initializeOwner(owner_); @@ -17,8 +17,8 @@ contract MockWatcherPrecompileImpl is WatcherPrecompile { LIMIT_DECIMALS = 18; // limit per day - maxLimit = maxLimit_ * 10 ** LIMIT_DECIMALS; + defaultLimit = defaultLimit_ * 10 ** LIMIT_DECIMALS; // limit per second - ratePerSecond = maxLimit / (24 * 60 * 60); + ratePerSecond = defaultLimit / (24 * 60 * 60); } } diff --git a/test/SetupTest.t.sol b/test/SetupTest.t.sol index 193e0ec6..f7566fe3 100644 --- a/test/SetupTest.t.sol +++ b/test/SetupTest.t.sol @@ -38,7 +38,7 @@ contract SetupTest is Test { uint256 public readPayloadIdCounter = 0; uint256 public timeoutPayloadIdCounter = 0; - uint256 public maxLimit = 1000; + uint256 public defaultLimit = 1000; bytes public asyncPromiseBytecode = type(AsyncPromise).creationCode; uint64 public version = 1; @@ -118,7 +118,7 @@ contract SetupTest is Test { WatcherPrecompile.initialize.selector, watcherEOA, address(addressResolverProxy), - maxLimit + defaultLimit ); vm.expectEmit(true, true, true, false); emit Initialized(version); From fdc89a6035973f474130fafe1307cf128f1aaf92 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Tue, 18 Feb 2025 19:13:12 +0400 Subject: [PATCH 063/186] rename: ratePerSecond to defaultRatePerSecond --- .../protocol/watcherPrecompile/WatcherPrecompile.sol | 2 +- .../watcherPrecompile/WatcherPrecompileLimits.sol | 12 ++++++------ test/MockWatcherPrecompileImpl.sol | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol b/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol index 3c1f7cde..02d8f720 100644 --- a/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol +++ b/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol @@ -111,7 +111,7 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { // limit per day defaultLimit = defaultLimit_ * 10 ** LIMIT_DECIMALS; // limit per second - ratePerSecond = defaultLimit / (24 * 60 * 60); + defaultRatePerSecond = defaultLimit / (24 * 60 * 60); } // ================== Timeout functions ================== diff --git a/contracts/protocol/watcherPrecompile/WatcherPrecompileLimits.sol b/contracts/protocol/watcherPrecompile/WatcherPrecompileLimits.sol index c90e1213..76a1bd55 100644 --- a/contracts/protocol/watcherPrecompile/WatcherPrecompileLimits.sol +++ b/contracts/protocol/watcherPrecompile/WatcherPrecompileLimits.sol @@ -17,7 +17,7 @@ abstract contract WatcherPrecompileLimits is /// @notice Default limit value for any app gateway uint256 public defaultLimit; /// @notice Rate at which limit replenishes per second - uint256 public ratePerSecond; + uint256 public defaultRatePerSecond; /// @notice Number of decimals used in limit calculations uint256 public LIMIT_DECIMALS; @@ -132,7 +132,7 @@ abstract contract WatcherPrecompileLimits is if (!_activeAppGateways[appGateway]) { LimitParams memory limitParam = LimitParams({ maxLimit: defaultLimit, - ratePerSecond: ratePerSecond, + ratePerSecond: defaultRatePerSecond, lastUpdateTimestamp: block.timestamp, lastUpdateLimit: defaultLimit }); @@ -142,7 +142,7 @@ abstract contract WatcherPrecompileLimits is _limitParams[appGateway][SCHEDULE] = limitParam; _activeAppGateways[appGateway] = true; - emit AppGatewayActivated(appGateway, defaultLimit, ratePerSecond); + emit AppGatewayActivated(appGateway, defaultLimit, defaultRatePerSecond); } // Update the limit @@ -172,10 +172,10 @@ abstract contract WatcherPrecompileLimits is /** * @notice Set the rate at which limit replenishes - * @param ratePerSecond_ The new rate per second + * @param defaultRatePerSecond_ The new rate per second */ - function setRatePerSecond(uint256 ratePerSecond_) external onlyOwner { - ratePerSecond = ratePerSecond_; + function setDefaultRatePerSecond(uint256 defaultRatePerSecond_) external onlyOwner { + defaultRatePerSecond = defaultRatePerSecond_; } uint256[49] __gap; diff --git a/test/MockWatcherPrecompileImpl.sol b/test/MockWatcherPrecompileImpl.sol index ca34b9f8..3ed0b3cc 100644 --- a/test/MockWatcherPrecompileImpl.sol +++ b/test/MockWatcherPrecompileImpl.sol @@ -19,6 +19,6 @@ contract MockWatcherPrecompileImpl is WatcherPrecompile { // limit per day defaultLimit = defaultLimit_ * 10 ** LIMIT_DECIMALS; // limit per second - ratePerSecond = defaultLimit / (24 * 60 * 60); + defaultRatePerSecond = defaultLimit / (24 * 60 * 60); } } From c61e09f3ee0a1c9263b599f698ff1366150aaf37 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Tue, 18 Feb 2025 21:06:34 +0400 Subject: [PATCH 064/186] fix: remove app-gateway map and add individual plug map --- contracts/base/AppDeployerBase.sol | 3 +- contracts/interfaces/IFeesManager.sol | 7 ++- contracts/interfaces/IWatcherPrecompile.sol | 26 ++++++--- contracts/mock/MockWatcherPrecompile.sol | 16 ------ .../app-gateway/BatchAsync.sol | 3 +- .../app-gateway/FeesManager.sol | 2 +- .../WatcherPrecompileConfig.sol | 57 +++++++++++++++---- hardhat-scripts/deploy/1.deploy.ts | 17 ++---- hardhat-scripts/deploy/2.roles.ts | 14 ++++- hardhat-scripts/deploy/3.upgradeManagers.ts | 40 +++++++++---- hardhat-scripts/deploy/4.connect.ts | 13 +++-- test/SetupTest.t.sol | 9 ++- 12 files changed, 133 insertions(+), 74 deletions(-) diff --git a/contracts/base/AppDeployerBase.sol b/contracts/base/AppDeployerBase.sol index acde6807..84d092b0 100644 --- a/contracts/base/AppDeployerBase.sol +++ b/contracts/base/AppDeployerBase.sol @@ -88,8 +88,7 @@ abstract contract AppDeployerBase is AppGatewayBase, IAppDeployer { /// @param chainSlug_ The chain slug /// @return socketAddress_ The socket address function getSocketAddress(uint32 chainSlug_) public view returns (address) { - return - watcherPrecompile__().appGatewayPlugs(addressResolver__.deliveryHelper(), chainSlug_); + return watcherPrecompile__().sockets(chainSlug_); } /// @notice Initializes the contract diff --git a/contracts/interfaces/IFeesManager.sol b/contracts/interfaces/IFeesManager.sol index 641b038a..0ef610bb 100644 --- a/contracts/interfaces/IFeesManager.sol +++ b/contracts/interfaces/IFeesManager.sol @@ -4,7 +4,12 @@ pragma solidity ^0.8.3; import {Fees, Bid, PayloadDetails} from "../protocol/utils/common/Structs.sol"; interface IFeesManager { - function blockFees(address appGateway_, Fees memory fees_, Bid memory winningBid_, bytes32 asyncId_) external; + function blockFees( + address appGateway_, + Fees memory fees_, + Bid memory winningBid_, + bytes32 asyncId_ + ) external; function updateTransmitterFees( Bid memory winningBid_, diff --git a/contracts/interfaces/IWatcherPrecompile.sol b/contracts/interfaces/IWatcherPrecompile.sol index a5d374b2..1a16d9f0 100644 --- a/contracts/interfaces/IWatcherPrecompile.sol +++ b/contracts/interfaces/IWatcherPrecompile.sol @@ -12,6 +12,17 @@ interface IWatcherPrecompile { /// @dev Only callable by authorized addresses function setAppGateways(AppGatewayConfig[] calldata configs_) external; + /// @notice Sets up on-chain contract configurations + /// @dev Only callable by authorized addresses + function setOnChainContracts( + uint32 chainSlug_, + bytes32 sbType_, + address switchboard_, + address socket_, + address contractFactoryPlug_, + address feesPlug_ + ) external; + /// @notice Retrieves plug configuration for a specific network and plug /// @param chainSlug_ The identifier of the network /// @param plug_ The address of the plug @@ -72,19 +83,16 @@ interface IWatcherPrecompile { /// @return root The calculated merkle root hash function getRoot(PayloadRootParams memory params_) external pure returns (bytes32 root); - /// @notice Gets the plug address for a given app gateway and chain - /// @param appGateway_ The address of the app gateway contract - /// @param chainSlug_ The identifier of the destination chain - /// @return The plug address for the given app gateway and chain - function appGatewayPlugs( - address appGateway_, - uint32 chainSlug_ - ) external view returns (address); - function setMaxTimeoutDelayInSeconds(uint256 maxTimeoutDelayInSeconds_) external; function switchboards(uint32 chainSlug_, bytes32 sbType_) external view returns (address); + function sockets(uint32 chainSlug_) external view returns (address); + + function contractFactoryPlug(uint32 chainSlug_) external view returns (address); + + function feesPlug(uint32 chainSlug_) external view returns (address); + function setIsValidInboxCaller(uint32 chainSlug_, address plug_, bool isValid_) external; function checkAndUpdateLimit( diff --git a/contracts/mock/MockWatcherPrecompile.sol b/contracts/mock/MockWatcherPrecompile.sol index 3fe4c2ef..09dd8781 100644 --- a/contracts/mock/MockWatcherPrecompile.sol +++ b/contracts/mock/MockWatcherPrecompile.sol @@ -29,9 +29,6 @@ contract MockWatcherPrecompile { mapping(uint32 => mapping(address => PlugConfig)) internal _plugConfigs; - /// @notice Maps app gateway to their associated plugs per network - /// @dev appGateway => chainSlug => plug - mapping(address => mapping(uint32 => address)) public appGatewayPlugs; /// @notice Error thrown when an invalid chain slug is provided error InvalidChainSlug(); error InvalidTransmitter(); @@ -229,19 +226,6 @@ contract MockWatcherPrecompile { return bytes32((uint256(uint160(address(this))) << 64) | timeoutCounter_); } - function setAppGateways(AppGatewayConfig[] calldata configs) external { - for (uint256 i = 0; i < configs.length; i++) { - // Store the plug configuration for this network and plug - _plugConfigs[configs[i].chainSlug][configs[i].plug] = PlugConfig({ - appGateway: configs[i].appGateway, - switchboard: configs[i].switchboard - }); - - // Create reverse mapping from app gateway to plug for easy lookup - appGatewayPlugs[configs[i].appGateway][configs[i].chainSlug] = configs[i].plug; - } - } - /// @notice Retrieves the configuration for a specific plug on a network /// @param chainSlug_ The identifier of the network /// @param plug_ The address of the plug diff --git a/contracts/protocol/payload-delivery/app-gateway/BatchAsync.sol b/contracts/protocol/payload-delivery/app-gateway/BatchAsync.sol index 14a636af..43df85ae 100644 --- a/contracts/protocol/payload-delivery/app-gateway/BatchAsync.sol +++ b/contracts/protocol/payload-delivery/app-gateway/BatchAsync.sol @@ -91,7 +91,6 @@ abstract contract BatchAsync is QueueAsync { bytes32 asyncId = getCurrentAsyncId(); asyncCounter++; - if (!IFeesManager(addressResolver__.feesManager()).isFeesEnough(msg.sender, fees_)) revert InsufficientFees(); @@ -282,7 +281,7 @@ abstract contract BatchAsync is QueueAsync { address appGateway_, uint32 chainSlug_ ) public view returns (address) { - return watcherPrecompile__().appGatewayPlugs(appGateway_, chainSlug_); + return watcherPrecompile__().contractFactoryPlug(chainSlug_); } /// @notice Gets the current async ID diff --git a/contracts/protocol/payload-delivery/app-gateway/FeesManager.sol b/contracts/protocol/payload-delivery/app-gateway/FeesManager.sol index 48a43f66..9ec14290 100644 --- a/contracts/protocol/payload-delivery/app-gateway/FeesManager.sol +++ b/contracts/protocol/payload-delivery/app-gateway/FeesManager.sol @@ -365,6 +365,6 @@ contract FeesManager is IFeesManager, AddressResolverUtil, Ownable, Initializabl } function _getFeesPlugAddress(uint32 chainSlug_) internal view returns (address) { - return watcherPrecompile__().appGatewayPlugs(address(this), chainSlug_); + return watcherPrecompile__().feesPlug(chainSlug_); } } diff --git a/contracts/protocol/watcherPrecompile/WatcherPrecompileConfig.sol b/contracts/protocol/watcherPrecompile/WatcherPrecompileConfig.sol index 8bc3b90f..e90f196a 100644 --- a/contracts/protocol/watcherPrecompile/WatcherPrecompileConfig.sol +++ b/contracts/protocol/watcherPrecompile/WatcherPrecompileConfig.sol @@ -11,14 +11,22 @@ abstract contract WatcherPrecompileConfig is WatcherPrecompileLimits { /// @dev chainSlug => plug => PlugConfig mapping(uint32 => mapping(address => PlugConfig)) internal _plugConfigs; - /// @notice Maps app gateway to their associated plugs per network - /// @dev appGateway => chainSlug => plug - mapping(address => mapping(uint32 => address)) public appGatewayPlugs; - /// @notice Maps chain slug to their associated switchboard /// @dev chainSlug => sb type => switchboard address mapping(uint32 => mapping(bytes32 => address)) public switchboards; + /// @notice Maps chain slug to their associated socket + /// @dev chainSlug => socket address + mapping(uint32 => address) public sockets; + + /// @notice Maps chain slug to their associated contract factory plug + /// @dev chainSlug => contract factory plug address + mapping(uint32 => address) public contractFactoryPlug; + + /// @notice Maps chain slug to their associated fees plug + /// @dev chainSlug => fees plug address + mapping(uint32 => address) public feesPlug; + // appGateway => chainSlug => plug => isValid mapping(address => mapping(uint32 => mapping(address => bool))) public isValidInboxCaller; @@ -34,6 +42,22 @@ abstract contract WatcherPrecompileConfig is WatcherPrecompileLimits { /// @param switchboard The address of the switchboard event SwitchboardSet(uint32 chainSlug, bytes32 sbType, address switchboard); + /// @notice Emitted when contracts are set for a network + /// @param chainSlug The identifier of the network + /// @param sbType The type of switchboard + /// @param switchboard The address of the switchboard + /// @param socket The address of the socket + /// @param contractFactoryPlug The address of the contract factory plug + /// @param feesPlug The address of the fees plug + event OnChainContractSet( + uint32 chainSlug, + bytes32 sbType, + address switchboard, + address socket, + address contractFactoryPlug, + address feesPlug + ); + /// @notice Configures app gateways with their respective plugs and switchboards /// @param configs_ Array of configurations containing app gateway, network, plug, and switchboard details /// @dev Only callable by the contract owner @@ -46,9 +70,6 @@ abstract contract WatcherPrecompileConfig is WatcherPrecompileLimits { switchboard: configs_[i].switchboard }); - // Create reverse mapping from app gateway to plug for easy lookup - appGatewayPlugs[configs_[i].appGateway][configs_[i].chainSlug] = configs_[i].plug; - emit PlugAdded(configs_[i].appGateway, configs_[i].chainSlug, configs_[i].plug); } } @@ -56,13 +77,27 @@ abstract contract WatcherPrecompileConfig is WatcherPrecompileLimits { /// @notice Sets the switchboard for a network /// @param chainSlug_ The identifier of the network /// @param switchboard_ The address of the switchboard - function setSwitchboard( + function setOnChainContracts( uint32 chainSlug_, bytes32 sbType_, - address switchboard_ - ) external onlyOwner { + address switchboard_, + address socket_, + address contractFactoryPlug_, + address feesPlug_ + ) external override onlyOwner { switchboards[chainSlug_][sbType_] = switchboard_; - emit SwitchboardSet(chainSlug_, sbType_, switchboard_); + sockets[chainSlug_] = socket_; + contractFactoryPlug[chainSlug_] = contractFactoryPlug_; + feesPlug[chainSlug_] = feesPlug_; + + emit OnChainContractSet( + chainSlug_, + sbType_, + switchboard_, + socket_, + contractFactoryPlug_, + feesPlug_ + ); } // @dev app gateway can set the valid plugs for each chain slug diff --git a/hardhat-scripts/deploy/1.deploy.ts b/hardhat-scripts/deploy/1.deploy.ts index 40d8a2a6..ec95a47d 100644 --- a/hardhat-scripts/deploy/1.deploy.ts +++ b/hardhat-scripts/deploy/1.deploy.ts @@ -13,13 +13,12 @@ import { getProviderFromChainSlug } from "../constants"; import { ethers } from "hardhat"; import dev_addresses from "../../deployments/dev_addresses.json"; import { auctionEndDelaySeconds, chains } from "./config"; -import { - MAX_LIMIT, - EVMX_CHAIN_ID, - BID_TIMEOUT -} from "../constants/constants"; +import { MAX_LIMIT, EVMX_CHAIN_ID, BID_TIMEOUT } from "../constants/constants"; import { getImplementationAddress } from "./migration/migrate-proxies"; -import { CORE_CONTRACTS, EVMxCoreContracts } from "../constants/protocolConstants"; +import { + CORE_CONTRACTS, + EVMxCoreContracts, +} from "../constants/protocolConstants"; let offChainVMOwner: string; const main = async () => { @@ -212,11 +211,7 @@ const deployWatcherVMContracts = async () => { deployUtils = await deployContractWithProxy( EVMxCoreContracts.DeliveryHelper, `contracts/apps/payload-delivery/app-gateway/DeliveryHelper.sol`, - [ - addressResolver.address, - offChainVMOwner, - BID_TIMEOUT, - ], + [addressResolver.address, offChainVMOwner, BID_TIMEOUT], proxyFactory, deployUtils ); diff --git a/hardhat-scripts/deploy/2.roles.ts b/hardhat-scripts/deploy/2.roles.ts index d007ac94..35ed6836 100644 --- a/hardhat-scripts/deploy/2.roles.ts +++ b/hardhat-scripts/deploy/2.roles.ts @@ -40,7 +40,8 @@ export const main = async () => { ); for (const [contractName, roleHash] of Object.entries(REQUIRED_ROLES)) { - if (!chainAddresses[contractName as keyof ChainSocketAddresses]) continue; + if (!chainAddresses[contractName as keyof ChainSocketAddresses]) + continue; let contract = await getInstance( contractName as CORE_CONTRACTS, @@ -48,7 +49,10 @@ export const main = async () => { ); contract = contract.connect(signer); - const targetAddress = contractName === CORE_CONTRACTS.FastSwitchboard ? watcher : signer.address; + const targetAddress = + contractName === CORE_CONTRACTS.FastSwitchboard + ? watcher + : signer.address; const hasRole = await contract.callStatic["hasRole(bytes32,address)"]( getRoleHash(roleHash), @@ -65,7 +69,11 @@ export const main = async () => { } else { tx = await contract.grantRole(getRoleHash(roleHash), targetAddress); } - console.log(`granting ${roleHash} role to ${targetAddress} for ${contractName}`, chain, tx.hash); + console.log( + `granting ${roleHash} role to ${targetAddress} for ${contractName}`, + chain, + tx.hash + ); await tx.wait(); } } diff --git a/hardhat-scripts/deploy/3.upgradeManagers.ts b/hardhat-scripts/deploy/3.upgradeManagers.ts index 3f60c874..cda42b70 100644 --- a/hardhat-scripts/deploy/3.upgradeManagers.ts +++ b/hardhat-scripts/deploy/3.upgradeManagers.ts @@ -48,11 +48,7 @@ export const main = async () => { socketContract ); - await setSwitchboard( - chainAddresses[CORE_CONTRACTS.FastSwitchboard], - chain, - addresses - ); + await setOnchainContracts(chain, addresses); await storeAddresses(chainAddresses, chain, DeploymentMode.DEV); } @@ -61,7 +57,7 @@ export const main = async () => { } }; -async function setSwitchboard(sbAddress, chain, addresses) { +async function setOnchainContracts(chain, addresses) { const providerInstance = getProviderFromChainSlug(EVMX_CHAIN_ID as ChainSlug); const signer: Wallet = new ethers.Wallet( process.env.WATCHER_PRIVATE_KEY as string, @@ -76,15 +72,37 @@ async function setSwitchboard(sbAddress, chain, addresses) { ).connect(signer); const fastSBtype = ethers.utils.keccak256(ethers.utils.toUtf8Bytes("FAST")); - const currentValue = await watcherPrecompile.switchboards(chain, fastSBtype); - console.log({ current: currentValue, required: sbAddress }); + const sbAddress = addresses[chain][CORE_CONTRACTS.FastSwitchboard]; + const socketAddress = addresses[chain][CORE_CONTRACTS.Socket]; + const contractFactoryPlugAddress = + addresses[chain][EVMxCoreContracts.ContractFactoryPlug]; + const feesPlugAddress = addresses[chain][EVMxCoreContracts.FeesPlug]; - if (currentValue.toLowerCase() !== sbAddress.toLowerCase()) { + const currentValue = await watcherPrecompile.switchboards(chain, fastSBtype); + const currentSocket = await watcherPrecompile.sockets(chain); + const currentContractFactoryPlug = + await watcherPrecompile.contractFactoryPlug(chain); + const currentFeesPlug = await watcherPrecompile.feesPlug(chain); + + if ( + currentValue.toLowerCase() !== sbAddress.toLowerCase() || + currentSocket.toLowerCase() !== socketAddress.toLowerCase() || + currentContractFactoryPlug.toLowerCase() !== + contractFactoryPlugAddress.toLowerCase() || + currentFeesPlug.toLowerCase() !== feesPlugAddress.toLowerCase() + ) { const tx = await watcherPrecompile .connect(signer) - .setSwitchboard(chain, fastSBtype, sbAddress); + .setOnChainContracts( + chain, + fastSBtype, + sbAddress, + socketAddress, + contractFactoryPlugAddress, + feesPlugAddress + ); - console.log(`Setting sb for ${chain} to`, tx.hash); + console.log(`Setting onchain contracts for ${chain} to`, tx.hash); await tx.wait(); } } diff --git a/hardhat-scripts/deploy/4.connect.ts b/hardhat-scripts/deploy/4.connect.ts index afc8706c..39e553cb 100644 --- a/hardhat-scripts/deploy/4.connect.ts +++ b/hardhat-scripts/deploy/4.connect.ts @@ -8,7 +8,10 @@ import { getInstance } from "./utils"; import { chains } from "./config"; import dev_addresses from "../../deployments/dev_addresses.json"; import { EVMX_CHAIN_ID } from "../constants/constants"; -import { CORE_CONTRACTS, EVMxCoreContracts } from "../constants/protocolConstants"; +import { + CORE_CONTRACTS, + EVMxCoreContracts, +} from "../constants/protocolConstants"; const plugs = [CORE_CONTRACTS.ContractFactoryPlug, CORE_CONTRACTS.FeesPlug]; export type AppGatewayConfig = { @@ -21,9 +24,7 @@ export type AppGatewayConfig = { export const getAppGateway = (plug: string, addresses: DeploymentAddresses) => { switch (plug) { case CORE_CONTRACTS.ContractFactoryPlug: - return addresses?.[EVMX_CHAIN_ID]?.[ - EVMxCoreContracts.DeliveryHelper - ]; + return addresses?.[EVMX_CHAIN_ID]?.[EVMxCoreContracts.DeliveryHelper]; case CORE_CONTRACTS.FeesPlug: return addresses?.[EVMX_CHAIN_ID]?.[EVMxCoreContracts.FeesManager]; default: @@ -52,9 +53,9 @@ export const isConfigSetOnSocket = async ( const plugConfigRegistered = await socket.getPlugConfig(plug.address); return ( plugConfigRegistered.appGateway.toLowerCase() === - appGateway?.toLowerCase() && + appGateway?.toLowerCase() && plugConfigRegistered.switchboard__.toLowerCase() === - switchboard.toLowerCase() + switchboard.toLowerCase() ); }; diff --git a/test/SetupTest.t.sol b/test/SetupTest.t.sol index f7566fe3..ebe5a14d 100644 --- a/test/SetupTest.t.sol +++ b/test/SetupTest.t.sol @@ -82,7 +82,14 @@ contract SetupTest is Test { vm.stopPrank(); hoax(watcherEOA); - watcherPrecompile.setSwitchboard(chainSlug_, FAST, address(switchboard)); + watcherPrecompile.setOnChainContracts( + chainSlug_, + FAST, + address(switchboard), + address(socket), + address(contractFactoryPlug), + address(feesPlug) + ); return SocketContracts({ From 41b971cfea32cf9e55dab0d74fff11b315702a61 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Tue, 18 Feb 2025 21:10:48 +0400 Subject: [PATCH 065/186] feat: make limit decimal constant --- contracts/protocol/watcherPrecompile/WatcherPrecompile.sol | 2 -- .../protocol/watcherPrecompile/WatcherPrecompileLimits.sol | 6 +++--- test/MockWatcherPrecompileImpl.sol | 2 -- 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol b/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol index 02d8f720..297a2277 100644 --- a/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol +++ b/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol @@ -106,8 +106,6 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { version = 1; maxTimeoutDelayInSeconds = 24 * 60 * 60; // 24 hours - LIMIT_DECIMALS = 18; - // limit per day defaultLimit = defaultLimit_ * 10 ** LIMIT_DECIMALS; // limit per second diff --git a/contracts/protocol/watcherPrecompile/WatcherPrecompileLimits.sol b/contracts/protocol/watcherPrecompile/WatcherPrecompileLimits.sol index 76a1bd55..df8f0f54 100644 --- a/contracts/protocol/watcherPrecompile/WatcherPrecompileLimits.sol +++ b/contracts/protocol/watcherPrecompile/WatcherPrecompileLimits.sol @@ -14,13 +14,13 @@ abstract contract WatcherPrecompileLimits is Ownable, IWatcherPrecompile { + /// @notice Number of decimals used in limit calculations + uint256 public constant LIMIT_DECIMALS = 18; + /// @notice Default limit value for any app gateway uint256 public defaultLimit; /// @notice Rate at which limit replenishes per second uint256 public defaultRatePerSecond; - /// @notice Number of decimals used in limit calculations - uint256 public LIMIT_DECIMALS; - // appGateway => limitType => receivingLimitParams mapping(address => mapping(bytes32 => LimitParams)) internal _limitParams; diff --git a/test/MockWatcherPrecompileImpl.sol b/test/MockWatcherPrecompileImpl.sol index 3ed0b3cc..5e92693a 100644 --- a/test/MockWatcherPrecompileImpl.sol +++ b/test/MockWatcherPrecompileImpl.sol @@ -14,8 +14,6 @@ contract MockWatcherPrecompileImpl is WatcherPrecompile { _initializeOwner(owner_); maxTimeoutDelayInSeconds = 24 * 60 * 60; // 24 hours - LIMIT_DECIMALS = 18; - // limit per day defaultLimit = defaultLimit_ * 10 ** LIMIT_DECIMALS; // limit per second From a4bded0b861d14704181faf2799612a9b2356726 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Wed, 19 Feb 2025 11:53:47 +0400 Subject: [PATCH 066/186] fix: merge counters and update payload id --- .../watcherPrecompile/WatcherPrecompile.sol | 48 ++++++++++--------- 1 file changed, 25 insertions(+), 23 deletions(-) diff --git a/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol b/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol index 297a2277..1cdccc0e 100644 --- a/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol +++ b/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol @@ -14,15 +14,14 @@ import {TimeoutDelayTooLarge, TimeoutAlreadyResolved, InvalidInboxCaller, Resolv /// @notice Contract that handles payload verification, execution and app configurations contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { uint256 public maxTimeoutDelayInSeconds; - /// @notice Counter for tracking query requests - uint256 public queryCounter; - /// @notice Counter for tracking payload execution requests + /// @notice Counter for tracking payload requests uint256 public payloadCounter; - /// @notice Counter for tracking timeout requests - uint256 public timeoutCounter; /// @notice The expiry time for the payload uint256 public expiryTime; + /// @notice The chain slug of the watcher precompile + uint32 public vmChainSlug; + /// @notice Mapping to store async requests /// @dev payloadId => AsyncRequest struct mapping(bytes32 => AsyncRequest) public asyncRequests; @@ -99,7 +98,8 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { function initialize( address owner_, address addressResolver_, - uint256 defaultLimit_ + uint256 defaultLimit_, + uint32 vmChainSlug_ ) public reinitializer(1) { _setAddressResolver(addressResolver_); _initializeOwner(owner_); @@ -110,6 +110,8 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { defaultLimit = defaultLimit_ * 10 ** LIMIT_DECIMALS; // limit per second defaultRatePerSecond = defaultLimit / (24 * 60 * 60); + + vmChainSlug = vmChainSlug_; } // ================== Timeout functions ================== @@ -127,7 +129,7 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { // from auction manager _consumeLimit(appGateway_, SCHEDULE, 1); uint256 executeAt = block.timestamp + delayInSeconds_; - bytes32 timeoutId = _encodeTimeoutId(timeoutCounter++); + bytes32 timeoutId = _encodeWritePayloadId(vmChainSlug, address(this)); timeoutRequests[timeoutId] = TimeoutRequest( timeoutId, msg.sender, @@ -182,10 +184,9 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { ); // Generate a unique payload ID by combining chain, target, and counter - payloadId = _encodePayloadId( + payloadId = _encodeWritePayloadId( params_.payloadDetails.chainSlug, - params_.payloadDetails.target, - payloadCounter++ + params_.payloadDetails.target ); // Construct parameters for root calculation @@ -241,7 +242,7 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { // from payload delivery _consumeLimit(appGateway_, QUERY, 1); // Generate unique payload ID from query counter - payloadId = bytes32(queryCounter++); + payloadId = _encodeWritePayloadId(vmChainSlug, address(this)); // Create async request with minimal information for queries // Note: addresses set to 0 as they're not needed for queries @@ -375,30 +376,31 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { /// @notice Encodes a unique payload ID from chain slug, plug address, and counter /// @param chainSlug_ The identifier of the chain /// @param plug_ The plug address - /// @param counter_ The current counter value /// @return The encoded payload ID as bytes32 /// @dev Reverts if chainSlug is 0 - function _encodePayloadId( + function _encodeWritePayloadId( uint32 chainSlug_, - address plug_, - uint256 counter_ + address plug_ ) internal view returns (bytes32) { if (chainSlug_ == 0) revert InvalidChainSlug(); (, address switchboard) = getPlugConfigs(chainSlug_, plug_); - // Encode payload ID by bit-shifting and combining: - // chainSlug (32 bits) | switchboard address (160 bits) | counter (64 bits) + return _encodeId(chainSlug_, switchboard); + } + function _encodeId( + uint32 chainSlug_, + address switchboardOrWatcher + ) internal view returns (bytes32) { + // Encode payload ID by bit-shifting and combining: + // chainSlug (32 bits) | switchboard or watcher precompile address (160 bits) | counter (64 bits) return bytes32( - (uint256(chainSlug_) << 224) | (uint256(uint160(switchboard)) << 64) | counter_ + (uint256(chainSlug_) << 224) | + (uint256(uint160(switchboardOrWatcher)) << 64) | + payloadCounter ); } - function _encodeTimeoutId(uint256 timeoutCounter_) internal view returns (bytes32) { - // watcher address (160 bits) | counter (64 bits) - return bytes32((uint256(uint160(address(this))) << 64) | timeoutCounter_); - } - function setExpiryTime(uint256 expiryTime_) external onlyOwner { expiryTime = expiryTime_; } From cd59be67a7fbfb6487e3da9de1c32d59c26934bf Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Wed, 19 Feb 2025 15:26:16 +0400 Subject: [PATCH 067/186] fix: tests --- .../watcherPrecompile/WatcherPrecompile.sol | 17 +++++------ test/DeliveryHelper.t.sol | 30 +++++++++++-------- test/FeesTest.t.sol | 2 +- test/SetupTest.t.sol | 29 +++++++++--------- test/apps/Counter.t.sol | 6 ++-- test/apps/SuperTokenLockable.t.sol | 24 +++++++-------- 6 files changed, 54 insertions(+), 54 deletions(-) diff --git a/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol b/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol index 1cdccc0e..358b2a74 100644 --- a/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol +++ b/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol @@ -129,7 +129,7 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { // from auction manager _consumeLimit(appGateway_, SCHEDULE, 1); uint256 executeAt = block.timestamp + delayInSeconds_; - bytes32 timeoutId = _encodeWritePayloadId(vmChainSlug, address(this)); + bytes32 timeoutId = _encodeId(vmChainSlug, address(this)); timeoutRequests[timeoutId] = TimeoutRequest( timeoutId, msg.sender, @@ -242,7 +242,7 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { // from payload delivery _consumeLimit(appGateway_, QUERY, 1); // Generate unique payload ID from query counter - payloadId = _encodeWritePayloadId(vmChainSlug, address(this)); + payloadId = _encodeId(vmChainSlug, address(this)); // Create async request with minimal information for queries // Note: addresses set to 0 as they're not needed for queries @@ -378,10 +378,7 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { /// @param plug_ The plug address /// @return The encoded payload ID as bytes32 /// @dev Reverts if chainSlug is 0 - function _encodeWritePayloadId( - uint32 chainSlug_, - address plug_ - ) internal view returns (bytes32) { + function _encodeWritePayloadId(uint32 chainSlug_, address plug_) internal returns (bytes32) { if (chainSlug_ == 0) revert InvalidChainSlug(); (, address switchboard) = getPlugConfigs(chainSlug_, plug_); return _encodeId(chainSlug_, switchboard); @@ -389,15 +386,15 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { function _encodeId( uint32 chainSlug_, - address switchboardOrWatcher - ) internal view returns (bytes32) { + address switchboardOrWatcher_ + ) internal returns (bytes32) { // Encode payload ID by bit-shifting and combining: // chainSlug (32 bits) | switchboard or watcher precompile address (160 bits) | counter (64 bits) return bytes32( (uint256(chainSlug_) << 224) | - (uint256(uint160(switchboardOrWatcher)) << 64) | - payloadCounter + (uint256(uint160(switchboardOrWatcher_)) << 64) | + payloadCounter++ ); } diff --git a/test/DeliveryHelper.t.sol b/test/DeliveryHelper.t.sol index 13e27add..c2148d77 100644 --- a/test/DeliveryHelper.t.sol +++ b/test/DeliveryHelper.t.sol @@ -260,10 +260,10 @@ contract DeliveryHelperTest is SetupTest { } function bidAndEndAuction(bytes32 asyncId) internal { + // for scheduling bid expiry + payloadIdCounter++; placeBid(asyncId); - - bytes32 timeoutId = encodeTimeoutId(timeoutPayloadIdCounter++); - endAuction(timeoutId); + endAuction(); } function bidAndExecute(bytes32[] memory payloadIds, bytes32 asyncId_) internal { @@ -293,6 +293,9 @@ contract DeliveryHelperTest is SetupTest { address appGateway_ ) internal returns (bytes32 asyncId) { SocketContracts memory socketConfig = getSocketConfig(chainSlug_); + + // for scheduling auction + payloadIdCounter++; bytes32[] memory payloadIds = getWritePayloadIds( chainSlug_, address(socketConfig.switchboard), @@ -311,6 +314,7 @@ contract DeliveryHelperTest is SetupTest { IMultiChainAppDeployer appDeployer_, address appGateway_ ) internal returns (bytes32 asyncId) { + payloadIdCounter++; asyncId = getCurrentAsyncId(); bytes32[] memory payloadIds = new bytes32[](contractIds.length * chainSlugs_.length); for (uint32 i = 0; i < chainSlugs_.length; i++) { @@ -318,12 +322,12 @@ contract DeliveryHelperTest is SetupTest { payloadIds[i * contractIds.length + j] = getWritePayloadId( chainSlugs_[i], address(getSocketConfig(chainSlugs_[i]).switchboard), - i * contractIds.length + j + writePayloadIdCounter + i * contractIds.length + j + payloadIdCounter ); } } // for fees - writePayloadIdCounter += chainSlugs_.length * contractIds.length + 1; + payloadIdCounter += chainSlugs_.length * contractIds.length + 1; appDeployer_.deployMultiChainContracts(chainSlugs_); bidAndExecute(payloadIds, asyncId); @@ -375,6 +379,7 @@ contract DeliveryHelperTest is SetupTest { ) internal returns (bytes32 asyncId) { asyncId = getCurrentAsyncId(); + payloadIdCounter++; bytes32[] memory payloadIds = getWritePayloadIds( chainSlug_, address(getSocketConfig(chainSlug_).switchboard), @@ -387,18 +392,18 @@ contract DeliveryHelperTest is SetupTest { uint32[] memory chainSlugs_ ) internal returns (bytes32 asyncId) { asyncId = getCurrentAsyncId(); - + payloadIdCounter++; bidAndEndAuction(asyncId); for (uint i = 0; i < chainSlugs_.length; i++) { bytes32 payloadId = getWritePayloadId( chainSlugs_[i], address(getSocketConfig(chainSlugs_[i]).switchboard), - i + writePayloadIdCounter + i + payloadIdCounter ); finalizeAndExecute(payloadId, false); } - writePayloadIdCounter += chainSlugs_.length; + payloadIdCounter += chainSlugs_.length; } function createDeployPayloadDetail( @@ -471,10 +476,11 @@ contract DeliveryHelperTest is SetupTest { keccak256(abi.encode(address(auctionManager), vmChainSlug, asyncId, bidAmount, "")), transmitterPrivateKey ); + auctionManager.bid(asyncId, bidAmount, transmitterSignature, ""); } - function endAuction(bytes32 timeoutId) internal { + function endAuction() internal { // todo: // vm.expectEmit(true, false, false, true); // emit AuctionEnded( @@ -483,6 +489,8 @@ contract DeliveryHelperTest is SetupTest { // ); if (auctionEndDelaySeconds == 0) return; + bytes32 timeoutId = _encodeId(vmChainSlug, address(watcherPrecompile), payloadIdCounter++); + hoax(watcherEOA); watcherPrecompile.resolveTimeout(timeoutId); } @@ -658,10 +666,6 @@ contract DeliveryHelperTest is SetupTest { return bytes32((uint256(uint160(address(deliveryHelper))) << 64) | asyncCounterTest); } - function getTimeoutPayloadId(uint256 counter_) internal view returns (bytes32) { - return bytes32((uint256(uint160(address(deliveryHelper))) << 64) | counter_); - } - function getOnChainAndForwarderAddresses( uint32 chainSlug_, bytes32 contractId_, diff --git a/test/FeesTest.t.sol b/test/FeesTest.t.sol index 98035397..5db25674 100644 --- a/test/FeesTest.t.sol +++ b/test/FeesTest.t.sol @@ -68,7 +68,7 @@ contract FeesTest is DeliveryHelperTest { hoax(transmitterEOA); (bytes32 payloadId, , PayloadDetails memory payloadDetails) = feesManager .withdrawTransmitterFees(feesChainSlug, ETH_ADDRESS, address(receiver)); - writePayloadIdCounter++; + payloadIdCounter++; finalizeAndExecute(payloadId, true, payloadDetails); assertEq( diff --git a/test/SetupTest.t.sol b/test/SetupTest.t.sol index ebe5a14d..498393d3 100644 --- a/test/SetupTest.t.sol +++ b/test/SetupTest.t.sol @@ -34,10 +34,7 @@ contract SetupTest is Test { uint32 optChainSlug = 11155420; uint32 vmChainSlug = 1; - uint256 public writePayloadIdCounter = 0; - uint256 public readPayloadIdCounter = 0; - uint256 public timeoutPayloadIdCounter = 0; - + uint256 public payloadIdCounter = 0; uint256 public defaultLimit = 1000; bytes public asyncPromiseBytecode = type(AsyncPromise).creationCode; @@ -125,7 +122,8 @@ contract SetupTest is Test { WatcherPrecompile.initialize.selector, watcherEOA, address(addressResolverProxy), - defaultLimit + defaultLimit, + vmChainSlug ); vm.expectEmit(true, true, true, false); emit Initialized(version); @@ -218,10 +216,7 @@ contract SetupTest is Test { address switchboard_, uint256 counter_ ) internal pure returns (bytes32) { - return - bytes32( - (uint256(chainSlug_) << 224) | (uint256(uint160(switchboard_)) << 64) | counter_ - ); + return _encodeId(chainSlug_, switchboard_, counter_); } function getWritePayloadIds( @@ -231,15 +226,19 @@ contract SetupTest is Test { ) internal returns (bytes32[] memory) { bytes32[] memory payloadIds = new bytes32[](numPayloads); for (uint256 i = 0; i < numPayloads; i++) { - payloadIds[i] = getWritePayloadId(chainSlug_, switchboard_, i + writePayloadIdCounter); + payloadIds[i] = _encodeId(chainSlug_, switchboard_, payloadIdCounter++); } - - writePayloadIdCounter += numPayloads; return payloadIds; } - function encodeTimeoutId(uint256 timeoutCounter_) internal view returns (bytes32) { - // watcher address (160 bits) | counter (64 bits) - return bytes32((uint256(uint160(address(watcherPrecompile))) << 64) | timeoutCounter_); + function _encodeId( + uint32 chainSlug_, + address sbOrWatcher_, + uint256 counter_ + ) internal pure returns (bytes32) { + return + bytes32( + (uint256(chainSlug_) << 224) | (uint256(uint160(sbOrWatcher_)) << 64) | counter_ + ); } } diff --git a/test/apps/Counter.t.sol b/test/apps/Counter.t.sol index c35c471e..dc90d936 100644 --- a/test/apps/Counter.t.sol +++ b/test/apps/Counter.t.sol @@ -138,13 +138,13 @@ contract CounterTest is DeliveryHelperTest { instances[0] = arbCounterForwarder; instances[1] = optCounterForwarder; bytes32[] memory payloadIds = new bytes32[](3); - payloadIds[0] = bytes32(readPayloadIdCounter++); - payloadIds[1] = bytes32(readPayloadIdCounter++); + payloadIds[0] = _encodeId(vmChainSlug, address(watcherPrecompile), payloadIdCounter++); + payloadIds[1] = _encodeId(vmChainSlug, address(watcherPrecompile), payloadIdCounter++); payloadIds[2] = getWritePayloadId( arbChainSlug, address(getSocketConfig(arbChainSlug).switchboard), - writePayloadIdCounter++ + payloadIdCounter++ ); bytes32 bridgeAsyncId = getCurrentAsyncId(); diff --git a/test/apps/SuperTokenLockable.t.sol b/test/apps/SuperTokenLockable.t.sol index f832a162..77b8a735 100644 --- a/test/apps/SuperTokenLockable.t.sol +++ b/test/apps/SuperTokenLockable.t.sol @@ -282,20 +282,20 @@ contract SuperTokenLockableTest is DeliveryHelperTest { payloadIds[0] = getWritePayloadId( srcChainSlug, address(getSocketConfig(srcChainSlug).switchboard), - writePayloadIdCounter++ + payloadIdCounter++ ); - payloadIds[1] = bytes32(readPayloadIdCounter++); + payloadIds[1] = _encodeId(vmChainSlug, address(watcherPrecompile), payloadIdCounter++); payloadIds[2] = getWritePayloadId( dstChainSlug, address(getSocketConfig(dstChainSlug).switchboard), - writePayloadIdCounter++ + payloadIdCounter++ ); payloadIds[3] = getWritePayloadId( srcChainSlug, address(getSocketConfig(srcChainSlug).switchboard), - writePayloadIdCounter++ + payloadIdCounter++ ); - writePayloadIdCounter++; + payloadIdCounter++; bytes32 bridgeAsyncId = getCurrentAsyncId(); @@ -352,7 +352,7 @@ contract SuperTokenLockableTest is DeliveryHelperTest { cancelPayloadIds[0] = getWritePayloadId( srcChainSlug, address(getSocketConfig(srcChainSlug).switchboard), - writePayloadIdCounter++ + payloadIdCounter++ ); bytes32 cancelAsyncId = getCurrentAsyncId(); @@ -538,20 +538,20 @@ contract SuperTokenLockableTest is DeliveryHelperTest { // payloadIds[0] = getWritePayloadId( // srcChainSlug, // address(getSocketConfig(srcChainSlug).contractFactoryPlug), - // writePayloadIdCounter++ + // payloadIdCounter++ // ); - // payloadIds[1] = bytes32(readPayloadIdCounter++); + // payloadIds[1] = _encodeId(vmChainSlug, address(watcherPrecompile), payloadIdCounter++); // payloadIds[2] = getWritePayloadId( // dstChainSlug, // address(getSocketConfig(dstChainSlug).contractFactoryPlug), - // writePayloadIdCounter++ + // payloadIdCounter++ // ); // payloadIds[3] = getWritePayloadId( // srcChainSlug, // address(getSocketConfig(srcChainSlug).contractFactoryPlug), - // writePayloadIdCounter++ + // payloadIdCounter++ // ); - // writePayloadIdCounter++; + // payloadIdCounter++; // PayloadDetails[] // memory payloadDetails = createBridgePayloadDetailsArray( @@ -635,7 +635,7 @@ contract SuperTokenLockableTest is DeliveryHelperTest { // cancelPayloadIds[0] = getWritePayloadId( // srcChainSlug, // address(getSocketConfig(srcChainSlug).contractFactoryPlug), - // writePayloadIdCounter++ + // payloadIdCounter++ // ); // PayloadDetails[] From 08621d2121ad5226a4e48fb702f285a2de222164 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Wed, 19 Feb 2025 15:26:38 +0400 Subject: [PATCH 068/186] fix: finalise for new transmitter --- .../app-gateway/DeliveryHelper.sol | 15 ++++++--------- .../watcherPrecompile/WatcherPrecompile.sol | 8 ++++++++ 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/contracts/protocol/payload-delivery/app-gateway/DeliveryHelper.sol b/contracts/protocol/payload-delivery/app-gateway/DeliveryHelper.sol index 16e817d6..7d51d82e 100644 --- a/contracts/protocol/payload-delivery/app-gateway/DeliveryHelper.sol +++ b/contracts/protocol/payload-delivery/app-gateway/DeliveryHelper.sol @@ -36,24 +36,21 @@ contract DeliveryHelper is BatchAsync, Ownable, Initializable { bytes32 asyncId_, Bid memory winningBid_ ) external onlyAuctionManager(asyncId_) { + if (winningBid_.transmitter == address(0)) revert InvalidTransmitter(); + + bool isRestarted = _payloadBatches[asyncId_].winningBid.transmitter != address(0); _payloadBatches[asyncId_].winningBid = winningBid_; // update fees + // todo: revisit IFeesManager(addressResolver__.feesManager()).updateTransmitterFees( winningBid_, asyncId_, _payloadBatches[asyncId_].appGateway ); - if (winningBid_.transmitter != address(0)) { - // process batch - _process(asyncId_); - } else { - // todo: check if this is correct? - // cancel batch - _payloadBatches[asyncId_].isBatchCancelled = true; - emit BatchCancelled(asyncId_); - } + if (!isRestarted) return _process(asyncId_); + watcherPrecompile__().finalizeWithNewTransmitter(asyncId_, winningBid_.transmitter); } function callback(bytes memory asyncId_, bytes memory) external override onlyPromises { diff --git a/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol b/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol index 358b2a74..893a714d 100644 --- a/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol +++ b/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol @@ -225,6 +225,14 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { emit FinalizeRequested(payloadId, asyncRequest); } + function finalizeWithNewTransmitter(bytes32 payloadId_, address newTransmitter_) external { + if (msg.sender != addressResolver__.deliveryHelper()) revert NotDeliveryHelper(); + + AsyncRequest storage asyncRequest = asyncRequests[payloadId_]; + asyncRequest.transmitter = newTransmitter_; + emit FinalizeRequested(payloadId_, asyncRequest); + } + // ================== Query functions ================== /// @notice Creates a new query request /// @param chainSlug_ The identifier of the destination chain From cd6e086cf0fd0bec24fd6bfd5d1f08ffffe5030b Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Wed, 19 Feb 2025 15:36:41 +0400 Subject: [PATCH 069/186] fix: add watcher sig comment --- .../protocol/watcherPrecompile/WatcherPrecompile.sol | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol b/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol index 893a714d..cbe5c6cc 100644 --- a/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol +++ b/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol @@ -44,6 +44,8 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { error InvalidConnection(); /// @notice Error thrown if winning bid is assigned to an invalid transmitter error InvalidTransmitter(); + /// @notice Error thrown when a timeout request is invalid + error InvalidTimeoutRequest(); event CalledAppGateway( bytes32 callId, @@ -147,12 +149,17 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { /// @dev Only callable by the contract owner function resolveTimeout(bytes32 timeoutId_) external onlyOwner { TimeoutRequest storage timeoutRequest_ = timeoutRequests[timeoutId_]; + if (timeoutRequest_.target == address(0)) revert InvalidTimeoutRequest(); + if (timeoutRequest_.isResolved) revert TimeoutAlreadyResolved(); if (block.timestamp < timeoutRequest_.executeAt) revert ResolvingTimeoutTooEarly(); + (bool success, ) = address(timeoutRequest_.target).call(timeoutRequest_.payload); if (!success) revert CallFailed(); + timeoutRequest_.isResolved = true; timeoutRequest_.executedAt = block.timestamp; + emit TimeoutResolved( timeoutId_, timeoutRequest_.target, @@ -273,6 +280,8 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { /// @param payloadId_ The unique identifier of the request /// @param signature_ The watcher's signature /// @dev Only callable by the contract owner + /// @dev Watcher signs on following digest for validation on switchboard: + /// @dev keccak256(abi.encode(switchboard, root)) function finalized(bytes32 payloadId_, bytes calldata signature_) external onlyOwner { watcherSignatures[payloadId_] = signature_; emit Finalized(payloadId_, asyncRequests[payloadId_], signature_); From df8ca6083fb977f25e2cd64742df26dae4cfd2f2 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Wed, 19 Feb 2025 15:57:04 +0400 Subject: [PATCH 070/186] fix: build --- contracts/interfaces/IWatcherPrecompile.sol | 5 +++++ .../payload-delivery/app-gateway/BatchAsync.sol | 6 +----- .../payload-delivery/app-gateway/DeliveryHelper.sol | 2 +- contracts/protocol/utils/common/Errors.sol | 1 + lib.tsconfig.json | 11 +++++++++-- 5 files changed, 17 insertions(+), 8 deletions(-) diff --git a/contracts/interfaces/IWatcherPrecompile.sol b/contracts/interfaces/IWatcherPrecompile.sol index 1a16d9f0..5b87a422 100644 --- a/contracts/interfaces/IWatcherPrecompile.sol +++ b/contracts/interfaces/IWatcherPrecompile.sol @@ -61,6 +61,11 @@ interface IWatcherPrecompile { /// @param signature_ The watcher's signature function finalized(bytes32 payloadId_, bytes calldata signature_) external; + /// @notice Finalizes a payload execution request with a new transmitter + /// @param payloadId_ The unique identifier of the request + /// @param newTransmitter_ The new transmitter address + function finalizeWithNewTransmitter(bytes32 payloadId_, address newTransmitter_) external; + /// @notice Resolves multiple promises with their return data /// @param resolvedPromises_ Array of resolved promises and their return data function resolvePromises(ResolvedPromises[] calldata resolvedPromises_) external; diff --git a/contracts/protocol/payload-delivery/app-gateway/BatchAsync.sol b/contracts/protocol/payload-delivery/app-gateway/BatchAsync.sol index 43df85ae..9f5f894a 100644 --- a/contracts/protocol/payload-delivery/app-gateway/BatchAsync.sol +++ b/contracts/protocol/payload-delivery/app-gateway/BatchAsync.sol @@ -184,7 +184,6 @@ abstract contract BatchAsync is QueueAsync { if (payloadDetails_[i].callType == CallType.DEPLOY) { // contract factory plug deploys new contracts payloadDetails_[i].target = getDeliveryHelperPlugAddress( - address(this), payloadDetails_[i].chainSlug ); writes++; @@ -277,10 +276,7 @@ abstract contract BatchAsync is QueueAsync { /// @notice Gets the payload delivery plug address /// @param chainSlug_ The chain identifier /// @return address The address of the payload delivery plug - function getDeliveryHelperPlugAddress( - address appGateway_, - uint32 chainSlug_ - ) public view returns (address) { + function getDeliveryHelperPlugAddress(uint32 chainSlug_) public view returns (address) { return watcherPrecompile__().contractFactoryPlug(chainSlug_); } diff --git a/contracts/protocol/payload-delivery/app-gateway/DeliveryHelper.sol b/contracts/protocol/payload-delivery/app-gateway/DeliveryHelper.sol index 7d51d82e..121188e6 100644 --- a/contracts/protocol/payload-delivery/app-gateway/DeliveryHelper.sol +++ b/contracts/protocol/payload-delivery/app-gateway/DeliveryHelper.sol @@ -7,7 +7,7 @@ import "solady/utils/Initializable.sol"; import {IAppGateway} from "../../../interfaces/IAppGateway.sol"; import {Bid, PayloadBatch, Fees, PayloadDetails, FinalizeParams} from "../../../protocol/utils/common/Structs.sol"; import {DISTRIBUTE_FEE, DEPLOY} from "../../../protocol/utils/common/Constants.sol"; -import {PromisesNotResolved} from "../../../protocol/utils/common/Errors.sol"; +import {PromisesNotResolved, InvalidTransmitter} from "../../../protocol/utils/common/Errors.sol"; import "./BatchAsync.sol"; contract DeliveryHelper is BatchAsync, Ownable, Initializable { diff --git a/contracts/protocol/utils/common/Errors.sol b/contracts/protocol/utils/common/Errors.sol index 54724da0..6f27694d 100644 --- a/contracts/protocol/utils/common/Errors.sol +++ b/contracts/protocol/utils/common/Errors.sol @@ -26,4 +26,5 @@ error InvalidInboxCaller(); error PromisesNotResolved(); error InvalidPromise(); error InvalidIndex(); +error InvalidTransmitter(); error FeesNotSet(); diff --git a/lib.tsconfig.json b/lib.tsconfig.json index c918562d..93818439 100644 --- a/lib.tsconfig.json +++ b/lib.tsconfig.json @@ -6,7 +6,14 @@ "esModuleInterop": true, "declaration": true, "resolveJsonModule": true, - "skipLibCheck": true + "skipLibCheck": true, + "moduleResolution": "node", + "allowJs": true }, - "include": ["./src", "./deployments"] + "include": [ + "src/**/*.ts", + "lib/**/*.ts", + "deployments/" + ], + "exclude": ["node_modules", "dist"] } From c95ae7269cf2cd6e69e0b576c6251cf8625b6be3 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Wed, 19 Feb 2025 19:11:27 +0400 Subject: [PATCH 071/186] fix: refinalise all payload ids --- contracts/interfaces/IWatcherPrecompile.sol | 10 +-- contracts/mock/MockWatcherPrecompile.sol | 2 + .../app-gateway/AuctionManager.sol | 8 ++- .../app-gateway/BatchAsync.sol | 1 + .../app-gateway/DeliveryHelper.sol | 24 +++++++- .../app-gateway/FeesManager.sol | 5 +- contracts/protocol/utils/common/Structs.sol | 3 + .../watcherPrecompile/WatcherPrecompile.sol | 61 ++++++++++++------- test/apps/SuperTokenLockable.t.sol | 2 + 9 files changed, 82 insertions(+), 34 deletions(-) diff --git a/contracts/interfaces/IWatcherPrecompile.sol b/contracts/interfaces/IWatcherPrecompile.sol index 5b87a422..926c6507 100644 --- a/contracts/interfaces/IWatcherPrecompile.sol +++ b/contracts/interfaces/IWatcherPrecompile.sol @@ -38,8 +38,8 @@ interface IWatcherPrecompile { /// @return payloadId The unique identifier for the request /// @return root The merkle root of the payload parameters function finalize( - FinalizeParams memory params_, - address originAppGateway_ + address originAppGateway_, + FinalizeParams memory params_ ) external returns (bytes32 payloadId, bytes32 root); /// @notice Creates a new query request @@ -61,10 +61,10 @@ interface IWatcherPrecompile { /// @param signature_ The watcher's signature function finalized(bytes32 payloadId_, bytes calldata signature_) external; - /// @notice Finalizes a payload execution request with a new transmitter + /// @notice Finalizes multiple payload execution requests with a new transmitter /// @param payloadId_ The unique identifier of the request - /// @param newTransmitter_ The new transmitter address - function finalizeWithNewTransmitter(bytes32 payloadId_, address newTransmitter_) external; + /// @param params_ The parameters for finalization + function refinalize(bytes32 payloadId_, FinalizeParams memory params_) external; /// @notice Resolves multiple promises with their return data /// @param resolvedPromises_ Array of resolved promises and their return data diff --git a/contracts/mock/MockWatcherPrecompile.sol b/contracts/mock/MockWatcherPrecompile.sol index 09dd8781..aa1ad265 100644 --- a/contracts/mock/MockWatcherPrecompile.sol +++ b/contracts/mock/MockWatcherPrecompile.sol @@ -138,11 +138,13 @@ contract MockWatcherPrecompile { emit FinalizeRequested( payloadId, AsyncRequest( + msg.sender, address(0), address(0), params_.payloadDetails.target, address(0), 0, + block.timestamp + 1000, params_.asyncId, bytes32(0), bytes(""), diff --git a/contracts/protocol/payload-delivery/app-gateway/AuctionManager.sol b/contracts/protocol/payload-delivery/app-gateway/AuctionManager.sol index 76a8c2ce..fb7dfdec 100644 --- a/contracts/protocol/payload-delivery/app-gateway/AuctionManager.sol +++ b/contracts/protocol/payload-delivery/app-gateway/AuctionManager.sol @@ -33,6 +33,8 @@ contract AuctionManager is AddressResolverUtil, Ownable, IAuctionManager, Initia /// @notice Error thrown if a lower bid already exists error LowerBidAlreadyExists(); + event AuctionRestarted(bytes32 asyncId); + constructor() { _disableInitializers(); // disable for implementation } @@ -149,8 +151,6 @@ contract AuctionManager is AddressResolverUtil, Ownable, IAuctionManager, Initia asyncId_, winningBid ); - - // todo: add scheduler for a time to retry auction } function expireBid(bytes32 asyncId_) external onlyWatcherPrecompile { @@ -158,11 +158,13 @@ contract AuctionManager is AddressResolverUtil, Ownable, IAuctionManager, Initia .payloadBatches(asyncId_); // if executed, bid is not expired // todo: should be less than total payloads in batch or zero? - if (batch.totalPayloadsRemaining == 0) return; + if (batch.totalPayloadsRemaining == 0 || batch.isBatchCancelled) return; IFeesManager(addressResolver__.feesManager()).unblockFees(asyncId_, batch.appGateway); winningBids[asyncId_] = Bid({fee: 0, transmitter: address(0), extraData: ""}); auctionClosed[asyncId_] = false; + + emit AuctionRestarted(asyncId_); } function _recoverSigner( diff --git a/contracts/protocol/payload-delivery/app-gateway/BatchAsync.sol b/contracts/protocol/payload-delivery/app-gateway/BatchAsync.sol index 9f5f894a..43a34ddd 100644 --- a/contracts/protocol/payload-delivery/app-gateway/BatchAsync.sol +++ b/contracts/protocol/payload-delivery/app-gateway/BatchAsync.sol @@ -225,6 +225,7 @@ abstract contract BatchAsync is QueueAsync { isBatchCancelled: false, totalPayloadsRemaining: _payloadBatches[asyncId].totalPayloadsRemaining, lastBatchPromises: _payloadBatches[asyncId].lastBatchPromises, + lastBatchOfPayloads: new bytes32[](0), onCompleteData: onCompleteData_ }); diff --git a/contracts/protocol/payload-delivery/app-gateway/DeliveryHelper.sol b/contracts/protocol/payload-delivery/app-gateway/DeliveryHelper.sol index 121188e6..b0f39eb1 100644 --- a/contracts/protocol/payload-delivery/app-gateway/DeliveryHelper.sol +++ b/contracts/protocol/payload-delivery/app-gateway/DeliveryHelper.sol @@ -14,6 +14,8 @@ contract DeliveryHelper is BatchAsync, Ownable, Initializable { event CallBackReverted(bytes32 asyncId_, bytes32 payloadId_); uint64 public version; + bytes32[] public tempPayloadIds; + constructor() { _disableInitializers(); // disable for implementation } @@ -50,7 +52,19 @@ contract DeliveryHelper is BatchAsync, Ownable, Initializable { ); if (!isRestarted) return _process(asyncId_); - watcherPrecompile__().finalizeWithNewTransmitter(asyncId_, winningBid_.transmitter); + + // Refinalize all payloads in the batch if a new transmitter is assigned + bytes32[] memory payloadIds = _payloadBatches[asyncId_].lastBatchOfPayloads; + for (uint256 i = 0; i < payloadIds.length; i++) { + watcherPrecompile__().refinalize( + payloadIds[i], + FinalizeParams({ + payloadDetails: payloadIdToPayloadDetails[payloadIds[i]], + asyncId: asyncId_, + transmitter: winningBid_.transmitter + }) + ); + } } function callback(bytes memory asyncId_, bytes memory) external override onlyPromises { @@ -76,8 +90,11 @@ contract DeliveryHelper is BatchAsync, Ownable, Initializable { } if (payloadBatch.totalPayloadsRemaining > 0) { + delete tempPayloadIds; + // Proceed with next payload only if all promises are resolved _finalizeNextPayload(asyncId_); + payloadBatch.lastBatchOfPayloads = tempPayloadIds; } else { _finishBatch(asyncId_, payloadBatch); } @@ -153,11 +170,12 @@ contract DeliveryHelper is BatchAsync, Ownable, Initializable { transmitter: payloadBatch_.winningBid.transmitter }); (payloadId, root) = watcherPrecompile__().finalize( - finalizeParams, - payloadBatch_.appGateway + payloadBatch_.appGateway, + finalizeParams ); } + tempPayloadIds.push(payloadId); payloadIdToBatchHash[payloadId] = asyncId_; payloadIdToPayloadDetails[payloadId] = payloadDetails_; diff --git a/contracts/protocol/payload-delivery/app-gateway/FeesManager.sol b/contracts/protocol/payload-delivery/app-gateway/FeesManager.sol index 9ec14290..4b61d83d 100644 --- a/contracts/protocol/payload-delivery/app-gateway/FeesManager.sol +++ b/contracts/protocol/payload-delivery/app-gateway/FeesManager.sol @@ -283,7 +283,10 @@ contract FeesManager is IFeesManager, AddressResolverUtil, Ownable, Initializabl transmitter: transmitter }); - (payloadId, root) = watcherPrecompile__().finalize(finalizeParams, address(this)); + (payloadId, root) = watcherPrecompile__().finalize( + address(this), + finalizeParams + ); } function _createPayloadDetails( diff --git a/contracts/protocol/utils/common/Structs.sol b/contracts/protocol/utils/common/Structs.sol index cfb05a6b..61522a1e 100644 --- a/contracts/protocol/utils/common/Structs.sol +++ b/contracts/protocol/utils/common/Structs.sol @@ -26,11 +26,13 @@ struct AppGatewayConfig { } struct AsyncRequest { + address finalizedBy; address appGateway; address transmitter; address target; address switchboard; uint256 executionGasLimit; + uint256 expiryTime; bytes32 asyncId; bytes32 root; bytes payload; @@ -107,6 +109,7 @@ struct PayloadBatch { Fees fees; Bid winningBid; address[] lastBatchPromises; + bytes32[] lastBatchOfPayloads; bytes onCompleteData; } diff --git a/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol b/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol index cbe5c6cc..420585d7 100644 --- a/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol +++ b/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol @@ -46,6 +46,10 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { error InvalidTransmitter(); /// @notice Error thrown when a timeout request is invalid error InvalidTimeoutRequest(); + /// @notice Error thrown when a payload id is invalid + error InvalidPayloadId(); + /// @notice Error thrown when a caller is invalid + error InvalidCaller(); event CalledAppGateway( bytes32 callId, @@ -149,8 +153,8 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { /// @dev Only callable by the contract owner function resolveTimeout(bytes32 timeoutId_) external onlyOwner { TimeoutRequest storage timeoutRequest_ = timeoutRequests[timeoutId_]; - if (timeoutRequest_.target == address(0)) revert InvalidTimeoutRequest(); + if (timeoutRequest_.target == address(0)) revert InvalidTimeoutRequest(); if (timeoutRequest_.isResolved) revert TimeoutAlreadyResolved(); if (block.timestamp < timeoutRequest_.executeAt) revert ResolvingTimeoutTooEarly(); @@ -175,9 +179,30 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { /// @return payloadId The unique identifier for the finalized request /// @return root The merkle root of the payload parameters function finalize( - FinalizeParams memory params_, - address originAppGateway_ + address originAppGateway_, + FinalizeParams memory params_ ) external returns (bytes32 payloadId, bytes32 root) { + // Generate a unique payload ID by combining chain, target, and counter + payloadId = _encodeWritePayloadId( + params_.payloadDetails.chainSlug, + params_.payloadDetails.target + ); + + root = _finalize(payloadId, originAppGateway_, params_); + } + + function refinalize(bytes32 payloadId_, FinalizeParams memory params_) external { + if (asyncRequests[payloadId_].appGateway == address(0)) revert InvalidPayloadId(); + if (asyncRequests[payloadId_].finalizedBy != msg.sender) revert InvalidCaller(); + + _finalize(payloadId_, asyncRequests[payloadId_].appGateway, params_); + } + + function _finalize( + bytes32 payloadId_, + address originAppGateway_, + FinalizeParams memory params_ + ) internal returns (bytes32 root) { if (params_.transmitter == address(0)) revert InvalidTransmitter(); // The app gateway is the caller of this function @@ -190,8 +215,8 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { params_.payloadDetails.appGateway ); - // Generate a unique payload ID by combining chain, target, and counter - payloadId = _encodeWritePayloadId( + // Get the switchboard address from plug configurations + (, address switchboard) = getPlugConfigs( params_.payloadDetails.chainSlug, params_.payloadDetails.target ); @@ -201,42 +226,30 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { params_.payloadDetails.appGateway, params_.transmitter, params_.payloadDetails.target, - payloadId, + payloadId_, params_.payloadDetails.executionGasLimit, - expiryTime, + block.timestamp + expiryTime, params_.payloadDetails.payload ); // Calculate merkle root from payload parameters root = getRoot(rootParams_); - // Get the switchboard address from plug configurations - (, address switchboard) = getPlugConfigs( - params_.payloadDetails.chainSlug, - params_.payloadDetails.target - ); - // Create and store the async request with all necessary details AsyncRequest memory asyncRequest = AsyncRequest( + msg.sender, params_.payloadDetails.appGateway, params_.transmitter, params_.payloadDetails.target, switchboard, params_.payloadDetails.executionGasLimit, + block.timestamp + expiryTime, params_.asyncId, root, params_.payloadDetails.payload, params_.payloadDetails.next ); - asyncRequests[payloadId] = asyncRequest; - emit FinalizeRequested(payloadId, asyncRequest); - } - - function finalizeWithNewTransmitter(bytes32 payloadId_, address newTransmitter_) external { - if (msg.sender != addressResolver__.deliveryHelper()) revert NotDeliveryHelper(); - - AsyncRequest storage asyncRequest = asyncRequests[payloadId_]; - asyncRequest.transmitter = newTransmitter_; + asyncRequests[payloadId_] = asyncRequest; emit FinalizeRequested(payloadId_, asyncRequest); } @@ -262,11 +275,13 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { // Create async request with minimal information for queries // Note: addresses set to 0 as they're not needed for queries AsyncRequest memory asyncRequest_ = AsyncRequest( + msg.sender, address(0), address(0), targetAddress_, address(0), 0, + block.timestamp + expiryTime, bytes32(0), bytes32(0), payload_, @@ -326,6 +341,8 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { asyncRequest_.transmitter, asyncRequest_.appGateway ); + + // batch.isBatchCancelled } } diff --git a/test/apps/SuperTokenLockable.t.sol b/test/apps/SuperTokenLockable.t.sol index 77b8a735..290a72ef 100644 --- a/test/apps/SuperTokenLockable.t.sol +++ b/test/apps/SuperTokenLockable.t.sol @@ -319,11 +319,13 @@ contract SuperTokenLockableTest is DeliveryHelperTest { emit FinalizeRequested( payloadIds[2], AsyncRequest( + address(deliveryHelper), address(0), transmitterEOA, payloadDetails.target, address(0), payloadDetails.executionGasLimit, + 0, bridgeAsyncId, bytes32(0), payloadDetails.payload, From 07f703b4bb50a4e7beaf26a618c44bf270e4259b Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Wed, 19 Feb 2025 19:12:12 +0400 Subject: [PATCH 072/186] fix: lint --- .../protocol/payload-delivery/app-gateway/FeesManager.sol | 5 +---- lib.tsconfig.json | 6 +----- 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/contracts/protocol/payload-delivery/app-gateway/FeesManager.sol b/contracts/protocol/payload-delivery/app-gateway/FeesManager.sol index 4b61d83d..e9c833d7 100644 --- a/contracts/protocol/payload-delivery/app-gateway/FeesManager.sol +++ b/contracts/protocol/payload-delivery/app-gateway/FeesManager.sol @@ -283,10 +283,7 @@ contract FeesManager is IFeesManager, AddressResolverUtil, Ownable, Initializabl transmitter: transmitter }); - (payloadId, root) = watcherPrecompile__().finalize( - address(this), - finalizeParams - ); + (payloadId, root) = watcherPrecompile__().finalize(address(this), finalizeParams); } function _createPayloadDetails( diff --git a/lib.tsconfig.json b/lib.tsconfig.json index 93818439..ba2f6b86 100644 --- a/lib.tsconfig.json +++ b/lib.tsconfig.json @@ -10,10 +10,6 @@ "moduleResolution": "node", "allowJs": true }, - "include": [ - "src/**/*.ts", - "lib/**/*.ts", - "deployments/" - ], + "include": ["src/**/*.ts", "lib/**/*.ts", "deployments/"], "exclude": ["node_modules", "dist"] } From c89f472412f67ec61bba84d454c602f80ce24542 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Wed, 19 Feb 2025 19:15:06 +0400 Subject: [PATCH 073/186] rename: socket base to utils --- Errors.md | 2 +- contracts/mock/MockSocket.sol | 2 +- contracts/protocol/socket/Socket.sol | 8 ++++---- .../protocol/socket/{SocketBase.sol => SocketUtils.sol} | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) rename contracts/protocol/socket/{SocketBase.sol => SocketUtils.sol} (98%) diff --git a/Errors.md b/Errors.md index 93712470..08b69fd0 100644 --- a/Errors.md +++ b/Errors.md @@ -134,7 +134,7 @@ | `InvalidSlug()` | `0x290a8315` | | `ExecutionFailed()` | `0xacfdb444` | -## socket/SocketBase.sol +## socket/SocketUtils.sol | Error | Signature | | ---------------------- | ------------ | diff --git a/contracts/mock/MockSocket.sol b/contracts/mock/MockSocket.sol index bff6dc6d..d3df9342 100644 --- a/contracts/mock/MockSocket.sol +++ b/contracts/mock/MockSocket.sol @@ -8,7 +8,7 @@ import "../interfaces/ISocket.sol"; /** * @title SocketDst - * @dev SocketDst is an abstract contract that inherits from SocketBase and + * @dev SocketDst is an abstract contract that inherits from SocketUtils and * provides functionality for payload execution, verification. * It manages the mapping of payload execution status * timestamps diff --git a/contracts/protocol/socket/Socket.sol b/contracts/protocol/socket/Socket.sol index 7102c533..7f28fd21 100644 --- a/contracts/protocol/socket/Socket.sol +++ b/contracts/protocol/socket/Socket.sol @@ -2,18 +2,18 @@ pragma solidity ^0.8.21; import "../../interfaces/IPlug.sol"; -import "./SocketBase.sol"; +import "./SocketUtils.sol"; import {PlugDisconnected, InvalidAppGateway} from "../utils/common/Errors.sol"; /** * @title SocketDst - * @dev SocketDst is an abstract contract that inherits from SocketBase and + * @dev SocketDst is an abstract contract that inherits from SocketUtils and * provides functionality for payload execution, verification. * It manages the mapping of payload execution status * timestamps * It also includes functions for payload execution and verification */ -contract Socket is SocketBase { +contract Socket is SocketUtils { //////////////////////////////////////////////////////// ////////////////////// ERRORS ////////////////////////// //////////////////////////////////////////////////////// @@ -56,7 +56,7 @@ contract Socket is SocketBase { uint32 chainSlug_, address owner_, string memory version_ - ) SocketBase(chainSlug_, owner_, version_) {} + ) SocketUtils(chainSlug_, owner_, version_) {} //////////////////////////////////////////////////////// ////////////////////// OPERATIONS ////////////////////////// diff --git a/contracts/protocol/socket/SocketBase.sol b/contracts/protocol/socket/SocketUtils.sol similarity index 98% rename from contracts/protocol/socket/SocketBase.sol rename to contracts/protocol/socket/SocketUtils.sol index 7bc97d69..e526322e 100644 --- a/contracts/protocol/socket/SocketBase.sol +++ b/contracts/protocol/socket/SocketUtils.sol @@ -6,11 +6,11 @@ import "./SocketConfig.sol"; import {ECDSA} from "solady/utils/ECDSA.sol"; /** - * @title SocketBase + * @title SocketUtils * @notice A contract that is responsible for common storage for src and dest contracts, governance * setters and inherits SocketConfig */ -abstract contract SocketBase is SocketConfig { +abstract contract SocketUtils is SocketConfig { // Version string for this socket instance bytes32 public immutable version; // ChainSlug for this deployed socket instance From 9e4f27cd9cb66fa222c1ca910e701129f8912a4c Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Wed, 19 Feb 2025 19:31:32 +0400 Subject: [PATCH 074/186] feat: support msg value --- contracts/base/AppDeployerBase.sol | 1 + contracts/interfaces/IDeliveryHelper.sol | 1 + contracts/protocol/Forwarder.sol | 1 + .../protocol/payload-delivery/app-gateway/FeesManager.sol | 1 + .../protocol/payload-delivery/app-gateway/QueueAsync.sol | 3 +++ contracts/protocol/socket/Socket.sol | 4 ++-- contracts/protocol/socket/SocketUtils.sol | 4 +++- contracts/protocol/utils/common/Structs.sol | 3 +++ contracts/protocol/watcherPrecompile/WatcherPrecompile.sol | 2 ++ script/mock/FinalizeAndExecution.s.sol | 1 + test/DeliveryHelper.t.sol | 2 ++ 11 files changed, 20 insertions(+), 3 deletions(-) diff --git a/contracts/base/AppDeployerBase.sol b/contracts/base/AppDeployerBase.sol index 84d092b0..cca54166 100644 --- a/contracts/base/AppDeployerBase.sol +++ b/contracts/base/AppDeployerBase.sol @@ -36,6 +36,7 @@ abstract contract AppDeployerBase is AppGatewayBase, IAppDeployer { chainSlug_, address(0), asyncPromise, + 0, CallType.DEPLOY, creationCodeWithArgs[contractId_] ); diff --git a/contracts/interfaces/IDeliveryHelper.sol b/contracts/interfaces/IDeliveryHelper.sol index 88873f5b..03bf2d53 100644 --- a/contracts/interfaces/IDeliveryHelper.sol +++ b/contracts/interfaces/IDeliveryHelper.sol @@ -24,6 +24,7 @@ interface IDeliveryHelper { uint32 chainSlug_, address target_, address asyncPromise_, + uint256 value_, CallType callType_, bytes memory payload_ ) external; diff --git a/contracts/protocol/Forwarder.sol b/contracts/protocol/Forwarder.sol index 54c7d64e..0c035ec5 100644 --- a/contracts/protocol/Forwarder.sol +++ b/contracts/protocol/Forwarder.sol @@ -90,6 +90,7 @@ contract Forwarder is IForwarder, Initializable { chainSlug, onChainAddress, latestAsyncPromise, + 0, isReadCall == Read.ON ? CallType.READ : CallType.WRITE, msg.data ); diff --git a/contracts/protocol/payload-delivery/app-gateway/FeesManager.sol b/contracts/protocol/payload-delivery/app-gateway/FeesManager.sol index e9c833d7..ef9ba401 100644 --- a/contracts/protocol/payload-delivery/app-gateway/FeesManager.sol +++ b/contracts/protocol/payload-delivery/app-gateway/FeesManager.sol @@ -298,6 +298,7 @@ contract FeesManager is IFeesManager, AddressResolverUtil, Ownable, Initializabl target: _getFeesPlugAddress(chainSlug_), payload: payload_, callType: callType_, + value: 0, executionGasLimit: 1000000, next: new address[](2), isParallel: Parallel.OFF diff --git a/contracts/protocol/payload-delivery/app-gateway/QueueAsync.sol b/contracts/protocol/payload-delivery/app-gateway/QueueAsync.sol index 7fea4890..03b7bdaf 100644 --- a/contracts/protocol/payload-delivery/app-gateway/QueueAsync.sol +++ b/contracts/protocol/payload-delivery/app-gateway/QueueAsync.sol @@ -69,6 +69,7 @@ abstract contract QueueAsync is AddressResolverUtil, IDeliveryHelper { uint32 chainSlug_, address target_, address asyncPromise_, + uint256 value_, CallType callType_, bytes memory payload_ ) external { @@ -80,6 +81,7 @@ abstract contract QueueAsync is AddressResolverUtil, IDeliveryHelper { chainSlug: chainSlug_, target: target_, payload: payload_, + value: value_, gasLimit: 10000000, isParallel: isParallel_ }) @@ -143,6 +145,7 @@ abstract contract QueueAsync is AddressResolverUtil, IDeliveryHelper { appGateway: appGateway_, chainSlug: params_.chainSlug, target: params_.target, + value: params_.value, payload: payload_, callType: params_.callType, executionGasLimit: params_.gasLimit == 0 ? 1_000_000 : params_.gasLimit, diff --git a/contracts/protocol/socket/Socket.sol b/contracts/protocol/socket/Socket.sol index 7f28fd21..f74c4832 100644 --- a/contracts/protocol/socket/Socket.sol +++ b/contracts/protocol/socket/Socket.sol @@ -61,7 +61,6 @@ contract Socket is SocketUtils { //////////////////////////////////////////////////////// ////////////////////// OPERATIONS ////////////////////////// //////////////////////////////////////////////////////// - /** * @notice To send message to a connected remote chain. Should only be called by a plug. * @param payload bytes to be delivered to the Plug on the siblingChainSlug_ @@ -126,7 +125,8 @@ contract Socket is SocketUtils { transmitter, target_, executionGasLimit_, - payload_ + payload_, + msg.value ); // verify payload was part of the packet and diff --git a/contracts/protocol/socket/SocketUtils.sol b/contracts/protocol/socket/SocketUtils.sol index e526322e..a7081cab 100644 --- a/contracts/protocol/socket/SocketUtils.sol +++ b/contracts/protocol/socket/SocketUtils.sol @@ -53,7 +53,8 @@ abstract contract SocketUtils is SocketConfig { address transmitter_, address target_, uint256 executionGasLimit_, - bytes memory payload_ + bytes memory payload_, + uint256 value_ ) internal pure returns (bytes32) { return keccak256( @@ -62,6 +63,7 @@ abstract contract SocketUtils is SocketConfig { appGateway_, transmitter_, target_, + value_, executionGasLimit_, payload_ ) diff --git a/contracts/protocol/utils/common/Structs.sol b/contracts/protocol/utils/common/Structs.sol index 61522a1e..d7fe435b 100644 --- a/contracts/protocol/utils/common/Structs.sol +++ b/contracts/protocol/utils/common/Structs.sol @@ -61,6 +61,7 @@ struct CallParams { CallType callType; Parallel isParallel; uint256 gasLimit; + uint256 value; bytes payload; } @@ -119,6 +120,7 @@ struct PayloadDetails { uint32 chainSlug; Parallel isParallel; CallType callType; + uint256 value; uint256 executionGasLimit; bytes payload; address[] next; @@ -129,6 +131,7 @@ struct PayloadRootParams { address transmitter; address target; bytes32 payloadId; + uint256 value; uint256 executionGasLimit; uint256 expiryTime; bytes payload; diff --git a/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol b/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol index 420585d7..b81912aa 100644 --- a/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol +++ b/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol @@ -227,6 +227,7 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { params_.transmitter, params_.payloadDetails.target, payloadId_, + params_.payloadDetails.value, params_.payloadDetails.executionGasLimit, block.timestamp + expiryTime, params_.payloadDetails.payload @@ -356,6 +357,7 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { params_.appGateway, params_.transmitter, params_.target, + params_.value, params_.executionGasLimit, params_.payload ) diff --git a/script/mock/FinalizeAndExecution.s.sol b/script/mock/FinalizeAndExecution.s.sol index 3de980a6..7c8642db 100644 --- a/script/mock/FinalizeAndExecution.s.sol +++ b/script/mock/FinalizeAndExecution.s.sol @@ -28,6 +28,7 @@ contract InboxTest is Script { ), callType: CallType.WRITE, executionGasLimit: 1000000, + value: 0, next: new address[](0), isParallel: Parallel.OFF }); diff --git a/test/DeliveryHelper.t.sol b/test/DeliveryHelper.t.sol index c2148d77..8e773ebb 100644 --- a/test/DeliveryHelper.t.sol +++ b/test/DeliveryHelper.t.sol @@ -457,6 +457,7 @@ contract DeliveryHelperTest is SetupTest { payload: payload_, callType: callType_, executionGasLimit: executionGasLimit_, + value: 0, next: next_, isParallel: Parallel.ON }); @@ -506,6 +507,7 @@ contract DeliveryHelperTest is SetupTest { transmitterEOA, payloadDetails.target, payloadId, + payloadDetails.value, payloadDetails.executionGasLimit, block.timestamp + 1000, payloadDetails.payload From 9c4fec82ee2f043c0eee594eff663059556afaac Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Wed, 19 Feb 2025 19:33:43 +0400 Subject: [PATCH 075/186] feat: function to disable switchboard --- contracts/protocol/socket/SocketConfig.sol | 27 +++++++++++++++++---- hardhat-scripts/deploy/3.upgradeManagers.ts | 2 +- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/contracts/protocol/socket/SocketConfig.sol b/contracts/protocol/socket/SocketConfig.sol index 50a56f35..4ff8a904 100644 --- a/contracts/protocol/socket/SocketConfig.sol +++ b/contracts/protocol/socket/SocketConfig.sol @@ -4,7 +4,7 @@ pragma solidity ^0.8.21; import "../../interfaces/ISocket.sol"; import "../../interfaces/ISwitchboard.sol"; import "../utils/AccessControl.sol"; -import {RESCUE_ROLE} from "../utils/common/AccessRoles.sol"; +import {GOVERNANCE_ROLE, RESCUE_ROLE} from "../utils/common/AccessRoles.sol"; /** * @title SocketConfig @@ -23,8 +23,14 @@ abstract contract SocketConfig is ISocket, AccessControl { ISwitchboard switchboard__; } + enum SwitchboardStatus { + NOT_REGISTERED, + REGISTERED, + DISABLED + } + // Error triggered when a switchboard already exists - mapping(address => bool) public isValidSwitchboard; + mapping(address => SwitchboardStatus) public isValidSwitchboard; // plug => (appGateway, switchboard__) mapping(address => PlugConfig) internal _plugConfigs; @@ -33,21 +39,32 @@ abstract contract SocketConfig is ISocket, AccessControl { // Error triggered when a connection is invalid error InvalidConnection(); error InvalidSwitchboard(); + error SwitchboardExistsOrDisabled(); // Event triggered when a new switchboard is added event SwitchboardAdded(address switchboard); + event SwitchboardDisabled(address switchboard); function registerSwitchboard() external { - if (isValidSwitchboard[msg.sender]) revert SwitchboardExists(); - isValidSwitchboard[msg.sender] = true; + if (isValidSwitchboard[msg.sender] != SwitchboardStatus.NOT_REGISTERED) + revert SwitchboardExistsOrDisabled(); + + isValidSwitchboard[msg.sender] = SwitchboardStatus.REGISTERED; emit SwitchboardAdded(msg.sender); } + function disableSwitchboard() external onlyRole(GOVERNANCE_ROLE) { + isValidSwitchboard[msg.sender] = SwitchboardStatus.DISABLED; + emit SwitchboardDisabled(msg.sender); + } + /** * @notice connects Plug to Socket and sets the config for given `siblingChainSlug_` */ function connect(address appGateway_, address switchboard_) external override { - if (!isValidSwitchboard[switchboard_]) revert InvalidSwitchboard(); + if (isValidSwitchboard[switchboard_] != SwitchboardStatus.REGISTERED) + revert InvalidSwitchboard(); + PlugConfig storage _plugConfig = _plugConfigs[msg.sender]; _plugConfig.appGateway = appGateway_; diff --git a/hardhat-scripts/deploy/3.upgradeManagers.ts b/hardhat-scripts/deploy/3.upgradeManagers.ts index cda42b70..7f7a4a9f 100644 --- a/hardhat-scripts/deploy/3.upgradeManagers.ts +++ b/hardhat-scripts/deploy/3.upgradeManagers.ts @@ -124,7 +124,7 @@ const registerSb = async (sbAddress, signer, socket) => { from: signer.address, }); - if (!sb) { + if (Number(sb) == 0) { const registerTx = await switchboard.registerSwitchboard(); console.log(`Registering Switchboard ${sbAddress}: ${registerTx.hash}`); await registerTx.wait(); From 93dea5f14527c977475bfcaffeb200965a7aad99 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Wed, 19 Feb 2025 19:57:13 +0400 Subject: [PATCH 076/186] feat: fix initial deploy flow --- contracts/apps/counter-inbox/CounterInbox.sol | 12 ++++--- contracts/apps/counter/Counter.sol | 13 ------- .../apps/super-token-lockable/LimitHook.sol | 3 +- .../SuperTokenLockable.sol | 10 +++--- contracts/apps/super-token/SuperToken.sol | 9 +++-- contracts/base/PlugBase.sol | 17 ++++++++-- contracts/interfaces/IPlug.sol | 2 +- contracts/mock/MockSocket.sol | 1 - .../payload-delivery/ContractFactoryPlug.sol | 34 +++++++++++-------- .../protocol/payload-delivery/FeesPlug.sol | 3 +- contracts/protocol/socket/Socket.sol | 1 - script/counter-inbox/Increment.s.sol | 1 - test/DeliveryHelper.t.sol | 8 ++--- test/Inbox.t.sol | 2 +- 14 files changed, 60 insertions(+), 56 deletions(-) diff --git a/contracts/apps/counter-inbox/CounterInbox.sol b/contracts/apps/counter-inbox/CounterInbox.sol index 483d67ac..58b394e4 100644 --- a/contracts/apps/counter-inbox/CounterInbox.sol +++ b/contracts/apps/counter-inbox/CounterInbox.sol @@ -5,16 +5,18 @@ import "solady/auth/Ownable.sol"; import "../../base/PlugBase.sol"; contract CounterInbox is Ownable, PlugBase { - constructor() PlugBase(msg.sender) { - _initializeOwner(msg.sender); - } + constructor() {} function increaseOnGateway(uint256 value_) external returns (bytes32) { return _callAppGateway(abi.encode(value_), bytes32(0)); } - function connectSocket(address appGateway_, address socket_, address switchboard_) external { + function initSocket( + address appGateway_, + address socket_, + address switchboard_ + ) external override { + this.initSocket(appGateway_, socket_, switchboard_); _initializeOwner(socket_); - _connectSocket(appGateway_, socket_, switchboard_); } } diff --git a/contracts/apps/counter/Counter.sol b/contracts/apps/counter/Counter.sol index db0e6446..44054091 100644 --- a/contracts/apps/counter/Counter.sol +++ b/contracts/apps/counter/Counter.sol @@ -7,23 +7,10 @@ import "../../base/PlugBase.sol"; contract Counter is Ownable, PlugBase { uint256 public counter; - constructor() PlugBase(msg.sender) { - _initializeOwner(msg.sender); - } - function increase() external onlySocket { counter++; } - function connectSocket( - address appGateway_, - address socket_, - address switchboard_ - ) external onlyOwner { - _initializeOwner(socket_); - _connectSocket(appGateway_, socket_, switchboard_); - } - function getCounter() external view returns (uint256) { return counter; } diff --git a/contracts/apps/super-token-lockable/LimitHook.sol b/contracts/apps/super-token-lockable/LimitHook.sol index 375d9608..d273587c 100644 --- a/contracts/apps/super-token-lockable/LimitHook.sol +++ b/contracts/apps/super-token-lockable/LimitHook.sol @@ -12,10 +12,9 @@ contract LimitHook is Ownable, PlugBase { error BurnLimitExceeded(); error MintLimitExceeded(); - constructor(uint256 _burnLimit_, uint256 _mintLimit_) PlugBase(msg.sender) { + constructor(uint256 _burnLimit_, uint256 _mintLimit_) { burnLimit = _burnLimit_; mintLimit = _mintLimit_; - _initializeOwner(msg.sender); } function setLimits(uint256 _burnLimit_, uint256 _mintLimit_) external onlyOwner { diff --git a/contracts/apps/super-token-lockable/SuperTokenLockable.sol b/contracts/apps/super-token-lockable/SuperTokenLockable.sol index fcc7ffdd..f1819da8 100644 --- a/contracts/apps/super-token-lockable/SuperTokenLockable.sol +++ b/contracts/apps/super-token-lockable/SuperTokenLockable.sol @@ -23,9 +23,8 @@ contract SuperTokenLockable is ERC20, Ownable, PlugBase { uint8 decimals_, address initialSupplyHolder_, uint256 initialSupply_ - ) ERC20(name_, symbol_, decimals_) PlugBase(msg.sender) { + ) ERC20(name_, symbol_, decimals_) { _mint(initialSupplyHolder_, initialSupply_); - _initializeOwner(msg.sender); } function lockTokens(address user_, uint256 amount_) external onlySocket { @@ -59,12 +58,13 @@ contract SuperTokenLockable is ERC20, Ownable, PlugBase { limitHook__ = LimitHook(limitHook_); } - function connectSocket( + // test for isSocketInitialized + function initSocket( address appGateway_, address socket_, address switchboard_ - ) external onlyOwner { + ) external override { + this.initSocket(appGateway_, socket_, switchboard_); _initializeOwner(socket_); - _connectSocket(appGateway_, socket_, switchboard_); } } diff --git a/contracts/apps/super-token/SuperToken.sol b/contracts/apps/super-token/SuperToken.sol index 5ec90b0c..9833439b 100644 --- a/contracts/apps/super-token/SuperToken.sol +++ b/contracts/apps/super-token/SuperToken.sol @@ -18,9 +18,8 @@ contract SuperToken is ERC20, Ownable, PlugBase { uint8 decimals_, address initialSupplyHolder_, uint256 initialSupply_ - ) ERC20(name_, symbol_, decimals_) PlugBase(msg.sender) { + ) ERC20(name_, symbol_, decimals_) { _mint(initialSupplyHolder_, initialSupply_); - _initializeOwner(msg.sender); } function mint(address receiver_, uint256 amount_) external onlySocket { @@ -35,12 +34,12 @@ contract SuperToken is ERC20, Ownable, PlugBase { _setSocket(newSocket_); } - function connectSocket( + function initSocket( address appGateway_, address socket_, address switchboard_ - ) external onlyOwner { + ) external override { + this.initSocket(appGateway_, socket_, switchboard_); _initializeOwner(socket_); - _connectSocket(appGateway_, socket_, switchboard_); } } diff --git a/contracts/base/PlugBase.sol b/contracts/base/PlugBase.sol index 2c155ba8..4a58a1fd 100644 --- a/contracts/base/PlugBase.sol +++ b/contracts/base/PlugBase.sol @@ -11,7 +11,9 @@ import {NotSocket} from "../protocol/utils/common/Errors.sol"; abstract contract PlugBase is IPlug { ISocket public socket__; address public appGateway; + uint256 public socketInitializer; + error SocketNotInitialized(); event ConnectorPlugDisconnected(); /// @notice Modifier to ensure only the socket can call the function @@ -21,8 +23,11 @@ abstract contract PlugBase is IPlug { _; } - constructor(address socket_) { - socket__ = ISocket(socket_); + /// @notice Modifier to ensure the socket is initialized + modifier isSocketInitialized() { + if (socketInitializer == 1) revert SocketNotInitialized(); + _; + socketInitializer = 1; } /// @notice Connects the plug to the app gateway and switchboard @@ -51,4 +56,12 @@ abstract contract PlugBase is IPlug { function _callAppGateway(bytes memory payload_, bytes32 params_) internal returns (bytes32) { return socket__.callAppGateway(payload_, params_); } + + function initSocket( + address appGateway_, + address socket_, + address switchboard_ + ) external virtual isSocketInitialized { + _connectSocket(appGateway_, socket_, switchboard_); + } } diff --git a/contracts/interfaces/IPlug.sol b/contracts/interfaces/IPlug.sol index 204cadb6..1e738f09 100644 --- a/contracts/interfaces/IPlug.sol +++ b/contracts/interfaces/IPlug.sol @@ -6,5 +6,5 @@ pragma solidity ^0.8.21; * @notice Interface for a plug contract that executes the payload received from a source chain. */ interface IPlug { - function connectSocket(address appGateway_, address socket_, address switchboard_) external; + function initSocket(address appGateway_, address socket_, address switchboard_) external; } diff --git a/contracts/mock/MockSocket.sol b/contracts/mock/MockSocket.sol index d3df9342..43fc9165 100644 --- a/contracts/mock/MockSocket.sol +++ b/contracts/mock/MockSocket.sol @@ -1,7 +1,6 @@ // SPDX-License-Identifier: GPL-3.0-only pragma solidity ^0.8.21; -import "../interfaces/IPlug.sol"; import {PlugDisconnected, InvalidAppGateway} from "../protocol/utils/common/Errors.sol"; import "../interfaces/ISwitchboard.sol"; import "../interfaces/ISocket.sol"; diff --git a/contracts/protocol/payload-delivery/ContractFactoryPlug.sol b/contracts/protocol/payload-delivery/ContractFactoryPlug.sol index c1cb1c98..f0181b6d 100644 --- a/contracts/protocol/payload-delivery/ContractFactoryPlug.sol +++ b/contracts/protocol/payload-delivery/ContractFactoryPlug.sol @@ -10,20 +10,24 @@ import "../../base/PlugBase.sol"; /// @title ContractFactory /// @notice Abstract contract for deploying contracts contract ContractFactoryPlug is PlugBase, AccessControl { - event Deployed(address addr, bytes32 salt); + event Deployed(address addr, bytes32 salt, bytes returnData); /// @notice Error thrown if it failed to deploy the create2 contract error DeploymentFailed(); + error ExecutionFailed(); - constructor(address socket_, address owner_) PlugBase(socket_) { + constructor(address socket_, address owner_) { _initializeOwner(owner_); + _setSocket(socket_); } function deployContract( - bytes memory creationCode_, + bool canConnectSocket_, bytes32 salt_, address appGateway_, - address switchboard_ + address switchboard_, + bytes memory creationCode_, + bytes memory initCallData_ ) public returns (address) { if (msg.sender != address(socket__)) { revert NotSocket(); @@ -38,8 +42,18 @@ contract ContractFactoryPlug is PlugBase, AccessControl { } } - IPlug(addr).connectSocket(appGateway_, msg.sender, switchboard_); - emit Deployed(addr, salt_); + if (canConnectSocket_) IPlug(addr).initSocket(appGateway_, msg.sender, switchboard_); + + bytes memory returnData; + if (initCallData_.length > 0) { + (bool success, bytes memory returnData_) = addr.call(initCallData_); + if (!success) { + revert ExecutionFailed(); + } + returnData = returnData_; + } + + emit Deployed(addr, salt_, returnData); return addr; } @@ -55,14 +69,6 @@ contract ContractFactoryPlug is PlugBase, AccessControl { return address(uint160(uint256(hash))); } - function connectSocket( - address appGateway_, - address socket_, - address switchboard_ - ) external onlyOwner { - _connectSocket(appGateway_, socket_, switchboard_); - } - /** * @notice Rescues funds from the contract if they are locked by mistake. This contract does not * theoretically need this function but it is added for safety. diff --git a/contracts/protocol/payload-delivery/FeesPlug.sol b/contracts/protocol/payload-delivery/FeesPlug.sol index ced1b5c2..eb4c9910 100644 --- a/contracts/protocol/payload-delivery/FeesPlug.sol +++ b/contracts/protocol/payload-delivery/FeesPlug.sol @@ -32,7 +32,8 @@ contract FeesPlug is PlugBase, AccessControl { _; } - constructor(address socket_, address owner_) PlugBase(socket_) { + constructor(address socket_, address owner_) { + _setSocket(socket_); _initializeOwner(owner_); } diff --git a/contracts/protocol/socket/Socket.sol b/contracts/protocol/socket/Socket.sol index f74c4832..8aba88e4 100644 --- a/contracts/protocol/socket/Socket.sol +++ b/contracts/protocol/socket/Socket.sol @@ -1,7 +1,6 @@ // SPDX-License-Identifier: GPL-3.0-only pragma solidity ^0.8.21; -import "../../interfaces/IPlug.sol"; import "./SocketUtils.sol"; import {PlugDisconnected, InvalidAppGateway} from "../utils/common/Errors.sol"; diff --git a/script/counter-inbox/Increment.s.sol b/script/counter-inbox/Increment.s.sol index de4f6f45..37b56733 100644 --- a/script/counter-inbox/Increment.s.sol +++ b/script/counter-inbox/Increment.s.sol @@ -20,7 +20,6 @@ contract Increment is Script { address counterInbox = vm.envAddress("COUNTER_INBOX"); CounterInbox inbox = CounterInbox(counterInbox); - inbox.connectSocket(address(gateway), socket, switchboard); inbox.increaseOnGateway(100); vm.stopBroadcast(); diff --git a/test/DeliveryHelper.t.sol b/test/DeliveryHelper.t.sol index 8e773ebb..5ad314c5 100644 --- a/test/DeliveryHelper.t.sol +++ b/test/DeliveryHelper.t.sol @@ -112,23 +112,23 @@ contract DeliveryHelperTest is SetupTest { function connectDeliveryHelper() internal { vm.startPrank(owner); - arbConfig.contractFactoryPlug.connectSocket( + arbConfig.contractFactoryPlug.initSocket( address(deliveryHelper), address(arbConfig.socket), address(arbConfig.switchboard) ); - optConfig.contractFactoryPlug.connectSocket( + optConfig.contractFactoryPlug.initSocket( address(deliveryHelper), address(optConfig.socket), address(optConfig.switchboard) ); - arbConfig.feesPlug.connectSocket( + arbConfig.feesPlug.initSocket( address(feesManager), address(arbConfig.socket), address(arbConfig.switchboard) ); - optConfig.feesPlug.connectSocket( + optConfig.feesPlug.initSocket( address(feesManager), address(optConfig.socket), address(optConfig.switchboard) diff --git a/test/Inbox.t.sol b/test/Inbox.t.sol index b9de3de5..b407e85e 100644 --- a/test/Inbox.t.sol +++ b/test/Inbox.t.sol @@ -27,7 +27,7 @@ contract InboxTest is DeliveryHelperTest { ); // Connect the inbox to the gateway and socket - inbox.connectSocket( + inbox.initSocket( address(gateway), address(arbConfig.socket), address(arbConfig.switchboard) From 9ce58c57b806641ed5c1fa16ed3f21347f0c3da3 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Wed, 19 Feb 2025 20:26:38 +0400 Subject: [PATCH 077/186] feat: fee token whitelist --- .../protocol/payload-delivery/FeesPlug.sol | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/contracts/protocol/payload-delivery/FeesPlug.sol b/contracts/protocol/payload-delivery/FeesPlug.sol index eb4c9910..35394d27 100644 --- a/contracts/protocol/payload-delivery/FeesPlug.sol +++ b/contracts/protocol/payload-delivery/FeesPlug.sol @@ -13,6 +13,7 @@ import {ETH_ADDRESS} from "../utils/common/Constants.sol"; contract FeesPlug is PlugBase, AccessControl { mapping(address => uint256) public balanceOf; mapping(bytes32 => bool) public feesRedeemed; + mapping(address => bool) public whitelistedTokens; /// @notice Error thrown when attempting to pay fees again error FeesAlreadyPaid(); @@ -21,11 +22,16 @@ contract FeesPlug is PlugBase, AccessControl { /// @notice Error thrown when deposit amount does not match msg.value error InvalidDepositAmount(); error InvalidTokenAddress(); + error TokenNotWhitelisted(address token_); /// @notice Event emitted when fees are deposited event FeesDeposited(address appGateway, address token, uint256 amount); /// @notice Event emitted when fees are withdrawn event FeesWithdrawn(address token, uint256 amount, address receiver); + /// @notice Event emitted when a token is whitelisted + event TokenWhitelisted(address token); + /// @notice Event emitted when a token is removed from whitelist + event TokenRemovedFromWhitelist(address token); modifier isFeesEnough(uint256 fee_, address feeToken_) { if (balanceOf[feeToken_] < fee_) revert InsufficientTokenBalance(feeToken_); @@ -35,6 +41,7 @@ contract FeesPlug is PlugBase, AccessControl { constructor(address socket_, address owner_) { _setSocket(socket_); _initializeOwner(owner_); + whitelistedTokens[ETH_ADDRESS] = true; // ETH is whitelisted by default } function distributeFee( @@ -66,6 +73,8 @@ contract FeesPlug is PlugBase, AccessControl { /// @param amount_ The amount /// @param appGateway_ The app gateway address function deposit(address token_, address appGateway_, uint256 amount_) external payable { + if (!whitelistedTokens[token_]) revert TokenNotWhitelisted(token_); + if (token_ == ETH_ADDRESS) { if (msg.value != amount_) revert InvalidDepositAmount(); } else { @@ -101,6 +110,21 @@ contract FeesPlug is PlugBase, AccessControl { _connectSocket(appGateway_, socket_, switchboard_); } + /// @notice Adds a token to the whitelist + /// @param token_ The token address to whitelist + function whitelistToken(address token_) external onlyOwner { + whitelistedTokens[token_] = true; + emit TokenWhitelisted(token_); + } + + /// @notice Removes a token from the whitelist + /// @param token_ The token address to remove + function removeTokenFromWhitelist(address token_) external onlyOwner { + if (token_ == ETH_ADDRESS) revert(); // Cannot remove ETH from whitelist + whitelistedTokens[token_] = false; + emit TokenRemovedFromWhitelist(token_); + } + /** * @notice Rescues funds from the contract if they are locked by mistake. This contract does not * theoretically need this function but it is added for safety. From c4bb7c9644468316f9322d24a734306a4ab8765d Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Wed, 19 Feb 2025 20:41:17 +0400 Subject: [PATCH 078/186] feat: evmx contracts change for deploy --- contracts/apps/counter/CounterDeployer.sol | 2 +- .../ParallelCounterDeployer.sol | 8 +++---- .../SuperTokenLockableDeployer.sol | 4 ++-- .../apps/super-token/SuperTokenDeployer.sol | 2 +- contracts/base/AppDeployerBase.sol | 21 +++++++++++++++---- contracts/interfaces/IDeliveryHelper.sol | 4 +++- contracts/protocol/Forwarder.sol | 4 +++- .../app-gateway/QueueAsync.sol | 14 +++++++++---- contracts/protocol/utils/common/Structs.sol | 2 ++ test/DeliveryHelper.t.sol | 6 +++++- 10 files changed, 48 insertions(+), 19 deletions(-) diff --git a/contracts/apps/counter/CounterDeployer.sol b/contracts/apps/counter/CounterDeployer.sol index 93d7f115..645686fc 100644 --- a/contracts/apps/counter/CounterDeployer.sol +++ b/contracts/apps/counter/CounterDeployer.sol @@ -20,7 +20,7 @@ contract CounterDeployer is AppDeployerBase, Ownable { } function deployContracts(uint32 chainSlug_) external async { - _deploy(counter, chainSlug_); + _deploy(counter, chainSlug_, true); } function initialize(uint32) public pure override { diff --git a/contracts/apps/parallel-counter/ParallelCounterDeployer.sol b/contracts/apps/parallel-counter/ParallelCounterDeployer.sol index c9c2f15c..1eb8eb1a 100644 --- a/contracts/apps/parallel-counter/ParallelCounterDeployer.sol +++ b/contracts/apps/parallel-counter/ParallelCounterDeployer.sol @@ -22,14 +22,14 @@ contract ParallelCounterDeployer is AppDeployerBase, Ownable { } function deployContracts(uint32 chainSlug_) external async { - _deploy(counter1, chainSlug_); - _deploy(counter2, chainSlug_); + _deploy(counter1, chainSlug_, true); + _deploy(counter2, chainSlug_, true); } function deployMultiChainContracts(uint32[] memory chainSlugs_) external async { for (uint32 i = 0; i < chainSlugs_.length; i++) { - _deploy(counter1, chainSlugs_[i]); - _deploy(counter2, chainSlugs_[i]); + _deploy(counter1, chainSlugs_[i], true); + _deploy(counter2, chainSlugs_[i], true); } } diff --git a/contracts/apps/super-token-lockable/SuperTokenLockableDeployer.sol b/contracts/apps/super-token-lockable/SuperTokenLockableDeployer.sol index 04dc2202..2812fa5f 100644 --- a/contracts/apps/super-token-lockable/SuperTokenLockableDeployer.sol +++ b/contracts/apps/super-token-lockable/SuperTokenLockableDeployer.sol @@ -49,8 +49,8 @@ contract SuperTokenLockableDeployer is AppDeployerBase, Ownable { } function deployContracts(uint32 chainSlug_) external async { - _deploy(superTokenLockable, chainSlug_); - _deploy(limitHook, chainSlug_); + _deploy(superTokenLockable, chainSlug_, true); + _deploy(limitHook, chainSlug_, true); } // don't need to call this directly, will be called automatically after all contracts are deployed. diff --git a/contracts/apps/super-token/SuperTokenDeployer.sol b/contracts/apps/super-token/SuperTokenDeployer.sol index d1e9d51e..b0d47ca8 100644 --- a/contracts/apps/super-token/SuperTokenDeployer.sol +++ b/contracts/apps/super-token/SuperTokenDeployer.sol @@ -38,7 +38,7 @@ contract SuperTokenDeployer is AppDeployerBase, Ownable { } function deployContracts(uint32 chainSlug_) external async { - _deploy(superToken, chainSlug_); + _deploy(superToken, chainSlug_, true); } // no need to call this directly, will be called automatically after all contracts are deployed. diff --git a/contracts/base/AppDeployerBase.sol b/contracts/base/AppDeployerBase.sol index cca54166..2674fb3d 100644 --- a/contracts/base/AppDeployerBase.sol +++ b/contracts/base/AppDeployerBase.sol @@ -25,20 +25,34 @@ abstract contract AppDeployerBase is AppGatewayBase, IAppDeployer { /// @notice Deploys a contract /// @param contractId_ The contract ID /// @param chainSlug_ The chain slug - function _deploy(bytes32 contractId_, uint32 chainSlug_) internal { + function _deploy(bytes32 contractId_, uint32 chainSlug_, bool isPlug_) internal { + _deploy(contractId_, chainSlug_, isPlug_, bytes("")); + } + + /// @notice Deploys a contract + /// @param contractId_ The contract ID + /// @param chainSlug_ The chain slug + function _deploy( + bytes32 contractId_, + uint32 chainSlug_, + bool isPlug_, + bytes memory initCallData_ + ) internal { address asyncPromise = addressResolver__.deployAsyncPromiseContract(address(this)); isValidPromise[asyncPromise] = true; IPromise(asyncPromise).then(this.setAddress.selector, abi.encode(chainSlug_, contractId_)); onCompleteData = abi.encode(chainSlug_); IDeliveryHelper(deliveryHelper()).queue( + isPlug_, isParallelCall, chainSlug_, address(0), asyncPromise, 0, CallType.DEPLOY, - creationCodeWithArgs[contractId_] + creationCodeWithArgs[contractId_], + initCallData_ ); } @@ -69,8 +83,7 @@ abstract contract AppDeployerBase is AppGatewayBase, IAppDeployer { return address(0); } - onChainAddress = IForwarder(forwarderAddresses[contractId_][chainSlug_]) - .getOnChainAddress(); + onChainAddress = IForwarder(forwarderAddresses[contractId_][chainSlug_]).getOnChainAddress(); } /// @notice Callback in pd promise to be called after all contracts are deployed diff --git a/contracts/interfaces/IDeliveryHelper.sol b/contracts/interfaces/IDeliveryHelper.sol index 03bf2d53..ab969695 100644 --- a/contracts/interfaces/IDeliveryHelper.sol +++ b/contracts/interfaces/IDeliveryHelper.sol @@ -20,13 +20,15 @@ interface IDeliveryHelper { function clearQueue() external; function queue( + bool isPlug_, Parallel isParallel_, uint32 chainSlug_, address target_, address asyncPromise_, uint256 value_, CallType callType_, - bytes memory payload_ + bytes memory payload_, + bytes memory initCallData_ ) external; function batch( diff --git a/contracts/protocol/Forwarder.sol b/contracts/protocol/Forwarder.sol index 0c035ec5..227b525a 100644 --- a/contracts/protocol/Forwarder.sol +++ b/contracts/protocol/Forwarder.sol @@ -86,13 +86,15 @@ contract Forwarder is IForwarder, Initializable { // Queue the call in the auction house. IDeliveryHelper(deliveryHelper).queue( + false, isParallelCall, chainSlug, onChainAddress, latestAsyncPromise, 0, isReadCall == Read.ON ? CallType.READ : CallType.WRITE, - msg.data + msg.data, + bytes("") ); } diff --git a/contracts/protocol/payload-delivery/app-gateway/QueueAsync.sol b/contracts/protocol/payload-delivery/app-gateway/QueueAsync.sol index 03b7bdaf..44b15eec 100644 --- a/contracts/protocol/payload-delivery/app-gateway/QueueAsync.sol +++ b/contracts/protocol/payload-delivery/app-gateway/QueueAsync.sol @@ -65,17 +65,20 @@ abstract contract QueueAsync is AddressResolverUtil, IDeliveryHelper { /// @param callType_ The call type /// @param payload_ The payload function queue( + bool isPlug_, Parallel isParallel_, uint32 chainSlug_, address target_, address asyncPromise_, uint256 value_, CallType callType_, - bytes memory payload_ + bytes memory payload_, + bytes memory initCallData_ ) external { // todo: sb related details callParamsArray.push( CallParams({ + isPlug: isPlug_, callType: callType_, asyncPromise: asyncPromise_, chainSlug: chainSlug_, @@ -83,7 +86,8 @@ abstract contract QueueAsync is AddressResolverUtil, IDeliveryHelper { payload: payload_, value: value_, gasLimit: 10000000, - isParallel: isParallel_ + isParallel: isParallel_, + initCallData: initCallData_ }) ); } @@ -130,10 +134,12 @@ abstract contract QueueAsync is AddressResolverUtil, IDeliveryHelper { // app gateway is set in the plug deployed on chain payload_ = abi.encodeWithSelector( IContractFactoryPlug.deployContract.selector, - payload_, + params_.isPlug, salt_, appGatewayForPlug_, - switchboard_ + switchboard_, + payload_, + params_.initCallData ); // for deploy, we set delivery helper as app gateway of contract factory plug diff --git a/contracts/protocol/utils/common/Structs.sol b/contracts/protocol/utils/common/Structs.sol index d7fe435b..deaa74bc 100644 --- a/contracts/protocol/utils/common/Structs.sol +++ b/contracts/protocol/utils/common/Structs.sol @@ -55,6 +55,7 @@ struct CallFromInboxParams { } struct CallParams { + bool isPlug; address asyncPromise; address target; uint32 chainSlug; @@ -63,6 +64,7 @@ struct CallParams { uint256 gasLimit; uint256 value; bytes payload; + bytes initCallData; } struct DeployParams { diff --git a/test/DeliveryHelper.t.sol b/test/DeliveryHelper.t.sol index 5ad314c5..a4c78b0a 100644 --- a/test/DeliveryHelper.t.sol +++ b/test/DeliveryHelper.t.sol @@ -414,8 +414,12 @@ contract DeliveryHelperTest is SetupTest { bytes32 salt = keccak256(abi.encode(appDeployer_, chainSlug_, deployCounter++)); bytes memory payload = abi.encodeWithSelector( IContractFactoryPlug.deployContract.selector, + true, + salt, + address(appDeployer_), + address(0), bytecode_, - salt + "" ); address asyncPromise = predictAsyncPromiseAddress( From c4f93874c26dfc1a18cf51b406455e79a9e4ed9c Mon Sep 17 00:00:00 2001 From: Akash Date: Wed, 19 Feb 2025 20:59:02 +0400 Subject: [PATCH 079/186] event topics script, deposit fees scripts --- Errors.md | 224 +++++++++++++----------- EventTopics.md | 186 ++++++++++++++++++++ hardhat-scripts/utils/getEventTopics.ts | 79 +++++++++ script/CheckDepositedFees.s.sol | 25 +++ testScript.sh | 5 +- 5 files changed, 414 insertions(+), 105 deletions(-) create mode 100644 EventTopics.md create mode 100644 hardhat-scripts/utils/getEventTopics.ts create mode 100644 script/CheckDepositedFees.s.sol diff --git a/Errors.md b/Errors.md index 93712470..146b40af 100644 --- a/Errors.md +++ b/Errors.md @@ -1,198 +1,216 @@ # Custom Error Codes + ## AddressResolver.sol -| Error | Signature | -| -------------------------------------------------------- | ------------ | +| Error | Signature | +|-------|-----------| | `AppGatewayContractAlreadySetByDifferentSender(address)` | `0xbe1ef5f1` | ## AsyncPromise.sol -| Error | Signature | -| ------------------------------- | ------------ | -| `PromiseAlreadyResolved()` | `0x56b63537` | +| Error | Signature | +|-------|-----------| +| `PromiseAlreadyResolved()` | `0x56b63537` | | `OnlyForwarderOrLocalInvoker()` | `0xa9fb0b28` | -| `PromiseAlreadySetUp()` | `0x927c53d5` | +| `PromiseAlreadySetUp()` | `0x927c53d5` | +| `PromiseRevertFailed()` | `0x0175b9de` | ## apps/payload-delivery/ContractFactoryPlug.sol -| Error | Signature | -| -------------------- | ------------ | +| Error | Signature | +|-------|-----------| | `DeploymentFailed()` | `0x30116425` | ## apps/payload-delivery/FeesPlug.sol -| Error | Signature | -| ----------------------------------- | ------------ | -| `FeesAlreadyPaid()` | `0xd3b1ad69` | +| Error | Signature | +|-------|-----------| +| `FeesAlreadyPaid()` | `0xd3b1ad69` | | `InsufficientTokenBalance(address)` | `0x642faafa` | -| `InvalidDepositAmount()` | `0xfe9ba5cd` | -| `InvalidTokenAddress()` | `0x1eb00b06` | +| `InvalidDepositAmount()` | `0xfe9ba5cd` | +| `InvalidTokenAddress()` | `0x1eb00b06` | ## apps/payload-delivery/app-gateway/AuctionManager.sol -| Error | Signature | -| ------------------------- | ------------ | -| `AuctionClosed()` | `0x36b6b46d` | +| Error | Signature | +|-------|-----------| +| `AuctionClosed()` | `0x36b6b46d` | | `AuctionAlreadyStarted()` | `0x628e3883` | -| `BidExceedsMaxFees()` | `0x4c923f3c` | -| `InvalidTransmitter()` | `0x58a70a0a` | +| `BidExceedsMaxFees()` | `0x4c923f3c` | +| `InvalidTransmitter()` | `0x58a70a0a` | ## apps/payload-delivery/app-gateway/BatchAsync.sol -| Error | Signature | -| ----------------------- | ------------ | +| Error | Signature | +|-------|-----------| | `AllPayloadsExecuted()` | `0x6bc43bfe` | -| `NotFromForwarder()` | `0xe83aa6bd` | -| `CallFailed(bytes32)` | `0xe22e3683` | -| `PayloadTooLarge()` | `0x492f620d` | -| `OnlyAppGateway()` | `0xfec944ea` | +| `NotFromForwarder()` | `0xe83aa6bd` | +| `CallFailed(bytes32)` | `0xe22e3683` | +| `PayloadTooLarge()` | `0x492f620d` | +| `OnlyAppGateway()` | `0xfec944ea` | +| `WinningBidExists()` | `0xe8733654` | +| `InsufficientFees()` | `0x8d53e553` | ## apps/payload-delivery/app-gateway/FeesManager.sol -| Error | Signature | -| ----------------------------- | ------------ | +| Error | Signature | +|-------|-----------| | `InsufficientFeesAvailable()` | `0x51488f54` | -| `NoFeesForTransmitter()` | `0x248bac55` | -| `NoFeesBlocked()` | `0x116d68f9` | +| `NoFeesForTransmitter()` | `0x248bac55` | +| `NoFeesBlocked()` | `0x116d68f9` | ## apps/super-token-lockable/LimitHook.sol -| Error | Signature | -| --------------------- | ------------ | +| Error | Signature | +|-------|-----------| | `BurnLimitExceeded()` | `0x85e72fd4` | | `MintLimitExceeded()` | `0xb643bfa6` | ## apps/super-token-lockable/SuperTokenLockable.sol -| Error | Signature | -| ---------------------------- | ------------ | -| `InsufficientBalance()` | `0xf4d678b8` | +| Error | Signature | +|-------|-----------| +| `InsufficientBalance()` | `0xf4d678b8` | | `InsufficientLockedTokens()` | `0x4f6d2a3e` | ## common/Errors.sol -| Error | Signature | -| ---------------------------- | ------------ | -| `NotAuthorized()` | `0xea8e4eb5` | -| `NotBridge()` | `0x7fea9dc5` | -| `NotSocket()` | `0xc59f8f7c` | -| `ConnectorUnavailable()` | `0xb1efb84a` | -| `InvalidTokenContract()` | `0x29bdfb34` | -| `ZeroAddressReceiver()` | `0x96bbcf1e` | -| `ZeroAddress()` | `0xd92e233d` | -| `ZeroAmount()` | `0x1f2a2005` | -| `InsufficientFunds()` | `0x356680b7` | -| `InvalidSigner()` | `0x815e1d64` | -| `InvalidFunction()` | `0xdb2079c3` | -| `TimeoutDelayTooLarge()` | `0xc10bfe64` | -| `TimeoutAlreadyResolved()` | `0x7dc8be06` | +| Error | Signature | +|-------|-----------| +| `NotAuthorized()` | `0xea8e4eb5` | +| `NotBridge()` | `0x7fea9dc5` | +| `NotSocket()` | `0xc59f8f7c` | +| `ConnectorUnavailable()` | `0xb1efb84a` | +| `InvalidTokenContract()` | `0x29bdfb34` | +| `ZeroAddressReceiver()` | `0x96bbcf1e` | +| `ZeroAddress()` | `0xd92e233d` | +| `ZeroAmount()` | `0x1f2a2005` | +| `InsufficientFunds()` | `0x356680b7` | +| `InvalidSigner()` | `0x815e1d64` | +| `InvalidFunction()` | `0xdb2079c3` | +| `TimeoutDelayTooLarge()` | `0xc10bfe64` | +| `TimeoutAlreadyResolved()` | `0x7dc8be06` | | `ResolvingTimeoutTooEarly()` | `0x28fd4c50` | -| `LimitReached()` | `0x3dd19101` | -| `FeesAlreadyPaid()` | `0xd3b1ad69` | -| `NotAuctionManager()` | `0x87944c26` | -| `CallFailed()` | `0x3204506f` | -| `PlugDisconnected()` | `0xe741bafb` | -| `InvalidAppGateway()` | `0x82ded261` | -| `AppGatewayAlreadyCalled()` | `0xb224683f` | -| `InvalidInboxCaller()` | `0x4f1aa61e` | -| `PromisesNotResolved()` | `0xb91dbe7d` | -| `InvalidPromise()` | `0x45f2d176` | -| `InvalidIndex()` | `0x63df8171` | -| `FeesNotSet()` | `0x2a831034` | +| `LimitReached()` | `0x3dd19101` | +| `FeesAlreadyPaid()` | `0xd3b1ad69` | +| `NotAuctionManager()` | `0x87944c26` | +| `CallFailed()` | `0x3204506f` | +| `PlugDisconnected()` | `0xe741bafb` | +| `InvalidAppGateway()` | `0x82ded261` | +| `AppGatewayAlreadyCalled()` | `0xb224683f` | +| `InvalidInboxCaller()` | `0x4f1aa61e` | +| `PromisesNotResolved()` | `0xb91dbe7d` | +| `InvalidPromise()` | `0x45f2d176` | +| `InvalidIndex()` | `0x63df8171` | +| `FeesNotSet()` | `0x2a831034` | + +## libraries/ECDSA.sol + +| Error | Signature | +|-------|-----------| +| `ECDSAInvalidSignature()` | `0xf645eedf` | +| `ECDSAInvalidSignatureLength(uint256)` | `0xfce698f7` | +| `ECDSAInvalidSignatureS(bytes32)` | `0xd78bce0c` | ## libraries/RescueFundsLib.sol -| Error | Signature | -| ----------------------- | ------------ | +| Error | Signature | +|-------|-----------| | `InvalidTokenAddress()` | `0x1eb00b06` | ## mock/MockSocket.sol -| Error | Signature | -| -------------------------- | ------------ | +| Error | Signature | +|-------|-----------| | `PayloadAlreadyExecuted()` | `0xe17bd578` | -| `VerificationFailed()` | `0x439cc0cd` | -| `LowGasLimit()` | `0xd38edae0` | -| `InvalidSlug()` | `0x290a8315` | -| `ExecutionFailed()` | `0xacfdb444` | +| `VerificationFailed()` | `0x439cc0cd` | +| `LowGasLimit()` | `0xd38edae0` | +| `InvalidSlug()` | `0x290a8315` | +| `ExecutionFailed()` | `0xacfdb444` | ## mock/MockWatcherPrecompile.sol -| Error | Signature | -| ---------------------- | ------------ | -| `InvalidChainSlug()` | `0xbff6b106` | +| Error | Signature | +|-------|-----------| +| `InvalidChainSlug()` | `0xbff6b106` | | `InvalidTransmitter()` | `0x58a70a0a` | ## socket/Socket.sol -| Error | Signature | -| -------------------------- | ------------ | +| Error | Signature | +|-------|-----------| | `PayloadAlreadyExecuted()` | `0xe17bd578` | -| `VerificationFailed()` | `0x439cc0cd` | -| `LowGasLimit()` | `0xd38edae0` | -| `InvalidSlug()` | `0x290a8315` | -| `ExecutionFailed()` | `0xacfdb444` | +| `VerificationFailed()` | `0x439cc0cd` | +| `LowGasLimit()` | `0xd38edae0` | +| `InvalidSlug()` | `0x290a8315` | +| `ExecutionFailed()` | `0xacfdb444` | ## socket/SocketBase.sol -| Error | Signature | -| ---------------------- | ------------ | +| Error | Signature | +|-------|-----------| | `InvalidTransmitter()` | `0x58a70a0a` | ## socket/SocketConfig.sol -| Error | Signature | -| ---------------------- | ------------ | -| `SwitchboardExists()` | `0x2dff8555` | -| `InvalidConnection()` | `0x63228f29` | +| Error | Signature | +|-------|-----------| +| `SwitchboardExists()` | `0x2dff8555` | +| `InvalidConnection()` | `0x63228f29` | | `InvalidSwitchboard()` | `0xf63c9e4d` | ## socket/switchboard/FastSwitchboard.sol -| Error | Signature | -| ------------------- | ------------ | +| Error | Signature | +|-------|-----------| | `AlreadyAttested()` | `0x35d90805` | | `WatcherNotFound()` | `0xa278e4ad` | ## socket/switchboard/SwitchboardBase.sol -| Error | Signature | -| ---------------- | ------------ | +| Error | Signature | +|-------|-----------| | `InvalidNonce()` | `0x756688fe` | ## socket/utils/AccessControl.sol -| Error | Signature | -| ------------------- | ------------ | +| Error | Signature | +|-------|-----------| | `NoPermit(bytes32)` | `0x962f6333` | +## socket/utils/SignatureVerifier.sol + +| Error | Signature | +|-------|-----------| +| `InvalidSigLength()` | `0xd2453293` | + ## utils/AddressResolverUtil.sol -| Error | Signature | -| ------------------------- | ------------ | -| `OnlyPayloadDelivery()` | `0x7ccc3a43` | +| Error | Signature | +|-------|-----------| +| `OnlyPayloadDelivery()` | `0x7ccc3a43` | | `OnlyWatcherPrecompile()` | `0x663a892a` | ## utils/OwnableTwoStep.sol -| Error | Signature | -| --------------- | ------------ | -| `OnlyOwner()` | `0x5fc483c5` | +| Error | Signature | +|-------|-----------| +| `OnlyOwner()` | `0x5fc483c5` | | `OnlyNominee()` | `0x7c91ccdd` | ## watcherPrecompile/WatcherPrecompile.sol -| Error | Signature | -| ---------------------- | ------------ | -| `InvalidChainSlug()` | `0xbff6b106` | -| `InvalidConnection()` | `0x63228f29` | +| Error | Signature | +|-------|-----------| +| `InvalidChainSlug()` | `0xbff6b106` | +| `InvalidConnection()` | `0x63228f29` | | `InvalidTransmitter()` | `0x58a70a0a` | ## watcherPrecompile/WatcherPrecompileLimits.sol -| Error | Signature | -| ------------------------------------------------ | ------------ | -| `ActionNotSupported(address,bytes32)` | `0xa219158f` | -| `NotDeliveryHelper()` | `0x29029c67` | +| Error | Signature | +|-------|-----------| +| `ActionNotSupported(address,bytes32)` | `0xa219158f` | +| `NotDeliveryHelper()` | `0x29029c67` | | `LimitExceeded(address,bytes32,uint256,uint256)` | `0x80bb2621` | diff --git a/EventTopics.md b/EventTopics.md new file mode 100644 index 00000000..ca2e415f --- /dev/null +++ b/EventTopics.md @@ -0,0 +1,186 @@ +# Event Topics + + +## AddressResolver.sol + +| Event | Topic | +|-------|-------| +| `PlugAdded` | `0x2cb8d865028f9abf3dc064724043264907615fadc8615a3699a85edb66472273` | +| `ForwarderDeployed` | `0x4dbbecb9cf9c8b93da9743a2b48ea52efe68d69230ab1c1b711891d9d223b29f` | +| `AsyncPromiseDeployed` | `0xb6c5491cf83e09749b1a4dd6a9f07b0e925fcb0a915ac8c2b40e8ab28191c270` | +| `ImplementationUpdated` | `0xa1e41aa2c2f3f20d9b63ac06b634d2788768d6034f3d9192cdf7d07374bb16f4` | + +## apps/cron/CronAppGateway.sol + +| Event | Topic | +|-------|-------| +| `TimeoutResolved` | `0x21f74fe97870cde3cfbde7addf2b9343c27ca433b826801e63b3d6153699ec3f` | + +## apps/payload-delivery/ContractFactoryPlug.sol + +| Event | Topic | +|-------|-------| +| `Deployed` | `0x94bfd9af14ef450884c8a7ddb5734e2e1e14e70a1c84f0801cc5a29e34d26428` | + +## apps/payload-delivery/FeesPlug.sol + +| Event | Topic | +|-------|-------| +| `FeesDeposited` | `0x0fd38537e815732117cfdab41ba9b6d3eb2c5799d44039c100c05fc9c112f235` | +| `FeesWithdrawn` | `0x87044da2612407bc001bb0985725dcc651a0dc71eaabfd1d7e8617ca85a8c19c` | + +## apps/payload-delivery/app-gateway/AuctionManager.sol + +| Event | Topic | +|-------|-------| +| `AuctionStarted` | `0x884055d82c091219e252c5c2acca6051c823fcba97cecb3ba07d5f06c1628e6c` | +| `AuctionEnded` | `0xefa02d67c6f01c72b191e6c5076e63d9a4941f9037bf1c4aa4ccc613340e1571` | +| `BidPlaced` | `0xaf5c23b337289338f72cec2fdec2c736d419c7607e4c840ee4d28176477d4e08` | + +## apps/payload-delivery/app-gateway/BatchAsync.sol + +| Event | Topic | +|-------|-------| +| `PayloadSubmitted` | `0xaab415570fdc7fb2a70601b49667178ab5f887c7901dc5e84b853c5bad514106` | +| `FeesIncreased` | `0xf1a5d6adcecf6c2be482b515e9564a9898cd629b54c57ede69295dffbf16bb1d` | +| `PayloadAsyncRequested` | `0x71c5226e31c1ad0fb69f89c62225760ba7c06c4ebdd284dfc71fd61603120d95` | +| `BatchCancelled` | `0xac01c50ce693d1fe783ba60ec0f82ab99f65e62446fffb028e3bd639cd5684d4` | + +## apps/payload-delivery/app-gateway/DeliveryHelper.sol + +| Event | Topic | +|-------|-------| +| `CallBackReverted` | `0xb793657774d4efcce6746ecc3d896279387c392fe6f6f2932daf35d5a1d65be6` | + +## apps/payload-delivery/app-gateway/FeesManager.sol + +| Event | Topic | +|-------|-------| +| `FeesBlocked` | `0xc1639cc709c1b397fa20d3a1ece33aee2eb5c29573fe9e1e06d2364d40cdf2f7` | +| `TransmitterFeesUpdated` | `0x409067fdd2f9c474161a5b1f96399f2d24c45cfc4a93f4b1c27c9bf351f1e2bb` | +| `FeesDepositedUpdated` | `0xe82dece33ef85114446a366b7d94538d641968e3ec87bf9f2f5a957ace1086e7` | +| `FeesUnblockedAndAssigned` | `0x09a0f93a20f672833eeac3a1c9d63495cfcbee2e32f968e947a6124054b44a79` | +| `FeesUnblocked` | `0x5290de2b93b8542dc233ee9f02c346e94a47254ed50e00738e6d7ec4a54bcb3a` | + +## apps/payload-delivery/app-gateway/QueueAsync.sol + +| Event | Topic | +|-------|-------| +| `PayloadBatchCancelled` | `0xae2e532ea00438ec2fc3e806f19c85f21334853d16c32107c75ff8d176af7633` | + +## apps/super-token/SuperTokenAppGateway.sol + +| Event | Topic | +|-------|-------| +| `Transferred` | `0xd729be146db2a3467d5eaf1eed3f1afcdd5cc05d1b3b14d27675e36844fb3aba` | + +## apps/super-token-lockable/SuperTokenLockableAppGateway.sol + +| Event | Topic | +|-------|-------| +| `Bridged` | `0x19138f4129b378a375fc2f5ca3b1be3fea2f048ef2b1884a1d0fff5dca83e0ac` | + +## base/PlugBase.sol + +| Event | Topic | +|-------|-------| +| `ConnectorPlugDisconnected` | `0xc2af098c82dba3c4b00be8bda596d62d13b98a87b42626fefa67e0bb0e198fdd` | + +## interfaces/IAddressResolver.sol + +| Event | Topic | +|-------|-------| +| `AddressSet` | `0x9ef0e8c8e52743bb38b83b17d9429141d494b8041ca6d616a6c77cebae9cd8b7` | + +## interfaces/IDeliveryHelper.sol + +| Event | Topic | +|-------|-------| +| `BidPlaced` | `0xaf5c23b337289338f72cec2fdec2c736d419c7607e4c840ee4d28176477d4e08` | +| `AuctionEnded` | `0xefa02d67c6f01c72b191e6c5076e63d9a4941f9037bf1c4aa4ccc613340e1571` | + +## interfaces/IERC20.sol + +| Event | Topic | +|-------|-------| +| `Transfer` | `0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef` | +| `Approval` | `0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925` | + +## interfaces/ISocket.sol + +| Event | Topic | +|-------|-------| +| `ExecutionSuccess` | `0xc54787fbe087097b182e713f16d3443ad2e67cbe6732628451dd3695a11814c2` | +| `PlugConnected` | `0x99c37c6da3bd69c6d59967915f8339f11a0a17fed28c615efb19457fdec0d7db` | +| `AppGatewayCallRequested` | `0x392cb36fae7bd0470268c65b15c32a745b37168c4ccd13348c59bd9170f3b3e8` | + +## mock/MockWatcherPrecompile.sol + +| Event | Topic | +|-------|-------| +| `CalledAppGateway` | `0x255bcf22d238fe60f6611670cd7919d2bc890283be2fdaf6d2ad3411e777e33c` | +| `QueryRequested` | `0x19a4898a6390d795c9d86362d12853f4f6515b41b95a57f9b28774b4b36fc916` | +| `FinalizeRequested` | `0x17e763b469fcd8535794b9c8c1452d90597be1eeb0eb0367662e18c067fe9656` | +| `Finalized` | `0x8ee21307ed5b839a691d488e11de81bee61525893865b7ae106cc712ef42376e` | +| `PromiseResolved` | `0x2e6de63938bd94bb20d9aa80f8bc4b07be2d8fbd4525664156351836588ed365` | +| `TimeoutRequested` | `0xdf94fed77e41734b8a17815476bbbf88e2db15d762f42a30ddb9d7870f2fb858` | +| `TimeoutResolved` | `0x221462ec065e22637f794ec3a7edb17b2f04bec88f0546dda308bc37a83801b8` | + +## socket/SocketBase.sol + +| Event | Topic | +|-------|-------| +| `HasherSet` | `0xc7238b23787eb9f8aa74c79b27083bb4b8f0db527df90366b487c40fa0ba2d3a` | +| `SignatureVerifierSet` | `0xcb341def955dbf73920141be056568edde30b1dbc56a29396945e5596a03c68c` | + +## socket/SocketConfig.sol + +| Event | Topic | +|-------|-------| +| `SwitchboardAdded` | `0x1595852923edfbbf906f09fc8523e4cfb022a194773c4d1509446b614146ee88` | + +## socket/switchboard/FastSwitchboard.sol + +| Event | Topic | +|-------|-------| +| `Attested` | `0x2f8e66b1207a4b70274a2a3da88ffb5737c8214576490da1b35acc38b2d62db6` | + +## socket/utils/AccessControl.sol + +| Event | Topic | +|-------|-------| +| `RoleGranted` | `0x2ae6a113c0ed5b78a53413ffbb7679881f11145ccfba4fb92e863dfcd5a1d2f3` | +| `RoleRevoked` | `0x155aaafb6329a2098580462df33ec4b7441b19729b9601c5fc17ae1cf99a8a52` | + +## utils/OwnableTwoStep.sol + +| Event | Topic | +|-------|-------| +| `OwnerNominated` | `0x906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce22` | +| `OwnerClaimed` | `0xfbe19c9b601f5ee90b44c7390f3fa2319eba01762d34ee372aeafd59b25c7f87` | + +## watcherPrecompile/WatcherPrecompile.sol + +| Event | Topic | +|-------|-------| +| `CalledAppGateway` | `0x255bcf22d238fe60f6611670cd7919d2bc890283be2fdaf6d2ad3411e777e33c` | +| `QueryRequested` | `0x19a4898a6390d795c9d86362d12853f4f6515b41b95a57f9b28774b4b36fc916` | +| `FinalizeRequested` | `0x17e763b469fcd8535794b9c8c1452d90597be1eeb0eb0367662e18c067fe9656` | +| `Finalized` | `0x8ee21307ed5b839a691d488e11de81bee61525893865b7ae106cc712ef42376e` | +| `PromiseResolved` | `0x3f1120f34271f52a541dfc8a71efbe6123ab80730562e8948fa7275514c41bda` | +| `TimeoutRequested` | `0xdf94fed77e41734b8a17815476bbbf88e2db15d762f42a30ddb9d7870f2fb858` | +| `TimeoutResolved` | `0x221462ec065e22637f794ec3a7edb17b2f04bec88f0546dda308bc37a83801b8` | + +## watcherPrecompile/WatcherPrecompileConfig.sol + +| Event | Topic | +|-------|-------| +| `PlugAdded` | `0x2cb8d865028f9abf3dc064724043264907615fadc8615a3699a85edb66472273` | +| `SwitchboardSet` | `0x6273f161f4a795e66ef3585d9b4442ef3796b32337157fdfb420b5281e4cf2e3` | + +## watcherPrecompile/WatcherPrecompileLimits.sol + +| Event | Topic | +|-------|-------| +| `LimitParamsUpdated` | `0x76b76501b1f65d80b7de6c1a42b2245466c1c80504052e7ad48e86b6038d39a1` | +| `AppGatewayActivated` | `0x44628d7d5628b9fbc2c84ea9bf3bd3987fa9cde8d2b28e2d5ceb451f916cb8b9` | diff --git a/hardhat-scripts/utils/getEventTopics.ts b/hardhat-scripts/utils/getEventTopics.ts new file mode 100644 index 00000000..66cd0d0b --- /dev/null +++ b/hardhat-scripts/utils/getEventTopics.ts @@ -0,0 +1,79 @@ +import fs from "fs"; +import path from "path"; +import { ethers } from "ethers"; + + +// Function to recursively get all .sol files +function getSolFiles(dir: string, fileList: string[] = []): string[] { + const files = fs.readdirSync(dir); + + files.forEach((file) => { + const filePath = path.join(dir, file); + if (fs.statSync(filePath).isDirectory()) { + fileList = getSolFiles(filePath, fileList); + } else if (path.extname(file) === ".sol") { + fileList.push(filePath); + } + }); + + return fileList; +} + +// Function to extract event topics from contract file +function extractEventTopics(filePath: string): string[] { + const content = fs.readFileSync(filePath, "utf8"); + const eventRegex = /event\s+(\w+)\s*\(([\s\S]*?)\);/g; + const topics: string[] = []; + + let match; + while ((match = eventRegex.exec(content)) !== null) { + const eventName = match[1]; + const params = match[2] + .split(",") + .map((param) => param.trim().split(" ")[0]) // Extract only the type + .join(","); + const topic = ethers.utils.id(`${eventName}(${params})`); + topics.push(`${eventName} -> ${topic}`); + } + + return topics; +} + +// Main function +async function main() { + const contractsDir = path.join(__dirname, "../../contracts"); + const topicsDir = path.join(__dirname, "../../EventTopics.md"); + const solFiles = getSolFiles(contractsDir); + + console.log("Event Topics Found:"); + console.log("-------------------"); + + let mdContent = "# Event Topics\n\n"; + + for (const file of solFiles) { + const topics = extractEventTopics(file); + if (topics.length > 0) { + console.log(`\nIn ${path.relative(contractsDir, file)}:`); + mdContent += `\n## ${path.relative(contractsDir, file)}\n\n`; + mdContent += "| Event | Topic |\n|-------|-------|"; + + for (const topic of topics) { + console.log(topic); + const [eventName, topicHash] = topic.split(" -> "); + mdContent += `\n| \`${eventName}\` | \`${topicHash}\` |`; + } + mdContent += "\n"; + } + } + + // Write to EventTopics.md file + fs.writeFileSync(topicsDir, mdContent); + console.log("\nEvent topics have been written to EventTopics.md"); +} + +main() + .then(() => process.exit(0)) + .catch((error) => { + console.error(error); + process.exit(1); + }); diff --git a/script/CheckDepositedFees.s.sol b/script/CheckDepositedFees.s.sol new file mode 100644 index 00000000..12ad3355 --- /dev/null +++ b/script/CheckDepositedFees.s.sol @@ -0,0 +1,25 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {Script} from "forge-std/Script.sol"; +import {console} from "forge-std/Console.sol"; +import {FeesManager} from "../contracts/apps/payload-delivery/app-gateway/FeesManager.sol"; +import {Fees} from "../contracts/common/Structs.sol"; +import {ETH_ADDRESS} from "../contracts/common/Constants.sol"; + +contract CheckDepositedFees is Script { + function run() external { + vm.createSelectFork(vm.envString("EVMX_RPC")); + FeesManager feesManager = FeesManager(payable(vm.envAddress("FEES_MANAGER"))); + address appGateway = vm.envAddress("APP_GATEWAY"); + + (uint256 deposited, uint256 blocked) = feesManager.appGatewayFeeBalances(appGateway, 421614, ETH_ADDRESS); + console.log("App Gateway:", appGateway); + console.log("Deposited fees:", deposited); + console.log("Blocked fees:", blocked); + + uint256 availableFees = feesManager.getAvailableFees(421614, appGateway, ETH_ADDRESS); + console.log("Available fees:", availableFees); + } +} + diff --git a/testScript.sh b/testScript.sh index 90929365..1157c8a0 100644 --- a/testScript.sh +++ b/testScript.sh @@ -8,7 +8,7 @@ source .env && forge script script/parallel-counter/checkCounters.s.sol --broadc ## Counter -source .env && forge script script/counter/DeployCounterOffchain.s.sol --broadcast --skip-simulation +source .env && forge script script/counter/deployEVMxCounterApp.s.sol --broadcast --skip-simulation source .env && forge script script/counter/DeployCounterOnchain.s.sol --broadcast --skip-simulation ## set limits for the app gateway using API source .env && cast send $DEPLOYER "deployContracts(uint32)" 421614 --private-key $PRIVATE_KEY @@ -53,4 +53,5 @@ source .env && forge script script/admin/UpdateLimits.s.sol --broadcast --skip-s # add fees -source .env && forge script script/DepositFees.s.sol --broadcast --skip-simulation +source .env && forge script script/PayFeesInArbitrumETH.s.sol --broadcast --skip-simulation +source .env && forge script script/CheckDepositedFees.s.sol From 1a0fed6a83403ad7b2749262627737f377ff8bd6 Mon Sep 17 00:00:00 2001 From: Akash Date: Wed, 19 Feb 2025 21:00:50 +0400 Subject: [PATCH 080/186] chore: lint --- Errors.md | 225 ++++++++++++------------ EventTopics.md | 163 +++++++++-------- hardhat-scripts/utils/getEventTopics.ts | 1 - script/CheckDepositedFees.s.sol | 7 +- 4 files changed, 198 insertions(+), 198 deletions(-) diff --git a/Errors.md b/Errors.md index 146b40af..76230b99 100644 --- a/Errors.md +++ b/Errors.md @@ -1,216 +1,215 @@ # Custom Error Codes - ## AddressResolver.sol -| Error | Signature | -|-------|-----------| +| Error | Signature | +| -------------------------------------------------------- | ------------ | | `AppGatewayContractAlreadySetByDifferentSender(address)` | `0xbe1ef5f1` | ## AsyncPromise.sol -| Error | Signature | -|-------|-----------| -| `PromiseAlreadyResolved()` | `0x56b63537` | +| Error | Signature | +| ------------------------------- | ------------ | +| `PromiseAlreadyResolved()` | `0x56b63537` | | `OnlyForwarderOrLocalInvoker()` | `0xa9fb0b28` | -| `PromiseAlreadySetUp()` | `0x927c53d5` | -| `PromiseRevertFailed()` | `0x0175b9de` | +| `PromiseAlreadySetUp()` | `0x927c53d5` | +| `PromiseRevertFailed()` | `0x0175b9de` | ## apps/payload-delivery/ContractFactoryPlug.sol -| Error | Signature | -|-------|-----------| +| Error | Signature | +| -------------------- | ------------ | | `DeploymentFailed()` | `0x30116425` | ## apps/payload-delivery/FeesPlug.sol -| Error | Signature | -|-------|-----------| -| `FeesAlreadyPaid()` | `0xd3b1ad69` | +| Error | Signature | +| ----------------------------------- | ------------ | +| `FeesAlreadyPaid()` | `0xd3b1ad69` | | `InsufficientTokenBalance(address)` | `0x642faafa` | -| `InvalidDepositAmount()` | `0xfe9ba5cd` | -| `InvalidTokenAddress()` | `0x1eb00b06` | +| `InvalidDepositAmount()` | `0xfe9ba5cd` | +| `InvalidTokenAddress()` | `0x1eb00b06` | ## apps/payload-delivery/app-gateway/AuctionManager.sol -| Error | Signature | -|-------|-----------| -| `AuctionClosed()` | `0x36b6b46d` | +| Error | Signature | +| ------------------------- | ------------ | +| `AuctionClosed()` | `0x36b6b46d` | | `AuctionAlreadyStarted()` | `0x628e3883` | -| `BidExceedsMaxFees()` | `0x4c923f3c` | -| `InvalidTransmitter()` | `0x58a70a0a` | +| `BidExceedsMaxFees()` | `0x4c923f3c` | +| `InvalidTransmitter()` | `0x58a70a0a` | ## apps/payload-delivery/app-gateway/BatchAsync.sol -| Error | Signature | -|-------|-----------| +| Error | Signature | +| ----------------------- | ------------ | | `AllPayloadsExecuted()` | `0x6bc43bfe` | -| `NotFromForwarder()` | `0xe83aa6bd` | -| `CallFailed(bytes32)` | `0xe22e3683` | -| `PayloadTooLarge()` | `0x492f620d` | -| `OnlyAppGateway()` | `0xfec944ea` | -| `WinningBidExists()` | `0xe8733654` | -| `InsufficientFees()` | `0x8d53e553` | +| `NotFromForwarder()` | `0xe83aa6bd` | +| `CallFailed(bytes32)` | `0xe22e3683` | +| `PayloadTooLarge()` | `0x492f620d` | +| `OnlyAppGateway()` | `0xfec944ea` | +| `WinningBidExists()` | `0xe8733654` | +| `InsufficientFees()` | `0x8d53e553` | ## apps/payload-delivery/app-gateway/FeesManager.sol -| Error | Signature | -|-------|-----------| +| Error | Signature | +| ----------------------------- | ------------ | | `InsufficientFeesAvailable()` | `0x51488f54` | -| `NoFeesForTransmitter()` | `0x248bac55` | -| `NoFeesBlocked()` | `0x116d68f9` | +| `NoFeesForTransmitter()` | `0x248bac55` | +| `NoFeesBlocked()` | `0x116d68f9` | ## apps/super-token-lockable/LimitHook.sol -| Error | Signature | -|-------|-----------| +| Error | Signature | +| --------------------- | ------------ | | `BurnLimitExceeded()` | `0x85e72fd4` | | `MintLimitExceeded()` | `0xb643bfa6` | ## apps/super-token-lockable/SuperTokenLockable.sol -| Error | Signature | -|-------|-----------| -| `InsufficientBalance()` | `0xf4d678b8` | +| Error | Signature | +| ---------------------------- | ------------ | +| `InsufficientBalance()` | `0xf4d678b8` | | `InsufficientLockedTokens()` | `0x4f6d2a3e` | ## common/Errors.sol -| Error | Signature | -|-------|-----------| -| `NotAuthorized()` | `0xea8e4eb5` | -| `NotBridge()` | `0x7fea9dc5` | -| `NotSocket()` | `0xc59f8f7c` | -| `ConnectorUnavailable()` | `0xb1efb84a` | -| `InvalidTokenContract()` | `0x29bdfb34` | -| `ZeroAddressReceiver()` | `0x96bbcf1e` | -| `ZeroAddress()` | `0xd92e233d` | -| `ZeroAmount()` | `0x1f2a2005` | -| `InsufficientFunds()` | `0x356680b7` | -| `InvalidSigner()` | `0x815e1d64` | -| `InvalidFunction()` | `0xdb2079c3` | -| `TimeoutDelayTooLarge()` | `0xc10bfe64` | -| `TimeoutAlreadyResolved()` | `0x7dc8be06` | +| Error | Signature | +| ---------------------------- | ------------ | +| `NotAuthorized()` | `0xea8e4eb5` | +| `NotBridge()` | `0x7fea9dc5` | +| `NotSocket()` | `0xc59f8f7c` | +| `ConnectorUnavailable()` | `0xb1efb84a` | +| `InvalidTokenContract()` | `0x29bdfb34` | +| `ZeroAddressReceiver()` | `0x96bbcf1e` | +| `ZeroAddress()` | `0xd92e233d` | +| `ZeroAmount()` | `0x1f2a2005` | +| `InsufficientFunds()` | `0x356680b7` | +| `InvalidSigner()` | `0x815e1d64` | +| `InvalidFunction()` | `0xdb2079c3` | +| `TimeoutDelayTooLarge()` | `0xc10bfe64` | +| `TimeoutAlreadyResolved()` | `0x7dc8be06` | | `ResolvingTimeoutTooEarly()` | `0x28fd4c50` | -| `LimitReached()` | `0x3dd19101` | -| `FeesAlreadyPaid()` | `0xd3b1ad69` | -| `NotAuctionManager()` | `0x87944c26` | -| `CallFailed()` | `0x3204506f` | -| `PlugDisconnected()` | `0xe741bafb` | -| `InvalidAppGateway()` | `0x82ded261` | -| `AppGatewayAlreadyCalled()` | `0xb224683f` | -| `InvalidInboxCaller()` | `0x4f1aa61e` | -| `PromisesNotResolved()` | `0xb91dbe7d` | -| `InvalidPromise()` | `0x45f2d176` | -| `InvalidIndex()` | `0x63df8171` | -| `FeesNotSet()` | `0x2a831034` | +| `LimitReached()` | `0x3dd19101` | +| `FeesAlreadyPaid()` | `0xd3b1ad69` | +| `NotAuctionManager()` | `0x87944c26` | +| `CallFailed()` | `0x3204506f` | +| `PlugDisconnected()` | `0xe741bafb` | +| `InvalidAppGateway()` | `0x82ded261` | +| `AppGatewayAlreadyCalled()` | `0xb224683f` | +| `InvalidInboxCaller()` | `0x4f1aa61e` | +| `PromisesNotResolved()` | `0xb91dbe7d` | +| `InvalidPromise()` | `0x45f2d176` | +| `InvalidIndex()` | `0x63df8171` | +| `FeesNotSet()` | `0x2a831034` | ## libraries/ECDSA.sol -| Error | Signature | -|-------|-----------| -| `ECDSAInvalidSignature()` | `0xf645eedf` | +| Error | Signature | +| -------------------------------------- | ------------ | +| `ECDSAInvalidSignature()` | `0xf645eedf` | | `ECDSAInvalidSignatureLength(uint256)` | `0xfce698f7` | -| `ECDSAInvalidSignatureS(bytes32)` | `0xd78bce0c` | +| `ECDSAInvalidSignatureS(bytes32)` | `0xd78bce0c` | ## libraries/RescueFundsLib.sol -| Error | Signature | -|-------|-----------| +| Error | Signature | +| ----------------------- | ------------ | | `InvalidTokenAddress()` | `0x1eb00b06` | ## mock/MockSocket.sol -| Error | Signature | -|-------|-----------| +| Error | Signature | +| -------------------------- | ------------ | | `PayloadAlreadyExecuted()` | `0xe17bd578` | -| `VerificationFailed()` | `0x439cc0cd` | -| `LowGasLimit()` | `0xd38edae0` | -| `InvalidSlug()` | `0x290a8315` | -| `ExecutionFailed()` | `0xacfdb444` | +| `VerificationFailed()` | `0x439cc0cd` | +| `LowGasLimit()` | `0xd38edae0` | +| `InvalidSlug()` | `0x290a8315` | +| `ExecutionFailed()` | `0xacfdb444` | ## mock/MockWatcherPrecompile.sol -| Error | Signature | -|-------|-----------| -| `InvalidChainSlug()` | `0xbff6b106` | +| Error | Signature | +| ---------------------- | ------------ | +| `InvalidChainSlug()` | `0xbff6b106` | | `InvalidTransmitter()` | `0x58a70a0a` | ## socket/Socket.sol -| Error | Signature | -|-------|-----------| +| Error | Signature | +| -------------------------- | ------------ | | `PayloadAlreadyExecuted()` | `0xe17bd578` | -| `VerificationFailed()` | `0x439cc0cd` | -| `LowGasLimit()` | `0xd38edae0` | -| `InvalidSlug()` | `0x290a8315` | -| `ExecutionFailed()` | `0xacfdb444` | +| `VerificationFailed()` | `0x439cc0cd` | +| `LowGasLimit()` | `0xd38edae0` | +| `InvalidSlug()` | `0x290a8315` | +| `ExecutionFailed()` | `0xacfdb444` | ## socket/SocketBase.sol -| Error | Signature | -|-------|-----------| +| Error | Signature | +| ---------------------- | ------------ | | `InvalidTransmitter()` | `0x58a70a0a` | ## socket/SocketConfig.sol -| Error | Signature | -|-------|-----------| -| `SwitchboardExists()` | `0x2dff8555` | -| `InvalidConnection()` | `0x63228f29` | +| Error | Signature | +| ---------------------- | ------------ | +| `SwitchboardExists()` | `0x2dff8555` | +| `InvalidConnection()` | `0x63228f29` | | `InvalidSwitchboard()` | `0xf63c9e4d` | ## socket/switchboard/FastSwitchboard.sol -| Error | Signature | -|-------|-----------| +| Error | Signature | +| ------------------- | ------------ | | `AlreadyAttested()` | `0x35d90805` | | `WatcherNotFound()` | `0xa278e4ad` | ## socket/switchboard/SwitchboardBase.sol -| Error | Signature | -|-------|-----------| +| Error | Signature | +| ---------------- | ------------ | | `InvalidNonce()` | `0x756688fe` | ## socket/utils/AccessControl.sol -| Error | Signature | -|-------|-----------| +| Error | Signature | +| ------------------- | ------------ | | `NoPermit(bytes32)` | `0x962f6333` | ## socket/utils/SignatureVerifier.sol -| Error | Signature | -|-------|-----------| +| Error | Signature | +| -------------------- | ------------ | | `InvalidSigLength()` | `0xd2453293` | ## utils/AddressResolverUtil.sol -| Error | Signature | -|-------|-----------| -| `OnlyPayloadDelivery()` | `0x7ccc3a43` | +| Error | Signature | +| ------------------------- | ------------ | +| `OnlyPayloadDelivery()` | `0x7ccc3a43` | | `OnlyWatcherPrecompile()` | `0x663a892a` | ## utils/OwnableTwoStep.sol -| Error | Signature | -|-------|-----------| -| `OnlyOwner()` | `0x5fc483c5` | +| Error | Signature | +| --------------- | ------------ | +| `OnlyOwner()` | `0x5fc483c5` | | `OnlyNominee()` | `0x7c91ccdd` | ## watcherPrecompile/WatcherPrecompile.sol -| Error | Signature | -|-------|-----------| -| `InvalidChainSlug()` | `0xbff6b106` | -| `InvalidConnection()` | `0x63228f29` | +| Error | Signature | +| ---------------------- | ------------ | +| `InvalidChainSlug()` | `0xbff6b106` | +| `InvalidConnection()` | `0x63228f29` | | `InvalidTransmitter()` | `0x58a70a0a` | ## watcherPrecompile/WatcherPrecompileLimits.sol -| Error | Signature | -|-------|-----------| -| `ActionNotSupported(address,bytes32)` | `0xa219158f` | -| `NotDeliveryHelper()` | `0x29029c67` | +| Error | Signature | +| ------------------------------------------------ | ------------ | +| `ActionNotSupported(address,bytes32)` | `0xa219158f` | +| `NotDeliveryHelper()` | `0x29029c67` | | `LimitExceeded(address,bytes32,uint256,uint256)` | `0x80bb2621` | diff --git a/EventTopics.md b/EventTopics.md index ca2e415f..fd91d9d2 100644 --- a/EventTopics.md +++ b/EventTopics.md @@ -1,186 +1,185 @@ # Event Topics - ## AddressResolver.sol -| Event | Topic | -|-------|-------| -| `PlugAdded` | `0x2cb8d865028f9abf3dc064724043264907615fadc8615a3699a85edb66472273` | -| `ForwarderDeployed` | `0x4dbbecb9cf9c8b93da9743a2b48ea52efe68d69230ab1c1b711891d9d223b29f` | -| `AsyncPromiseDeployed` | `0xb6c5491cf83e09749b1a4dd6a9f07b0e925fcb0a915ac8c2b40e8ab28191c270` | +| Event | Topic | +| ----------------------- | -------------------------------------------------------------------- | +| `PlugAdded` | `0x2cb8d865028f9abf3dc064724043264907615fadc8615a3699a85edb66472273` | +| `ForwarderDeployed` | `0x4dbbecb9cf9c8b93da9743a2b48ea52efe68d69230ab1c1b711891d9d223b29f` | +| `AsyncPromiseDeployed` | `0xb6c5491cf83e09749b1a4dd6a9f07b0e925fcb0a915ac8c2b40e8ab28191c270` | | `ImplementationUpdated` | `0xa1e41aa2c2f3f20d9b63ac06b634d2788768d6034f3d9192cdf7d07374bb16f4` | ## apps/cron/CronAppGateway.sol -| Event | Topic | -|-------|-------| +| Event | Topic | +| ----------------- | -------------------------------------------------------------------- | | `TimeoutResolved` | `0x21f74fe97870cde3cfbde7addf2b9343c27ca433b826801e63b3d6153699ec3f` | ## apps/payload-delivery/ContractFactoryPlug.sol -| Event | Topic | -|-------|-------| +| Event | Topic | +| ---------- | -------------------------------------------------------------------- | | `Deployed` | `0x94bfd9af14ef450884c8a7ddb5734e2e1e14e70a1c84f0801cc5a29e34d26428` | ## apps/payload-delivery/FeesPlug.sol -| Event | Topic | -|-------|-------| +| Event | Topic | +| --------------- | -------------------------------------------------------------------- | | `FeesDeposited` | `0x0fd38537e815732117cfdab41ba9b6d3eb2c5799d44039c100c05fc9c112f235` | | `FeesWithdrawn` | `0x87044da2612407bc001bb0985725dcc651a0dc71eaabfd1d7e8617ca85a8c19c` | ## apps/payload-delivery/app-gateway/AuctionManager.sol -| Event | Topic | -|-------|-------| +| Event | Topic | +| ---------------- | -------------------------------------------------------------------- | | `AuctionStarted` | `0x884055d82c091219e252c5c2acca6051c823fcba97cecb3ba07d5f06c1628e6c` | -| `AuctionEnded` | `0xefa02d67c6f01c72b191e6c5076e63d9a4941f9037bf1c4aa4ccc613340e1571` | -| `BidPlaced` | `0xaf5c23b337289338f72cec2fdec2c736d419c7607e4c840ee4d28176477d4e08` | +| `AuctionEnded` | `0xefa02d67c6f01c72b191e6c5076e63d9a4941f9037bf1c4aa4ccc613340e1571` | +| `BidPlaced` | `0xaf5c23b337289338f72cec2fdec2c736d419c7607e4c840ee4d28176477d4e08` | ## apps/payload-delivery/app-gateway/BatchAsync.sol -| Event | Topic | -|-------|-------| -| `PayloadSubmitted` | `0xaab415570fdc7fb2a70601b49667178ab5f887c7901dc5e84b853c5bad514106` | -| `FeesIncreased` | `0xf1a5d6adcecf6c2be482b515e9564a9898cd629b54c57ede69295dffbf16bb1d` | +| Event | Topic | +| ----------------------- | -------------------------------------------------------------------- | +| `PayloadSubmitted` | `0xaab415570fdc7fb2a70601b49667178ab5f887c7901dc5e84b853c5bad514106` | +| `FeesIncreased` | `0xf1a5d6adcecf6c2be482b515e9564a9898cd629b54c57ede69295dffbf16bb1d` | | `PayloadAsyncRequested` | `0x71c5226e31c1ad0fb69f89c62225760ba7c06c4ebdd284dfc71fd61603120d95` | -| `BatchCancelled` | `0xac01c50ce693d1fe783ba60ec0f82ab99f65e62446fffb028e3bd639cd5684d4` | +| `BatchCancelled` | `0xac01c50ce693d1fe783ba60ec0f82ab99f65e62446fffb028e3bd639cd5684d4` | ## apps/payload-delivery/app-gateway/DeliveryHelper.sol -| Event | Topic | -|-------|-------| +| Event | Topic | +| ------------------ | -------------------------------------------------------------------- | | `CallBackReverted` | `0xb793657774d4efcce6746ecc3d896279387c392fe6f6f2932daf35d5a1d65be6` | ## apps/payload-delivery/app-gateway/FeesManager.sol -| Event | Topic | -|-------|-------| -| `FeesBlocked` | `0xc1639cc709c1b397fa20d3a1ece33aee2eb5c29573fe9e1e06d2364d40cdf2f7` | -| `TransmitterFeesUpdated` | `0x409067fdd2f9c474161a5b1f96399f2d24c45cfc4a93f4b1c27c9bf351f1e2bb` | -| `FeesDepositedUpdated` | `0xe82dece33ef85114446a366b7d94538d641968e3ec87bf9f2f5a957ace1086e7` | +| Event | Topic | +| -------------------------- | -------------------------------------------------------------------- | +| `FeesBlocked` | `0xc1639cc709c1b397fa20d3a1ece33aee2eb5c29573fe9e1e06d2364d40cdf2f7` | +| `TransmitterFeesUpdated` | `0x409067fdd2f9c474161a5b1f96399f2d24c45cfc4a93f4b1c27c9bf351f1e2bb` | +| `FeesDepositedUpdated` | `0xe82dece33ef85114446a366b7d94538d641968e3ec87bf9f2f5a957ace1086e7` | | `FeesUnblockedAndAssigned` | `0x09a0f93a20f672833eeac3a1c9d63495cfcbee2e32f968e947a6124054b44a79` | -| `FeesUnblocked` | `0x5290de2b93b8542dc233ee9f02c346e94a47254ed50e00738e6d7ec4a54bcb3a` | +| `FeesUnblocked` | `0x5290de2b93b8542dc233ee9f02c346e94a47254ed50e00738e6d7ec4a54bcb3a` | ## apps/payload-delivery/app-gateway/QueueAsync.sol -| Event | Topic | -|-------|-------| +| Event | Topic | +| ----------------------- | -------------------------------------------------------------------- | | `PayloadBatchCancelled` | `0xae2e532ea00438ec2fc3e806f19c85f21334853d16c32107c75ff8d176af7633` | ## apps/super-token/SuperTokenAppGateway.sol -| Event | Topic | -|-------|-------| +| Event | Topic | +| ------------- | -------------------------------------------------------------------- | | `Transferred` | `0xd729be146db2a3467d5eaf1eed3f1afcdd5cc05d1b3b14d27675e36844fb3aba` | ## apps/super-token-lockable/SuperTokenLockableAppGateway.sol -| Event | Topic | -|-------|-------| +| Event | Topic | +| --------- | -------------------------------------------------------------------- | | `Bridged` | `0x19138f4129b378a375fc2f5ca3b1be3fea2f048ef2b1884a1d0fff5dca83e0ac` | ## base/PlugBase.sol -| Event | Topic | -|-------|-------| +| Event | Topic | +| --------------------------- | -------------------------------------------------------------------- | | `ConnectorPlugDisconnected` | `0xc2af098c82dba3c4b00be8bda596d62d13b98a87b42626fefa67e0bb0e198fdd` | ## interfaces/IAddressResolver.sol -| Event | Topic | -|-------|-------| +| Event | Topic | +| ------------ | -------------------------------------------------------------------- | | `AddressSet` | `0x9ef0e8c8e52743bb38b83b17d9429141d494b8041ca6d616a6c77cebae9cd8b7` | ## interfaces/IDeliveryHelper.sol -| Event | Topic | -|-------|-------| -| `BidPlaced` | `0xaf5c23b337289338f72cec2fdec2c736d419c7607e4c840ee4d28176477d4e08` | +| Event | Topic | +| -------------- | -------------------------------------------------------------------- | +| `BidPlaced` | `0xaf5c23b337289338f72cec2fdec2c736d419c7607e4c840ee4d28176477d4e08` | | `AuctionEnded` | `0xefa02d67c6f01c72b191e6c5076e63d9a4941f9037bf1c4aa4ccc613340e1571` | ## interfaces/IERC20.sol -| Event | Topic | -|-------|-------| +| Event | Topic | +| ---------- | -------------------------------------------------------------------- | | `Transfer` | `0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef` | | `Approval` | `0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925` | ## interfaces/ISocket.sol -| Event | Topic | -|-------|-------| -| `ExecutionSuccess` | `0xc54787fbe087097b182e713f16d3443ad2e67cbe6732628451dd3695a11814c2` | -| `PlugConnected` | `0x99c37c6da3bd69c6d59967915f8339f11a0a17fed28c615efb19457fdec0d7db` | +| Event | Topic | +| ------------------------- | -------------------------------------------------------------------- | +| `ExecutionSuccess` | `0xc54787fbe087097b182e713f16d3443ad2e67cbe6732628451dd3695a11814c2` | +| `PlugConnected` | `0x99c37c6da3bd69c6d59967915f8339f11a0a17fed28c615efb19457fdec0d7db` | | `AppGatewayCallRequested` | `0x392cb36fae7bd0470268c65b15c32a745b37168c4ccd13348c59bd9170f3b3e8` | ## mock/MockWatcherPrecompile.sol -| Event | Topic | -|-------|-------| -| `CalledAppGateway` | `0x255bcf22d238fe60f6611670cd7919d2bc890283be2fdaf6d2ad3411e777e33c` | -| `QueryRequested` | `0x19a4898a6390d795c9d86362d12853f4f6515b41b95a57f9b28774b4b36fc916` | +| Event | Topic | +| ------------------- | -------------------------------------------------------------------- | +| `CalledAppGateway` | `0x255bcf22d238fe60f6611670cd7919d2bc890283be2fdaf6d2ad3411e777e33c` | +| `QueryRequested` | `0x19a4898a6390d795c9d86362d12853f4f6515b41b95a57f9b28774b4b36fc916` | | `FinalizeRequested` | `0x17e763b469fcd8535794b9c8c1452d90597be1eeb0eb0367662e18c067fe9656` | -| `Finalized` | `0x8ee21307ed5b839a691d488e11de81bee61525893865b7ae106cc712ef42376e` | -| `PromiseResolved` | `0x2e6de63938bd94bb20d9aa80f8bc4b07be2d8fbd4525664156351836588ed365` | -| `TimeoutRequested` | `0xdf94fed77e41734b8a17815476bbbf88e2db15d762f42a30ddb9d7870f2fb858` | -| `TimeoutResolved` | `0x221462ec065e22637f794ec3a7edb17b2f04bec88f0546dda308bc37a83801b8` | +| `Finalized` | `0x8ee21307ed5b839a691d488e11de81bee61525893865b7ae106cc712ef42376e` | +| `PromiseResolved` | `0x2e6de63938bd94bb20d9aa80f8bc4b07be2d8fbd4525664156351836588ed365` | +| `TimeoutRequested` | `0xdf94fed77e41734b8a17815476bbbf88e2db15d762f42a30ddb9d7870f2fb858` | +| `TimeoutResolved` | `0x221462ec065e22637f794ec3a7edb17b2f04bec88f0546dda308bc37a83801b8` | ## socket/SocketBase.sol -| Event | Topic | -|-------|-------| -| `HasherSet` | `0xc7238b23787eb9f8aa74c79b27083bb4b8f0db527df90366b487c40fa0ba2d3a` | +| Event | Topic | +| ---------------------- | -------------------------------------------------------------------- | +| `HasherSet` | `0xc7238b23787eb9f8aa74c79b27083bb4b8f0db527df90366b487c40fa0ba2d3a` | | `SignatureVerifierSet` | `0xcb341def955dbf73920141be056568edde30b1dbc56a29396945e5596a03c68c` | ## socket/SocketConfig.sol -| Event | Topic | -|-------|-------| +| Event | Topic | +| ------------------ | -------------------------------------------------------------------- | | `SwitchboardAdded` | `0x1595852923edfbbf906f09fc8523e4cfb022a194773c4d1509446b614146ee88` | ## socket/switchboard/FastSwitchboard.sol -| Event | Topic | -|-------|-------| +| Event | Topic | +| ---------- | -------------------------------------------------------------------- | | `Attested` | `0x2f8e66b1207a4b70274a2a3da88ffb5737c8214576490da1b35acc38b2d62db6` | ## socket/utils/AccessControl.sol -| Event | Topic | -|-------|-------| +| Event | Topic | +| ------------- | -------------------------------------------------------------------- | | `RoleGranted` | `0x2ae6a113c0ed5b78a53413ffbb7679881f11145ccfba4fb92e863dfcd5a1d2f3` | | `RoleRevoked` | `0x155aaafb6329a2098580462df33ec4b7441b19729b9601c5fc17ae1cf99a8a52` | ## utils/OwnableTwoStep.sol -| Event | Topic | -|-------|-------| +| Event | Topic | +| ---------------- | -------------------------------------------------------------------- | | `OwnerNominated` | `0x906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce22` | -| `OwnerClaimed` | `0xfbe19c9b601f5ee90b44c7390f3fa2319eba01762d34ee372aeafd59b25c7f87` | +| `OwnerClaimed` | `0xfbe19c9b601f5ee90b44c7390f3fa2319eba01762d34ee372aeafd59b25c7f87` | ## watcherPrecompile/WatcherPrecompile.sol -| Event | Topic | -|-------|-------| -| `CalledAppGateway` | `0x255bcf22d238fe60f6611670cd7919d2bc890283be2fdaf6d2ad3411e777e33c` | -| `QueryRequested` | `0x19a4898a6390d795c9d86362d12853f4f6515b41b95a57f9b28774b4b36fc916` | +| Event | Topic | +| ------------------- | -------------------------------------------------------------------- | +| `CalledAppGateway` | `0x255bcf22d238fe60f6611670cd7919d2bc890283be2fdaf6d2ad3411e777e33c` | +| `QueryRequested` | `0x19a4898a6390d795c9d86362d12853f4f6515b41b95a57f9b28774b4b36fc916` | | `FinalizeRequested` | `0x17e763b469fcd8535794b9c8c1452d90597be1eeb0eb0367662e18c067fe9656` | -| `Finalized` | `0x8ee21307ed5b839a691d488e11de81bee61525893865b7ae106cc712ef42376e` | -| `PromiseResolved` | `0x3f1120f34271f52a541dfc8a71efbe6123ab80730562e8948fa7275514c41bda` | -| `TimeoutRequested` | `0xdf94fed77e41734b8a17815476bbbf88e2db15d762f42a30ddb9d7870f2fb858` | -| `TimeoutResolved` | `0x221462ec065e22637f794ec3a7edb17b2f04bec88f0546dda308bc37a83801b8` | +| `Finalized` | `0x8ee21307ed5b839a691d488e11de81bee61525893865b7ae106cc712ef42376e` | +| `PromiseResolved` | `0x3f1120f34271f52a541dfc8a71efbe6123ab80730562e8948fa7275514c41bda` | +| `TimeoutRequested` | `0xdf94fed77e41734b8a17815476bbbf88e2db15d762f42a30ddb9d7870f2fb858` | +| `TimeoutResolved` | `0x221462ec065e22637f794ec3a7edb17b2f04bec88f0546dda308bc37a83801b8` | ## watcherPrecompile/WatcherPrecompileConfig.sol -| Event | Topic | -|-------|-------| -| `PlugAdded` | `0x2cb8d865028f9abf3dc064724043264907615fadc8615a3699a85edb66472273` | +| Event | Topic | +| ---------------- | -------------------------------------------------------------------- | +| `PlugAdded` | `0x2cb8d865028f9abf3dc064724043264907615fadc8615a3699a85edb66472273` | | `SwitchboardSet` | `0x6273f161f4a795e66ef3585d9b4442ef3796b32337157fdfb420b5281e4cf2e3` | ## watcherPrecompile/WatcherPrecompileLimits.sol -| Event | Topic | -|-------|-------| -| `LimitParamsUpdated` | `0x76b76501b1f65d80b7de6c1a42b2245466c1c80504052e7ad48e86b6038d39a1` | +| Event | Topic | +| --------------------- | -------------------------------------------------------------------- | +| `LimitParamsUpdated` | `0x76b76501b1f65d80b7de6c1a42b2245466c1c80504052e7ad48e86b6038d39a1` | | `AppGatewayActivated` | `0x44628d7d5628b9fbc2c84ea9bf3bd3987fa9cde8d2b28e2d5ceb451f916cb8b9` | diff --git a/hardhat-scripts/utils/getEventTopics.ts b/hardhat-scripts/utils/getEventTopics.ts index 66cd0d0b..09339479 100644 --- a/hardhat-scripts/utils/getEventTopics.ts +++ b/hardhat-scripts/utils/getEventTopics.ts @@ -2,7 +2,6 @@ import fs from "fs"; import path from "path"; import { ethers } from "ethers"; - // Function to recursively get all .sol files function getSolFiles(dir: string, fileList: string[] = []): string[] { const files = fs.readdirSync(dir); diff --git a/script/CheckDepositedFees.s.sol b/script/CheckDepositedFees.s.sol index 12ad3355..8cd4838c 100644 --- a/script/CheckDepositedFees.s.sol +++ b/script/CheckDepositedFees.s.sol @@ -13,7 +13,11 @@ contract CheckDepositedFees is Script { FeesManager feesManager = FeesManager(payable(vm.envAddress("FEES_MANAGER"))); address appGateway = vm.envAddress("APP_GATEWAY"); - (uint256 deposited, uint256 blocked) = feesManager.appGatewayFeeBalances(appGateway, 421614, ETH_ADDRESS); + (uint256 deposited, uint256 blocked) = feesManager.appGatewayFeeBalances( + appGateway, + 421614, + ETH_ADDRESS + ); console.log("App Gateway:", appGateway); console.log("Deposited fees:", deposited); console.log("Blocked fees:", blocked); @@ -22,4 +26,3 @@ contract CheckDepositedFees is Script { console.log("Available fees:", availableFees); } } - From 6cbfed0c915b2a4b5c84e552137f134a57a8df0a Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Thu, 20 Feb 2025 12:28:30 +0400 Subject: [PATCH 081/186] feat: payload deadline --- contracts/interfaces/ISocket.sol | 23 ++++++++--- contracts/mock/MockSocket.sol | 10 ++--- contracts/protocol/socket/Socket.sol | 39 ++++++++++--------- contracts/protocol/socket/SocketBatcher.sol | 15 ++++--- contracts/protocol/socket/SocketUtils.sol | 6 ++- contracts/protocol/utils/common/Structs.sol | 5 ++- .../watcherPrecompile/WatcherPrecompile.sol | 1 + script/mock/FinalizeAndExecution.s.sol | 12 +++++- test/SetupTest.t.sol | 4 +- 9 files changed, 73 insertions(+), 42 deletions(-) diff --git a/contracts/interfaces/ISocket.sol b/contracts/interfaces/ISocket.sol index 0e0b371b..5727abee 100644 --- a/contracts/interfaces/ISocket.sol +++ b/contracts/interfaces/ISocket.sol @@ -42,6 +42,22 @@ interface ISocket { bytes payload ); + /** + * @notice params for executing a payload + * @param payloadId the id of the payload + * @param target the address of the contract to call + * @param executionGasLimit the gas limit for the execution + * @param deadline the deadline for the execution + * @param payload the data to be executed + */ + struct ExecuteParams { + bytes32 payloadId; + address target; + uint256 executionGasLimit; + uint256 deadline; + bytes payload; + } + /** * @notice To call the appGateway on offChainVM. Should only be called by a plug. * @param payload_ bytes to be delivered to the Plug on offChainVM @@ -56,12 +72,9 @@ interface ISocket { * @notice executes a payload */ function execute( - bytes32 payloadId_, address appGateway_, - address target_, - uint256 executionGasLimit_, - bytes memory transmitterSignature_, - bytes memory payload_ + ExecuteParams memory params_, + bytes memory transmitterSignature_ ) external payable returns (bytes memory); /** diff --git a/contracts/mock/MockSocket.sol b/contracts/mock/MockSocket.sol index 43fc9165..11ff3930 100644 --- a/contracts/mock/MockSocket.sol +++ b/contracts/mock/MockSocket.sol @@ -107,15 +107,13 @@ contract MockSocket is ISocket { * @notice Executes a payload that has been delivered by transmitters and authenticated by switchboards */ function execute( - bytes32 payloadId_, address, - address target_, - uint256 executionGasLimit_, - bytes memory, - bytes memory payload_ + ExecuteParams memory params_, + bytes memory ) external payable returns (bytes memory) { // execute payload - return _execute(target_, payloadId_, executionGasLimit_, payload_); + return + _execute(params_.target, params_.payloadId, params_.executionGasLimit, params_.payload); } //////////////////////////////////////////////////////// diff --git a/contracts/protocol/socket/Socket.sol b/contracts/protocol/socket/Socket.sol index 8aba88e4..67421191 100644 --- a/contracts/protocol/socket/Socket.sol +++ b/contracts/protocol/socket/Socket.sol @@ -40,6 +40,7 @@ contract Socket is SocketUtils { error LowGasLimit(); error InvalidSlug(); error ExecutionFailed(); + error DeadlinePassed(); //////////////////////////////////////////////////////////// ////////////////////// State Vars ////////////////////////// @@ -90,50 +91,50 @@ contract Socket is SocketUtils { * @notice Executes a payload that has been delivered by transmitters and authenticated by switchboards */ function execute( - bytes32 payloadId_, address appGateway_, - address target_, - uint256 executionGasLimit_, - bytes memory transmitterSignature_, - bytes memory payload_ + ExecuteParams memory params_, + bytes memory transmitterSignature_ ) external payable returns (bytes memory) { // make sure payload is not executed already - if (payloadExecuted[payloadId_]) revert PayloadAlreadyExecuted(); + if (payloadExecuted[params_.payloadId]) revert PayloadAlreadyExecuted(); // update state to make sure no reentrancy - payloadExecuted[payloadId_] = true; + payloadExecuted[params_.payloadId] = true; + + if (params_.deadline < block.timestamp) revert DeadlinePassed(); // extract plug address from msgID - address switchboard = _decodeSwitchboard(payloadId_); - uint32 localSlug = _decodeChainSlug(payloadId_); + address switchboard = _decodeSwitchboard(params_.payloadId); + uint32 localSlug = _decodeChainSlug(params_.payloadId); - PlugConfig memory plugConfig = _plugConfigs[target_]; + PlugConfig memory plugConfig = _plugConfigs[params_.target]; if (switchboard != address(plugConfig.switchboard__)) revert InvalidSwitchboard(); - if (localSlug != chainSlug) revert InvalidSlug(); address transmitter = _recoverSigner( - keccak256(abi.encode(address(this), payloadId_)), + keccak256(abi.encode(address(this), params_.payloadId)), transmitterSignature_ ); // create packed payload bytes32 root = _packPayload( - payloadId_, + params_.payloadId, appGateway_, transmitter, - target_, - executionGasLimit_, - payload_, - msg.value + params_.target, + msg.value, + params_.deadline, + params_.executionGasLimit, + params_.payload ); // verify payload was part of the packet and // authenticated by respective switchboard - _verify(root, payloadId_, ISwitchboard(switchboard)); + _verify(root, params_.payloadId, ISwitchboard(switchboard)); // execute payload - return _execute(target_, payloadId_, executionGasLimit_, payload_); + return + _execute(params_.target, params_.payloadId, params_.executionGasLimit, params_.payload); } //////////////////////////////////////////////////////// diff --git a/contracts/protocol/socket/SocketBatcher.sol b/contracts/protocol/socket/SocketBatcher.sol index 685e2111..dba5678f 100644 --- a/contracts/protocol/socket/SocketBatcher.sol +++ b/contracts/protocol/socket/SocketBatcher.sol @@ -33,14 +33,19 @@ contract SocketBatcher is Ownable { params_.root, params_.watcherSignature ); + + ISocket.ExecuteParams memory executeParams = ISocket.ExecuteParams({ + payloadId: params_.payloadId, + target: params_.target, + executionGasLimit: params_.executionGasLimit, + deadline: params_.deadline, + payload: params_.payload + }); return socket__.execute( - params_.payloadId, params_.appGateway, - params_.target, - params_.executionGasLimit, - params_.transmitterSignature, - params_.payload + executeParams, + params_.transmitterSignature ); } diff --git a/contracts/protocol/socket/SocketUtils.sol b/contracts/protocol/socket/SocketUtils.sol index a7081cab..e46dd0fb 100644 --- a/contracts/protocol/socket/SocketUtils.sol +++ b/contracts/protocol/socket/SocketUtils.sol @@ -52,9 +52,10 @@ abstract contract SocketUtils is SocketConfig { address appGateway_, address transmitter_, address target_, + uint256 value_, + uint256 deadline_, uint256 executionGasLimit_, - bytes memory payload_, - uint256 value_ + bytes memory payload_ ) internal pure returns (bytes32) { return keccak256( @@ -64,6 +65,7 @@ abstract contract SocketUtils is SocketConfig { transmitter_, target_, value_, + deadline_, executionGasLimit_, payload_ ) diff --git a/contracts/protocol/utils/common/Structs.sol b/contracts/protocol/utils/common/Structs.sol index deaa74bc..d47506f9 100644 --- a/contracts/protocol/utils/common/Structs.sol +++ b/contracts/protocol/utils/common/Structs.sol @@ -32,7 +32,7 @@ struct AsyncRequest { address target; address switchboard; uint256 executionGasLimit; - uint256 expiryTime; + uint256 deadline; bytes32 asyncId; bytes32 root; bytes payload; @@ -79,6 +79,7 @@ struct ExecutePayloadParams { address appGateway; address target; uint256 executionGasLimit; + uint256 deadline; bytes watcherSignature; bytes transmitterSignature; bytes payload; @@ -135,7 +136,7 @@ struct PayloadRootParams { bytes32 payloadId; uint256 value; uint256 executionGasLimit; - uint256 expiryTime; + uint256 deadline; bytes payload; } diff --git a/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol b/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol index b81912aa..84af7535 100644 --- a/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol +++ b/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol @@ -358,6 +358,7 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { params_.transmitter, params_.target, params_.value, + params_.deadline, params_.executionGasLimit, params_.payload ) diff --git a/script/mock/FinalizeAndExecution.s.sol b/script/mock/FinalizeAndExecution.s.sol index 7c8642db..628bd4aa 100644 --- a/script/mock/FinalizeAndExecution.s.sol +++ b/script/mock/FinalizeAndExecution.s.sol @@ -4,7 +4,7 @@ pragma solidity ^0.8.0; import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/console.sol"; import {MockWatcherPrecompile} from "../../contracts/mock/MockWatcherPrecompile.sol"; -import {MockSocket} from "../../contracts/mock/MockSocket.sol"; +import "../../contracts/mock/MockSocket.sol"; import {CallType, FinalizeParams, PayloadDetails, Parallel} from "../../contracts/protocol/utils/common/Structs.sol"; contract InboxTest is Script { function run() external { @@ -45,7 +45,15 @@ contract InboxTest is Script { vm.startBroadcast(arbDeployerPrivateKey); address socket = vm.envAddress("SOCKET"); MockSocket socketInstance = MockSocket(socket); - socketInstance.execute(payloadId, address(0), address(0), 10000000, bytes(""), bytes("")); + + ISocket.ExecuteParams memory executeParams = ISocket.ExecuteParams({ + payloadId: payloadId, + target: address(0), + executionGasLimit: 10000000, + deadline: 10000000, + payload: bytes("") + }); + socketInstance.execute(address(0), executeParams, bytes("")); vm.stopBroadcast(); } } diff --git a/test/SetupTest.t.sol b/test/SetupTest.t.sol index 498393d3..6b491c7f 100644 --- a/test/SetupTest.t.sol +++ b/test/SetupTest.t.sol @@ -33,6 +33,7 @@ contract SetupTest is Test { uint32 arbChainSlug = 421614; uint32 optChainSlug = 11155420; uint32 vmChainSlug = 1; + uint256 expiryTime = 10000000; uint256 public payloadIdCounter = 0; uint256 public defaultLimit = 1000; @@ -186,7 +187,8 @@ contract SetupTest is Test { executionGasLimit: payloadDetails.executionGasLimit, transmitterSignature: transmitterSig, payload: payloadDetails.payload, - target: payloadDetails.target + target: payloadDetails.target, + deadline: block.timestamp + expiryTime }); bytes memory returnData = socketConfig.socketBatcher.attestAndExecute(params); From 7ab89293b7f31171b4c3ddc2725015dd79b26480 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Thu, 20 Feb 2025 12:36:25 +0400 Subject: [PATCH 082/186] fix: rename struct --- contracts/interfaces/ISocketBatcher.sol | 2 +- contracts/protocol/socket/SocketBatcher.sol | 11 +++-------- contracts/protocol/utils/common/Structs.sol | 2 +- script/CheckDepositedFees.s.sol | 6 +++--- test/SetupTest.t.sol | 2 +- 5 files changed, 9 insertions(+), 14 deletions(-) diff --git a/contracts/interfaces/ISocketBatcher.sol b/contracts/interfaces/ISocketBatcher.sol index 513687b5..1626e0ae 100644 --- a/contracts/interfaces/ISocketBatcher.sol +++ b/contracts/interfaces/ISocketBatcher.sol @@ -5,6 +5,6 @@ import "../protocol/utils/common/Structs.sol"; interface ISocketBatcher { function attestAndExecute( - ExecutePayloadParams calldata params_ + AttestAndExecutePayloadParams calldata params_ ) external returns (bytes memory); } diff --git a/contracts/protocol/socket/SocketBatcher.sol b/contracts/protocol/socket/SocketBatcher.sol index dba5678f..ea32d5d9 100644 --- a/contracts/protocol/socket/SocketBatcher.sol +++ b/contracts/protocol/socket/SocketBatcher.sol @@ -5,7 +5,7 @@ import "solady/auth/Ownable.sol"; import "../../interfaces/ISocket.sol"; import "../../interfaces/ISwitchboard.sol"; import "../utils/RescueFundsLib.sol"; -import {ExecutePayloadParams} from "../../protocol/utils/common/Structs.sol"; +import {AttestAndExecutePayloadParams} from "../../protocol/utils/common/Structs.sol"; /** * @title SocketBatcher @@ -26,7 +26,7 @@ contract SocketBatcher is Ownable { } function attestAndExecute( - ExecutePayloadParams calldata params_ + AttestAndExecutePayloadParams calldata params_ ) external returns (bytes memory) { ISwitchboard(params_.switchboard).attest( params_.payloadId, @@ -41,12 +41,7 @@ contract SocketBatcher is Ownable { deadline: params_.deadline, payload: params_.payload }); - return - socket__.execute( - params_.appGateway, - executeParams, - params_.transmitterSignature - ); + return socket__.execute(params_.appGateway, executeParams, params_.transmitterSignature); } function rescueFunds(address token_, address to_, uint256 amount_) external onlyOwner { diff --git a/contracts/protocol/utils/common/Structs.sol b/contracts/protocol/utils/common/Structs.sol index d47506f9..5aa22d93 100644 --- a/contracts/protocol/utils/common/Structs.sol +++ b/contracts/protocol/utils/common/Structs.sol @@ -72,7 +72,7 @@ struct DeployParams { bytes bytecode; } -struct ExecutePayloadParams { +struct AttestAndExecutePayloadParams { bytes32 payloadId; bytes32 root; address switchboard; diff --git a/script/CheckDepositedFees.s.sol b/script/CheckDepositedFees.s.sol index 8cd4838c..8684a3e4 100644 --- a/script/CheckDepositedFees.s.sol +++ b/script/CheckDepositedFees.s.sol @@ -3,9 +3,9 @@ pragma solidity ^0.8.0; import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/Console.sol"; -import {FeesManager} from "../contracts/apps/payload-delivery/app-gateway/FeesManager.sol"; -import {Fees} from "../contracts/common/Structs.sol"; -import {ETH_ADDRESS} from "../contracts/common/Constants.sol"; +import {FeesManager} from "../contracts/protocol/payload-delivery/app-gateway/FeesManager.sol"; +import {Fees} from "../contracts/protocol/utils/common/Structs.sol"; +import {ETH_ADDRESS} from "../contracts/protocol/utils/common/Constants.sol"; contract CheckDepositedFees is Script { function run() external { diff --git a/test/SetupTest.t.sol b/test/SetupTest.t.sol index 6b491c7f..b3d2a873 100644 --- a/test/SetupTest.t.sol +++ b/test/SetupTest.t.sol @@ -178,7 +178,7 @@ contract SetupTest is Test { bytes memory transmitterSig = _createSignature(transmitterDigest, transmitterPrivateKey); vm.startPrank(transmitterEOA); - ExecutePayloadParams memory params = ExecutePayloadParams({ + AttestAndExecutePayloadParams memory params = AttestAndExecutePayloadParams({ switchboard: address(socketConfig.switchboard), root: root, watcherSignature: watcherSignature, From 187a8735997c81d9f6e09a1e562fed486ae9d2ee Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Thu, 20 Feb 2025 13:22:50 +0400 Subject: [PATCH 083/186] fix: enum --- contracts/apps/counter/CounterDeployer.sol | 2 +- .../apps/parallel-counter/ParallelCounterDeployer.sol | 8 ++++---- .../super-token-lockable/SuperTokenLockableDeployer.sol | 4 ++-- contracts/apps/super-token/SuperTokenDeployer.sol | 2 +- contracts/base/AppDeployerBase.sol | 4 ++-- contracts/interfaces/IDeliveryHelper.sol | 4 ++-- contracts/protocol/Forwarder.sol | 2 +- .../payload-delivery/app-gateway/AuctionManager.sol | 2 -- .../protocol/payload-delivery/app-gateway/QueueAsync.sol | 4 ++-- contracts/protocol/utils/common/Structs.sol | 7 ++++++- 10 files changed, 21 insertions(+), 18 deletions(-) diff --git a/contracts/apps/counter/CounterDeployer.sol b/contracts/apps/counter/CounterDeployer.sol index 645686fc..8ae8c2f3 100644 --- a/contracts/apps/counter/CounterDeployer.sol +++ b/contracts/apps/counter/CounterDeployer.sol @@ -20,7 +20,7 @@ contract CounterDeployer is AppDeployerBase, Ownable { } function deployContracts(uint32 chainSlug_) external async { - _deploy(counter, chainSlug_, true); + _deploy(counter, chainSlug_, IsPlug.YES); } function initialize(uint32) public pure override { diff --git a/contracts/apps/parallel-counter/ParallelCounterDeployer.sol b/contracts/apps/parallel-counter/ParallelCounterDeployer.sol index 1eb8eb1a..7c4e27c5 100644 --- a/contracts/apps/parallel-counter/ParallelCounterDeployer.sol +++ b/contracts/apps/parallel-counter/ParallelCounterDeployer.sol @@ -22,14 +22,14 @@ contract ParallelCounterDeployer is AppDeployerBase, Ownable { } function deployContracts(uint32 chainSlug_) external async { - _deploy(counter1, chainSlug_, true); - _deploy(counter2, chainSlug_, true); + _deploy(counter1, chainSlug_, IsPlug.YES); + _deploy(counter2, chainSlug_, IsPlug.YES); } function deployMultiChainContracts(uint32[] memory chainSlugs_) external async { for (uint32 i = 0; i < chainSlugs_.length; i++) { - _deploy(counter1, chainSlugs_[i], true); - _deploy(counter2, chainSlugs_[i], true); + _deploy(counter1, chainSlugs_[i], IsPlug.YES); + _deploy(counter2, chainSlugs_[i], IsPlug.YES); } } diff --git a/contracts/apps/super-token-lockable/SuperTokenLockableDeployer.sol b/contracts/apps/super-token-lockable/SuperTokenLockableDeployer.sol index 2812fa5f..2e2d1ee7 100644 --- a/contracts/apps/super-token-lockable/SuperTokenLockableDeployer.sol +++ b/contracts/apps/super-token-lockable/SuperTokenLockableDeployer.sol @@ -49,8 +49,8 @@ contract SuperTokenLockableDeployer is AppDeployerBase, Ownable { } function deployContracts(uint32 chainSlug_) external async { - _deploy(superTokenLockable, chainSlug_, true); - _deploy(limitHook, chainSlug_, true); + _deploy(superTokenLockable, chainSlug_, IsPlug.YES); + _deploy(limitHook, chainSlug_, IsPlug.YES); } // don't need to call this directly, will be called automatically after all contracts are deployed. diff --git a/contracts/apps/super-token/SuperTokenDeployer.sol b/contracts/apps/super-token/SuperTokenDeployer.sol index b0d47ca8..a8c4993c 100644 --- a/contracts/apps/super-token/SuperTokenDeployer.sol +++ b/contracts/apps/super-token/SuperTokenDeployer.sol @@ -38,7 +38,7 @@ contract SuperTokenDeployer is AppDeployerBase, Ownable { } function deployContracts(uint32 chainSlug_) external async { - _deploy(superToken, chainSlug_, true); + _deploy(superToken, chainSlug_, IsPlug.YES); } // no need to call this directly, will be called automatically after all contracts are deployed. diff --git a/contracts/base/AppDeployerBase.sol b/contracts/base/AppDeployerBase.sol index 2674fb3d..78d84bc6 100644 --- a/contracts/base/AppDeployerBase.sol +++ b/contracts/base/AppDeployerBase.sol @@ -25,7 +25,7 @@ abstract contract AppDeployerBase is AppGatewayBase, IAppDeployer { /// @notice Deploys a contract /// @param contractId_ The contract ID /// @param chainSlug_ The chain slug - function _deploy(bytes32 contractId_, uint32 chainSlug_, bool isPlug_) internal { + function _deploy(bytes32 contractId_, uint32 chainSlug_, IsPlug isPlug_) internal { _deploy(contractId_, chainSlug_, isPlug_, bytes("")); } @@ -35,7 +35,7 @@ abstract contract AppDeployerBase is AppGatewayBase, IAppDeployer { function _deploy( bytes32 contractId_, uint32 chainSlug_, - bool isPlug_, + IsPlug isPlug_, bytes memory initCallData_ ) internal { address asyncPromise = addressResolver__.deployAsyncPromiseContract(address(this)); diff --git a/contracts/interfaces/IDeliveryHelper.sol b/contracts/interfaces/IDeliveryHelper.sol index ab969695..d6cd4fd3 100644 --- a/contracts/interfaces/IDeliveryHelper.sol +++ b/contracts/interfaces/IDeliveryHelper.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.3; -import {PayloadDetails, Bid, Fees, DeployParams, CallType, PayloadBatch, Parallel} from "../protocol/utils/common/Structs.sol"; +import {PayloadDetails, Bid, Fees, DeployParams, CallType, PayloadBatch, Parallel, IsPlug} from "../protocol/utils/common/Structs.sol"; interface IDeliveryHelper { event BidPlaced( @@ -20,7 +20,7 @@ interface IDeliveryHelper { function clearQueue() external; function queue( - bool isPlug_, + IsPlug isPlug_, Parallel isParallel_, uint32 chainSlug_, address target_, diff --git a/contracts/protocol/Forwarder.sol b/contracts/protocol/Forwarder.sol index 227b525a..f208a949 100644 --- a/contracts/protocol/Forwarder.sol +++ b/contracts/protocol/Forwarder.sol @@ -86,7 +86,7 @@ contract Forwarder is IForwarder, Initializable { // Queue the call in the auction house. IDeliveryHelper(deliveryHelper).queue( - false, + IsPlug.NO, isParallelCall, chainSlug, onChainAddress, diff --git a/contracts/protocol/payload-delivery/app-gateway/AuctionManager.sol b/contracts/protocol/payload-delivery/app-gateway/AuctionManager.sol index fb7dfdec..29528779 100644 --- a/contracts/protocol/payload-delivery/app-gateway/AuctionManager.sol +++ b/contracts/protocol/payload-delivery/app-gateway/AuctionManager.sol @@ -121,8 +121,6 @@ contract AuctionManager is AddressResolverUtil, Ownable, IAuctionManager, Initia emit BidPlaced(asyncId_, newBid); auctionClosed[asyncId_] = true; - - emit AuctionEnded(asyncId_, newBid); } /// @notice Ends an auction diff --git a/contracts/protocol/payload-delivery/app-gateway/QueueAsync.sol b/contracts/protocol/payload-delivery/app-gateway/QueueAsync.sol index 44b15eec..8cf41850 100644 --- a/contracts/protocol/payload-delivery/app-gateway/QueueAsync.sol +++ b/contracts/protocol/payload-delivery/app-gateway/QueueAsync.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.21; import {AddressResolverUtil} from "../../../protocol/utils/AddressResolverUtil.sol"; -import {CallParams, Fees, PayloadDetails, CallType, Bid, PayloadBatch, Parallel} from "../../../protocol/utils/common/Structs.sol"; +import {CallParams, Fees, PayloadDetails, CallType, Bid, PayloadBatch, Parallel, IsPlug} from "../../../protocol/utils/common/Structs.sol"; import {NotAuctionManager, InvalidPromise, InvalidIndex} from "../../../protocol/utils/common/Errors.sol"; import {AsyncPromise} from "../../AsyncPromise.sol"; import {IPromise} from "../../../interfaces/IPromise.sol"; @@ -65,7 +65,7 @@ abstract contract QueueAsync is AddressResolverUtil, IDeliveryHelper { /// @param callType_ The call type /// @param payload_ The payload function queue( - bool isPlug_, + IsPlug isPlug_, Parallel isParallel_, uint32 chainSlug_, address target_, diff --git a/contracts/protocol/utils/common/Structs.sol b/contracts/protocol/utils/common/Structs.sol index 5aa22d93..72058e7c 100644 --- a/contracts/protocol/utils/common/Structs.sol +++ b/contracts/protocol/utils/common/Structs.sol @@ -18,6 +18,11 @@ enum Parallel { ON } +enum IsPlug { + YES, + NO +} + struct AppGatewayConfig { address plug; address appGateway; @@ -55,7 +60,7 @@ struct CallFromInboxParams { } struct CallParams { - bool isPlug; + IsPlug isPlug; address asyncPromise; address target; uint32 chainSlug; From c84114bae2f74f2aaddb2751ebb970c73b3a5896 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Thu, 20 Feb 2025 13:27:45 +0400 Subject: [PATCH 084/186] fix: plug base --- contracts/base/PlugBase.sol | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/contracts/base/PlugBase.sol b/contracts/base/PlugBase.sol index 4a58a1fd..cd10bea4 100644 --- a/contracts/base/PlugBase.sol +++ b/contracts/base/PlugBase.sol @@ -11,9 +11,9 @@ import {NotSocket} from "../protocol/utils/common/Errors.sol"; abstract contract PlugBase is IPlug { ISocket public socket__; address public appGateway; - uint256 public socketInitializer; + uint256 public isSocketInitialized; - error SocketNotInitialized(); + error SocketAlreadyInitialized(); event ConnectorPlugDisconnected(); /// @notice Modifier to ensure only the socket can call the function @@ -24,10 +24,10 @@ abstract contract PlugBase is IPlug { } /// @notice Modifier to ensure the socket is initialized - modifier isSocketInitialized() { - if (socketInitializer == 1) revert SocketNotInitialized(); + modifier socketInitializer() { + if (isSocketInitialized == 1) revert SocketAlreadyInitialized(); _; - socketInitializer = 1; + isSocketInitialized = 1; } /// @notice Connects the plug to the app gateway and switchboard @@ -61,7 +61,7 @@ abstract contract PlugBase is IPlug { address appGateway_, address socket_, address switchboard_ - ) external virtual isSocketInitialized { + ) external virtual socketInitializer { _connectSocket(appGateway_, socket_, switchboard_); } } From f83ca0c007e8563de97d612c3339c17db2612091 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Thu, 20 Feb 2025 14:37:43 +0400 Subject: [PATCH 085/186] wip: e2e tests --- contracts/base/AppDeployerBase.sol | 2 +- contracts/base/PlugBase.sol | 2 +- .../payload-delivery/ContractFactoryPlug.sol | 38 +++++++++++++++++-- contracts/protocol/socket/Socket.sol | 7 ++++ contracts/protocol/socket/SocketBatcher.sol | 9 ++++- test/DeliveryHelper.t.sol | 3 +- test/SetupTest.t.sol | 4 +- 7 files changed, 56 insertions(+), 9 deletions(-) diff --git a/contracts/base/AppDeployerBase.sol b/contracts/base/AppDeployerBase.sol index 78d84bc6..f7b40c83 100644 --- a/contracts/base/AppDeployerBase.sol +++ b/contracts/base/AppDeployerBase.sol @@ -26,7 +26,7 @@ abstract contract AppDeployerBase is AppGatewayBase, IAppDeployer { /// @param contractId_ The contract ID /// @param chainSlug_ The chain slug function _deploy(bytes32 contractId_, uint32 chainSlug_, IsPlug isPlug_) internal { - _deploy(contractId_, chainSlug_, isPlug_, bytes("")); + _deploy(contractId_, chainSlug_, isPlug_, new bytes(0)); } /// @notice Deploys a contract diff --git a/contracts/base/PlugBase.sol b/contracts/base/PlugBase.sol index cd10bea4..f44c359b 100644 --- a/contracts/base/PlugBase.sol +++ b/contracts/base/PlugBase.sol @@ -26,8 +26,8 @@ abstract contract PlugBase is IPlug { /// @notice Modifier to ensure the socket is initialized modifier socketInitializer() { if (isSocketInitialized == 1) revert SocketAlreadyInitialized(); - _; isSocketInitialized = 1; + _; } /// @notice Connects the plug to the app gateway and switchboard diff --git a/contracts/protocol/payload-delivery/ContractFactoryPlug.sol b/contracts/protocol/payload-delivery/ContractFactoryPlug.sol index f0181b6d..11445aa2 100644 --- a/contracts/protocol/payload-delivery/ContractFactoryPlug.sol +++ b/contracts/protocol/payload-delivery/ContractFactoryPlug.sol @@ -5,7 +5,9 @@ import "../utils/AccessControl.sol"; import {RESCUE_ROLE} from "../utils/common/AccessRoles.sol"; import "../utils/RescueFundsLib.sol"; import {NotSocket} from "../utils/common/Errors.sol"; +import {IsPlug} from "../utils/common/Structs.sol"; import "../../base/PlugBase.sol"; +import "forge-std/console.sol"; /// @title ContractFactory /// @notice Abstract contract for deploying contracts @@ -22,13 +24,30 @@ contract ContractFactoryPlug is PlugBase, AccessControl { } function deployContract( - bool canConnectSocket_, + IsPlug isPlug_, bytes32 salt_, address appGateway_, address switchboard_, bytes memory creationCode_, bytes memory initCallData_ ) public returns (address) { + console.log("deployContract called"); + console.log("msg.sender", msg.sender); + console.log("socket address", address(socket__)); + + // Log detailed payload information + console.log("creationCode length", creationCode_.length); + console.log("initCallData length", initCallData_.length); + + // Hex logging for deeper inspection + console.logBytes(creationCode_); + console.logBytes(initCallData_); + + // Detailed hex logging + for (uint i = 0; i < initCallData_.length; i++) { + console.logBytes1(initCallData_[i]); + } + if (msg.sender != address(socket__)) { revert NotSocket(); } @@ -42,12 +61,25 @@ contract ContractFactoryPlug is PlugBase, AccessControl { } } - if (canConnectSocket_) IPlug(addr).initSocket(appGateway_, msg.sender, switchboard_); + if (isPlug_ == IsPlug.YES) IPlug(addr).initSocket(appGateway_, msg.sender, switchboard_); bytes memory returnData; if (initCallData_.length > 0) { - (bool success, bytes memory returnData_) = addr.call(initCallData_); + console.log("Attempting to call with initCallData"); + + // Capture more detailed error information + (bool success, bytes memory returnData_) = addr.call{gas: gasleft()}(initCallData_); + if (!success) { + console.log("Call failed"); + + // Additional error logging + assembly { + let ptr := mload(0x40) + returndatacopy(ptr, 0, returndatasize()) + log0(ptr, returndatasize()) + } + revert ExecutionFailed(); } returnData = returnData_; diff --git a/contracts/protocol/socket/Socket.sol b/contracts/protocol/socket/Socket.sol index 67421191..d41079a6 100644 --- a/contracts/protocol/socket/Socket.sol +++ b/contracts/protocol/socket/Socket.sol @@ -3,6 +3,7 @@ pragma solidity ^0.8.21; import "./SocketUtils.sol"; import {PlugDisconnected, InvalidAppGateway} from "../utils/common/Errors.sol"; +import "forge-std/console.sol"; /** * @title SocketDst @@ -158,6 +159,12 @@ contract Socket is SocketUtils { bytes memory payload_ ) internal returns (bytes memory) { if (gasleft() < executionGasLimit_) revert LowGasLimit(); + + console.log("Executing payload"); + console.log(payload_.length); + + + // NOTE: external un-trusted call (bool success, bytes memory returnData) = localPlug_.call{ gas: executionGasLimit_, diff --git a/contracts/protocol/socket/SocketBatcher.sol b/contracts/protocol/socket/SocketBatcher.sol index ea32d5d9..96371877 100644 --- a/contracts/protocol/socket/SocketBatcher.sol +++ b/contracts/protocol/socket/SocketBatcher.sol @@ -27,7 +27,7 @@ contract SocketBatcher is Ownable { function attestAndExecute( AttestAndExecutePayloadParams calldata params_ - ) external returns (bytes memory) { + ) external payable returns (bytes memory) { ISwitchboard(params_.switchboard).attest( params_.payloadId, params_.root, @@ -41,7 +41,12 @@ contract SocketBatcher is Ownable { deadline: params_.deadline, payload: params_.payload }); - return socket__.execute(params_.appGateway, executeParams, params_.transmitterSignature); + return + socket__.execute{value: msg.value}( + params_.appGateway, + executeParams, + params_.transmitterSignature + ); } function rescueFunds(address token_, address to_, uint256 amount_) external onlyOwner { diff --git a/test/DeliveryHelper.t.sol b/test/DeliveryHelper.t.sol index a4c78b0a..85569d07 100644 --- a/test/DeliveryHelper.t.sol +++ b/test/DeliveryHelper.t.sol @@ -505,6 +505,7 @@ contract DeliveryHelperTest is SetupTest { PayloadDetails memory payloadDetails ) internal view returns (bytes memory, bytes32) { SocketContracts memory socketConfig = getSocketConfig(payloadDetails.chainSlug); + (, , , , , , uint256 deadline, , , ) = watcherPrecompile.asyncRequests(payloadId); PayloadRootParams memory rootParams_ = PayloadRootParams( payloadDetails.appGateway, @@ -513,7 +514,7 @@ contract DeliveryHelperTest is SetupTest { payloadId, payloadDetails.value, payloadDetails.executionGasLimit, - block.timestamp + 1000, + deadline, payloadDetails.payload ); bytes32 root = watcherPrecompile.getRoot(rootParams_); diff --git a/test/SetupTest.t.sol b/test/SetupTest.t.sol index b3d2a873..3378c611 100644 --- a/test/SetupTest.t.sol +++ b/test/SetupTest.t.sol @@ -177,6 +177,8 @@ contract SetupTest is Test { bytes32 transmitterDigest = keccak256(abi.encode(address(socketConfig.socket), payloadId)); bytes memory transmitterSig = _createSignature(transmitterDigest, transmitterPrivateKey); + (, , , , , , uint256 deadline, , , ) = watcherPrecompile.asyncRequests(payloadId); + vm.startPrank(transmitterEOA); AttestAndExecutePayloadParams memory params = AttestAndExecutePayloadParams({ switchboard: address(socketConfig.switchboard), @@ -188,7 +190,7 @@ contract SetupTest is Test { transmitterSignature: transmitterSig, payload: payloadDetails.payload, target: payloadDetails.target, - deadline: block.timestamp + expiryTime + deadline: deadline }); bytes memory returnData = socketConfig.socketBatcher.attestAndExecute(params); From ffebb79d162d867f67a232ca521e23b13a27ae73 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Thu, 20 Feb 2025 15:11:31 +0400 Subject: [PATCH 086/186] fix: contract deployments --- .../SuperTokenLockable.sol | 10 ------ contracts/apps/super-token/SuperToken.sol | 9 ------ contracts/base/AppDeployerBase.sol | 3 +- contracts/base/PlugBase.sol | 1 - contracts/interfaces/IContractFactoryPlug.sol | 9 ++++-- .../payload-delivery/ContractFactoryPlug.sol | 31 +++---------------- contracts/protocol/socket/Socket.sol | 6 ---- .../watcherPrecompile/WatcherPrecompile.sol | 2 ++ hardhat-scripts/constants/networks.ts | 1 - test/SetupTest.t.sol | 1 + 10 files changed, 16 insertions(+), 57 deletions(-) diff --git a/contracts/apps/super-token-lockable/SuperTokenLockable.sol b/contracts/apps/super-token-lockable/SuperTokenLockable.sol index f1819da8..1fa16005 100644 --- a/contracts/apps/super-token-lockable/SuperTokenLockable.sol +++ b/contracts/apps/super-token-lockable/SuperTokenLockable.sol @@ -57,14 +57,4 @@ contract SuperTokenLockable is ERC20, Ownable, PlugBase { function setLimitHook(address limitHook_) external onlyOwner { limitHook__ = LimitHook(limitHook_); } - - // test for isSocketInitialized - function initSocket( - address appGateway_, - address socket_, - address switchboard_ - ) external override { - this.initSocket(appGateway_, socket_, switchboard_); - _initializeOwner(socket_); - } } diff --git a/contracts/apps/super-token/SuperToken.sol b/contracts/apps/super-token/SuperToken.sol index 9833439b..5bacd128 100644 --- a/contracts/apps/super-token/SuperToken.sol +++ b/contracts/apps/super-token/SuperToken.sol @@ -33,13 +33,4 @@ contract SuperToken is ERC20, Ownable, PlugBase { function setSocket(address newSocket_) external onlyOwner { _setSocket(newSocket_); } - - function initSocket( - address appGateway_, - address socket_, - address switchboard_ - ) external override { - this.initSocket(appGateway_, socket_, switchboard_); - _initializeOwner(socket_); - } } diff --git a/contracts/base/AppDeployerBase.sol b/contracts/base/AppDeployerBase.sol index f7b40c83..b6eff74f 100644 --- a/contracts/base/AppDeployerBase.sol +++ b/contracts/base/AppDeployerBase.sol @@ -83,7 +83,8 @@ abstract contract AppDeployerBase is AppGatewayBase, IAppDeployer { return address(0); } - onChainAddress = IForwarder(forwarderAddresses[contractId_][chainSlug_]).getOnChainAddress(); + onChainAddress = IForwarder(forwarderAddresses[contractId_][chainSlug_]) + .getOnChainAddress(); } /// @notice Callback in pd promise to be called after all contracts are deployed diff --git a/contracts/base/PlugBase.sol b/contracts/base/PlugBase.sol index f44c359b..66a1e943 100644 --- a/contracts/base/PlugBase.sol +++ b/contracts/base/PlugBase.sol @@ -5,7 +5,6 @@ import {SafeTransferLib} from "solmate/utils/SafeTransferLib.sol"; import {ISocket} from "../interfaces/ISocket.sol"; import {IPlug} from "../interfaces/IPlug.sol"; import {NotSocket} from "../protocol/utils/common/Errors.sol"; - /// @title PlugBase /// @notice Abstract contract for plugs abstract contract PlugBase is IPlug { diff --git a/contracts/interfaces/IContractFactoryPlug.sol b/contracts/interfaces/IContractFactoryPlug.sol index a7fe29ad..a3b5bac0 100644 --- a/contracts/interfaces/IContractFactoryPlug.sol +++ b/contracts/interfaces/IContractFactoryPlug.sol @@ -1,18 +1,23 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.21; +import {IsPlug} from "../protocol/utils/common/Structs.sol"; + /// @title IContractFactory /// @notice Interface for contract factory functionality interface IContractFactoryPlug { /// @notice Deploys a contract using CREATE2 + /// @param isPlug_ Whether the contract is a plug /// @param creationCode_ The contract creation code /// @param salt_ The salt value for CREATE2 /// @return address The deployed contract address function deployContract( - bytes memory creationCode_, + IsPlug isPlug_, bytes32 salt_, address appGateway_, - address switchboard_ + address switchboard_, + bytes memory creationCode_, + bytes memory initCallData_ ) external returns (address); /// @notice Gets the deterministic address for a contract deployment diff --git a/contracts/protocol/payload-delivery/ContractFactoryPlug.sol b/contracts/protocol/payload-delivery/ContractFactoryPlug.sol index 11445aa2..2c23b49e 100644 --- a/contracts/protocol/payload-delivery/ContractFactoryPlug.sol +++ b/contracts/protocol/payload-delivery/ContractFactoryPlug.sol @@ -5,13 +5,11 @@ import "../utils/AccessControl.sol"; import {RESCUE_ROLE} from "../utils/common/AccessRoles.sol"; import "../utils/RescueFundsLib.sol"; import {NotSocket} from "../utils/common/Errors.sol"; -import {IsPlug} from "../utils/common/Structs.sol"; import "../../base/PlugBase.sol"; -import "forge-std/console.sol"; - +import "../../interfaces/IContractFactoryPlug.sol"; /// @title ContractFactory /// @notice Abstract contract for deploying contracts -contract ContractFactoryPlug is PlugBase, AccessControl { +contract ContractFactoryPlug is PlugBase, AccessControl, IContractFactoryPlug { event Deployed(address addr, bytes32 salt, bytes returnData); /// @notice Error thrown if it failed to deploy the create2 contract @@ -30,24 +28,7 @@ contract ContractFactoryPlug is PlugBase, AccessControl { address switchboard_, bytes memory creationCode_, bytes memory initCallData_ - ) public returns (address) { - console.log("deployContract called"); - console.log("msg.sender", msg.sender); - console.log("socket address", address(socket__)); - - // Log detailed payload information - console.log("creationCode length", creationCode_.length); - console.log("initCallData length", initCallData_.length); - - // Hex logging for deeper inspection - console.logBytes(creationCode_); - console.logBytes(initCallData_); - - // Detailed hex logging - for (uint i = 0; i < initCallData_.length; i++) { - console.logBytes1(initCallData_[i]); - } - + ) public override returns (address) { if (msg.sender != address(socket__)) { revert NotSocket(); } @@ -65,14 +46,10 @@ contract ContractFactoryPlug is PlugBase, AccessControl { bytes memory returnData; if (initCallData_.length > 0) { - console.log("Attempting to call with initCallData"); - // Capture more detailed error information - (bool success, bytes memory returnData_) = addr.call{gas: gasleft()}(initCallData_); + (bool success, bytes memory returnData_) = addr.call(initCallData_); if (!success) { - console.log("Call failed"); - // Additional error logging assembly { let ptr := mload(0x40) diff --git a/contracts/protocol/socket/Socket.sol b/contracts/protocol/socket/Socket.sol index d41079a6..7de9a6ff 100644 --- a/contracts/protocol/socket/Socket.sol +++ b/contracts/protocol/socket/Socket.sol @@ -3,7 +3,6 @@ pragma solidity ^0.8.21; import "./SocketUtils.sol"; import {PlugDisconnected, InvalidAppGateway} from "../utils/common/Errors.sol"; -import "forge-std/console.sol"; /** * @title SocketDst @@ -160,11 +159,6 @@ contract Socket is SocketUtils { ) internal returns (bytes memory) { if (gasleft() < executionGasLimit_) revert LowGasLimit(); - console.log("Executing payload"); - console.log(payload_.length); - - - // NOTE: external un-trusted call (bool success, bytes memory returnData) = localPlug_.call{ gas: executionGasLimit_, diff --git a/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol b/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol index 84af7535..c528e0af 100644 --- a/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol +++ b/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol @@ -105,12 +105,14 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { address owner_, address addressResolver_, uint256 defaultLimit_, + uint256 expiryTime_, uint32 vmChainSlug_ ) public reinitializer(1) { _setAddressResolver(addressResolver_); _initializeOwner(owner_); version = 1; maxTimeoutDelayInSeconds = 24 * 60 * 60; // 24 hours + expiryTime = expiryTime_; // limit per day defaultLimit = defaultLimit_ * 10 ** LIMIT_DECIMALS; diff --git a/hardhat-scripts/constants/networks.ts b/hardhat-scripts/constants/networks.ts index f5be446d..8010747d 100644 --- a/hardhat-scripts/constants/networks.ts +++ b/hardhat-scripts/constants/networks.ts @@ -28,7 +28,6 @@ export const rpcKeys = (chainSlug: ChainSlug) => { return "EVMX_RPC"; } let chainName = chainSlugToHardhatChainName[chainSlug].toString(); - // console.log("chainName", chainName); chainName = chainName.replace("-", "_"); return `${chainName.toUpperCase()}_RPC`; }; diff --git a/test/SetupTest.t.sol b/test/SetupTest.t.sol index 3378c611..513c7ed0 100644 --- a/test/SetupTest.t.sol +++ b/test/SetupTest.t.sol @@ -124,6 +124,7 @@ contract SetupTest is Test { watcherEOA, address(addressResolverProxy), defaultLimit, + expiryTime, vmChainSlug ); vm.expectEmit(true, true, true, false); From 2f9c41987bed9753409dfbba2eb16c847e991d34 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Thu, 20 Feb 2025 16:30:01 +0400 Subject: [PATCH 087/186] fix: counter tests --- contracts/apps/counter/CounterAppGateway.sol | 4 +-- contracts/base/AppDeployerBase.sol | 3 +- .../app-gateway/DeliveryHelper.sol | 12 ++++--- .../watcherPrecompile/WatcherPrecompile.sol | 4 ++- test/DeliveryHelper.t.sol | 36 ++++--------------- test/FeesTest.t.sol | 4 +-- test/apps/Counter.t.sol | 17 +++++---- test/apps/ParallelCounter.t.sol | 2 ++ test/apps/SuperTokenLockable.t.sol | 12 +++---- 9 files changed, 41 insertions(+), 53 deletions(-) diff --git a/contracts/apps/counter/CounterAppGateway.sol b/contracts/apps/counter/CounterAppGateway.sol index f0998e58..dc6943cb 100644 --- a/contracts/apps/counter/CounterAppGateway.sol +++ b/contracts/apps/counter/CounterAppGateway.sol @@ -31,13 +31,13 @@ contract CounterAppGateway is AppGatewayBase { function readCounters(address[] memory instances_) public async { // the increase function is called on given list of instances - // this + _setOverrides(Read.ON, Parallel.ON); for (uint256 i = 0; i < instances_.length; i++) { uint32 chainSlug = IForwarder(instances_[i]).getChainSlug(); ICounter(instances_[i]).getCounter(); IPromise(instances_[i]).then(this.setCounterValues.selector, abi.encode(chainSlug)); } - _setOverrides(Parallel.ON); + _setOverrides(Read.OFF, Parallel.OFF); ICounter(instances_[0]).increase(); } diff --git a/contracts/base/AppDeployerBase.sol b/contracts/base/AppDeployerBase.sol index b6eff74f..f7b40c83 100644 --- a/contracts/base/AppDeployerBase.sol +++ b/contracts/base/AppDeployerBase.sol @@ -83,8 +83,7 @@ abstract contract AppDeployerBase is AppGatewayBase, IAppDeployer { return address(0); } - onChainAddress = IForwarder(forwarderAddresses[contractId_][chainSlug_]) - .getOnChainAddress(); + onChainAddress = IForwarder(forwarderAddresses[contractId_][chainSlug_]).getOnChainAddress(); } /// @notice Callback in pd promise to be called after all contracts are deployed diff --git a/contracts/protocol/payload-delivery/app-gateway/DeliveryHelper.sol b/contracts/protocol/payload-delivery/app-gateway/DeliveryHelper.sol index b0f39eb1..8fa83874 100644 --- a/contracts/protocol/payload-delivery/app-gateway/DeliveryHelper.sol +++ b/contracts/protocol/payload-delivery/app-gateway/DeliveryHelper.sol @@ -51,7 +51,7 @@ contract DeliveryHelper is BatchAsync, Ownable, Initializable { _payloadBatches[asyncId_].appGateway ); - if (!isRestarted) return _process(asyncId_); + if (!isRestarted) return _process(asyncId_, false); // Refinalize all payloads in the batch if a new transmitter is assigned bytes32[] memory payloadIds = _payloadBatches[asyncId_].lastBatchOfPayloads; @@ -69,10 +69,10 @@ contract DeliveryHelper is BatchAsync, Ownable, Initializable { function callback(bytes memory asyncId_, bytes memory) external override onlyPromises { bytes32 asyncId = abi.decode(asyncId_, (bytes32)); - _process(asyncId); + _process(asyncId, true); } - function _process(bytes32 asyncId_) internal { + function _process(bytes32 asyncId_, bool isCallback_) internal { PayloadBatch storage payloadBatch = _payloadBatches[asyncId_]; if (payloadBatch.isBatchCancelled) return; @@ -82,11 +82,13 @@ contract DeliveryHelper is BatchAsync, Ownable, Initializable { // Check if all promises are resolved for (uint256 i = 0; i < payloadBatch.lastBatchPromises.length; i++) { if (!IPromise(payloadBatch.lastBatchPromises[i]).resolved()) { - revert PromisesNotResolved(); + if (isCallback_) revert PromisesNotResolved(); } } // Clear promises array after all are resolved - delete payloadBatch.lastBatchPromises; + if (isCallback_) { + delete payloadBatch.lastBatchPromises; + } } if (payloadBatch.totalPayloadsRemaining > 0) { diff --git a/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol b/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol index c528e0af..428bbc16 100644 --- a/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol +++ b/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol @@ -6,7 +6,7 @@ import "../../interfaces/IAppGateway.sol"; import "../../interfaces/IPromise.sol"; import "../../interfaces/IFeesManager.sol"; import "solady/utils/Initializable.sol"; - +import "forge-std/console.sol"; import {PayloadRootParams, AsyncRequest, FinalizeParams, TimeoutRequest, CallFromInboxParams} from "../utils/common/Structs.sol"; import {TimeoutDelayTooLarge, TimeoutAlreadyResolved, InvalidInboxCaller, ResolvingTimeoutTooEarly, CallFailed, AppGatewayAlreadyCalled} from "../utils/common/Errors.sol"; @@ -427,6 +427,8 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { uint32 chainSlug_, address switchboardOrWatcher_ ) internal returns (bytes32) { + console.log("chainSlug_", chainSlug_); + console.log("payloadCounter", payloadCounter); // Encode payload ID by bit-shifting and combining: // chainSlug (32 bits) | switchboard or watcher precompile address (160 bits) | counter (64 bits) return diff --git a/test/DeliveryHelper.t.sol b/test/DeliveryHelper.t.sol index 85569d07..4702a879 100644 --- a/test/DeliveryHelper.t.sol +++ b/test/DeliveryHelper.t.sol @@ -260,8 +260,6 @@ contract DeliveryHelperTest is SetupTest { } function bidAndEndAuction(bytes32 asyncId) internal { - // for scheduling bid expiry - payloadIdCounter++; placeBid(asyncId); endAuction(); } @@ -269,7 +267,7 @@ contract DeliveryHelperTest is SetupTest { function bidAndExecute(bytes32[] memory payloadIds, bytes32 asyncId_) internal { bidAndEndAuction(asyncId_); for (uint i = 0; i < payloadIds.length; i++) { - finalizeAndExecute(payloadIds[i], false); + finalizeAndExecute(payloadIds[i]); } } @@ -294,14 +292,12 @@ contract DeliveryHelperTest is SetupTest { ) internal returns (bytes32 asyncId) { SocketContracts memory socketConfig = getSocketConfig(chainSlug_); - // for scheduling auction - payloadIdCounter++; + asyncId = getCurrentAsyncId(); bytes32[] memory payloadIds = getWritePayloadIds( chainSlug_, address(socketConfig.switchboard), totalPayloads ); - asyncId = getCurrentAsyncId(); appDeployer_.deployContracts(chainSlug_); bidAndExecute(payloadIds, asyncId); @@ -314,7 +310,6 @@ contract DeliveryHelperTest is SetupTest { IMultiChainAppDeployer appDeployer_, address appGateway_ ) internal returns (bytes32 asyncId) { - payloadIdCounter++; asyncId = getCurrentAsyncId(); bytes32[] memory payloadIds = new bytes32[](contractIds.length * chainSlugs_.length); for (uint32 i = 0; i < chainSlugs_.length; i++) { @@ -379,7 +374,6 @@ contract DeliveryHelperTest is SetupTest { ) internal returns (bytes32 asyncId) { asyncId = getCurrentAsyncId(); - payloadIdCounter++; bytes32[] memory payloadIds = getWritePayloadIds( chainSlug_, address(getSocketConfig(chainSlug_).switchboard), @@ -392,18 +386,15 @@ contract DeliveryHelperTest is SetupTest { uint32[] memory chainSlugs_ ) internal returns (bytes32 asyncId) { asyncId = getCurrentAsyncId(); - payloadIdCounter++; bidAndEndAuction(asyncId); for (uint i = 0; i < chainSlugs_.length; i++) { bytes32 payloadId = getWritePayloadId( chainSlugs_[i], address(getSocketConfig(chainSlugs_[i]).switchboard), - i + payloadIdCounter + payloadIdCounter++ ); - finalizeAndExecute(payloadId, false); + finalizeAndExecute(payloadId); } - - payloadIdCounter += chainSlugs_.length; } function createDeployPayloadDetail( @@ -613,20 +604,10 @@ contract DeliveryHelperTest is SetupTest { resolvePromise(payloadId, returnData_); } - function finalizeAndExecute(bytes32 payloadId, bool isWithdraw) internal { + function finalizeAndExecute(bytes32 payloadId) internal { PayloadDetails memory payloadDetails = deliveryHelper.getPayloadDetails(payloadId); - finalizeAndExecute(payloadId, isWithdraw, payloadDetails); - } - - function finalizeAndExecute( - bytes32 payloadId, - bool isWithdraw, - PayloadDetails memory payloadDetails - ) internal { bytes memory returnData = finalizeAndRelay(payloadId, payloadDetails); - if (!isWithdraw) { - resolvePromise(payloadId, returnData); - } + resolvePromise(payloadId, returnData); } function finalizeAndRelay( @@ -666,13 +647,10 @@ contract DeliveryHelperTest is SetupTest { } function getCurrentAsyncId() public returns (bytes32) { + payloadIdCounter++; return bytes32((uint256(uint160(address(deliveryHelper))) << 64) | asyncCounterTest++); } - function getLatestAsyncId() public view returns (bytes32) { - return bytes32((uint256(uint160(address(deliveryHelper))) << 64) | asyncCounterTest); - } - function getOnChainAndForwarderAddresses( uint32 chainSlug_, bytes32 contractId_, diff --git a/test/FeesTest.t.sol b/test/FeesTest.t.sol index 5db25674..e6e66854 100644 --- a/test/FeesTest.t.sol +++ b/test/FeesTest.t.sol @@ -69,8 +69,8 @@ contract FeesTest is DeliveryHelperTest { (bytes32 payloadId, , PayloadDetails memory payloadDetails) = feesManager .withdrawTransmitterFees(feesChainSlug, ETH_ADDRESS, address(receiver)); payloadIdCounter++; + finalizeAndRelay(payloadId, payloadDetails); - finalizeAndExecute(payloadId, true, payloadDetails); assertEq( transmitterReceiverBalanceBefore + bidAmount, address(receiver).balance, @@ -101,7 +101,7 @@ contract FeesTest is DeliveryHelperTest { 1 ); bidAndEndAuction(asyncId); - finalizeAndExecute(payloadIds[0], true); + finalizeAndExecute(payloadIds[0]); assertEq( depositAmount - withdrawAmount, address(feesConfig.feesPlug).balance, diff --git a/test/apps/Counter.t.sol b/test/apps/Counter.t.sol index dc90d936..9f3f2b1b 100644 --- a/test/apps/Counter.t.sol +++ b/test/apps/Counter.t.sol @@ -69,7 +69,7 @@ contract CounterTest is DeliveryHelperTest { ); } - function testCounterIncrement() external { + function testCounterIncrement1() external { deploySetup(); deployCounterApp(arbChainSlug); @@ -90,10 +90,11 @@ contract CounterTest is DeliveryHelperTest { } function testCounterIncrementMultipleChains() public { - deploySetup(); + deploySetup(); deployCounterApp(arbChainSlug); deployCounterApp(optChainSlug); + (address arbCounter, address arbCounterForwarder) = getOnChainAndForwarderAddresses( arbChainSlug, counterId, @@ -117,12 +118,14 @@ contract CounterTest is DeliveryHelperTest { chains[0] = arbChainSlug; chains[1] = optChainSlug; _executeWriteBatchMultiChain(chains); + assertEq(Counter(arbCounter).counter(), arbCounterBefore + 1); assertEq(Counter(optCounter).counter(), optCounterBefore + 1); } function testCounterReadMultipleChains() external { testCounterIncrementMultipleChains(); + (address arbCounter, address arbCounterForwarder) = getOnChainAndForwarderAddresses( arbChainSlug, counterId, @@ -137,6 +140,9 @@ contract CounterTest is DeliveryHelperTest { address[] memory instances = new address[](2); instances[0] = arbCounterForwarder; instances[1] = optCounterForwarder; + + bytes32 bridgeAsyncId = getCurrentAsyncId(); + bytes32[] memory payloadIds = new bytes32[](3); payloadIds[0] = _encodeId(vmChainSlug, address(watcherPrecompile), payloadIdCounter++); payloadIds[1] = _encodeId(vmChainSlug, address(watcherPrecompile), payloadIdCounter++); @@ -146,13 +152,12 @@ contract CounterTest is DeliveryHelperTest { address(getSocketConfig(arbChainSlug).switchboard), payloadIdCounter++ ); - bytes32 bridgeAsyncId = getCurrentAsyncId(); counterGateway.readCounters(instances); + + bidAndEndAuction(bridgeAsyncId); finalizeQuery(payloadIds[0], abi.encode(Counter(arbCounter).counter())); finalizeQuery(payloadIds[1], abi.encode(Counter(optCounter).counter())); - - bidAndEndAuction(bridgeAsyncId); - finalizeAndExecute(payloadIds[2], false); + finalizeAndExecute(payloadIds[2]); } } diff --git a/test/apps/ParallelCounter.t.sol b/test/apps/ParallelCounter.t.sol index 7460cfc7..8a41a132 100644 --- a/test/apps/ParallelCounter.t.sol +++ b/test/apps/ParallelCounter.t.sol @@ -77,6 +77,8 @@ contract ParallelCounterTest is DeliveryHelperTest { parallelCounterDeployer ); + console.log("forwarderArb1", forwarderArb1); + assertEq( IForwarder(forwarderArb1).getChainSlug(), arbChainSlug, diff --git a/test/apps/SuperTokenLockable.t.sol b/test/apps/SuperTokenLockable.t.sol index 290a72ef..ba755c09 100644 --- a/test/apps/SuperTokenLockable.t.sol +++ b/test/apps/SuperTokenLockable.t.sol @@ -277,6 +277,7 @@ contract SuperTokenLockableTest is DeliveryHelperTest { }); uint32 srcChainSlug = IForwarder(userOrder.srcToken).getChainSlug(); uint32 dstChainSlug = IForwarder(userOrder.dstToken).getChainSlug(); + bytes32 bridgeAsyncId = getCurrentAsyncId(); bytes32[] memory payloadIds = new bytes32[](4); payloadIds[0] = getWritePayloadId( @@ -297,7 +298,6 @@ contract SuperTokenLockableTest is DeliveryHelperTest { ); payloadIdCounter++; - bytes32 bridgeAsyncId = getCurrentAsyncId(); bytes memory encodedOrder = abi.encode(userOrder); appContracts.superTokenLockableApp.bridge(encodedOrder); @@ -312,7 +312,7 @@ contract SuperTokenLockableTest is DeliveryHelperTest { bridgeAsyncId, 0 ); - finalizeAndExecute(payloadIds[0], false); + finalizeAndExecute(payloadIds[0]); payloadDetails = deliveryHelper.getPayloadIndexDetails(bridgeAsyncId, 2); vm.expectEmit(true, false, false, false); @@ -333,20 +333,21 @@ contract SuperTokenLockableTest is DeliveryHelperTest { ) ); finalizeQuery(payloadIds[1], abi.encode(srcAmount)); - finalizeAndExecute(payloadIds[2], false); + finalizeAndExecute(payloadIds[2]); payloadDetails = deliveryHelper.getPayloadIndexDetails(bridgeAsyncId, 3); - finalizeAndExecute(payloadIds[3], false); + finalizeAndExecute(payloadIds[3]); } function testCancel() public { (bytes32 bridgeAsyncId, bytes32[] memory payloadIds) = _bridge(); - finalizeAndExecute(payloadIds[0], false); + finalizeAndExecute(payloadIds[0]); vm.expectEmit(true, true, false, true); emit BatchCancelled(bridgeAsyncId); finalizeQuery(payloadIds[1], abi.encode(0.001 ether)); + bytes32 cancelAsyncId = getCurrentAsyncId(); bytes32[] memory cancelPayloadIds = new bytes32[](1); uint32 srcChainSlug = IForwarder(userOrder.srcToken).getChainSlug(); @@ -357,7 +358,6 @@ contract SuperTokenLockableTest is DeliveryHelperTest { payloadIdCounter++ ); - bytes32 cancelAsyncId = getCurrentAsyncId(); // bidAndEndAuction(cancelAsyncId); // finalizeAndExecute( From 6c82d2d459011ff64a25c4181c73340096145008 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Thu, 20 Feb 2025 17:00:53 +0400 Subject: [PATCH 088/186] fix: inbox test --- contracts/apps/counter-inbox/CounterInbox.sol | 11 ----------- contracts/base/AppDeployerBase.sol | 3 ++- test/apps/Counter.t.sol | 5 ++--- test/apps/SuperTokenLockable.t.sol | 2 -- 4 files changed, 4 insertions(+), 17 deletions(-) diff --git a/contracts/apps/counter-inbox/CounterInbox.sol b/contracts/apps/counter-inbox/CounterInbox.sol index 58b394e4..df86efb7 100644 --- a/contracts/apps/counter-inbox/CounterInbox.sol +++ b/contracts/apps/counter-inbox/CounterInbox.sol @@ -5,18 +5,7 @@ import "solady/auth/Ownable.sol"; import "../../base/PlugBase.sol"; contract CounterInbox is Ownable, PlugBase { - constructor() {} - function increaseOnGateway(uint256 value_) external returns (bytes32) { return _callAppGateway(abi.encode(value_), bytes32(0)); } - - function initSocket( - address appGateway_, - address socket_, - address switchboard_ - ) external override { - this.initSocket(appGateway_, socket_, switchboard_); - _initializeOwner(socket_); - } } diff --git a/contracts/base/AppDeployerBase.sol b/contracts/base/AppDeployerBase.sol index f7b40c83..b6eff74f 100644 --- a/contracts/base/AppDeployerBase.sol +++ b/contracts/base/AppDeployerBase.sol @@ -83,7 +83,8 @@ abstract contract AppDeployerBase is AppGatewayBase, IAppDeployer { return address(0); } - onChainAddress = IForwarder(forwarderAddresses[contractId_][chainSlug_]).getOnChainAddress(); + onChainAddress = IForwarder(forwarderAddresses[contractId_][chainSlug_]) + .getOnChainAddress(); } /// @notice Callback in pd promise to be called after all contracts are deployed diff --git a/test/apps/Counter.t.sol b/test/apps/Counter.t.sol index 9f3f2b1b..e0ed658b 100644 --- a/test/apps/Counter.t.sol +++ b/test/apps/Counter.t.sol @@ -90,11 +90,10 @@ contract CounterTest is DeliveryHelperTest { } function testCounterIncrementMultipleChains() public { - deploySetup(); + deploySetup(); deployCounterApp(arbChainSlug); deployCounterApp(optChainSlug); - (address arbCounter, address arbCounterForwarder) = getOnChainAndForwarderAddresses( arbChainSlug, counterId, @@ -154,7 +153,7 @@ contract CounterTest is DeliveryHelperTest { ); counterGateway.readCounters(instances); - + bidAndEndAuction(bridgeAsyncId); finalizeQuery(payloadIds[0], abi.encode(Counter(arbCounter).counter())); finalizeQuery(payloadIds[1], abi.encode(Counter(optCounter).counter())); diff --git a/test/apps/SuperTokenLockable.t.sol b/test/apps/SuperTokenLockable.t.sol index ba755c09..95e6bebe 100644 --- a/test/apps/SuperTokenLockable.t.sol +++ b/test/apps/SuperTokenLockable.t.sol @@ -298,7 +298,6 @@ contract SuperTokenLockableTest is DeliveryHelperTest { ); payloadIdCounter++; - bytes memory encodedOrder = abi.encode(userOrder); appContracts.superTokenLockableApp.bridge(encodedOrder); bidAndEndAuction(bridgeAsyncId); @@ -358,7 +357,6 @@ contract SuperTokenLockableTest is DeliveryHelperTest { payloadIdCounter++ ); - // bidAndEndAuction(cancelAsyncId); // finalizeAndExecute( // cancelPayloadIds[0], From b36151c3da4bbb0a606d2ebbafa64d537d54e708 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Thu, 20 Feb 2025 17:04:31 +0400 Subject: [PATCH 089/186] fix: super token --- contracts/apps/super-token-lockable/SuperTokenLockable.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/apps/super-token-lockable/SuperTokenLockable.sol b/contracts/apps/super-token-lockable/SuperTokenLockable.sol index 1fa16005..abd8fa1c 100644 --- a/contracts/apps/super-token-lockable/SuperTokenLockable.sol +++ b/contracts/apps/super-token-lockable/SuperTokenLockable.sol @@ -50,11 +50,11 @@ contract SuperTokenLockable is ERC20, Ownable, PlugBase { _mint(user_, amount_); } - function setSocket(address newSocket_) external onlyOwner { + function setSocket(address newSocket_) external onlySocket { _setSocket(newSocket_); } - function setLimitHook(address limitHook_) external onlyOwner { + function setLimitHook(address limitHook_) external onlySocket { limitHook__ = LimitHook(limitHook_); } } From bbb2dc1281ccbf0b8957702dbd5186f52267e707 Mon Sep 17 00:00:00 2001 From: Akash Date: Thu, 20 Feb 2025 18:26:45 +0400 Subject: [PATCH 090/186] fix: hardhat scripts, deployment working --- contracts/base/AppDeployerBase.sol | 3 +- deployments/dev_addresses.json | 48 ++++---- deployments/dev_verification.json | 114 ++++++++++++++++-- hardhat-scripts/config/config.ts | 41 +++++++ hardhat-scripts/config/index.ts | 1 + hardhat-scripts/constants/config.ts | 85 ------------- hardhat-scripts/constants/constants.ts | 14 --- .../{protocolConstants.ts => enums.ts} | 2 +- hardhat-scripts/constants/index.ts | 5 +- hardhat-scripts/constants/types.ts | 18 +++ hardhat-scripts/deploy/1.deploy.ts | 55 +++++---- hardhat-scripts/deploy/2.roles.ts | 66 +++++----- hardhat-scripts/deploy/3.upgradeManagers.ts | 37 +++--- hardhat-scripts/deploy/4.connect.ts | 13 +- hardhat-scripts/deploy/5.upload.ts | 47 ++------ hardhat-scripts/deploy/6.setupEnv.ts | 6 +- hardhat-scripts/deploy/config.ts | 55 --------- hardhat-scripts/deploy/sendToken.ts | 51 -------- hardhat-scripts/deploy/utils/index.ts | 2 - .../{deploy => }/migration/migrate-proxies.ts | 6 +- .../{utils => misc-scripts}/getErrorCodes.ts | 0 .../{utils => misc-scripts}/getEventTopics.ts | 0 .../updateLastBlocks.ts | 7 +- hardhat-scripts/{deploy => }/utils/address.ts | 0 .../utils/utils.ts => utils/deployUtils.ts} | 2 +- hardhat-scripts/utils/index.ts | 5 + .../{constants => utils}/networks.ts | 3 +- .../{constants => utils}/overrides.ts | 15 ++- hardhat-scripts/verify/index.ts | 1 + hardhat-scripts/{deploy => verify}/verify.ts | 6 +- hardhat.config.ts | 12 +- lib/solady | 2 +- setupInfraContracts.sh | 4 +- test/apps/Counter.t.sol | 5 +- test/apps/SuperTokenLockable.t.sol | 2 - 35 files changed, 333 insertions(+), 400 deletions(-) create mode 100644 hardhat-scripts/config/config.ts create mode 100644 hardhat-scripts/config/index.ts delete mode 100644 hardhat-scripts/constants/config.ts rename hardhat-scripts/constants/{protocolConstants.ts => enums.ts} (92%) create mode 100644 hardhat-scripts/constants/types.ts delete mode 100644 hardhat-scripts/deploy/config.ts delete mode 100644 hardhat-scripts/deploy/sendToken.ts delete mode 100644 hardhat-scripts/deploy/utils/index.ts rename hardhat-scripts/{deploy => }/migration/migrate-proxies.ts (97%) rename hardhat-scripts/{utils => misc-scripts}/getErrorCodes.ts (100%) rename hardhat-scripts/{utils => misc-scripts}/getEventTopics.ts (100%) rename hardhat-scripts/{utils => misc-scripts}/updateLastBlocks.ts (93%) rename hardhat-scripts/{deploy => }/utils/address.ts (100%) rename hardhat-scripts/{deploy/utils/utils.ts => utils/deployUtils.ts} (99%) create mode 100644 hardhat-scripts/utils/index.ts rename hardhat-scripts/{constants => utils}/networks.ts (94%) rename hardhat-scripts/{constants => utils}/overrides.ts (79%) create mode 100644 hardhat-scripts/verify/index.ts rename hardhat-scripts/{deploy => verify}/verify.ts (92%) diff --git a/contracts/base/AppDeployerBase.sol b/contracts/base/AppDeployerBase.sol index f7b40c83..b6eff74f 100644 --- a/contracts/base/AppDeployerBase.sol +++ b/contracts/base/AppDeployerBase.sol @@ -83,7 +83,8 @@ abstract contract AppDeployerBase is AppGatewayBase, IAppDeployer { return address(0); } - onChainAddress = IForwarder(forwarderAddresses[contractId_][chainSlug_]).getOnChainAddress(); + onChainAddress = IForwarder(forwarderAddresses[contractId_][chainSlug_]) + .getOnChainAddress(); } /// @notice Callback in pd promise to be called after all contracts are deployed diff --git a/deployments/dev_addresses.json b/deployments/dev_addresses.json index 7f4625ae..8e2f78f9 100644 --- a/deployments/dev_addresses.json +++ b/deployments/dev_addresses.json @@ -1,32 +1,32 @@ { "421614": { - "ContractFactoryPlug": "0x1dc20d27F06876cA74ee4e2E9a4724f06a4a5E54", - "FastSwitchboard": "0xaFFfaD81e6DDE509Bd83Ab2024225b2FF537BeA7", - "FeesPlug": "0xb2B779ab8FC851bCE986d25B2824933B0Cd101d9", - "Socket": "0x9B06e2Dae351ed8B1112C036e5c306E8fBe4C9c5", - "SocketBatcher": "0xd627BFe7d2fCAC1147c996a6F2CAaB2E1e1bD344", - "startBlock": 124035386 + "ContractFactoryPlug": "0x38cAf1D477F806Fae8aed84ecD68E00eF6c2cB0c", + "FastSwitchboard": "0xB16475054Dc6D8bfbd80daE964bbE416a4B7a791", + "FeesPlug": "0x228AA70a66498FC75524371cDAfB31958Ca5F12D", + "Socket": "0x963eC83119862cD518826DA9177B348cFdfebaA4", + "SocketBatcher": "0x2db8cb4f841aa944869ECD5002e8153642A30971", + "startBlock": 125604419 }, "7625382": { - "AddressResolver": "0x1287D33646d763Ff8237Aa7BE7d92Fc918c66589", - "AddressResolverImpl": "0x8662FC08dEC7c61Dd3432fAF45a5bC024BB60B00", - "AuctionManager": "0xE3806Bc41FEAFCAA2480E702fF02dA14F767bF0F", - "AuctionManagerImpl": "0x4C68058509d754Cc0dE474eBC20aE94e4787E704", - "DeliveryHelper": "0x4D8Fb6e8a5294ed0644f462b5723ee228ecf9958", - "DeliveryHelperImpl": "0x3c9f5172feb0dDfC06176cE67B566EFbb01CCe98", - "ERC1967Factory": "0xbBfb525ADc6eC38Ef0D4b807d327c2Dd1C286de1", - "FeesManager": "0x886682a69D6c0240EB850cc2e42c5B4B74449e82", - "FeesManagerImpl": "0xF4D3BDe438416938217d4624c82AEbEb46CeD371", - "startBlock": 18, - "WatcherPrecompile": "0xaCf94Cd4A7e70304F5CA6294CDAe3CBe78Ea6A86", - "WatcherPrecompileImpl": "0x8F18fC10a8b40b548C6F04Fb252481c783A9ace0" + "AddressResolver": "0x5d16F235471531521ec23e1c75F26F55b15f51F1", + "AddressResolverImpl": "0x3d981a431c38B9b781178279AecFb91509BDa645", + "AuctionManager": "0x7DC27a33f99252FaF2388416620E3178597cfBdC", + "AuctionManagerImpl": "0x48228f8ebdCA92B7F7fdC9C545372123f5Bcc4C4", + "DeliveryHelper": "0xC415FA4baE9183a2439FA0a06dd558bb4FCc0051", + "DeliveryHelperImpl": "0xc67BEa5A43cb0D908866F3577D1f967f901Dbc75", + "ERC1967Factory": "0xC36e58c0c505435179417a318333e4a7C1867247", + "FeesManager": "0x7B03A532aCea55bc06aB39b844797dD5d82Af012", + "FeesManagerImpl": "0xaF369f1fc1523dc8086c2ACDD7e7A73aA8732FE6", + "startBlock": 5534, + "WatcherPrecompile": "0x71B25Fc5f47E786574aFca919Ca61611168d94D0", + "WatcherPrecompileImpl": "0xCF9728Dc37da5c5B08780F818B6fB65c64d6a402" }, "11155420": { - "ContractFactoryPlug": "0x0EE19F0D0e34Cdd2eb4F61E24DC837b0b7c34e69", - "FastSwitchboard": "0x70bfB36F8b8de7763F1D52d954225ae88F6Ed595", - "FeesPlug": "0x7F5D263572469Fdf1875Cd858D557B45e9FC7f23", - "Socket": "0x0BAAD473580c9F7Ca8b2758759aF3ce5E3154bC6", - "SocketBatcher": "0xCf731f35EFd775F692fe24e650e75Fd64bBaD810", - "startBlock": 23911773 + "ContractFactoryPlug": "0x43942f05D5b44DC6Ca19b316dF54BE87FcF9D583", + "FastSwitchboard": "0xA448B8CD7325AA38d4E533cE209471B7ce01901F", + "FeesPlug": "0x17b3c7c5552fA4e730888558A8912cFD7A8b042e", + "Socket": "0xaF57894A5244711a7bEBE582E9e121980f1aa95e", + "SocketBatcher": "0x977e2f721f8958b2F776d2dc693D04A1256ed426", + "startBlock": 24127420 } } diff --git a/deployments/dev_verification.json b/deployments/dev_verification.json index 75548eea..5106392d 100644 --- a/deployments/dev_verification.json +++ b/deployments/dev_verification.json @@ -1,42 +1,130 @@ { - "421614": [], + "421614": [ + [ + "0x38cAf1D477F806Fae8aed84ecD68E00eF6c2cB0c", + "ContractFactoryPlug", + "contracts/protocol/payload-delivery/ContractFactoryPlug.sol", + [ + "0x963eC83119862cD518826DA9177B348cFdfebaA4", + "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18" + ] + ], + [ + "0x228AA70a66498FC75524371cDAfB31958Ca5F12D", + "FeesPlug", + "contracts/protocol/payload-delivery/FeesPlug.sol", + [ + "0x963eC83119862cD518826DA9177B348cFdfebaA4", + "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18" + ] + ], + [ + "0xB16475054Dc6D8bfbd80daE964bbE416a4B7a791", + "FastSwitchboard", + "contracts/protocol/socket/switchboard/FastSwitchboard.sol", + [ + 421614, + "0x963eC83119862cD518826DA9177B348cFdfebaA4", + "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18" + ] + ], + [ + "0x2db8cb4f841aa944869ECD5002e8153642A30971", + "SocketBatcher", + "contracts/protocol/socket/SocketBatcher.sol", + [ + "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18", + "0x963eC83119862cD518826DA9177B348cFdfebaA4" + ] + ], + [ + "0x963eC83119862cD518826DA9177B348cFdfebaA4", + "Socket", + "contracts/protocol/socket/Socket.sol", + [421614, "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18", "EVMX"] + ] + ], "7625382": [ [ - "0xb888e3a8F9cC8F0281796958B01862427417b0Ea", + "0x48228f8ebdCA92B7F7fdC9C545372123f5Bcc4C4", "AuctionManager", - "contracts/apps/payload-delivery/app-gateway/AuctionManager.sol", + "contracts/protocol/payload-delivery/app-gateway/AuctionManager.sol", [] ], [ - "0x5bA4C527883F7D9e12d71Da5Cd170f26eCF2F901", + "0xc67BEa5A43cb0D908866F3577D1f967f901Dbc75", "DeliveryHelper", - "contracts/apps/payload-delivery/app-gateway/DeliveryHelper.sol", + "contracts/protocol/payload-delivery/app-gateway/DeliveryHelper.sol", [] ], [ - "0x731f609cae8C9B6862B4c1D43dE29d4759f878F8", + "0xaF369f1fc1523dc8086c2ACDD7e7A73aA8732FE6", "FeesManager", - "contracts/apps/payload-delivery/app-gateway/FeesManager.sol", + "contracts/protocol/payload-delivery/app-gateway/FeesManager.sol", [] ], [ - "0x32D3c608405b9b037A574550a40477F8Ea1f8B5B", + "0xCF9728Dc37da5c5B08780F818B6fB65c64d6a402", "WatcherPrecompile", - "contracts/watcherPrecompile/WatcherPrecompile.sol", + "contracts/protocol/watcherPrecompile/WatcherPrecompile.sol", [] ], [ - "0xE6C9cf66F57f6aF78585235E36E94007020e3746", + "0x3d981a431c38B9b781178279AecFb91509BDa645", "AddressResolver", - "contracts/AddressResolver.sol", + "contracts/protocol/AddressResolver.sol", [] ], [ - "0xbBfb525ADc6eC38Ef0D4b807d327c2Dd1C286de1", + "0xC36e58c0c505435179417a318333e4a7C1867247", "ERC1967Factory", "lib/solady/src/utils/ERC1967Factory.sol", [] ] ], - "11155420": [] + "11155420": [ + [ + "0x43942f05D5b44DC6Ca19b316dF54BE87FcF9D583", + "ContractFactoryPlug", + "contracts/protocol/payload-delivery/ContractFactoryPlug.sol", + [ + "0xaF57894A5244711a7bEBE582E9e121980f1aa95e", + "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18" + ] + ], + [ + "0x17b3c7c5552fA4e730888558A8912cFD7A8b042e", + "FeesPlug", + "contracts/protocol/payload-delivery/FeesPlug.sol", + [ + "0xaF57894A5244711a7bEBE582E9e121980f1aa95e", + "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18" + ] + ], + [ + "0xA448B8CD7325AA38d4E533cE209471B7ce01901F", + "FastSwitchboard", + "contracts/protocol/socket/switchboard/FastSwitchboard.sol", + [ + 11155420, + "0xaF57894A5244711a7bEBE582E9e121980f1aa95e", + "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18" + ] + ], + [ + "0x977e2f721f8958b2F776d2dc693D04A1256ed426", + "SocketBatcher", + "contracts/protocol/socket/SocketBatcher.sol", + [ + "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18", + "0xaF57894A5244711a7bEBE582E9e121980f1aa95e" + ] + ], + [ + "0xaF57894A5244711a7bEBE582E9e121980f1aa95e", + "Socket", + "contracts/protocol/socket/Socket.sol", + [11155420, "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18", "EVMX"] + ] + ] } diff --git a/hardhat-scripts/config/config.ts b/hardhat-scripts/config/config.ts new file mode 100644 index 00000000..444841bc --- /dev/null +++ b/hardhat-scripts/config/config.ts @@ -0,0 +1,41 @@ +import { config as dotenvConfig } from "dotenv"; +dotenvConfig(); +import { ChainSlug, DeploymentMode, version } from "@socket.tech/dl-core"; +import { ethers } from "ethers"; + +export const mode = process.env.DEPLOYMENT_MODE as + | DeploymentMode + | DeploymentMode.DEV; + +export const logConfig = () => { + console.log( + "================================================================================================================" + ); + console.log(""); + console.log(`Mode: ${mode}`); + console.log(`Version: ${version[mode]}`); + console.log(""); + console.log( + `Make sure ${mode}_addresses.json and ${mode}_verification.json is cleared for given networks if redeploying!!` + ); + console.log(""); + console.log( + "================================================================================================================" + ); +}; + +export const chains: Array = [ + ChainSlug.ARBITRUM_SEPOLIA, + ChainSlug.OPTIMISM_SEPOLIA, + // ChainSlug.SEPOLIA, + // BASE_SEPOLIA_CHAIN_ID as ChainSlug, +]; + +export const auctionEndDelaySeconds = 0; +export const watcher = "0xb62505feacC486e809392c65614Ce4d7b051923b"; +export const MAX_FEES = ethers.utils.parseEther("0.001"); +export const EVMX_CHAIN_ID = 7625382; +export const MAX_LIMIT = 100; +export const BID_TIMEOUT = 600; +export const EXPIRY_TIME = 300; +export const UPGRADE_VERSION = 1; diff --git a/hardhat-scripts/config/index.ts b/hardhat-scripts/config/index.ts new file mode 100644 index 00000000..5c62e04f --- /dev/null +++ b/hardhat-scripts/config/index.ts @@ -0,0 +1 @@ +export * from "./config"; diff --git a/hardhat-scripts/constants/config.ts b/hardhat-scripts/constants/config.ts deleted file mode 100644 index 5ccef6a3..00000000 --- a/hardhat-scripts/constants/config.ts +++ /dev/null @@ -1,85 +0,0 @@ -import { - ChainSlug, - IntegrationTypes, - NativeSwitchboard, -} from "@socket.tech/dl-core"; - -const TIMEOUT = 7200; -export const maxAllowedPacketLength = 10; - -// return chain specific timeout if present else default value -export const timeout = (chain: number): number => { - return TIMEOUT; -}; - -export const getDefaultIntegrationType = ( - chain: ChainSlug, - sibling: ChainSlug -): IntegrationTypes => { - return switchboards?.[chain]?.[sibling] - ? IntegrationTypes.native - : IntegrationTypes.fast; -}; - -export const switchboards = { - [ChainSlug.ARBITRUM_SEPOLIA]: { - [ChainSlug.SEPOLIA]: { - switchboard: NativeSwitchboard.ARBITRUM_L2, - }, - }, - [ChainSlug.ARBITRUM]: { - [ChainSlug.MAINNET]: { - switchboard: NativeSwitchboard.ARBITRUM_L2, - }, - }, - [ChainSlug.OPTIMISM]: { - [ChainSlug.MAINNET]: { - switchboard: NativeSwitchboard.OPTIMISM, - }, - }, - [ChainSlug.OPTIMISM_SEPOLIA]: { - [ChainSlug.SEPOLIA]: { - switchboard: NativeSwitchboard.OPTIMISM, - }, - }, - [ChainSlug.LYRA_TESTNET]: { - [ChainSlug.SEPOLIA]: { - switchboard: NativeSwitchboard.OPTIMISM, - }, - }, - // [ChainSlug.LYRA]: { - // [ChainSlug.MAINNET]: { - // switchboard: NativeSwitchboard.OPTIMISM, - // }, - // }, - [ChainSlug.POLYGON_MAINNET]: { - [ChainSlug.MAINNET]: { - switchboard: NativeSwitchboard.POLYGON_L2, - }, - }, - [ChainSlug.SEPOLIA]: { - [ChainSlug.ARBITRUM_SEPOLIA]: { - switchboard: NativeSwitchboard.ARBITRUM_L1, - }, - [ChainSlug.OPTIMISM_SEPOLIA]: { - switchboard: NativeSwitchboard.OPTIMISM, - }, - [ChainSlug.LYRA_TESTNET]: { - switchboard: NativeSwitchboard.OPTIMISM, - }, - }, - [ChainSlug.MAINNET]: { - [ChainSlug.ARBITRUM]: { - switchboard: NativeSwitchboard.ARBITRUM_L1, - }, - [ChainSlug.OPTIMISM]: { - switchboard: NativeSwitchboard.OPTIMISM, - }, - [ChainSlug.POLYGON_MAINNET]: { - switchboard: NativeSwitchboard.POLYGON_L1, - }, - [ChainSlug.LYRA]: { - switchboard: NativeSwitchboard.OPTIMISM, - }, - }, -}; diff --git a/hardhat-scripts/constants/constants.ts b/hardhat-scripts/constants/constants.ts index b908f2ea..753b92e2 100644 --- a/hardhat-scripts/constants/constants.ts +++ b/hardhat-scripts/constants/constants.ts @@ -1,16 +1,2 @@ -import { ethers } from "ethers"; - export const ETH_ADDRESS = "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE"; -export const MAX_FEES = ethers.utils.parseEther("0.001"); - -export const fees = { - // fees - feePoolChain: 421614, // example chain ID - feePoolToken: ETH_ADDRESS, // example token address - amount: MAX_FEES, // example max fees -}; - export const BASE_SEPOLIA_CHAIN_ID = 84532; -export const EVMX_CHAIN_ID = 7625382; -export const MAX_LIMIT = 100; -export const BID_TIMEOUT = 1000; diff --git a/hardhat-scripts/constants/protocolConstants.ts b/hardhat-scripts/constants/enums.ts similarity index 92% rename from hardhat-scripts/constants/protocolConstants.ts rename to hardhat-scripts/constants/enums.ts index 0133c56a..371023e1 100644 --- a/hardhat-scripts/constants/protocolConstants.ts +++ b/hardhat-scripts/constants/enums.ts @@ -6,7 +6,7 @@ export enum CORE_CONTRACTS { ContractFactoryPlug = "ContractFactoryPlug", } -export enum OffChainVMCoreContracts { +export enum EVMxCoreContracts { WatcherPrecompile = "WatcherPrecompile", AuctionManager = "AuctionManager", FeesManager = "FeesManager", diff --git a/hardhat-scripts/constants/index.ts b/hardhat-scripts/constants/index.ts index 5297f967..e42be831 100644 --- a/hardhat-scripts/constants/index.ts +++ b/hardhat-scripts/constants/index.ts @@ -1,2 +1,3 @@ -export * from "./networks"; -export * from "./config"; +export * from "./constants"; +export * from "./enums"; +export * from "./types"; diff --git a/hardhat-scripts/constants/types.ts b/hardhat-scripts/constants/types.ts new file mode 100644 index 00000000..e6468794 --- /dev/null +++ b/hardhat-scripts/constants/types.ts @@ -0,0 +1,18 @@ +export type ChainAddressesObj = { + Socket: string; + SocketBatcher: string; + FastSwitchboard: string; + FeesPlug: string; + ContractFactoryPlug: string; + startBlock: number; +}; + +export type CloudAddressesObj = { + SignatureVerifier: string; + AddressResolver: string; + WatcherPrecompile: string; + AuctionManager: string; + FeesManager: string; + DeliveryHelper: string; + startBlock: number; +}; diff --git a/hardhat-scripts/deploy/1.deploy.ts b/hardhat-scripts/deploy/1.deploy.ts index ec95a47d..a3c1cdcf 100644 --- a/hardhat-scripts/deploy/1.deploy.ts +++ b/hardhat-scripts/deploy/1.deploy.ts @@ -1,28 +1,29 @@ -import { config } from "dotenv"; -config(); - -import { Contract, Signer, Wallet, providers } from "ethers"; -import { DeployParams, getOrDeploy, storeAddresses } from "./utils"; import { ChainSlug, ChainSocketAddresses, DeploymentAddresses, DeploymentMode, } from "@socket.tech/dl-core"; -import { getProviderFromChainSlug } from "../constants"; +import { config } from "dotenv"; +import { Contract, Signer, Wallet, providers } from "ethers"; import { ethers } from "hardhat"; import dev_addresses from "../../deployments/dev_addresses.json"; -import { auctionEndDelaySeconds, chains } from "./config"; -import { MAX_LIMIT, EVMX_CHAIN_ID, BID_TIMEOUT } from "../constants/constants"; -import { getImplementationAddress } from "./migration/migrate-proxies"; +import { BID_TIMEOUT, EVMX_CHAIN_ID, EXPIRY_TIME, MAX_LIMIT } from "../config"; +import { auctionEndDelaySeconds, chains, logConfig } from "../config/config"; +import { CORE_CONTRACTS, EVMxCoreContracts } from "../constants"; +import { getImplementationAddress } from "../migration/migrate-proxies"; import { - CORE_CONTRACTS, - EVMxCoreContracts, -} from "../constants/protocolConstants"; + DeployParams, + getOrDeploy, + getProviderFromChainSlug, + storeAddresses, +} from "../utils"; +config(); let offChainVMOwner: string; const main = async () => { try { + logConfig(); let addresses: DeploymentAddresses; let deployUtils: DeployParams = { addresses: {} as ChainSocketAddresses, @@ -59,7 +60,7 @@ const main = async () => { const socket: Contract = await getOrDeploy( contractName, contractName, - `contracts/socket/${contractName}.sol`, + `contracts/protocol/socket/${contractName}.sol`, [chain as ChainSlug, socketOwner, "EVMX"], deployUtils ); @@ -69,7 +70,7 @@ const main = async () => { const batcher: Contract = await getOrDeploy( contractName, contractName, - `contracts/socket/${contractName}.sol`, + `contracts/protocol/socket/${contractName}.sol`, [socketOwner, socket.address], deployUtils ); @@ -79,7 +80,7 @@ const main = async () => { const sb: Contract = await getOrDeploy( contractName, contractName, - `contracts/socket/switchboard/${contractName}.sol`, + `contracts/protocol/socket/switchboard/${contractName}.sol`, [chain as ChainSlug, socket.address, socketOwner], deployUtils ); @@ -89,7 +90,7 @@ const main = async () => { const feesPlug: Contract = await getOrDeploy( contractName, contractName, - `contracts/apps/payload-delivery/${contractName}.sol`, + `contracts/protocol/payload-delivery/${contractName}.sol`, [socket.address, socketOwner], deployUtils ); @@ -99,7 +100,7 @@ const main = async () => { const contractFactoryPlug: Contract = await getOrDeploy( contractName, contractName, - `contracts/apps/payload-delivery/${contractName}.sol`, + `contracts/protocol/payload-delivery/${contractName}.sol`, [socket.address, socketOwner], deployUtils ); @@ -176,8 +177,8 @@ const deployWatcherVMContracts = async () => { deployUtils.addresses[contractName] = proxyFactory.address; deployUtils = await deployContractWithProxy( - OffChainVMCoreContracts.AddressResolver, - `contracts/AddressResolver.sol`, + EVMxCoreContracts.AddressResolver, + `contracts/protocol/AddressResolver.sol`, [offChainVMOwner], proxyFactory, deployUtils @@ -190,15 +191,21 @@ const deployWatcherVMContracts = async () => { deployUtils = await deployContractWithProxy( EVMxCoreContracts.WatcherPrecompile, - `contracts/watcherPrecompile/WatcherPrecompile.sol`, - [offChainVMOwner, addressResolver.address, MAX_LIMIT], + `contracts/protocol/watcherPrecompile/WatcherPrecompile.sol`, + [ + offChainVMOwner, + addressResolver.address, + MAX_LIMIT, + EXPIRY_TIME, + EVMX_CHAIN_ID, + ], proxyFactory, deployUtils ); deployUtils = await deployContractWithProxy( EVMxCoreContracts.FeesManager, - `contracts/apps/payload-delivery/app-gateway/FeesManager.sol`, + `contracts/protocol/payload-delivery/app-gateway/FeesManager.sol`, [addressResolver.address, offChainVMOwner], proxyFactory, deployUtils @@ -210,7 +217,7 @@ const deployWatcherVMContracts = async () => { deployUtils = await deployContractWithProxy( EVMxCoreContracts.DeliveryHelper, - `contracts/apps/payload-delivery/app-gateway/DeliveryHelper.sol`, + `contracts/protocol/payload-delivery/app-gateway/DeliveryHelper.sol`, [addressResolver.address, offChainVMOwner, BID_TIMEOUT], proxyFactory, deployUtils @@ -218,7 +225,7 @@ const deployWatcherVMContracts = async () => { deployUtils = await deployContractWithProxy( EVMxCoreContracts.AuctionManager, - `contracts/apps/payload-delivery/app-gateway/AuctionManager.sol`, + `contracts/protocol/payload-delivery/app-gateway/AuctionManager.sol`, [ EVMX_CHAIN_ID, auctionEndDelaySeconds, diff --git a/hardhat-scripts/deploy/2.roles.ts b/hardhat-scripts/deploy/2.roles.ts index 35ed6836..4bd15a2a 100644 --- a/hardhat-scripts/deploy/2.roles.ts +++ b/hardhat-scripts/deploy/2.roles.ts @@ -1,5 +1,4 @@ import { - ChainSocketAddresses, CORE_CONTRACTS, DeploymentAddresses, ROLES, @@ -8,12 +7,12 @@ import { import { config as dotenvConfig } from "dotenv"; dotenvConfig(); +import { Wallet } from "ethers"; import { ethers } from "hardhat"; import dev_addresses from "../../deployments/dev_addresses.json"; -import { chains, watcher } from "./config"; -import { getProviderFromChainSlug } from "../constants"; -import { Wallet } from "ethers"; -import { getInstance, getRoleHash } from "./utils"; +import { chains, watcher } from "../config"; +import { ChainAddressesObj } from "../constants"; +import { getInstance, getProviderFromChainSlug, getRoleHash } from "../utils"; export const REQUIRED_ROLES = { FastSwitchboard: [ROLES.WATCHER_ROLE, ROLES.RESCUE_ROLE], @@ -29,23 +28,22 @@ export const main = async () => { addresses = dev_addresses as unknown as DeploymentAddresses; for (const chain of chains) { - let chainAddresses: ChainSocketAddresses = addresses[chain] - ? (addresses[chain] as ChainSocketAddresses) - : ({} as ChainSocketAddresses); - + let chainAddresses: ChainAddressesObj = (addresses[chain] ?? + {}) as ChainAddressesObj; const providerInstance = getProviderFromChainSlug(chain); const signer: Wallet = new ethers.Wallet( process.env.SOCKET_SIGNER_KEY as string, providerInstance ); - for (const [contractName, roleHash] of Object.entries(REQUIRED_ROLES)) { - if (!chainAddresses[contractName as keyof ChainSocketAddresses]) - continue; + for (const [contractName, roles] of Object.entries(REQUIRED_ROLES)) { + const contractAddress = + chainAddresses[contractName as keyof ChainAddressesObj]; + if (!contractAddress) continue; let contract = await getInstance( contractName as CORE_CONTRACTS, - chainAddresses[contractName as keyof ChainSocketAddresses]! + String(contractAddress) ); contract = contract.connect(signer); @@ -54,27 +52,31 @@ export const main = async () => { ? watcher : signer.address; - const hasRole = await contract.callStatic["hasRole(bytes32,address)"]( - getRoleHash(roleHash), - targetAddress, - { - from: signer.address, - } - ); + for (const roleName of roles) { + const roleHash = getRoleHash(roleName); + const hasRole = await contract.callStatic["hasRole(bytes32,address)"]( + roleHash, + targetAddress, + { + from: signer.address, + } + ); - if (!hasRole) { - let tx; - if (contractName === CORE_CONTRACTS.FastSwitchboard) { - tx = await contract.grantWatcherRole(targetAddress); - } else { - tx = await contract.grantRole(getRoleHash(roleHash), targetAddress); + if (!hasRole) { + let tx; + if (contractName === CORE_CONTRACTS.FastSwitchboard) { + tx = await contract.grantWatcherRole(targetAddress); + } else { + tx = await contract.grantRole(roleHash, targetAddress); + } + console.log( + `granting ${roleName} role to ${targetAddress} for ${contractName}`, + chain, + "txHash: ", + tx.hash + ); + await tx.wait(); } - console.log( - `granting ${roleHash} role to ${targetAddress} for ${contractName}`, - chain, - tx.hash - ); - await tx.wait(); } } } diff --git a/hardhat-scripts/deploy/3.upgradeManagers.ts b/hardhat-scripts/deploy/3.upgradeManagers.ts index 7f7a4a9f..6dca3449 100644 --- a/hardhat-scripts/deploy/3.upgradeManagers.ts +++ b/hardhat-scripts/deploy/3.upgradeManagers.ts @@ -1,7 +1,6 @@ import { ChainSlug, ChainSocketAddresses, - CORE_CONTRACTS, DeploymentAddresses, DeploymentMode, } from "@socket.tech/dl-core"; @@ -9,14 +8,16 @@ import { import { config as dotenvConfig } from "dotenv"; dotenvConfig(); +import { Wallet } from "ethers"; import { ethers } from "hardhat"; import dev_addresses from "../../deployments/dev_addresses.json"; -import { chains } from "./config"; -import { getProviderFromChainSlug } from "../constants"; -import { Wallet } from "ethers"; -import { getInstance, storeAddresses } from "./utils"; -import { EVMxCoreContracts } from "../constants/protocolConstants"; -import { EVMX_CHAIN_ID } from "../constants/constants"; +import { chains, EVMX_CHAIN_ID } from "../config"; +import { CORE_CONTRACTS, EVMxCoreContracts } from "../constants"; +import { + getInstance, + getProviderFromChainSlug, + storeAddresses, +} from "../utils"; export const main = async () => { let addresses: DeploymentAddresses; @@ -37,7 +38,7 @@ export const main = async () => { const socketContract = ( await getInstance( - "contracts/socket/Socket.sol:Socket", + CORE_CONTRACTS.Socket, chainAddresses[CORE_CONTRACTS.Socket] ) ).connect(signer); @@ -66,7 +67,7 @@ async function setOnchainContracts(chain, addresses) { const watcherVMaddr = addresses[EVMX_CHAIN_ID]!; const watcherPrecompile = ( await getInstance( - "contracts/watcherPrecompile/WatcherPrecompile.sol:WatcherPrecompile", + EVMxCoreContracts.WatcherPrecompile, watcherVMaddr[EVMxCoreContracts.WatcherPrecompile] ) ).connect(signer); @@ -75,17 +76,20 @@ async function setOnchainContracts(chain, addresses) { const sbAddress = addresses[chain][CORE_CONTRACTS.FastSwitchboard]; const socketAddress = addresses[chain][CORE_CONTRACTS.Socket]; const contractFactoryPlugAddress = - addresses[chain][EVMxCoreContracts.ContractFactoryPlug]; - const feesPlugAddress = addresses[chain][EVMxCoreContracts.FeesPlug]; + addresses[chain][CORE_CONTRACTS.ContractFactoryPlug]; + const feesPlugAddress = addresses[chain][CORE_CONTRACTS.FeesPlug]; - const currentValue = await watcherPrecompile.switchboards(chain, fastSBtype); + const currentSbAddress = await watcherPrecompile.switchboards( + chain, + fastSBtype + ); const currentSocket = await watcherPrecompile.sockets(chain); const currentContractFactoryPlug = await watcherPrecompile.contractFactoryPlug(chain); const currentFeesPlug = await watcherPrecompile.feesPlug(chain); if ( - currentValue.toLowerCase() !== sbAddress.toLowerCase() || + currentSbAddress.toLowerCase() !== sbAddress.toLowerCase() || currentSocket.toLowerCase() !== socketAddress.toLowerCase() || currentContractFactoryPlug.toLowerCase() !== contractFactoryPlugAddress.toLowerCase() || @@ -102,7 +106,7 @@ async function setOnchainContracts(chain, addresses) { feesPlugAddress ); - console.log(`Setting onchain contracts for ${chain} to`, tx.hash); + console.log(`Setting onchain contracts for ${chain}, txHash: `, tx.hash); await tx.wait(); } } @@ -111,10 +115,7 @@ const registerSb = async (sbAddress, signer, socket) => { try { // used fast switchboard here as all have same function signature const switchboard = ( - await getInstance( - "contracts/socket/switchboard/FastSwitchboard.sol:FastSwitchboard", - sbAddress - ) + await getInstance(CORE_CONTRACTS.FastSwitchboard, sbAddress) ).connect(signer); // send overrides while reading capacitor to avoid errors on mantle chain diff --git a/hardhat-scripts/deploy/4.connect.ts b/hardhat-scripts/deploy/4.connect.ts index 39e553cb..5a3c53e2 100644 --- a/hardhat-scripts/deploy/4.connect.ts +++ b/hardhat-scripts/deploy/4.connect.ts @@ -2,16 +2,11 @@ import { ChainSocketAddresses, DeploymentAddresses, } from "@socket.tech/dl-core"; -import { getProviderFromChainSlug } from "../constants"; import { Contract, ethers, providers, Wallet } from "ethers"; -import { getInstance } from "./utils"; -import { chains } from "./config"; import dev_addresses from "../../deployments/dev_addresses.json"; -import { EVMX_CHAIN_ID } from "../constants/constants"; -import { - CORE_CONTRACTS, - EVMxCoreContracts, -} from "../constants/protocolConstants"; +import { chains, EVMX_CHAIN_ID } from "../config"; +import { CORE_CONTRACTS, EVMxCoreContracts } from "../constants"; +import { getInstance, getProviderFromChainSlug } from "../utils"; const plugs = [CORE_CONTRACTS.ContractFactoryPlug, CORE_CONTRACTS.FeesPlug]; export type AppGatewayConfig = { @@ -89,7 +84,7 @@ async function connectPlug( } // Connect the plug - const tx = await plug.functions["connectSocket"]( + const tx = await plug.functions["initSocket"]( appGateway, socket.address, switchboard diff --git a/hardhat-scripts/deploy/5.upload.ts b/hardhat-scripts/deploy/5.upload.ts index c6e2925f..a9a7bdfa 100644 --- a/hardhat-scripts/deploy/5.upload.ts +++ b/hardhat-scripts/deploy/5.upload.ts @@ -1,33 +1,14 @@ +import { PutObjectCommand, S3Client } from "@aws-sdk/client-s3"; +import { ChainSlug } from "@socket.tech/dl-core"; +import { config as dotenvConfig } from "dotenv"; import fs from "fs"; import path from "path"; -import { S3Client, PutObjectCommand } from "@aws-sdk/client-s3"; -import { config as dotenvConfig } from "dotenv"; -import { BASE_SEPOLIA_CHAIN_ID, EVMX_CHAIN_ID } from "../constants/constants"; -import { ChainSlug } from "@socket.tech/dl-core"; - -// import applicationGateway from "../../artifacts/abi/SuperTokenApp.json"; -// import socketBatcher from "../../artifacts/abi/SocketBatcher.json"; -// import deliveryHelperPlug from "../../artifacts/abi/PayloadDeliveryPlug.json"; -// import socket from "../../artifacts/abi/Socket.json"; -// import watcherVM from "../../artifacts/abi/WatcherPrecompile.json"; - -// export const applicationGatewayABI = applicationGateway; -// export const socketBatcherABI = socketBatcher; -// export const ERC20ABI = ERC20; -// export const deliveryHelperABI = deliveryHelper; -// export const socketABI = socket; -// export const watcherVMABI = watcherVM; -// export const deliveryHelperPlugABI = deliveryHelperPlug; - -// const abis = { -// applicationGatewayABI, -// socketBatcherABI, -// ERC20ABI, -// deliveryHelperABI, -// socketABI, -// watcherVMABI, -// deliveryHelperPlugABI, -// }; +import { EVMX_CHAIN_ID } from "../config/config"; +import { + BASE_SEPOLIA_CHAIN_ID, + ChainAddressesObj, + CloudAddressesObj, +} from "../constants"; dotenvConfig(); @@ -37,14 +18,7 @@ type ConfigEntry = { wssRpc: string | undefined; confirmations: number; eventBlockRange: number; - addresses?: { - Socket: string; - FastSwitchboard: string; - SocketBatcher: string; - ContractFactoryPlug: string; - FeesPlug: string; - startBlock: number; - }; + addresses?: ChainAddressesObj | CloudAddressesObj; }; type S3Config = { @@ -133,4 +107,3 @@ async function uploadToS3(data: any, fileName: string) { // Upload config to S3 uploadToS3(config, "pocConfig.json"); -// uploadToS3(abis, "pocABIs.json"); diff --git a/hardhat-scripts/deploy/6.setupEnv.ts b/hardhat-scripts/deploy/6.setupEnv.ts index 93396386..641fa4ce 100644 --- a/hardhat-scripts/deploy/6.setupEnv.ts +++ b/hardhat-scripts/deploy/6.setupEnv.ts @@ -1,8 +1,8 @@ +import { ChainSlug } from "@socket.tech/dl-core"; import fs from "fs"; -import dev_addresses from "../../deployments/dev_addresses.json"; -import { EVMX_CHAIN_ID } from "../constants/constants"; import path from "path"; -import { ChainSlug } from "@socket.tech/dl-core"; +import dev_addresses from "../../deployments/dev_addresses.json"; +import { EVMX_CHAIN_ID } from "../config/config"; const envFilePath = path.join(__dirname, "../../.env"); const encoding = "utf8"; diff --git a/hardhat-scripts/deploy/config.ts b/hardhat-scripts/deploy/config.ts deleted file mode 100644 index 29ef9197..00000000 --- a/hardhat-scripts/deploy/config.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { config as dotenvConfig } from "dotenv"; -dotenvConfig(); - -import { ChainSlug, DeploymentMode, version } from "@socket.tech/dl-core"; -import { BigNumberish, utils } from "ethers"; -import { getOverrides } from "../constants/overrides"; -import { getProviderFromChainSlug } from "../constants"; - -export const mode = process.env.DEPLOYMENT_MODE as - | DeploymentMode - | DeploymentMode.DEV; - -console.log( - "================================================================================================================" -); -console.log(""); -console.log(`Mode: ${mode}`); -console.log(`Version: ${version[mode]}`); -console.log(""); -console.log( - `Make sure ${mode}_addresses.json and ${mode}_verification.json is cleared for given networks if redeploying!!` -); -console.log(""); -console.log( - "================================================================================================================" -); - -export const chains: Array = [ - ChainSlug.ARBITRUM_SEPOLIA, - ChainSlug.OPTIMISM_SEPOLIA, - // ChainSlug.SEPOLIA, - // BASE_SEPOLIA_CHAIN_ID as ChainSlug, -]; - -export const capacitorType = 1; -export const maxPacketLength = 1; -export const initialPacketCount = 0; -export const auctionEndDelaySeconds = 0; - -const MSG_VALUE_MAX_THRESHOLD = utils.parseEther("0.001"); -export const msgValueMaxThreshold = (chain: ChainSlug): BigNumberish => { - return MSG_VALUE_MAX_THRESHOLD; -}; - -export const overrides = async ( - chain: ChainSlug | number -): Promise<{ - type?: number | undefined; - gasLimit?: BigNumberish | undefined; - gasPrice?: BigNumberish | undefined; -}> => { - return await getOverrides(chain, getProviderFromChainSlug(chain)); -}; - -export const watcher = "0xb62505feacC486e809392c65614Ce4d7b051923b"; diff --git a/hardhat-scripts/deploy/sendToken.ts b/hardhat-scripts/deploy/sendToken.ts deleted file mode 100644 index 1c855e5d..00000000 --- a/hardhat-scripts/deploy/sendToken.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { - ChainSlug, - ChainSocketAddresses, - DeploymentAddresses, -} from "@socket.tech/dl-core"; -import { getProviderFromChainSlug } from "../constants"; -import { Contract, Wallet } from "ethers"; -import { getInstance } from "./utils"; -import dev_addresses from "../../deployments/dev_addresses.json"; - -const chain = ChainSlug.ARBITRUM_SEPOLIA; -const to = "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC"; -const amount = "1000000000000000000"; - -export const main = async () => { - let addresses: DeploymentAddresses; - try { - addresses = dev_addresses as unknown as DeploymentAddresses; - - if (!addresses[chain]) return; - - const providerInstance = getProviderFromChainSlug(chain); - const socketSigner: Wallet = new Wallet( - process.env.SOCKET_SIGNER_KEY as string, - providerInstance - ); - - const addr: ChainSocketAddresses = addresses[chain]!; - if (!addr["integrations"]) return; - - const token: Contract = ( - await getInstance("SuperToken", addr["SuperToken"]) - ).connect(socketSigner); - - const tx = await token.transfer(to, amount); - - console.log( - `tokens transferred from ${socketSigner.address} to ${to} on ${chain} at tx hash: ${tx.hash}` - ); - await tx.wait(); - } catch (error) { - console.log("Error while sending transaction", error); - } -}; - -main() - .then(() => process.exit(0)) - .catch((error: Error) => { - console.error(error); - process.exit(1); - }); diff --git a/hardhat-scripts/deploy/utils/index.ts b/hardhat-scripts/deploy/utils/index.ts deleted file mode 100644 index e9b2ec3e..00000000 --- a/hardhat-scripts/deploy/utils/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from "./address"; -export * from "./utils"; diff --git a/hardhat-scripts/deploy/migration/migrate-proxies.ts b/hardhat-scripts/migration/migrate-proxies.ts similarity index 97% rename from hardhat-scripts/deploy/migration/migrate-proxies.ts rename to hardhat-scripts/migration/migrate-proxies.ts index bf8c5ed6..380cfc6d 100644 --- a/hardhat-scripts/deploy/migration/migrate-proxies.ts +++ b/hardhat-scripts/migration/migrate-proxies.ts @@ -2,8 +2,8 @@ import { ethers } from "hardhat"; import { Contract, utils, Wallet } from "ethers"; import * as fs from "fs"; import * as path from "path"; -import { EVMX_CHAIN_ID, VERSION } from "../../constants/constants"; -import { getProviderFromChainSlug } from "../../constants"; +import { EVMX_CHAIN_ID, UPGRADE_VERSION } from "../config/config"; +import { getProviderFromChainSlug } from "../utils"; import { ChainSlug } from "@socket.tech/dl-core"; // Implementation slot from ERC1967 @@ -143,7 +143,7 @@ async function performUpgrade( console.log("Upgrading proxy..."); const initializeFn = contract.interface.getFunction("initialize"); const initData = contract.interface.encodeFunctionData(initializeFn, [ - VERSION, + UPGRADE_VERSION, ]); const tx = await proxyFactory.upgradeAndCall( diff --git a/hardhat-scripts/utils/getErrorCodes.ts b/hardhat-scripts/misc-scripts/getErrorCodes.ts similarity index 100% rename from hardhat-scripts/utils/getErrorCodes.ts rename to hardhat-scripts/misc-scripts/getErrorCodes.ts diff --git a/hardhat-scripts/utils/getEventTopics.ts b/hardhat-scripts/misc-scripts/getEventTopics.ts similarity index 100% rename from hardhat-scripts/utils/getEventTopics.ts rename to hardhat-scripts/misc-scripts/getEventTopics.ts diff --git a/hardhat-scripts/utils/updateLastBlocks.ts b/hardhat-scripts/misc-scripts/updateLastBlocks.ts similarity index 93% rename from hardhat-scripts/utils/updateLastBlocks.ts rename to hardhat-scripts/misc-scripts/updateLastBlocks.ts index 6a071319..c2f882a9 100644 --- a/hardhat-scripts/utils/updateLastBlocks.ts +++ b/hardhat-scripts/misc-scripts/updateLastBlocks.ts @@ -1,9 +1,8 @@ -import fs from "fs"; import dotenv from "dotenv"; -dotenv.config(); -import { getProviderFromChainSlug } from "../constants/networks"; +import fs from "fs"; import path from "path"; -import { ethers } from "ethers"; +import { getProviderFromChainSlug } from "../utils"; +dotenv.config(); const DEPLOYMENT_FILE = path.join( __dirname, "../../deployments/dev_addresses.json" diff --git a/hardhat-scripts/deploy/utils/address.ts b/hardhat-scripts/utils/address.ts similarity index 100% rename from hardhat-scripts/deploy/utils/address.ts rename to hardhat-scripts/utils/address.ts diff --git a/hardhat-scripts/deploy/utils/utils.ts b/hardhat-scripts/utils/deployUtils.ts similarity index 99% rename from hardhat-scripts/deploy/utils/utils.ts rename to hardhat-scripts/utils/deployUtils.ts index 6ddbb529..e847edc6 100644 --- a/hardhat-scripts/deploy/utils/utils.ts +++ b/hardhat-scripts/utils/deployUtils.ts @@ -12,7 +12,7 @@ import { DeploymentMode, } from "@socket.tech/dl-core"; import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/signers"; -import { overrides } from "../config"; +import { overrides } from "../utils"; import { VerifyArgs } from "../verify"; export const deploymentsPath = path.join(__dirname, `/../../../deployments/`); diff --git a/hardhat-scripts/utils/index.ts b/hardhat-scripts/utils/index.ts new file mode 100644 index 00000000..b0ec6153 --- /dev/null +++ b/hardhat-scripts/utils/index.ts @@ -0,0 +1,5 @@ +export * from "./address"; +export * from "./networks"; +export * from "./overrides"; +export * from "./accounts"; +export * from "./deployUtils"; diff --git a/hardhat-scripts/constants/networks.ts b/hardhat-scripts/utils/networks.ts similarity index 94% rename from hardhat-scripts/constants/networks.ts rename to hardhat-scripts/utils/networks.ts index 8010747d..76fe2bc8 100644 --- a/hardhat-scripts/constants/networks.ts +++ b/hardhat-scripts/utils/networks.ts @@ -7,7 +7,8 @@ import { HardhatChainName, chainSlugToHardhatChainName, } from "@socket.tech/dl-core"; -import { BASE_SEPOLIA_CHAIN_ID, EVMX_CHAIN_ID } from "./constants"; +import { EVMX_CHAIN_ID } from "../config/config"; +import { BASE_SEPOLIA_CHAIN_ID } from "../constants"; const dotenvConfigPath: string = process.env.DOTENV_CONFIG_PATH || "./.env"; dotenvConfig({ path: resolve(__dirname, dotenvConfigPath) }); diff --git a/hardhat-scripts/constants/overrides.ts b/hardhat-scripts/utils/overrides.ts similarity index 79% rename from hardhat-scripts/constants/overrides.ts rename to hardhat-scripts/utils/overrides.ts index 8a6d8ce7..685ed393 100644 --- a/hardhat-scripts/constants/overrides.ts +++ b/hardhat-scripts/utils/overrides.ts @@ -1,6 +1,7 @@ import { ChainSlug } from "@socket.tech/dl-core"; -import { BigNumber, providers } from "ethers"; -import { EVMX_CHAIN_ID } from "./constants"; +import { BigNumber, BigNumberish, providers } from "ethers"; +import { EVMX_CHAIN_ID } from "../config/config"; +import { getProviderFromChainSlug } from "./networks"; const defaultType = 0; @@ -33,6 +34,16 @@ export const chainOverrides: { }, }; +export const overrides = async ( + chain: ChainSlug | number +): Promise<{ + type?: number | undefined; + gasLimit?: BigNumberish | undefined; + gasPrice?: BigNumberish | undefined; +}> => { + return await getOverrides(chain, getProviderFromChainSlug(chain)); +}; + export const getOverrides = async ( chainSlug: ChainSlug, provider: providers.StaticJsonRpcProvider diff --git a/hardhat-scripts/verify/index.ts b/hardhat-scripts/verify/index.ts new file mode 100644 index 00000000..641f493c --- /dev/null +++ b/hardhat-scripts/verify/index.ts @@ -0,0 +1 @@ +export * from "./verify"; diff --git a/hardhat-scripts/deploy/verify.ts b/hardhat-scripts/verify/verify.ts similarity index 92% rename from hardhat-scripts/deploy/verify.ts rename to hardhat-scripts/verify/verify.ts index d9c54417..3bf82bfb 100644 --- a/hardhat-scripts/deploy/verify.ts +++ b/hardhat-scripts/verify/verify.ts @@ -1,5 +1,5 @@ import hre from "hardhat"; -import { storeUnVerifiedParams, verify } from "./utils/utils"; +import { storeUnVerifiedParams, verify } from "../utils"; import { HardhatChainName, ChainSlugToKey, @@ -8,8 +8,8 @@ import { } from "@socket.tech/dl-core"; import path from "path"; import fs from "fs"; -import { BASE_SEPOLIA_CHAIN_ID, EVMX_CHAIN_ID } from "../constants/constants"; - +import { EVMX_CHAIN_ID } from "../config/config"; +import { BASE_SEPOLIA_CHAIN_ID } from "../constants"; export type VerifyParams = { [chain in HardhatChainName]?: VerifyArgs[]; }; diff --git a/hardhat.config.ts b/hardhat.config.ts index 15a075ca..8a7dc568 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -15,7 +15,7 @@ import { resolve } from "path"; import fs from "fs"; import "./hardhat-scripts/utils/accounts"; -import { getJsonRpcUrl } from "./hardhat-scripts/constants/networks"; +import { getJsonRpcUrl } from "./hardhat-scripts/utils/networks"; import { ChainId, ChainSlug, @@ -23,10 +23,8 @@ import { HardhatChainName, hardhatChainNameToSlug, } from "@socket.tech/dl-core"; -import { - BASE_SEPOLIA_CHAIN_ID, - EVMX_CHAIN_ID, -} from "./hardhat-scripts/constants/constants"; +import { EVMX_CHAIN_ID } from "./hardhat-scripts/config/config"; +import { BASE_SEPOLIA_CHAIN_ID } from "./hardhat-scripts/constants"; const dotenvConfigPath: string = process.env.DOTENV_CONFIG_PATH || "./.env"; dotenvConfig({ path: resolve(__dirname, dotenvConfigPath) }); @@ -102,7 +100,7 @@ const config: HardhatUserConfig = { sepolia: process.env.ETHERSCAN_API_KEY || "", optimisticEthereum: process.env.OPTIMISM_API_KEY || "", optimisticTestnet: process.env.OPTIMISM_API_KEY || "", - offChainVM: "none", + evmx: "none", }, customChains: [ { @@ -130,7 +128,7 @@ const config: HardhatUserConfig = { }, }, { - network: "EVMx", + network: "evmx", chainId: EVMX_CHAIN_ID, urls: { apiURL: "", diff --git a/lib/solady b/lib/solady index 8583a6e3..6c2d0da6 160000 --- a/lib/solady +++ b/lib/solady @@ -1 +1 @@ -Subproject commit 8583a6e386b897f3db142a541f86d5953eccd835 +Subproject commit 6c2d0da6397e3c016aabc3f298de1b92c6ce7405 diff --git a/setupInfraContracts.sh b/setupInfraContracts.sh index f3bd4dca..c487ae32 100644 --- a/setupInfraContracts.sh +++ b/setupInfraContracts.sh @@ -1,7 +1,7 @@ -npx hardhat run hardhat-scripts/deploy/1.deploy.ts +npx hardhat run hardhat-scripts/deploy/1.deploy.ts --no-compile npx hardhat run hardhat-scripts/deploy/2.roles.ts --no-compile npx hardhat run hardhat-scripts/deploy/3.upgradeManagers.ts --no-compile npx hardhat run hardhat-scripts/deploy/4.connect.ts --no-compile export AWS_PROFILE=lldev && npx ts-node hardhat-scripts/deploy/5.upload.ts --resolveJsonModule npx hardhat run hardhat-scripts/deploy/6.setupEnv.ts --no-compile -npx hardhat run hardhat-scripts/deploy/verify.ts --no-compile +npx hardhat run hardhat-scripts/verify/verify.ts --no-compile diff --git a/test/apps/Counter.t.sol b/test/apps/Counter.t.sol index 9f3f2b1b..e0ed658b 100644 --- a/test/apps/Counter.t.sol +++ b/test/apps/Counter.t.sol @@ -90,11 +90,10 @@ contract CounterTest is DeliveryHelperTest { } function testCounterIncrementMultipleChains() public { - deploySetup(); + deploySetup(); deployCounterApp(arbChainSlug); deployCounterApp(optChainSlug); - (address arbCounter, address arbCounterForwarder) = getOnChainAndForwarderAddresses( arbChainSlug, counterId, @@ -154,7 +153,7 @@ contract CounterTest is DeliveryHelperTest { ); counterGateway.readCounters(instances); - + bidAndEndAuction(bridgeAsyncId); finalizeQuery(payloadIds[0], abi.encode(Counter(arbCounter).counter())); finalizeQuery(payloadIds[1], abi.encode(Counter(optCounter).counter())); diff --git a/test/apps/SuperTokenLockable.t.sol b/test/apps/SuperTokenLockable.t.sol index ba755c09..95e6bebe 100644 --- a/test/apps/SuperTokenLockable.t.sol +++ b/test/apps/SuperTokenLockable.t.sol @@ -298,7 +298,6 @@ contract SuperTokenLockableTest is DeliveryHelperTest { ); payloadIdCounter++; - bytes memory encodedOrder = abi.encode(userOrder); appContracts.superTokenLockableApp.bridge(encodedOrder); bidAndEndAuction(bridgeAsyncId); @@ -358,7 +357,6 @@ contract SuperTokenLockableTest is DeliveryHelperTest { payloadIdCounter++ ); - // bidAndEndAuction(cancelAsyncId); // finalizeAndExecute( // cancelPayloadIds[0], From e29e6660f000850956164e539c51aa88eb380d72 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Thu, 20 Feb 2025 18:40:12 +0400 Subject: [PATCH 091/186] fix: remove duplicate errors --- Errors.md | 6 ------ contracts/protocol/payload-delivery/FeesPlug.sol | 2 +- contracts/protocol/utils/RescueFundsLib.sol | 9 ++------- contracts/protocol/utils/common/Errors.sol | 1 + 4 files changed, 4 insertions(+), 14 deletions(-) diff --git a/Errors.md b/Errors.md index ef2dbef4..506cf6d3 100644 --- a/Errors.md +++ b/Errors.md @@ -112,12 +112,6 @@ | `ECDSAInvalidSignatureLength(uint256)` | `0xfce698f7` | | `ECDSAInvalidSignatureS(bytes32)` | `0xd78bce0c` | -## libraries/RescueFundsLib.sol - -| Error | Signature | -| ----------------------- | ------------ | -| `InvalidTokenAddress()` | `0x1eb00b06` | - ## mock/MockSocket.sol | Error | Signature | diff --git a/contracts/protocol/payload-delivery/FeesPlug.sol b/contracts/protocol/payload-delivery/FeesPlug.sol index 35394d27..a6a1afdf 100644 --- a/contracts/protocol/payload-delivery/FeesPlug.sol +++ b/contracts/protocol/payload-delivery/FeesPlug.sol @@ -7,6 +7,7 @@ import "../utils/AccessControl.sol"; import {RESCUE_ROLE} from "../utils/common/AccessRoles.sol"; import "../utils/RescueFundsLib.sol"; import {ETH_ADDRESS} from "../utils/common/Constants.sol"; +import {InvalidTokenAddress} from "../utils/common/Errors.sol"; /// @title FeesManager /// @notice Abstract contract for managing fees @@ -21,7 +22,6 @@ contract FeesPlug is PlugBase, AccessControl { error InsufficientTokenBalance(address token_); /// @notice Error thrown when deposit amount does not match msg.value error InvalidDepositAmount(); - error InvalidTokenAddress(); error TokenNotWhitelisted(address token_); /// @notice Event emitted when fees are deposited diff --git a/contracts/protocol/utils/RescueFundsLib.sol b/contracts/protocol/utils/RescueFundsLib.sol index a2355bc6..a6319036 100644 --- a/contracts/protocol/utils/RescueFundsLib.sol +++ b/contracts/protocol/utils/RescueFundsLib.sol @@ -3,8 +3,8 @@ pragma solidity ^0.8.21; import "solmate/utils/SafeTransferLib.sol"; import "solmate/tokens/ERC20.sol"; -import {ZeroAddress} from "../utils/common/Errors.sol"; -import {ETH_ADDRESS} from "../utils/common/Constants.sol"; +import {ZeroAddress, InvalidTokenAddress} from "./common/Errors.sol"; +import {ETH_ADDRESS} from "./common/Constants.sol"; /** * @title RescueFundsLib @@ -12,11 +12,6 @@ import {ETH_ADDRESS} from "../utils/common/Constants.sol"; */ library RescueFundsLib { - /** - * @dev thrown when the given token address don't have any code - */ - error InvalidTokenAddress(); - /** * @dev Rescues funds from a contract. * @param token_ The address of the token contract. diff --git a/contracts/protocol/utils/common/Errors.sol b/contracts/protocol/utils/common/Errors.sol index 6f27694d..1ab0cde6 100644 --- a/contracts/protocol/utils/common/Errors.sol +++ b/contracts/protocol/utils/common/Errors.sol @@ -28,3 +28,4 @@ error InvalidPromise(); error InvalidIndex(); error InvalidTransmitter(); error FeesNotSet(); +error InvalidTokenAddress(); \ No newline at end of file From 9609ea2c250c6736d0945e561d78528e70e4281e Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Thu, 20 Feb 2025 18:41:03 +0400 Subject: [PATCH 092/186] feat: bid timeout setter --- .../payload-delivery/app-gateway/DeliveryHelper.sol | 3 +-- .../payload-delivery/app-gateway/QueueAsync.sol | 13 +++++++++++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/contracts/protocol/payload-delivery/app-gateway/DeliveryHelper.sol b/contracts/protocol/payload-delivery/app-gateway/DeliveryHelper.sol index 8fa83874..38a68ae0 100644 --- a/contracts/protocol/payload-delivery/app-gateway/DeliveryHelper.sol +++ b/contracts/protocol/payload-delivery/app-gateway/DeliveryHelper.sol @@ -1,7 +1,6 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -import {Ownable} from "solady/auth/Ownable.sol"; import "solady/utils/Initializable.sol"; import {IAppGateway} from "../../../interfaces/IAppGateway.sol"; @@ -10,7 +9,7 @@ import {DISTRIBUTE_FEE, DEPLOY} from "../../../protocol/utils/common/Constants.s import {PromisesNotResolved, InvalidTransmitter} from "../../../protocol/utils/common/Errors.sol"; import "./BatchAsync.sol"; -contract DeliveryHelper is BatchAsync, Ownable, Initializable { +contract DeliveryHelper is BatchAsync, Initializable { event CallBackReverted(bytes32 asyncId_, bytes32 payloadId_); uint64 public version; diff --git a/contracts/protocol/payload-delivery/app-gateway/QueueAsync.sol b/contracts/protocol/payload-delivery/app-gateway/QueueAsync.sol index 8cf41850..85f13c65 100644 --- a/contracts/protocol/payload-delivery/app-gateway/QueueAsync.sol +++ b/contracts/protocol/payload-delivery/app-gateway/QueueAsync.sol @@ -10,9 +10,10 @@ import {IAppDeployer} from "../../../interfaces/IAppDeployer.sol"; import {IAddressResolver} from "../../../interfaces/IAddressResolver.sol"; import {IContractFactoryPlug} from "../../../interfaces/IContractFactoryPlug.sol"; import {IDeliveryHelper} from "../../../interfaces/IDeliveryHelper.sol"; +import {Ownable} from "solady/auth/Ownable.sol"; /// @notice Abstract contract for managing asynchronous payloads -abstract contract QueueAsync is AddressResolverUtil, IDeliveryHelper { +abstract contract QueueAsync is AddressResolverUtil, IDeliveryHelper, Ownable { uint256 public saltCounter; uint256 public asyncCounter; @@ -30,7 +31,8 @@ abstract contract QueueAsync is AddressResolverUtil, IDeliveryHelper { // asyncId => PayloadBatch mapping(bytes32 => PayloadBatch) internal _payloadBatches; - event PayloadBatchCancelled(bytes32 asyncId_); + event PayloadBatchCancelled(bytes32 asyncId); + event BidTimeoutUpdated(uint256 newBidTimeout); function payloadBatches(bytes32 asyncId_) external view override returns (PayloadBatch memory) { return _payloadBatches[asyncId_]; @@ -160,6 +162,13 @@ abstract contract QueueAsync is AddressResolverUtil, IDeliveryHelper { }); } + /// @notice Updates the bid timeout + /// @param newBidTimeout_ The new bid timeout value + function updateBidTimeout(uint256 newBidTimeout_) external onlyOwner { + bidTimeout = newBidTimeout_; + emit BidTimeoutUpdated(newBidTimeout_); + } + function getPayloadIndexDetails( bytes32 asyncId_, uint256 index_ From 17c2743be67e3f81495b0f6b60b3647f033c8580 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Thu, 20 Feb 2025 18:43:13 +0400 Subject: [PATCH 093/186] fix: connect socket in plugs --- .../protocol/payload-delivery/ContractFactoryPlug.sol | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/contracts/protocol/payload-delivery/ContractFactoryPlug.sol b/contracts/protocol/payload-delivery/ContractFactoryPlug.sol index 2c23b49e..6e137162 100644 --- a/contracts/protocol/payload-delivery/ContractFactoryPlug.sol +++ b/contracts/protocol/payload-delivery/ContractFactoryPlug.sol @@ -7,6 +7,7 @@ import "../utils/RescueFundsLib.sol"; import {NotSocket} from "../utils/common/Errors.sol"; import "../../base/PlugBase.sol"; import "../../interfaces/IContractFactoryPlug.sol"; + /// @title ContractFactory /// @notice Abstract contract for deploying contracts contract ContractFactoryPlug is PlugBase, AccessControl, IContractFactoryPlug { @@ -78,6 +79,14 @@ contract ContractFactoryPlug is PlugBase, AccessControl, IContractFactoryPlug { return address(uint160(uint256(hash))); } + function connectSocket( + address appGateway_, + address socket_, + address switchboard_ + ) external onlyOwner { + _connectSocket(appGateway_, socket_, switchboard_); + } + /** * @notice Rescues funds from the contract if they are locked by mistake. This contract does not * theoretically need this function but it is added for safety. From 586990e806d8cf34f361d6626487150106c1ac15 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Thu, 20 Feb 2025 19:49:39 +0400 Subject: [PATCH 094/186] fix: remove version --- contracts/protocol/Forwarder.sol | 1 - .../protocol/payload-delivery/app-gateway/AuctionManager.sol | 2 -- .../protocol/payload-delivery/app-gateway/FeesManager.sol | 4 ---- contracts/protocol/watcherPrecompile/WatcherPrecompile.sol | 3 --- 4 files changed, 10 deletions(-) diff --git a/contracts/protocol/Forwarder.sol b/contracts/protocol/Forwarder.sol index f208a949..7e01c67c 100644 --- a/contracts/protocol/Forwarder.sol +++ b/contracts/protocol/Forwarder.sol @@ -23,7 +23,6 @@ contract Forwarder is IForwarder, Initializable { /// @notice caches the latest async promise address for the last call address public latestAsyncPromise; - uint64 public version; constructor() { _disableInitializers(); // disable for implementation diff --git a/contracts/protocol/payload-delivery/app-gateway/AuctionManager.sol b/contracts/protocol/payload-delivery/app-gateway/AuctionManager.sol index 29528779..f8fa19ac 100644 --- a/contracts/protocol/payload-delivery/app-gateway/AuctionManager.sol +++ b/contracts/protocol/payload-delivery/app-gateway/AuctionManager.sol @@ -20,7 +20,6 @@ contract AuctionManager is AddressResolverUtil, Ownable, IAuctionManager, Initia mapping(bytes32 => bool) public override auctionStarted; uint256 public auctionEndDelaySeconds; - uint64 public version; /// @notice Error thrown when trying to start or bid a closed auction error AuctionClosed(); @@ -52,7 +51,6 @@ contract AuctionManager is AddressResolverUtil, Ownable, IAuctionManager, Initia ) public reinitializer(1) { _setAddressResolver(addressResolver_); _initializeOwner(owner_); - version = 1; vmChainSlug = vmChainSlug_; auctionEndDelaySeconds = auctionEndDelaySeconds_; } diff --git a/contracts/protocol/payload-delivery/app-gateway/FeesManager.sol b/contracts/protocol/payload-delivery/app-gateway/FeesManager.sol index ef9ba401..d5542903 100644 --- a/contracts/protocol/payload-delivery/app-gateway/FeesManager.sol +++ b/contracts/protocol/payload-delivery/app-gateway/FeesManager.sol @@ -15,8 +15,6 @@ import {IFeesManager} from "../../../interfaces/IFeesManager.sol"; /// @notice Contract for managing fees contract FeesManager is IFeesManager, AddressResolverUtil, Ownable, Initializable { uint256 public feesCounter; - mapping(uint32 => uint256) public feeCollectionGasLimit; - uint64 public version; /// @notice Struct containing fee amounts and status struct TokenBalance { @@ -101,7 +99,6 @@ contract FeesManager is IFeesManager, AddressResolverUtil, Ownable, Initializabl /// @param addressResolver_ The address of the address resolver /// @param owner_ The address of the owner function initialize(address addressResolver_, address owner_) public reinitializer(1) { - version = 1; _setAddressResolver(addressResolver_); _initializeOwner(owner_); } @@ -174,7 +171,6 @@ contract FeesManager is IFeesManager, AddressResolverUtil, Ownable, Initializabl fees_.feePoolToken ]; tokenBalance.blocked += winningBid_.fee; - asyncIdBlockedFees[asyncId_] = fees_; emit FeesBlocked(asyncId_, fees_.feePoolChain, fees_.feePoolToken, winningBid_.fee); } diff --git a/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol b/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol index 428bbc16..eefcb8ec 100644 --- a/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol +++ b/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol @@ -36,8 +36,6 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { /// @dev callId => bool mapping(bytes32 => bool) public appGatewayCalled; - uint64 public version; - /// @notice Error thrown when an invalid chain slug is provided error InvalidChainSlug(); /// @notice Error thrown when an invalid app gateway reaches a plug @@ -110,7 +108,6 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { ) public reinitializer(1) { _setAddressResolver(addressResolver_); _initializeOwner(owner_); - version = 1; maxTimeoutDelayInSeconds = 24 * 60 * 60; // 24 hours expiryTime = expiryTime_; From 5b0efb9a7df7ba73e2fd7a75c7fdf56a1d787120 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Thu, 20 Feb 2025 20:32:46 +0400 Subject: [PATCH 095/186] fix: fees assignment --- .../app-gateway/DeliveryHelper.sol | 8 ---- .../app-gateway/FeesManager.sol | 48 ++++++++++++------- .../watcherPrecompile/WatcherPrecompile.sol | 2 - test/apps/ParallelCounter.t.sol | 2 - 4 files changed, 30 insertions(+), 30 deletions(-) diff --git a/contracts/protocol/payload-delivery/app-gateway/DeliveryHelper.sol b/contracts/protocol/payload-delivery/app-gateway/DeliveryHelper.sol index 38a68ae0..834520e5 100644 --- a/contracts/protocol/payload-delivery/app-gateway/DeliveryHelper.sol +++ b/contracts/protocol/payload-delivery/app-gateway/DeliveryHelper.sol @@ -42,14 +42,6 @@ contract DeliveryHelper is BatchAsync, Initializable { bool isRestarted = _payloadBatches[asyncId_].winningBid.transmitter != address(0); _payloadBatches[asyncId_].winningBid = winningBid_; - // update fees - // todo: revisit - IFeesManager(addressResolver__.feesManager()).updateTransmitterFees( - winningBid_, - asyncId_, - _payloadBatches[asyncId_].appGateway - ); - if (!isRestarted) return _process(asyncId_, false); // Refinalize all payloads in the batch if a new transmitter is assigned diff --git a/contracts/protocol/payload-delivery/app-gateway/FeesManager.sol b/contracts/protocol/payload-delivery/app-gateway/FeesManager.sol index d5542903..2c5269e2 100644 --- a/contracts/protocol/payload-delivery/app-gateway/FeesManager.sol +++ b/contracts/protocol/payload-delivery/app-gateway/FeesManager.sol @@ -148,12 +148,12 @@ contract FeesManager is IFeesManager, AddressResolverUtil, Ownable, Initializabl /// @notice Blocks fees for transmitter /// @param appGateway_ The app gateway address - /// @param fees_ The fees data struct + /// @param feesGivenByApp_ The fees data struct given by the app gateway /// @param asyncId_ The batch identifier /// @dev Only callable by delivery helper function blockFees( address appGateway_, - Fees memory fees_, + Fees memory feesGivenByApp_, Bid memory winningBid_, bytes32 asyncId_ ) external { @@ -161,25 +161,44 @@ contract FeesManager is IFeesManager, AddressResolverUtil, Ownable, Initializabl address appGateway = _getCoreAppGateway(appGateway_); // Block fees uint256 availableFees = getAvailableFees( - fees_.feePoolChain, + feesGivenByApp_.feePoolChain, appGateway, - fees_.feePoolToken + feesGivenByApp_.feePoolToken ); + + if (asyncIdBlockedFees[asyncId_].amount > 0) + availableFees += asyncIdBlockedFees[asyncId_].amount; + if (availableFees < winningBid_.fee) revert InsufficientFeesAvailable(); + TokenBalance storage tokenBalance = appGatewayFeeBalances[appGateway][ + feesGivenByApp_.feePoolChain + ][feesGivenByApp_.feePoolToken]; + + tokenBalance.blocked = + tokenBalance.blocked + + winningBid_.fee - + asyncIdBlockedFees[asyncId_].amount; + + asyncIdBlockedFees[asyncId_] = Fees({ + feePoolChain: feesGivenByApp_.feePoolChain, + feePoolToken: feesGivenByApp_.feePoolToken, + amount: winningBid_.fee + }); - TokenBalance storage tokenBalance = appGatewayFeeBalances[appGateway][fees_.feePoolChain][ - fees_.feePoolToken - ]; - tokenBalance.blocked += winningBid_.fee; - asyncIdBlockedFees[asyncId_] = fees_; - emit FeesBlocked(asyncId_, fees_.feePoolChain, fees_.feePoolToken, winningBid_.fee); + emit FeesBlocked( + asyncId_, + feesGivenByApp_.feePoolChain, + feesGivenByApp_.feePoolToken, + winningBid_.fee + ); } + // todo: revisit function updateTransmitterFees( Bid memory winningBid_, bytes32 asyncId_, address appGateway_ - ) external onlyDeliveryHelper { + ) external onlyWatcherPrecompile { address appGateway = _getCoreAppGateway(appGateway_); Fees storage fees = asyncIdBlockedFees[asyncId_]; @@ -187,13 +206,6 @@ contract FeesManager is IFeesManager, AddressResolverUtil, Ownable, Initializabl fees.feePoolToken ]; - // if no transmitter assigned after auction, unblock fees - if (winningBid_.transmitter == address(0)) { - tokenBalance.blocked -= fees.amount; - delete asyncIdBlockedFees[asyncId_]; - return; - } - // update new amount fees.amount = winningBid_.fee; tokenBalance.blocked = tokenBalance.blocked - fees.amount + winningBid_.fee; diff --git a/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol b/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol index eefcb8ec..ad8c68ef 100644 --- a/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol +++ b/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol @@ -424,8 +424,6 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { uint32 chainSlug_, address switchboardOrWatcher_ ) internal returns (bytes32) { - console.log("chainSlug_", chainSlug_); - console.log("payloadCounter", payloadCounter); // Encode payload ID by bit-shifting and combining: // chainSlug (32 bits) | switchboard or watcher precompile address (160 bits) | counter (64 bits) return diff --git a/test/apps/ParallelCounter.t.sol b/test/apps/ParallelCounter.t.sol index 8a41a132..7460cfc7 100644 --- a/test/apps/ParallelCounter.t.sol +++ b/test/apps/ParallelCounter.t.sol @@ -77,8 +77,6 @@ contract ParallelCounterTest is DeliveryHelperTest { parallelCounterDeployer ); - console.log("forwarderArb1", forwarderArb1); - assertEq( IForwarder(forwarderArb1).getChainSlug(), arbChainSlug, From 94e6e6fa6a5104e2613ef7a0ce0fe7fa6843ba6e Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Thu, 20 Feb 2025 20:47:38 +0400 Subject: [PATCH 096/186] fix: todos --- contracts/interfaces/IFeesManager.sol | 9 +--- .../app-gateway/AuctionManager.sol | 2 +- .../app-gateway/DeliveryHelper.sol | 4 +- .../app-gateway/FeesManager.sol | 51 ++----------------- 4 files changed, 8 insertions(+), 58 deletions(-) diff --git a/contracts/interfaces/IFeesManager.sol b/contracts/interfaces/IFeesManager.sol index 0ef610bb..906e9ea5 100644 --- a/contracts/interfaces/IFeesManager.sol +++ b/contracts/interfaces/IFeesManager.sol @@ -11,17 +11,10 @@ interface IFeesManager { bytes32 asyncId_ ) external; - function updateTransmitterFees( - Bid memory winningBid_, - bytes32 asyncId_, - address appGateway_ - ) external; - - function updateBlockedFees(bytes32 asyncId_, uint256 feesUsed_) external; - function unblockFees(bytes32 asyncId_, address appGateway_) external; function isFeesEnough(address appGateway_, Fees memory fees_) external view returns (bool); + function unblockAndAssignFees( bytes32 asyncId_, address transmitter_, diff --git a/contracts/protocol/payload-delivery/app-gateway/AuctionManager.sol b/contracts/protocol/payload-delivery/app-gateway/AuctionManager.sol index f8fa19ac..59bad963 100644 --- a/contracts/protocol/payload-delivery/app-gateway/AuctionManager.sol +++ b/contracts/protocol/payload-delivery/app-gateway/AuctionManager.sol @@ -152,8 +152,8 @@ contract AuctionManager is AddressResolverUtil, Ownable, IAuctionManager, Initia function expireBid(bytes32 asyncId_) external onlyWatcherPrecompile { PayloadBatch memory batch = IDeliveryHelper(addressResolver__.deliveryHelper()) .payloadBatches(asyncId_); + // if executed, bid is not expired - // todo: should be less than total payloads in batch or zero? if (batch.totalPayloadsRemaining == 0 || batch.isBatchCancelled) return; IFeesManager(addressResolver__.feesManager()).unblockFees(asyncId_, batch.appGateway); diff --git a/contracts/protocol/payload-delivery/app-gateway/DeliveryHelper.sol b/contracts/protocol/payload-delivery/app-gateway/DeliveryHelper.sol index 834520e5..650d622f 100644 --- a/contracts/protocol/payload-delivery/app-gateway/DeliveryHelper.sol +++ b/contracts/protocol/payload-delivery/app-gateway/DeliveryHelper.sol @@ -110,10 +110,8 @@ contract DeliveryHelper is BatchAsync, Initializable { PayloadDetails[] storage payloads = payloadBatchDetails[asyncId_]; // Check for empty payloads or index out of bounds - // todo: should revert if (payloads.length == 0 || currentIndex >= payloads.length) { - _finishBatch(asyncId_, payloadBatch_); - return; + revert InvalidIndex(); } // Deploy single promise for the next batch of operations diff --git a/contracts/protocol/payload-delivery/app-gateway/FeesManager.sol b/contracts/protocol/payload-delivery/app-gateway/FeesManager.sol index 2c5269e2..50fbea34 100644 --- a/contracts/protocol/payload-delivery/app-gateway/FeesManager.sol +++ b/contracts/protocol/payload-delivery/app-gateway/FeesManager.sol @@ -11,6 +11,8 @@ import {FORWARD_CALL, DISTRIBUTE_FEE, DEPLOY, WITHDRAW} from "../../../protocol/ import {IFeesPlug} from "../../../interfaces/IFeesPlug.sol"; import {IFeesManager} from "../../../interfaces/IFeesManager.sol"; +import {NotAuctionManager} from "../../../protocol/utils/common/Errors.sol"; + /// @title FeesManager /// @notice Contract for managing fees contract FeesManager is IFeesManager, AddressResolverUtil, Ownable, Initializable { @@ -157,7 +159,9 @@ contract FeesManager is IFeesManager, AddressResolverUtil, Ownable, Initializabl Bid memory winningBid_, bytes32 asyncId_ ) external { - // todo: only auction manager can call this + if (msg.sender != deliveryHelper().getAsyncBatchDetails(asyncId_).auctionManager) + revert NotAuctionManager(); + address appGateway = _getCoreAppGateway(appGateway_); // Block fees uint256 availableFees = getAvailableFees( @@ -193,26 +197,6 @@ contract FeesManager is IFeesManager, AddressResolverUtil, Ownable, Initializabl ); } - // todo: revisit - function updateTransmitterFees( - Bid memory winningBid_, - bytes32 asyncId_, - address appGateway_ - ) external onlyWatcherPrecompile { - address appGateway = _getCoreAppGateway(appGateway_); - - Fees storage fees = asyncIdBlockedFees[asyncId_]; - TokenBalance storage tokenBalance = appGatewayFeeBalances[appGateway][fees.feePoolChain][ - fees.feePoolToken - ]; - - // update new amount - fees.amount = winningBid_.fee; - tokenBalance.blocked = tokenBalance.blocked - fees.amount + winningBid_.fee; - - emit TransmitterFeesUpdated(asyncId_, winningBid_.transmitter, winningBid_.fee); - } - /// @notice Unblocks fees after successful execution and assigns them to the transmitter /// @param asyncId_ The async ID of the executed batch /// @param transmitter_ The address of the transmitter who executed the batch @@ -283,8 +267,6 @@ contract FeesManager is IFeesManager, AddressResolverUtil, Ownable, Initializabl // Create payload for plug contract payloadDetails = _createPayloadDetails(CallType.WRITE, chainSlug_, payload); - - // todo: revisit FinalizeParams memory finalizeParams = FinalizeParams({ payloadDetails: payloadDetails, asyncId: bytes32(0), @@ -313,29 +295,6 @@ contract FeesManager is IFeesManager, AddressResolverUtil, Ownable, Initializabl }); } - /// @notice Updates blocked fees in case of failed execution - /// @param asyncId_ The batch identifier - /// @dev Only callable by delivery helper - function updateBlockedFees(bytes32 asyncId_, uint256 feesUsed_) external onlyOwner { - PayloadBatch memory batch = IDeliveryHelper(deliveryHelper()).getAsyncBatchDetails( - asyncId_ - ); - - Fees storage fees = asyncIdBlockedFees[asyncId_]; - TokenBalance storage tokenBalance = appGatewayFeeBalances[batch.appGateway][ - batch.fees.feePoolChain - ][batch.fees.feePoolToken]; - - // todo how to settle fees here? - // Unblock unused fees - uint256 unusedFees = fees.amount - feesUsed_; - tokenBalance.blocked -= unusedFees; - - // Update fees with actual fees used - fees.amount = feesUsed_; - asyncIdBlockedFees[asyncId_] = fees; - } - /// @notice Withdraws funds to a specified receiver /// @dev This function is used to withdraw fees from the fees plug /// @param appGateway_ The address of the app gateway From 8960ce1eb76cd137c53a9730a0fe07b148897d32 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Thu, 20 Feb 2025 21:03:46 +0400 Subject: [PATCH 097/186] fix: fees test --- contracts/protocol/watcherPrecompile/WatcherPrecompile.sol | 2 +- test/FeesTest.t.sol | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol b/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol index ad8c68ef..cf3d0b73 100644 --- a/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol +++ b/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol @@ -6,7 +6,6 @@ import "../../interfaces/IAppGateway.sol"; import "../../interfaces/IPromise.sol"; import "../../interfaces/IFeesManager.sol"; import "solady/utils/Initializable.sol"; -import "forge-std/console.sol"; import {PayloadRootParams, AsyncRequest, FinalizeParams, TimeoutRequest, CallFromInboxParams} from "../utils/common/Structs.sol"; import {TimeoutDelayTooLarge, TimeoutAlreadyResolved, InvalidInboxCaller, ResolvingTimeoutTooEarly, CallFailed, AppGatewayAlreadyCalled} from "../utils/common/Errors.sol"; @@ -314,6 +313,7 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { // Resolve each promise with its corresponding return data bool success; for (uint256 j = 0; j < next.length; j++) { + if (next[j] == address(0)) continue; success = IPromise(next[j]).markResolved( asyncRequest_.asyncId, resolvedPromises_[i].payloadId, diff --git a/test/FeesTest.t.sol b/test/FeesTest.t.sol index e6e66854..67d053a0 100644 --- a/test/FeesTest.t.sol +++ b/test/FeesTest.t.sol @@ -92,6 +92,7 @@ contract FeesTest is DeliveryHelperTest { uint256 receiverBalanceBefore = receiver.balance; uint256 withdrawAmount = 0.5 ether; + counterGateway.withdrawFeeTokens(feesChainSlug, ETH_ADDRESS, withdrawAmount, receiver); asyncId = getCurrentAsyncId(); @@ -101,7 +102,9 @@ contract FeesTest is DeliveryHelperTest { 1 ); bidAndEndAuction(asyncId); - finalizeAndExecute(payloadIds[0]); + + PayloadDetails memory payloadDetails = deliveryHelper.getPayloadDetails(payloadIds[0]); + finalizeAndRelay(payloadIds[0], payloadDetails); assertEq( depositAmount - withdrawAmount, address(feesConfig.feesPlug).balance, From 39c17515914bba7a2681c512962a5b2f100ccb25 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Thu, 20 Feb 2025 21:14:34 +0400 Subject: [PATCH 098/186] fix: build --- script/CheckDepositedFees.s.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/script/CheckDepositedFees.s.sol b/script/CheckDepositedFees.s.sol index 8684a3e4..70934724 100644 --- a/script/CheckDepositedFees.s.sol +++ b/script/CheckDepositedFees.s.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.0; import {Script} from "forge-std/Script.sol"; -import {console} from "forge-std/Console.sol"; +import {console} from "forge-std/console.sol"; import {FeesManager} from "../contracts/protocol/payload-delivery/app-gateway/FeesManager.sol"; import {Fees} from "../contracts/protocol/utils/common/Structs.sol"; import {ETH_ADDRESS} from "../contracts/protocol/utils/common/Constants.sol"; From 68b6ee58da18f78c3750ba4854f32787175f20eb Mon Sep 17 00:00:00 2001 From: Akash Date: Thu, 20 Feb 2025 21:29:35 +0400 Subject: [PATCH 099/186] fix: deployment scripts --- deployments/dev_addresses.json | 24 +-- deployments/dev_addresses_composer.json | 32 ++++ deployments/dev_addresses_geth.json | 38 ---- hardhat-scripts/deploy/1.deploy.ts | 229 ++++++++++++------------ hardhat-scripts/deploy/2.roles.ts | 19 +- hardhat-scripts/deploy/4.connect.ts | 9 +- hardhat-scripts/deploy/6.setupEnv.ts | 12 +- hardhat-scripts/utils/deployUtils.ts | 2 +- package.json | 2 +- 9 files changed, 184 insertions(+), 183 deletions(-) create mode 100644 deployments/dev_addresses_composer.json delete mode 100644 deployments/dev_addresses_geth.json diff --git a/deployments/dev_addresses.json b/deployments/dev_addresses.json index 8e2f78f9..ae35be28 100644 --- a/deployments/dev_addresses.json +++ b/deployments/dev_addresses.json @@ -8,18 +8,18 @@ "startBlock": 125604419 }, "7625382": { - "AddressResolver": "0x5d16F235471531521ec23e1c75F26F55b15f51F1", - "AddressResolverImpl": "0x3d981a431c38B9b781178279AecFb91509BDa645", - "AuctionManager": "0x7DC27a33f99252FaF2388416620E3178597cfBdC", - "AuctionManagerImpl": "0x48228f8ebdCA92B7F7fdC9C545372123f5Bcc4C4", - "DeliveryHelper": "0xC415FA4baE9183a2439FA0a06dd558bb4FCc0051", - "DeliveryHelperImpl": "0xc67BEa5A43cb0D908866F3577D1f967f901Dbc75", - "ERC1967Factory": "0xC36e58c0c505435179417a318333e4a7C1867247", - "FeesManager": "0x7B03A532aCea55bc06aB39b844797dD5d82Af012", - "FeesManagerImpl": "0xaF369f1fc1523dc8086c2ACDD7e7A73aA8732FE6", - "startBlock": 5534, - "WatcherPrecompile": "0x71B25Fc5f47E786574aFca919Ca61611168d94D0", - "WatcherPrecompileImpl": "0xCF9728Dc37da5c5B08780F818B6fB65c64d6a402" + "AddressResolver": "0xE0692012B818cdc72972CbF3A2dCbf5299FFa2bA", + "AddressResolverImpl": "0x764F5812F89584c053652B6Bcec62050F649ABf3", + "AuctionManager": "0x977036A2B56cE7Bc87161614802fE381629A5298", + "AuctionManagerImpl": "0x484fDd713323bD8cfb944620c20986A7AEBa4880", + "DeliveryHelper": "0x0e89e59C9FB5e440F07a8A67D8bBC53Ec07e92C0", + "DeliveryHelperImpl": "0x635E9fEac9fe3Ff19c41974B3a457D52F9521b9B", + "ERC1967Factory": "0x794b92C2Ade7D33Fb34d138B13014C63aB27CBC0", + "FeesManager": "0xBC83ad0Df55a3B52B93D3f16d466283902b31BEB", + "FeesManagerImpl": "0xD83B7753212efe1c81CE42F642661701eAeDA80A", + "startBlock": 138, + "WatcherPrecompile": "0x0245a1Aece4bfd16bc85d08B4aFfa5e63CDE8908", + "WatcherPrecompileImpl": "0xaf76e485B26C5c5964b403CA2C5c1a9D6Cd8022F" }, "11155420": { "ContractFactoryPlug": "0x43942f05D5b44DC6Ca19b316dF54BE87FcF9D583", diff --git a/deployments/dev_addresses_composer.json b/deployments/dev_addresses_composer.json new file mode 100644 index 00000000..8e2f78f9 --- /dev/null +++ b/deployments/dev_addresses_composer.json @@ -0,0 +1,32 @@ +{ + "421614": { + "ContractFactoryPlug": "0x38cAf1D477F806Fae8aed84ecD68E00eF6c2cB0c", + "FastSwitchboard": "0xB16475054Dc6D8bfbd80daE964bbE416a4B7a791", + "FeesPlug": "0x228AA70a66498FC75524371cDAfB31958Ca5F12D", + "Socket": "0x963eC83119862cD518826DA9177B348cFdfebaA4", + "SocketBatcher": "0x2db8cb4f841aa944869ECD5002e8153642A30971", + "startBlock": 125604419 + }, + "7625382": { + "AddressResolver": "0x5d16F235471531521ec23e1c75F26F55b15f51F1", + "AddressResolverImpl": "0x3d981a431c38B9b781178279AecFb91509BDa645", + "AuctionManager": "0x7DC27a33f99252FaF2388416620E3178597cfBdC", + "AuctionManagerImpl": "0x48228f8ebdCA92B7F7fdC9C545372123f5Bcc4C4", + "DeliveryHelper": "0xC415FA4baE9183a2439FA0a06dd558bb4FCc0051", + "DeliveryHelperImpl": "0xc67BEa5A43cb0D908866F3577D1f967f901Dbc75", + "ERC1967Factory": "0xC36e58c0c505435179417a318333e4a7C1867247", + "FeesManager": "0x7B03A532aCea55bc06aB39b844797dD5d82Af012", + "FeesManagerImpl": "0xaF369f1fc1523dc8086c2ACDD7e7A73aA8732FE6", + "startBlock": 5534, + "WatcherPrecompile": "0x71B25Fc5f47E786574aFca919Ca61611168d94D0", + "WatcherPrecompileImpl": "0xCF9728Dc37da5c5B08780F818B6fB65c64d6a402" + }, + "11155420": { + "ContractFactoryPlug": "0x43942f05D5b44DC6Ca19b316dF54BE87FcF9D583", + "FastSwitchboard": "0xA448B8CD7325AA38d4E533cE209471B7ce01901F", + "FeesPlug": "0x17b3c7c5552fA4e730888558A8912cFD7A8b042e", + "Socket": "0xaF57894A5244711a7bEBE582E9e121980f1aa95e", + "SocketBatcher": "0x977e2f721f8958b2F776d2dc693D04A1256ed426", + "startBlock": 24127420 + } +} diff --git a/deployments/dev_addresses_geth.json b/deployments/dev_addresses_geth.json deleted file mode 100644 index 9498b9b1..00000000 --- a/deployments/dev_addresses_geth.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "421614": { - "ContractFactoryPlug": "0x1dc20d27F06876cA74ee4e2E9a4724f06a4a5E54", - "FastSwitchboard": "0xaFFfaD81e6DDE509Bd83Ab2024225b2FF537BeA7", - "FeesPlug": "0xb2B779ab8FC851bCE986d25B2824933B0Cd101d9", - "Hasher": "0x49f24A72e738Fe86263Aa26696370972e049498B", - "SignatureVerifier": "0xb6d39d1dB2cB14043182a008EfFC079A9C578208", - "Socket": "0x9B06e2Dae351ed8B1112C036e5c306E8fBe4C9c5", - "SocketBatcher": "0xd627BFe7d2fCAC1147c996a6F2CAaB2E1e1bD344", - "startBlock": 124035386 - }, - "7625382": { - "AddressResolver": "0x1287D33646d763Ff8237Aa7BE7d92Fc918c66589", - "AddressResolverImpl": "0x8662FC08dEC7c61Dd3432fAF45a5bC024BB60B00", - "AuctionManager": "0xE3806Bc41FEAFCAA2480E702fF02dA14F767bF0F", - "AuctionManagerImpl": "0x4C68058509d754Cc0dE474eBC20aE94e4787E704", - "DeliveryHelper": "0x4D8Fb6e8a5294ed0644f462b5723ee228ecf9958", - "DeliveryHelperImpl": "0x3c9f5172feb0dDfC06176cE67B566EFbb01CCe98", - "ERC1967Factory": "0xbBfb525ADc6eC38Ef0D4b807d327c2Dd1C286de1", - "FeesManager": "0x886682a69D6c0240EB850cc2e42c5B4B74449e82", - "FeesManagerImpl": "0xF4D3BDe438416938217d4624c82AEbEb46CeD371", - "SignatureVerifier": "0x366Dea9AC69fb9D45b6756587D2fE9B4c14197F6", - "SignatureVerifierImpl": "0x3cf47Ad0F040dFF1208E649C8f8e23e6B5A08916", - "startBlock": 18, - "WatcherPrecompile": "0xaCf94Cd4A7e70304F5CA6294CDAe3CBe78Ea6A86", - "WatcherPrecompileImpl": "0x8F18fC10a8b40b548C6F04Fb252481c783A9ace0" - }, - "11155420": { - "ContractFactoryPlug": "0x0EE19F0D0e34Cdd2eb4F61E24DC837b0b7c34e69", - "FastSwitchboard": "0x70bfB36F8b8de7763F1D52d954225ae88F6Ed595", - "FeesPlug": "0x7F5D263572469Fdf1875Cd858D557B45e9FC7f23", - "Hasher": "0xe37D675646A6FEEC3E41A0FF9535E0E716f5cD89", - "SignatureVerifier": "0x0452225B52Ef6134499232CbBEDF05fD8cc38530", - "Socket": "0x0BAAD473580c9F7Ca8b2758759aF3ce5E3154bC6", - "SocketBatcher": "0xCf731f35EFd775F692fe24e650e75Fd64bBaD810", - "startBlock": 23911773 - } -} diff --git a/hardhat-scripts/deploy/1.deploy.ts b/hardhat-scripts/deploy/1.deploy.ts index a3c1cdcf..c7978337 100644 --- a/hardhat-scripts/deploy/1.deploy.ts +++ b/hardhat-scripts/deploy/1.deploy.ts @@ -9,7 +9,7 @@ import { Contract, Signer, Wallet, providers } from "ethers"; import { ethers } from "hardhat"; import dev_addresses from "../../deployments/dev_addresses.json"; import { BID_TIMEOUT, EVMX_CHAIN_ID, EXPIRY_TIME, MAX_LIMIT } from "../config"; -import { auctionEndDelaySeconds, chains, logConfig } from "../config/config"; +import { auctionEndDelaySeconds, chains, mode, logConfig } from "../config/config"; import { CORE_CONTRACTS, EVMxCoreContracts } from "../constants"; import { getImplementationAddress } from "../migration/migrate-proxies"; import { @@ -21,123 +21,19 @@ import { config(); let offChainVMOwner: string; + const main = async () => { - try { logConfig(); - let addresses: DeploymentAddresses; - let deployUtils: DeployParams = { - addresses: {} as ChainSocketAddresses, - mode: DeploymentMode.DEV, - signer: new ethers.Wallet(process.env.SOCKET_SIGNER_KEY as string), - currentChainSlug: EVMX_CHAIN_ID as ChainSlug, - }; - try { - await deployWatcherVMContracts(); - - console.log("Deploying Socket contracts"); - addresses = dev_addresses as unknown as DeploymentAddresses; - for (const chain of chains) { - try { - let chainAddresses: ChainSocketAddresses = addresses[chain] - ? (addresses[chain] as ChainSocketAddresses) - : ({} as ChainSocketAddresses); - - const providerInstance = getProviderFromChainSlug(chain); - const signer: Wallet = new ethers.Wallet( - process.env.SOCKET_SIGNER_KEY as string, - providerInstance - ); - const socketOwner = signer.address; - - deployUtils = { - addresses: chainAddresses, - mode: DeploymentMode.DEV, - signer: signer, - currentChainSlug: chain as ChainSlug, - }; - - let contractName = CORE_CONTRACTS.Socket; - const socket: Contract = await getOrDeploy( - contractName, - contractName, - `contracts/protocol/socket/${contractName}.sol`, - [chain as ChainSlug, socketOwner, "EVMX"], - deployUtils - ); - deployUtils.addresses[contractName] = socket.address; - - contractName = CORE_CONTRACTS.SocketBatcher; - const batcher: Contract = await getOrDeploy( - contractName, - contractName, - `contracts/protocol/socket/${contractName}.sol`, - [socketOwner, socket.address], - deployUtils - ); - deployUtils.addresses[contractName] = batcher.address; - - contractName = CORE_CONTRACTS.FastSwitchboard; - const sb: Contract = await getOrDeploy( - contractName, - contractName, - `contracts/protocol/socket/switchboard/${contractName}.sol`, - [chain as ChainSlug, socket.address, socketOwner], - deployUtils - ); - deployUtils.addresses[contractName] = sb.address; - - contractName = CORE_CONTRACTS.FeesPlug; - const feesPlug: Contract = await getOrDeploy( - contractName, - contractName, - `contracts/protocol/payload-delivery/${contractName}.sol`, - [socket.address, socketOwner], - deployUtils - ); - deployUtils.addresses[contractName] = feesPlug.address; - - contractName = CORE_CONTRACTS.ContractFactoryPlug; - const contractFactoryPlug: Contract = await getOrDeploy( - contractName, - contractName, - `contracts/protocol/payload-delivery/${contractName}.sol`, - [socket.address, socketOwner], - deployUtils - ); - deployUtils.addresses[contractName] = contractFactoryPlug.address; - - deployUtils.addresses.startBlock = deployUtils.addresses.startBlock - ? deployUtils.addresses.startBlock - : await deployUtils.signer.provider?.getBlockNumber(); - - await storeAddresses( - deployUtils.addresses, - chain, - DeploymentMode.DEV - ); - } catch (error) { - await storeAddresses( - deployUtils.addresses, - chain, - DeploymentMode.DEV - ); - console.log("Error:", error); - } - } - } catch (error) { - console.error("Error in main deployment:", error); - } - } catch (error) { - console.error("Error in overall deployment process:", error); - } + await deployEVMxContracts(); + await deploySocketContracts(); }; -const deployWatcherVMContracts = async () => { +const deployEVMxContracts = async () => { try { let addresses: DeploymentAddresses; let deployUtils: DeployParams = { addresses: {} as ChainSocketAddresses, - mode: DeploymentMode.DEV, + mode, signer: new ethers.Wallet(process.env.WATCHER_PRIVATE_KEY as string), currentChainSlug: EVMX_CHAIN_ID as ChainSlug, }; @@ -160,7 +56,7 @@ const deployWatcherVMContracts = async () => { deployUtils = { addresses: chainAddresses, - mode: DeploymentMode.DEV, + mode, signer: signer, currentChainSlug: chain as ChainSlug, }; @@ -267,13 +163,13 @@ const deployWatcherVMContracts = async () => { await storeAddresses( deployUtils.addresses, chain as ChainSlug, - DeploymentMode.DEV + mode ); } catch (error) { await storeAddresses( deployUtils.addresses, chain as ChainSlug, - DeploymentMode.DEV + mode ); console.log("Error:", error); } @@ -282,6 +178,113 @@ const deployWatcherVMContracts = async () => { } }; + +const deploySocketContracts = async () => { + try { + let addresses: DeploymentAddresses; + let deployUtils: DeployParams = { + addresses: {} as ChainSocketAddresses, + mode, + signer: new ethers.Wallet(process.env.SOCKET_SIGNER_KEY as string), + currentChainSlug: EVMX_CHAIN_ID as ChainSlug, + }; + console.log("Deploying Socket contracts"); + addresses = dev_addresses as unknown as DeploymentAddresses; + + for (const chain of chains) { + try { + let chainAddresses: ChainSocketAddresses = addresses[chain] + ? (addresses[chain] as ChainSocketAddresses) + : ({} as ChainSocketAddresses); + + const providerInstance = getProviderFromChainSlug(chain); + const signer: Wallet = new ethers.Wallet( + process.env.SOCKET_SIGNER_KEY as string, + providerInstance + ); + const socketOwner = signer.address; + + deployUtils = { + addresses: chainAddresses, + mode, + signer: signer, + currentChainSlug: chain as ChainSlug, + }; + + let contractName = CORE_CONTRACTS.Socket; + const socket: Contract = await getOrDeploy( + contractName, + contractName, + `contracts/protocol/socket/${contractName}.sol`, + [chain as ChainSlug, socketOwner, "EVMX"], + deployUtils + ); + deployUtils.addresses[contractName] = socket.address; + + contractName = CORE_CONTRACTS.SocketBatcher; + const batcher: Contract = await getOrDeploy( + contractName, + contractName, + `contracts/protocol/socket/${contractName}.sol`, + [socketOwner, socket.address], + deployUtils + ); + deployUtils.addresses[contractName] = batcher.address; + + contractName = CORE_CONTRACTS.FastSwitchboard; + const sb: Contract = await getOrDeploy( + contractName, + contractName, + `contracts/protocol/socket/switchboard/${contractName}.sol`, + [chain as ChainSlug, socket.address, socketOwner], + deployUtils + ); + deployUtils.addresses[contractName] = sb.address; + + contractName = CORE_CONTRACTS.FeesPlug; + const feesPlug: Contract = await getOrDeploy( + contractName, + contractName, + `contracts/protocol/payload-delivery/${contractName}.sol`, + [socket.address, socketOwner], + deployUtils + ); + deployUtils.addresses[contractName] = feesPlug.address; + + contractName = CORE_CONTRACTS.ContractFactoryPlug; + const contractFactoryPlug: Contract = await getOrDeploy( + contractName, + contractName, + `contracts/protocol/payload-delivery/${contractName}.sol`, + [socket.address, socketOwner], + deployUtils + ); + deployUtils.addresses[contractName] = contractFactoryPlug.address; + + deployUtils.addresses.startBlock = deployUtils.addresses.startBlock + ? deployUtils.addresses.startBlock + : await deployUtils.signer.provider?.getBlockNumber(); + + await storeAddresses( + deployUtils.addresses, + chain, + mode + ); + } catch (error) { + await storeAddresses( + deployUtils.addresses, + chain, + mode + ); + console.log("Error while deploying socket contracts on chain", chain, error); + } + } + } catch (error) { + console.error("Error in socket deployment:", error); + } +} + + async function initializeSigVerifier( contract: Contract, getterMethod: string, diff --git a/hardhat-scripts/deploy/2.roles.ts b/hardhat-scripts/deploy/2.roles.ts index 4bd15a2a..e3410da0 100644 --- a/hardhat-scripts/deploy/2.roles.ts +++ b/hardhat-scripts/deploy/2.roles.ts @@ -47,12 +47,16 @@ export const main = async () => { ); contract = contract.connect(signer); - const targetAddress = - contractName === CORE_CONTRACTS.FastSwitchboard - ? watcher - : signer.address; for (const roleName of roles) { + console.log(`checking ${roleName} role for ${contractName} on ${chain}`) + const targetAddress = + contractName === CORE_CONTRACTS.FastSwitchboard && + roleName === ROLES.WATCHER_ROLE + ? watcher + : signer.address; + + const roleHash = getRoleHash(roleName); const hasRole = await contract.callStatic["hasRole(bytes32,address)"]( roleHash, @@ -63,12 +67,7 @@ export const main = async () => { ); if (!hasRole) { - let tx; - if (contractName === CORE_CONTRACTS.FastSwitchboard) { - tx = await contract.grantWatcherRole(targetAddress); - } else { - tx = await contract.grantRole(roleHash, targetAddress); - } + let tx = await contract.grantRole(roleHash, targetAddress); console.log( `granting ${roleName} role to ${targetAddress} for ${contractName}`, chain, diff --git a/hardhat-scripts/deploy/4.connect.ts b/hardhat-scripts/deploy/4.connect.ts index 5a3c53e2..c13002e8 100644 --- a/hardhat-scripts/deploy/4.connect.ts +++ b/hardhat-scripts/deploy/4.connect.ts @@ -17,11 +17,16 @@ export type AppGatewayConfig = { }; // Maps plug contracts to their corresponding app gateways export const getAppGateway = (plug: string, addresses: DeploymentAddresses) => { + let address: string = ''; switch (plug) { case CORE_CONTRACTS.ContractFactoryPlug: - return addresses?.[EVMX_CHAIN_ID]?.[EVMxCoreContracts.DeliveryHelper]; + address = addresses?.[EVMX_CHAIN_ID]?.[EVMxCoreContracts.DeliveryHelper]; + if (!address) throw new Error(`DeliveryHelper not found on EVMX`); + return address; case CORE_CONTRACTS.FeesPlug: - return addresses?.[EVMX_CHAIN_ID]?.[EVMxCoreContracts.FeesManager]; + address = addresses?.[EVMX_CHAIN_ID]?.[EVMxCoreContracts.FeesManager]; + if (!address) throw new Error(`FeesManager not found on EVMX`); + return address; default: throw new Error(`Unknown plug: ${plug}`); } diff --git a/hardhat-scripts/deploy/6.setupEnv.ts b/hardhat-scripts/deploy/6.setupEnv.ts index 641fa4ce..7d6a9aef 100644 --- a/hardhat-scripts/deploy/6.setupEnv.ts +++ b/hardhat-scripts/deploy/6.setupEnv.ts @@ -24,12 +24,12 @@ const updatedLines = lines.map((line) => { return `WATCHER_PRECOMPILE=${latestAddresses["WatcherPrecompile"]}`; } else if (line.startsWith("AUCTION_MANAGER=")) { return `AUCTION_MANAGER=${latestAddresses["AuctionManager"]}`; - } else if (line.startsWith("ARBITRUM_FEES_PLUG=")) { - return `ARBITRUM_FEES_PLUG=${latestAddresses["FeesManager"]}`; - } else if (line.startsWith("SOCKET=")) { - return `SOCKET=${dev_addresses[ChainSlug.ARBITRUM_SEPOLIA]["Socket"]}`; - } else if (line.startsWith("SWITCHBOARD=")) { - return `SWITCHBOARD=${ + } else if (line.startsWith("FEES_MANAGER=")) { + return `FEES_MANAGER=${latestAddresses["FeesManager"]}`; + } else if (line.startsWith("ARBITRUM_SOCKET=")) { + return `ARBITRUM_SOCKET=${dev_addresses[ChainSlug.ARBITRUM_SEPOLIA]["Socket"]}`; + } else if (line.startsWith("ARBITRUM_SWITCHBOARD=")) { + return `ARBITRUM_SWITCHBOARD=${ dev_addresses[ChainSlug.ARBITRUM_SEPOLIA]["FastSwitchboard"] }`; } else if (line.startsWith("ARBITRUM_FEES_PLUG=")) { diff --git a/hardhat-scripts/utils/deployUtils.ts b/hardhat-scripts/utils/deployUtils.ts index e847edc6..e0404c46 100644 --- a/hardhat-scripts/utils/deployUtils.ts +++ b/hardhat-scripts/utils/deployUtils.ts @@ -15,7 +15,7 @@ import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/signers"; import { overrides } from "../utils"; import { VerifyArgs } from "../verify"; -export const deploymentsPath = path.join(__dirname, `/../../../deployments/`); +export const deploymentsPath = path.join(__dirname, `/../../deployments/`); export const deployedAddressPath = (mode: DeploymentMode) => deploymentsPath + `${mode}_addresses.json`; diff --git a/package.json b/package.json index c7668da8..d4f8fa9b 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "publishConfig": { "access": "public" }, - "version": "1.0.9", + "version": "1.0.10", "description": "socket protocol", "scripts": { "build": "hardhat export-abi && tsc --project lib.tsconfig.json", From f1f1f18fcd518d5820b6d4328eaa2393582eb090 Mon Sep 17 00:00:00 2001 From: Rookmate <14072042+rookmate@users.noreply.github.com> Date: Thu, 20 Feb 2025 18:58:56 +0000 Subject: [PATCH 100/186] Update .env.sample EVMx addresses --- .env.sample | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.env.sample b/.env.sample index e6aebb40..1a95ccf7 100644 --- a/.env.sample +++ b/.env.sample @@ -7,9 +7,9 @@ BASE_SEPOLIA_RPC="https://rpc.ankr.com/base_sepolia" # EVMx key addresses # Find the most up to date addresses in deployments/dev_addresses.json -ADDRESS_RESOLVER="0x1307b0cDCA91e969D5885D0332bD34688E9f6E39" -AUCTION_MANAGER="0xA8016fad20367D9De8B21d4c16BB677bc7a265cE" -ARBITRUM_FEES_PLUG="0xFDd8beaDb07cB224971fD311F9218addC14443fb" +ADDRESS_RESOLVER="0x7480D8D4B1929e751984b01eE877A9D65e1F3737" +AUCTION_MANAGER="0x50E5140d3601812Dc11f49a39CF9520567731c82" +ARBITRUM_FEES_PLUG="0xa08Dac27E27c49A2535b36064c370e6e8B3A0B9a" # Add your deployer private key here # or remove it from this file if it is already an env var @@ -21,4 +21,4 @@ APP_GATEWAY="0x" # FOR INFRASTRUCTURE DEPLOYMENT ONLY # Removes hardhat issues related to linting and syntax checking -SOCKET_SIGNER_KEY="0000dead0000dead0000dead0000dead0000dead0000dead0000dead0000dead" \ No newline at end of file +SOCKET_SIGNER_KEY="0000dead0000dead0000dead0000dead0000dead0000dead0000dead0000dead" From 83137ef85afa695a1a06bb1d36f7016eaec73f9c Mon Sep 17 00:00:00 2001 From: Rookmate <14072042+rookmate@users.noreply.github.com> Date: Thu, 20 Feb 2025 19:05:48 +0000 Subject: [PATCH 101/186] Update .env.sample EVMx URL --- .env.sample | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.env.sample b/.env.sample index 1a95ccf7..2250eb73 100644 --- a/.env.sample +++ b/.env.sample @@ -1,5 +1,5 @@ # RPCs -EVMX_RPC="https://rpc-socket-composer-testnet.t.conduit.xyz" +EVMX_RPC="https://rpc.evmx.socket.tech" SEPOLIA_RPC="https://rpc.ankr.com/eth_sepolia/" ARBITRUM_SEPOLIA_RPC="https://rpc.ankr.com/arbitrum_sepolia" OPTIMISM_SEPOLIA_RPC="https://rpc.ankr.com/optimism_sepolia" From 5839a0a310873a888c64c25dce658b06e37d0bad Mon Sep 17 00:00:00 2001 From: Rookmate <14072042+rookmate@users.noreply.github.com> Date: Fri, 21 Feb 2025 09:11:04 +0000 Subject: [PATCH 102/186] Update foundry.toml --- foundry.toml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/foundry.toml b/foundry.toml index 3c9d312f..cb4f0f24 100644 --- a/foundry.toml +++ b/foundry.toml @@ -6,10 +6,9 @@ libs = ["node_modules", "lib"] ffi = true optimizer = true optimizer_runs = 200 -evm_version = 'shanghai' +evm_version = 'paris' # See more config options https://github.com/foundry-rs/foundry/blob/master/crates/config/README.md#all-options [etherscan] -3605 = { key = "none", url = "https://explorer-cloud-broken-leg-7uu20euqoj.t.conduit.xyz/api" } 421614 = { key = "${ARBISCAN_API_KEY}", url = "https://api-sepolia.arbiscan.io/api?" } 11155420 = { key = "${OPTIMISM_API_KEY}", url = "https://optimism-sepolia.blockscout.com/api?" } From c56cf3c1dcf43f3068b5706d13d63437c683473f Mon Sep 17 00:00:00 2001 From: Rookmate <14072042+rookmate@users.noreply.github.com> Date: Fri, 21 Feb 2025 09:16:26 +0000 Subject: [PATCH 103/186] Add EVMx contract verification URL --- foundry.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/foundry.toml b/foundry.toml index cb4f0f24..2b0a2d73 100644 --- a/foundry.toml +++ b/foundry.toml @@ -10,5 +10,6 @@ evm_version = 'paris' # See more config options https://github.com/foundry-rs/foundry/blob/master/crates/config/README.md#all-options [etherscan] +7625382 = { key = "empty", url = "https://evms.cloud.blockscout.com/api?" } 421614 = { key = "${ARBISCAN_API_KEY}", url = "https://api-sepolia.arbiscan.io/api?" } 11155420 = { key = "${OPTIMISM_API_KEY}", url = "https://optimism-sepolia.blockscout.com/api?" } From 8446446a5b94d6429892aec2762cd1a9b3901471 Mon Sep 17 00:00:00 2001 From: Rookmate <14072042+rookmate@users.noreply.github.com> Date: Fri, 21 Feb 2025 09:49:02 +0000 Subject: [PATCH 104/186] Add FEES_MANAGER to .env.sample --- .env.sample | 1 + 1 file changed, 1 insertion(+) diff --git a/.env.sample b/.env.sample index 2250eb73..de7767c6 100644 --- a/.env.sample +++ b/.env.sample @@ -10,6 +10,7 @@ BASE_SEPOLIA_RPC="https://rpc.ankr.com/base_sepolia" ADDRESS_RESOLVER="0x7480D8D4B1929e751984b01eE877A9D65e1F3737" AUCTION_MANAGER="0x50E5140d3601812Dc11f49a39CF9520567731c82" ARBITRUM_FEES_PLUG="0xa08Dac27E27c49A2535b36064c370e6e8B3A0B9a" +FEES_MANAGER="0x80bEc58A00993dc874Ab2fAe56621af24eF06bA5" # Add your deployer private key here # or remove it from this file if it is already an env var From a84695dac93c45e40240ccfff4f2a2f305bc8b6e Mon Sep 17 00:00:00 2001 From: Rookmate <14072042+rookmate@users.noreply.github.com> Date: Fri, 21 Feb 2025 10:09:25 +0000 Subject: [PATCH 105/186] Rename to AppGatewayFeeBalance --- script/{CheckDepositedFees.s.sol => AppGatewayFeeBalance.s.sol} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename script/{CheckDepositedFees.s.sol => AppGatewayFeeBalance.s.sol} (100%) diff --git a/script/CheckDepositedFees.s.sol b/script/AppGatewayFeeBalance.s.sol similarity index 100% rename from script/CheckDepositedFees.s.sol rename to script/AppGatewayFeeBalance.s.sol From a1cc45f896b0d8f294b8fcb6c4cc72b4c0b5875a Mon Sep 17 00:00:00 2001 From: Rookmate <14072042+rookmate@users.noreply.github.com> Date: Fri, 21 Feb 2025 10:44:14 +0000 Subject: [PATCH 106/186] [WIP] Update WithdrawFees --- .../WithdrawFeesArbitrumFeesPlug.s.sol | 37 +++++++++++-------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/script/counter/WithdrawFeesArbitrumFeesPlug.s.sol b/script/counter/WithdrawFeesArbitrumFeesPlug.s.sol index 26d2a0f0..2caf8a09 100644 --- a/script/counter/WithdrawFeesArbitrumFeesPlug.s.sol +++ b/script/counter/WithdrawFeesArbitrumFeesPlug.s.sol @@ -3,30 +3,37 @@ pragma solidity ^0.8.0; import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/console.sol"; -import {FeesPlug} from "../../contracts/protocol/payload-delivery/FeesPlug.sol"; +import {FeesManager} from "../../contracts/protocol/payload-delivery/app-gateway/FeesManager.sol"; import {ETH_ADDRESS} from "../../contracts/protocol/utils/common/Constants.sol"; import {CounterAppGateway} from "../../contracts/apps/counter/CounterAppGateway.sol"; contract WithdrawFees is Script { function run() external { - vm.createSelectFork(vm.envString("ARBITRUM_SEPOLIA_RPC")); - - uint256 privateKey = vm.envUint("PRIVATE_KEY"); - vm.startBroadcast(privateKey); - FeesPlug feesPlug = FeesPlug(payable(vm.envAddress("ARBITRUM_FEES_PLUG"))); + vm.createSelectFork(vm.envString("EVMX_RPC")); + FeesManager feesManager = FeesManager(payable(vm.envAddress("FEES_MANAGER"))); address appGatewayAddress = vm.envAddress("APP_GATEWAY"); CounterAppGateway appGateway = CounterAppGateway(appGatewayAddress); - address sender = vm.addr(privateKey); - console.log("Sender address:", sender); - uint256 balance = sender.balance; - console.log("Sender balance:", balance); + uint256 availableFees = feesManager.getAvailableFees( + 421614, + appGatewayAddress, + ETH_ADDRESS + ); + console.log("Available fees:", availableFees); + + if (availableFees > 0) { + vm.createSelectFork(vm.envString("ARBITRUM_SEPOLIA_RPC")); + + uint256 privateKey = vm.envUint("PRIVATE_KEY"); + address sender = vm.addr(privateKey); + console.log("Sender address:", sender); + console.log("Sender balance", sender.balance); + + vm.startBroadcast(privateKey); - uint256 appBalance = feesPlug.balanceOf(appGatewayAddress); - console.log("AppBalance:", appBalance); - if (appBalance > 0) { - appGateway.withdrawFeeTokens(421614, ETH_ADDRESS, appBalance, sender); - console.log("Withdrew:", appBalance); + appGateway.withdrawFeeTokens(421614, ETH_ADDRESS, availableFees, sender); + console.log("Withdrew:", availableFees); + console.log("Sender balance", sender.balance); } } } From dabc5f70c5ab97e65c261d1afdc48bbc153c5c9d Mon Sep 17 00:00:00 2001 From: Rookmate <14072042+rookmate@users.noreply.github.com> Date: Fri, 21 Feb 2025 11:24:08 +0000 Subject: [PATCH 107/186] Minor fixes on counter scripts --- script/PayFeesInArbitrumETH.s.sol | 2 +- script/counter/IncrementCountersFromApp.s.sol | 16 ++++------------ script/counter/deployOnchainCounters.s.sol | 4 ++-- 3 files changed, 7 insertions(+), 15 deletions(-) diff --git a/script/PayFeesInArbitrumETH.s.sol b/script/PayFeesInArbitrumETH.s.sol index dec3763b..ff3ff1be 100644 --- a/script/PayFeesInArbitrumETH.s.sol +++ b/script/PayFeesInArbitrumETH.s.sol @@ -21,7 +21,7 @@ contract DepositFees is Script { uint256 balance = sender.balance; console.log("Sender balance in wei:", balance); - uint feesAmount = 0.01 ether; + uint feesAmount = 0.001 ether; feesPlug.deposit{value: feesAmount}(ETH_ADDRESS, appGateway, feesAmount); } } diff --git a/script/counter/IncrementCountersFromApp.s.sol b/script/counter/IncrementCountersFromApp.s.sol index 70036545..379cd9ef 100644 --- a/script/counter/IncrementCountersFromApp.s.sol +++ b/script/counter/IncrementCountersFromApp.s.sol @@ -13,8 +13,8 @@ contract IncrementCounters is Script { vm.createSelectFork(socketRPC); - CounterDeployer deployer = CounterDeployer(vm.envAddress("COUNTER_DEPLOYER")); - CounterAppGateway gateway = CounterAppGateway(vm.envAddress("COUNTER_APP_GATEWAY")); + CounterDeployer deployer = CounterDeployer(vm.envAddress("DEPLOYER")); + CounterAppGateway gateway = CounterAppGateway(vm.envAddress("APP_GATEWAY")); address counterForwarderArbitrumSepolia = deployer.forwarderAddresses( deployer.counter(), @@ -67,15 +67,7 @@ contract IncrementCounters is Script { // console.log("Ethereum Sepolia forwarder not yet deployed"); //} - // vm.startBroadcast(deployerPrivateKey); - bytes memory data = abi.encodeWithSelector( - CounterAppGateway.incrementCounters.selector, - instances - ); - console.log("to"); - console.log(address(gateway)); - console.log("data"); - console.logBytes(data); - // gateway.incrementCounters(instances); + vm.startBroadcast(deployerPrivateKey); + gateway.incrementCounters(instances); } } diff --git a/script/counter/deployOnchainCounters.s.sol b/script/counter/deployOnchainCounters.s.sol index 4279c13a..2c67a1fe 100644 --- a/script/counter/deployOnchainCounters.s.sol +++ b/script/counter/deployOnchainCounters.s.sol @@ -25,7 +25,7 @@ contract CounterDeployOnchain is Script { // deployer.deployContracts(11155420); // console.log("Deploying contracts on Base Sepolia..."); // deployer.deployContracts(84532); - //console.log("Deploying contracts on Ethereum Sepolia..."); - //deployer.deployContracts(11155111); + // console.log("Deploying contracts on Ethereum Sepolia..."); + // deployer.deployContracts(11155111); } } From 5610135b76ddc739229d03e698366cf87d1f18a8 Mon Sep 17 00:00:00 2001 From: Akash Date: Fri, 21 Feb 2025 15:26:36 +0400 Subject: [PATCH 108/186] feat: first version deployed --- deployments/dev_addresses.json | 32 ++++---- deployments/dev_verification.json | 112 +++++++-------------------- foundry.toml | 2 +- hardhat-scripts/deploy/1.deploy.ts | 43 ++++------ hardhat-scripts/deploy/2.roles.ts | 6 +- hardhat-scripts/deploy/4.connect.ts | 4 +- hardhat-scripts/deploy/6.setupEnv.ts | 4 +- hardhat-scripts/utils/overrides.ts | 6 +- package.json | 2 +- setupInfraContracts.sh | 14 ++-- testScript.sh | 7 +- 11 files changed, 86 insertions(+), 146 deletions(-) diff --git a/deployments/dev_addresses.json b/deployments/dev_addresses.json index ae35be28..fb1d2e3b 100644 --- a/deployments/dev_addresses.json +++ b/deployments/dev_addresses.json @@ -1,30 +1,30 @@ { "421614": { - "ContractFactoryPlug": "0x38cAf1D477F806Fae8aed84ecD68E00eF6c2cB0c", + "ContractFactoryPlug": "0x146dd9Fc049501675533a455835989684a2f79C1", "FastSwitchboard": "0xB16475054Dc6D8bfbd80daE964bbE416a4B7a791", - "FeesPlug": "0x228AA70a66498FC75524371cDAfB31958Ca5F12D", + "FeesPlug": "0xa08Dac27E27c49A2535b36064c370e6e8B3A0B9a", "Socket": "0x963eC83119862cD518826DA9177B348cFdfebaA4", "SocketBatcher": "0x2db8cb4f841aa944869ECD5002e8153642A30971", "startBlock": 125604419 }, "7625382": { - "AddressResolver": "0xE0692012B818cdc72972CbF3A2dCbf5299FFa2bA", - "AddressResolverImpl": "0x764F5812F89584c053652B6Bcec62050F649ABf3", - "AuctionManager": "0x977036A2B56cE7Bc87161614802fE381629A5298", - "AuctionManagerImpl": "0x484fDd713323bD8cfb944620c20986A7AEBa4880", - "DeliveryHelper": "0x0e89e59C9FB5e440F07a8A67D8bBC53Ec07e92C0", - "DeliveryHelperImpl": "0x635E9fEac9fe3Ff19c41974B3a457D52F9521b9B", - "ERC1967Factory": "0x794b92C2Ade7D33Fb34d138B13014C63aB27CBC0", - "FeesManager": "0xBC83ad0Df55a3B52B93D3f16d466283902b31BEB", - "FeesManagerImpl": "0xD83B7753212efe1c81CE42F642661701eAeDA80A", - "startBlock": 138, - "WatcherPrecompile": "0x0245a1Aece4bfd16bc85d08B4aFfa5e63CDE8908", - "WatcherPrecompileImpl": "0xaf76e485B26C5c5964b403CA2C5c1a9D6Cd8022F" + "AddressResolver": "0x7480D8D4B1929e751984b01eE877A9D65e1F3737", + "AddressResolverImpl": "0xcc9486bce931041d1393921b32f7b4C60F6eAA99", + "AuctionManager": "0x50E5140d3601812Dc11f49a39CF9520567731c82", + "AuctionManagerImpl": "0xd6F9087DaBe64649c33B20B444eCcE19cca97436", + "DeliveryHelper": "0x862f14446ce869218C04c29507131B68119B4CEd", + "DeliveryHelperImpl": "0xD4f1AE0d51F61dda1476BD43953EF1878556B74c", + "ERC1967Factory": "0x157FEE5a69B538AD189AbB863eeAfD24552DED23", + "FeesManager": "0x80bEc58A00993dc874Ab2fAe56621af24eF06bA5", + "FeesManagerImpl": "0x187058842C78675eA08572E0edc9598271dEF278", + "startBlock": 168, + "WatcherPrecompile": "0x102A1F3546754B21D6a6BA90B54b59Da30bcb3B4", + "WatcherPrecompileImpl": "0x0429DB4f0a97F8c6E3D84399bBdA3e03B62b03A3" }, "11155420": { - "ContractFactoryPlug": "0x43942f05D5b44DC6Ca19b316dF54BE87FcF9D583", + "ContractFactoryPlug": "0xDF769F323560b54F1370a407d3aE6fC99AaAeF75", "FastSwitchboard": "0xA448B8CD7325AA38d4E533cE209471B7ce01901F", - "FeesPlug": "0x17b3c7c5552fA4e730888558A8912cFD7A8b042e", + "FeesPlug": "0x5e5CF700c97BC8B3F6215D98E65f85D4A44d7D06", "Socket": "0xaF57894A5244711a7bEBE582E9e121980f1aa95e", "SocketBatcher": "0x977e2f721f8958b2F776d2dc693D04A1256ed426", "startBlock": 24127420 diff --git a/deployments/dev_verification.json b/deployments/dev_verification.json index 5106392d..6bb8f277 100644 --- a/deployments/dev_verification.json +++ b/deployments/dev_verification.json @@ -1,50 +1,42 @@ { - "421614": [ + "421614": [], + "7625382": [ [ - "0x38cAf1D477F806Fae8aed84ecD68E00eF6c2cB0c", - "ContractFactoryPlug", - "contracts/protocol/payload-delivery/ContractFactoryPlug.sol", - [ - "0x963eC83119862cD518826DA9177B348cFdfebaA4", - "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18" - ] + "0xd6F9087DaBe64649c33B20B444eCcE19cca97436", + "AuctionManager", + "contracts/protocol/payload-delivery/app-gateway/AuctionManager.sol", + [] ], [ - "0x228AA70a66498FC75524371cDAfB31958Ca5F12D", - "FeesPlug", - "contracts/protocol/payload-delivery/FeesPlug.sol", - [ - "0x963eC83119862cD518826DA9177B348cFdfebaA4", - "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18" - ] + "0xD4f1AE0d51F61dda1476BD43953EF1878556B74c", + "DeliveryHelper", + "contracts/protocol/payload-delivery/app-gateway/DeliveryHelper.sol", + [] ], [ - "0xB16475054Dc6D8bfbd80daE964bbE416a4B7a791", - "FastSwitchboard", - "contracts/protocol/socket/switchboard/FastSwitchboard.sol", - [ - 421614, - "0x963eC83119862cD518826DA9177B348cFdfebaA4", - "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18" - ] + "0x187058842C78675eA08572E0edc9598271dEF278", + "FeesManager", + "contracts/protocol/payload-delivery/app-gateway/FeesManager.sol", + [] ], [ - "0x2db8cb4f841aa944869ECD5002e8153642A30971", - "SocketBatcher", - "contracts/protocol/socket/SocketBatcher.sol", - [ - "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18", - "0x963eC83119862cD518826DA9177B348cFdfebaA4" - ] + "0x0429DB4f0a97F8c6E3D84399bBdA3e03B62b03A3", + "WatcherPrecompile", + "contracts/protocol/watcherPrecompile/WatcherPrecompile.sol", + [] ], [ - "0x963eC83119862cD518826DA9177B348cFdfebaA4", - "Socket", - "contracts/protocol/socket/Socket.sol", - [421614, "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18", "EVMX"] - ] - ], - "7625382": [ + "0xcc9486bce931041d1393921b32f7b4C60F6eAA99", + "AddressResolver", + "contracts/protocol/AddressResolver.sol", + [] + ], + [ + "0x157FEE5a69B538AD189AbB863eeAfD24552DED23", + "ERC1967Factory", + "lib/solady/src/utils/ERC1967Factory.sol", + [] + ], [ "0x48228f8ebdCA92B7F7fdC9C545372123f5Bcc4C4", "AuctionManager", @@ -82,49 +74,5 @@ [] ] ], - "11155420": [ - [ - "0x43942f05D5b44DC6Ca19b316dF54BE87FcF9D583", - "ContractFactoryPlug", - "contracts/protocol/payload-delivery/ContractFactoryPlug.sol", - [ - "0xaF57894A5244711a7bEBE582E9e121980f1aa95e", - "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18" - ] - ], - [ - "0x17b3c7c5552fA4e730888558A8912cFD7A8b042e", - "FeesPlug", - "contracts/protocol/payload-delivery/FeesPlug.sol", - [ - "0xaF57894A5244711a7bEBE582E9e121980f1aa95e", - "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18" - ] - ], - [ - "0xA448B8CD7325AA38d4E533cE209471B7ce01901F", - "FastSwitchboard", - "contracts/protocol/socket/switchboard/FastSwitchboard.sol", - [ - 11155420, - "0xaF57894A5244711a7bEBE582E9e121980f1aa95e", - "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18" - ] - ], - [ - "0x977e2f721f8958b2F776d2dc693D04A1256ed426", - "SocketBatcher", - "contracts/protocol/socket/SocketBatcher.sol", - [ - "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18", - "0xaF57894A5244711a7bEBE582E9e121980f1aa95e" - ] - ], - [ - "0xaF57894A5244711a7bEBE582E9e121980f1aa95e", - "Socket", - "contracts/protocol/socket/Socket.sol", - [11155420, "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18", "EVMX"] - ] - ] + "11155420": [] } diff --git a/foundry.toml b/foundry.toml index 3c9d312f..06143bda 100644 --- a/foundry.toml +++ b/foundry.toml @@ -6,7 +6,7 @@ libs = ["node_modules", "lib"] ffi = true optimizer = true optimizer_runs = 200 -evm_version = 'shanghai' +evm_version = 'paris' # See more config options https://github.com/foundry-rs/foundry/blob/master/crates/config/README.md#all-options [etherscan] diff --git a/hardhat-scripts/deploy/1.deploy.ts b/hardhat-scripts/deploy/1.deploy.ts index c7978337..92c9c5f0 100644 --- a/hardhat-scripts/deploy/1.deploy.ts +++ b/hardhat-scripts/deploy/1.deploy.ts @@ -9,7 +9,12 @@ import { Contract, Signer, Wallet, providers } from "ethers"; import { ethers } from "hardhat"; import dev_addresses from "../../deployments/dev_addresses.json"; import { BID_TIMEOUT, EVMX_CHAIN_ID, EXPIRY_TIME, MAX_LIMIT } from "../config"; -import { auctionEndDelaySeconds, chains, mode, logConfig } from "../config/config"; +import { + auctionEndDelaySeconds, + chains, + mode, + logConfig, +} from "../config/config"; import { CORE_CONTRACTS, EVMxCoreContracts } from "../constants"; import { getImplementationAddress } from "../migration/migrate-proxies"; import { @@ -23,9 +28,9 @@ config(); let offChainVMOwner: string; const main = async () => { - logConfig(); - await deployEVMxContracts(); - await deploySocketContracts(); + logConfig(); + await deployEVMxContracts(); + await deploySocketContracts(); }; const deployEVMxContracts = async () => { @@ -160,17 +165,9 @@ const deployEVMxContracts = async () => { ? deployUtils.addresses.startBlock : await deployUtils.signer.provider?.getBlockNumber(); - await storeAddresses( - deployUtils.addresses, - chain as ChainSlug, - mode - ); + await storeAddresses(deployUtils.addresses, chain as ChainSlug, mode); } catch (error) { - await storeAddresses( - deployUtils.addresses, - chain as ChainSlug, - mode - ); + await storeAddresses(deployUtils.addresses, chain as ChainSlug, mode); console.log("Error:", error); } } catch (error) { @@ -178,7 +175,6 @@ const deployEVMxContracts = async () => { } }; - const deploySocketContracts = async () => { try { let addresses: DeploymentAddresses; @@ -265,25 +261,20 @@ const deploySocketContracts = async () => { ? deployUtils.addresses.startBlock : await deployUtils.signer.provider?.getBlockNumber(); - await storeAddresses( - deployUtils.addresses, - chain, - mode - ); + await storeAddresses(deployUtils.addresses, chain, mode); } catch (error) { - await storeAddresses( - deployUtils.addresses, + await storeAddresses(deployUtils.addresses, chain, mode); + console.log( + "Error while deploying socket contracts on chain", chain, - mode + error ); - console.log("Error while deploying socket contracts on chain", chain, error); } } } catch (error) { console.error("Error in socket deployment:", error); } -} - +}; async function initializeSigVerifier( contract: Contract, diff --git a/hardhat-scripts/deploy/2.roles.ts b/hardhat-scripts/deploy/2.roles.ts index e3410da0..ba3dd802 100644 --- a/hardhat-scripts/deploy/2.roles.ts +++ b/hardhat-scripts/deploy/2.roles.ts @@ -47,16 +47,16 @@ export const main = async () => { ); contract = contract.connect(signer); - for (const roleName of roles) { - console.log(`checking ${roleName} role for ${contractName} on ${chain}`) + console.log( + `checking ${roleName} role for ${contractName} on ${chain}` + ); const targetAddress = contractName === CORE_CONTRACTS.FastSwitchboard && roleName === ROLES.WATCHER_ROLE ? watcher : signer.address; - const roleHash = getRoleHash(roleName); const hasRole = await contract.callStatic["hasRole(bytes32,address)"]( roleHash, diff --git a/hardhat-scripts/deploy/4.connect.ts b/hardhat-scripts/deploy/4.connect.ts index c13002e8..203badb3 100644 --- a/hardhat-scripts/deploy/4.connect.ts +++ b/hardhat-scripts/deploy/4.connect.ts @@ -17,7 +17,7 @@ export type AppGatewayConfig = { }; // Maps plug contracts to their corresponding app gateways export const getAppGateway = (plug: string, addresses: DeploymentAddresses) => { - let address: string = ''; + let address: string = ""; switch (plug) { case CORE_CONTRACTS.ContractFactoryPlug: address = addresses?.[EVMX_CHAIN_ID]?.[EVMxCoreContracts.DeliveryHelper]; @@ -89,7 +89,7 @@ async function connectPlug( } // Connect the plug - const tx = await plug.functions["initSocket"]( + const tx = await plug.functions["connectSocket"]( appGateway, socket.address, switchboard diff --git a/hardhat-scripts/deploy/6.setupEnv.ts b/hardhat-scripts/deploy/6.setupEnv.ts index 7d6a9aef..edbbfd29 100644 --- a/hardhat-scripts/deploy/6.setupEnv.ts +++ b/hardhat-scripts/deploy/6.setupEnv.ts @@ -27,7 +27,9 @@ const updatedLines = lines.map((line) => { } else if (line.startsWith("FEES_MANAGER=")) { return `FEES_MANAGER=${latestAddresses["FeesManager"]}`; } else if (line.startsWith("ARBITRUM_SOCKET=")) { - return `ARBITRUM_SOCKET=${dev_addresses[ChainSlug.ARBITRUM_SEPOLIA]["Socket"]}`; + return `ARBITRUM_SOCKET=${ + dev_addresses[ChainSlug.ARBITRUM_SEPOLIA]["Socket"] + }`; } else if (line.startsWith("ARBITRUM_SWITCHBOARD=")) { return `ARBITRUM_SWITCHBOARD=${ dev_addresses[ChainSlug.ARBITRUM_SEPOLIA]["FastSwitchboard"] diff --git a/hardhat-scripts/utils/overrides.ts b/hardhat-scripts/utils/overrides.ts index 685ed393..d3966954 100644 --- a/hardhat-scripts/utils/overrides.ts +++ b/hardhat-scripts/utils/overrides.ts @@ -28,9 +28,9 @@ export const chainOverrides: { // gasPrice: 212_000_000_000, }, [EVMX_CHAIN_ID as ChainSlug]: { - // type: 0, - gasLimit: 1_000_000_000, - // gasPrice: 0, + type: 0, + // gasLimit: 1_000_000_000, + gasPrice: 0, }, }; diff --git a/package.json b/package.json index d4f8fa9b..7e70a99c 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "publishConfig": { "access": "public" }, - "version": "1.0.10", + "version": "1.0.11", "description": "socket protocol", "scripts": { "build": "hardhat export-abi && tsc --project lib.tsconfig.json", diff --git a/setupInfraContracts.sh b/setupInfraContracts.sh index c487ae32..71c874b0 100644 --- a/setupInfraContracts.sh +++ b/setupInfraContracts.sh @@ -1,7 +1,7 @@ -npx hardhat run hardhat-scripts/deploy/1.deploy.ts --no-compile -npx hardhat run hardhat-scripts/deploy/2.roles.ts --no-compile -npx hardhat run hardhat-scripts/deploy/3.upgradeManagers.ts --no-compile -npx hardhat run hardhat-scripts/deploy/4.connect.ts --no-compile -export AWS_PROFILE=lldev && npx ts-node hardhat-scripts/deploy/5.upload.ts --resolveJsonModule -npx hardhat run hardhat-scripts/deploy/6.setupEnv.ts --no-compile -npx hardhat run hardhat-scripts/verify/verify.ts --no-compile +time npx hardhat run hardhat-scripts/deploy/1.deploy.ts +time npx hardhat run hardhat-scripts/deploy/2.roles.ts --no-compile +time npx hardhat run hardhat-scripts/deploy/3.upgradeManagers.ts --no-compile +time npx hardhat run hardhat-scripts/deploy/4.connect.ts --no-compile +time export AWS_PROFILE=lldev && npx ts-node hardhat-scripts/deploy/5.upload.ts --resolveJsonModule +time npx hardhat run hardhat-scripts/deploy/6.setupEnv.ts --no-compile +time npx hardhat run hardhat-scripts/verify/verify.ts --no-compile diff --git a/testScript.sh b/testScript.sh index 1157c8a0..eeb2c589 100644 --- a/testScript.sh +++ b/testScript.sh @@ -8,15 +8,14 @@ source .env && forge script script/parallel-counter/checkCounters.s.sol --broadc ## Counter -source .env && forge script script/counter/deployEVMxCounterApp.s.sol --broadcast --skip-simulation +source .env && forge script script/counter/deployEVMxCounterApp.s.sol --broadcast --skip-simulation --legacy --gas-price 0 source .env && forge script script/counter/DeployCounterOnchain.s.sol --broadcast --skip-simulation ## set limits for the app gateway using API -source .env && cast send $DEPLOYER "deployContracts(uint32)" 421614 --private-key $PRIVATE_KEY -source .env && cast send $APP_GATEWAY "incrementCounters(address[])" '[0x4507f726d8ca980e3a1800a8d972792d7ff46f65]' --private-key $PRIVATE_KEY +source .env && cast send $DEPLOYER "deployContracts(uint32)" 421614 --private-key $PRIVATE_KEY --legacy --gas-price 0 +source .env && cast send $APP_GATEWAY "incrementCounters(address[])" '[0x9Bd3efbd1dA4f58Bd4A11421102FE4B08fAb0121]' --private-key $PRIVATE_KEY --legacy --gas-price 0 forge script script/counter/incrementCounters.s.sol --broadcast --skip-simulation forge script script/counter/checkCounters.s.sol --broadcast --skip-simulation - ## Cron source .env && forge script script/cron/DeployGateway.s.sol:DeployGateway --broadcast --skip-simulation source .env && forge script script/cron/SetTimeout.s.sol:SetTimeoutScript --broadcast --skip-simulation From 2f590ee4cc377c74252dc6b9ec76df95d716cfdf Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Fri, 21 Feb 2025 15:32:30 +0400 Subject: [PATCH 109/186] feat: add watcher role --- .../protocol/watcherPrecompile/WatcherPrecompile.sol | 10 +++++----- .../watcherPrecompile/WatcherPrecompileConfig.sol | 2 +- .../watcherPrecompile/WatcherPrecompileLimits.sol | 5 +++-- script/CheckDepositedFees.s.sol | 2 +- test/SetupTest.t.sol | 3 +++ 5 files changed, 13 insertions(+), 9 deletions(-) diff --git a/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol b/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol index cf3d0b73..3ab83ee4 100644 --- a/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol +++ b/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol @@ -149,7 +149,7 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { /// @notice Ends the timeouts and calls the target address with the callback payload /// @param timeoutId_ The unique identifier for the timeout /// @dev Only callable by the contract owner - function resolveTimeout(bytes32 timeoutId_) external onlyOwner { + function resolveTimeout(bytes32 timeoutId_) external onlyRole(WATCHER_ROLE) { TimeoutRequest storage timeoutRequest_ = timeoutRequests[timeoutId_]; if (timeoutRequest_.target == address(0)) revert InvalidTimeoutRequest(); @@ -296,7 +296,7 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { /// @dev Only callable by the contract owner /// @dev Watcher signs on following digest for validation on switchboard: /// @dev keccak256(abi.encode(switchboard, root)) - function finalized(bytes32 payloadId_, bytes calldata signature_) external onlyOwner { + function finalized(bytes32 payloadId_, bytes calldata signature_) external onlyRole(WATCHER_ROLE) { watcherSignatures[payloadId_] = signature_; emit Finalized(payloadId_, asyncRequests[payloadId_], signature_); } @@ -304,7 +304,7 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { /// @notice Resolves multiple promises with their return data /// @param resolvedPromises_ Array of resolved promises and their return data /// @dev Only callable by the contract owner - function resolvePromises(ResolvedPromises[] calldata resolvedPromises_) external onlyOwner { + function resolvePromises(ResolvedPromises[] calldata resolvedPromises_) external onlyRole(WATCHER_ROLE) { for (uint256 i = 0; i < resolvedPromises_.length; i++) { // Get the array of promise addresses for this payload AsyncRequest memory asyncRequest_ = asyncRequests[resolvedPromises_[i].payloadId]; @@ -327,7 +327,7 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { } // wait till expiry time to assign fees - function markRevert(bytes32 payloadId_, bool isRevertingOnchain_) external onlyOwner { + function markRevert(bytes32 payloadId_, bool isRevertingOnchain_) external onlyRole(WATCHER_ROLE) { AsyncRequest memory asyncRequest_ = asyncRequests[payloadId_]; address[] memory next = asyncRequest_.next; @@ -370,7 +370,7 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { // ================== On-Chain Inbox ================== - function callAppGateways(CallFromInboxParams[] calldata params_) external onlyOwner { + function callAppGateways(CallFromInboxParams[] calldata params_) external onlyRole(WATCHER_ROLE) { for (uint256 i = 0; i < params_.length; i++) { if (appGatewayCalled[params_[i].callId]) revert AppGatewayAlreadyCalled(); if (!isValidInboxCaller[params_[i].appGateway][params_[i].chainSlug][params_[i].plug]) diff --git a/contracts/protocol/watcherPrecompile/WatcherPrecompileConfig.sol b/contracts/protocol/watcherPrecompile/WatcherPrecompileConfig.sol index e90f196a..a14631dd 100644 --- a/contracts/protocol/watcherPrecompile/WatcherPrecompileConfig.sol +++ b/contracts/protocol/watcherPrecompile/WatcherPrecompileConfig.sol @@ -62,7 +62,7 @@ abstract contract WatcherPrecompileConfig is WatcherPrecompileLimits { /// @param configs_ Array of configurations containing app gateway, network, plug, and switchboard details /// @dev Only callable by the contract owner /// @dev This helps in verifying that plugs are called by respective app gateways - function setAppGateways(AppGatewayConfig[] calldata configs_) external onlyOwner { + function setAppGateways(AppGatewayConfig[] calldata configs_) external onlyRole(WATCHER_ROLE) { for (uint256 i = 0; i < configs_.length; i++) { // Store the plug configuration for this network and plug _plugConfigs[configs_[i].chainSlug][configs_[i].plug] = PlugConfig({ diff --git a/contracts/protocol/watcherPrecompile/WatcherPrecompileLimits.sol b/contracts/protocol/watcherPrecompile/WatcherPrecompileLimits.sol index df8f0f54..284d012c 100644 --- a/contracts/protocol/watcherPrecompile/WatcherPrecompileLimits.sol +++ b/contracts/protocol/watcherPrecompile/WatcherPrecompileLimits.sol @@ -1,17 +1,18 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.21; -import {Ownable} from "solady/auth/Ownable.sol"; +import {AccessControl} from "../utils/AccessControl.sol"; import {Gauge} from "../utils/Gauge.sol"; import {LimitParams, UpdateLimitParams} from "../utils/common/Structs.sol"; import {AddressResolverUtil} from "../utils/AddressResolverUtil.sol"; import {QUERY, FINALIZE, SCHEDULE} from "../utils/common/Constants.sol"; import "../../interfaces/IWatcherPrecompile.sol"; +import {WATCHER_ROLE} from "../utils/common/AccessRoles.sol"; abstract contract WatcherPrecompileLimits is Gauge, AddressResolverUtil, - Ownable, + AccessControl, IWatcherPrecompile { /// @notice Number of decimals used in limit calculations diff --git a/script/CheckDepositedFees.s.sol b/script/CheckDepositedFees.s.sol index 70934724..6d102510 100644 --- a/script/CheckDepositedFees.s.sol +++ b/script/CheckDepositedFees.s.sol @@ -11,7 +11,7 @@ contract CheckDepositedFees is Script { function run() external { vm.createSelectFork(vm.envString("EVMX_RPC")); FeesManager feesManager = FeesManager(payable(vm.envAddress("FEES_MANAGER"))); - address appGateway = vm.envAddress("APP_GATEWAY"); + address appGateway = address(0x31000ca8d07a26640cA16f1af1276C179A4F4741); (uint256 deposited, uint256 blocked) = feesManager.appGatewayFeeBalances( appGateway, diff --git a/test/SetupTest.t.sol b/test/SetupTest.t.sol index 513c7ed0..216ca823 100644 --- a/test/SetupTest.t.sol +++ b/test/SetupTest.t.sol @@ -139,6 +139,9 @@ contract SetupTest is Test { addressResolver = AddressResolver(address(addressResolverProxy)); watcherPrecompile = WatcherPrecompile(address(watcherPrecompileProxy)); + hoax(watcherEOA); + watcherPrecompile.grantRole(WATCHER_ROLE, watcherEOA); + hoax(watcherEOA); addressResolver.setWatcherPrecompile(address(watcherPrecompile)); } From fab3f691c1c1137d23e28c363fe6888b77089cd5 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Fri, 21 Feb 2025 15:44:10 +0400 Subject: [PATCH 110/186] script: grant watcher role to relayers --- hardhat-scripts/constants/relayers.ts | 22 ++++ hardhat-scripts/deploy/2.roles.ts | 153 +++++++++++++++++--------- 2 files changed, 121 insertions(+), 54 deletions(-) create mode 100644 hardhat-scripts/constants/relayers.ts diff --git a/hardhat-scripts/constants/relayers.ts b/hardhat-scripts/constants/relayers.ts new file mode 100644 index 00000000..1cbee517 --- /dev/null +++ b/hardhat-scripts/constants/relayers.ts @@ -0,0 +1,22 @@ +export const relayerAddressList = [ + "0x59D24CD3A0b2b646F980A62DCb0aA4115506FFc9", + "0x762783712FD12231601d6d8591F3a5718812D534", + "0x9f5C9941306E7B57583E99033BedB7eA7889EEA4", + "0xd35F262d6f2D3F6D610bAf6635dE57c349ca83A1", + "0xce6b9c352f864515d7E8BBEA67d80d18245937F2", + "0xE651eDb3F16D9e6b1145ae5eee388f0e48D2d44b", + "0xc176E88dE45747743699fAeA58814Ce98a2faC2D", + "0x88220692264EEc280Bd5AaF9278CdE0737Feb2D6", + "0x2d68551354226c7321130f122055F049F8F67791", + "0xA7C89619ceaC009a23c6C3bC5F74d41BBaC68fD1", + "0x7893D79718860DF30e5Fd21AAA6Be05edD22465D", + "0x6386c83e994331c6a41A4420294D130930AEDF9e", + "0xfF33A0afc88CbF48C9DB31Fc2D2EC2F36D598184", + "0xB756B6D986eE448433542A60A1f590EE3B0DFCda", + "0x76943F947D5622624444aeFF135a5121d6732299", + "0x049B750045fdE15F347aF9E86FB80dD879C848ea", + "0x9c653569C32473F40210495128BB5A40ef10c65B", + "0x0291a40beF28E3606b8208a665F900d141E9A8B3", + "0x2e498dFB44CC79D2ef80Afd7C4439BEC8822E216", + "0x049E701A690E885467E54A1B0595f90BDc8324B0" +] \ No newline at end of file diff --git a/hardhat-scripts/deploy/2.roles.ts b/hardhat-scripts/deploy/2.roles.ts index ba3dd802..5e54711b 100644 --- a/hardhat-scripts/deploy/2.roles.ts +++ b/hardhat-scripts/deploy/2.roles.ts @@ -10,9 +10,10 @@ dotenvConfig(); import { Wallet } from "ethers"; import { ethers } from "hardhat"; import dev_addresses from "../../deployments/dev_addresses.json"; -import { chains, watcher } from "../config"; -import { ChainAddressesObj } from "../constants"; +import { chains, EVMX_CHAIN_ID, watcher } from "../config"; +import { ChainAddressesObj, EVMxCoreContracts } from "../constants"; import { getInstance, getProviderFromChainSlug, getRoleHash } from "../utils"; +import { relayerAddressList } from "../constants/relayers"; export const REQUIRED_ROLES = { FastSwitchboard: [ROLES.WATCHER_ROLE, ROLES.RESCUE_ROLE], @@ -21,63 +22,107 @@ export const REQUIRED_ROLES = { ContractFactoryPlug: [ROLES.RESCUE_ROLE], }; +async function setRoleForContract( + contractName: CORE_CONTRACTS | EVMxCoreContracts, + contractAddress: string | number, + targetAddress: string, + roleName: string, + signer: Wallet, + chain: number +) { + let contract = await getInstance(contractName, contractAddress.toString()); + contract = contract.connect(signer); + + console.log(`checking ${roleName} role for ${contractName} on ${chain}`); + const roleHash = getRoleHash(roleName); + const hasRole = await contract.callStatic["hasRole(bytes32,address)"]( + roleHash, + targetAddress, + { + from: signer.address, + } + ); + + if (!hasRole) { + let tx = await contract.grantRole(roleHash, targetAddress); + console.log( + `granting ${roleName} role to ${targetAddress} for ${contractName}`, + chain, + "txHash: ", + tx.hash + ); + await tx.wait(); + } +} + +async function getSigner(chain: number) { + const providerInstance = getProviderFromChainSlug(chain); + const signer: Wallet = new ethers.Wallet( + process.env.SOCKET_SIGNER_KEY as string, + providerInstance + ); + return signer; +} + + +async function setRolesForOnChain(chain: number, addresses: DeploymentAddresses) { + const chainAddresses: ChainAddressesObj = (addresses[chain] ?? {}) as ChainAddressesObj; + const signer = await getSigner(chain); + + for (const [contractName, roles] of Object.entries(REQUIRED_ROLES)) { + const contractAddress = chainAddresses[contractName as keyof ChainAddressesObj]; + if (!contractAddress) continue; + + for (const roleName of roles) { + const targetAddress = + contractName === CORE_CONTRACTS.FastSwitchboard && roleName === ROLES.WATCHER_ROLE + ? watcher + : signer.address; + + + await setRoleForContract( + contractName as CORE_CONTRACTS, + contractAddress, + targetAddress, + roleName, + signer, + chain + ); + } + } +} + +async function setRolesForEVMx(addresses: DeploymentAddresses) { + const chainAddresses: ChainAddressesObj = (addresses[EVMX_CHAIN_ID] ?? {}) as ChainAddressesObj; + const signer = await getSigner(EVMX_CHAIN_ID); + + const contractAddress = chainAddresses[EVMxCoreContracts.WatcherPrecompile]; + if (!contractAddress) return; + + for (const relayerAddress of relayerAddressList) { + console.log(`setting WATCHER_ROLE for ${relayerAddress} on EVMX`); + await setRoleForContract( + EVMxCoreContracts.WatcherPrecompile, + contractAddress, + relayerAddress, + ROLES.WATCHER_ROLE, + signer, + EVMX_CHAIN_ID + ); + } +} + export const main = async () => { - let addresses: DeploymentAddresses; try { console.log("Setting Roles"); - addresses = dev_addresses as unknown as DeploymentAddresses; + const addresses = dev_addresses as unknown as DeploymentAddresses; - for (const chain of chains) { - let chainAddresses: ChainAddressesObj = (addresses[chain] ?? - {}) as ChainAddressesObj; - const providerInstance = getProviderFromChainSlug(chain); - const signer: Wallet = new ethers.Wallet( - process.env.SOCKET_SIGNER_KEY as string, - providerInstance - ); + console.log("Setting Roles for EVMx"); + await setRolesForEVMx(addresses); - for (const [contractName, roles] of Object.entries(REQUIRED_ROLES)) { - const contractAddress = - chainAddresses[contractName as keyof ChainAddressesObj]; - if (!contractAddress) continue; - - let contract = await getInstance( - contractName as CORE_CONTRACTS, - String(contractAddress) - ); - contract = contract.connect(signer); - - for (const roleName of roles) { - console.log( - `checking ${roleName} role for ${contractName} on ${chain}` - ); - const targetAddress = - contractName === CORE_CONTRACTS.FastSwitchboard && - roleName === ROLES.WATCHER_ROLE - ? watcher - : signer.address; - - const roleHash = getRoleHash(roleName); - const hasRole = await contract.callStatic["hasRole(bytes32,address)"]( - roleHash, - targetAddress, - { - from: signer.address, - } - ); - - if (!hasRole) { - let tx = await contract.grantRole(roleHash, targetAddress); - console.log( - `granting ${roleName} role to ${targetAddress} for ${contractName}`, - chain, - "txHash: ", - tx.hash - ); - await tx.wait(); - } - } - } + console.log("Setting Roles for On Chain"); + for (const chain of chains) { + await setRolesForOnChain(chain, addresses); } } catch (error) { console.log("Error:", error); From cc30148a312621bab2e776a033d48d0dd1657b5e Mon Sep 17 00:00:00 2001 From: Rookmate <14072042+rookmate@users.noreply.github.com> Date: Fri, 21 Feb 2025 11:50:14 +0000 Subject: [PATCH 111/186] Re-add env CheckDepositedFees.s.sol --- script/CheckDepositedFees.s.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/script/CheckDepositedFees.s.sol b/script/CheckDepositedFees.s.sol index 6d102510..70934724 100644 --- a/script/CheckDepositedFees.s.sol +++ b/script/CheckDepositedFees.s.sol @@ -11,7 +11,7 @@ contract CheckDepositedFees is Script { function run() external { vm.createSelectFork(vm.envString("EVMX_RPC")); FeesManager feesManager = FeesManager(payable(vm.envAddress("FEES_MANAGER"))); - address appGateway = address(0x31000ca8d07a26640cA16f1af1276C179A4F4741); + address appGateway = vm.envAddress("APP_GATEWAY"); (uint256 deposited, uint256 blocked) = feesManager.appGatewayFeeBalances( appGateway, From a2f101d2df76e9faa051a616356137c745ad6d4e Mon Sep 17 00:00:00 2001 From: Rookmate <14072042+rookmate@users.noreply.github.com> Date: Fri, 21 Feb 2025 11:57:44 +0000 Subject: [PATCH 112/186] [WIP] Fix WithdrawFeesArbitrumFeesPlug RPCs --- script/counter/WithdrawFeesArbitrumFeesPlug.s.sol | 2 ++ 1 file changed, 2 insertions(+) diff --git a/script/counter/WithdrawFeesArbitrumFeesPlug.s.sol b/script/counter/WithdrawFeesArbitrumFeesPlug.s.sol index 2caf8a09..a96d7723 100644 --- a/script/counter/WithdrawFeesArbitrumFeesPlug.s.sol +++ b/script/counter/WithdrawFeesArbitrumFeesPlug.s.sol @@ -29,10 +29,12 @@ contract WithdrawFees is Script { console.log("Sender address:", sender); console.log("Sender balance", sender.balance); + vm.createSelectFork(vm.envString("EVMX_RPC")); vm.startBroadcast(privateKey); appGateway.withdrawFeeTokens(421614, ETH_ADDRESS, availableFees, sender); console.log("Withdrew:", availableFees); + vm.createSelectFork(vm.envString("ARBITRUM_SEPOLIA_RPC")); console.log("Sender balance", sender.balance); } } From 58d62d330e0ebc8f6d8b0c1c886c4df32272426e Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Fri, 21 Feb 2025 16:16:49 +0400 Subject: [PATCH 113/186] fix: roles script --- hardhat-scripts/deploy/2.roles.ts | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/hardhat-scripts/deploy/2.roles.ts b/hardhat-scripts/deploy/2.roles.ts index 5e54711b..687cee9b 100644 --- a/hardhat-scripts/deploy/2.roles.ts +++ b/hardhat-scripts/deploy/2.roles.ts @@ -44,7 +44,9 @@ async function setRoleForContract( ); if (!hasRole) { - let tx = await contract.grantRole(roleHash, targetAddress); + let tx = await contract.grantRole(roleHash, targetAddress, { + ...getOverrides(chain), + }); console.log( `granting ${roleName} role to ${targetAddress} for ${contractName}`, chain, @@ -55,10 +57,10 @@ async function setRoleForContract( } } -async function getSigner(chain: number) { +async function getSigner(chain: number, isWatcher: boolean = false) { const providerInstance = getProviderFromChainSlug(chain); const signer: Wallet = new ethers.Wallet( - process.env.SOCKET_SIGNER_KEY as string, + isWatcher ? process.env.WATCHER_PRIVATE_KEY as string : process.env.SOCKET_SIGNER_KEY as string, providerInstance ); return signer; @@ -94,7 +96,7 @@ async function setRolesForOnChain(chain: number, addresses: DeploymentAddresses) async function setRolesForEVMx(addresses: DeploymentAddresses) { const chainAddresses: ChainAddressesObj = (addresses[EVMX_CHAIN_ID] ?? {}) as ChainAddressesObj; - const signer = await getSigner(EVMX_CHAIN_ID); + const signer = await getSigner(EVMX_CHAIN_ID, true); const contractAddress = chainAddresses[EVMxCoreContracts.WatcherPrecompile]; if (!contractAddress) return; From 1a6c9bcf0ba34d4f0c39175b0fb6274ee67cd45e Mon Sep 17 00:00:00 2001 From: Rookmate <14072042+rookmate@users.noreply.github.com> Date: Fri, 21 Feb 2025 13:09:32 +0000 Subject: [PATCH 114/186] [WIP] Take into account ArbSep gas price WithdrawFeesArbitrumFeesPlug --- .../WithdrawFeesArbitrumFeesPlug.s.sol | 38 ++++++++++++++----- 1 file changed, 29 insertions(+), 9 deletions(-) diff --git a/script/counter/WithdrawFeesArbitrumFeesPlug.s.sol b/script/counter/WithdrawFeesArbitrumFeesPlug.s.sol index a96d7723..0c6ee9c0 100644 --- a/script/counter/WithdrawFeesArbitrumFeesPlug.s.sol +++ b/script/counter/WithdrawFeesArbitrumFeesPlug.s.sol @@ -9,6 +9,7 @@ import {CounterAppGateway} from "../../contracts/apps/counter/CounterAppGateway. contract WithdrawFees is Script { function run() external { + // EVMX Check available fees vm.createSelectFork(vm.envString("EVMX_RPC")); FeesManager feesManager = FeesManager(payable(vm.envAddress("FEES_MANAGER"))); address appGatewayAddress = vm.envAddress("APP_GATEWAY"); @@ -22,20 +23,39 @@ contract WithdrawFees is Script { console.log("Available fees:", availableFees); if (availableFees > 0) { + // Switch to Arbitrum Sepolia to get gas price vm.createSelectFork(vm.envString("ARBITRUM_SEPOLIA_RPC")); - uint256 privateKey = vm.envUint("PRIVATE_KEY"); address sender = vm.addr(privateKey); - console.log("Sender address:", sender); - console.log("Sender balance", sender.balance); - vm.createSelectFork(vm.envString("EVMX_RPC")); - vm.startBroadcast(privateKey); + // Gas price from Arbitrum + uint256 arbitrumGasPrice = block.basefee + 0.1 gwei; + uint256 gasLimit = 300000; // Estimate + uint256 estimatedGasCost = gasLimit * arbitrumGasPrice; - appGateway.withdrawFeeTokens(421614, ETH_ADDRESS, availableFees, sender); - console.log("Withdrew:", availableFees); - vm.createSelectFork(vm.envString("ARBITRUM_SEPOLIA_RPC")); - console.log("Sender balance", sender.balance); + console.log("Arbitrum gas price (wei):", arbitrumGasPrice); + console.log("Gas limit:", gasLimit); + console.log("Estimated gas cost:", estimatedGasCost); + + // Calculate amount to withdraw + uint256 amountToWithdraw = availableFees > estimatedGasCost + ? availableFees - estimatedGasCost + : 0; + + if (amountToWithdraw > 0) { + // Switch back to EVMX to perform withdrawal + vm.createSelectFork(vm.envString("EVMX_RPC")); + vm.startBroadcast(privateKey); + + console.log("Withdrawing amount:", amountToWithdraw); + appGateway.withdrawFeeTokens(421614, ETH_ADDRESS, amountToWithdraw, sender); + + // Switch back to Arbitrum Sepolia to check final balance + vm.createSelectFork(vm.envString("ARBITRUM_SEPOLIA_RPC")); + console.log("Final sender balance:", sender.balance); + } else { + console.log("Available fees less than estimated gas cost"); + } } } } From c4c5c7e92a32168c41f7732b6931aab0bbb33a88 Mon Sep 17 00:00:00 2001 From: Rookmate <14072042+rookmate@users.noreply.github.com> Date: Fri, 21 Feb 2025 13:27:04 +0000 Subject: [PATCH 115/186] Fix WithdrawFees script --- script/counter/WithdrawFeesArbitrumFeesPlug.s.sol | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/script/counter/WithdrawFeesArbitrumFeesPlug.s.sol b/script/counter/WithdrawFeesArbitrumFeesPlug.s.sol index 0c6ee9c0..098f58bc 100644 --- a/script/counter/WithdrawFeesArbitrumFeesPlug.s.sol +++ b/script/counter/WithdrawFeesArbitrumFeesPlug.s.sol @@ -29,8 +29,8 @@ contract WithdrawFees is Script { address sender = vm.addr(privateKey); // Gas price from Arbitrum - uint256 arbitrumGasPrice = block.basefee + 0.1 gwei; - uint256 gasLimit = 300000; // Estimate + uint256 arbitrumGasPrice = block.basefee + 0.1 gwei; // With buffer + uint256 gasLimit = 5_000_000; // Estimate uint256 estimatedGasCost = gasLimit * arbitrumGasPrice; console.log("Arbitrum gas price (wei):", arbitrumGasPrice); @@ -46,9 +46,9 @@ contract WithdrawFees is Script { // Switch back to EVMX to perform withdrawal vm.createSelectFork(vm.envString("EVMX_RPC")); vm.startBroadcast(privateKey); - console.log("Withdrawing amount:", amountToWithdraw); appGateway.withdrawFeeTokens(421614, ETH_ADDRESS, amountToWithdraw, sender); + vm.stopBroadcast(); // Switch back to Arbitrum Sepolia to check final balance vm.createSelectFork(vm.envString("ARBITRUM_SEPOLIA_RPC")); From 2d16f12041d151e2af0dc94015a0c54ac3b7b599 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Fri, 21 Feb 2025 17:41:17 +0400 Subject: [PATCH 116/186] doc: code guidelines --- README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/README.md b/README.md index 8dd5efee..dd8337b0 100644 --- a/README.md +++ b/README.md @@ -7,3 +7,13 @@ SOCKET Protocol is the first chain-abstraction protocol, enabling developers to SOCKET is a chain-abstraction protocol, not a network(chain/rollup). Using a combination of offchain agents(watchers, transmitters) and onchain contracts(switchboards) it enables application-builders to build truly chain-abstracted protocols. Find more information at [docs](https://docs.socket.tech) + +# Code Guidelines: + +- always inherit at the end +- always add storage to Storage contracts +- Storage contracts should have gaps before and after +- update gaps after every change +- update version after every change +- never remove code +- inherited contracts should have gaps at the end to avoid storage collision From 61ba571437950a268d77bd48d7cbcd08dff22acb Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Sat, 22 Feb 2025 01:11:48 +0400 Subject: [PATCH 117/186] feat: execution status --- contracts/interfaces/ISocket.sol | 6 +++++ contracts/mock/MockSocket.sol | 10 ++++++-- contracts/protocol/socket/Socket.sol | 25 +++++++++++++------ .../watcherPrecompile/WatcherPrecompile.sol | 2 +- 4 files changed, 33 insertions(+), 10 deletions(-) diff --git a/contracts/interfaces/ISocket.sol b/contracts/interfaces/ISocket.sol index 5727abee..60729a00 100644 --- a/contracts/interfaces/ISocket.sol +++ b/contracts/interfaces/ISocket.sol @@ -16,6 +16,12 @@ interface ISocket { */ event ExecutionSuccess(bytes32 payloadId, bytes returnData); + /** + * @notice emits the status of payload after external call + * @param payloadId msg id which is executed + */ + event ExecutionFailed(bytes32 payloadId, bytes returnData); + /** * @notice emits the config set by a plug for a remoteChainSlug * @param plug address of plug on current chain diff --git a/contracts/mock/MockSocket.sol b/contracts/mock/MockSocket.sol index 11ff3930..1ffdbd03 100644 --- a/contracts/mock/MockSocket.sol +++ b/contracts/mock/MockSocket.sol @@ -61,17 +61,23 @@ contract MockSocket is ISocket { */ error LowGasLimit(); error InvalidSlug(); - error ExecutionFailed(); //////////////////////////////////////////////////////////// ////////////////////// State Vars ////////////////////////// //////////////////////////////////////////////////////////// uint64 public callCounter; uint32 public chainSlug; + + enum ExecutionStatus { + NotExecuted, + Executed, + Reverted + } + /** * @dev keeps track of whether a payload has been executed or not using payload id */ - mapping(bytes32 => bool) public payloadExecuted; + mapping(bytes32 => ExecutionStatus) public payloadExecuted; constructor(uint32 chainSlug_, address, address, address, string memory) { chainSlug = chainSlug_; diff --git a/contracts/protocol/socket/Socket.sol b/contracts/protocol/socket/Socket.sol index 7de9a6ff..67720475 100644 --- a/contracts/protocol/socket/Socket.sol +++ b/contracts/protocol/socket/Socket.sol @@ -23,7 +23,7 @@ contract Socket is SocketUtils { /** * @dev Error emitted when a payload has already been executed */ - error PayloadAlreadyExecuted(); + error PayloadAlreadyExecuted(ExecutionStatus status); /** * @dev Error emitted when the executor is not valid */ @@ -39,7 +39,6 @@ contract Socket is SocketUtils { */ error LowGasLimit(); error InvalidSlug(); - error ExecutionFailed(); error DeadlinePassed(); //////////////////////////////////////////////////////////// @@ -47,10 +46,16 @@ contract Socket is SocketUtils { //////////////////////////////////////////////////////////// uint64 public callCounter; + enum ExecutionStatus { + NotExecuted, + Executed, + Reverted + } + /** * @dev keeps track of whether a payload has been executed or not using payload id */ - mapping(bytes32 => bool) public payloadExecuted; + mapping(bytes32 => ExecutionStatus) public payloadExecuted; constructor( uint32 chainSlug_, @@ -96,9 +101,10 @@ contract Socket is SocketUtils { bytes memory transmitterSignature_ ) external payable returns (bytes memory) { // make sure payload is not executed already - if (payloadExecuted[params_.payloadId]) revert PayloadAlreadyExecuted(); + if (payloadExecuted[params_.payloadId] != ExecutionStatus.NotExecuted) + revert PayloadAlreadyExecuted(payloadExecuted[params_.payloadId]); // update state to make sure no reentrancy - payloadExecuted[params_.payloadId] = true; + payloadExecuted[params_.payloadId] = ExecutionStatus.Executed; if (params_.deadline < block.timestamp) revert DeadlinePassed(); @@ -165,8 +171,13 @@ contract Socket is SocketUtils { value: msg.value }(payload_); - if (!success) revert ExecutionFailed(); - emit ExecutionSuccess(payloadId_, returnData); + if (!success) { + payloadExecuted[payloadId_] = ExecutionStatus.Reverted; + emit ExecutionFailed(payloadId_, returnData); + } else { + emit ExecutionSuccess(payloadId_, returnData); + } + return returnData; } diff --git a/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol b/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol index 3ab83ee4..9f12c7d9 100644 --- a/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol +++ b/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol @@ -320,7 +320,7 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { resolvedPromises_[i].returnData[j] ); - if (!success) continue; + if (!success) break; emit PromiseResolved(resolvedPromises_[i].payloadId, success, next[j]); } } From 68195ffd77bf20401e07ba4dad8ef7c4a934c093 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Sat, 22 Feb 2025 01:26:42 +0400 Subject: [PATCH 118/186] gea: rename root to digest --- contracts/interfaces/ISwitchboard.sol | 6 +-- contracts/interfaces/IWatcherPrecompile.sol | 14 +++--- contracts/mock/MockSocket.sol | 8 ++- contracts/mock/MockWatcherPrecompile.sol | 8 +-- .../app-gateway/BatchAsync.sol | 2 +- .../app-gateway/DeliveryHelper.sol | 8 +-- .../app-gateway/FeesManager.sol | 4 +- contracts/protocol/socket/Socket.sol | 12 +++-- contracts/protocol/socket/SocketBatcher.sol | 2 +- .../socket/switchboard/FastSwitchboard.sol | 34 ++++++------- contracts/protocol/utils/common/Structs.sol | 6 +-- .../watcherPrecompile/WatcherPrecompile.sol | 50 +++++++++++-------- test/DeliveryHelper.t.sol | 16 +++--- test/SetupTest.t.sol | 4 +- 14 files changed, 96 insertions(+), 78 deletions(-) diff --git a/contracts/interfaces/ISwitchboard.sol b/contracts/interfaces/ISwitchboard.sol index ac822b4f..f2a82559 100644 --- a/contracts/interfaces/ISwitchboard.sol +++ b/contracts/interfaces/ISwitchboard.sol @@ -9,11 +9,11 @@ pragma solidity ^0.8.21; interface ISwitchboard { /** * @notice Checks if a packet can be allowed to go through the switchboard. - * @param root_ the packet root. + * @param digest_ the packet digest. * @param packetId_ The unique identifier for the packet. * @return A boolean indicating whether the packet is allowed to go through the switchboard or not. */ - function allowPacket(bytes32 root_, bytes32 packetId_) external view returns (bool); + function allowPacket(bytes32 digest_, bytes32 packetId_) external view returns (bool); - function attest(bytes32 payloadId_, bytes32 root_, bytes calldata signature_) external; + function attest(bytes32 payloadId_, bytes32 digest_, bytes calldata signature_) external; } diff --git a/contracts/interfaces/IWatcherPrecompile.sol b/contracts/interfaces/IWatcherPrecompile.sol index 926c6507..e9671c4f 100644 --- a/contracts/interfaces/IWatcherPrecompile.sol +++ b/contracts/interfaces/IWatcherPrecompile.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: Unlicense pragma solidity ^0.8.21; -import {PayloadDetails, AsyncRequest, FinalizeParams, PayloadRootParams, AppGatewayConfig, PlugConfig, ResolvedPromises} from "../protocol/utils/common/Structs.sol"; +import {PayloadDetails, AsyncRequest, FinalizeParams, PayloadDigestParams, AppGatewayConfig, PlugConfig, ResolvedPromises} from "../protocol/utils/common/Structs.sol"; /// @title IWatcherPrecompile /// @notice Interface for the Watcher Precompile system that handles payload verification and execution @@ -36,11 +36,11 @@ interface IWatcherPrecompile { /// @notice Finalizes a payload execution request /// @param params_ Parameters needed for finalization /// @return payloadId The unique identifier for the request - /// @return root The merkle root of the payload parameters + /// @return digest The merkle digest of the payload parameters function finalize( address originAppGateway_, FinalizeParams memory params_ - ) external returns (bytes32 payloadId, bytes32 root); + ) external returns (bytes32 payloadId, bytes32 digest); /// @notice Creates a new query request /// @param chainSlug_ The identifier of the destination network @@ -83,10 +83,10 @@ interface IWatcherPrecompile { /// @param timeoutId_ The unique identifier for the timeout function resolveTimeout(bytes32 timeoutId_) external; - /// @notice Calculates the root hash for payload parameters - /// @param params_ The payload parameters used to calculate the root - /// @return root The calculated merkle root hash - function getRoot(PayloadRootParams memory params_) external pure returns (bytes32 root); + /// @notice Calculates the Digest hash for payload parameters + /// @param params_ The payload parameters used to calculate the digest + /// @return digest The calculated merkle digest hash + function getDigest(PayloadDigestParams memory params_) external pure returns (bytes32 digest); function setMaxTimeoutDelayInSeconds(uint256 maxTimeoutDelayInSeconds_) external; diff --git a/contracts/mock/MockSocket.sol b/contracts/mock/MockSocket.sol index 1ffdbd03..d6a4c96e 100644 --- a/contracts/mock/MockSocket.sol +++ b/contracts/mock/MockSocket.sol @@ -126,9 +126,13 @@ contract MockSocket is ISocket { ////////////////// INTERNAL FUNCS ////////////////////// //////////////////////////////////////////////////////// - function _verify(bytes32 root_, bytes32 payloadId_, ISwitchboard switchboard__) internal view { + function _verify( + bytes32 digest_, + bytes32 payloadId_, + ISwitchboard switchboard__ + ) internal view { // NOTE: is the the first un-trusted call in the system, another one is Plug.call - if (!switchboard__.allowPacket(root_, payloadId_)) revert VerificationFailed(); + if (!switchboard__.allowPacket(digest_, payloadId_)) revert VerificationFailed(); } /** diff --git a/contracts/mock/MockWatcherPrecompile.sol b/contracts/mock/MockWatcherPrecompile.sol index aa1ad265..655fe32e 100644 --- a/contracts/mock/MockWatcherPrecompile.sol +++ b/contracts/mock/MockWatcherPrecompile.sol @@ -5,7 +5,7 @@ import "../interfaces/IAppGateway.sol"; import "../interfaces/IWatcherPrecompile.sol"; import "../interfaces/IPromise.sol"; -import {PayloadRootParams, AsyncRequest, FinalizeParams, TimeoutRequest, CallFromInboxParams, PlugConfig, ResolvedPromises, AppGatewayConfig} from "../protocol/utils/common/Structs.sol"; +import {PayloadDigestParams, AsyncRequest, FinalizeParams, TimeoutRequest, CallFromInboxParams, PlugConfig, ResolvedPromises, AppGatewayConfig} from "../protocol/utils/common/Structs.sol"; import {QUERY, FINALIZE, SCHEDULE} from "../protocol/utils/common/Constants.sol"; import {TimeoutDelayTooLarge, TimeoutAlreadyResolved, InvalidInboxCaller, ResolvingTimeoutTooEarly, CallFailed, AppGatewayAlreadyCalled} from "../protocol/utils/common/Errors.sol"; import "solady/utils/ERC1967Factory.sol"; @@ -123,11 +123,11 @@ contract MockWatcherPrecompile { /// @notice Finalizes a payload request, requests the watcher to release the signatures to execute on chain /// @param params_ The finalization parameters /// @return payloadId The unique identifier for the finalized request - /// @return root The merkle root of the payload parameters + /// @return digest The merkle digest of the payload parameters function finalize( FinalizeParams memory params_ - ) external returns (bytes32 payloadId, bytes32 root) { - root = keccak256(abi.encode(block.timestamp)); + ) external returns (bytes32 payloadId, bytes32 digest) { + digest = keccak256(abi.encode(block.timestamp)); // Generate a unique payload ID by combining chain, target, and counter payloadId = encodePayloadId( params_.payloadDetails.chainSlug, diff --git a/contracts/protocol/payload-delivery/app-gateway/BatchAsync.sol b/contracts/protocol/payload-delivery/app-gateway/BatchAsync.sol index 43a34ddd..8a5a6903 100644 --- a/contracts/protocol/payload-delivery/app-gateway/BatchAsync.sol +++ b/contracts/protocol/payload-delivery/app-gateway/BatchAsync.sol @@ -45,7 +45,7 @@ abstract contract BatchAsync is QueueAsync { event PayloadAsyncRequested( bytes32 indexed asyncId, bytes32 indexed payloadId, - bytes32 indexed root, + bytes32 indexed digest, PayloadDetails payloadDetails ); diff --git a/contracts/protocol/payload-delivery/app-gateway/DeliveryHelper.sol b/contracts/protocol/payload-delivery/app-gateway/DeliveryHelper.sol index 650d622f..e0a85af0 100644 --- a/contracts/protocol/payload-delivery/app-gateway/DeliveryHelper.sol +++ b/contracts/protocol/payload-delivery/app-gateway/DeliveryHelper.sol @@ -143,7 +143,7 @@ contract DeliveryHelper is BatchAsync, Initializable { PayloadBatch storage payloadBatch_, address batchPromise_, bool isRead_ - ) internal returns (bytes32 payloadId, bytes32 root) { + ) internal returns (bytes32 payloadId, bytes32 digest) { payloadDetails_.next[1] = batchPromise_; if (isRead_) { payloadId = watcherPrecompile__().query( @@ -153,14 +153,14 @@ contract DeliveryHelper is BatchAsync, Initializable { payloadDetails_.next, payloadDetails_.payload ); - root = bytes32(0); + digest = bytes32(0); } else { FinalizeParams memory finalizeParams = FinalizeParams({ payloadDetails: payloadDetails_, asyncId: asyncId_, transmitter: payloadBatch_.winningBid.transmitter }); - (payloadId, root) = watcherPrecompile__().finalize( + (payloadId, digest) = watcherPrecompile__().finalize( payloadBatch_.appGateway, finalizeParams ); @@ -170,7 +170,7 @@ contract DeliveryHelper is BatchAsync, Initializable { payloadIdToBatchHash[payloadId] = asyncId_; payloadIdToPayloadDetails[payloadId] = payloadDetails_; - emit PayloadAsyncRequested(asyncId_, payloadId, root, payloadDetails_); + emit PayloadAsyncRequested(asyncId_, payloadId, digest, payloadDetails_); } function _processParallelCalls( diff --git a/contracts/protocol/payload-delivery/app-gateway/FeesManager.sol b/contracts/protocol/payload-delivery/app-gateway/FeesManager.sol index 50fbea34..8acf5997 100644 --- a/contracts/protocol/payload-delivery/app-gateway/FeesManager.sol +++ b/contracts/protocol/payload-delivery/app-gateway/FeesManager.sol @@ -250,7 +250,7 @@ contract FeesManager is IFeesManager, AddressResolverUtil, Ownable, Initializabl uint32 chainSlug_, address token_, address receiver_ - ) external returns (bytes32 payloadId, bytes32 root, PayloadDetails memory payloadDetails) { + ) external returns (bytes32 payloadId, bytes32 digest, PayloadDetails memory payloadDetails) { address transmitter = msg.sender; // Get all asyncIds for the transmitter uint256 totalFees = transmitterFees[transmitter][chainSlug_][token_]; @@ -273,7 +273,7 @@ contract FeesManager is IFeesManager, AddressResolverUtil, Ownable, Initializabl transmitter: transmitter }); - (payloadId, root) = watcherPrecompile__().finalize(address(this), finalizeParams); + (payloadId, digest) = watcherPrecompile__().finalize(address(this), finalizeParams); } function _createPayloadDetails( diff --git a/contracts/protocol/socket/Socket.sol b/contracts/protocol/socket/Socket.sol index 67720475..bd70a175 100644 --- a/contracts/protocol/socket/Socket.sol +++ b/contracts/protocol/socket/Socket.sol @@ -123,7 +123,7 @@ contract Socket is SocketUtils { ); // create packed payload - bytes32 root = _packPayload( + bytes32 digest = _packPayload( params_.payloadId, appGateway_, transmitter, @@ -136,7 +136,7 @@ contract Socket is SocketUtils { // verify payload was part of the packet and // authenticated by respective switchboard - _verify(root, params_.payloadId, ISwitchboard(switchboard)); + _verify(digest, params_.payloadId, ISwitchboard(switchboard)); // execute payload return @@ -147,9 +147,13 @@ contract Socket is SocketUtils { ////////////////// INTERNAL FUNCS ////////////////////// //////////////////////////////////////////////////////// - function _verify(bytes32 root_, bytes32 payloadId_, ISwitchboard switchboard__) internal view { + function _verify( + bytes32 digest_, + bytes32 payloadId_, + ISwitchboard switchboard__ + ) internal view { // NOTE: is the the first un-trusted call in the system, another one is Plug.call - if (!switchboard__.allowPacket(root_, payloadId_)) revert VerificationFailed(); + if (!switchboard__.allowPacket(digest_, payloadId_)) revert VerificationFailed(); } /** diff --git a/contracts/protocol/socket/SocketBatcher.sol b/contracts/protocol/socket/SocketBatcher.sol index 96371877..3b6d2869 100644 --- a/contracts/protocol/socket/SocketBatcher.sol +++ b/contracts/protocol/socket/SocketBatcher.sol @@ -30,7 +30,7 @@ contract SocketBatcher is Ownable { ) external payable returns (bytes memory) { ISwitchboard(params_.switchboard).attest( params_.payloadId, - params_.root, + params_.digest, params_.watcherSignature ); diff --git a/contracts/protocol/socket/switchboard/FastSwitchboard.sol b/contracts/protocol/socket/switchboard/FastSwitchboard.sol index 74e8451e..8d1cc668 100644 --- a/contracts/protocol/socket/switchboard/FastSwitchboard.sol +++ b/contracts/protocol/socket/switchboard/FastSwitchboard.sol @@ -9,15 +9,15 @@ import "./SwitchboardBase.sol"; * that enables packet attestations and watchers registration. */ contract FastSwitchboard is SwitchboardBase { - // used to track which watcher have attested a root - // watcher => root => isAttested + // used to track which watcher have attested a digest + // watcher => digest => isAttested mapping(bytes32 => bool) public isAttested; - // Error emitted when a root is already attested by a specific watcher. - // This is hit even if they are attesting a new proposalCount with same root. + // Error emitted when a digest is already attested by a specific watcher. + // This is hit even if they are attesting a new proposalCount with same digest. error AlreadyAttested(); error WatcherNotFound(); - event Attested(bytes32 payloadId, bytes32 root_, address watcher); + event Attested(bytes32 payloadId, bytes32 digest_, address watcher); /** * @dev Constructor function for the FastSwitchboard contract @@ -32,28 +32,28 @@ contract FastSwitchboard is SwitchboardBase { /** * @dev Function to attest a packet * @param payloadId_ Packet ID - * @param root_ Root of the packet + * @param digest_ Digest of the packet * @param signature_ Signature of the watcher - * @notice we are attesting a root uniquely identified with packetId and proposalCount. However, - * there can be multiple proposals for same root. To avoid need to re-attest for different proposals - * with same root, we are storing attestations against root instead of packetId and proposalCount. + * @notice we are attesting a digest uniquely identified with packetId and proposalCount. However, + * there can be multiple proposals for same digest. To avoid need to re-attest for different proposals + * with same digest, we are storing attestations against digest instead of packetId and proposalCount. */ - function attest(bytes32 payloadId_, bytes32 root_, bytes calldata signature_) external { - address watcher = _recoverSigner(keccak256(abi.encode(address(this), root_)), signature_); + function attest(bytes32 payloadId_, bytes32 digest_, bytes calldata signature_) external { + address watcher = _recoverSigner(keccak256(abi.encode(address(this), digest_)), signature_); - if (isAttested[root_]) revert AlreadyAttested(); + if (isAttested[digest_]) revert AlreadyAttested(); if (!_hasRole(WATCHER_ROLE, watcher)) revert WatcherNotFound(); - isAttested[root_] = true; - emit Attested(payloadId_, root_, watcher); + isAttested[digest_] = true; + emit Attested(payloadId_, digest_, watcher); } /** * @inheritdoc ISwitchboard */ - function allowPacket(bytes32 root_, bytes32) external view returns (bool) { - // root has enough attestations - if (isAttested[root_]) return true; + function allowPacket(bytes32 digest_, bytes32) external view returns (bool) { + // digest has enough attestations + if (isAttested[digest_]) return true; // not enough attestations and timeout not hit return false; diff --git a/contracts/protocol/utils/common/Structs.sol b/contracts/protocol/utils/common/Structs.sol index 72058e7c..20bcf5de 100644 --- a/contracts/protocol/utils/common/Structs.sol +++ b/contracts/protocol/utils/common/Structs.sol @@ -39,7 +39,7 @@ struct AsyncRequest { uint256 executionGasLimit; uint256 deadline; bytes32 asyncId; - bytes32 root; + bytes32 digest; bytes payload; address[] next; } @@ -79,7 +79,7 @@ struct DeployParams { struct AttestAndExecutePayloadParams { bytes32 payloadId; - bytes32 root; + bytes32 digest; address switchboard; address appGateway; address target; @@ -134,7 +134,7 @@ struct PayloadDetails { address[] next; } -struct PayloadRootParams { +struct PayloadDigestParams { address appGateway; address transmitter; address target; diff --git a/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol b/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol index 9f12c7d9..fc1000f0 100644 --- a/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol +++ b/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol @@ -6,7 +6,7 @@ import "../../interfaces/IAppGateway.sol"; import "../../interfaces/IPromise.sol"; import "../../interfaces/IFeesManager.sol"; import "solady/utils/Initializable.sol"; -import {PayloadRootParams, AsyncRequest, FinalizeParams, TimeoutRequest, CallFromInboxParams} from "../utils/common/Structs.sol"; +import {PayloadDigestParams, AsyncRequest, FinalizeParams, TimeoutRequest, CallFromInboxParams} from "../utils/common/Structs.sol"; import {TimeoutDelayTooLarge, TimeoutAlreadyResolved, InvalidInboxCaller, ResolvingTimeoutTooEarly, CallFailed, AppGatewayAlreadyCalled} from "../utils/common/Errors.sol"; /// @title WatcherPrecompile @@ -175,18 +175,18 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { /// @notice Finalizes a payload request, requests the watcher to release the signatures to execute on chain /// @param params_ The finalization parameters /// @return payloadId The unique identifier for the finalized request - /// @return root The merkle root of the payload parameters + /// @return digest The merkle digest of the payload parameters function finalize( address originAppGateway_, FinalizeParams memory params_ - ) external returns (bytes32 payloadId, bytes32 root) { + ) external returns (bytes32 payloadId, bytes32 digest) { // Generate a unique payload ID by combining chain, target, and counter payloadId = _encodeWritePayloadId( params_.payloadDetails.chainSlug, params_.payloadDetails.target ); - root = _finalize(payloadId, originAppGateway_, params_); + digest = _finalize(payloadId, originAppGateway_, params_); } function refinalize(bytes32 payloadId_, FinalizeParams memory params_) external { @@ -200,7 +200,7 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { bytes32 payloadId_, address originAppGateway_, FinalizeParams memory params_ - ) internal returns (bytes32 root) { + ) internal returns (bytes32 digest) { if (params_.transmitter == address(0)) revert InvalidTransmitter(); // The app gateway is the caller of this function @@ -219,8 +219,8 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { params_.payloadDetails.target ); - // Construct parameters for root calculation - PayloadRootParams memory rootParams_ = PayloadRootParams( + // Construct parameters for digest calculation + PayloadDigestParams memory digestParams_ = PayloadDigestParams( params_.payloadDetails.appGateway, params_.transmitter, params_.payloadDetails.target, @@ -231,8 +231,8 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { params_.payloadDetails.payload ); - // Calculate merkle root from payload parameters - root = getRoot(rootParams_); + // Calculate merkle digest from payload parameters + digest = getDigest(digestParams_); // Create and store the async request with all necessary details AsyncRequest memory asyncRequest = AsyncRequest( @@ -244,7 +244,7 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { params_.payloadDetails.executionGasLimit, block.timestamp + expiryTime, params_.asyncId, - root, + digest, params_.payloadDetails.payload, params_.payloadDetails.next ); @@ -290,13 +290,16 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { emit QueryRequested(chainSlug_, targetAddress_, payloadId, payload_); } - /// @notice Marks a request as finalized with a signature on root + /// @notice Marks a request as finalized with a signature on digest /// @param payloadId_ The unique identifier of the request /// @param signature_ The watcher's signature /// @dev Only callable by the contract owner /// @dev Watcher signs on following digest for validation on switchboard: - /// @dev keccak256(abi.encode(switchboard, root)) - function finalized(bytes32 payloadId_, bytes calldata signature_) external onlyRole(WATCHER_ROLE) { + /// @dev keccak256(abi.encode(switchboard, digest)) + function finalized( + bytes32 payloadId_, + bytes calldata signature_ + ) external onlyRole(WATCHER_ROLE) { watcherSignatures[payloadId_] = signature_; emit Finalized(payloadId_, asyncRequests[payloadId_], signature_); } @@ -304,7 +307,9 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { /// @notice Resolves multiple promises with their return data /// @param resolvedPromises_ Array of resolved promises and their return data /// @dev Only callable by the contract owner - function resolvePromises(ResolvedPromises[] calldata resolvedPromises_) external onlyRole(WATCHER_ROLE) { + function resolvePromises( + ResolvedPromises[] calldata resolvedPromises_ + ) external onlyRole(WATCHER_ROLE) { for (uint256 i = 0; i < resolvedPromises_.length; i++) { // Get the array of promise addresses for this payload AsyncRequest memory asyncRequest_ = asyncRequests[resolvedPromises_[i].payloadId]; @@ -327,7 +332,10 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { } // wait till expiry time to assign fees - function markRevert(bytes32 payloadId_, bool isRevertingOnchain_) external onlyRole(WATCHER_ROLE) { + function markRevert( + bytes32 payloadId_, + bool isRevertingOnchain_ + ) external onlyRole(WATCHER_ROLE) { AsyncRequest memory asyncRequest_ = asyncRequests[payloadId_]; address[] memory next = asyncRequest_.next; @@ -346,11 +354,11 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { } } - /// @notice Calculates the root hash of payload parameters + /// @notice Calculates the digest hash of payload parameters /// @param params_ The payload parameters - /// @return root The calculated merkle root - function getRoot(PayloadRootParams memory params_) public pure returns (bytes32 root) { - root = keccak256( + /// @return digest The calculated merkle digest + function getDigest(PayloadDigestParams memory params_) public pure returns (bytes32 digest) { + digest = keccak256( abi.encode( params_.payloadId, params_.appGateway, @@ -370,7 +378,9 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { // ================== On-Chain Inbox ================== - function callAppGateways(CallFromInboxParams[] calldata params_) external onlyRole(WATCHER_ROLE) { + function callAppGateways( + CallFromInboxParams[] calldata params_ + ) external onlyRole(WATCHER_ROLE) { for (uint256 i = 0; i < params_.length; i++) { if (appGatewayCalled[params_[i].callId]) revert AppGatewayAlreadyCalled(); if (!isValidInboxCaller[params_[i].appGateway][params_[i].chainSlug][params_[i].plug]) diff --git a/test/DeliveryHelper.t.sol b/test/DeliveryHelper.t.sol index 4702a879..626eb4ae 100644 --- a/test/DeliveryHelper.t.sol +++ b/test/DeliveryHelper.t.sol @@ -498,7 +498,7 @@ contract DeliveryHelperTest is SetupTest { SocketContracts memory socketConfig = getSocketConfig(payloadDetails.chainSlug); (, , , , , , uint256 deadline, , , ) = watcherPrecompile.asyncRequests(payloadId); - PayloadRootParams memory rootParams_ = PayloadRootParams( + PayloadDigestParams memory digestParams_ = PayloadDigestParams( payloadDetails.appGateway, transmitterEOA, payloadDetails.target, @@ -508,11 +508,11 @@ contract DeliveryHelperTest is SetupTest { deadline, payloadDetails.payload ); - bytes32 root = watcherPrecompile.getRoot(rootParams_); - - bytes32 digest = keccak256(abi.encode(address(socketConfig.switchboard), root)); - bytes memory watcherSig = _createSignature(digest, watcherPrivateKey); - return (watcherSig, root); + bytes32 digest = watcherPrecompile.getDigest(digestParams_); + + bytes32 sigDigest = keccak256(abi.encode(address(socketConfig.switchboard), digest)); + bytes memory watcherSig = _createSignature(sigDigest, watcherPrivateKey); + return (watcherSig, digest); } function createWithdrawPayloadDetail( @@ -614,12 +614,12 @@ contract DeliveryHelperTest is SetupTest { bytes32 payloadId_, PayloadDetails memory payloadDetails ) internal returns (bytes memory returnData) { - (bytes memory watcherSig, bytes32 root) = finalize(payloadId_, payloadDetails); + (bytes memory watcherSig, bytes32 digest) = finalize(payloadId_, payloadDetails); returnData = relayTx( payloadDetails.chainSlug, payloadId_, - root, + digest, payloadDetails, watcherSig ); diff --git a/test/SetupTest.t.sol b/test/SetupTest.t.sol index 216ca823..4f8da541 100644 --- a/test/SetupTest.t.sol +++ b/test/SetupTest.t.sol @@ -173,7 +173,7 @@ contract SetupTest is Test { function relayTx( uint32 chainSlug_, bytes32 payloadId, - bytes32 root, + bytes32 digest, PayloadDetails memory payloadDetails, bytes memory watcherSignature ) internal returns (bytes memory) { @@ -186,7 +186,7 @@ contract SetupTest is Test { vm.startPrank(transmitterEOA); AttestAndExecutePayloadParams memory params = AttestAndExecutePayloadParams({ switchboard: address(socketConfig.switchboard), - root: root, + digest: digest, watcherSignature: watcherSignature, payloadId: payloadId, appGateway: payloadDetails.appGateway, From b838b96e27af44f04f24691b622f504804befe05 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Sat, 22 Feb 2025 01:33:58 +0400 Subject: [PATCH 119/186] feat: watcher sign to proof --- contracts/interfaces/ISwitchboard.sol | 2 +- contracts/interfaces/IWatcherPrecompile.sol | 6 +-- contracts/mock/MockWatcherPrecompile.sol | 14 +++---- .../app-gateway/AuctionManager.sol | 2 +- contracts/protocol/socket/SocketBatcher.sol | 6 +-- .../socket/switchboard/FastSwitchboard.sol | 6 +-- contracts/protocol/utils/common/Errors.sol | 2 +- contracts/protocol/utils/common/Structs.sol | 2 +- .../watcherPrecompile/WatcherPrecompile.sol | 25 +++++------ hardhat-scripts/constants/relayers.ts | 42 +++++++++---------- hardhat-scripts/deploy/2.roles.ts | 19 +++++---- test/DeliveryHelper.t.sol | 2 +- test/SetupTest.t.sol | 4 +- 13 files changed, 65 insertions(+), 67 deletions(-) diff --git a/contracts/interfaces/ISwitchboard.sol b/contracts/interfaces/ISwitchboard.sol index f2a82559..394d4044 100644 --- a/contracts/interfaces/ISwitchboard.sol +++ b/contracts/interfaces/ISwitchboard.sol @@ -15,5 +15,5 @@ interface ISwitchboard { */ function allowPacket(bytes32 digest_, bytes32 packetId_) external view returns (bool); - function attest(bytes32 payloadId_, bytes32 digest_, bytes calldata signature_) external; + function attest(bytes32 payloadId_, bytes32 digest_, bytes calldata proof_) external; } diff --git a/contracts/interfaces/IWatcherPrecompile.sol b/contracts/interfaces/IWatcherPrecompile.sol index e9671c4f..ee1321c4 100644 --- a/contracts/interfaces/IWatcherPrecompile.sol +++ b/contracts/interfaces/IWatcherPrecompile.sol @@ -56,10 +56,10 @@ interface IWatcherPrecompile { bytes memory payload_ ) external returns (bytes32 payloadId); - /// @notice Marks a request as finalized with a signature + /// @notice Marks a request as finalized with a proof /// @param payloadId_ The unique identifier of the request - /// @param signature_ The watcher's signature - function finalized(bytes32 payloadId_, bytes calldata signature_) external; + /// @param proof_ The watcher's proof + function finalized(bytes32 payloadId_, bytes calldata proof_) external; /// @notice Finalizes multiple payload execution requests with a new transmitter /// @param payloadId_ The unique identifier of the request diff --git a/contracts/mock/MockWatcherPrecompile.sol b/contracts/mock/MockWatcherPrecompile.sol index 655fe32e..ea96329d 100644 --- a/contracts/mock/MockWatcherPrecompile.sol +++ b/contracts/mock/MockWatcherPrecompile.sol @@ -57,8 +57,8 @@ contract MockWatcherPrecompile { /// @notice Emitted when a request is finalized /// @param payloadId The unique identifier for the request /// @param asyncRequest The async request details - /// @param watcherSignature The signature from the watcher - event Finalized(bytes32 indexed payloadId, AsyncRequest asyncRequest, bytes watcherSignature); + /// @param proof The proof from the watcher + event Finalized(bytes32 indexed payloadId, AsyncRequest asyncRequest, bytes proof); /// @notice Emitted when a promise is resolved /// @param payloadId The unique identifier for the resolved promise @@ -120,7 +120,7 @@ contract MockWatcherPrecompile { // ================== Finalize functions ================== - /// @notice Finalizes a payload request, requests the watcher to release the signatures to execute on chain + /// @notice Finalizes a payload request, requests the watcher to release the proofs to execute on chain /// @param params_ The finalization parameters /// @return payloadId The unique identifier for the finalized request /// @return digest The merkle digest of the payload parameters @@ -169,12 +169,12 @@ contract MockWatcherPrecompile { emit QueryRequested(chainSlug, targetAddress, payloadId, payload); } - /// @notice Marks a request as finalized with a signature + /// @notice Marks a request as finalized with a proof /// @param payloadId_ The unique identifier of the request - /// @param signature_ The watcher's signature + /// @param proof_ The watcher's proof /// @dev Only callable by the contract owner - function finalized(bytes32 payloadId_, bytes calldata signature_) external { - emit Finalized(payloadId_, asyncRequests[payloadId_], signature_); + function finalized(bytes32 payloadId_, bytes calldata proof_) external { + emit Finalized(payloadId_, asyncRequests[payloadId_], proof_); } /// @notice Resolves multiple promises with their return data diff --git a/contracts/protocol/payload-delivery/app-gateway/AuctionManager.sol b/contracts/protocol/payload-delivery/app-gateway/AuctionManager.sol index 59bad963..17c555db 100644 --- a/contracts/protocol/payload-delivery/app-gateway/AuctionManager.sol +++ b/contracts/protocol/payload-delivery/app-gateway/AuctionManager.sol @@ -152,7 +152,7 @@ contract AuctionManager is AddressResolverUtil, Ownable, IAuctionManager, Initia function expireBid(bytes32 asyncId_) external onlyWatcherPrecompile { PayloadBatch memory batch = IDeliveryHelper(addressResolver__.deliveryHelper()) .payloadBatches(asyncId_); - + // if executed, bid is not expired if (batch.totalPayloadsRemaining == 0 || batch.isBatchCancelled) return; diff --git a/contracts/protocol/socket/SocketBatcher.sol b/contracts/protocol/socket/SocketBatcher.sol index 3b6d2869..726101e8 100644 --- a/contracts/protocol/socket/SocketBatcher.sol +++ b/contracts/protocol/socket/SocketBatcher.sol @@ -28,11 +28,7 @@ contract SocketBatcher is Ownable { function attestAndExecute( AttestAndExecutePayloadParams calldata params_ ) external payable returns (bytes memory) { - ISwitchboard(params_.switchboard).attest( - params_.payloadId, - params_.digest, - params_.watcherSignature - ); + ISwitchboard(params_.switchboard).attest(params_.payloadId, params_.digest, params_.proof); ISocket.ExecuteParams memory executeParams = ISocket.ExecuteParams({ payloadId: params_.payloadId, diff --git a/contracts/protocol/socket/switchboard/FastSwitchboard.sol b/contracts/protocol/socket/switchboard/FastSwitchboard.sol index 8d1cc668..874e7d19 100644 --- a/contracts/protocol/socket/switchboard/FastSwitchboard.sol +++ b/contracts/protocol/socket/switchboard/FastSwitchboard.sol @@ -33,13 +33,13 @@ contract FastSwitchboard is SwitchboardBase { * @dev Function to attest a packet * @param payloadId_ Packet ID * @param digest_ Digest of the packet - * @param signature_ Signature of the watcher + * @param proof_ Proof of the watcher * @notice we are attesting a digest uniquely identified with packetId and proposalCount. However, * there can be multiple proposals for same digest. To avoid need to re-attest for different proposals * with same digest, we are storing attestations against digest instead of packetId and proposalCount. */ - function attest(bytes32 payloadId_, bytes32 digest_, bytes calldata signature_) external { - address watcher = _recoverSigner(keccak256(abi.encode(address(this), digest_)), signature_); + function attest(bytes32 payloadId_, bytes32 digest_, bytes calldata proof_) external { + address watcher = _recoverSigner(keccak256(abi.encode(address(this), digest_)), proof_); if (isAttested[digest_]) revert AlreadyAttested(); if (!_hasRole(WATCHER_ROLE, watcher)) revert WatcherNotFound(); diff --git a/contracts/protocol/utils/common/Errors.sol b/contracts/protocol/utils/common/Errors.sol index 1ab0cde6..11c15386 100644 --- a/contracts/protocol/utils/common/Errors.sol +++ b/contracts/protocol/utils/common/Errors.sol @@ -28,4 +28,4 @@ error InvalidPromise(); error InvalidIndex(); error InvalidTransmitter(); error FeesNotSet(); -error InvalidTokenAddress(); \ No newline at end of file +error InvalidTokenAddress(); diff --git a/contracts/protocol/utils/common/Structs.sol b/contracts/protocol/utils/common/Structs.sol index 20bcf5de..fe629c79 100644 --- a/contracts/protocol/utils/common/Structs.sol +++ b/contracts/protocol/utils/common/Structs.sol @@ -85,7 +85,7 @@ struct AttestAndExecutePayloadParams { address target; uint256 executionGasLimit; uint256 deadline; - bytes watcherSignature; + bytes proof; bytes transmitterSignature; bytes payload; } diff --git a/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol b/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol index fc1000f0..0f6ae695 100644 --- a/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol +++ b/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol @@ -27,9 +27,9 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { /// @notice Mapping to store timeout requests /// @dev timeoutId => TimeoutRequest struct mapping(bytes32 => TimeoutRequest) public timeoutRequests; - /// @notice Mapping to store watcher signatures - /// @dev payloadId => signature bytes - mapping(bytes32 => bytes) public watcherSignatures; + /// @notice Mapping to store watcher proofs + /// @dev payloadId => proof bytes + mapping(bytes32 => bytes) public watcherProofs; /// @notice Mapping to store if appGateway has been called with trigger from on-chain Inbox /// @dev callId => bool @@ -72,8 +72,8 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { /// @notice Emitted when a request is finalized /// @param payloadId The unique identifier for the request /// @param asyncRequest The async request details - /// @param watcherSignature The signature from the watcher - event Finalized(bytes32 indexed payloadId, AsyncRequest asyncRequest, bytes watcherSignature); + /// @param proof The proof from the watcher + event Finalized(bytes32 indexed payloadId, AsyncRequest asyncRequest, bytes proof); /// @notice Emitted when a promise is resolved /// @param payloadId The unique identifier for the resolved promise @@ -172,7 +172,7 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { // ================== Finalize functions ================== - /// @notice Finalizes a payload request, requests the watcher to release the signatures to execute on chain + /// @notice Finalizes a payload request, requests the watcher to release the proofs to execute on chain /// @param params_ The finalization parameters /// @return payloadId The unique identifier for the finalized request /// @return digest The merkle digest of the payload parameters @@ -290,18 +290,15 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { emit QueryRequested(chainSlug_, targetAddress_, payloadId, payload_); } - /// @notice Marks a request as finalized with a signature on digest + /// @notice Marks a request as finalized with a proof on digest /// @param payloadId_ The unique identifier of the request - /// @param signature_ The watcher's signature + /// @param proof_ The watcher's proof /// @dev Only callable by the contract owner /// @dev Watcher signs on following digest for validation on switchboard: /// @dev keccak256(abi.encode(switchboard, digest)) - function finalized( - bytes32 payloadId_, - bytes calldata signature_ - ) external onlyRole(WATCHER_ROLE) { - watcherSignatures[payloadId_] = signature_; - emit Finalized(payloadId_, asyncRequests[payloadId_], signature_); + function finalized(bytes32 payloadId_, bytes calldata proof_) external onlyRole(WATCHER_ROLE) { + watcherProofs[payloadId_] = proof_; + emit Finalized(payloadId_, asyncRequests[payloadId_], proof_); } /// @notice Resolves multiple promises with their return data diff --git a/hardhat-scripts/constants/relayers.ts b/hardhat-scripts/constants/relayers.ts index 1cbee517..589291d9 100644 --- a/hardhat-scripts/constants/relayers.ts +++ b/hardhat-scripts/constants/relayers.ts @@ -1,22 +1,22 @@ export const relayerAddressList = [ - "0x59D24CD3A0b2b646F980A62DCb0aA4115506FFc9", - "0x762783712FD12231601d6d8591F3a5718812D534", - "0x9f5C9941306E7B57583E99033BedB7eA7889EEA4", - "0xd35F262d6f2D3F6D610bAf6635dE57c349ca83A1", - "0xce6b9c352f864515d7E8BBEA67d80d18245937F2", - "0xE651eDb3F16D9e6b1145ae5eee388f0e48D2d44b", - "0xc176E88dE45747743699fAeA58814Ce98a2faC2D", - "0x88220692264EEc280Bd5AaF9278CdE0737Feb2D6", - "0x2d68551354226c7321130f122055F049F8F67791", - "0xA7C89619ceaC009a23c6C3bC5F74d41BBaC68fD1", - "0x7893D79718860DF30e5Fd21AAA6Be05edD22465D", - "0x6386c83e994331c6a41A4420294D130930AEDF9e", - "0xfF33A0afc88CbF48C9DB31Fc2D2EC2F36D598184", - "0xB756B6D986eE448433542A60A1f590EE3B0DFCda", - "0x76943F947D5622624444aeFF135a5121d6732299", - "0x049B750045fdE15F347aF9E86FB80dD879C848ea", - "0x9c653569C32473F40210495128BB5A40ef10c65B", - "0x0291a40beF28E3606b8208a665F900d141E9A8B3", - "0x2e498dFB44CC79D2ef80Afd7C4439BEC8822E216", - "0x049E701A690E885467E54A1B0595f90BDc8324B0" -] \ No newline at end of file + "0x59D24CD3A0b2b646F980A62DCb0aA4115506FFc9", + "0x762783712FD12231601d6d8591F3a5718812D534", + "0x9f5C9941306E7B57583E99033BedB7eA7889EEA4", + "0xd35F262d6f2D3F6D610bAf6635dE57c349ca83A1", + "0xce6b9c352f864515d7E8BBEA67d80d18245937F2", + "0xE651eDb3F16D9e6b1145ae5eee388f0e48D2d44b", + "0xc176E88dE45747743699fAeA58814Ce98a2faC2D", + "0x88220692264EEc280Bd5AaF9278CdE0737Feb2D6", + "0x2d68551354226c7321130f122055F049F8F67791", + "0xA7C89619ceaC009a23c6C3bC5F74d41BBaC68fD1", + "0x7893D79718860DF30e5Fd21AAA6Be05edD22465D", + "0x6386c83e994331c6a41A4420294D130930AEDF9e", + "0xfF33A0afc88CbF48C9DB31Fc2D2EC2F36D598184", + "0xB756B6D986eE448433542A60A1f590EE3B0DFCda", + "0x76943F947D5622624444aeFF135a5121d6732299", + "0x049B750045fdE15F347aF9E86FB80dD879C848ea", + "0x9c653569C32473F40210495128BB5A40ef10c65B", + "0x0291a40beF28E3606b8208a665F900d141E9A8B3", + "0x2e498dFB44CC79D2ef80Afd7C4439BEC8822E216", + "0x049E701A690E885467E54A1B0595f90BDc8324B0", +]; diff --git a/hardhat-scripts/deploy/2.roles.ts b/hardhat-scripts/deploy/2.roles.ts index 5e54711b..cfbb1120 100644 --- a/hardhat-scripts/deploy/2.roles.ts +++ b/hardhat-scripts/deploy/2.roles.ts @@ -64,22 +64,26 @@ async function getSigner(chain: number) { return signer; } - -async function setRolesForOnChain(chain: number, addresses: DeploymentAddresses) { - const chainAddresses: ChainAddressesObj = (addresses[chain] ?? {}) as ChainAddressesObj; +async function setRolesForOnChain( + chain: number, + addresses: DeploymentAddresses +) { + const chainAddresses: ChainAddressesObj = (addresses[chain] ?? + {}) as ChainAddressesObj; const signer = await getSigner(chain); for (const [contractName, roles] of Object.entries(REQUIRED_ROLES)) { - const contractAddress = chainAddresses[contractName as keyof ChainAddressesObj]; + const contractAddress = + chainAddresses[contractName as keyof ChainAddressesObj]; if (!contractAddress) continue; for (const roleName of roles) { const targetAddress = - contractName === CORE_CONTRACTS.FastSwitchboard && roleName === ROLES.WATCHER_ROLE + contractName === CORE_CONTRACTS.FastSwitchboard && + roleName === ROLES.WATCHER_ROLE ? watcher : signer.address; - await setRoleForContract( contractName as CORE_CONTRACTS, contractAddress, @@ -93,7 +97,8 @@ async function setRolesForOnChain(chain: number, addresses: DeploymentAddresses) } async function setRolesForEVMx(addresses: DeploymentAddresses) { - const chainAddresses: ChainAddressesObj = (addresses[EVMX_CHAIN_ID] ?? {}) as ChainAddressesObj; + const chainAddresses: ChainAddressesObj = (addresses[EVMX_CHAIN_ID] ?? + {}) as ChainAddressesObj; const signer = await getSigner(EVMX_CHAIN_ID); const contractAddress = chainAddresses[EVMxCoreContracts.WatcherPrecompile]; diff --git a/test/DeliveryHelper.t.sol b/test/DeliveryHelper.t.sol index 626eb4ae..b95d7b34 100644 --- a/test/DeliveryHelper.t.sol +++ b/test/DeliveryHelper.t.sol @@ -509,7 +509,7 @@ contract DeliveryHelperTest is SetupTest { payloadDetails.payload ); bytes32 digest = watcherPrecompile.getDigest(digestParams_); - + bytes32 sigDigest = keccak256(abi.encode(address(socketConfig.switchboard), digest)); bytes memory watcherSig = _createSignature(sigDigest, watcherPrivateKey); return (watcherSig, digest); diff --git a/test/SetupTest.t.sol b/test/SetupTest.t.sol index 4f8da541..7ffbdc2c 100644 --- a/test/SetupTest.t.sol +++ b/test/SetupTest.t.sol @@ -175,7 +175,7 @@ contract SetupTest is Test { bytes32 payloadId, bytes32 digest, PayloadDetails memory payloadDetails, - bytes memory watcherSignature + bytes memory watcherProof ) internal returns (bytes memory) { SocketContracts memory socketConfig = getSocketConfig(chainSlug_); bytes32 transmitterDigest = keccak256(abi.encode(address(socketConfig.socket), payloadId)); @@ -187,7 +187,7 @@ contract SetupTest is Test { AttestAndExecutePayloadParams memory params = AttestAndExecutePayloadParams({ switchboard: address(socketConfig.switchboard), digest: digest, - watcherSignature: watcherSignature, + proof: watcherProof, payloadId: payloadId, appGateway: payloadDetails.appGateway, executionGasLimit: payloadDetails.executionGasLimit, From 16c32179ce8b79a088b0671c98e5e4a14b2600e4 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Sat, 22 Feb 2025 01:37:14 +0400 Subject: [PATCH 120/186] fix: emit event for failed promise --- .../protocol/watcherPrecompile/WatcherPrecompile.sol | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol b/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol index 0f6ae695..ec51b20d 100644 --- a/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol +++ b/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol @@ -79,6 +79,10 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { /// @param payloadId The unique identifier for the resolved promise event PromiseResolved(bytes32 indexed payloadId, bool success, address asyncPromise); + /// @notice Emitted when a promise is not resolved + /// @param payloadId The unique identifier for the not resolved promise + event PromiseNotResolved(bytes32 indexed payloadId, bool success, address asyncPromise); + event TimeoutRequested( bytes32 timeoutId, address target, @@ -322,8 +326,12 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { resolvedPromises_[i].returnData[j] ); - if (!success) break; - emit PromiseResolved(resolvedPromises_[i].payloadId, success, next[j]); + if (!success) { + emit PromiseNotResolved(resolvedPromises_[i].payloadId, success, next[j]); + break; + } else { + emit PromiseResolved(resolvedPromises_[i].payloadId, success, next[j]); + } } } } From 158d41a628ce38cc0599f40a3b4156314d2ea3a3 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Sat, 22 Feb 2025 01:37:14 +0400 Subject: [PATCH 121/186] fix: emit event for failed promise --- .../protocol/watcherPrecompile/WatcherPrecompile.sol | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol b/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol index 9f12c7d9..c79753fb 100644 --- a/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol +++ b/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol @@ -79,6 +79,10 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { /// @param payloadId The unique identifier for the resolved promise event PromiseResolved(bytes32 indexed payloadId, bool success, address asyncPromise); + /// @notice Emitted when a promise is not resolved + /// @param payloadId The unique identifier for the not resolved promise + event PromiseNotResolved(bytes32 indexed payloadId, bool success, address asyncPromise); + event TimeoutRequested( bytes32 timeoutId, address target, @@ -320,8 +324,12 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { resolvedPromises_[i].returnData[j] ); - if (!success) break; - emit PromiseResolved(resolvedPromises_[i].payloadId, success, next[j]); + if (!success) { + emit PromiseNotResolved(resolvedPromises_[i].payloadId, success, next[j]); + break; + } else { + emit PromiseResolved(resolvedPromises_[i].payloadId, success, next[j]); + } } } } From 50c8f493f330a872fa8f243d5a193b7df0ea93b7 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Sat, 22 Feb 2025 02:24:03 +0400 Subject: [PATCH 122/186] fix: event on read batches --- .../protocol/payload-delivery/app-gateway/BatchAsync.sol | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/contracts/protocol/payload-delivery/app-gateway/BatchAsync.sol b/contracts/protocol/payload-delivery/app-gateway/BatchAsync.sol index 43a34ddd..8476847c 100644 --- a/contracts/protocol/payload-delivery/app-gateway/BatchAsync.sol +++ b/contracts/protocol/payload-delivery/app-gateway/BatchAsync.sol @@ -105,6 +105,13 @@ abstract contract BatchAsync is QueueAsync { // If only reads, return early if (readEndIndex == payloadDetails_.length) { + emit PayloadSubmitted( + asyncId, + _getCoreAppGateway(msg.sender), + payloadDetails_, + fees_, + auctionManager_ + ); return asyncId; } From bb4260a06f01da6d3b863b50329c9c595e4983d0 Mon Sep 17 00:00:00 2001 From: Akash Date: Sat, 22 Feb 2025 02:34:02 +0400 Subject: [PATCH 123/186] fix: deployment scripts --- deployments/dev_addresses.json | 8 +- deployments/dev_verification.json | 18 ++ deployments/prod_addresses.json | 1 + deployments/prod_verification.json | 1 + deployments/stage_addresses.json | 48 ++++ deployments/stage_verification.json | 92 ++++++++ hardhat-scripts/config/config.ts | 7 +- hardhat-scripts/constants/constants.ts | 1 - hardhat-scripts/constants/roles.ts | 8 + hardhat-scripts/constants/types.ts | 21 +- hardhat-scripts/deploy/1.deploy.ts | 29 ++- hardhat-scripts/deploy/2.roles.ts | 21 +- hardhat-scripts/deploy/3.upgradeManagers.ts | 21 +- hardhat-scripts/deploy/4.connect.ts | 22 +- hardhat-scripts/deploy/5.upload.ts | 68 ++++-- hardhat-scripts/deploy/6.setupEnv.ts | 25 +- hardhat-scripts/migration/migrate-proxies.ts | 23 +- .../misc-scripts/updateLastBlocks.ts | 14 +- hardhat-scripts/utils/address.ts | 53 ++--- hardhat-scripts/utils/deployUtils.ts | 47 ++-- hardhat-scripts/utils/networks.ts | 2 +- hardhat-scripts/utils/overrides.ts | 2 +- hardhat-scripts/verify/verify.ts | 46 ++-- hardhat.config.ts | 2 +- package.json | 9 +- yarn.lock | 218 +++++++++++++++++- 26 files changed, 577 insertions(+), 230 deletions(-) create mode 100644 deployments/prod_addresses.json create mode 100644 deployments/prod_verification.json create mode 100644 deployments/stage_addresses.json create mode 100644 deployments/stage_verification.json create mode 100644 hardhat-scripts/constants/roles.ts diff --git a/deployments/dev_addresses.json b/deployments/dev_addresses.json index fb1d2e3b..bc2ece26 100644 --- a/deployments/dev_addresses.json +++ b/deployments/dev_addresses.json @@ -1,7 +1,7 @@ { "421614": { "ContractFactoryPlug": "0x146dd9Fc049501675533a455835989684a2f79C1", - "FastSwitchboard": "0xB16475054Dc6D8bfbd80daE964bbE416a4B7a791", + "FastSwitchboard": "0x64f929Ad5ce17cF440Ad2a33Db56F9a9ce386723", "FeesPlug": "0xa08Dac27E27c49A2535b36064c370e6e8B3A0B9a", "Socket": "0x963eC83119862cD518826DA9177B348cFdfebaA4", "SocketBatcher": "0x2db8cb4f841aa944869ECD5002e8153642A30971", @@ -18,12 +18,12 @@ "FeesManager": "0x80bEc58A00993dc874Ab2fAe56621af24eF06bA5", "FeesManagerImpl": "0x187058842C78675eA08572E0edc9598271dEF278", "startBlock": 168, - "WatcherPrecompile": "0x102A1F3546754B21D6a6BA90B54b59Da30bcb3B4", - "WatcherPrecompileImpl": "0x0429DB4f0a97F8c6E3D84399bBdA3e03B62b03A3" + "WatcherPrecompile": "0x298A3F9351ec982393f6f6CEAF35C7A61154Fb65", + "WatcherPrecompileImpl": "0x966Fe0e61d6f0384A1F3b5Dc4165385FC58be93d" }, "11155420": { "ContractFactoryPlug": "0xDF769F323560b54F1370a407d3aE6fC99AaAeF75", - "FastSwitchboard": "0xA448B8CD7325AA38d4E533cE209471B7ce01901F", + "FastSwitchboard": "0x87cC19AedD434ebD3B74FfdC073CAeC7dC1E92EA", "FeesPlug": "0x5e5CF700c97BC8B3F6215D98E65f85D4A44d7D06", "Socket": "0xaF57894A5244711a7bEBE582E9e121980f1aa95e", "SocketBatcher": "0x977e2f721f8958b2F776d2dc693D04A1256ed426", diff --git a/deployments/dev_verification.json b/deployments/dev_verification.json index 6bb8f277..6e9609b3 100644 --- a/deployments/dev_verification.json +++ b/deployments/dev_verification.json @@ -1,6 +1,24 @@ { "421614": [], "7625382": [ + [ + "0x966Fe0e61d6f0384A1F3b5Dc4165385FC58be93d", + "WatcherPrecompile", + "contracts/protocol/watcherPrecompile/WatcherPrecompile.sol", + [] + ], + [ + "0x00cc4eff9719F3AB0271866a75b45C0ba66890D0", + "WatcherPrecompile", + "contracts/protocol/watcherPrecompile/WatcherPrecompile.sol", + [] + ], + [ + "0xFdFfB47C774A804e00205BA95B4308f533Ba219D", + "WatcherPrecompile", + "contracts/protocol/watcherPrecompile/WatcherPrecompile.sol", + [] + ], [ "0xd6F9087DaBe64649c33B20B444eCcE19cca97436", "AuctionManager", diff --git a/deployments/prod_addresses.json b/deployments/prod_addresses.json new file mode 100644 index 00000000..9e26dfee --- /dev/null +++ b/deployments/prod_addresses.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/deployments/prod_verification.json b/deployments/prod_verification.json new file mode 100644 index 00000000..9e26dfee --- /dev/null +++ b/deployments/prod_verification.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/deployments/stage_addresses.json b/deployments/stage_addresses.json new file mode 100644 index 00000000..34e75205 --- /dev/null +++ b/deployments/stage_addresses.json @@ -0,0 +1,48 @@ +{ + "84532": { + "ContractFactoryPlug": "0x60C4ecd1B5E613Bd888b64933bEd6F407B3946A3", + "FastSwitchboard": "0xBb0F2e200528Be1C5cE383bcbe96aE4E92560D55", + "FeesPlug": "0x804Af74b5b3865872bEf354e286124253782FA95", + "Socket": "0x302E258fe375A1da4d6B3F4Dd5208638A29bc409", + "SocketBatcher": "0xeAb2e310A53FD3Fb34C2944690a79DFB2e834F20", + "startBlock": 22196067 + }, + "421614": { + "ContractFactoryPlug": "0x7D173648F99875c4369d2F4d29Be922D1Ed7CEaD", + "FastSwitchboard": "0x72583393DBF61d3dd37b5474AECd73F16A94e7E0", + "FeesPlug": "0xf740d6b59762fF2547Ed7aD629e041F80E1A3f75", + "Socket": "0x81046b8A1752253b214E0EAace04E3927ECbC3cC", + "SocketBatcher": "0x23463461b040c3B2DE91ce84e697656de6021636", + "startBlock": 125993799 + }, + "7625382": { + "AddressResolver": "0x33E0B939d5d01C9ae9f2F64af6EC973eE66f73db", + "AddressResolverImpl": "0xd4dd92440A6bdb51DEcD3D34105C46B4C5d25E14", + "AuctionManager": "0xAc331D182BCc5BC8563A987DE13a7C5dF2e0f1d6", + "AuctionManagerImpl": "0x57dFaDC404764686995D672E1145c9B2a015e318", + "DeliveryHelper": "0xE024683bF9E501165E2937CbFa594AFA71BE5B94", + "DeliveryHelperImpl": "0x7BC32962d8b90AC52AE1bd830A39Ae86c7f7a01F", + "ERC1967Factory": "0x6f6b19A05B049E68DF324Fc0d9191292CB9fF8d1", + "FeesManager": "0xAa8877Dea1930Ec6ed7Dab78bc415d7A02963774", + "FeesManagerImpl": "0x17C7f3578d9Cc0722d870a691b281eA61a6C9B11", + "startBlock": 556, + "WatcherPrecompile": "0xF444D24d398Fd3d8Ccaf7fA0BC543f1a6dbd4deA", + "WatcherPrecompileImpl": "0xaBc914E0834E2c7BffD586f8e96230FCe6f72e1E" + }, + "11155111": { + "ContractFactoryPlug": "0x60C4ecd1B5E613Bd888b64933bEd6F407B3946A3", + "FastSwitchboard": "0xBb0F2e200528Be1C5cE383bcbe96aE4E92560D55", + "FeesPlug": "0x804Af74b5b3865872bEf354e286124253782FA95", + "Socket": "0x302E258fe375A1da4d6B3F4Dd5208638A29bc409", + "SocketBatcher": "0xeAb2e310A53FD3Fb34C2944690a79DFB2e834F20", + "startBlock": 7756339 + }, + "11155420": { + "ContractFactoryPlug": "0xd627BFe7d2fCAC1147c996a6F2CAaB2E1e1bD344", + "FastSwitchboard": "0x49f24A72e738Fe86263Aa26696370972e049498B", + "FeesPlug": "0x9B06e2Dae351ed8B1112C036e5c306E8fBe4C9c5", + "Socket": "0xb6d39d1dB2cB14043182a008EfFC079A9C578208", + "SocketBatcher": "0xcd9F9D5C1Ec32C28455b8C74589Edcb24540B338", + "startBlock": 24178839 + } +} diff --git a/deployments/stage_verification.json b/deployments/stage_verification.json new file mode 100644 index 00000000..3a8ec095 --- /dev/null +++ b/deployments/stage_verification.json @@ -0,0 +1,92 @@ +{ + "84532": [ + [ + "0x60C4ecd1B5E613Bd888b64933bEd6F407B3946A3", + "ContractFactoryPlug", + "contracts/protocol/payload-delivery/ContractFactoryPlug.sol", + [ + "0x302E258fe375A1da4d6B3F4Dd5208638A29bc409", + "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18" + ] + ], + [ + "0x804Af74b5b3865872bEf354e286124253782FA95", + "FeesPlug", + "contracts/protocol/payload-delivery/FeesPlug.sol", + [ + "0x302E258fe375A1da4d6B3F4Dd5208638A29bc409", + "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18" + ] + ], + [ + "0xBb0F2e200528Be1C5cE383bcbe96aE4E92560D55", + "FastSwitchboard", + "contracts/protocol/socket/switchboard/FastSwitchboard.sol", + [ + 84532, + "0x302E258fe375A1da4d6B3F4Dd5208638A29bc409", + "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18" + ] + ], + [ + "0xeAb2e310A53FD3Fb34C2944690a79DFB2e834F20", + "SocketBatcher", + "contracts/protocol/socket/SocketBatcher.sol", + [ + "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18", + "0x302E258fe375A1da4d6B3F4Dd5208638A29bc409" + ] + ], + [ + "0x302E258fe375A1da4d6B3F4Dd5208638A29bc409", + "Socket", + "contracts/protocol/socket/Socket.sol", + [ + 84532, + "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18", + "EVMX" + ] + ] + ], + "421614": [], + "7625382": [ + [ + "0x57dFaDC404764686995D672E1145c9B2a015e318", + "AuctionManager", + "contracts/protocol/payload-delivery/app-gateway/AuctionManager.sol", + [] + ], + [ + "0x7BC32962d8b90AC52AE1bd830A39Ae86c7f7a01F", + "DeliveryHelper", + "contracts/protocol/payload-delivery/app-gateway/DeliveryHelper.sol", + [] + ], + [ + "0x17C7f3578d9Cc0722d870a691b281eA61a6C9B11", + "FeesManager", + "contracts/protocol/payload-delivery/app-gateway/FeesManager.sol", + [] + ], + [ + "0xaBc914E0834E2c7BffD586f8e96230FCe6f72e1E", + "WatcherPrecompile", + "contracts/protocol/watcherPrecompile/WatcherPrecompile.sol", + [] + ], + [ + "0xd4dd92440A6bdb51DEcD3D34105C46B4C5d25E14", + "AddressResolver", + "contracts/protocol/AddressResolver.sol", + [] + ], + [ + "0x6f6b19A05B049E68DF324Fc0d9191292CB9fF8d1", + "ERC1967Factory", + "lib/solady/src/utils/ERC1967Factory.sol", + [] + ] + ], + "11155111": [], + "11155420": [] +} diff --git a/hardhat-scripts/config/config.ts b/hardhat-scripts/config/config.ts index 444841bc..00c7985d 100644 --- a/hardhat-scripts/config/config.ts +++ b/hardhat-scripts/config/config.ts @@ -1,7 +1,7 @@ import { config as dotenvConfig } from "dotenv"; dotenvConfig(); -import { ChainSlug, DeploymentMode, version } from "@socket.tech/dl-core"; import { ethers } from "ethers"; +import { ChainSlug, DeploymentMode } from "@socket.tech/socket-protocol-common"; export const mode = process.env.DEPLOYMENT_MODE as | DeploymentMode @@ -13,7 +13,6 @@ export const logConfig = () => { ); console.log(""); console.log(`Mode: ${mode}`); - console.log(`Version: ${version[mode]}`); console.log(""); console.log( `Make sure ${mode}_addresses.json and ${mode}_verification.json is cleared for given networks if redeploying!!` @@ -27,8 +26,8 @@ export const logConfig = () => { export const chains: Array = [ ChainSlug.ARBITRUM_SEPOLIA, ChainSlug.OPTIMISM_SEPOLIA, - // ChainSlug.SEPOLIA, - // BASE_SEPOLIA_CHAIN_ID as ChainSlug, + ChainSlug.SEPOLIA, + ChainSlug.BASE_SEPOLIA, ]; export const auctionEndDelaySeconds = 0; diff --git a/hardhat-scripts/constants/constants.ts b/hardhat-scripts/constants/constants.ts index 753b92e2..1ae8e8f5 100644 --- a/hardhat-scripts/constants/constants.ts +++ b/hardhat-scripts/constants/constants.ts @@ -1,2 +1 @@ export const ETH_ADDRESS = "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE"; -export const BASE_SEPOLIA_CHAIN_ID = 84532; diff --git a/hardhat-scripts/constants/roles.ts b/hardhat-scripts/constants/roles.ts new file mode 100644 index 00000000..97188a39 --- /dev/null +++ b/hardhat-scripts/constants/roles.ts @@ -0,0 +1,8 @@ + + +export enum ROLES { + RESCUE_ROLE = "RESCUE_ROLE", + WITHDRAW_ROLE = "WITHDRAW_ROLE", + GOVERNANCE_ROLE = "GOVERNANCE_ROLE", + WATCHER_ROLE = "WATCHER_ROLE", +} diff --git a/hardhat-scripts/constants/types.ts b/hardhat-scripts/constants/types.ts index e6468794..2f014a9b 100644 --- a/hardhat-scripts/constants/types.ts +++ b/hardhat-scripts/constants/types.ts @@ -1,18 +1,5 @@ -export type ChainAddressesObj = { - Socket: string; - SocketBatcher: string; - FastSwitchboard: string; - FeesPlug: string; - ContractFactoryPlug: string; - startBlock: number; -}; +import { ChainAddressesObj, ChainSlug } from "@socket.tech/socket-protocol-common"; -export type CloudAddressesObj = { - SignatureVerifier: string; - AddressResolver: string; - WatcherPrecompile: string; - AuctionManager: string; - FeesManager: string; - DeliveryHelper: string; - startBlock: number; -}; +export type DeploymentAddresses = { + [chainSlug in ChainSlug]?: ChainAddressesObj; +}; \ No newline at end of file diff --git a/hardhat-scripts/deploy/1.deploy.ts b/hardhat-scripts/deploy/1.deploy.ts index 92c9c5f0..5c579ec1 100644 --- a/hardhat-scripts/deploy/1.deploy.ts +++ b/hardhat-scripts/deploy/1.deploy.ts @@ -1,13 +1,11 @@ import { ChainSlug, - ChainSocketAddresses, - DeploymentAddresses, DeploymentMode, -} from "@socket.tech/dl-core"; + ChainAddressesObj +} from "@socket.tech/socket-protocol-common"; import { config } from "dotenv"; import { Contract, Signer, Wallet, providers } from "ethers"; import { ethers } from "hardhat"; -import dev_addresses from "../../deployments/dev_addresses.json"; import { BID_TIMEOUT, EVMX_CHAIN_ID, EXPIRY_TIME, MAX_LIMIT } from "../config"; import { auctionEndDelaySeconds, @@ -15,10 +13,11 @@ import { mode, logConfig, } from "../config/config"; -import { CORE_CONTRACTS, EVMxCoreContracts } from "../constants"; +import { CORE_CONTRACTS, DeploymentAddresses, EVMxCoreContracts } from "../constants"; import { getImplementationAddress } from "../migration/migrate-proxies"; import { DeployParams, + getAddresses, getOrDeploy, getProviderFromChainSlug, storeAddresses, @@ -37,7 +36,7 @@ const deployEVMxContracts = async () => { try { let addresses: DeploymentAddresses; let deployUtils: DeployParams = { - addresses: {} as ChainSocketAddresses, + addresses: {} as ChainAddressesObj, mode, signer: new ethers.Wallet(process.env.WATCHER_PRIVATE_KEY as string), currentChainSlug: EVMX_CHAIN_ID as ChainSlug, @@ -45,10 +44,10 @@ const deployEVMxContracts = async () => { const chain = EVMX_CHAIN_ID; try { console.log("Deploying EVMx contracts"); - addresses = dev_addresses as unknown as DeploymentAddresses; - let chainAddresses: ChainSocketAddresses = addresses[chain] - ? (addresses[chain] as ChainSocketAddresses) - : ({} as ChainSocketAddresses); + addresses = getAddresses(mode) as unknown as DeploymentAddresses; + let chainAddresses: ChainAddressesObj = addresses[chain] + ? (addresses[chain] as ChainAddressesObj) + : ({} as ChainAddressesObj); const providerInstance = new providers.StaticJsonRpcProvider( process.env.EVMX_RPC as string @@ -179,19 +178,19 @@ const deploySocketContracts = async () => { try { let addresses: DeploymentAddresses; let deployUtils: DeployParams = { - addresses: {} as ChainSocketAddresses, + addresses: {} as ChainAddressesObj, mode, signer: new ethers.Wallet(process.env.SOCKET_SIGNER_KEY as string), currentChainSlug: EVMX_CHAIN_ID as ChainSlug, }; console.log("Deploying Socket contracts"); - addresses = dev_addresses as unknown as DeploymentAddresses; + addresses = getAddresses(mode) as unknown as DeploymentAddresses; for (const chain of chains) { try { - let chainAddresses: ChainSocketAddresses = addresses[chain] - ? (addresses[chain] as ChainSocketAddresses) - : ({} as ChainSocketAddresses); + let chainAddresses: ChainAddressesObj = addresses[chain] + ? (addresses[chain] as ChainAddressesObj) + : ({} as ChainAddressesObj); const providerInstance = getProviderFromChainSlug(chain); const signer: Wallet = new ethers.Wallet( diff --git a/hardhat-scripts/deploy/2.roles.ts b/hardhat-scripts/deploy/2.roles.ts index 687cee9b..2179fb72 100644 --- a/hardhat-scripts/deploy/2.roles.ts +++ b/hardhat-scripts/deploy/2.roles.ts @@ -1,19 +1,14 @@ -import { - CORE_CONTRACTS, - DeploymentAddresses, - ROLES, -} from "@socket.tech/dl-core"; - import { config as dotenvConfig } from "dotenv"; dotenvConfig(); import { Wallet } from "ethers"; import { ethers } from "hardhat"; -import dev_addresses from "../../deployments/dev_addresses.json"; -import { chains, EVMX_CHAIN_ID, watcher } from "../config"; -import { ChainAddressesObj, EVMxCoreContracts } from "../constants"; -import { getInstance, getProviderFromChainSlug, getRoleHash } from "../utils"; +import { chains, EVMX_CHAIN_ID, mode, watcher } from "../config"; +import { CORE_CONTRACTS, DeploymentAddresses, EVMxCoreContracts } from "../constants"; +import { getAddresses, getInstance, getProviderFromChainSlug, getRoleHash, overrides } from "../utils"; import { relayerAddressList } from "../constants/relayers"; +import { ChainAddressesObj } from "@socket.tech/socket-protocol-common"; +import { ROLES } from "../constants/roles"; export const REQUIRED_ROLES = { FastSwitchboard: [ROLES.WATCHER_ROLE, ROLES.RESCUE_ROLE], @@ -45,7 +40,7 @@ async function setRoleForContract( if (!hasRole) { let tx = await contract.grantRole(roleHash, targetAddress, { - ...getOverrides(chain), + ...overrides(chain), }); console.log( `granting ${roleName} role to ${targetAddress} for ${contractName}`, @@ -101,7 +96,7 @@ async function setRolesForEVMx(addresses: DeploymentAddresses) { const contractAddress = chainAddresses[EVMxCoreContracts.WatcherPrecompile]; if (!contractAddress) return; - for (const relayerAddress of relayerAddressList) { + for (const relayerAddress of [...relayerAddressList, signer.address]) { console.log(`setting WATCHER_ROLE for ${relayerAddress} on EVMX`); await setRoleForContract( EVMxCoreContracts.WatcherPrecompile, @@ -117,7 +112,7 @@ async function setRolesForEVMx(addresses: DeploymentAddresses) { export const main = async () => { try { console.log("Setting Roles"); - const addresses = dev_addresses as unknown as DeploymentAddresses; + const addresses = getAddresses(mode) as unknown as DeploymentAddresses; console.log("Setting Roles for EVMx"); await setRolesForEVMx(addresses); diff --git a/hardhat-scripts/deploy/3.upgradeManagers.ts b/hardhat-scripts/deploy/3.upgradeManagers.ts index 6dca3449..acf506bc 100644 --- a/hardhat-scripts/deploy/3.upgradeManagers.ts +++ b/hardhat-scripts/deploy/3.upgradeManagers.ts @@ -1,19 +1,18 @@ import { ChainSlug, - ChainSocketAddresses, - DeploymentAddresses, + ChainAddressesObj, DeploymentMode, -} from "@socket.tech/dl-core"; +} from "@socket.tech/socket-protocol-common"; import { config as dotenvConfig } from "dotenv"; dotenvConfig(); import { Wallet } from "ethers"; import { ethers } from "hardhat"; -import dev_addresses from "../../deployments/dev_addresses.json"; -import { chains, EVMX_CHAIN_ID } from "../config"; -import { CORE_CONTRACTS, EVMxCoreContracts } from "../constants"; +import { chains, EVMX_CHAIN_ID, mode } from "../config"; +import { CORE_CONTRACTS, DeploymentAddresses, EVMxCoreContracts } from "../constants"; import { + getAddresses, getInstance, getProviderFromChainSlug, storeAddresses, @@ -23,12 +22,12 @@ export const main = async () => { let addresses: DeploymentAddresses; try { console.log("Upgrading Managers"); - addresses = dev_addresses as unknown as DeploymentAddresses; + addresses = getAddresses(mode) as unknown as DeploymentAddresses; for (const chain of chains) { - let chainAddresses: ChainSocketAddresses = addresses[chain] - ? (addresses[chain] as ChainSocketAddresses) - : ({} as ChainSocketAddresses); + let chainAddresses: ChainAddressesObj = addresses[chain] + ? (addresses[chain] as ChainAddressesObj) + : ({} as ChainAddressesObj); const providerInstance = getProviderFromChainSlug(chain); const signer: Wallet = new ethers.Wallet( @@ -51,7 +50,7 @@ export const main = async () => { await setOnchainContracts(chain, addresses); - await storeAddresses(chainAddresses, chain, DeploymentMode.DEV); + await storeAddresses(chainAddresses, chain, mode); } } catch (error) { console.log("Error:", error); diff --git a/hardhat-scripts/deploy/4.connect.ts b/hardhat-scripts/deploy/4.connect.ts index 203badb3..4681a165 100644 --- a/hardhat-scripts/deploy/4.connect.ts +++ b/hardhat-scripts/deploy/4.connect.ts @@ -1,12 +1,10 @@ import { - ChainSocketAddresses, - DeploymentAddresses, -} from "@socket.tech/dl-core"; + ChainAddressesObj, +} from "@socket.tech/socket-protocol-common"; import { Contract, ethers, providers, Wallet } from "ethers"; -import dev_addresses from "../../deployments/dev_addresses.json"; -import { chains, EVMX_CHAIN_ID } from "../config"; -import { CORE_CONTRACTS, EVMxCoreContracts } from "../constants"; -import { getInstance, getProviderFromChainSlug } from "../utils"; +import { chains, EVMX_CHAIN_ID, mode } from "../config"; +import { CORE_CONTRACTS, DeploymentAddresses, EVMxCoreContracts } from "../constants"; +import { getAddresses, getInstance, getProviderFromChainSlug, overrides } from "../utils"; const plugs = [CORE_CONTRACTS.ContractFactoryPlug, CORE_CONTRACTS.FeesPlug]; export type AppGatewayConfig = { @@ -65,7 +63,7 @@ async function connectPlug( plugContract: string, socketSigner: Wallet, addresses: DeploymentAddresses, - addr: ChainSocketAddresses + addr: ChainAddressesObj ) { console.log(`Connecting ${plugContract} on ${chain}`); @@ -102,7 +100,7 @@ async function connectPlug( export const connectPlugsOnSocket = async () => { console.log("Connecting plugs"); - const addresses = dev_addresses as unknown as DeploymentAddresses; + const addresses = getAddresses(mode) as unknown as DeploymentAddresses; // Connect plugs on each chain await Promise.all( chains.map(async (chain) => { @@ -140,7 +138,7 @@ export const isConfigSetOnWatcherVM = async ( export const updateConfigWatcherVM = async () => { try { console.log("Connecting plugs on EVMx"); - const addresses = dev_addresses as unknown as DeploymentAddresses; + const addresses = getAddresses(mode) as unknown as DeploymentAddresses; const appConfigs: AppGatewayConfig[] = []; // Set up Watcher contract @@ -196,7 +194,9 @@ export const updateConfigWatcherVM = async () => { // Update configs if any changes needed if (appConfigs.length > 0) { console.log({ appConfigs }); - const tx = await watcher.setAppGateways(appConfigs); + const tx = await watcher.setAppGateways(appConfigs, { + ...overrides(EVMX_CHAIN_ID), + }); console.log(`Updating EVMx Config tx hash: ${tx.hash}`); await tx.wait(); } diff --git a/hardhat-scripts/deploy/5.upload.ts b/hardhat-scripts/deploy/5.upload.ts index a9a7bdfa..507baa60 100644 --- a/hardhat-scripts/deploy/5.upload.ts +++ b/hardhat-scripts/deploy/5.upload.ts @@ -1,17 +1,51 @@ import { PutObjectCommand, S3Client } from "@aws-sdk/client-s3"; -import { ChainSlug } from "@socket.tech/dl-core"; +import { ChainAddressesObj, CloudAddressesObj, ChainSlug, DeploymentMode } from "@socket.tech/socket-protocol-common"; import { config as dotenvConfig } from "dotenv"; import fs from "fs"; import path from "path"; -import { EVMX_CHAIN_ID } from "../config/config"; -import { - BASE_SEPOLIA_CHAIN_ID, - ChainAddressesObj, - CloudAddressesObj, -} from "../constants"; +import { EVMX_CHAIN_ID, mode } from "../config/config"; dotenvConfig(); +const getBucketName = () => { + switch (mode) { + case DeploymentMode.DEV: + return "socketpoc"; + case DeploymentMode.STAGE: + return "socket-stage"; + case DeploymentMode.PROD: + return "socket-prod"; + default: + throw new Error(`Invalid deployment mode: ${mode}`); + } +}; + +const getFileName = () => { + switch (mode) { + case DeploymentMode.DEV: + return "pocConfig.json"; + case DeploymentMode.STAGE: + return "stageConfig.json"; + case DeploymentMode.PROD: + return "prodConfig.json"; + default: + throw new Error(`Invalid deployment mode: ${mode}`); + } +}; + + +const getAddressesPath = () => { + switch (mode) { + case DeploymentMode.DEV: + return "../../deployments/dev_addresses.json"; + case DeploymentMode.STAGE: + return "../../deployments/stage_addresses.json"; + case DeploymentMode.PROD: + return "../../deployments/prod_addresses.json"; + default: + throw new Error(`Invalid deployment mode: ${mode}`); + } +}; type ConfigEntry = { eventBlockRangePerCron: number; rpc: string | undefined; @@ -53,7 +87,7 @@ export let config: S3Config = { confirmations: 0, eventBlockRange: 5000, }, - [BASE_SEPOLIA_CHAIN_ID]: { + [ChainSlug.BASE_SEPOLIA]: { eventBlockRangePerCron: 5000, rpc: process.env.BASE_SEPOLIA_RPC, wssRpc: process.env.BASE_SEPOLIA_WSS_RPC, @@ -69,18 +103,18 @@ export let config: S3Config = { // BASE_SEPOLIA_CHAIN_ID, ], }; -// Read the dev_addresses.json file -const devAddressesPath = path.join( +// Read the addresses.json file +const addressesPath = path.join( __dirname, - "../../deployments/dev_addresses.json" + getAddressesPath() ); -const devAddresses = JSON.parse(fs.readFileSync(devAddressesPath, "utf8")); +const addresses = JSON.parse(fs.readFileSync(addressesPath, "utf8")); // Update config with addresses for (const chainId in config) { - if (devAddresses[chainId]) { + if (addresses[chainId]) { console.log(`Updating addresses for chainId ${chainId}`); - config[chainId].addresses = devAddresses[chainId]; + config[chainId].addresses = addresses[chainId]; } } console.log(JSON.stringify(config, null, 2)); @@ -88,9 +122,9 @@ console.log(JSON.stringify(config, null, 2)); const s3Client = new S3Client({ region: "us-east-1" }); // Replace with your preferred region // Function to upload to S3 -async function uploadToS3(data: any, fileName: string) { +async function uploadToS3(data: any, bucketName: string, fileName: string) { const params = { - Bucket: "socketpoc", + Bucket: bucketName, Key: fileName, Body: JSON.stringify(data, null, 2), ContentType: "application/json", @@ -106,4 +140,4 @@ async function uploadToS3(data: any, fileName: string) { } // Upload config to S3 -uploadToS3(config, "pocConfig.json"); +uploadToS3(config, getBucketName(), getFileName()); diff --git a/hardhat-scripts/deploy/6.setupEnv.ts b/hardhat-scripts/deploy/6.setupEnv.ts index edbbfd29..17707fed 100644 --- a/hardhat-scripts/deploy/6.setupEnv.ts +++ b/hardhat-scripts/deploy/6.setupEnv.ts @@ -1,8 +1,8 @@ -import { ChainSlug } from "@socket.tech/dl-core"; +import { ChainSlug } from "@socket.tech/socket-protocol-common"; import fs from "fs"; import path from "path"; -import dev_addresses from "../../deployments/dev_addresses.json"; -import { EVMX_CHAIN_ID } from "../config/config"; +import { EVMX_CHAIN_ID, mode } from "../config/config"; +import { getAddresses } from "../utils"; const envFilePath = path.join(__dirname, "../../.env"); const encoding = "utf8"; @@ -13,30 +13,31 @@ const envContent = fs.readFileSync(envFilePath, encoding); // Parse the .env content into an array of lines const lines = envContent.split("\n"); -// Get the latest addresses from dev_addresses -const latestAddresses = dev_addresses[EVMX_CHAIN_ID]; +// Get the latest addresses +const latestAddresses = getAddresses(mode); +const latestEVMxAddresses = latestAddresses[EVMX_CHAIN_ID]; // Create a new array to hold the updated lines const updatedLines = lines.map((line) => { if (line.startsWith("ADDRESS_RESOLVER=")) { - return `ADDRESS_RESOLVER=${latestAddresses["AddressResolver"]}`; + return `ADDRESS_RESOLVER=${latestEVMxAddresses["AddressResolver"]}`; } else if (line.startsWith("WATCHER_PRECOMPILE=")) { - return `WATCHER_PRECOMPILE=${latestAddresses["WatcherPrecompile"]}`; + return `WATCHER_PRECOMPILE=${latestEVMxAddresses["WatcherPrecompile"]}`; } else if (line.startsWith("AUCTION_MANAGER=")) { - return `AUCTION_MANAGER=${latestAddresses["AuctionManager"]}`; + return `AUCTION_MANAGER=${latestEVMxAddresses["AuctionManager"]}`; } else if (line.startsWith("FEES_MANAGER=")) { - return `FEES_MANAGER=${latestAddresses["FeesManager"]}`; + return `FEES_MANAGER=${latestEVMxAddresses["FeesManager"]}`; } else if (line.startsWith("ARBITRUM_SOCKET=")) { return `ARBITRUM_SOCKET=${ - dev_addresses[ChainSlug.ARBITRUM_SEPOLIA]["Socket"] + latestAddresses[ChainSlug.ARBITRUM_SEPOLIA]["Socket"] }`; } else if (line.startsWith("ARBITRUM_SWITCHBOARD=")) { return `ARBITRUM_SWITCHBOARD=${ - dev_addresses[ChainSlug.ARBITRUM_SEPOLIA]["FastSwitchboard"] + latestAddresses[ChainSlug.ARBITRUM_SEPOLIA]["FastSwitchboard"] }`; } else if (line.startsWith("ARBITRUM_FEES_PLUG=")) { return `ARBITRUM_FEES_PLUG=${ - dev_addresses[ChainSlug.ARBITRUM_SEPOLIA]["FeesPlug"] + latestAddresses[ChainSlug.ARBITRUM_SEPOLIA]["FeesPlug"] }`; } return line; // Return the line unchanged if it doesn't match any of the above diff --git a/hardhat-scripts/migration/migrate-proxies.ts b/hardhat-scripts/migration/migrate-proxies.ts index 380cfc6d..ca8068c1 100644 --- a/hardhat-scripts/migration/migrate-proxies.ts +++ b/hardhat-scripts/migration/migrate-proxies.ts @@ -1,11 +1,10 @@ import { ethers } from "hardhat"; import { Contract, utils, Wallet } from "ethers"; -import * as fs from "fs"; -import * as path from "path"; import { EVMX_CHAIN_ID, UPGRADE_VERSION } from "../config/config"; import { getProviderFromChainSlug } from "../utils"; -import { ChainSlug } from "@socket.tech/dl-core"; - +import { ChainSlug } from "@socket.tech/socket-protocol-common"; +import { getAddresses } from "../utils"; +import { mode } from "../config/config"; // Implementation slot from ERC1967 const IMPLEMENTATION_SLOT = "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"; @@ -34,20 +33,6 @@ export async function getImplementationAddress( return utils.getAddress("0x" + implHex.slice(-40)); } -async function loadAddresses() { - const addressesPath = path.join( - __dirname, - "../../../deployments/dev_addresses.json" - ); - const addresses = JSON.parse(fs.readFileSync(addressesPath, "utf8")); - - if (!addresses[EVMX_CHAIN_ID]) { - throw new Error(`No addresses found for chain ID ${EVMX_CHAIN_ID}`); - } - - return addresses; -} - async function setupSigner() { const providerInstance = getProviderFromChainSlug(EVMX_CHAIN_ID as ChainSlug); return new ethers.Wallet( @@ -225,7 +210,7 @@ async function verifyBeaconImplementation(contract: Contract, signer: Wallet) { async function main() { // @ts-ignore - Hardhat Runtime Environment will be injected by hardhat - const addresses = await loadAddresses(); + const addresses = getAddresses(mode); const signer = await setupSigner(); const proxyFactory = await setupProxyFactory(addresses, signer); diff --git a/hardhat-scripts/misc-scripts/updateLastBlocks.ts b/hardhat-scripts/misc-scripts/updateLastBlocks.ts index c2f882a9..e4b36946 100644 --- a/hardhat-scripts/misc-scripts/updateLastBlocks.ts +++ b/hardhat-scripts/misc-scripts/updateLastBlocks.ts @@ -2,15 +2,12 @@ import dotenv from "dotenv"; import fs from "fs"; import path from "path"; import { getProviderFromChainSlug } from "../utils"; +import { getAddresses } from "../utils"; +import { mode } from "../config/config"; dotenv.config(); -const DEPLOYMENT_FILE = path.join( - __dirname, - "../../deployments/dev_addresses.json" -); - async function updateLastBlocks() { // Read deployment addresses - const addresses = JSON.parse(fs.readFileSync(DEPLOYMENT_FILE, "utf8")); + const addresses = getAddresses(mode); const chains = Object.keys(addresses).map((chainSlug) => Number(chainSlug)); // Update each chain's start block @@ -35,7 +32,10 @@ async function updateLastBlocks() { } // Write updated data back to file - fs.writeFileSync(DEPLOYMENT_FILE, JSON.stringify(addresses, null, 2)); + fs.writeFileSync( + path.join(__dirname, `../../deployments/${mode}_addresses.json`), + JSON.stringify(addresses, null, 2) + ); console.log("Successfully updated start blocks in deployment file"); } diff --git a/hardhat-scripts/utils/address.ts b/hardhat-scripts/utils/address.ts index 4fb2e634..af8c5edd 100644 --- a/hardhat-scripts/utils/address.ts +++ b/hardhat-scripts/utils/address.ts @@ -1,40 +1,19 @@ -import { ChainSlug, IntegrationTypes } from "@socket.tech/dl-core"; -function getSwitchboardAddress( - chainSlug: ChainSlug | string, - integrationType: IntegrationTypes, - config: any -) { - if (integrationType === IntegrationTypes.fast) { - return config?.["FastSwitchboard"]; - } else if (integrationType === IntegrationTypes.fast2) { - return config?.["FastSwitchboard2"]; - } else if (integrationType === IntegrationTypes.optimistic) { - return config?.["OptimisticSwitchboard"]; - } else - return config?.["integrations"]?.[chainSlug]?.[integrationType]?.[ - "switchboard" - ]; -} -function getCapacitorAddress( - chainSlug: ChainSlug, - integrationType: IntegrationTypes, - config: any -) { - return config?.["integrations"]?.[chainSlug]?.[integrationType]?.[ - "capacitor" - ]; -} +import dev_addresses from "../../deployments/dev_addresses.json"; +import stage_addresses from "../../deployments/stage_addresses.json"; +import prod_addresses from "../../deployments/prod_addresses.json"; +import { DeploymentMode } from "@socket.tech/socket-protocol-common"; -function getDecapacitorAddress( - chainSlug: ChainSlug, - integrationType: IntegrationTypes, - config: any -) { - return config?.["integrations"]?.[chainSlug]?.[integrationType]?.[ - "decapacitor" - ]; -} - -export { getSwitchboardAddress, getCapacitorAddress, getDecapacitorAddress }; +export const getAddresses = (mode: DeploymentMode) => { + switch (mode) { + case DeploymentMode.DEV: + return dev_addresses; + case DeploymentMode.STAGE: + return stage_addresses; + case DeploymentMode.PROD: + return prod_addresses; + default: + throw new Error(`Invalid deployment mode: ${mode}`); + } +}; diff --git a/hardhat-scripts/utils/deployUtils.ts b/hardhat-scripts/utils/deployUtils.ts index e0404c46..36d1241c 100644 --- a/hardhat-scripts/utils/deployUtils.ts +++ b/hardhat-scripts/utils/deployUtils.ts @@ -6,14 +6,14 @@ import { Address } from "hardhat-deploy/dist/types"; import path from "path"; import fs from "fs"; import { + ChainAddressesObj, ChainSlug, - ChainSocketAddresses, - DeploymentAddresses, - DeploymentMode, -} from "@socket.tech/dl-core"; + DeploymentMode +} from "@socket.tech/socket-protocol-common"; import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/signers"; import { overrides } from "../utils"; import { VerifyArgs } from "../verify"; +import { DeploymentAddresses } from "../constants"; export const deploymentsPath = path.join(__dirname, `/../../deployments/`); @@ -32,7 +32,7 @@ export const getChainRoleHash = (role: string, chainSlug: number) => ); export interface DeployParams { - addresses: ChainSocketAddresses; + addresses: ChainAddressesObj; mode: DeploymentMode; signer: SignerWithAddress | Wallet; currentChainSlug: number; @@ -140,7 +140,7 @@ export const integrationType = (integrationName: string) => ); export const storeAddresses = async ( - addresses: ChainSocketAddresses, + addresses: ChainAddressesObj, chainSlug: ChainSlug, mode: DeploymentMode ) => { @@ -159,7 +159,7 @@ export const storeAddresses = async ( // Sort addresses object by key name for readability const sortedAddresses = Object.fromEntries( Object.entries(addresses).sort(([keyA], [keyB]) => keyA.localeCompare(keyB)) - ) as ChainSocketAddresses; + ) as ChainAddressesObj; deploymentAddresses[chainSlug] = sortedAddresses; fs.writeFileSync( @@ -239,7 +239,7 @@ export const storeVerificationParams = async ( }; export const getChainSlugsFromDeployedAddresses = async ( - mode = DeploymentMode.DEV + mode: DeploymentMode ) => { if (!fs.existsSync(deploymentsPath)) { await fs.promises.mkdir(deploymentsPath); @@ -258,8 +258,8 @@ export const getChainSlugsFromDeployedAddresses = async ( export const getRelayUrl = async (mode: DeploymentMode) => { switch (mode) { - case DeploymentMode.SURGE: - return process.env.RELAYER_URL_SURGE; + case DeploymentMode.STAGE: + return process.env.RELAYER_URL_STAGE; case DeploymentMode.PROD: return process.env.RELAYER_URL_PROD; default: @@ -269,8 +269,8 @@ export const getRelayUrl = async (mode: DeploymentMode) => { export const getRelayAPIKEY = (mode: DeploymentMode) => { switch (mode) { - case DeploymentMode.SURGE: - return process.env.RELAYER_API_KEY_SURGE; + case DeploymentMode.STAGE: + return process.env.RELAYER_API_KEY_STAGE; case DeploymentMode.PROD: return process.env.RELAYER_API_KEY_PROD; default: @@ -287,30 +287,11 @@ export const getAPIBaseURL = (mode: DeploymentMode) => { } }; -export const getAddresses = async ( - chainSlug: ChainSlug, - mode = DeploymentMode.DEV -) => { - if (!fs.existsSync(deploymentsPath)) { - await fs.promises.mkdir(deploymentsPath); - } - - const addressesPath = deploymentsPath + `${mode}_addresses.json`; - const outputExists = fs.existsSync(addressesPath); - let deploymentAddresses: DeploymentAddresses = {}; - if (outputExists) { - const deploymentAddressesString = fs.readFileSync(addressesPath, "utf-8"); - deploymentAddresses = JSON.parse(deploymentAddressesString); - } - - return deploymentAddresses[chainSlug]; -}; - export const createObj = function ( - obj: ChainSocketAddresses, + obj: ChainAddressesObj, keys: string[], value: any -): ChainSocketAddresses { +): ChainAddressesObj { if (keys.length === 1) { obj[keys[0]] = value; } else { diff --git a/hardhat-scripts/utils/networks.ts b/hardhat-scripts/utils/networks.ts index 76fe2bc8..2abd4eb7 100644 --- a/hardhat-scripts/utils/networks.ts +++ b/hardhat-scripts/utils/networks.ts @@ -6,7 +6,7 @@ import { hardhatChainNameToSlug, HardhatChainName, chainSlugToHardhatChainName, -} from "@socket.tech/dl-core"; +} from "@socket.tech/socket-protocol-common"; import { EVMX_CHAIN_ID } from "../config/config"; import { BASE_SEPOLIA_CHAIN_ID } from "../constants"; diff --git a/hardhat-scripts/utils/overrides.ts b/hardhat-scripts/utils/overrides.ts index d3966954..7d9ccc96 100644 --- a/hardhat-scripts/utils/overrides.ts +++ b/hardhat-scripts/utils/overrides.ts @@ -1,4 +1,4 @@ -import { ChainSlug } from "@socket.tech/dl-core"; +import { ChainSlug } from "@socket.tech/socket-protocol-common"; import { BigNumber, BigNumberish, providers } from "ethers"; import { EVMX_CHAIN_ID } from "../config/config"; import { getProviderFromChainSlug } from "./networks"; diff --git a/hardhat-scripts/verify/verify.ts b/hardhat-scripts/verify/verify.ts index 3bf82bfb..4c6dc721 100644 --- a/hardhat-scripts/verify/verify.ts +++ b/hardhat-scripts/verify/verify.ts @@ -1,34 +1,42 @@ -import hre from "hardhat"; -import { storeUnVerifiedParams, verify } from "../utils"; import { - HardhatChainName, - ChainSlugToKey, ChainSlug, + ChainSlugToKey, DeploymentMode, -} from "@socket.tech/dl-core"; + HardhatChainName, +} from "@socket.tech/socket-protocol-common"; +import hre from "hardhat"; import path from "path"; -import fs from "fs"; -import { EVMX_CHAIN_ID } from "../config/config"; -import { BASE_SEPOLIA_CHAIN_ID } from "../constants"; +import { EVMX_CHAIN_ID, mode } from "../config/config"; +import { storeUnVerifiedParams, verify } from "../utils"; + +import dev_verification from "../../deployments/dev_verification.json"; +import prod_verification from "../../deployments/prod_verification.json"; +import stage_verification from "../../deployments/stage_verification.json"; + +const getVerificationParams = (mode: DeploymentMode) => { + switch (mode) { + case DeploymentMode.DEV: + return dev_verification; + case DeploymentMode.STAGE: + return stage_verification; + case DeploymentMode.PROD: + return prod_verification; + default: + throw new Error(`Invalid deployment mode: ${mode}`); + } +}; + export type VerifyParams = { [chain in HardhatChainName]?: VerifyArgs[]; }; export type VerifyArgs = [string, string, string, any[]]; -const deploymentsPath = path.join(__dirname, `/../../deployments/`); /** * Deploys network-independent socket contracts */ export const main = async () => { try { - const path = deploymentsPath + `dev_verification.json`; - if (!fs.existsSync(path)) { - throw new Error("addresses.json not found"); - } - let verificationParams: VerifyParams = JSON.parse( - fs.readFileSync(path, "utf-8") - ); - + const verificationParams = getVerificationParams(mode); const chains = Object.keys(verificationParams); if (!chains) return; @@ -36,7 +44,7 @@ export const main = async () => { const chain = parseInt(chains[chainIndex]) as ChainSlug; let chainName: string; console.log({ chain }); - if (chain == (BASE_SEPOLIA_CHAIN_ID as ChainSlug)) { + if (chain == (ChainSlug.BASE_SEPOLIA as ChainSlug)) { chainName = "base_sepolia"; } else if (chain == (EVMX_CHAIN_ID as ChainSlug)) { chainName = "EVMX"; @@ -62,7 +70,7 @@ export const main = async () => { await storeUnVerifiedParams( unverifiedChainParams, chain, - DeploymentMode.DEV + mode ); } } catch (error) { diff --git a/hardhat.config.ts b/hardhat.config.ts index 8a7dc568..72ce85e8 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -22,7 +22,7 @@ import { ChainSlugToId, HardhatChainName, hardhatChainNameToSlug, -} from "@socket.tech/dl-core"; +} from "@socket.tech/socket-protocol-common"; import { EVMX_CHAIN_ID } from "./hardhat-scripts/config/config"; import { BASE_SEPOLIA_CHAIN_ID } from "./hardhat-scripts/constants"; diff --git a/package.json b/package.json index 7e70a99c..84a54c73 100644 --- a/package.json +++ b/package.json @@ -23,8 +23,8 @@ "author": "", "license": "ISC", "devDependencies": { - "@nomiclabs/hardhat-ethers": "2.2.3", "@nomicfoundation/hardhat-verify": "^2.0.12", + "@nomiclabs/hardhat-ethers": "2.2.3", "@socket.tech/dl-core": "^2.35.0", "@typechain/ethers-v5": "^10.0.0", "@typechain/hardhat": "6.0.0", @@ -40,11 +40,12 @@ "prettier-plugin-solidity": "^1.4.1", "ts-node": "^10.7.0", "typechain": "^8.0.0", - "typescript": "^4.6.4" - }, - "dependencies": { + "typescript": "^4.6.4", "@aws-sdk/client-s3": "^3.670.0", + "@socket.tech/socket-protocol-common": "1.1.24", "forge-std": "^1.1.2", "http-server": "^14.1.1" + }, + "dependencies": { } } diff --git a/yarn.lock b/yarn.lock index 0a85c6fe..550b8343 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2117,13 +2117,23 @@ "@socket.tech/dl-core@^2.35.0": version "2.35.0" - resolved "https://registry.yarnpkg.com/@socket.tech/dl-core/-/dl-core-2.35.0.tgz#154120d222e095db812423f3b1e748fecdeb8815" + resolved "https://registry.yarnpkg.com/@socket.tech/socket-protocol-common/-/dl-core-2.35.0.tgz#154120d222e095db812423f3b1e748fecdeb8815" integrity sha512-VH3I4lfCFRpF0ovaYACfd3Fhq2DAtWYcL45xUUHMNVII/EbBl3F7jB10ztWime+0l5sWXVP3o0R8bMnkrotw3w== dependencies: axios "^1.3.6" prompts "^2.4.2" yargs "^17.7.1" +"@socket.tech/socket-protocol-common@1.1.24": + version "1.1.24" + resolved "https://registry.yarnpkg.com/@socket.tech/socket-protocol-common/-/socket-protocol-common-1.1.24.tgz#acc4617a20d997a6940f018458904983501f2882" + integrity sha512-1lmxechJL2ultwnhFecp/AWxmy7//eNCrlo7DG6+phzxiTz0VY4Iv2e3xfTjil5IM/8LJ8/NSU51uCgIcezMuw== + dependencies: + axios "^1.7.9" + ethers "^5.6.5" + pino "^9.6.0" + sequelize "^6.21.6" + "@solidity-parser/parser@^0.18.0": version "0.18.0" resolved "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.18.0.tgz" @@ -2186,6 +2196,13 @@ dependencies: "@types/node" "*" +"@types/debug@^4.1.8": + version "4.1.12" + resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.12.tgz#a155f21690871953410df4b6b6f53187f0500917" + integrity sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ== + dependencies: + "@types/ms" "*" + "@types/events@*": version "3.0.3" resolved "https://registry.npmjs.org/@types/events/-/events-3.0.3.tgz" @@ -2196,6 +2213,11 @@ resolved "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz" integrity sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw== +"@types/ms@*": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@types/ms/-/ms-2.1.0.tgz#052aa67a48eccc4309d7f0191b7e41434b90bb78" + integrity sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA== + "@types/node@*": version "22.7.5" resolved "https://registry.npmjs.org/@types/node/-/node-22.7.5.tgz" @@ -2227,6 +2249,11 @@ dependencies: "@types/node" "*" +"@types/validator@^13.7.17": + version "13.12.2" + resolved "https://registry.yarnpkg.com/@types/validator/-/validator-13.12.2.tgz#760329e756e18a4aab82fc502b51ebdfebbe49f5" + integrity sha512-6SlHBzUW8Jhf3liqrGGXyTJSIFe4nqlJ5A5KaMZ2l/vbM3Wh3KSybots/wfWVzNLK4D1NZluDlSQIbIEPx6oyA== + abort-controller@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz" @@ -2259,6 +2286,11 @@ acorn@^8.11.0, acorn@^8.4.1: resolved "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz" integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== +add@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/add/-/add-2.0.6.tgz#248f0a9f6e5a528ef2295dbeec30532130ae2235" + integrity sha512-j5QzrmsokwWWp6kUcJQySpbG+xfOBqqKnup3OIk1pz+kB/80SLorZ9V8zHFLO92Lcd+hbvq8bT+zOGoPkmBV0Q== + adm-zip@^0.4.16: version "0.4.16" resolved "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz" @@ -2382,6 +2414,11 @@ at-least-node@^1.0.0: resolved "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz" integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== +atomic-sleep@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/atomic-sleep/-/atomic-sleep-1.0.0.tgz#eb85b77a601fc932cfe432c5acd364a9e2c9075b" + integrity sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ== + axios@^0.21.1: version "0.21.4" resolved "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz" @@ -2398,6 +2435,15 @@ axios@^1.3.6: form-data "^4.0.0" proxy-from-env "^1.1.0" +axios@^1.7.9: + version "1.7.9" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.9.tgz#d7d071380c132a24accda1b2cfc1535b79ec650a" + integrity sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw== + dependencies: + follow-redirects "^1.15.6" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" @@ -2804,6 +2850,13 @@ debug@^3.2.7: dependencies: ms "^2.1.1" +debug@^4.3.4: + version "4.4.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a" + integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== + dependencies: + ms "^2.1.3" + decamelize@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz" @@ -2858,6 +2911,11 @@ dotenv@^16.0.3: resolved "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz" integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== +dottie@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/dottie/-/dottie-2.0.6.tgz#34564ebfc6ec5e5772272d466424ad5b696484d4" + integrity sha512-iGCHkfUc5kFekGiqhe8B/mdaurD+lakO9txNnTvKtA6PISrw86LgqHvRzWYPyoE2Ph5aMIrCw9/uko6XHTKCwA== + elliptic@6.5.4, elliptic@^6.5.2, elliptic@^6.5.4: version "6.5.4" resolved "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz" @@ -3009,7 +3067,7 @@ ethers@5.6.6: "@ethersproject/web" "5.6.0" "@ethersproject/wordlists" "5.6.0" -ethers@^5.5.3: +ethers@^5.5.3, ethers@^5.6.5: version "5.7.2" resolved "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz" integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== @@ -3076,6 +3134,11 @@ fast-deep-equal@^3.1.3: resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== +fast-redact@^3.1.1: + version "3.5.0" + resolved "https://registry.yarnpkg.com/fast-redact/-/fast-redact-3.5.0.tgz#e9ea02f7e57d0cd8438180083e93077e496285e4" + integrity sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A== + fast-uri@^3.0.1: version "3.0.2" resolved "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.2.tgz" @@ -3530,6 +3593,11 @@ indent-string@^4.0.0: resolved "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz" integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== +inflection@^1.13.4: + version "1.13.4" + resolved "https://registry.yarnpkg.com/inflection/-/inflection-1.13.4.tgz#65aa696c4e2da6225b148d7a154c449366633a32" + integrity sha512-6I/HUDeYFfuNCVS3td055BaXBwKYuzw7K3ExVMStBowKo9oOAMJIXIHvdyR3iboTCp1b+1i5DSkIZTcwIktuDw== + inflight@^1.0.4: version "1.0.6" resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" @@ -3722,7 +3790,7 @@ lodash.truncate@^4.4.2: resolved "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz" integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== -lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15: +lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.21: version "4.17.21" resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -3889,6 +3957,18 @@ module-error@^1.0.1, module-error@^1.0.2: resolved "https://registry.npmjs.org/module-error/-/module-error-1.0.2.tgz" integrity sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA== +moment-timezone@^0.5.43: + version "0.5.47" + resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.47.tgz#d4d1a21b78372d914d6d69ae285454732a429749" + integrity sha512-UbNt/JAWS0m/NJOebR0QMRHBk0hu03r5dx9GK8Cs0AS3I81yDcOc9k+DytPItgVvBP7J6Mf6U2n3BPAacAV9oA== + dependencies: + moment "^2.29.4" + +moment@^2.29.4: + version "2.30.1" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.30.1.tgz#f8c91c07b7a786e30c59926df530b4eac96974ae" + integrity sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how== + ms@^2.1.1, ms@^2.1.3: version "2.1.3" resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" @@ -3938,6 +4018,11 @@ obliterator@^2.0.0: resolved "https://registry.npmjs.org/obliterator/-/obliterator-2.0.4.tgz" integrity sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ== +on-exit-leak-free@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz#fed195c9ebddb7d9e4c3842f93f281ac8dadd3b8" + integrity sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA== + once@^1.3.0: version "1.4.0" resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" @@ -4036,6 +4121,11 @@ pbkdf2@^3.0.17: safe-buffer "^5.0.1" sha.js "^2.4.8" +pg-connection-string@^2.6.1: + version "2.7.0" + resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.7.0.tgz#f1d3489e427c62ece022dba98d5262efcb168b37" + integrity sha512-PI2W9mv53rXJQEOb8xNR8lH7Hr+EKa6oJa38zsK0S/ky2er16ios1wLKhZyxzD7jUReiWokc9WK5nxSnC7W1TA== + picocolors@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" @@ -4046,6 +4136,35 @@ picomatch@^2.0.4, picomatch@^2.2.1: resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== +pino-abstract-transport@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pino-abstract-transport/-/pino-abstract-transport-2.0.0.tgz#de241578406ac7b8a33ce0d77ae6e8a0b3b68a60" + integrity sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw== + dependencies: + split2 "^4.0.0" + +pino-std-serializers@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/pino-std-serializers/-/pino-std-serializers-7.0.0.tgz#7c625038b13718dbbd84ab446bd673dc52259e3b" + integrity sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA== + +pino@^9.6.0: + version "9.6.0" + resolved "https://registry.yarnpkg.com/pino/-/pino-9.6.0.tgz#6bc628159ba0cc81806d286718903b7fc6b13169" + integrity sha512-i85pKRCt4qMjZ1+L7sy2Ag4t1atFcdbEt76+7iRJn1g2BvsnRMGu9p8pivl9fs63M2kF/A0OacFZhTub+m/qMg== + dependencies: + atomic-sleep "^1.0.0" + fast-redact "^3.1.1" + on-exit-leak-free "^2.1.0" + pino-abstract-transport "^2.0.0" + pino-std-serializers "^7.0.0" + process-warning "^4.0.0" + quick-format-unescaped "^4.0.3" + real-require "^0.2.0" + safe-stable-stringify "^2.3.1" + sonic-boom "^4.0.1" + thread-stream "^3.0.0" + portfinder@^1.0.28: version "1.0.32" resolved "https://registry.npmjs.org/portfinder/-/portfinder-1.0.32.tgz" @@ -4082,6 +4201,11 @@ process-nextick-args@~2.0.0: resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== +process-warning@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/process-warning/-/process-warning-4.0.1.tgz#5c1db66007c67c756e4e09eb170cdece15da32fb" + integrity sha512-3c2LzQ3rY9d0hc1emcsHhfT9Jwz0cChib/QN89oME2R451w5fy3f0afAhERFZAwrbDU43wk12d0ORBpDVME50Q== + prompts@^2.4.2: version "2.4.2" resolved "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz" @@ -4112,6 +4236,11 @@ queue-microtask@^1.2.2, queue-microtask@^1.2.3: resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== +quick-format-unescaped@^4.0.3: + version "4.0.4" + resolved "https://registry.yarnpkg.com/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz#93ef6dd8d3453cbc7970dd614fad4c5954d6b5a7" + integrity sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg== + randombytes@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" @@ -4158,6 +4287,11 @@ readdirp@~3.6.0: dependencies: picomatch "^2.2.1" +real-require@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/real-require/-/real-require-0.2.0.tgz#209632dea1810be2ae063a6ac084fee7e33fba78" + integrity sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg== + reduce-flatten@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz" @@ -4185,6 +4319,11 @@ resolve@1.17.0: dependencies: path-parse "^1.0.6" +retry-as-promised@^7.0.4: + version "7.0.4" + resolved "https://registry.yarnpkg.com/retry-as-promised/-/retry-as-promised-7.0.4.tgz#9df73adaeea08cb2948b9d34990549dc13d800a2" + integrity sha512-XgmCoxKWkDofwH8WddD0w85ZfqYz+ZHlr5yo+3YUCfycWawU56T5ckWXsScsj5B8tqUcIG67DxXByo3VUgiAdA== + rimraf@^2.2.8, rimraf@^2.6.2: version "2.7.1" resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz" @@ -4229,6 +4368,11 @@ safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== +safe-stable-stringify@^2.3.1: + version "2.5.0" + resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz#4ca2f8e385f2831c432a719b108a3bf7af42a1dd" + integrity sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA== + "safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": version "2.1.2" resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" @@ -4268,6 +4412,33 @@ semver@^7.5.4: resolved "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz" integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== +sequelize-pool@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/sequelize-pool/-/sequelize-pool-7.1.0.tgz#210b391af4002762f823188fd6ecfc7413020768" + integrity sha512-G9c0qlIWQSK29pR/5U2JF5dDQeqqHRragoyahj/Nx4KOOQ3CPPfzxnfqFPCSB7x5UgjOgnZ61nSxz+fjDpRlJg== + +sequelize@^6.21.6: + version "6.37.5" + resolved "https://registry.yarnpkg.com/sequelize/-/sequelize-6.37.5.tgz#2711ab97d0e0fe49c652368946a7312eb0f11cd7" + integrity sha512-10WA4poUb3XWnUROThqL2Apq9C2NhyV1xHPMZuybNMCucDsbbFuKg51jhmyvvAUyUqCiimwTZamc3AHhMoBr2Q== + dependencies: + "@types/debug" "^4.1.8" + "@types/validator" "^13.7.17" + debug "^4.3.4" + dottie "^2.0.6" + inflection "^1.13.4" + lodash "^4.17.21" + moment "^2.29.4" + moment-timezone "^0.5.43" + pg-connection-string "^2.6.1" + retry-as-promised "^7.0.4" + semver "^7.5.4" + sequelize-pool "^7.1.0" + toposort-class "^1.0.1" + uuid "^8.3.2" + validator "^13.9.0" + wkx "^0.5.0" + serialize-javascript@^6.0.2: version "6.0.2" resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz" @@ -4356,6 +4527,13 @@ solc@0.7.3: semver "^5.5.0" tmp "0.0.33" +sonic-boom@^4.0.1: + version "4.2.0" + resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-4.2.0.tgz#e59a525f831210fa4ef1896428338641ac1c124d" + integrity sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww== + dependencies: + atomic-sleep "^1.0.0" + source-map-support@^0.5.13: version "0.5.21" resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" @@ -4377,6 +4555,11 @@ spawn-sync@^1.0.15: concat-stream "^1.4.7" os-shim "^0.1.2" +split2@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/split2/-/split2-4.2.0.tgz#c9c5920904d148bab0b9f67145f245a86aadbfa4" + integrity sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg== + stacktrace-parser@^0.1.10: version "0.1.10" resolved "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz" @@ -4483,6 +4666,13 @@ table@^6.8.0: string-width "^4.2.3" strip-ansi "^6.0.1" +thread-stream@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/thread-stream/-/thread-stream-3.1.0.tgz#4b2ef252a7c215064507d4ef70c05a5e2d34c4f1" + integrity sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A== + dependencies: + real-require "^0.2.0" + tmp@0.0.33: version "0.0.33" resolved "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz" @@ -4502,6 +4692,11 @@ toidentifier@1.0.1: resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz" integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== +toposort-class@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toposort-class/-/toposort-class-1.0.1.tgz#7ffd1f78c8be28c3ba45cd4e1a3f5ee193bd9988" + integrity sha512-OsLcGGbYF3rMjPUf8oKktyvCiUxSbqMMS39m33MAjLTC1DVIH6x3WSt63/M77ihI09+Sdfk1AXvfhCEeUmC7mg== + ts-command-line-args@^2.2.0: version "2.5.1" resolved "https://registry.npmjs.org/ts-command-line-args/-/ts-command-line-args-2.5.1.tgz" @@ -4666,6 +4861,11 @@ v8-compile-cache-lib@^3.0.1: resolved "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz" integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== +validator@^13.9.0: + version "13.12.0" + resolved "https://registry.yarnpkg.com/validator/-/validator-13.12.0.tgz#7d78e76ba85504da3fee4fd1922b385914d4b35f" + integrity sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg== + whatwg-encoding@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz" @@ -4680,6 +4880,13 @@ which@1.2.x, which@^1.2.9: dependencies: isexe "^2.0.0" +wkx@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/wkx/-/wkx-0.5.0.tgz#c6c37019acf40e517cc6b94657a25a3d4aa33e8c" + integrity sha512-Xng/d4Ichh8uN4l0FToV/258EjMGU9MGcA0HV2d9B/ZpZB3lqQm7nkOdZdm5GhKtLLhAE7PiVQwN4eN+2YJJUg== + dependencies: + "@types/node" "*" + wordwrapjs@^4.0.0: version "4.0.1" resolved "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz" @@ -4773,6 +4980,11 @@ yargs@^17.7.1: y18n "^5.0.5" yargs-parser "^21.1.1" +yarn@^1.22.22: + version "1.22.22" + resolved "https://registry.yarnpkg.com/yarn/-/yarn-1.22.22.tgz#ac34549e6aa8e7ead463a7407e1c7390f61a6610" + integrity sha512-prL3kGtyG7o9Z9Sv8IPfBNrWTDmXB4Qbes8A9rEzt6wkJV8mUvoirjU0Mp3GGAU06Y0XQyA3/2/RQFVuK7MTfg== + yn@3.1.1: version "3.1.1" resolved "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz" From e9e705d943d12bc12a1f69b114ab9a4ff89bcc7f Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Sat, 22 Feb 2025 02:39:42 +0400 Subject: [PATCH 124/186] + @socket.tech/socket-protocol@1.0.12 --- .../app-gateway/AuctionManager.sol | 2 +- contracts/protocol/utils/common/Errors.sol | 2 +- .../watcherPrecompile/WatcherPrecompile.sol | 18 ++++++-- hardhat-scripts/constants/relayers.ts | 42 +++++++++---------- hardhat-scripts/deploy/2.roles.ts | 23 ++++++---- package.json | 2 +- 6 files changed, 53 insertions(+), 36 deletions(-) diff --git a/contracts/protocol/payload-delivery/app-gateway/AuctionManager.sol b/contracts/protocol/payload-delivery/app-gateway/AuctionManager.sol index 59bad963..17c555db 100644 --- a/contracts/protocol/payload-delivery/app-gateway/AuctionManager.sol +++ b/contracts/protocol/payload-delivery/app-gateway/AuctionManager.sol @@ -152,7 +152,7 @@ contract AuctionManager is AddressResolverUtil, Ownable, IAuctionManager, Initia function expireBid(bytes32 asyncId_) external onlyWatcherPrecompile { PayloadBatch memory batch = IDeliveryHelper(addressResolver__.deliveryHelper()) .payloadBatches(asyncId_); - + // if executed, bid is not expired if (batch.totalPayloadsRemaining == 0 || batch.isBatchCancelled) return; diff --git a/contracts/protocol/utils/common/Errors.sol b/contracts/protocol/utils/common/Errors.sol index 1ab0cde6..11c15386 100644 --- a/contracts/protocol/utils/common/Errors.sol +++ b/contracts/protocol/utils/common/Errors.sol @@ -28,4 +28,4 @@ error InvalidPromise(); error InvalidIndex(); error InvalidTransmitter(); error FeesNotSet(); -error InvalidTokenAddress(); \ No newline at end of file +error InvalidTokenAddress(); diff --git a/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol b/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol index c79753fb..7d18ca94 100644 --- a/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol +++ b/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol @@ -300,7 +300,10 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { /// @dev Only callable by the contract owner /// @dev Watcher signs on following digest for validation on switchboard: /// @dev keccak256(abi.encode(switchboard, root)) - function finalized(bytes32 payloadId_, bytes calldata signature_) external onlyRole(WATCHER_ROLE) { + function finalized( + bytes32 payloadId_, + bytes calldata signature_ + ) external onlyRole(WATCHER_ROLE) { watcherSignatures[payloadId_] = signature_; emit Finalized(payloadId_, asyncRequests[payloadId_], signature_); } @@ -308,7 +311,9 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { /// @notice Resolves multiple promises with their return data /// @param resolvedPromises_ Array of resolved promises and their return data /// @dev Only callable by the contract owner - function resolvePromises(ResolvedPromises[] calldata resolvedPromises_) external onlyRole(WATCHER_ROLE) { + function resolvePromises( + ResolvedPromises[] calldata resolvedPromises_ + ) external onlyRole(WATCHER_ROLE) { for (uint256 i = 0; i < resolvedPromises_.length; i++) { // Get the array of promise addresses for this payload AsyncRequest memory asyncRequest_ = asyncRequests[resolvedPromises_[i].payloadId]; @@ -335,7 +340,10 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { } // wait till expiry time to assign fees - function markRevert(bytes32 payloadId_, bool isRevertingOnchain_) external onlyRole(WATCHER_ROLE) { + function markRevert( + bytes32 payloadId_, + bool isRevertingOnchain_ + ) external onlyRole(WATCHER_ROLE) { AsyncRequest memory asyncRequest_ = asyncRequests[payloadId_]; address[] memory next = asyncRequest_.next; @@ -378,7 +386,9 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { // ================== On-Chain Inbox ================== - function callAppGateways(CallFromInboxParams[] calldata params_) external onlyRole(WATCHER_ROLE) { + function callAppGateways( + CallFromInboxParams[] calldata params_ + ) external onlyRole(WATCHER_ROLE) { for (uint256 i = 0; i < params_.length; i++) { if (appGatewayCalled[params_[i].callId]) revert AppGatewayAlreadyCalled(); if (!isValidInboxCaller[params_[i].appGateway][params_[i].chainSlug][params_[i].plug]) diff --git a/hardhat-scripts/constants/relayers.ts b/hardhat-scripts/constants/relayers.ts index 1cbee517..589291d9 100644 --- a/hardhat-scripts/constants/relayers.ts +++ b/hardhat-scripts/constants/relayers.ts @@ -1,22 +1,22 @@ export const relayerAddressList = [ - "0x59D24CD3A0b2b646F980A62DCb0aA4115506FFc9", - "0x762783712FD12231601d6d8591F3a5718812D534", - "0x9f5C9941306E7B57583E99033BedB7eA7889EEA4", - "0xd35F262d6f2D3F6D610bAf6635dE57c349ca83A1", - "0xce6b9c352f864515d7E8BBEA67d80d18245937F2", - "0xE651eDb3F16D9e6b1145ae5eee388f0e48D2d44b", - "0xc176E88dE45747743699fAeA58814Ce98a2faC2D", - "0x88220692264EEc280Bd5AaF9278CdE0737Feb2D6", - "0x2d68551354226c7321130f122055F049F8F67791", - "0xA7C89619ceaC009a23c6C3bC5F74d41BBaC68fD1", - "0x7893D79718860DF30e5Fd21AAA6Be05edD22465D", - "0x6386c83e994331c6a41A4420294D130930AEDF9e", - "0xfF33A0afc88CbF48C9DB31Fc2D2EC2F36D598184", - "0xB756B6D986eE448433542A60A1f590EE3B0DFCda", - "0x76943F947D5622624444aeFF135a5121d6732299", - "0x049B750045fdE15F347aF9E86FB80dD879C848ea", - "0x9c653569C32473F40210495128BB5A40ef10c65B", - "0x0291a40beF28E3606b8208a665F900d141E9A8B3", - "0x2e498dFB44CC79D2ef80Afd7C4439BEC8822E216", - "0x049E701A690E885467E54A1B0595f90BDc8324B0" -] \ No newline at end of file + "0x59D24CD3A0b2b646F980A62DCb0aA4115506FFc9", + "0x762783712FD12231601d6d8591F3a5718812D534", + "0x9f5C9941306E7B57583E99033BedB7eA7889EEA4", + "0xd35F262d6f2D3F6D610bAf6635dE57c349ca83A1", + "0xce6b9c352f864515d7E8BBEA67d80d18245937F2", + "0xE651eDb3F16D9e6b1145ae5eee388f0e48D2d44b", + "0xc176E88dE45747743699fAeA58814Ce98a2faC2D", + "0x88220692264EEc280Bd5AaF9278CdE0737Feb2D6", + "0x2d68551354226c7321130f122055F049F8F67791", + "0xA7C89619ceaC009a23c6C3bC5F74d41BBaC68fD1", + "0x7893D79718860DF30e5Fd21AAA6Be05edD22465D", + "0x6386c83e994331c6a41A4420294D130930AEDF9e", + "0xfF33A0afc88CbF48C9DB31Fc2D2EC2F36D598184", + "0xB756B6D986eE448433542A60A1f590EE3B0DFCda", + "0x76943F947D5622624444aeFF135a5121d6732299", + "0x049B750045fdE15F347aF9E86FB80dD879C848ea", + "0x9c653569C32473F40210495128BB5A40ef10c65B", + "0x0291a40beF28E3606b8208a665F900d141E9A8B3", + "0x2e498dFB44CC79D2ef80Afd7C4439BEC8822E216", + "0x049E701A690E885467E54A1B0595f90BDc8324B0", +]; diff --git a/hardhat-scripts/deploy/2.roles.ts b/hardhat-scripts/deploy/2.roles.ts index 687cee9b..fe6ab9f9 100644 --- a/hardhat-scripts/deploy/2.roles.ts +++ b/hardhat-scripts/deploy/2.roles.ts @@ -60,28 +60,34 @@ async function setRoleForContract( async function getSigner(chain: number, isWatcher: boolean = false) { const providerInstance = getProviderFromChainSlug(chain); const signer: Wallet = new ethers.Wallet( - isWatcher ? process.env.WATCHER_PRIVATE_KEY as string : process.env.SOCKET_SIGNER_KEY as string, + isWatcher + ? (process.env.WATCHER_PRIVATE_KEY as string) + : (process.env.SOCKET_SIGNER_KEY as string), providerInstance ); return signer; } - -async function setRolesForOnChain(chain: number, addresses: DeploymentAddresses) { - const chainAddresses: ChainAddressesObj = (addresses[chain] ?? {}) as ChainAddressesObj; +async function setRolesForOnChain( + chain: number, + addresses: DeploymentAddresses +) { + const chainAddresses: ChainAddressesObj = (addresses[chain] ?? + {}) as ChainAddressesObj; const signer = await getSigner(chain); for (const [contractName, roles] of Object.entries(REQUIRED_ROLES)) { - const contractAddress = chainAddresses[contractName as keyof ChainAddressesObj]; + const contractAddress = + chainAddresses[contractName as keyof ChainAddressesObj]; if (!contractAddress) continue; for (const roleName of roles) { const targetAddress = - contractName === CORE_CONTRACTS.FastSwitchboard && roleName === ROLES.WATCHER_ROLE + contractName === CORE_CONTRACTS.FastSwitchboard && + roleName === ROLES.WATCHER_ROLE ? watcher : signer.address; - await setRoleForContract( contractName as CORE_CONTRACTS, contractAddress, @@ -95,7 +101,8 @@ async function setRolesForOnChain(chain: number, addresses: DeploymentAddresses) } async function setRolesForEVMx(addresses: DeploymentAddresses) { - const chainAddresses: ChainAddressesObj = (addresses[EVMX_CHAIN_ID] ?? {}) as ChainAddressesObj; + const chainAddresses: ChainAddressesObj = (addresses[EVMX_CHAIN_ID] ?? + {}) as ChainAddressesObj; const signer = await getSigner(EVMX_CHAIN_ID, true); const contractAddress = chainAddresses[EVMxCoreContracts.WatcherPrecompile]; diff --git a/package.json b/package.json index 7e70a99c..250a9afd 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "publishConfig": { "access": "public" }, - "version": "1.0.11", + "version": "1.0.12", "description": "socket protocol", "scripts": { "build": "hardhat export-abi && tsc --project lib.tsconfig.json", From e4b143b1d42112c18411810dc5411842b1b5bde3 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Mon, 24 Feb 2025 18:53:30 +0400 Subject: [PATCH 125/186] gix: origin gateway rename --- contracts/protocol/AddressResolver.sol | 4 +-- .../app-gateway/BatchAsync.sol | 1 + .../app-gateway/FeesManager.sol | 26 +++++++++---------- .../protocol/utils/AddressResolverUtil.sol | 6 ++--- .../WatcherPrecompileLimits.sol | 10 +++---- 5 files changed, 24 insertions(+), 23 deletions(-) diff --git a/contracts/protocol/AddressResolver.sol b/contracts/protocol/AddressResolver.sol index 5be797e7..28050c26 100644 --- a/contracts/protocol/AddressResolver.sol +++ b/contracts/protocol/AddressResolver.sol @@ -36,7 +36,7 @@ contract AddressResolver is Ownable, IAddressResolver, Initializable { mapping(address => address) public override gatewaysToContracts; /// @notice Error thrown if AppGateway contract was already set by a different address - error AppGatewayContractAlreadySetByDifferentSender(address contractAddress_); + error InvalidCaller(address contractAddress_); event PlugAdded(address appGateway, uint32 chainSlug, address plug); event ForwarderDeployed(address newForwarder, bytes32 salt); @@ -166,7 +166,7 @@ contract AddressResolver is Ownable, IAddressResolver, Initializable { contractsToGateways[contractAddress_] != address(0) && contractsToGateways[contractAddress_] != msg.sender ) { - revert AppGatewayContractAlreadySetByDifferentSender(contractAddress_); + revert InvalidCaller(contractAddress_); } contractsToGateways[contractAddress_] = msg.sender; } diff --git a/contracts/protocol/payload-delivery/app-gateway/BatchAsync.sol b/contracts/protocol/payload-delivery/app-gateway/BatchAsync.sol index 39cd5674..03c0a42c 100644 --- a/contracts/protocol/payload-delivery/app-gateway/BatchAsync.sol +++ b/contracts/protocol/payload-delivery/app-gateway/BatchAsync.sol @@ -182,6 +182,7 @@ abstract contract BatchAsync is QueueAsync { uint256 readEndIndex, bytes32 asyncId ) internal returns (address) { + // later changed to main app gateway if its a write call address appGateway = msg.sender; uint256 writes = 0; diff --git a/contracts/protocol/payload-delivery/app-gateway/FeesManager.sol b/contracts/protocol/payload-delivery/app-gateway/FeesManager.sol index 8acf5997..3ce49665 100644 --- a/contracts/protocol/payload-delivery/app-gateway/FeesManager.sol +++ b/contracts/protocol/payload-delivery/app-gateway/FeesManager.sol @@ -127,19 +127,19 @@ contract FeesManager is IFeesManager, AddressResolverUtil, Ownable, Initializabl /// @param amount_ The amount deposited function incrementFeesDeposited( uint32 chainSlug_, - address appGateway_, + address originAppGateway_, address token_, uint256 amount_ ) external onlyOwner { - address appGateway = _getCoreAppGateway(appGateway_); + address appGateway = _getCoreAppGateway(originAppGateway_); TokenBalance storage tokenBalance = appGatewayFeeBalances[appGateway][chainSlug_][token_]; tokenBalance.deposited += amount_; emit FeesDepositedUpdated(chainSlug_, appGateway, token_, amount_); } - function isFeesEnough(address appGateway_, Fees memory fees_) external view returns (bool) { - address appGateway = _getCoreAppGateway(appGateway_); + function isFeesEnough(address originAppGateway_, Fees memory fees_) external view returns (bool) { + address appGateway = _getCoreAppGateway(originAppGateway_); uint256 availableFees = getAvailableFees( fees_.feePoolChain, appGateway, @@ -154,7 +154,7 @@ contract FeesManager is IFeesManager, AddressResolverUtil, Ownable, Initializabl /// @param asyncId_ The batch identifier /// @dev Only callable by delivery helper function blockFees( - address appGateway_, + address originAppGateway_, Fees memory feesGivenByApp_, Bid memory winningBid_, bytes32 asyncId_ @@ -162,7 +162,7 @@ contract FeesManager is IFeesManager, AddressResolverUtil, Ownable, Initializabl if (msg.sender != deliveryHelper().getAsyncBatchDetails(asyncId_).auctionManager) revert NotAuctionManager(); - address appGateway = _getCoreAppGateway(appGateway_); + address appGateway = _getCoreAppGateway(originAppGateway_); // Block fees uint256 availableFees = getAvailableFees( feesGivenByApp_.feePoolChain, @@ -203,12 +203,12 @@ contract FeesManager is IFeesManager, AddressResolverUtil, Ownable, Initializabl function unblockAndAssignFees( bytes32 asyncId_, address transmitter_, - address appGateway_ + address originAppGateway_ ) external override onlyDeliveryHelper { Fees memory fees = asyncIdBlockedFees[asyncId_]; if (fees.amount == 0) revert NoFeesBlocked(); - address appGateway = _getCoreAppGateway(appGateway_); + address appGateway = _getCoreAppGateway(originAppGateway_); TokenBalance storage tokenBalance = appGatewayFeeBalances[appGateway][fees.feePoolChain][ fees.feePoolToken ]; @@ -225,11 +225,11 @@ contract FeesManager is IFeesManager, AddressResolverUtil, Ownable, Initializabl emit FeesUnblockedAndAssigned(asyncId_, transmitter_, fees.amount); } - function unblockFees(bytes32 asyncId_, address appGateway_) external onlyDeliveryHelper { + function unblockFees(bytes32 asyncId_, address originAppGateway_) external onlyDeliveryHelper { Fees memory fees = asyncIdBlockedFees[asyncId_]; if (fees.amount == 0) revert NoFeesBlocked(); - address appGateway = _getCoreAppGateway(appGateway_); + address appGateway = _getCoreAppGateway(originAppGateway_); TokenBalance storage tokenBalance = appGatewayFeeBalances[appGateway][fees.feePoolChain][ fees.feePoolToken ]; @@ -297,19 +297,19 @@ contract FeesManager is IFeesManager, AddressResolverUtil, Ownable, Initializabl /// @notice Withdraws funds to a specified receiver /// @dev This function is used to withdraw fees from the fees plug - /// @param appGateway_ The address of the app gateway + /// @param originAppGateway_ The address of the app gateway /// @param chainSlug_ The chain identifier /// @param token_ The address of the token /// @param amount_ The amount of tokens to withdraw /// @param receiver_ The address of the receiver function getWithdrawToPayload( - address appGateway_, + address originAppGateway_, uint32 chainSlug_, address token_, uint256 amount_, address receiver_ ) public returns (PayloadDetails memory) { - address appGateway = _getCoreAppGateway(appGateway_); + address appGateway = _getCoreAppGateway(originAppGateway_); // Check if amount is available in fees plug uint256 availableAmount = getAvailableFees(chainSlug_, appGateway, token_); diff --git a/contracts/protocol/utils/AddressResolverUtil.sol b/contracts/protocol/utils/AddressResolverUtil.sol index 6172427b..de888174 100644 --- a/contracts/protocol/utils/AddressResolverUtil.sol +++ b/contracts/protocol/utils/AddressResolverUtil.sol @@ -59,9 +59,9 @@ abstract contract AddressResolverUtil { addressResolver__ = IAddressResolver(_addressResolver); } - function _getCoreAppGateway(address appGateway_) internal view returns (address appGateway) { - appGateway = addressResolver__.contractsToGateways(appGateway_); - if (appGateway == address(0)) appGateway = appGateway_; + function _getCoreAppGateway(address originAppGateway_) internal view returns (address appGateway) { + appGateway = addressResolver__.contractsToGateways(originAppGateway_); + if (appGateway == address(0)) appGateway = originAppGateway_; } // for proxy contracts diff --git a/contracts/protocol/watcherPrecompile/WatcherPrecompileLimits.sol b/contracts/protocol/watcherPrecompile/WatcherPrecompileLimits.sol index 284d012c..2753ee41 100644 --- a/contracts/protocol/watcherPrecompile/WatcherPrecompileLimits.sol +++ b/contracts/protocol/watcherPrecompile/WatcherPrecompileLimits.sol @@ -152,15 +152,15 @@ abstract contract WatcherPrecompileLimits is /** * @notice Internal function to get the core app gateway address - * @param appGateway_ The input app gateway address + * @param originAppGateway_ The input app gateway address * @return appGateway The resolved core app gateway address */ - function _getAppGateway(address appGateway_) internal view returns (address appGateway) { - address resolverAddress = msg.sender == addressResolver__.deliveryHelper() - ? appGateway_ + function _getAppGateway(address originAppGateway_) internal view returns (address appGateway) { + address originAppGateway = msg.sender == addressResolver__.deliveryHelper() + ? originAppGateway_ : msg.sender; - appGateway = _getCoreAppGateway(resolverAddress); + appGateway = _getCoreAppGateway(originAppGateway); } /** From 9f70039e023f9e0fc9aab2c74ee9820ba51193cb Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Mon, 24 Feb 2025 19:01:13 +0400 Subject: [PATCH 126/186] rename: watchervm/offchain to EVMx --- contracts/interfaces/ISocket.sol | 4 ++-- .../app-gateway/AuctionManager.sol | 10 +++++----- .../payload-delivery/app-gateway/FeesManager.sol | 9 ++++++--- contracts/protocol/utils/AddressResolverUtil.sol | 4 +++- .../watcherPrecompile/WatcherPrecompile.sol | 10 +++++----- hardhat-scripts/deploy/1.deploy.ts | 16 ++++++++-------- hardhat-scripts/deploy/2.roles.ts | 7 +++++-- hardhat-scripts/deploy/3.upgradeManagers.ts | 4 ++-- hardhat-scripts/deploy/4.connect.ts | 12 ++++++------ script/mock/{DeployVM.s.sol => DeployEVMx.s.sol} | 3 ++- .../{deployOffchain.s.sol => deployOnEVMx.s.sol} | 0 test/DeliveryHelper.t.sol | 12 ++++++++---- test/Migration.t.sol | 2 +- test/SetupTest.t.sol | 6 +++--- test/apps/Counter.t.sol | 4 ++-- test/apps/SuperToken.t.sol | 2 +- test/apps/SuperTokenLockable.t.sol | 11 +++++++---- testScript.sh | 4 ++-- 18 files changed, 68 insertions(+), 52 deletions(-) rename script/mock/{DeployVM.s.sol => DeployEVMx.s.sol} (95%) rename script/parallel-counter/{deployOffchain.s.sol => deployOnEVMx.s.sol} (100%) diff --git a/contracts/interfaces/ISocket.sol b/contracts/interfaces/ISocket.sol index 60729a00..d46f6eca 100644 --- a/contracts/interfaces/ISocket.sol +++ b/contracts/interfaces/ISocket.sol @@ -65,8 +65,8 @@ interface ISocket { } /** - * @notice To call the appGateway on offChainVM. Should only be called by a plug. - * @param payload_ bytes to be delivered to the Plug on offChainVM + * @notice To call the appGateway on EVMx. Should only be called by a plug. + * @param payload_ bytes to be delivered to the Plug on EVMx * @param params_ a 32 bytes param to add details for execution. */ function callAppGateway( diff --git a/contracts/protocol/payload-delivery/app-gateway/AuctionManager.sol b/contracts/protocol/payload-delivery/app-gateway/AuctionManager.sol index 17c555db..f5933c02 100644 --- a/contracts/protocol/payload-delivery/app-gateway/AuctionManager.sol +++ b/contracts/protocol/payload-delivery/app-gateway/AuctionManager.sol @@ -13,7 +13,7 @@ import "solady/utils/Initializable.sol"; /// @title AuctionManager /// @notice Contract for managing auctions and placing bids contract AuctionManager is AddressResolverUtil, Ownable, IAuctionManager, Initializable { - uint32 public vmChainSlug; + uint32 public evmxChainSlug; mapping(bytes32 => Bid) public winningBids; // asyncId => auction status mapping(bytes32 => bool) public override auctionClosed; @@ -39,19 +39,19 @@ contract AuctionManager is AddressResolverUtil, Ownable, IAuctionManager, Initia } /// @notice Initializer function to replace constructor - /// @param vmChainSlug_ The chain slug for the VM + /// @param evmxChainSlug_ The chain slug for the VM /// @param auctionEndDelaySeconds_ The delay in seconds before an auction can end /// @param addressResolver_ The address of the address resolver /// @param owner_ The address of the contract owner function initialize( - uint32 vmChainSlug_, + uint32 evmxChainSlug_, uint256 auctionEndDelaySeconds_, address addressResolver_, address owner_ ) public reinitializer(1) { _setAddressResolver(addressResolver_); _initializeOwner(owner_); - vmChainSlug = vmChainSlug_; + evmxChainSlug = evmxChainSlug_; auctionEndDelaySeconds = auctionEndDelaySeconds_; } @@ -84,7 +84,7 @@ contract AuctionManager is AddressResolverUtil, Ownable, IAuctionManager, Initia if (auctionClosed[asyncId_]) revert AuctionClosed(); address transmitter = _recoverSigner( - keccak256(abi.encode(address(this), vmChainSlug, asyncId_, fee, extraData)), + keccak256(abi.encode(address(this), evmxChainSlug, asyncId_, fee, extraData)), transmitterSignature ); diff --git a/contracts/protocol/payload-delivery/app-gateway/FeesManager.sol b/contracts/protocol/payload-delivery/app-gateway/FeesManager.sol index 3ce49665..8c6873de 100644 --- a/contracts/protocol/payload-delivery/app-gateway/FeesManager.sol +++ b/contracts/protocol/payload-delivery/app-gateway/FeesManager.sol @@ -122,7 +122,7 @@ contract FeesManager is IFeesManager, AddressResolverUtil, Ownable, Initializabl /// @notice Adds the fees deposited for an app gateway on a chain /// @param chainSlug_ The chain identifier - /// @param appGateway_ The app gateway address + /// @param originAppGateway_ The app gateway address /// @param token_ The token address /// @param amount_ The amount deposited function incrementFeesDeposited( @@ -138,7 +138,10 @@ contract FeesManager is IFeesManager, AddressResolverUtil, Ownable, Initializabl emit FeesDepositedUpdated(chainSlug_, appGateway, token_, amount_); } - function isFeesEnough(address originAppGateway_, Fees memory fees_) external view returns (bool) { + function isFeesEnough( + address originAppGateway_, + Fees memory fees_ + ) external view returns (bool) { address appGateway = _getCoreAppGateway(originAppGateway_); uint256 availableFees = getAvailableFees( fees_.feePoolChain, @@ -149,7 +152,7 @@ contract FeesManager is IFeesManager, AddressResolverUtil, Ownable, Initializabl } /// @notice Blocks fees for transmitter - /// @param appGateway_ The app gateway address + /// @param originAppGateway_ The app gateway address /// @param feesGivenByApp_ The fees data struct given by the app gateway /// @param asyncId_ The batch identifier /// @dev Only callable by delivery helper diff --git a/contracts/protocol/utils/AddressResolverUtil.sol b/contracts/protocol/utils/AddressResolverUtil.sol index de888174..a0dcd789 100644 --- a/contracts/protocol/utils/AddressResolverUtil.sol +++ b/contracts/protocol/utils/AddressResolverUtil.sol @@ -59,7 +59,9 @@ abstract contract AddressResolverUtil { addressResolver__ = IAddressResolver(_addressResolver); } - function _getCoreAppGateway(address originAppGateway_) internal view returns (address appGateway) { + function _getCoreAppGateway( + address originAppGateway_ + ) internal view returns (address appGateway) { appGateway = addressResolver__.contractsToGateways(originAppGateway_); if (appGateway == address(0)) appGateway = originAppGateway_; } diff --git a/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol b/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol index ec51b20d..368d8dfc 100644 --- a/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol +++ b/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol @@ -19,7 +19,7 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { uint256 public expiryTime; /// @notice The chain slug of the watcher precompile - uint32 public vmChainSlug; + uint32 public evmxChainSlug; /// @notice Mapping to store async requests /// @dev payloadId => AsyncRequest struct @@ -107,7 +107,7 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { address addressResolver_, uint256 defaultLimit_, uint256 expiryTime_, - uint32 vmChainSlug_ + uint32 evmxChainSlug_ ) public reinitializer(1) { _setAddressResolver(addressResolver_); _initializeOwner(owner_); @@ -119,7 +119,7 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { // limit per second defaultRatePerSecond = defaultLimit / (24 * 60 * 60); - vmChainSlug = vmChainSlug_; + evmxChainSlug = evmxChainSlug_; } // ================== Timeout functions ================== @@ -137,7 +137,7 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { // from auction manager _consumeLimit(appGateway_, SCHEDULE, 1); uint256 executeAt = block.timestamp + delayInSeconds_; - bytes32 timeoutId = _encodeId(vmChainSlug, address(this)); + bytes32 timeoutId = _encodeId(evmxChainSlug, address(this)); timeoutRequests[timeoutId] = TimeoutRequest( timeoutId, msg.sender, @@ -273,7 +273,7 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { // from payload delivery _consumeLimit(appGateway_, QUERY, 1); // Generate unique payload ID from query counter - payloadId = _encodeId(vmChainSlug, address(this)); + payloadId = _encodeId(evmxChainSlug, address(this)); // Create async request with minimal information for queries // Note: addresses set to 0 as they're not needed for queries diff --git a/hardhat-scripts/deploy/1.deploy.ts b/hardhat-scripts/deploy/1.deploy.ts index 92c9c5f0..a860969a 100644 --- a/hardhat-scripts/deploy/1.deploy.ts +++ b/hardhat-scripts/deploy/1.deploy.ts @@ -25,7 +25,7 @@ import { } from "../utils"; config(); -let offChainVMOwner: string; +let EVMxOwner: string; const main = async () => { logConfig(); @@ -57,7 +57,7 @@ const deployEVMxContracts = async () => { process.env.WATCHER_PRIVATE_KEY as string, providerInstance ); - offChainVMOwner = signer.address; + EVMxOwner = signer.address; deployUtils = { addresses: chainAddresses, @@ -80,7 +80,7 @@ const deployEVMxContracts = async () => { deployUtils = await deployContractWithProxy( EVMxCoreContracts.AddressResolver, `contracts/protocol/AddressResolver.sol`, - [offChainVMOwner], + [EVMxOwner], proxyFactory, deployUtils ); @@ -94,7 +94,7 @@ const deployEVMxContracts = async () => { EVMxCoreContracts.WatcherPrecompile, `contracts/protocol/watcherPrecompile/WatcherPrecompile.sol`, [ - offChainVMOwner, + EVMxOwner, addressResolver.address, MAX_LIMIT, EXPIRY_TIME, @@ -107,7 +107,7 @@ const deployEVMxContracts = async () => { deployUtils = await deployContractWithProxy( EVMxCoreContracts.FeesManager, `contracts/protocol/payload-delivery/app-gateway/FeesManager.sol`, - [addressResolver.address, offChainVMOwner], + [addressResolver.address, EVMxOwner], proxyFactory, deployUtils ); @@ -119,7 +119,7 @@ const deployEVMxContracts = async () => { deployUtils = await deployContractWithProxy( EVMxCoreContracts.DeliveryHelper, `contracts/protocol/payload-delivery/app-gateway/DeliveryHelper.sol`, - [addressResolver.address, offChainVMOwner, BID_TIMEOUT], + [addressResolver.address, EVMxOwner, BID_TIMEOUT], proxyFactory, deployUtils ); @@ -131,7 +131,7 @@ const deployEVMxContracts = async () => { EVMX_CHAIN_ID, auctionEndDelaySeconds, addressResolver.address, - offChainVMOwner, + EVMxOwner, ], proxyFactory, deployUtils @@ -380,7 +380,7 @@ const deployContractWithProxy = async ( // Deploy transparent proxy const tx = await proxyFactory .connect(deployUtils.signer) - .deployAndCall(implementation.address, offChainVMOwner, initData); + .deployAndCall(implementation.address, EVMxOwner, initData); const receipt = await tx.wait(); const proxyAddress = receipt.events?.find((e) => e.event === "Deployed")?.args ?.proxy; diff --git a/hardhat-scripts/deploy/2.roles.ts b/hardhat-scripts/deploy/2.roles.ts index fd9b60bb..fe6ab9f9 100644 --- a/hardhat-scripts/deploy/2.roles.ts +++ b/hardhat-scripts/deploy/2.roles.ts @@ -60,7 +60,9 @@ async function setRoleForContract( async function getSigner(chain: number, isWatcher: boolean = false) { const providerInstance = getProviderFromChainSlug(chain); const signer: Wallet = new ethers.Wallet( - isWatcher ? process.env.WATCHER_PRIVATE_KEY as string : process.env.SOCKET_SIGNER_KEY as string, + isWatcher + ? (process.env.WATCHER_PRIVATE_KEY as string) + : (process.env.SOCKET_SIGNER_KEY as string), providerInstance ); return signer; @@ -99,7 +101,8 @@ async function setRolesForOnChain( } async function setRolesForEVMx(addresses: DeploymentAddresses) { - const chainAddresses: ChainAddressesObj = (addresses[EVMX_CHAIN_ID] ?? {}) as ChainAddressesObj; + const chainAddresses: ChainAddressesObj = (addresses[EVMX_CHAIN_ID] ?? + {}) as ChainAddressesObj; const signer = await getSigner(EVMX_CHAIN_ID, true); const contractAddress = chainAddresses[EVMxCoreContracts.WatcherPrecompile]; diff --git a/hardhat-scripts/deploy/3.upgradeManagers.ts b/hardhat-scripts/deploy/3.upgradeManagers.ts index 6dca3449..92a522d5 100644 --- a/hardhat-scripts/deploy/3.upgradeManagers.ts +++ b/hardhat-scripts/deploy/3.upgradeManagers.ts @@ -64,11 +64,11 @@ async function setOnchainContracts(chain, addresses) { process.env.WATCHER_PRIVATE_KEY as string, providerInstance ); - const watcherVMaddr = addresses[EVMX_CHAIN_ID]!; + const EVMxAddresses = addresses[EVMX_CHAIN_ID]!; const watcherPrecompile = ( await getInstance( EVMxCoreContracts.WatcherPrecompile, - watcherVMaddr[EVMxCoreContracts.WatcherPrecompile] + EVMxAddresses[EVMxCoreContracts.WatcherPrecompile] ) ).connect(signer); diff --git a/hardhat-scripts/deploy/4.connect.ts b/hardhat-scripts/deploy/4.connect.ts index 203badb3..7baec350 100644 --- a/hardhat-scripts/deploy/4.connect.ts +++ b/hardhat-scripts/deploy/4.connect.ts @@ -122,7 +122,7 @@ export const connectPlugsOnSocket = async () => { ); }; -export const isConfigSetOnWatcherVM = async ( +export const isConfigSetOnEVMx = async ( watcher: Contract, chain: number, plug: string, @@ -137,7 +137,7 @@ export const isConfigSetOnWatcherVM = async ( }; // Configure plugs on the Watcher VM -export const updateConfigWatcherVM = async () => { +export const updateConfigEVMx = async () => { try { console.log("Connecting plugs on EVMx"); const addresses = dev_addresses as unknown as DeploymentAddresses; @@ -151,11 +151,11 @@ export const updateConfigWatcherVM = async () => { process.env.WATCHER_PRIVATE_KEY as string, providerInstance ); - const watcherVMaddr = addresses[EVMX_CHAIN_ID]!; + const EVMxAddresses = addresses[EVMX_CHAIN_ID]!; const watcher = ( await getInstance( EVMxCoreContracts.WatcherPrecompile, - watcherVMaddr[EVMxCoreContracts.WatcherPrecompile] + EVMxAddresses[EVMxCoreContracts.WatcherPrecompile] ) ).connect(signer); @@ -172,7 +172,7 @@ export const updateConfigWatcherVM = async () => { checkIfAddressExists(appGateway, "AppGateway"); if ( - await isConfigSetOnWatcherVM( + await isConfigSetOnEVMx( watcher, chain, addr[plugContract], @@ -209,7 +209,7 @@ export const updateConfigWatcherVM = async () => { export const main = async () => { try { await connectPlugsOnSocket(); - await updateConfigWatcherVM(); + await updateConfigEVMx(); } catch (error) { console.log("Error while sending transaction", error); } diff --git a/script/mock/DeployVM.s.sol b/script/mock/DeployEVMx.s.sol similarity index 95% rename from script/mock/DeployVM.s.sol rename to script/mock/DeployEVMx.s.sol index 31ecee3f..12570d06 100644 --- a/script/mock/DeployVM.s.sol +++ b/script/mock/DeployEVMx.s.sol @@ -5,7 +5,8 @@ import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/console.sol"; import {MockWatcherPrecompile} from "../../contracts/mock/MockWatcherPrecompile.sol"; import {MockSocket} from "../../contracts/mock/MockSocket.sol"; -contract DeployVM is Script { + +contract DeployEVMx is Script { function run() external { string memory rpc = vm.envString("EVMX_RPC"); vm.createSelectFork(rpc); diff --git a/script/parallel-counter/deployOffchain.s.sol b/script/parallel-counter/deployOnEVMx.s.sol similarity index 100% rename from script/parallel-counter/deployOffchain.s.sol rename to script/parallel-counter/deployOnEVMx.s.sol diff --git a/test/DeliveryHelper.t.sol b/test/DeliveryHelper.t.sol index b95d7b34..05c1f417 100644 --- a/test/DeliveryHelper.t.sol +++ b/test/DeliveryHelper.t.sol @@ -39,7 +39,7 @@ contract DeliveryHelperTest is SetupTest { function setUpDeliveryHelper() internal { // core - deployOffChainVMCore(); + deployEVMxCore(); // Deploy implementations FeesManager feesManagerImpl = new FeesManager(); DeliveryHelper deliveryHelperImpl = new DeliveryHelper(); @@ -78,7 +78,7 @@ contract DeliveryHelperTest is SetupTest { bytes memory auctionManagerData = abi.encodeWithSelector( AuctionManager.initialize.selector, - vmChainSlug, + evmxChainSlug, auctionEndDelaySeconds, address(addressResolver), owner, @@ -469,7 +469,7 @@ contract DeliveryHelperTest is SetupTest { vm.prank(transmitterEOA); bytes memory transmitterSignature = _createSignature( - keccak256(abi.encode(address(auctionManager), vmChainSlug, asyncId, bidAmount, "")), + keccak256(abi.encode(address(auctionManager), evmxChainSlug, asyncId, bidAmount, "")), transmitterPrivateKey ); @@ -485,7 +485,11 @@ contract DeliveryHelperTest is SetupTest { // ); if (auctionEndDelaySeconds == 0) return; - bytes32 timeoutId = _encodeId(vmChainSlug, address(watcherPrecompile), payloadIdCounter++); + bytes32 timeoutId = _encodeId( + evmxChainSlug, + address(watcherPrecompile), + payloadIdCounter++ + ); hoax(watcherEOA); watcherPrecompile.resolveTimeout(timeoutId); diff --git a/test/Migration.t.sol b/test/Migration.t.sol index f29eceda..e073092b 100644 --- a/test/Migration.t.sol +++ b/test/Migration.t.sol @@ -28,7 +28,7 @@ contract MigrationTest is SetupTest { bytes4 internal constant UNAUTHORIZED_SELECTOR = 0x82b42900; // bytes4(keccak256("Unauthorized()")) function setUp() public { - deployOffChainVMCore(); + deployEVMxCore(); } function getImplementation(address proxy) internal view returns (address) { diff --git a/test/SetupTest.t.sol b/test/SetupTest.t.sol index 7ffbdc2c..83b75e5c 100644 --- a/test/SetupTest.t.sol +++ b/test/SetupTest.t.sol @@ -32,7 +32,7 @@ contract SetupTest is Test { uint32 arbChainSlug = 421614; uint32 optChainSlug = 11155420; - uint32 vmChainSlug = 1; + uint32 evmxChainSlug = 1; uint256 expiryTime = 10000000; uint256 public payloadIdCounter = 0; @@ -100,7 +100,7 @@ contract SetupTest is Test { }); } - function deployOffChainVMCore() internal { + function deployEVMxCore() internal { // Deploy implementations addressResolverImpl = new AddressResolver(); watcherPrecompileImpl = new WatcherPrecompile(); @@ -125,7 +125,7 @@ contract SetupTest is Test { address(addressResolverProxy), defaultLimit, expiryTime, - vmChainSlug + evmxChainSlug ); vm.expectEmit(true, true, true, false); emit Initialized(version); diff --git a/test/apps/Counter.t.sol b/test/apps/Counter.t.sol index e0ed658b..2ba5884a 100644 --- a/test/apps/Counter.t.sol +++ b/test/apps/Counter.t.sol @@ -143,8 +143,8 @@ contract CounterTest is DeliveryHelperTest { bytes32 bridgeAsyncId = getCurrentAsyncId(); bytes32[] memory payloadIds = new bytes32[](3); - payloadIds[0] = _encodeId(vmChainSlug, address(watcherPrecompile), payloadIdCounter++); - payloadIds[1] = _encodeId(vmChainSlug, address(watcherPrecompile), payloadIdCounter++); + payloadIds[0] = _encodeId(evmxChainSlug, address(watcherPrecompile), payloadIdCounter++); + payloadIds[1] = _encodeId(evmxChainSlug, address(watcherPrecompile), payloadIdCounter++); payloadIds[2] = getWritePayloadId( arbChainSlug, diff --git a/test/apps/SuperToken.t.sol b/test/apps/SuperToken.t.sol index 56066ed9..d9558a75 100644 --- a/test/apps/SuperToken.t.sol +++ b/test/apps/SuperToken.t.sol @@ -84,7 +84,7 @@ contract SuperTokenTest is DeliveryHelperTest { createFees(maxFees), address(auctionManager) ); - // Enable app gateways to do all operations in the Watcher: Read, Write and Schedule on VM + // Enable app gateways to do all operations in the Watcher: Read, Write and Schedule on EVMx // Watcher sets the limits for apps in this SOCKET protocol version depositFees(address(superTokenApp), createFees(1 ether)); diff --git a/test/apps/SuperTokenLockable.t.sol b/test/apps/SuperTokenLockable.t.sol index 95e6bebe..cb7ee1ee 100644 --- a/test/apps/SuperTokenLockable.t.sol +++ b/test/apps/SuperTokenLockable.t.sol @@ -116,11 +116,14 @@ contract SuperTokenLockableTest is DeliveryHelperTest { address appDeployer = address(uint160(c++)); address chainContractAddress = address(uint160(c++)); - address predicted = addressResolver.getForwarderAddress(chainContractAddress, vmChainSlug); + address predicted = addressResolver.getForwarderAddress( + chainContractAddress, + evmxChainSlug + ); address forwarder = addressResolver.getOrDeployForwarderContract( appDeployer, chainContractAddress, - vmChainSlug + evmxChainSlug ); assertEq(forwarder, predicted); @@ -285,7 +288,7 @@ contract SuperTokenLockableTest is DeliveryHelperTest { address(getSocketConfig(srcChainSlug).switchboard), payloadIdCounter++ ); - payloadIds[1] = _encodeId(vmChainSlug, address(watcherPrecompile), payloadIdCounter++); + payloadIds[1] = _encodeId(evmxChainSlug, address(watcherPrecompile), payloadIdCounter++); payloadIds[2] = getWritePayloadId( dstChainSlug, address(getSocketConfig(dstChainSlug).switchboard), @@ -540,7 +543,7 @@ contract SuperTokenLockableTest is DeliveryHelperTest { // address(getSocketConfig(srcChainSlug).contractFactoryPlug), // payloadIdCounter++ // ); - // payloadIds[1] = _encodeId(vmChainSlug, address(watcherPrecompile), payloadIdCounter++); + // payloadIds[1] = _encodeId(evmxChainSlug, address(watcherPrecompile), payloadIdCounter++); // payloadIds[2] = getWritePayloadId( // dstChainSlug, // address(getSocketConfig(dstChainSlug).contractFactoryPlug), diff --git a/testScript.sh b/testScript.sh index eeb2c589..818eb715 100644 --- a/testScript.sh +++ b/testScript.sh @@ -1,7 +1,7 @@ ## Parallel Counter -source .env && forge script script/parallel-counter/deployOffchain.s.sol --broadcast --skip-simulation +source .env && forge script script/parallel-counter/deployOnEVMx.s.sol --broadcast --skip-simulation ## set limits for the app gateway using API source .env && cast send $DEPLOYER "deployMultiChainContracts(uint32[])" '[421614, 11155420]' --private-key $PRIVATE_KEY source .env && forge script script/parallel-counter/checkCounters.s.sol --broadcast --skip-simulation @@ -38,7 +38,7 @@ source .env && forge script script/counter-inbox/CheckGatewayCounter.s.sol --bro ## Mock Testing -source .env && forge script script/mock/DeployVM.s.sol --broadcast --skip-simulation +source .env && forge script script/mock/DeployEVMx.s.sol --broadcast --skip-simulation source .env && forge script script/mock/DeploySocket.s.sol --broadcast --skip-simulation source .env && forge script script/mock/Timeout.s.sol --broadcast --skip-simulation source .env && forge script script/mock/Query.s.sol --broadcast --skip-simulation From 6cebaeb3b584f4a97b54dc548532c129a7957a4a Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Mon, 24 Feb 2025 19:02:39 +0400 Subject: [PATCH 127/186] rename: checkAndConsumeLimit --- contracts/interfaces/IWatcherPrecompile.sol | 2 +- .../protocol/payload-delivery/app-gateway/BatchAsync.sol | 6 +++--- .../protocol/watcherPrecompile/WatcherPrecompileLimits.sol | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/contracts/interfaces/IWatcherPrecompile.sol b/contracts/interfaces/IWatcherPrecompile.sol index ee1321c4..d8657f98 100644 --- a/contracts/interfaces/IWatcherPrecompile.sol +++ b/contracts/interfaces/IWatcherPrecompile.sol @@ -100,7 +100,7 @@ interface IWatcherPrecompile { function setIsValidInboxCaller(uint32 chainSlug_, address plug_, bool isValid_) external; - function checkAndUpdateLimit( + function checkAndConsumeLimit( address appGateway_, bytes32 limitType_, uint256 consumeLimit_ diff --git a/contracts/protocol/payload-delivery/app-gateway/BatchAsync.sol b/contracts/protocol/payload-delivery/app-gateway/BatchAsync.sol index 03c0a42c..db2cf1e4 100644 --- a/contracts/protocol/payload-delivery/app-gateway/BatchAsync.sol +++ b/contracts/protocol/payload-delivery/app-gateway/BatchAsync.sol @@ -97,7 +97,7 @@ abstract contract BatchAsync is QueueAsync { // Handle initial read operations first uint256 readEndIndex = _processReadOperations(payloadDetails_, asyncId); - watcherPrecompile__().checkAndUpdateLimit( + watcherPrecompile__().checkAndConsumeLimit( payloadDetails_[0].appGateway, QUERY, readEndIndex @@ -204,13 +204,13 @@ abstract contract BatchAsync is QueueAsync { payloadBatchDetails[asyncId].push(payloadDetails_[i]); } - watcherPrecompile__().checkAndUpdateLimit( + watcherPrecompile__().checkAndConsumeLimit( appGateway, QUERY, // remaining reads payloadDetails_.length - writes - readEndIndex ); - watcherPrecompile__().checkAndUpdateLimit(appGateway, FINALIZE, writes); + watcherPrecompile__().checkAndConsumeLimit(appGateway, FINALIZE, writes); return appGateway; } diff --git a/contracts/protocol/watcherPrecompile/WatcherPrecompileLimits.sol b/contracts/protocol/watcherPrecompile/WatcherPrecompileLimits.sol index 2753ee41..d5acb4a2 100644 --- a/contracts/protocol/watcherPrecompile/WatcherPrecompileLimits.sol +++ b/contracts/protocol/watcherPrecompile/WatcherPrecompileLimits.sol @@ -78,7 +78,7 @@ abstract contract WatcherPrecompileLimits is * @param limitType_ The type of limit to check * @param consumeLimit_ The amount of limit to consume */ - function checkAndUpdateLimit( + function checkAndConsumeLimit( address appGateway_, bytes32 limitType_, uint256 consumeLimit_ From bbafd54c06075040ea17e9e150dfa673e740d4df Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Mon, 24 Feb 2025 19:03:37 +0400 Subject: [PATCH 128/186] rename: getNextAsyncId --- test/DeliveryHelper.t.sol | 14 +++++++------- test/FeesTest.t.sol | 2 +- test/apps/Counter.t.sol | 2 +- test/apps/SuperTokenLockable.t.sol | 8 ++++---- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/test/DeliveryHelper.t.sol b/test/DeliveryHelper.t.sol index 05c1f417..a0c9c1c5 100644 --- a/test/DeliveryHelper.t.sol +++ b/test/DeliveryHelper.t.sol @@ -292,7 +292,7 @@ contract DeliveryHelperTest is SetupTest { ) internal returns (bytes32 asyncId) { SocketContracts memory socketConfig = getSocketConfig(chainSlug_); - asyncId = getCurrentAsyncId(); + asyncId = getNextAsyncId(); bytes32[] memory payloadIds = getWritePayloadIds( chainSlug_, address(socketConfig.switchboard), @@ -310,7 +310,7 @@ contract DeliveryHelperTest is SetupTest { IMultiChainAppDeployer appDeployer_, address appGateway_ ) internal returns (bytes32 asyncId) { - asyncId = getCurrentAsyncId(); + asyncId = getNextAsyncId(); bytes32[] memory payloadIds = new bytes32[](contractIds.length * chainSlugs_.length); for (uint32 i = 0; i < chainSlugs_.length; i++) { for (uint j = 0; j < contractIds.length; j++) { @@ -359,20 +359,20 @@ contract DeliveryHelperTest is SetupTest { uint32 chainSlug_, uint256 totalPayloads ) internal returns (bytes32 asyncId) { - asyncId = getCurrentAsyncId(); + asyncId = getNextAsyncId(); } function _executeReadBatchMultiChain( uint32[] memory chainSlugs_ ) internal returns (bytes32 asyncId) { - asyncId = getCurrentAsyncId(); + asyncId = getNextAsyncId(); } function _executeWriteBatchSingleChain( uint32 chainSlug_, uint256 totalPayloads ) internal returns (bytes32 asyncId) { - asyncId = getCurrentAsyncId(); + asyncId = getNextAsyncId(); bytes32[] memory payloadIds = getWritePayloadIds( chainSlug_, @@ -385,7 +385,7 @@ contract DeliveryHelperTest is SetupTest { function _executeWriteBatchMultiChain( uint32[] memory chainSlugs_ ) internal returns (bytes32 asyncId) { - asyncId = getCurrentAsyncId(); + asyncId = getNextAsyncId(); bidAndEndAuction(asyncId); for (uint i = 0; i < chainSlugs_.length; i++) { bytes32 payloadId = getWritePayloadId( @@ -650,7 +650,7 @@ contract DeliveryHelperTest is SetupTest { return address(uint160(uint256(hash))); } - function getCurrentAsyncId() public returns (bytes32) { + function getNextAsyncId() public returns (bytes32) { payloadIdCounter++; return bytes32((uint256(uint160(address(deliveryHelper))) << 64) | asyncCounterTest++); } diff --git a/test/FeesTest.t.sol b/test/FeesTest.t.sol index 67d053a0..060f4af2 100644 --- a/test/FeesTest.t.sol +++ b/test/FeesTest.t.sol @@ -95,7 +95,7 @@ contract FeesTest is DeliveryHelperTest { counterGateway.withdrawFeeTokens(feesChainSlug, ETH_ADDRESS, withdrawAmount, receiver); - asyncId = getCurrentAsyncId(); + asyncId = getNextAsyncId(); bytes32[] memory payloadIds = getWritePayloadIds( feesChainSlug, address(getSocketConfig(feesChainSlug).switchboard), diff --git a/test/apps/Counter.t.sol b/test/apps/Counter.t.sol index 2ba5884a..ca75e6a1 100644 --- a/test/apps/Counter.t.sol +++ b/test/apps/Counter.t.sol @@ -140,7 +140,7 @@ contract CounterTest is DeliveryHelperTest { instances[0] = arbCounterForwarder; instances[1] = optCounterForwarder; - bytes32 bridgeAsyncId = getCurrentAsyncId(); + bytes32 bridgeAsyncId = getNextAsyncId(); bytes32[] memory payloadIds = new bytes32[](3); payloadIds[0] = _encodeId(evmxChainSlug, address(watcherPrecompile), payloadIdCounter++); diff --git a/test/apps/SuperTokenLockable.t.sol b/test/apps/SuperTokenLockable.t.sol index cb7ee1ee..5902ae8e 100644 --- a/test/apps/SuperTokenLockable.t.sol +++ b/test/apps/SuperTokenLockable.t.sol @@ -280,7 +280,7 @@ contract SuperTokenLockableTest is DeliveryHelperTest { }); uint32 srcChainSlug = IForwarder(userOrder.srcToken).getChainSlug(); uint32 dstChainSlug = IForwarder(userOrder.dstToken).getChainSlug(); - bytes32 bridgeAsyncId = getCurrentAsyncId(); + bytes32 bridgeAsyncId = getNextAsyncId(); bytes32[] memory payloadIds = new bytes32[](4); payloadIds[0] = getWritePayloadId( @@ -349,7 +349,7 @@ contract SuperTokenLockableTest is DeliveryHelperTest { vm.expectEmit(true, true, false, true); emit BatchCancelled(bridgeAsyncId); finalizeQuery(payloadIds[1], abi.encode(0.001 ether)); - bytes32 cancelAsyncId = getCurrentAsyncId(); + bytes32 cancelAsyncId = getNextAsyncId(); bytes32[] memory cancelPayloadIds = new bytes32[](1); uint32 srcChainSlug = IForwarder(userOrder.srcToken).getChainSlug(); @@ -561,7 +561,7 @@ contract SuperTokenLockableTest is DeliveryHelperTest { // srcChainSlug, // dstChainSlug // ); - // bytes32 bridgeAsyncId = getCurrentAsyncId(); + // bytes32 bridgeAsyncId = getNextAsyncId(); // asyncCounterTest++; // bytes memory encodedOrder = abi.encode(userOrder); @@ -646,7 +646,7 @@ contract SuperTokenLockableTest is DeliveryHelperTest { // srcChainSlug // ); - // bytes32 cancelAsyncId = getCurrentAsyncId(); + // bytes32 cancelAsyncId = getNextAsyncId(); // asyncCounterTest++; // bidAndValidate( From ce7dd858e452e76dd5383e810b3232d9156b0b66 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Mon, 24 Feb 2025 19:04:52 +0400 Subject: [PATCH 129/186] rename: proof --- test/DeliveryHelper.t.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/DeliveryHelper.t.sol b/test/DeliveryHelper.t.sol index a0c9c1c5..f83c355b 100644 --- a/test/DeliveryHelper.t.sol +++ b/test/DeliveryHelper.t.sol @@ -515,8 +515,8 @@ contract DeliveryHelperTest is SetupTest { bytes32 digest = watcherPrecompile.getDigest(digestParams_); bytes32 sigDigest = keccak256(abi.encode(address(socketConfig.switchboard), digest)); - bytes memory watcherSig = _createSignature(sigDigest, watcherPrivateKey); - return (watcherSig, digest); + bytes memory proof = _createSignature(sigDigest, watcherPrivateKey); + return (proof, digest); } function createWithdrawPayloadDetail( From 9764d89845362cc992959b3664ca21f2c4b4e8c0 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Mon, 24 Feb 2025 19:07:52 +0400 Subject: [PATCH 130/186] feat: inbox renames --- contracts/apps/counter-inbox/CounterInboxAppGateway.sol | 4 ++-- contracts/base/AppGatewayBase.sol | 2 +- contracts/interfaces/IAppGateway.sol | 2 +- contracts/interfaces/IWatcherPrecompile.sol | 6 +++--- contracts/mock/MockWatcherPrecompile.sol | 6 +++--- contracts/protocol/utils/common/Structs.sol | 2 +- .../protocol/watcherPrecompile/WatcherPrecompileConfig.sol | 6 +++--- test/Inbox.t.sol | 6 +++--- 8 files changed, 17 insertions(+), 17 deletions(-) diff --git a/contracts/apps/counter-inbox/CounterInboxAppGateway.sol b/contracts/apps/counter-inbox/CounterInboxAppGateway.sol index d759a543..23c6a03c 100644 --- a/contracts/apps/counter-inbox/CounterInboxAppGateway.sol +++ b/contracts/apps/counter-inbox/CounterInboxAppGateway.sol @@ -13,11 +13,11 @@ contract CounterInboxAppGateway is AppGatewayBase { uint32 chainSlug_, Fees memory fees_ ) AppGatewayBase(addressResolver_, auctionManager_) { - watcherPrecompile__().setIsValidInboxCaller(chainSlug_, address(counterInbox_), true); + watcherPrecompile__().setIsValidPlug(chainSlug_, address(counterInbox_), true); _setOverrides(fees_); } - function callFromInbox( + function callFromChain( uint32, address, bytes calldata payload_, diff --git a/contracts/base/AppGatewayBase.sol b/contracts/base/AppGatewayBase.sol index 0ae8e5e7..dd4ab09b 100644 --- a/contracts/base/AppGatewayBase.sol +++ b/contracts/base/AppGatewayBase.sol @@ -180,7 +180,7 @@ abstract contract AppGatewayBase is AddressResolverUtil, IAppGateway, FeesPlugin PayloadBatch memory payloadBatch_ ) external virtual onlyDeliveryHelper {} - function callFromInbox( + function callFromChain( uint32 chainSlug_, address plug_, bytes calldata payload_, diff --git a/contracts/interfaces/IAppGateway.sol b/contracts/interfaces/IAppGateway.sol index 64ebfd1a..308452f0 100644 --- a/contracts/interfaces/IAppGateway.sol +++ b/contracts/interfaces/IAppGateway.sol @@ -12,7 +12,7 @@ interface IAppGateway { function onBatchComplete(bytes32 asyncId_, PayloadBatch memory payloadBatch_) external; - function callFromInbox( + function callFromChain( uint32 chainSlug_, address plug_, bytes calldata payload_, diff --git a/contracts/interfaces/IWatcherPrecompile.sol b/contracts/interfaces/IWatcherPrecompile.sol index d8657f98..1e6f510b 100644 --- a/contracts/interfaces/IWatcherPrecompile.sol +++ b/contracts/interfaces/IWatcherPrecompile.sol @@ -36,7 +36,7 @@ interface IWatcherPrecompile { /// @notice Finalizes a payload execution request /// @param params_ Parameters needed for finalization /// @return payloadId The unique identifier for the request - /// @return digest The merkle digest of the payload parameters + /// @return digest The digest of the payload parameters function finalize( address originAppGateway_, FinalizeParams memory params_ @@ -85,7 +85,7 @@ interface IWatcherPrecompile { /// @notice Calculates the Digest hash for payload parameters /// @param params_ The payload parameters used to calculate the digest - /// @return digest The calculated merkle digest hash + /// @return digest The calculated digest hash function getDigest(PayloadDigestParams memory params_) external pure returns (bytes32 digest); function setMaxTimeoutDelayInSeconds(uint256 maxTimeoutDelayInSeconds_) external; @@ -98,7 +98,7 @@ interface IWatcherPrecompile { function feesPlug(uint32 chainSlug_) external view returns (address); - function setIsValidInboxCaller(uint32 chainSlug_, address plug_, bool isValid_) external; + function setIsValidPlug(uint32 chainSlug_, address plug_, bool isValid_) external; function checkAndConsumeLimit( address appGateway_, diff --git a/contracts/mock/MockWatcherPrecompile.sol b/contracts/mock/MockWatcherPrecompile.sol index ea96329d..93f9b3c5 100644 --- a/contracts/mock/MockWatcherPrecompile.sol +++ b/contracts/mock/MockWatcherPrecompile.sol @@ -5,7 +5,7 @@ import "../interfaces/IAppGateway.sol"; import "../interfaces/IWatcherPrecompile.sol"; import "../interfaces/IPromise.sol"; -import {PayloadDigestParams, AsyncRequest, FinalizeParams, TimeoutRequest, CallFromInboxParams, PlugConfig, ResolvedPromises, AppGatewayConfig} from "../protocol/utils/common/Structs.sol"; +import {PayloadDigestParams, AsyncRequest, FinalizeParams, TimeoutRequest, CallFromChainParams, PlugConfig, ResolvedPromises, AppGatewayConfig} from "../protocol/utils/common/Structs.sol"; import {QUERY, FINALIZE, SCHEDULE} from "../protocol/utils/common/Constants.sol"; import {TimeoutDelayTooLarge, TimeoutAlreadyResolved, InvalidInboxCaller, ResolvingTimeoutTooEarly, CallFailed, AppGatewayAlreadyCalled} from "../protocol/utils/common/Errors.sol"; import "solady/utils/ERC1967Factory.sol"; @@ -123,7 +123,7 @@ contract MockWatcherPrecompile { /// @notice Finalizes a payload request, requests the watcher to release the proofs to execute on chain /// @param params_ The finalization parameters /// @return payloadId The unique identifier for the finalized request - /// @return digest The merkle digest of the payload parameters + /// @return digest The digest of the payload parameters function finalize( FinalizeParams memory params_ ) external returns (bytes32 payloadId, bytes32 digest) { @@ -188,7 +188,7 @@ contract MockWatcherPrecompile { // ================== On-Chain Inbox ================== - function callAppGateways(CallFromInboxParams[] calldata params_) external { + function callAppGateways(CallFromChainParams[] calldata params_) external { for (uint256 i = 0; i < params_.length; i++) { emit CalledAppGateway( params_[i].callId, diff --git a/contracts/protocol/utils/common/Structs.sol b/contracts/protocol/utils/common/Structs.sol index fe629c79..64c03016 100644 --- a/contracts/protocol/utils/common/Structs.sol +++ b/contracts/protocol/utils/common/Structs.sol @@ -50,7 +50,7 @@ struct Bid { bytes extraData; } -struct CallFromInboxParams { +struct CallFromChainParams { bytes32 callId; bytes32 params; address plug; diff --git a/contracts/protocol/watcherPrecompile/WatcherPrecompileConfig.sol b/contracts/protocol/watcherPrecompile/WatcherPrecompileConfig.sol index a14631dd..89928c7d 100644 --- a/contracts/protocol/watcherPrecompile/WatcherPrecompileConfig.sol +++ b/contracts/protocol/watcherPrecompile/WatcherPrecompileConfig.sol @@ -28,7 +28,7 @@ abstract contract WatcherPrecompileConfig is WatcherPrecompileLimits { mapping(uint32 => address) public feesPlug; // appGateway => chainSlug => plug => isValid - mapping(address => mapping(uint32 => mapping(address => bool))) public isValidInboxCaller; + mapping(address => mapping(uint32 => mapping(address => bool))) public isValidPlug; /// @notice Emitted when a new plug is configured for an app gateway /// @param appGateway The address of the app gateway @@ -101,8 +101,8 @@ abstract contract WatcherPrecompileConfig is WatcherPrecompileLimits { } // @dev app gateway can set the valid plugs for each chain slug - function setIsValidInboxCaller(uint32 chainSlug_, address plug_, bool isValid_) external { - isValidInboxCaller[msg.sender][chainSlug_][plug_] = isValid_; + function setIsValidPlug(uint32 chainSlug_, address plug_, bool isValid_) external { + isValidPlug[msg.sender][chainSlug_][plug_] = isValid_; } /// @notice Retrieves the configuration for a specific plug on a network diff --git a/test/Inbox.t.sol b/test/Inbox.t.sol index b407e85e..9072689d 100644 --- a/test/Inbox.t.sol +++ b/test/Inbox.t.sol @@ -46,7 +46,7 @@ contract InboxTest is DeliveryHelperTest { watcherPrecompile.setAppGateways(gateways); hoax(watcherEOA); - watcherPrecompile.setIsValidInboxCaller(arbChainSlug, address(inbox), true); + watcherPrecompile.setIsValidPlug(arbChainSlug, address(inbox), true); } function testInboxIncrement() public { @@ -59,8 +59,8 @@ contract InboxTest is DeliveryHelperTest { bytes32 callId = inbox.increaseOnGateway(incrementValue); hoax(watcherEOA); - CallFromInboxParams[] memory params = new CallFromInboxParams[](1); - params[0] = CallFromInboxParams({ + CallFromChainParams[] memory params = new CallFromChainParams[](1); + params[0] = CallFromChainParams({ callId: callId, chainSlug: arbChainSlug, appGateway: address(gateway), From 8ec15cb74404a071c60c7fa0a48e3c3d8afdae75 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Mon, 24 Feb 2025 19:08:02 +0400 Subject: [PATCH 131/186] rename: merkle --- .../watcherPrecompile/WatcherPrecompile.sol | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol b/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol index 368d8dfc..18681eb8 100644 --- a/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol +++ b/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol @@ -6,7 +6,7 @@ import "../../interfaces/IAppGateway.sol"; import "../../interfaces/IPromise.sol"; import "../../interfaces/IFeesManager.sol"; import "solady/utils/Initializable.sol"; -import {PayloadDigestParams, AsyncRequest, FinalizeParams, TimeoutRequest, CallFromInboxParams} from "../utils/common/Structs.sol"; +import {PayloadDigestParams, AsyncRequest, FinalizeParams, TimeoutRequest, CallFromChainParams} from "../utils/common/Structs.sol"; import {TimeoutDelayTooLarge, TimeoutAlreadyResolved, InvalidInboxCaller, ResolvingTimeoutTooEarly, CallFailed, AppGatewayAlreadyCalled} from "../utils/common/Errors.sol"; /// @title WatcherPrecompile @@ -179,7 +179,7 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { /// @notice Finalizes a payload request, requests the watcher to release the proofs to execute on chain /// @param params_ The finalization parameters /// @return payloadId The unique identifier for the finalized request - /// @return digest The merkle digest of the payload parameters + /// @return digest The digest of the payload parameters function finalize( address originAppGateway_, FinalizeParams memory params_ @@ -235,7 +235,7 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { params_.payloadDetails.payload ); - // Calculate merkle digest from payload parameters + // Calculate digest from payload parameters digest = getDigest(digestParams_); // Create and store the async request with all necessary details @@ -361,7 +361,7 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { /// @notice Calculates the digest hash of payload parameters /// @param params_ The payload parameters - /// @return digest The calculated merkle digest + /// @return digest The calculated digest function getDigest(PayloadDigestParams memory params_) public pure returns (bytes32 digest) { digest = keccak256( abi.encode( @@ -384,14 +384,14 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { // ================== On-Chain Inbox ================== function callAppGateways( - CallFromInboxParams[] calldata params_ + CallFromChainParams[] calldata params_ ) external onlyRole(WATCHER_ROLE) { for (uint256 i = 0; i < params_.length; i++) { if (appGatewayCalled[params_[i].callId]) revert AppGatewayAlreadyCalled(); - if (!isValidInboxCaller[params_[i].appGateway][params_[i].chainSlug][params_[i].plug]) + if (!isValidPlug[params_[i].appGateway][params_[i].chainSlug][params_[i].plug]) revert InvalidInboxCaller(); appGatewayCalled[params_[i].callId] = true; - IAppGateway(params_[i].appGateway).callFromInbox( + IAppGateway(params_[i].appGateway).callFromChain( params_[i].chainSlug, params_[i].plug, params_[i].payload, From 8c87b70048aca4f6f27360508747d5c8a0df0469 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Mon, 24 Feb 2025 19:59:30 +0400 Subject: [PATCH 132/186] feat: watcher signatures --- contracts/interfaces/IWatcherPrecompile.sol | 27 ++++++- contracts/protocol/utils/common/Errors.sol | 2 + .../watcherPrecompile/WatcherPrecompile.sol | 76 +++++++++++++++---- .../WatcherPrecompileConfig.sol | 31 +++++++- .../WatcherPrecompileLimits.sol | 5 ++ script/counter-inbox/Increment.s.sol | 4 +- .../parallel-counter/incrementCounters.s.sol | 1 - test/Inbox.t.sol | 3 +- 8 files changed, 126 insertions(+), 23 deletions(-) diff --git a/contracts/interfaces/IWatcherPrecompile.sol b/contracts/interfaces/IWatcherPrecompile.sol index 1e6f510b..3a29dc0f 100644 --- a/contracts/interfaces/IWatcherPrecompile.sol +++ b/contracts/interfaces/IWatcherPrecompile.sol @@ -9,8 +9,14 @@ import {PayloadDetails, AsyncRequest, FinalizeParams, PayloadDigestParams, AppGa interface IWatcherPrecompile { /// @notice Sets up app gateway configurations /// @param configs_ Array of app gateway configurations + /// @param signatureNonce_ The nonce of the signature + /// @param signature_ The signature of the watcher /// @dev Only callable by authorized addresses - function setAppGateways(AppGatewayConfig[] calldata configs_) external; + function setAppGateways( + AppGatewayConfig[] calldata configs_, + uint256 signatureNonce_, + bytes calldata signature_ + ) external; /// @notice Sets up on-chain contract configurations /// @dev Only callable by authorized addresses @@ -59,7 +65,12 @@ interface IWatcherPrecompile { /// @notice Marks a request as finalized with a proof /// @param payloadId_ The unique identifier of the request /// @param proof_ The watcher's proof - function finalized(bytes32 payloadId_, bytes calldata proof_) external; + function finalized( + bytes32 payloadId_, + uint256 signatureNonce_, + bytes calldata proof_, + bytes calldata signature_ + ) external; /// @notice Finalizes multiple payload execution requests with a new transmitter /// @param payloadId_ The unique identifier of the request @@ -68,7 +79,11 @@ interface IWatcherPrecompile { /// @notice Resolves multiple promises with their return data /// @param resolvedPromises_ Array of resolved promises and their return data - function resolvePromises(ResolvedPromises[] calldata resolvedPromises_) external; + function resolvePromises( + uint256 signatureNonce_, + ResolvedPromises[] calldata resolvedPromises_, + bytes calldata signature_ + ) external; /// @notice Sets a timeout for payload execution /// @param payload_ The payload data @@ -81,7 +96,11 @@ interface IWatcherPrecompile { /// @notice Resolves a timeout by executing the payload /// @param timeoutId_ The unique identifier for the timeout - function resolveTimeout(bytes32 timeoutId_) external; + function resolveTimeout( + bytes32 timeoutId_, + uint256 signatureNonce_, + bytes calldata signature_ + ) external; /// @notice Calculates the Digest hash for payload parameters /// @param params_ The payload parameters used to calculate the digest diff --git a/contracts/protocol/utils/common/Errors.sol b/contracts/protocol/utils/common/Errors.sol index 11c15386..f129a2a2 100644 --- a/contracts/protocol/utils/common/Errors.sol +++ b/contracts/protocol/utils/common/Errors.sol @@ -29,3 +29,5 @@ error InvalidIndex(); error InvalidTransmitter(); error FeesNotSet(); error InvalidTokenAddress(); +error InvalidWatcherSignature(); +error NonceUsed(); diff --git a/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol b/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol index 18681eb8..38be81ab 100644 --- a/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol +++ b/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol @@ -7,7 +7,6 @@ import "../../interfaces/IPromise.sol"; import "../../interfaces/IFeesManager.sol"; import "solady/utils/Initializable.sol"; import {PayloadDigestParams, AsyncRequest, FinalizeParams, TimeoutRequest, CallFromChainParams} from "../utils/common/Structs.sol"; -import {TimeoutDelayTooLarge, TimeoutAlreadyResolved, InvalidInboxCaller, ResolvingTimeoutTooEarly, CallFailed, AppGatewayAlreadyCalled} from "../utils/common/Errors.sol"; /// @title WatcherPrecompile /// @notice Contract that handles payload verification, execution and app configurations @@ -18,9 +17,6 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { /// @notice The expiry time for the payload uint256 public expiryTime; - /// @notice The chain slug of the watcher precompile - uint32 public evmxChainSlug; - /// @notice Mapping to store async requests /// @dev payloadId => AsyncRequest struct mapping(bytes32 => AsyncRequest) public asyncRequests; @@ -153,9 +149,18 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { /// @notice Ends the timeouts and calls the target address with the callback payload /// @param timeoutId_ The unique identifier for the timeout /// @dev Only callable by the contract owner - function resolveTimeout(bytes32 timeoutId_) external onlyRole(WATCHER_ROLE) { - TimeoutRequest storage timeoutRequest_ = timeoutRequests[timeoutId_]; + function resolveTimeout( + bytes32 timeoutId_, + uint256 signatureNonce_, + bytes calldata signature_ + ) external { + _isWatcherSignatureValid( + signatureNonce_, + keccak256(abi.encode(address(this), evmxChainSlug, signatureNonce_, timeoutId_)), + signature_ + ); + TimeoutRequest storage timeoutRequest_ = timeoutRequests[timeoutId_]; if (timeoutRequest_.target == address(0)) revert InvalidTimeoutRequest(); if (timeoutRequest_.isResolved) revert TimeoutAlreadyResolved(); if (block.timestamp < timeoutRequest_.executeAt) revert ResolvingTimeoutTooEarly(); @@ -300,7 +305,20 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { /// @dev Only callable by the contract owner /// @dev Watcher signs on following digest for validation on switchboard: /// @dev keccak256(abi.encode(switchboard, digest)) - function finalized(bytes32 payloadId_, bytes calldata proof_) external onlyRole(WATCHER_ROLE) { + function finalized( + bytes32 payloadId_, + uint256 signatureNonce_, + bytes calldata proof_, + bytes calldata signature_ + ) external { + _isWatcherSignatureValid( + signatureNonce_, + keccak256( + abi.encode(address(this), evmxChainSlug, signatureNonce_, payloadId_, proof_) + ), + signature_ + ); + watcherProofs[payloadId_] = proof_; emit Finalized(payloadId_, asyncRequests[payloadId_], proof_); } @@ -309,8 +327,16 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { /// @param resolvedPromises_ Array of resolved promises and their return data /// @dev Only callable by the contract owner function resolvePromises( - ResolvedPromises[] calldata resolvedPromises_ - ) external onlyRole(WATCHER_ROLE) { + uint256 signatureNonce_, + ResolvedPromises[] calldata resolvedPromises_, + bytes calldata signature_ + ) external { + _isWatcherSignatureValid( + signatureNonce_, + keccak256(abi.encode(address(this), evmxChainSlug, signatureNonce_, resolvedPromises_)), + signature_ + ); + for (uint256 i = 0; i < resolvedPromises_.length; i++) { // Get the array of promise addresses for this payload AsyncRequest memory asyncRequest_ = asyncRequests[resolvedPromises_[i].payloadId]; @@ -338,9 +364,25 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { // wait till expiry time to assign fees function markRevert( + bool isRevertingOnchain_, bytes32 payloadId_, - bool isRevertingOnchain_ - ) external onlyRole(WATCHER_ROLE) { + uint256 signatureNonce_, + bytes calldata signature_ + ) external { + _isWatcherSignatureValid( + signatureNonce_, + keccak256( + abi.encode( + address(this), + evmxChainSlug, + signatureNonce_, + payloadId_, + isRevertingOnchain_ + ) + ), + signature_ + ); + AsyncRequest memory asyncRequest_ = asyncRequests[payloadId_]; address[] memory next = asyncRequest_.next; @@ -384,8 +426,16 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { // ================== On-Chain Inbox ================== function callAppGateways( - CallFromChainParams[] calldata params_ - ) external onlyRole(WATCHER_ROLE) { + CallFromChainParams[] calldata params_, + uint256 signatureNonce_, + bytes calldata signature_ + ) external { + _isWatcherSignatureValid( + signatureNonce_, + keccak256(abi.encode(address(this), evmxChainSlug, signatureNonce_, params_)), + signature_ + ); + for (uint256 i = 0; i < params_.length; i++) { if (appGatewayCalled[params_[i].callId]) revert AppGatewayAlreadyCalled(); if (!isValidPlug[params_[i].appGateway][params_[i].chainSlug][params_[i].plug]) diff --git a/contracts/protocol/watcherPrecompile/WatcherPrecompileConfig.sol b/contracts/protocol/watcherPrecompile/WatcherPrecompileConfig.sol index 89928c7d..f5940af3 100644 --- a/contracts/protocol/watcherPrecompile/WatcherPrecompileConfig.sol +++ b/contracts/protocol/watcherPrecompile/WatcherPrecompileConfig.sol @@ -2,6 +2,7 @@ pragma solidity ^0.8.21; import "./WatcherPrecompileLimits.sol"; +import {ECDSA} from "solady/utils/ECDSA.sol"; /// @title WatcherPrecompileConfig /// @notice Configuration contract for the Watcher Precompile system @@ -27,6 +28,10 @@ abstract contract WatcherPrecompileConfig is WatcherPrecompileLimits { /// @dev chainSlug => fees plug address mapping(uint32 => address) public feesPlug; + /// @notice Maps nonce to whether it has been used + /// @dev signatureNonce => isValid + mapping(uint256 => bool) public isNonceUsed; + // appGateway => chainSlug => plug => isValid mapping(address => mapping(uint32 => mapping(address => bool))) public isValidPlug; @@ -62,7 +67,17 @@ abstract contract WatcherPrecompileConfig is WatcherPrecompileLimits { /// @param configs_ Array of configurations containing app gateway, network, plug, and switchboard details /// @dev Only callable by the contract owner /// @dev This helps in verifying that plugs are called by respective app gateways - function setAppGateways(AppGatewayConfig[] calldata configs_) external onlyRole(WATCHER_ROLE) { + function setAppGateways( + AppGatewayConfig[] calldata configs_, + uint256 signatureNonce_, + bytes calldata signature_ + ) external { + _isWatcherSignatureValid( + signatureNonce_, + keccak256(abi.encode(address(this), evmxChainSlug, signatureNonce_, configs_)), + signature_ + ); + for (uint256 i = 0; i < configs_.length; i++) { // Store the plug configuration for this network and plug _plugConfigs[configs_[i].chainSlug][configs_[i].plug] = PlugConfig({ @@ -120,5 +135,19 @@ abstract contract WatcherPrecompileConfig is WatcherPrecompileLimits { ); } + function _isWatcherSignatureValid( + uint256 signatureNonce_, + bytes32 digest_, + bytes memory signature_ + ) internal { + if (isNonceUsed[signatureNonce_]) revert NonceUsed(); + isNonceUsed[signatureNonce_] = true; + + bytes32 digest = keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", digest_)); + // recovered signer is checked for the valid roles later + address signer = ECDSA.recover(digest, signature_); + if (signer != owner()) revert InvalidWatcherSignature(); + } + uint256[49] __gap_config; } diff --git a/contracts/protocol/watcherPrecompile/WatcherPrecompileLimits.sol b/contracts/protocol/watcherPrecompile/WatcherPrecompileLimits.sol index d5acb4a2..cc6d44ab 100644 --- a/contracts/protocol/watcherPrecompile/WatcherPrecompileLimits.sol +++ b/contracts/protocol/watcherPrecompile/WatcherPrecompileLimits.sol @@ -8,6 +8,7 @@ import {AddressResolverUtil} from "../utils/AddressResolverUtil.sol"; import {QUERY, FINALIZE, SCHEDULE} from "../utils/common/Constants.sol"; import "../../interfaces/IWatcherPrecompile.sol"; import {WATCHER_ROLE} from "../utils/common/AccessRoles.sol"; +import {TimeoutDelayTooLarge, TimeoutAlreadyResolved, InvalidInboxCaller, ResolvingTimeoutTooEarly, CallFailed, AppGatewayAlreadyCalled, InvalidWatcherSignature, NonceUsed} from "../utils/common/Errors.sol"; abstract contract WatcherPrecompileLimits is Gauge, @@ -22,6 +23,10 @@ abstract contract WatcherPrecompileLimits is uint256 public defaultLimit; /// @notice Rate at which limit replenishes per second uint256 public defaultRatePerSecond; + + /// @notice The chain slug of the watcher precompile + uint32 public evmxChainSlug; + // appGateway => limitType => receivingLimitParams mapping(address => mapping(bytes32 => LimitParams)) internal _limitParams; diff --git a/script/counter-inbox/Increment.s.sol b/script/counter-inbox/Increment.s.sol index 37b56733..95477943 100644 --- a/script/counter-inbox/Increment.s.sol +++ b/script/counter-inbox/Increment.s.sol @@ -10,10 +10,8 @@ import {ETH_ADDRESS, FAST} from "../../contracts/protocol/utils/common/Constants contract Increment is Script { function run() external { - address gateway = vm.envAddress("APP_GATEWAY"); - address socket = vm.envAddress("SOCKET"); - address switchboard = vm.envAddress("SWITCHBOARD"); string memory arbRpc = vm.envString("ARBITRUM_SEPOLIA_RPC"); + vm.createSelectFork(arbRpc); uint256 arbDeployerPrivateKey = vm.envUint("SPONSOR_KEY"); vm.startBroadcast(arbDeployerPrivateKey); diff --git a/script/parallel-counter/incrementCounters.s.sol b/script/parallel-counter/incrementCounters.s.sol index 70036545..5c4fc7e5 100644 --- a/script/parallel-counter/incrementCounters.s.sol +++ b/script/parallel-counter/incrementCounters.s.sol @@ -9,7 +9,6 @@ import {CounterAppGateway} from "../../contracts/apps//counter/CounterAppGateway contract IncrementCounters is Script { function run() external { string memory socketRPC = vm.envString("EVMX_RPC"); - uint256 deployerPrivateKey = vm.envUint("PRIVATE_KEY"); vm.createSelectFork(socketRPC); diff --git a/test/Inbox.t.sol b/test/Inbox.t.sol index 9072689d..8de8ce14 100644 --- a/test/Inbox.t.sol +++ b/test/Inbox.t.sol @@ -68,7 +68,8 @@ contract InboxTest is DeliveryHelperTest { payload: abi.encode(incrementValue), params: bytes32(0) }); - watcherPrecompile.callAppGateways(params); + //signhereeee + watcherPrecompile.callAppGateways(params, 0, bytes("")); // Check counter was incremented assertEq(gateway.counter(), incrementValue, "Gateway counter should be incremented"); } From 6571b008422dba578aab814ab99371451ffd5785 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Mon, 24 Feb 2025 22:24:28 +0400 Subject: [PATCH 133/186] fix: tests --- test/DeliveryHelper.t.sol | 25 +++++++++++++++++++------ test/Inbox.t.sol | 16 +++++++++++----- test/SetupTest.t.sol | 28 ++++++++++++++++++++++++++-- 3 files changed, 56 insertions(+), 13 deletions(-) diff --git a/test/DeliveryHelper.t.sol b/test/DeliveryHelper.t.sol index f83c355b..cb9e0161 100644 --- a/test/DeliveryHelper.t.sol +++ b/test/DeliveryHelper.t.sol @@ -161,8 +161,13 @@ contract DeliveryHelperTest is SetupTest { switchboard: address(optConfig.switchboard) }); - hoax(watcherEOA); - watcherPrecompile.setAppGateways(gateways); + bytes memory watcherSignature = _createWatcherSignature( + keccak256( + abi.encode(address(watcherPrecompile), evmxChainSlug, signatureNonce, gateways) + ) + ); + + watcherPrecompile.setAppGateways(gateways, signatureNonce++, watcherSignature); } function setLimit(address appGateway_) internal { @@ -351,8 +356,12 @@ contract DeliveryHelperTest is SetupTest { }); } - hoax(watcherEOA); - watcherPrecompile.setAppGateways(gateways); + bytes memory watcherSignature = _createWatcherSignature( + keccak256( + abi.encode(address(watcherPrecompile), evmxChainSlug, signatureNonce, gateways) + ) + ); + watcherPrecompile.setAppGateways(gateways, signatureNonce++, watcherSignature); } function _executeReadBatchSingleChain( @@ -491,8 +500,12 @@ contract DeliveryHelperTest is SetupTest { payloadIdCounter++ ); - hoax(watcherEOA); - watcherPrecompile.resolveTimeout(timeoutId); + bytes memory watcherSignature = _createWatcherSignature( + keccak256( + abi.encode(address(watcherPrecompile), evmxChainSlug, signatureNonce, timeoutId) + ) + ); + watcherPrecompile.resolveTimeout(timeoutId, signatureNonce++, watcherSignature); } function finalize( diff --git a/test/Inbox.t.sol b/test/Inbox.t.sol index 8de8ce14..29711ef8 100644 --- a/test/Inbox.t.sol +++ b/test/Inbox.t.sol @@ -42,8 +42,12 @@ contract InboxTest is DeliveryHelperTest { switchboard: address(arbConfig.switchboard) }); - hoax(watcherEOA); - watcherPrecompile.setAppGateways(gateways); + bytes memory watcherSignature = _createWatcherSignature( + keccak256( + abi.encode(address(watcherPrecompile), evmxChainSlug, signatureNonce, gateways) + ) + ); + watcherPrecompile.setAppGateways(gateways, signatureNonce++, watcherSignature); hoax(watcherEOA); watcherPrecompile.setIsValidPlug(arbChainSlug, address(inbox), true); @@ -58,7 +62,6 @@ contract InboxTest is DeliveryHelperTest { bytes32 callId = inbox.increaseOnGateway(incrementValue); - hoax(watcherEOA); CallFromChainParams[] memory params = new CallFromChainParams[](1); params[0] = CallFromChainParams({ callId: callId, @@ -68,8 +71,11 @@ contract InboxTest is DeliveryHelperTest { payload: abi.encode(incrementValue), params: bytes32(0) }); - //signhereeee - watcherPrecompile.callAppGateways(params, 0, bytes("")); + + bytes memory watcherSignature = _createWatcherSignature( + keccak256(abi.encode(address(watcherPrecompile), evmxChainSlug, signatureNonce, params)) + ); + watcherPrecompile.callAppGateways(params, signatureNonce++, watcherSignature); // Check counter was incremented assertEq(gateway.counter(), incrementValue, "Gateway counter should be incremented"); } diff --git a/test/SetupTest.t.sol b/test/SetupTest.t.sol index 83b75e5c..3e573cd0 100644 --- a/test/SetupTest.t.sol +++ b/test/SetupTest.t.sol @@ -35,6 +35,7 @@ contract SetupTest is Test { uint32 evmxChainSlug = 1; uint256 expiryTime = 10000000; + uint256 public signatureNonce = 0; uint256 public payloadIdCounter = 0; uint256 public defaultLimit = 1000; @@ -215,8 +216,31 @@ contract SetupTest is Test { returnDatas[0] = returnData; resolvedPromises[0] = ResolvedPromises({payloadId: payloadId, returnData: returnDatas}); - vm.prank(watcherEOA); - watcherPrecompile.resolvePromises(resolvedPromises); + + bytes memory watcherSignature = _createWatcherSignature( + keccak256( + abi.encode( + address(watcherPrecompile), + evmxChainSlug, + signatureNonce, + resolvedPromises + ) + ) + ); + watcherPrecompile.resolvePromises(signatureNonce++, resolvedPromises, watcherSignature); + } + + function _createWatcherSignature(bytes32 digest_) internal view returns (bytes memory sig) { + bytes32 digest = keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", digest_)); + (uint8 sigV, bytes32 sigR, bytes32 sigS) = vm.sign(watcherPrivateKey, digest); + sig = new bytes(65); + bytes1 v32 = bytes1(sigV); + + assembly { + mstore(add(sig, 96), v32) + mstore(add(sig, 32), sigR) + mstore(add(sig, 64), sigS) + } } function getWritePayloadId( From 71f804316578133aa0a84d7fa30bd154e08c9540 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Mon, 24 Feb 2025 22:57:18 +0400 Subject: [PATCH 134/186] feat: bool to temp check if async modifier is in use --- contracts/base/AppGatewayBase.sol | 4 ++++ contracts/interfaces/IAppGateway.sol | 2 ++ contracts/protocol/Forwarder.sol | 5 +++++ 3 files changed, 11 insertions(+) diff --git a/contracts/base/AppGatewayBase.sol b/contracts/base/AppGatewayBase.sol index dd4ab09b..f0aa6d2a 100644 --- a/contracts/base/AppGatewayBase.sol +++ b/contracts/base/AppGatewayBase.sol @@ -20,14 +20,18 @@ abstract contract AppGatewayBase is AddressResolverUtil, IAppGateway, FeesPlugin bytes public onCompleteData; bytes32 public sbType; + bool public isAsyncModifierSet; + mapping(address => bool) public isValidPromise; /// @notice Modifier to treat functions async modifier async() { if (fees.feePoolChain == 0) revert FeesNotSet(); + isAsyncModifierSet = true; deliveryHelper().clearQueue(); addressResolver__.clearPromises(); _; + isAsyncModifierSet = false; deliveryHelper().batch(fees, auctionManager, onCompleteData, sbType); _markValidPromises(); } diff --git a/contracts/interfaces/IAppGateway.sol b/contracts/interfaces/IAppGateway.sol index 308452f0..50d0123f 100644 --- a/contracts/interfaces/IAppGateway.sol +++ b/contracts/interfaces/IAppGateway.sol @@ -10,6 +10,8 @@ interface IAppGateway { function gasLimit() external view returns (uint256); + function isAsyncModifierSet() external view returns (bool); + function onBatchComplete(bytes32 asyncId_, PayloadBatch memory payloadBatch_) external; function callFromChain( diff --git a/contracts/protocol/Forwarder.sol b/contracts/protocol/Forwarder.sol index 7e01c67c..0c45a45c 100644 --- a/contracts/protocol/Forwarder.sol +++ b/contracts/protocol/Forwarder.sol @@ -24,6 +24,8 @@ contract Forwarder is IForwarder, Initializable { /// @notice caches the latest async promise address for the last call address public latestAsyncPromise; + error AsyncModifierNotUsed(); + constructor() { _disableInitializers(); // disable for implementation } @@ -74,6 +76,9 @@ contract Forwarder is IForwarder, Initializable { revert("Forwarder: deliveryHelper not found"); } + bool isAsyncModifierSet = IAppGateway(msg.sender).isAsyncModifierSet(); + if (!isAsyncModifierSet) revert AsyncModifierNotUsed(); + // Deploy a new async promise contract. latestAsyncPromise = IAddressResolver(addressResolver).deployAsyncPromiseContract( msg.sender From a1392d6621702c4460e696ff9699ed57c8cb7436 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Mon, 24 Feb 2025 22:57:32 +0400 Subject: [PATCH 135/186] feat: isAsyncModifierUsed tests --- .../ParallelCounterAppGateway.sol | 7 +++++++ test/apps/Counter.t.sol | 2 +- test/apps/ParallelCounter.t.sol | 21 ++++++++++++++++++- 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/contracts/apps/parallel-counter/ParallelCounterAppGateway.sol b/contracts/apps/parallel-counter/ParallelCounterAppGateway.sol index bdd1d3ea..32abf96b 100644 --- a/contracts/apps/parallel-counter/ParallelCounterAppGateway.sol +++ b/contracts/apps/parallel-counter/ParallelCounterAppGateway.sol @@ -23,6 +23,13 @@ contract ParallelCounterAppGateway is AppGatewayBase { } } + function incrementCountersWithoutAsync(address[] memory instances_) public { + // the increase function is called on given list of instances + for (uint256 i = 0; i < instances_.length; i++) { + Counter(instances_[i]).increase(); + } + } + function setFees(Fees memory fees_) public { fees = fees_; } diff --git a/test/apps/Counter.t.sol b/test/apps/Counter.t.sol index ca75e6a1..9c892710 100644 --- a/test/apps/Counter.t.sol +++ b/test/apps/Counter.t.sol @@ -69,7 +69,7 @@ contract CounterTest is DeliveryHelperTest { ); } - function testCounterIncrement1() external { + function testCounterIncrement() external { deploySetup(); deployCounterApp(arbChainSlug); diff --git a/test/apps/ParallelCounter.t.sol b/test/apps/ParallelCounter.t.sol index 7460cfc7..963aa1e1 100644 --- a/test/apps/ParallelCounter.t.sol +++ b/test/apps/ParallelCounter.t.sol @@ -3,7 +3,6 @@ pragma solidity ^0.8.21; import {ParallelCounterAppGateway} from "../../contracts/apps/parallel-counter/ParallelCounterAppGateway.sol"; import {ParallelCounterDeployer} from "../../contracts/apps/parallel-counter/ParallelCounterDeployer.sol"; -import {Counter} from "../../contracts/apps/counter/Counter.sol"; import "../DeliveryHelper.t.sol"; contract ParallelCounterTest is DeliveryHelperTest { @@ -119,6 +118,26 @@ contract ParallelCounterTest is DeliveryHelperTest { ); } + function testAsyncModifierNotSet() external { + deploySetup(); + uint32[] memory chainSlugs = new uint32[](1); + chainSlugs[0] = arbChainSlug; + deployCounterApps(chainSlugs); + + (, address arbCounterForwarder) = getOnChainAndForwarderAddresses( + arbChainSlug, + counterId1, + parallelCounterDeployer + ); + + address[] memory instances = new address[](1); + instances[0] = arbCounterForwarder; + + // Should revert with AsyncModifierNotUsed error + vm.expectRevert(abi.encodeWithSignature("AsyncModifierNotUsed()")); + parallelCounterGateway.incrementCountersWithoutAsync(instances); + } + // function testCounterIncrement() external { // deploySetup(); // deployCounterApp(arbChainSlug); From 2a87da9b6aee5165d631a79324df143ee5438a9d Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Tue, 25 Feb 2025 13:17:46 +0400 Subject: [PATCH 136/186] fix: use init data for owner init --- contracts/apps/super-token-lockable/LimitHook.sol | 7 ++++++- .../apps/super-token-lockable/SuperTokenLockable.sol | 8 +++++++- .../super-token-lockable/SuperTokenLockableDeployer.sol | 8 ++++++-- contracts/apps/super-token/SuperToken.sol | 6 ++++++ contracts/apps/super-token/SuperTokenDeployer.sol | 3 ++- test/apps/SuperToken.t.sol | 1 + test/apps/SuperTokenLockable.t.sol | 7 +++++++ 7 files changed, 35 insertions(+), 5 deletions(-) diff --git a/contracts/apps/super-token-lockable/LimitHook.sol b/contracts/apps/super-token-lockable/LimitHook.sol index d273587c..76527f5b 100644 --- a/contracts/apps/super-token-lockable/LimitHook.sol +++ b/contracts/apps/super-token-lockable/LimitHook.sol @@ -11,6 +11,7 @@ contract LimitHook is Ownable, PlugBase { error BurnLimitExceeded(); error MintLimitExceeded(); + error InvalidSender(); constructor(uint256 _burnLimit_, uint256 _mintLimit_) { burnLimit = _burnLimit_; @@ -30,12 +31,16 @@ contract LimitHook is Ownable, PlugBase { if (amount_ > mintLimit) revert MintLimitExceeded(); } + function setOwner(address owner_) external { + if (owner() != address(0) && owner() != msg.sender) revert InvalidSender(); + _initializeOwner(owner_); + } + function connectSocket( address appGateway_, address socket_, address switchboard_ ) external onlyOwner { - _initializeOwner(socket_); _connectSocket(appGateway_, socket_, switchboard_); } } diff --git a/contracts/apps/super-token-lockable/SuperTokenLockable.sol b/contracts/apps/super-token-lockable/SuperTokenLockable.sol index abd8fa1c..92eb64f1 100644 --- a/contracts/apps/super-token-lockable/SuperTokenLockable.sol +++ b/contracts/apps/super-token-lockable/SuperTokenLockable.sol @@ -16,6 +16,7 @@ contract SuperTokenLockable is ERC20, Ownable, PlugBase { error InsufficientBalance(); error InsufficientLockedTokens(); + error InvalidSender(); constructor( string memory name_, @@ -50,11 +51,16 @@ contract SuperTokenLockable is ERC20, Ownable, PlugBase { _mint(user_, amount_); } - function setSocket(address newSocket_) external onlySocket { + function setSocket(address newSocket_) external onlyOwner { _setSocket(newSocket_); } function setLimitHook(address limitHook_) external onlySocket { limitHook__ = LimitHook(limitHook_); } + + function setOwner(address owner_) external { + if (owner() != address(0) && owner() != msg.sender) revert InvalidSender(); + _initializeOwner(owner_); + } } diff --git a/contracts/apps/super-token-lockable/SuperTokenLockableDeployer.sol b/contracts/apps/super-token-lockable/SuperTokenLockableDeployer.sol index 2e2d1ee7..1648d49b 100644 --- a/contracts/apps/super-token-lockable/SuperTokenLockableDeployer.sol +++ b/contracts/apps/super-token-lockable/SuperTokenLockableDeployer.sol @@ -49,8 +49,12 @@ contract SuperTokenLockableDeployer is AppDeployerBase, Ownable { } function deployContracts(uint32 chainSlug_) external async { - _deploy(superTokenLockable, chainSlug_, IsPlug.YES); - _deploy(limitHook, chainSlug_, IsPlug.YES); + bytes memory initData = abi.encodeWithSelector( + SuperTokenLockable.setOwner.selector, + owner() + ); + _deploy(superTokenLockable, chainSlug_, IsPlug.YES, initData); + _deploy(limitHook, chainSlug_, IsPlug.YES, initData); } // don't need to call this directly, will be called automatically after all contracts are deployed. diff --git a/contracts/apps/super-token/SuperToken.sol b/contracts/apps/super-token/SuperToken.sol index 5bacd128..17b0ba85 100644 --- a/contracts/apps/super-token/SuperToken.sol +++ b/contracts/apps/super-token/SuperToken.sol @@ -12,6 +12,7 @@ import "../../base/PlugBase.sol"; contract SuperToken is ERC20, Ownable, PlugBase { mapping(address => uint256) public lockedTokens; + error InvalidSender(); constructor( string memory name_, string memory symbol_, @@ -33,4 +34,9 @@ contract SuperToken is ERC20, Ownable, PlugBase { function setSocket(address newSocket_) external onlyOwner { _setSocket(newSocket_); } + + function setOwner(address owner_) external { + if (owner() != address(0) && owner() != msg.sender) revert InvalidSender(); + _initializeOwner(owner_); + } } diff --git a/contracts/apps/super-token/SuperTokenDeployer.sol b/contracts/apps/super-token/SuperTokenDeployer.sol index a8c4993c..53e06964 100644 --- a/contracts/apps/super-token/SuperTokenDeployer.sol +++ b/contracts/apps/super-token/SuperTokenDeployer.sol @@ -38,7 +38,8 @@ contract SuperTokenDeployer is AppDeployerBase, Ownable { } function deployContracts(uint32 chainSlug_) external async { - _deploy(superToken, chainSlug_, IsPlug.YES); + bytes memory initData = abi.encodeWithSelector(SuperToken.setOwner.selector, owner()); + _deploy(superToken, chainSlug_, IsPlug.YES, initData); } // no need to call this directly, will be called automatically after all contracts are deployed. diff --git a/test/apps/SuperToken.t.sol b/test/apps/SuperToken.t.sol index d9558a75..7ce322e2 100644 --- a/test/apps/SuperToken.t.sol +++ b/test/apps/SuperToken.t.sol @@ -132,6 +132,7 @@ contract SuperTokenTest is DeliveryHelperTest { onChain, "Forwarder SuperToken onChainAddress should be correct" ); + assertEq(SuperToken(onChain).owner(), owner, "SuperToken owner should be correct"); } /** diff --git a/test/apps/SuperTokenLockable.t.sol b/test/apps/SuperTokenLockable.t.sol index 5902ae8e..1994fe79 100644 --- a/test/apps/SuperTokenLockable.t.sol +++ b/test/apps/SuperTokenLockable.t.sol @@ -4,6 +4,7 @@ pragma solidity ^0.8.0; import {SuperTokenLockableDeployer} from "../../contracts/apps/super-token-lockable/SuperTokenLockableDeployer.sol"; import {SuperTokenLockableAppGateway} from "../../contracts/apps/super-token-lockable/SuperTokenLockableAppGateway.sol"; import {SuperTokenLockable} from "../../contracts/apps/super-token-lockable/SuperTokenLockable.sol"; +import {LimitHook} from "../../contracts/apps/super-token-lockable/LimitHook.sol"; import {QUERY, FINALIZE, SCHEDULE} from "../../contracts/protocol/utils/common/Constants.sol"; import "../DeliveryHelper.t.sol"; @@ -196,6 +197,12 @@ contract SuperTokenLockableTest is DeliveryHelperTest { onChainLimitHook, "Forwarder onChainAddress should be correct" ); + assertEq( + SuperTokenLockable(onChainSuperToken).owner(), + owner, + "SuperToken owner should be correct" + ); + assertEq(LimitHook(onChainLimitHook).owner(), owner, "LimitHook owner should be correct"); PayloadDetails[] memory payloadDetails = createDeployPayloadDetailsArray(arbChainSlug); checkPayloadBatchAndDetails( From cf49f4aff62be537f0dc8ce4297c62aef4d10b0e Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Tue, 25 Feb 2025 15:10:54 +0400 Subject: [PATCH 137/186] feat: separate storages --- contracts/protocol/AddressResolver.sol | 10 +-- contracts/protocol/AsyncPromise.sol | 10 +-- contracts/protocol/Forwarder.sol | 8 ++- .../{app-gateway => }/AuctionManager.sol | 41 +++++------ .../{app-gateway => }/FeesManager.sol | 29 +++++--- .../app-gateway/DeliveryHelper.sol | 6 +- .../app-gateway/DeliveryHelperStorage.sol | 28 ++++++++ .../app-gateway/QueueAsync.sol | 44 ++++-------- contracts/protocol/utils/common/Errors.sol | 8 +++ .../watcherPrecompile/WatcherPrecompile.sol | 21 ------ .../WatcherPrecompileConfig.sol | 27 ------- .../WatcherPrecompileLimits.sol | 24 +------ .../WatcherPrecompileStorage.sol | 71 +++++++++++++++++++ script/AppGatewayFeeBalance.s.sol | 2 +- .../WithdrawFeesArbitrumFeesPlug.s.sol | 2 +- test/DeliveryHelper.t.sol | 4 +- 16 files changed, 181 insertions(+), 154 deletions(-) rename contracts/protocol/payload-delivery/{app-gateway => }/AuctionManager.sol (85%) rename contracts/protocol/payload-delivery/{app-gateway => }/FeesManager.sol (95%) create mode 100644 contracts/protocol/payload-delivery/app-gateway/DeliveryHelperStorage.sol create mode 100644 contracts/protocol/watcherPrecompile/WatcherPrecompileStorage.sol diff --git a/contracts/protocol/AddressResolver.sol b/contracts/protocol/AddressResolver.sol index 28050c26..6f804a0d 100644 --- a/contracts/protocol/AddressResolver.sol +++ b/contracts/protocol/AddressResolver.sol @@ -9,10 +9,7 @@ import "../interfaces/IAddressResolver.sol"; import {Forwarder} from "./Forwarder.sol"; import {AsyncPromise} from "./AsyncPromise.sol"; -/// @title AddressResolver Contract -/// @notice This contract is responsible for fetching latest core addresses and deploying Forwarder and AsyncPromise contracts. -/// @dev Inherits the Ownable contract and implements the IAddressResolver interface. -contract AddressResolver is Ownable, IAddressResolver, Initializable { +abstract contract AddressResolverStorage is IAddressResolver { IWatcherPrecompile public override watcherPrecompile__; address public override deliveryHelper; address public override feesManager; @@ -34,7 +31,12 @@ contract AddressResolver is Ownable, IAddressResolver, Initializable { mapping(address => address) public override contractsToGateways; // gateway to contract map mapping(address => address) public override gatewaysToContracts; +} +/// @title AddressResolver Contract +/// @notice This contract is responsible for fetching latest core addresses and deploying Forwarder and AsyncPromise contracts. +/// @dev Inherits the Ownable contract and implements the IAddressResolver interface. +contract AddressResolver is AddressResolverStorage, Ownable, Initializable { /// @notice Error thrown if AppGateway contract was already set by a different address error InvalidCaller(address contractAddress_); diff --git a/contracts/protocol/AsyncPromise.sol b/contracts/protocol/AsyncPromise.sol index 99f5e08e..b8d4b8f6 100644 --- a/contracts/protocol/AsyncPromise.sol +++ b/contracts/protocol/AsyncPromise.sol @@ -15,10 +15,7 @@ enum AsyncPromiseState { RESOLVED } -/// @title AsyncPromise -/// @notice this contract stores the callback address and data to be executed once the previous call is executed -/// This promise expires once the callback is executed -contract AsyncPromise is IPromise, Initializable, AddressResolverUtil { +abstract contract AsyncPromiseStorage is IPromise { /// @notice The callback selector to be called on the invoker. bytes4 public callbackSelector; @@ -37,7 +34,12 @@ contract AsyncPromise is IPromise, Initializable, AddressResolverUtil { /// @notice The callback data to be used when the promise is resolved. bytes public callbackData; +} +/// @title AsyncPromise +/// @notice this contract stores the callback address and data to be executed once the previous call is executed +/// This promise expires once the callback is executed +contract AsyncPromise is AsyncPromiseStorage, Initializable, AddressResolverUtil { /// @notice Error thrown when attempting to resolve an already resolved promise. error PromiseAlreadyResolved(); /// @notice Only the forwarder or local invoker can set then's promise callback diff --git a/contracts/protocol/Forwarder.sol b/contracts/protocol/Forwarder.sol index 0c45a45c..22a4b95f 100644 --- a/contracts/protocol/Forwarder.sol +++ b/contracts/protocol/Forwarder.sol @@ -9,9 +9,7 @@ import "./AsyncPromise.sol"; import "../interfaces/IForwarder.sol"; import "solady/utils/Initializable.sol"; -/// @title Forwarder Contract -/// @notice This contract acts as a forwarder for async calls to the on-chain contracts. -contract Forwarder is IForwarder, Initializable { +abstract contract ForwarderStorage is IForwarder { /// @notice chain id uint32 public chainSlug; @@ -23,7 +21,11 @@ contract Forwarder is IForwarder, Initializable { /// @notice caches the latest async promise address for the last call address public latestAsyncPromise; +} +/// @title Forwarder Contract +/// @notice This contract acts as a forwarder for async calls to the on-chain contracts. +contract Forwarder is ForwarderStorage, Initializable { error AsyncModifierNotUsed(); constructor() { diff --git a/contracts/protocol/payload-delivery/app-gateway/AuctionManager.sol b/contracts/protocol/payload-delivery/AuctionManager.sol similarity index 85% rename from contracts/protocol/payload-delivery/app-gateway/AuctionManager.sol rename to contracts/protocol/payload-delivery/AuctionManager.sol index f5933c02..bb86ba37 100644 --- a/contracts/protocol/payload-delivery/app-gateway/AuctionManager.sol +++ b/contracts/protocol/payload-delivery/AuctionManager.sol @@ -1,18 +1,19 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -import {Ownable} from "solady/auth/Ownable.sol"; import {ECDSA} from "solady/utils/ECDSA.sol"; -import {AddressResolverUtil} from "../../utils/AddressResolverUtil.sol"; -import {Fees, Bid, PayloadBatch} from "../../utils/common/Structs.sol"; -import {IDeliveryHelper} from "../../../interfaces/IDeliveryHelper.sol"; -import {IFeesManager} from "../../../interfaces/IFeesManager.sol"; -import {IAuctionManager} from "../../../interfaces/IAuctionManager.sol"; import "solady/utils/Initializable.sol"; +import {Ownable} from "solady/auth/Ownable.sol"; -/// @title AuctionManager -/// @notice Contract for managing auctions and placing bids -contract AuctionManager is AddressResolverUtil, Ownable, IAuctionManager, Initializable { +import {IDeliveryHelper} from "../../interfaces/IDeliveryHelper.sol"; +import {IFeesManager} from "../../interfaces/IFeesManager.sol"; +import {IAuctionManager} from "../../interfaces/IAuctionManager.sol"; + +import {AddressResolverUtil} from "../utils/AddressResolverUtil.sol"; +import {Fees, Bid, PayloadBatch} from "../utils/common/Structs.sol"; +import {AuctionClosed, AuctionAlreadyStarted, BidExceedsMaxFees, LowerBidAlreadyExists, InvalidTransmitter} from "../utils/common/Errors.sol"; + +abstract contract AuctionManagerStorage is IAuctionManager { uint32 public evmxChainSlug; mapping(bytes32 => Bid) public winningBids; // asyncId => auction status @@ -20,19 +21,15 @@ contract AuctionManager is AddressResolverUtil, Ownable, IAuctionManager, Initia mapping(bytes32 => bool) public override auctionStarted; uint256 public auctionEndDelaySeconds; +} - /// @notice Error thrown when trying to start or bid a closed auction - error AuctionClosed(); - /// @notice Error thrown when trying to start an ongoing auction - error AuctionAlreadyStarted(); - /// @notice Error thrown if fees exceed the maximum set fees - error BidExceedsMaxFees(); - /// @notice Error thrown if winning bid is assigned to an invalid transmitter - error InvalidTransmitter(); - /// @notice Error thrown if a lower bid already exists - error LowerBidAlreadyExists(); - +/// @title AuctionManager +/// @notice Contract for managing auctions and placing bids +contract AuctionManager is AuctionManagerStorage, AddressResolverUtil, Ownable, Initializable { event AuctionRestarted(bytes32 asyncId); + event AuctionStarted(bytes32 asyncId); + event AuctionEnded(bytes32 asyncId, Bid winningBid); + event BidPlaced(bytes32 asyncId, Bid bid); constructor() { _disableInitializers(); // disable for implementation @@ -55,10 +52,6 @@ contract AuctionManager is AddressResolverUtil, Ownable, IAuctionManager, Initia auctionEndDelaySeconds = auctionEndDelaySeconds_; } - event AuctionStarted(bytes32 asyncId); - event AuctionEnded(bytes32 asyncId, Bid winningBid); - event BidPlaced(bytes32 asyncId, Bid bid); - function setAuctionEndDelaySeconds(uint256 auctionEndDelaySeconds_) external onlyOwner { auctionEndDelaySeconds = auctionEndDelaySeconds_; } diff --git a/contracts/protocol/payload-delivery/app-gateway/FeesManager.sol b/contracts/protocol/payload-delivery/FeesManager.sol similarity index 95% rename from contracts/protocol/payload-delivery/app-gateway/FeesManager.sol rename to contracts/protocol/payload-delivery/FeesManager.sol index 8c6873de..ec364b4f 100644 --- a/contracts/protocol/payload-delivery/app-gateway/FeesManager.sol +++ b/contracts/protocol/payload-delivery/FeesManager.sol @@ -4,20 +4,17 @@ pragma solidity ^0.8.0; import {Ownable} from "solady/auth/Ownable.sol"; import "solady/utils/Initializable.sol"; -import {AddressResolverUtil} from "../../../protocol/utils/AddressResolverUtil.sol"; -import {Bid, Fees, PayloadDetails, CallType, FinalizeParams, PayloadBatch, Parallel} from "../../../protocol/utils/common/Structs.sol"; -import {IDeliveryHelper} from "../../../interfaces/IDeliveryHelper.sol"; -import {FORWARD_CALL, DISTRIBUTE_FEE, DEPLOY, WITHDRAW} from "../../../protocol/utils/common/Constants.sol"; -import {IFeesPlug} from "../../../interfaces/IFeesPlug.sol"; -import {IFeesManager} from "../../../interfaces/IFeesManager.sol"; +import {IDeliveryHelper} from "../../interfaces/IDeliveryHelper.sol"; +import {IFeesPlug} from "../../interfaces/IFeesPlug.sol"; +import {IFeesManager} from "../../interfaces/IFeesManager.sol"; -import {NotAuctionManager} from "../../../protocol/utils/common/Errors.sol"; +import {AddressResolverUtil} from "../utils/AddressResolverUtil.sol"; +import {FORWARD_CALL, DISTRIBUTE_FEE, DEPLOY, WITHDRAW} from "../utils/common/Constants.sol"; +import {NotAuctionManager} from "../utils/common/Errors.sol"; +import {Bid, Fees, PayloadDetails, CallType, FinalizeParams, Parallel} from "../utils/common/Structs.sol"; -/// @title FeesManager -/// @notice Contract for managing fees -contract FeesManager is IFeesManager, AddressResolverUtil, Ownable, Initializable { +contract FeesManagerStorage { uint256 public feesCounter; - /// @notice Struct containing fee amounts and status struct TokenBalance { uint256 deposited; // Amount deposited @@ -36,7 +33,17 @@ contract FeesManager is IFeesManager, AddressResolverUtil, Ownable, Initializabl /// @notice Mapping to track fees to be distributed to transmitters /// @dev transmitter => chainSlug => token => amount mapping(address => mapping(uint32 => mapping(address => uint256))) public transmitterFees; +} +/// @title FeesManager +/// @notice Contract for managing fees +contract FeesManager is + IFeesManager, + FeesManagerStorage, + AddressResolverUtil, + Ownable, + Initializable +{ /// @notice Emitted when fees are blocked for a batch /// @param asyncId The batch identifier /// @param chainSlug The chain identifier diff --git a/contracts/protocol/payload-delivery/app-gateway/DeliveryHelper.sol b/contracts/protocol/payload-delivery/app-gateway/DeliveryHelper.sol index e0a85af0..4eace8ca 100644 --- a/contracts/protocol/payload-delivery/app-gateway/DeliveryHelper.sol +++ b/contracts/protocol/payload-delivery/app-gateway/DeliveryHelper.sol @@ -11,9 +11,6 @@ import "./BatchAsync.sol"; contract DeliveryHelper is BatchAsync, Initializable { event CallBackReverted(bytes32 asyncId_, bytes32 payloadId_); - uint64 public version; - - bytes32[] public tempPayloadIds; constructor() { _disableInitializers(); // disable for implementation @@ -28,7 +25,6 @@ contract DeliveryHelper is BatchAsync, Initializable { uint256 bidTimeout_ ) public reinitializer(1) { _setAddressResolver(addressResolver_); - version = 1; bidTimeout = bidTimeout_; _initializeOwner(owner_); } @@ -44,7 +40,7 @@ contract DeliveryHelper is BatchAsync, Initializable { if (!isRestarted) return _process(asyncId_, false); - // Refinalize all payloads in the batch if a new transmitter is assigned + // Re-finalize all payloads in the batch if a new transmitter is assigned bytes32[] memory payloadIds = _payloadBatches[asyncId_].lastBatchOfPayloads; for (uint256 i = 0; i < payloadIds.length; i++) { watcherPrecompile__().refinalize( diff --git a/contracts/protocol/payload-delivery/app-gateway/DeliveryHelperStorage.sol b/contracts/protocol/payload-delivery/app-gateway/DeliveryHelperStorage.sol new file mode 100644 index 00000000..958b2d82 --- /dev/null +++ b/contracts/protocol/payload-delivery/app-gateway/DeliveryHelperStorage.sol @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: Unlicense +pragma solidity ^0.8.21; + +import {CallParams, PayloadDetails, PayloadBatch} from "../../../protocol/utils/common/Structs.sol"; +import {IDeliveryHelper} from "../../../interfaces/IDeliveryHelper.sol"; + +/// @title DeliveryHelperStorage +/// @notice Storage contract for DeliveryHelper +abstract contract DeliveryHelperStorage is IDeliveryHelper { + uint256 public saltCounter; + uint256 public asyncCounter; + uint256 public bidTimeout; + + /// @notice The call parameters array + CallParams[] public callParamsArray; + + bytes32[] public tempPayloadIds; + + /// @notice The mapping of valid promises + mapping(address => bool) public isValidPromise; + // payloadId => asyncId + mapping(bytes32 => bytes32) public payloadIdToBatchHash; + mapping(bytes32 => PayloadDetails) public payloadIdToPayloadDetails; + // asyncId => PayloadDetails[] + mapping(bytes32 => PayloadDetails[]) public payloadBatchDetails; + // asyncId => PayloadBatch + mapping(bytes32 => PayloadBatch) internal _payloadBatches; +} diff --git a/contracts/protocol/payload-delivery/app-gateway/QueueAsync.sol b/contracts/protocol/payload-delivery/app-gateway/QueueAsync.sol index 85f13c65..28586381 100644 --- a/contracts/protocol/payload-delivery/app-gateway/QueueAsync.sol +++ b/contracts/protocol/payload-delivery/app-gateway/QueueAsync.sol @@ -9,42 +9,18 @@ import {IPromise} from "../../../interfaces/IPromise.sol"; import {IAppDeployer} from "../../../interfaces/IAppDeployer.sol"; import {IAddressResolver} from "../../../interfaces/IAddressResolver.sol"; import {IContractFactoryPlug} from "../../../interfaces/IContractFactoryPlug.sol"; -import {IDeliveryHelper} from "../../../interfaces/IDeliveryHelper.sol"; import {Ownable} from "solady/auth/Ownable.sol"; +import {DeliveryHelperStorage} from "./DeliveryHelperStorage.sol"; /// @notice Abstract contract for managing asynchronous payloads -abstract contract QueueAsync is AddressResolverUtil, IDeliveryHelper, Ownable { - uint256 public saltCounter; - uint256 public asyncCounter; - - uint256 public bidTimeout; - - /// @notice The call parameters array - CallParams[] public callParamsArray; - /// @notice The mapping of valid promises - mapping(address => bool) public isValidPromise; - - // payloadId => asyncId - mapping(bytes32 => bytes32) public payloadIdToBatchHash; - mapping(bytes32 => PayloadDetails) public payloadIdToPayloadDetails; - - // asyncId => PayloadBatch - mapping(bytes32 => PayloadBatch) internal _payloadBatches; - +abstract contract QueueAsync is + DeliveryHelperStorage, + AddressResolverUtil, + Ownable +{ event PayloadBatchCancelled(bytes32 asyncId); event BidTimeoutUpdated(uint256 newBidTimeout); - function payloadBatches(bytes32 asyncId_) external view override returns (PayloadBatch memory) { - return _payloadBatches[asyncId_]; - } - - function getPayloadDetails(bytes32 payloadId_) external view returns (PayloadDetails memory) { - return payloadIdToPayloadDetails[payloadId_]; - } - - // asyncId => PayloadDetails[] - mapping(bytes32 => PayloadDetails[]) public payloadBatchDetails; - modifier onlyPromises() { if (!isValidPromise[msg.sender]) revert InvalidPromise(); _; @@ -55,6 +31,14 @@ abstract contract QueueAsync is AddressResolverUtil, IDeliveryHelper, Ownable { _; } + function payloadBatches(bytes32 asyncId_) external view override returns (PayloadBatch memory) { + return _payloadBatches[asyncId_]; + } + + function getPayloadDetails(bytes32 payloadId_) external view returns (PayloadDetails memory) { + return payloadIdToPayloadDetails[payloadId_]; + } + /// @notice Clears the call parameters array function clearQueue() public { delete callParamsArray; diff --git a/contracts/protocol/utils/common/Errors.sol b/contracts/protocol/utils/common/Errors.sol index f129a2a2..9a1fe4ca 100644 --- a/contracts/protocol/utils/common/Errors.sol +++ b/contracts/protocol/utils/common/Errors.sol @@ -31,3 +31,11 @@ error FeesNotSet(); error InvalidTokenAddress(); error InvalidWatcherSignature(); error NonceUsed(); +/// @notice Error thrown when trying to start or bid a closed auction +error AuctionClosed(); +/// @notice Error thrown when trying to start an ongoing auction +error AuctionAlreadyStarted(); +/// @notice Error thrown if fees exceed the maximum set fees +error BidExceedsMaxFees(); +/// @notice Error thrown if a lower bid already exists +error LowerBidAlreadyExists(); diff --git a/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol b/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol index 38be81ab..eaecfbd6 100644 --- a/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol +++ b/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol @@ -6,31 +6,10 @@ import "../../interfaces/IAppGateway.sol"; import "../../interfaces/IPromise.sol"; import "../../interfaces/IFeesManager.sol"; import "solady/utils/Initializable.sol"; -import {PayloadDigestParams, AsyncRequest, FinalizeParams, TimeoutRequest, CallFromChainParams} from "../utils/common/Structs.sol"; /// @title WatcherPrecompile /// @notice Contract that handles payload verification, execution and app configurations contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { - uint256 public maxTimeoutDelayInSeconds; - /// @notice Counter for tracking payload requests - uint256 public payloadCounter; - /// @notice The expiry time for the payload - uint256 public expiryTime; - - /// @notice Mapping to store async requests - /// @dev payloadId => AsyncRequest struct - mapping(bytes32 => AsyncRequest) public asyncRequests; - /// @notice Mapping to store timeout requests - /// @dev timeoutId => TimeoutRequest struct - mapping(bytes32 => TimeoutRequest) public timeoutRequests; - /// @notice Mapping to store watcher proofs - /// @dev payloadId => proof bytes - mapping(bytes32 => bytes) public watcherProofs; - - /// @notice Mapping to store if appGateway has been called with trigger from on-chain Inbox - /// @dev callId => bool - mapping(bytes32 => bool) public appGatewayCalled; - /// @notice Error thrown when an invalid chain slug is provided error InvalidChainSlug(); /// @notice Error thrown when an invalid app gateway reaches a plug diff --git a/contracts/protocol/watcherPrecompile/WatcherPrecompileConfig.sol b/contracts/protocol/watcherPrecompile/WatcherPrecompileConfig.sol index f5940af3..a8bba140 100644 --- a/contracts/protocol/watcherPrecompile/WatcherPrecompileConfig.sol +++ b/contracts/protocol/watcherPrecompile/WatcherPrecompileConfig.sol @@ -8,33 +8,6 @@ import {ECDSA} from "solady/utils/ECDSA.sol"; /// @notice Configuration contract for the Watcher Precompile system /// @dev Handles the mapping between networks, plugs, and app gateways for payload execution abstract contract WatcherPrecompileConfig is WatcherPrecompileLimits { - /// @notice Maps network and plug to their configuration - /// @dev chainSlug => plug => PlugConfig - mapping(uint32 => mapping(address => PlugConfig)) internal _plugConfigs; - - /// @notice Maps chain slug to their associated switchboard - /// @dev chainSlug => sb type => switchboard address - mapping(uint32 => mapping(bytes32 => address)) public switchboards; - - /// @notice Maps chain slug to their associated socket - /// @dev chainSlug => socket address - mapping(uint32 => address) public sockets; - - /// @notice Maps chain slug to their associated contract factory plug - /// @dev chainSlug => contract factory plug address - mapping(uint32 => address) public contractFactoryPlug; - - /// @notice Maps chain slug to their associated fees plug - /// @dev chainSlug => fees plug address - mapping(uint32 => address) public feesPlug; - - /// @notice Maps nonce to whether it has been used - /// @dev signatureNonce => isValid - mapping(uint256 => bool) public isNonceUsed; - - // appGateway => chainSlug => plug => isValid - mapping(address => mapping(uint32 => mapping(address => bool))) public isValidPlug; - /// @notice Emitted when a new plug is configured for an app gateway /// @param appGateway The address of the app gateway /// @param chainSlug The identifier of the destination network diff --git a/contracts/protocol/watcherPrecompile/WatcherPrecompileLimits.sol b/contracts/protocol/watcherPrecompile/WatcherPrecompileLimits.sol index cc6d44ab..ac07d848 100644 --- a/contracts/protocol/watcherPrecompile/WatcherPrecompileLimits.sol +++ b/contracts/protocol/watcherPrecompile/WatcherPrecompileLimits.sol @@ -3,36 +3,18 @@ pragma solidity ^0.8.21; import {AccessControl} from "../utils/AccessControl.sol"; import {Gauge} from "../utils/Gauge.sol"; -import {LimitParams, UpdateLimitParams} from "../utils/common/Structs.sol"; import {AddressResolverUtil} from "../utils/AddressResolverUtil.sol"; import {QUERY, FINALIZE, SCHEDULE} from "../utils/common/Constants.sol"; -import "../../interfaces/IWatcherPrecompile.sol"; import {WATCHER_ROLE} from "../utils/common/AccessRoles.sol"; import {TimeoutDelayTooLarge, TimeoutAlreadyResolved, InvalidInboxCaller, ResolvingTimeoutTooEarly, CallFailed, AppGatewayAlreadyCalled, InvalidWatcherSignature, NonceUsed} from "../utils/common/Errors.sol"; +import "./WatcherPrecompileStorage.sol"; abstract contract WatcherPrecompileLimits is + WatcherPrecompileStorage, Gauge, AddressResolverUtil, - AccessControl, - IWatcherPrecompile + AccessControl { - /// @notice Number of decimals used in limit calculations - uint256 public constant LIMIT_DECIMALS = 18; - - /// @notice Default limit value for any app gateway - uint256 public defaultLimit; - /// @notice Rate at which limit replenishes per second - uint256 public defaultRatePerSecond; - - /// @notice The chain slug of the watcher precompile - uint32 public evmxChainSlug; - - // appGateway => limitType => receivingLimitParams - mapping(address => mapping(bytes32 => LimitParams)) internal _limitParams; - - // Mapping to track active app gateways - mapping(address => bool) private _activeAppGateways; - //////////////////////////////////////////////////////// ////////////////////// EVENTS ////////////////////////// //////////////////////////////////////////////////////// diff --git a/contracts/protocol/watcherPrecompile/WatcherPrecompileStorage.sol b/contracts/protocol/watcherPrecompile/WatcherPrecompileStorage.sol new file mode 100644 index 00000000..44b0839e --- /dev/null +++ b/contracts/protocol/watcherPrecompile/WatcherPrecompileStorage.sol @@ -0,0 +1,71 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IWatcherPrecompile} from "../../interfaces/IWatcherPrecompile.sol"; +import {ResolvedPromises, AppGatewayConfig, LimitParams, UpdateLimitParams, PlugConfig, PayloadDigestParams, AsyncRequest, FinalizeParams, TimeoutRequest, CallFromChainParams} from "../utils/common/Structs.sol"; + +abstract contract WatcherPrecompileStorage is IWatcherPrecompile { + /// @notice Number of decimals used in limit calculations + uint256 public constant LIMIT_DECIMALS = 18; + + /// @notice Default limit value for any app gateway + uint256 public defaultLimit; + /// @notice Rate at which limit replenishes per second + uint256 public defaultRatePerSecond; + + /// @notice The chain slug of the watcher precompile + uint32 public evmxChainSlug; + + // appGateway => limitType => receivingLimitParams + mapping(address => mapping(bytes32 => LimitParams)) internal _limitParams; + + // Mapping to track active app gateways + mapping(address => bool) internal _activeAppGateways; + + /// @notice Maps network and plug to their configuration + /// @dev chainSlug => plug => PlugConfig + mapping(uint32 => mapping(address => PlugConfig)) internal _plugConfigs; + + /// @notice Maps chain slug to their associated switchboard + /// @dev chainSlug => sb type => switchboard address + mapping(uint32 => mapping(bytes32 => address)) public switchboards; + + /// @notice Maps chain slug to their associated socket + /// @dev chainSlug => socket address + mapping(uint32 => address) public sockets; + + /// @notice Maps chain slug to their associated contract factory plug + /// @dev chainSlug => contract factory plug address + mapping(uint32 => address) public contractFactoryPlug; + + /// @notice Maps chain slug to their associated fees plug + /// @dev chainSlug => fees plug address + mapping(uint32 => address) public feesPlug; + + /// @notice Maps nonce to whether it has been used + /// @dev signatureNonce => isValid + mapping(uint256 => bool) public isNonceUsed; + + // appGateway => chainSlug => plug => isValid + mapping(address => mapping(uint32 => mapping(address => bool))) public isValidPlug; + + uint256 public maxTimeoutDelayInSeconds; + /// @notice Counter for tracking payload requests + uint256 public payloadCounter; + /// @notice The expiry time for the payload + uint256 public expiryTime; + + /// @notice Mapping to store async requests + /// @dev payloadId => AsyncRequest struct + mapping(bytes32 => AsyncRequest) public asyncRequests; + /// @notice Mapping to store timeout requests + /// @dev timeoutId => TimeoutRequest struct + mapping(bytes32 => TimeoutRequest) public timeoutRequests; + /// @notice Mapping to store watcher proofs + /// @dev payloadId => proof bytes + mapping(bytes32 => bytes) public watcherProofs; + + /// @notice Mapping to store if appGateway has been called with trigger from on-chain Inbox + /// @dev callId => bool + mapping(bytes32 => bool) public appGatewayCalled; +} diff --git a/script/AppGatewayFeeBalance.s.sol b/script/AppGatewayFeeBalance.s.sol index 70934724..cb773904 100644 --- a/script/AppGatewayFeeBalance.s.sol +++ b/script/AppGatewayFeeBalance.s.sol @@ -3,7 +3,7 @@ pragma solidity ^0.8.0; import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/console.sol"; -import {FeesManager} from "../contracts/protocol/payload-delivery/app-gateway/FeesManager.sol"; +import {FeesManager} from "../contracts/protocol/payload-delivery/FeesManager.sol"; import {Fees} from "../contracts/protocol/utils/common/Structs.sol"; import {ETH_ADDRESS} from "../contracts/protocol/utils/common/Constants.sol"; diff --git a/script/counter/WithdrawFeesArbitrumFeesPlug.s.sol b/script/counter/WithdrawFeesArbitrumFeesPlug.s.sol index 098f58bc..a7dbc9f1 100644 --- a/script/counter/WithdrawFeesArbitrumFeesPlug.s.sol +++ b/script/counter/WithdrawFeesArbitrumFeesPlug.s.sol @@ -3,7 +3,7 @@ pragma solidity ^0.8.0; import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/console.sol"; -import {FeesManager} from "../../contracts/protocol/payload-delivery/app-gateway/FeesManager.sol"; +import {FeesManager} from "../../contracts/protocol/payload-delivery/FeesManager.sol"; import {ETH_ADDRESS} from "../../contracts/protocol/utils/common/Constants.sol"; import {CounterAppGateway} from "../../contracts/apps/counter/CounterAppGateway.sol"; diff --git a/test/DeliveryHelper.t.sol b/test/DeliveryHelper.t.sol index cb9e0161..2d6f923c 100644 --- a/test/DeliveryHelper.t.sol +++ b/test/DeliveryHelper.t.sol @@ -2,8 +2,8 @@ pragma solidity ^0.8.0; import "../contracts/protocol/payload-delivery/app-gateway/DeliveryHelper.sol"; -import "../contracts/protocol/payload-delivery/app-gateway/FeesManager.sol"; -import "../contracts/protocol/payload-delivery/app-gateway/AuctionManager.sol"; +import "../contracts/protocol/payload-delivery/FeesManager.sol"; +import "../contracts/protocol/payload-delivery/AuctionManager.sol"; import "../contracts/protocol/Forwarder.sol"; import "../contracts/interfaces/IAppDeployer.sol"; From 4b910292d6880e0aeb0312b2332022a1bd7323d4 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Tue, 25 Feb 2025 19:46:36 +0400 Subject: [PATCH 138/186] fix: remove extra imports and rearrange --- contracts/protocol/Forwarder.sol | 1 - .../protocol/payload-delivery/FeesManager.sol | 3 +-- .../app-gateway/BatchAsync.sol | 9 --------- .../app-gateway/DeliveryHelper.sol | 5 ----- .../app-gateway/DeliveryHelperStorage.sol | 13 ++++++++++++- .../app-gateway/QueueAsync.sol | 19 +++++-------------- .../watcherPrecompile/WatcherPrecompile.sol | 3 --- .../WatcherPrecompileLimits.sol | 2 -- .../WatcherPrecompileStorage.sol | 6 ++++++ 9 files changed, 24 insertions(+), 37 deletions(-) diff --git a/contracts/protocol/Forwarder.sol b/contracts/protocol/Forwarder.sol index 22a4b95f..14ae74f4 100644 --- a/contracts/protocol/Forwarder.sol +++ b/contracts/protocol/Forwarder.sol @@ -5,7 +5,6 @@ import "../interfaces/IAddressResolver.sol"; import "../interfaces/IDeliveryHelper.sol"; import "../interfaces/IAppGateway.sol"; import "../interfaces/IPromise.sol"; -import "./AsyncPromise.sol"; import "../interfaces/IForwarder.sol"; import "solady/utils/Initializable.sol"; diff --git a/contracts/protocol/payload-delivery/FeesManager.sol b/contracts/protocol/payload-delivery/FeesManager.sol index ec364b4f..310d496f 100644 --- a/contracts/protocol/payload-delivery/FeesManager.sol +++ b/contracts/protocol/payload-delivery/FeesManager.sol @@ -4,12 +4,11 @@ pragma solidity ^0.8.0; import {Ownable} from "solady/auth/Ownable.sol"; import "solady/utils/Initializable.sol"; -import {IDeliveryHelper} from "../../interfaces/IDeliveryHelper.sol"; import {IFeesPlug} from "../../interfaces/IFeesPlug.sol"; import {IFeesManager} from "../../interfaces/IFeesManager.sol"; import {AddressResolverUtil} from "../utils/AddressResolverUtil.sol"; -import {FORWARD_CALL, DISTRIBUTE_FEE, DEPLOY, WITHDRAW} from "../utils/common/Constants.sol"; +import {WITHDRAW} from "../utils/common/Constants.sol"; import {NotAuctionManager} from "../utils/common/Errors.sol"; import {Bid, Fees, PayloadDetails, CallType, FinalizeParams, Parallel} from "../utils/common/Structs.sol"; diff --git a/contracts/protocol/payload-delivery/app-gateway/BatchAsync.sol b/contracts/protocol/payload-delivery/app-gateway/BatchAsync.sol index db2cf1e4..fa6cd3a4 100644 --- a/contracts/protocol/payload-delivery/app-gateway/BatchAsync.sol +++ b/contracts/protocol/payload-delivery/app-gateway/BatchAsync.sol @@ -3,15 +3,6 @@ pragma solidity ^0.8.21; import "./QueueAsync.sol"; -import {IDeliveryHelper} from "../../../interfaces/IDeliveryHelper.sol"; -import {IAppGateway} from "../../../interfaces/IAppGateway.sol"; -import {IAddressResolver} from "../../../interfaces/IAddressResolver.sol"; -import {IAuctionManager} from "../../../interfaces/IAuctionManager.sol"; -import {IFeesManager} from "../../../interfaces/IFeesManager.sol"; - -import {Bid, PayloadBatch, Fees, PayloadDetails} from "../../../protocol/utils/common/Structs.sol"; -import {FORWARD_CALL, DISTRIBUTE_FEE, DEPLOY, WITHDRAW, QUERY, FINALIZE} from "../../../protocol/utils/common/Constants.sol"; - /// @title BatchAsync /// @notice Abstract contract for managing asynchronous payload batches abstract contract BatchAsync is QueueAsync { diff --git a/contracts/protocol/payload-delivery/app-gateway/DeliveryHelper.sol b/contracts/protocol/payload-delivery/app-gateway/DeliveryHelper.sol index 4eace8ca..3df8d2e7 100644 --- a/contracts/protocol/payload-delivery/app-gateway/DeliveryHelper.sol +++ b/contracts/protocol/payload-delivery/app-gateway/DeliveryHelper.sol @@ -2,11 +2,6 @@ pragma solidity ^0.8.0; import "solady/utils/Initializable.sol"; - -import {IAppGateway} from "../../../interfaces/IAppGateway.sol"; -import {Bid, PayloadBatch, Fees, PayloadDetails, FinalizeParams} from "../../../protocol/utils/common/Structs.sol"; -import {DISTRIBUTE_FEE, DEPLOY} from "../../../protocol/utils/common/Constants.sol"; -import {PromisesNotResolved, InvalidTransmitter} from "../../../protocol/utils/common/Errors.sol"; import "./BatchAsync.sol"; contract DeliveryHelper is BatchAsync, Initializable { diff --git a/contracts/protocol/payload-delivery/app-gateway/DeliveryHelperStorage.sol b/contracts/protocol/payload-delivery/app-gateway/DeliveryHelperStorage.sol index 958b2d82..58755ec9 100644 --- a/contracts/protocol/payload-delivery/app-gateway/DeliveryHelperStorage.sol +++ b/contracts/protocol/payload-delivery/app-gateway/DeliveryHelperStorage.sol @@ -1,8 +1,19 @@ // SPDX-License-Identifier: Unlicense pragma solidity ^0.8.21; -import {CallParams, PayloadDetails, PayloadBatch} from "../../../protocol/utils/common/Structs.sol"; import {IDeliveryHelper} from "../../../interfaces/IDeliveryHelper.sol"; +import {IPromise} from "../../../interfaces/IPromise.sol"; +import {IAddressResolver} from "../../../interfaces/IAddressResolver.sol"; +import {IContractFactoryPlug} from "../../../interfaces/IContractFactoryPlug.sol"; +import {IAppGateway} from "../../../interfaces/IAppGateway.sol"; +import {IAppGateway} from "../../../interfaces/IAppGateway.sol"; +import {IAddressResolver} from "../../../interfaces/IAddressResolver.sol"; +import {IAuctionManager} from "../../../interfaces/IAuctionManager.sol"; +import {IFeesManager} from "../../../interfaces/IFeesManager.sol"; + +import {CallParams, Fees, PayloadDetails, CallType, Bid, PayloadBatch, Parallel, IsPlug, FinalizeParams} from "../../utils/common/Structs.sol"; +import {NotAuctionManager, InvalidPromise, InvalidIndex, PromisesNotResolved, InvalidTransmitter} from "../../utils/common/Errors.sol"; +import {FORWARD_CALL, DISTRIBUTE_FEE, DEPLOY, WITHDRAW, QUERY, FINALIZE} from "../../utils/common/Constants.sol"; /// @title DeliveryHelperStorage /// @notice Storage contract for DeliveryHelper diff --git a/contracts/protocol/payload-delivery/app-gateway/QueueAsync.sol b/contracts/protocol/payload-delivery/app-gateway/QueueAsync.sol index 28586381..1d12c82b 100644 --- a/contracts/protocol/payload-delivery/app-gateway/QueueAsync.sol +++ b/contracts/protocol/payload-delivery/app-gateway/QueueAsync.sol @@ -1,23 +1,14 @@ // SPDX-License-Identifier: Unlicense pragma solidity ^0.8.21; -import {AddressResolverUtil} from "../../../protocol/utils/AddressResolverUtil.sol"; -import {CallParams, Fees, PayloadDetails, CallType, Bid, PayloadBatch, Parallel, IsPlug} from "../../../protocol/utils/common/Structs.sol"; -import {NotAuctionManager, InvalidPromise, InvalidIndex} from "../../../protocol/utils/common/Errors.sol"; -import {AsyncPromise} from "../../AsyncPromise.sol"; -import {IPromise} from "../../../interfaces/IPromise.sol"; -import {IAppDeployer} from "../../../interfaces/IAppDeployer.sol"; -import {IAddressResolver} from "../../../interfaces/IAddressResolver.sol"; -import {IContractFactoryPlug} from "../../../interfaces/IContractFactoryPlug.sol"; import {Ownable} from "solady/auth/Ownable.sol"; -import {DeliveryHelperStorage} from "./DeliveryHelperStorage.sol"; + +import {AddressResolverUtil} from "../../utils/AddressResolverUtil.sol"; + +import "./DeliveryHelperStorage.sol"; /// @notice Abstract contract for managing asynchronous payloads -abstract contract QueueAsync is - DeliveryHelperStorage, - AddressResolverUtil, - Ownable -{ +abstract contract QueueAsync is DeliveryHelperStorage, AddressResolverUtil, Ownable { event PayloadBatchCancelled(bytes32 asyncId); event BidTimeoutUpdated(uint256 newBidTimeout); diff --git a/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol b/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol index eaecfbd6..6d5c2aab 100644 --- a/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol +++ b/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol @@ -2,9 +2,6 @@ pragma solidity ^0.8.21; import "./WatcherPrecompileConfig.sol"; -import "../../interfaces/IAppGateway.sol"; -import "../../interfaces/IPromise.sol"; -import "../../interfaces/IFeesManager.sol"; import "solady/utils/Initializable.sol"; /// @title WatcherPrecompile diff --git a/contracts/protocol/watcherPrecompile/WatcherPrecompileLimits.sol b/contracts/protocol/watcherPrecompile/WatcherPrecompileLimits.sol index ac07d848..05fc7565 100644 --- a/contracts/protocol/watcherPrecompile/WatcherPrecompileLimits.sol +++ b/contracts/protocol/watcherPrecompile/WatcherPrecompileLimits.sol @@ -4,9 +4,7 @@ pragma solidity ^0.8.21; import {AccessControl} from "../utils/AccessControl.sol"; import {Gauge} from "../utils/Gauge.sol"; import {AddressResolverUtil} from "../utils/AddressResolverUtil.sol"; -import {QUERY, FINALIZE, SCHEDULE} from "../utils/common/Constants.sol"; import {WATCHER_ROLE} from "../utils/common/AccessRoles.sol"; -import {TimeoutDelayTooLarge, TimeoutAlreadyResolved, InvalidInboxCaller, ResolvingTimeoutTooEarly, CallFailed, AppGatewayAlreadyCalled, InvalidWatcherSignature, NonceUsed} from "../utils/common/Errors.sol"; import "./WatcherPrecompileStorage.sol"; abstract contract WatcherPrecompileLimits is diff --git a/contracts/protocol/watcherPrecompile/WatcherPrecompileStorage.sol b/contracts/protocol/watcherPrecompile/WatcherPrecompileStorage.sol index 44b0839e..c530e489 100644 --- a/contracts/protocol/watcherPrecompile/WatcherPrecompileStorage.sol +++ b/contracts/protocol/watcherPrecompile/WatcherPrecompileStorage.sol @@ -2,6 +2,12 @@ pragma solidity ^0.8.0; import {IWatcherPrecompile} from "../../interfaces/IWatcherPrecompile.sol"; +import {IAppGateway} from "../../interfaces/IAppGateway.sol"; +import {IFeesManager} from "../../interfaces/IFeesManager.sol"; +import {IPromise} from "../../interfaces/IPromise.sol"; + +import {QUERY, FINALIZE, SCHEDULE} from "../utils/common/Constants.sol"; +import {TimeoutDelayTooLarge, TimeoutAlreadyResolved, InvalidInboxCaller, ResolvingTimeoutTooEarly, CallFailed, AppGatewayAlreadyCalled, InvalidWatcherSignature, NonceUsed} from "../utils/common/Errors.sol"; import {ResolvedPromises, AppGatewayConfig, LimitParams, UpdateLimitParams, PlugConfig, PayloadDigestParams, AsyncRequest, FinalizeParams, TimeoutRequest, CallFromChainParams} from "../utils/common/Structs.sol"; abstract contract WatcherPrecompileStorage is IWatcherPrecompile { From 5468244713035960240f37cd4321114f681382d4 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Tue, 25 Feb 2025 19:58:53 +0400 Subject: [PATCH 139/186] feat: add gaps --- README.md | 2 ++ contracts/protocol/AddressResolver.sol | 5 ++++- contracts/protocol/AsyncPromise.sol | 3 +++ contracts/protocol/Forwarder.sol | 4 ++++ .../protocol/payload-delivery/AuctionManager.sol | 6 +++++- .../protocol/payload-delivery/FeesManager.sol | 14 ++++++-------- .../app-gateway/DeliveryHelperStorage.sol | 4 ++++ .../payload-delivery/app-gateway/QueueAsync.sol | 4 +--- contracts/protocol/utils/AddressResolverUtil.sol | 2 +- .../watcherPrecompile/WatcherPrecompileStorage.sol | 4 ++++ 10 files changed, 34 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index dd8337b0..7807e036 100644 --- a/README.md +++ b/README.md @@ -17,3 +17,5 @@ Find more information at [docs](https://docs.socket.tech) - update version after every change - never remove code - inherited contracts should have gaps at the end to avoid storage collision +- write tests for migration checking slots after the change +- diff --git a/contracts/protocol/AddressResolver.sol b/contracts/protocol/AddressResolver.sol index 6f804a0d..64c5bb21 100644 --- a/contracts/protocol/AddressResolver.sol +++ b/contracts/protocol/AddressResolver.sol @@ -10,6 +10,7 @@ import {Forwarder} from "./Forwarder.sol"; import {AsyncPromise} from "./AsyncPromise.sol"; abstract contract AddressResolverStorage is IAddressResolver { + uint256[50] _gap_before; IWatcherPrecompile public override watcherPrecompile__; address public override deliveryHelper; address public override feesManager; @@ -31,12 +32,14 @@ abstract contract AddressResolverStorage is IAddressResolver { mapping(address => address) public override contractsToGateways; // gateway to contract map mapping(address => address) public override gatewaysToContracts; + + uint256[50] _gap_after; } /// @title AddressResolver Contract /// @notice This contract is responsible for fetching latest core addresses and deploying Forwarder and AsyncPromise contracts. /// @dev Inherits the Ownable contract and implements the IAddressResolver interface. -contract AddressResolver is AddressResolverStorage, Ownable, Initializable { +contract AddressResolver is AddressResolverStorage, Initializable, Ownable { /// @notice Error thrown if AppGateway contract was already set by a different address error InvalidCaller(address contractAddress_); diff --git a/contracts/protocol/AsyncPromise.sol b/contracts/protocol/AsyncPromise.sol index b8d4b8f6..268f27cd 100644 --- a/contracts/protocol/AsyncPromise.sol +++ b/contracts/protocol/AsyncPromise.sol @@ -16,6 +16,7 @@ enum AsyncPromiseState { } abstract contract AsyncPromiseStorage is IPromise { + uint256[50] _gap_before; /// @notice The callback selector to be called on the invoker. bytes4 public callbackSelector; @@ -34,6 +35,8 @@ abstract contract AsyncPromiseStorage is IPromise { /// @notice The callback data to be used when the promise is resolved. bytes public callbackData; + + uint256[50] _gap_after; } /// @title AsyncPromise diff --git a/contracts/protocol/Forwarder.sol b/contracts/protocol/Forwarder.sol index 14ae74f4..9cfb4d03 100644 --- a/contracts/protocol/Forwarder.sol +++ b/contracts/protocol/Forwarder.sol @@ -9,6 +9,8 @@ import "../interfaces/IForwarder.sol"; import "solady/utils/Initializable.sol"; abstract contract ForwarderStorage is IForwarder { + uint256[50] _gap_before; + /// @notice chain id uint32 public chainSlug; @@ -20,6 +22,8 @@ abstract contract ForwarderStorage is IForwarder { /// @notice caches the latest async promise address for the last call address public latestAsyncPromise; + + uint256[50] _gap_after; } /// @title Forwarder Contract diff --git a/contracts/protocol/payload-delivery/AuctionManager.sol b/contracts/protocol/payload-delivery/AuctionManager.sol index bb86ba37..c24054ce 100644 --- a/contracts/protocol/payload-delivery/AuctionManager.sol +++ b/contracts/protocol/payload-delivery/AuctionManager.sol @@ -14,6 +14,8 @@ import {Fees, Bid, PayloadBatch} from "../utils/common/Structs.sol"; import {AuctionClosed, AuctionAlreadyStarted, BidExceedsMaxFees, LowerBidAlreadyExists, InvalidTransmitter} from "../utils/common/Errors.sol"; abstract contract AuctionManagerStorage is IAuctionManager { + uint256[50] _gap_before; + uint32 public evmxChainSlug; mapping(bytes32 => Bid) public winningBids; // asyncId => auction status @@ -21,11 +23,13 @@ abstract contract AuctionManagerStorage is IAuctionManager { mapping(bytes32 => bool) public override auctionStarted; uint256 public auctionEndDelaySeconds; + + uint256[50] _gap_after; } /// @title AuctionManager /// @notice Contract for managing auctions and placing bids -contract AuctionManager is AuctionManagerStorage, AddressResolverUtil, Ownable, Initializable { +contract AuctionManager is AuctionManagerStorage, Initializable, Ownable, AddressResolverUtil { event AuctionRestarted(bytes32 asyncId); event AuctionStarted(bytes32 asyncId); event AuctionEnded(bytes32 asyncId, Bid winningBid); diff --git a/contracts/protocol/payload-delivery/FeesManager.sol b/contracts/protocol/payload-delivery/FeesManager.sol index 310d496f..df482fb5 100644 --- a/contracts/protocol/payload-delivery/FeesManager.sol +++ b/contracts/protocol/payload-delivery/FeesManager.sol @@ -12,7 +12,9 @@ import {WITHDRAW} from "../utils/common/Constants.sol"; import {NotAuctionManager} from "../utils/common/Errors.sol"; import {Bid, Fees, PayloadDetails, CallType, FinalizeParams, Parallel} from "../utils/common/Structs.sol"; -contract FeesManagerStorage { +abstract contract FeesManagerStorage is IFeesManager { + uint256[50] _gap_before; + uint256 public feesCounter; /// @notice Struct containing fee amounts and status struct TokenBalance { @@ -32,17 +34,13 @@ contract FeesManagerStorage { /// @notice Mapping to track fees to be distributed to transmitters /// @dev transmitter => chainSlug => token => amount mapping(address => mapping(uint32 => mapping(address => uint256))) public transmitterFees; + + uint256[50] _gap_after; } /// @title FeesManager /// @notice Contract for managing fees -contract FeesManager is - IFeesManager, - FeesManagerStorage, - AddressResolverUtil, - Ownable, - Initializable -{ +contract FeesManager is FeesManagerStorage, Initializable, Ownable, AddressResolverUtil { /// @notice Emitted when fees are blocked for a batch /// @param asyncId The batch identifier /// @param chainSlug The chain identifier diff --git a/contracts/protocol/payload-delivery/app-gateway/DeliveryHelperStorage.sol b/contracts/protocol/payload-delivery/app-gateway/DeliveryHelperStorage.sol index 58755ec9..49f1966b 100644 --- a/contracts/protocol/payload-delivery/app-gateway/DeliveryHelperStorage.sol +++ b/contracts/protocol/payload-delivery/app-gateway/DeliveryHelperStorage.sol @@ -18,6 +18,8 @@ import {FORWARD_CALL, DISTRIBUTE_FEE, DEPLOY, WITHDRAW, QUERY, FINALIZE} from ". /// @title DeliveryHelperStorage /// @notice Storage contract for DeliveryHelper abstract contract DeliveryHelperStorage is IDeliveryHelper { + uint256[50] _gap_before; + uint256 public saltCounter; uint256 public asyncCounter; uint256 public bidTimeout; @@ -36,4 +38,6 @@ abstract contract DeliveryHelperStorage is IDeliveryHelper { mapping(bytes32 => PayloadDetails[]) public payloadBatchDetails; // asyncId => PayloadBatch mapping(bytes32 => PayloadBatch) internal _payloadBatches; + + uint256[50] _gap_after; } diff --git a/contracts/protocol/payload-delivery/app-gateway/QueueAsync.sol b/contracts/protocol/payload-delivery/app-gateway/QueueAsync.sol index 1d12c82b..c4a31bf9 100644 --- a/contracts/protocol/payload-delivery/app-gateway/QueueAsync.sol +++ b/contracts/protocol/payload-delivery/app-gateway/QueueAsync.sol @@ -8,7 +8,7 @@ import {AddressResolverUtil} from "../../utils/AddressResolverUtil.sol"; import "./DeliveryHelperStorage.sol"; /// @notice Abstract contract for managing asynchronous payloads -abstract contract QueueAsync is DeliveryHelperStorage, AddressResolverUtil, Ownable { +abstract contract QueueAsync is DeliveryHelperStorage, Ownable, AddressResolverUtil { event PayloadBatchCancelled(bytes32 asyncId); event BidTimeoutUpdated(uint256 newBidTimeout); @@ -159,6 +159,4 @@ abstract contract QueueAsync is DeliveryHelperStorage, AddressResolverUtil, Owna function getAsyncBatchDetails(bytes32 asyncId_) external view returns (PayloadBatch memory) { return _payloadBatches[asyncId_]; } - - uint256[49] __gap; } diff --git a/contracts/protocol/utils/AddressResolverUtil.sol b/contracts/protocol/utils/AddressResolverUtil.sol index a0dcd789..ad85e214 100644 --- a/contracts/protocol/utils/AddressResolverUtil.sol +++ b/contracts/protocol/utils/AddressResolverUtil.sol @@ -67,5 +67,5 @@ abstract contract AddressResolverUtil { } // for proxy contracts - uint256[49] __gap_resolver_util; + uint256[50] __gap_resolver_util; } diff --git a/contracts/protocol/watcherPrecompile/WatcherPrecompileStorage.sol b/contracts/protocol/watcherPrecompile/WatcherPrecompileStorage.sol index c530e489..0a073602 100644 --- a/contracts/protocol/watcherPrecompile/WatcherPrecompileStorage.sol +++ b/contracts/protocol/watcherPrecompile/WatcherPrecompileStorage.sol @@ -11,6 +11,8 @@ import {TimeoutDelayTooLarge, TimeoutAlreadyResolved, InvalidInboxCaller, Resolv import {ResolvedPromises, AppGatewayConfig, LimitParams, UpdateLimitParams, PlugConfig, PayloadDigestParams, AsyncRequest, FinalizeParams, TimeoutRequest, CallFromChainParams} from "../utils/common/Structs.sol"; abstract contract WatcherPrecompileStorage is IWatcherPrecompile { + uint256[50] _gap_before; + /// @notice Number of decimals used in limit calculations uint256 public constant LIMIT_DECIMALS = 18; @@ -74,4 +76,6 @@ abstract contract WatcherPrecompileStorage is IWatcherPrecompile { /// @notice Mapping to store if appGateway has been called with trigger from on-chain Inbox /// @dev callId => bool mapping(bytes32 => bool) public appGatewayCalled; + + uint256[50] _gap_after; } From fdf3538361ff84ce0b9397a1bfef388e40a6159f Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Tue, 25 Feb 2025 20:07:20 +0400 Subject: [PATCH 140/186] fix: gaps in inherited contracts --- .../protocol/payload-delivery/app-gateway/BatchAsync.sol | 2 ++ .../payload-delivery/app-gateway/DeliveryHelper.sol | 3 +-- .../protocol/payload-delivery/app-gateway/QueueAsync.sol | 5 ++++- contracts/protocol/utils/AccessControl.sol | 2 ++ contracts/protocol/utils/Gauge.sol | 2 ++ .../protocol/watcherPrecompile/WatcherPrecompile.sol | 3 +-- .../watcherPrecompile/WatcherPrecompileConfig.sol | 2 +- .../watcherPrecompile/WatcherPrecompileLimits.sol | 8 +++++--- 8 files changed, 18 insertions(+), 9 deletions(-) diff --git a/contracts/protocol/payload-delivery/app-gateway/BatchAsync.sol b/contracts/protocol/payload-delivery/app-gateway/BatchAsync.sol index fa6cd3a4..a5eda5a1 100644 --- a/contracts/protocol/payload-delivery/app-gateway/BatchAsync.sol +++ b/contracts/protocol/payload-delivery/app-gateway/BatchAsync.sol @@ -310,4 +310,6 @@ abstract contract BatchAsync is QueueAsync { ); _deliverPayload(payloadDetailsArray, fees_, auctionManager_, new bytes(0)); } + + uint256[50] _gap_batch_async; } diff --git a/contracts/protocol/payload-delivery/app-gateway/DeliveryHelper.sol b/contracts/protocol/payload-delivery/app-gateway/DeliveryHelper.sol index 3df8d2e7..e7796e8b 100644 --- a/contracts/protocol/payload-delivery/app-gateway/DeliveryHelper.sol +++ b/contracts/protocol/payload-delivery/app-gateway/DeliveryHelper.sol @@ -1,10 +1,9 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -import "solady/utils/Initializable.sol"; import "./BatchAsync.sol"; -contract DeliveryHelper is BatchAsync, Initializable { +contract DeliveryHelper is BatchAsync { event CallBackReverted(bytes32 asyncId_, bytes32 payloadId_); constructor() { diff --git a/contracts/protocol/payload-delivery/app-gateway/QueueAsync.sol b/contracts/protocol/payload-delivery/app-gateway/QueueAsync.sol index c4a31bf9..bf9b0046 100644 --- a/contracts/protocol/payload-delivery/app-gateway/QueueAsync.sol +++ b/contracts/protocol/payload-delivery/app-gateway/QueueAsync.sol @@ -2,13 +2,14 @@ pragma solidity ^0.8.21; import {Ownable} from "solady/auth/Ownable.sol"; +import "solady/utils/Initializable.sol"; import {AddressResolverUtil} from "../../utils/AddressResolverUtil.sol"; import "./DeliveryHelperStorage.sol"; /// @notice Abstract contract for managing asynchronous payloads -abstract contract QueueAsync is DeliveryHelperStorage, Ownable, AddressResolverUtil { +abstract contract QueueAsync is DeliveryHelperStorage, Initializable, Ownable, AddressResolverUtil { event PayloadBatchCancelled(bytes32 asyncId); event BidTimeoutUpdated(uint256 newBidTimeout); @@ -159,4 +160,6 @@ abstract contract QueueAsync is DeliveryHelperStorage, Ownable, AddressResolverU function getAsyncBatchDetails(bytes32 asyncId_) external view returns (PayloadBatch memory) { return _payloadBatches[asyncId_]; } + + uint256[50] _gap_queue_async; } diff --git a/contracts/protocol/utils/AccessControl.sol b/contracts/protocol/utils/AccessControl.sol index 1f050375..6086e354 100644 --- a/contracts/protocol/utils/AccessControl.sol +++ b/contracts/protocol/utils/AccessControl.sol @@ -105,4 +105,6 @@ abstract contract AccessControl is Ownable { function _hasRole(bytes32 role_, address address_) internal view returns (bool) { return _permits[role_][address_]; } + + uint256[50] _gap_access_control; } diff --git a/contracts/protocol/utils/Gauge.sol b/contracts/protocol/utils/Gauge.sol index 1aa4cebe..a9a6a7dc 100644 --- a/contracts/protocol/utils/Gauge.sol +++ b/contracts/protocol/utils/Gauge.sol @@ -41,4 +41,6 @@ abstract contract Gauge { revert LimitReached(); } } + + uint256[50] _gap_gauge; } diff --git a/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol b/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol index 6d5c2aab..1d5fb8ed 100644 --- a/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol +++ b/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol @@ -2,11 +2,10 @@ pragma solidity ^0.8.21; import "./WatcherPrecompileConfig.sol"; -import "solady/utils/Initializable.sol"; /// @title WatcherPrecompile /// @notice Contract that handles payload verification, execution and app configurations -contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { +contract WatcherPrecompile is WatcherPrecompileConfig { /// @notice Error thrown when an invalid chain slug is provided error InvalidChainSlug(); /// @notice Error thrown when an invalid app gateway reaches a plug diff --git a/contracts/protocol/watcherPrecompile/WatcherPrecompileConfig.sol b/contracts/protocol/watcherPrecompile/WatcherPrecompileConfig.sol index a8bba140..cd63d06f 100644 --- a/contracts/protocol/watcherPrecompile/WatcherPrecompileConfig.sol +++ b/contracts/protocol/watcherPrecompile/WatcherPrecompileConfig.sol @@ -122,5 +122,5 @@ abstract contract WatcherPrecompileConfig is WatcherPrecompileLimits { if (signer != owner()) revert InvalidWatcherSignature(); } - uint256[49] __gap_config; + uint256[50] _gap_watcher_precompile_config; } diff --git a/contracts/protocol/watcherPrecompile/WatcherPrecompileLimits.sol b/contracts/protocol/watcherPrecompile/WatcherPrecompileLimits.sol index 05fc7565..14034ca5 100644 --- a/contracts/protocol/watcherPrecompile/WatcherPrecompileLimits.sol +++ b/contracts/protocol/watcherPrecompile/WatcherPrecompileLimits.sol @@ -6,12 +6,14 @@ import {Gauge} from "../utils/Gauge.sol"; import {AddressResolverUtil} from "../utils/AddressResolverUtil.sol"; import {WATCHER_ROLE} from "../utils/common/AccessRoles.sol"; import "./WatcherPrecompileStorage.sol"; +import "solady/utils/Initializable.sol"; abstract contract WatcherPrecompileLimits is WatcherPrecompileStorage, + Initializable, + AccessControl, Gauge, - AddressResolverUtil, - AccessControl + AddressResolverUtil { //////////////////////////////////////////////////////// ////////////////////// EVENTS ////////////////////////// @@ -164,5 +166,5 @@ abstract contract WatcherPrecompileLimits is defaultRatePerSecond = defaultRatePerSecond_; } - uint256[49] __gap; + uint256[50] _gap_watcher_precompile_limits; } From a8b0e861986344dfeeb782c62e298f4c2f6e7cd6 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Tue, 25 Feb 2025 20:13:20 +0400 Subject: [PATCH 141/186] rename: evmxChainSlug to evmxSlug --- .../payload-delivery/app-gateway/AuctionManager.sol | 10 +++++----- .../protocol/watcherPrecompile/WatcherPrecompile.sol | 10 +++++----- test/DeliveryHelper.t.sol | 10 +++------- test/SetupTest.t.sol | 4 ++-- test/apps/Counter.t.sol | 4 ++-- test/apps/SuperTokenLockable.t.sol | 11 ++++------- 6 files changed, 21 insertions(+), 28 deletions(-) diff --git a/contracts/protocol/payload-delivery/app-gateway/AuctionManager.sol b/contracts/protocol/payload-delivery/app-gateway/AuctionManager.sol index f5933c02..863e969a 100644 --- a/contracts/protocol/payload-delivery/app-gateway/AuctionManager.sol +++ b/contracts/protocol/payload-delivery/app-gateway/AuctionManager.sol @@ -13,7 +13,7 @@ import "solady/utils/Initializable.sol"; /// @title AuctionManager /// @notice Contract for managing auctions and placing bids contract AuctionManager is AddressResolverUtil, Ownable, IAuctionManager, Initializable { - uint32 public evmxChainSlug; + uint32 public evmxSlug; mapping(bytes32 => Bid) public winningBids; // asyncId => auction status mapping(bytes32 => bool) public override auctionClosed; @@ -39,19 +39,19 @@ contract AuctionManager is AddressResolverUtil, Ownable, IAuctionManager, Initia } /// @notice Initializer function to replace constructor - /// @param evmxChainSlug_ The chain slug for the VM + /// @param evmxSlug_ The chain slug for the VM /// @param auctionEndDelaySeconds_ The delay in seconds before an auction can end /// @param addressResolver_ The address of the address resolver /// @param owner_ The address of the contract owner function initialize( - uint32 evmxChainSlug_, + uint32 evmxSlug_, uint256 auctionEndDelaySeconds_, address addressResolver_, address owner_ ) public reinitializer(1) { _setAddressResolver(addressResolver_); _initializeOwner(owner_); - evmxChainSlug = evmxChainSlug_; + evmxSlug = evmxSlug_; auctionEndDelaySeconds = auctionEndDelaySeconds_; } @@ -84,7 +84,7 @@ contract AuctionManager is AddressResolverUtil, Ownable, IAuctionManager, Initia if (auctionClosed[asyncId_]) revert AuctionClosed(); address transmitter = _recoverSigner( - keccak256(abi.encode(address(this), evmxChainSlug, asyncId_, fee, extraData)), + keccak256(abi.encode(address(this), evmxSlug, asyncId_, fee, extraData)), transmitterSignature ); diff --git a/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol b/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol index 18681eb8..576d3c31 100644 --- a/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol +++ b/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol @@ -19,7 +19,7 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { uint256 public expiryTime; /// @notice The chain slug of the watcher precompile - uint32 public evmxChainSlug; + uint32 public evmxSlug; /// @notice Mapping to store async requests /// @dev payloadId => AsyncRequest struct @@ -107,7 +107,7 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { address addressResolver_, uint256 defaultLimit_, uint256 expiryTime_, - uint32 evmxChainSlug_ + uint32 evmxSlug_ ) public reinitializer(1) { _setAddressResolver(addressResolver_); _initializeOwner(owner_); @@ -119,7 +119,7 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { // limit per second defaultRatePerSecond = defaultLimit / (24 * 60 * 60); - evmxChainSlug = evmxChainSlug_; + evmxSlug = evmxSlug_; } // ================== Timeout functions ================== @@ -137,7 +137,7 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { // from auction manager _consumeLimit(appGateway_, SCHEDULE, 1); uint256 executeAt = block.timestamp + delayInSeconds_; - bytes32 timeoutId = _encodeId(evmxChainSlug, address(this)); + bytes32 timeoutId = _encodeId(evmxSlug, address(this)); timeoutRequests[timeoutId] = TimeoutRequest( timeoutId, msg.sender, @@ -273,7 +273,7 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { // from payload delivery _consumeLimit(appGateway_, QUERY, 1); // Generate unique payload ID from query counter - payloadId = _encodeId(evmxChainSlug, address(this)); + payloadId = _encodeId(evmxSlug, address(this)); // Create async request with minimal information for queries // Note: addresses set to 0 as they're not needed for queries diff --git a/test/DeliveryHelper.t.sol b/test/DeliveryHelper.t.sol index f83c355b..04a0fc3e 100644 --- a/test/DeliveryHelper.t.sol +++ b/test/DeliveryHelper.t.sol @@ -78,7 +78,7 @@ contract DeliveryHelperTest is SetupTest { bytes memory auctionManagerData = abi.encodeWithSelector( AuctionManager.initialize.selector, - evmxChainSlug, + evmxSlug, auctionEndDelaySeconds, address(addressResolver), owner, @@ -469,7 +469,7 @@ contract DeliveryHelperTest is SetupTest { vm.prank(transmitterEOA); bytes memory transmitterSignature = _createSignature( - keccak256(abi.encode(address(auctionManager), evmxChainSlug, asyncId, bidAmount, "")), + keccak256(abi.encode(address(auctionManager), evmxSlug, asyncId, bidAmount, "")), transmitterPrivateKey ); @@ -485,11 +485,7 @@ contract DeliveryHelperTest is SetupTest { // ); if (auctionEndDelaySeconds == 0) return; - bytes32 timeoutId = _encodeId( - evmxChainSlug, - address(watcherPrecompile), - payloadIdCounter++ - ); + bytes32 timeoutId = _encodeId(evmxSlug, address(watcherPrecompile), payloadIdCounter++); hoax(watcherEOA); watcherPrecompile.resolveTimeout(timeoutId); diff --git a/test/SetupTest.t.sol b/test/SetupTest.t.sol index 83b75e5c..65594d3c 100644 --- a/test/SetupTest.t.sol +++ b/test/SetupTest.t.sol @@ -32,7 +32,7 @@ contract SetupTest is Test { uint32 arbChainSlug = 421614; uint32 optChainSlug = 11155420; - uint32 evmxChainSlug = 1; + uint32 evmxSlug = 1; uint256 expiryTime = 10000000; uint256 public payloadIdCounter = 0; @@ -125,7 +125,7 @@ contract SetupTest is Test { address(addressResolverProxy), defaultLimit, expiryTime, - evmxChainSlug + evmxSlug ); vm.expectEmit(true, true, true, false); emit Initialized(version); diff --git a/test/apps/Counter.t.sol b/test/apps/Counter.t.sol index ca75e6a1..ab4d149c 100644 --- a/test/apps/Counter.t.sol +++ b/test/apps/Counter.t.sol @@ -143,8 +143,8 @@ contract CounterTest is DeliveryHelperTest { bytes32 bridgeAsyncId = getNextAsyncId(); bytes32[] memory payloadIds = new bytes32[](3); - payloadIds[0] = _encodeId(evmxChainSlug, address(watcherPrecompile), payloadIdCounter++); - payloadIds[1] = _encodeId(evmxChainSlug, address(watcherPrecompile), payloadIdCounter++); + payloadIds[0] = _encodeId(evmxSlug, address(watcherPrecompile), payloadIdCounter++); + payloadIds[1] = _encodeId(evmxSlug, address(watcherPrecompile), payloadIdCounter++); payloadIds[2] = getWritePayloadId( arbChainSlug, diff --git a/test/apps/SuperTokenLockable.t.sol b/test/apps/SuperTokenLockable.t.sol index 5902ae8e..82990d8b 100644 --- a/test/apps/SuperTokenLockable.t.sol +++ b/test/apps/SuperTokenLockable.t.sol @@ -116,14 +116,11 @@ contract SuperTokenLockableTest is DeliveryHelperTest { address appDeployer = address(uint160(c++)); address chainContractAddress = address(uint160(c++)); - address predicted = addressResolver.getForwarderAddress( - chainContractAddress, - evmxChainSlug - ); + address predicted = addressResolver.getForwarderAddress(chainContractAddress, evmxSlug); address forwarder = addressResolver.getOrDeployForwarderContract( appDeployer, chainContractAddress, - evmxChainSlug + evmxSlug ); assertEq(forwarder, predicted); @@ -288,7 +285,7 @@ contract SuperTokenLockableTest is DeliveryHelperTest { address(getSocketConfig(srcChainSlug).switchboard), payloadIdCounter++ ); - payloadIds[1] = _encodeId(evmxChainSlug, address(watcherPrecompile), payloadIdCounter++); + payloadIds[1] = _encodeId(evmxSlug, address(watcherPrecompile), payloadIdCounter++); payloadIds[2] = getWritePayloadId( dstChainSlug, address(getSocketConfig(dstChainSlug).switchboard), @@ -543,7 +540,7 @@ contract SuperTokenLockableTest is DeliveryHelperTest { // address(getSocketConfig(srcChainSlug).contractFactoryPlug), // payloadIdCounter++ // ); - // payloadIds[1] = _encodeId(evmxChainSlug, address(watcherPrecompile), payloadIdCounter++); + // payloadIds[1] = _encodeId(evmxSlug, address(watcherPrecompile), payloadIdCounter++); // payloadIds[2] = getWritePayloadId( // dstChainSlug, // address(getSocketConfig(dstChainSlug).contractFactoryPlug), From 98a9d5978bee86b2ef1fadd39ac1e762aa4efb96 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Tue, 25 Feb 2025 20:14:36 +0400 Subject: [PATCH 142/186] fix: rename error --- contracts/protocol/AddressResolver.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/protocol/AddressResolver.sol b/contracts/protocol/AddressResolver.sol index 28050c26..264f6206 100644 --- a/contracts/protocol/AddressResolver.sol +++ b/contracts/protocol/AddressResolver.sol @@ -36,7 +36,7 @@ contract AddressResolver is Ownable, IAddressResolver, Initializable { mapping(address => address) public override gatewaysToContracts; /// @notice Error thrown if AppGateway contract was already set by a different address - error InvalidCaller(address contractAddress_); + error InvalidAppGateway(address contractAddress_); event PlugAdded(address appGateway, uint32 chainSlug, address plug); event ForwarderDeployed(address newForwarder, bytes32 salt); @@ -166,7 +166,7 @@ contract AddressResolver is Ownable, IAddressResolver, Initializable { contractsToGateways[contractAddress_] != address(0) && contractsToGateways[contractAddress_] != msg.sender ) { - revert InvalidCaller(contractAddress_); + revert InvalidAppGateway(contractAddress_); } contractsToGateways[contractAddress_] = msg.sender; } From fd9721b89cf3a929afec0d08da2fb072aa1e2488 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Tue, 25 Feb 2025 20:58:31 +0400 Subject: [PATCH 143/186] feat: include selector and enforce contract constants --- .../watcherPrecompile/WatcherPrecompile.sol | 23 ++++--------------- .../WatcherPrecompileConfig.sol | 8 ++++--- .../WatcherPrecompileLimits.sol | 2 +- test/DeliveryHelper.t.sol | 12 +++------- test/Inbox.t.sol | 6 ++--- test/SetupTest.t.sol | 7 +----- 6 files changed, 17 insertions(+), 41 deletions(-) diff --git a/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol b/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol index a54ba400..795441e7 100644 --- a/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol +++ b/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol @@ -17,9 +17,6 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { /// @notice The expiry time for the payload uint256 public expiryTime; - /// @notice The chain slug of the watcher precompile - uint32 public evmxSlug; - /// @notice Mapping to store async requests /// @dev payloadId => AsyncRequest struct mapping(bytes32 => AsyncRequest) public asyncRequests; @@ -159,7 +156,7 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { ) external { _isWatcherSignatureValid( signatureNonce_, - keccak256(abi.encode(address(this), evmxChainSlug, signatureNonce_, timeoutId_)), + abi.encode(this.resolveTimeout.selector, timeoutId_), signature_ ); @@ -316,9 +313,7 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { ) external { _isWatcherSignatureValid( signatureNonce_, - keccak256( - abi.encode(address(this), evmxChainSlug, signatureNonce_, payloadId_, proof_) - ), + abi.encode(this.finalized.selector, payloadId_, proof_), signature_ ); @@ -336,7 +331,7 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { ) external { _isWatcherSignatureValid( signatureNonce_, - keccak256(abi.encode(address(this), evmxChainSlug, signatureNonce_, resolvedPromises_)), + abi.encode(this.resolvePromises.selector, resolvedPromises_), signature_ ); @@ -374,15 +369,7 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { ) external { _isWatcherSignatureValid( signatureNonce_, - keccak256( - abi.encode( - address(this), - evmxChainSlug, - signatureNonce_, - payloadId_, - isRevertingOnchain_ - ) - ), + abi.encode(this.markRevert.selector, isRevertingOnchain_, payloadId_), signature_ ); @@ -435,7 +422,7 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { ) external { _isWatcherSignatureValid( signatureNonce_, - keccak256(abi.encode(address(this), evmxChainSlug, signatureNonce_, params_)), + abi.encode(this.callAppGateways.selector, params_), signature_ ); diff --git a/contracts/protocol/watcherPrecompile/WatcherPrecompileConfig.sol b/contracts/protocol/watcherPrecompile/WatcherPrecompileConfig.sol index f5940af3..de019e05 100644 --- a/contracts/protocol/watcherPrecompile/WatcherPrecompileConfig.sol +++ b/contracts/protocol/watcherPrecompile/WatcherPrecompileConfig.sol @@ -74,7 +74,7 @@ abstract contract WatcherPrecompileConfig is WatcherPrecompileLimits { ) external { _isWatcherSignatureValid( signatureNonce_, - keccak256(abi.encode(address(this), evmxChainSlug, signatureNonce_, configs_)), + abi.encode(this.setAppGateways.selector, configs_), signature_ ); @@ -137,13 +137,15 @@ abstract contract WatcherPrecompileConfig is WatcherPrecompileLimits { function _isWatcherSignatureValid( uint256 signatureNonce_, - bytes32 digest_, + bytes memory digest_, bytes memory signature_ ) internal { if (isNonceUsed[signatureNonce_]) revert NonceUsed(); isNonceUsed[signatureNonce_] = true; - bytes32 digest = keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", digest_)); + bytes32 digest = keccak256(abi.encode(address(this), evmxSlug, signatureNonce_, digest_)); + digest = keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", digest)); + // recovered signer is checked for the valid roles later address signer = ECDSA.recover(digest, signature_); if (signer != owner()) revert InvalidWatcherSignature(); diff --git a/contracts/protocol/watcherPrecompile/WatcherPrecompileLimits.sol b/contracts/protocol/watcherPrecompile/WatcherPrecompileLimits.sol index cc6d44ab..8bc10bc9 100644 --- a/contracts/protocol/watcherPrecompile/WatcherPrecompileLimits.sol +++ b/contracts/protocol/watcherPrecompile/WatcherPrecompileLimits.sol @@ -25,7 +25,7 @@ abstract contract WatcherPrecompileLimits is uint256 public defaultRatePerSecond; /// @notice The chain slug of the watcher precompile - uint32 public evmxChainSlug; + uint32 public evmxSlug; // appGateway => limitType => receivingLimitParams mapping(address => mapping(bytes32 => LimitParams)) internal _limitParams; diff --git a/test/DeliveryHelper.t.sol b/test/DeliveryHelper.t.sol index 1323a1cf..debab576 100644 --- a/test/DeliveryHelper.t.sol +++ b/test/DeliveryHelper.t.sol @@ -162,9 +162,7 @@ contract DeliveryHelperTest is SetupTest { }); bytes memory watcherSignature = _createWatcherSignature( - keccak256( - abi.encode(address(watcherPrecompile), evmxChainSlug, signatureNonce, gateways) - ) + keccak256(abi.encode(address(watcherPrecompile), evmxSlug, signatureNonce, gateways)) ); watcherPrecompile.setAppGateways(gateways, signatureNonce++, watcherSignature); @@ -357,9 +355,7 @@ contract DeliveryHelperTest is SetupTest { } bytes memory watcherSignature = _createWatcherSignature( - keccak256( - abi.encode(address(watcherPrecompile), evmxChainSlug, signatureNonce, gateways) - ) + keccak256(abi.encode(address(watcherPrecompile), evmxSlug, signatureNonce, gateways)) ); watcherPrecompile.setAppGateways(gateways, signatureNonce++, watcherSignature); } @@ -497,9 +493,7 @@ contract DeliveryHelperTest is SetupTest { bytes32 timeoutId = _encodeId(evmxSlug, address(watcherPrecompile), payloadIdCounter++); bytes memory watcherSignature = _createWatcherSignature( - keccak256( - abi.encode(address(watcherPrecompile), evmxChainSlug, signatureNonce, timeoutId) - ) + keccak256(abi.encode(address(watcherPrecompile), evmxSlug, signatureNonce, timeoutId)) ); watcherPrecompile.resolveTimeout(timeoutId, signatureNonce++, watcherSignature); } diff --git a/test/Inbox.t.sol b/test/Inbox.t.sol index 29711ef8..5986611b 100644 --- a/test/Inbox.t.sol +++ b/test/Inbox.t.sol @@ -43,9 +43,7 @@ contract InboxTest is DeliveryHelperTest { }); bytes memory watcherSignature = _createWatcherSignature( - keccak256( - abi.encode(address(watcherPrecompile), evmxChainSlug, signatureNonce, gateways) - ) + keccak256(abi.encode(address(watcherPrecompile), evmxSlug, signatureNonce, gateways)) ); watcherPrecompile.setAppGateways(gateways, signatureNonce++, watcherSignature); @@ -73,7 +71,7 @@ contract InboxTest is DeliveryHelperTest { }); bytes memory watcherSignature = _createWatcherSignature( - keccak256(abi.encode(address(watcherPrecompile), evmxChainSlug, signatureNonce, params)) + keccak256(abi.encode(address(watcherPrecompile), evmxSlug, signatureNonce, params)) ); watcherPrecompile.callAppGateways(params, signatureNonce++, watcherSignature); // Check counter was incremented diff --git a/test/SetupTest.t.sol b/test/SetupTest.t.sol index 67bcee71..a0db33a4 100644 --- a/test/SetupTest.t.sol +++ b/test/SetupTest.t.sol @@ -219,12 +219,7 @@ contract SetupTest is Test { bytes memory watcherSignature = _createWatcherSignature( keccak256( - abi.encode( - address(watcherPrecompile), - evmxChainSlug, - signatureNonce, - resolvedPromises - ) + abi.encode(address(watcherPrecompile), evmxSlug, signatureNonce, resolvedPromises) ) ); watcherPrecompile.resolvePromises(signatureNonce++, resolvedPromises, watcherSignature); From 774071e5f61d63c004886f9b1c7628871834e965 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Tue, 25 Feb 2025 20:58:53 +0400 Subject: [PATCH 144/186] fix: tests --- test/DeliveryHelper.t.sol | 6 +++--- test/Inbox.t.sol | 4 ++-- test/SetupTest.t.sol | 13 ++++++++----- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/test/DeliveryHelper.t.sol b/test/DeliveryHelper.t.sol index debab576..74aa39a9 100644 --- a/test/DeliveryHelper.t.sol +++ b/test/DeliveryHelper.t.sol @@ -162,7 +162,7 @@ contract DeliveryHelperTest is SetupTest { }); bytes memory watcherSignature = _createWatcherSignature( - keccak256(abi.encode(address(watcherPrecompile), evmxSlug, signatureNonce, gateways)) + abi.encode(IWatcherPrecompile.setAppGateways.selector, gateways) ); watcherPrecompile.setAppGateways(gateways, signatureNonce++, watcherSignature); @@ -355,7 +355,7 @@ contract DeliveryHelperTest is SetupTest { } bytes memory watcherSignature = _createWatcherSignature( - keccak256(abi.encode(address(watcherPrecompile), evmxSlug, signatureNonce, gateways)) + abi.encode(IWatcherPrecompile.setAppGateways.selector, gateways) ); watcherPrecompile.setAppGateways(gateways, signatureNonce++, watcherSignature); } @@ -493,7 +493,7 @@ contract DeliveryHelperTest is SetupTest { bytes32 timeoutId = _encodeId(evmxSlug, address(watcherPrecompile), payloadIdCounter++); bytes memory watcherSignature = _createWatcherSignature( - keccak256(abi.encode(address(watcherPrecompile), evmxSlug, signatureNonce, timeoutId)) + abi.encode(IWatcherPrecompile.resolveTimeout.selector, timeoutId) ); watcherPrecompile.resolveTimeout(timeoutId, signatureNonce++, watcherSignature); } diff --git a/test/Inbox.t.sol b/test/Inbox.t.sol index 5986611b..9e8da63d 100644 --- a/test/Inbox.t.sol +++ b/test/Inbox.t.sol @@ -43,7 +43,7 @@ contract InboxTest is DeliveryHelperTest { }); bytes memory watcherSignature = _createWatcherSignature( - keccak256(abi.encode(address(watcherPrecompile), evmxSlug, signatureNonce, gateways)) + abi.encode(IWatcherPrecompile.setAppGateways.selector, gateways) ); watcherPrecompile.setAppGateways(gateways, signatureNonce++, watcherSignature); @@ -71,7 +71,7 @@ contract InboxTest is DeliveryHelperTest { }); bytes memory watcherSignature = _createWatcherSignature( - keccak256(abi.encode(address(watcherPrecompile), evmxSlug, signatureNonce, params)) + abi.encode(WatcherPrecompile.callAppGateways.selector, params) ); watcherPrecompile.callAppGateways(params, signatureNonce++, watcherSignature); // Check counter was incremented diff --git a/test/SetupTest.t.sol b/test/SetupTest.t.sol index a0db33a4..e1a52fb9 100644 --- a/test/SetupTest.t.sol +++ b/test/SetupTest.t.sol @@ -218,15 +218,18 @@ contract SetupTest is Test { resolvedPromises[0] = ResolvedPromises({payloadId: payloadId, returnData: returnDatas}); bytes memory watcherSignature = _createWatcherSignature( - keccak256( - abi.encode(address(watcherPrecompile), evmxSlug, signatureNonce, resolvedPromises) - ) + abi.encode(WatcherPrecompile.resolvePromises.selector, resolvedPromises) ); watcherPrecompile.resolvePromises(signatureNonce++, resolvedPromises, watcherSignature); } - function _createWatcherSignature(bytes32 digest_) internal view returns (bytes memory sig) { - bytes32 digest = keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", digest_)); + function _createWatcherSignature( + bytes memory params_ + ) internal view returns (bytes memory sig) { + bytes32 digest = keccak256( + abi.encode(address(watcherPrecompile), evmxSlug, signatureNonce, params_) + ); + digest = keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", digest)); (uint8 sigV, bytes32 sigR, bytes32 sigS) = vm.sign(watcherPrivateKey, digest); sig = new bytes(65); bytes1 v32 = bytes1(sigV); From 57a81b596a3b4663f799829decc355676572c0de Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Wed, 26 Feb 2025 13:25:20 +0400 Subject: [PATCH 145/186] feat: change data type --- contracts/interfaces/IDeliveryHelper.sol | 2 +- .../app-gateway/DeliveryHelper.sol | 2 +- .../app-gateway/DeliveryHelperStorage.sol | 22 ++++++++++++++----- .../app-gateway/QueueAsync.sol | 4 +++- 4 files changed, 22 insertions(+), 8 deletions(-) diff --git a/contracts/interfaces/IDeliveryHelper.sol b/contracts/interfaces/IDeliveryHelper.sol index d6cd4fd3..2f9d15ae 100644 --- a/contracts/interfaces/IDeliveryHelper.sol +++ b/contracts/interfaces/IDeliveryHelper.sol @@ -13,7 +13,7 @@ interface IDeliveryHelper { Bid winningBid // Replaced winningTransmitter and winningBid with Bid struct ); - function bidTimeout() external view returns (uint256); + function bidTimeout() external view returns (uint128); function payloadBatches(bytes32) external view returns (PayloadBatch memory); diff --git a/contracts/protocol/payload-delivery/app-gateway/DeliveryHelper.sol b/contracts/protocol/payload-delivery/app-gateway/DeliveryHelper.sol index e7796e8b..df7cb9bc 100644 --- a/contracts/protocol/payload-delivery/app-gateway/DeliveryHelper.sol +++ b/contracts/protocol/payload-delivery/app-gateway/DeliveryHelper.sol @@ -16,7 +16,7 @@ contract DeliveryHelper is BatchAsync { function initialize( address addressResolver_, address owner_, - uint256 bidTimeout_ + uint128 bidTimeout_ ) public reinitializer(1) { _setAddressResolver(addressResolver_); bidTimeout = bidTimeout_; diff --git a/contracts/protocol/payload-delivery/app-gateway/DeliveryHelperStorage.sol b/contracts/protocol/payload-delivery/app-gateway/DeliveryHelperStorage.sol index 49f1966b..118444ff 100644 --- a/contracts/protocol/payload-delivery/app-gateway/DeliveryHelperStorage.sol +++ b/contracts/protocol/payload-delivery/app-gateway/DeliveryHelperStorage.sol @@ -20,22 +20,34 @@ import {FORWARD_CALL, DISTRIBUTE_FEE, DEPLOY, WITHDRAW, QUERY, FINALIZE} from ". abstract contract DeliveryHelperStorage is IDeliveryHelper { uint256[50] _gap_before; + // slot 50 uint256 public saltCounter; - uint256 public asyncCounter; - uint256 public bidTimeout; - /// @notice The call parameters array - CallParams[] public callParamsArray; + // slot 51 + uint128 public asyncCounter; + uint128 public bidTimeout; + // slot 52 bytes32[] public tempPayloadIds; + // slot 53 + /// @notice The call parameters array + CallParams[] public callParamsArray; + + // slot 54 /// @notice The mapping of valid promises mapping(address => bool) public isValidPromise; - // payloadId => asyncId + + // slot 55 - payloadIdToBatchHash mapping(bytes32 => bytes32) public payloadIdToBatchHash; + // slot 56 - payloadIdToPayloadDetails mapping(bytes32 => PayloadDetails) public payloadIdToPayloadDetails; + + // slot 57 // asyncId => PayloadDetails[] mapping(bytes32 => PayloadDetails[]) public payloadBatchDetails; + + // slot 58 // asyncId => PayloadBatch mapping(bytes32 => PayloadBatch) internal _payloadBatches; diff --git a/contracts/protocol/payload-delivery/app-gateway/QueueAsync.sol b/contracts/protocol/payload-delivery/app-gateway/QueueAsync.sol index bf9b0046..ce859cec 100644 --- a/contracts/protocol/payload-delivery/app-gateway/QueueAsync.sol +++ b/contracts/protocol/payload-delivery/app-gateway/QueueAsync.sol @@ -75,6 +75,8 @@ abstract contract QueueAsync is DeliveryHelperStorage, Initializable, Ownable, A function _createPayloadDetailsArray( bytes32 sbType_ ) internal returns (PayloadDetails[] memory payloadDetailsArray) { + if (callParamsArray.length == 0) return payloadDetailsArray; + payloadDetailsArray = new PayloadDetails[](callParamsArray.length); for (uint256 i = 0; i < callParamsArray.length; i++) { CallParams memory params = callParamsArray[i]; @@ -140,7 +142,7 @@ abstract contract QueueAsync is DeliveryHelperStorage, Initializable, Ownable, A /// @notice Updates the bid timeout /// @param newBidTimeout_ The new bid timeout value - function updateBidTimeout(uint256 newBidTimeout_) external onlyOwner { + function updateBidTimeout(uint128 newBidTimeout_) external onlyOwner { bidTimeout = newBidTimeout_; emit BidTimeoutUpdated(newBidTimeout_); } From 2bf154967748fd3ad64a6a9e80d2fb8464359f8f Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Wed, 26 Feb 2025 14:21:31 +0400 Subject: [PATCH 146/186] doc: added slots --- contracts/protocol/AddressResolver.sol | 25 +- contracts/protocol/AsyncPromise.sol | 11 + contracts/protocol/Forwarder.sol | 6 + .../payload-delivery/AuctionManager.sol | 12 + .../protocol/payload-delivery/FeesManager.sol | 11 +- .../app-gateway/BatchAsync.sol | 1 + .../app-gateway/DeliveryHelperStorage.sol | 6 +- .../app-gateway/QueueAsync.sol | 3 + .../protocol/utils/AddressResolverUtil.sol | 3 +- contracts/protocol/utils/Gauge.sol | 1 + .../WatcherPrecompileConfig.sol | 1 + .../WatcherPrecompileLimits.sol | 8 + .../WatcherPrecompileStorage.sol | 22 ++ test/mock/MockSocket.sol | 181 +++++++++++++ test/mock/MockWatcherPrecompile.sol | 245 ++++++++++++++++++ 15 files changed, 528 insertions(+), 8 deletions(-) create mode 100644 test/mock/MockSocket.sol create mode 100644 test/mock/MockWatcherPrecompile.sol diff --git a/contracts/protocol/AddressResolver.sol b/contracts/protocol/AddressResolver.sol index 64c5bb21..fe87dbe9 100644 --- a/contracts/protocol/AddressResolver.sol +++ b/contracts/protocol/AddressResolver.sol @@ -10,29 +10,46 @@ import {Forwarder} from "./Forwarder.sol"; import {AsyncPromise} from "./AsyncPromise.sol"; abstract contract AddressResolverStorage is IAddressResolver { + // slots [0-49] reserved for gap uint256[50] _gap_before; + + // slot 50 IWatcherPrecompile public override watcherPrecompile__; + + // slot 51 address public override deliveryHelper; + + // slot 52 address public override feesManager; - // Beacons for managing upgrades + // slot 53 UpgradeableBeacon public forwarderBeacon; + + // slot 54 UpgradeableBeacon public asyncPromiseBeacon; + // slot 55 address public forwarderImplementation; + + // slot 56 address public asyncPromiseImplementation; - // Array to store promises + // slot 57 address[] internal _promises; + // slot 58 uint256 public asyncPromiseCounter; + + // slot 59 uint64 public version; - // contracts to gateway map + // slot 60 mapping(address => address) public override contractsToGateways; - // gateway to contract map + + // slot 61 mapping(address => address) public override gatewaysToContracts; + // slots [62-111] reserved for gap uint256[50] _gap_after; } diff --git a/contracts/protocol/AsyncPromise.sol b/contracts/protocol/AsyncPromise.sol index 268f27cd..869601c3 100644 --- a/contracts/protocol/AsyncPromise.sol +++ b/contracts/protocol/AsyncPromise.sol @@ -16,27 +16,38 @@ enum AsyncPromiseState { } abstract contract AsyncPromiseStorage is IPromise { + // slots [0-49] reserved for gap uint256[50] _gap_before; + + // slot 50 /// @notice The callback selector to be called on the invoker. bytes4 public callbackSelector; + // slot 51 /// @notice Indicates whether the promise has been resolved. bool public override resolved; + // slot 52 /// @notice The current state of the async promise. AsyncPromiseState public state; + // slot 53 /// @notice The local contract which initiated the async call. /// @dev The callback will be executed on this address address public localInvoker; + // slot 54 /// @notice The forwarder address which can call the callback address public forwarder; + // slot 55 /// @notice The callback data to be used when the promise is resolved. bytes public callbackData; + // slots [56-105] reserved for gap uint256[50] _gap_after; + + // slots 106-157 reserved for addr resolver util } /// @title AsyncPromise diff --git a/contracts/protocol/Forwarder.sol b/contracts/protocol/Forwarder.sol index 9cfb4d03..13785b7b 100644 --- a/contracts/protocol/Forwarder.sol +++ b/contracts/protocol/Forwarder.sol @@ -9,20 +9,26 @@ import "../interfaces/IForwarder.sol"; import "solady/utils/Initializable.sol"; abstract contract ForwarderStorage is IForwarder { + // slots [0-49] reserved for gap uint256[50] _gap_before; + // slot 50 /// @notice chain id uint32 public chainSlug; + // slot 51 /// @notice on-chain address associated with this forwarder address public onChainAddress; + // slot 52 /// @notice address resolver contract address for imp addresses address public addressResolver; + // slot 53 /// @notice caches the latest async promise address for the last call address public latestAsyncPromise; + // slots [54-103] reserved for gap uint256[50] _gap_after; } diff --git a/contracts/protocol/payload-delivery/AuctionManager.sol b/contracts/protocol/payload-delivery/AuctionManager.sol index c24054ce..c7e2b260 100644 --- a/contracts/protocol/payload-delivery/AuctionManager.sol +++ b/contracts/protocol/payload-delivery/AuctionManager.sol @@ -14,17 +14,29 @@ import {Fees, Bid, PayloadBatch} from "../utils/common/Structs.sol"; import {AuctionClosed, AuctionAlreadyStarted, BidExceedsMaxFees, LowerBidAlreadyExists, InvalidTransmitter} from "../utils/common/Errors.sol"; abstract contract AuctionManagerStorage is IAuctionManager { + // slots [0-49] reserved for gap uint256[50] _gap_before; + // slot 50 uint32 public evmxChainSlug; + + // slot 51 mapping(bytes32 => Bid) public winningBids; + + // slot 52 // asyncId => auction status mapping(bytes32 => bool) public override auctionClosed; + + // slot 53 mapping(bytes32 => bool) public override auctionStarted; + // slot 54 uint256 public auctionEndDelaySeconds; + // slots [55-104] reserved for gap uint256[50] _gap_after; + + // slots 105-156 reserved for addr resolver util } /// @title AuctionManager diff --git a/contracts/protocol/payload-delivery/FeesManager.sol b/contracts/protocol/payload-delivery/FeesManager.sol index df482fb5..007e2e09 100644 --- a/contracts/protocol/payload-delivery/FeesManager.sol +++ b/contracts/protocol/payload-delivery/FeesManager.sol @@ -13,30 +13,39 @@ import {NotAuctionManager} from "../utils/common/Errors.sol"; import {Bid, Fees, PayloadDetails, CallType, FinalizeParams, Parallel} from "../utils/common/Structs.sol"; abstract contract FeesManagerStorage is IFeesManager { + // slots [0-49] reserved for gap uint256[50] _gap_before; + // slot 50 uint256 public feesCounter; + /// @notice Struct containing fee amounts and status struct TokenBalance { uint256 deposited; // Amount deposited uint256 blocked; // Amount blocked } + // slot 51 /// @notice Master mapping tracking all fee information /// @dev appGateway => chainSlug => token => TokenBalance mapping(address => mapping(uint32 => mapping(address => TokenBalance))) public appGatewayFeeBalances; + // slot 52 /// @notice Mapping to track blocked fees for each async id /// @dev asyncId => Fees mapping(bytes32 => Fees) public asyncIdBlockedFees; + // slot 53 /// @notice Mapping to track fees to be distributed to transmitters /// @dev transmitter => chainSlug => token => amount mapping(address => mapping(uint32 => mapping(address => uint256))) public transmitterFees; + // slots [54-103] reserved for gap uint256[50] _gap_after; -} + + // slots 104-153 reserved for addr resolver util + } /// @title FeesManager /// @notice Contract for managing fees diff --git a/contracts/protocol/payload-delivery/app-gateway/BatchAsync.sol b/contracts/protocol/payload-delivery/app-gateway/BatchAsync.sol index a5eda5a1..634709e8 100644 --- a/contracts/protocol/payload-delivery/app-gateway/BatchAsync.sol +++ b/contracts/protocol/payload-delivery/app-gateway/BatchAsync.sol @@ -311,5 +311,6 @@ abstract contract BatchAsync is QueueAsync { _deliverPayload(payloadDetailsArray, fees_, auctionManager_, new bytes(0)); } + // slots [211-260] reserved for gap uint256[50] _gap_batch_async; } diff --git a/contracts/protocol/payload-delivery/app-gateway/DeliveryHelperStorage.sol b/contracts/protocol/payload-delivery/app-gateway/DeliveryHelperStorage.sol index 118444ff..1801385a 100644 --- a/contracts/protocol/payload-delivery/app-gateway/DeliveryHelperStorage.sol +++ b/contracts/protocol/payload-delivery/app-gateway/DeliveryHelperStorage.sol @@ -18,6 +18,7 @@ import {FORWARD_CALL, DISTRIBUTE_FEE, DEPLOY, WITHDRAW, QUERY, FINALIZE} from ". /// @title DeliveryHelperStorage /// @notice Storage contract for DeliveryHelper abstract contract DeliveryHelperStorage is IDeliveryHelper { + // slots [0-49] reserved for gap uint256[50] _gap_before; // slot 50 @@ -40,16 +41,17 @@ abstract contract DeliveryHelperStorage is IDeliveryHelper { // slot 55 - payloadIdToBatchHash mapping(bytes32 => bytes32) public payloadIdToBatchHash; - // slot 56 - payloadIdToPayloadDetails + // slot 56 - payloadIdToPayloadDetails mapping(bytes32 => PayloadDetails) public payloadIdToPayloadDetails; // slot 57 // asyncId => PayloadDetails[] mapping(bytes32 => PayloadDetails[]) public payloadBatchDetails; - + // slot 58 // asyncId => PayloadBatch mapping(bytes32 => PayloadBatch) internal _payloadBatches; + // slots [59-108] reserved for gap uint256[50] _gap_after; } diff --git a/contracts/protocol/payload-delivery/app-gateway/QueueAsync.sol b/contracts/protocol/payload-delivery/app-gateway/QueueAsync.sol index ce859cec..9b9d36ab 100644 --- a/contracts/protocol/payload-delivery/app-gateway/QueueAsync.sol +++ b/contracts/protocol/payload-delivery/app-gateway/QueueAsync.sol @@ -10,6 +10,8 @@ import "./DeliveryHelperStorage.sol"; /// @notice Abstract contract for managing asynchronous payloads abstract contract QueueAsync is DeliveryHelperStorage, Initializable, Ownable, AddressResolverUtil { + // slots [0-108] reserved for delivery helper storage and [109-160] reserved for addr resolver util + event PayloadBatchCancelled(bytes32 asyncId); event BidTimeoutUpdated(uint256 newBidTimeout); @@ -163,5 +165,6 @@ abstract contract QueueAsync is DeliveryHelperStorage, Initializable, Ownable, A return _payloadBatches[asyncId_]; } + // slots [161-210] reserved for gap uint256[50] _gap_queue_async; } diff --git a/contracts/protocol/utils/AddressResolverUtil.sol b/contracts/protocol/utils/AddressResolverUtil.sol index ad85e214..7862aab6 100644 --- a/contracts/protocol/utils/AddressResolverUtil.sol +++ b/contracts/protocol/utils/AddressResolverUtil.sol @@ -11,6 +11,7 @@ import "../../interfaces/IWatcherPrecompile.sol"; abstract contract AddressResolverUtil { /// @notice The address resolver contract reference /// @dev Used to look up system contract addresses + // slot 0 IAddressResolver public addressResolver__; /// @notice Error thrown when an invalid address attempts to call the Payload Delivery only function @@ -66,6 +67,6 @@ abstract contract AddressResolverUtil { if (appGateway == address(0)) appGateway = originAppGateway_; } - // for proxy contracts + // slots 1-50 reserved for future use uint256[50] __gap_resolver_util; } diff --git a/contracts/protocol/utils/Gauge.sol b/contracts/protocol/utils/Gauge.sol index a9a6a7dc..3fde631f 100644 --- a/contracts/protocol/utils/Gauge.sol +++ b/contracts/protocol/utils/Gauge.sol @@ -42,5 +42,6 @@ abstract contract Gauge { } } + // slot 0-49: gap for future storage variables uint256[50] _gap_gauge; } diff --git a/contracts/protocol/watcherPrecompile/WatcherPrecompileConfig.sol b/contracts/protocol/watcherPrecompile/WatcherPrecompileConfig.sol index cd63d06f..1acad489 100644 --- a/contracts/protocol/watcherPrecompile/WatcherPrecompileConfig.sol +++ b/contracts/protocol/watcherPrecompile/WatcherPrecompileConfig.sol @@ -122,5 +122,6 @@ abstract contract WatcherPrecompileConfig is WatcherPrecompileLimits { if (signer != owner()) revert InvalidWatcherSignature(); } + // slot 324-374: gap for future storage variables uint256[50] _gap_watcher_precompile_config; } diff --git a/contracts/protocol/watcherPrecompile/WatcherPrecompileLimits.sol b/contracts/protocol/watcherPrecompile/WatcherPrecompileLimits.sol index 14034ca5..e21eaff6 100644 --- a/contracts/protocol/watcherPrecompile/WatcherPrecompileLimits.sol +++ b/contracts/protocol/watcherPrecompile/WatcherPrecompileLimits.sol @@ -15,6 +15,13 @@ abstract contract WatcherPrecompileLimits is Gauge, AddressResolverUtil { + // Slots from parent contracts: + // slot 0-119: watcher precompile storage + // 0 slots for initializable and ownable + // slots 120-170: access control + // slots 171-221: gauge + // slots 222-272: address resolver util + //////////////////////////////////////////////////////// ////////////////////// EVENTS ////////////////////////// //////////////////////////////////////////////////////// @@ -166,5 +173,6 @@ abstract contract WatcherPrecompileLimits is defaultRatePerSecond = defaultRatePerSecond_; } + // slots 273-323: gap for future storage variables uint256[50] _gap_watcher_precompile_limits; } diff --git a/contracts/protocol/watcherPrecompile/WatcherPrecompileStorage.sol b/contracts/protocol/watcherPrecompile/WatcherPrecompileStorage.sol index 0a073602..640b90b0 100644 --- a/contracts/protocol/watcherPrecompile/WatcherPrecompileStorage.sol +++ b/contracts/protocol/watcherPrecompile/WatcherPrecompileStorage.sol @@ -11,71 +11,93 @@ import {TimeoutDelayTooLarge, TimeoutAlreadyResolved, InvalidInboxCaller, Resolv import {ResolvedPromises, AppGatewayConfig, LimitParams, UpdateLimitParams, PlugConfig, PayloadDigestParams, AsyncRequest, FinalizeParams, TimeoutRequest, CallFromChainParams} from "../utils/common/Structs.sol"; abstract contract WatcherPrecompileStorage is IWatcherPrecompile { + // slot 0-49: gap for future storage variables uint256[50] _gap_before; + // slot 50: constant LIMIT_DECIMALS (doesn't use storage) /// @notice Number of decimals used in limit calculations uint256 public constant LIMIT_DECIMALS = 18; + // slot 51: defaultLimit /// @notice Default limit value for any app gateway uint256 public defaultLimit; + // slot 52: defaultRatePerSecond /// @notice Rate at which limit replenishes per second uint256 public defaultRatePerSecond; + // slot 53: evmxChainSlug /// @notice The chain slug of the watcher precompile uint32 public evmxChainSlug; + // slot 54: _limitParams // appGateway => limitType => receivingLimitParams mapping(address => mapping(bytes32 => LimitParams)) internal _limitParams; + // slot 55: _activeAppGateways // Mapping to track active app gateways mapping(address => bool) internal _activeAppGateways; + // slot 56: _plugConfigs /// @notice Maps network and plug to their configuration /// @dev chainSlug => plug => PlugConfig mapping(uint32 => mapping(address => PlugConfig)) internal _plugConfigs; + // slot 57: switchboards /// @notice Maps chain slug to their associated switchboard /// @dev chainSlug => sb type => switchboard address mapping(uint32 => mapping(bytes32 => address)) public switchboards; + // slot 58: sockets /// @notice Maps chain slug to their associated socket /// @dev chainSlug => socket address mapping(uint32 => address) public sockets; + // slot 59: contractFactoryPlug /// @notice Maps chain slug to their associated contract factory plug /// @dev chainSlug => contract factory plug address mapping(uint32 => address) public contractFactoryPlug; + // slot 60: feesPlug /// @notice Maps chain slug to their associated fees plug /// @dev chainSlug => fees plug address mapping(uint32 => address) public feesPlug; + // slot 61: isNonceUsed /// @notice Maps nonce to whether it has been used /// @dev signatureNonce => isValid mapping(uint256 => bool) public isNonceUsed; + // slot 62: isValidPlug // appGateway => chainSlug => plug => isValid mapping(address => mapping(uint32 => mapping(address => bool))) public isValidPlug; + // slot 63: maxTimeoutDelayInSeconds uint256 public maxTimeoutDelayInSeconds; + // slot 64: payloadCounter /// @notice Counter for tracking payload requests uint256 public payloadCounter; + // slot 65: expiryTime /// @notice The expiry time for the payload uint256 public expiryTime; + // slot 66: asyncRequests /// @notice Mapping to store async requests /// @dev payloadId => AsyncRequest struct mapping(bytes32 => AsyncRequest) public asyncRequests; + // slot 67: timeoutRequests /// @notice Mapping to store timeout requests /// @dev timeoutId => TimeoutRequest struct mapping(bytes32 => TimeoutRequest) public timeoutRequests; + // slot 68: watcherProofs /// @notice Mapping to store watcher proofs /// @dev payloadId => proof bytes mapping(bytes32 => bytes) public watcherProofs; + // slot 69: appGatewayCalled /// @notice Mapping to store if appGateway has been called with trigger from on-chain Inbox /// @dev callId => bool mapping(bytes32 => bool) public appGatewayCalled; + // slots 70-119: gap for future storage variables uint256[50] _gap_after; } diff --git a/test/mock/MockSocket.sol b/test/mock/MockSocket.sol new file mode 100644 index 00000000..d6a4c96e --- /dev/null +++ b/test/mock/MockSocket.sol @@ -0,0 +1,181 @@ +// SPDX-License-Identifier: GPL-3.0-only +pragma solidity ^0.8.21; + +import {PlugDisconnected, InvalidAppGateway} from "../protocol/utils/common/Errors.sol"; +import "../interfaces/ISwitchboard.sol"; +import "../interfaces/ISocket.sol"; + +/** + * @title SocketDst + * @dev SocketDst is an abstract contract that inherits from SocketUtils and + * provides functionality for payload execution, verification. + * It manages the mapping of payload execution status + * timestamps + * It also includes functions for payload execution and verification + */ +contract MockSocket is ISocket { + struct PlugConfig { + // address of the sibling plug on the remote chain + address appGateway; + // switchboard instance for the plug connection + ISwitchboard switchboard__; + } + + // plug => (appGateway, switchboard__) + mapping(address => PlugConfig) internal _plugConfigs; + + function getPlugConfig( + address plugAddress_ + ) external view returns (address appGateway, address switchboard__) { + PlugConfig memory _plugConfig = _plugConfigs[plugAddress_]; + return (_plugConfig.appGateway, address(_plugConfig.switchboard__)); + } + + function connect(address appGateway_, address switchboard_) external override {} + + function registerSwitchboard() external override {} + + //////////////////////////////////////////////////////// + ////////////////////// ERRORS ////////////////////////// + //////////////////////////////////////////////////////// + /** + * @dev Error emitted when proof is invalid + */ + + /** + * @dev Error emitted when a payload has already been executed + */ + error PayloadAlreadyExecuted(); + /** + * @dev Error emitted when the executor is not valid + */ + /** + * @dev Error emitted when verification fails + */ + error VerificationFailed(); + /** + * @dev Error emitted when source slugs deduced from packet id and msg id don't match + */ + /** + * @dev Error emitted when less gas limit is provided for execution than expected + */ + error LowGasLimit(); + error InvalidSlug(); + + //////////////////////////////////////////////////////////// + ////////////////////// State Vars ////////////////////////// + //////////////////////////////////////////////////////////// + uint64 public callCounter; + uint32 public chainSlug; + + enum ExecutionStatus { + NotExecuted, + Executed, + Reverted + } + + /** + * @dev keeps track of whether a payload has been executed or not using payload id + */ + mapping(bytes32 => ExecutionStatus) public payloadExecuted; + + constructor(uint32 chainSlug_, address, address, address, string memory) { + chainSlug = chainSlug_; + } + + //////////////////////////////////////////////////////// + ////////////////////// OPERATIONS ////////////////////////// + //////////////////////////////////////////////////////// + + /** + * @notice To send message to a connected remote chain. Should only be called by a plug. + * @param payload bytes to be delivered to the Plug on the siblingChainSlug_ + * @param params a 32 bytes param to add details for execution, for eg: fees to be paid for execution + */ + function callAppGateway( + bytes calldata payload, + bytes32 params + ) external returns (bytes32 callId) { + PlugConfig memory plugConfig = _plugConfigs[msg.sender]; + // creates a unique ID for the message + callId = _encodeCallId(plugConfig.appGateway); + emit AppGatewayCallRequested( + callId, + chainSlug, + msg.sender, + plugConfig.appGateway, + params, + payload + ); + } + + /** + * @notice Executes a payload that has been delivered by transmitters and authenticated by switchboards + */ + function execute( + address, + ExecuteParams memory params_, + bytes memory + ) external payable returns (bytes memory) { + // execute payload + return + _execute(params_.target, params_.payloadId, params_.executionGasLimit, params_.payload); + } + + //////////////////////////////////////////////////////// + ////////////////// INTERNAL FUNCS ////////////////////// + //////////////////////////////////////////////////////// + + function _verify( + bytes32 digest_, + bytes32 payloadId_, + ISwitchboard switchboard__ + ) internal view { + // NOTE: is the the first un-trusted call in the system, another one is Plug.call + if (!switchboard__.allowPacket(digest_, payloadId_)) revert VerificationFailed(); + } + + /** + * This function assumes localPlug_ will have code while executing. As the payload + * execution failure is not blocking the system, it is not necessary to check if + * code exists in the given address. + */ + function _execute( + address, + bytes32 payloadId_, + uint256, + bytes memory + ) internal returns (bytes memory) { + bytes memory returnData = hex"00010203"; + emit ExecutionSuccess(payloadId_, returnData); + return returnData; + } + + /** + * @dev Decodes the switchboard address from a given payload id. + * @param id_ The ID of the msg to decode the switchboard from. + * @return switchboard_ The address of switchboard decoded from the payload ID. + */ + function _decodeSwitchboard(bytes32 id_) internal pure returns (address switchboard_) { + switchboard_ = address(uint160(uint256(id_) >> 64)); + } + + /** + * @dev Decodes the chain ID from a given packet/payload ID. + * @param id_ The ID of the packet/msg to decode the chain slug from. + * @return chainSlug_ The chain slug decoded from the packet/payload ID. + */ + function _decodeChainSlug(bytes32 id_) internal pure returns (uint32 chainSlug_) { + chainSlug_ = uint32(uint256(id_) >> 224); + } + + // Packs the local plug, local chain slug, remote chain slug and nonce + // callCount++ will take care of call id overflow as well + // callId(256) = localChainSlug(32) | appGateway_(160) | nonce(64) + function _encodeCallId(address appGateway_) internal returns (bytes32) { + return + bytes32( + (uint256(chainSlug) << 224) | (uint256(uint160(appGateway_)) << 64) | callCounter++ + ); + } +} diff --git a/test/mock/MockWatcherPrecompile.sol b/test/mock/MockWatcherPrecompile.sol new file mode 100644 index 00000000..93f9b3c5 --- /dev/null +++ b/test/mock/MockWatcherPrecompile.sol @@ -0,0 +1,245 @@ +// SPDX-License-Identifier: Unlicense +pragma solidity ^0.8.21; + +import "../interfaces/IAppGateway.sol"; +import "../interfaces/IWatcherPrecompile.sol"; +import "../interfaces/IPromise.sol"; + +import {PayloadDigestParams, AsyncRequest, FinalizeParams, TimeoutRequest, CallFromChainParams, PlugConfig, ResolvedPromises, AppGatewayConfig} from "../protocol/utils/common/Structs.sol"; +import {QUERY, FINALIZE, SCHEDULE} from "../protocol/utils/common/Constants.sol"; +import {TimeoutDelayTooLarge, TimeoutAlreadyResolved, InvalidInboxCaller, ResolvingTimeoutTooEarly, CallFailed, AppGatewayAlreadyCalled} from "../protocol/utils/common/Errors.sol"; +import "solady/utils/ERC1967Factory.sol"; + +/// @title WatcherPrecompile +/// @notice Contract that handles payload verification, execution and app configurations +contract MockWatcherPrecompile { + uint256 public maxTimeoutDelayInSeconds = 24 * 60 * 60; // 24 hours + /// @notice Counter for tracking query requests + uint256 public queryCounter; + /// @notice Counter for tracking payload execution requests + uint256 public payloadCounter; + /// @notice Counter for tracking timeout requests + uint256 public timeoutCounter; + /// @notice Mapping to store async requests + /// @dev payloadId => AsyncRequest struct + mapping(bytes32 => AsyncRequest) public asyncRequests; + /// @notice Mapping to store timeout requests + /// @dev timeoutId => TimeoutRequest struct + mapping(bytes32 => TimeoutRequest) public timeoutRequests; + + mapping(uint32 => mapping(address => PlugConfig)) internal _plugConfigs; + + /// @notice Error thrown when an invalid chain slug is provided + error InvalidChainSlug(); + error InvalidTransmitter(); + + event CalledAppGateway( + bytes32 callId, + uint32 chainSlug, + address plug, + address appGateway, + bytes32 params, + bytes payload + ); + + /// @notice Emitted when a new query is requested + /// @param chainSlug The identifier of the destination chain + /// @param targetAddress The address of the target contract + /// @param payloadId The unique identifier for the query + /// @param payload The query data + event QueryRequested(uint32 chainSlug, address targetAddress, bytes32 payloadId, bytes payload); + + /// @notice Emitted when a finalize request is made + /// @param payloadId The unique identifier for the request + /// @param asyncRequest The async request details + event FinalizeRequested(bytes32 indexed payloadId, AsyncRequest asyncRequest); + + /// @notice Emitted when a request is finalized + /// @param payloadId The unique identifier for the request + /// @param asyncRequest The async request details + /// @param proof The proof from the watcher + event Finalized(bytes32 indexed payloadId, AsyncRequest asyncRequest, bytes proof); + + /// @notice Emitted when a promise is resolved + /// @param payloadId The unique identifier for the resolved promise + event PromiseResolved(bytes32 indexed payloadId); + + event TimeoutRequested( + bytes32 timeoutId, + address target, + bytes payload, + uint256 executeAt // Epoch time when the task should execute + ); + + /// @notice Emitted when a timeout is resolved + /// @param timeoutId The unique identifier for the timeout + /// @param target The target address for the timeout + /// @param payload The payload data + /// @param executedAt The epoch time when the task was executed + event TimeoutResolved(bytes32 timeoutId, address target, bytes payload, uint256 executedAt); + + /// @notice Contract constructor + /// @param _owner Address of the contract owner + constructor(address _owner, address addressResolver_) {} + + // ================== Timeout functions ================== + + /// @notice Sets a timeout for a payload execution on app gateway + /// @param payload_ The payload data + /// @param delayInSeconds_ The delay in seconds + function setTimeout(bytes calldata payload_, uint256 delayInSeconds_) external { + uint256 executeAt = block.timestamp + delayInSeconds_; + bytes32 timeoutId = _encodeTimeoutId(timeoutCounter++); + timeoutRequests[timeoutId] = TimeoutRequest( + timeoutId, + msg.sender, + delayInSeconds_, + executeAt, + 0, + false, + payload_ + ); + emit TimeoutRequested(timeoutId, msg.sender, payload_, executeAt); + } + + /// @notice Ends the timeouts and calls the target address with the callback payload + /// @param timeoutId The unique identifier for the timeout + /// @dev Only callable by the contract owner + function resolveTimeout(bytes32 timeoutId) external { + TimeoutRequest storage timeoutRequest = timeoutRequests[timeoutId]; + + (bool success, ) = address(timeoutRequest.target).call(timeoutRequest.payload); + if (!success) revert CallFailed(); + emit TimeoutResolved( + timeoutId, + timeoutRequest.target, + timeoutRequest.payload, + block.timestamp + ); + } + + // ================== Finalize functions ================== + + /// @notice Finalizes a payload request, requests the watcher to release the proofs to execute on chain + /// @param params_ The finalization parameters + /// @return payloadId The unique identifier for the finalized request + /// @return digest The digest of the payload parameters + function finalize( + FinalizeParams memory params_ + ) external returns (bytes32 payloadId, bytes32 digest) { + digest = keccak256(abi.encode(block.timestamp)); + // Generate a unique payload ID by combining chain, target, and counter + payloadId = encodePayloadId( + params_.payloadDetails.chainSlug, + params_.payloadDetails.target, + payloadCounter++ + ); + address[] memory next = new address[](1); + emit FinalizeRequested( + payloadId, + AsyncRequest( + msg.sender, + address(0), + address(0), + params_.payloadDetails.target, + address(0), + 0, + block.timestamp + 1000, + params_.asyncId, + bytes32(0), + bytes(""), + next + ) + ); + } + + // ================== Query functions ================== + /// @notice Creates a new query request + /// @param chainSlug The identifier of the destination chain + /// @param targetAddress The address of the target contract + /// @param payload The query payload data + /// @return payloadId The unique identifier for the query + function query( + uint32 chainSlug, + address targetAddress, + address[] memory, + bytes memory payload + ) public returns (bytes32 payloadId) { + payloadId = bytes32(queryCounter++); + emit QueryRequested(chainSlug, targetAddress, payloadId, payload); + } + + /// @notice Marks a request as finalized with a proof + /// @param payloadId_ The unique identifier of the request + /// @param proof_ The watcher's proof + /// @dev Only callable by the contract owner + function finalized(bytes32 payloadId_, bytes calldata proof_) external { + emit Finalized(payloadId_, asyncRequests[payloadId_], proof_); + } + + /// @notice Resolves multiple promises with their return data + /// @param resolvedPromises_ Array of resolved promises and their return data + /// @dev Only callable by the contract owner + function resolvePromises(ResolvedPromises[] calldata resolvedPromises_) external { + for (uint256 i = 0; i < resolvedPromises_.length; i++) { + emit PromiseResolved(resolvedPromises_[i].payloadId); + } + } + + // ================== On-Chain Inbox ================== + + function callAppGateways(CallFromChainParams[] calldata params_) external { + for (uint256 i = 0; i < params_.length; i++) { + emit CalledAppGateway( + params_[i].callId, + params_[i].chainSlug, + params_[i].plug, + params_[i].appGateway, + params_[i].params, + params_[i].payload + ); + } + } + + /// @notice Encodes a unique payload ID from chain slug, plug address, and counter + /// @param chainSlug_ The identifier of the chain + /// @param plug_ The plug address + /// @param counter_ The current counter value + /// @return The encoded payload ID as bytes32 + /// @dev Reverts if chainSlug is 0 + function encodePayloadId( + uint32 chainSlug_, + address plug_, + uint256 counter_ + ) internal view returns (bytes32) { + if (chainSlug_ == 0) revert InvalidChainSlug(); + (, address switchboard) = getPlugConfigs(chainSlug_, plug_); + // Encode payload ID by bit-shifting and combining: + // chainSlug (32 bits) | switchboard address (160 bits) | counter (64 bits) + + return + bytes32( + (uint256(chainSlug_) << 224) | (uint256(uint160(switchboard)) << 64) | counter_ + ); + } + + function _encodeTimeoutId(uint256 timeoutCounter_) internal view returns (bytes32) { + // watcher address (160 bits) | counter (64 bits) + return bytes32((uint256(uint160(address(this))) << 64) | timeoutCounter_); + } + + /// @notice Retrieves the configuration for a specific plug on a network + /// @param chainSlug_ The identifier of the network + /// @param plug_ The address of the plug + /// @return The app gateway address and switchboard address for the plug + /// @dev Returns zero addresses if configuration doesn't exist + function getPlugConfigs( + uint32 chainSlug_, + address plug_ + ) public view returns (address, address) { + return ( + _plugConfigs[chainSlug_][plug_].appGateway, + _plugConfigs[chainSlug_][plug_].switchboard + ); + } +} From e4211630445b0825fb10bce6d6853cd43774ba90 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Wed, 26 Feb 2025 14:29:29 +0400 Subject: [PATCH 147/186] feat: merge deploy and app gateway base --- contracts/base/AppDeployerBase.sol | 112 -------- contracts/base/AppGatewayBase.sol | 102 +++++++- contracts/interfaces/IAppDeployer.sol | 24 -- contracts/interfaces/IAppGateway.sol | 20 +- contracts/mock/MockSocket.sol | 181 ------------- contracts/mock/MockWatcherPrecompile.sol | 245 ------------------ .../protocol/payload-delivery/FeesManager.sol | 2 +- test/mock/MockSocket.sol | 6 +- test/mock/MockWatcherPrecompile.sol | 12 +- 9 files changed, 128 insertions(+), 576 deletions(-) delete mode 100644 contracts/base/AppDeployerBase.sol delete mode 100644 contracts/interfaces/IAppDeployer.sol delete mode 100644 contracts/mock/MockSocket.sol delete mode 100644 contracts/mock/MockWatcherPrecompile.sol diff --git a/contracts/base/AppDeployerBase.sol b/contracts/base/AppDeployerBase.sol deleted file mode 100644 index b6eff74f..00000000 --- a/contracts/base/AppDeployerBase.sol +++ /dev/null @@ -1,112 +0,0 @@ -// SPDX-License-Identifier: Unlicense -pragma solidity ^0.8.21; - -import {DeployParams, Fees, CallType, PayloadBatch} from "../protocol/utils/common/Structs.sol"; -import "./AppGatewayBase.sol"; -import {IForwarder} from "../interfaces/IForwarder.sol"; -import {IPromise} from "../interfaces/IPromise.sol"; -import {IAppDeployer} from "../interfaces/IAppDeployer.sol"; -import {IDeliveryHelper} from "../interfaces/IDeliveryHelper.sol"; - -/// @title AppDeployerBase -/// @notice Abstract contract for deploying applications -abstract contract AppDeployerBase is AppGatewayBase, IAppDeployer { - mapping(bytes32 => mapping(uint32 => address)) public override forwarderAddresses; - mapping(bytes32 => bytes) public creationCodeWithArgs; - - constructor( - address addressResolver_, - address auctionManager_, - bytes32 sbType_ - ) AppGatewayBase(addressResolver_, auctionManager_) { - sbType = sbType_; - } - - /// @notice Deploys a contract - /// @param contractId_ The contract ID - /// @param chainSlug_ The chain slug - function _deploy(bytes32 contractId_, uint32 chainSlug_, IsPlug isPlug_) internal { - _deploy(contractId_, chainSlug_, isPlug_, new bytes(0)); - } - - /// @notice Deploys a contract - /// @param contractId_ The contract ID - /// @param chainSlug_ The chain slug - function _deploy( - bytes32 contractId_, - uint32 chainSlug_, - IsPlug isPlug_, - bytes memory initCallData_ - ) internal { - address asyncPromise = addressResolver__.deployAsyncPromiseContract(address(this)); - isValidPromise[asyncPromise] = true; - IPromise(asyncPromise).then(this.setAddress.selector, abi.encode(chainSlug_, contractId_)); - - onCompleteData = abi.encode(chainSlug_); - IDeliveryHelper(deliveryHelper()).queue( - isPlug_, - isParallelCall, - chainSlug_, - address(0), - asyncPromise, - 0, - CallType.DEPLOY, - creationCodeWithArgs[contractId_], - initCallData_ - ); - } - - /// @notice Sets the address for a deployed contract - /// @param data_ The data - /// @param returnData_ The return data - function setAddress(bytes memory data_, bytes memory returnData_) external onlyPromises { - (uint32 chainSlug, bytes32 contractId) = abi.decode(data_, (uint32, bytes32)); - - address forwarderContractAddress = addressResolver__.getOrDeployForwarderContract( - address(this), - abi.decode(returnData_, (address)), - chainSlug - ); - - forwarderAddresses[contractId][chainSlug] = forwarderContractAddress; - } - - /// @notice Gets the on-chain address - /// @param contractId_ The contract ID - /// @param chainSlug_ The chain slug - /// @return onChainAddress The on-chain address - function getOnChainAddress( - bytes32 contractId_, - uint32 chainSlug_ - ) public view returns (address onChainAddress) { - if (forwarderAddresses[contractId_][chainSlug_] == address(0)) { - return address(0); - } - - onChainAddress = IForwarder(forwarderAddresses[contractId_][chainSlug_]) - .getOnChainAddress(); - } - - /// @notice Callback in pd promise to be called after all contracts are deployed - /// @param payloadBatch_ The payload batch - /// @dev only payload delivery can call this - /// @dev callback in pd promise to be called after all contracts are deployed - function onBatchComplete( - bytes32, - PayloadBatch memory payloadBatch_ - ) external override onlyDeliveryHelper { - uint32 chainSlug = abi.decode(payloadBatch_.onCompleteData, (uint32)); - initialize(chainSlug); - } - - /// @notice Gets the socket address - /// @param chainSlug_ The chain slug - /// @return socketAddress_ The socket address - function getSocketAddress(uint32 chainSlug_) public view returns (address) { - return watcherPrecompile__().sockets(chainSlug_); - } - - /// @notice Initializes the contract - /// @param chainSlug_ The chain slug - function initialize(uint32 chainSlug_) public virtual {} -} diff --git a/contracts/base/AppGatewayBase.sol b/contracts/base/AppGatewayBase.sol index f0aa6d2a..559e8c29 100644 --- a/contracts/base/AppGatewayBase.sol +++ b/contracts/base/AppGatewayBase.sol @@ -2,10 +2,11 @@ pragma solidity ^0.8.3; import "../protocol/utils/AddressResolverUtil.sol"; -import "../interfaces/IDeliveryHelper.sol"; import "../interfaces/IAppGateway.sol"; +import "../interfaces/IForwarder.sol"; +import "../interfaces/IDeliveryHelper.sol"; import "../interfaces/IPromise.sol"; -import {Fees, Read, Parallel} from "../protocol/utils/common/Structs.sol"; + import {FeesPlugin} from "../protocol/utils/FeesPlugin.sol"; import {InvalidPromise, FeesNotSet} from "../protocol/utils/common/Errors.sol"; @@ -23,6 +24,8 @@ abstract contract AppGatewayBase is AddressResolverUtil, IAppGateway, FeesPlugin bool public isAsyncModifierSet; mapping(address => bool) public isValidPromise; + mapping(bytes32 => mapping(uint32 => address)) public override forwarderAddresses; + mapping(bytes32 => bytes) public creationCodeWithArgs; /// @notice Modifier to treat functions async modifier async() { @@ -47,9 +50,10 @@ abstract contract AppGatewayBase is AddressResolverUtil, IAppGateway, FeesPlugin /// @notice Constructor for AppGatewayBase /// @param addressResolver_ The address resolver address - constructor(address addressResolver_, address auctionManager_) { + constructor(address addressResolver_, address auctionManager_, bytes32 sbType_) { _setAddressResolver(addressResolver_); auctionManager = auctionManager_; + sbType = sbType_; } /// @notice Creates a contract ID @@ -79,6 +83,94 @@ abstract contract AppGatewayBase is AddressResolverUtil, IAppGateway, FeesPlugin } } + /// @notice Gets the socket address + /// @param chainSlug_ The chain slug + /// @return socketAddress_ The socket address + function getSocketAddress(uint32 chainSlug_) public view returns (address) { + return watcherPrecompile__().sockets(chainSlug_); + } + + //////////////////////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////// DEPLOY HELPERS /////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////////////////// + + /// @notice Deploys a contract + /// @param contractId_ The contract ID + /// @param chainSlug_ The chain slug + function _deploy(bytes32 contractId_, uint32 chainSlug_, IsPlug isPlug_) internal { + _deploy(contractId_, chainSlug_, isPlug_, new bytes(0)); + } + + /// @notice Deploys a contract + /// @param contractId_ The contract ID + /// @param chainSlug_ The chain slug + function _deploy( + bytes32 contractId_, + uint32 chainSlug_, + IsPlug isPlug_, + bytes memory initCallData_ + ) internal { + address asyncPromise = addressResolver__.deployAsyncPromiseContract(address(this)); + isValidPromise[asyncPromise] = true; + IPromise(asyncPromise).then(this.setAddress.selector, abi.encode(chainSlug_, contractId_)); + + onCompleteData = abi.encode(chainSlug_); + IDeliveryHelper(deliveryHelper()).queue( + isPlug_, + isParallelCall, + chainSlug_, + address(0), + asyncPromise, + 0, + CallType.DEPLOY, + creationCodeWithArgs[contractId_], + initCallData_ + ); + } + + /// @notice Sets the address for a deployed contract + /// @param data_ The data + /// @param returnData_ The return data + function setAddress(bytes memory data_, bytes memory returnData_) external onlyPromises { + (uint32 chainSlug, bytes32 contractId) = abi.decode(data_, (uint32, bytes32)); + + address forwarderContractAddress = addressResolver__.getOrDeployForwarderContract( + address(this), + abi.decode(returnData_, (address)), + chainSlug + ); + + forwarderAddresses[contractId][chainSlug] = forwarderContractAddress; + } + + /// @notice Gets the on-chain address + /// @param contractId_ The contract ID + /// @param chainSlug_ The chain slug + /// @return onChainAddress The on-chain address + function getOnChainAddress( + bytes32 contractId_, + uint32 chainSlug_ + ) public view returns (address onChainAddress) { + if (forwarderAddresses[contractId_][chainSlug_] == address(0)) { + return address(0); + } + + onChainAddress = IForwarder(forwarderAddresses[contractId_][chainSlug_]) + .getOnChainAddress(); + } + + /// @notice Callback in pd promise to be called after all contracts are deployed + /// @param payloadBatch_ The payload batch + /// @dev only payload delivery can call this + /// @dev callback in pd promise to be called after all contracts are deployed + function onBatchComplete( + bytes32, + PayloadBatch memory payloadBatch_ + ) external override onlyDeliveryHelper { + uint32 chainSlug = abi.decode(payloadBatch_.onCompleteData, (uint32)); + initialize(chainSlug); + } + //////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////// TX OVERRIDE HELPERS /////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////// @@ -191,6 +283,10 @@ abstract contract AppGatewayBase is AddressResolverUtil, IAppGateway, FeesPlugin bytes32 params_ ) external virtual onlyWatcherPrecompile {} + /// @notice Initializes the contract + /// @param chainSlug_ The chain slug + function initialize(uint32 chainSlug_) public virtual {} + /// @notice hook to handle the revert in callbacks or onchain executions /// @dev can be overridden by the app gateway to add custom logic /// @param asyncId_ The async ID diff --git a/contracts/interfaces/IAppDeployer.sol b/contracts/interfaces/IAppDeployer.sol deleted file mode 100644 index 14b6e8f4..00000000 --- a/contracts/interfaces/IAppDeployer.sol +++ /dev/null @@ -1,24 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.21; - -/// @title IAppDeployer -/// @notice Interface for the app deployer -interface IAppDeployer { - /// @notice initialize the contracts on chain - function initialize(uint32 chainSlug_) external; - - /// @notice deploy contracts to chain - function deployContracts(uint32 chainSlug_) external; - - /// @notice get the on-chain address of a contract - function getOnChainAddress( - bytes32 contractId_, - uint32 chainSlug_ - ) external view returns (address onChainAddress); - - /// @notice get the forwarder address of a contract - function forwarderAddresses( - bytes32 contractId_, - uint32 chainSlug_ - ) external view returns (address forwarderAddress); -} diff --git a/contracts/interfaces/IAppGateway.sol b/contracts/interfaces/IAppGateway.sol index 50d0123f..38e68fee 100644 --- a/contracts/interfaces/IAppGateway.sol +++ b/contracts/interfaces/IAppGateway.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: Unlicense pragma solidity ^0.8.21; -import {PayloadBatch, Read, Parallel} from "../protocol/utils/common/Structs.sol"; +import {Fees, Read, Parallel, DeployParams, CallType, PayloadBatch} from "../protocol/utils/common/Structs.sol"; interface IAppGateway { function isReadCall() external view returns (Read); @@ -22,4 +22,22 @@ interface IAppGateway { ) external; function handleRevert(bytes32 asyncId_, bytes32 payloadId_) external; + + /// @notice initialize the contracts on chain + function initialize(uint32 chainSlug_) external; + + /// @notice deploy contracts to chain + function deployContracts(uint32 chainSlug_) external; + + /// @notice get the on-chain address of a contract + function getOnChainAddress( + bytes32 contractId_, + uint32 chainSlug_ + ) external view returns (address onChainAddress); + + /// @notice get the forwarder address of a contract + function forwarderAddresses( + bytes32 contractId_, + uint32 chainSlug_ + ) external view returns (address forwarderAddress); } diff --git a/contracts/mock/MockSocket.sol b/contracts/mock/MockSocket.sol deleted file mode 100644 index d6a4c96e..00000000 --- a/contracts/mock/MockSocket.sol +++ /dev/null @@ -1,181 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0-only -pragma solidity ^0.8.21; - -import {PlugDisconnected, InvalidAppGateway} from "../protocol/utils/common/Errors.sol"; -import "../interfaces/ISwitchboard.sol"; -import "../interfaces/ISocket.sol"; - -/** - * @title SocketDst - * @dev SocketDst is an abstract contract that inherits from SocketUtils and - * provides functionality for payload execution, verification. - * It manages the mapping of payload execution status - * timestamps - * It also includes functions for payload execution and verification - */ -contract MockSocket is ISocket { - struct PlugConfig { - // address of the sibling plug on the remote chain - address appGateway; - // switchboard instance for the plug connection - ISwitchboard switchboard__; - } - - // plug => (appGateway, switchboard__) - mapping(address => PlugConfig) internal _plugConfigs; - - function getPlugConfig( - address plugAddress_ - ) external view returns (address appGateway, address switchboard__) { - PlugConfig memory _plugConfig = _plugConfigs[plugAddress_]; - return (_plugConfig.appGateway, address(_plugConfig.switchboard__)); - } - - function connect(address appGateway_, address switchboard_) external override {} - - function registerSwitchboard() external override {} - - //////////////////////////////////////////////////////// - ////////////////////// ERRORS ////////////////////////// - //////////////////////////////////////////////////////// - /** - * @dev Error emitted when proof is invalid - */ - - /** - * @dev Error emitted when a payload has already been executed - */ - error PayloadAlreadyExecuted(); - /** - * @dev Error emitted when the executor is not valid - */ - /** - * @dev Error emitted when verification fails - */ - error VerificationFailed(); - /** - * @dev Error emitted when source slugs deduced from packet id and msg id don't match - */ - /** - * @dev Error emitted when less gas limit is provided for execution than expected - */ - error LowGasLimit(); - error InvalidSlug(); - - //////////////////////////////////////////////////////////// - ////////////////////// State Vars ////////////////////////// - //////////////////////////////////////////////////////////// - uint64 public callCounter; - uint32 public chainSlug; - - enum ExecutionStatus { - NotExecuted, - Executed, - Reverted - } - - /** - * @dev keeps track of whether a payload has been executed or not using payload id - */ - mapping(bytes32 => ExecutionStatus) public payloadExecuted; - - constructor(uint32 chainSlug_, address, address, address, string memory) { - chainSlug = chainSlug_; - } - - //////////////////////////////////////////////////////// - ////////////////////// OPERATIONS ////////////////////////// - //////////////////////////////////////////////////////// - - /** - * @notice To send message to a connected remote chain. Should only be called by a plug. - * @param payload bytes to be delivered to the Plug on the siblingChainSlug_ - * @param params a 32 bytes param to add details for execution, for eg: fees to be paid for execution - */ - function callAppGateway( - bytes calldata payload, - bytes32 params - ) external returns (bytes32 callId) { - PlugConfig memory plugConfig = _plugConfigs[msg.sender]; - // creates a unique ID for the message - callId = _encodeCallId(plugConfig.appGateway); - emit AppGatewayCallRequested( - callId, - chainSlug, - msg.sender, - plugConfig.appGateway, - params, - payload - ); - } - - /** - * @notice Executes a payload that has been delivered by transmitters and authenticated by switchboards - */ - function execute( - address, - ExecuteParams memory params_, - bytes memory - ) external payable returns (bytes memory) { - // execute payload - return - _execute(params_.target, params_.payloadId, params_.executionGasLimit, params_.payload); - } - - //////////////////////////////////////////////////////// - ////////////////// INTERNAL FUNCS ////////////////////// - //////////////////////////////////////////////////////// - - function _verify( - bytes32 digest_, - bytes32 payloadId_, - ISwitchboard switchboard__ - ) internal view { - // NOTE: is the the first un-trusted call in the system, another one is Plug.call - if (!switchboard__.allowPacket(digest_, payloadId_)) revert VerificationFailed(); - } - - /** - * This function assumes localPlug_ will have code while executing. As the payload - * execution failure is not blocking the system, it is not necessary to check if - * code exists in the given address. - */ - function _execute( - address, - bytes32 payloadId_, - uint256, - bytes memory - ) internal returns (bytes memory) { - bytes memory returnData = hex"00010203"; - emit ExecutionSuccess(payloadId_, returnData); - return returnData; - } - - /** - * @dev Decodes the switchboard address from a given payload id. - * @param id_ The ID of the msg to decode the switchboard from. - * @return switchboard_ The address of switchboard decoded from the payload ID. - */ - function _decodeSwitchboard(bytes32 id_) internal pure returns (address switchboard_) { - switchboard_ = address(uint160(uint256(id_) >> 64)); - } - - /** - * @dev Decodes the chain ID from a given packet/payload ID. - * @param id_ The ID of the packet/msg to decode the chain slug from. - * @return chainSlug_ The chain slug decoded from the packet/payload ID. - */ - function _decodeChainSlug(bytes32 id_) internal pure returns (uint32 chainSlug_) { - chainSlug_ = uint32(uint256(id_) >> 224); - } - - // Packs the local plug, local chain slug, remote chain slug and nonce - // callCount++ will take care of call id overflow as well - // callId(256) = localChainSlug(32) | appGateway_(160) | nonce(64) - function _encodeCallId(address appGateway_) internal returns (bytes32) { - return - bytes32( - (uint256(chainSlug) << 224) | (uint256(uint160(appGateway_)) << 64) | callCounter++ - ); - } -} diff --git a/contracts/mock/MockWatcherPrecompile.sol b/contracts/mock/MockWatcherPrecompile.sol deleted file mode 100644 index 93f9b3c5..00000000 --- a/contracts/mock/MockWatcherPrecompile.sol +++ /dev/null @@ -1,245 +0,0 @@ -// SPDX-License-Identifier: Unlicense -pragma solidity ^0.8.21; - -import "../interfaces/IAppGateway.sol"; -import "../interfaces/IWatcherPrecompile.sol"; -import "../interfaces/IPromise.sol"; - -import {PayloadDigestParams, AsyncRequest, FinalizeParams, TimeoutRequest, CallFromChainParams, PlugConfig, ResolvedPromises, AppGatewayConfig} from "../protocol/utils/common/Structs.sol"; -import {QUERY, FINALIZE, SCHEDULE} from "../protocol/utils/common/Constants.sol"; -import {TimeoutDelayTooLarge, TimeoutAlreadyResolved, InvalidInboxCaller, ResolvingTimeoutTooEarly, CallFailed, AppGatewayAlreadyCalled} from "../protocol/utils/common/Errors.sol"; -import "solady/utils/ERC1967Factory.sol"; - -/// @title WatcherPrecompile -/// @notice Contract that handles payload verification, execution and app configurations -contract MockWatcherPrecompile { - uint256 public maxTimeoutDelayInSeconds = 24 * 60 * 60; // 24 hours - /// @notice Counter for tracking query requests - uint256 public queryCounter; - /// @notice Counter for tracking payload execution requests - uint256 public payloadCounter; - /// @notice Counter for tracking timeout requests - uint256 public timeoutCounter; - /// @notice Mapping to store async requests - /// @dev payloadId => AsyncRequest struct - mapping(bytes32 => AsyncRequest) public asyncRequests; - /// @notice Mapping to store timeout requests - /// @dev timeoutId => TimeoutRequest struct - mapping(bytes32 => TimeoutRequest) public timeoutRequests; - - mapping(uint32 => mapping(address => PlugConfig)) internal _plugConfigs; - - /// @notice Error thrown when an invalid chain slug is provided - error InvalidChainSlug(); - error InvalidTransmitter(); - - event CalledAppGateway( - bytes32 callId, - uint32 chainSlug, - address plug, - address appGateway, - bytes32 params, - bytes payload - ); - - /// @notice Emitted when a new query is requested - /// @param chainSlug The identifier of the destination chain - /// @param targetAddress The address of the target contract - /// @param payloadId The unique identifier for the query - /// @param payload The query data - event QueryRequested(uint32 chainSlug, address targetAddress, bytes32 payloadId, bytes payload); - - /// @notice Emitted when a finalize request is made - /// @param payloadId The unique identifier for the request - /// @param asyncRequest The async request details - event FinalizeRequested(bytes32 indexed payloadId, AsyncRequest asyncRequest); - - /// @notice Emitted when a request is finalized - /// @param payloadId The unique identifier for the request - /// @param asyncRequest The async request details - /// @param proof The proof from the watcher - event Finalized(bytes32 indexed payloadId, AsyncRequest asyncRequest, bytes proof); - - /// @notice Emitted when a promise is resolved - /// @param payloadId The unique identifier for the resolved promise - event PromiseResolved(bytes32 indexed payloadId); - - event TimeoutRequested( - bytes32 timeoutId, - address target, - bytes payload, - uint256 executeAt // Epoch time when the task should execute - ); - - /// @notice Emitted when a timeout is resolved - /// @param timeoutId The unique identifier for the timeout - /// @param target The target address for the timeout - /// @param payload The payload data - /// @param executedAt The epoch time when the task was executed - event TimeoutResolved(bytes32 timeoutId, address target, bytes payload, uint256 executedAt); - - /// @notice Contract constructor - /// @param _owner Address of the contract owner - constructor(address _owner, address addressResolver_) {} - - // ================== Timeout functions ================== - - /// @notice Sets a timeout for a payload execution on app gateway - /// @param payload_ The payload data - /// @param delayInSeconds_ The delay in seconds - function setTimeout(bytes calldata payload_, uint256 delayInSeconds_) external { - uint256 executeAt = block.timestamp + delayInSeconds_; - bytes32 timeoutId = _encodeTimeoutId(timeoutCounter++); - timeoutRequests[timeoutId] = TimeoutRequest( - timeoutId, - msg.sender, - delayInSeconds_, - executeAt, - 0, - false, - payload_ - ); - emit TimeoutRequested(timeoutId, msg.sender, payload_, executeAt); - } - - /// @notice Ends the timeouts and calls the target address with the callback payload - /// @param timeoutId The unique identifier for the timeout - /// @dev Only callable by the contract owner - function resolveTimeout(bytes32 timeoutId) external { - TimeoutRequest storage timeoutRequest = timeoutRequests[timeoutId]; - - (bool success, ) = address(timeoutRequest.target).call(timeoutRequest.payload); - if (!success) revert CallFailed(); - emit TimeoutResolved( - timeoutId, - timeoutRequest.target, - timeoutRequest.payload, - block.timestamp - ); - } - - // ================== Finalize functions ================== - - /// @notice Finalizes a payload request, requests the watcher to release the proofs to execute on chain - /// @param params_ The finalization parameters - /// @return payloadId The unique identifier for the finalized request - /// @return digest The digest of the payload parameters - function finalize( - FinalizeParams memory params_ - ) external returns (bytes32 payloadId, bytes32 digest) { - digest = keccak256(abi.encode(block.timestamp)); - // Generate a unique payload ID by combining chain, target, and counter - payloadId = encodePayloadId( - params_.payloadDetails.chainSlug, - params_.payloadDetails.target, - payloadCounter++ - ); - address[] memory next = new address[](1); - emit FinalizeRequested( - payloadId, - AsyncRequest( - msg.sender, - address(0), - address(0), - params_.payloadDetails.target, - address(0), - 0, - block.timestamp + 1000, - params_.asyncId, - bytes32(0), - bytes(""), - next - ) - ); - } - - // ================== Query functions ================== - /// @notice Creates a new query request - /// @param chainSlug The identifier of the destination chain - /// @param targetAddress The address of the target contract - /// @param payload The query payload data - /// @return payloadId The unique identifier for the query - function query( - uint32 chainSlug, - address targetAddress, - address[] memory, - bytes memory payload - ) public returns (bytes32 payloadId) { - payloadId = bytes32(queryCounter++); - emit QueryRequested(chainSlug, targetAddress, payloadId, payload); - } - - /// @notice Marks a request as finalized with a proof - /// @param payloadId_ The unique identifier of the request - /// @param proof_ The watcher's proof - /// @dev Only callable by the contract owner - function finalized(bytes32 payloadId_, bytes calldata proof_) external { - emit Finalized(payloadId_, asyncRequests[payloadId_], proof_); - } - - /// @notice Resolves multiple promises with their return data - /// @param resolvedPromises_ Array of resolved promises and their return data - /// @dev Only callable by the contract owner - function resolvePromises(ResolvedPromises[] calldata resolvedPromises_) external { - for (uint256 i = 0; i < resolvedPromises_.length; i++) { - emit PromiseResolved(resolvedPromises_[i].payloadId); - } - } - - // ================== On-Chain Inbox ================== - - function callAppGateways(CallFromChainParams[] calldata params_) external { - for (uint256 i = 0; i < params_.length; i++) { - emit CalledAppGateway( - params_[i].callId, - params_[i].chainSlug, - params_[i].plug, - params_[i].appGateway, - params_[i].params, - params_[i].payload - ); - } - } - - /// @notice Encodes a unique payload ID from chain slug, plug address, and counter - /// @param chainSlug_ The identifier of the chain - /// @param plug_ The plug address - /// @param counter_ The current counter value - /// @return The encoded payload ID as bytes32 - /// @dev Reverts if chainSlug is 0 - function encodePayloadId( - uint32 chainSlug_, - address plug_, - uint256 counter_ - ) internal view returns (bytes32) { - if (chainSlug_ == 0) revert InvalidChainSlug(); - (, address switchboard) = getPlugConfigs(chainSlug_, plug_); - // Encode payload ID by bit-shifting and combining: - // chainSlug (32 bits) | switchboard address (160 bits) | counter (64 bits) - - return - bytes32( - (uint256(chainSlug_) << 224) | (uint256(uint160(switchboard)) << 64) | counter_ - ); - } - - function _encodeTimeoutId(uint256 timeoutCounter_) internal view returns (bytes32) { - // watcher address (160 bits) | counter (64 bits) - return bytes32((uint256(uint160(address(this))) << 64) | timeoutCounter_); - } - - /// @notice Retrieves the configuration for a specific plug on a network - /// @param chainSlug_ The identifier of the network - /// @param plug_ The address of the plug - /// @return The app gateway address and switchboard address for the plug - /// @dev Returns zero addresses if configuration doesn't exist - function getPlugConfigs( - uint32 chainSlug_, - address plug_ - ) public view returns (address, address) { - return ( - _plugConfigs[chainSlug_][plug_].appGateway, - _plugConfigs[chainSlug_][plug_].switchboard - ); - } -} diff --git a/contracts/protocol/payload-delivery/FeesManager.sol b/contracts/protocol/payload-delivery/FeesManager.sol index 007e2e09..e90014e5 100644 --- a/contracts/protocol/payload-delivery/FeesManager.sol +++ b/contracts/protocol/payload-delivery/FeesManager.sol @@ -45,7 +45,7 @@ abstract contract FeesManagerStorage is IFeesManager { uint256[50] _gap_after; // slots 104-153 reserved for addr resolver util - } +} /// @title FeesManager /// @notice Contract for managing fees diff --git a/test/mock/MockSocket.sol b/test/mock/MockSocket.sol index d6a4c96e..98c87f09 100644 --- a/test/mock/MockSocket.sol +++ b/test/mock/MockSocket.sol @@ -1,9 +1,9 @@ // SPDX-License-Identifier: GPL-3.0-only pragma solidity ^0.8.21; -import {PlugDisconnected, InvalidAppGateway} from "../protocol/utils/common/Errors.sol"; -import "../interfaces/ISwitchboard.sol"; -import "../interfaces/ISocket.sol"; +import {PlugDisconnected, InvalidAppGateway} from "../../contracts/protocol/utils/common/Errors.sol"; +import "../../contracts/interfaces/ISwitchboard.sol"; +import "../../contracts/interfaces/ISocket.sol"; /** * @title SocketDst diff --git a/test/mock/MockWatcherPrecompile.sol b/test/mock/MockWatcherPrecompile.sol index 93f9b3c5..d1886b89 100644 --- a/test/mock/MockWatcherPrecompile.sol +++ b/test/mock/MockWatcherPrecompile.sol @@ -1,13 +1,13 @@ // SPDX-License-Identifier: Unlicense pragma solidity ^0.8.21; -import "../interfaces/IAppGateway.sol"; -import "../interfaces/IWatcherPrecompile.sol"; -import "../interfaces/IPromise.sol"; +import "../../contracts/interfaces/IAppGateway.sol"; +import "../../contracts/interfaces/IWatcherPrecompile.sol"; +import "../../contracts/interfaces/IPromise.sol"; -import {PayloadDigestParams, AsyncRequest, FinalizeParams, TimeoutRequest, CallFromChainParams, PlugConfig, ResolvedPromises, AppGatewayConfig} from "../protocol/utils/common/Structs.sol"; -import {QUERY, FINALIZE, SCHEDULE} from "../protocol/utils/common/Constants.sol"; -import {TimeoutDelayTooLarge, TimeoutAlreadyResolved, InvalidInboxCaller, ResolvingTimeoutTooEarly, CallFailed, AppGatewayAlreadyCalled} from "../protocol/utils/common/Errors.sol"; +import {PayloadDigestParams, AsyncRequest, FinalizeParams, TimeoutRequest, CallFromChainParams, PlugConfig, ResolvedPromises, AppGatewayConfig} from "../../contracts/protocol/utils/common/Structs.sol"; +import {QUERY, FINALIZE, SCHEDULE} from "../../contracts/protocol/utils/common/Constants.sol"; +import {TimeoutDelayTooLarge, TimeoutAlreadyResolved, InvalidInboxCaller, ResolvingTimeoutTooEarly, CallFailed, AppGatewayAlreadyCalled} from "../../contracts/protocol/utils/common/Errors.sol"; import "solady/utils/ERC1967Factory.sol"; /// @title WatcherPrecompile From 8d93d3313c414b91c1cf403da6065554af9f57d9 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Wed, 26 Feb 2025 17:05:31 +0400 Subject: [PATCH 148/186] fix: apps and scripts --- .env.sample | 1 - contracts/apps/counter-inbox/CounterInbox.sol | 11 --- .../counter-inbox/CounterInboxAppGateway.sol | 29 ------- contracts/apps/counter/Counter.sol | 4 + contracts/apps/counter/CounterAppGateway.sol | 79 ++++++++++++++++++- contracts/apps/counter/CounterDeployer.sol | 33 -------- contracts/apps/cron/CronAppGateway.sol | 30 ------- .../ParallelCounterAppGateway.sol | 45 ----------- .../ParallelCounterDeployer.sol | 43 ---------- .../SuperTokenLockableAppGateway.sol | 61 ++++++++++++-- .../SuperTokenLockableDeployer.sol | 68 ---------------- .../apps/super-token/SuperTokenAppGateway.sol | 43 ++++++++-- .../apps/super-token/SuperTokenDeployer.sol | 50 ------------ contracts/base/AppGatewayBase.sol | 34 ++++---- contracts/interfaces/IAddressResolver.sol | 2 +- .../interfaces/IMultiChainAppDeployer.sol | 4 +- contracts/protocol/AddressResolver.sol | 8 +- .../counter-inbox/CheckGatewayCounter.s.sol | 10 +-- .../DeployCounterAndGateway.s.sol | 49 ------------ script/counter-inbox/Increment.s.sol | 6 +- script/counter/IncrementCountersFromApp.s.sol | 14 ++-- script/counter/ReadOnchainCounters.s.sol | 14 ++-- script/counter/deployEVMxCounterApp.s.sol | 8 +- script/counter/deployOnchainCounters.s.sol | 14 ++-- script/cron/DeployGateway.s.sol | 37 --------- script/cron/SetTimeout.s.sol | 4 +- script/mock/DeployEVMx.s.sol | 4 +- script/mock/DeploySocket.s.sol | 5 +- script/mock/FinalizeAndExecution.s.sol | 5 +- script/mock/Inbox.s.sol | 4 +- script/mock/Query.s.sol | 2 +- script/mock/Timeout.s.sol | 2 +- script/parallel-counter/checkCounters.s.sol | 54 ++++++------- script/parallel-counter/deployOnEVMx.s.sol | 46 ----------- script/parallel-counter/deployOnchain.s.sol | 9 +-- .../parallel-counter/incrementCounters.s.sol | 23 +++--- script/super-token-lockable/Bridge.s.sol | 32 ++++---- .../DeployContracts.s.sol | 9 +-- .../super-token-lockable/DeployGateway.s.sol | 22 ++---- script/super-token/DeployContracts.s.sol | 3 +- script/super-token/DeployGateway.s.sol | 26 ++---- test/DeliveryHelper.t.sol | 28 +++---- test/apps/ParallelCounter.t.sol | 6 +- testScript.sh | 8 +- 44 files changed, 329 insertions(+), 660 deletions(-) delete mode 100644 contracts/apps/counter-inbox/CounterInbox.sol delete mode 100644 contracts/apps/counter-inbox/CounterInboxAppGateway.sol delete mode 100644 contracts/apps/counter/CounterDeployer.sol delete mode 100644 contracts/apps/cron/CronAppGateway.sol delete mode 100644 contracts/apps/parallel-counter/ParallelCounterAppGateway.sol delete mode 100644 contracts/apps/parallel-counter/ParallelCounterDeployer.sol delete mode 100644 contracts/apps/super-token-lockable/SuperTokenLockableDeployer.sol delete mode 100644 contracts/apps/super-token/SuperTokenDeployer.sol delete mode 100644 script/counter-inbox/DeployCounterAndGateway.s.sol delete mode 100644 script/cron/DeployGateway.s.sol delete mode 100644 script/parallel-counter/deployOnEVMx.s.sol diff --git a/.env.sample b/.env.sample index de7767c6..607b51c5 100644 --- a/.env.sample +++ b/.env.sample @@ -17,7 +17,6 @@ FEES_MANAGER="0x80bEc58A00993dc874Ab2fAe56621af24eF06bA5" PRIVATE_KEY="0x" # Set app related values after deployment on EVMx -DEPLOYER="0x" APP_GATEWAY="0x" # FOR INFRASTRUCTURE DEPLOYMENT ONLY diff --git a/contracts/apps/counter-inbox/CounterInbox.sol b/contracts/apps/counter-inbox/CounterInbox.sol deleted file mode 100644 index df86efb7..00000000 --- a/contracts/apps/counter-inbox/CounterInbox.sol +++ /dev/null @@ -1,11 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0 -pragma solidity >=0.7.0 <0.9.0; - -import "solady/auth/Ownable.sol"; -import "../../base/PlugBase.sol"; - -contract CounterInbox is Ownable, PlugBase { - function increaseOnGateway(uint256 value_) external returns (bytes32) { - return _callAppGateway(abi.encode(value_), bytes32(0)); - } -} diff --git a/contracts/apps/counter-inbox/CounterInboxAppGateway.sol b/contracts/apps/counter-inbox/CounterInboxAppGateway.sol deleted file mode 100644 index 23c6a03c..00000000 --- a/contracts/apps/counter-inbox/CounterInboxAppGateway.sol +++ /dev/null @@ -1,29 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0 -pragma solidity >=0.7.0 <0.9.0; - -import "../../base/AppGatewayBase.sol"; - -contract CounterInboxAppGateway is AppGatewayBase { - uint256 public counter; - - constructor( - address addressResolver_, - address auctionManager_, - address counterInbox_, - uint32 chainSlug_, - Fees memory fees_ - ) AppGatewayBase(addressResolver_, auctionManager_) { - watcherPrecompile__().setIsValidPlug(chainSlug_, address(counterInbox_), true); - _setOverrides(fees_); - } - - function callFromChain( - uint32, - address, - bytes calldata payload_, - bytes32 - ) external override onlyWatcherPrecompile { - uint256 value = abi.decode(payload_, (uint256)); - counter += value; - } -} diff --git a/contracts/apps/counter/Counter.sol b/contracts/apps/counter/Counter.sol index 44054091..f2502c33 100644 --- a/contracts/apps/counter/Counter.sol +++ b/contracts/apps/counter/Counter.sol @@ -14,4 +14,8 @@ contract Counter is Ownable, PlugBase { function getCounter() external view returns (uint256) { return counter; } + + function increaseOnGateway(uint256 value_) external returns (bytes32) { + return _callAppGateway(abi.encode(value_), bytes32(0)); + } } diff --git a/contracts/apps/counter/CounterAppGateway.sol b/contracts/apps/counter/CounterAppGateway.sol index dc6943cb..0d36d319 100644 --- a/contracts/apps/counter/CounterAppGateway.sol +++ b/contracts/apps/counter/CounterAppGateway.sol @@ -7,18 +7,51 @@ import "./ICounter.sol"; import "../../interfaces/IForwarder.sol"; import "../../interfaces/IPromise.sol"; -contract CounterAppGateway is AppGatewayBase { +contract CounterAppGateway is AppGatewayBase, Ownable { + bytes32 public counter = _createContractId("counter"); + bytes32 public counter1 = _createContractId("counter1"); + + uint256 public counterVal; + uint256 arbCounter; uint256 optCounter; + event TimeoutResolved(uint256 creationTimestamp, uint256 executionTimestamp); constructor( address addressResolver_, - address deployerContract_, address auctionManager_, + bytes32 sbType_, Fees memory fees_ - ) AppGatewayBase(addressResolver_, auctionManager_) { - addressResolver__.setContractsToGateways(deployerContract_); + ) AppGatewayBase(addressResolver_, auctionManager_, sbType_) { + creationCodeWithArgs[counter] = abi.encodePacked(type(Counter).creationCode); + creationCodeWithArgs[counter1] = abi.encodePacked(type(Counter).creationCode); _setOverrides(fees_); + _initializeOwner(msg.sender); + } + + // deploy contracts + function deployContracts(uint32 chainSlug_) external async { + _deploy(counter, chainSlug_, IsPlug.YES); + } + + function deployParallelContracts(uint32 chainSlug_) external async { + _setOverrides(Parallel.ON); + _deploy(counter, chainSlug_, IsPlug.YES); + _deploy(counter1, chainSlug_, IsPlug.YES); + _setOverrides(Parallel.OFF); + } + + function deployMultiChainContracts(uint32[] memory chainSlugs_) external async { + _setOverrides(Parallel.ON); + for (uint32 i = 0; i < chainSlugs_.length; i++) { + _deploy(counter, chainSlugs_[i], IsPlug.YES); + _deploy(counter1, chainSlugs_[i], IsPlug.YES); + } + _setOverrides(Parallel.OFF); + } + + function initialize(uint32) public pure override { + return; } function incrementCounters(address[] memory instances_) public async { @@ -29,6 +62,14 @@ contract CounterAppGateway is AppGatewayBase { } } + // for testing purposes + function incrementCountersWithoutAsync(address[] memory instances_) public { + // the increase function is called on given list of instances + for (uint256 i = 0; i < instances_.length; i++) { + Counter(instances_[i]).increase(); + } + } + function readCounters(address[] memory instances_) public async { // the increase function is called on given list of instances _setOverrides(Read.ON, Parallel.ON); @@ -51,6 +92,36 @@ contract CounterAppGateway is AppGatewayBase { } } + // INBOX + function setIsValidPlug(uint32 chainSlug_, address plug_) public { + watcherPrecompile__().setIsValidPlug(chainSlug_, plug_, true); + } + + function callFromChain( + uint32, + address, + bytes calldata payload_, + bytes32 + ) external override onlyWatcherPrecompile { + uint256 value = abi.decode(payload_, (uint256)); + counterVal += value; + } + + // TIMEOUT + function setTimeout(uint256 delayInSeconds_) public { + bytes memory payload = abi.encodeWithSelector( + this.resolveTimeout.selector, + block.timestamp + ); + watcherPrecompile__().setTimeout(address(this), payload, delayInSeconds_); + } + + function resolveTimeout(uint256 creationTimestamp_) external onlyWatcherPrecompile { + emit TimeoutResolved(creationTimestamp_, block.timestamp); + } + + // UTILS + function setFees(Fees memory fees_) public { fees = fees_; } diff --git a/contracts/apps/counter/CounterDeployer.sol b/contracts/apps/counter/CounterDeployer.sol deleted file mode 100644 index 8ae8c2f3..00000000 --- a/contracts/apps/counter/CounterDeployer.sol +++ /dev/null @@ -1,33 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0 -pragma solidity >=0.7.0 <0.9.0; - -import "./Counter.sol"; -import "../../base/AppDeployerBase.sol"; -import "solady/auth/Ownable.sol"; - -contract CounterDeployer is AppDeployerBase, Ownable { - bytes32 public counter = _createContractId("counter"); - - constructor( - address addressResolver_, - address auctionManager_, - bytes32 sbType_, - Fees memory fees_ - ) AppDeployerBase(addressResolver_, auctionManager_, sbType_) { - creationCodeWithArgs[counter] = abi.encodePacked(type(Counter).creationCode); - _setOverrides(fees_); - _initializeOwner(msg.sender); - } - - function deployContracts(uint32 chainSlug_) external async { - _deploy(counter, chainSlug_, IsPlug.YES); - } - - function initialize(uint32) public pure override { - return; - } - - function setFees(Fees memory fees_) public { - fees = fees_; - } -} diff --git a/contracts/apps/cron/CronAppGateway.sol b/contracts/apps/cron/CronAppGateway.sol deleted file mode 100644 index 9b50abf5..00000000 --- a/contracts/apps/cron/CronAppGateway.sol +++ /dev/null @@ -1,30 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0 -pragma solidity >=0.7.0 <0.9.0; - -import "../../base/AppGatewayBase.sol"; - -contract CronAppGateway is AppGatewayBase { - event TimeoutResolved(uint256 creationTimestamp, uint256 executionTimestamp); - - constructor( - address addressResolver_, - address deployerContract_, - address auctionManager_, - Fees memory fees_ - ) AppGatewayBase(addressResolver_, auctionManager_) { - addressResolver__.setContractsToGateways(deployerContract_); - _setOverrides(fees_); - } - - function setTimeout(uint256 delayInSeconds_) public { - bytes memory payload = abi.encodeWithSelector( - this.resolveTimeout.selector, - block.timestamp - ); - watcherPrecompile__().setTimeout(address(this), payload, delayInSeconds_); - } - - function resolveTimeout(uint256 creationTimestamp_) external onlyWatcherPrecompile { - emit TimeoutResolved(creationTimestamp_, block.timestamp); - } -} diff --git a/contracts/apps/parallel-counter/ParallelCounterAppGateway.sol b/contracts/apps/parallel-counter/ParallelCounterAppGateway.sol deleted file mode 100644 index 32abf96b..00000000 --- a/contracts/apps/parallel-counter/ParallelCounterAppGateway.sol +++ /dev/null @@ -1,45 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0 -pragma solidity >=0.7.0 <0.9.0; - -import "../../base/AppGatewayBase.sol"; -import "../counter/Counter.sol"; - -contract ParallelCounterAppGateway is AppGatewayBase { - constructor( - address addressResolver_, - address deployerContract_, - address auctionManager_, - Fees memory fees_ - ) AppGatewayBase(addressResolver_, auctionManager_) { - addressResolver__.setContractsToGateways(deployerContract_); - _setOverrides(Read.OFF, Parallel.OFF, 1000000, fees_); - } - - function incrementCounters(address[] memory instances_) public async { - // the increase function is called on given list of instances - // this - for (uint256 i = 0; i < instances_.length; i++) { - Counter(instances_[i]).increase(); - } - } - - function incrementCountersWithoutAsync(address[] memory instances_) public { - // the increase function is called on given list of instances - for (uint256 i = 0; i < instances_.length; i++) { - Counter(instances_[i]).increase(); - } - } - - function setFees(Fees memory fees_) public { - fees = fees_; - } - - function withdrawFeeTokens( - uint32 chainSlug_, - address token_, - uint256 amount_, - address receiver_ - ) external { - _withdrawFeeTokens(chainSlug_, token_, amount_, receiver_); - } -} diff --git a/contracts/apps/parallel-counter/ParallelCounterDeployer.sol b/contracts/apps/parallel-counter/ParallelCounterDeployer.sol deleted file mode 100644 index 7c4e27c5..00000000 --- a/contracts/apps/parallel-counter/ParallelCounterDeployer.sol +++ /dev/null @@ -1,43 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0 -pragma solidity >=0.7.0 <0.9.0; - -import "solady/auth/Ownable.sol"; -import "../counter/Counter.sol"; -import "../../base/AppDeployerBase.sol"; - -contract ParallelCounterDeployer is AppDeployerBase, Ownable { - bytes32 public counter1 = _createContractId("counter1"); - bytes32 public counter2 = _createContractId("counter2"); - - constructor( - address addressResolver_, - address auctionManager_, - bytes32 sbType_, - Fees memory fees_ - ) AppDeployerBase(addressResolver_, auctionManager_, sbType_) { - creationCodeWithArgs[counter1] = abi.encodePacked(type(Counter).creationCode); - creationCodeWithArgs[counter2] = abi.encodePacked(type(Counter).creationCode); - _setOverrides(Read.OFF, Parallel.ON, 1000000, fees_); - _initializeOwner(msg.sender); - } - - function deployContracts(uint32 chainSlug_) external async { - _deploy(counter1, chainSlug_, IsPlug.YES); - _deploy(counter2, chainSlug_, IsPlug.YES); - } - - function deployMultiChainContracts(uint32[] memory chainSlugs_) external async { - for (uint32 i = 0; i < chainSlugs_.length; i++) { - _deploy(counter1, chainSlugs_[i], IsPlug.YES); - _deploy(counter2, chainSlugs_[i], IsPlug.YES); - } - } - - function initialize(uint32) public pure override { - return; - } - - function setFees(Fees memory fees_) public { - fees = fees_; - } -} diff --git a/contracts/apps/super-token-lockable/SuperTokenLockableAppGateway.sol b/contracts/apps/super-token-lockable/SuperTokenLockableAppGateway.sol index 92a96e06..56336bef 100644 --- a/contracts/apps/super-token-lockable/SuperTokenLockableAppGateway.sol +++ b/contracts/apps/super-token-lockable/SuperTokenLockableAppGateway.sol @@ -1,12 +1,15 @@ // SPDX-License-Identifier: Unlicense pragma solidity ^0.8.21; -import "../../base/AppGatewayBase.sol"; -import {ISuperToken} from "../../interfaces/ISuperToken.sol"; import "solady/auth/Ownable.sol"; +import {ISuperToken} from "../../interfaces/ISuperToken.sol"; +import "../../base/AppGatewayBase.sol"; +import "./SuperTokenLockable.sol"; +import "./LimitHook.sol"; contract SuperTokenLockableAppGateway is AppGatewayBase, Ownable { - uint256 public idCounter; + bytes32 public superTokenLockable = _createContractId("superTokenLockable"); + bytes32 public limitHook = _createContractId("limitHook"); event Bridged(bytes32 asyncId); @@ -18,17 +21,61 @@ contract SuperTokenLockableAppGateway is AppGatewayBase, Ownable { uint256 deadline; } + struct ConstructorParams { + uint256 _burnLimit; + uint256 _mintLimit; + string name_; + string symbol_; + uint8 decimals_; + address initialSupplyHolder_; + uint256 initialSupply_; + } + constructor( address addressResolver_, - address deployerContract_, address auctionManager_, - Fees memory fees_ - ) AppGatewayBase(addressResolver_, auctionManager_) { - addressResolver__.setContractsToGateways(deployerContract_); + bytes32 sbType_, + Fees memory fees_, + ConstructorParams memory params + ) AppGatewayBase(addressResolver_, auctionManager_, sbType_) { + creationCodeWithArgs[superTokenLockable] = abi.encodePacked( + type(SuperTokenLockable).creationCode, + abi.encode( + params.name_, + params.symbol_, + params.decimals_, + params.initialSupplyHolder_, + params.initialSupply_ + ) + ); + + creationCodeWithArgs[limitHook] = abi.encodePacked( + type(LimitHook).creationCode, + abi.encode(params._burnLimit, params._mintLimit) + ); + _setOverrides(fees_); _initializeOwner(msg.sender); } + function deployContracts(uint32 chainSlug_) external async { + bytes memory initData = abi.encodeWithSelector( + SuperTokenLockable.setOwner.selector, + owner() + ); + _deploy(superTokenLockable, chainSlug_, IsPlug.YES, initData); + _deploy(limitHook, chainSlug_, IsPlug.YES, initData); + } + + // don't need to call this directly, will be called automatically after all contracts are deployed. + // check AppGatewayBase.onBatchComplete + function initialize(uint32 chainSlug_) public override async { + address limitHookContract = getOnChainAddress(limitHook, chainSlug_); + SuperTokenLockable(forwarderAddresses[superTokenLockable][chainSlug_]).setLimitHook( + limitHookContract + ); + } + function checkBalance(bytes memory data_, bytes memory returnData_) external onlyPromises { (UserOrder memory order, bytes32 asyncId) = abi.decode(data_, (UserOrder, bytes32)); diff --git a/contracts/apps/super-token-lockable/SuperTokenLockableDeployer.sol b/contracts/apps/super-token-lockable/SuperTokenLockableDeployer.sol deleted file mode 100644 index 1648d49b..00000000 --- a/contracts/apps/super-token-lockable/SuperTokenLockableDeployer.sol +++ /dev/null @@ -1,68 +0,0 @@ -// SPDX-License-Identifier: Unlicense -pragma solidity ^0.8.21; - -import "./SuperTokenLockable.sol"; -import "./LimitHook.sol"; -import "../../base/AppDeployerBase.sol"; -import "solady/auth/Ownable.sol"; - -contract SuperTokenLockableDeployer is AppDeployerBase, Ownable { - bytes32 public superTokenLockable = _createContractId("superTokenLockable"); - bytes32 public limitHook = _createContractId("limitHook"); - - struct ConstructorParams { - uint256 _burnLimit; - uint256 _mintLimit; - string name_; - string symbol_; - uint8 decimals_; - address initialSupplyHolder_; - uint256 initialSupply_; - } - - constructor( - address addressResolver_, - address owner_, - address auctionManager_, - bytes32 sbType_, - ConstructorParams memory params, - Fees memory fees_ - ) AppDeployerBase(addressResolver_, auctionManager_, sbType_) { - creationCodeWithArgs[superTokenLockable] = abi.encodePacked( - type(SuperTokenLockable).creationCode, - abi.encode( - params.name_, - params.symbol_, - params.decimals_, - params.initialSupplyHolder_, - params.initialSupply_ - ) - ); - - creationCodeWithArgs[limitHook] = abi.encodePacked( - type(LimitHook).creationCode, - abi.encode(params._burnLimit, params._mintLimit) - ); - - _setOverrides(fees_); - _initializeOwner(owner_); - } - - function deployContracts(uint32 chainSlug_) external async { - bytes memory initData = abi.encodeWithSelector( - SuperTokenLockable.setOwner.selector, - owner() - ); - _deploy(superTokenLockable, chainSlug_, IsPlug.YES, initData); - _deploy(limitHook, chainSlug_, IsPlug.YES, initData); - } - - // don't need to call this directly, will be called automatically after all contracts are deployed. - // check AppDeployerBase.allPayloadsExecuted and AppGateway.queueAndDeploy - function initialize(uint32 chainSlug_) public override async { - address limitHookContract = getOnChainAddress(limitHook, chainSlug_); - SuperTokenLockable(forwarderAddresses[superTokenLockable][chainSlug_]).setLimitHook( - limitHookContract - ); - } -} diff --git a/contracts/apps/super-token/SuperTokenAppGateway.sol b/contracts/apps/super-token/SuperTokenAppGateway.sol index 2527ab7e..308759b3 100644 --- a/contracts/apps/super-token/SuperTokenAppGateway.sol +++ b/contracts/apps/super-token/SuperTokenAppGateway.sol @@ -1,13 +1,24 @@ // SPDX-License-Identifier: Unlicense pragma solidity ^0.8.21; +import "solady/auth/Ownable.sol"; import "../../base/AppGatewayBase.sol"; import "../../interfaces/ISuperToken.sol"; -import "solady/auth/Ownable.sol"; +import "./SuperToken.sol"; contract SuperTokenAppGateway is AppGatewayBase, Ownable { + bytes32 public superToken = _createContractId("superToken"); + event Transferred(bytes32 asyncId); + struct ConstructorParams { + string name_; + string symbol_; + uint8 decimals_; + address initialSupplyHolder_; + uint256 initialSupply_; + } + struct TransferOrder { address srcToken; address dstToken; @@ -18,12 +29,21 @@ contract SuperTokenAppGateway is AppGatewayBase, Ownable { constructor( address addressResolver_, - address deployerContract_, + address auctionManager_, + bytes32 sbType_, Fees memory fees_, - address auctionManager_ - ) AppGatewayBase(addressResolver_, auctionManager_) { - // called to connect the deployer contract with this app - addressResolver__.setContractsToGateways(deployerContract_); + ConstructorParams memory params_ + ) AppGatewayBase(addressResolver_, auctionManager_, sbType_) { + creationCodeWithArgs[superToken] = abi.encodePacked( + type(SuperToken).creationCode, + abi.encode( + params_.name_, + params_.symbol_, + params_.decimals_, + params_.initialSupplyHolder_, + params_.initialSupply_ + ) + ); // sets the fees data like max fees, chain and token for all transfers // they can be updated for each transfer as well @@ -31,6 +51,17 @@ contract SuperTokenAppGateway is AppGatewayBase, Ownable { _initializeOwner(msg.sender); } + function deployContracts(uint32 chainSlug_) external async { + bytes memory initData = abi.encodeWithSelector(SuperToken.setOwner.selector, owner()); + _deploy(superToken, chainSlug_, IsPlug.YES, initData); + } + + // no need to call this directly, will be called automatically after all contracts are deployed. + // check AppGatewayBase._deploy and AppGatewayBase.onBatchComplete + function initialize(uint32) public pure override { + return; + } + function transfer(bytes memory order_) external async { TransferOrder memory order = abi.decode(order_, (TransferOrder)); ISuperToken(order.srcToken).burn(order.user, order.srcAmount); diff --git a/contracts/apps/super-token/SuperTokenDeployer.sol b/contracts/apps/super-token/SuperTokenDeployer.sol deleted file mode 100644 index 53e06964..00000000 --- a/contracts/apps/super-token/SuperTokenDeployer.sol +++ /dev/null @@ -1,50 +0,0 @@ -// SPDX-License-Identifier: Unlicense -pragma solidity ^0.8.21; - -import "./SuperToken.sol"; -import "../../base/AppDeployerBase.sol"; -import "solady/auth/Ownable.sol"; - -contract SuperTokenDeployer is AppDeployerBase, Ownable { - bytes32 public superToken = _createContractId("superToken"); - struct ConstructorParams { - string name_; - string symbol_; - uint8 decimals_; - address initialSupplyHolder_; - uint256 initialSupply_; - } - - constructor( - address addressResolver_, - address owner_, - address auctionManager_, - bytes32 sbType_, - ConstructorParams memory params_, - Fees memory fees_ - ) AppDeployerBase(addressResolver_, auctionManager_, sbType_) { - _initializeOwner(owner_); - creationCodeWithArgs[superToken] = abi.encodePacked( - type(SuperToken).creationCode, - abi.encode( - params_.name_, - params_.symbol_, - params_.decimals_, - params_.initialSupplyHolder_, - params_.initialSupply_ - ) - ); - _setOverrides(fees_); - } - - function deployContracts(uint32 chainSlug_) external async { - bytes memory initData = abi.encodeWithSelector(SuperToken.setOwner.selector, owner()); - _deploy(superToken, chainSlug_, IsPlug.YES, initData); - } - - // no need to call this directly, will be called automatically after all contracts are deployed. - // check AppDeployerBase._deploy and AppDeployerBase.onBatchComplete - function initialize(uint32) public pure override { - return; - } -} diff --git a/contracts/base/AppGatewayBase.sol b/contracts/base/AppGatewayBase.sol index 559e8c29..c8472cbd 100644 --- a/contracts/base/AppGatewayBase.sol +++ b/contracts/base/AppGatewayBase.sol @@ -114,7 +114,7 @@ abstract contract AppGatewayBase is AddressResolverUtil, IAppGateway, FeesPlugin isValidPromise[asyncPromise] = true; IPromise(asyncPromise).then(this.setAddress.selector, abi.encode(chainSlug_, contractId_)); - onCompleteData = abi.encode(chainSlug_); + onCompleteData = abi.encode(chainSlug_, true); IDeliveryHelper(deliveryHelper()).queue( isPlug_, isParallelCall, @@ -126,6 +126,8 @@ abstract contract AppGatewayBase is AddressResolverUtil, IAppGateway, FeesPlugin creationCodeWithArgs[contractId_], initCallData_ ); + + onCompleteData = abi.encode(chainSlug_, false); } /// @notice Sets the address for a deployed contract @@ -155,20 +157,7 @@ abstract contract AppGatewayBase is AddressResolverUtil, IAppGateway, FeesPlugin return address(0); } - onChainAddress = IForwarder(forwarderAddresses[contractId_][chainSlug_]) - .getOnChainAddress(); - } - - /// @notice Callback in pd promise to be called after all contracts are deployed - /// @param payloadBatch_ The payload batch - /// @dev only payload delivery can call this - /// @dev callback in pd promise to be called after all contracts are deployed - function onBatchComplete( - bytes32, - PayloadBatch memory payloadBatch_ - ) external override onlyDeliveryHelper { - uint32 chainSlug = abi.decode(payloadBatch_.onCompleteData, (uint32)); - initialize(chainSlug); + onChainAddress = IForwarder(forwarderAddresses[contractId_][chainSlug_]).getOnChainAddress(); } //////////////////////////////////////////////////////////////////////////////////////////////// @@ -269,12 +258,21 @@ abstract contract AppGatewayBase is AddressResolverUtil, IAppGateway, FeesPlugin //////////////////////////////////////////////////////////////////////////////////////////////// /// @notice Callback in pd promise to be called after all contracts are deployed - /// @param asyncId_ The async ID /// @param payloadBatch_ The payload batch + /// @dev only payload delivery can call this + /// @dev callback in pd promise to be called after all contracts are deployed function onBatchComplete( - bytes32 asyncId_, + bytes32, PayloadBatch memory payloadBatch_ - ) external virtual onlyDeliveryHelper {} + ) external override onlyDeliveryHelper { + (uint32 chainSlug, bool isDeploy) = abi.decode( + payloadBatch_.onCompleteData, + (uint32, bool) + ); + if (isDeploy) { + initialize(chainSlug); + } + } function callFromChain( uint32 chainSlug_, diff --git a/contracts/interfaces/IAddressResolver.sol b/contracts/interfaces/IAddressResolver.sol index 8d062286..be19aae4 100644 --- a/contracts/interfaces/IAddressResolver.sol +++ b/contracts/interfaces/IAddressResolver.sol @@ -66,7 +66,7 @@ interface IAddressResolver { /// @param chainSlug_ The identifier of the destination chain /// @return The address of the newly deployed forwarder contract function getOrDeployForwarderContract( - address appDeployer_, + address appGateway_, address chainContractAddress_, uint32 chainSlug_ ) external returns (address); diff --git a/contracts/interfaces/IMultiChainAppDeployer.sol b/contracts/interfaces/IMultiChainAppDeployer.sol index e36020c1..37bd04ad 100644 --- a/contracts/interfaces/IMultiChainAppDeployer.sol +++ b/contracts/interfaces/IMultiChainAppDeployer.sol @@ -1,11 +1,9 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.21; -import "./IAppDeployer.sol"; - /// @title IMultiChainAppDeployer /// @notice Interface for the multi-chain app deployer -interface IMultiChainAppDeployer is IAppDeployer { +interface IMultiChainAppDeployer { /// @notice deploy contracts to multiple chains function deployMultiChainContracts(uint32[] memory chainSlugs_) external; } diff --git a/contracts/protocol/AddressResolver.sol b/contracts/protocol/AddressResolver.sol index fe87dbe9..65775d7e 100644 --- a/contracts/protocol/AddressResolver.sol +++ b/contracts/protocol/AddressResolver.sol @@ -88,7 +88,7 @@ contract AddressResolver is AddressResolverStorage, Initializable, Ownable { /// @param chainSlug_ The chain slug /// @return newForwarder The address of the deployed Forwarder proxy contract function getOrDeployForwarderContract( - address appDeployer_, + address appGateway_, address chainContractAddress_, uint32 chainSlug_ ) public returns (address newForwarder) { @@ -105,7 +105,7 @@ contract AddressResolver is AddressResolverStorage, Initializable, Ownable { ); newForwarder = _deployProxy(salt, address(forwarderBeacon), initData); - _setConfig(appDeployer_, newForwarder); + _setConfig(appGateway_, newForwarder); emit ForwarderDeployed(newForwarder, salt); } @@ -222,8 +222,8 @@ contract AddressResolver is AddressResolverStorage, Initializable, Ownable { LibClone.predictDeterministicAddressERC1967BeaconProxy(beacon_, salt_, address(this)); } - function _setConfig(address appDeployer_, address newForwarder_) internal { - address gateway = contractsToGateways[appDeployer_]; + function _setConfig(address appGateway_, address newForwarder_) internal { + address gateway = contractsToGateways[appGateway_]; gatewaysToContracts[gateway] = newForwarder_; contractsToGateways[newForwarder_] = gateway; } diff --git a/script/counter-inbox/CheckGatewayCounter.s.sol b/script/counter-inbox/CheckGatewayCounter.s.sol index c9855b7d..563b61d7 100644 --- a/script/counter-inbox/CheckGatewayCounter.s.sol +++ b/script/counter-inbox/CheckGatewayCounter.s.sol @@ -3,7 +3,7 @@ pragma solidity ^0.8.0; import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/console.sol"; -import {CounterInboxAppGateway} from "../../contracts/apps/counter-inbox/CounterInboxAppGateway.sol"; +import {CounterAppGateway} from "../../contracts/apps/counter/CounterAppGateway.sol"; contract CheckGatewayCounter is Script { function run() external { @@ -11,11 +11,11 @@ contract CheckGatewayCounter is Script { vm.createSelectFork(rpc); address gatewayAddress = vm.envAddress("APP_GATEWAY"); - CounterInboxAppGateway gateway = CounterInboxAppGateway(gatewayAddress); + CounterAppGateway gateway = CounterAppGateway(gatewayAddress); - // Log the value of the counter variable on CounterInboxAppGateway - uint256 counterValue = gateway.counter(); - console.log("Counter value on CounterInboxAppGateway:"); + // Log the value of the counter variable on CounterAppGateway + uint256 counterValue = gateway.counterVal(); + console.log("Counter value on CounterAppGateway:"); console.log(counterValue); } } diff --git a/script/counter-inbox/DeployCounterAndGateway.s.sol b/script/counter-inbox/DeployCounterAndGateway.s.sol deleted file mode 100644 index 09341af4..00000000 --- a/script/counter-inbox/DeployCounterAndGateway.s.sol +++ /dev/null @@ -1,49 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Script} from "forge-std/Script.sol"; -import {console} from "forge-std/console.sol"; -import {CounterInbox} from "../../contracts/apps/counter-inbox/CounterInbox.sol"; -import {CounterInboxAppGateway} from "../../contracts/apps/counter-inbox/CounterInboxAppGateway.sol"; -import {Fees} from "../../contracts/protocol/utils/common/Structs.sol"; -import {ETH_ADDRESS} from "../../contracts/protocol/utils/common/Constants.sol"; - -contract DeployCounterAndGateway is Script { - function run() external { - address addressResolver = vm.envAddress("ADDRESS_RESOLVER"); - address auctionManager = vm.envAddress("AUCTION_MANAGER"); - - string memory arbRpc = vm.envString("ARBITRUM_SEPOLIA_RPC"); - vm.createSelectFork(arbRpc); - uint256 arbDeployerPrivateKey = vm.envUint("SPONSOR_KEY"); - vm.startBroadcast(arbDeployerPrivateKey); - - CounterInbox inbox = new CounterInbox(); - console.log("CounterInbox:", address(inbox)); - - vm.stopBroadcast(); - - string memory offChainRpc = vm.envString("EVMX_RPC"); - vm.createSelectFork(offChainRpc); - uint256 offChainDeployerPrivateKey = vm.envUint("PRIVATE_KEY"); - vm.startBroadcast(offChainDeployerPrivateKey); - - Fees memory fees = Fees({ - feePoolChain: 421614, - feePoolToken: ETH_ADDRESS, - amount: 0.001 ether - }); - - CounterInboxAppGateway gateway = new CounterInboxAppGateway( - addressResolver, - auctionManager, - address(inbox), - 421614, - fees - ); - - console.log("CounterInboxAppGateway:", address(gateway)); - - vm.stopBroadcast(); - } -} diff --git a/script/counter-inbox/Increment.s.sol b/script/counter-inbox/Increment.s.sol index 95477943..44fb7897 100644 --- a/script/counter-inbox/Increment.s.sol +++ b/script/counter-inbox/Increment.s.sol @@ -3,8 +3,8 @@ pragma solidity ^0.8.0; import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/console.sol"; -import {CounterInbox} from "../../contracts/apps/counter-inbox/CounterInbox.sol"; -import {CounterInboxAppGateway} from "../../contracts/apps/counter-inbox/CounterInboxAppGateway.sol"; +import {CounterAppGateway} from "../../contracts/apps/counter/CounterAppGateway.sol"; +import {Counter} from "../../contracts/apps/counter/Counter.sol"; import {Fees} from "../../contracts/protocol/utils/common/Structs.sol"; import {ETH_ADDRESS, FAST} from "../../contracts/protocol/utils/common/Constants.sol"; @@ -17,7 +17,7 @@ contract Increment is Script { vm.startBroadcast(arbDeployerPrivateKey); address counterInbox = vm.envAddress("COUNTER_INBOX"); - CounterInbox inbox = CounterInbox(counterInbox); + Counter inbox = Counter(counterInbox); inbox.increaseOnGateway(100); vm.stopBroadcast(); diff --git a/script/counter/IncrementCountersFromApp.s.sol b/script/counter/IncrementCountersFromApp.s.sol index 379cd9ef..10a0f727 100644 --- a/script/counter/IncrementCountersFromApp.s.sol +++ b/script/counter/IncrementCountersFromApp.s.sol @@ -3,7 +3,6 @@ pragma solidity ^0.8.0; import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/console.sol"; -import {CounterDeployer} from "../../contracts/apps//counter/CounterDeployer.sol"; import {CounterAppGateway} from "../../contracts/apps//counter/CounterAppGateway.sol"; contract IncrementCounters is Script { @@ -13,19 +12,18 @@ contract IncrementCounters is Script { vm.createSelectFork(socketRPC); - CounterDeployer deployer = CounterDeployer(vm.envAddress("DEPLOYER")); CounterAppGateway gateway = CounterAppGateway(vm.envAddress("APP_GATEWAY")); - address counterForwarderArbitrumSepolia = deployer.forwarderAddresses( - deployer.counter(), + address counterForwarderArbitrumSepolia = gateway.forwarderAddresses( + gateway.counter(), 421614 ); - address counterForwarderOptimismSepolia = deployer.forwarderAddresses( - deployer.counter(), + address counterForwarderOptimismSepolia = gateway.forwarderAddresses( + gateway.counter(), 11155420 ); - address counterForwarderBaseSepolia = deployer.forwarderAddresses( - deployer.counter(), + address counterForwarderBaseSepolia = gateway.forwarderAddresses( + gateway.counter(), 84532 ); //address counterForwarderSepolia = deployer.forwarderAddresses( diff --git a/script/counter/ReadOnchainCounters.s.sol b/script/counter/ReadOnchainCounters.s.sol index 56a91796..3770e927 100644 --- a/script/counter/ReadOnchainCounters.s.sol +++ b/script/counter/ReadOnchainCounters.s.sol @@ -3,23 +3,23 @@ pragma solidity ^0.8.0; import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/console.sol"; -import {CounterDeployer} from "../../contracts/apps/counter/CounterDeployer.sol"; import {Counter} from "../../contracts/apps//counter/Counter.sol"; +import {CounterAppGateway} from "../../contracts/apps//counter/CounterAppGateway.sol"; contract CheckCounters is Script { function run() external { - CounterDeployer deployer = CounterDeployer(vm.envAddress("DEPLOYER")); + CounterAppGateway gateway = CounterAppGateway(vm.envAddress("APP_GATEWAY")); vm.createSelectFork(vm.envString("EVMX_RPC")); - address counterInstanceArbitrumSepolia = deployer.getOnChainAddress( - deployer.counter(), + address counterInstanceArbitrumSepolia = gateway.getOnChainAddress( + gateway.counter(), 421614 ); - address counterInstanceOptimismSepolia = deployer.getOnChainAddress( - deployer.counter(), + address counterInstanceOptimismSepolia = gateway.getOnChainAddress( + gateway.counter(), 11155420 ); - address counterInstanceBaseSepolia = deployer.getOnChainAddress(deployer.counter(), 84532); + address counterInstanceBaseSepolia = gateway.getOnChainAddress(gateway.counter(), 84532); //address counterInstanceSepolia = deployer.getOnChainAddress( // deployer.counter(), // 11155111 diff --git a/script/counter/deployEVMxCounterApp.s.sol b/script/counter/deployEVMxCounterApp.s.sol index 97d4f68d..12868719 100644 --- a/script/counter/deployEVMxCounterApp.s.sol +++ b/script/counter/deployEVMxCounterApp.s.sol @@ -4,7 +4,6 @@ pragma solidity ^0.8.0; import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/console.sol"; import {CounterAppGateway} from "../../contracts/apps//counter/CounterAppGateway.sol"; -import {CounterDeployer} from "../../contracts/apps//counter/CounterDeployer.sol"; import {Fees} from "../../contracts/protocol/utils/common/Structs.sol"; import {ETH_ADDRESS, FAST} from "../../contracts/protocol/utils/common/Constants.sol"; @@ -25,19 +24,16 @@ contract CounterDeploy is Script { amount: 0.001 ether }); - CounterDeployer deployer = new CounterDeployer(addressResolver, auctionManager, FAST, fees); - CounterAppGateway gateway = new CounterAppGateway( addressResolver, - address(deployer), auctionManager, + FAST, fees ); console.log("Contracts deployed:"); - console.log("CounterDeployer:", address(deployer)); console.log("CounterAppGateway:", address(gateway)); console.log("counterId:"); - console.logBytes32(deployer.counter()); + console.logBytes32(gateway.counter()); } } diff --git a/script/counter/deployOnchainCounters.s.sol b/script/counter/deployOnchainCounters.s.sol index 2c67a1fe..123c6958 100644 --- a/script/counter/deployOnchainCounters.s.sol +++ b/script/counter/deployOnchainCounters.s.sol @@ -3,8 +3,8 @@ pragma solidity ^0.8.0; import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/console.sol"; -import {CounterDeployer} from "../../contracts/apps//counter/CounterDeployer.sol"; import {ETH_ADDRESS} from "../../contracts/protocol/utils/common/Constants.sol"; +import {CounterAppGateway} from "../../contracts/apps/counter/CounterAppGateway.sol"; contract CounterDeployOnchain is Script { function run() external { @@ -15,17 +15,17 @@ contract CounterDeployOnchain is Script { uint256 deployerPrivateKey = vm.envUint("PRIVATE_KEY"); vm.startBroadcast(deployerPrivateKey); - CounterDeployer deployer = CounterDeployer(vm.envAddress("DEPLOYER")); + CounterAppGateway appGateway = CounterAppGateway(vm.envAddress("APP_GATEWAY")); - console.log("Counter Deployer:", address(deployer)); + console.log("Counter Gateway:", address(appGateway)); console.log("Deploying contracts on Arbitrum Sepolia..."); - deployer.deployContracts(421614); + appGateway.deployContracts(421614); // console.log("Deploying contracts on Optimism Sepolia..."); - // deployer.deployContracts(11155420); + // appGateway.deployContracts(11155420); // console.log("Deploying contracts on Base Sepolia..."); - // deployer.deployContracts(84532); + // appGateway.deployContracts(84532); // console.log("Deploying contracts on Ethereum Sepolia..."); - // deployer.deployContracts(11155111); + // appGateway.deployContracts(11155111); } } diff --git a/script/cron/DeployGateway.s.sol b/script/cron/DeployGateway.s.sol deleted file mode 100644 index 32bd6eb1..00000000 --- a/script/cron/DeployGateway.s.sol +++ /dev/null @@ -1,37 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Script} from "forge-std/Script.sol"; -import {console} from "forge-std/console.sol"; -import {CronAppGateway} from "../../contracts/apps/cron/CronAppGateway.sol"; -import {Fees} from "../../contracts/protocol/utils/common/Structs.sol"; -import {ETH_ADDRESS} from "../../contracts/protocol/utils/common/Constants.sol"; - -contract DeployGateway is Script { - function run() external { - address addressResolver = vm.envAddress("ADDRESS_RESOLVER"); - address auctionManager = vm.envAddress("AUCTION_MANAGER"); - - string memory rpc = vm.envString("EVMX_RPC"); - vm.createSelectFork(rpc); - - uint256 deployerPrivateKey = vm.envUint("PRIVATE_KEY"); - vm.startBroadcast(deployerPrivateKey); - - // Setting fee payment on Arbitrum Sepolia - Fees memory fees = Fees({ - feePoolChain: 421614, - feePoolToken: ETH_ADDRESS, - amount: 0.01 ether - }); - CronAppGateway gateway = new CronAppGateway( - addressResolver, - address(uint160(uint256(keccak256(abi.encodePacked(block.timestamp))))), - auctionManager, - fees - ); - - console.log("Contracts deployed:"); - console.log("CronAppGateway:", address(gateway)); - } -} diff --git a/script/cron/SetTimeout.s.sol b/script/cron/SetTimeout.s.sol index 29ed632a..9a8c575a 100644 --- a/script/cron/SetTimeout.s.sol +++ b/script/cron/SetTimeout.s.sol @@ -3,7 +3,7 @@ pragma solidity ^0.8.0; import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/console.sol"; -import {CronAppGateway} from "../../contracts/apps/cron/CronAppGateway.sol"; +import {CounterAppGateway} from "../../contracts/apps/counter/CounterAppGateway.sol"; contract SetTimeoutScript is Script { function run() external { @@ -12,7 +12,7 @@ contract SetTimeoutScript is Script { vm.createSelectFork(socketRPC); address gatewayAddress = vm.envAddress("APP_GATEWAY"); console.log("Gateway address:", gatewayAddress); - CronAppGateway gateway = CronAppGateway(gatewayAddress); + CounterAppGateway gateway = CounterAppGateway(gatewayAddress); vm.startBroadcast(deployerPrivateKey); gateway.setTimeout(0); // vm.stopBroadcast(); diff --git a/script/mock/DeployEVMx.s.sol b/script/mock/DeployEVMx.s.sol index 12570d06..4ed43b5b 100644 --- a/script/mock/DeployEVMx.s.sol +++ b/script/mock/DeployEVMx.s.sol @@ -3,8 +3,8 @@ pragma solidity ^0.8.0; import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/console.sol"; -import {MockWatcherPrecompile} from "../../contracts/mock/MockWatcherPrecompile.sol"; -import {MockSocket} from "../../contracts/mock/MockSocket.sol"; +import {MockWatcherPrecompile} from "../../test/mock/MockWatcherPrecompile.sol"; +import {MockSocket} from "../../test/mock/MockSocket.sol"; contract DeployEVMx is Script { function run() external { diff --git a/script/mock/DeploySocket.s.sol b/script/mock/DeploySocket.s.sol index d69bad3a..56291966 100644 --- a/script/mock/DeploySocket.s.sol +++ b/script/mock/DeploySocket.s.sol @@ -3,8 +3,9 @@ pragma solidity ^0.8.0; import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/console.sol"; -import {MockWatcherPrecompile} from "../../contracts/mock/MockWatcherPrecompile.sol"; -import {MockSocket} from "../../contracts/mock/MockSocket.sol"; +import {MockWatcherPrecompile} from "../../test/mock/MockWatcherPrecompile.sol"; +import {MockSocket} from "../../test/mock/MockSocket.sol"; + contract DeploySocket is Script { function run() external { string memory rpc = vm.envString("ARBITRUM_SEPOLIA_RPC"); diff --git a/script/mock/FinalizeAndExecution.s.sol b/script/mock/FinalizeAndExecution.s.sol index 628bd4aa..4ba2d49a 100644 --- a/script/mock/FinalizeAndExecution.s.sol +++ b/script/mock/FinalizeAndExecution.s.sol @@ -3,9 +3,10 @@ pragma solidity ^0.8.0; import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/console.sol"; -import {MockWatcherPrecompile} from "../../contracts/mock/MockWatcherPrecompile.sol"; -import "../../contracts/mock/MockSocket.sol"; +import {MockWatcherPrecompile} from "../../test/mock/MockWatcherPrecompile.sol"; +import "../../test/mock/MockSocket.sol"; import {CallType, FinalizeParams, PayloadDetails, Parallel} from "../../contracts/protocol/utils/common/Structs.sol"; + contract InboxTest is Script { function run() external { string memory arbRpc = vm.envString("ARBITRUM_SEPOLIA_RPC"); diff --git a/script/mock/Inbox.s.sol b/script/mock/Inbox.s.sol index 178825ad..792a635d 100644 --- a/script/mock/Inbox.s.sol +++ b/script/mock/Inbox.s.sol @@ -3,8 +3,8 @@ pragma solidity ^0.8.0; import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/console.sol"; -import {MockWatcherPrecompile} from "../../contracts/mock/MockWatcherPrecompile.sol"; -import {MockSocket} from "../../contracts/mock/MockSocket.sol"; +import {MockWatcherPrecompile} from "../../test/mock/MockWatcherPrecompile.sol"; +import {MockSocket} from "../../test/mock/MockSocket.sol"; contract InboxTest is Script { function run() external { diff --git a/script/mock/Query.s.sol b/script/mock/Query.s.sol index 1909509c..6f5dde86 100644 --- a/script/mock/Query.s.sol +++ b/script/mock/Query.s.sol @@ -3,7 +3,7 @@ pragma solidity ^0.8.0; import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/console.sol"; -import {MockWatcherPrecompile} from "../../contracts/mock/MockWatcherPrecompile.sol"; +import {MockWatcherPrecompile} from "../../test/mock/MockWatcherPrecompile.sol"; contract QueryTest is Script { function run() external { diff --git a/script/mock/Timeout.s.sol b/script/mock/Timeout.s.sol index 68ae3a10..52313212 100644 --- a/script/mock/Timeout.s.sol +++ b/script/mock/Timeout.s.sol @@ -3,7 +3,7 @@ pragma solidity ^0.8.0; import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/console.sol"; -import {MockWatcherPrecompile} from "../../contracts/mock/MockWatcherPrecompile.sol"; +import {MockWatcherPrecompile} from "../../test/mock/MockWatcherPrecompile.sol"; contract TimeoutTest is Script { function run() external { diff --git a/script/parallel-counter/checkCounters.s.sol b/script/parallel-counter/checkCounters.s.sol index 55b7e29d..23c0ad53 100644 --- a/script/parallel-counter/checkCounters.s.sol +++ b/script/parallel-counter/checkCounters.s.sol @@ -3,65 +3,63 @@ pragma solidity ^0.8.0; import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/console.sol"; -import {ParallelCounterDeployer} from "../../contracts/apps/parallel-counter/ParallelCounterDeployer.sol"; +import {CounterAppGateway} from "../../contracts/apps/counter/CounterAppGateway.sol"; import {Counter} from "../../contracts/apps/counter/Counter.sol"; contract CheckCounters is Script { function run() external { - ParallelCounterDeployer deployer = ParallelCounterDeployer(vm.envAddress("DEPLOYER")); + CounterAppGateway gateway = CounterAppGateway(vm.envAddress("APP_GATEWAY")); vm.createSelectFork(vm.envString("EVMX_RPC")); - address counter1InstanceArbitrumSepolia = deployer.getOnChainAddress( - deployer.counter1(), + address counterInstanceArbitrumSepolia = gateway.getOnChainAddress( + gateway.counter(), 421614 ); - address counter2InstanceArbitrumSepolia = deployer.getOnChainAddress( - deployer.counter2(), + address counter1InstanceArbitrumSepolia = gateway.getOnChainAddress( + gateway.counter1(), 421614 ); - address counter1InstanceOptimismSepolia = deployer.getOnChainAddress( - deployer.counter1(), + address counterInstanceOptimismSepolia = gateway.getOnChainAddress( + gateway.counter(), 11155420 ); - address counter2InstanceOptimismSepolia = deployer.getOnChainAddress( - deployer.counter2(), + address counter1InstanceOptimismSepolia = gateway.getOnChainAddress( + gateway.counter1(), 11155420 ); - if (counter1InstanceArbitrumSepolia != address(0)) { + if (counterInstanceArbitrumSepolia != address(0)) { vm.createSelectFork(vm.envString("ARBITRUM_SEPOLIA_RPC")); - console.log("Counter 1 instance on Arbitrum Sepolia:", counter1InstanceArbitrumSepolia); - uint256 counterValueArbitrumSepolia = Counter(counter1InstanceArbitrumSepolia) - .counter(); + console.log("Counter 1 instance on Arbitrum Sepolia:", counterInstanceArbitrumSepolia); + uint256 counterValueArbitrumSepolia = Counter(counterInstanceArbitrumSepolia).counter(); console.log("Counter1 value on Arbitrum Sepolia: ", counterValueArbitrumSepolia); } else { console.log("Counter1 not yet deployed on Arbitrum Sepolia"); } - if (counter2InstanceArbitrumSepolia != address(0)) { + if (counter1InstanceArbitrumSepolia != address(0)) { vm.createSelectFork(vm.envString("ARBITRUM_SEPOLIA_RPC")); - console.log("Counter 2 instance on Arbitrum Sepolia:", counter2InstanceArbitrumSepolia); - uint256 counterValueArbitrumSepolia = Counter(counter2InstanceArbitrumSepolia) + console.log("Counter 2 instance on Arbitrum Sepolia:", counter1InstanceArbitrumSepolia); + uint256 counterValueArbitrumSepolia = Counter(counter1InstanceArbitrumSepolia) .counter(); console.log("Counter2 value on Arbitrum Sepolia: ", counterValueArbitrumSepolia); } else { console.log("Counter2 not yet deployed on Arbitrum Sepolia"); } - if (counter1InstanceOptimismSepolia != address(0)) { + if (counterInstanceOptimismSepolia != address(0)) { vm.createSelectFork(vm.envString("OPTIMISM_SEPOLIA_RPC")); - console.log("Counter 1 instance on Optimism Sepolia:", counter1InstanceOptimismSepolia); - uint256 counterValueOptimismSepolia = Counter(counter1InstanceOptimismSepolia) - .counter(); + console.log("Counter 1 instance on Optimism Sepolia:", counterInstanceOptimismSepolia); + uint256 counterValueOptimismSepolia = Counter(counterInstanceOptimismSepolia).counter(); console.log("Counter1 value on Optimism Sepolia: ", counterValueOptimismSepolia); } else { console.log("Counter1 not yet deployed on Optimism Sepolia"); } - if (counter2InstanceOptimismSepolia != address(0)) { + if (counter1InstanceOptimismSepolia != address(0)) { vm.createSelectFork(vm.envString("OPTIMISM_SEPOLIA_RPC")); - console.log("Counter 2 instance on Optimism Sepolia:", counter2InstanceOptimismSepolia); - uint256 counterValueOptimismSepolia = Counter(counter2InstanceOptimismSepolia) + console.log("Counter 2 instance on Optimism Sepolia:", counter1InstanceOptimismSepolia); + uint256 counterValueOptimismSepolia = Counter(counter1InstanceOptimismSepolia) .counter(); console.log("Counter2 value on Optimism Sepolia: ", counterValueOptimismSepolia); } else { @@ -69,10 +67,10 @@ contract CheckCounters is Script { } vm.createSelectFork(vm.envString("EVMX_RPC")); - address forwarderArb1 = deployer.forwarderAddresses(deployer.counter1(), 421614); - address forwarderArb2 = deployer.forwarderAddresses(deployer.counter2(), 421614); - address forwarderOpt1 = deployer.forwarderAddresses(deployer.counter1(), 11155420); - address forwarderOpt2 = deployer.forwarderAddresses(deployer.counter2(), 11155420); + address forwarderArb1 = gateway.forwarderAddresses(gateway.counter(), 421614); + address forwarderArb2 = gateway.forwarderAddresses(gateway.counter1(), 421614); + address forwarderOpt1 = gateway.forwarderAddresses(gateway.counter(), 11155420); + address forwarderOpt2 = gateway.forwarderAddresses(gateway.counter1(), 11155420); console.log("Forwarder 1 on Arbitrum Sepolia:", forwarderArb1); console.log("Forwarder 2 on Arbitrum Sepolia:", forwarderArb2); diff --git a/script/parallel-counter/deployOnEVMx.s.sol b/script/parallel-counter/deployOnEVMx.s.sol deleted file mode 100644 index 9cbe0350..00000000 --- a/script/parallel-counter/deployOnEVMx.s.sol +++ /dev/null @@ -1,46 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Script} from "forge-std/Script.sol"; -import {console} from "forge-std/console.sol"; -import {ParallelCounterAppGateway} from "../../contracts/apps/parallel-counter/ParallelCounterAppGateway.sol"; -import {ParallelCounterDeployer} from "../../contracts/apps/parallel-counter/ParallelCounterDeployer.sol"; -import {Fees} from "../../contracts/protocol/utils/common/Structs.sol"; -import {ETH_ADDRESS, FAST} from "../../contracts/protocol/utils/common/Constants.sol"; - -contract CounterDeploy is Script { - function run() external { - address addressResolver = vm.envAddress("ADDRESS_RESOLVER"); - address auctionManager = vm.envAddress("AUCTION_MANAGER"); - string memory rpc = vm.envString("EVMX_RPC"); - vm.createSelectFork(rpc); - - uint256 deployerPrivateKey = vm.envUint("PRIVATE_KEY"); - vm.startBroadcast(deployerPrivateKey); - - // Setting fee payment on Arbitrum Sepolia - Fees memory fees = Fees({ - feePoolChain: 421614, - feePoolToken: ETH_ADDRESS, - amount: 0.01 ether - }); - - ParallelCounterDeployer deployer = new ParallelCounterDeployer( - addressResolver, - auctionManager, - FAST, - fees - ); - - ParallelCounterAppGateway gateway = new ParallelCounterAppGateway( - addressResolver, - address(deployer), - auctionManager, - fees - ); - - console.log("Contracts deployed:"); - console.log("ParallelCounterDeployer:", address(deployer)); - console.log("ParallelCounterAppGateway:", address(gateway)); - } -} diff --git a/script/parallel-counter/deployOnchain.s.sol b/script/parallel-counter/deployOnchain.s.sol index ba05c9c9..6bf9811c 100644 --- a/script/parallel-counter/deployOnchain.s.sol +++ b/script/parallel-counter/deployOnchain.s.sol @@ -3,7 +3,7 @@ pragma solidity ^0.8.0; import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/console.sol"; -import {ParallelCounterDeployer} from "../../contracts/apps/parallel-counter/ParallelCounterDeployer.sol"; +import {CounterAppGateway} from "../../contracts/apps/counter/CounterAppGateway.sol"; import {ETH_ADDRESS} from "../../contracts/protocol/utils/common/Constants.sol"; contract CounterDeployOnchain is Script { @@ -15,15 +15,14 @@ contract CounterDeployOnchain is Script { uint256 deployerPrivateKey = vm.envUint("PRIVATE_KEY"); vm.startBroadcast(deployerPrivateKey); - ParallelCounterDeployer deployer = ParallelCounterDeployer(vm.envAddress("DEPLOYER")); - - console.log("Counter Deployer:", address(deployer)); + CounterAppGateway gateway = CounterAppGateway(vm.envAddress("APP_GATEWAY")); + console.log("Counter Gateway:", address(gateway)); console.log("Deploying contracts on Arbitrum Sepolia..."); uint32[] memory chainSlugs = new uint32[](2); chainSlugs[0] = 421614; chainSlugs[1] = 11155420; - deployer.deployMultiChainContracts(chainSlugs); + gateway.deployMultiChainContracts(chainSlugs); } } diff --git a/script/parallel-counter/incrementCounters.s.sol b/script/parallel-counter/incrementCounters.s.sol index 5c4fc7e5..c7651085 100644 --- a/script/parallel-counter/incrementCounters.s.sol +++ b/script/parallel-counter/incrementCounters.s.sol @@ -3,8 +3,7 @@ pragma solidity ^0.8.0; import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/console.sol"; -import {CounterDeployer} from "../../contracts/apps//counter/CounterDeployer.sol"; -import {CounterAppGateway} from "../../contracts/apps//counter/CounterAppGateway.sol"; +import {CounterAppGateway} from "../../contracts/apps/counter/CounterAppGateway.sol"; contract IncrementCounters is Script { function run() external { @@ -12,23 +11,19 @@ contract IncrementCounters is Script { vm.createSelectFork(socketRPC); - CounterDeployer deployer = CounterDeployer(vm.envAddress("COUNTER_DEPLOYER")); - CounterAppGateway gateway = CounterAppGateway(vm.envAddress("COUNTER_APP_GATEWAY")); + CounterAppGateway gateway = CounterAppGateway(vm.envAddress("APP_GATEWAY")); - address counterForwarderArbitrumSepolia = deployer.forwarderAddresses( - deployer.counter(), + address counterForwarderArbitrumSepolia = gateway.forwarderAddresses( + gateway.counter(), 421614 ); - address counterForwarderOptimismSepolia = deployer.forwarderAddresses( - deployer.counter(), + address counterForwarderOptimismSepolia = gateway.forwarderAddresses( + gateway.counter(), 11155420 ); - address counterForwarderBaseSepolia = deployer.forwarderAddresses( - deployer.counter(), - 84532 - ); - //address counterForwarderSepolia = deployer.forwarderAddresses( - // deployer.counter(), + address counterForwarderBaseSepolia = gateway.forwarderAddresses(gateway.counter(), 84532); + //address counterForwarderSepolia = gateway.forwarderAddresses( + // gateway.counter(), // 11155111 //); diff --git a/script/super-token-lockable/Bridge.s.sol b/script/super-token-lockable/Bridge.s.sol index 9fa30d5b..abb6875f 100644 --- a/script/super-token-lockable/Bridge.s.sol +++ b/script/super-token-lockable/Bridge.s.sol @@ -5,42 +5,40 @@ import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/console.sol"; import {SuperTokenLockableAppGateway} from "../../contracts/apps/super-token-lockable/SuperTokenLockableAppGateway.sol"; -import {SuperTokenLockableDeployer} from "../../contracts/apps/super-token-lockable/SuperTokenLockableDeployer.sol"; contract Bridge is Script { function run() external { - address owner = vm.envAddress("SUPERTOKEN_OWNER"); - address deployer = vm.envAddress("SUPERTOKEN_DEPLOYER"); - address gateway = vm.envAddress("SUPERTOKEN_APP_GATEWAY"); + address owner = vm.envAddress("OWNER"); + address gateway = vm.envAddress("APP_GATEWAY"); SuperTokenLockableAppGateway gatewayContract = SuperTokenLockableAppGateway(gateway); - SuperTokenLockableDeployer deployerContract = SuperTokenLockableDeployer(deployer); + string memory rpc = vm.envString("EVMX_RPC"); vm.createSelectFork(rpc); uint256 deployerPrivateKey = vm.envUint("PRIVATE_KEY"); vm.startBroadcast(deployerPrivateKey); - address arbTokenForwarder = deployerContract.forwarderAddresses( - deployerContract.superTokenLockable(), + address arbTokenForwarder = gatewayContract.forwarderAddresses( + gatewayContract.superTokenLockable(), 421614 ); - address arbHookForwarder = deployerContract.forwarderAddresses( - deployerContract.limitHook(), + address arbHookForwarder = gatewayContract.forwarderAddresses( + gatewayContract.limitHook(), 421614 ); - address optTokenForwarder = deployerContract.forwarderAddresses( - deployerContract.superTokenLockable(), + address optTokenForwarder = gatewayContract.forwarderAddresses( + gatewayContract.superTokenLockable(), 11155420 ); - address optHookForwarder = deployerContract.forwarderAddresses( - deployerContract.limitHook(), + address optHookForwarder = gatewayContract.forwarderAddresses( + gatewayContract.limitHook(), 11155420 ); - address arbOnChainToken = deployerContract.getOnChainAddress( - deployerContract.superTokenLockable(), + address arbOnChainToken = gatewayContract.getOnChainAddress( + gatewayContract.superTokenLockable(), 421614 ); - address optOnChainToken = deployerContract.getOnChainAddress( - deployerContract.superTokenLockable(), + address optOnChainToken = gatewayContract.getOnChainAddress( + gatewayContract.superTokenLockable(), 11155420 ); console.log("arbTokenForwarder"); diff --git a/script/super-token-lockable/DeployContracts.s.sol b/script/super-token-lockable/DeployContracts.s.sol index f4439e8e..b1729a85 100644 --- a/script/super-token-lockable/DeployContracts.s.sol +++ b/script/super-token-lockable/DeployContracts.s.sol @@ -4,21 +4,20 @@ pragma solidity ^0.8.0; import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/console.sol"; import {SuperTokenLockableAppGateway} from "../../contracts/apps/super-token-lockable/SuperTokenLockableAppGateway.sol"; -import {SuperTokenLockableDeployer} from "../../contracts/apps/super-token-lockable/SuperTokenLockableDeployer.sol"; import {SuperTokenLockable} from "../../contracts/apps/super-token-lockable/SuperTokenLockable.sol"; import {Fees} from "../../contracts/protocol/utils/common/Structs.sol"; import {ETH_ADDRESS} from "../../contracts/protocol/utils/common/Constants.sol"; contract DeployContracts is Script { function run() external { - SuperTokenLockableDeployer deployer = SuperTokenLockableDeployer( - vm.envAddress("SUPERTOKEN_DEPLOYER") + SuperTokenLockableAppGateway gateway = SuperTokenLockableAppGateway( + vm.envAddress("APP_GATEWAY") ); string memory rpc = vm.envString("EVMX_RPC"); vm.createSelectFork(rpc); uint256 deployerPrivateKey = vm.envUint("PRIVATE_KEY"); vm.startBroadcast(deployerPrivateKey); - deployer.deployContracts(84532); - deployer.deployContracts(11155111); + gateway.deployContracts(84532); + gateway.deployContracts(11155111); } } diff --git a/script/super-token-lockable/DeployGateway.s.sol b/script/super-token-lockable/DeployGateway.s.sol index e9ef679a..dee05645 100644 --- a/script/super-token-lockable/DeployGateway.s.sol +++ b/script/super-token-lockable/DeployGateway.s.sol @@ -4,7 +4,6 @@ pragma solidity ^0.8.0; import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/console.sol"; import {SuperTokenLockableAppGateway} from "../../contracts/apps/super-token-lockable/SuperTokenLockableAppGateway.sol"; -import {SuperTokenLockableDeployer} from "../../contracts/apps/super-token-lockable/SuperTokenLockableDeployer.sol"; import {SuperTokenLockable} from "../../contracts/apps/super-token-lockable/SuperTokenLockable.sol"; import {Fees} from "../../contracts/protocol/utils/common/Structs.sol"; import {ETH_ADDRESS, FAST} from "../../contracts/protocol/utils/common/Constants.sol"; @@ -25,12 +24,12 @@ contract DeployGateway is Script { amount: 0.001 ether }); - SuperTokenLockableDeployer deployer = new SuperTokenLockableDeployer( + SuperTokenLockableAppGateway gateway = new SuperTokenLockableAppGateway( addressResolver, - owner, address(auctionManager), FAST, - SuperTokenLockableDeployer.ConstructorParams({ + fees, + SuperTokenLockableAppGateway.ConstructorParams({ _burnLimit: 1000000000 ether, _mintLimit: 1000000000 ether, name_: "SUPER TOKEN", @@ -38,23 +37,14 @@ contract DeployGateway is Script { decimals_: 18, initialSupplyHolder_: owner, initialSupply_: 1000000000 ether - }), - fees - ); - - SuperTokenLockableAppGateway gateway = new SuperTokenLockableAppGateway( - addressResolver, - address(deployer), - address(auctionManager), - fees + }) ); - bytes32 superToken = deployer.superTokenLockable(); - bytes32 limitHook = deployer.limitHook(); + bytes32 superToken = gateway.superTokenLockable(); + bytes32 limitHook = gateway.limitHook(); console.log("Contracts deployed:"); console.log("SuperTokenLockableAppGateway:", address(gateway)); - console.log("SuperTokenLockableDeployer:", address(deployer)); console.log("SuperTokenLockableId:"); console.logBytes32(superToken); console.log("LimitHookId:"); diff --git a/script/super-token/DeployContracts.s.sol b/script/super-token/DeployContracts.s.sol index 08cc9989..37546559 100644 --- a/script/super-token/DeployContracts.s.sol +++ b/script/super-token/DeployContracts.s.sol @@ -4,7 +4,6 @@ pragma solidity ^0.8.0; import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/console.sol"; import {SuperTokenAppGateway} from "../../contracts/apps/super-token/SuperTokenAppGateway.sol"; -import {SuperTokenDeployer} from "../../contracts/apps/super-token/SuperTokenDeployer.sol"; import {SuperToken} from "../../contracts/apps/super-token/SuperToken.sol"; import {Fees} from "../../contracts/protocol/utils/common/Structs.sol"; import {ETH_ADDRESS} from "../../contracts/protocol/utils/common/Constants.sol"; @@ -12,7 +11,7 @@ import {ETH_ADDRESS} from "../../contracts/protocol/utils/common/Constants.sol"; contract DeployContracts is Script { function run() external { vm.startBroadcast(); - SuperTokenDeployer deployer = SuperTokenDeployer( + SuperTokenAppGateway deployer = SuperTokenAppGateway( 0x02520426a04D2943d817A60ABa37ab25bA10e630 ); deployer.deployContracts(84532); diff --git a/script/super-token/DeployGateway.s.sol b/script/super-token/DeployGateway.s.sol index 3d81543b..e4091a1d 100644 --- a/script/super-token/DeployGateway.s.sol +++ b/script/super-token/DeployGateway.s.sol @@ -4,7 +4,6 @@ pragma solidity ^0.8.0; import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/console.sol"; import {SuperTokenAppGateway} from "../../contracts/apps/super-token/SuperTokenAppGateway.sol"; -import {SuperTokenDeployer} from "../../contracts/apps/super-token/SuperTokenDeployer.sol"; import {SuperToken} from "../../contracts/apps/super-token/SuperToken.sol"; import {Fees} from "../../contracts/protocol/utils/common/Structs.sol"; import {ETH_ADDRESS, FAST} from "../../contracts/protocol/utils/common/Constants.sol"; @@ -23,33 +22,24 @@ contract DeployGateway is Script { amount: 0.001 ether }); - SuperTokenDeployer deployer = new SuperTokenDeployer( + SuperTokenAppGateway gateway = new SuperTokenAppGateway( addressResolver, - owner, address(auctionManager), FAST, - SuperTokenDeployer.ConstructorParams({ - name_: "SUPER TOKEN", + fees, + SuperTokenAppGateway.ConstructorParams({ + name_: "SuperToken", symbol_: "SUPER", decimals_: 18, initialSupplyHolder_: owner, - initialSupply_: 1000000000 ether - }), - fees - ); - - SuperTokenAppGateway gateway = new SuperTokenAppGateway( - addressResolver, - address(deployer), - fees, - address(auctionManager) + initialSupply_: 1000000000000000000000000 + }) ); - bytes32 superToken = deployer.superToken(); + bytes32 superToken = gateway.superToken(); console.log("Contracts deployed:"); - console.log("SuperTokenApp:", address(gateway)); - console.log("SuperTokenDeployer:", address(deployer)); + console.log("SuperTokenAppGateway:", address(gateway)); console.log("SuperTokenId:"); console.logBytes32(superToken); } diff --git a/test/DeliveryHelper.t.sol b/test/DeliveryHelper.t.sol index 2d6f923c..10f31140 100644 --- a/test/DeliveryHelper.t.sol +++ b/test/DeliveryHelper.t.sol @@ -6,8 +6,7 @@ import "../contracts/protocol/payload-delivery/FeesManager.sol"; import "../contracts/protocol/payload-delivery/AuctionManager.sol"; import "../contracts/protocol/Forwarder.sol"; -import "../contracts/interfaces/IAppDeployer.sol"; -import "../contracts/interfaces/IMultiChainAppDeployer.sol"; +import "../contracts/interfaces/IAppGateway.sol"; import "./SetupTest.t.sol"; @@ -292,8 +291,7 @@ contract DeliveryHelperTest is SetupTest { bytes32[] memory contractIds, uint32 chainSlug_, uint256 totalPayloads, - IAppDeployer appDeployer_, - address appGateway_ + IAppGateway appGateway_ ) internal returns (bytes32 asyncId) { SocketContracts memory socketConfig = getSocketConfig(chainSlug_); @@ -304,16 +302,15 @@ contract DeliveryHelperTest is SetupTest { totalPayloads ); - appDeployer_.deployContracts(chainSlug_); + appGateway_.deployContracts(chainSlug_); bidAndExecute(payloadIds, asyncId); - setupGatewayAndPlugs(chainSlug_, appDeployer_, appGateway_, contractIds); + setupGatewayAndPlugs(chainSlug_, appGateway_, appGateway_, contractIds); } function _deployParallel( bytes32[] memory contractIds, uint32[] memory chainSlugs_, - IMultiChainAppDeployer appDeployer_, - address appGateway_ + IAppGateway appGateway_ ) internal returns (bytes32 asyncId) { asyncId = getNextAsyncId(); bytes32[] memory payloadIds = new bytes32[](contractIds.length * chainSlugs_.length); @@ -329,24 +326,23 @@ contract DeliveryHelperTest is SetupTest { // for fees payloadIdCounter += chainSlugs_.length * contractIds.length + 1; - appDeployer_.deployMultiChainContracts(chainSlugs_); + appGateway_.deployMultiChainContracts(chainSlugs_); bidAndExecute(payloadIds, asyncId); for (uint i = 0; i < chainSlugs_.length; i++) { - setupGatewayAndPlugs(chainSlugs_[i], appDeployer_, appGateway_, contractIds); + setupGatewayAndPlugs(chainSlugs_[i], appGateway_, appGateway_, contractIds); } } function setupGatewayAndPlugs( uint32 chainSlug_, - IAppDeployer appDeployer_, - address appGateway_, + IAppGateway appGateway_, bytes32[] memory contractIds ) internal { AppGatewayConfig[] memory gateways = new AppGatewayConfig[](contractIds.length); SocketContracts memory socketConfig = getSocketConfig(chainSlug_); for (uint i = 0; i < contractIds.length; i++) { - address plug = appDeployer_.getOnChainAddress(contractIds[i], chainSlug_); + address plug = appGateway_.getOnChainAddress(contractIds[i], chainSlug_); gateways[i] = AppGatewayConfig({ plug: plug, @@ -671,10 +667,10 @@ contract DeliveryHelperTest is SetupTest { function getOnChainAndForwarderAddresses( uint32 chainSlug_, bytes32 contractId_, - IAppDeployer deployer_ + IAppGateway appGateway_ ) internal view returns (address, address) { - address app = deployer_.getOnChainAddress(contractId_, chainSlug_); - address forwarder = deployer_.forwarderAddresses(contractId_, chainSlug_); + address app = appGateway_.getOnChainAddress(contractId_, chainSlug_); + address forwarder = appGateway_.forwarderAddresses(contractId_, chainSlug_); return (app, forwarder); } } diff --git a/test/apps/ParallelCounter.t.sol b/test/apps/ParallelCounter.t.sol index 963aa1e1..c6e2e1ea 100644 --- a/test/apps/ParallelCounter.t.sol +++ b/test/apps/ParallelCounter.t.sol @@ -5,6 +5,9 @@ import {ParallelCounterAppGateway} from "../../contracts/apps/parallel-counter/P import {ParallelCounterDeployer} from "../../contracts/apps/parallel-counter/ParallelCounterDeployer.sol"; import "../DeliveryHelper.t.sol"; + + + contract ParallelCounterTest is DeliveryHelperTest { uint256 feesAmount = 0.01 ether; @@ -42,8 +45,7 @@ contract ParallelCounterTest is DeliveryHelperTest { asyncId = _deployParallel( contractIds, chainSlugs, - IMultiChainAppDeployer(address(parallelCounterDeployer)), - address(parallelCounterGateway) + IAppGateway(address(parallelCounterGateway)) ); } diff --git a/testScript.sh b/testScript.sh index 818eb715..f211c951 100644 --- a/testScript.sh +++ b/testScript.sh @@ -3,7 +3,7 @@ ## Parallel Counter source .env && forge script script/parallel-counter/deployOnEVMx.s.sol --broadcast --skip-simulation ## set limits for the app gateway using API -source .env && cast send $DEPLOYER "deployMultiChainContracts(uint32[])" '[421614, 11155420]' --private-key $PRIVATE_KEY +source .env && cast send $APP_GATEWAY "deployMultiChainContracts(uint32[])" '[421614, 11155420]' --private-key $PRIVATE_KEY source .env && forge script script/parallel-counter/checkCounters.s.sol --broadcast --skip-simulation @@ -11,7 +11,7 @@ source .env && forge script script/parallel-counter/checkCounters.s.sol --broadc source .env && forge script script/counter/deployEVMxCounterApp.s.sol --broadcast --skip-simulation --legacy --gas-price 0 source .env && forge script script/counter/DeployCounterOnchain.s.sol --broadcast --skip-simulation ## set limits for the app gateway using API -source .env && cast send $DEPLOYER "deployContracts(uint32)" 421614 --private-key $PRIVATE_KEY --legacy --gas-price 0 +source .env && cast send $APP_GATEWAY "deployContracts(uint32)" 421614 --private-key $PRIVATE_KEY --legacy --gas-price 0 source .env && cast send $APP_GATEWAY "incrementCounters(address[])" '[0x9Bd3efbd1dA4f58Bd4A11421102FE4B08fAb0121]' --private-key $PRIVATE_KEY --legacy --gas-price 0 forge script script/counter/incrementCounters.s.sol --broadcast --skip-simulation forge script script/counter/checkCounters.s.sol --broadcast --skip-simulation @@ -23,8 +23,8 @@ source .env && cast send $APP_GATEWAY "setTimeout(uint256)" 0 --private-key $PRI ## Super Token Lockable forge script script/super-token-lockable/DeployGateway.s.sol --broadcast --skip-simulation -source .env && cast send $DEPLOYER "deployContracts(uint32)" 421614 --private-key $PRIVATE_KEY -source .env && cast send $DEPLOYER "deployContracts(uint32)" 11155420 --private-key $PRIVATE_KEY +source .env && cast send $APP_GATEWAY "deployContracts(uint32)" 421614 --private-key $PRIVATE_KEY +source .env && cast send $APP_GATEWAY "deployContracts(uint32)" 11155420 --private-key $PRIVATE_KEY forge script script/super-token-lockable/Bridge.s.sol --broadcast --skip-simulation source .env && cast send $APP_GATEWAY $data --private-key $PRIVATE_KEY From bd1895b16dc476713c72decf8297405b91b9f313 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Wed, 26 Feb 2025 19:26:36 +0400 Subject: [PATCH 149/186] fix: tests --- .../SuperTokenLockableAppGateway.sol | 3 +- .../apps/super-token/SuperTokenAppGateway.sol | 3 +- contracts/base/AppGatewayBase.sol | 8 +- contracts/interfaces/IAddressResolver.sol | 5 -- contracts/protocol/AddressResolver.sol | 6 +- script/counter/IncrementCountersFromApp.s.sol | 5 +- .../super-token-lockable/DeployGateway.s.sol | 1 + script/super-token/DeployGateway.s.sol | 1 + test/DeliveryHelper.t.sol | 30 +------ test/FeesTest.t.sol | 21 +---- test/Inbox.t.sol | 21 +++-- test/apps/Counter.t.sol | 33 +++----- test/apps/ParallelCounter.t.sol | 60 +++++++------- test/apps/SuperToken.t.sol | 52 +++--------- test/apps/SuperTokenLockable.t.sol | 80 ++++++------------- 15 files changed, 107 insertions(+), 222 deletions(-) diff --git a/contracts/apps/super-token-lockable/SuperTokenLockableAppGateway.sol b/contracts/apps/super-token-lockable/SuperTokenLockableAppGateway.sol index 56336bef..ef003ac0 100644 --- a/contracts/apps/super-token-lockable/SuperTokenLockableAppGateway.sol +++ b/contracts/apps/super-token-lockable/SuperTokenLockableAppGateway.sol @@ -34,6 +34,7 @@ contract SuperTokenLockableAppGateway is AppGatewayBase, Ownable { constructor( address addressResolver_, address auctionManager_, + address owner_, bytes32 sbType_, Fees memory fees_, ConstructorParams memory params @@ -55,7 +56,7 @@ contract SuperTokenLockableAppGateway is AppGatewayBase, Ownable { ); _setOverrides(fees_); - _initializeOwner(msg.sender); + _initializeOwner(owner_); } function deployContracts(uint32 chainSlug_) external async { diff --git a/contracts/apps/super-token/SuperTokenAppGateway.sol b/contracts/apps/super-token/SuperTokenAppGateway.sol index 308759b3..77f4cf9e 100644 --- a/contracts/apps/super-token/SuperTokenAppGateway.sol +++ b/contracts/apps/super-token/SuperTokenAppGateway.sol @@ -30,6 +30,7 @@ contract SuperTokenAppGateway is AppGatewayBase, Ownable { constructor( address addressResolver_, address auctionManager_, + address owner_, bytes32 sbType_, Fees memory fees_, ConstructorParams memory params_ @@ -48,7 +49,7 @@ contract SuperTokenAppGateway is AppGatewayBase, Ownable { // sets the fees data like max fees, chain and token for all transfers // they can be updated for each transfer as well _setOverrides(fees_); - _initializeOwner(msg.sender); + _initializeOwner(owner_); } function deployContracts(uint32 chainSlug_) external async { diff --git a/contracts/base/AppGatewayBase.sol b/contracts/base/AppGatewayBase.sol index c8472cbd..f019ff3a 100644 --- a/contracts/base/AppGatewayBase.sol +++ b/contracts/base/AppGatewayBase.sol @@ -37,6 +37,7 @@ abstract contract AppGatewayBase is AddressResolverUtil, IAppGateway, FeesPlugin isAsyncModifierSet = false; deliveryHelper().batch(fees, auctionManager, onCompleteData, sbType); _markValidPromises(); + onCompleteData = bytes(""); } /// @notice Modifier to ensure only valid promises can call the function @@ -126,8 +127,6 @@ abstract contract AppGatewayBase is AddressResolverUtil, IAppGateway, FeesPlugin creationCodeWithArgs[contractId_], initCallData_ ); - - onCompleteData = abi.encode(chainSlug_, false); } /// @notice Sets the address for a deployed contract @@ -157,7 +156,8 @@ abstract contract AppGatewayBase is AddressResolverUtil, IAppGateway, FeesPlugin return address(0); } - onChainAddress = IForwarder(forwarderAddresses[contractId_][chainSlug_]).getOnChainAddress(); + onChainAddress = IForwarder(forwarderAddresses[contractId_][chainSlug_]) + .getOnChainAddress(); } //////////////////////////////////////////////////////////////////////////////////////////////// @@ -265,6 +265,8 @@ abstract contract AppGatewayBase is AddressResolverUtil, IAppGateway, FeesPlugin bytes32, PayloadBatch memory payloadBatch_ ) external override onlyDeliveryHelper { + if (payloadBatch_.onCompleteData.length == 0) return; + (uint32 chainSlug, bool isDeploy) = abi.decode( payloadBatch_.onCompleteData, (uint32, bool) diff --git a/contracts/interfaces/IAddressResolver.sol b/contracts/interfaces/IAddressResolver.sol index be19aae4..89f5483a 100644 --- a/contracts/interfaces/IAddressResolver.sol +++ b/contracts/interfaces/IAddressResolver.sol @@ -32,11 +32,6 @@ interface IAddressResolver { /// @return The gateway address associated with the contract function contractsToGateways(address contractAddress_) external view returns (address); - /// @notice Maps gateway addresses to their corresponding contract addresses - /// @param gatewayAddress_ The address of the gateway to lookup - /// @return The contract address associated with the gateway - function gatewaysToContracts(address gatewayAddress_) external view returns (address); - /// @notice Gets the list of all deployed async promise contracts /// @return Array of async promise contract addresses function getPromises() external view returns (address[] memory); diff --git a/contracts/protocol/AddressResolver.sol b/contracts/protocol/AddressResolver.sol index 65775d7e..12581543 100644 --- a/contracts/protocol/AddressResolver.sol +++ b/contracts/protocol/AddressResolver.sol @@ -46,10 +46,7 @@ abstract contract AddressResolverStorage is IAddressResolver { // slot 60 mapping(address => address) public override contractsToGateways; - // slot 61 - mapping(address => address) public override gatewaysToContracts; - - // slots [62-111] reserved for gap + // slots [61-110] reserved for gap uint256[50] _gap_after; } @@ -224,7 +221,6 @@ contract AddressResolver is AddressResolverStorage, Initializable, Ownable { function _setConfig(address appGateway_, address newForwarder_) internal { address gateway = contractsToGateways[appGateway_]; - gatewaysToContracts[gateway] = newForwarder_; contractsToGateways[newForwarder_] = gateway; } diff --git a/script/counter/IncrementCountersFromApp.s.sol b/script/counter/IncrementCountersFromApp.s.sol index 10a0f727..704cd065 100644 --- a/script/counter/IncrementCountersFromApp.s.sol +++ b/script/counter/IncrementCountersFromApp.s.sol @@ -22,10 +22,7 @@ contract IncrementCounters is Script { gateway.counter(), 11155420 ); - address counterForwarderBaseSepolia = gateway.forwarderAddresses( - gateway.counter(), - 84532 - ); + address counterForwarderBaseSepolia = gateway.forwarderAddresses(gateway.counter(), 84532); //address counterForwarderSepolia = deployer.forwarderAddresses( // deployer.counter(), // 11155111 diff --git a/script/super-token-lockable/DeployGateway.s.sol b/script/super-token-lockable/DeployGateway.s.sol index dee05645..86ba6018 100644 --- a/script/super-token-lockable/DeployGateway.s.sol +++ b/script/super-token-lockable/DeployGateway.s.sol @@ -27,6 +27,7 @@ contract DeployGateway is Script { SuperTokenLockableAppGateway gateway = new SuperTokenLockableAppGateway( addressResolver, address(auctionManager), + owner, FAST, fees, SuperTokenLockableAppGateway.ConstructorParams({ diff --git a/script/super-token/DeployGateway.s.sol b/script/super-token/DeployGateway.s.sol index e4091a1d..165f0bcd 100644 --- a/script/super-token/DeployGateway.s.sol +++ b/script/super-token/DeployGateway.s.sol @@ -25,6 +25,7 @@ contract DeployGateway is Script { SuperTokenAppGateway gateway = new SuperTokenAppGateway( addressResolver, address(auctionManager), + owner, FAST, fees, SuperTokenAppGateway.ConstructorParams({ diff --git a/test/DeliveryHelper.t.sol b/test/DeliveryHelper.t.sol index 10f31140..96c7046a 100644 --- a/test/DeliveryHelper.t.sol +++ b/test/DeliveryHelper.t.sol @@ -304,33 +304,7 @@ contract DeliveryHelperTest is SetupTest { appGateway_.deployContracts(chainSlug_); bidAndExecute(payloadIds, asyncId); - setupGatewayAndPlugs(chainSlug_, appGateway_, appGateway_, contractIds); - } - - function _deployParallel( - bytes32[] memory contractIds, - uint32[] memory chainSlugs_, - IAppGateway appGateway_ - ) internal returns (bytes32 asyncId) { - asyncId = getNextAsyncId(); - bytes32[] memory payloadIds = new bytes32[](contractIds.length * chainSlugs_.length); - for (uint32 i = 0; i < chainSlugs_.length; i++) { - for (uint j = 0; j < contractIds.length; j++) { - payloadIds[i * contractIds.length + j] = getWritePayloadId( - chainSlugs_[i], - address(getSocketConfig(chainSlugs_[i]).switchboard), - i * contractIds.length + j + payloadIdCounter - ); - } - } - // for fees - payloadIdCounter += chainSlugs_.length * contractIds.length + 1; - - appGateway_.deployMultiChainContracts(chainSlugs_); - bidAndExecute(payloadIds, asyncId); - for (uint i = 0; i < chainSlugs_.length; i++) { - setupGatewayAndPlugs(chainSlugs_[i], appGateway_, appGateway_, contractIds); - } + setupGatewayAndPlugs(chainSlug_, appGateway_, contractIds); } function setupGatewayAndPlugs( @@ -347,7 +321,7 @@ contract DeliveryHelperTest is SetupTest { gateways[i] = AppGatewayConfig({ plug: plug, chainSlug: chainSlug_, - appGateway: appGateway_, + appGateway: address(appGateway_), switchboard: address(socketConfig.switchboard) }); } diff --git a/test/FeesTest.t.sol b/test/FeesTest.t.sol index 060f4af2..8a70922e 100644 --- a/test/FeesTest.t.sol +++ b/test/FeesTest.t.sol @@ -2,7 +2,6 @@ pragma solidity ^0.8.3; import "./DeliveryHelper.t.sol"; -import {CounterDeployer} from "../contracts/apps/counter/CounterDeployer.sol"; import {Counter} from "../contracts/apps/counter/Counter.sol"; import {CounterAppGateway} from "../contracts/apps/counter/CounterAppGateway.sol"; @@ -16,36 +15,22 @@ contract FeesTest is DeliveryHelperTest { bytes32 asyncId; CounterAppGateway counterGateway; - CounterDeployer counterDeployer; function setUp() public { setUpDeliveryHelper(); feesConfig = getSocketConfig(feesChainSlug); - counterDeployer = new CounterDeployer( - address(addressResolver), - address(auctionManager), - FAST, - createFees(feesAmount) - ); - counterGateway = new CounterAppGateway( address(addressResolver), - address(counterDeployer), address(auctionManager), + FAST, createFees(feesAmount) ); depositFees(address(counterGateway), createFees(depositAmount)); bytes32[] memory contractIds = new bytes32[](1); - contractIds[0] = counterDeployer.counter(); - asyncId = _deploy( - contractIds, - feesChainSlug, - 1, - IAppDeployer(counterDeployer), - address(counterGateway) - ); + contractIds[0] = counterGateway.counter(); + asyncId = _deploy(contractIds, feesChainSlug, 1, IAppGateway(counterGateway)); } function testDistributeFee() public { diff --git a/test/Inbox.t.sol b/test/Inbox.t.sol index 29711ef8..e067972f 100644 --- a/test/Inbox.t.sol +++ b/test/Inbox.t.sol @@ -1,30 +1,30 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -import {CounterInboxAppGateway} from "../contracts/apps/counter-inbox/CounterInboxAppGateway.sol"; -import {CounterInbox} from "../contracts/apps/counter-inbox/CounterInbox.sol"; +import {CounterAppGateway} from "../contracts/apps/counter/CounterAppGateway.sol"; +import {Counter} from "../contracts/apps/counter/Counter.sol"; import "./DeliveryHelper.t.sol"; contract InboxTest is DeliveryHelperTest { uint256 constant feesAmount = 0.01 ether; - CounterInboxAppGateway public gateway; - CounterInbox public inbox; + CounterAppGateway public gateway; + Counter public inbox; function setUp() public { // Setup core test infrastructure setUpDeliveryHelper(); // Deploy the inbox contract - inbox = new CounterInbox(); + inbox = new Counter(); // Deploy the gateway with fees - gateway = new CounterInboxAppGateway( + gateway = new CounterAppGateway( address(addressResolver), address(auctionManager), - address(inbox), - arbChainSlug, + FAST, createFees(feesAmount) ); + gateway.setIsValidPlug(arbChainSlug, address(inbox)); // Connect the inbox to the gateway and socket inbox.initSocket( @@ -55,13 +55,12 @@ contract InboxTest is DeliveryHelperTest { function testInboxIncrement() public { // Initial counter value should be 0 - assertEq(gateway.counter(), 0, "Initial gateway counter should be 0"); + assertEq(gateway.counterVal(), 0, "Initial gateway counter should be 0"); // Simulate a message from another chain through the watcher uint256 incrementValue = 5; bytes32 callId = inbox.increaseOnGateway(incrementValue); - CallFromChainParams[] memory params = new CallFromChainParams[](1); params[0] = CallFromChainParams({ callId: callId, @@ -77,6 +76,6 @@ contract InboxTest is DeliveryHelperTest { ); watcherPrecompile.callAppGateways(params, signatureNonce++, watcherSignature); // Check counter was incremented - assertEq(gateway.counter(), incrementValue, "Gateway counter should be incremented"); + assertEq(gateway.counterVal(), incrementValue, "Gateway counter should be incremented"); } } diff --git a/test/apps/Counter.t.sol b/test/apps/Counter.t.sol index 9c892710..ac74c870 100644 --- a/test/apps/Counter.t.sol +++ b/test/apps/Counter.t.sol @@ -2,7 +2,6 @@ pragma solidity ^0.8.21; import {CounterAppGateway} from "../../contracts/apps/counter/CounterAppGateway.sol"; -import {CounterDeployer} from "../../contracts/apps/counter/CounterDeployer.sol"; import {Counter} from "../../contracts/apps/counter/Counter.sol"; import "../DeliveryHelper.t.sol"; @@ -13,38 +12,24 @@ contract CounterTest is DeliveryHelperTest { bytes32[] contractIds = new bytes32[](1); CounterAppGateway counterGateway; - CounterDeployer counterDeployer; function deploySetup() internal { setUpDeliveryHelper(); - counterDeployer = new CounterDeployer( - address(addressResolver), - address(auctionManager), - FAST, - createFees(feesAmount) - ); - counterGateway = new CounterAppGateway( address(addressResolver), - address(counterDeployer), address(auctionManager), + FAST, createFees(feesAmount) ); depositFees(address(counterGateway), createFees(1 ether)); - counterId = counterDeployer.counter(); + counterId = counterGateway.counter(); contractIds[0] = counterId; } function deployCounterApp(uint32 chainSlug) internal returns (bytes32 asyncId) { - asyncId = _deploy( - contractIds, - chainSlug, - 1, - IAppDeployer(counterDeployer), - address(counterGateway) - ); + asyncId = _deploy(contractIds, chainSlug, 1, IAppGateway(counterGateway)); } function testCounterDeployment() external { @@ -54,7 +39,7 @@ contract CounterTest is DeliveryHelperTest { (address onChain, address forwarder) = getOnChainAndForwarderAddresses( arbChainSlug, counterId, - counterDeployer + counterGateway ); assertEq( @@ -76,7 +61,7 @@ contract CounterTest is DeliveryHelperTest { (address arbCounter, address arbCounterForwarder) = getOnChainAndForwarderAddresses( arbChainSlug, counterId, - counterDeployer + counterGateway ); uint256 arbCounterBefore = Counter(arbCounter).counter(); @@ -97,12 +82,12 @@ contract CounterTest is DeliveryHelperTest { (address arbCounter, address arbCounterForwarder) = getOnChainAndForwarderAddresses( arbChainSlug, counterId, - counterDeployer + counterGateway ); (address optCounter, address optCounterForwarder) = getOnChainAndForwarderAddresses( optChainSlug, counterId, - counterDeployer + counterGateway ); uint256 arbCounterBefore = Counter(arbCounter).counter(); @@ -128,12 +113,12 @@ contract CounterTest is DeliveryHelperTest { (address arbCounter, address arbCounterForwarder) = getOnChainAndForwarderAddresses( arbChainSlug, counterId, - counterDeployer + counterGateway ); (address optCounter, address optCounterForwarder) = getOnChainAndForwarderAddresses( optChainSlug, counterId, - counterDeployer + counterGateway ); address[] memory instances = new address[](2); diff --git a/test/apps/ParallelCounter.t.sol b/test/apps/ParallelCounter.t.sol index c6e2e1ea..d6c049c7 100644 --- a/test/apps/ParallelCounter.t.sol +++ b/test/apps/ParallelCounter.t.sol @@ -1,13 +1,9 @@ // SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.21; -import {ParallelCounterAppGateway} from "../../contracts/apps/parallel-counter/ParallelCounterAppGateway.sol"; -import {ParallelCounterDeployer} from "../../contracts/apps/parallel-counter/ParallelCounterDeployer.sol"; +import {CounterAppGateway} from "../../contracts/apps/counter/CounterAppGateway.sol"; import "../DeliveryHelper.t.sol"; - - - contract ParallelCounterTest is DeliveryHelperTest { uint256 feesAmount = 0.01 ether; @@ -15,38 +11,48 @@ contract ParallelCounterTest is DeliveryHelperTest { bytes32 counterId2; bytes32[] contractIds = new bytes32[](2); - ParallelCounterAppGateway parallelCounterGateway; - ParallelCounterDeployer parallelCounterDeployer; + CounterAppGateway parallelCounterGateway; function deploySetup() internal { setUpDeliveryHelper(); - parallelCounterDeployer = new ParallelCounterDeployer( + parallelCounterGateway = new CounterAppGateway( address(addressResolver), address(auctionManager), FAST, createFees(feesAmount) ); - - parallelCounterGateway = new ParallelCounterAppGateway( - address(addressResolver), - address(parallelCounterDeployer), - address(auctionManager), - createFees(feesAmount) - ); depositFees(address(parallelCounterGateway), createFees(1 ether)); - counterId1 = parallelCounterDeployer.counter1(); - counterId2 = parallelCounterDeployer.counter2(); + counterId1 = parallelCounterGateway.counter1(); + counterId2 = parallelCounterGateway.counter(); contractIds[0] = counterId1; contractIds[1] = counterId2; } + function _deployParallel(uint32[] memory chainSlugs_) internal returns (bytes32 asyncId) { + asyncId = getNextAsyncId(); + bytes32[] memory payloadIds = new bytes32[](contractIds.length * chainSlugs_.length); + for (uint32 i = 0; i < chainSlugs_.length; i++) { + for (uint j = 0; j < contractIds.length; j++) { + payloadIds[i * contractIds.length + j] = getWritePayloadId( + chainSlugs_[i], + address(getSocketConfig(chainSlugs_[i]).switchboard), + i * contractIds.length + j + payloadIdCounter + ); + } + } + // for fees + payloadIdCounter += chainSlugs_.length * contractIds.length + 1; + + parallelCounterGateway.deployMultiChainContracts(chainSlugs_); + bidAndExecute(payloadIds, asyncId); + for (uint i = 0; i < chainSlugs_.length; i++) { + setupGatewayAndPlugs(chainSlugs_[i], parallelCounterGateway, contractIds); + } + } + function deployCounterApps(uint32[] memory chainSlugs) internal returns (bytes32 asyncId) { - asyncId = _deployParallel( - contractIds, - chainSlugs, - IAppGateway(address(parallelCounterGateway)) - ); + asyncId = _deployParallel(chainSlugs); } function testParallelCounterDeployment() external { @@ -59,23 +65,23 @@ contract ParallelCounterTest is DeliveryHelperTest { (address onChainArb1, address forwarderArb1) = getOnChainAndForwarderAddresses( arbChainSlug, counterId1, - parallelCounterDeployer + parallelCounterGateway ); (address onChainArb2, address forwarderArb2) = getOnChainAndForwarderAddresses( arbChainSlug, counterId2, - parallelCounterDeployer + parallelCounterGateway ); (address onChainOpt1, address forwarderOpt1) = getOnChainAndForwarderAddresses( optChainSlug, counterId1, - parallelCounterDeployer + parallelCounterGateway ); (address onChainOpt2, address forwarderOpt2) = getOnChainAndForwarderAddresses( optChainSlug, counterId2, - parallelCounterDeployer + parallelCounterGateway ); assertEq( @@ -129,7 +135,7 @@ contract ParallelCounterTest is DeliveryHelperTest { (, address arbCounterForwarder) = getOnChainAndForwarderAddresses( arbChainSlug, counterId1, - parallelCounterDeployer + parallelCounterGateway ); address[] memory instances = new address[](1); diff --git a/test/apps/SuperToken.t.sol b/test/apps/SuperToken.t.sol index 7ce322e2..379799ef 100644 --- a/test/apps/SuperToken.t.sol +++ b/test/apps/SuperToken.t.sol @@ -1,7 +1,6 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -import {SuperTokenDeployer} from "../../contracts/apps/super-token/SuperTokenDeployer.sol"; import {SuperTokenAppGateway} from "../../contracts/apps/super-token/SuperTokenAppGateway.sol"; import {SuperToken} from "../../contracts/apps/super-token/SuperToken.sol"; import "../DeliveryHelper.t.sol"; @@ -28,7 +27,6 @@ contract SuperTokenTest is DeliveryHelperTest { */ struct AppContracts { SuperTokenAppGateway superTokenApp; - SuperTokenDeployer superTokenDeployer; bytes32 superToken; } @@ -64,25 +62,19 @@ contract SuperTokenTest is DeliveryHelperTest { * - Sets up fee structure and auction manager integration */ function deploySuperTokenApp() internal { - SuperTokenDeployer superTokenDeployer = new SuperTokenDeployer( + SuperTokenAppGateway superTokenApp = new SuperTokenAppGateway( address(addressResolver), - owner, address(auctionManager), + owner, FAST, - SuperTokenDeployer.ConstructorParams({ + createFees(maxFees), + SuperTokenAppGateway.ConstructorParams({ name_: "SUPER TOKEN", symbol_: "SUPER", decimals_: 18, initialSupplyHolder_: owner, initialSupply_: 1000000000 ether - }), - createFees(maxFees) - ); - SuperTokenAppGateway superTokenApp = new SuperTokenAppGateway( - address(addressResolver), - address(superTokenDeployer), - createFees(maxFees), - address(auctionManager) + }) ); // Enable app gateways to do all operations in the Watcher: Read, Write and Schedule on EVMx // Watcher sets the limits for apps in this SOCKET protocol version @@ -90,8 +82,7 @@ contract SuperTokenTest is DeliveryHelperTest { appContracts = AppContracts({ superTokenApp: superTokenApp, - superTokenDeployer: superTokenDeployer, - superToken: superTokenDeployer.superToken() + superToken: superTokenApp.superToken() }); } @@ -103,18 +94,12 @@ contract SuperTokenTest is DeliveryHelperTest { * - Correct setup of forwarder contracts for multi-chain communication */ function testContractDeployment() public { - _deploy( - contractIds, - arbChainSlug, - 1, - appContracts.superTokenDeployer, - address(appContracts.superTokenApp) - ); + _deploy(contractIds, arbChainSlug, 1, IAppGateway(appContracts.superTokenApp)); (address onChain, address forwarder) = getOnChainAndForwarderAddresses( arbChainSlug, appContracts.superToken, - appContracts.superTokenDeployer + IAppGateway(appContracts.superTokenApp) ); assertEq( @@ -140,21 +125,8 @@ contract SuperTokenTest is DeliveryHelperTest { * @dev Deploys necessary contracts on both Arbitrum and Optimism chains */ function beforeTransfer() internal { - _deploy( - contractIds, - arbChainSlug, - 1, - appContracts.superTokenDeployer, - address(appContracts.superTokenApp) - ); - - _deploy( - contractIds, - optChainSlug, - 1, - appContracts.superTokenDeployer, - address(appContracts.superTokenApp) - ); + _deploy(contractIds, arbChainSlug, 1, IAppGateway(appContracts.superTokenApp)); + _deploy(contractIds, optChainSlug, 1, IAppGateway(appContracts.superTokenApp)); } /** @@ -171,13 +143,13 @@ contract SuperTokenTest is DeliveryHelperTest { (address onChainArb, address forwarderArb) = getOnChainAndForwarderAddresses( arbChainSlug, appContracts.superToken, - appContracts.superTokenDeployer + IAppGateway(appContracts.superTokenApp) ); (address onChainOpt, address forwarderOpt) = getOnChainAndForwarderAddresses( optChainSlug, appContracts.superToken, - appContracts.superTokenDeployer + IAppGateway(appContracts.superTokenApp) ); uint256 arbBalanceBefore = SuperToken(onChainArb).balanceOf(owner); diff --git a/test/apps/SuperTokenLockable.t.sol b/test/apps/SuperTokenLockable.t.sol index 1994fe79..5159d62a 100644 --- a/test/apps/SuperTokenLockable.t.sol +++ b/test/apps/SuperTokenLockable.t.sol @@ -1,7 +1,6 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -import {SuperTokenLockableDeployer} from "../../contracts/apps/super-token-lockable/SuperTokenLockableDeployer.sol"; import {SuperTokenLockableAppGateway} from "../../contracts/apps/super-token-lockable/SuperTokenLockableAppGateway.sol"; import {SuperTokenLockable} from "../../contracts/apps/super-token-lockable/SuperTokenLockable.sol"; import {LimitHook} from "../../contracts/apps/super-token-lockable/LimitHook.sol"; @@ -12,7 +11,6 @@ import "../DeliveryHelper.t.sol"; contract SuperTokenLockableTest is DeliveryHelperTest { struct AppContracts { SuperTokenLockableAppGateway superTokenLockableApp; - SuperTokenLockableDeployer superTokenLockableDeployer; bytes32 superTokenLockable; bytes32 limitHook; } @@ -34,12 +32,13 @@ contract SuperTokenLockableTest is DeliveryHelperTest { } function deploySuperTokenApp() internal { - SuperTokenLockableDeployer superTokenLockableDeployer = new SuperTokenLockableDeployer( + SuperTokenLockableAppGateway superTokenLockableApp = new SuperTokenLockableAppGateway( address(addressResolver), - owner, address(auctionManager), + owner, FAST, - SuperTokenLockableDeployer.ConstructorParams({ + createFees(maxFees), + SuperTokenLockableAppGateway.ConstructorParams({ _burnLimit: 10000000000000000000000, _mintLimit: 10000000000000000000000, name_: "SUPER TOKEN", @@ -47,22 +46,14 @@ contract SuperTokenLockableTest is DeliveryHelperTest { decimals_: 18, initialSupplyHolder_: owner, initialSupply_: 1000000000 ether - }), - createFees(maxFees) - ); - SuperTokenLockableAppGateway superTokenLockableApp = new SuperTokenLockableAppGateway( - address(addressResolver), - address(superTokenLockableDeployer), - address(auctionManager), - createFees(maxFees) + }) ); depositFees(address(superTokenLockableApp), createFees(1 ether)); appContracts = AppContracts({ superTokenLockableApp: superTokenLockableApp, - superTokenLockableDeployer: superTokenLockableDeployer, - superTokenLockable: superTokenLockableDeployer.superTokenLockable(), - limitHook: superTokenLockableDeployer.limitHook() + superTokenLockable: superTokenLockableApp.superTokenLockable(), + limitHook: superTokenLockableApp.limitHook() }); } @@ -72,15 +63,13 @@ contract SuperTokenLockableTest is DeliveryHelperTest { PayloadDetails[] memory payloadDetails = new PayloadDetails[](2); payloadDetails[0] = createDeployPayloadDetail( chainSlug_, - address(appContracts.superTokenLockableDeployer), - appContracts.superTokenLockableDeployer.creationCodeWithArgs( - appContracts.superTokenLockable - ) + address(appContracts.superTokenLockableApp), + appContracts.superTokenLockableApp.creationCodeWithArgs(appContracts.superTokenLockable) ); payloadDetails[1] = createDeployPayloadDetail( chainSlug_, - address(appContracts.superTokenLockableDeployer), - appContracts.superTokenLockableDeployer.creationCodeWithArgs(appContracts.limitHook) + address(appContracts.superTokenLockableApp), + appContracts.superTokenLockableApp.creationCodeWithArgs(appContracts.limitHook) ); return payloadDetails; @@ -89,11 +78,11 @@ contract SuperTokenLockableTest is DeliveryHelperTest { function createConfigurePayloadDetailsArray( uint32 chainSlug_ ) internal returns (PayloadDetails[] memory) { - address superTokenForwarder = appContracts.superTokenLockableDeployer.forwarderAddresses( + address superTokenForwarder = appContracts.superTokenLockableApp.forwarderAddresses( appContracts.superTokenLockable, chainSlug_ ); - address limitHookForwarder = appContracts.superTokenLockableDeployer.forwarderAddresses( + address limitHookForwarder = appContracts.superTokenLockableApp.forwarderAddresses( appContracts.limitHook, chainSlug_ ); @@ -105,7 +94,7 @@ contract SuperTokenLockableTest is DeliveryHelperTest { payloadDetails[0] = createExecutePayloadDetail( chainSlug_, deployedToken, - address(appContracts.superTokenLockableDeployer), + address(appContracts.superTokenLockableApp), superTokenForwarder, abi.encodeWithSignature("setLimitHook(address)", deployedLimitHook) ); @@ -144,20 +133,19 @@ contract SuperTokenLockableTest is DeliveryHelperTest { contractIds, arbChainSlug, 2, - appContracts.superTokenLockableDeployer, - address(appContracts.superTokenLockableApp) + IAppGateway(appContracts.superTokenLockableApp) ); (address onChainSuperToken, address forwarderSuperToken) = getOnChainAndForwarderAddresses( arbChainSlug, appContracts.superTokenLockable, - appContracts.superTokenLockableDeployer + IAppGateway(appContracts.superTokenLockableApp) ); (address onChainLimitHook, address forwarderLimitHook) = getOnChainAndForwarderAddresses( arbChainSlug, appContracts.limitHook, - appContracts.superTokenLockableDeployer + IAppGateway(appContracts.superTokenLockableApp) ); assertEq( @@ -208,30 +196,24 @@ contract SuperTokenLockableTest is DeliveryHelperTest { checkPayloadBatchAndDetails( payloadDetails, asyncId, - address(appContracts.superTokenLockableDeployer) + address(appContracts.superTokenLockableApp) ); } function testConfigure() public { - _deploy( - contractIds, - arbChainSlug, - 2, - appContracts.superTokenLockableDeployer, - address(appContracts.superTokenLockableApp) - ); + _deploy(contractIds, arbChainSlug, 2, IAppGateway(appContracts.superTokenLockableApp)); bytes32 asyncId = _executeWriteBatchSingleChain(arbChainSlug, 1); (address onChainSuperToken, ) = getOnChainAndForwarderAddresses( arbChainSlug, appContracts.superTokenLockable, - appContracts.superTokenLockableDeployer + IAppGateway(appContracts.superTokenLockableApp) ); (address onChainLimitHook, ) = getOnChainAndForwarderAddresses( arbChainSlug, appContracts.limitHook, - appContracts.superTokenLockableDeployer + IAppGateway(appContracts.superTokenLockableApp) ); assertEq( address(SuperTokenLockable(onChainSuperToken).limitHook__()), @@ -248,23 +230,11 @@ contract SuperTokenLockableTest is DeliveryHelperTest { } function _deployBridge() internal { - _deploy( - contractIds, - arbChainSlug, - 2, - appContracts.superTokenLockableDeployer, - address(appContracts.superTokenLockableApp) - ); + _deploy(contractIds, arbChainSlug, 2, IAppGateway(appContracts.superTokenLockableApp)); _executeWriteBatchSingleChain(arbChainSlug, 1); - _deploy( - contractIds, - optChainSlug, - 2, - appContracts.superTokenLockableDeployer, - address(appContracts.superTokenLockableApp) - ); + _deploy(contractIds, optChainSlug, 2, IAppGateway(appContracts.superTokenLockableApp)); _executeWriteBatchSingleChain(optChainSlug, 1); } @@ -273,11 +243,11 @@ contract SuperTokenLockableTest is DeliveryHelperTest { _deployBridge(); userOrder = SuperTokenLockableAppGateway.UserOrder({ - srcToken: appContracts.superTokenLockableDeployer.forwarderAddresses( + srcToken: appContracts.superTokenLockableApp.forwarderAddresses( appContracts.superTokenLockable, arbChainSlug ), - dstToken: appContracts.superTokenLockableDeployer.forwarderAddresses( + dstToken: appContracts.superTokenLockableApp.forwarderAddresses( appContracts.superTokenLockable, optChainSlug ), From cc49d1ee6746bb83c1c473797aaae025c89b6669 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Wed, 26 Feb 2025 19:33:46 +0400 Subject: [PATCH 150/186] fix: move apps to tests --- script/counter-inbox/CheckGatewayCounter.s.sol | 2 +- script/counter-inbox/Increment.s.sol | 4 ++-- script/counter/IncrementCountersFromApp.s.sol | 2 +- script/counter/ReadOnchainCounters.s.sol | 4 ++-- script/counter/WithdrawFeesArbitrumFeesPlug.s.sol | 2 +- script/counter/deployEVMxCounterApp.s.sol | 2 +- script/counter/deployOnchainCounters.s.sol | 2 +- script/cron/SetTimeout.s.sol | 2 +- script/parallel-counter/checkCounters.s.sol | 4 ++-- script/parallel-counter/deployOnchain.s.sol | 2 +- script/parallel-counter/incrementCounters.s.sol | 2 +- script/super-token-lockable/Bridge.s.sol | 2 +- script/super-token-lockable/DeployContracts.s.sol | 4 ++-- script/super-token-lockable/DeployGateway.s.sol | 4 ++-- script/super-token/Bridge.s.sol | 2 +- script/super-token/DeployContracts.s.sol | 4 ++-- script/super-token/DeployGateway.s.sol | 4 ++-- test/FeesTest.t.sol | 4 ++-- test/Inbox.t.sol | 4 ++-- test/apps/Counter.t.sol | 4 ++-- test/apps/ParallelCounter.t.sol | 2 +- test/apps/SuperToken.t.sol | 4 ++-- test/apps/SuperTokenLockable.t.sol | 6 +++--- .../apps => test/apps/app-gateways}/counter/Counter.sol | 2 +- .../apps/app-gateways}/counter/CounterAppGateway.sol | 6 +++--- .../apps => test/apps/app-gateways}/counter/ICounter.sol | 0 .../apps/app-gateways}/super-token-lockable/LimitHook.sol | 2 +- .../super-token-lockable/SuperTokenLockable.sol | 2 +- .../super-token-lockable/SuperTokenLockableAppGateway.sol | 4 ++-- .../apps/app-gateways}/super-token/SuperToken.sol | 2 +- .../apps/app-gateways}/super-token/SuperTokenAppGateway.sol | 4 ++-- 31 files changed, 47 insertions(+), 47 deletions(-) rename {contracts/apps => test/apps/app-gateways}/counter/Counter.sol (90%) rename {contracts/apps => test/apps/app-gateways}/counter/CounterAppGateway.sol (96%) rename {contracts/apps => test/apps/app-gateways}/counter/ICounter.sol (100%) rename {contracts/apps => test/apps/app-gateways}/super-token-lockable/LimitHook.sol (96%) rename {contracts/apps => test/apps/app-gateways}/super-token-lockable/SuperTokenLockable.sol (97%) rename {contracts/apps => test/apps/app-gateways}/super-token-lockable/SuperTokenLockableAppGateway.sol (96%) rename {contracts/apps => test/apps/app-gateways}/super-token/SuperToken.sol (95%) rename {contracts/apps => test/apps/app-gateways}/super-token/SuperTokenAppGateway.sol (95%) diff --git a/script/counter-inbox/CheckGatewayCounter.s.sol b/script/counter-inbox/CheckGatewayCounter.s.sol index 563b61d7..ffd80b88 100644 --- a/script/counter-inbox/CheckGatewayCounter.s.sol +++ b/script/counter-inbox/CheckGatewayCounter.s.sol @@ -3,7 +3,7 @@ pragma solidity ^0.8.0; import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/console.sol"; -import {CounterAppGateway} from "../../contracts/apps/counter/CounterAppGateway.sol"; +import {CounterAppGateway} from "../../test/apps/app-gateways/counter/CounterAppGateway.sol"; contract CheckGatewayCounter is Script { function run() external { diff --git a/script/counter-inbox/Increment.s.sol b/script/counter-inbox/Increment.s.sol index 44fb7897..3937d716 100644 --- a/script/counter-inbox/Increment.s.sol +++ b/script/counter-inbox/Increment.s.sol @@ -3,8 +3,8 @@ pragma solidity ^0.8.0; import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/console.sol"; -import {CounterAppGateway} from "../../contracts/apps/counter/CounterAppGateway.sol"; -import {Counter} from "../../contracts/apps/counter/Counter.sol"; +import {CounterAppGateway} from "../../test/apps/app-gateways/counter/CounterAppGateway.sol"; +import {Counter} from "../../test/apps/app-gateways/counter/Counter.sol"; import {Fees} from "../../contracts/protocol/utils/common/Structs.sol"; import {ETH_ADDRESS, FAST} from "../../contracts/protocol/utils/common/Constants.sol"; diff --git a/script/counter/IncrementCountersFromApp.s.sol b/script/counter/IncrementCountersFromApp.s.sol index 704cd065..b63f6c83 100644 --- a/script/counter/IncrementCountersFromApp.s.sol +++ b/script/counter/IncrementCountersFromApp.s.sol @@ -3,7 +3,7 @@ pragma solidity ^0.8.0; import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/console.sol"; -import {CounterAppGateway} from "../../contracts/apps//counter/CounterAppGateway.sol"; +import {CounterAppGateway} from "../../test/apps/app-gateways/counter/CounterAppGateway.sol"; contract IncrementCounters is Script { function run() external { diff --git a/script/counter/ReadOnchainCounters.s.sol b/script/counter/ReadOnchainCounters.s.sol index 3770e927..850f7e9c 100644 --- a/script/counter/ReadOnchainCounters.s.sol +++ b/script/counter/ReadOnchainCounters.s.sol @@ -3,8 +3,8 @@ pragma solidity ^0.8.0; import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/console.sol"; -import {Counter} from "../../contracts/apps//counter/Counter.sol"; -import {CounterAppGateway} from "../../contracts/apps//counter/CounterAppGateway.sol"; +import {Counter} from "../../test/apps/app-gateways/counter/Counter.sol"; +import {CounterAppGateway} from "../../test/apps/app-gateways/counter/CounterAppGateway.sol"; contract CheckCounters is Script { function run() external { diff --git a/script/counter/WithdrawFeesArbitrumFeesPlug.s.sol b/script/counter/WithdrawFeesArbitrumFeesPlug.s.sol index a7dbc9f1..fbebfe6e 100644 --- a/script/counter/WithdrawFeesArbitrumFeesPlug.s.sol +++ b/script/counter/WithdrawFeesArbitrumFeesPlug.s.sol @@ -5,7 +5,7 @@ import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/console.sol"; import {FeesManager} from "../../contracts/protocol/payload-delivery/FeesManager.sol"; import {ETH_ADDRESS} from "../../contracts/protocol/utils/common/Constants.sol"; -import {CounterAppGateway} from "../../contracts/apps/counter/CounterAppGateway.sol"; +import {CounterAppGateway} from "../../test/apps/app-gateways/counter/CounterAppGateway.sol"; contract WithdrawFees is Script { function run() external { diff --git a/script/counter/deployEVMxCounterApp.s.sol b/script/counter/deployEVMxCounterApp.s.sol index 12868719..922baacd 100644 --- a/script/counter/deployEVMxCounterApp.s.sol +++ b/script/counter/deployEVMxCounterApp.s.sol @@ -3,7 +3,7 @@ pragma solidity ^0.8.0; import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/console.sol"; -import {CounterAppGateway} from "../../contracts/apps//counter/CounterAppGateway.sol"; +import {CounterAppGateway} from "../../test/apps/app-gateways/counter/CounterAppGateway.sol"; import {Fees} from "../../contracts/protocol/utils/common/Structs.sol"; import {ETH_ADDRESS, FAST} from "../../contracts/protocol/utils/common/Constants.sol"; diff --git a/script/counter/deployOnchainCounters.s.sol b/script/counter/deployOnchainCounters.s.sol index 123c6958..fd75c155 100644 --- a/script/counter/deployOnchainCounters.s.sol +++ b/script/counter/deployOnchainCounters.s.sol @@ -4,7 +4,7 @@ pragma solidity ^0.8.0; import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/console.sol"; import {ETH_ADDRESS} from "../../contracts/protocol/utils/common/Constants.sol"; -import {CounterAppGateway} from "../../contracts/apps/counter/CounterAppGateway.sol"; +import {CounterAppGateway} from "../../test/apps/app-gateways/counter/CounterAppGateway.sol"; contract CounterDeployOnchain is Script { function run() external { diff --git a/script/cron/SetTimeout.s.sol b/script/cron/SetTimeout.s.sol index 9a8c575a..b58a0925 100644 --- a/script/cron/SetTimeout.s.sol +++ b/script/cron/SetTimeout.s.sol @@ -3,7 +3,7 @@ pragma solidity ^0.8.0; import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/console.sol"; -import {CounterAppGateway} from "../../contracts/apps/counter/CounterAppGateway.sol"; +import {CounterAppGateway} from "../../test/apps/app-gateways/counter/CounterAppGateway.sol"; contract SetTimeoutScript is Script { function run() external { diff --git a/script/parallel-counter/checkCounters.s.sol b/script/parallel-counter/checkCounters.s.sol index 23c0ad53..fa04b108 100644 --- a/script/parallel-counter/checkCounters.s.sol +++ b/script/parallel-counter/checkCounters.s.sol @@ -3,8 +3,8 @@ pragma solidity ^0.8.0; import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/console.sol"; -import {CounterAppGateway} from "../../contracts/apps/counter/CounterAppGateway.sol"; -import {Counter} from "../../contracts/apps/counter/Counter.sol"; +import {CounterAppGateway} from "../../test/apps/app-gateways/counter/CounterAppGateway.sol"; +import {Counter} from "../../test/apps/app-gateways/counter/Counter.sol"; contract CheckCounters is Script { function run() external { diff --git a/script/parallel-counter/deployOnchain.s.sol b/script/parallel-counter/deployOnchain.s.sol index 6bf9811c..d52528ec 100644 --- a/script/parallel-counter/deployOnchain.s.sol +++ b/script/parallel-counter/deployOnchain.s.sol @@ -3,7 +3,7 @@ pragma solidity ^0.8.0; import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/console.sol"; -import {CounterAppGateway} from "../../contracts/apps/counter/CounterAppGateway.sol"; +import {CounterAppGateway} from "../../test/apps/app-gateways/counter/CounterAppGateway.sol"; import {ETH_ADDRESS} from "../../contracts/protocol/utils/common/Constants.sol"; contract CounterDeployOnchain is Script { diff --git a/script/parallel-counter/incrementCounters.s.sol b/script/parallel-counter/incrementCounters.s.sol index c7651085..ab03e084 100644 --- a/script/parallel-counter/incrementCounters.s.sol +++ b/script/parallel-counter/incrementCounters.s.sol @@ -3,7 +3,7 @@ pragma solidity ^0.8.0; import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/console.sol"; -import {CounterAppGateway} from "../../contracts/apps/counter/CounterAppGateway.sol"; +import {CounterAppGateway} from "../../test/apps/app-gateways/counter/CounterAppGateway.sol"; contract IncrementCounters is Script { function run() external { diff --git a/script/super-token-lockable/Bridge.s.sol b/script/super-token-lockable/Bridge.s.sol index abb6875f..34fc36bf 100644 --- a/script/super-token-lockable/Bridge.s.sol +++ b/script/super-token-lockable/Bridge.s.sol @@ -4,7 +4,7 @@ pragma solidity ^0.8.0; import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/console.sol"; -import {SuperTokenLockableAppGateway} from "../../contracts/apps/super-token-lockable/SuperTokenLockableAppGateway.sol"; +import {SuperTokenLockableAppGateway} from "../../test/apps/app-gateways/super-token-lockable/SuperTokenLockableAppGateway.sol"; contract Bridge is Script { function run() external { diff --git a/script/super-token-lockable/DeployContracts.s.sol b/script/super-token-lockable/DeployContracts.s.sol index b1729a85..df001e0f 100644 --- a/script/super-token-lockable/DeployContracts.s.sol +++ b/script/super-token-lockable/DeployContracts.s.sol @@ -3,8 +3,8 @@ pragma solidity ^0.8.0; import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/console.sol"; -import {SuperTokenLockableAppGateway} from "../../contracts/apps/super-token-lockable/SuperTokenLockableAppGateway.sol"; -import {SuperTokenLockable} from "../../contracts/apps/super-token-lockable/SuperTokenLockable.sol"; +import {SuperTokenLockableAppGateway} from "../../test/apps/app-gateways/super-token-lockable/SuperTokenLockableAppGateway.sol"; +import {SuperTokenLockable} from "../../test/apps/app-gateways/super-token-lockable/SuperTokenLockable.sol"; import {Fees} from "../../contracts/protocol/utils/common/Structs.sol"; import {ETH_ADDRESS} from "../../contracts/protocol/utils/common/Constants.sol"; diff --git a/script/super-token-lockable/DeployGateway.s.sol b/script/super-token-lockable/DeployGateway.s.sol index 86ba6018..8a2be2a8 100644 --- a/script/super-token-lockable/DeployGateway.s.sol +++ b/script/super-token-lockable/DeployGateway.s.sol @@ -3,8 +3,8 @@ pragma solidity ^0.8.0; import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/console.sol"; -import {SuperTokenLockableAppGateway} from "../../contracts/apps/super-token-lockable/SuperTokenLockableAppGateway.sol"; -import {SuperTokenLockable} from "../../contracts/apps/super-token-lockable/SuperTokenLockable.sol"; +import {SuperTokenLockableAppGateway} from "../../test/apps/app-gateways/super-token-lockable/SuperTokenLockableAppGateway.sol"; +import {SuperTokenLockable} from "../../test/apps/app-gateways/super-token-lockable/SuperTokenLockable.sol"; import {Fees} from "../../contracts/protocol/utils/common/Structs.sol"; import {ETH_ADDRESS, FAST} from "../../contracts/protocol/utils/common/Constants.sol"; diff --git a/script/super-token/Bridge.s.sol b/script/super-token/Bridge.s.sol index 2f83e781..a5e8aed9 100644 --- a/script/super-token/Bridge.s.sol +++ b/script/super-token/Bridge.s.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.0; import {Script} from "forge-std/Script.sol"; -import {SuperTokenAppGateway} from "../../contracts/apps/super-token/SuperTokenAppGateway.sol"; +import {SuperTokenAppGateway} from "../../test/apps/app-gateways/super-token/SuperTokenAppGateway.sol"; contract Bridge is Script { struct UserOrder { diff --git a/script/super-token/DeployContracts.s.sol b/script/super-token/DeployContracts.s.sol index 37546559..d007bcc3 100644 --- a/script/super-token/DeployContracts.s.sol +++ b/script/super-token/DeployContracts.s.sol @@ -3,8 +3,8 @@ pragma solidity ^0.8.0; import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/console.sol"; -import {SuperTokenAppGateway} from "../../contracts/apps/super-token/SuperTokenAppGateway.sol"; -import {SuperToken} from "../../contracts/apps/super-token/SuperToken.sol"; +import {SuperTokenAppGateway} from "../../test/apps/app-gateways/super-token/SuperTokenAppGateway.sol"; +import {SuperToken} from "../../test/apps/app-gateways/super-token/SuperToken.sol"; import {Fees} from "../../contracts/protocol/utils/common/Structs.sol"; import {ETH_ADDRESS} from "../../contracts/protocol/utils/common/Constants.sol"; diff --git a/script/super-token/DeployGateway.s.sol b/script/super-token/DeployGateway.s.sol index 165f0bcd..61df966a 100644 --- a/script/super-token/DeployGateway.s.sol +++ b/script/super-token/DeployGateway.s.sol @@ -3,8 +3,8 @@ pragma solidity ^0.8.0; import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/console.sol"; -import {SuperTokenAppGateway} from "../../contracts/apps/super-token/SuperTokenAppGateway.sol"; -import {SuperToken} from "../../contracts/apps/super-token/SuperToken.sol"; +import {SuperTokenAppGateway} from "../../test/apps/app-gateways/super-token/SuperTokenAppGateway.sol"; +import {SuperToken} from "../../test/apps/app-gateways/super-token/SuperToken.sol"; import {Fees} from "../../contracts/protocol/utils/common/Structs.sol"; import {ETH_ADDRESS, FAST} from "../../contracts/protocol/utils/common/Constants.sol"; diff --git a/test/FeesTest.t.sol b/test/FeesTest.t.sol index 8a70922e..c04b7a85 100644 --- a/test/FeesTest.t.sol +++ b/test/FeesTest.t.sol @@ -2,8 +2,8 @@ pragma solidity ^0.8.3; import "./DeliveryHelper.t.sol"; -import {Counter} from "../contracts/apps/counter/Counter.sol"; -import {CounterAppGateway} from "../contracts/apps/counter/CounterAppGateway.sol"; +import {Counter} from "./apps/app-gateways/counter/Counter.sol"; +import {CounterAppGateway} from "./apps/app-gateways/counter/CounterAppGateway.sol"; contract FeesTest is DeliveryHelperTest { uint256 constant depositAmount = 1 ether; diff --git a/test/Inbox.t.sol b/test/Inbox.t.sol index e067972f..7a555c77 100644 --- a/test/Inbox.t.sol +++ b/test/Inbox.t.sol @@ -1,8 +1,8 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -import {CounterAppGateway} from "../contracts/apps/counter/CounterAppGateway.sol"; -import {Counter} from "../contracts/apps/counter/Counter.sol"; +import {CounterAppGateway} from "./apps/app-gateways/counter/CounterAppGateway.sol"; +import {Counter} from "./apps/app-gateways/counter/Counter.sol"; import "./DeliveryHelper.t.sol"; contract InboxTest is DeliveryHelperTest { diff --git a/test/apps/Counter.t.sol b/test/apps/Counter.t.sol index ac74c870..2200e655 100644 --- a/test/apps/Counter.t.sol +++ b/test/apps/Counter.t.sol @@ -1,8 +1,8 @@ // SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.21; -import {CounterAppGateway} from "../../contracts/apps/counter/CounterAppGateway.sol"; -import {Counter} from "../../contracts/apps/counter/Counter.sol"; +import {CounterAppGateway} from "./app-gateways/counter/CounterAppGateway.sol"; +import {Counter} from "./app-gateways/counter/Counter.sol"; import "../DeliveryHelper.t.sol"; contract CounterTest is DeliveryHelperTest { diff --git a/test/apps/ParallelCounter.t.sol b/test/apps/ParallelCounter.t.sol index d6c049c7..beec26e5 100644 --- a/test/apps/ParallelCounter.t.sol +++ b/test/apps/ParallelCounter.t.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.21; -import {CounterAppGateway} from "../../contracts/apps/counter/CounterAppGateway.sol"; +import {CounterAppGateway} from "./app-gateways/counter/CounterAppGateway.sol"; import "../DeliveryHelper.t.sol"; contract ParallelCounterTest is DeliveryHelperTest { diff --git a/test/apps/SuperToken.t.sol b/test/apps/SuperToken.t.sol index 379799ef..c3c98bdb 100644 --- a/test/apps/SuperToken.t.sol +++ b/test/apps/SuperToken.t.sol @@ -1,8 +1,8 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -import {SuperTokenAppGateway} from "../../contracts/apps/super-token/SuperTokenAppGateway.sol"; -import {SuperToken} from "../../contracts/apps/super-token/SuperToken.sol"; +import {SuperTokenAppGateway} from "./app-gateways/super-token/SuperTokenAppGateway.sol"; +import {SuperToken} from "./app-gateways/super-token/SuperToken.sol"; import "../DeliveryHelper.t.sol"; import {QUERY, FINALIZE, SCHEDULE} from "../../contracts/protocol/utils/common/Constants.sol"; diff --git a/test/apps/SuperTokenLockable.t.sol b/test/apps/SuperTokenLockable.t.sol index 5159d62a..3bff72d9 100644 --- a/test/apps/SuperTokenLockable.t.sol +++ b/test/apps/SuperTokenLockable.t.sol @@ -1,9 +1,9 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -import {SuperTokenLockableAppGateway} from "../../contracts/apps/super-token-lockable/SuperTokenLockableAppGateway.sol"; -import {SuperTokenLockable} from "../../contracts/apps/super-token-lockable/SuperTokenLockable.sol"; -import {LimitHook} from "../../contracts/apps/super-token-lockable/LimitHook.sol"; +import {SuperTokenLockableAppGateway} from "./app-gateways/super-token-lockable/SuperTokenLockableAppGateway.sol"; +import {SuperTokenLockable} from "./app-gateways/super-token-lockable/SuperTokenLockable.sol"; +import {LimitHook} from "./app-gateways/super-token-lockable/LimitHook.sol"; import {QUERY, FINALIZE, SCHEDULE} from "../../contracts/protocol/utils/common/Constants.sol"; import "../DeliveryHelper.t.sol"; diff --git a/contracts/apps/counter/Counter.sol b/test/apps/app-gateways/counter/Counter.sol similarity index 90% rename from contracts/apps/counter/Counter.sol rename to test/apps/app-gateways/counter/Counter.sol index f2502c33..b4d585ef 100644 --- a/contracts/apps/counter/Counter.sol +++ b/test/apps/app-gateways/counter/Counter.sol @@ -2,7 +2,7 @@ pragma solidity >=0.7.0 <0.9.0; import "solady/auth/Ownable.sol"; -import "../../base/PlugBase.sol"; +import "../../../../contracts/base/PlugBase.sol"; contract Counter is Ownable, PlugBase { uint256 public counter; diff --git a/contracts/apps/counter/CounterAppGateway.sol b/test/apps/app-gateways/counter/CounterAppGateway.sol similarity index 96% rename from contracts/apps/counter/CounterAppGateway.sol rename to test/apps/app-gateways/counter/CounterAppGateway.sol index 0d36d319..1b73aa47 100644 --- a/contracts/apps/counter/CounterAppGateway.sol +++ b/test/apps/app-gateways/counter/CounterAppGateway.sol @@ -1,11 +1,11 @@ // SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.7.0 <0.9.0; -import "../../base/AppGatewayBase.sol"; +import "../../../../contracts/base/AppGatewayBase.sol"; +import "../../../../contracts/interfaces/IForwarder.sol"; +import "../../../../contracts/interfaces/IPromise.sol"; import "./Counter.sol"; import "./ICounter.sol"; -import "../../interfaces/IForwarder.sol"; -import "../../interfaces/IPromise.sol"; contract CounterAppGateway is AppGatewayBase, Ownable { bytes32 public counter = _createContractId("counter"); diff --git a/contracts/apps/counter/ICounter.sol b/test/apps/app-gateways/counter/ICounter.sol similarity index 100% rename from contracts/apps/counter/ICounter.sol rename to test/apps/app-gateways/counter/ICounter.sol diff --git a/contracts/apps/super-token-lockable/LimitHook.sol b/test/apps/app-gateways/super-token-lockable/LimitHook.sol similarity index 96% rename from contracts/apps/super-token-lockable/LimitHook.sol rename to test/apps/app-gateways/super-token-lockable/LimitHook.sol index 76527f5b..d2ac0939 100644 --- a/contracts/apps/super-token-lockable/LimitHook.sol +++ b/test/apps/app-gateways/super-token-lockable/LimitHook.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.0; import {Ownable} from "solady/auth/Ownable.sol"; -import "../../base/PlugBase.sol"; +import "../../../../contracts/base/PlugBase.sol"; contract LimitHook is Ownable, PlugBase { // Define any state variables or functions for the LimitHook contract here diff --git a/contracts/apps/super-token-lockable/SuperTokenLockable.sol b/test/apps/app-gateways/super-token-lockable/SuperTokenLockable.sol similarity index 97% rename from contracts/apps/super-token-lockable/SuperTokenLockable.sol rename to test/apps/app-gateways/super-token-lockable/SuperTokenLockable.sol index 92eb64f1..5aec4aec 100644 --- a/contracts/apps/super-token-lockable/SuperTokenLockable.sol +++ b/test/apps/app-gateways/super-token-lockable/SuperTokenLockable.sol @@ -4,7 +4,7 @@ pragma solidity ^0.8.21; import "solmate/tokens/ERC20.sol"; import {Ownable} from "solady/auth/Ownable.sol"; import {LimitHook} from "./LimitHook.sol"; -import "../../base/PlugBase.sol"; +import "../../../../contracts/base/PlugBase.sol"; /** * @title SuperToken diff --git a/contracts/apps/super-token-lockable/SuperTokenLockableAppGateway.sol b/test/apps/app-gateways/super-token-lockable/SuperTokenLockableAppGateway.sol similarity index 96% rename from contracts/apps/super-token-lockable/SuperTokenLockableAppGateway.sol rename to test/apps/app-gateways/super-token-lockable/SuperTokenLockableAppGateway.sol index ef003ac0..a1b3c125 100644 --- a/contracts/apps/super-token-lockable/SuperTokenLockableAppGateway.sol +++ b/test/apps/app-gateways/super-token-lockable/SuperTokenLockableAppGateway.sol @@ -2,8 +2,8 @@ pragma solidity ^0.8.21; import "solady/auth/Ownable.sol"; -import {ISuperToken} from "../../interfaces/ISuperToken.sol"; -import "../../base/AppGatewayBase.sol"; +import {ISuperToken} from "../../../../contracts/interfaces/ISuperToken.sol"; +import "../../../../contracts/base/AppGatewayBase.sol"; import "./SuperTokenLockable.sol"; import "./LimitHook.sol"; diff --git a/contracts/apps/super-token/SuperToken.sol b/test/apps/app-gateways/super-token/SuperToken.sol similarity index 95% rename from contracts/apps/super-token/SuperToken.sol rename to test/apps/app-gateways/super-token/SuperToken.sol index 17b0ba85..4d7dfe05 100644 --- a/contracts/apps/super-token/SuperToken.sol +++ b/test/apps/app-gateways/super-token/SuperToken.sol @@ -3,7 +3,7 @@ pragma solidity ^0.8.21; import "solmate/tokens/ERC20.sol"; import {Ownable} from "solady/auth/Ownable.sol"; -import "../../base/PlugBase.sol"; +import "../../../../contracts/base/PlugBase.sol"; /** * @title SuperToken diff --git a/contracts/apps/super-token/SuperTokenAppGateway.sol b/test/apps/app-gateways/super-token/SuperTokenAppGateway.sol similarity index 95% rename from contracts/apps/super-token/SuperTokenAppGateway.sol rename to test/apps/app-gateways/super-token/SuperTokenAppGateway.sol index 77f4cf9e..a73b8e39 100644 --- a/contracts/apps/super-token/SuperTokenAppGateway.sol +++ b/test/apps/app-gateways/super-token/SuperTokenAppGateway.sol @@ -2,8 +2,8 @@ pragma solidity ^0.8.21; import "solady/auth/Ownable.sol"; -import "../../base/AppGatewayBase.sol"; -import "../../interfaces/ISuperToken.sol"; +import "../../../../contracts/base/AppGatewayBase.sol"; +import "../../../../contracts/interfaces/ISuperToken.sol"; import "./SuperToken.sol"; contract SuperTokenAppGateway is AppGatewayBase, Ownable { From 03cbd540ef389483f528fd5f04c03a50f2ca6288 Mon Sep 17 00:00:00 2001 From: arthcp Date: Wed, 26 Feb 2025 22:04:31 +0400 Subject: [PATCH 151/186] feat: common order of params --- contracts/interfaces/IWatcherPrecompile.sol | 4 ++-- .../watcherPrecompile/WatcherPrecompile.sol | 14 +++++++------- .../watcherPrecompile/WatcherPrecompileConfig.sol | 4 ++-- test/SetupTest.t.sol | 2 +- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/contracts/interfaces/IWatcherPrecompile.sol b/contracts/interfaces/IWatcherPrecompile.sol index 3a29dc0f..0a54fa6a 100644 --- a/contracts/interfaces/IWatcherPrecompile.sol +++ b/contracts/interfaces/IWatcherPrecompile.sol @@ -67,8 +67,8 @@ interface IWatcherPrecompile { /// @param proof_ The watcher's proof function finalized( bytes32 payloadId_, - uint256 signatureNonce_, bytes calldata proof_, + uint256 signatureNonce_, bytes calldata signature_ ) external; @@ -80,8 +80,8 @@ interface IWatcherPrecompile { /// @notice Resolves multiple promises with their return data /// @param resolvedPromises_ Array of resolved promises and their return data function resolvePromises( - uint256 signatureNonce_, ResolvedPromises[] calldata resolvedPromises_, + uint256 signatureNonce_, bytes calldata signature_ ) external; diff --git a/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol b/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol index 795441e7..966e5342 100644 --- a/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol +++ b/contracts/protocol/watcherPrecompile/WatcherPrecompile.sol @@ -155,8 +155,8 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { bytes calldata signature_ ) external { _isWatcherSignatureValid( - signatureNonce_, abi.encode(this.resolveTimeout.selector, timeoutId_), + signatureNonce_, signature_ ); @@ -307,13 +307,13 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { /// @dev keccak256(abi.encode(switchboard, digest)) function finalized( bytes32 payloadId_, - uint256 signatureNonce_, bytes calldata proof_, + uint256 signatureNonce_, bytes calldata signature_ ) external { _isWatcherSignatureValid( - signatureNonce_, abi.encode(this.finalized.selector, payloadId_, proof_), + signatureNonce_, signature_ ); @@ -325,13 +325,13 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { /// @param resolvedPromises_ Array of resolved promises and their return data /// @dev Only callable by the contract owner function resolvePromises( - uint256 signatureNonce_, ResolvedPromises[] calldata resolvedPromises_, + uint256 signatureNonce_, bytes calldata signature_ ) external { _isWatcherSignatureValid( - signatureNonce_, abi.encode(this.resolvePromises.selector, resolvedPromises_), + signatureNonce_, signature_ ); @@ -368,8 +368,8 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { bytes calldata signature_ ) external { _isWatcherSignatureValid( - signatureNonce_, abi.encode(this.markRevert.selector, isRevertingOnchain_, payloadId_), + signatureNonce_, signature_ ); @@ -421,8 +421,8 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable { bytes calldata signature_ ) external { _isWatcherSignatureValid( - signatureNonce_, abi.encode(this.callAppGateways.selector, params_), + signatureNonce_, signature_ ); diff --git a/contracts/protocol/watcherPrecompile/WatcherPrecompileConfig.sol b/contracts/protocol/watcherPrecompile/WatcherPrecompileConfig.sol index de019e05..0f855adb 100644 --- a/contracts/protocol/watcherPrecompile/WatcherPrecompileConfig.sol +++ b/contracts/protocol/watcherPrecompile/WatcherPrecompileConfig.sol @@ -73,8 +73,8 @@ abstract contract WatcherPrecompileConfig is WatcherPrecompileLimits { bytes calldata signature_ ) external { _isWatcherSignatureValid( - signatureNonce_, abi.encode(this.setAppGateways.selector, configs_), + signatureNonce_, signature_ ); @@ -136,8 +136,8 @@ abstract contract WatcherPrecompileConfig is WatcherPrecompileLimits { } function _isWatcherSignatureValid( - uint256 signatureNonce_, bytes memory digest_, + uint256 signatureNonce_, bytes memory signature_ ) internal { if (isNonceUsed[signatureNonce_]) revert NonceUsed(); diff --git a/test/SetupTest.t.sol b/test/SetupTest.t.sol index e1a52fb9..8103bbd6 100644 --- a/test/SetupTest.t.sol +++ b/test/SetupTest.t.sol @@ -220,7 +220,7 @@ contract SetupTest is Test { bytes memory watcherSignature = _createWatcherSignature( abi.encode(WatcherPrecompile.resolvePromises.selector, resolvedPromises) ); - watcherPrecompile.resolvePromises(signatureNonce++, resolvedPromises, watcherSignature); + watcherPrecompile.resolvePromises(resolvedPromises, signatureNonce++, watcherSignature); } function _createWatcherSignature( From 66a88ada05c2bbb99e01caeaa90e6b8cef474198 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Wed, 26 Feb 2025 22:10:23 +0400 Subject: [PATCH 152/186] feat: sign input in fees manager --- .../app-gateway/FeesManager.sol | 46 +++++++++++++++++-- hardhat-scripts/deploy/1.deploy.ts | 2 +- 2 files changed, 43 insertions(+), 5 deletions(-) diff --git a/contracts/protocol/payload-delivery/app-gateway/FeesManager.sol b/contracts/protocol/payload-delivery/app-gateway/FeesManager.sol index 8c6873de..a210bcb2 100644 --- a/contracts/protocol/payload-delivery/app-gateway/FeesManager.sol +++ b/contracts/protocol/payload-delivery/app-gateway/FeesManager.sol @@ -3,7 +3,7 @@ pragma solidity ^0.8.0; import {Ownable} from "solady/auth/Ownable.sol"; import "solady/utils/Initializable.sol"; - +import "solady/utils/ECDSA.sol"; import {AddressResolverUtil} from "../../../protocol/utils/AddressResolverUtil.sol"; import {Bid, Fees, PayloadDetails, CallType, FinalizeParams, PayloadBatch, Parallel} from "../../../protocol/utils/common/Structs.sol"; import {IDeliveryHelper} from "../../../interfaces/IDeliveryHelper.sol"; @@ -17,6 +17,7 @@ import {NotAuctionManager} from "../../../protocol/utils/common/Errors.sol"; /// @notice Contract for managing fees contract FeesManager is IFeesManager, AddressResolverUtil, Ownable, Initializable { uint256 public feesCounter; + uint32 public evmxSlug; /// @notice Struct containing fee amounts and status struct TokenBalance { @@ -37,6 +38,10 @@ contract FeesManager is IFeesManager, AddressResolverUtil, Ownable, Initializabl /// @dev transmitter => chainSlug => token => amount mapping(address => mapping(uint32 => mapping(address => uint256))) public transmitterFees; + /// @notice Mapping to track nonce to whether it has been used + /// @dev signatureNonce => isValid + mapping(uint256 => bool) public isNonceUsed; + /// @notice Emitted when fees are blocked for a batch /// @param asyncId The batch identifier /// @param chainSlug The chain identifier @@ -92,6 +97,10 @@ contract FeesManager is IFeesManager, AddressResolverUtil, Ownable, Initializabl error NoFeesForTransmitter(); /// @notice Error thrown when no fees was blocked error NoFeesBlocked(); + /// @notice Error thrown when watcher signature is invalid + error InvalidWatcherSignature(); + /// @notice Error thrown when nonce is used + error NonceUsed(); constructor() { _disableInitializers(); // disable for implementation @@ -100,7 +109,13 @@ contract FeesManager is IFeesManager, AddressResolverUtil, Ownable, Initializabl /// @notice Initializer function to replace constructor /// @param addressResolver_ The address of the address resolver /// @param owner_ The address of the owner - function initialize(address addressResolver_, address owner_) public reinitializer(1) { + /// @param evmxSlug_ The evmx chain slug + function initialize( + address addressResolver_, + address owner_, + uint32 evmxSlug_ + ) public reinitializer(1) { + evmxSlug = evmxSlug_; _setAddressResolver(addressResolver_); _initializeOwner(owner_); } @@ -129,8 +144,16 @@ contract FeesManager is IFeesManager, AddressResolverUtil, Ownable, Initializabl uint32 chainSlug_, address originAppGateway_, address token_, - uint256 amount_ - ) external onlyOwner { + uint256 amount_, + uint256 signatureNonce_, + bytes memory signature_ + ) external { + _isWatcherSignatureValid( + signatureNonce_, + abi.encode(chainSlug_, originAppGateway_, token_, amount_), + signature_ + ); + address appGateway = _getCoreAppGateway(originAppGateway_); TokenBalance storage tokenBalance = appGatewayFeeBalances[appGateway][chainSlug_][token_]; @@ -338,4 +361,19 @@ contract FeesManager is IFeesManager, AddressResolverUtil, Ownable, Initializabl function _getFeesPlugAddress(uint32 chainSlug_) internal view returns (address) { return watcherPrecompile__().feesPlug(chainSlug_); } + + function _isWatcherSignatureValid( + uint256 signatureNonce_, + bytes memory digest_, + bytes memory signature_ + ) internal { + if (isNonceUsed[signatureNonce_]) revert NonceUsed(); + isNonceUsed[signatureNonce_] = true; + + bytes32 digest = keccak256(abi.encode(address(this), evmxSlug, signatureNonce_, digest_)); + digest = keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", digest)); + // recovered signer is checked for the valid roles later + address signer = ECDSA.recover(digest, signature_); + if (signer != owner()) revert InvalidWatcherSignature(); + } } diff --git a/hardhat-scripts/deploy/1.deploy.ts b/hardhat-scripts/deploy/1.deploy.ts index a860969a..f023e836 100644 --- a/hardhat-scripts/deploy/1.deploy.ts +++ b/hardhat-scripts/deploy/1.deploy.ts @@ -107,7 +107,7 @@ const deployEVMxContracts = async () => { deployUtils = await deployContractWithProxy( EVMxCoreContracts.FeesManager, `contracts/protocol/payload-delivery/app-gateway/FeesManager.sol`, - [addressResolver.address, EVMxOwner], + [addressResolver.address, EVMxOwner, EVMX_CHAIN_ID], proxyFactory, deployUtils ); From 4b297d6bdba07ec00bba01e8eeec7cf25a2f7757 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Wed, 26 Feb 2025 22:11:31 +0400 Subject: [PATCH 153/186] fix: test --- test/DeliveryHelper.t.sol | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/test/DeliveryHelper.t.sol b/test/DeliveryHelper.t.sol index 74aa39a9..0214ddbb 100644 --- a/test/DeliveryHelper.t.sol +++ b/test/DeliveryHelper.t.sol @@ -49,7 +49,8 @@ contract DeliveryHelperTest is SetupTest { bytes memory feesManagerData = abi.encodeWithSelector( FeesManager.initialize.selector, address(addressResolver), - owner + watcherEOA, + evmxSlug ); vm.expectEmit(true, true, true, false); @@ -203,13 +204,34 @@ contract DeliveryHelperTest is SetupTest { fees_.amount ); - hoax(owner); - feesManager.incrementFeesDeposited( + bytes memory bytesInput = abi.encode( fees_.feePoolChain, appGateway_, fees_.feePoolToken, fees_.amount ); + bytes32 digest = keccak256( + abi.encode(address(feesManager), evmxSlug, signatureNonce, bytesInput) + ); + + digest = keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", digest)); + (uint8 sigV, bytes32 sigR, bytes32 sigS) = vm.sign(watcherPrivateKey, digest); + bytes memory sig = new bytes(65); + bytes1 v32 = bytes1(sigV); + + assembly { + mstore(add(sig, 96), v32) + mstore(add(sig, 32), sigR) + mstore(add(sig, 64), sigS) + } + feesManager.incrementFeesDeposited( + fees_.feePoolChain, + appGateway_, + fees_.feePoolToken, + fees_.amount, + signatureNonce++, + sig + ); } //// BATCH DEPLOY AND EXECUTE HELPERS //// From 73f9969c17691b41a3c8aaff198993b1b61480c4 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Wed, 26 Feb 2025 22:16:07 +0400 Subject: [PATCH 154/186] fix: order --- .../protocol/payload-delivery/app-gateway/FeesManager.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/protocol/payload-delivery/app-gateway/FeesManager.sol b/contracts/protocol/payload-delivery/app-gateway/FeesManager.sol index a210bcb2..736f4191 100644 --- a/contracts/protocol/payload-delivery/app-gateway/FeesManager.sol +++ b/contracts/protocol/payload-delivery/app-gateway/FeesManager.sol @@ -149,8 +149,8 @@ contract FeesManager is IFeesManager, AddressResolverUtil, Ownable, Initializabl bytes memory signature_ ) external { _isWatcherSignatureValid( - signatureNonce_, abi.encode(chainSlug_, originAppGateway_, token_, amount_), + signatureNonce_, signature_ ); @@ -363,8 +363,8 @@ contract FeesManager is IFeesManager, AddressResolverUtil, Ownable, Initializabl } function _isWatcherSignatureValid( - uint256 signatureNonce_, bytes memory digest_, + uint256 signatureNonce_, bytes memory signature_ ) internal { if (isNonceUsed[signatureNonce_]) revert NonceUsed(); From 8668471ac8a98f56fe004c71b9b257d6688a159d Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Thu, 27 Feb 2025 12:28:31 +0400 Subject: [PATCH 155/186] fix: slot comments --- .../WatcherPrecompileStorage.sol | 45 +++++++++---------- 1 file changed, 22 insertions(+), 23 deletions(-) diff --git a/contracts/protocol/watcherPrecompile/WatcherPrecompileStorage.sol b/contracts/protocol/watcherPrecompile/WatcherPrecompileStorage.sol index 640b90b0..a8f11fd7 100644 --- a/contracts/protocol/watcherPrecompile/WatcherPrecompileStorage.sol +++ b/contracts/protocol/watcherPrecompile/WatcherPrecompileStorage.sol @@ -14,90 +14,89 @@ abstract contract WatcherPrecompileStorage is IWatcherPrecompile { // slot 0-49: gap for future storage variables uint256[50] _gap_before; - // slot 50: constant LIMIT_DECIMALS (doesn't use storage) /// @notice Number of decimals used in limit calculations uint256 public constant LIMIT_DECIMALS = 18; - // slot 51: defaultLimit + // slot 50: defaultLimit /// @notice Default limit value for any app gateway uint256 public defaultLimit; - // slot 52: defaultRatePerSecond + // slot 51: defaultRatePerSecond /// @notice Rate at which limit replenishes per second uint256 public defaultRatePerSecond; - // slot 53: evmxChainSlug + // slot 52: evmxSlug /// @notice The chain slug of the watcher precompile - uint32 public evmxChainSlug; + uint32 public evmxSlug; - // slot 54: _limitParams + // slot 53: _limitParams // appGateway => limitType => receivingLimitParams mapping(address => mapping(bytes32 => LimitParams)) internal _limitParams; - // slot 55: _activeAppGateways + // slot 54: _activeAppGateways // Mapping to track active app gateways mapping(address => bool) internal _activeAppGateways; - // slot 56: _plugConfigs + // slot 55: _plugConfigs /// @notice Maps network and plug to their configuration /// @dev chainSlug => plug => PlugConfig mapping(uint32 => mapping(address => PlugConfig)) internal _plugConfigs; - // slot 57: switchboards + // slot 56: switchboards /// @notice Maps chain slug to their associated switchboard /// @dev chainSlug => sb type => switchboard address mapping(uint32 => mapping(bytes32 => address)) public switchboards; - // slot 58: sockets + // slot 57: sockets /// @notice Maps chain slug to their associated socket /// @dev chainSlug => socket address mapping(uint32 => address) public sockets; - // slot 59: contractFactoryPlug + // slot 58: contractFactoryPlug /// @notice Maps chain slug to their associated contract factory plug /// @dev chainSlug => contract factory plug address mapping(uint32 => address) public contractFactoryPlug; - // slot 60: feesPlug + // slot 59: feesPlug /// @notice Maps chain slug to their associated fees plug /// @dev chainSlug => fees plug address mapping(uint32 => address) public feesPlug; - // slot 61: isNonceUsed + // slot 60: isNonceUsed /// @notice Maps nonce to whether it has been used /// @dev signatureNonce => isValid mapping(uint256 => bool) public isNonceUsed; - // slot 62: isValidPlug + // slot 61: isValidPlug // appGateway => chainSlug => plug => isValid mapping(address => mapping(uint32 => mapping(address => bool))) public isValidPlug; - // slot 63: maxTimeoutDelayInSeconds + // slot 62: maxTimeoutDelayInSeconds uint256 public maxTimeoutDelayInSeconds; - // slot 64: payloadCounter + // slot 63: payloadCounter /// @notice Counter for tracking payload requests uint256 public payloadCounter; - // slot 65: expiryTime + // slot 64: expiryTime /// @notice The expiry time for the payload uint256 public expiryTime; - // slot 66: asyncRequests + // slot 65: asyncRequests /// @notice Mapping to store async requests /// @dev payloadId => AsyncRequest struct mapping(bytes32 => AsyncRequest) public asyncRequests; - // slot 67: timeoutRequests + // slot 66: timeoutRequests /// @notice Mapping to store timeout requests /// @dev timeoutId => TimeoutRequest struct mapping(bytes32 => TimeoutRequest) public timeoutRequests; - // slot 68: watcherProofs + // slot 67: watcherProofs /// @notice Mapping to store watcher proofs /// @dev payloadId => proof bytes mapping(bytes32 => bytes) public watcherProofs; - // slot 69: appGatewayCalled + // slot 68: appGatewayCalled /// @notice Mapping to store if appGateway has been called with trigger from on-chain Inbox /// @dev callId => bool mapping(bytes32 => bool) public appGatewayCalled; - // slots 70-119: gap for future storage variables - uint256[50] _gap_after; + // slots 69-119: gap for future storage variables + uint256[51] _gap_after; } From 86ff37ffbc65447532f98719a47a6844649f9b02 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Thu, 27 Feb 2025 12:28:56 +0400 Subject: [PATCH 156/186] fix: comment --- contracts/protocol/payload-delivery/FeesManager.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/protocol/payload-delivery/FeesManager.sol b/contracts/protocol/payload-delivery/FeesManager.sol index b5bc3781..c43e8a39 100644 --- a/contracts/protocol/payload-delivery/FeesManager.sol +++ b/contracts/protocol/payload-delivery/FeesManager.sol @@ -45,7 +45,7 @@ abstract contract FeesManagerStorage is IFeesManager { // slot 54 /// @notice Mapping to track nonce to whether it has been used - /// @dev signatureNonce => isValid + /// @dev signatureNonce => isNonceUsed mapping(uint256 => bool) public isNonceUsed; // slots [55-104] reserved for gap From 578a685a010586706e4d8cc17dc45d4618e1325b Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Thu, 27 Feb 2025 12:33:56 +0400 Subject: [PATCH 157/186] fix: moved gaps to top --- .../protocol/payload-delivery/app-gateway/BatchAsync.sol | 6 +++--- .../protocol/payload-delivery/app-gateway/QueueAsync.sol | 5 ++--- contracts/protocol/utils/AccessControl.sol | 5 +++-- contracts/protocol/utils/AddressResolverUtil.sol | 6 +++--- contracts/protocol/utils/Gauge.sol | 6 +++--- .../protocol/watcherPrecompile/WatcherPrecompileConfig.sol | 6 +++--- .../protocol/watcherPrecompile/WatcherPrecompileLimits.sol | 5 ++--- 7 files changed, 19 insertions(+), 20 deletions(-) diff --git a/contracts/protocol/payload-delivery/app-gateway/BatchAsync.sol b/contracts/protocol/payload-delivery/app-gateway/BatchAsync.sol index 634709e8..578b47aa 100644 --- a/contracts/protocol/payload-delivery/app-gateway/BatchAsync.sol +++ b/contracts/protocol/payload-delivery/app-gateway/BatchAsync.sol @@ -6,6 +6,9 @@ import "./QueueAsync.sol"; /// @title BatchAsync /// @notice Abstract contract for managing asynchronous payload batches abstract contract BatchAsync is QueueAsync { + // slots [211-260] reserved for gap + uint256[50] _gap_batch_async; + /// @notice Error thrown when attempting to executed payloads after all have been executed error AllPayloadsExecuted(); /// @notice Error thrown request did not come from Forwarder address @@ -310,7 +313,4 @@ abstract contract BatchAsync is QueueAsync { ); _deliverPayload(payloadDetailsArray, fees_, auctionManager_, new bytes(0)); } - - // slots [211-260] reserved for gap - uint256[50] _gap_batch_async; } diff --git a/contracts/protocol/payload-delivery/app-gateway/QueueAsync.sol b/contracts/protocol/payload-delivery/app-gateway/QueueAsync.sol index 9b9d36ab..34284598 100644 --- a/contracts/protocol/payload-delivery/app-gateway/QueueAsync.sol +++ b/contracts/protocol/payload-delivery/app-gateway/QueueAsync.sol @@ -11,6 +11,8 @@ import "./DeliveryHelperStorage.sol"; /// @notice Abstract contract for managing asynchronous payloads abstract contract QueueAsync is DeliveryHelperStorage, Initializable, Ownable, AddressResolverUtil { // slots [0-108] reserved for delivery helper storage and [109-160] reserved for addr resolver util + // slots [161-210] reserved for gap + uint256[50] _gap_queue_async; event PayloadBatchCancelled(bytes32 asyncId); event BidTimeoutUpdated(uint256 newBidTimeout); @@ -164,7 +166,4 @@ abstract contract QueueAsync is DeliveryHelperStorage, Initializable, Ownable, A function getAsyncBatchDetails(bytes32 asyncId_) external view returns (PayloadBatch memory) { return _payloadBatches[asyncId_]; } - - // slots [161-210] reserved for gap - uint256[50] _gap_queue_async; } diff --git a/contracts/protocol/utils/AccessControl.sol b/contracts/protocol/utils/AccessControl.sol index 6086e354..d96dabaa 100644 --- a/contracts/protocol/utils/AccessControl.sol +++ b/contracts/protocol/utils/AccessControl.sol @@ -15,6 +15,9 @@ abstract contract AccessControl is Ownable { */ mapping(bytes32 => mapping(address => bool)) private _permits; + // slots 0-49: gap for future storage variables + uint256[50] _gap_access_control; + /** * @dev Emitted when a role is granted to an address. */ @@ -105,6 +108,4 @@ abstract contract AccessControl is Ownable { function _hasRole(bytes32 role_, address address_) internal view returns (bool) { return _permits[role_][address_]; } - - uint256[50] _gap_access_control; } diff --git a/contracts/protocol/utils/AddressResolverUtil.sol b/contracts/protocol/utils/AddressResolverUtil.sol index 7862aab6..38005e15 100644 --- a/contracts/protocol/utils/AddressResolverUtil.sol +++ b/contracts/protocol/utils/AddressResolverUtil.sol @@ -14,6 +14,9 @@ abstract contract AddressResolverUtil { // slot 0 IAddressResolver public addressResolver__; + // slots 1-50 reserved for future use + uint256[50] __gap_resolver_util; + /// @notice Error thrown when an invalid address attempts to call the Payload Delivery only function error OnlyPayloadDelivery(); /// @notice Error thrown when an invalid address attempts to call the Watcher only function @@ -66,7 +69,4 @@ abstract contract AddressResolverUtil { appGateway = addressResolver__.contractsToGateways(originAppGateway_); if (appGateway == address(0)) appGateway = originAppGateway_; } - - // slots 1-50 reserved for future use - uint256[50] __gap_resolver_util; } diff --git a/contracts/protocol/utils/Gauge.sol b/contracts/protocol/utils/Gauge.sol index 3fde631f..0a0d7b59 100644 --- a/contracts/protocol/utils/Gauge.sol +++ b/contracts/protocol/utils/Gauge.sol @@ -4,6 +4,9 @@ import {LimitParams} from "../utils/common/Structs.sol"; import {LimitReached} from "../utils/common/Errors.sol"; abstract contract Gauge { + // slot 0-49: gap for future storage variables + uint256[50] _gap_gauge; + function _getCurrentLimit(LimitParams storage params_) internal view returns (uint256 _limit) { uint256 timeElapsed = block.timestamp - params_.lastUpdateTimestamp; uint256 limitIncrease = timeElapsed * params_.ratePerSecond; @@ -41,7 +44,4 @@ abstract contract Gauge { revert LimitReached(); } } - - // slot 0-49: gap for future storage variables - uint256[50] _gap_gauge; } diff --git a/contracts/protocol/watcherPrecompile/WatcherPrecompileConfig.sol b/contracts/protocol/watcherPrecompile/WatcherPrecompileConfig.sol index d80f4a9f..8ea88b68 100644 --- a/contracts/protocol/watcherPrecompile/WatcherPrecompileConfig.sol +++ b/contracts/protocol/watcherPrecompile/WatcherPrecompileConfig.sol @@ -8,6 +8,9 @@ import {ECDSA} from "solady/utils/ECDSA.sol"; /// @notice Configuration contract for the Watcher Precompile system /// @dev Handles the mapping between networks, plugs, and app gateways for payload execution abstract contract WatcherPrecompileConfig is WatcherPrecompileLimits { + // slot 324-374: gap for future storage variables + uint256[50] _gap_watcher_precompile_config; + /// @notice Emitted when a new plug is configured for an app gateway /// @param appGateway The address of the app gateway /// @param chainSlug The identifier of the destination network @@ -123,7 +126,4 @@ abstract contract WatcherPrecompileConfig is WatcherPrecompileLimits { address signer = ECDSA.recover(digest, signature_); if (signer != owner()) revert InvalidWatcherSignature(); } - - // slot 324-374: gap for future storage variables - uint256[50] _gap_watcher_precompile_config; } diff --git a/contracts/protocol/watcherPrecompile/WatcherPrecompileLimits.sol b/contracts/protocol/watcherPrecompile/WatcherPrecompileLimits.sol index e21eaff6..9a01a7f2 100644 --- a/contracts/protocol/watcherPrecompile/WatcherPrecompileLimits.sol +++ b/contracts/protocol/watcherPrecompile/WatcherPrecompileLimits.sol @@ -21,6 +21,8 @@ abstract contract WatcherPrecompileLimits is // slots 120-170: access control // slots 171-221: gauge // slots 222-272: address resolver util + // slots 273-323: gap for future storage variables + uint256[50] _gap_watcher_precompile_limits; //////////////////////////////////////////////////////// ////////////////////// EVENTS ////////////////////////// @@ -172,7 +174,4 @@ abstract contract WatcherPrecompileLimits is function setDefaultRatePerSecond(uint256 defaultRatePerSecond_) external onlyOwner { defaultRatePerSecond = defaultRatePerSecond_; } - - // slots 273-323: gap for future storage variables - uint256[50] _gap_watcher_precompile_limits; } From 4c7cb800b793b5d8841b94fe3d77ab761fda1ed9 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Thu, 27 Feb 2025 12:35:12 +0400 Subject: [PATCH 158/186] fix: build --- test/mock/MockSocket.sol | 6 +++--- test/mock/MockWatcherPrecompile.sol | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/test/mock/MockSocket.sol b/test/mock/MockSocket.sol index d6a4c96e..98c87f09 100644 --- a/test/mock/MockSocket.sol +++ b/test/mock/MockSocket.sol @@ -1,9 +1,9 @@ // SPDX-License-Identifier: GPL-3.0-only pragma solidity ^0.8.21; -import {PlugDisconnected, InvalidAppGateway} from "../protocol/utils/common/Errors.sol"; -import "../interfaces/ISwitchboard.sol"; -import "../interfaces/ISocket.sol"; +import {PlugDisconnected, InvalidAppGateway} from "../../contracts/protocol/utils/common/Errors.sol"; +import "../../contracts/interfaces/ISwitchboard.sol"; +import "../../contracts/interfaces/ISocket.sol"; /** * @title SocketDst diff --git a/test/mock/MockWatcherPrecompile.sol b/test/mock/MockWatcherPrecompile.sol index 93f9b3c5..d1886b89 100644 --- a/test/mock/MockWatcherPrecompile.sol +++ b/test/mock/MockWatcherPrecompile.sol @@ -1,13 +1,13 @@ // SPDX-License-Identifier: Unlicense pragma solidity ^0.8.21; -import "../interfaces/IAppGateway.sol"; -import "../interfaces/IWatcherPrecompile.sol"; -import "../interfaces/IPromise.sol"; +import "../../contracts/interfaces/IAppGateway.sol"; +import "../../contracts/interfaces/IWatcherPrecompile.sol"; +import "../../contracts/interfaces/IPromise.sol"; -import {PayloadDigestParams, AsyncRequest, FinalizeParams, TimeoutRequest, CallFromChainParams, PlugConfig, ResolvedPromises, AppGatewayConfig} from "../protocol/utils/common/Structs.sol"; -import {QUERY, FINALIZE, SCHEDULE} from "../protocol/utils/common/Constants.sol"; -import {TimeoutDelayTooLarge, TimeoutAlreadyResolved, InvalidInboxCaller, ResolvingTimeoutTooEarly, CallFailed, AppGatewayAlreadyCalled} from "../protocol/utils/common/Errors.sol"; +import {PayloadDigestParams, AsyncRequest, FinalizeParams, TimeoutRequest, CallFromChainParams, PlugConfig, ResolvedPromises, AppGatewayConfig} from "../../contracts/protocol/utils/common/Structs.sol"; +import {QUERY, FINALIZE, SCHEDULE} from "../../contracts/protocol/utils/common/Constants.sol"; +import {TimeoutDelayTooLarge, TimeoutAlreadyResolved, InvalidInboxCaller, ResolvingTimeoutTooEarly, CallFailed, AppGatewayAlreadyCalled} from "../../contracts/protocol/utils/common/Errors.sol"; import "solady/utils/ERC1967Factory.sol"; /// @title WatcherPrecompile From 99c08ea8450dc9d0fcb08aad4bccc66495089495 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Thu, 27 Feb 2025 12:56:53 +0400 Subject: [PATCH 159/186] fix: slot comments --- .../protocol/payload-delivery/AuctionManager.sol | 2 +- .../protocol/payload-delivery/FeesManager.sol | 14 ++++++++------ .../payload-delivery/app-gateway/BatchAsync.sol | 2 +- .../payload-delivery/app-gateway/QueueAsync.sol | 4 ++-- contracts/protocol/utils/AccessControl.sol | 3 ++- .../watcherPrecompile/WatcherPrecompileConfig.sol | 2 +- .../watcherPrecompile/WatcherPrecompileLimits.sol | 8 ++++---- .../watcherPrecompile/WatcherPrecompileStorage.sol | 4 ++-- 8 files changed, 21 insertions(+), 18 deletions(-) diff --git a/contracts/protocol/payload-delivery/AuctionManager.sol b/contracts/protocol/payload-delivery/AuctionManager.sol index c0209183..dd12f475 100644 --- a/contracts/protocol/payload-delivery/AuctionManager.sol +++ b/contracts/protocol/payload-delivery/AuctionManager.sol @@ -36,7 +36,7 @@ abstract contract AuctionManagerStorage is IAuctionManager { // slots [55-104] reserved for gap uint256[50] _gap_after; - // slots 105-156 reserved for addr resolver util + // slots 105-155 reserved for addr resolver util } /// @title AuctionManager diff --git a/contracts/protocol/payload-delivery/FeesManager.sol b/contracts/protocol/payload-delivery/FeesManager.sol index c43e8a39..58a9323f 100644 --- a/contracts/protocol/payload-delivery/FeesManager.sol +++ b/contracts/protocol/payload-delivery/FeesManager.sol @@ -19,6 +19,8 @@ abstract contract FeesManagerStorage is IFeesManager { // slot 50 uint256 public feesCounter; + + // slot 51 uint32 public evmxSlug; /// @notice Struct containing fee amounts and status @@ -27,31 +29,31 @@ abstract contract FeesManagerStorage is IFeesManager { uint256 blocked; // Amount blocked } - // slot 51 + // slot 52 /// @notice Master mapping tracking all fee information /// @dev appGateway => chainSlug => token => TokenBalance mapping(address => mapping(uint32 => mapping(address => TokenBalance))) public appGatewayFeeBalances; - // slot 52 + // slot 53 /// @notice Mapping to track blocked fees for each async id /// @dev asyncId => Fees mapping(bytes32 => Fees) public asyncIdBlockedFees; - // slot 53 + // slot 54 /// @notice Mapping to track fees to be distributed to transmitters /// @dev transmitter => chainSlug => token => amount mapping(address => mapping(uint32 => mapping(address => uint256))) public transmitterFees; - // slot 54 + // slot 55 /// @notice Mapping to track nonce to whether it has been used /// @dev signatureNonce => isNonceUsed mapping(uint256 => bool) public isNonceUsed; - // slots [55-104] reserved for gap + // slots [56-105] reserved for gap uint256[50] _gap_after; - // slots 105-154 reserved for addr resolver util + // slots 106-156 reserved for addr resolver util } /// @title FeesManager diff --git a/contracts/protocol/payload-delivery/app-gateway/BatchAsync.sol b/contracts/protocol/payload-delivery/app-gateway/BatchAsync.sol index 578b47aa..f4415f3c 100644 --- a/contracts/protocol/payload-delivery/app-gateway/BatchAsync.sol +++ b/contracts/protocol/payload-delivery/app-gateway/BatchAsync.sol @@ -6,7 +6,7 @@ import "./QueueAsync.sol"; /// @title BatchAsync /// @notice Abstract contract for managing asynchronous payload batches abstract contract BatchAsync is QueueAsync { - // slots [211-260] reserved for gap + // slots [210-259] reserved for gap uint256[50] _gap_batch_async; /// @notice Error thrown when attempting to executed payloads after all have been executed diff --git a/contracts/protocol/payload-delivery/app-gateway/QueueAsync.sol b/contracts/protocol/payload-delivery/app-gateway/QueueAsync.sol index 34284598..c08b0f93 100644 --- a/contracts/protocol/payload-delivery/app-gateway/QueueAsync.sol +++ b/contracts/protocol/payload-delivery/app-gateway/QueueAsync.sol @@ -10,8 +10,8 @@ import "./DeliveryHelperStorage.sol"; /// @notice Abstract contract for managing asynchronous payloads abstract contract QueueAsync is DeliveryHelperStorage, Initializable, Ownable, AddressResolverUtil { - // slots [0-108] reserved for delivery helper storage and [109-160] reserved for addr resolver util - // slots [161-210] reserved for gap + // slots [0-108] reserved for delivery helper storage and [109-159] reserved for addr resolver util + // slots [160-209] reserved for gap uint256[50] _gap_queue_async; event PayloadBatchCancelled(bytes32 asyncId); diff --git a/contracts/protocol/utils/AccessControl.sol b/contracts/protocol/utils/AccessControl.sol index d96dabaa..c25f0645 100644 --- a/contracts/protocol/utils/AccessControl.sol +++ b/contracts/protocol/utils/AccessControl.sol @@ -12,10 +12,11 @@ import "solady/auth/Ownable.sol"; abstract contract AccessControl is Ownable { /** * @dev A mapping of roles to a mapping of addresses to boolean values indicating whether or not they have the role. + * @dev slot 0 */ mapping(bytes32 => mapping(address => bool)) private _permits; - // slots 0-49: gap for future storage variables + // slots 1-50: gap for future storage variables uint256[50] _gap_access_control; /** diff --git a/contracts/protocol/watcherPrecompile/WatcherPrecompileConfig.sol b/contracts/protocol/watcherPrecompile/WatcherPrecompileConfig.sol index 8ea88b68..ca5e6fac 100644 --- a/contracts/protocol/watcherPrecompile/WatcherPrecompileConfig.sol +++ b/contracts/protocol/watcherPrecompile/WatcherPrecompileConfig.sol @@ -8,7 +8,7 @@ import {ECDSA} from "solady/utils/ECDSA.sol"; /// @notice Configuration contract for the Watcher Precompile system /// @dev Handles the mapping between networks, plugs, and app gateways for payload execution abstract contract WatcherPrecompileConfig is WatcherPrecompileLimits { - // slot 324-374: gap for future storage variables + // slot 322-371: gap for future storage variables uint256[50] _gap_watcher_precompile_config; /// @notice Emitted when a new plug is configured for an app gateway diff --git a/contracts/protocol/watcherPrecompile/WatcherPrecompileLimits.sol b/contracts/protocol/watcherPrecompile/WatcherPrecompileLimits.sol index 9a01a7f2..6f2cbcd8 100644 --- a/contracts/protocol/watcherPrecompile/WatcherPrecompileLimits.sol +++ b/contracts/protocol/watcherPrecompile/WatcherPrecompileLimits.sol @@ -18,10 +18,10 @@ abstract contract WatcherPrecompileLimits is // Slots from parent contracts: // slot 0-119: watcher precompile storage // 0 slots for initializable and ownable - // slots 120-170: access control - // slots 171-221: gauge - // slots 222-272: address resolver util - // slots 273-323: gap for future storage variables + // slots 120-170: access control (gap + 1) + // slots 171-220: gauge (gap) + // slots 221-271: address resolver util (gap + 1) + // slots 272-321: gap for future storage variables uint256[50] _gap_watcher_precompile_limits; //////////////////////////////////////////////////////// diff --git a/contracts/protocol/watcherPrecompile/WatcherPrecompileStorage.sol b/contracts/protocol/watcherPrecompile/WatcherPrecompileStorage.sol index a8f11fd7..e5142824 100644 --- a/contracts/protocol/watcherPrecompile/WatcherPrecompileStorage.sol +++ b/contracts/protocol/watcherPrecompile/WatcherPrecompileStorage.sol @@ -97,6 +97,6 @@ abstract contract WatcherPrecompileStorage is IWatcherPrecompile { /// @dev callId => bool mapping(bytes32 => bool) public appGatewayCalled; - // slots 69-119: gap for future storage variables - uint256[51] _gap_after; + // slots 69-118: gap for future storage variables + uint256[50] _gap_after; } From f8eb3fb6dc6c258eb19a3320d4a0a99088d338b2 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Thu, 27 Feb 2025 14:43:48 +0400 Subject: [PATCH 160/186] test: slot --- contracts/protocol/AsyncPromise.sol | 18 ++--- .../WatcherPrecompileLimits.sol | 10 +-- test/Storage.t.sol | 75 +++++++++++++++++++ 3 files changed, 88 insertions(+), 15 deletions(-) create mode 100644 test/Storage.t.sol diff --git a/contracts/protocol/AsyncPromise.sol b/contracts/protocol/AsyncPromise.sol index 869601c3..4f5b0664 100644 --- a/contracts/protocol/AsyncPromise.sol +++ b/contracts/protocol/AsyncPromise.sol @@ -20,34 +20,32 @@ abstract contract AsyncPromiseStorage is IPromise { uint256[50] _gap_before; // slot 50 + // bytes1 /// @notice The callback selector to be called on the invoker. bytes4 public callbackSelector; - - // slot 51 + // bytes4 /// @notice Indicates whether the promise has been resolved. bool public override resolved; - - // slot 52 + // bytes8 /// @notice The current state of the async promise. AsyncPromiseState public state; - - // slot 53 + // bytes20 /// @notice The local contract which initiated the async call. /// @dev The callback will be executed on this address address public localInvoker; - // slot 54 + // slot 51 /// @notice The forwarder address which can call the callback address public forwarder; - // slot 55 + // slot 52 /// @notice The callback data to be used when the promise is resolved. bytes public callbackData; - // slots [56-105] reserved for gap + // slots [53-102] reserved for gap uint256[50] _gap_after; - // slots 106-157 reserved for addr resolver util + // slots 103-154 reserved for addr resolver util } /// @title AsyncPromise diff --git a/contracts/protocol/watcherPrecompile/WatcherPrecompileLimits.sol b/contracts/protocol/watcherPrecompile/WatcherPrecompileLimits.sol index 6f2cbcd8..7f62d344 100644 --- a/contracts/protocol/watcherPrecompile/WatcherPrecompileLimits.sol +++ b/contracts/protocol/watcherPrecompile/WatcherPrecompileLimits.sol @@ -16,12 +16,12 @@ abstract contract WatcherPrecompileLimits is AddressResolverUtil { // Slots from parent contracts: - // slot 0-119: watcher precompile storage + // slot 0-118: watcher precompile storage // 0 slots for initializable and ownable - // slots 120-170: access control (gap + 1) - // slots 171-220: gauge (gap) - // slots 221-271: address resolver util (gap + 1) - // slots 272-321: gap for future storage variables + // slots 119-169: access control (gap + 1) + // slots 170-219: gauge (gap) + // slots 220-270: address resolver util (gap + 1) + // slots 271-320: gap for future storage variables uint256[50] _gap_watcher_precompile_limits; //////////////////////////////////////////////////////// diff --git a/test/Storage.t.sol b/test/Storage.t.sol new file mode 100644 index 00000000..d5e91d60 --- /dev/null +++ b/test/Storage.t.sol @@ -0,0 +1,75 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import "./DeliveryHelper.t.sol"; + +contract StorageTest is DeliveryHelperTest { + DeliveryHelper public deliveryHelperImpl; + + function setUp() public { + setUpDeliveryHelper(); + } + + function testAddressResolverSlot() public { + // Test AddressResolver version at slot 59 + bytes32 versionSlot = vm.load(address(addressResolver), bytes32(uint256(59))); + assertEq(uint64(uint256(versionSlot)), 1); + } + + function testWatcherPrecompileSlot() public { + // Test AddressResolver address at slot 109 in WatcherPrecompile + bytes32 slotValue = vm.load(address(watcherPrecompile), bytes32(uint256(52))); + assertEq(uint256(slotValue), evmxSlug); + + slotValue = vm.load(address(watcherPrecompile), bytes32(uint256(220))); + assertEq(address(uint160(uint256(slotValue))), address(addressResolver)); + } + + function testFeesManagerSlot() public { + bytes32 slotValue = vm.load(address(feesManager), bytes32(uint256(51))); + assertEq(uint32(uint256(slotValue)), evmxSlug); + + slotValue = vm.load(address(feesManager), bytes32(uint256(106))); + assertEq(address(uint160(uint256(slotValue))), address(addressResolver)); + } + + function testAuctionManagerSlot() public { + bytes32 slotValue = vm.load(address(auctionManager), bytes32(uint256(50))); + assertEq(uint32(uint256(slotValue)), evmxSlug); + + slotValue = vm.load(address(auctionManager), bytes32(uint256(105))); + assertEq(address(uint160(uint256(slotValue))), address(addressResolver)); + } + + function testForwarderSlot() public { + address forwarder = addressResolver.getOrDeployForwarderContract( + address(this), + address(this), + evmxSlug + ); + + bytes32 slotValue = vm.load(address(forwarder), bytes32(uint256(50))); + assertEq(uint32(uint256(slotValue)), evmxSlug); + + slotValue = vm.load(address(forwarder), bytes32(uint256(53))); + assertEq(address(uint160(uint256(slotValue))), address(0)); + } + + function testAsyncPromiseSlot() public { + address asyncPromise = addressResolver.deployAsyncPromiseContract(address(this)); + + bytes32 slotValue = vm.load(address(asyncPromise), bytes32(uint256(51))); + assertEq(address(uint160(uint256(slotValue))), address(this)); + + slotValue = vm.load(address(asyncPromise), bytes32(uint256(103))); + assertEq(address(uint160(uint256(slotValue))), address(addressResolver)); + } + + function testDeliveryHelperSlot() public { + bytes32 slotValue = vm.load(address(deliveryHelper), bytes32(uint256(50))); + assertEq(uint256(uint256(slotValue)), 0); + + slotValue = vm.load(address(deliveryHelper), bytes32(uint256(109))); + assertEq(address(uint160(uint256(slotValue))), address(addressResolver)); + } +} From 1fb422c54b74af6f22a5f6ca9eeb65b6cb0e9918 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Thu, 27 Feb 2025 14:52:06 +0400 Subject: [PATCH 161/186] fix: remove interface --- contracts/interfaces/IMultiChainAppDeployer.sol | 9 --------- 1 file changed, 9 deletions(-) delete mode 100644 contracts/interfaces/IMultiChainAppDeployer.sol diff --git a/contracts/interfaces/IMultiChainAppDeployer.sol b/contracts/interfaces/IMultiChainAppDeployer.sol deleted file mode 100644 index 37bd04ad..00000000 --- a/contracts/interfaces/IMultiChainAppDeployer.sol +++ /dev/null @@ -1,9 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.21; - -/// @title IMultiChainAppDeployer -/// @notice Interface for the multi-chain app deployer -interface IMultiChainAppDeployer { - /// @notice deploy contracts to multiple chains - function deployMultiChainContracts(uint32[] memory chainSlugs_) external; -} From 45700468f8b6ab0863f420b6e22e236b7778ed36 Mon Sep 17 00:00:00 2001 From: Akash Date: Thu, 27 Feb 2025 14:54:00 +0400 Subject: [PATCH 162/186] feat: watcher sig fix --- Errors.md | 318 ++++++++++++++-------------- deployments/dev_addresses.json | 64 +++--- deployments/dev_verification.json | 165 +++++++++++++-- deployments/local_addresses.json | 3 + deployments/stage_addresses.json | 49 +---- deployments/stage_verification.json | 93 +------- hardhat-scripts/deploy/1.deploy.ts | 8 +- hardhat-scripts/deploy/4.connect.ts | 12 +- hardhat-scripts/deploy/5.upload.ts | 19 +- hardhat-scripts/utils/networks.ts | 5 +- hardhat-scripts/utils/sign.ts | 24 +++ hardhat-scripts/verify/verify.ts | 5 +- package.json | 15 +- setupInfraContracts.sh | 2 +- testScript.sh | 6 +- yarn.lock | 18 +- 16 files changed, 417 insertions(+), 389 deletions(-) create mode 100644 deployments/local_addresses.json create mode 100644 hardhat-scripts/utils/sign.ts diff --git a/Errors.md b/Errors.md index 506cf6d3..2100d8eb 100644 --- a/Errors.md +++ b/Errors.md @@ -1,209 +1,207 @@ # Custom Error Codes -## AddressResolver.sol -| Error | Signature | -| -------------------------------------------------------- | ------------ | -| `AppGatewayContractAlreadySetByDifferentSender(address)` | `0xbe1ef5f1` | - -## AsyncPromise.sol - -| Error | Signature | -| ------------------------------- | ------------ | -| `PromiseAlreadyResolved()` | `0x56b63537` | -| `OnlyForwarderOrLocalInvoker()` | `0xa9fb0b28` | -| `PromiseAlreadySetUp()` | `0x927c53d5` | -| `PromiseRevertFailed()` | `0x0175b9de` | +## apps/super-token-lockable/LimitHook.sol -## apps/payload-delivery/ContractFactoryPlug.sol +| Error | Signature | +|-------|-----------| +| `BurnLimitExceeded()` | `0x85e72fd4` | +| `MintLimitExceeded()` | `0xb643bfa6` | -| Error | Signature | -| -------------------- | ------------ | -| `DeploymentFailed()` | `0x30116425` | +## apps/super-token-lockable/SuperTokenLockable.sol -## apps/payload-delivery/FeesPlug.sol +| Error | Signature | +|-------|-----------| +| `InsufficientBalance()` | `0xf4d678b8` | +| `InsufficientLockedTokens()` | `0x4f6d2a3e` | -| Error | Signature | -| ----------------------------------- | ------------ | -| `FeesAlreadyPaid()` | `0xd3b1ad69` | -| `InsufficientTokenBalance(address)` | `0x642faafa` | -| `InvalidDepositAmount()` | `0xfe9ba5cd` | -| `InvalidTokenAddress()` | `0x1eb00b06` | +## base/PlugBase.sol -## apps/payload-delivery/app-gateway/AuctionManager.sol +| Error | Signature | +|-------|-----------| +| `SocketAlreadyInitialized()` | `0xc9500b00` | -| Error | Signature | -| ------------------------- | ------------ | -| `AuctionClosed()` | `0x36b6b46d` | -| `AuctionAlreadyStarted()` | `0x628e3883` | -| `BidExceedsMaxFees()` | `0x4c923f3c` | -| `InvalidTransmitter()` | `0x58a70a0a` | +## mock/MockSocket.sol -## apps/payload-delivery/app-gateway/BatchAsync.sol +| Error | Signature | +|-------|-----------| +| `PayloadAlreadyExecuted()` | `0xe17bd578` | +| `VerificationFailed()` | `0x439cc0cd` | +| `LowGasLimit()` | `0xd38edae0` | +| `InvalidSlug()` | `0x290a8315` | -| Error | Signature | -| ----------------------- | ------------ | -| `AllPayloadsExecuted()` | `0x6bc43bfe` | -| `NotFromForwarder()` | `0xe83aa6bd` | -| `CallFailed(bytes32)` | `0xe22e3683` | -| `PayloadTooLarge()` | `0x492f620d` | -| `OnlyAppGateway()` | `0xfec944ea` | -| `WinningBidExists()` | `0xe8733654` | -| `InsufficientFees()` | `0x8d53e553` | +## mock/MockWatcherPrecompile.sol -## apps/payload-delivery/app-gateway/FeesManager.sol +| Error | Signature | +|-------|-----------| +| `InvalidChainSlug()` | `0xbff6b106` | +| `InvalidTransmitter()` | `0x58a70a0a` | -| Error | Signature | -| ----------------------------- | ------------ | -| `InsufficientFeesAvailable()` | `0x51488f54` | -| `NoFeesForTransmitter()` | `0x248bac55` | -| `NoFeesBlocked()` | `0x116d68f9` | +## protocol/AddressResolver.sol -## apps/super-token-lockable/LimitHook.sol +| Error | Signature | +|-------|-----------| +| `InvalidAppGateway(address)` | `0x0e66940d` | -| Error | Signature | -| --------------------- | ------------ | -| `BurnLimitExceeded()` | `0x85e72fd4` | -| `MintLimitExceeded()` | `0xb643bfa6` | +## protocol/AsyncPromise.sol -## apps/super-token-lockable/SuperTokenLockable.sol +| Error | Signature | +|-------|-----------| +| `PromiseAlreadyResolved()` | `0x56b63537` | +| `OnlyForwarderOrLocalInvoker()` | `0xa9fb0b28` | +| `PromiseAlreadySetUp()` | `0x927c53d5` | +| `PromiseRevertFailed()` | `0x0175b9de` | -| Error | Signature | -| ---------------------------- | ------------ | -| `InsufficientBalance()` | `0xf4d678b8` | -| `InsufficientLockedTokens()` | `0x4f6d2a3e` | +## protocol/payload-delivery/ContractFactoryPlug.sol -## common/Errors.sol - -| Error | Signature | -| ---------------------------- | ------------ | -| `NotAuthorized()` | `0xea8e4eb5` | -| `NotBridge()` | `0x7fea9dc5` | -| `NotSocket()` | `0xc59f8f7c` | -| `ConnectorUnavailable()` | `0xb1efb84a` | -| `InvalidTokenContract()` | `0x29bdfb34` | -| `ZeroAddressReceiver()` | `0x96bbcf1e` | -| `ZeroAddress()` | `0xd92e233d` | -| `ZeroAmount()` | `0x1f2a2005` | -| `InsufficientFunds()` | `0x356680b7` | -| `InvalidSigner()` | `0x815e1d64` | -| `InvalidFunction()` | `0xdb2079c3` | -| `TimeoutDelayTooLarge()` | `0xc10bfe64` | -| `TimeoutAlreadyResolved()` | `0x7dc8be06` | -| `ResolvingTimeoutTooEarly()` | `0x28fd4c50` | -| `LimitReached()` | `0x3dd19101` | -| `FeesAlreadyPaid()` | `0xd3b1ad69` | -| `NotAuctionManager()` | `0x87944c26` | -| `CallFailed()` | `0x3204506f` | -| `PlugDisconnected()` | `0xe741bafb` | -| `InvalidAppGateway()` | `0x82ded261` | -| `AppGatewayAlreadyCalled()` | `0xb224683f` | -| `InvalidInboxCaller()` | `0x4f1aa61e` | -| `PromisesNotResolved()` | `0xb91dbe7d` | -| `InvalidPromise()` | `0x45f2d176` | -| `InvalidIndex()` | `0x63df8171` | -| `FeesNotSet()` | `0x2a831034` | - -## libraries/ECDSA.sol - -| Error | Signature | -| -------------------------------------- | ------------ | -| `ECDSAInvalidSignature()` | `0xf645eedf` | -| `ECDSAInvalidSignatureLength(uint256)` | `0xfce698f7` | -| `ECDSAInvalidSignatureS(bytes32)` | `0xd78bce0c` | +| Error | Signature | +|-------|-----------| +| `DeploymentFailed()` | `0x30116425` | +| `ExecutionFailed()` | `0xacfdb444` | +| `information(bool,bytes)` | `0x1a5c6d63` | -## mock/MockSocket.sol +## protocol/payload-delivery/FeesPlug.sol -| Error | Signature | -| -------------------------- | ------------ | -| `PayloadAlreadyExecuted()` | `0xe17bd578` | -| `VerificationFailed()` | `0x439cc0cd` | -| `LowGasLimit()` | `0xd38edae0` | -| `InvalidSlug()` | `0x290a8315` | -| `ExecutionFailed()` | `0xacfdb444` | +| Error | Signature | +|-------|-----------| +| `FeesAlreadyPaid()` | `0xd3b1ad69` | +| `InsufficientTokenBalance(address)` | `0x642faafa` | +| `InvalidDepositAmount()` | `0xfe9ba5cd` | +| `TokenNotWhitelisted(address)` | `0xea3bff2e` | -## mock/MockWatcherPrecompile.sol +## protocol/payload-delivery/app-gateway/AuctionManager.sol -| Error | Signature | -| ---------------------- | ------------ | -| `InvalidChainSlug()` | `0xbff6b106` | +| Error | Signature | +|-------|-----------| +| `AuctionClosed()` | `0x36b6b46d` | +| `AuctionAlreadyStarted()` | `0x628e3883` | +| `BidExceedsMaxFees()` | `0x4c923f3c` | | `InvalidTransmitter()` | `0x58a70a0a` | +| `LowerBidAlreadyExists()` | `0xaaa1f709` | -## socket/Socket.sol +## protocol/payload-delivery/app-gateway/BatchAsync.sol -| Error | Signature | -| -------------------------- | ------------ | -| `PayloadAlreadyExecuted()` | `0xe17bd578` | -| `VerificationFailed()` | `0x439cc0cd` | -| `LowGasLimit()` | `0xd38edae0` | -| `InvalidSlug()` | `0x290a8315` | -| `ExecutionFailed()` | `0xacfdb444` | +| Error | Signature | +|-------|-----------| +| `AllPayloadsExecuted()` | `0x6bc43bfe` | +| `NotFromForwarder()` | `0xe83aa6bd` | +| `CallFailed(bytes32)` | `0xe22e3683` | +| `PayloadTooLarge()` | `0x492f620d` | +| `OnlyAppGateway()` | `0xfec944ea` | +| `WinningBidExists()` | `0xe8733654` | +| `InsufficientFees()` | `0x8d53e553` | -## socket/SocketUtils.sol +## protocol/payload-delivery/app-gateway/FeesManager.sol -| Error | Signature | -| ---------------------- | ------------ | -| `InvalidTransmitter()` | `0x58a70a0a` | +| Error | Signature | +|-------|-----------| +| `InsufficientFeesAvailable()` | `0x51488f54` | +| `NoFeesForTransmitter()` | `0x248bac55` | +| `NoFeesBlocked()` | `0x116d68f9` | +| `InvalidWatcherSignature()` | `0x5029f14f` | +| `NonceUsed()` | `0x1f6d5aef` | + +## protocol/socket/Socket.sol + +| Error | Signature | +|-------|-----------| +| `PayloadAlreadyExecuted(ExecutionStatus)` | `0xf4c54edd` | +| `VerificationFailed()` | `0x439cc0cd` | +| `LowGasLimit()` | `0xd38edae0` | +| `InvalidSlug()` | `0x290a8315` | +| `DeadlinePassed()` | `0x70f65caa` | + +## protocol/socket/SocketConfig.sol + +| Error | Signature | +|-------|-----------| +| `SwitchboardExists()` | `0x2dff8555` | +| `InvalidConnection()` | `0x63228f29` | +| `InvalidSwitchboard()` | `0xf63c9e4d` | +| `SwitchboardExistsOrDisabled()` | `0x1c7d2487` | -## socket/SocketConfig.sol +## protocol/socket/SocketUtils.sol -| Error | Signature | -| ---------------------- | ------------ | -| `SwitchboardExists()` | `0x2dff8555` | -| `InvalidConnection()` | `0x63228f29` | -| `InvalidSwitchboard()` | `0xf63c9e4d` | +| Error | Signature | +|-------|-----------| +| `InvalidTransmitter()` | `0x58a70a0a` | -## socket/switchboard/FastSwitchboard.sol +## protocol/socket/switchboard/FastSwitchboard.sol -| Error | Signature | -| ------------------- | ------------ | +| Error | Signature | +|-------|-----------| | `AlreadyAttested()` | `0x35d90805` | | `WatcherNotFound()` | `0xa278e4ad` | -## socket/switchboard/SwitchboardBase.sol +## protocol/socket/switchboard/SwitchboardBase.sol -| Error | Signature | -| ---------------- | ------------ | +| Error | Signature | +|-------|-----------| | `InvalidNonce()` | `0x756688fe` | -## socket/utils/AccessControl.sol +## protocol/utils/AccessControl.sol -| Error | Signature | -| ------------------- | ------------ | +| Error | Signature | +|-------|-----------| | `NoPermit(bytes32)` | `0x962f6333` | -## socket/utils/SignatureVerifier.sol +## protocol/utils/AddressResolverUtil.sol -| Error | Signature | -| -------------------- | ------------ | -| `InvalidSigLength()` | `0xd2453293` | - -## utils/AddressResolverUtil.sol - -| Error | Signature | -| ------------------------- | ------------ | -| `OnlyPayloadDelivery()` | `0x7ccc3a43` | +| Error | Signature | +|-------|-----------| +| `OnlyPayloadDelivery()` | `0x7ccc3a43` | | `OnlyWatcherPrecompile()` | `0x663a892a` | -## utils/OwnableTwoStep.sol - -| Error | Signature | -| --------------- | ------------ | -| `OnlyOwner()` | `0x5fc483c5` | -| `OnlyNominee()` | `0x7c91ccdd` | +## protocol/utils/common/Errors.sol + +| Error | Signature | +|-------|-----------| +| `NotAuthorized()` | `0xea8e4eb5` | +| `NotBridge()` | `0x7fea9dc5` | +| `NotSocket()` | `0xc59f8f7c` | +| `ConnectorUnavailable()` | `0xb1efb84a` | +| `InvalidTokenContract()` | `0x29bdfb34` | +| `ZeroAddressReceiver()` | `0x96bbcf1e` | +| `ZeroAddress()` | `0xd92e233d` | +| `ZeroAmount()` | `0x1f2a2005` | +| `InsufficientFunds()` | `0x356680b7` | +| `InvalidSigner()` | `0x815e1d64` | +| `InvalidFunction()` | `0xdb2079c3` | +| `TimeoutDelayTooLarge()` | `0xc10bfe64` | +| `TimeoutAlreadyResolved()` | `0x7dc8be06` | +| `ResolvingTimeoutTooEarly()` | `0x28fd4c50` | +| `LimitReached()` | `0x3dd19101` | +| `FeesAlreadyPaid()` | `0xd3b1ad69` | +| `NotAuctionManager()` | `0x87944c26` | +| `CallFailed()` | `0x3204506f` | +| `PlugDisconnected()` | `0xe741bafb` | +| `InvalidAppGateway()` | `0x82ded261` | +| `AppGatewayAlreadyCalled()` | `0xb224683f` | +| `InvalidInboxCaller()` | `0x4f1aa61e` | +| `PromisesNotResolved()` | `0xb91dbe7d` | +| `InvalidPromise()` | `0x45f2d176` | +| `InvalidIndex()` | `0x63df8171` | +| `InvalidTransmitter()` | `0x58a70a0a` | +| `FeesNotSet()` | `0x2a831034` | +| `InvalidTokenAddress()` | `0x1eb00b06` | +| `InvalidWatcherSignature()` | `0x5029f14f` | +| `NonceUsed()` | `0x1f6d5aef` | -## watcherPrecompile/WatcherPrecompile.sol +## protocol/watcherPrecompile/WatcherPrecompile.sol -| Error | Signature | -| ---------------------- | ------------ | -| `InvalidChainSlug()` | `0xbff6b106` | -| `InvalidConnection()` | `0x63228f29` | +| Error | Signature | +|-------|-----------| +| `InvalidChainSlug()` | `0xbff6b106` | +| `InvalidConnection()` | `0x63228f29` | | `InvalidTransmitter()` | `0x58a70a0a` | +| `InvalidTimeoutRequest()` | `0x600ca372` | +| `InvalidPayloadId()` | `0xfa0b8c86` | +| `InvalidCaller()` | `0x48f5c3ed` | -## watcherPrecompile/WatcherPrecompileLimits.sol +## protocol/watcherPrecompile/WatcherPrecompileLimits.sol -| Error | Signature | -| ------------------------------------------------ | ------------ | -| `ActionNotSupported(address,bytes32)` | `0xa219158f` | -| `NotDeliveryHelper()` | `0x29029c67` | +| Error | Signature | +|-------|-----------| +| `ActionNotSupported(address,bytes32)` | `0xa219158f` | +| `NotDeliveryHelper()` | `0x29029c67` | | `LimitExceeded(address,bytes32,uint256,uint256)` | `0x80bb2621` | diff --git a/deployments/dev_addresses.json b/deployments/dev_addresses.json index bc2ece26..6fb6b53c 100644 --- a/deployments/dev_addresses.json +++ b/deployments/dev_addresses.json @@ -1,32 +1,48 @@ { + "84532": { + "ContractFactoryPlug": "0xA557EBE094F939ae6eE8F18c8F88D06182168786", + "FastSwitchboard": "0x06234dB2D69Ac158793a3ce59c3764422028E964", + "FeesPlug": "0xD78f99D62BeaF0918bB0601C68EB537b6703Ce63", + "Socket": "0x6c40Fb39B03e32EC4D23e31DdE6D10283F2C7b4F", + "SocketBatcher": "0xA944BBe5D4F67a242C9e92d539fF2d55616283a7", + "startBlock": 22408552 + }, "421614": { - "ContractFactoryPlug": "0x146dd9Fc049501675533a455835989684a2f79C1", - "FastSwitchboard": "0x64f929Ad5ce17cF440Ad2a33Db56F9a9ce386723", - "FeesPlug": "0xa08Dac27E27c49A2535b36064c370e6e8B3A0B9a", - "Socket": "0x963eC83119862cD518826DA9177B348cFdfebaA4", - "SocketBatcher": "0x2db8cb4f841aa944869ECD5002e8153642A30971", - "startBlock": 125604419 + "ContractFactoryPlug": "0x73e72Df0e73d9ceA2C96D16D512B203bc8DC0A77", + "FastSwitchboard": "0x29E632aE79107A82C637016CA21030d922De5375", + "FeesPlug": "0x469B536c5Df15948c8759FEEE5DB1c17790d4152", + "Socket": "0xa0E1738a9Fc0698789866e09d7A335d30128C5C5", + "SocketBatcher": "0x6734a30B8f2d210faefa5aeD4E11b674C59641F1", + "startBlock": 127534886 }, "7625382": { - "AddressResolver": "0x7480D8D4B1929e751984b01eE877A9D65e1F3737", - "AddressResolverImpl": "0xcc9486bce931041d1393921b32f7b4C60F6eAA99", - "AuctionManager": "0x50E5140d3601812Dc11f49a39CF9520567731c82", - "AuctionManagerImpl": "0xd6F9087DaBe64649c33B20B444eCcE19cca97436", - "DeliveryHelper": "0x862f14446ce869218C04c29507131B68119B4CEd", - "DeliveryHelperImpl": "0xD4f1AE0d51F61dda1476BD43953EF1878556B74c", - "ERC1967Factory": "0x157FEE5a69B538AD189AbB863eeAfD24552DED23", - "FeesManager": "0x80bEc58A00993dc874Ab2fAe56621af24eF06bA5", - "FeesManagerImpl": "0x187058842C78675eA08572E0edc9598271dEF278", - "startBlock": 168, - "WatcherPrecompile": "0x298A3F9351ec982393f6f6CEAF35C7A61154Fb65", - "WatcherPrecompileImpl": "0x966Fe0e61d6f0384A1F3b5Dc4165385FC58be93d" + "AddressResolver": "0xA57B7ce75aF92ADd9f2e7D3F66cc3B8675B1D697", + "AddressResolverImpl": "0xbBfb525ADc6eC38Ef0D4b807d327c2Dd1C286de1", + "AuctionManager": "0x6Ba8F0fD3Aac6786D552e691486e49Cfdcc948C1", + "AuctionManagerImpl": "0x23EF7Af3bC1009EA6f95c3389921d5cB19950182", + "DeliveryHelper": "0xb69045D15f6c13c4b3718d0E03d8f6d4476c3A10", + "DeliveryHelperImpl": "0x4CCF8F511A364827E5e6749b196BB26Ea00bF512", + "ERC1967Factory": "0x208dC31cd6042a09bbFDdB31614A337a51b870ba", + "FeesManager": "0x3Df4D93F499fB4C489D4741ABd5e662D2EA58A49", + "FeesManagerImpl": "0x8dcEE196AFECe27545687426914d2830ff2dbc35", + "startBlock": 2316, + "WatcherPrecompile": "0x595bF33368B034da798be2a4345F52C26121C685", + "WatcherPrecompileImpl": "0x09B503e744DCB2cA2827ce5AF08Fd49Ba06D17e4" + }, + "11155111": { + "ContractFactoryPlug": "0xf0f51Ba62284A98AbB5D447487d5E6B536DB9B72", + "FastSwitchboard": "0x6D54668ba18B425a1DbFC0BD720145c0aeE97f65", + "FeesPlug": "0xC559BABEbcD92278E91a545308190E4761efc347", + "Socket": "0xD78f99D62BeaF0918bB0601C68EB537b6703Ce63", + "SocketBatcher": "0xA557EBE094F939ae6eE8F18c8F88D06182168786", + "startBlock": 7790632 }, "11155420": { - "ContractFactoryPlug": "0xDF769F323560b54F1370a407d3aE6fC99AaAeF75", - "FastSwitchboard": "0x87cC19AedD434ebD3B74FfdC073CAeC7dC1E92EA", - "FeesPlug": "0x5e5CF700c97BC8B3F6215D98E65f85D4A44d7D06", - "Socket": "0xaF57894A5244711a7bEBE582E9e121980f1aa95e", - "SocketBatcher": "0x977e2f721f8958b2F776d2dc693D04A1256ed426", - "startBlock": 24127420 + "ContractFactoryPlug": "0xB0694bF9332ec67825B9Ad6E677941aeAF50995F", + "FastSwitchboard": "0x245C0DCF8eF6e52b4d03c96b563C83a5f78A1E14", + "FeesPlug": "0xa8176BE60350AA44Dd10d46f42720cD604EE85Ff", + "Socket": "0x79Ac996De9333956f4980397ED5Bd91f77f10b01", + "SocketBatcher": "0x4afd974a84F224ea25dd43be91C6fbaff8DcEcfa", + "startBlock": 24391377 } } diff --git a/deployments/dev_verification.json b/deployments/dev_verification.json index 6e9609b3..e9eca4a3 100644 --- a/deployments/dev_verification.json +++ b/deployments/dev_verification.json @@ -1,96 +1,227 @@ { - "421614": [], + "84532": [ + [ + "0xA557EBE094F939ae6eE8F18c8F88D06182168786", + "ContractFactoryPlug", + "contracts/protocol/payload-delivery/ContractFactoryPlug.sol", + [ + "0x6c40Fb39B03e32EC4D23e31DdE6D10283F2C7b4F", + "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18" + ] + ], + [ + "0xD78f99D62BeaF0918bB0601C68EB537b6703Ce63", + "FeesPlug", + "contracts/protocol/payload-delivery/FeesPlug.sol", + [ + "0x6c40Fb39B03e32EC4D23e31DdE6D10283F2C7b4F", + "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18" + ] + ], + [ + "0x06234dB2D69Ac158793a3ce59c3764422028E964", + "FastSwitchboard", + "contracts/protocol/socket/switchboard/FastSwitchboard.sol", + [ + 84532, + "0x6c40Fb39B03e32EC4D23e31DdE6D10283F2C7b4F", + "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18" + ] + ], + [ + "0xA944BBe5D4F67a242C9e92d539fF2d55616283a7", + "SocketBatcher", + "contracts/protocol/socket/SocketBatcher.sol", + [ + "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18", + "0x6c40Fb39B03e32EC4D23e31DdE6D10283F2C7b4F" + ] + ], + [ + "0x6c40Fb39B03e32EC4D23e31DdE6D10283F2C7b4F", + "Socket", + "contracts/protocol/socket/Socket.sol", + [ + 84532, + "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18", + "EVMX" + ] + ] + ], + "421614": [ + [ + "0x29E632aE79107A82C637016CA21030d922De5375", + "FastSwitchboard", + "contracts/protocol/socket/switchboard/FastSwitchboard.sol", + [ + 421614, + "0xa0E1738a9Fc0698789866e09d7A335d30128C5C5", + "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18" + ] + ] + ], "7625382": [ [ - "0x966Fe0e61d6f0384A1F3b5Dc4165385FC58be93d", + "0x09B503e744DCB2cA2827ce5AF08Fd49Ba06D17e4", + "WatcherPrecompile", + "contracts/protocol/watcherPrecompile/WatcherPrecompile.sol", + [] + ], + [ + "0x6c73961Bfaa2c9c1d0D7F4C213aa85af15b7CB54", "WatcherPrecompile", "contracts/protocol/watcherPrecompile/WatcherPrecompile.sol", [] ], [ - "0x00cc4eff9719F3AB0271866a75b45C0ba66890D0", + "0xd151bD217704F72f717C2111207e6Bb33B609f61", "WatcherPrecompile", "contracts/protocol/watcherPrecompile/WatcherPrecompile.sol", [] ], [ - "0xFdFfB47C774A804e00205BA95B4308f533Ba219D", + "0x8dcEE196AFECe27545687426914d2830ff2dbc35", + "FeesManager", + "contracts/protocol/payload-delivery/app-gateway/FeesManager.sol", + [] + ], + [ + "0xb1F4CbFCE786aA8B553796Fb06c04Dd461967A16", "WatcherPrecompile", "contracts/protocol/watcherPrecompile/WatcherPrecompile.sol", [] ], [ - "0xd6F9087DaBe64649c33B20B444eCcE19cca97436", + "0x23EF7Af3bC1009EA6f95c3389921d5cB19950182", "AuctionManager", "contracts/protocol/payload-delivery/app-gateway/AuctionManager.sol", [] ], [ - "0xD4f1AE0d51F61dda1476BD43953EF1878556B74c", + "0x4CCF8F511A364827E5e6749b196BB26Ea00bF512", "DeliveryHelper", "contracts/protocol/payload-delivery/app-gateway/DeliveryHelper.sol", [] ], [ - "0x187058842C78675eA08572E0edc9598271dEF278", + "0x39f9b492695375F703450c5653c9D80CFa38e6eD", "FeesManager", "contracts/protocol/payload-delivery/app-gateway/FeesManager.sol", [] ], [ - "0x0429DB4f0a97F8c6E3D84399bBdA3e03B62b03A3", + "0x234cA13f5dC4a2467c81E515F57238BF9f53156E", "WatcherPrecompile", "contracts/protocol/watcherPrecompile/WatcherPrecompile.sol", [] ], [ - "0xcc9486bce931041d1393921b32f7b4C60F6eAA99", + "0xbBfb525ADc6eC38Ef0D4b807d327c2Dd1C286de1", "AddressResolver", "contracts/protocol/AddressResolver.sol", [] ], [ - "0x157FEE5a69B538AD189AbB863eeAfD24552DED23", + "0x208dC31cd6042a09bbFDdB31614A337a51b870ba", "ERC1967Factory", "lib/solady/src/utils/ERC1967Factory.sol", [] ], [ - "0x48228f8ebdCA92B7F7fdC9C545372123f5Bcc4C4", + "0x4C68058509d754Cc0dE474eBC20aE94e4787E704", "AuctionManager", "contracts/protocol/payload-delivery/app-gateway/AuctionManager.sol", [] ], [ - "0xc67BEa5A43cb0D908866F3577D1f967f901Dbc75", + "0x3c9f5172feb0dDfC06176cE67B566EFbb01CCe98", "DeliveryHelper", "contracts/protocol/payload-delivery/app-gateway/DeliveryHelper.sol", [] ], [ - "0xaF369f1fc1523dc8086c2ACDD7e7A73aA8732FE6", + "0xF4D3BDe438416938217d4624c82AEbEb46CeD371", "FeesManager", "contracts/protocol/payload-delivery/app-gateway/FeesManager.sol", [] ], [ - "0xCF9728Dc37da5c5B08780F818B6fB65c64d6a402", + "0x8F18fC10a8b40b548C6F04Fb252481c783A9ace0", "WatcherPrecompile", "contracts/protocol/watcherPrecompile/WatcherPrecompile.sol", [] ], [ - "0x3d981a431c38B9b781178279AecFb91509BDa645", + "0x8662FC08dEC7c61Dd3432fAF45a5bC024BB60B00", "AddressResolver", "contracts/protocol/AddressResolver.sol", [] ], [ - "0xC36e58c0c505435179417a318333e4a7C1867247", + "0x234cA13f5dC4a2467c81E515F57238BF9f53156E", "ERC1967Factory", "lib/solady/src/utils/ERC1967Factory.sol", [] ] ], - "11155420": [] + "11155111": [], + "11155420": [ + [ + "0x245C0DCF8eF6e52b4d03c96b563C83a5f78A1E14", + "FastSwitchboard", + "contracts/protocol/socket/switchboard/FastSwitchboard.sol", + [ + 11155420, + "0x79Ac996De9333956f4980397ED5Bd91f77f10b01", + "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18" + ] + ], + [ + "0xB0694bF9332ec67825B9Ad6E677941aeAF50995F", + "ContractFactoryPlug", + "contracts/protocol/payload-delivery/ContractFactoryPlug.sol", + [ + "0x79Ac996De9333956f4980397ED5Bd91f77f10b01", + "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18" + ] + ], + [ + "0xa8176BE60350AA44Dd10d46f42720cD604EE85Ff", + "FeesPlug", + "contracts/protocol/payload-delivery/FeesPlug.sol", + [ + "0x79Ac996De9333956f4980397ED5Bd91f77f10b01", + "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18" + ] + ], + [ + "0xBf9Ec2b0441eeEA9bEb89C6638921c37c15A13E4", + "FastSwitchboard", + "contracts/protocol/socket/switchboard/FastSwitchboard.sol", + [ + 11155420, + "0x79Ac996De9333956f4980397ED5Bd91f77f10b01", + "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18" + ] + ], + [ + "0x4afd974a84F224ea25dd43be91C6fbaff8DcEcfa", + "SocketBatcher", + "contracts/protocol/socket/SocketBatcher.sol", + [ + "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18", + "0x79Ac996De9333956f4980397ED5Bd91f77f10b01" + ] + ], + [ + "0x79Ac996De9333956f4980397ED5Bd91f77f10b01", + "Socket", + "contracts/protocol/socket/Socket.sol", + [ + 11155420, + "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18", + "EVMX" + ] + ] + ] } diff --git a/deployments/local_addresses.json b/deployments/local_addresses.json new file mode 100644 index 00000000..7f90cbb0 --- /dev/null +++ b/deployments/local_addresses.json @@ -0,0 +1,3 @@ +{ + "7625382": {} +} diff --git a/deployments/stage_addresses.json b/deployments/stage_addresses.json index 34e75205..0967ef42 100644 --- a/deployments/stage_addresses.json +++ b/deployments/stage_addresses.json @@ -1,48 +1 @@ -{ - "84532": { - "ContractFactoryPlug": "0x60C4ecd1B5E613Bd888b64933bEd6F407B3946A3", - "FastSwitchboard": "0xBb0F2e200528Be1C5cE383bcbe96aE4E92560D55", - "FeesPlug": "0x804Af74b5b3865872bEf354e286124253782FA95", - "Socket": "0x302E258fe375A1da4d6B3F4Dd5208638A29bc409", - "SocketBatcher": "0xeAb2e310A53FD3Fb34C2944690a79DFB2e834F20", - "startBlock": 22196067 - }, - "421614": { - "ContractFactoryPlug": "0x7D173648F99875c4369d2F4d29Be922D1Ed7CEaD", - "FastSwitchboard": "0x72583393DBF61d3dd37b5474AECd73F16A94e7E0", - "FeesPlug": "0xf740d6b59762fF2547Ed7aD629e041F80E1A3f75", - "Socket": "0x81046b8A1752253b214E0EAace04E3927ECbC3cC", - "SocketBatcher": "0x23463461b040c3B2DE91ce84e697656de6021636", - "startBlock": 125993799 - }, - "7625382": { - "AddressResolver": "0x33E0B939d5d01C9ae9f2F64af6EC973eE66f73db", - "AddressResolverImpl": "0xd4dd92440A6bdb51DEcD3D34105C46B4C5d25E14", - "AuctionManager": "0xAc331D182BCc5BC8563A987DE13a7C5dF2e0f1d6", - "AuctionManagerImpl": "0x57dFaDC404764686995D672E1145c9B2a015e318", - "DeliveryHelper": "0xE024683bF9E501165E2937CbFa594AFA71BE5B94", - "DeliveryHelperImpl": "0x7BC32962d8b90AC52AE1bd830A39Ae86c7f7a01F", - "ERC1967Factory": "0x6f6b19A05B049E68DF324Fc0d9191292CB9fF8d1", - "FeesManager": "0xAa8877Dea1930Ec6ed7Dab78bc415d7A02963774", - "FeesManagerImpl": "0x17C7f3578d9Cc0722d870a691b281eA61a6C9B11", - "startBlock": 556, - "WatcherPrecompile": "0xF444D24d398Fd3d8Ccaf7fA0BC543f1a6dbd4deA", - "WatcherPrecompileImpl": "0xaBc914E0834E2c7BffD586f8e96230FCe6f72e1E" - }, - "11155111": { - "ContractFactoryPlug": "0x60C4ecd1B5E613Bd888b64933bEd6F407B3946A3", - "FastSwitchboard": "0xBb0F2e200528Be1C5cE383bcbe96aE4E92560D55", - "FeesPlug": "0x804Af74b5b3865872bEf354e286124253782FA95", - "Socket": "0x302E258fe375A1da4d6B3F4Dd5208638A29bc409", - "SocketBatcher": "0xeAb2e310A53FD3Fb34C2944690a79DFB2e834F20", - "startBlock": 7756339 - }, - "11155420": { - "ContractFactoryPlug": "0xd627BFe7d2fCAC1147c996a6F2CAaB2E1e1bD344", - "FastSwitchboard": "0x49f24A72e738Fe86263Aa26696370972e049498B", - "FeesPlug": "0x9B06e2Dae351ed8B1112C036e5c306E8fBe4C9c5", - "Socket": "0xb6d39d1dB2cB14043182a008EfFC079A9C578208", - "SocketBatcher": "0xcd9F9D5C1Ec32C28455b8C74589Edcb24540B338", - "startBlock": 24178839 - } -} +{} diff --git a/deployments/stage_verification.json b/deployments/stage_verification.json index 3a8ec095..0967ef42 100644 --- a/deployments/stage_verification.json +++ b/deployments/stage_verification.json @@ -1,92 +1 @@ -{ - "84532": [ - [ - "0x60C4ecd1B5E613Bd888b64933bEd6F407B3946A3", - "ContractFactoryPlug", - "contracts/protocol/payload-delivery/ContractFactoryPlug.sol", - [ - "0x302E258fe375A1da4d6B3F4Dd5208638A29bc409", - "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18" - ] - ], - [ - "0x804Af74b5b3865872bEf354e286124253782FA95", - "FeesPlug", - "contracts/protocol/payload-delivery/FeesPlug.sol", - [ - "0x302E258fe375A1da4d6B3F4Dd5208638A29bc409", - "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18" - ] - ], - [ - "0xBb0F2e200528Be1C5cE383bcbe96aE4E92560D55", - "FastSwitchboard", - "contracts/protocol/socket/switchboard/FastSwitchboard.sol", - [ - 84532, - "0x302E258fe375A1da4d6B3F4Dd5208638A29bc409", - "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18" - ] - ], - [ - "0xeAb2e310A53FD3Fb34C2944690a79DFB2e834F20", - "SocketBatcher", - "contracts/protocol/socket/SocketBatcher.sol", - [ - "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18", - "0x302E258fe375A1da4d6B3F4Dd5208638A29bc409" - ] - ], - [ - "0x302E258fe375A1da4d6B3F4Dd5208638A29bc409", - "Socket", - "contracts/protocol/socket/Socket.sol", - [ - 84532, - "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18", - "EVMX" - ] - ] - ], - "421614": [], - "7625382": [ - [ - "0x57dFaDC404764686995D672E1145c9B2a015e318", - "AuctionManager", - "contracts/protocol/payload-delivery/app-gateway/AuctionManager.sol", - [] - ], - [ - "0x7BC32962d8b90AC52AE1bd830A39Ae86c7f7a01F", - "DeliveryHelper", - "contracts/protocol/payload-delivery/app-gateway/DeliveryHelper.sol", - [] - ], - [ - "0x17C7f3578d9Cc0722d870a691b281eA61a6C9B11", - "FeesManager", - "contracts/protocol/payload-delivery/app-gateway/FeesManager.sol", - [] - ], - [ - "0xaBc914E0834E2c7BffD586f8e96230FCe6f72e1E", - "WatcherPrecompile", - "contracts/protocol/watcherPrecompile/WatcherPrecompile.sol", - [] - ], - [ - "0xd4dd92440A6bdb51DEcD3D34105C46B4C5d25E14", - "AddressResolver", - "contracts/protocol/AddressResolver.sol", - [] - ], - [ - "0x6f6b19A05B049E68DF324Fc0d9191292CB9fF8d1", - "ERC1967Factory", - "lib/solady/src/utils/ERC1967Factory.sol", - [] - ] - ], - "11155111": [], - "11155420": [] -} +{} diff --git a/hardhat-scripts/deploy/1.deploy.ts b/hardhat-scripts/deploy/1.deploy.ts index beb015ca..3b2eaf77 100644 --- a/hardhat-scripts/deploy/1.deploy.ts +++ b/hardhat-scripts/deploy/1.deploy.ts @@ -160,9 +160,9 @@ const deployEVMxContracts = async () => { deployUtils.signer ); - deployUtils.addresses.startBlock = deployUtils.addresses.startBlock + deployUtils.addresses.startBlock = (deployUtils.addresses.startBlock ? deployUtils.addresses.startBlock - : await deployUtils.signer.provider?.getBlockNumber(); + : await deployUtils.signer.provider?.getBlockNumber()) || 0; await storeAddresses(deployUtils.addresses, chain as ChainSlug, mode); } catch (error) { @@ -256,9 +256,9 @@ const deploySocketContracts = async () => { ); deployUtils.addresses[contractName] = contractFactoryPlug.address; - deployUtils.addresses.startBlock = deployUtils.addresses.startBlock + deployUtils.addresses.startBlock = (deployUtils.addresses.startBlock ? deployUtils.addresses.startBlock - : await deployUtils.signer.provider?.getBlockNumber(); + : await deployUtils.signer.provider?.getBlockNumber()) || 0; await storeAddresses(deployUtils.addresses, chain, mode); } catch (error) { diff --git a/hardhat-scripts/deploy/4.connect.ts b/hardhat-scripts/deploy/4.connect.ts index 7e5deadf..f5f78b89 100644 --- a/hardhat-scripts/deploy/4.connect.ts +++ b/hardhat-scripts/deploy/4.connect.ts @@ -5,7 +5,7 @@ import { Contract, ethers, providers, Wallet } from "ethers"; import { chains, EVMX_CHAIN_ID, mode } from "../config"; import { CORE_CONTRACTS, DeploymentAddresses, EVMxCoreContracts } from "../constants"; import { getAddresses, getInstance, getProviderFromChainSlug, overrides } from "../utils"; - +import { signWatcherMessage } from "../utils/sign"; const plugs = [CORE_CONTRACTS.ContractFactoryPlug, CORE_CONTRACTS.FeesPlug]; export type AppGatewayConfig = { plug: string; @@ -194,7 +194,15 @@ export const updateConfigEVMx = async () => { // Update configs if any changes needed if (appConfigs.length > 0) { console.log({ appConfigs }); - const tx = await watcher.setAppGateways(appConfigs, { + const encodedMessage = ethers.utils.defaultAbiCoder.encode( + ['bytes4', 'tuple(address plug,address appGateway,address switchboard,uint32 chainSlug)[]'], + [ + watcher.interface.getSighash('setAppGateways'), + appConfigs, + ], + ); + const { nonce, signature } = await signWatcherMessage(encodedMessage); + const tx = await watcher.setAppGateways(appConfigs, nonce, signature, { ...overrides(EVMX_CHAIN_ID), }); console.log(`Updating EVMx Config tx hash: ${tx.hash}`); diff --git a/hardhat-scripts/deploy/5.upload.ts b/hardhat-scripts/deploy/5.upload.ts index 507baa60..dbe22860 100644 --- a/hardhat-scripts/deploy/5.upload.ts +++ b/hardhat-scripts/deploy/5.upload.ts @@ -1,5 +1,5 @@ import { PutObjectCommand, S3Client } from "@aws-sdk/client-s3"; -import { ChainAddressesObj, CloudAddressesObj, ChainSlug, DeploymentMode } from "@socket.tech/socket-protocol-common"; +import { ChainAddressesObj, EVMxAddressesObj, ChainSlug, DeploymentMode } from "@socket.tech/socket-protocol-common"; import { config as dotenvConfig } from "dotenv"; import fs from "fs"; import path from "path"; @@ -23,10 +23,10 @@ const getBucketName = () => { const getFileName = () => { switch (mode) { case DeploymentMode.DEV: - return "pocConfig.json"; + return "devConfig.json"; case DeploymentMode.STAGE: return "stageConfig.json"; - case DeploymentMode.PROD: + case DeploymentMode.PROD: return "prodConfig.json"; default: throw new Error(`Invalid deployment mode: ${mode}`); @@ -52,7 +52,7 @@ type ConfigEntry = { wssRpc: string | undefined; confirmations: number; eventBlockRange: number; - addresses?: ChainAddressesObj | CloudAddressesObj; + addresses?: ChainAddressesObj | EVMxAddressesObj; }; type S3Config = { @@ -98,9 +98,9 @@ export let config: S3Config = { supportedChainSlugs: [ ChainSlug.ARBITRUM_SEPOLIA, ChainSlug.OPTIMISM_SEPOLIA, - // ChainSlug.SEPOLIA, + ChainSlug.SEPOLIA, EVMX_CHAIN_ID, - // BASE_SEPOLIA_CHAIN_ID, + ChainSlug.BASE_SEPOLIA, ], }; // Read the addresses.json file @@ -122,9 +122,9 @@ console.log(JSON.stringify(config, null, 2)); const s3Client = new S3Client({ region: "us-east-1" }); // Replace with your preferred region // Function to upload to S3 -async function uploadToS3(data: any, bucketName: string, fileName: string) { +async function uploadToS3(data: any, fileName: string = getFileName()) { const params = { - Bucket: bucketName, + Bucket: getBucketName(), Key: fileName, Body: JSON.stringify(data, null, 2), ContentType: "application/json", @@ -140,4 +140,5 @@ async function uploadToS3(data: any, bucketName: string, fileName: string) { } // Upload config to S3 -uploadToS3(config, getBucketName(), getFileName()); +uploadToS3(config, "pocConfig.json"); +// uploadToS3(config); diff --git a/hardhat-scripts/utils/networks.ts b/hardhat-scripts/utils/networks.ts index 2abd4eb7..56d69fd8 100644 --- a/hardhat-scripts/utils/networks.ts +++ b/hardhat-scripts/utils/networks.ts @@ -8,7 +8,6 @@ import { chainSlugToHardhatChainName, } from "@socket.tech/socket-protocol-common"; import { EVMX_CHAIN_ID } from "../config/config"; -import { BASE_SEPOLIA_CHAIN_ID } from "../constants"; const dotenvConfigPath: string = process.env.DOTENV_CONFIG_PATH || "./.env"; dotenvConfig({ path: resolve(__dirname, dotenvConfigPath) }); @@ -23,9 +22,7 @@ function createReverseEnumMap(enumObj: any) { } export const rpcKeys = (chainSlug: ChainSlug) => { - if (chainSlug == (BASE_SEPOLIA_CHAIN_ID as ChainSlug)) { - return "BASE_SEPOLIA_RPC"; - } else if (chainSlug == (EVMX_CHAIN_ID as ChainSlug)) { + if (chainSlug == EVMX_CHAIN_ID as ChainSlug) { return "EVMX_RPC"; } let chainName = chainSlugToHardhatChainName[chainSlug].toString(); diff --git a/hardhat-scripts/utils/sign.ts b/hardhat-scripts/utils/sign.ts new file mode 100644 index 00000000..6c038e8b --- /dev/null +++ b/hardhat-scripts/utils/sign.ts @@ -0,0 +1,24 @@ +import { ethers, Wallet } from "ethers"; +import { EVMX_CHAIN_ID, mode } from "../config/config"; +import { EVMxCoreContracts } from "../constants"; +import { getAddresses } from "./address"; + +export const signWatcherMessage = async (encodedMessage: string) => { + const signatureNonce = Date.now(); + const signer = new Wallet(process.env.WATCHER_PRIVATE_KEY!); + const watcherPrecompileAddress = getAddresses(mode)[EVMX_CHAIN_ID][EVMxCoreContracts.WatcherPrecompile]; + const digest = ethers.utils.keccak256( + ethers.utils.defaultAbiCoder.encode( + ['address', 'uint32', 'uint256', 'bytes'], + [ + watcherPrecompileAddress, + EVMX_CHAIN_ID, + signatureNonce, + encodedMessage, + ], + ), + ); + const signature = await signer.signMessage(ethers.utils.arrayify(digest)); + return { nonce: signatureNonce, signature }; + }; + \ No newline at end of file diff --git a/hardhat-scripts/verify/verify.ts b/hardhat-scripts/verify/verify.ts index 4c6dc721..20ccc6b5 100644 --- a/hardhat-scripts/verify/verify.ts +++ b/hardhat-scripts/verify/verify.ts @@ -5,7 +5,6 @@ import { HardhatChainName, } from "@socket.tech/socket-protocol-common"; import hre from "hardhat"; -import path from "path"; import { EVMX_CHAIN_ID, mode } from "../config/config"; import { storeUnVerifiedParams, verify } from "../utils"; @@ -44,9 +43,7 @@ export const main = async () => { const chain = parseInt(chains[chainIndex]) as ChainSlug; let chainName: string; console.log({ chain }); - if (chain == (ChainSlug.BASE_SEPOLIA as ChainSlug)) { - chainName = "base_sepolia"; - } else if (chain == (EVMX_CHAIN_ID as ChainSlug)) { + if (chain == (EVMX_CHAIN_ID as ChainSlug)) { chainName = "EVMX"; } else { chainName = ChainSlugToKey[chain]; diff --git a/package.json b/package.json index da1e0857..8a5b6b93 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "publishConfig": { "access": "public" }, - "version": "1.0.12", + "version": "1.0.14", "description": "socket protocol", "scripts": { "build": "hardhat export-abi && tsc --project lib.tsconfig.json", @@ -23,29 +23,28 @@ "author": "", "license": "ISC", "devDependencies": { + "@aws-sdk/client-s3": "^3.670.0", "@nomicfoundation/hardhat-verify": "^2.0.12", "@nomiclabs/hardhat-ethers": "2.2.3", "@socket.tech/dl-core": "^2.35.0", + "@socket.tech/socket-protocol-common": "1.1.27", "@typechain/ethers-v5": "^10.0.0", "@typechain/hardhat": "6.0.0", "dotenv": "^16.0.3", "ethers": "5.6.6", + "forge-std": "^1.1.2", "hardhat": "2.12.2", "hardhat-abi-exporter": "2.10.1", "hardhat-change-network": "^0.0.7", "hardhat-deploy": "0.11.20", "hardhat-preprocessor": "0.1.4", + "http-server": "^14.1.1", "pre-commit": "^1.2.2", "prettier": "^2.3.1", "prettier-plugin-solidity": "^1.4.1", "ts-node": "^10.7.0", "typechain": "^8.0.0", - "typescript": "^4.6.4", - "@aws-sdk/client-s3": "^3.670.0", - "@socket.tech/socket-protocol-common": "1.1.24", - "forge-std": "^1.1.2", - "http-server": "^14.1.1" + "typescript": "^4.6.4" }, - "dependencies": { - } + "dependencies": {} } diff --git a/setupInfraContracts.sh b/setupInfraContracts.sh index 71c874b0..5040cc54 100644 --- a/setupInfraContracts.sh +++ b/setupInfraContracts.sh @@ -2,6 +2,6 @@ time npx hardhat run hardhat-scripts/deploy/1.deploy.ts time npx hardhat run hardhat-scripts/deploy/2.roles.ts --no-compile time npx hardhat run hardhat-scripts/deploy/3.upgradeManagers.ts --no-compile time npx hardhat run hardhat-scripts/deploy/4.connect.ts --no-compile -time export AWS_PROFILE=lldev && npx ts-node hardhat-scripts/deploy/5.upload.ts --resolveJsonModule +time npx ts-node hardhat-scripts/deploy/5.upload.ts --resolveJsonModule time npx hardhat run hardhat-scripts/deploy/6.setupEnv.ts --no-compile time npx hardhat run hardhat-scripts/verify/verify.ts --no-compile diff --git a/testScript.sh b/testScript.sh index 818eb715..4db56081 100644 --- a/testScript.sh +++ b/testScript.sh @@ -12,7 +12,9 @@ source .env && forge script script/counter/deployEVMxCounterApp.s.sol --broadcas source .env && forge script script/counter/DeployCounterOnchain.s.sol --broadcast --skip-simulation ## set limits for the app gateway using API source .env && cast send $DEPLOYER "deployContracts(uint32)" 421614 --private-key $PRIVATE_KEY --legacy --gas-price 0 -source .env && cast send $APP_GATEWAY "incrementCounters(address[])" '[0x9Bd3efbd1dA4f58Bd4A11421102FE4B08fAb0121]' --private-key $PRIVATE_KEY --legacy --gas-price 0 +source .env && cast send $APP_GATEWAY "incrementCounters(address[])" '[0x18a93d520879524e0c215b64f05914da5883540f]' --private-key $PRIVATE_KEY --legacy --gas-price 0 +source .env && cast send $APP_GATEWAY "readCounters(address[])" '[0x18a93d520879524e0c215b64f05914da5883540f]' --private-key $PRIVATE_KEY --legacy --gas-price 0 + forge script script/counter/incrementCounters.s.sol --broadcast --skip-simulation forge script script/counter/checkCounters.s.sol --broadcast --skip-simulation @@ -53,4 +55,4 @@ source .env && forge script script/admin/UpdateLimits.s.sol --broadcast --skip-s # add fees source .env && forge script script/PayFeesInArbitrumETH.s.sol --broadcast --skip-simulation -source .env && forge script script/CheckDepositedFees.s.sol +source .env && forge script script/AppGatewayFeeBalance.s.sol diff --git a/yarn.lock b/yarn.lock index 550b8343..b5e5c979 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2124,10 +2124,10 @@ prompts "^2.4.2" yargs "^17.7.1" -"@socket.tech/socket-protocol-common@1.1.24": - version "1.1.24" - resolved "https://registry.yarnpkg.com/@socket.tech/socket-protocol-common/-/socket-protocol-common-1.1.24.tgz#acc4617a20d997a6940f018458904983501f2882" - integrity sha512-1lmxechJL2ultwnhFecp/AWxmy7//eNCrlo7DG6+phzxiTz0VY4Iv2e3xfTjil5IM/8LJ8/NSU51uCgIcezMuw== +"@socket.tech/socket-protocol-common@1.1.27": + version "1.1.27" + resolved "https://registry.yarnpkg.com/@socket.tech/socket-protocol-common/-/socket-protocol-common-1.1.27.tgz#62f1ecee76f9496e98095545a05a03b93bcb3423" + integrity sha512-6zZYNoU0N9dS1UMR0AXBYIqFO84HPopTTxOfM5WTJvOKTiAl/OODza499tOS6o6va/eyaiOaICYW27GoIBJXYw== dependencies: axios "^1.7.9" ethers "^5.6.5" @@ -2286,11 +2286,6 @@ acorn@^8.11.0, acorn@^8.4.1: resolved "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz" integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== -add@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/add/-/add-2.0.6.tgz#248f0a9f6e5a528ef2295dbeec30532130ae2235" - integrity sha512-j5QzrmsokwWWp6kUcJQySpbG+xfOBqqKnup3OIk1pz+kB/80SLorZ9V8zHFLO92Lcd+hbvq8bT+zOGoPkmBV0Q== - adm-zip@^0.4.16: version "0.4.16" resolved "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz" @@ -4980,11 +4975,6 @@ yargs@^17.7.1: y18n "^5.0.5" yargs-parser "^21.1.1" -yarn@^1.22.22: - version "1.22.22" - resolved "https://registry.yarnpkg.com/yarn/-/yarn-1.22.22.tgz#ac34549e6aa8e7ead463a7407e1c7390f61a6610" - integrity sha512-prL3kGtyG7o9Z9Sv8IPfBNrWTDmXB4Qbes8A9rEzt6wkJV8mUvoirjU0Mp3GGAU06Y0XQyA3/2/RQFVuK7MTfg== - yn@3.1.1: version "3.1.1" resolved "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz" From 39c5e87abafecf4128906fb46471391df36e7bd3 Mon Sep 17 00:00:00 2001 From: Akash Date: Thu, 27 Feb 2025 15:00:32 +0400 Subject: [PATCH 163/186] fix: yarn install --- yarn.lock | 3438 +++++++++++++++++++++++++++-------------------------- 1 file changed, 1740 insertions(+), 1698 deletions(-) diff --git a/yarn.lock b/yarn.lock index b5e5c979..95ff999d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4,7 +4,7 @@ "@aws-crypto/crc32@5.2.0": version "5.2.0" - resolved "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-5.2.0.tgz" + resolved "https://registry.yarnpkg.com/@aws-crypto/crc32/-/crc32-5.2.0.tgz#cfcc22570949c98c6689cfcbd2d693d36cdae2e1" integrity sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg== dependencies: "@aws-crypto/util" "^5.2.0" @@ -13,7 +13,7 @@ "@aws-crypto/crc32c@5.2.0": version "5.2.0" - resolved "https://registry.npmjs.org/@aws-crypto/crc32c/-/crc32c-5.2.0.tgz" + resolved "https://registry.yarnpkg.com/@aws-crypto/crc32c/-/crc32c-5.2.0.tgz#4e34aab7f419307821509a98b9b08e84e0c1917e" integrity sha512-+iWb8qaHLYKrNvGRbiYRHSdKRWhto5XlZUEBwDjYNf+ly5SVYG6zEoYIdxvf5R3zyeP16w4PLBn3rH1xc74Rag== dependencies: "@aws-crypto/util" "^5.2.0" @@ -22,7 +22,7 @@ "@aws-crypto/sha1-browser@5.2.0": version "5.2.0" - resolved "https://registry.npmjs.org/@aws-crypto/sha1-browser/-/sha1-browser-5.2.0.tgz" + resolved "https://registry.yarnpkg.com/@aws-crypto/sha1-browser/-/sha1-browser-5.2.0.tgz#b0ee2d2821d3861f017e965ef3b4cb38e3b6a0f4" integrity sha512-OH6lveCFfcDjX4dbAvCFSYUjJZjDr/3XJ3xHtjn3Oj5b9RjojQo8npoLeA/bNwkOkrSQ0wgrHzXk4tDRxGKJeg== dependencies: "@aws-crypto/supports-web-crypto" "^5.2.0" @@ -34,7 +34,7 @@ "@aws-crypto/sha256-browser@5.2.0": version "5.2.0" - resolved "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz" + resolved "https://registry.yarnpkg.com/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz#153895ef1dba6f9fce38af550e0ef58988eb649e" integrity sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw== dependencies: "@aws-crypto/sha256-js" "^5.2.0" @@ -47,7 +47,7 @@ "@aws-crypto/sha256-js@5.2.0", "@aws-crypto/sha256-js@^5.2.0": version "5.2.0" - resolved "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz" + resolved "https://registry.yarnpkg.com/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz#c4fdb773fdbed9a664fc1a95724e206cf3860042" integrity sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA== dependencies: "@aws-crypto/util" "^5.2.0" @@ -56,14 +56,14 @@ "@aws-crypto/supports-web-crypto@^5.2.0": version "5.2.0" - resolved "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz" + resolved "https://registry.yarnpkg.com/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz#a1e399af29269be08e695109aa15da0a07b5b5fb" integrity sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg== dependencies: tslib "^2.6.2" -"@aws-crypto/util@^5.2.0": +"@aws-crypto/util@5.2.0", "@aws-crypto/util@^5.2.0": version "5.2.0" - resolved "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz" + resolved "https://registry.yarnpkg.com/@aws-crypto/util/-/util-5.2.0.tgz#71284c9cffe7927ddadac793c14f14886d3876da" integrity sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ== dependencies: "@aws-sdk/types" "^3.222.0" @@ -71,547 +71,503 @@ tslib "^2.6.2" "@aws-sdk/client-s3@^3.670.0": - version "3.670.0" - resolved "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.670.0.tgz" - integrity sha512-8Pwu1K+PgbYpXDaGKNy5hEbRH5FXHlfXJOhtV4oEDroL7ngix3ZUVWN9oIVVSDK02y1oQS1jCSEGUiUiauzb0g== + version "3.750.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-s3/-/client-s3-3.750.0.tgz#54bbbb930bcc275c9c928d2eb4590c3ee2030d52" + integrity sha512-S9G9noCeBxchoMVkHYrRi1A1xW/VOTP2W7X34lP+Y7Wpl32yMA7IJo0fAGAuTc0q1Nu6/pXDm+oDG7rhTCA1tg== dependencies: "@aws-crypto/sha1-browser" "5.2.0" "@aws-crypto/sha256-browser" "5.2.0" "@aws-crypto/sha256-js" "5.2.0" - "@aws-sdk/client-sso-oidc" "3.670.0" - "@aws-sdk/client-sts" "3.670.0" - "@aws-sdk/core" "3.667.0" - "@aws-sdk/credential-provider-node" "3.670.0" - "@aws-sdk/middleware-bucket-endpoint" "3.667.0" - "@aws-sdk/middleware-expect-continue" "3.667.0" - "@aws-sdk/middleware-flexible-checksums" "3.669.0" - "@aws-sdk/middleware-host-header" "3.667.0" - "@aws-sdk/middleware-location-constraint" "3.667.0" - "@aws-sdk/middleware-logger" "3.667.0" - "@aws-sdk/middleware-recursion-detection" "3.667.0" - "@aws-sdk/middleware-sdk-s3" "3.669.0" - "@aws-sdk/middleware-ssec" "3.667.0" - "@aws-sdk/middleware-user-agent" "3.669.0" - "@aws-sdk/region-config-resolver" "3.667.0" - "@aws-sdk/signature-v4-multi-region" "3.669.0" - "@aws-sdk/types" "3.667.0" - "@aws-sdk/util-endpoints" "3.667.0" - "@aws-sdk/util-user-agent-browser" "3.670.0" - "@aws-sdk/util-user-agent-node" "3.669.0" - "@aws-sdk/xml-builder" "3.662.0" - "@smithy/config-resolver" "^3.0.9" - "@smithy/core" "^2.4.8" - "@smithy/eventstream-serde-browser" "^3.0.10" - "@smithy/eventstream-serde-config-resolver" "^3.0.7" - "@smithy/eventstream-serde-node" "^3.0.9" - "@smithy/fetch-http-handler" "^3.2.9" - "@smithy/hash-blob-browser" "^3.1.6" - "@smithy/hash-node" "^3.0.7" - "@smithy/hash-stream-node" "^3.1.6" - "@smithy/invalid-dependency" "^3.0.7" - "@smithy/md5-js" "^3.0.7" - "@smithy/middleware-content-length" "^3.0.9" - "@smithy/middleware-endpoint" "^3.1.4" - "@smithy/middleware-retry" "^3.0.23" - "@smithy/middleware-serde" "^3.0.7" - "@smithy/middleware-stack" "^3.0.7" - "@smithy/node-config-provider" "^3.1.8" - "@smithy/node-http-handler" "^3.2.4" - "@smithy/protocol-http" "^4.1.4" - "@smithy/smithy-client" "^3.4.0" - "@smithy/types" "^3.5.0" - "@smithy/url-parser" "^3.0.7" - "@smithy/util-base64" "^3.0.0" - "@smithy/util-body-length-browser" "^3.0.0" - "@smithy/util-body-length-node" "^3.0.0" - "@smithy/util-defaults-mode-browser" "^3.0.23" - "@smithy/util-defaults-mode-node" "^3.0.23" - "@smithy/util-endpoints" "^2.1.3" - "@smithy/util-middleware" "^3.0.7" - "@smithy/util-retry" "^3.0.7" - "@smithy/util-stream" "^3.1.9" - "@smithy/util-utf8" "^3.0.0" - "@smithy/util-waiter" "^3.1.6" + "@aws-sdk/core" "3.750.0" + "@aws-sdk/credential-provider-node" "3.750.0" + "@aws-sdk/middleware-bucket-endpoint" "3.734.0" + "@aws-sdk/middleware-expect-continue" "3.734.0" + "@aws-sdk/middleware-flexible-checksums" "3.750.0" + "@aws-sdk/middleware-host-header" "3.734.0" + "@aws-sdk/middleware-location-constraint" "3.734.0" + "@aws-sdk/middleware-logger" "3.734.0" + "@aws-sdk/middleware-recursion-detection" "3.734.0" + "@aws-sdk/middleware-sdk-s3" "3.750.0" + "@aws-sdk/middleware-ssec" "3.734.0" + "@aws-sdk/middleware-user-agent" "3.750.0" + "@aws-sdk/region-config-resolver" "3.734.0" + "@aws-sdk/signature-v4-multi-region" "3.750.0" + "@aws-sdk/types" "3.734.0" + "@aws-sdk/util-endpoints" "3.743.0" + "@aws-sdk/util-user-agent-browser" "3.734.0" + "@aws-sdk/util-user-agent-node" "3.750.0" + "@aws-sdk/xml-builder" "3.734.0" + "@smithy/config-resolver" "^4.0.1" + "@smithy/core" "^3.1.4" + "@smithy/eventstream-serde-browser" "^4.0.1" + "@smithy/eventstream-serde-config-resolver" "^4.0.1" + "@smithy/eventstream-serde-node" "^4.0.1" + "@smithy/fetch-http-handler" "^5.0.1" + "@smithy/hash-blob-browser" "^4.0.1" + "@smithy/hash-node" "^4.0.1" + "@smithy/hash-stream-node" "^4.0.1" + "@smithy/invalid-dependency" "^4.0.1" + "@smithy/md5-js" "^4.0.1" + "@smithy/middleware-content-length" "^4.0.1" + "@smithy/middleware-endpoint" "^4.0.5" + "@smithy/middleware-retry" "^4.0.6" + "@smithy/middleware-serde" "^4.0.2" + "@smithy/middleware-stack" "^4.0.1" + "@smithy/node-config-provider" "^4.0.1" + "@smithy/node-http-handler" "^4.0.2" + "@smithy/protocol-http" "^5.0.1" + "@smithy/smithy-client" "^4.1.5" + "@smithy/types" "^4.1.0" + "@smithy/url-parser" "^4.0.1" + "@smithy/util-base64" "^4.0.0" + "@smithy/util-body-length-browser" "^4.0.0" + "@smithy/util-body-length-node" "^4.0.0" + "@smithy/util-defaults-mode-browser" "^4.0.6" + "@smithy/util-defaults-mode-node" "^4.0.6" + "@smithy/util-endpoints" "^3.0.1" + "@smithy/util-middleware" "^4.0.1" + "@smithy/util-retry" "^4.0.1" + "@smithy/util-stream" "^4.1.1" + "@smithy/util-utf8" "^4.0.0" + "@smithy/util-waiter" "^4.0.2" tslib "^2.6.2" -"@aws-sdk/client-sso-oidc@3.670.0": - version "3.670.0" - resolved "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.670.0.tgz" - integrity sha512-4qDK2L36Q4J1lfemaHHd9ZxqKRaos3STp44qPAHf/8QyX6Uk5sXgZNVO2yWM7SIEtVKwwBh/fZAsdBkGPBfZcw== +"@aws-sdk/client-sso@3.750.0": + version "3.750.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso/-/client-sso-3.750.0.tgz#b45864b78057504f823b2927535ac60b7c5583b2" + integrity sha512-y0Rx6pTQXw0E61CaptpZF65qNggjqOgymq/RYZU5vWba5DGQ+iqGt8Yq8s+jfBoBBNXshxq8l8Dl5Uq/JTY1wg== dependencies: "@aws-crypto/sha256-browser" "5.2.0" "@aws-crypto/sha256-js" "5.2.0" - "@aws-sdk/core" "3.667.0" - "@aws-sdk/credential-provider-node" "3.670.0" - "@aws-sdk/middleware-host-header" "3.667.0" - "@aws-sdk/middleware-logger" "3.667.0" - "@aws-sdk/middleware-recursion-detection" "3.667.0" - "@aws-sdk/middleware-user-agent" "3.669.0" - "@aws-sdk/region-config-resolver" "3.667.0" - "@aws-sdk/types" "3.667.0" - "@aws-sdk/util-endpoints" "3.667.0" - "@aws-sdk/util-user-agent-browser" "3.670.0" - "@aws-sdk/util-user-agent-node" "3.669.0" - "@smithy/config-resolver" "^3.0.9" - "@smithy/core" "^2.4.8" - "@smithy/fetch-http-handler" "^3.2.9" - "@smithy/hash-node" "^3.0.7" - "@smithy/invalid-dependency" "^3.0.7" - "@smithy/middleware-content-length" "^3.0.9" - "@smithy/middleware-endpoint" "^3.1.4" - "@smithy/middleware-retry" "^3.0.23" - "@smithy/middleware-serde" "^3.0.7" - "@smithy/middleware-stack" "^3.0.7" - "@smithy/node-config-provider" "^3.1.8" - "@smithy/node-http-handler" "^3.2.4" - "@smithy/protocol-http" "^4.1.4" - "@smithy/smithy-client" "^3.4.0" - "@smithy/types" "^3.5.0" - "@smithy/url-parser" "^3.0.7" - "@smithy/util-base64" "^3.0.0" - "@smithy/util-body-length-browser" "^3.0.0" - "@smithy/util-body-length-node" "^3.0.0" - "@smithy/util-defaults-mode-browser" "^3.0.23" - "@smithy/util-defaults-mode-node" "^3.0.23" - "@smithy/util-endpoints" "^2.1.3" - "@smithy/util-middleware" "^3.0.7" - "@smithy/util-retry" "^3.0.7" - "@smithy/util-utf8" "^3.0.0" + "@aws-sdk/core" "3.750.0" + "@aws-sdk/middleware-host-header" "3.734.0" + "@aws-sdk/middleware-logger" "3.734.0" + "@aws-sdk/middleware-recursion-detection" "3.734.0" + "@aws-sdk/middleware-user-agent" "3.750.0" + "@aws-sdk/region-config-resolver" "3.734.0" + "@aws-sdk/types" "3.734.0" + "@aws-sdk/util-endpoints" "3.743.0" + "@aws-sdk/util-user-agent-browser" "3.734.0" + "@aws-sdk/util-user-agent-node" "3.750.0" + "@smithy/config-resolver" "^4.0.1" + "@smithy/core" "^3.1.4" + "@smithy/fetch-http-handler" "^5.0.1" + "@smithy/hash-node" "^4.0.1" + "@smithy/invalid-dependency" "^4.0.1" + "@smithy/middleware-content-length" "^4.0.1" + "@smithy/middleware-endpoint" "^4.0.5" + "@smithy/middleware-retry" "^4.0.6" + "@smithy/middleware-serde" "^4.0.2" + "@smithy/middleware-stack" "^4.0.1" + "@smithy/node-config-provider" "^4.0.1" + "@smithy/node-http-handler" "^4.0.2" + "@smithy/protocol-http" "^5.0.1" + "@smithy/smithy-client" "^4.1.5" + "@smithy/types" "^4.1.0" + "@smithy/url-parser" "^4.0.1" + "@smithy/util-base64" "^4.0.0" + "@smithy/util-body-length-browser" "^4.0.0" + "@smithy/util-body-length-node" "^4.0.0" + "@smithy/util-defaults-mode-browser" "^4.0.6" + "@smithy/util-defaults-mode-node" "^4.0.6" + "@smithy/util-endpoints" "^3.0.1" + "@smithy/util-middleware" "^4.0.1" + "@smithy/util-retry" "^4.0.1" + "@smithy/util-utf8" "^4.0.0" tslib "^2.6.2" -"@aws-sdk/client-sso@3.670.0": - version "3.670.0" - resolved "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.670.0.tgz" - integrity sha512-J+oz6uSsDvk4pimMDnKJb1wsV216zTrejvMTIL4RhUD1QPIVVOpteTdUShcjZUIZnkcJZGI+cym/SFK0kuzTpg== - dependencies: - "@aws-crypto/sha256-browser" "5.2.0" - "@aws-crypto/sha256-js" "5.2.0" - "@aws-sdk/core" "3.667.0" - "@aws-sdk/middleware-host-header" "3.667.0" - "@aws-sdk/middleware-logger" "3.667.0" - "@aws-sdk/middleware-recursion-detection" "3.667.0" - "@aws-sdk/middleware-user-agent" "3.669.0" - "@aws-sdk/region-config-resolver" "3.667.0" - "@aws-sdk/types" "3.667.0" - "@aws-sdk/util-endpoints" "3.667.0" - "@aws-sdk/util-user-agent-browser" "3.670.0" - "@aws-sdk/util-user-agent-node" "3.669.0" - "@smithy/config-resolver" "^3.0.9" - "@smithy/core" "^2.4.8" - "@smithy/fetch-http-handler" "^3.2.9" - "@smithy/hash-node" "^3.0.7" - "@smithy/invalid-dependency" "^3.0.7" - "@smithy/middleware-content-length" "^3.0.9" - "@smithy/middleware-endpoint" "^3.1.4" - "@smithy/middleware-retry" "^3.0.23" - "@smithy/middleware-serde" "^3.0.7" - "@smithy/middleware-stack" "^3.0.7" - "@smithy/node-config-provider" "^3.1.8" - "@smithy/node-http-handler" "^3.2.4" - "@smithy/protocol-http" "^4.1.4" - "@smithy/smithy-client" "^3.4.0" - "@smithy/types" "^3.5.0" - "@smithy/url-parser" "^3.0.7" - "@smithy/util-base64" "^3.0.0" - "@smithy/util-body-length-browser" "^3.0.0" - "@smithy/util-body-length-node" "^3.0.0" - "@smithy/util-defaults-mode-browser" "^3.0.23" - "@smithy/util-defaults-mode-node" "^3.0.23" - "@smithy/util-endpoints" "^2.1.3" - "@smithy/util-middleware" "^3.0.7" - "@smithy/util-retry" "^3.0.7" - "@smithy/util-utf8" "^3.0.0" - tslib "^2.6.2" - -"@aws-sdk/client-sts@3.670.0": - version "3.670.0" - resolved "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.670.0.tgz" - integrity sha512-bExrNo8ZVWorS3cjMZKQnA2HWqDmAzcZoSN/cPVoPFNkHwdl1lzPxvcLzmhpIr48JHgKfybBjrbluDZfIYeEog== - dependencies: - "@aws-crypto/sha256-browser" "5.2.0" - "@aws-crypto/sha256-js" "5.2.0" - "@aws-sdk/client-sso-oidc" "3.670.0" - "@aws-sdk/core" "3.667.0" - "@aws-sdk/credential-provider-node" "3.670.0" - "@aws-sdk/middleware-host-header" "3.667.0" - "@aws-sdk/middleware-logger" "3.667.0" - "@aws-sdk/middleware-recursion-detection" "3.667.0" - "@aws-sdk/middleware-user-agent" "3.669.0" - "@aws-sdk/region-config-resolver" "3.667.0" - "@aws-sdk/types" "3.667.0" - "@aws-sdk/util-endpoints" "3.667.0" - "@aws-sdk/util-user-agent-browser" "3.670.0" - "@aws-sdk/util-user-agent-node" "3.669.0" - "@smithy/config-resolver" "^3.0.9" - "@smithy/core" "^2.4.8" - "@smithy/fetch-http-handler" "^3.2.9" - "@smithy/hash-node" "^3.0.7" - "@smithy/invalid-dependency" "^3.0.7" - "@smithy/middleware-content-length" "^3.0.9" - "@smithy/middleware-endpoint" "^3.1.4" - "@smithy/middleware-retry" "^3.0.23" - "@smithy/middleware-serde" "^3.0.7" - "@smithy/middleware-stack" "^3.0.7" - "@smithy/node-config-provider" "^3.1.8" - "@smithy/node-http-handler" "^3.2.4" - "@smithy/protocol-http" "^4.1.4" - "@smithy/smithy-client" "^3.4.0" - "@smithy/types" "^3.5.0" - "@smithy/url-parser" "^3.0.7" - "@smithy/util-base64" "^3.0.0" - "@smithy/util-body-length-browser" "^3.0.0" - "@smithy/util-body-length-node" "^3.0.0" - "@smithy/util-defaults-mode-browser" "^3.0.23" - "@smithy/util-defaults-mode-node" "^3.0.23" - "@smithy/util-endpoints" "^2.1.3" - "@smithy/util-middleware" "^3.0.7" - "@smithy/util-retry" "^3.0.7" - "@smithy/util-utf8" "^3.0.0" - tslib "^2.6.2" - -"@aws-sdk/core@3.667.0": - version "3.667.0" - resolved "https://registry.npmjs.org/@aws-sdk/core/-/core-3.667.0.tgz" - integrity sha512-pMcDVI7Tmdsc8R3sDv0Omj/4iRParGY+uJtAfF669WnZfDfaBQaix2Mq7+Mu08vdjqO9K3gicFvjk9S1VLmOKA== - dependencies: - "@aws-sdk/types" "3.667.0" - "@smithy/core" "^2.4.8" - "@smithy/node-config-provider" "^3.1.8" - "@smithy/property-provider" "^3.1.7" - "@smithy/protocol-http" "^4.1.4" - "@smithy/signature-v4" "^4.2.0" - "@smithy/smithy-client" "^3.4.0" - "@smithy/types" "^3.5.0" - "@smithy/util-middleware" "^3.0.7" +"@aws-sdk/core@3.750.0": + version "3.750.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/core/-/core-3.750.0.tgz#087ce3dd86e2e94e9a2828506a82223ae9f364ff" + integrity sha512-bZ5K7N5L4+Pa2epbVpUQqd1XLG2uU8BGs/Sd+2nbgTf+lNQJyIxAg/Qsrjz9MzmY8zzQIeRQEkNmR6yVAfCmmQ== + dependencies: + "@aws-sdk/types" "3.734.0" + "@smithy/core" "^3.1.4" + "@smithy/node-config-provider" "^4.0.1" + "@smithy/property-provider" "^4.0.1" + "@smithy/protocol-http" "^5.0.1" + "@smithy/signature-v4" "^5.0.1" + "@smithy/smithy-client" "^4.1.5" + "@smithy/types" "^4.1.0" + "@smithy/util-middleware" "^4.0.1" fast-xml-parser "4.4.1" tslib "^2.6.2" -"@aws-sdk/credential-provider-env@3.667.0": - version "3.667.0" - resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.667.0.tgz" - integrity sha512-zZbrkkaPc54WXm+QAnpuv0LPNfsts0HPPd+oCECGs7IQRaFsGj187cwvPg9RMWDFZqpm64MdBDoA8OQHsqzYCw== +"@aws-sdk/credential-provider-env@3.750.0": + version "3.750.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.750.0.tgz#adfa47d24bb9ea0d87993c6998b1ddc38fd3444f" + integrity sha512-In6bsG0p/P31HcH4DBRKBbcDS/3SHvEPjfXV8ODPWZO/l3/p7IRoYBdQ07C9R+VMZU2D0+/Sc/DWK/TUNDk1+Q== dependencies: - "@aws-sdk/core" "3.667.0" - "@aws-sdk/types" "3.667.0" - "@smithy/property-provider" "^3.1.7" - "@smithy/types" "^3.5.0" + "@aws-sdk/core" "3.750.0" + "@aws-sdk/types" "3.734.0" + "@smithy/property-provider" "^4.0.1" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@aws-sdk/credential-provider-http@3.667.0": - version "3.667.0" - resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.667.0.tgz" - integrity sha512-sjtybFfERZWiqTY7fswBxKQLvUkiCucOWyqh3IaPo/4nE1PXRnaZCVG0+kRBPrYIxWqiVwytvZzMJy8sVZcG0A== - dependencies: - "@aws-sdk/core" "3.667.0" - "@aws-sdk/types" "3.667.0" - "@smithy/fetch-http-handler" "^3.2.9" - "@smithy/node-http-handler" "^3.2.4" - "@smithy/property-provider" "^3.1.7" - "@smithy/protocol-http" "^4.1.4" - "@smithy/smithy-client" "^3.4.0" - "@smithy/types" "^3.5.0" - "@smithy/util-stream" "^3.1.9" +"@aws-sdk/credential-provider-http@3.750.0": + version "3.750.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-http/-/credential-provider-http-3.750.0.tgz#2879dde158dfccb21165aab95c90b7286bcdd5cf" + integrity sha512-wFB9qqfa20AB0dElsQz5ZlZT5o+a+XzpEpmg0erylmGYqEOvh8NQWfDUVpRmQuGq9VbvW/8cIbxPoNqEbPtuWQ== + dependencies: + "@aws-sdk/core" "3.750.0" + "@aws-sdk/types" "3.734.0" + "@smithy/fetch-http-handler" "^5.0.1" + "@smithy/node-http-handler" "^4.0.2" + "@smithy/property-provider" "^4.0.1" + "@smithy/protocol-http" "^5.0.1" + "@smithy/smithy-client" "^4.1.5" + "@smithy/types" "^4.1.0" + "@smithy/util-stream" "^4.1.1" tslib "^2.6.2" -"@aws-sdk/credential-provider-ini@3.670.0": - version "3.670.0" - resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.670.0.tgz" - integrity sha512-TB1gacUj75leaTt2JsCTzygDSIk4ksv9uZoR7VenlgFPRktyOeT+fapwIVBeB2Qg7b9uxAY2K5XkKstDZyBEEw== - dependencies: - "@aws-sdk/core" "3.667.0" - "@aws-sdk/credential-provider-env" "3.667.0" - "@aws-sdk/credential-provider-http" "3.667.0" - "@aws-sdk/credential-provider-process" "3.667.0" - "@aws-sdk/credential-provider-sso" "3.670.0" - "@aws-sdk/credential-provider-web-identity" "3.667.0" - "@aws-sdk/types" "3.667.0" - "@smithy/credential-provider-imds" "^3.2.4" - "@smithy/property-provider" "^3.1.7" - "@smithy/shared-ini-file-loader" "^3.1.8" - "@smithy/types" "^3.5.0" +"@aws-sdk/credential-provider-ini@3.750.0": + version "3.750.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.750.0.tgz#5079c5732ac886d72f357c0da532749d0c7487fd" + integrity sha512-2YIZmyEr5RUd3uxXpxOLD9G67Bibm4I/65M6vKFP17jVMUT+R1nL7mKqmhEVO2p+BoeV+bwMyJ/jpTYG368PCg== + dependencies: + "@aws-sdk/core" "3.750.0" + "@aws-sdk/credential-provider-env" "3.750.0" + "@aws-sdk/credential-provider-http" "3.750.0" + "@aws-sdk/credential-provider-process" "3.750.0" + "@aws-sdk/credential-provider-sso" "3.750.0" + "@aws-sdk/credential-provider-web-identity" "3.750.0" + "@aws-sdk/nested-clients" "3.750.0" + "@aws-sdk/types" "3.734.0" + "@smithy/credential-provider-imds" "^4.0.1" + "@smithy/property-provider" "^4.0.1" + "@smithy/shared-ini-file-loader" "^4.0.1" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@aws-sdk/credential-provider-node@3.670.0": - version "3.670.0" - resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.670.0.tgz" - integrity sha512-zwNrRYzubk4CaZ7zebeDhxsm8QtNWkbGKopZPOaZSnd5uqUGRcmx4ccVRngWUK68XDP44aEUWC8iU5Pc7btpHQ== - dependencies: - "@aws-sdk/credential-provider-env" "3.667.0" - "@aws-sdk/credential-provider-http" "3.667.0" - "@aws-sdk/credential-provider-ini" "3.670.0" - "@aws-sdk/credential-provider-process" "3.667.0" - "@aws-sdk/credential-provider-sso" "3.670.0" - "@aws-sdk/credential-provider-web-identity" "3.667.0" - "@aws-sdk/types" "3.667.0" - "@smithy/credential-provider-imds" "^3.2.4" - "@smithy/property-provider" "^3.1.7" - "@smithy/shared-ini-file-loader" "^3.1.8" - "@smithy/types" "^3.5.0" +"@aws-sdk/credential-provider-node@3.750.0": + version "3.750.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.750.0.tgz#0eb117a287dac34040fb8cdf65d7d239b703b2ff" + integrity sha512-THWHHAceLwsOiowPEmKyhWVDlEUxH07GHSw5AQFDvNQtGKOQl0HSIFO1mKObT2Q2Vqzji9Bq8H58SO5BFtNPRw== + dependencies: + "@aws-sdk/credential-provider-env" "3.750.0" + "@aws-sdk/credential-provider-http" "3.750.0" + "@aws-sdk/credential-provider-ini" "3.750.0" + "@aws-sdk/credential-provider-process" "3.750.0" + "@aws-sdk/credential-provider-sso" "3.750.0" + "@aws-sdk/credential-provider-web-identity" "3.750.0" + "@aws-sdk/types" "3.734.0" + "@smithy/credential-provider-imds" "^4.0.1" + "@smithy/property-provider" "^4.0.1" + "@smithy/shared-ini-file-loader" "^4.0.1" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@aws-sdk/credential-provider-process@3.667.0": - version "3.667.0" - resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.667.0.tgz" - integrity sha512-HZHnvop32fKgsNHkdhVaul7UzQ25sEc0j9yqA4bjhtbk0ECl42kj3f1pJ+ZU/YD9ut8lMJs/vVqiOdNThVdeBw== +"@aws-sdk/credential-provider-process@3.750.0": + version "3.750.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.750.0.tgz#04ecf72fb30dbe6b360ea9371446f13183701b5e" + integrity sha512-Q78SCH1n0m7tpu36sJwfrUSxI8l611OyysjQeMiIOliVfZICEoHcLHLcLkiR+tnIpZ3rk7d2EQ6R1jwlXnalMQ== dependencies: - "@aws-sdk/core" "3.667.0" - "@aws-sdk/types" "3.667.0" - "@smithy/property-provider" "^3.1.7" - "@smithy/shared-ini-file-loader" "^3.1.8" - "@smithy/types" "^3.5.0" + "@aws-sdk/core" "3.750.0" + "@aws-sdk/types" "3.734.0" + "@smithy/property-provider" "^4.0.1" + "@smithy/shared-ini-file-loader" "^4.0.1" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@aws-sdk/credential-provider-sso@3.670.0": - version "3.670.0" - resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.670.0.tgz" - integrity sha512-5PkA8BOy4q57Vhe9AESoHKZ7vjRbElNPKjXA4qC01xY+DitClRFz4O3B9sMzFp0PHlz9nDVSXXKgq0yzF/nAag== - dependencies: - "@aws-sdk/client-sso" "3.670.0" - "@aws-sdk/core" "3.667.0" - "@aws-sdk/token-providers" "3.667.0" - "@aws-sdk/types" "3.667.0" - "@smithy/property-provider" "^3.1.7" - "@smithy/shared-ini-file-loader" "^3.1.8" - "@smithy/types" "^3.5.0" +"@aws-sdk/credential-provider-sso@3.750.0": + version "3.750.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.750.0.tgz#a96afc83cfd63a957c5b9ed7913d60830c5b1f57" + integrity sha512-FGYrDjXN/FOQVi/t8fHSv8zCk+NEvtFnuc4cZUj5OIbM4vrfFc5VaPyn41Uza3iv6Qq9rZg0QOwWnqK8lNrqUw== + dependencies: + "@aws-sdk/client-sso" "3.750.0" + "@aws-sdk/core" "3.750.0" + "@aws-sdk/token-providers" "3.750.0" + "@aws-sdk/types" "3.734.0" + "@smithy/property-provider" "^4.0.1" + "@smithy/shared-ini-file-loader" "^4.0.1" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@aws-sdk/credential-provider-web-identity@3.667.0": - version "3.667.0" - resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.667.0.tgz" - integrity sha512-t8CFlZMD/1p/8Cli3rvRiTJpjr/8BO64gw166AHgFZYSN2h95L2l1tcW0jpsc3PprA32nLg1iQVKYt4WGM4ugw== +"@aws-sdk/credential-provider-web-identity@3.750.0": + version "3.750.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.750.0.tgz#2ab785cced1326f253c324d6ec10f74a02506c00" + integrity sha512-Nz8zs3YJ+GOTSrq+LyzbbC1Ffpt7pK38gcOyNZv76pP5MswKTUKNYBJehqwa+i7FcFQHsCk3TdhR8MT1ZR23uA== dependencies: - "@aws-sdk/core" "3.667.0" - "@aws-sdk/types" "3.667.0" - "@smithy/property-provider" "^3.1.7" - "@smithy/types" "^3.5.0" + "@aws-sdk/core" "3.750.0" + "@aws-sdk/nested-clients" "3.750.0" + "@aws-sdk/types" "3.734.0" + "@smithy/property-provider" "^4.0.1" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@aws-sdk/middleware-bucket-endpoint@3.667.0": - version "3.667.0" - resolved "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.667.0.tgz" - integrity sha512-XGz4jMAkDoTyFdtLz7ZF+C05IAhCTC1PllpvTBaj821z/L0ilhbqVhrT/f2Buw8Id/K5A390csGXgusXyrFFjA== - dependencies: - "@aws-sdk/types" "3.667.0" - "@aws-sdk/util-arn-parser" "3.568.0" - "@smithy/node-config-provider" "^3.1.8" - "@smithy/protocol-http" "^4.1.4" - "@smithy/types" "^3.5.0" - "@smithy/util-config-provider" "^3.0.0" +"@aws-sdk/middleware-bucket-endpoint@3.734.0": + version "3.734.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.734.0.tgz#af63fcaa865d3a47fd0ca3933eef04761f232677" + integrity sha512-etC7G18aF7KdZguW27GE/wpbrNmYLVT755EsFc8kXpZj8D6AFKxc7OuveinJmiy0bYXAMspJUWsF6CrGpOw6CQ== + dependencies: + "@aws-sdk/types" "3.734.0" + "@aws-sdk/util-arn-parser" "3.723.0" + "@smithy/node-config-provider" "^4.0.1" + "@smithy/protocol-http" "^5.0.1" + "@smithy/types" "^4.1.0" + "@smithy/util-config-provider" "^4.0.0" tslib "^2.6.2" -"@aws-sdk/middleware-expect-continue@3.667.0": - version "3.667.0" - resolved "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.667.0.tgz" - integrity sha512-0TiSL9S5DSG95NHGIz6qTMuV7GDKVn8tvvGSrSSZu/wXO3JaYSH0AElVpYfc4PtPRqVpEyNA7nnc7W56mMCLWQ== +"@aws-sdk/middleware-expect-continue@3.734.0": + version "3.734.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.734.0.tgz#8159d81c3a8d9a9d60183fdeb7e8d6674f01c1cd" + integrity sha512-P38/v1l6HjuB2aFUewt7ueAW5IvKkFcv5dalPtbMGRhLeyivBOHwbCyuRKgVs7z7ClTpu9EaViEGki2jEQqEsQ== dependencies: - "@aws-sdk/types" "3.667.0" - "@smithy/protocol-http" "^4.1.4" - "@smithy/types" "^3.5.0" + "@aws-sdk/types" "3.734.0" + "@smithy/protocol-http" "^5.0.1" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@aws-sdk/middleware-flexible-checksums@3.669.0": - version "3.669.0" - resolved "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.669.0.tgz" - integrity sha512-01UQLoUzVwWMf+b+AEuwJ2lluBD+Cp8AcbyEHqvEaPdjGKHIS4BCvnY70mZYnAfRtL8R2h9tt7iI61oWU3Gjkg== +"@aws-sdk/middleware-flexible-checksums@3.750.0": + version "3.750.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.750.0.tgz#7ba7defd7b90b22b0aacedcc05072cb7fc50532c" + integrity sha512-ach0d2buDnX2TUausUbiXXFWFo3IegLnCrA+Rw8I9AYVpLN9lTaRwAYJwYC6zEuW9Golff8MwkYsp/OaC5tKMw== dependencies: "@aws-crypto/crc32" "5.2.0" "@aws-crypto/crc32c" "5.2.0" - "@aws-sdk/core" "3.667.0" - "@aws-sdk/types" "3.667.0" - "@smithy/is-array-buffer" "^3.0.0" - "@smithy/node-config-provider" "^3.1.8" - "@smithy/protocol-http" "^4.1.4" - "@smithy/types" "^3.5.0" - "@smithy/util-middleware" "^3.0.7" - "@smithy/util-utf8" "^3.0.0" + "@aws-crypto/util" "5.2.0" + "@aws-sdk/core" "3.750.0" + "@aws-sdk/types" "3.734.0" + "@smithy/is-array-buffer" "^4.0.0" + "@smithy/node-config-provider" "^4.0.1" + "@smithy/protocol-http" "^5.0.1" + "@smithy/types" "^4.1.0" + "@smithy/util-middleware" "^4.0.1" + "@smithy/util-stream" "^4.1.1" + "@smithy/util-utf8" "^4.0.0" tslib "^2.6.2" -"@aws-sdk/middleware-host-header@3.667.0": - version "3.667.0" - resolved "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.667.0.tgz" - integrity sha512-Z7fIAMQnPegs7JjAQvlOeWXwpMRfegh5eCoIP6VLJIeR6DLfYKbP35JBtt98R6DXslrN2RsbTogjbxPEDQfw1w== +"@aws-sdk/middleware-host-header@3.734.0": + version "3.734.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-host-header/-/middleware-host-header-3.734.0.tgz#a9a02c055352f5c435cc925a4e1e79b7ba41b1b5" + integrity sha512-LW7RRgSOHHBzWZnigNsDIzu3AiwtjeI2X66v+Wn1P1u+eXssy1+up4ZY/h+t2sU4LU36UvEf+jrZti9c6vRnFw== dependencies: - "@aws-sdk/types" "3.667.0" - "@smithy/protocol-http" "^4.1.4" - "@smithy/types" "^3.5.0" + "@aws-sdk/types" "3.734.0" + "@smithy/protocol-http" "^5.0.1" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@aws-sdk/middleware-location-constraint@3.667.0": - version "3.667.0" - resolved "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.667.0.tgz" - integrity sha512-ob85H3HhT3/u5O+x0o557xGZ78vSNeSSwMaSitxdsfs2hOuoUl1uk+OeLpi1hkuJnL41FPpokV7TVII2XrFfmg== +"@aws-sdk/middleware-location-constraint@3.734.0": + version "3.734.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.734.0.tgz#fd1dc0e080ed85dd1feb7db3736c80689db4be07" + integrity sha512-EJEIXwCQhto/cBfHdm3ZOeLxd2NlJD+X2F+ZTOxzokuhBtY0IONfC/91hOo5tWQweerojwshSMHRCKzRv1tlwg== dependencies: - "@aws-sdk/types" "3.667.0" - "@smithy/types" "^3.5.0" + "@aws-sdk/types" "3.734.0" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@aws-sdk/middleware-logger@3.667.0": - version "3.667.0" - resolved "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.667.0.tgz" - integrity sha512-PtTRNpNm/5c746jRgZCNg4X9xEJIwggkGJrF0GP9AB1ANg4pc/sF2Fvn1NtqPe9wtQ2stunJprnm5WkCHN7QiA== +"@aws-sdk/middleware-logger@3.734.0": + version "3.734.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-logger/-/middleware-logger-3.734.0.tgz#d31e141ae7a78667e372953a3b86905bc6124664" + integrity sha512-mUMFITpJUW3LcKvFok176eI5zXAUomVtahb9IQBwLzkqFYOrMJvWAvoV4yuxrJ8TlQBG8gyEnkb9SnhZvjg67w== dependencies: - "@aws-sdk/types" "3.667.0" - "@smithy/types" "^3.5.0" + "@aws-sdk/types" "3.734.0" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@aws-sdk/middleware-recursion-detection@3.667.0": - version "3.667.0" - resolved "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.667.0.tgz" - integrity sha512-U5glWD3ehFohzpUpopLtmqAlDurGWo2wRGPNgi4SwhWU7UDt6LS7E/UvJjqC0CUrjlzOw+my2A+Ncf+fisMhxQ== +"@aws-sdk/middleware-recursion-detection@3.734.0": + version "3.734.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.734.0.tgz#4fa1deb9887455afbb39130f7d9bc89ccee17168" + integrity sha512-CUat2d9ITsFc2XsmeiRQO96iWpxSKYFjxvj27Hc7vo87YUHRnfMfnc8jw1EpxEwMcvBD7LsRa6vDNky6AjcrFA== dependencies: - "@aws-sdk/types" "3.667.0" - "@smithy/protocol-http" "^4.1.4" - "@smithy/types" "^3.5.0" + "@aws-sdk/types" "3.734.0" + "@smithy/protocol-http" "^5.0.1" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@aws-sdk/middleware-sdk-s3@3.669.0": - version "3.669.0" - resolved "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.669.0.tgz" - integrity sha512-b2QUQ7DcIcVCUFhvmFEDI90BemvQhO0ntIajllLqQSy88PSNdLDCVx5mIzfxaaK/1tdY/UsEDRRm1kMQHJDQpg== - dependencies: - "@aws-sdk/core" "3.667.0" - "@aws-sdk/types" "3.667.0" - "@aws-sdk/util-arn-parser" "3.568.0" - "@smithy/core" "^2.4.8" - "@smithy/node-config-provider" "^3.1.8" - "@smithy/protocol-http" "^4.1.4" - "@smithy/signature-v4" "^4.2.0" - "@smithy/smithy-client" "^3.4.0" - "@smithy/types" "^3.5.0" - "@smithy/util-config-provider" "^3.0.0" - "@smithy/util-middleware" "^3.0.7" - "@smithy/util-stream" "^3.1.9" - "@smithy/util-utf8" "^3.0.0" +"@aws-sdk/middleware-sdk-s3@3.750.0": + version "3.750.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.750.0.tgz#35f372310b3f2150e3ea8aee292e1b98fb40c1f0" + integrity sha512-3H6Z46cmAQCHQ0z8mm7/cftY5ifiLfCjbObrbyyp2fhQs9zk6gCKzIX8Zjhw0RMd93FZi3ebRuKJWmMglf4Itw== + dependencies: + "@aws-sdk/core" "3.750.0" + "@aws-sdk/types" "3.734.0" + "@aws-sdk/util-arn-parser" "3.723.0" + "@smithy/core" "^3.1.4" + "@smithy/node-config-provider" "^4.0.1" + "@smithy/protocol-http" "^5.0.1" + "@smithy/signature-v4" "^5.0.1" + "@smithy/smithy-client" "^4.1.5" + "@smithy/types" "^4.1.0" + "@smithy/util-config-provider" "^4.0.0" + "@smithy/util-middleware" "^4.0.1" + "@smithy/util-stream" "^4.1.1" + "@smithy/util-utf8" "^4.0.0" tslib "^2.6.2" -"@aws-sdk/middleware-ssec@3.667.0": - version "3.667.0" - resolved "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.667.0.tgz" - integrity sha512-1wuAUZIkmZIvOmGg5qNQU821CGFHhkuKioxXgNh0DpUxZ9+AeiV7yorJr+bqkb2KBFv1i1TnzGRecvKf/KvZIQ== +"@aws-sdk/middleware-ssec@3.734.0": + version "3.734.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-ssec/-/middleware-ssec-3.734.0.tgz#a5863b9c5a5006dbf2f856f14030d30063a28dfa" + integrity sha512-d4yd1RrPW/sspEXizq2NSOUivnheac6LPeLSLnaeTbBG9g1KqIqvCzP1TfXEqv2CrWfHEsWtJpX7oyjySSPvDQ== dependencies: - "@aws-sdk/types" "3.667.0" - "@smithy/types" "^3.5.0" + "@aws-sdk/types" "3.734.0" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@aws-sdk/middleware-user-agent@3.669.0": - version "3.669.0" - resolved "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.669.0.tgz" - integrity sha512-K8ScPi45zjJrj5Y2gRqVsvKKQCQbvQBfYGcBw9ZOx9TTavH80bOCBjWg/GFnvs4f37tqVc1wMN2oGvcTF6HveQ== - dependencies: - "@aws-sdk/core" "3.667.0" - "@aws-sdk/types" "3.667.0" - "@aws-sdk/util-endpoints" "3.667.0" - "@smithy/core" "^2.4.8" - "@smithy/protocol-http" "^4.1.4" - "@smithy/types" "^3.5.0" +"@aws-sdk/middleware-user-agent@3.750.0": + version "3.750.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.750.0.tgz#cea1d9ece724acba1369d7b4a1efa16192cbf658" + integrity sha512-YYcslDsP5+2NZoN3UwuhZGkhAHPSli7HlJHBafBrvjGV/I9f8FuOO1d1ebxGdEP4HyRXUGyh+7Ur4q+Psk0ryw== + dependencies: + "@aws-sdk/core" "3.750.0" + "@aws-sdk/types" "3.734.0" + "@aws-sdk/util-endpoints" "3.743.0" + "@smithy/core" "^3.1.4" + "@smithy/protocol-http" "^5.0.1" + "@smithy/types" "^4.1.0" + tslib "^2.6.2" + +"@aws-sdk/nested-clients@3.750.0": + version "3.750.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/nested-clients/-/nested-clients-3.750.0.tgz#facfef441ad78db2f544be0eb3f1f7adb16846c1" + integrity sha512-OH68BRF0rt9nDloq4zsfeHI0G21lj11a66qosaljtEP66PWm7tQ06feKbFkXHT5E1K3QhJW3nVyK8v2fEBY5fg== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/core" "3.750.0" + "@aws-sdk/middleware-host-header" "3.734.0" + "@aws-sdk/middleware-logger" "3.734.0" + "@aws-sdk/middleware-recursion-detection" "3.734.0" + "@aws-sdk/middleware-user-agent" "3.750.0" + "@aws-sdk/region-config-resolver" "3.734.0" + "@aws-sdk/types" "3.734.0" + "@aws-sdk/util-endpoints" "3.743.0" + "@aws-sdk/util-user-agent-browser" "3.734.0" + "@aws-sdk/util-user-agent-node" "3.750.0" + "@smithy/config-resolver" "^4.0.1" + "@smithy/core" "^3.1.4" + "@smithy/fetch-http-handler" "^5.0.1" + "@smithy/hash-node" "^4.0.1" + "@smithy/invalid-dependency" "^4.0.1" + "@smithy/middleware-content-length" "^4.0.1" + "@smithy/middleware-endpoint" "^4.0.5" + "@smithy/middleware-retry" "^4.0.6" + "@smithy/middleware-serde" "^4.0.2" + "@smithy/middleware-stack" "^4.0.1" + "@smithy/node-config-provider" "^4.0.1" + "@smithy/node-http-handler" "^4.0.2" + "@smithy/protocol-http" "^5.0.1" + "@smithy/smithy-client" "^4.1.5" + "@smithy/types" "^4.1.0" + "@smithy/url-parser" "^4.0.1" + "@smithy/util-base64" "^4.0.0" + "@smithy/util-body-length-browser" "^4.0.0" + "@smithy/util-body-length-node" "^4.0.0" + "@smithy/util-defaults-mode-browser" "^4.0.6" + "@smithy/util-defaults-mode-node" "^4.0.6" + "@smithy/util-endpoints" "^3.0.1" + "@smithy/util-middleware" "^4.0.1" + "@smithy/util-retry" "^4.0.1" + "@smithy/util-utf8" "^4.0.0" tslib "^2.6.2" -"@aws-sdk/region-config-resolver@3.667.0": - version "3.667.0" - resolved "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.667.0.tgz" - integrity sha512-iNr+JhhA902JMKHG9IwT9YdaEx6KGl6vjAL5BRNeOjfj4cZYMog6Lz/IlfOAltMtT0w88DAHDEFrBd2uO0l2eg== +"@aws-sdk/region-config-resolver@3.734.0": + version "3.734.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/region-config-resolver/-/region-config-resolver-3.734.0.tgz#45ffbc56a3e94cc5c9e0cd596b0fda60f100f70b" + integrity sha512-Lvj1kPRC5IuJBr9DyJ9T9/plkh+EfKLy+12s/mykOy1JaKHDpvj+XGy2YO6YgYVOb8JFtaqloid+5COtje4JTQ== dependencies: - "@aws-sdk/types" "3.667.0" - "@smithy/node-config-provider" "^3.1.8" - "@smithy/types" "^3.5.0" - "@smithy/util-config-provider" "^3.0.0" - "@smithy/util-middleware" "^3.0.7" + "@aws-sdk/types" "3.734.0" + "@smithy/node-config-provider" "^4.0.1" + "@smithy/types" "^4.1.0" + "@smithy/util-config-provider" "^4.0.0" + "@smithy/util-middleware" "^4.0.1" tslib "^2.6.2" -"@aws-sdk/signature-v4-multi-region@3.669.0": - version "3.669.0" - resolved "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.669.0.tgz" - integrity sha512-TVwlWAxfBHnFjnfTBQWUhzVJzjwVhkq1+KR0JZV7JrfqeyBOdZjAaV9ie3VNY9HUouecq1fDuKaSwe4JiWQsHg== +"@aws-sdk/signature-v4-multi-region@3.750.0": + version "3.750.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.750.0.tgz#b948dfc7ab7fbcb97e0df6bdffc03b3f3cecb49a" + integrity sha512-RA9hv1Irro/CrdPcOEXKwJ0DJYJwYCsauGEdRXihrRfy8MNSR9E+mD5/Fr5Rxjaq5AHM05DYnN3mg/DU6VwzSw== dependencies: - "@aws-sdk/middleware-sdk-s3" "3.669.0" - "@aws-sdk/types" "3.667.0" - "@smithy/protocol-http" "^4.1.4" - "@smithy/signature-v4" "^4.2.0" - "@smithy/types" "^3.5.0" + "@aws-sdk/middleware-sdk-s3" "3.750.0" + "@aws-sdk/types" "3.734.0" + "@smithy/protocol-http" "^5.0.1" + "@smithy/signature-v4" "^5.0.1" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@aws-sdk/token-providers@3.667.0": - version "3.667.0" - resolved "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.667.0.tgz" - integrity sha512-ZecJlG8p6D4UTYlBHwOWX6nknVtw/OBJ3yPXTSajBjhUlj9lE2xvejI8gl4rqkyLXk7z3bki+KR4tATbMaM9yg== +"@aws-sdk/token-providers@3.750.0": + version "3.750.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/token-providers/-/token-providers-3.750.0.tgz#dc72c3d71f224ee5a7df35829547966d2562aba2" + integrity sha512-X/KzqZw41iWolwNdc8e3RMcNSMR364viHv78u6AefXOO5eRM40c4/LuST1jDzq35/LpnqRhL7/MuixOetw+sFw== dependencies: - "@aws-sdk/types" "3.667.0" - "@smithy/property-provider" "^3.1.7" - "@smithy/shared-ini-file-loader" "^3.1.8" - "@smithy/types" "^3.5.0" + "@aws-sdk/nested-clients" "3.750.0" + "@aws-sdk/types" "3.734.0" + "@smithy/property-provider" "^4.0.1" + "@smithy/shared-ini-file-loader" "^4.0.1" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@aws-sdk/types@3.667.0", "@aws-sdk/types@^3.222.0": - version "3.667.0" - resolved "https://registry.npmjs.org/@aws-sdk/types/-/types-3.667.0.tgz" - integrity sha512-gYq0xCsqFfQaSL/yT1Gl1vIUjtsg7d7RhnUfsXaHt8xTxOKRTdH9GjbesBjXOzgOvB0W0vfssfreSNGFlOOMJg== +"@aws-sdk/types@3.734.0", "@aws-sdk/types@^3.222.0": + version "3.734.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.734.0.tgz#af5e620b0e761918282aa1c8e53cac6091d169a2" + integrity sha512-o11tSPTT70nAkGV1fN9wm/hAIiLPyWX6SuGf+9JyTp7S/rC2cFWhR26MvA69nplcjNaXVzB0f+QFrLXXjOqCrg== dependencies: - "@smithy/types" "^3.5.0" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@aws-sdk/util-arn-parser@3.568.0": - version "3.568.0" - resolved "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.568.0.tgz" - integrity sha512-XUKJWWo+KOB7fbnPP0+g/o5Ulku/X53t7i/h+sPHr5xxYTJJ9CYnbToo95mzxe7xWvkLrsNtJ8L+MnNn9INs2w== +"@aws-sdk/util-arn-parser@3.723.0": + version "3.723.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-arn-parser/-/util-arn-parser-3.723.0.tgz#e9bff2b13918a92d60e0012101dad60ed7db292c" + integrity sha512-ZhEfvUwNliOQROcAk34WJWVYTlTa4694kSVhDSjW6lE1bMataPnIN8A0ycukEzBXmd8ZSoBcQLn6lKGl7XIJ5w== dependencies: tslib "^2.6.2" -"@aws-sdk/util-endpoints@3.667.0": - version "3.667.0" - resolved "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.667.0.tgz" - integrity sha512-X22SYDAuQJWnkF1/q17pkX3nGw5XMD9YEUbmt87vUnRq7iyJ3JOpl6UKOBeUBaL838wA5yzdbinmCITJ/VZ1QA== +"@aws-sdk/util-endpoints@3.743.0": + version "3.743.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-endpoints/-/util-endpoints-3.743.0.tgz#fba654e0c5f1c8ba2b3e175dfee8e3ba4df2394a" + integrity sha512-sN1l559zrixeh5x+pttrnd0A3+r34r0tmPkJ/eaaMaAzXqsmKU/xYre9K3FNnsSS1J1k4PEfk/nHDTVUgFYjnw== dependencies: - "@aws-sdk/types" "3.667.0" - "@smithy/types" "^3.5.0" - "@smithy/util-endpoints" "^2.1.3" + "@aws-sdk/types" "3.734.0" + "@smithy/types" "^4.1.0" + "@smithy/util-endpoints" "^3.0.1" tslib "^2.6.2" "@aws-sdk/util-locate-window@^3.0.0": - version "3.568.0" - resolved "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.568.0.tgz" - integrity sha512-3nh4TINkXYr+H41QaPelCceEB2FXP3fxp93YZXB/kqJvX0U9j0N0Uk45gvsjmEPzG8XxkPEeLIfT2I1M7A6Lig== + version "3.723.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-locate-window/-/util-locate-window-3.723.0.tgz#174551bfdd2eb36d3c16e7023fd7e7ee96ad0fa9" + integrity sha512-Yf2CS10BqK688DRsrKI/EO6B8ff5J86NXe4C+VCysK7UOgN0l1zOTeTukZ3H8Q9tYYX3oaF1961o8vRkFm7Nmw== dependencies: tslib "^2.6.2" -"@aws-sdk/util-user-agent-browser@3.670.0": - version "3.670.0" - resolved "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.670.0.tgz" - integrity sha512-iRynWWazqEcCKwGMcQcywKTDLdLvqts1Yx474U64I9OKQXXwhOwhXbF5CAPSRta86lkVNAVYJa/0Bsv45pNn1A== +"@aws-sdk/util-user-agent-browser@3.734.0": + version "3.734.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.734.0.tgz#bbf3348b14bd7783f60346e1ce86978999450fe7" + integrity sha512-xQTCus6Q9LwUuALW+S76OL0jcWtMOVu14q+GoLnWPUM7QeUw963oQcLhF7oq0CtaLLKyl4GOUfcwc773Zmwwng== dependencies: - "@aws-sdk/types" "3.667.0" - "@smithy/types" "^3.5.0" + "@aws-sdk/types" "3.734.0" + "@smithy/types" "^4.1.0" bowser "^2.11.0" tslib "^2.6.2" -"@aws-sdk/util-user-agent-node@3.669.0": - version "3.669.0" - resolved "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.669.0.tgz" - integrity sha512-9jxCYrgggy2xd44ZASqI7AMiRVaSiFp+06Kg8BQSU0ijKpBJlwcsqIS8pDT/n6LxuOw2eV5ipvM2C0r1iKzrGA== +"@aws-sdk/util-user-agent-node@3.750.0": + version "3.750.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.750.0.tgz#a12fe898bcab26cf50b31cb70b5fc5e887edce40" + integrity sha512-84HJj9G9zbrHX2opLk9eHfDceB+UIHVrmflMzWHpsmo9fDuro/flIBqaVDlE021Osj6qIM0SJJcnL6s23j7JEw== dependencies: - "@aws-sdk/middleware-user-agent" "3.669.0" - "@aws-sdk/types" "3.667.0" - "@smithy/node-config-provider" "^3.1.8" - "@smithy/types" "^3.5.0" + "@aws-sdk/middleware-user-agent" "3.750.0" + "@aws-sdk/types" "3.734.0" + "@smithy/node-config-provider" "^4.0.1" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@aws-sdk/xml-builder@3.662.0": - version "3.662.0" - resolved "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.662.0.tgz" - integrity sha512-ikLkXn0igUpnJu2mCZjklvmcDGWT9OaLRv3JyC/cRkTaaSrblPjPM7KKsltxdMTLQ+v7fjCN0TsJpxphMfaOPA== +"@aws-sdk/xml-builder@3.734.0": + version "3.734.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/xml-builder/-/xml-builder-3.734.0.tgz#174d3269d303919e3ebfbfa3dd9b6d5a6a7a9543" + integrity sha512-Zrjxi5qwGEcUsJ0ru7fRtW74WcTS0rbLcehoFB+rN1GRi2hbLcFaYs4PwVA5diLeAJH0gszv3x4Hr/S87MfbKQ== dependencies: - "@smithy/types" "^3.5.0" + "@smithy/types" "^4.1.0" tslib "^2.6.2" "@cspotcode/source-map-support@^0.8.0": version "0.8.1" - resolved "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== dependencies: "@jridgewell/trace-mapping" "0.3.9" "@ethersproject/abi@5.6.2": version "5.6.2" - resolved "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.6.2.tgz" + resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.6.2.tgz#f2956f2ac724cd720e581759d9e3840cd9744818" integrity sha512-40Ixjhy+YzFtnvzIqFU13FW9hd1gMoLa3cJfSDnfnL4o8EnEG1qLiV8sNJo3sHYi9UYMfFeRuZ7kv5+vhzU7gQ== dependencies: "@ethersproject/address" "^5.6.0" @@ -624,24 +580,24 @@ "@ethersproject/properties" "^5.6.0" "@ethersproject/strings" "^5.6.0" -"@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.1.2", "@ethersproject/abi@^5.5.0", "@ethersproject/abi@^5.6.0", "@ethersproject/abi@^5.7.0": - version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz" - integrity sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA== - dependencies: - "@ethersproject/address" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/constants" "^5.7.0" - "@ethersproject/hash" "^5.7.0" - "@ethersproject/keccak256" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/strings" "^5.7.0" +"@ethersproject/abi@5.8.0", "@ethersproject/abi@^5.1.2", "@ethersproject/abi@^5.5.0", "@ethersproject/abi@^5.6.0", "@ethersproject/abi@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.8.0.tgz#e79bb51940ac35fe6f3262d7fe2cdb25ad5f07d9" + integrity sha512-b9YS/43ObplgyV6SlyQsG53/vkSal0MNA1fskSC4mbnCMi8R+NkcH8K9FPYNESf6jUefBUniE4SOKms0E/KK1Q== + dependencies: + "@ethersproject/address" "^5.8.0" + "@ethersproject/bignumber" "^5.8.0" + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/constants" "^5.8.0" + "@ethersproject/hash" "^5.8.0" + "@ethersproject/keccak256" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + "@ethersproject/properties" "^5.8.0" + "@ethersproject/strings" "^5.8.0" "@ethersproject/abstract-provider@5.6.0": version "5.6.0" - resolved "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.6.0.tgz" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.6.0.tgz#0c4ac7054650dbd9c476cf5907f588bbb6ef3061" integrity sha512-oPMFlKLN+g+y7a79cLK3WiLcjWFnZQtXWgnLAbHZcN3s7L4v90UHpTOrLk+m3yr0gt+/h9STTM6zrr7PM8uoRw== dependencies: "@ethersproject/bignumber" "^5.6.0" @@ -652,22 +608,22 @@ "@ethersproject/transactions" "^5.6.0" "@ethersproject/web" "^5.6.0" -"@ethersproject/abstract-provider@5.7.0", "@ethersproject/abstract-provider@^5.6.0", "@ethersproject/abstract-provider@^5.7.0": - version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz" - integrity sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw== +"@ethersproject/abstract-provider@5.8.0", "@ethersproject/abstract-provider@^5.6.0", "@ethersproject/abstract-provider@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.8.0.tgz#7581f9be601afa1d02b95d26b9d9840926a35b0c" + integrity sha512-wC9SFcmh4UK0oKuLJQItoQdzS/qZ51EJegK6EmAWlh+OptpQ/npECOR3QqECd8iGHC0RJb4WKbVdSfif4ammrg== dependencies: - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/networks" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/transactions" "^5.7.0" - "@ethersproject/web" "^5.7.0" + "@ethersproject/bignumber" "^5.8.0" + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + "@ethersproject/networks" "^5.8.0" + "@ethersproject/properties" "^5.8.0" + "@ethersproject/transactions" "^5.8.0" + "@ethersproject/web" "^5.8.0" "@ethersproject/abstract-signer@5.6.1": version "5.6.1" - resolved "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.6.1.tgz" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.6.1.tgz#54df786bdf1aabe20d0ed508ec05e0aa2d06674f" integrity sha512-xhSLo6y0nGJS7NxfvOSzCaWKvWb1TLT7dQ0nnpHZrDnC67xfnWm9NXflTMFPUXXMtjr33CdV0kWDEmnbrQZ74Q== dependencies: "@ethersproject/abstract-provider" "^5.6.0" @@ -676,20 +632,20 @@ "@ethersproject/logger" "^5.6.0" "@ethersproject/properties" "^5.6.0" -"@ethersproject/abstract-signer@5.7.0", "@ethersproject/abstract-signer@^5.6.0", "@ethersproject/abstract-signer@^5.7.0": - version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz" - integrity sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ== +"@ethersproject/abstract-signer@5.8.0", "@ethersproject/abstract-signer@^5.6.0", "@ethersproject/abstract-signer@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.8.0.tgz#8d7417e95e4094c1797a9762e6789c7356db0754" + integrity sha512-N0XhZTswXcmIZQdYtUnd79VJzvEwXQw6PK0dTl9VoYrEBxxCPXqS0Eod7q5TNKRxe1/5WUMuR0u0nqTF/avdCA== dependencies: - "@ethersproject/abstract-provider" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" + "@ethersproject/abstract-provider" "^5.8.0" + "@ethersproject/bignumber" "^5.8.0" + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + "@ethersproject/properties" "^5.8.0" "@ethersproject/address@5.6.0": version "5.6.0" - resolved "https://registry.npmjs.org/@ethersproject/address/-/address-5.6.0.tgz" + resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.6.0.tgz#13c49836d73e7885fc148ad633afad729da25012" integrity sha512-6nvhYXjbXsHPS+30sHZ+U4VMagFC/9zAk6Gd/h3S21YW4+yfb0WfRtaAIZ4kfM4rrVwqiy284LP0GtL5HXGLxQ== dependencies: "@ethersproject/bignumber" "^5.6.0" @@ -698,96 +654,96 @@ "@ethersproject/logger" "^5.6.0" "@ethersproject/rlp" "^5.6.0" -"@ethersproject/address@5.7.0", "@ethersproject/address@^5.0.2", "@ethersproject/address@^5.6.0", "@ethersproject/address@^5.7.0": - version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz" - integrity sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA== +"@ethersproject/address@5.8.0", "@ethersproject/address@^5.0.2", "@ethersproject/address@^5.6.0", "@ethersproject/address@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.8.0.tgz#3007a2c352eee566ad745dca1dbbebdb50a6a983" + integrity sha512-GhH/abcC46LJwshoN+uBNoKVFPxUuZm6dA257z0vZkKmU1+t8xTn8oK7B9qrj8W2rFRMch4gbJl6PmVxjxBEBA== dependencies: - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/keccak256" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/rlp" "^5.7.0" + "@ethersproject/bignumber" "^5.8.0" + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/keccak256" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + "@ethersproject/rlp" "^5.8.0" -"@ethersproject/base64@5.6.0", "@ethersproject/base64@^5.6.0": +"@ethersproject/base64@5.6.0": version "5.6.0" - resolved "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.6.0.tgz" + resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.6.0.tgz#a12c4da2a6fb86d88563216b0282308fc15907c9" integrity sha512-2Neq8wxJ9xHxCF9TUgmKeSh9BXJ6OAxWfeGWvbauPh8FuHEjamgHilllx8KkSd5ErxyHIX7Xv3Fkcud2kY9ezw== dependencies: "@ethersproject/bytes" "^5.6.0" -"@ethersproject/base64@5.7.0", "@ethersproject/base64@^5.7.0": - version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz" - integrity sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ== +"@ethersproject/base64@5.8.0", "@ethersproject/base64@^5.6.0", "@ethersproject/base64@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.8.0.tgz#61c669c648f6e6aad002c228465d52ac93ee83eb" + integrity sha512-lN0oIwfkYj9LbPx4xEkie6rAMJtySbpOAFXSDVQaBnAzYfB4X2Qr+FXJGxMoc3Bxp2Sm8OwvzMrywxyw0gLjIQ== dependencies: - "@ethersproject/bytes" "^5.7.0" + "@ethersproject/bytes" "^5.8.0" "@ethersproject/basex@5.6.0": version "5.6.0" - resolved "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.6.0.tgz" + resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.6.0.tgz#9ea7209bf0a1c3ddc2a90f180c3a7f0d7d2e8a69" integrity sha512-qN4T+hQd/Md32MoJpc69rOwLYRUXwjTlhHDIeUkUmiN/JyWkkLLMoG0TqvSQKNqZOMgN5stbUYN6ILC+eD7MEQ== dependencies: "@ethersproject/bytes" "^5.6.0" "@ethersproject/properties" "^5.6.0" -"@ethersproject/basex@5.7.0", "@ethersproject/basex@^5.6.0", "@ethersproject/basex@^5.7.0": - version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz" - integrity sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw== +"@ethersproject/basex@5.8.0", "@ethersproject/basex@^5.6.0", "@ethersproject/basex@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.8.0.tgz#1d279a90c4be84d1c1139114a1f844869e57d03a" + integrity sha512-PIgTszMlDRmNwW9nhS6iqtVfdTAKosA7llYXNmGPw4YAI1PUyMv28988wAb41/gHF/WqGdoLv0erHaRcHRKW2Q== dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/properties" "^5.7.0" + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/properties" "^5.8.0" "@ethersproject/bignumber@5.6.1": version "5.6.1" - resolved "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.6.1.tgz" + resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.6.1.tgz#d5e0da518eb82ab8d08ca9db501888bbf5f0c8fb" integrity sha512-UtMeZ3GaUuF9sx2u9nPZiPP3ULcAFmXyvynR7oHl/tPrM+vldZh7ocMsoa1PqKYGnQnqUZJoqxZnGN6J0qdipA== dependencies: "@ethersproject/bytes" "^5.6.0" "@ethersproject/logger" "^5.6.0" bn.js "^4.11.9" -"@ethersproject/bignumber@5.7.0", "@ethersproject/bignumber@^5.6.0", "@ethersproject/bignumber@^5.7.0": - version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz" - integrity sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw== +"@ethersproject/bignumber@5.8.0", "@ethersproject/bignumber@^5.6.0", "@ethersproject/bignumber@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.8.0.tgz#c381d178f9eeb370923d389284efa19f69efa5d7" + integrity sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA== dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/logger" "^5.8.0" bn.js "^5.2.1" "@ethersproject/bytes@5.6.1": version "5.6.1" - resolved "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.6.1.tgz" + resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.6.1.tgz#24f916e411f82a8a60412344bf4a813b917eefe7" integrity sha512-NwQt7cKn5+ZE4uDn+X5RAXLp46E1chXoaMmrxAyA0rblpxz8t58lVkrHXoRIn0lz1joQElQ8410GqhTqMOwc6g== dependencies: "@ethersproject/logger" "^5.6.0" -"@ethersproject/bytes@5.7.0", "@ethersproject/bytes@^5.6.0", "@ethersproject/bytes@^5.7.0": - version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz" - integrity sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A== +"@ethersproject/bytes@5.8.0", "@ethersproject/bytes@^5.6.0", "@ethersproject/bytes@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.8.0.tgz#9074820e1cac7507a34372cadeb035461463be34" + integrity sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A== dependencies: - "@ethersproject/logger" "^5.7.0" + "@ethersproject/logger" "^5.8.0" "@ethersproject/constants@5.6.0": version "5.6.0" - resolved "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.6.0.tgz" + resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.6.0.tgz#55e3eb0918584d3acc0688e9958b0cedef297088" integrity sha512-SrdaJx2bK0WQl23nSpV/b1aq293Lh0sUaZT/yYKPDKn4tlAbkH96SPJwIhwSwTsoQQZxuh1jnqsKwyymoiBdWA== dependencies: "@ethersproject/bignumber" "^5.6.0" -"@ethersproject/constants@5.7.0", "@ethersproject/constants@^5.6.0", "@ethersproject/constants@^5.7.0": - version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz" - integrity sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA== +"@ethersproject/constants@5.8.0", "@ethersproject/constants@^5.6.0", "@ethersproject/constants@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.8.0.tgz#12f31c2f4317b113a4c19de94e50933648c90704" + integrity sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg== dependencies: - "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bignumber" "^5.8.0" "@ethersproject/contracts@5.6.1": version "5.6.1" - resolved "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.6.1.tgz" + resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.6.1.tgz#c0eba3f8a2226456f92251a547344fd0593281d2" integrity sha512-0fpBBDoPqJMsutE6sNjg6pvCJaIcl7tliMQTMRcoUWDACfjO68CpKOJBlsEhEhmzdnu/41KbrfAeg+sB3y35MQ== dependencies: "@ethersproject/abi" "^5.6.0" @@ -801,25 +757,25 @@ "@ethersproject/properties" "^5.6.0" "@ethersproject/transactions" "^5.6.0" -"@ethersproject/contracts@5.7.0": - version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz" - integrity sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg== - dependencies: - "@ethersproject/abi" "^5.7.0" - "@ethersproject/abstract-provider" "^5.7.0" - "@ethersproject/abstract-signer" "^5.7.0" - "@ethersproject/address" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/constants" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/transactions" "^5.7.0" +"@ethersproject/contracts@5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.8.0.tgz#243a38a2e4aa3e757215ea64e276f8a8c9d8ed73" + integrity sha512-0eFjGz9GtuAi6MZwhb4uvUM216F38xiuR0yYCjKJpNfSEy4HUM8hvqqBj9Jmm0IUz8l0xKEhWwLIhPgxNY0yvQ== + dependencies: + "@ethersproject/abi" "^5.8.0" + "@ethersproject/abstract-provider" "^5.8.0" + "@ethersproject/abstract-signer" "^5.8.0" + "@ethersproject/address" "^5.8.0" + "@ethersproject/bignumber" "^5.8.0" + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/constants" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + "@ethersproject/properties" "^5.8.0" + "@ethersproject/transactions" "^5.8.0" "@ethersproject/hash@5.6.0": version "5.6.0" - resolved "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.6.0.tgz" + resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.6.0.tgz#d24446a5263e02492f9808baa99b6e2b4c3429a2" integrity sha512-fFd+k9gtczqlr0/BruWLAu7UAOas1uRRJvOR84uDf4lNZ+bTkGl366qvniUZHKtlqxBRU65MkOobkmvmpHU+jA== dependencies: "@ethersproject/abstract-signer" "^5.6.0" @@ -831,24 +787,24 @@ "@ethersproject/properties" "^5.6.0" "@ethersproject/strings" "^5.6.0" -"@ethersproject/hash@5.7.0", "@ethersproject/hash@^5.6.0", "@ethersproject/hash@^5.7.0": - version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz" - integrity sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g== - dependencies: - "@ethersproject/abstract-signer" "^5.7.0" - "@ethersproject/address" "^5.7.0" - "@ethersproject/base64" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/keccak256" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/strings" "^5.7.0" - -"@ethersproject/hdnode@5.6.1", "@ethersproject/hdnode@^5.6.0": +"@ethersproject/hash@5.8.0", "@ethersproject/hash@^5.6.0", "@ethersproject/hash@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.8.0.tgz#b8893d4629b7f8462a90102572f8cd65a0192b4c" + integrity sha512-ac/lBcTbEWW/VGJij0CNSw/wPcw9bSRgCB0AIBz8CvED/jfvDoV9hsIIiWfvWmFEi8RcXtlNwp2jv6ozWOsooA== + dependencies: + "@ethersproject/abstract-signer" "^5.8.0" + "@ethersproject/address" "^5.8.0" + "@ethersproject/base64" "^5.8.0" + "@ethersproject/bignumber" "^5.8.0" + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/keccak256" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + "@ethersproject/properties" "^5.8.0" + "@ethersproject/strings" "^5.8.0" + +"@ethersproject/hdnode@5.6.1": version "5.6.1" - resolved "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.6.1.tgz" + resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.6.1.tgz#37fa1eb91f6e20ca39cc5fcb7acd3da263d85dab" integrity sha512-6IuYDmbH5Bv/WH/A2cUd0FjNr4qTLAvyHAECiFZhNZp69pPvU7qIDwJ7CU7VAkwm4IVBzqdYy9mpMAGhQdwCDA== dependencies: "@ethersproject/abstract-signer" "^5.6.0" @@ -864,27 +820,27 @@ "@ethersproject/transactions" "^5.6.0" "@ethersproject/wordlists" "^5.6.0" -"@ethersproject/hdnode@5.7.0", "@ethersproject/hdnode@^5.7.0": - version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz" - integrity sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg== - dependencies: - "@ethersproject/abstract-signer" "^5.7.0" - "@ethersproject/basex" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/pbkdf2" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/sha2" "^5.7.0" - "@ethersproject/signing-key" "^5.7.0" - "@ethersproject/strings" "^5.7.0" - "@ethersproject/transactions" "^5.7.0" - "@ethersproject/wordlists" "^5.7.0" - -"@ethersproject/json-wallets@5.6.0", "@ethersproject/json-wallets@^5.6.0": +"@ethersproject/hdnode@5.8.0", "@ethersproject/hdnode@^5.6.0", "@ethersproject/hdnode@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.8.0.tgz#a51ae2a50bcd48ef6fd108c64cbae5e6ff34a761" + integrity sha512-4bK1VF6E83/3/Im0ERnnUeWOY3P1BZml4ZD3wcH8Ys0/d1h1xaFt6Zc+Dh9zXf9TapGro0T4wvO71UTCp3/uoA== + dependencies: + "@ethersproject/abstract-signer" "^5.8.0" + "@ethersproject/basex" "^5.8.0" + "@ethersproject/bignumber" "^5.8.0" + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + "@ethersproject/pbkdf2" "^5.8.0" + "@ethersproject/properties" "^5.8.0" + "@ethersproject/sha2" "^5.8.0" + "@ethersproject/signing-key" "^5.8.0" + "@ethersproject/strings" "^5.8.0" + "@ethersproject/transactions" "^5.8.0" + "@ethersproject/wordlists" "^5.8.0" + +"@ethersproject/json-wallets@5.6.0": version "5.6.0" - resolved "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.6.0.tgz" + resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.6.0.tgz#4c2fc27f17e36c583e7a252fb938bc46f98891e5" integrity sha512-fmh86jViB9r0ibWXTQipxpAGMiuxoqUf78oqJDlCAJXgnJF024hOOX7qVgqsjtbeoxmcLwpPsXNU0WEe/16qPQ== dependencies: "@ethersproject/abstract-signer" "^5.6.0" @@ -901,98 +857,98 @@ aes-js "3.0.0" scrypt-js "3.0.1" -"@ethersproject/json-wallets@5.7.0", "@ethersproject/json-wallets@^5.7.0": - version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz" - integrity sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g== - dependencies: - "@ethersproject/abstract-signer" "^5.7.0" - "@ethersproject/address" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/hdnode" "^5.7.0" - "@ethersproject/keccak256" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/pbkdf2" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/random" "^5.7.0" - "@ethersproject/strings" "^5.7.0" - "@ethersproject/transactions" "^5.7.0" +"@ethersproject/json-wallets@5.8.0", "@ethersproject/json-wallets@^5.6.0", "@ethersproject/json-wallets@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.8.0.tgz#d18de0a4cf0f185f232eb3c17d5e0744d97eb8c9" + integrity sha512-HxblNck8FVUtNxS3VTEYJAcwiKYsBIF77W15HufqlBF9gGfhmYOJtYZp8fSDZtn9y5EaXTE87zDwzxRoTFk11w== + dependencies: + "@ethersproject/abstract-signer" "^5.8.0" + "@ethersproject/address" "^5.8.0" + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/hdnode" "^5.8.0" + "@ethersproject/keccak256" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + "@ethersproject/pbkdf2" "^5.8.0" + "@ethersproject/properties" "^5.8.0" + "@ethersproject/random" "^5.8.0" + "@ethersproject/strings" "^5.8.0" + "@ethersproject/transactions" "^5.8.0" aes-js "3.0.0" scrypt-js "3.0.1" "@ethersproject/keccak256@5.6.0": version "5.6.0" - resolved "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.6.0.tgz" + resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.6.0.tgz#fea4bb47dbf8f131c2e1774a1cecbfeb9d606459" integrity sha512-tk56BJ96mdj/ksi7HWZVWGjCq0WVl/QvfhFQNeL8fxhBlGoP+L80uDCiQcpJPd+2XxkivS3lwRm3E0CXTfol0w== dependencies: "@ethersproject/bytes" "^5.6.0" js-sha3 "0.8.0" -"@ethersproject/keccak256@5.7.0", "@ethersproject/keccak256@^5.6.0", "@ethersproject/keccak256@^5.7.0": - version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz" - integrity sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg== +"@ethersproject/keccak256@5.8.0", "@ethersproject/keccak256@^5.6.0", "@ethersproject/keccak256@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.8.0.tgz#d2123a379567faf2d75d2aaea074ffd4df349e6a" + integrity sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng== dependencies: - "@ethersproject/bytes" "^5.7.0" + "@ethersproject/bytes" "^5.8.0" js-sha3 "0.8.0" "@ethersproject/logger@5.6.0": version "5.6.0" - resolved "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.6.0.tgz" + resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.6.0.tgz#d7db1bfcc22fd2e4ab574cba0bb6ad779a9a3e7a" integrity sha512-BiBWllUROH9w+P21RzoxJKzqoqpkyM1pRnEKG69bulE9TSQD8SAIvTQqIMZmmCO8pUNkgLP1wndX1gKghSpBmg== -"@ethersproject/logger@5.7.0", "@ethersproject/logger@^5.6.0", "@ethersproject/logger@^5.7.0": - version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz" - integrity sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig== +"@ethersproject/logger@5.8.0", "@ethersproject/logger@^5.6.0", "@ethersproject/logger@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.8.0.tgz#f0232968a4f87d29623a0481690a2732662713d6" + integrity sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA== -"@ethersproject/networks@5.6.2", "@ethersproject/networks@^5.6.0": +"@ethersproject/networks@5.6.2": version "5.6.2" - resolved "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.6.2.tgz" + resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.6.2.tgz#2bacda62102c0b1fcee408315f2bed4f6fbdf336" integrity sha512-9uEzaJY7j5wpYGTojGp8U89mSsgQLc40PCMJLMCnFXTs7nhBveZ0t7dbqWUNrepWTszDbFkYD6WlL8DKx5huHA== dependencies: "@ethersproject/logger" "^5.6.0" -"@ethersproject/networks@5.7.1", "@ethersproject/networks@^5.7.0": - version "5.7.1" - resolved "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz" - integrity sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ== +"@ethersproject/networks@5.8.0", "@ethersproject/networks@^5.6.0", "@ethersproject/networks@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.8.0.tgz#8b4517a3139380cba9fb00b63ffad0a979671fde" + integrity sha512-egPJh3aPVAzbHwq8DD7Po53J4OUSsA1MjQp8Vf/OZPav5rlmWUaFLiq8cvQiGK0Z5K6LYzm29+VA/p4RL1FzNg== dependencies: - "@ethersproject/logger" "^5.7.0" + "@ethersproject/logger" "^5.8.0" -"@ethersproject/pbkdf2@5.6.0", "@ethersproject/pbkdf2@^5.6.0": +"@ethersproject/pbkdf2@5.6.0": version "5.6.0" - resolved "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.6.0.tgz" + resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.6.0.tgz#04fcc2d7c6bff88393f5b4237d906a192426685a" integrity sha512-Wu1AxTgJo3T3H6MIu/eejLFok9TYoSdgwRr5oGY1LTLfmGesDoSx05pemsbrPT2gG4cQME+baTSCp5sEo2erZQ== dependencies: "@ethersproject/bytes" "^5.6.0" "@ethersproject/sha2" "^5.6.0" -"@ethersproject/pbkdf2@5.7.0", "@ethersproject/pbkdf2@^5.7.0": - version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz" - integrity sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw== +"@ethersproject/pbkdf2@5.8.0", "@ethersproject/pbkdf2@^5.6.0", "@ethersproject/pbkdf2@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.8.0.tgz#cd2621130e5dd51f6a0172e63a6e4a0c0a0ec37e" + integrity sha512-wuHiv97BrzCmfEaPbUFpMjlVg/IDkZThp9Ri88BpjRleg4iePJaj2SW8AIyE8cXn5V1tuAaMj6lzvsGJkGWskg== dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/sha2" "^5.7.0" + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/sha2" "^5.8.0" "@ethersproject/properties@5.6.0": version "5.6.0" - resolved "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.6.0.tgz" + resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.6.0.tgz#38904651713bc6bdd5bdd1b0a4287ecda920fa04" integrity sha512-szoOkHskajKePTJSZ46uHUWWkbv7TzP2ypdEK6jGMqJaEt2sb0jCgfBo0gH0m2HBpRixMuJ6TBRaQCF7a9DoCg== dependencies: "@ethersproject/logger" "^5.6.0" -"@ethersproject/properties@5.7.0", "@ethersproject/properties@^5.6.0", "@ethersproject/properties@^5.7.0": - version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz" - integrity sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw== +"@ethersproject/properties@5.8.0", "@ethersproject/properties@^5.6.0", "@ethersproject/properties@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.8.0.tgz#405a8affb6311a49a91dabd96aeeae24f477020e" + integrity sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw== dependencies: - "@ethersproject/logger" "^5.7.0" + "@ethersproject/logger" "^5.8.0" "@ethersproject/providers@5.6.6": version "5.6.6" - resolved "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.6.6.tgz" + resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.6.6.tgz#1967149cb4557d253f8c176a44aabda155f228cd" integrity sha512-6X6agj3NeQ4tgnvBMCjHK+CjQbz+Qmn20JTxCYZ/uymrgCEOpJtY9zeRxJIDsSi0DPw8xNAxypj95JMCsapUfA== dependencies: "@ethersproject/abstract-provider" "^5.6.0" @@ -1015,85 +971,85 @@ bech32 "1.1.4" ws "7.4.6" -"@ethersproject/providers@5.7.2": - version "5.7.2" - resolved "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.2.tgz" - integrity sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg== - dependencies: - "@ethersproject/abstract-provider" "^5.7.0" - "@ethersproject/abstract-signer" "^5.7.0" - "@ethersproject/address" "^5.7.0" - "@ethersproject/base64" "^5.7.0" - "@ethersproject/basex" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/constants" "^5.7.0" - "@ethersproject/hash" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/networks" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/random" "^5.7.0" - "@ethersproject/rlp" "^5.7.0" - "@ethersproject/sha2" "^5.7.0" - "@ethersproject/strings" "^5.7.0" - "@ethersproject/transactions" "^5.7.0" - "@ethersproject/web" "^5.7.0" +"@ethersproject/providers@5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.8.0.tgz#6c2ae354f7f96ee150439f7de06236928bc04cb4" + integrity sha512-3Il3oTzEx3o6kzcg9ZzbE+oCZYyY+3Zh83sKkn4s1DZfTUjIegHnN2Cm0kbn9YFy45FDVcuCLLONhU7ny0SsCw== + dependencies: + "@ethersproject/abstract-provider" "^5.8.0" + "@ethersproject/abstract-signer" "^5.8.0" + "@ethersproject/address" "^5.8.0" + "@ethersproject/base64" "^5.8.0" + "@ethersproject/basex" "^5.8.0" + "@ethersproject/bignumber" "^5.8.0" + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/constants" "^5.8.0" + "@ethersproject/hash" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + "@ethersproject/networks" "^5.8.0" + "@ethersproject/properties" "^5.8.0" + "@ethersproject/random" "^5.8.0" + "@ethersproject/rlp" "^5.8.0" + "@ethersproject/sha2" "^5.8.0" + "@ethersproject/strings" "^5.8.0" + "@ethersproject/transactions" "^5.8.0" + "@ethersproject/web" "^5.8.0" bech32 "1.1.4" - ws "7.4.6" + ws "8.18.0" "@ethersproject/random@5.6.0": version "5.6.0" - resolved "https://registry.npmjs.org/@ethersproject/random/-/random-5.6.0.tgz" + resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.6.0.tgz#1505d1ab6a250e0ee92f436850fa3314b2cb5ae6" integrity sha512-si0PLcLjq+NG/XHSZz90asNf+YfKEqJGVdxoEkSukzbnBgC8rydbgbUgBbBGLeHN4kAJwUFEKsu3sCXT93YMsw== dependencies: "@ethersproject/bytes" "^5.6.0" "@ethersproject/logger" "^5.6.0" -"@ethersproject/random@5.7.0", "@ethersproject/random@^5.6.0", "@ethersproject/random@^5.7.0": - version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz" - integrity sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ== +"@ethersproject/random@5.8.0", "@ethersproject/random@^5.6.0", "@ethersproject/random@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.8.0.tgz#1bced04d49449f37c6437c701735a1a022f0057a" + integrity sha512-E4I5TDl7SVqyg4/kkA/qTfuLWAQGXmSOgYyO01So8hLfwgKvYK5snIlzxJMk72IFdG/7oh8yuSqY2KX7MMwg+A== dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/logger" "^5.8.0" -"@ethersproject/rlp@5.6.0", "@ethersproject/rlp@^5.6.0": +"@ethersproject/rlp@5.6.0": version "5.6.0" - resolved "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.6.0.tgz" + resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.6.0.tgz#55a7be01c6f5e64d6e6e7edb6061aa120962a717" integrity sha512-dz9WR1xpcTL+9DtOT/aDO+YyxSSdO8YIS0jyZwHHSlAmnxA6cKU3TrTd4Xc/bHayctxTgGLYNuVVoiXE4tTq1g== dependencies: "@ethersproject/bytes" "^5.6.0" "@ethersproject/logger" "^5.6.0" -"@ethersproject/rlp@5.7.0", "@ethersproject/rlp@^5.7.0": - version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz" - integrity sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w== +"@ethersproject/rlp@5.8.0", "@ethersproject/rlp@^5.6.0", "@ethersproject/rlp@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.8.0.tgz#5a0d49f61bc53e051532a5179472779141451de5" + integrity sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q== dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/logger" "^5.8.0" "@ethersproject/sha2@5.6.0": version "5.6.0" - resolved "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.6.0.tgz" + resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.6.0.tgz#364c4c11cc753bda36f31f001628706ebadb64d9" integrity sha512-1tNWCPFLu1n3JM9t4/kytz35DkuF9MxqkGGEHNauEbaARdm2fafnOyw1s0tIQDPKF/7bkP1u3dbrmjpn5CelyA== dependencies: "@ethersproject/bytes" "^5.6.0" "@ethersproject/logger" "^5.6.0" hash.js "1.1.7" -"@ethersproject/sha2@5.7.0", "@ethersproject/sha2@^5.6.0", "@ethersproject/sha2@^5.7.0": - version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz" - integrity sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw== +"@ethersproject/sha2@5.8.0", "@ethersproject/sha2@^5.6.0", "@ethersproject/sha2@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.8.0.tgz#8954a613bb78dac9b46829c0a95de561ef74e5e1" + integrity sha512-dDOUrXr9wF/YFltgTBYS0tKslPEKr6AekjqDW2dbn1L1xmjGR+9GiKu4ajxovnrDbwxAKdHjW8jNcwfz8PAz4A== dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/logger" "^5.8.0" hash.js "1.1.7" "@ethersproject/signing-key@5.6.1": version "5.6.1" - resolved "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.6.1.tgz" + resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.6.1.tgz#31b0a531520616254eb0465b9443e49515c4d457" integrity sha512-XvqQ20DH0D+bS3qlrrgh+axRMth5kD1xuvqUQUTeezxUTXBOeR6hWz2/C6FBEu39FRytyybIWrYf7YLSAKr1LQ== dependencies: "@ethersproject/bytes" "^5.6.0" @@ -1103,21 +1059,21 @@ elliptic "6.5.4" hash.js "1.1.7" -"@ethersproject/signing-key@5.7.0", "@ethersproject/signing-key@^5.6.0", "@ethersproject/signing-key@^5.7.0": - version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz" - integrity sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q== +"@ethersproject/signing-key@5.8.0", "@ethersproject/signing-key@^5.6.0", "@ethersproject/signing-key@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.8.0.tgz#9797e02c717b68239c6349394ea85febf8893119" + integrity sha512-LrPW2ZxoigFi6U6aVkFN/fa9Yx/+4AtIUe4/HACTvKJdhm0eeb107EVCIQcrLZkxaSIgc/eCrX8Q1GtbH+9n3w== dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + "@ethersproject/properties" "^5.8.0" bn.js "^5.2.1" - elliptic "6.5.4" + elliptic "6.6.1" hash.js "1.1.7" "@ethersproject/solidity@5.6.0": version "5.6.0" - resolved "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.6.0.tgz" + resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.6.0.tgz#64657362a596bf7f5630bdc921c07dd78df06dc3" integrity sha512-YwF52vTNd50kjDzqKaoNNbC/r9kMDPq3YzDWmsjFTRBcIF1y4JCQJ8gB30wsTfHbaxgxelI5BfxQSxD/PbJOww== dependencies: "@ethersproject/bignumber" "^5.6.0" @@ -1127,39 +1083,39 @@ "@ethersproject/sha2" "^5.6.0" "@ethersproject/strings" "^5.6.0" -"@ethersproject/solidity@5.7.0": - version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz" - integrity sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA== +"@ethersproject/solidity@5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.8.0.tgz#429bb9fcf5521307a9448d7358c26b93695379b9" + integrity sha512-4CxFeCgmIWamOHwYN9d+QWGxye9qQLilpgTU0XhYs1OahkclF+ewO+3V1U0mvpiuQxm5EHHmv8f7ClVII8EHsA== dependencies: - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/keccak256" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/sha2" "^5.7.0" - "@ethersproject/strings" "^5.7.0" + "@ethersproject/bignumber" "^5.8.0" + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/keccak256" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + "@ethersproject/sha2" "^5.8.0" + "@ethersproject/strings" "^5.8.0" "@ethersproject/strings@5.6.0": version "5.6.0" - resolved "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.6.0.tgz" + resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.6.0.tgz#9891b26709153d996bf1303d39a7f4bc047878fd" integrity sha512-uv10vTtLTZqrJuqBZR862ZQjTIa724wGPWQqZrofaPI/kUsf53TBG0I0D+hQ1qyNtllbNzaW+PDPHHUI6/65Mg== dependencies: "@ethersproject/bytes" "^5.6.0" "@ethersproject/constants" "^5.6.0" "@ethersproject/logger" "^5.6.0" -"@ethersproject/strings@5.7.0", "@ethersproject/strings@^5.6.0", "@ethersproject/strings@^5.7.0": - version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz" - integrity sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg== +"@ethersproject/strings@5.8.0", "@ethersproject/strings@^5.6.0", "@ethersproject/strings@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.8.0.tgz#ad79fafbf0bd272d9765603215ac74fd7953908f" + integrity sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg== dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/constants" "^5.7.0" - "@ethersproject/logger" "^5.7.0" + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/constants" "^5.8.0" + "@ethersproject/logger" "^5.8.0" "@ethersproject/transactions@5.6.0": version "5.6.0" - resolved "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.6.0.tgz" + resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.6.0.tgz#4b594d73a868ef6e1529a2f8f94a785e6791ae4e" integrity sha512-4HX+VOhNjXHZyGzER6E/LVI2i6lf9ejYeWD6l4g50AdmimyuStKc39kvKf1bXWQMg7QNVh+uC7dYwtaZ02IXeg== dependencies: "@ethersproject/address" "^5.6.0" @@ -1172,42 +1128,42 @@ "@ethersproject/rlp" "^5.6.0" "@ethersproject/signing-key" "^5.6.0" -"@ethersproject/transactions@5.7.0", "@ethersproject/transactions@^5.6.0", "@ethersproject/transactions@^5.7.0": - version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz" - integrity sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ== - dependencies: - "@ethersproject/address" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/constants" "^5.7.0" - "@ethersproject/keccak256" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/rlp" "^5.7.0" - "@ethersproject/signing-key" "^5.7.0" +"@ethersproject/transactions@5.8.0", "@ethersproject/transactions@^5.6.0", "@ethersproject/transactions@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.8.0.tgz#1e518822403abc99def5a043d1c6f6fe0007e46b" + integrity sha512-UglxSDjByHG0TuU17bDfCemZ3AnKO2vYrL5/2n2oXvKzvb7Cz+W9gOWXKARjp2URVwcWlQlPOEQyAviKwT4AHg== + dependencies: + "@ethersproject/address" "^5.8.0" + "@ethersproject/bignumber" "^5.8.0" + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/constants" "^5.8.0" + "@ethersproject/keccak256" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + "@ethersproject/properties" "^5.8.0" + "@ethersproject/rlp" "^5.8.0" + "@ethersproject/signing-key" "^5.8.0" "@ethersproject/units@5.6.0": version "5.6.0" - resolved "https://registry.npmjs.org/@ethersproject/units/-/units-5.6.0.tgz" + resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.6.0.tgz#e5cbb1906988f5740254a21b9ded6bd51e826d9c" integrity sha512-tig9x0Qmh8qbo1w8/6tmtyrm/QQRviBh389EQ+d8fP4wDsBrJBf08oZfoiz1/uenKK9M78yAP4PoR7SsVoTjsw== dependencies: "@ethersproject/bignumber" "^5.6.0" "@ethersproject/constants" "^5.6.0" "@ethersproject/logger" "^5.6.0" -"@ethersproject/units@5.7.0": - version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/units/-/units-5.7.0.tgz" - integrity sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg== +"@ethersproject/units@5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.8.0.tgz#c12f34ba7c3a2de0e9fa0ed0ee32f3e46c5c2c6a" + integrity sha512-lxq0CAnc5kMGIiWW4Mr041VT8IhNM+Pn5T3haO74XZWFulk7wH1Gv64HqE96hT4a7iiNMdOCFEBgaxWuk8ETKQ== dependencies: - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/constants" "^5.7.0" - "@ethersproject/logger" "^5.7.0" + "@ethersproject/bignumber" "^5.8.0" + "@ethersproject/constants" "^5.8.0" + "@ethersproject/logger" "^5.8.0" "@ethersproject/wallet@5.6.1": version "5.6.1" - resolved "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.6.1.tgz" + resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.6.1.tgz#5df4f75f848ed84ca30fd6ca75d2c66b19c5552b" integrity sha512-oXWoOslEWtwZiViIMlGVjeKDQz/tI7JF9UkyzN9jaGj8z7sXt2SyFMb0Ev6vSAqjIzrCrNrJ/+MkAhtKnGOfZw== dependencies: "@ethersproject/abstract-provider" "^5.6.0" @@ -1226,30 +1182,30 @@ "@ethersproject/transactions" "^5.6.0" "@ethersproject/wordlists" "^5.6.0" -"@ethersproject/wallet@5.7.0": - version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz" - integrity sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA== - dependencies: - "@ethersproject/abstract-provider" "^5.7.0" - "@ethersproject/abstract-signer" "^5.7.0" - "@ethersproject/address" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/hash" "^5.7.0" - "@ethersproject/hdnode" "^5.7.0" - "@ethersproject/json-wallets" "^5.7.0" - "@ethersproject/keccak256" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/random" "^5.7.0" - "@ethersproject/signing-key" "^5.7.0" - "@ethersproject/transactions" "^5.7.0" - "@ethersproject/wordlists" "^5.7.0" - -"@ethersproject/web@5.6.0", "@ethersproject/web@^5.6.0": +"@ethersproject/wallet@5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.8.0.tgz#49c300d10872e6986d953e8310dc33d440da8127" + integrity sha512-G+jnzmgg6UxurVKRKvw27h0kvG75YKXZKdlLYmAHeF32TGUzHkOFd7Zn6QHOTYRFWnfjtSSFjBowKo7vfrXzPA== + dependencies: + "@ethersproject/abstract-provider" "^5.8.0" + "@ethersproject/abstract-signer" "^5.8.0" + "@ethersproject/address" "^5.8.0" + "@ethersproject/bignumber" "^5.8.0" + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/hash" "^5.8.0" + "@ethersproject/hdnode" "^5.8.0" + "@ethersproject/json-wallets" "^5.8.0" + "@ethersproject/keccak256" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + "@ethersproject/properties" "^5.8.0" + "@ethersproject/random" "^5.8.0" + "@ethersproject/signing-key" "^5.8.0" + "@ethersproject/transactions" "^5.8.0" + "@ethersproject/wordlists" "^5.8.0" + +"@ethersproject/web@5.6.0": version "5.6.0" - resolved "https://registry.npmjs.org/@ethersproject/web/-/web-5.6.0.tgz" + resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.6.0.tgz#4bf8b3cbc17055027e1a5dd3c357e37474eaaeb8" integrity sha512-G/XHj0hV1FxI2teHRfCGvfBUHFmU+YOSbCxlAMqJklxSa7QMiHFQfAxvwY2PFqgvdkxEKwRNr/eCjfAPEm2Ctg== dependencies: "@ethersproject/base64" "^5.6.0" @@ -1258,20 +1214,20 @@ "@ethersproject/properties" "^5.6.0" "@ethersproject/strings" "^5.6.0" -"@ethersproject/web@5.7.1", "@ethersproject/web@^5.7.0": - version "5.7.1" - resolved "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz" - integrity sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w== +"@ethersproject/web@5.8.0", "@ethersproject/web@^5.6.0", "@ethersproject/web@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.8.0.tgz#3e54badc0013b7a801463a7008a87988efce8a37" + integrity sha512-j7+Ksi/9KfGviws6Qtf9Q7KCqRhpwrYKQPs+JBA/rKVFF/yaWLHJEH3zfVP2plVu+eys0d2DlFmhoQJayFewcw== dependencies: - "@ethersproject/base64" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/strings" "^5.7.0" + "@ethersproject/base64" "^5.8.0" + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + "@ethersproject/properties" "^5.8.0" + "@ethersproject/strings" "^5.8.0" -"@ethersproject/wordlists@5.6.0", "@ethersproject/wordlists@^5.6.0": +"@ethersproject/wordlists@5.6.0": version "5.6.0" - resolved "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.6.0.tgz" + resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.6.0.tgz#79e62c5276e091d8575f6930ba01a29218ded032" integrity sha512-q0bxNBfIX3fUuAo9OmjlEYxP40IB8ABgb7HjEZCL5IKubzV3j30CWi2rqQbjTS2HfoyQbfINoKcTVWP4ejwR7Q== dependencies: "@ethersproject/bytes" "^5.6.0" @@ -1280,35 +1236,35 @@ "@ethersproject/properties" "^5.6.0" "@ethersproject/strings" "^5.6.0" -"@ethersproject/wordlists@5.7.0", "@ethersproject/wordlists@^5.7.0": - version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz" - integrity sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA== +"@ethersproject/wordlists@5.8.0", "@ethersproject/wordlists@^5.6.0", "@ethersproject/wordlists@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.8.0.tgz#7a5654ee8d1bb1f4dbe43f91d217356d650ad821" + integrity sha512-2df9bbXicZws2Sb5S6ET493uJ0Z84Fjr3pC4tu/qlnZERibZCeUVuqdtt+7Tv9xxhUxHoIekIA7avrKUWHrezg== dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/hash" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/strings" "^5.7.0" + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/hash" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + "@ethersproject/properties" "^5.8.0" + "@ethersproject/strings" "^5.8.0" "@fastify/busboy@^2.0.0": version "2.1.1" - resolved "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz" + resolved "https://registry.yarnpkg.com/@fastify/busboy/-/busboy-2.1.1.tgz#b9da6a878a371829a0502c9b6c1c143ef6663f4d" integrity sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA== "@jridgewell/resolve-uri@^3.0.3": version "3.1.2" - resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== "@jridgewell/sourcemap-codec@^1.4.10": version "1.5.0" - resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== "@jridgewell/trace-mapping@0.3.9": version "0.3.9" - resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== dependencies: "@jridgewell/resolve-uri" "^3.0.3" @@ -1316,7 +1272,7 @@ "@metamask/eth-sig-util@^4.0.0": version "4.0.1" - resolved "https://registry.npmjs.org/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz" + resolved "https://registry.yarnpkg.com/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz#3ad61f6ea9ad73ba5b19db780d40d9aae5157088" integrity sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ== dependencies: ethereumjs-abi "^0.6.8" @@ -1327,17 +1283,17 @@ "@noble/hashes@1.2.0", "@noble/hashes@~1.2.0": version "1.2.0" - resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.2.0.tgz" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.2.0.tgz#a3150eeb09cc7ab207ebf6d7b9ad311a9bdbed12" integrity sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ== "@noble/secp256k1@1.7.1", "@noble/secp256k1@~1.7.0": version "1.7.1" - resolved "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.1.tgz" + resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.7.1.tgz#b251c70f824ce3ca7f8dc3df08d58f005cc0507c" integrity sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw== "@nomicfoundation/ethereumjs-block@4.2.2", "@nomicfoundation/ethereumjs-block@^4.0.0": version "4.2.2" - resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-4.2.2.tgz" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-4.2.2.tgz#f317078c810a54381c682d0c12e1e81acfc11599" integrity sha512-atjpt4gc6ZGZUPHBAQaUJsm1l/VCo7FmyQ780tMGO8QStjLdhz09dXynmhwVTy5YbRr0FOh/uX3QaEM0yIB2Zg== dependencies: "@nomicfoundation/ethereumjs-common" "3.1.2" @@ -1349,7 +1305,7 @@ "@nomicfoundation/ethereumjs-blockchain@6.2.2", "@nomicfoundation/ethereumjs-blockchain@^6.0.0": version "6.2.2" - resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-6.2.2.tgz" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-6.2.2.tgz#9f79dd2b3dc73f5d5a220f7d8a734330c4c26320" integrity sha512-6AIB2MoTEPZJLl6IRKcbd8mUmaBAQ/NMe3O7OsAOIiDjMNPPH5KaUQiLfbVlegT4wKIg/GOsFH7XlH2KDVoJNg== dependencies: "@nomicfoundation/ethereumjs-block" "4.2.2" @@ -1367,7 +1323,7 @@ "@nomicfoundation/ethereumjs-common@3.1.2", "@nomicfoundation/ethereumjs-common@^3.0.0": version "3.1.2" - resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-3.1.2.tgz" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-3.1.2.tgz#041086da66ed40f2bf2a2116a1f2f0fcf33fb80d" integrity sha512-JAEBpIua62dyObHM9KI2b4wHZcRQYYge9gxiygTWa3lNCr2zo+K0TbypDpgiNij5MCGNWP1eboNfNfx1a3vkvA== dependencies: "@nomicfoundation/ethereumjs-util" "8.0.6" @@ -1375,7 +1331,7 @@ "@nomicfoundation/ethereumjs-ethash@2.0.5": version "2.0.5" - resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-2.0.5.tgz" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-2.0.5.tgz#0c605812f6f4589a9f6d597db537bbf3b86469db" integrity sha512-xlLdcICGgAYyYmnI3r1t0R5fKGBJNDQSOQxXNjVO99JmxJIdXR5MgPo5CSJO1RpyzKOgzi3uIFn8agv564dZEQ== dependencies: "@nomicfoundation/ethereumjs-block" "4.2.2" @@ -1387,7 +1343,7 @@ "@nomicfoundation/ethereumjs-evm@1.3.2", "@nomicfoundation/ethereumjs-evm@^1.0.0": version "1.3.2" - resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-1.3.2.tgz" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-1.3.2.tgz#f9d6bafd5c23d07ab75b8649d589af1a43b60bfc" integrity sha512-I00d4MwXuobyoqdPe/12dxUQxTYzX8OckSaWsMcWAfQhgVDvBx6ffPyP/w1aL0NW7MjyerySPcSVfDJAMHjilw== dependencies: "@nomicfoundation/ethereumjs-common" "3.1.2" @@ -1401,12 +1357,12 @@ "@nomicfoundation/ethereumjs-rlp@4.0.3", "@nomicfoundation/ethereumjs-rlp@^4.0.0": version "4.0.3" - resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-4.0.3.tgz" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-4.0.3.tgz#8d9147fbd0d49e8f4c5ce729d226694a8fe03eb8" integrity sha512-DZMzB/lqPK78T6MluyXqtlRmOMcsZbTTbbEyAjo0ncaff2mqu/k8a79PBcyvpgAhWD/R59Fjq/x3ro5Lof0AtA== "@nomicfoundation/ethereumjs-statemanager@1.0.5", "@nomicfoundation/ethereumjs-statemanager@^1.0.0": version "1.0.5" - resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-1.0.5.tgz" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-1.0.5.tgz#951cc9ff2c421d40233d2e9d0fe033db2391ee44" integrity sha512-CAhzpzTR5toh/qOJIZUUOnWekUXuRqkkzaGAQrVcF457VhtCmr+ddZjjK50KNZ524c1XP8cISguEVNqJ6ij1sA== dependencies: "@nomicfoundation/ethereumjs-common" "3.1.2" @@ -1419,7 +1375,7 @@ "@nomicfoundation/ethereumjs-trie@5.0.5", "@nomicfoundation/ethereumjs-trie@^5.0.0": version "5.0.5" - resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-5.0.5.tgz" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-5.0.5.tgz#bf31c9306dcbba2007fad668e96109ddb147040c" integrity sha512-+8sNZrXkzvA1NH5F4kz5RSYl1I6iaRz7mAZRsyxOm0IVY4UaP43Ofvfp/TwOalFunurQrYB5pRO40+8FBcxFMA== dependencies: "@nomicfoundation/ethereumjs-rlp" "4.0.3" @@ -1429,7 +1385,7 @@ "@nomicfoundation/ethereumjs-tx@4.1.2", "@nomicfoundation/ethereumjs-tx@^4.0.0": version "4.1.2" - resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-4.1.2.tgz" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-4.1.2.tgz#8659fad7f9094b7eb82aa6cc3c8097cb1c42ff31" integrity sha512-emJBJZpmTdUa09cqxQqHaysbBI9Od353ZazeH7WgPb35miMgNY6mb7/3vBA98N5lUW/rgkiItjX0KZfIzihSoQ== dependencies: "@nomicfoundation/ethereumjs-common" "3.1.2" @@ -1439,7 +1395,7 @@ "@nomicfoundation/ethereumjs-util@8.0.6", "@nomicfoundation/ethereumjs-util@^8.0.0": version "8.0.6" - resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-8.0.6.tgz" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-8.0.6.tgz#dbce5d258b017b37aa58b3a7c330ad59d10ccf0b" integrity sha512-jOQfF44laa7xRfbfLXojdlcpkvxeHrE2Xu7tSeITsWFgoII163MzjOwFEzSNozHYieFysyoEMhCdP+NY5ikstw== dependencies: "@nomicfoundation/ethereumjs-rlp" "4.0.3" @@ -1447,7 +1403,7 @@ "@nomicfoundation/ethereumjs-vm@^6.0.0": version "6.4.2" - resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-6.4.2.tgz" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-6.4.2.tgz#af1cf62e6c0054bc2b7febc8556d032433d1b18c" integrity sha512-PRTyxZMP6kx+OdAzBhuH1LD2Yw+hrSpaytftvaK//thDy2OI07S0nrTdbrdk7b8ZVPAc9H9oTwFBl3/wJ3w15g== dependencies: "@nomicfoundation/ethereumjs-block" "4.2.2" @@ -1468,9 +1424,9 @@ rustbn.js "~0.2.0" "@nomicfoundation/hardhat-verify@^2.0.12": - version "2.0.12" - resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-verify/-/hardhat-verify-2.0.12.tgz#480819a245a2db0b127e473c62079f7b4f16daa8" - integrity sha512-Lg3Nu7DCXASQRVI/YysjuAX2z8jwOCbS0w5tz2HalWGSTZThqA0v9N0v0psHbKNqzPJa8bNOeapIVSziyJTnAg== + version "2.0.13" + resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-verify/-/hardhat-verify-2.0.13.tgz#41691adc32e01dc5cf6b725615f64958fba2100b" + integrity sha512-i57GX1sC0kYGyRVnbQrjjyBTpWTKgrvKC+jH8CMKV6gHp959Upb8lKaZ58WRHIU0espkulTxLnacYeUDirwJ2g== dependencies: "@ethersproject/abi" "^5.1.2" "@ethersproject/address" "^5.0.2" @@ -1484,42 +1440,42 @@ "@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.2": version "0.1.2" - resolved "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.2.tgz" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.2.tgz#3a9c3b20d51360b20affb8f753e756d553d49557" integrity sha512-JaqcWPDZENCvm++lFFGjrDd8mxtf+CtLd2MiXvMNTBD33dContTZ9TWETwNFwg7JTJT5Q9HEecH7FA+HTSsIUw== "@nomicfoundation/solidity-analyzer-darwin-x64@0.1.2": version "0.1.2" - resolved "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.2.tgz" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.2.tgz#74dcfabeb4ca373d95bd0d13692f44fcef133c28" integrity sha512-fZNmVztrSXC03e9RONBT+CiksSeYcxI1wlzqyr0L7hsQlK1fzV+f04g2JtQ1c/Fe74ZwdV6aQBdd6Uwl1052sw== "@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.2": version "0.1.2" - resolved "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.2.tgz" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.2.tgz#4af5849a89e5a8f511acc04f28eb5d4460ba2b6a" integrity sha512-3d54oc+9ZVBuB6nbp8wHylk4xh0N0Gc+bk+/uJae+rUgbOBwQSfuGIbAZt1wBXs5REkSmynEGcqx6DutoK0tPA== "@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.2": version "0.1.2" - resolved "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.2.tgz" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.2.tgz#54036808a9a327b2ff84446c130a6687ee702a8e" integrity sha512-iDJfR2qf55vgsg7BtJa7iPiFAsYf2d0Tv/0B+vhtnI16+wfQeTbP7teookbGvAo0eJo7aLLm0xfS/GTkvHIucA== "@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.2": version "0.1.2" - resolved "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.2.tgz" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.2.tgz#466cda0d6e43691986c944b909fc6dbb8cfc594e" integrity sha512-9dlHMAt5/2cpWyuJ9fQNOUXFB/vgSFORg1jpjX1Mh9hJ/MfZXlDdHQ+DpFCs32Zk5pxRBb07yGvSHk9/fezL+g== "@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.2": version "0.1.2" - resolved "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.2.tgz" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.2.tgz#2b35826987a6e94444140ac92310baa088ee7f94" integrity sha512-GzzVeeJob3lfrSlDKQw2bRJ8rBf6mEYaWY+gW0JnTDHINA0s2gPR4km5RLIj1xeZZOYz4zRw+AEeYgLRqB2NXg== "@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.2": version "0.1.2" - resolved "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.2.tgz" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.2.tgz#e6363d13b8709ca66f330562337dbc01ce8bbbd9" integrity sha512-Fdjli4DCcFHb4Zgsz0uEJXZ2K7VEO+w5KVv7HmT7WO10iODdU9csC2az4jrhEsRtiR9Gfd74FlG0NYlw1BMdyA== "@nomicfoundation/solidity-analyzer@^0.1.0": version "0.1.2" - resolved "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.2.tgz" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.2.tgz#8bcea7d300157bf3a770a851d9f5c5e2db34ac55" integrity sha512-q4n32/FNKIhQ3zQGGw5CvPF6GTvDCpYwIf7bEY/dZTZbgfDsHyjJwURxUJf3VQuuJj+fDIFl4+KkBVbw4Ef6jA== optionalDependencies: "@nomicfoundation/solidity-analyzer-darwin-arm64" "0.1.2" @@ -1537,12 +1493,12 @@ "@scure/base@~1.1.0": version "1.1.9" - resolved "https://registry.npmjs.org/@scure/base/-/base-1.1.9.tgz" + resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.9.tgz#e5e142fbbfe251091f9c5f1dd4c834ac04c3dbd1" integrity sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg== "@scure/bip32@1.1.5": version "1.1.5" - resolved "https://registry.npmjs.org/@scure/bip32/-/bip32-1.1.5.tgz" + resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.1.5.tgz#d2ccae16dcc2e75bc1d75f5ef3c66a338d1ba300" integrity sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw== dependencies: "@noble/hashes" "~1.2.0" @@ -1551,7 +1507,7 @@ "@scure/bip39@1.1.1": version "1.1.1" - resolved "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.1.tgz" + resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.1.1.tgz#b54557b2e86214319405db819c4b6a370cf340c5" integrity sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg== dependencies: "@noble/hashes" "~1.2.0" @@ -1559,7 +1515,7 @@ "@sentry/core@5.30.0": version "5.30.0" - resolved "https://registry.npmjs.org/@sentry/core/-/core-5.30.0.tgz" + resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.30.0.tgz#6b203664f69e75106ee8b5a2fe1d717379b331f3" integrity sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg== dependencies: "@sentry/hub" "5.30.0" @@ -1570,7 +1526,7 @@ "@sentry/hub@5.30.0": version "5.30.0" - resolved "https://registry.npmjs.org/@sentry/hub/-/hub-5.30.0.tgz" + resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-5.30.0.tgz#2453be9b9cb903404366e198bd30c7ca74cdc100" integrity sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ== dependencies: "@sentry/types" "5.30.0" @@ -1579,7 +1535,7 @@ "@sentry/minimal@5.30.0": version "5.30.0" - resolved "https://registry.npmjs.org/@sentry/minimal/-/minimal-5.30.0.tgz" + resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-5.30.0.tgz#ce3d3a6a273428e0084adcb800bc12e72d34637b" integrity sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw== dependencies: "@sentry/hub" "5.30.0" @@ -1588,7 +1544,7 @@ "@sentry/node@^5.18.1": version "5.30.0" - resolved "https://registry.npmjs.org/@sentry/node/-/node-5.30.0.tgz" + resolved "https://registry.yarnpkg.com/@sentry/node/-/node-5.30.0.tgz#4ca479e799b1021285d7fe12ac0858951c11cd48" integrity sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg== dependencies: "@sentry/core" "5.30.0" @@ -1603,7 +1559,7 @@ "@sentry/tracing@5.30.0": version "5.30.0" - resolved "https://registry.npmjs.org/@sentry/tracing/-/tracing-5.30.0.tgz" + resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-5.30.0.tgz#501d21f00c3f3be7f7635d8710da70d9419d4e1f" integrity sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw== dependencies: "@sentry/hub" "5.30.0" @@ -1614,511 +1570,511 @@ "@sentry/types@5.30.0": version "5.30.0" - resolved "https://registry.npmjs.org/@sentry/types/-/types-5.30.0.tgz" + resolved "https://registry.yarnpkg.com/@sentry/types/-/types-5.30.0.tgz#19709bbe12a1a0115bc790b8942917da5636f402" integrity sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw== "@sentry/utils@5.30.0": version "5.30.0" - resolved "https://registry.npmjs.org/@sentry/utils/-/utils-5.30.0.tgz" + resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-5.30.0.tgz#9a5bd7ccff85ccfe7856d493bffa64cabc41e980" integrity sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww== dependencies: "@sentry/types" "5.30.0" tslib "^1.9.3" -"@smithy/abort-controller@^3.1.5": - version "3.1.5" - resolved "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-3.1.5.tgz" - integrity sha512-DhNPnqTqPoG8aZ5dWkFOgsuY+i0GQ3CI6hMmvCoduNsnU9gUZWZBwGfDQsTTB7NvFPkom1df7jMIJWU90kuXXg== +"@smithy/abort-controller@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@smithy/abort-controller/-/abort-controller-4.0.1.tgz#7c5e73690c4105ad264c2896bd1ea822450c3819" + integrity sha512-fiUIYgIgRjMWznk6iLJz35K2YxSLHzLBA/RC6lBrKfQ8fHbPfvk7Pk9UvpKoHgJjI18MnbPuEju53zcVy6KF1g== dependencies: - "@smithy/types" "^3.5.0" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@smithy/chunked-blob-reader-native@^3.0.0": - version "3.0.0" - resolved "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-3.0.0.tgz" - integrity sha512-VDkpCYW+peSuM4zJip5WDfqvg2Mo/e8yxOv3VF1m11y7B8KKMKVFtmZWDe36Fvk8rGuWrPZHHXZ7rR7uM5yWyg== +"@smithy/chunked-blob-reader-native@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-4.0.0.tgz#33cbba6deb8a3c516f98444f65061784f7cd7f8c" + integrity sha512-R9wM2yPmfEMsUmlMlIgSzOyICs0x9uu7UTHoccMyt7BWw8shcGM8HqB355+BZCPBcySvbTYMs62EgEQkNxz2ig== dependencies: - "@smithy/util-base64" "^3.0.0" + "@smithy/util-base64" "^4.0.0" tslib "^2.6.2" -"@smithy/chunked-blob-reader@^3.0.0": - version "3.0.0" - resolved "https://registry.npmjs.org/@smithy/chunked-blob-reader/-/chunked-blob-reader-3.0.0.tgz" - integrity sha512-sbnURCwjF0gSToGlsBiAmd1lRCmSn72nu9axfJu5lIx6RUEgHu6GwTMbqCdhQSi0Pumcm5vFxsi9XWXb2mTaoA== +"@smithy/chunked-blob-reader@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@smithy/chunked-blob-reader/-/chunked-blob-reader-5.0.0.tgz#3f6ea5ff4e2b2eacf74cefd737aa0ba869b2e0f6" + integrity sha512-+sKqDBQqb036hh4NPaUiEkYFkTUGYzRsn3EuFhyfQfMy6oGHEUJDurLP9Ufb5dasr/XiAmPNMr6wa9afjQB+Gw== dependencies: tslib "^2.6.2" -"@smithy/config-resolver@^3.0.9": - version "3.0.9" - resolved "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-3.0.9.tgz" - integrity sha512-5d9oBf40qC7n2xUoHmntKLdqsyTMMo/r49+eqSIjJ73eDfEtljAxEhzIQ3bkgXJtR3xiv7YzMT/3FF3ORkjWdg== +"@smithy/config-resolver@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@smithy/config-resolver/-/config-resolver-4.0.1.tgz#3d6c78bbc51adf99c9819bb3f0ea197fe03ad363" + integrity sha512-Igfg8lKu3dRVkTSEm98QpZUvKEOa71jDX4vKRcvJVyRc3UgN3j7vFMf0s7xLQhYmKa8kyJGQgUJDOV5V3neVlQ== dependencies: - "@smithy/node-config-provider" "^3.1.8" - "@smithy/types" "^3.5.0" - "@smithy/util-config-provider" "^3.0.0" - "@smithy/util-middleware" "^3.0.7" + "@smithy/node-config-provider" "^4.0.1" + "@smithy/types" "^4.1.0" + "@smithy/util-config-provider" "^4.0.0" + "@smithy/util-middleware" "^4.0.1" tslib "^2.6.2" -"@smithy/core@^2.4.8": - version "2.4.8" - resolved "https://registry.npmjs.org/@smithy/core/-/core-2.4.8.tgz" - integrity sha512-x4qWk7p/a4dcf7Vxb2MODIf4OIcqNbK182WxRvZ/3oKPrf/6Fdic5sSElhO1UtXpWKBazWfqg0ZEK9xN1DsuHA== - dependencies: - "@smithy/middleware-endpoint" "^3.1.4" - "@smithy/middleware-retry" "^3.0.23" - "@smithy/middleware-serde" "^3.0.7" - "@smithy/protocol-http" "^4.1.4" - "@smithy/smithy-client" "^3.4.0" - "@smithy/types" "^3.5.0" - "@smithy/util-body-length-browser" "^3.0.0" - "@smithy/util-middleware" "^3.0.7" - "@smithy/util-utf8" "^3.0.0" +"@smithy/core@^3.1.4", "@smithy/core@^3.1.5": + version "3.1.5" + resolved "https://registry.yarnpkg.com/@smithy/core/-/core-3.1.5.tgz#cc260229e45964d8354a3737bf3dedb56e373616" + integrity sha512-HLclGWPkCsekQgsyzxLhCQLa8THWXtB5PxyYN+2O6nkyLt550KQKTlbV2D1/j5dNIQapAZM1+qFnpBFxZQkgCA== + dependencies: + "@smithy/middleware-serde" "^4.0.2" + "@smithy/protocol-http" "^5.0.1" + "@smithy/types" "^4.1.0" + "@smithy/util-body-length-browser" "^4.0.0" + "@smithy/util-middleware" "^4.0.1" + "@smithy/util-stream" "^4.1.2" + "@smithy/util-utf8" "^4.0.0" tslib "^2.6.2" -"@smithy/credential-provider-imds@^3.2.4": - version "3.2.4" - resolved "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-3.2.4.tgz" - integrity sha512-S9bb0EIokfYEuar4kEbLta+ivlKCWOCFsLZuilkNy9i0uEUEHSi47IFLPaxqqCl+0ftKmcOTHayY5nQhAuq7+w== +"@smithy/credential-provider-imds@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@smithy/credential-provider-imds/-/credential-provider-imds-4.0.1.tgz#807110739982acd1588a4847b61e6edf196d004e" + integrity sha512-l/qdInaDq1Zpznpmev/+52QomsJNZ3JkTl5yrTl02V6NBgJOQ4LY0SFw/8zsMwj3tLe8vqiIuwF6nxaEwgf6mg== dependencies: - "@smithy/node-config-provider" "^3.1.8" - "@smithy/property-provider" "^3.1.7" - "@smithy/types" "^3.5.0" - "@smithy/url-parser" "^3.0.7" + "@smithy/node-config-provider" "^4.0.1" + "@smithy/property-provider" "^4.0.1" + "@smithy/types" "^4.1.0" + "@smithy/url-parser" "^4.0.1" tslib "^2.6.2" -"@smithy/eventstream-codec@^3.1.6": - version "3.1.6" - resolved "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-3.1.6.tgz" - integrity sha512-SBiOYPBH+5wOyPS7lfI150ePfGLhnp/eTu5RnV9xvhGvRiKfnl6HzRK9wehBph+il8FxS9KTeadx7Rcmf1GLPQ== +"@smithy/eventstream-codec@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@smithy/eventstream-codec/-/eventstream-codec-4.0.1.tgz#8e0beae84013eb3b497dd189470a44bac4411bae" + integrity sha512-Q2bCAAR6zXNVtJgifsU16ZjKGqdw/DyecKNgIgi7dlqw04fqDu0mnq+JmGphqheypVc64CYq3azSuCpAdFk2+A== dependencies: "@aws-crypto/crc32" "5.2.0" - "@smithy/types" "^3.5.0" - "@smithy/util-hex-encoding" "^3.0.0" + "@smithy/types" "^4.1.0" + "@smithy/util-hex-encoding" "^4.0.0" tslib "^2.6.2" -"@smithy/eventstream-serde-browser@^3.0.10": - version "3.0.10" - resolved "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-3.0.10.tgz" - integrity sha512-1i9aMY6Pl/SmA6NjvidxnfBLHMPzhKu2BP148pEt5VwhMdmXn36PE2kWKGa9Hj8b0XGtCTRucpCncylevCtI7g== +"@smithy/eventstream-serde-browser@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.0.1.tgz#cdbbb18b9371da363eff312d78a10f6bad82df28" + integrity sha512-HbIybmz5rhNg+zxKiyVAnvdM3vkzjE6ccrJ620iPL8IXcJEntd3hnBl+ktMwIy12Te/kyrSbUb8UCdnUT4QEdA== dependencies: - "@smithy/eventstream-serde-universal" "^3.0.9" - "@smithy/types" "^3.5.0" + "@smithy/eventstream-serde-universal" "^4.0.1" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@smithy/eventstream-serde-config-resolver@^3.0.7": - version "3.0.7" - resolved "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-3.0.7.tgz" - integrity sha512-eVzhGQBPEqXXYHvIUku0jMTxd4gDvenRzUQPTmKVWdRvp9JUCKrbAXGQRYiGxUYq9+cqQckRm0wq3kTWnNtDhw== +"@smithy/eventstream-serde-config-resolver@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.0.1.tgz#3662587f507ad7fac5bd4505c4ed6ed0ac49a010" + integrity sha512-lSipaiq3rmHguHa3QFF4YcCM3VJOrY9oq2sow3qlhFY+nBSTF/nrO82MUQRPrxHQXA58J5G1UnU2WuJfi465BA== dependencies: - "@smithy/types" "^3.5.0" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@smithy/eventstream-serde-node@^3.0.9": - version "3.0.9" - resolved "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-3.0.9.tgz" - integrity sha512-JE0Guqvt0xsmfQ5y1EI342/qtJqznBv8cJqkHZV10PwC8GWGU5KNgFbQnsVCcX+xF+qIqwwfRmeWoJCjuOLmng== +"@smithy/eventstream-serde-node@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.0.1.tgz#3799c33e0148d2b923a66577d1dbc590865742ce" + integrity sha512-o4CoOI6oYGYJ4zXo34U8X9szDe3oGjmHgsMGiZM0j4vtNoT+h80TLnkUcrLZR3+E6HIxqW+G+9WHAVfl0GXK0Q== dependencies: - "@smithy/eventstream-serde-universal" "^3.0.9" - "@smithy/types" "^3.5.0" + "@smithy/eventstream-serde-universal" "^4.0.1" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@smithy/eventstream-serde-universal@^3.0.9": - version "3.0.9" - resolved "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-3.0.9.tgz" - integrity sha512-bydfgSisfepCufw9kCEnWRxqxJFzX/o8ysXWv+W9F2FIyiaEwZ/D8bBKINbh4ONz3i05QJ1xE7A5OKYvgJsXaw== +"@smithy/eventstream-serde-universal@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.0.1.tgz#ddb2ab9f62b8ab60f50acd5f7c8b3ac9d27468e2" + integrity sha512-Z94uZp0tGJuxds3iEAZBqGU2QiaBHP4YytLUjwZWx+oUeohCsLyUm33yp4MMBmhkuPqSbQCXq5hDet6JGUgHWA== dependencies: - "@smithy/eventstream-codec" "^3.1.6" - "@smithy/types" "^3.5.0" + "@smithy/eventstream-codec" "^4.0.1" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@smithy/fetch-http-handler@^3.2.9": - version "3.2.9" - resolved "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-3.2.9.tgz" - integrity sha512-hYNVQOqhFQ6vOpenifFME546f0GfJn2OiQ3M0FDmuUu8V/Uiwy2wej7ZXxFBNqdx0R5DZAqWM1l6VRhGz8oE6A== +"@smithy/fetch-http-handler@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@smithy/fetch-http-handler/-/fetch-http-handler-5.0.1.tgz#8463393442ca6a1644204849e42c386066f0df79" + integrity sha512-3aS+fP28urrMW2KTjb6z9iFow6jO8n3MFfineGbndvzGZit3taZhKWtTorf+Gp5RpFDDafeHlhfsGlDCXvUnJA== dependencies: - "@smithy/protocol-http" "^4.1.4" - "@smithy/querystring-builder" "^3.0.7" - "@smithy/types" "^3.5.0" - "@smithy/util-base64" "^3.0.0" + "@smithy/protocol-http" "^5.0.1" + "@smithy/querystring-builder" "^4.0.1" + "@smithy/types" "^4.1.0" + "@smithy/util-base64" "^4.0.0" tslib "^2.6.2" -"@smithy/hash-blob-browser@^3.1.6": - version "3.1.6" - resolved "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-3.1.6.tgz" - integrity sha512-BKNcMIaeZ9lB67sgo88iCF4YB35KT8X2dNJ8DqrtZNTgN6tUDYBKThzfGtos/mnZkGkW91AYHisESHmSiYQmKw== +"@smithy/hash-blob-browser@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@smithy/hash-blob-browser/-/hash-blob-browser-4.0.1.tgz#cda18d5828e8724d97441ea9cc4fd16d0db9da39" + integrity sha512-rkFIrQOKZGS6i1D3gKJ8skJ0RlXqDvb1IyAphksaFOMzkn3v3I1eJ8m7OkLj0jf1McP63rcCEoLlkAn/HjcTRw== dependencies: - "@smithy/chunked-blob-reader" "^3.0.0" - "@smithy/chunked-blob-reader-native" "^3.0.0" - "@smithy/types" "^3.5.0" + "@smithy/chunked-blob-reader" "^5.0.0" + "@smithy/chunked-blob-reader-native" "^4.0.0" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@smithy/hash-node@^3.0.7": - version "3.0.7" - resolved "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-3.0.7.tgz" - integrity sha512-SAGHN+QkrwcHFjfWzs/czX94ZEjPJ0CrWJS3M43WswDXVEuP4AVy9gJ3+AF6JQHZD13bojmuf/Ap/ItDeZ+Qfw== +"@smithy/hash-node@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@smithy/hash-node/-/hash-node-4.0.1.tgz#ce78fc11b848a4f47c2e1e7a07fb6b982d2f130c" + integrity sha512-TJ6oZS+3r2Xu4emVse1YPB3Dq3d8RkZDKcPr71Nj/lJsdAP1c7oFzYqEn1IBc915TsgLl2xIJNuxCz+gLbLE0w== dependencies: - "@smithy/types" "^3.5.0" - "@smithy/util-buffer-from" "^3.0.0" - "@smithy/util-utf8" "^3.0.0" + "@smithy/types" "^4.1.0" + "@smithy/util-buffer-from" "^4.0.0" + "@smithy/util-utf8" "^4.0.0" tslib "^2.6.2" -"@smithy/hash-stream-node@^3.1.6": - version "3.1.6" - resolved "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-3.1.6.tgz" - integrity sha512-sFSSt7cmCpFWZPfVx7k80Bgb1K2VJ27VmMxH8X+dDhp7Wv8IBgID4K2VK5ehMJROF8hQgcj4WywnkHIwX/xlwQ== +"@smithy/hash-stream-node@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@smithy/hash-stream-node/-/hash-stream-node-4.0.1.tgz#06126859a3cb1a11e50b61c5a097a4d9a5af2ac1" + integrity sha512-U1rAE1fxmReCIr6D2o/4ROqAQX+GffZpyMt3d7njtGDr2pUNmAKRWa49gsNVhCh2vVAuf3wXzWwNr2YN8PAXIw== dependencies: - "@smithy/types" "^3.5.0" - "@smithy/util-utf8" "^3.0.0" + "@smithy/types" "^4.1.0" + "@smithy/util-utf8" "^4.0.0" tslib "^2.6.2" -"@smithy/invalid-dependency@^3.0.7": - version "3.0.7" - resolved "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-3.0.7.tgz" - integrity sha512-Bq00GsAhHeYSuZX8Kpu4sbI9agH2BNYnqUmmbTGWOhki9NVsWn2jFr896vvoTMH8KAjNX/ErC/8t5QHuEXG+IA== +"@smithy/invalid-dependency@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@smithy/invalid-dependency/-/invalid-dependency-4.0.1.tgz#704d1acb6fac105558c17d53f6d55da6b0d6b6fc" + integrity sha512-gdudFPf4QRQ5pzj7HEnu6FhKRi61BfH/Gk5Yf6O0KiSbr1LlVhgjThcvjdu658VE6Nve8vaIWB8/fodmS1rBPQ== dependencies: - "@smithy/types" "^3.5.0" + "@smithy/types" "^4.1.0" tslib "^2.6.2" "@smithy/is-array-buffer@^2.2.0": version "2.2.0" - resolved "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz" + resolved "https://registry.yarnpkg.com/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz#f84f0d9f9a36601a9ca9381688bd1b726fd39111" integrity sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA== dependencies: tslib "^2.6.2" -"@smithy/is-array-buffer@^3.0.0": - version "3.0.0" - resolved "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz" - integrity sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ== +"@smithy/is-array-buffer@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@smithy/is-array-buffer/-/is-array-buffer-4.0.0.tgz#55a939029321fec462bcc574890075cd63e94206" + integrity sha512-saYhF8ZZNoJDTvJBEWgeBccCg+yvp1CX+ed12yORU3NilJScfc6gfch2oVb4QgxZrGUx3/ZJlb+c/dJbyupxlw== dependencies: tslib "^2.6.2" -"@smithy/md5-js@^3.0.7": - version "3.0.7" - resolved "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-3.0.7.tgz" - integrity sha512-+wco9IN9uOW4tNGkZIqTR6IXyfO7Z8A+IOq82QCRn/f/xcmt7H1fXwmQVbfDSvbeFwfNnhv7s+u0G9PzPG6o2w== +"@smithy/md5-js@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@smithy/md5-js/-/md5-js-4.0.1.tgz#d7622e94dc38ecf290876fcef04369217ada8f07" + integrity sha512-HLZ647L27APi6zXkZlzSFZIjpo8po45YiyjMGJZM3gyDY8n7dPGdmxIIljLm4gPt/7rRvutLTTkYJpZVfG5r+A== dependencies: - "@smithy/types" "^3.5.0" - "@smithy/util-utf8" "^3.0.0" + "@smithy/types" "^4.1.0" + "@smithy/util-utf8" "^4.0.0" tslib "^2.6.2" -"@smithy/middleware-content-length@^3.0.9": - version "3.0.9" - resolved "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-3.0.9.tgz" - integrity sha512-t97PidoGElF9hTtLCrof32wfWMqC5g2SEJNxaVH3NjlatuNGsdxXRYO/t+RPnxA15RpYiS0f+zG7FuE2DeGgjA== +"@smithy/middleware-content-length@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@smithy/middleware-content-length/-/middleware-content-length-4.0.1.tgz#378bc94ae623f45e412fb4f164b5bb90b9de2ba3" + integrity sha512-OGXo7w5EkB5pPiac7KNzVtfCW2vKBTZNuCctn++TTSOMpe6RZO/n6WEC1AxJINn3+vWLKW49uad3lo/u0WJ9oQ== dependencies: - "@smithy/protocol-http" "^4.1.4" - "@smithy/types" "^3.5.0" + "@smithy/protocol-http" "^5.0.1" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@smithy/middleware-endpoint@^3.1.4": - version "3.1.4" - resolved "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-3.1.4.tgz" - integrity sha512-/ChcVHekAyzUbyPRI8CzPPLj6y8QRAfJngWcLMgsWxKVzw/RzBV69mSOzJYDD3pRwushA1+5tHtPF8fjmzBnrQ== - dependencies: - "@smithy/middleware-serde" "^3.0.7" - "@smithy/node-config-provider" "^3.1.8" - "@smithy/shared-ini-file-loader" "^3.1.8" - "@smithy/types" "^3.5.0" - "@smithy/url-parser" "^3.0.7" - "@smithy/util-middleware" "^3.0.7" +"@smithy/middleware-endpoint@^4.0.5", "@smithy/middleware-endpoint@^4.0.6": + version "4.0.6" + resolved "https://registry.yarnpkg.com/@smithy/middleware-endpoint/-/middleware-endpoint-4.0.6.tgz#7ead08fcfda92ee470786a7f458e9b59048407eb" + integrity sha512-ftpmkTHIFqgaFugcjzLZv3kzPEFsBFSnq1JsIkr2mwFzCraZVhQk2gqN51OOeRxqhbPTkRFj39Qd2V91E/mQxg== + dependencies: + "@smithy/core" "^3.1.5" + "@smithy/middleware-serde" "^4.0.2" + "@smithy/node-config-provider" "^4.0.1" + "@smithy/shared-ini-file-loader" "^4.0.1" + "@smithy/types" "^4.1.0" + "@smithy/url-parser" "^4.0.1" + "@smithy/util-middleware" "^4.0.1" tslib "^2.6.2" -"@smithy/middleware-retry@^3.0.23": - version "3.0.23" - resolved "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-3.0.23.tgz" - integrity sha512-x9PbGXxkcXIpm6L26qRSCC+eaYcHwybRmqU8LO/WM2RRlW0g8lz6FIiKbKgGvHuoK3dLZRiQVSQJveiCzwnA5A== - dependencies: - "@smithy/node-config-provider" "^3.1.8" - "@smithy/protocol-http" "^4.1.4" - "@smithy/service-error-classification" "^3.0.7" - "@smithy/smithy-client" "^3.4.0" - "@smithy/types" "^3.5.0" - "@smithy/util-middleware" "^3.0.7" - "@smithy/util-retry" "^3.0.7" +"@smithy/middleware-retry@^4.0.6": + version "4.0.7" + resolved "https://registry.yarnpkg.com/@smithy/middleware-retry/-/middleware-retry-4.0.7.tgz#8bb2014842a6144f230967db502f5fe6adcd6529" + integrity sha512-58j9XbUPLkqAcV1kHzVX/kAR16GT+j7DUZJqwzsxh1jtz7G82caZiGyyFgUvogVfNTg3TeAOIJepGc8TXF4AVQ== + dependencies: + "@smithy/node-config-provider" "^4.0.1" + "@smithy/protocol-http" "^5.0.1" + "@smithy/service-error-classification" "^4.0.1" + "@smithy/smithy-client" "^4.1.6" + "@smithy/types" "^4.1.0" + "@smithy/util-middleware" "^4.0.1" + "@smithy/util-retry" "^4.0.1" tslib "^2.6.2" uuid "^9.0.1" -"@smithy/middleware-serde@^3.0.7": - version "3.0.7" - resolved "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-3.0.7.tgz" - integrity sha512-VytaagsQqtH2OugzVTq4qvjkLNbWehHfGcGr0JLJmlDRrNCeZoWkWsSOw1nhS/4hyUUWF/TLGGml4X/OnEep5g== +"@smithy/middleware-serde@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@smithy/middleware-serde/-/middleware-serde-4.0.2.tgz#f792d72f6ad8fa6b172e3f19c6fe1932a856a56d" + integrity sha512-Sdr5lOagCn5tt+zKsaW+U2/iwr6bI9p08wOkCp6/eL6iMbgdtc2R5Ety66rf87PeohR0ExI84Txz9GYv5ou3iQ== dependencies: - "@smithy/types" "^3.5.0" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@smithy/middleware-stack@^3.0.7": - version "3.0.7" - resolved "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-3.0.7.tgz" - integrity sha512-EyTbMCdqS1DoeQsO4gI7z2Gzq1MoRFAeS8GkFYIwbedB7Lp5zlLHJdg+56tllIIG5Hnf9ZWX48YKSHlsKvugGA== +"@smithy/middleware-stack@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@smithy/middleware-stack/-/middleware-stack-4.0.1.tgz#c157653f9df07f7c26e32f49994d368e4e071d22" + integrity sha512-dHwDmrtR/ln8UTHpaIavRSzeIk5+YZTBtLnKwDW3G2t6nAupCiQUvNzNoHBpik63fwUaJPtlnMzXbQrNFWssIA== dependencies: - "@smithy/types" "^3.5.0" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@smithy/node-config-provider@^3.1.8": - version "3.1.8" - resolved "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.8.tgz" - integrity sha512-E0rU0DglpeJn5ge64mk8wTGEXcQwmpUTY5Zr7IzTpDLmHKiIamINERNZYrPQjg58Ck236sEKSwRSHA4CwshU6Q== +"@smithy/node-config-provider@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@smithy/node-config-provider/-/node-config-provider-4.0.1.tgz#4e84fe665c0774d5f4ebb75144994fc6ebedf86e" + integrity sha512-8mRTjvCtVET8+rxvmzRNRR0hH2JjV0DFOmwXPrISmTIJEfnCBugpYYGAsCj8t41qd+RB5gbheSQ/6aKZCQvFLQ== dependencies: - "@smithy/property-provider" "^3.1.7" - "@smithy/shared-ini-file-loader" "^3.1.8" - "@smithy/types" "^3.5.0" + "@smithy/property-provider" "^4.0.1" + "@smithy/shared-ini-file-loader" "^4.0.1" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@smithy/node-http-handler@^3.2.4": - version "3.2.4" - resolved "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-3.2.4.tgz" - integrity sha512-49reY3+JgLMFNm7uTAKBWiKCA6XSvkNp9FqhVmusm2jpVnHORYFeFZ704LShtqWfjZW/nhX+7Iexyb6zQfXYIQ== +"@smithy/node-http-handler@^4.0.2", "@smithy/node-http-handler@^4.0.3": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@smithy/node-http-handler/-/node-http-handler-4.0.3.tgz#363e1d453168b4e37e8dd456d0a368a4e413bc98" + integrity sha512-dYCLeINNbYdvmMLtW0VdhW1biXt+PPCGazzT5ZjKw46mOtdgToQEwjqZSS9/EN8+tNs/RO0cEWG044+YZs97aA== dependencies: - "@smithy/abort-controller" "^3.1.5" - "@smithy/protocol-http" "^4.1.4" - "@smithy/querystring-builder" "^3.0.7" - "@smithy/types" "^3.5.0" + "@smithy/abort-controller" "^4.0.1" + "@smithy/protocol-http" "^5.0.1" + "@smithy/querystring-builder" "^4.0.1" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@smithy/property-provider@^3.1.7": - version "3.1.7" - resolved "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.1.7.tgz" - integrity sha512-QfzLi1GPMisY7bAM5hOUqBdGYnY5S2JAlr201pghksrQv139f8iiiMalXtjczIP5f6owxFn3MINLNUNvUkgtPw== +"@smithy/property-provider@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@smithy/property-provider/-/property-provider-4.0.1.tgz#8d35d5997af2a17cf15c5e921201ef6c5e3fc870" + integrity sha512-o+VRiwC2cgmk/WFV0jaETGOtX16VNPp2bSQEzu0whbReqE1BMqsP2ami2Vi3cbGVdKu1kq9gQkDAGKbt0WOHAQ== dependencies: - "@smithy/types" "^3.5.0" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@smithy/protocol-http@^4.1.4": - version "4.1.4" - resolved "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.4.tgz" - integrity sha512-MlWK8eqj0JlpZBnWmjQLqmFp71Ug00P+m72/1xQB3YByXD4zZ+y9N4hYrR0EDmrUCZIkyATWHOXFgtavwGDTzQ== +"@smithy/protocol-http@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@smithy/protocol-http/-/protocol-http-5.0.1.tgz#37c248117b29c057a9adfad4eb1d822a67079ff1" + integrity sha512-TE4cpj49jJNB/oHyh/cRVEgNZaoPaxd4vteJNB0yGidOCVR0jCw/hjPVsT8Q8FRmj8Bd3bFZt8Dh7xGCT+xMBQ== dependencies: - "@smithy/types" "^3.5.0" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@smithy/querystring-builder@^3.0.7": - version "3.0.7" - resolved "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-3.0.7.tgz" - integrity sha512-65RXGZZ20rzqqxTsChdqSpbhA6tdt5IFNgG6o7e1lnPVLCe6TNWQq4rTl4N87hTDD8mV4IxJJnvyE7brbnRkQw== +"@smithy/querystring-builder@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@smithy/querystring-builder/-/querystring-builder-4.0.1.tgz#37e1e05d0d33c6f694088abc3e04eafb65cb6976" + integrity sha512-wU87iWZoCbcqrwszsOewEIuq+SU2mSoBE2CcsLwE0I19m0B2gOJr1MVjxWcDQYOzHbR1xCk7AcOBbGFUYOKvdg== dependencies: - "@smithy/types" "^3.5.0" - "@smithy/util-uri-escape" "^3.0.0" + "@smithy/types" "^4.1.0" + "@smithy/util-uri-escape" "^4.0.0" tslib "^2.6.2" -"@smithy/querystring-parser@^3.0.7": - version "3.0.7" - resolved "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-3.0.7.tgz" - integrity sha512-Fouw4KJVWqqUVIu1gZW8BH2HakwLz6dvdrAhXeXfeymOBrZw+hcqaWs+cS1AZPVp4nlbeIujYrKA921ZW2WMPA== +"@smithy/querystring-parser@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@smithy/querystring-parser/-/querystring-parser-4.0.1.tgz#312dc62b146f8bb8a67558d82d4722bb9211af42" + integrity sha512-Ma2XC7VS9aV77+clSFylVUnPZRindhB7BbmYiNOdr+CHt/kZNJoPP0cd3QxCnCFyPXC4eybmyE98phEHkqZ5Jw== dependencies: - "@smithy/types" "^3.5.0" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@smithy/service-error-classification@^3.0.7": - version "3.0.7" - resolved "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-3.0.7.tgz" - integrity sha512-91PRkTfiBf9hxkIchhRKJfl1rsplRDyBnmyFca3y0Z3x/q0JJN480S83LBd8R6sBCkm2bBbqw2FHp0Mbh+ecSA== +"@smithy/service-error-classification@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@smithy/service-error-classification/-/service-error-classification-4.0.1.tgz#84e78579af46c7b79c900b6d6cc822c9465f3259" + integrity sha512-3JNjBfOWpj/mYfjXJHB4Txc/7E4LVq32bwzE7m28GN79+M1f76XHflUaSUkhOriprPDzev9cX/M+dEB80DNDKA== dependencies: - "@smithy/types" "^3.5.0" + "@smithy/types" "^4.1.0" -"@smithy/shared-ini-file-loader@^3.1.8": - version "3.1.8" - resolved "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.8.tgz" - integrity sha512-0NHdQiSkeGl0ICQKcJQ2lCOKH23Nb0EaAa7RDRId6ZqwXkw4LJyIyZ0t3iusD4bnKYDPLGy2/5e2rfUhrt0Acw== +"@smithy/shared-ini-file-loader@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.1.tgz#d35c21c29454ca4e58914a4afdde68d3b2def1ee" + integrity sha512-hC8F6qTBbuHRI/uqDgqqi6J0R4GtEZcgrZPhFQnMhfJs3MnUTGSnR1NSJCJs5VWlMydu0kJz15M640fJlRsIOw== dependencies: - "@smithy/types" "^3.5.0" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@smithy/signature-v4@^4.2.0": - version "4.2.0" - resolved "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-4.2.0.tgz" - integrity sha512-LafbclHNKnsorMgUkKm7Tk7oJ7xizsZ1VwqhGKqoCIrXh4fqDDp73fK99HOEEgcsQbtemmeY/BPv0vTVYYUNEQ== - dependencies: - "@smithy/is-array-buffer" "^3.0.0" - "@smithy/protocol-http" "^4.1.4" - "@smithy/types" "^3.5.0" - "@smithy/util-hex-encoding" "^3.0.0" - "@smithy/util-middleware" "^3.0.7" - "@smithy/util-uri-escape" "^3.0.0" - "@smithy/util-utf8" "^3.0.0" +"@smithy/signature-v4@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@smithy/signature-v4/-/signature-v4-5.0.1.tgz#f93401b176150286ba246681031b0503ec359270" + integrity sha512-nCe6fQ+ppm1bQuw5iKoeJ0MJfz2os7Ic3GBjOkLOPtavbD1ONoyE3ygjBfz2ythFWm4YnRm6OxW+8p/m9uCoIA== + dependencies: + "@smithy/is-array-buffer" "^4.0.0" + "@smithy/protocol-http" "^5.0.1" + "@smithy/types" "^4.1.0" + "@smithy/util-hex-encoding" "^4.0.0" + "@smithy/util-middleware" "^4.0.1" + "@smithy/util-uri-escape" "^4.0.0" + "@smithy/util-utf8" "^4.0.0" tslib "^2.6.2" -"@smithy/smithy-client@^3.4.0": - version "3.4.0" - resolved "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-3.4.0.tgz" - integrity sha512-nOfJ1nVQsxiP6srKt43r2My0Gp5PLWCW2ASqUioxIiGmu6d32v4Nekidiv5qOmmtzIrmaD+ADX5SKHUuhReeBQ== - dependencies: - "@smithy/middleware-endpoint" "^3.1.4" - "@smithy/middleware-stack" "^3.0.7" - "@smithy/protocol-http" "^4.1.4" - "@smithy/types" "^3.5.0" - "@smithy/util-stream" "^3.1.9" +"@smithy/smithy-client@^4.1.5", "@smithy/smithy-client@^4.1.6": + version "4.1.6" + resolved "https://registry.yarnpkg.com/@smithy/smithy-client/-/smithy-client-4.1.6.tgz#2183c922d086d33252012232be891f29a008d932" + integrity sha512-UYDolNg6h2O0L+cJjtgSyKKvEKCOa/8FHYJnBobyeoeWDmNpXjwOAtw16ezyeu1ETuuLEOZbrynK0ZY1Lx9Jbw== + dependencies: + "@smithy/core" "^3.1.5" + "@smithy/middleware-endpoint" "^4.0.6" + "@smithy/middleware-stack" "^4.0.1" + "@smithy/protocol-http" "^5.0.1" + "@smithy/types" "^4.1.0" + "@smithy/util-stream" "^4.1.2" tslib "^2.6.2" -"@smithy/types@^3.5.0": - version "3.5.0" - resolved "https://registry.npmjs.org/@smithy/types/-/types-3.5.0.tgz" - integrity sha512-QN0twHNfe8mNJdH9unwsCK13GURU7oEAZqkBI+rsvpv1jrmserO+WnLE7jidR9W/1dxwZ0u/CB01mV2Gms/K2Q== +"@smithy/types@^4.1.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@smithy/types/-/types-4.1.0.tgz#19de0b6087bccdd4182a334eb5d3d2629699370f" + integrity sha512-enhjdwp4D7CXmwLtD6zbcDMbo6/T6WtuuKCY49Xxc6OMOmUWlBEBDREsxxgV2LIdeQPW756+f97GzcgAwp3iLw== dependencies: tslib "^2.6.2" -"@smithy/url-parser@^3.0.7": - version "3.0.7" - resolved "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-3.0.7.tgz" - integrity sha512-70UbSSR8J97c1rHZOWhl+VKiZDqHWxs/iW8ZHrHp5fCCPLSBE7GcUlUvKSle3Ca+J9LLbYCj/A79BxztBvAfpA== +"@smithy/url-parser@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@smithy/url-parser/-/url-parser-4.0.1.tgz#b47743f785f5b8d81324878cbb1b5f834bf8d85a" + integrity sha512-gPXcIEUtw7VlK8f/QcruNXm7q+T5hhvGu9tl63LsJPZ27exB6dtNwvh2HIi0v7JcXJ5emBxB+CJxwaLEdJfA+g== dependencies: - "@smithy/querystring-parser" "^3.0.7" - "@smithy/types" "^3.5.0" + "@smithy/querystring-parser" "^4.0.1" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@smithy/util-base64@^3.0.0": - version "3.0.0" - resolved "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-3.0.0.tgz" - integrity sha512-Kxvoh5Qtt0CDsfajiZOCpJxgtPHXOKwmM+Zy4waD43UoEMA+qPxxa98aE/7ZhdnBFZFXMOiBR5xbcaMhLtznQQ== +"@smithy/util-base64@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@smithy/util-base64/-/util-base64-4.0.0.tgz#8345f1b837e5f636e5f8470c4d1706ae0c6d0358" + integrity sha512-CvHfCmO2mchox9kjrtzoHkWHxjHZzaFojLc8quxXY7WAAMAg43nuxwv95tATVgQFNDwd4M9S1qFzj40Ul41Kmg== dependencies: - "@smithy/util-buffer-from" "^3.0.0" - "@smithy/util-utf8" "^3.0.0" + "@smithy/util-buffer-from" "^4.0.0" + "@smithy/util-utf8" "^4.0.0" tslib "^2.6.2" -"@smithy/util-body-length-browser@^3.0.0": - version "3.0.0" - resolved "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-3.0.0.tgz" - integrity sha512-cbjJs2A1mLYmqmyVl80uoLTJhAcfzMOyPgjwAYusWKMdLeNtzmMz9YxNl3/jRLoxSS3wkqkf0jwNdtXWtyEBaQ== +"@smithy/util-body-length-browser@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@smithy/util-body-length-browser/-/util-body-length-browser-4.0.0.tgz#965d19109a4b1e5fe7a43f813522cce718036ded" + integrity sha512-sNi3DL0/k64/LO3A256M+m3CDdG6V7WKWHdAiBBMUN8S3hK3aMPhwnPik2A/a2ONN+9doY9UxaLfgqsIRg69QA== dependencies: tslib "^2.6.2" -"@smithy/util-body-length-node@^3.0.0": - version "3.0.0" - resolved "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-3.0.0.tgz" - integrity sha512-Tj7pZ4bUloNUP6PzwhN7K386tmSmEET9QtQg0TgdNOnxhZvCssHji+oZTUIuzxECRfG8rdm2PMw2WCFs6eIYkA== +"@smithy/util-body-length-node@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@smithy/util-body-length-node/-/util-body-length-node-4.0.0.tgz#3db245f6844a9b1e218e30c93305bfe2ffa473b3" + integrity sha512-q0iDP3VsZzqJyje8xJWEJCNIu3lktUGVoSy1KB0UWym2CL1siV3artm+u1DFYTLejpsrdGyCSWBdGNjJzfDPjg== dependencies: tslib "^2.6.2" "@smithy/util-buffer-from@^2.2.0": version "2.2.0" - resolved "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz" + resolved "https://registry.yarnpkg.com/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz#6fc88585165ec73f8681d426d96de5d402021e4b" integrity sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA== dependencies: "@smithy/is-array-buffer" "^2.2.0" tslib "^2.6.2" -"@smithy/util-buffer-from@^3.0.0": - version "3.0.0" - resolved "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz" - integrity sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA== +"@smithy/util-buffer-from@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@smithy/util-buffer-from/-/util-buffer-from-4.0.0.tgz#b23b7deb4f3923e84ef50c8b2c5863d0dbf6c0b9" + integrity sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug== dependencies: - "@smithy/is-array-buffer" "^3.0.0" + "@smithy/is-array-buffer" "^4.0.0" tslib "^2.6.2" -"@smithy/util-config-provider@^3.0.0": - version "3.0.0" - resolved "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-3.0.0.tgz" - integrity sha512-pbjk4s0fwq3Di/ANL+rCvJMKM5bzAQdE5S/6RL5NXgMExFAi6UgQMPOm5yPaIWPpr+EOXKXRonJ3FoxKf4mCJQ== +"@smithy/util-config-provider@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@smithy/util-config-provider/-/util-config-provider-4.0.0.tgz#e0c7c8124c7fba0b696f78f0bd0ccb060997d45e" + integrity sha512-L1RBVzLyfE8OXH+1hsJ8p+acNUSirQnWQ6/EgpchV88G6zGBTDPdXiiExei6Z1wR2RxYvxY/XLw6AMNCCt8H3w== dependencies: tslib "^2.6.2" -"@smithy/util-defaults-mode-browser@^3.0.23": - version "3.0.23" - resolved "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-3.0.23.tgz" - integrity sha512-Y07qslyRtXDP/C5aWKqxTPBl4YxplEELG3xRrz2dnAQ6Lq/FgNrcKWmV561nNaZmFH+EzeGOX3ZRMbU8p1T6Nw== +"@smithy/util-defaults-mode-browser@^4.0.6": + version "4.0.7" + resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.0.7.tgz#54595ab3da6765bfb388e8e8b594276e0f485710" + integrity sha512-CZgDDrYHLv0RUElOsmZtAnp1pIjwDVCSuZWOPhIOBvG36RDfX1Q9+6lS61xBf+qqvHoqRjHxgINeQz47cYFC2Q== dependencies: - "@smithy/property-provider" "^3.1.7" - "@smithy/smithy-client" "^3.4.0" - "@smithy/types" "^3.5.0" + "@smithy/property-provider" "^4.0.1" + "@smithy/smithy-client" "^4.1.6" + "@smithy/types" "^4.1.0" bowser "^2.11.0" tslib "^2.6.2" -"@smithy/util-defaults-mode-node@^3.0.23": - version "3.0.23" - resolved "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-3.0.23.tgz" - integrity sha512-9Y4WH7f0vnDGuHUa4lGX9e2p+sMwODibsceSV6rfkZOvMC+BY3StB2LdO1NHafpsyHJLpwAgChxQ38tFyd6vkg== - dependencies: - "@smithy/config-resolver" "^3.0.9" - "@smithy/credential-provider-imds" "^3.2.4" - "@smithy/node-config-provider" "^3.1.8" - "@smithy/property-provider" "^3.1.7" - "@smithy/smithy-client" "^3.4.0" - "@smithy/types" "^3.5.0" +"@smithy/util-defaults-mode-node@^4.0.6": + version "4.0.7" + resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.7.tgz#0dea136de9096a36d84416f6af5843d866621491" + integrity sha512-79fQW3hnfCdrfIi1soPbK3zmooRFnLpSx3Vxi6nUlqaaQeC5dm8plt4OTNDNqEEEDkvKghZSaoti684dQFVrGQ== + dependencies: + "@smithy/config-resolver" "^4.0.1" + "@smithy/credential-provider-imds" "^4.0.1" + "@smithy/node-config-provider" "^4.0.1" + "@smithy/property-provider" "^4.0.1" + "@smithy/smithy-client" "^4.1.6" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@smithy/util-endpoints@^2.1.3": - version "2.1.3" - resolved "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-2.1.3.tgz" - integrity sha512-34eACeKov6jZdHqS5hxBMJ4KyWKztTMulhuQ2UdOoP6vVxMLrOKUqIXAwJe/wiWMhXhydLW664B02CNpQBQ4Aw== +"@smithy/util-endpoints@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@smithy/util-endpoints/-/util-endpoints-3.0.1.tgz#44ccbf1721447966f69496c9003b87daa8f61975" + integrity sha512-zVdUENQpdtn9jbpD9SCFK4+aSiavRb9BxEtw9ZGUR1TYo6bBHbIoi7VkrFQ0/RwZlzx0wRBaRmPclj8iAoJCLA== dependencies: - "@smithy/node-config-provider" "^3.1.8" - "@smithy/types" "^3.5.0" + "@smithy/node-config-provider" "^4.0.1" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@smithy/util-hex-encoding@^3.0.0": - version "3.0.0" - resolved "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-3.0.0.tgz" - integrity sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ== +"@smithy/util-hex-encoding@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@smithy/util-hex-encoding/-/util-hex-encoding-4.0.0.tgz#dd449a6452cffb37c5b1807ec2525bb4be551e8d" + integrity sha512-Yk5mLhHtfIgW2W2WQZWSg5kuMZCVbvhFmC7rV4IO2QqnZdbEFPmQnCcGMAX2z/8Qj3B9hYYNjZOhWym+RwhePw== dependencies: tslib "^2.6.2" -"@smithy/util-middleware@^3.0.7": - version "3.0.7" - resolved "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.7.tgz" - integrity sha512-OVA6fv/3o7TMJTpTgOi1H5OTwnuUa8hzRzhSFDtZyNxi6OZ70L/FHattSmhE212I7b6WSOJAAmbYnvcjTHOJCA== +"@smithy/util-middleware@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@smithy/util-middleware/-/util-middleware-4.0.1.tgz#58d363dcd661219298c89fa176a28e98ccc4bf43" + integrity sha512-HiLAvlcqhbzhuiOa0Lyct5IIlyIz0PQO5dnMlmQ/ubYM46dPInB+3yQGkfxsk6Q24Y0n3/JmcA1v5iEhmOF5mA== dependencies: - "@smithy/types" "^3.5.0" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@smithy/util-retry@^3.0.7": - version "3.0.7" - resolved "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-3.0.7.tgz" - integrity sha512-nh1ZO1vTeo2YX1plFPSe/OXaHkLAHza5jpokNiiKX2M5YpNUv6RxGJZhpfmiR4jSvVHCjIDmILjrxKmP+/Ghug== +"@smithy/util-retry@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@smithy/util-retry/-/util-retry-4.0.1.tgz#fb5f26492383dcb9a09cc4aee23a10f839cd0769" + integrity sha512-WmRHqNVwn3kI3rKk1LsKcVgPBG6iLTBGC1iYOV3GQegwJ3E8yjzHytPt26VNzOWr1qu0xE03nK0Ug8S7T7oufw== dependencies: - "@smithy/service-error-classification" "^3.0.7" - "@smithy/types" "^3.5.0" + "@smithy/service-error-classification" "^4.0.1" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@smithy/util-stream@^3.1.9": - version "3.1.9" - resolved "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-3.1.9.tgz" - integrity sha512-7YAR0Ub3MwTMjDfjnup4qa6W8gygZMxikBhFMPESi6ASsl/rZJhwLpF/0k9TuezScCojsM0FryGdz4LZtjKPPQ== - dependencies: - "@smithy/fetch-http-handler" "^3.2.9" - "@smithy/node-http-handler" "^3.2.4" - "@smithy/types" "^3.5.0" - "@smithy/util-base64" "^3.0.0" - "@smithy/util-buffer-from" "^3.0.0" - "@smithy/util-hex-encoding" "^3.0.0" - "@smithy/util-utf8" "^3.0.0" +"@smithy/util-stream@^4.1.1", "@smithy/util-stream@^4.1.2": + version "4.1.2" + resolved "https://registry.yarnpkg.com/@smithy/util-stream/-/util-stream-4.1.2.tgz#b867f25bc8b016de0582810a2f4092a71c5e3244" + integrity sha512-44PKEqQ303d3rlQuiDpcCcu//hV8sn+u2JBo84dWCE0rvgeiVl0IlLMagbU++o0jCWhYCsHaAt9wZuZqNe05Hw== + dependencies: + "@smithy/fetch-http-handler" "^5.0.1" + "@smithy/node-http-handler" "^4.0.3" + "@smithy/types" "^4.1.0" + "@smithy/util-base64" "^4.0.0" + "@smithy/util-buffer-from" "^4.0.0" + "@smithy/util-hex-encoding" "^4.0.0" + "@smithy/util-utf8" "^4.0.0" tslib "^2.6.2" -"@smithy/util-uri-escape@^3.0.0": - version "3.0.0" - resolved "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-3.0.0.tgz" - integrity sha512-LqR7qYLgZTD7nWLBecUi4aqolw8Mhza9ArpNEQ881MJJIU2sE5iHCK6TdyqqzcDLy0OPe10IY4T8ctVdtynubg== +"@smithy/util-uri-escape@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@smithy/util-uri-escape/-/util-uri-escape-4.0.0.tgz#a96c160c76f3552458a44d8081fade519d214737" + integrity sha512-77yfbCbQMtgtTylO9itEAdpPXSog3ZxMe09AEhm0dU0NLTalV70ghDZFR+Nfi1C60jnJoh/Re4090/DuZh2Omg== dependencies: tslib "^2.6.2" "@smithy/util-utf8@^2.0.0": version "2.3.0" - resolved "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz" + resolved "https://registry.yarnpkg.com/@smithy/util-utf8/-/util-utf8-2.3.0.tgz#dd96d7640363259924a214313c3cf16e7dd329c5" integrity sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A== dependencies: "@smithy/util-buffer-from" "^2.2.0" tslib "^2.6.2" -"@smithy/util-utf8@^3.0.0": - version "3.0.0" - resolved "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz" - integrity sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA== +"@smithy/util-utf8@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@smithy/util-utf8/-/util-utf8-4.0.0.tgz#09ca2d9965e5849e72e347c130f2a29d5c0c863c" + integrity sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow== dependencies: - "@smithy/util-buffer-from" "^3.0.0" + "@smithy/util-buffer-from" "^4.0.0" tslib "^2.6.2" -"@smithy/util-waiter@^3.1.6": - version "3.1.6" - resolved "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-3.1.6.tgz" - integrity sha512-xs/KAwWOeCklq8aMlnpk25LgxEYHKOEodfjfKclDMLcBJEVEKzDLxZxBQyztcuPJ7F54213NJS8PxoiHNMdItQ== +"@smithy/util-waiter@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@smithy/util-waiter/-/util-waiter-4.0.2.tgz#0a73a0fcd30ea7bbc3009cf98ad199f51b8eac51" + integrity sha512-piUTHyp2Axx3p/kc2CIJkYSv0BAaheBQmbACZgQSSfWUumWNW+R1lL+H9PDBxKJkvOeEX+hKYEFiwO8xagL8AQ== dependencies: - "@smithy/abort-controller" "^3.1.5" - "@smithy/types" "^3.5.0" + "@smithy/abort-controller" "^4.0.1" + "@smithy/types" "^4.1.0" tslib "^2.6.2" "@socket.tech/dl-core@^2.35.0": - version "2.35.0" - resolved "https://registry.yarnpkg.com/@socket.tech/socket-protocol-common/-/dl-core-2.35.0.tgz#154120d222e095db812423f3b1e748fecdeb8815" - integrity sha512-VH3I4lfCFRpF0ovaYACfd3Fhq2DAtWYcL45xUUHMNVII/EbBl3F7jB10ztWime+0l5sWXVP3o0R8bMnkrotw3w== + version "2.40.0" + resolved "https://registry.yarnpkg.com/@socket.tech/dl-core/-/dl-core-2.40.0.tgz#57452b070feac7a412098cc5317fa72dad1e7020" + integrity sha512-c5CKN8ec5IwfVYUgJNbOAeefz7tv1u7b6Sz/o35usvn4AxRV3Tw4rgXAJS7tPEXYCq6jmhj2oD5CRUKJ65Dr2A== dependencies: axios "^1.3.6" prompts "^2.4.2" @@ -2134,34 +2090,34 @@ pino "^9.6.0" sequelize "^6.21.6" -"@solidity-parser/parser@^0.18.0": - version "0.18.0" - resolved "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.18.0.tgz" - integrity sha512-yfORGUIPgLck41qyN7nbwJRAx17/jAIXCTanHOJZhB6PJ1iAk/84b/xlsVKFSyNyLXIj0dhppoE0+CRws7wlzA== +"@solidity-parser/parser@^0.19.0": + version "0.19.0" + resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.19.0.tgz#37a8983b2725af9b14ff8c4a475fa0e98d773c3f" + integrity sha512-RV16k/qIxW/wWc+mLzV3ARyKUaMUTBy9tOLMzFhtNSKYeTAanQ3a5MudJKf/8arIFnA2L27SNjarQKmFg0w/jA== "@tsconfig/node10@^1.0.7": version "1.0.11" - resolved "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.11.tgz#6ee46400685f130e278128c7b38b7e031ff5b2f2" integrity sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw== "@tsconfig/node12@^1.0.7": version "1.0.11" - resolved "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz" + resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== "@tsconfig/node14@^1.0.0": version "1.0.3" - resolved "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz" + resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== "@tsconfig/node16@^1.0.2": version "1.0.4" - resolved "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== "@typechain/ethers-v5@^10.0.0": version "10.2.1" - resolved "https://registry.npmjs.org/@typechain/ethers-v5/-/ethers-v5-10.2.1.tgz" + resolved "https://registry.yarnpkg.com/@typechain/ethers-v5/-/ethers-v5-10.2.1.tgz#50241e6957683281ecfa03fb5a6724d8a3ce2391" integrity sha512-n3tQmCZjRE6IU4h6lqUGiQ1j866n5MTCBJreNEHHVWXa2u9GJTaeYyU1/k+1qLutkyw+sS6VAN+AbeiTqsxd/A== dependencies: lodash "^4.17.15" @@ -2169,7 +2125,7 @@ "@typechain/hardhat@6.0.0": version "6.0.0" - resolved "https://registry.npmjs.org/@typechain/hardhat/-/hardhat-6.0.0.tgz" + resolved "https://registry.yarnpkg.com/@typechain/hardhat/-/hardhat-6.0.0.tgz#5e305641de67276efbfaa8c37c78e38f22b22ef4" integrity sha512-AnhwODKHxx3+st5uc1j2NQh79Lv2OuvDQe4dKn8ZxhqYsAsTPnHTLBeI8KPZ+mfdE7v13D2QYssRTIkkGhK35A== dependencies: fs-extra "^9.1.0" @@ -2177,21 +2133,21 @@ "@types/async-eventemitter@^0.2.1": version "0.2.4" - resolved "https://registry.npmjs.org/@types/async-eventemitter/-/async-eventemitter-0.2.4.tgz" + resolved "https://registry.yarnpkg.com/@types/async-eventemitter/-/async-eventemitter-0.2.4.tgz#2f26d81e515a30ec32aa31a53da0469948f5f00b" integrity sha512-2Bq61VD01kgLf1XkK2xPtoBcu7fgn/km5JyEX9v0BlG5VQBzA+BlF9umFk+8gR8S4+eK7MgDY2oyVZCu6ar3Jw== dependencies: "@types/events" "*" "@types/bn.js@^4.11.3": version "4.11.6" - resolved "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz" + resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-4.11.6.tgz#c306c70d9358aaea33cd4eda092a742b9505967c" integrity sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg== dependencies: "@types/node" "*" "@types/bn.js@^5.1.0": version "5.1.6" - resolved "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.6.tgz" + resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.6.tgz#9ba818eec0c85e4d3c679518428afdf611d03203" integrity sha512-Xh8vSwUeMKeYYrj3cX4lGQgFSF/N03r+tv4AiLl1SucqV+uTQpxRcnM8AkXKHwYP9ZPXOYXRr2KPXpVlIvqh9w== dependencies: "@types/node" "*" @@ -2205,12 +2161,12 @@ "@types/events@*": version "3.0.3" - resolved "https://registry.npmjs.org/@types/events/-/events-3.0.3.tgz" + resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.3.tgz#a8ef894305af28d1fc6d2dfdfc98e899591ea529" integrity sha512-trOc4AAUThEz9hapPtSd7wf5tiQKvTtu5b371UxXdTuqzIh0ArcRspRP0i0Viu+LXstIQ1z96t1nsPxT9ol01g== "@types/lru-cache@^5.1.0": version "5.1.1" - resolved "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz" + resolved "https://registry.yarnpkg.com/@types/lru-cache/-/lru-cache-5.1.1.tgz#c48c2e27b65d2a153b19bfc1a317e30872e01eef" integrity sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw== "@types/ms@*": @@ -2219,32 +2175,32 @@ integrity sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA== "@types/node@*": - version "22.7.5" - resolved "https://registry.npmjs.org/@types/node/-/node-22.7.5.tgz" - integrity sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ== + version "22.13.5" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.13.5.tgz#23add1d71acddab2c6a4d31db89c0f98d330b511" + integrity sha512-+lTU0PxZXn0Dr1NBtC7Y8cR21AJr87dLLU953CWA6pMxxv/UDc7jYAY90upcrie1nRcD6XNG5HOYEDtgW5TxAg== dependencies: - undici-types "~6.19.2" + undici-types "~6.20.0" "@types/pbkdf2@^3.0.0": version "3.1.2" - resolved "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.2.tgz" + resolved "https://registry.yarnpkg.com/@types/pbkdf2/-/pbkdf2-3.1.2.tgz#2dc43808e9985a2c69ff02e2d2027bd4fe33e8dc" integrity sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew== dependencies: "@types/node" "*" "@types/prettier@^2.1.1": version "2.7.3" - resolved "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.3.tgz#3e51a17e291d01d17d3fc61422015a933af7a08f" integrity sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA== "@types/qs@^6.9.7": - version "6.9.16" - resolved "https://registry.npmjs.org/@types/qs/-/qs-6.9.16.tgz" - integrity sha512-7i+zxXdPD0T4cKDuxCUXJ4wHcsJLwENa6Z3dCu8cfCK743OGy5Nu1RmAGqDPsoTDINVEcdXKRvR/zre+P2Ku1A== + version "6.9.18" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.18.tgz#877292caa91f7c1b213032b34626505b746624c2" + integrity sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA== "@types/secp256k1@^4.0.1": version "4.0.6" - resolved "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.6.tgz" + resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-4.0.6.tgz#d60ba2349a51c2cbc5e816dcd831a42029d376bf" integrity sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ== dependencies: "@types/node" "*" @@ -2256,14 +2212,14 @@ abort-controller@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== dependencies: event-target-shim "^5.0.0" abstract-level@^1.0.0, abstract-level@^1.0.2, abstract-level@^1.0.3, abstract-level@^1.0.4: version "1.0.4" - resolved "https://registry.npmjs.org/abstract-level/-/abstract-level-1.0.4.tgz" + resolved "https://registry.yarnpkg.com/abstract-level/-/abstract-level-1.0.4.tgz#3ad8d684c51cc9cbc9cf9612a7100b716c414b57" integrity sha512-eUP/6pbXBkMbXFdx4IH2fVgvB7M0JvR7/lIL33zcs0IBcwjdzSSl31TOJsaCzmKSSDF9h8QYSOJux4Nd4YJqFg== dependencies: buffer "^6.0.3" @@ -2276,36 +2232,36 @@ abstract-level@^1.0.0, abstract-level@^1.0.2, abstract-level@^1.0.3, abstract-le acorn-walk@^8.1.1: version "8.3.4" - resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.4.tgz#794dd169c3977edf4ba4ea47583587c5866236b7" integrity sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g== dependencies: acorn "^8.11.0" acorn@^8.11.0, acorn@^8.4.1: - version "8.12.1" - resolved "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz" - integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== + version "8.14.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.14.0.tgz#063e2c70cac5fb4f6467f0b11152e04c682795b0" + integrity sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA== adm-zip@^0.4.16: version "0.4.16" - resolved "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz" + resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.16.tgz#cf4c508fdffab02c269cbc7f471a875f05570365" integrity sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg== aes-js@3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d" integrity sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw== agent-base@6: version "6.0.2" - resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== dependencies: debug "4" aggregate-error@^3.0.0: version "3.1.0" - resolved "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== dependencies: clean-stack "^2.0.0" @@ -2313,7 +2269,7 @@ aggregate-error@^3.0.0: ajv@^8.0.1: version "8.17.1" - resolved "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.17.1.tgz#37d9a5c776af6bc92d7f4f9510eba4c0a60d11a6" integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== dependencies: fast-deep-equal "^3.1.3" @@ -2323,38 +2279,38 @@ ajv@^8.0.1: ansi-colors@^4.1.0, ansi-colors@^4.1.1, ansi-colors@^4.1.3: version "4.1.3" - resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== ansi-escapes@^4.3.0: version "4.3.2" - resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== dependencies: type-fest "^0.21.3" ansi-regex@^5.0.1: version "5.0.1" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== ansi-styles@^3.2.1: version "3.2.1" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== dependencies: color-convert "^1.9.0" ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: color-convert "^2.0.1" anymatch@~3.1.2: version "3.1.3" - resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== dependencies: normalize-path "^3.0.0" @@ -2362,51 +2318,51 @@ anymatch@~3.1.2: arg@^4.1.0: version "4.1.3" - resolved "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== argparse@^2.0.1: version "2.0.1" - resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== array-back@^3.0.1, array-back@^3.1.0: version "3.1.0" - resolved "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz" + resolved "https://registry.yarnpkg.com/array-back/-/array-back-3.1.0.tgz#b8859d7a508871c9a7b2cf42f99428f65e96bfb0" integrity sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q== array-back@^4.0.1, array-back@^4.0.2: version "4.0.2" - resolved "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz" + resolved "https://registry.yarnpkg.com/array-back/-/array-back-4.0.2.tgz#8004e999a6274586beeb27342168652fdb89fa1e" integrity sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg== astral-regex@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== async-eventemitter@^0.2.4: version "0.2.4" - resolved "https://registry.npmjs.org/async-eventemitter/-/async-eventemitter-0.2.4.tgz" + resolved "https://registry.yarnpkg.com/async-eventemitter/-/async-eventemitter-0.2.4.tgz#f5e7c8ca7d3e46aab9ec40a292baf686a0bafaca" integrity sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw== dependencies: async "^2.4.0" async@^2.4.0, async@^2.6.4: version "2.6.4" - resolved "https://registry.npmjs.org/async/-/async-2.6.4.tgz" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== dependencies: lodash "^4.17.14" asynckit@^0.4.0: version "0.4.0" - resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== at-least-node@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== atomic-sleep@^1.0.0: @@ -2416,24 +2372,15 @@ atomic-sleep@^1.0.0: axios@^0.21.1: version "0.21.4" - resolved "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== dependencies: follow-redirects "^1.14.0" -axios@^1.3.6: - version "1.7.7" - resolved "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz" - integrity sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q== - dependencies: - follow-redirects "^1.15.6" - form-data "^4.0.0" - proxy-from-env "^1.1.0" - -axios@^1.7.9: - version "1.7.9" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.9.tgz#d7d071380c132a24accda1b2cfc1535b79ec650a" - integrity sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw== +axios@^1.3.6, axios@^1.7.9: + version "1.8.1" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.8.1.tgz#7c118d2146e9ebac512b7d1128771cdd738d11e3" + integrity sha512-NN+fvwH/kV01dYUQ3PTOZns4LWtWhOFCAhQ/pHb88WQ1hNe5V/dvFwc4VJcDL11LT9xSX0QtsR8sWUuyOuOq7g== dependencies: follow-redirects "^1.15.6" form-data "^4.0.0" @@ -2441,66 +2388,66 @@ axios@^1.7.9: balanced-match@^1.0.0: version "1.0.2" - resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== base-x@^3.0.2: version "3.0.10" - resolved "https://registry.npmjs.org/base-x/-/base-x-3.0.10.tgz" + resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.10.tgz#62de58653f8762b5d6f8d9fe30fa75f7b2585a75" integrity sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ== dependencies: safe-buffer "^5.0.1" base64-js@^1.3.1: version "1.5.1" - resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== basic-auth@^2.0.1: version "2.0.1" - resolved "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz" + resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-2.0.1.tgz#b998279bf47ce38344b4f3cf916d4679bbf51e3a" integrity sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg== dependencies: safe-buffer "5.1.2" bech32@1.1.4: version "1.1.4" - resolved "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz" + resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== bigint-crypto-utils@^3.0.23: version "3.3.0" - resolved "https://registry.npmjs.org/bigint-crypto-utils/-/bigint-crypto-utils-3.3.0.tgz" + resolved "https://registry.yarnpkg.com/bigint-crypto-utils/-/bigint-crypto-utils-3.3.0.tgz#72ad00ae91062cf07f2b1def9594006c279c1d77" integrity sha512-jOTSb+drvEDxEq6OuUybOAv/xxoh3cuYRUIPyu8sSHQNKM303UQ2R1DAo45o1AkcIXw6fzbaFI1+xGGdaXs2lg== binary-extensions@^2.0.0: version "2.3.0" - resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== blakejs@^1.1.0: version "1.2.1" - resolved "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz" + resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.2.1.tgz#5057e4206eadb4a97f7c0b6e197a505042fc3814" integrity sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ== bn.js@^4.11.0, bn.js@^4.11.8, bn.js@^4.11.9: - version "4.12.0" - resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz" - integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== + version "4.12.1" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.1.tgz#215741fe3c9dba2d7e12c001d0cfdbae43975ba7" + integrity sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg== bn.js@^5.2.0, bn.js@^5.2.1: version "5.2.1" - resolved "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== bowser@^2.11.0: version "2.11.0" - resolved "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz" + resolved "https://registry.yarnpkg.com/bowser/-/bowser-2.11.0.tgz#5ca3c35757a7aa5771500c70a73a9f91ef420a8f" integrity sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA== brace-expansion@^1.1.7: version "1.1.11" - resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== dependencies: balanced-match "^1.0.0" @@ -2508,26 +2455,26 @@ brace-expansion@^1.1.7: brace-expansion@^2.0.1: version "2.0.1" - resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== dependencies: balanced-match "^1.0.0" braces@~3.0.2: version "3.0.3" - resolved "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== dependencies: fill-range "^7.1.1" brorand@^1.1.0: version "1.1.0" - resolved "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== browser-level@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/browser-level/-/browser-level-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/browser-level/-/browser-level-1.0.1.tgz#36e8c3183d0fe1c405239792faaab5f315871011" integrity sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ== dependencies: abstract-level "^1.0.2" @@ -2537,12 +2484,12 @@ browser-level@^1.0.1: browser-stdout@^1.3.1: version "1.3.1" - resolved "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz" + resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== browserify-aes@^1.2.0: version "1.2.0" - resolved "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== dependencies: buffer-xor "^1.0.3" @@ -2554,14 +2501,14 @@ browserify-aes@^1.2.0: bs58@^4.0.0: version "4.0.1" - resolved "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz" + resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" integrity sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw== dependencies: base-x "^3.0.2" bs58check@^2.1.2: version "2.1.2" - resolved "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz" + resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-2.1.2.tgz#53b018291228d82a5aa08e7d796fdafda54aebfc" integrity sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA== dependencies: bs58 "^4.0.0" @@ -2570,17 +2517,17 @@ bs58check@^2.1.2: buffer-from@^1.0.0: version "1.1.2" - resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== buffer-xor@^1.0.3: version "1.0.3" - resolved "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== buffer@^6.0.3: version "6.0.3" - resolved "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== dependencies: base64-js "^1.3.1" @@ -2588,40 +2535,45 @@ buffer@^6.0.3: bytes@3.1.2: version "3.1.2" - resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== -call-bind@^1.0.7: - version "1.0.7" - resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz" - integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== +call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6" + integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== dependencies: - es-define-property "^1.0.0" es-errors "^1.3.0" function-bind "^1.1.2" - get-intrinsic "^1.2.4" - set-function-length "^1.2.1" + +call-bound@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.3.tgz#41cfd032b593e39176a71533ab4f384aa04fd681" + integrity sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA== + dependencies: + call-bind-apply-helpers "^1.0.1" + get-intrinsic "^1.2.6" camelcase@^6.0.0: version "6.3.0" - resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== catering@^2.1.0, catering@^2.1.1: version "2.1.1" - resolved "https://registry.npmjs.org/catering/-/catering-2.1.1.tgz" + resolved "https://registry.yarnpkg.com/catering/-/catering-2.1.1.tgz#66acba06ed5ee28d5286133982a927de9a04b510" integrity sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w== cbor@^8.1.0: version "8.1.0" - resolved "https://registry.npmjs.org/cbor/-/cbor-8.1.0.tgz" + resolved "https://registry.yarnpkg.com/cbor/-/cbor-8.1.0.tgz#cfc56437e770b73417a2ecbfc9caf6b771af60d5" integrity sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg== dependencies: nofilter "^3.1.0" chalk@^2.4.2: version "2.4.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== dependencies: ansi-styles "^3.2.1" @@ -2630,7 +2582,7 @@ chalk@^2.4.2: chalk@^4.1.0, chalk@^4.1.2: version "4.1.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== dependencies: ansi-styles "^4.1.0" @@ -2638,7 +2590,7 @@ chalk@^4.1.0, chalk@^4.1.2: chokidar@^3.4.0, chokidar@^3.5.2, chokidar@^3.5.3: version "3.6.0" - resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== dependencies: anymatch "~3.1.2" @@ -2653,20 +2605,20 @@ chokidar@^3.4.0, chokidar@^3.5.2, chokidar@^3.5.3: ci-info@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: - version "1.0.4" - resolved "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz" - integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== + version "1.0.6" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.6.tgz#8fe672437d01cd6c4561af5334e0cc50ff1955f7" + integrity sha512-3Ek9H3X6pj5TgenXYtNWdaBon1tgYCaebd+XPg0keyjEbEfkD4KkmAxkQ/i1vYvxdcT5nscLBfq9VJRmCBcFSw== dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" + inherits "^2.0.4" + safe-buffer "^5.2.1" classic-level@^1.2.0: version "1.4.1" - resolved "https://registry.npmjs.org/classic-level/-/classic-level-1.4.1.tgz" + resolved "https://registry.yarnpkg.com/classic-level/-/classic-level-1.4.1.tgz#169ecf9f9c6200ad42a98c8576af449c1badbaee" integrity sha512-qGx/KJl3bvtOHrGau2WklEZuXhS3zme+jf+fsu6Ej7W7IP/C49v7KNlWIsT1jZu0YnfzSIYDGcEWpCa1wKGWXQ== dependencies: abstract-level "^1.0.2" @@ -2677,12 +2629,12 @@ classic-level@^1.2.0: clean-stack@^2.0.0: version "2.2.0" - resolved "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== cliui@^7.0.2: version "7.0.4" - resolved "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== dependencies: string-width "^4.2.0" @@ -2691,7 +2643,7 @@ cliui@^7.0.2: cliui@^8.0.1: version "8.0.1" - resolved "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== dependencies: string-width "^4.2.0" @@ -2700,43 +2652,43 @@ cliui@^8.0.1: color-convert@^1.9.0: version "1.9.3" - resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== dependencies: color-name "1.1.3" color-convert@^2.0.1: version "2.0.1" - resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== dependencies: color-name "~1.1.4" color-name@1.1.3: version "1.1.3" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== color-name@~1.1.4: version "1.1.4" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== combined-stream@^1.0.8: version "1.0.8" - resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== dependencies: delayed-stream "~1.0.0" command-exists@^1.2.8: version "1.2.9" - resolved "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz" + resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.9.tgz#c50725af3808c8ab0260fd60b01fbfa25b954f69" integrity sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w== command-line-args@^5.1.1: version "5.2.1" - resolved "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz" + resolved "https://registry.yarnpkg.com/command-line-args/-/command-line-args-5.2.1.tgz#c44c32e437a57d7c51157696893c5909e9cec42e" integrity sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg== dependencies: array-back "^3.1.0" @@ -2746,7 +2698,7 @@ command-line-args@^5.1.1: command-line-usage@^6.1.0: version "6.1.3" - resolved "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.3.tgz" + resolved "https://registry.yarnpkg.com/command-line-usage/-/command-line-usage-6.1.3.tgz#428fa5acde6a838779dfa30e44686f4b6761d957" integrity sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw== dependencies: array-back "^4.0.2" @@ -2756,17 +2708,17 @@ command-line-usage@^6.1.0: commander@3.0.2: version "3.0.2" - resolved "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz" + resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.2.tgz#6837c3fb677ad9933d1cfba42dd14d5117d6b39e" integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow== concat-map@0.0.1: version "0.0.1" - resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== concat-stream@^1.4.7: version "1.6.2" - resolved "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== dependencies: buffer-from "^1.0.0" @@ -2776,27 +2728,27 @@ concat-stream@^1.4.7: cookie@^0.4.1: version "0.4.2" - resolved "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== core-util-is@~1.0.0: version "1.0.3" - resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== corser@^2.0.1: version "2.0.1" - resolved "https://registry.npmjs.org/corser/-/corser-2.0.1.tgz" + resolved "https://registry.yarnpkg.com/corser/-/corser-2.0.1.tgz#8eda252ecaab5840dcd975ceb90d9370c819ff87" integrity sha512-utCYNzRSQIZNPIcGZdQc92UVJYAhtGAteCFg0yRaFm8f0P+CPtyGyHXJcGXnffjCybUCEx3FQ2G7U3/o9eIkVQ== crc-32@^1.2.0: version "1.2.2" - resolved "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz" + resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.2.tgz#3cad35a934b8bf71f25ca524b6da51fb7eace2ff" integrity sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ== create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: version "1.2.0" - resolved "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== dependencies: cipher-base "^1.0.1" @@ -2807,7 +2759,7 @@ create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: create-hmac@^1.1.4, create-hmac@^1.1.7: version "1.1.7" - resolved "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== dependencies: cipher-base "^1.0.3" @@ -2819,66 +2771,50 @@ create-hmac@^1.1.4, create-hmac@^1.1.7: create-require@^1.1.0: version "1.1.1" - resolved "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== cross-spawn@^5.0.1: version "5.1.0" - resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" integrity sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A== dependencies: lru-cache "^4.0.1" shebang-command "^1.2.0" which "^1.2.9" -debug@4, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.5: - version "4.3.7" - resolved "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz" - integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== +debug@4, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@^4.3.5: + version "4.4.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a" + integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== dependencies: ms "^2.1.3" debug@^3.2.7: version "3.2.7" - resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== dependencies: ms "^2.1.1" -debug@^4.3.4: - version "4.4.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a" - integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== - dependencies: - ms "^2.1.3" - decamelize@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== deep-extend@~0.6.0: version "0.6.0" - resolved "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== -define-data-property@^1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz" - integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== - dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - gopd "^1.0.1" - delayed-stream@~1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== delete-empty@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/delete-empty/-/delete-empty-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/delete-empty/-/delete-empty-3.0.0.tgz#f8040f2669f26fa7060bc2304e9859c593b685e8" integrity sha512-ZUyiwo76W+DYnKsL3Kim6M/UOavPdBJgDYWOmuQhYaZvJH0AXAHbUNyEDtRbBra8wqqr686+63/0azfEk1ebUQ== dependencies: ansi-colors "^4.1.0" @@ -2888,32 +2824,41 @@ delete-empty@^3.0.0: depd@2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== diff@^4.0.1: version "4.0.2" - resolved "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== diff@^5.2.0: version "5.2.0" - resolved "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.2.0.tgz#26ded047cd1179b78b9537d5ef725503ce1ae531" integrity sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A== dotenv@^16.0.3: - version "16.4.5" - resolved "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz" - integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== + version "16.4.7" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.7.tgz#0e20c5b82950140aa99be360a8a5f52335f53c26" + integrity sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ== dottie@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/dottie/-/dottie-2.0.6.tgz#34564ebfc6ec5e5772272d466424ad5b696484d4" integrity sha512-iGCHkfUc5kFekGiqhe8B/mdaurD+lakO9txNnTvKtA6PISrw86LgqHvRzWYPyoE2Ph5aMIrCw9/uko6XHTKCwA== -elliptic@6.5.4, elliptic@^6.5.2, elliptic@^6.5.4: +dunder-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" + integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== + dependencies: + call-bind-apply-helpers "^1.0.1" + es-errors "^1.3.0" + gopd "^1.2.0" + +elliptic@6.5.4: version "6.5.4" - resolved "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== dependencies: bn.js "^4.11.9" @@ -2924,19 +2869,32 @@ elliptic@6.5.4, elliptic@^6.5.2, elliptic@^6.5.4: minimalistic-assert "^1.0.1" minimalistic-crypto-utils "^1.0.1" +elliptic@6.6.1, elliptic@^6.5.2, elliptic@^6.5.7: + version "6.6.1" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.6.1.tgz#3b8ffb02670bf69e382c7f65bf524c97c5405c06" + integrity sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g== + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + emoji-regex@^8.0.0: version "8.0.0" - resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== encode-utf8@^1.0.2: version "1.0.3" - resolved "https://registry.npmjs.org/encode-utf8/-/encode-utf8-1.0.3.tgz" + resolved "https://registry.yarnpkg.com/encode-utf8/-/encode-utf8-1.0.3.tgz#f30fdd31da07fb596f281beb2f6b027851994cda" integrity sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw== enquirer@^2.3.0, enquirer@^2.3.6: version "2.4.1" - resolved "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.4.1.tgz#93334b3fbd74fc7097b224ab4a8fb7e40bf4ae56" integrity sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ== dependencies: ansi-colors "^4.1.1" @@ -2944,39 +2902,54 @@ enquirer@^2.3.0, enquirer@^2.3.6: env-paths@^2.2.0: version "2.2.1" - resolved "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== -es-define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz" - integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== - dependencies: - get-intrinsic "^1.2.4" +es-define-property@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" + integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== es-errors@^1.3.0: version "1.3.0" - resolved "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== +es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1" + integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== + dependencies: + es-errors "^1.3.0" + +es-set-tostringtag@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz#f31dbbe0c183b00a6d26eb6325c810c0fd18bd4d" + integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA== + dependencies: + es-errors "^1.3.0" + get-intrinsic "^1.2.6" + has-tostringtag "^1.0.2" + hasown "^2.0.2" + escalade@^3.1.1: version "3.2.0" - resolved "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== escape-string-regexp@^1.0.5: version "1.0.5" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== escape-string-regexp@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== ethereum-cryptography@0.1.3, ethereum-cryptography@^0.1.3: version "0.1.3" - resolved "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz" + resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz#8d6143cfc3d74bf79bbd8edecdf29e4ae20dd191" integrity sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ== dependencies: "@types/pbkdf2" "^3.0.0" @@ -2997,7 +2970,7 @@ ethereum-cryptography@0.1.3, ethereum-cryptography@^0.1.3: ethereum-cryptography@^1.0.3: version "1.2.0" - resolved "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz" + resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz#5ccfa183e85fdaf9f9b299a79430c044268c9b3a" integrity sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw== dependencies: "@noble/hashes" "1.2.0" @@ -3007,7 +2980,7 @@ ethereum-cryptography@^1.0.3: ethereumjs-abi@^0.6.8: version "0.6.8" - resolved "https://registry.npmjs.org/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz" + resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz#71bc152db099f70e62f108b7cdfca1b362c6fcae" integrity sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA== dependencies: bn.js "^4.11.8" @@ -3015,7 +2988,7 @@ ethereumjs-abi@^0.6.8: ethereumjs-util@^6.0.0, ethereumjs-util@^6.2.1: version "6.2.1" - resolved "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz" + resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz#fcb4e4dd5ceacb9d2305426ab1a5cd93e3163b69" integrity sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw== dependencies: "@types/bn.js" "^4.11.3" @@ -3028,7 +3001,7 @@ ethereumjs-util@^6.0.0, ethereumjs-util@^6.2.1: ethers@5.6.6: version "5.6.6" - resolved "https://registry.npmjs.org/ethers/-/ethers-5.6.6.tgz" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.6.6.tgz#a37aa7e265a484a1b4d2ef91d4d89d6b43808a57" integrity sha512-2B2ZmSGvRcJpHnFMBk58mkXP50njFipUBCgLK8jUTFbomhVs501cLzyMU6+Vx8YnUDQxywC3qkZvd33xWS+2FA== dependencies: "@ethersproject/abi" "5.6.2" @@ -3063,44 +3036,44 @@ ethers@5.6.6: "@ethersproject/wordlists" "5.6.0" ethers@^5.5.3, ethers@^5.6.5: - version "5.7.2" - resolved "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz" - integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== - dependencies: - "@ethersproject/abi" "5.7.0" - "@ethersproject/abstract-provider" "5.7.0" - "@ethersproject/abstract-signer" "5.7.0" - "@ethersproject/address" "5.7.0" - "@ethersproject/base64" "5.7.0" - "@ethersproject/basex" "5.7.0" - "@ethersproject/bignumber" "5.7.0" - "@ethersproject/bytes" "5.7.0" - "@ethersproject/constants" "5.7.0" - "@ethersproject/contracts" "5.7.0" - "@ethersproject/hash" "5.7.0" - "@ethersproject/hdnode" "5.7.0" - "@ethersproject/json-wallets" "5.7.0" - "@ethersproject/keccak256" "5.7.0" - "@ethersproject/logger" "5.7.0" - "@ethersproject/networks" "5.7.1" - "@ethersproject/pbkdf2" "5.7.0" - "@ethersproject/properties" "5.7.0" - "@ethersproject/providers" "5.7.2" - "@ethersproject/random" "5.7.0" - "@ethersproject/rlp" "5.7.0" - "@ethersproject/sha2" "5.7.0" - "@ethersproject/signing-key" "5.7.0" - "@ethersproject/solidity" "5.7.0" - "@ethersproject/strings" "5.7.0" - "@ethersproject/transactions" "5.7.0" - "@ethersproject/units" "5.7.0" - "@ethersproject/wallet" "5.7.0" - "@ethersproject/web" "5.7.1" - "@ethersproject/wordlists" "5.7.0" + version "5.8.0" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.8.0.tgz#97858dc4d4c74afce83ea7562fe9493cedb4d377" + integrity sha512-DUq+7fHrCg1aPDFCHx6UIPb3nmt2XMpM7Y/g2gLhsl3lIBqeAfOJIl1qEvRf2uq3BiKxmh6Fh5pfp2ieyek7Kg== + dependencies: + "@ethersproject/abi" "5.8.0" + "@ethersproject/abstract-provider" "5.8.0" + "@ethersproject/abstract-signer" "5.8.0" + "@ethersproject/address" "5.8.0" + "@ethersproject/base64" "5.8.0" + "@ethersproject/basex" "5.8.0" + "@ethersproject/bignumber" "5.8.0" + "@ethersproject/bytes" "5.8.0" + "@ethersproject/constants" "5.8.0" + "@ethersproject/contracts" "5.8.0" + "@ethersproject/hash" "5.8.0" + "@ethersproject/hdnode" "5.8.0" + "@ethersproject/json-wallets" "5.8.0" + "@ethersproject/keccak256" "5.8.0" + "@ethersproject/logger" "5.8.0" + "@ethersproject/networks" "5.8.0" + "@ethersproject/pbkdf2" "5.8.0" + "@ethersproject/properties" "5.8.0" + "@ethersproject/providers" "5.8.0" + "@ethersproject/random" "5.8.0" + "@ethersproject/rlp" "5.8.0" + "@ethersproject/sha2" "5.8.0" + "@ethersproject/signing-key" "5.8.0" + "@ethersproject/solidity" "5.8.0" + "@ethersproject/strings" "5.8.0" + "@ethersproject/transactions" "5.8.0" + "@ethersproject/units" "5.8.0" + "@ethersproject/wallet" "5.8.0" + "@ethersproject/web" "5.8.0" + "@ethersproject/wordlists" "5.8.0" ethjs-util@0.1.6, ethjs-util@^0.1.6: version "0.1.6" - resolved "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz" + resolved "https://registry.yarnpkg.com/ethjs-util/-/ethjs-util-0.1.6.tgz#f308b62f185f9fe6237132fb2a9818866a5cd536" integrity sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w== dependencies: is-hex-prefixed "1.0.0" @@ -3108,17 +3081,17 @@ ethjs-util@0.1.6, ethjs-util@^0.1.6: event-target-shim@^5.0.0: version "5.0.1" - resolved "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz" + resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== eventemitter3@^4.0.0: version "4.0.7" - resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== evp_bytestokey@^1.0.3: version "1.0.3" - resolved "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== dependencies: md5.js "^1.3.4" @@ -3126,7 +3099,7 @@ evp_bytestokey@^1.0.3: fast-deep-equal@^3.1.3: version "3.1.3" - resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-redact@^3.1.1: @@ -3135,41 +3108,41 @@ fast-redact@^3.1.1: integrity sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A== fast-uri@^3.0.1: - version "3.0.2" - resolved "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.2.tgz" - integrity sha512-GR6f0hD7XXyNJa25Tb9BuIdN0tdr+0BMi6/CJPH3wJO1JjNG3n/VsSw38AwRdKZABm8lGbPfakLRkYzx2V9row== + version "3.0.6" + resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.6.tgz#88f130b77cfaea2378d56bf970dea21257a68748" + integrity sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw== fast-xml-parser@4.4.1: version "4.4.1" - resolved "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.4.1.tgz" + resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-4.4.1.tgz#86dbf3f18edf8739326447bcaac31b4ae7f6514f" integrity sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw== dependencies: strnum "^1.0.5" fill-range@^7.1.1: version "7.1.1" - resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== dependencies: to-regex-range "^5.0.1" find-replace@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/find-replace/-/find-replace-3.0.0.tgz#3e7e23d3b05167a76f770c9fbd5258b0def68c38" integrity sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ== dependencies: array-back "^3.0.1" find-up@^2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" integrity sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ== dependencies: locate-path "^2.0.0" find-up@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== dependencies: locate-path "^6.0.0" @@ -3177,43 +3150,49 @@ find-up@^5.0.0: flat@^5.0.2: version "5.0.2" - resolved "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== fmix@^0.1.0: version "0.1.0" - resolved "https://registry.npmjs.org/fmix/-/fmix-0.1.0.tgz" + resolved "https://registry.yarnpkg.com/fmix/-/fmix-0.1.0.tgz#c7bbf124dec42c9d191cfb947d0a9778dd986c0c" integrity sha512-Y6hyofImk9JdzU8k5INtTXX1cu8LDlePWDFU5sftm9H+zKCr5SGrVjdhkvsim646cw5zD0nADj8oHyXMZmCZ9w== dependencies: imul "^1.0.0" follow-redirects@^1.0.0, follow-redirects@^1.12.1, follow-redirects@^1.14.0, follow-redirects@^1.15.6: version "1.15.9" - resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1" integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== forge-std@^1.1.2: version "1.1.2" - resolved "https://registry.npmjs.org/forge-std/-/forge-std-1.1.2.tgz" + resolved "https://registry.yarnpkg.com/forge-std/-/forge-std-1.1.2.tgz#f4a0eda103538d56f9c563f3cd1fa2fd01bd9378" integrity sha512-Wfb0iAS9PcfjMKtGpWQw9mXzJxrWD62kJCUqqLcyuI0+VRtJ3j20XembjF3kS20qELYdXft1vD/SPFVWVKMFOw== form-data@^4.0.0: - version "4.0.1" - resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz" - integrity sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw== + version "4.0.2" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.2.tgz#35cabbdd30c3ce73deb2c42d3c8d3ed9ca51794c" + integrity sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w== dependencies: asynckit "^0.4.0" combined-stream "^1.0.8" + es-set-tostringtag "^2.1.0" mime-types "^2.1.12" -fp-ts@1.19.3, fp-ts@^1.0.0: +fp-ts@1.19.3: version "1.19.3" - resolved "https://registry.npmjs.org/fp-ts/-/fp-ts-1.19.3.tgz" + resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.3.tgz#261a60d1088fbff01f91256f91d21d0caaaaa96f" integrity sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg== +fp-ts@^1.0.0: + version "1.19.5" + resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.5.tgz#3da865e585dfa1fdfd51785417357ac50afc520a" + integrity sha512-wDNqTimnzs8QqpldiId9OavWK2NptormjXnRJTQecNjzwfyp6P/8s/zG8e4h3ja3oqkKaY72UlTjQYt/1yXf9A== + fs-extra@^0.30.0: version "0.30.0" - resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0" integrity sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA== dependencies: graceful-fs "^4.1.2" @@ -3224,7 +3203,7 @@ fs-extra@^0.30.0: fs-extra@^10.0.0: version "10.1.0" - resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== dependencies: graceful-fs "^4.2.0" @@ -3233,7 +3212,7 @@ fs-extra@^10.0.0: fs-extra@^7.0.0, fs-extra@^7.0.1: version "7.0.1" - resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== dependencies: graceful-fs "^4.1.2" @@ -3242,7 +3221,7 @@ fs-extra@^7.0.0, fs-extra@^7.0.1: fs-extra@^9.1.0: version "9.1.0" - resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== dependencies: at-least-node "^1.0.0" @@ -3252,50 +3231,63 @@ fs-extra@^9.1.0: fs.realpath@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== fsevents@~2.3.2: version "2.3.3" - resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== function-bind@^1.1.2: version "1.1.2" - resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== functional-red-black-tree@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== get-caller-file@^2.0.5: version "2.0.5" - resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-intrinsic@^1.1.3, get-intrinsic@^1.2.4: - version "1.2.4" - resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz" - integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== +get-intrinsic@^1.2.5, get-intrinsic@^1.2.6: + version "1.3.0" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" + integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== dependencies: + call-bind-apply-helpers "^1.0.2" + es-define-property "^1.0.1" es-errors "^1.3.0" + es-object-atoms "^1.1.1" function-bind "^1.1.2" - has-proto "^1.0.1" - has-symbols "^1.0.3" - hasown "^2.0.0" + get-proto "^1.0.1" + gopd "^1.2.0" + has-symbols "^1.1.0" + hasown "^2.0.2" + math-intrinsics "^1.1.0" + +get-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" + integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== + dependencies: + dunder-proto "^1.0.1" + es-object-atoms "^1.0.0" glob-parent@~5.1.2: version "5.1.2" - resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" glob@7.1.7: version "7.1.7" - resolved "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== dependencies: fs.realpath "^1.0.0" @@ -3305,9 +3297,9 @@ glob@7.1.7: once "^1.3.0" path-is-absolute "^1.0.0" -glob@7.2.0, glob@^7.1.3: +glob@7.2.0: version "7.2.0" - resolved "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== dependencies: fs.realpath "^1.0.0" @@ -3317,9 +3309,21 @@ glob@7.2.0, glob@^7.1.3: once "^1.3.0" path-is-absolute "^1.0.0" +glob@^7.1.3: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + glob@^8.1.0: version "8.1.0" - resolved "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz" + resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== dependencies: fs.realpath "^1.0.0" @@ -3328,12 +3332,10 @@ glob@^8.1.0: minimatch "^5.0.1" once "^1.3.0" -gopd@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz" - integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== - dependencies: - get-intrinsic "^1.1.3" +gopd@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" + integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0: version "4.2.11" @@ -3342,7 +3344,7 @@ graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0: hardhat-abi-exporter@2.10.1: version "2.10.1" - resolved "https://registry.npmjs.org/hardhat-abi-exporter/-/hardhat-abi-exporter-2.10.1.tgz" + resolved "https://registry.yarnpkg.com/hardhat-abi-exporter/-/hardhat-abi-exporter-2.10.1.tgz#b14884e233c73fe3f43360f014ad7fd6df4b6d25" integrity sha512-X8GRxUTtebMAd2k4fcPyVnCdPa6dYK4lBsrwzKP5yiSq4i+WadWPIumaLfce53TUf/o2TnLpLOduyO1ylE2NHQ== dependencies: "@ethersproject/abi" "^5.5.0" @@ -3350,12 +3352,12 @@ hardhat-abi-exporter@2.10.1: hardhat-change-network@^0.0.7: version "0.0.7" - resolved "https://registry.npmjs.org/hardhat-change-network/-/hardhat-change-network-0.0.7.tgz" + resolved "https://registry.yarnpkg.com/hardhat-change-network/-/hardhat-change-network-0.0.7.tgz#9f9b7943ff966515658b70bf5e44bc2f073af402" integrity sha512-Usp9fJan9SOJnOlVcv/jMJDchseE7bIDA5ZsBnracgVk4MiBwkvMqpmLWn5G1aDBvnUCthvS2gO3odfahgkV0Q== hardhat-deploy@0.11.20: version "0.11.20" - resolved "https://registry.npmjs.org/hardhat-deploy/-/hardhat-deploy-0.11.20.tgz" + resolved "https://registry.yarnpkg.com/hardhat-deploy/-/hardhat-deploy-0.11.20.tgz#d95499a0d29b75f1f1d3838c9a3eb6d2d0d20f57" integrity sha512-6G2aFLW0mfZxY0ljDf8rxzEJkVh57gr3Eia5H2DeBIQNJh0dhBV2Y5LDq4E4J9K4Crq0DjpxGNTshEtAB9eWxA== dependencies: "@types/qs" "^6.9.7" @@ -3374,14 +3376,14 @@ hardhat-deploy@0.11.20: hardhat-preprocessor@0.1.4: version "0.1.4" - resolved "https://registry.npmjs.org/hardhat-preprocessor/-/hardhat-preprocessor-0.1.4.tgz" + resolved "https://registry.yarnpkg.com/hardhat-preprocessor/-/hardhat-preprocessor-0.1.4.tgz#daa3004c3d2cca2ce1b5555c0c9b1940670fd022" integrity sha512-TeIi9y5xXf6oKa2BMqXAFQV0tAJRy9MKDElu0VrHMsEVpiUXRh47AEJqWkFpWr2lVLFweif40n1RGxGIEFOPXw== dependencies: murmur-128 "^0.2.1" hardhat@2.12.2: version "2.12.2" - resolved "https://registry.npmjs.org/hardhat/-/hardhat-2.12.2.tgz" + resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.12.2.tgz#6ae985007b20c1f381c6573799d66c1438c4c802" integrity sha512-f3ZhzXy1uyQv0UXnAQ8GCBOWjzv++WJNb7bnm10SsyC3dB7vlPpsMWBNhq7aoRxKrNhX9tCev81KFV3i5BTeMQ== dependencies: "@ethersproject/abi" "^5.1.2" @@ -3437,34 +3439,29 @@ hardhat@2.12.2: has-flag@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== has-flag@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-property-descriptors@^1.0.2: +has-symbols@^1.0.3, has-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" + integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== + +has-tostringtag@^1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz" - integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== dependencies: - es-define-property "^1.0.0" - -has-proto@^1.0.1: - version "1.0.3" - resolved "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz" - integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== - -has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + has-symbols "^1.0.3" hash-base@^3.0.0: version "3.1.0" - resolved "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== dependencies: inherits "^2.0.4" @@ -3473,27 +3470,27 @@ hash-base@^3.0.0: hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: version "1.1.7" - resolved "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== dependencies: inherits "^2.0.3" minimalistic-assert "^1.0.1" -hasown@^2.0.0: +hasown@^2.0.2: version "2.0.2" - resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== dependencies: function-bind "^1.1.2" he@^1.2.0: version "1.2.0" - resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== hmac-drbg@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== dependencies: hash.js "^1.0.3" @@ -3502,14 +3499,14 @@ hmac-drbg@^1.0.1: html-encoding-sniffer@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz#2cb1a8cf0db52414776e5b2a7a04d5dd98158de9" integrity sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA== dependencies: whatwg-encoding "^2.0.0" http-errors@2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== dependencies: depd "2.0.0" @@ -3520,7 +3517,7 @@ http-errors@2.0.0: http-proxy@^1.18.1: version "1.18.1" - resolved "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== dependencies: eventemitter3 "^4.0.0" @@ -3529,7 +3526,7 @@ http-proxy@^1.18.1: http-server@^14.1.1: version "14.1.1" - resolved "https://registry.npmjs.org/http-server/-/http-server-14.1.1.tgz" + resolved "https://registry.yarnpkg.com/http-server/-/http-server-14.1.1.tgz#d60fbb37d7c2fdff0f0fbff0d0ee6670bd285e2e" integrity sha512-+cbxadF40UXd9T01zUHgA+rlo2Bg1Srer4+B4NwIHdaGxAGGv59nYRnGGDJ9LBk7alpS0US+J+bLLdQOOkJq4A== dependencies: basic-auth "^2.0.1" @@ -3548,7 +3545,7 @@ http-server@^14.1.1: https-proxy-agent@^5.0.0: version "5.0.1" - resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== dependencies: agent-base "6" @@ -3556,36 +3553,36 @@ https-proxy-agent@^5.0.0: iconv-lite@0.4.24: version "0.4.24" - resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" iconv-lite@0.6.3: version "0.6.3" - resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== dependencies: safer-buffer ">= 2.1.2 < 3.0.0" ieee754@^1.2.1: version "1.2.1" - resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== immutable@^4.0.0-rc.12: version "4.3.7" - resolved "https://registry.npmjs.org/immutable/-/immutable-4.3.7.tgz" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.7.tgz#c70145fc90d89fb02021e65c84eb0226e4e5a381" integrity sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw== imul@^1.0.0: version "1.0.1" - resolved "https://registry.npmjs.org/imul/-/imul-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/imul/-/imul-1.0.1.tgz#9d5867161e8b3de96c2c38d5dc7cb102f35e2ac9" integrity sha512-WFAgfwPLAjU66EKt6vRdTlKj4nAgIDQzh29JonLa4Bqtl6D8JrIMvWjCnx7xEjVNmP3U0fM5o8ZObk7d0f62bA== indent-string@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== inflection@^1.13.4: @@ -3595,7 +3592,7 @@ inflection@^1.13.4: inflight@^1.0.4: version "1.0.6" - resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== dependencies: once "^1.3.0" @@ -3603,109 +3600,109 @@ inflight@^1.0.4: inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: version "2.0.4" - resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== io-ts@1.10.4: version "1.10.4" - resolved "https://registry.npmjs.org/io-ts/-/io-ts-1.10.4.tgz" + resolved "https://registry.yarnpkg.com/io-ts/-/io-ts-1.10.4.tgz#cd5401b138de88e4f920adbcb7026e2d1967e6e2" integrity sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g== dependencies: fp-ts "^1.0.0" is-binary-path@~2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== dependencies: binary-extensions "^2.0.0" is-buffer@^2.0.5: version "2.0.5" - resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== is-extglob@^2.1.1: version "2.1.1" - resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== is-fullwidth-code-point@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== is-glob@^4.0.1, is-glob@~4.0.1: version "4.0.3" - resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" is-hex-prefixed@1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz#7d8d37e6ad77e5d127148913c573e082d777f554" integrity sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA== is-number@^7.0.0: version "7.0.0" - resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== is-plain-obj@^2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== is-unicode-supported@^0.1.0: version "0.1.0" - resolved "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== isarray@~1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== isexe@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== js-sha3@0.8.0, js-sha3@^0.8.0: version "0.8.0" - resolved "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz" + resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== js-yaml@^4.1.0: version "4.1.0" - resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== dependencies: argparse "^2.0.1" json-schema-traverse@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== jsonfile@^2.1.0: version "2.4.0" - resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" integrity sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw== optionalDependencies: graceful-fs "^4.1.6" jsonfile@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== optionalDependencies: graceful-fs "^4.1.6" jsonfile@^6.0.1: version "6.1.0" - resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== dependencies: universalify "^2.0.0" @@ -3714,7 +3711,7 @@ jsonfile@^6.0.1: keccak@^3.0.0, keccak@^3.0.2: version "3.0.4" - resolved "https://registry.npmjs.org/keccak/-/keccak-3.0.4.tgz" + resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.4.tgz#edc09b89e633c0549da444432ecf062ffadee86d" integrity sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q== dependencies: node-addon-api "^2.0.0" @@ -3723,24 +3720,24 @@ keccak@^3.0.0, keccak@^3.0.2: klaw@^1.0.0: version "1.3.1" - resolved "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz" + resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" integrity sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw== optionalDependencies: graceful-fs "^4.1.9" kleur@^3.0.3: version "3.0.3" - resolved "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== level-supports@^4.0.0: version "4.0.1" - resolved "https://registry.npmjs.org/level-supports/-/level-supports-4.0.1.tgz" + resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-4.0.1.tgz#431546f9d81f10ff0fea0e74533a0e875c08c66a" integrity sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA== level-transcoder@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/level-transcoder/-/level-transcoder-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/level-transcoder/-/level-transcoder-1.0.1.tgz#f8cef5990c4f1283d4c86d949e73631b0bc8ba9c" integrity sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w== dependencies: buffer "^6.0.3" @@ -3748,7 +3745,7 @@ level-transcoder@^1.0.1: level@^8.0.0: version "8.0.1" - resolved "https://registry.npmjs.org/level/-/level-8.0.1.tgz" + resolved "https://registry.yarnpkg.com/level/-/level-8.0.1.tgz#737161db1bc317193aca4e7b6f436e7e1df64379" integrity sha512-oPBGkheysuw7DmzFQYyFe8NAia5jFLAgEnkgWnK3OXAuJr8qFT+xBQIwokAZPME2bhPFzS8hlYcL16m8UZrtwQ== dependencies: abstract-level "^1.0.4" @@ -3757,7 +3754,7 @@ level@^8.0.0: locate-path@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" integrity sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA== dependencies: p-locate "^2.0.0" @@ -3765,14 +3762,14 @@ locate-path@^2.0.0: locate-path@^6.0.0: version "6.0.0" - resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== dependencies: p-locate "^5.0.0" lodash.camelcase@^4.3.0: version "4.3.0" - resolved "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz" + resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== lodash.clonedeep@^4.5.0: @@ -3782,17 +3779,17 @@ lodash.clonedeep@^4.5.0: lodash.truncate@^4.4.2: version "4.4.2" - resolved "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz" + resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.21: version "4.17.21" - resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== log-symbols@^4.1.0: version "4.1.0" - resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== dependencies: chalk "^4.1.0" @@ -3800,7 +3797,7 @@ log-symbols@^4.1.0: lru-cache@^4.0.1: version "4.1.5" - resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== dependencies: pseudomap "^1.0.2" @@ -3808,34 +3805,39 @@ lru-cache@^4.0.1: lru-cache@^5.1.1: version "5.1.1" - resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== dependencies: yallist "^3.0.2" lru_map@^0.3.3: version "0.3.3" - resolved "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz" + resolved "https://registry.yarnpkg.com/lru_map/-/lru_map-0.3.3.tgz#b5c8351b9464cbd750335a79650a0ec0e56118dd" integrity sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ== make-error@^1.1.1: version "1.3.6" - resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== match-all@^1.2.6: - version "1.2.6" - resolved "https://registry.npmjs.org/match-all/-/match-all-1.2.6.tgz" - integrity sha512-0EESkXiTkWzrQQntBu2uzKvLu6vVkUGz40nGPbSZuegcfE5UuSzNjLaIu76zJWuaT/2I3Z/8M06OlUOZLGwLlQ== + version "1.2.7" + resolved "https://registry.yarnpkg.com/match-all/-/match-all-1.2.7.tgz#3c03b7f7ee372ae177aac5eca08c3ad6af59633a" + integrity sha512-qSpsBKarh55r9KyXzFC3xBLRf2GlGasba2em9kbpRsSlGvdTAqjx3QD0r3FKSARiW+OE4iMHYsolM3aX9n5djw== + +math-intrinsics@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" + integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== mcl-wasm@^0.7.1: version "0.7.9" - resolved "https://registry.npmjs.org/mcl-wasm/-/mcl-wasm-0.7.9.tgz" + resolved "https://registry.yarnpkg.com/mcl-wasm/-/mcl-wasm-0.7.9.tgz#c1588ce90042a8700c3b60e40efb339fc07ab87f" integrity sha512-iJIUcQWA88IJB/5L15GnJVnSQJmf/YaxxV6zRavv83HILHaJQb6y0iFyDMdDO0gN8X37tdxmAOrH/P8B6RB8sQ== md5.js@^1.3.4: version "1.3.5" - resolved "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== dependencies: hash-base "^3.0.0" @@ -3844,7 +3846,7 @@ md5.js@^1.3.4: memory-level@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/memory-level/-/memory-level-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/memory-level/-/memory-level-1.0.0.tgz#7323c3fd368f9af2f71c3cd76ba403a17ac41692" integrity sha512-UXzwewuWeHBz5krr7EvehKcmLFNoXxGcvuYhC41tRnkrTbJohtS7kVn9akmgirtRygg+f7Yjsfi8Uu5SGSQ4Og== dependencies: abstract-level "^1.0.0" @@ -3853,78 +3855,78 @@ memory-level@^1.0.0: memorystream@^0.3.1: version "0.3.1" - resolved "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz" + resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" integrity sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw== mime-db@1.52.0: version "1.52.0" - resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== mime-types@^2.1.12: version "2.1.35" - resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: mime-db "1.52.0" mime@^1.6.0: version "1.6.0" - resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== minimalistic-crypto-utils@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== -minimatch@^3.0.4: +minimatch@^3.0.4, minimatch@^3.1.1: version "3.1.2" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" minimatch@^5.0.1, minimatch@^5.1.6: version "5.1.6" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== dependencies: brace-expansion "^2.0.1" minimist@^1.2.0, minimist@^1.2.6: version "1.2.8" - resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== mkdirp@^0.5.6: version "0.5.6" - resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== dependencies: minimist "^1.2.6" mkdirp@^1.0.4: version "1.0.4" - resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== mnemonist@^0.38.0: version "0.38.5" - resolved "https://registry.npmjs.org/mnemonist/-/mnemonist-0.38.5.tgz" + resolved "https://registry.yarnpkg.com/mnemonist/-/mnemonist-0.38.5.tgz#4adc7f4200491237fe0fa689ac0b86539685cade" integrity sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg== dependencies: obliterator "^2.0.0" mocha@^10.0.0: - version "10.7.3" - resolved "https://registry.npmjs.org/mocha/-/mocha-10.7.3.tgz" - integrity sha512-uQWxAu44wwiACGqjbPYmjo7Lg8sFrS3dQe7PP2FQI+woptP4vZXSMcfMyFL/e1yFEeEpV4RtyTpZROOKmxis+A== + version "10.8.2" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.8.2.tgz#8d8342d016ed411b12a429eb731b825f961afb96" + integrity sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg== dependencies: ansi-colors "^4.1.3" browser-stdout "^1.3.1" @@ -3949,7 +3951,7 @@ mocha@^10.0.0: module-error@^1.0.1, module-error@^1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/module-error/-/module-error-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/module-error/-/module-error-1.0.2.tgz#8d1a48897ca883f47a45816d4fb3e3c6ba404d86" integrity sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA== moment-timezone@^0.5.43: @@ -3966,12 +3968,12 @@ moment@^2.29.4: ms@^2.1.1, ms@^2.1.3: version "2.1.3" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== murmur-128@^0.2.1: version "0.2.1" - resolved "https://registry.npmjs.org/murmur-128/-/murmur-128-0.2.1.tgz" + resolved "https://registry.yarnpkg.com/murmur-128/-/murmur-128-0.2.1.tgz#a9f6568781d2350ecb1bf80c14968cadbeaa4b4d" integrity sha512-WseEgiRkI6aMFBbj8Cg9yBj/y+OdipwVC7zUo3W2W1JAJITwouUOtpqsmGSg67EQmwwSyod7hsVsWY5LsrfQVg== dependencies: encode-utf8 "^1.0.2" @@ -3980,38 +3982,43 @@ murmur-128@^0.2.1: napi-macros@^2.2.2: version "2.2.2" - resolved "https://registry.npmjs.org/napi-macros/-/napi-macros-2.2.2.tgz" + resolved "https://registry.yarnpkg.com/napi-macros/-/napi-macros-2.2.2.tgz#817fef20c3e0e40a963fbf7b37d1600bd0201044" integrity sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g== node-addon-api@^2.0.0: version "2.0.2" - resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== +node-addon-api@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-5.1.0.tgz#49da1ca055e109a23d537e9de43c09cca21eb762" + integrity sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA== + node-gyp-build@^4.2.0, node-gyp-build@^4.3.0: - version "4.8.2" - resolved "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.2.tgz" - integrity sha512-IRUxE4BVsHWXkV/SFOut4qTlagw2aM8T5/vnTsmrHJvVoKueJHRc/JaFND7QDDc61kLYUJ6qlZM3sqTSyx2dTw== + version "4.8.4" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.4.tgz#8a70ee85464ae52327772a90d66c6077a900cfc8" + integrity sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ== nofilter@^3.1.0: version "3.1.0" - resolved "https://registry.npmjs.org/nofilter/-/nofilter-3.1.0.tgz" + resolved "https://registry.yarnpkg.com/nofilter/-/nofilter-3.1.0.tgz#c757ba68801d41ff930ba2ec55bab52ca184aa66" integrity sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g== normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== -object-inspect@^1.13.1: - version "1.13.2" - resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz" - integrity sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g== +object-inspect@^1.13.3: + version "1.13.4" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.4.tgz#8375265e21bc20d0fa582c22e1b13485d6e00213" + integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew== obliterator@^2.0.0: - version "2.0.4" - resolved "https://registry.npmjs.org/obliterator/-/obliterator-2.0.4.tgz" - integrity sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ== + version "2.0.5" + resolved "https://registry.yarnpkg.com/obliterator/-/obliterator-2.0.5.tgz#031e0145354b0c18840336ae51d41e7d6d2c76aa" + integrity sha512-42CPE9AhahZRsMNslczq0ctAEtqk8Eka26QofnqC346BZdHDySk3LWka23LI7ULIw11NmltpiLagIq8gBozxTw== on-exit-leak-free@^2.1.0: version "2.1.2" @@ -4020,94 +4027,94 @@ on-exit-leak-free@^2.1.0: once@^1.3.0: version "1.4.0" - resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" opener@^1.5.1: version "1.5.2" - resolved "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz" + resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== os-shim@^0.1.2: version "0.1.3" - resolved "https://registry.npmjs.org/os-shim/-/os-shim-0.1.3.tgz" + resolved "https://registry.yarnpkg.com/os-shim/-/os-shim-0.1.3.tgz#6b62c3791cf7909ea35ed46e17658bb417cb3917" integrity sha512-jd0cvB8qQ5uVt0lvCIexBaROw1KyKm5sbulg2fWOHjETisuCzWyt+eTZKEMs8v6HwzoGs8xik26jg7eCM6pS+A== os-tmpdir@~1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== p-limit@^1.1.0: version "1.3.0" - resolved "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== dependencies: p-try "^1.0.0" p-limit@^3.0.2: version "3.1.0" - resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== dependencies: yocto-queue "^0.1.0" p-locate@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" integrity sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg== dependencies: p-limit "^1.1.0" p-locate@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== dependencies: p-limit "^3.0.2" p-map@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== dependencies: aggregate-error "^3.0.0" p-try@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" integrity sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww== path-exists@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== path-exists@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== path-is-absolute@^1.0.0: version "1.0.1" - resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== path-parse@^1.0.6: version "1.0.7" - resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== path-starts-with@^2.0.0: version "2.0.1" - resolved "https://registry.npmjs.org/path-starts-with/-/path-starts-with-2.0.1.tgz" + resolved "https://registry.yarnpkg.com/path-starts-with/-/path-starts-with-2.0.1.tgz#cd8b6213c141a9f2dd86c748310acdfa6493abb1" integrity sha512-wZ3AeiRBRlNwkdUxvBANh0+esnt38DLffHDujZyRHkqkaKHTglnY2EP5UX3b8rdeiSutgO4y9NEJwXezNP5vHg== pbkdf2@^3.0.17: version "3.1.2" - resolved "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== dependencies: create-hash "^1.1.2" @@ -4128,7 +4135,7 @@ picocolors@^1.1.0: picomatch@^2.0.4, picomatch@^2.2.1: version "2.3.1" - resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== pino-abstract-transport@^2.0.0: @@ -4161,9 +4168,9 @@ pino@^9.6.0: thread-stream "^3.0.0" portfinder@^1.0.28: - version "1.0.32" - resolved "https://registry.npmjs.org/portfinder/-/portfinder-1.0.32.tgz" - integrity sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg== + version "1.0.33" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.33.tgz#03dbc51455aa8f83ad9fb86af8345e063bb51101" + integrity sha512-+2jndHT63cL5MdQOwDm9OT2dIe11zVpjV+0GGRXdtO1wpPxv260NfVqoEXtYAi/shanmm3W4+yLduIe55ektTw== dependencies: async "^2.6.4" debug "^3.2.7" @@ -4171,7 +4178,7 @@ portfinder@^1.0.28: pre-commit@^1.2.2: version "1.2.2" - resolved "https://registry.npmjs.org/pre-commit/-/pre-commit-1.2.2.tgz" + resolved "https://registry.yarnpkg.com/pre-commit/-/pre-commit-1.2.2.tgz#dbcee0ee9de7235e57f79c56d7ce94641a69eec6" integrity sha512-qokTiqxD6GjODy5ETAIgzsRgnBWWQHQH2ghy86PU7mIn/wuWeTwF3otyNQZxWBwVn8XNr8Tdzj/QfUXpH+gRZA== dependencies: cross-spawn "^5.0.1" @@ -4179,21 +4186,21 @@ pre-commit@^1.2.2: which "1.2.x" prettier-plugin-solidity@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/prettier-plugin-solidity/-/prettier-plugin-solidity-1.4.1.tgz#8060baf18853a9e34d2e09e47e87b4f19e15afe9" - integrity sha512-Mq8EtfacVZ/0+uDKTtHZGW3Aa7vEbX/BNx63hmVg6YTiTXSiuKP0amj0G6pGwjmLaOfymWh3QgXEZkjQbU8QRg== + version "1.4.2" + resolved "https://registry.yarnpkg.com/prettier-plugin-solidity/-/prettier-plugin-solidity-1.4.2.tgz#d4f6173674e73a29731a8c79c45ab6f5246310df" + integrity sha512-VVD/4XlDjSzyPWWCPW8JEleFa8JNKFYac5kNlMjVXemQyQZKfpekPMhFZSePuXB6L+RixlFvWe20iacGjFYrLw== dependencies: - "@solidity-parser/parser" "^0.18.0" - semver "^7.5.4" + "@solidity-parser/parser" "^0.19.0" + semver "^7.6.3" prettier@^2.3.1: version "2.8.8" - resolved "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== process-nextick-args@~2.0.0: version "2.0.1" - resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== process-warning@^4.0.0: @@ -4203,7 +4210,7 @@ process-warning@^4.0.0: prompts@^2.4.2: version "2.4.2" - resolved "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== dependencies: kleur "^3.0.3" @@ -4211,24 +4218,24 @@ prompts@^2.4.2: proxy-from-env@^1.1.0: version "1.1.0" - resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== pseudomap@^1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" integrity sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ== qs@^6.4.0, qs@^6.7.0, qs@^6.9.4: - version "6.13.0" - resolved "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz" - integrity sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg== + version "6.14.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.14.0.tgz#c63fa40680d2c5c941412a0e899c89af60c0a930" + integrity sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w== dependencies: - side-channel "^1.0.6" + side-channel "^1.1.0" queue-microtask@^1.2.2, queue-microtask@^1.2.3: version "1.2.3" - resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== quick-format-unescaped@^4.0.3: @@ -4238,14 +4245,14 @@ quick-format-unescaped@^4.0.3: randombytes@^2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== dependencies: safe-buffer "^5.1.0" raw-body@^2.4.1: version "2.5.2" - resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== dependencies: bytes "3.1.2" @@ -4255,7 +4262,7 @@ raw-body@^2.4.1: readable-stream@^2.2.2: version "2.3.8" - resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== dependencies: core-util-is "~1.0.0" @@ -4268,7 +4275,7 @@ readable-stream@^2.2.2: readable-stream@^3.6.0: version "3.6.2" - resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== dependencies: inherits "^2.0.3" @@ -4277,7 +4284,7 @@ readable-stream@^3.6.0: readdirp@~3.6.0: version "3.6.0" - resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== dependencies: picomatch "^2.2.1" @@ -4289,46 +4296,46 @@ real-require@^0.2.0: reduce-flatten@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/reduce-flatten/-/reduce-flatten-2.0.0.tgz#734fd84e65f375d7ca4465c69798c25c9d10ae27" integrity sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w== require-directory@^2.1.1: version "2.1.1" - resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== require-from-string@^2.0.0, require-from-string@^2.0.2: version "2.0.2" - resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== requires-port@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== resolve@1.17.0: version "1.17.0" - resolved "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== dependencies: path-parse "^1.0.6" retry-as-promised@^7.0.4: - version "7.0.4" - resolved "https://registry.yarnpkg.com/retry-as-promised/-/retry-as-promised-7.0.4.tgz#9df73adaeea08cb2948b9d34990549dc13d800a2" - integrity sha512-XgmCoxKWkDofwH8WddD0w85ZfqYz+ZHlr5yo+3YUCfycWawU56T5ckWXsScsj5B8tqUcIG67DxXByo3VUgiAdA== + version "7.1.1" + resolved "https://registry.yarnpkg.com/retry-as-promised/-/retry-as-promised-7.1.1.tgz#3626246f04c1941ff10cebcfa3df0577fd8ab2d7" + integrity sha512-hMD7odLOt3LkTjcif8aRZqi/hybjpLNgSk5oF5FCowfCjok6LukpN2bDX7R5wDmbgBQFn7YoBxSagmtXHaJYJw== rimraf@^2.2.8, rimraf@^2.6.2: version "2.7.1" - resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== dependencies: glob "^7.1.3" ripemd160@^2.0.0, ripemd160@^2.0.1: version "2.0.2" - resolved "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== dependencies: hash-base "^3.0.0" @@ -4343,24 +4350,24 @@ rlp@^2.2.3: run-parallel-limit@^1.1.0: version "1.1.0" - resolved "https://registry.npmjs.org/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz" + resolved "https://registry.yarnpkg.com/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz#be80e936f5768623a38a963262d6bef8ff11e7ba" integrity sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw== dependencies: queue-microtask "^1.2.2" rustbn.js@~0.2.0: version "0.2.0" - resolved "https://registry.npmjs.org/rustbn.js/-/rustbn.js-0.2.0.tgz" + resolved "https://registry.yarnpkg.com/rustbn.js/-/rustbn.js-0.2.0.tgz#8082cb886e707155fd1cb6f23bd591ab8d55d0ca" integrity sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA== safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@^5.2.1, safe-buffer@~5.2.0: version "5.2.1" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== safe-stable-stringify@^2.3.1: @@ -4370,42 +4377,42 @@ safe-stable-stringify@^2.3.1: "safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": version "2.1.2" - resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== scrypt-js@3.0.1, scrypt-js@^3.0.0: version "3.0.1" - resolved "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz" + resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== secp256k1@^4.0.1: - version "4.0.3" - resolved "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz" - integrity sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA== + version "4.0.4" + resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.4.tgz#58f0bfe1830fe777d9ca1ffc7574962a8189f8ab" + integrity sha512-6JfvwvjUOn8F/jUoBY2Q1v5WY5XS+rj8qSe0v8Y4ezH4InLgTEeOOPQsRll9OV429Pvo6BCHGavIyJfr3TAhsw== dependencies: - elliptic "^6.5.4" - node-addon-api "^2.0.0" + elliptic "^6.5.7" + node-addon-api "^5.0.0" node-gyp-build "^4.2.0" secure-compare@3.0.1: version "3.0.1" - resolved "https://registry.npmjs.org/secure-compare/-/secure-compare-3.0.1.tgz" + resolved "https://registry.yarnpkg.com/secure-compare/-/secure-compare-3.0.1.tgz#f1a0329b308b221fae37b9974f3d578d0ca999e3" integrity sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw== semver@^5.5.0: version "5.7.2" - resolved "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== semver@^6.3.0: version "6.3.1" - resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.5.4: - version "7.6.3" - resolved "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz" - integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== +semver@^7.5.4, semver@^7.6.3: + version "7.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.1.tgz#abd5098d82b18c6c81f6074ff2647fd3e7220c9f" + integrity sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA== sequelize-pool@^7.1.0: version "7.1.0" @@ -4436,36 +4443,24 @@ sequelize@^6.21.6: serialize-javascript@^6.0.2: version "6.0.2" - resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== dependencies: randombytes "^2.1.0" -set-function-length@^1.2.1: - version "1.2.2" - resolved "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz" - integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== - dependencies: - define-data-property "^1.1.4" - es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - gopd "^1.0.1" - has-property-descriptors "^1.0.2" - setimmediate@^1.0.5: version "1.0.5" - resolved "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== setprototypeof@1.2.0: version "1.2.0" - resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== sha.js@^2.4.0, sha.js@^2.4.8: version "2.4.11" - resolved "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== dependencies: inherits "^2.0.1" @@ -4473,34 +4468,64 @@ sha.js@^2.4.0, sha.js@^2.4.8: shebang-command@^1.2.0: version "1.2.0" - resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== dependencies: shebang-regex "^1.0.0" shebang-regex@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== -side-channel@^1.0.6: - version "1.0.6" - resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz" - integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== +side-channel-list@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/side-channel-list/-/side-channel-list-1.0.0.tgz#10cb5984263115d3b7a0e336591e290a830af8ad" + integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA== dependencies: - call-bind "^1.0.7" es-errors "^1.3.0" - get-intrinsic "^1.2.4" - object-inspect "^1.13.1" + object-inspect "^1.13.3" + +side-channel-map@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/side-channel-map/-/side-channel-map-1.0.1.tgz#d6bb6b37902c6fef5174e5f533fab4c732a26f42" + integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" + +side-channel-weakmap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz#11dda19d5368e40ce9ec2bdc1fb0ecbc0790ecea" + integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" + side-channel-map "^1.0.1" + +side-channel@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.0.tgz#c3fcff9c4da932784873335ec9765fa94ff66bc9" + integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== + dependencies: + es-errors "^1.3.0" + object-inspect "^1.13.3" + side-channel-list "^1.0.0" + side-channel-map "^1.0.1" + side-channel-weakmap "^1.0.2" sisteransi@^1.0.5: version "1.0.5" - resolved "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== slice-ansi@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== dependencies: ansi-styles "^4.0.0" @@ -4509,7 +4534,7 @@ slice-ansi@^4.0.0: solc@0.7.3: version "0.7.3" - resolved "https://registry.npmjs.org/solc/-/solc-0.7.3.tgz" + resolved "https://registry.yarnpkg.com/solc/-/solc-0.7.3.tgz#04646961bd867a744f63d2b4e3c0701ffdc7d78a" integrity sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA== dependencies: command-exists "^1.2.8" @@ -4531,7 +4556,7 @@ sonic-boom@^4.0.1: source-map-support@^0.5.13: version "0.5.21" - resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== dependencies: buffer-from "^1.0.0" @@ -4539,12 +4564,12 @@ source-map-support@^0.5.13: source-map@^0.6.0: version "0.6.1" - resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== spawn-sync@^1.0.15: version "1.0.15" - resolved "https://registry.npmjs.org/spawn-sync/-/spawn-sync-1.0.15.tgz" + resolved "https://registry.yarnpkg.com/spawn-sync/-/spawn-sync-1.0.15.tgz#b00799557eb7fb0c8376c29d44e8a1ea67e57476" integrity sha512-9DWBgrgYZzNghseho0JOuh+5fg9u6QWhAWa51QC7+U5rCheZ/j1DrEZnyE0RBBRqZ9uEXGPgSSM0nky6burpVw== dependencies: concat-stream "^1.4.7" @@ -4556,25 +4581,25 @@ split2@^4.0.0: integrity sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg== stacktrace-parser@^0.1.10: - version "0.1.10" - resolved "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz" - integrity sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg== + version "0.1.11" + resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.11.tgz#c7c08f9b29ef566b9a6f7b255d7db572f66fabc4" + integrity sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg== dependencies: type-fest "^0.7.1" statuses@2.0.1: version "2.0.1" - resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== string-format@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/string-format/-/string-format-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/string-format/-/string-format-2.0.0.tgz#f2df2e7097440d3b65de31b6d40d54c96eaffb9b" integrity sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA== string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" - resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: emoji-regex "^8.0.0" @@ -4583,66 +4608,66 @@ string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: string_decoder@^1.1.1: version "1.3.0" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== dependencies: safe-buffer "~5.2.0" string_decoder@~1.1.1: version "1.1.1" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== dependencies: safe-buffer "~5.1.0" strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: ansi-regex "^5.0.1" strip-hex-prefix@1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz#0c5f155fef1151373377de9dbb588da05500e36f" integrity sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A== dependencies: is-hex-prefixed "1.0.0" strip-json-comments@^3.1.1: version "3.1.1" - resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== strnum@^1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz" - integrity sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA== + version "1.1.2" + resolved "https://registry.yarnpkg.com/strnum/-/strnum-1.1.2.tgz#57bca4fbaa6f271081715dbc9ed7cee5493e28e4" + integrity sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA== supports-color@^5.3.0: version "5.5.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: has-flag "^3.0.0" supports-color@^7.1.0: version "7.2.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" supports-color@^8.1.1: version "8.1.1" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== dependencies: has-flag "^4.0.0" table-layout@^1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/table-layout/-/table-layout-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/table-layout/-/table-layout-1.0.2.tgz#c4038a1853b0136d63365a734b6931cf4fad4a04" integrity sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A== dependencies: array-back "^4.0.1" @@ -4651,9 +4676,9 @@ table-layout@^1.0.2: wordwrapjs "^4.0.0" table@^6.8.0: - version "6.8.2" - resolved "https://registry.npmjs.org/table/-/table-6.8.2.tgz" - integrity sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA== + version "6.9.0" + resolved "https://registry.yarnpkg.com/table/-/table-6.9.0.tgz#50040afa6264141c7566b3b81d4d82c47a8668f5" + integrity sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A== dependencies: ajv "^8.0.1" lodash.truncate "^4.4.2" @@ -4670,21 +4695,21 @@ thread-stream@^3.0.0: tmp@0.0.33: version "0.0.33" - resolved "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== dependencies: os-tmpdir "~1.0.2" to-regex-range@^5.0.1: version "5.0.1" - resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== dependencies: is-number "^7.0.0" toidentifier@1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== toposort-class@^1.0.1: @@ -4694,7 +4719,7 @@ toposort-class@^1.0.1: ts-command-line-args@^2.2.0: version "2.5.1" - resolved "https://registry.npmjs.org/ts-command-line-args/-/ts-command-line-args-2.5.1.tgz" + resolved "https://registry.yarnpkg.com/ts-command-line-args/-/ts-command-line-args-2.5.1.tgz#e64456b580d1d4f6d948824c274cf6fa5f45f7f0" integrity sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw== dependencies: chalk "^4.1.0" @@ -4704,12 +4729,12 @@ ts-command-line-args@^2.2.0: ts-essentials@^7.0.1: version "7.0.3" - resolved "https://registry.npmjs.org/ts-essentials/-/ts-essentials-7.0.3.tgz" + resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-7.0.3.tgz#686fd155a02133eedcc5362dc8b5056cde3e5a38" integrity sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ== ts-node@^10.7.0: version "10.9.2" - resolved "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== dependencies: "@cspotcode/source-map-support" "^0.8.0" @@ -4728,42 +4753,42 @@ ts-node@^10.7.0: tslib@^1.9.3: version "1.14.1" - resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== tslib@^2.6.2: - version "2.7.0" - resolved "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz" - integrity sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA== + version "2.8.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" + integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== tsort@0.0.1: version "0.0.1" - resolved "https://registry.npmjs.org/tsort/-/tsort-0.0.1.tgz" + resolved "https://registry.yarnpkg.com/tsort/-/tsort-0.0.1.tgz#e2280f5e817f8bf4275657fd0f9aebd44f5a2786" integrity sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw== tweetnacl-util@^0.15.1: version "0.15.1" - resolved "https://registry.npmjs.org/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz" + resolved "https://registry.yarnpkg.com/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz#b80fcdb5c97bcc508be18c44a4be50f022eea00b" integrity sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw== tweetnacl@^1.0.3: version "1.0.3" - resolved "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== type-fest@^0.21.3: version "0.21.3" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== type-fest@^0.7.1: version "0.7.1" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48" integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== typechain@^8.0.0: version "8.3.2" - resolved "https://registry.npmjs.org/typechain/-/typechain-8.3.2.tgz" + resolved "https://registry.yarnpkg.com/typechain/-/typechain-8.3.2.tgz#1090dd8d9c57b6ef2aed3640a516bdbf01b00d73" integrity sha512-x/sQYr5w9K7yv3es7jo4KTX05CLxOf7TRWwoHlrjRh8H82G64g+k7VuWPJlgMo6qrjfCulOdfBjiaDtmhFYD/Q== dependencies: "@types/prettier" "^2.1.1" @@ -4779,81 +4804,81 @@ typechain@^8.0.0: typedarray@^0.0.6: version "0.0.6" - resolved "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== typescript@^4.6.4: version "4.9.5" - resolved "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== typical@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/typical/-/typical-4.0.0.tgz#cbeaff3b9d7ae1e2bbfaf5a4e6f11eccfde94fc4" integrity sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw== typical@^5.2.0: version "5.2.0" - resolved "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz" + resolved "https://registry.yarnpkg.com/typical/-/typical-5.2.0.tgz#4daaac4f2b5315460804f0acf6cb69c52bb93066" integrity sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg== -undici-types@~6.19.2: - version "6.19.8" - resolved "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz" - integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== +undici-types@~6.20.0: + version "6.20.0" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.20.0.tgz#8171bf22c1f588d1554d55bf204bc624af388433" + integrity sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg== undici@^5.14.0, undici@^5.4.0: - version "5.28.4" - resolved "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz" - integrity sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g== + version "5.28.5" + resolved "https://registry.yarnpkg.com/undici/-/undici-5.28.5.tgz#b2b94b6bf8f1d919bc5a6f31f2c01deb02e54d4b" + integrity sha512-zICwjrDrcrUE0pyyJc1I2QzBkLM8FINsgOrt6WjA+BgajVq9Nxu2PbFFXUrAggLfDXlZGZBVZYw7WNV5KiBiBA== dependencies: "@fastify/busboy" "^2.0.0" union@~0.5.0: version "0.5.0" - resolved "https://registry.npmjs.org/union/-/union-0.5.0.tgz" + resolved "https://registry.yarnpkg.com/union/-/union-0.5.0.tgz#b2c11be84f60538537b846edb9ba266ba0090075" integrity sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA== dependencies: qs "^6.4.0" universalify@^0.1.0: version "0.1.2" - resolved "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== universalify@^2.0.0: version "2.0.1" - resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== unpipe@1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== url-join@^4.0.1: version "4.0.1" - resolved "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz" + resolved "https://registry.yarnpkg.com/url-join/-/url-join-4.0.1.tgz#b642e21a2646808ffa178c4c5fda39844e12cde7" integrity sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA== util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" - resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== uuid@^8.3.2: version "8.3.2" - resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== uuid@^9.0.1: version "9.0.1" - resolved "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== v8-compile-cache-lib@^3.0.1: version "3.0.1" - resolved "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz" + resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== validator@^13.9.0: @@ -4863,18 +4888,25 @@ validator@^13.9.0: whatwg-encoding@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz#e7635f597fd87020858626805a2729fa7698ac53" integrity sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg== dependencies: iconv-lite "0.6.3" -which@1.2.x, which@^1.2.9: +which@1.2.x: version "1.2.14" - resolved "https://registry.npmjs.org/which/-/which-1.2.14.tgz" + resolved "https://registry.yarnpkg.com/which/-/which-1.2.14.tgz#9a87c4378f03e827cecaf1acdf56c736c01c14e5" integrity sha512-16uPglFkRPzgiUXYMi1Jf8Z5EzN1iB4V0ZtMXcHZnwsBtQhhHeCqoWw7tsUY42hJGNDWtUsVLTjakIa5BgAxCw== dependencies: isexe "^2.0.0" +which@^1.2.9: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + wkx@^0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/wkx/-/wkx-0.5.0.tgz#c6c37019acf40e517cc6b94657a25a3d4aa33e8c" @@ -4884,7 +4916,7 @@ wkx@^0.5.0: wordwrapjs@^4.0.0: version "4.0.1" - resolved "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz" + resolved "https://registry.yarnpkg.com/wordwrapjs/-/wordwrapjs-4.0.1.tgz#d9790bccfb110a0fc7836b5ebce0937b37a8b98f" integrity sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA== dependencies: reduce-flatten "^2.0.0" @@ -4892,12 +4924,12 @@ wordwrapjs@^4.0.0: workerpool@^6.5.1: version "6.5.1" - resolved "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.5.1.tgz#060f73b39d0caf97c6db64da004cd01b4c099544" integrity sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA== wrap-ansi@^7.0.0: version "7.0.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== dependencies: ansi-styles "^4.0.0" @@ -4906,42 +4938,52 @@ wrap-ansi@^7.0.0: wrappy@1: version "1.0.2" - resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== -ws@7.4.6, ws@^7.4.6: +ws@7.4.6: version "7.4.6" - resolved "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== +ws@8.18.0: + version "8.18.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.0.tgz#0d7505a6eafe2b0e712d232b42279f53bc289bbc" + integrity sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw== + +ws@^7.4.6: + version "7.5.10" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9" + integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== + y18n@^5.0.5: version "5.0.8" - resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== yallist@^2.1.2: version "2.1.2" - resolved "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" integrity sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A== yallist@^3.0.2: version "3.1.1" - resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== yargs-parser@^20.2.2, yargs-parser@^20.2.9: version "20.2.9" - resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== yargs-parser@^21.1.1: version "21.1.1" - resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== yargs-unparser@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== dependencies: camelcase "^6.0.0" @@ -4951,7 +4993,7 @@ yargs-unparser@^2.0.0: yargs@^16.2.0: version "16.2.0" - resolved "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== dependencies: cliui "^7.0.2" @@ -4964,7 +5006,7 @@ yargs@^16.2.0: yargs@^17.7.1: version "17.7.2" - resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== dependencies: cliui "^8.0.1" @@ -4977,15 +5019,15 @@ yargs@^17.7.1: yn@3.1.1: version "3.1.1" - resolved "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== yocto-queue@^0.1.0: version "0.1.0" - resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== zksync-web3@^0.8.1: version "0.8.1" - resolved "https://registry.npmjs.org/zksync-web3/-/zksync-web3-0.8.1.tgz" + resolved "https://registry.yarnpkg.com/zksync-web3/-/zksync-web3-0.8.1.tgz#db289d8f6caf61f4d5ddc471fa3448d93208dc14" integrity sha512-1A4aHPQ3MyuGjpv5X/8pVEN+MdZqMjfVmiweQSRjOlklXYu65wT9BGEOtCmMs5d3gIvLp4ssfTeuR5OCKOD2kw== From e204a6ab66722a972d799cf363f65d94b2800808 Mon Sep 17 00:00:00 2001 From: Akash Date: Thu, 27 Feb 2025 15:01:52 +0400 Subject: [PATCH 164/186] feat: removed dlcore --- package.json | 1 - yarn.lock | 56 +--------------------------------------------------- 2 files changed, 1 insertion(+), 56 deletions(-) diff --git a/package.json b/package.json index 8a5b6b93..bf794bff 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,6 @@ "@aws-sdk/client-s3": "^3.670.0", "@nomicfoundation/hardhat-verify": "^2.0.12", "@nomiclabs/hardhat-ethers": "2.2.3", - "@socket.tech/dl-core": "^2.35.0", "@socket.tech/socket-protocol-common": "1.1.27", "@typechain/ethers-v5": "^10.0.0", "@typechain/hardhat": "6.0.0", diff --git a/yarn.lock b/yarn.lock index 95ff999d..c90b952e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2071,15 +2071,6 @@ "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@socket.tech/dl-core@^2.35.0": - version "2.40.0" - resolved "https://registry.yarnpkg.com/@socket.tech/dl-core/-/dl-core-2.40.0.tgz#57452b070feac7a412098cc5317fa72dad1e7020" - integrity sha512-c5CKN8ec5IwfVYUgJNbOAeefz7tv1u7b6Sz/o35usvn4AxRV3Tw4rgXAJS7tPEXYCq6jmhj2oD5CRUKJ65Dr2A== - dependencies: - axios "^1.3.6" - prompts "^2.4.2" - yargs "^17.7.1" - "@socket.tech/socket-protocol-common@1.1.27": version "1.1.27" resolved "https://registry.yarnpkg.com/@socket.tech/socket-protocol-common/-/socket-protocol-common-1.1.27.tgz#62f1ecee76f9496e98095545a05a03b93bcb3423" @@ -2377,7 +2368,7 @@ axios@^0.21.1: dependencies: follow-redirects "^1.14.0" -axios@^1.3.6, axios@^1.7.9: +axios@^1.7.9: version "1.8.1" resolved "https://registry.yarnpkg.com/axios/-/axios-1.8.1.tgz#7c118d2146e9ebac512b7d1128771cdd738d11e3" integrity sha512-NN+fvwH/kV01dYUQ3PTOZns4LWtWhOFCAhQ/pHb88WQ1hNe5V/dvFwc4VJcDL11LT9xSX0QtsR8sWUuyOuOq7g== @@ -2641,15 +2632,6 @@ cliui@^7.0.2: strip-ansi "^6.0.0" wrap-ansi "^7.0.0" -cliui@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" - integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.1" - wrap-ansi "^7.0.0" - color-convert@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" @@ -3725,11 +3707,6 @@ klaw@^1.0.0: optionalDependencies: graceful-fs "^4.1.9" -kleur@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" - integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== - level-supports@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-4.0.1.tgz#431546f9d81f10ff0fea0e74533a0e875c08c66a" @@ -4208,14 +4185,6 @@ process-warning@^4.0.0: resolved "https://registry.yarnpkg.com/process-warning/-/process-warning-4.0.1.tgz#5c1db66007c67c756e4e09eb170cdece15da32fb" integrity sha512-3c2LzQ3rY9d0hc1emcsHhfT9Jwz0cChib/QN89oME2R451w5fy3f0afAhERFZAwrbDU43wk12d0ORBpDVME50Q== -prompts@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" - integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== - dependencies: - kleur "^3.0.3" - sisteransi "^1.0.5" - proxy-from-env@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" @@ -4518,11 +4487,6 @@ side-channel@^1.1.0: side-channel-map "^1.0.1" side-channel-weakmap "^1.0.2" -sisteransi@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" - integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== - slice-ansi@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" @@ -4976,11 +4940,6 @@ yargs-parser@^20.2.2, yargs-parser@^20.2.9: resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== -yargs-parser@^21.1.1: - version "21.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" - integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== - yargs-unparser@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" @@ -5004,19 +4963,6 @@ yargs@^16.2.0: y18n "^5.0.5" yargs-parser "^20.2.2" -yargs@^17.7.1: - version "17.7.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" - integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== - dependencies: - cliui "^8.0.1" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.3" - y18n "^5.0.5" - yargs-parser "^21.1.1" - yn@3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" From 21cbc1ff7617612e37944ecbbb2b7b3cb6c2bcb4 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Thu, 27 Feb 2025 15:30:21 +0400 Subject: [PATCH 165/186] fix: lint --- Errors.md | 229 ++++++++++---------- deployments/dev_verification.json | 12 +- deployments/prod_addresses.json | 2 +- deployments/prod_verification.json | 2 +- hardhat-scripts/constants/roles.ts | 2 - hardhat-scripts/constants/types.ts | 9 +- hardhat-scripts/deploy/1.deploy.ts | 22 +- hardhat-scripts/deploy/2.roles.ts | 14 +- hardhat-scripts/deploy/3.upgradeManagers.ts | 6 +- hardhat-scripts/deploy/4.connect.ts | 25 ++- hardhat-scripts/deploy/5.upload.ts | 15 +- hardhat-scripts/utils/address.ts | 2 - hardhat-scripts/utils/deployUtils.ts | 2 +- hardhat-scripts/utils/networks.ts | 2 +- hardhat-scripts/utils/sign.ts | 31 ++- hardhat-scripts/verify/verify.ts | 6 +- 16 files changed, 195 insertions(+), 186 deletions(-) diff --git a/Errors.md b/Errors.md index 2100d8eb..fe4496c6 100644 --- a/Errors.md +++ b/Errors.md @@ -1,207 +1,206 @@ # Custom Error Codes - ## apps/super-token-lockable/LimitHook.sol -| Error | Signature | -|-------|-----------| +| Error | Signature | +| --------------------- | ------------ | | `BurnLimitExceeded()` | `0x85e72fd4` | | `MintLimitExceeded()` | `0xb643bfa6` | ## apps/super-token-lockable/SuperTokenLockable.sol -| Error | Signature | -|-------|-----------| -| `InsufficientBalance()` | `0xf4d678b8` | +| Error | Signature | +| ---------------------------- | ------------ | +| `InsufficientBalance()` | `0xf4d678b8` | | `InsufficientLockedTokens()` | `0x4f6d2a3e` | ## base/PlugBase.sol -| Error | Signature | -|-------|-----------| +| Error | Signature | +| ---------------------------- | ------------ | | `SocketAlreadyInitialized()` | `0xc9500b00` | ## mock/MockSocket.sol -| Error | Signature | -|-------|-----------| +| Error | Signature | +| -------------------------- | ------------ | | `PayloadAlreadyExecuted()` | `0xe17bd578` | -| `VerificationFailed()` | `0x439cc0cd` | -| `LowGasLimit()` | `0xd38edae0` | -| `InvalidSlug()` | `0x290a8315` | +| `VerificationFailed()` | `0x439cc0cd` | +| `LowGasLimit()` | `0xd38edae0` | +| `InvalidSlug()` | `0x290a8315` | ## mock/MockWatcherPrecompile.sol -| Error | Signature | -|-------|-----------| -| `InvalidChainSlug()` | `0xbff6b106` | +| Error | Signature | +| ---------------------- | ------------ | +| `InvalidChainSlug()` | `0xbff6b106` | | `InvalidTransmitter()` | `0x58a70a0a` | ## protocol/AddressResolver.sol -| Error | Signature | -|-------|-----------| +| Error | Signature | +| ---------------------------- | ------------ | | `InvalidAppGateway(address)` | `0x0e66940d` | ## protocol/AsyncPromise.sol -| Error | Signature | -|-------|-----------| -| `PromiseAlreadyResolved()` | `0x56b63537` | +| Error | Signature | +| ------------------------------- | ------------ | +| `PromiseAlreadyResolved()` | `0x56b63537` | | `OnlyForwarderOrLocalInvoker()` | `0xa9fb0b28` | -| `PromiseAlreadySetUp()` | `0x927c53d5` | -| `PromiseRevertFailed()` | `0x0175b9de` | +| `PromiseAlreadySetUp()` | `0x927c53d5` | +| `PromiseRevertFailed()` | `0x0175b9de` | ## protocol/payload-delivery/ContractFactoryPlug.sol -| Error | Signature | -|-------|-----------| -| `DeploymentFailed()` | `0x30116425` | -| `ExecutionFailed()` | `0xacfdb444` | +| Error | Signature | +| ------------------------- | ------------ | +| `DeploymentFailed()` | `0x30116425` | +| `ExecutionFailed()` | `0xacfdb444` | | `information(bool,bytes)` | `0x1a5c6d63` | ## protocol/payload-delivery/FeesPlug.sol -| Error | Signature | -|-------|-----------| -| `FeesAlreadyPaid()` | `0xd3b1ad69` | +| Error | Signature | +| ----------------------------------- | ------------ | +| `FeesAlreadyPaid()` | `0xd3b1ad69` | | `InsufficientTokenBalance(address)` | `0x642faafa` | -| `InvalidDepositAmount()` | `0xfe9ba5cd` | -| `TokenNotWhitelisted(address)` | `0xea3bff2e` | +| `InvalidDepositAmount()` | `0xfe9ba5cd` | +| `TokenNotWhitelisted(address)` | `0xea3bff2e` | ## protocol/payload-delivery/app-gateway/AuctionManager.sol -| Error | Signature | -|-------|-----------| -| `AuctionClosed()` | `0x36b6b46d` | +| Error | Signature | +| ------------------------- | ------------ | +| `AuctionClosed()` | `0x36b6b46d` | | `AuctionAlreadyStarted()` | `0x628e3883` | -| `BidExceedsMaxFees()` | `0x4c923f3c` | -| `InvalidTransmitter()` | `0x58a70a0a` | +| `BidExceedsMaxFees()` | `0x4c923f3c` | +| `InvalidTransmitter()` | `0x58a70a0a` | | `LowerBidAlreadyExists()` | `0xaaa1f709` | ## protocol/payload-delivery/app-gateway/BatchAsync.sol -| Error | Signature | -|-------|-----------| +| Error | Signature | +| ----------------------- | ------------ | | `AllPayloadsExecuted()` | `0x6bc43bfe` | -| `NotFromForwarder()` | `0xe83aa6bd` | -| `CallFailed(bytes32)` | `0xe22e3683` | -| `PayloadTooLarge()` | `0x492f620d` | -| `OnlyAppGateway()` | `0xfec944ea` | -| `WinningBidExists()` | `0xe8733654` | -| `InsufficientFees()` | `0x8d53e553` | +| `NotFromForwarder()` | `0xe83aa6bd` | +| `CallFailed(bytes32)` | `0xe22e3683` | +| `PayloadTooLarge()` | `0x492f620d` | +| `OnlyAppGateway()` | `0xfec944ea` | +| `WinningBidExists()` | `0xe8733654` | +| `InsufficientFees()` | `0x8d53e553` | ## protocol/payload-delivery/app-gateway/FeesManager.sol -| Error | Signature | -|-------|-----------| +| Error | Signature | +| ----------------------------- | ------------ | | `InsufficientFeesAvailable()` | `0x51488f54` | -| `NoFeesForTransmitter()` | `0x248bac55` | -| `NoFeesBlocked()` | `0x116d68f9` | -| `InvalidWatcherSignature()` | `0x5029f14f` | -| `NonceUsed()` | `0x1f6d5aef` | +| `NoFeesForTransmitter()` | `0x248bac55` | +| `NoFeesBlocked()` | `0x116d68f9` | +| `InvalidWatcherSignature()` | `0x5029f14f` | +| `NonceUsed()` | `0x1f6d5aef` | ## protocol/socket/Socket.sol -| Error | Signature | -|-------|-----------| +| Error | Signature | +| ----------------------------------------- | ------------ | | `PayloadAlreadyExecuted(ExecutionStatus)` | `0xf4c54edd` | -| `VerificationFailed()` | `0x439cc0cd` | -| `LowGasLimit()` | `0xd38edae0` | -| `InvalidSlug()` | `0x290a8315` | -| `DeadlinePassed()` | `0x70f65caa` | +| `VerificationFailed()` | `0x439cc0cd` | +| `LowGasLimit()` | `0xd38edae0` | +| `InvalidSlug()` | `0x290a8315` | +| `DeadlinePassed()` | `0x70f65caa` | ## protocol/socket/SocketConfig.sol -| Error | Signature | -|-------|-----------| -| `SwitchboardExists()` | `0x2dff8555` | -| `InvalidConnection()` | `0x63228f29` | -| `InvalidSwitchboard()` | `0xf63c9e4d` | +| Error | Signature | +| ------------------------------- | ------------ | +| `SwitchboardExists()` | `0x2dff8555` | +| `InvalidConnection()` | `0x63228f29` | +| `InvalidSwitchboard()` | `0xf63c9e4d` | | `SwitchboardExistsOrDisabled()` | `0x1c7d2487` | ## protocol/socket/SocketUtils.sol -| Error | Signature | -|-------|-----------| +| Error | Signature | +| ---------------------- | ------------ | | `InvalidTransmitter()` | `0x58a70a0a` | ## protocol/socket/switchboard/FastSwitchboard.sol -| Error | Signature | -|-------|-----------| +| Error | Signature | +| ------------------- | ------------ | | `AlreadyAttested()` | `0x35d90805` | | `WatcherNotFound()` | `0xa278e4ad` | ## protocol/socket/switchboard/SwitchboardBase.sol -| Error | Signature | -|-------|-----------| +| Error | Signature | +| ---------------- | ------------ | | `InvalidNonce()` | `0x756688fe` | ## protocol/utils/AccessControl.sol -| Error | Signature | -|-------|-----------| +| Error | Signature | +| ------------------- | ------------ | | `NoPermit(bytes32)` | `0x962f6333` | ## protocol/utils/AddressResolverUtil.sol -| Error | Signature | -|-------|-----------| -| `OnlyPayloadDelivery()` | `0x7ccc3a43` | +| Error | Signature | +| ------------------------- | ------------ | +| `OnlyPayloadDelivery()` | `0x7ccc3a43` | | `OnlyWatcherPrecompile()` | `0x663a892a` | ## protocol/utils/common/Errors.sol -| Error | Signature | -|-------|-----------| -| `NotAuthorized()` | `0xea8e4eb5` | -| `NotBridge()` | `0x7fea9dc5` | -| `NotSocket()` | `0xc59f8f7c` | -| `ConnectorUnavailable()` | `0xb1efb84a` | -| `InvalidTokenContract()` | `0x29bdfb34` | -| `ZeroAddressReceiver()` | `0x96bbcf1e` | -| `ZeroAddress()` | `0xd92e233d` | -| `ZeroAmount()` | `0x1f2a2005` | -| `InsufficientFunds()` | `0x356680b7` | -| `InvalidSigner()` | `0x815e1d64` | -| `InvalidFunction()` | `0xdb2079c3` | -| `TimeoutDelayTooLarge()` | `0xc10bfe64` | -| `TimeoutAlreadyResolved()` | `0x7dc8be06` | +| Error | Signature | +| ---------------------------- | ------------ | +| `NotAuthorized()` | `0xea8e4eb5` | +| `NotBridge()` | `0x7fea9dc5` | +| `NotSocket()` | `0xc59f8f7c` | +| `ConnectorUnavailable()` | `0xb1efb84a` | +| `InvalidTokenContract()` | `0x29bdfb34` | +| `ZeroAddressReceiver()` | `0x96bbcf1e` | +| `ZeroAddress()` | `0xd92e233d` | +| `ZeroAmount()` | `0x1f2a2005` | +| `InsufficientFunds()` | `0x356680b7` | +| `InvalidSigner()` | `0x815e1d64` | +| `InvalidFunction()` | `0xdb2079c3` | +| `TimeoutDelayTooLarge()` | `0xc10bfe64` | +| `TimeoutAlreadyResolved()` | `0x7dc8be06` | | `ResolvingTimeoutTooEarly()` | `0x28fd4c50` | -| `LimitReached()` | `0x3dd19101` | -| `FeesAlreadyPaid()` | `0xd3b1ad69` | -| `NotAuctionManager()` | `0x87944c26` | -| `CallFailed()` | `0x3204506f` | -| `PlugDisconnected()` | `0xe741bafb` | -| `InvalidAppGateway()` | `0x82ded261` | -| `AppGatewayAlreadyCalled()` | `0xb224683f` | -| `InvalidInboxCaller()` | `0x4f1aa61e` | -| `PromisesNotResolved()` | `0xb91dbe7d` | -| `InvalidPromise()` | `0x45f2d176` | -| `InvalidIndex()` | `0x63df8171` | -| `InvalidTransmitter()` | `0x58a70a0a` | -| `FeesNotSet()` | `0x2a831034` | -| `InvalidTokenAddress()` | `0x1eb00b06` | -| `InvalidWatcherSignature()` | `0x5029f14f` | -| `NonceUsed()` | `0x1f6d5aef` | +| `LimitReached()` | `0x3dd19101` | +| `FeesAlreadyPaid()` | `0xd3b1ad69` | +| `NotAuctionManager()` | `0x87944c26` | +| `CallFailed()` | `0x3204506f` | +| `PlugDisconnected()` | `0xe741bafb` | +| `InvalidAppGateway()` | `0x82ded261` | +| `AppGatewayAlreadyCalled()` | `0xb224683f` | +| `InvalidInboxCaller()` | `0x4f1aa61e` | +| `PromisesNotResolved()` | `0xb91dbe7d` | +| `InvalidPromise()` | `0x45f2d176` | +| `InvalidIndex()` | `0x63df8171` | +| `InvalidTransmitter()` | `0x58a70a0a` | +| `FeesNotSet()` | `0x2a831034` | +| `InvalidTokenAddress()` | `0x1eb00b06` | +| `InvalidWatcherSignature()` | `0x5029f14f` | +| `NonceUsed()` | `0x1f6d5aef` | ## protocol/watcherPrecompile/WatcherPrecompile.sol -| Error | Signature | -|-------|-----------| -| `InvalidChainSlug()` | `0xbff6b106` | -| `InvalidConnection()` | `0x63228f29` | -| `InvalidTransmitter()` | `0x58a70a0a` | +| Error | Signature | +| ------------------------- | ------------ | +| `InvalidChainSlug()` | `0xbff6b106` | +| `InvalidConnection()` | `0x63228f29` | +| `InvalidTransmitter()` | `0x58a70a0a` | | `InvalidTimeoutRequest()` | `0x600ca372` | -| `InvalidPayloadId()` | `0xfa0b8c86` | -| `InvalidCaller()` | `0x48f5c3ed` | +| `InvalidPayloadId()` | `0xfa0b8c86` | +| `InvalidCaller()` | `0x48f5c3ed` | ## protocol/watcherPrecompile/WatcherPrecompileLimits.sol -| Error | Signature | -|-------|-----------| -| `ActionNotSupported(address,bytes32)` | `0xa219158f` | -| `NotDeliveryHelper()` | `0x29029c67` | +| Error | Signature | +| ------------------------------------------------ | ------------ | +| `ActionNotSupported(address,bytes32)` | `0xa219158f` | +| `NotDeliveryHelper()` | `0x29029c67` | | `LimitExceeded(address,bytes32,uint256,uint256)` | `0x80bb2621` | diff --git a/deployments/dev_verification.json b/deployments/dev_verification.json index e9eca4a3..93eca439 100644 --- a/deployments/dev_verification.json +++ b/deployments/dev_verification.json @@ -41,11 +41,7 @@ "0x6c40Fb39B03e32EC4D23e31DdE6D10283F2C7b4F", "Socket", "contracts/protocol/socket/Socket.sol", - [ - 84532, - "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18", - "EVMX" - ] + [84532, "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18", "EVMX"] ] ], "421614": [ @@ -217,11 +213,7 @@ "0x79Ac996De9333956f4980397ED5Bd91f77f10b01", "Socket", "contracts/protocol/socket/Socket.sol", - [ - 11155420, - "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18", - "EVMX" - ] + [11155420, "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18", "EVMX"] ] ] } diff --git a/deployments/prod_addresses.json b/deployments/prod_addresses.json index 9e26dfee..0967ef42 100644 --- a/deployments/prod_addresses.json +++ b/deployments/prod_addresses.json @@ -1 +1 @@ -{} \ No newline at end of file +{} diff --git a/deployments/prod_verification.json b/deployments/prod_verification.json index 9e26dfee..0967ef42 100644 --- a/deployments/prod_verification.json +++ b/deployments/prod_verification.json @@ -1 +1 @@ -{} \ No newline at end of file +{} diff --git a/hardhat-scripts/constants/roles.ts b/hardhat-scripts/constants/roles.ts index 97188a39..5faeb8c1 100644 --- a/hardhat-scripts/constants/roles.ts +++ b/hardhat-scripts/constants/roles.ts @@ -1,5 +1,3 @@ - - export enum ROLES { RESCUE_ROLE = "RESCUE_ROLE", WITHDRAW_ROLE = "WITHDRAW_ROLE", diff --git a/hardhat-scripts/constants/types.ts b/hardhat-scripts/constants/types.ts index 2f014a9b..97603b2c 100644 --- a/hardhat-scripts/constants/types.ts +++ b/hardhat-scripts/constants/types.ts @@ -1,5 +1,8 @@ -import { ChainAddressesObj, ChainSlug } from "@socket.tech/socket-protocol-common"; +import { + ChainAddressesObj, + ChainSlug, +} from "@socket.tech/socket-protocol-common"; export type DeploymentAddresses = { - [chainSlug in ChainSlug]?: ChainAddressesObj; -}; \ No newline at end of file + [chainSlug in ChainSlug]?: ChainAddressesObj; +}; diff --git a/hardhat-scripts/deploy/1.deploy.ts b/hardhat-scripts/deploy/1.deploy.ts index 3b2eaf77..edef7ede 100644 --- a/hardhat-scripts/deploy/1.deploy.ts +++ b/hardhat-scripts/deploy/1.deploy.ts @@ -1,7 +1,7 @@ import { ChainSlug, DeploymentMode, - ChainAddressesObj + ChainAddressesObj, } from "@socket.tech/socket-protocol-common"; import { config } from "dotenv"; import { Contract, Signer, Wallet, providers } from "ethers"; @@ -13,7 +13,11 @@ import { mode, logConfig, } from "../config/config"; -import { CORE_CONTRACTS, DeploymentAddresses, EVMxCoreContracts } from "../constants"; +import { + CORE_CONTRACTS, + DeploymentAddresses, + EVMxCoreContracts, +} from "../constants"; import { getImplementationAddress } from "../migration/migrate-proxies"; import { DeployParams, @@ -160,9 +164,10 @@ const deployEVMxContracts = async () => { deployUtils.signer ); - deployUtils.addresses.startBlock = (deployUtils.addresses.startBlock - ? deployUtils.addresses.startBlock - : await deployUtils.signer.provider?.getBlockNumber()) || 0; + deployUtils.addresses.startBlock = + (deployUtils.addresses.startBlock + ? deployUtils.addresses.startBlock + : await deployUtils.signer.provider?.getBlockNumber()) || 0; await storeAddresses(deployUtils.addresses, chain as ChainSlug, mode); } catch (error) { @@ -256,9 +261,10 @@ const deploySocketContracts = async () => { ); deployUtils.addresses[contractName] = contractFactoryPlug.address; - deployUtils.addresses.startBlock = (deployUtils.addresses.startBlock - ? deployUtils.addresses.startBlock - : await deployUtils.signer.provider?.getBlockNumber()) || 0; + deployUtils.addresses.startBlock = + (deployUtils.addresses.startBlock + ? deployUtils.addresses.startBlock + : await deployUtils.signer.provider?.getBlockNumber()) || 0; await storeAddresses(deployUtils.addresses, chain, mode); } catch (error) { diff --git a/hardhat-scripts/deploy/2.roles.ts b/hardhat-scripts/deploy/2.roles.ts index cf96de35..1e3c25f5 100644 --- a/hardhat-scripts/deploy/2.roles.ts +++ b/hardhat-scripts/deploy/2.roles.ts @@ -4,8 +4,18 @@ dotenvConfig(); import { Wallet } from "ethers"; import { ethers } from "hardhat"; import { chains, EVMX_CHAIN_ID, mode, watcher } from "../config"; -import { CORE_CONTRACTS, DeploymentAddresses, EVMxCoreContracts } from "../constants"; -import { getAddresses, getInstance, getProviderFromChainSlug, getRoleHash, overrides } from "../utils"; +import { + CORE_CONTRACTS, + DeploymentAddresses, + EVMxCoreContracts, +} from "../constants"; +import { + getAddresses, + getInstance, + getProviderFromChainSlug, + getRoleHash, + overrides, +} from "../utils"; import { relayerAddressList } from "../constants/relayers"; import { ChainAddressesObj } from "@socket.tech/socket-protocol-common"; import { ROLES } from "../constants/roles"; diff --git a/hardhat-scripts/deploy/3.upgradeManagers.ts b/hardhat-scripts/deploy/3.upgradeManagers.ts index 62344c57..eaf3592f 100644 --- a/hardhat-scripts/deploy/3.upgradeManagers.ts +++ b/hardhat-scripts/deploy/3.upgradeManagers.ts @@ -10,7 +10,11 @@ dotenvConfig(); import { Wallet } from "ethers"; import { ethers } from "hardhat"; import { chains, EVMX_CHAIN_ID, mode } from "../config"; -import { CORE_CONTRACTS, DeploymentAddresses, EVMxCoreContracts } from "../constants"; +import { + CORE_CONTRACTS, + DeploymentAddresses, + EVMxCoreContracts, +} from "../constants"; import { getAddresses, getInstance, diff --git a/hardhat-scripts/deploy/4.connect.ts b/hardhat-scripts/deploy/4.connect.ts index f5f78b89..0de5a503 100644 --- a/hardhat-scripts/deploy/4.connect.ts +++ b/hardhat-scripts/deploy/4.connect.ts @@ -1,10 +1,17 @@ -import { - ChainAddressesObj, -} from "@socket.tech/socket-protocol-common"; +import { ChainAddressesObj } from "@socket.tech/socket-protocol-common"; import { Contract, ethers, providers, Wallet } from "ethers"; import { chains, EVMX_CHAIN_ID, mode } from "../config"; -import { CORE_CONTRACTS, DeploymentAddresses, EVMxCoreContracts } from "../constants"; -import { getAddresses, getInstance, getProviderFromChainSlug, overrides } from "../utils"; +import { + CORE_CONTRACTS, + DeploymentAddresses, + EVMxCoreContracts, +} from "../constants"; +import { + getAddresses, + getInstance, + getProviderFromChainSlug, + overrides, +} from "../utils"; import { signWatcherMessage } from "../utils/sign"; const plugs = [CORE_CONTRACTS.ContractFactoryPlug, CORE_CONTRACTS.FeesPlug]; export type AppGatewayConfig = { @@ -195,12 +202,12 @@ export const updateConfigEVMx = async () => { if (appConfigs.length > 0) { console.log({ appConfigs }); const encodedMessage = ethers.utils.defaultAbiCoder.encode( - ['bytes4', 'tuple(address plug,address appGateway,address switchboard,uint32 chainSlug)[]'], [ - watcher.interface.getSighash('setAppGateways'), - appConfigs, + "bytes4", + "tuple(address plug,address appGateway,address switchboard,uint32 chainSlug)[]", ], - ); + [watcher.interface.getSighash("setAppGateways"), appConfigs] + ); const { nonce, signature } = await signWatcherMessage(encodedMessage); const tx = await watcher.setAppGateways(appConfigs, nonce, signature, { ...overrides(EVMX_CHAIN_ID), diff --git a/hardhat-scripts/deploy/5.upload.ts b/hardhat-scripts/deploy/5.upload.ts index dbe22860..cd34b7d6 100644 --- a/hardhat-scripts/deploy/5.upload.ts +++ b/hardhat-scripts/deploy/5.upload.ts @@ -1,5 +1,10 @@ import { PutObjectCommand, S3Client } from "@aws-sdk/client-s3"; -import { ChainAddressesObj, EVMxAddressesObj, ChainSlug, DeploymentMode } from "@socket.tech/socket-protocol-common"; +import { + ChainAddressesObj, + EVMxAddressesObj, + ChainSlug, + DeploymentMode, +} from "@socket.tech/socket-protocol-common"; import { config as dotenvConfig } from "dotenv"; import fs from "fs"; import path from "path"; @@ -26,14 +31,13 @@ const getFileName = () => { return "devConfig.json"; case DeploymentMode.STAGE: return "stageConfig.json"; - case DeploymentMode.PROD: + case DeploymentMode.PROD: return "prodConfig.json"; default: throw new Error(`Invalid deployment mode: ${mode}`); } }; - const getAddressesPath = () => { switch (mode) { case DeploymentMode.DEV: @@ -104,10 +108,7 @@ export let config: S3Config = { ], }; // Read the addresses.json file -const addressesPath = path.join( - __dirname, - getAddressesPath() -); +const addressesPath = path.join(__dirname, getAddressesPath()); const addresses = JSON.parse(fs.readFileSync(addressesPath, "utf8")); // Update config with addresses diff --git a/hardhat-scripts/utils/address.ts b/hardhat-scripts/utils/address.ts index af8c5edd..d74f1313 100644 --- a/hardhat-scripts/utils/address.ts +++ b/hardhat-scripts/utils/address.ts @@ -1,5 +1,3 @@ - - import dev_addresses from "../../deployments/dev_addresses.json"; import stage_addresses from "../../deployments/stage_addresses.json"; import prod_addresses from "../../deployments/prod_addresses.json"; diff --git a/hardhat-scripts/utils/deployUtils.ts b/hardhat-scripts/utils/deployUtils.ts index 36d1241c..a3accdf2 100644 --- a/hardhat-scripts/utils/deployUtils.ts +++ b/hardhat-scripts/utils/deployUtils.ts @@ -8,7 +8,7 @@ import fs from "fs"; import { ChainAddressesObj, ChainSlug, - DeploymentMode + DeploymentMode, } from "@socket.tech/socket-protocol-common"; import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/signers"; import { overrides } from "../utils"; diff --git a/hardhat-scripts/utils/networks.ts b/hardhat-scripts/utils/networks.ts index 56d69fd8..b2f55ebe 100644 --- a/hardhat-scripts/utils/networks.ts +++ b/hardhat-scripts/utils/networks.ts @@ -22,7 +22,7 @@ function createReverseEnumMap(enumObj: any) { } export const rpcKeys = (chainSlug: ChainSlug) => { - if (chainSlug == EVMX_CHAIN_ID as ChainSlug) { + if (chainSlug == (EVMX_CHAIN_ID as ChainSlug)) { return "EVMX_RPC"; } let chainName = chainSlugToHardhatChainName[chainSlug].toString(); diff --git a/hardhat-scripts/utils/sign.ts b/hardhat-scripts/utils/sign.ts index 6c038e8b..2bd67a08 100644 --- a/hardhat-scripts/utils/sign.ts +++ b/hardhat-scripts/utils/sign.ts @@ -4,21 +4,16 @@ import { EVMxCoreContracts } from "../constants"; import { getAddresses } from "./address"; export const signWatcherMessage = async (encodedMessage: string) => { - const signatureNonce = Date.now(); - const signer = new Wallet(process.env.WATCHER_PRIVATE_KEY!); - const watcherPrecompileAddress = getAddresses(mode)[EVMX_CHAIN_ID][EVMxCoreContracts.WatcherPrecompile]; - const digest = ethers.utils.keccak256( - ethers.utils.defaultAbiCoder.encode( - ['address', 'uint32', 'uint256', 'bytes'], - [ - watcherPrecompileAddress, - EVMX_CHAIN_ID, - signatureNonce, - encodedMessage, - ], - ), - ); - const signature = await signer.signMessage(ethers.utils.arrayify(digest)); - return { nonce: signatureNonce, signature }; - }; - \ No newline at end of file + const signatureNonce = Date.now(); + const signer = new Wallet(process.env.WATCHER_PRIVATE_KEY!); + const watcherPrecompileAddress = + getAddresses(mode)[EVMX_CHAIN_ID][EVMxCoreContracts.WatcherPrecompile]; + const digest = ethers.utils.keccak256( + ethers.utils.defaultAbiCoder.encode( + ["address", "uint32", "uint256", "bytes"], + [watcherPrecompileAddress, EVMX_CHAIN_ID, signatureNonce, encodedMessage] + ) + ); + const signature = await signer.signMessage(ethers.utils.arrayify(digest)); + return { nonce: signatureNonce, signature }; +}; diff --git a/hardhat-scripts/verify/verify.ts b/hardhat-scripts/verify/verify.ts index 20ccc6b5..4afabe63 100644 --- a/hardhat-scripts/verify/verify.ts +++ b/hardhat-scripts/verify/verify.ts @@ -64,11 +64,7 @@ export const main = async () => { } } - await storeUnVerifiedParams( - unverifiedChainParams, - chain, - mode - ); + await storeUnVerifiedParams(unverifiedChainParams, chain, mode); } } catch (error) { console.log("Error in verifying contracts", error); From f8bc28c9c577180419b90c08a02a2cfb93223620 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Thu, 27 Feb 2025 15:30:34 +0400 Subject: [PATCH 166/186] rm: extra addr json --- deployments/dev_addresses_composer.json | 32 ------------------------- deployments/local_addresses.json | 3 --- deployments/prod_addresses.json | 1 - deployments/prod_verification.json | 1 - 4 files changed, 37 deletions(-) delete mode 100644 deployments/dev_addresses_composer.json delete mode 100644 deployments/local_addresses.json delete mode 100644 deployments/prod_addresses.json delete mode 100644 deployments/prod_verification.json diff --git a/deployments/dev_addresses_composer.json b/deployments/dev_addresses_composer.json deleted file mode 100644 index 8e2f78f9..00000000 --- a/deployments/dev_addresses_composer.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "421614": { - "ContractFactoryPlug": "0x38cAf1D477F806Fae8aed84ecD68E00eF6c2cB0c", - "FastSwitchboard": "0xB16475054Dc6D8bfbd80daE964bbE416a4B7a791", - "FeesPlug": "0x228AA70a66498FC75524371cDAfB31958Ca5F12D", - "Socket": "0x963eC83119862cD518826DA9177B348cFdfebaA4", - "SocketBatcher": "0x2db8cb4f841aa944869ECD5002e8153642A30971", - "startBlock": 125604419 - }, - "7625382": { - "AddressResolver": "0x5d16F235471531521ec23e1c75F26F55b15f51F1", - "AddressResolverImpl": "0x3d981a431c38B9b781178279AecFb91509BDa645", - "AuctionManager": "0x7DC27a33f99252FaF2388416620E3178597cfBdC", - "AuctionManagerImpl": "0x48228f8ebdCA92B7F7fdC9C545372123f5Bcc4C4", - "DeliveryHelper": "0xC415FA4baE9183a2439FA0a06dd558bb4FCc0051", - "DeliveryHelperImpl": "0xc67BEa5A43cb0D908866F3577D1f967f901Dbc75", - "ERC1967Factory": "0xC36e58c0c505435179417a318333e4a7C1867247", - "FeesManager": "0x7B03A532aCea55bc06aB39b844797dD5d82Af012", - "FeesManagerImpl": "0xaF369f1fc1523dc8086c2ACDD7e7A73aA8732FE6", - "startBlock": 5534, - "WatcherPrecompile": "0x71B25Fc5f47E786574aFca919Ca61611168d94D0", - "WatcherPrecompileImpl": "0xCF9728Dc37da5c5B08780F818B6fB65c64d6a402" - }, - "11155420": { - "ContractFactoryPlug": "0x43942f05D5b44DC6Ca19b316dF54BE87FcF9D583", - "FastSwitchboard": "0xA448B8CD7325AA38d4E533cE209471B7ce01901F", - "FeesPlug": "0x17b3c7c5552fA4e730888558A8912cFD7A8b042e", - "Socket": "0xaF57894A5244711a7bEBE582E9e121980f1aa95e", - "SocketBatcher": "0x977e2f721f8958b2F776d2dc693D04A1256ed426", - "startBlock": 24127420 - } -} diff --git a/deployments/local_addresses.json b/deployments/local_addresses.json deleted file mode 100644 index 7f90cbb0..00000000 --- a/deployments/local_addresses.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "7625382": {} -} diff --git a/deployments/prod_addresses.json b/deployments/prod_addresses.json deleted file mode 100644 index 0967ef42..00000000 --- a/deployments/prod_addresses.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/deployments/prod_verification.json b/deployments/prod_verification.json deleted file mode 100644 index 0967ef42..00000000 --- a/deployments/prod_verification.json +++ /dev/null @@ -1 +0,0 @@ -{} From 6f7e5204f6105daa80440ceb8d6c8469e277f111 Mon Sep 17 00:00:00 2001 From: Akash Date: Thu, 27 Feb 2025 15:52:59 +0400 Subject: [PATCH 167/186] feat: updated scripts --- contracts/base/ProxyFactory.sol | 7 ++++ deployments/dev_addresses.json | 64 +++++++++++------------------- deployments/dev_verification.json | 63 ++++++++++++++++------------- hardhat-scripts/deploy/1.deploy.ts | 4 +- hardhat-scripts/deploy/2.roles.ts | 4 -- package.json | 2 +- setupInfraContracts.sh | 8 +++- testScript.sh | 2 +- 8 files changed, 77 insertions(+), 77 deletions(-) create mode 100644 contracts/base/ProxyFactory.sol diff --git a/contracts/base/ProxyFactory.sol b/contracts/base/ProxyFactory.sol new file mode 100644 index 00000000..d6dd269f --- /dev/null +++ b/contracts/base/ProxyFactory.sol @@ -0,0 +1,7 @@ +pragma solidity ^0.8.0; + +import {ERC1967Factory} from "solady/utils/ERC1967Factory.sol"; + +contract ProxyFactory is ERC1967Factory { + constructor() {} +} \ No newline at end of file diff --git a/deployments/dev_addresses.json b/deployments/dev_addresses.json index 6fb6b53c..242369d1 100644 --- a/deployments/dev_addresses.json +++ b/deployments/dev_addresses.json @@ -1,48 +1,32 @@ { - "84532": { - "ContractFactoryPlug": "0xA557EBE094F939ae6eE8F18c8F88D06182168786", - "FastSwitchboard": "0x06234dB2D69Ac158793a3ce59c3764422028E964", - "FeesPlug": "0xD78f99D62BeaF0918bB0601C68EB537b6703Ce63", - "Socket": "0x6c40Fb39B03e32EC4D23e31DdE6D10283F2C7b4F", - "SocketBatcher": "0xA944BBe5D4F67a242C9e92d539fF2d55616283a7", - "startBlock": 22408552 - }, "421614": { - "ContractFactoryPlug": "0x73e72Df0e73d9ceA2C96D16D512B203bc8DC0A77", - "FastSwitchboard": "0x29E632aE79107A82C637016CA21030d922De5375", - "FeesPlug": "0x469B536c5Df15948c8759FEEE5DB1c17790d4152", - "Socket": "0xa0E1738a9Fc0698789866e09d7A335d30128C5C5", - "SocketBatcher": "0x6734a30B8f2d210faefa5aeD4E11b674C59641F1", - "startBlock": 127534886 + "ContractFactoryPlug": "0xCE9aF7Fb0Ee31276Ea64Cd7414d54eC57dA9b675", + "FastSwitchboard": "0x772088727d003f5A6Cf816E745ba6B8F8dEBbCe9", + "FeesPlug": "0xcc38176545fa5f6c2aB970F6d2D62b2D90bBA3Ba", + "Socket": "0xdE177c392Ad47377BA944215A944f530F79E1d87", + "SocketBatcher": "0x6BF08F11bDA6CD571Bc942F23ec38b8652FFfB2D", + "startBlock": 127798344 }, "7625382": { - "AddressResolver": "0xA57B7ce75aF92ADd9f2e7D3F66cc3B8675B1D697", - "AddressResolverImpl": "0xbBfb525ADc6eC38Ef0D4b807d327c2Dd1C286de1", - "AuctionManager": "0x6Ba8F0fD3Aac6786D552e691486e49Cfdcc948C1", - "AuctionManagerImpl": "0x23EF7Af3bC1009EA6f95c3389921d5cB19950182", - "DeliveryHelper": "0xb69045D15f6c13c4b3718d0E03d8f6d4476c3A10", - "DeliveryHelperImpl": "0x4CCF8F511A364827E5e6749b196BB26Ea00bF512", - "ERC1967Factory": "0x208dC31cd6042a09bbFDdB31614A337a51b870ba", - "FeesManager": "0x3Df4D93F499fB4C489D4741ABd5e662D2EA58A49", - "FeesManagerImpl": "0x8dcEE196AFECe27545687426914d2830ff2dbc35", - "startBlock": 2316, - "WatcherPrecompile": "0x595bF33368B034da798be2a4345F52C26121C685", - "WatcherPrecompileImpl": "0x09B503e744DCB2cA2827ce5AF08Fd49Ba06D17e4" - }, - "11155111": { - "ContractFactoryPlug": "0xf0f51Ba62284A98AbB5D447487d5E6B536DB9B72", - "FastSwitchboard": "0x6D54668ba18B425a1DbFC0BD720145c0aeE97f65", - "FeesPlug": "0xC559BABEbcD92278E91a545308190E4761efc347", - "Socket": "0xD78f99D62BeaF0918bB0601C68EB537b6703Ce63", - "SocketBatcher": "0xA557EBE094F939ae6eE8F18c8F88D06182168786", - "startBlock": 7790632 + "AddressResolver": "0x403eCBcC4d4bB8Fad09034bf0d197dDC626C832f", + "AddressResolverImpl": "0xbAeF84edEae864Ff22Bd9c9912AdfF84aD490d82", + "AuctionManager": "0x7dc45C49650e2914e3fA6E194e2080775c58256E", + "AuctionManagerImpl": "0xa07e38cAB46eAA358C3653C63219f1009e8F7789", + "DeliveryHelper": "0x0861f0888125e5A243C7af2c3E0F80C357c4c0C0", + "DeliveryHelperImpl": "0x9F10A0c71178dbD4d049f2C04fD0e34966134b9e", + "ERC1967Factory": "0x945e9ab4c08c225C10F178a0bd600BcC2bA7Cc78", + "FeesManager": "0x777fAAf1c30Ce8E68262b1cbF0a752d4f1bA652C", + "FeesManagerImpl": "0xB423eE3bffc3604F96B59cF419C48AE05b8E9d0b", + "startBlock": 73062, + "WatcherPrecompile": "0xadA397123A6E80F67b1887895A62B2D9273E50b4", + "WatcherPrecompileImpl": "0x71956F006Ec5434581D3Fd5E7224BB3bae231907" }, "11155420": { - "ContractFactoryPlug": "0xB0694bF9332ec67825B9Ad6E677941aeAF50995F", - "FastSwitchboard": "0x245C0DCF8eF6e52b4d03c96b563C83a5f78A1E14", - "FeesPlug": "0xa8176BE60350AA44Dd10d46f42720cD604EE85Ff", - "Socket": "0x79Ac996De9333956f4980397ED5Bd91f77f10b01", - "SocketBatcher": "0x4afd974a84F224ea25dd43be91C6fbaff8DcEcfa", - "startBlock": 24391377 + "ContractFactoryPlug": "0x289A0413420f812a7b05F931FB0726168121ae5a", + "FastSwitchboard": "0x59D9c8C5515cF9C8A9c83458E3D78C2a246E3e7C", + "FeesPlug": "0x285d1b2e93c1c74E141dC37f759B8aFAcD479b2b", + "Socket": "0xa347A8475d4d218b22e8b0cc90FF76B3e6c8043c", + "SocketBatcher": "0x4a7Ccf2845222172A8B7Fc6E132eDb64cCB4E4a4", + "startBlock": 24425961 } } diff --git a/deployments/dev_verification.json b/deployments/dev_verification.json index e9eca4a3..08bfd6ce 100644 --- a/deployments/dev_verification.json +++ b/deployments/dev_verification.json @@ -61,6 +61,42 @@ ] ], "7625382": [ + [ + "0xa07e38cAB46eAA358C3653C63219f1009e8F7789", + "AuctionManager", + "contracts/protocol/payload-delivery/AuctionManager.sol", + [] + ], + [ + "0x9F10A0c71178dbD4d049f2C04fD0e34966134b9e", + "DeliveryHelper", + "contracts/protocol/payload-delivery/app-gateway/DeliveryHelper.sol", + [] + ], + [ + "0xB423eE3bffc3604F96B59cF419C48AE05b8E9d0b", + "FeesManager", + "contracts/protocol/payload-delivery/FeesManager.sol", + [] + ], + [ + "0x71956F006Ec5434581D3Fd5E7224BB3bae231907", + "WatcherPrecompile", + "contracts/protocol/watcherPrecompile/WatcherPrecompile.sol", + [] + ], + [ + "0xbAeF84edEae864Ff22Bd9c9912AdfF84aD490d82", + "AddressResolver", + "contracts/protocol/AddressResolver.sol", + [] + ], + [ + "0x945e9ab4c08c225C10F178a0bd600BcC2bA7Cc78", + "ERC1967Factory", + "lib/solady/src/utils/ERC1967Factory.sol", + [] + ], [ "0x09B503e744DCB2cA2827ce5AF08Fd49Ba06D17e4", "WatcherPrecompile", @@ -176,24 +212,6 @@ "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18" ] ], - [ - "0xB0694bF9332ec67825B9Ad6E677941aeAF50995F", - "ContractFactoryPlug", - "contracts/protocol/payload-delivery/ContractFactoryPlug.sol", - [ - "0x79Ac996De9333956f4980397ED5Bd91f77f10b01", - "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18" - ] - ], - [ - "0xa8176BE60350AA44Dd10d46f42720cD604EE85Ff", - "FeesPlug", - "contracts/protocol/payload-delivery/FeesPlug.sol", - [ - "0x79Ac996De9333956f4980397ED5Bd91f77f10b01", - "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18" - ] - ], [ "0xBf9Ec2b0441eeEA9bEb89C6638921c37c15A13E4", "FastSwitchboard", @@ -204,15 +222,6 @@ "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18" ] ], - [ - "0x4afd974a84F224ea25dd43be91C6fbaff8DcEcfa", - "SocketBatcher", - "contracts/protocol/socket/SocketBatcher.sol", - [ - "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18", - "0x79Ac996De9333956f4980397ED5Bd91f77f10b01" - ] - ], [ "0x79Ac996De9333956f4980397ED5Bd91f77f10b01", "Socket", diff --git a/hardhat-scripts/deploy/1.deploy.ts b/hardhat-scripts/deploy/1.deploy.ts index 3b2eaf77..2639bb17 100644 --- a/hardhat-scripts/deploy/1.deploy.ts +++ b/hardhat-scripts/deploy/1.deploy.ts @@ -105,7 +105,7 @@ const deployEVMxContracts = async () => { deployUtils = await deployContractWithProxy( EVMxCoreContracts.FeesManager, - `contracts/protocol/payload-delivery/app-gateway/FeesManager.sol`, + `contracts/protocol/payload-delivery/FeesManager.sol`, [addressResolver.address, EVMxOwner, EVMX_CHAIN_ID], proxyFactory, deployUtils @@ -125,7 +125,7 @@ const deployEVMxContracts = async () => { deployUtils = await deployContractWithProxy( EVMxCoreContracts.AuctionManager, - `contracts/protocol/payload-delivery/app-gateway/AuctionManager.sol`, + `contracts/protocol/payload-delivery/AuctionManager.sol`, [ EVMX_CHAIN_ID, auctionEndDelaySeconds, diff --git a/hardhat-scripts/deploy/2.roles.ts b/hardhat-scripts/deploy/2.roles.ts index cf96de35..4c517e5e 100644 --- a/hardhat-scripts/deploy/2.roles.ts +++ b/hardhat-scripts/deploy/2.roles.ts @@ -120,10 +120,6 @@ export const main = async () => { try { console.log("Setting Roles"); const addresses = getAddresses(mode) as unknown as DeploymentAddresses; - - console.log("Setting Roles for EVMx"); - await setRolesForEVMx(addresses); - console.log("Setting Roles for On Chain"); for (const chain of chains) { await setRolesForOnChain(chain, addresses); diff --git a/package.json b/package.json index bf794bff..8529f8ac 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "publishConfig": { "access": "public" }, - "version": "1.0.14", + "version": "1.0.15", "description": "socket protocol", "scripts": { "build": "hardhat export-abi && tsc --project lib.tsconfig.json", diff --git a/setupInfraContracts.sh b/setupInfraContracts.sh index 5040cc54..19d7adb8 100644 --- a/setupInfraContracts.sh +++ b/setupInfraContracts.sh @@ -1,7 +1,11 @@ -time npx hardhat run hardhat-scripts/deploy/1.deploy.ts +if [ "$1" = "compile" ]; then + time npx hardhat run hardhat-scripts/deploy/1.deploy.ts +else + time npx hardhat run hardhat-scripts/deploy/1.deploy.ts --no-compile +fi time npx hardhat run hardhat-scripts/deploy/2.roles.ts --no-compile time npx hardhat run hardhat-scripts/deploy/3.upgradeManagers.ts --no-compile time npx hardhat run hardhat-scripts/deploy/4.connect.ts --no-compile time npx ts-node hardhat-scripts/deploy/5.upload.ts --resolveJsonModule time npx hardhat run hardhat-scripts/deploy/6.setupEnv.ts --no-compile -time npx hardhat run hardhat-scripts/verify/verify.ts --no-compile +time npx hardhat run hardhat-scripts/verify/verify.ts --no-compile & disown diff --git a/testScript.sh b/testScript.sh index d69c2f14..456bd718 100644 --- a/testScript.sh +++ b/testScript.sh @@ -11,7 +11,7 @@ source .env && forge script script/parallel-counter/checkCounters.s.sol --broadc source .env && forge script script/counter/deployEVMxCounterApp.s.sol --broadcast --skip-simulation --legacy --gas-price 0 source .env && forge script script/counter/DeployCounterOnchain.s.sol --broadcast --skip-simulation ## set limits for the app gateway using API -source .env && cast send $DEPLOYER "deployContracts(uint32)" 421614 --private-key $PRIVATE_KEY --legacy --gas-price 0 +source .env && cast send $APP_GATEWAY "deployContracts(uint32)" 421614 --private-key $PRIVATE_KEY --legacy --gas-price 0 source .env && cast send $APP_GATEWAY "incrementCounters(address[])" '[0x18a93d520879524e0c215b64f05914da5883540f]' --private-key $PRIVATE_KEY --legacy --gas-price 0 source .env && cast send $APP_GATEWAY "readCounters(address[])" '[0x18a93d520879524e0c215b64f05914da5883540f]' --private-key $PRIVATE_KEY --legacy --gas-price 0 From a8939981000e8c24cd5d673e4e3a1ec8c44b5c75 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Thu, 27 Feb 2025 16:13:18 +0400 Subject: [PATCH 168/186] rm: remove extra scripts --- script/{ => admin}/mock/DeployEVMx.s.sol | 0 script/{ => admin}/mock/DeploySocket.s.sol | 0 .../counter-inbox/CheckGatewayCounter.s.sol | 21 ----- script/counter-inbox/Increment.s.sol | 25 ------ script/counter/IncrementCountersFromApp.s.sol | 11 --- script/counter/ReadOnchainCounters.s.sol | 17 ---- script/counter/deployOnchainCounters.s.sol | 6 -- script/cron/SetTimeout.s.sol | 20 ----- .../{ => helpers}/AppGatewayFeeBalance.s.sol | 0 .../CheckAppEVMxLimits.s.sol | 0 .../{ => helpers}/PayFeesInArbitrumETH.s.sol | 0 .../WithdrawFeesArbitrumFeesPlug.s.sol | 4 +- script/mock/FinalizeAndExecution.s.sol | 60 ------------- script/mock/Inbox.s.sol | 21 ----- script/mock/Query.s.sol | 27 ------ script/mock/Timeout.s.sol | 18 ---- script/parallel-counter/checkCounters.s.sol | 80 ----------------- script/parallel-counter/deployOnchain.s.sol | 28 ------ .../parallel-counter/incrementCounters.s.sol | 75 ---------------- script/super-token-lockable/Bridge.s.sol | 85 ------------------- .../DeployContracts.s.sol | 23 ----- .../super-token-lockable/DeployGateway.s.sol | 54 ------------ script/super-token/Bridge.s.sol | 32 ------- script/super-token/DeployContracts.s.sol | 20 ----- script/super-token/DeployGateway.s.sol | 47 ---------- 25 files changed, 3 insertions(+), 671 deletions(-) rename script/{ => admin}/mock/DeployEVMx.s.sol (100%) rename script/{ => admin}/mock/DeploySocket.s.sol (100%) delete mode 100644 script/counter-inbox/CheckGatewayCounter.s.sol delete mode 100644 script/counter-inbox/Increment.s.sol delete mode 100644 script/cron/SetTimeout.s.sol rename script/{ => helpers}/AppGatewayFeeBalance.s.sol (100%) rename script/{admin => helpers}/CheckAppEVMxLimits.s.sol (100%) rename script/{ => helpers}/PayFeesInArbitrumETH.s.sol (100%) rename script/{counter => helpers}/WithdrawFeesArbitrumFeesPlug.s.sol (92%) delete mode 100644 script/mock/FinalizeAndExecution.s.sol delete mode 100644 script/mock/Inbox.s.sol delete mode 100644 script/mock/Query.s.sol delete mode 100644 script/mock/Timeout.s.sol delete mode 100644 script/parallel-counter/checkCounters.s.sol delete mode 100644 script/parallel-counter/deployOnchain.s.sol delete mode 100644 script/parallel-counter/incrementCounters.s.sol delete mode 100644 script/super-token-lockable/Bridge.s.sol delete mode 100644 script/super-token-lockable/DeployContracts.s.sol delete mode 100644 script/super-token-lockable/DeployGateway.s.sol delete mode 100644 script/super-token/Bridge.s.sol delete mode 100644 script/super-token/DeployContracts.s.sol delete mode 100644 script/super-token/DeployGateway.s.sol diff --git a/script/mock/DeployEVMx.s.sol b/script/admin/mock/DeployEVMx.s.sol similarity index 100% rename from script/mock/DeployEVMx.s.sol rename to script/admin/mock/DeployEVMx.s.sol diff --git a/script/mock/DeploySocket.s.sol b/script/admin/mock/DeploySocket.s.sol similarity index 100% rename from script/mock/DeploySocket.s.sol rename to script/admin/mock/DeploySocket.s.sol diff --git a/script/counter-inbox/CheckGatewayCounter.s.sol b/script/counter-inbox/CheckGatewayCounter.s.sol deleted file mode 100644 index ffd80b88..00000000 --- a/script/counter-inbox/CheckGatewayCounter.s.sol +++ /dev/null @@ -1,21 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Script} from "forge-std/Script.sol"; -import {console} from "forge-std/console.sol"; -import {CounterAppGateway} from "../../test/apps/app-gateways/counter/CounterAppGateway.sol"; - -contract CheckGatewayCounter is Script { - function run() external { - string memory rpc = vm.envString("EVMX_RPC"); - vm.createSelectFork(rpc); - - address gatewayAddress = vm.envAddress("APP_GATEWAY"); - CounterAppGateway gateway = CounterAppGateway(gatewayAddress); - - // Log the value of the counter variable on CounterAppGateway - uint256 counterValue = gateway.counterVal(); - console.log("Counter value on CounterAppGateway:"); - console.log(counterValue); - } -} diff --git a/script/counter-inbox/Increment.s.sol b/script/counter-inbox/Increment.s.sol deleted file mode 100644 index 3937d716..00000000 --- a/script/counter-inbox/Increment.s.sol +++ /dev/null @@ -1,25 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Script} from "forge-std/Script.sol"; -import {console} from "forge-std/console.sol"; -import {CounterAppGateway} from "../../test/apps/app-gateways/counter/CounterAppGateway.sol"; -import {Counter} from "../../test/apps/app-gateways/counter/Counter.sol"; -import {Fees} from "../../contracts/protocol/utils/common/Structs.sol"; -import {ETH_ADDRESS, FAST} from "../../contracts/protocol/utils/common/Constants.sol"; - -contract Increment is Script { - function run() external { - string memory arbRpc = vm.envString("ARBITRUM_SEPOLIA_RPC"); - - vm.createSelectFork(arbRpc); - uint256 arbDeployerPrivateKey = vm.envUint("SPONSOR_KEY"); - vm.startBroadcast(arbDeployerPrivateKey); - address counterInbox = vm.envAddress("COUNTER_INBOX"); - - Counter inbox = Counter(counterInbox); - inbox.increaseOnGateway(100); - - vm.stopBroadcast(); - } -} diff --git a/script/counter/IncrementCountersFromApp.s.sol b/script/counter/IncrementCountersFromApp.s.sol index b63f6c83..60a90fd2 100644 --- a/script/counter/IncrementCountersFromApp.s.sol +++ b/script/counter/IncrementCountersFromApp.s.sol @@ -23,17 +23,12 @@ contract IncrementCounters is Script { 11155420 ); address counterForwarderBaseSepolia = gateway.forwarderAddresses(gateway.counter(), 84532); - //address counterForwarderSepolia = deployer.forwarderAddresses( - // deployer.counter(), - // 11155111 - //); // Count non-zero addresses uint256 nonZeroCount = 0; if (counterForwarderArbitrumSepolia != address(0)) nonZeroCount++; if (counterForwarderOptimismSepolia != address(0)) nonZeroCount++; if (counterForwarderBaseSepolia != address(0)) nonZeroCount++; - //if (counterForwarderSepolia != address(0)) nonZeroCount++; address[] memory instances = new address[](nonZeroCount); uint256 index = 0; @@ -55,12 +50,6 @@ contract IncrementCounters is Script { } else { console.log("Base Sepolia forwarder not yet deployed"); } - //if (counterForwarderSepolia != address(0)) { - // instances[index] = counterForwarderSepolia; - // index++; - //} else { - // console.log("Ethereum Sepolia forwarder not yet deployed"); - //} vm.startBroadcast(deployerPrivateKey); gateway.incrementCounters(instances); diff --git a/script/counter/ReadOnchainCounters.s.sol b/script/counter/ReadOnchainCounters.s.sol index 850f7e9c..534acd66 100644 --- a/script/counter/ReadOnchainCounters.s.sol +++ b/script/counter/ReadOnchainCounters.s.sol @@ -20,10 +20,6 @@ contract CheckCounters is Script { 11155420 ); address counterInstanceBaseSepolia = gateway.getOnChainAddress(gateway.counter(), 84532); - //address counterInstanceSepolia = deployer.getOnChainAddress( - // deployer.counter(), - // 11155111 - //); if (counterInstanceArbitrumSepolia != address(0)) { vm.createSelectFork(vm.envString("ARBITRUM_SEPOLIA_RPC")); @@ -48,18 +44,5 @@ contract CheckCounters is Script { } else { console.log("Counter not yet deployed on Base Sepolia"); } - - //if (counterInstanceSepolia != address(0)) { - // vm.createSelectFork(vm.envString("SEPOLIA_RPC")); - // uint256 counterValueOptimismSepolia = Counter( - // counterInstanceOptimismSepolia - // ).counter(); - // console.log( - // "Counter value on Ethereum Sepolia: ", - // counterValueOptimismSepolia - // ); - //} else { - // console.log("Counter not yet deployed on Ethereum Sepolia"); - //} } } diff --git a/script/counter/deployOnchainCounters.s.sol b/script/counter/deployOnchainCounters.s.sol index fd75c155..65b00d4c 100644 --- a/script/counter/deployOnchainCounters.s.sol +++ b/script/counter/deployOnchainCounters.s.sol @@ -21,11 +21,5 @@ contract CounterDeployOnchain is Script { console.log("Deploying contracts on Arbitrum Sepolia..."); appGateway.deployContracts(421614); - // console.log("Deploying contracts on Optimism Sepolia..."); - // appGateway.deployContracts(11155420); - // console.log("Deploying contracts on Base Sepolia..."); - // appGateway.deployContracts(84532); - // console.log("Deploying contracts on Ethereum Sepolia..."); - // appGateway.deployContracts(11155111); } } diff --git a/script/cron/SetTimeout.s.sol b/script/cron/SetTimeout.s.sol deleted file mode 100644 index b58a0925..00000000 --- a/script/cron/SetTimeout.s.sol +++ /dev/null @@ -1,20 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Script} from "forge-std/Script.sol"; -import {console} from "forge-std/console.sol"; -import {CounterAppGateway} from "../../test/apps/app-gateways/counter/CounterAppGateway.sol"; - -contract SetTimeoutScript is Script { - function run() external { - string memory socketRPC = vm.envString("EVMX_RPC"); - uint256 deployerPrivateKey = vm.envUint("PRIVATE_KEY"); - vm.createSelectFork(socketRPC); - address gatewayAddress = vm.envAddress("APP_GATEWAY"); - console.log("Gateway address:", gatewayAddress); - CounterAppGateway gateway = CounterAppGateway(gatewayAddress); - vm.startBroadcast(deployerPrivateKey); - gateway.setTimeout(0); - // vm.stopBroadcast(); - } -} diff --git a/script/AppGatewayFeeBalance.s.sol b/script/helpers/AppGatewayFeeBalance.s.sol similarity index 100% rename from script/AppGatewayFeeBalance.s.sol rename to script/helpers/AppGatewayFeeBalance.s.sol diff --git a/script/admin/CheckAppEVMxLimits.s.sol b/script/helpers/CheckAppEVMxLimits.s.sol similarity index 100% rename from script/admin/CheckAppEVMxLimits.s.sol rename to script/helpers/CheckAppEVMxLimits.s.sol diff --git a/script/PayFeesInArbitrumETH.s.sol b/script/helpers/PayFeesInArbitrumETH.s.sol similarity index 100% rename from script/PayFeesInArbitrumETH.s.sol rename to script/helpers/PayFeesInArbitrumETH.s.sol diff --git a/script/counter/WithdrawFeesArbitrumFeesPlug.s.sol b/script/helpers/WithdrawFeesArbitrumFeesPlug.s.sol similarity index 92% rename from script/counter/WithdrawFeesArbitrumFeesPlug.s.sol rename to script/helpers/WithdrawFeesArbitrumFeesPlug.s.sol index fbebfe6e..fc954d26 100644 --- a/script/counter/WithdrawFeesArbitrumFeesPlug.s.sol +++ b/script/helpers/WithdrawFeesArbitrumFeesPlug.s.sol @@ -7,14 +7,16 @@ import {FeesManager} from "../../contracts/protocol/payload-delivery/FeesManager import {ETH_ADDRESS} from "../../contracts/protocol/utils/common/Constants.sol"; import {CounterAppGateway} from "../../test/apps/app-gateways/counter/CounterAppGateway.sol"; +// @notice This script is used to withdraw fees from EVMX to Arbitrum Sepolia +// @dev Make sure your app has withdrawFeeTokens() function implemented. You can check its implementation in CounterAppGateway.sol contract WithdrawFees is Script { function run() external { // EVMX Check available fees vm.createSelectFork(vm.envString("EVMX_RPC")); FeesManager feesManager = FeesManager(payable(vm.envAddress("FEES_MANAGER"))); address appGatewayAddress = vm.envAddress("APP_GATEWAY"); - CounterAppGateway appGateway = CounterAppGateway(appGatewayAddress); + CounterAppGateway appGateway = CounterAppGateway(appGatewayAddress); uint256 availableFees = feesManager.getAvailableFees( 421614, appGatewayAddress, diff --git a/script/mock/FinalizeAndExecution.s.sol b/script/mock/FinalizeAndExecution.s.sol deleted file mode 100644 index 4ba2d49a..00000000 --- a/script/mock/FinalizeAndExecution.s.sol +++ /dev/null @@ -1,60 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Script} from "forge-std/Script.sol"; -import {console} from "forge-std/console.sol"; -import {MockWatcherPrecompile} from "../../test/mock/MockWatcherPrecompile.sol"; -import "../../test/mock/MockSocket.sol"; -import {CallType, FinalizeParams, PayloadDetails, Parallel} from "../../contracts/protocol/utils/common/Structs.sol"; - -contract InboxTest is Script { - function run() external { - string memory arbRpc = vm.envString("ARBITRUM_SEPOLIA_RPC"); - string memory offChainRpc = vm.envString("EVMX_RPC"); - uint256 offChainDeployerPrivateKey = vm.envUint("PRIVATE_KEY"); - uint256 arbDeployerPrivateKey = vm.envUint("SOCKET_SIGNER_KEY"); - - vm.createSelectFork(offChainRpc); - vm.startBroadcast(offChainDeployerPrivateKey); - address watcher = vm.envAddress("WATCHER_PRECOMPILE"); - MockWatcherPrecompile watcherInstance = MockWatcherPrecompile(watcher); - PayloadDetails memory payloadDetails = PayloadDetails({ - chainSlug: 421614, - appGateway: address(0), // usdc contract - target: 0x6402c4c08C1F752Ac8c91beEAF226018ec1a27f2, // usdc contract - payload: abi.encodeWithSignature( - "transfer(address,uint256)", - address(0), - 1000000000000000000 - ), - callType: CallType.WRITE, - executionGasLimit: 1000000, - value: 0, - next: new address[](0), - isParallel: Parallel.OFF - }); - FinalizeParams memory finalizeParams = FinalizeParams({ - payloadDetails: payloadDetails, - asyncId: bytes32(0), - transmitter: address(0) - }); - (bytes32 payloadId, ) = watcherInstance.finalize(finalizeParams); - - vm.stopBroadcast(); - - vm.createSelectFork(arbRpc); - vm.startBroadcast(arbDeployerPrivateKey); - address socket = vm.envAddress("SOCKET"); - MockSocket socketInstance = MockSocket(socket); - - ISocket.ExecuteParams memory executeParams = ISocket.ExecuteParams({ - payloadId: payloadId, - target: address(0), - executionGasLimit: 10000000, - deadline: 10000000, - payload: bytes("") - }); - socketInstance.execute(address(0), executeParams, bytes("")); - vm.stopBroadcast(); - } -} diff --git a/script/mock/Inbox.s.sol b/script/mock/Inbox.s.sol deleted file mode 100644 index 792a635d..00000000 --- a/script/mock/Inbox.s.sol +++ /dev/null @@ -1,21 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Script} from "forge-std/Script.sol"; -import {console} from "forge-std/console.sol"; -import {MockWatcherPrecompile} from "../../test/mock/MockWatcherPrecompile.sol"; -import {MockSocket} from "../../test/mock/MockSocket.sol"; - -contract InboxTest is Script { - function run() external { - string memory rpc = vm.envString("ARBITRUM_SEPOLIA_RPC"); - vm.createSelectFork(rpc); - uint256 deployerPrivateKey = vm.envUint("SOCKET_SIGNER_KEY"); - vm.startBroadcast(deployerPrivateKey); - address socket = vm.envAddress("SOCKET"); - MockSocket socketInstance = MockSocket(socket); - bytes memory payload = hex"00010203"; - bytes32 params = bytes32(0); - socketInstance.callAppGateway(payload, params); - } -} diff --git a/script/mock/Query.s.sol b/script/mock/Query.s.sol deleted file mode 100644 index 6f5dde86..00000000 --- a/script/mock/Query.s.sol +++ /dev/null @@ -1,27 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Script} from "forge-std/Script.sol"; -import {console} from "forge-std/console.sol"; -import {MockWatcherPrecompile} from "../../test/mock/MockWatcherPrecompile.sol"; - -contract QueryTest is Script { - function run() external { - string memory rpc = vm.envString("EVMX_RPC"); - vm.createSelectFork(rpc); - uint256 deployerPrivateKey = vm.envUint("PRIVATE_KEY"); - vm.startBroadcast(deployerPrivateKey); - address watcher = vm.envAddress("WATCHER_PRECOMPILE"); - MockWatcherPrecompile watcherInstance = MockWatcherPrecompile(watcher); - - address[] memory asyncPromises = new address[](1); - asyncPromises[0] = address(0); - bytes memory payload = abi.encodeWithSignature("balanceOf(address)", address(0)); - watcherInstance.query( - 421614, - 0x6402c4c08C1F752Ac8c91beEAF226018ec1a27f2, // usdc contract - asyncPromises, - payload - ); - } -} diff --git a/script/mock/Timeout.s.sol b/script/mock/Timeout.s.sol deleted file mode 100644 index 52313212..00000000 --- a/script/mock/Timeout.s.sol +++ /dev/null @@ -1,18 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Script} from "forge-std/Script.sol"; -import {console} from "forge-std/console.sol"; -import {MockWatcherPrecompile} from "../../test/mock/MockWatcherPrecompile.sol"; - -contract TimeoutTest is Script { - function run() external { - string memory rpc = vm.envString("EVMX_RPC"); - vm.createSelectFork(rpc); - uint256 deployerPrivateKey = vm.envUint("PRIVATE_KEY"); - vm.startBroadcast(deployerPrivateKey); - address watcher = vm.envAddress("WATCHER_PRECOMPILE"); - MockWatcherPrecompile watcherInstance = MockWatcherPrecompile(watcher); - watcherInstance.setTimeout("", 10); - } -} diff --git a/script/parallel-counter/checkCounters.s.sol b/script/parallel-counter/checkCounters.s.sol deleted file mode 100644 index fa04b108..00000000 --- a/script/parallel-counter/checkCounters.s.sol +++ /dev/null @@ -1,80 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Script} from "forge-std/Script.sol"; -import {console} from "forge-std/console.sol"; -import {CounterAppGateway} from "../../test/apps/app-gateways/counter/CounterAppGateway.sol"; -import {Counter} from "../../test/apps/app-gateways/counter/Counter.sol"; - -contract CheckCounters is Script { - function run() external { - CounterAppGateway gateway = CounterAppGateway(vm.envAddress("APP_GATEWAY")); - - vm.createSelectFork(vm.envString("EVMX_RPC")); - address counterInstanceArbitrumSepolia = gateway.getOnChainAddress( - gateway.counter(), - 421614 - ); - address counter1InstanceArbitrumSepolia = gateway.getOnChainAddress( - gateway.counter1(), - 421614 - ); - address counterInstanceOptimismSepolia = gateway.getOnChainAddress( - gateway.counter(), - 11155420 - ); - address counter1InstanceOptimismSepolia = gateway.getOnChainAddress( - gateway.counter1(), - 11155420 - ); - - if (counterInstanceArbitrumSepolia != address(0)) { - vm.createSelectFork(vm.envString("ARBITRUM_SEPOLIA_RPC")); - console.log("Counter 1 instance on Arbitrum Sepolia:", counterInstanceArbitrumSepolia); - uint256 counterValueArbitrumSepolia = Counter(counterInstanceArbitrumSepolia).counter(); - console.log("Counter1 value on Arbitrum Sepolia: ", counterValueArbitrumSepolia); - } else { - console.log("Counter1 not yet deployed on Arbitrum Sepolia"); - } - - if (counter1InstanceArbitrumSepolia != address(0)) { - vm.createSelectFork(vm.envString("ARBITRUM_SEPOLIA_RPC")); - console.log("Counter 2 instance on Arbitrum Sepolia:", counter1InstanceArbitrumSepolia); - uint256 counterValueArbitrumSepolia = Counter(counter1InstanceArbitrumSepolia) - .counter(); - console.log("Counter2 value on Arbitrum Sepolia: ", counterValueArbitrumSepolia); - } else { - console.log("Counter2 not yet deployed on Arbitrum Sepolia"); - } - - if (counterInstanceOptimismSepolia != address(0)) { - vm.createSelectFork(vm.envString("OPTIMISM_SEPOLIA_RPC")); - console.log("Counter 1 instance on Optimism Sepolia:", counterInstanceOptimismSepolia); - uint256 counterValueOptimismSepolia = Counter(counterInstanceOptimismSepolia).counter(); - console.log("Counter1 value on Optimism Sepolia: ", counterValueOptimismSepolia); - } else { - console.log("Counter1 not yet deployed on Optimism Sepolia"); - } - - if (counter1InstanceOptimismSepolia != address(0)) { - vm.createSelectFork(vm.envString("OPTIMISM_SEPOLIA_RPC")); - console.log("Counter 2 instance on Optimism Sepolia:", counter1InstanceOptimismSepolia); - uint256 counterValueOptimismSepolia = Counter(counter1InstanceOptimismSepolia) - .counter(); - console.log("Counter2 value on Optimism Sepolia: ", counterValueOptimismSepolia); - } else { - console.log("Counter2 not yet deployed on Optimism Sepolia"); - } - - vm.createSelectFork(vm.envString("EVMX_RPC")); - address forwarderArb1 = gateway.forwarderAddresses(gateway.counter(), 421614); - address forwarderArb2 = gateway.forwarderAddresses(gateway.counter1(), 421614); - address forwarderOpt1 = gateway.forwarderAddresses(gateway.counter(), 11155420); - address forwarderOpt2 = gateway.forwarderAddresses(gateway.counter1(), 11155420); - - console.log("Forwarder 1 on Arbitrum Sepolia:", forwarderArb1); - console.log("Forwarder 2 on Arbitrum Sepolia:", forwarderArb2); - console.log("Forwarder 1 on Optimism Sepolia:", forwarderOpt1); - console.log("Forwarder 2 on Optimism Sepolia:", forwarderOpt2); - } -} diff --git a/script/parallel-counter/deployOnchain.s.sol b/script/parallel-counter/deployOnchain.s.sol deleted file mode 100644 index d52528ec..00000000 --- a/script/parallel-counter/deployOnchain.s.sol +++ /dev/null @@ -1,28 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Script} from "forge-std/Script.sol"; -import {console} from "forge-std/console.sol"; -import {CounterAppGateway} from "../../test/apps/app-gateways/counter/CounterAppGateway.sol"; -import {ETH_ADDRESS} from "../../contracts/protocol/utils/common/Constants.sol"; - -contract CounterDeployOnchain is Script { - function run() external { - string memory rpc = vm.envString("EVMX_RPC"); - console.log(rpc); - vm.createSelectFork(rpc); - - uint256 deployerPrivateKey = vm.envUint("PRIVATE_KEY"); - vm.startBroadcast(deployerPrivateKey); - - CounterAppGateway gateway = CounterAppGateway(vm.envAddress("APP_GATEWAY")); - - console.log("Counter Gateway:", address(gateway)); - console.log("Deploying contracts on Arbitrum Sepolia..."); - - uint32[] memory chainSlugs = new uint32[](2); - chainSlugs[0] = 421614; - chainSlugs[1] = 11155420; - gateway.deployMultiChainContracts(chainSlugs); - } -} diff --git a/script/parallel-counter/incrementCounters.s.sol b/script/parallel-counter/incrementCounters.s.sol deleted file mode 100644 index ab03e084..00000000 --- a/script/parallel-counter/incrementCounters.s.sol +++ /dev/null @@ -1,75 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Script} from "forge-std/Script.sol"; -import {console} from "forge-std/console.sol"; -import {CounterAppGateway} from "../../test/apps/app-gateways/counter/CounterAppGateway.sol"; - -contract IncrementCounters is Script { - function run() external { - string memory socketRPC = vm.envString("EVMX_RPC"); - - vm.createSelectFork(socketRPC); - - CounterAppGateway gateway = CounterAppGateway(vm.envAddress("APP_GATEWAY")); - - address counterForwarderArbitrumSepolia = gateway.forwarderAddresses( - gateway.counter(), - 421614 - ); - address counterForwarderOptimismSepolia = gateway.forwarderAddresses( - gateway.counter(), - 11155420 - ); - address counterForwarderBaseSepolia = gateway.forwarderAddresses(gateway.counter(), 84532); - //address counterForwarderSepolia = gateway.forwarderAddresses( - // gateway.counter(), - // 11155111 - //); - - // Count non-zero addresses - uint256 nonZeroCount = 0; - if (counterForwarderArbitrumSepolia != address(0)) nonZeroCount++; - if (counterForwarderOptimismSepolia != address(0)) nonZeroCount++; - if (counterForwarderBaseSepolia != address(0)) nonZeroCount++; - //if (counterForwarderSepolia != address(0)) nonZeroCount++; - - address[] memory instances = new address[](nonZeroCount); - uint256 index = 0; - if (counterForwarderArbitrumSepolia != address(0)) { - instances[index] = counterForwarderArbitrumSepolia; - index++; - } else { - console.log("Arbitrum Sepolia forwarder not yet deployed"); - } - if (counterForwarderOptimismSepolia != address(0)) { - instances[index] = counterForwarderOptimismSepolia; - index++; - } else { - console.log("Optimism Sepolia forwarder not yet deployed"); - } - if (counterForwarderBaseSepolia != address(0)) { - instances[index] = counterForwarderBaseSepolia; - index++; - } else { - console.log("Base Sepolia forwarder not yet deployed"); - } - //if (counterForwarderSepolia != address(0)) { - // instances[index] = counterForwarderSepolia; - // index++; - //} else { - // console.log("Ethereum Sepolia forwarder not yet deployed"); - //} - - // vm.startBroadcast(deployerPrivateKey); - bytes memory data = abi.encodeWithSelector( - CounterAppGateway.incrementCounters.selector, - instances - ); - console.log("to"); - console.log(address(gateway)); - console.log("data"); - console.logBytes(data); - // gateway.incrementCounters(instances); - } -} diff --git a/script/super-token-lockable/Bridge.s.sol b/script/super-token-lockable/Bridge.s.sol deleted file mode 100644 index 34fc36bf..00000000 --- a/script/super-token-lockable/Bridge.s.sol +++ /dev/null @@ -1,85 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Script} from "forge-std/Script.sol"; -import {console} from "forge-std/console.sol"; - -import {SuperTokenLockableAppGateway} from "../../test/apps/app-gateways/super-token-lockable/SuperTokenLockableAppGateway.sol"; - -contract Bridge is Script { - function run() external { - address owner = vm.envAddress("OWNER"); - address gateway = vm.envAddress("APP_GATEWAY"); - SuperTokenLockableAppGateway gatewayContract = SuperTokenLockableAppGateway(gateway); - - string memory rpc = vm.envString("EVMX_RPC"); - vm.createSelectFork(rpc); - uint256 deployerPrivateKey = vm.envUint("PRIVATE_KEY"); - vm.startBroadcast(deployerPrivateKey); - - address arbTokenForwarder = gatewayContract.forwarderAddresses( - gatewayContract.superTokenLockable(), - 421614 - ); - address arbHookForwarder = gatewayContract.forwarderAddresses( - gatewayContract.limitHook(), - 421614 - ); - address optTokenForwarder = gatewayContract.forwarderAddresses( - gatewayContract.superTokenLockable(), - 11155420 - ); - address optHookForwarder = gatewayContract.forwarderAddresses( - gatewayContract.limitHook(), - 11155420 - ); - address arbOnChainToken = gatewayContract.getOnChainAddress( - gatewayContract.superTokenLockable(), - 421614 - ); - address optOnChainToken = gatewayContract.getOnChainAddress( - gatewayContract.superTokenLockable(), - 11155420 - ); - console.log("arbTokenForwarder"); - console.logAddress(arbTokenForwarder); - console.log("arbHookForwarder"); - console.logAddress(arbHookForwarder); - console.log("arbOnChainToken"); - console.logAddress(arbOnChainToken); - console.log("optTokenForwarder"); - console.logAddress(optTokenForwarder); - console.log("optHookForwarder"); - console.logAddress(optHookForwarder); - console.log("optOnChainToken"); - console.logAddress(optOnChainToken); - if ( - arbTokenForwarder == address(0) || - optTokenForwarder == address(0) || - arbHookForwarder == address(0) || - optHookForwarder == address(0) - ) { - revert("Forwarder not found"); - } - SuperTokenLockableAppGateway.UserOrder memory order = SuperTokenLockableAppGateway - .UserOrder({ - srcToken: arbTokenForwarder, - dstToken: optTokenForwarder, - user: owner, - srcAmount: 1000, - deadline: block.timestamp + 1 days - }); - console.log(order.srcToken); - console.log(order.dstToken); - console.log(order.user); - console.log(order.srcAmount); - console.log(order.deadline); - - // bytes memory payload = abi.encodeWithSelector( - // bytes4(keccak256("bridge(UserOrder)")), - // order - // ); - // console.logBytes(payload); - gatewayContract.bridge(abi.encode(order)); - } -} diff --git a/script/super-token-lockable/DeployContracts.s.sol b/script/super-token-lockable/DeployContracts.s.sol deleted file mode 100644 index df001e0f..00000000 --- a/script/super-token-lockable/DeployContracts.s.sol +++ /dev/null @@ -1,23 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Script} from "forge-std/Script.sol"; -import {console} from "forge-std/console.sol"; -import {SuperTokenLockableAppGateway} from "../../test/apps/app-gateways/super-token-lockable/SuperTokenLockableAppGateway.sol"; -import {SuperTokenLockable} from "../../test/apps/app-gateways/super-token-lockable/SuperTokenLockable.sol"; -import {Fees} from "../../contracts/protocol/utils/common/Structs.sol"; -import {ETH_ADDRESS} from "../../contracts/protocol/utils/common/Constants.sol"; - -contract DeployContracts is Script { - function run() external { - SuperTokenLockableAppGateway gateway = SuperTokenLockableAppGateway( - vm.envAddress("APP_GATEWAY") - ); - string memory rpc = vm.envString("EVMX_RPC"); - vm.createSelectFork(rpc); - uint256 deployerPrivateKey = vm.envUint("PRIVATE_KEY"); - vm.startBroadcast(deployerPrivateKey); - gateway.deployContracts(84532); - gateway.deployContracts(11155111); - } -} diff --git a/script/super-token-lockable/DeployGateway.s.sol b/script/super-token-lockable/DeployGateway.s.sol deleted file mode 100644 index 8a2be2a8..00000000 --- a/script/super-token-lockable/DeployGateway.s.sol +++ /dev/null @@ -1,54 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Script} from "forge-std/Script.sol"; -import {console} from "forge-std/console.sol"; -import {SuperTokenLockableAppGateway} from "../../test/apps/app-gateways/super-token-lockable/SuperTokenLockableAppGateway.sol"; -import {SuperTokenLockable} from "../../test/apps/app-gateways/super-token-lockable/SuperTokenLockable.sol"; -import {Fees} from "../../contracts/protocol/utils/common/Structs.sol"; -import {ETH_ADDRESS, FAST} from "../../contracts/protocol/utils/common/Constants.sol"; - -contract DeployGateway is Script { - function run() external { - address addressResolver = vm.envAddress("ADDRESS_RESOLVER"); - address auctionManager = vm.envAddress("AUCTION_MANAGER"); - address owner = vm.envAddress("SUPERTOKEN_OWNER"); - string memory rpc = vm.envString("EVMX_RPC"); - vm.createSelectFork(rpc); - uint256 deployerPrivateKey = vm.envUint("PRIVATE_KEY"); - vm.startBroadcast(deployerPrivateKey); - - Fees memory fees = Fees({ - feePoolChain: 421614, - feePoolToken: ETH_ADDRESS, - amount: 0.001 ether - }); - - SuperTokenLockableAppGateway gateway = new SuperTokenLockableAppGateway( - addressResolver, - address(auctionManager), - owner, - FAST, - fees, - SuperTokenLockableAppGateway.ConstructorParams({ - _burnLimit: 1000000000 ether, - _mintLimit: 1000000000 ether, - name_: "SUPER TOKEN", - symbol_: "SUPER", - decimals_: 18, - initialSupplyHolder_: owner, - initialSupply_: 1000000000 ether - }) - ); - - bytes32 superToken = gateway.superTokenLockable(); - bytes32 limitHook = gateway.limitHook(); - - console.log("Contracts deployed:"); - console.log("SuperTokenLockableAppGateway:", address(gateway)); - console.log("SuperTokenLockableId:"); - console.logBytes32(superToken); - console.log("LimitHookId:"); - console.logBytes32(limitHook); - } -} diff --git a/script/super-token/Bridge.s.sol b/script/super-token/Bridge.s.sol deleted file mode 100644 index a5e8aed9..00000000 --- a/script/super-token/Bridge.s.sol +++ /dev/null @@ -1,32 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Script} from "forge-std/Script.sol"; -import {SuperTokenAppGateway} from "../../test/apps/app-gateways/super-token/SuperTokenAppGateway.sol"; - -contract Bridge is Script { - struct UserOrder { - address srcToken; - address dstToken; - address user; - uint256 srcAmount; - uint256 deadline; - } - - function run() external { - vm.startBroadcast(); - - UserOrder memory order = UserOrder({ - srcToken: 0x047Db07E30809f87CABA2E552585F9A727a074ED, - dstToken: 0x4545C7bc6347945e7bfda082a2A0033cE4C7CEae, - user: 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266, - srcAmount: 1000, - deadline: block.timestamp + 1 days - }); - - SuperTokenAppGateway gateway = SuperTokenAppGateway( - 0xb1F4CbFCE786aA8B553796Fb06c04Dd461967A16 - ); - gateway.transfer(abi.encode(order)); - } -} diff --git a/script/super-token/DeployContracts.s.sol b/script/super-token/DeployContracts.s.sol deleted file mode 100644 index d007bcc3..00000000 --- a/script/super-token/DeployContracts.s.sol +++ /dev/null @@ -1,20 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Script} from "forge-std/Script.sol"; -import {console} from "forge-std/console.sol"; -import {SuperTokenAppGateway} from "../../test/apps/app-gateways/super-token/SuperTokenAppGateway.sol"; -import {SuperToken} from "../../test/apps/app-gateways/super-token/SuperToken.sol"; -import {Fees} from "../../contracts/protocol/utils/common/Structs.sol"; -import {ETH_ADDRESS} from "../../contracts/protocol/utils/common/Constants.sol"; - -contract DeployContracts is Script { - function run() external { - vm.startBroadcast(); - SuperTokenAppGateway deployer = SuperTokenAppGateway( - 0x02520426a04D2943d817A60ABa37ab25bA10e630 - ); - deployer.deployContracts(84532); - deployer.deployContracts(11155111); - } -} diff --git a/script/super-token/DeployGateway.s.sol b/script/super-token/DeployGateway.s.sol deleted file mode 100644 index 61df966a..00000000 --- a/script/super-token/DeployGateway.s.sol +++ /dev/null @@ -1,47 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {Script} from "forge-std/Script.sol"; -import {console} from "forge-std/console.sol"; -import {SuperTokenAppGateway} from "../../test/apps/app-gateways/super-token/SuperTokenAppGateway.sol"; -import {SuperToken} from "../../test/apps/app-gateways/super-token/SuperToken.sol"; -import {Fees} from "../../contracts/protocol/utils/common/Structs.sol"; -import {ETH_ADDRESS, FAST} from "../../contracts/protocol/utils/common/Constants.sol"; - -contract DeployGateway is Script { - function run() external { - vm.startBroadcast(); - - address addressResolver = vm.envAddress("ADDRESS_RESOLVER"); - address auctionManager = vm.envAddress("AUCTION_MANAGER"); - address owner = vm.envAddress("OWNER"); - - Fees memory fees = Fees({ - feePoolChain: 421614, - feePoolToken: ETH_ADDRESS, - amount: 0.001 ether - }); - - SuperTokenAppGateway gateway = new SuperTokenAppGateway( - addressResolver, - address(auctionManager), - owner, - FAST, - fees, - SuperTokenAppGateway.ConstructorParams({ - name_: "SuperToken", - symbol_: "SUPER", - decimals_: 18, - initialSupplyHolder_: owner, - initialSupply_: 1000000000000000000000000 - }) - ); - - bytes32 superToken = gateway.superToken(); - - console.log("Contracts deployed:"); - console.log("SuperTokenAppGateway:", address(gateway)); - console.log("SuperTokenId:"); - console.logBytes32(superToken); - } -} From 0dfa529f32116d7a6f814652690f7f79faa2e0c9 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Thu, 27 Feb 2025 16:20:17 +0400 Subject: [PATCH 169/186] fix: build --- contracts/interfaces/IERC20.sol | 33 ------------------- script/admin/mock/DeployEVMx.s.sol | 3 +- script/admin/mock/DeploySocket.s.sol | 3 +- script/helpers/AppGatewayFeeBalance.s.sol | 6 ++-- script/helpers/PayFeesInArbitrumETH.s.sol | 6 ++-- test/Migration.t.sol | 2 +- .../SuperTokenLockableAppGateway.sol | 2 +- .../app-gateways/super-token}/ISuperToken.sol | 0 .../super-token/SuperTokenAppGateway.sol | 2 +- test/{ => mock}/MockWatcherPrecompileImpl.sol | 2 +- 10 files changed, 12 insertions(+), 47 deletions(-) delete mode 100644 contracts/interfaces/IERC20.sol rename {contracts/interfaces => test/apps/app-gateways/super-token}/ISuperToken.sol (100%) rename test/{ => mock}/MockWatcherPrecompileImpl.sol (89%) diff --git a/contracts/interfaces/IERC20.sol b/contracts/interfaces/IERC20.sol deleted file mode 100644 index 8810365c..00000000 --- a/contracts/interfaces/IERC20.sol +++ /dev/null @@ -1,33 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.8.0; - -/// @notice Modern and gas efficient ERC20 + EIP-2612 implementation. -interface IERC20 { - /*////////////////////////////////////////////////////////////// - EVENTS - //////////////////////////////////////////////////////////////*/ - - event Transfer(address indexed from, address indexed to, uint256 amount); - - event Approval(address indexed owner, address indexed spender, uint256 amount); - - /*////////////////////////////////////////////////////////////// - ERC20 STORAGE - //////////////////////////////////////////////////////////////*/ - - function totalSupply() external view returns (uint256); - - function balanceOf(address account_) external view returns (uint256); - - function allowance(address owner_, address spender_) external view returns (uint256); - - /*////////////////////////////////////////////////////////////// - ERC20 LOGIC - //////////////////////////////////////////////////////////////*/ - - function approve(address spender_, uint256 amount_) external returns (bool); - - function transfer(address to_, uint256 amount_) external returns (bool); - - function transferFrom(address from_, address to_, uint256 amount_) external returns (bool); -} diff --git a/script/admin/mock/DeployEVMx.s.sol b/script/admin/mock/DeployEVMx.s.sol index 4ed43b5b..e3f71807 100644 --- a/script/admin/mock/DeployEVMx.s.sol +++ b/script/admin/mock/DeployEVMx.s.sol @@ -3,8 +3,7 @@ pragma solidity ^0.8.0; import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/console.sol"; -import {MockWatcherPrecompile} from "../../test/mock/MockWatcherPrecompile.sol"; -import {MockSocket} from "../../test/mock/MockSocket.sol"; +import {MockWatcherPrecompile} from "../../../test/mock/MockWatcherPrecompile.sol"; contract DeployEVMx is Script { function run() external { diff --git a/script/admin/mock/DeploySocket.s.sol b/script/admin/mock/DeploySocket.s.sol index 56291966..603d8eea 100644 --- a/script/admin/mock/DeploySocket.s.sol +++ b/script/admin/mock/DeploySocket.s.sol @@ -3,8 +3,7 @@ pragma solidity ^0.8.0; import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/console.sol"; -import {MockWatcherPrecompile} from "../../test/mock/MockWatcherPrecompile.sol"; -import {MockSocket} from "../../test/mock/MockSocket.sol"; +import {MockSocket} from "../../../test/mock/MockSocket.sol"; contract DeploySocket is Script { function run() external { diff --git a/script/helpers/AppGatewayFeeBalance.s.sol b/script/helpers/AppGatewayFeeBalance.s.sol index cb773904..6637a83b 100644 --- a/script/helpers/AppGatewayFeeBalance.s.sol +++ b/script/helpers/AppGatewayFeeBalance.s.sol @@ -3,9 +3,9 @@ pragma solidity ^0.8.0; import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/console.sol"; -import {FeesManager} from "../contracts/protocol/payload-delivery/FeesManager.sol"; -import {Fees} from "../contracts/protocol/utils/common/Structs.sol"; -import {ETH_ADDRESS} from "../contracts/protocol/utils/common/Constants.sol"; +import {FeesManager} from "../../contracts/protocol/payload-delivery/FeesManager.sol"; +import {Fees} from "../../contracts/protocol/utils/common/Structs.sol"; +import {ETH_ADDRESS} from "../../contracts/protocol/utils/common/Constants.sol"; contract CheckDepositedFees is Script { function run() external { diff --git a/script/helpers/PayFeesInArbitrumETH.s.sol b/script/helpers/PayFeesInArbitrumETH.s.sol index ff3ff1be..50da4fc1 100644 --- a/script/helpers/PayFeesInArbitrumETH.s.sol +++ b/script/helpers/PayFeesInArbitrumETH.s.sol @@ -3,9 +3,9 @@ pragma solidity ^0.8.0; import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/console.sol"; -import {FeesPlug} from "../contracts/protocol/payload-delivery/FeesPlug.sol"; -import {Fees} from "../contracts/protocol/utils/common/Structs.sol"; -import {ETH_ADDRESS} from "../contracts/protocol/utils/common/Constants.sol"; +import {FeesPlug} from "../../contracts/protocol/payload-delivery/FeesPlug.sol"; +import {Fees} from "../../contracts/protocol/utils/common/Structs.sol"; +import {ETH_ADDRESS} from "../../contracts/protocol/utils/common/Constants.sol"; contract DepositFees is Script { function run() external { diff --git a/test/Migration.t.sol b/test/Migration.t.sol index e073092b..17ffb944 100644 --- a/test/Migration.t.sol +++ b/test/Migration.t.sol @@ -6,7 +6,7 @@ import "../contracts/protocol/AddressResolver.sol"; import "../contracts/protocol/watcherPrecompile/WatcherPrecompile.sol"; import "../contracts/protocol/Forwarder.sol"; import "../contracts/protocol/AsyncPromise.sol"; -import "./MockWatcherPrecompileImpl.sol"; +import "./mock/MockWatcherPrecompileImpl.sol"; contract MigrationTest is SetupTest { // ERC1967Factory emits this event with both proxy and implementation addresses diff --git a/test/apps/app-gateways/super-token-lockable/SuperTokenLockableAppGateway.sol b/test/apps/app-gateways/super-token-lockable/SuperTokenLockableAppGateway.sol index a1b3c125..cb9fb514 100644 --- a/test/apps/app-gateways/super-token-lockable/SuperTokenLockableAppGateway.sol +++ b/test/apps/app-gateways/super-token-lockable/SuperTokenLockableAppGateway.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.21; import "solady/auth/Ownable.sol"; -import {ISuperToken} from "../../../../contracts/interfaces/ISuperToken.sol"; +import {ISuperToken} from "../super-token/ISuperToken.sol"; import "../../../../contracts/base/AppGatewayBase.sol"; import "./SuperTokenLockable.sol"; import "./LimitHook.sol"; diff --git a/contracts/interfaces/ISuperToken.sol b/test/apps/app-gateways/super-token/ISuperToken.sol similarity index 100% rename from contracts/interfaces/ISuperToken.sol rename to test/apps/app-gateways/super-token/ISuperToken.sol diff --git a/test/apps/app-gateways/super-token/SuperTokenAppGateway.sol b/test/apps/app-gateways/super-token/SuperTokenAppGateway.sol index a73b8e39..1b73ac90 100644 --- a/test/apps/app-gateways/super-token/SuperTokenAppGateway.sol +++ b/test/apps/app-gateways/super-token/SuperTokenAppGateway.sol @@ -3,7 +3,7 @@ pragma solidity ^0.8.21; import "solady/auth/Ownable.sol"; import "../../../../contracts/base/AppGatewayBase.sol"; -import "../../../../contracts/interfaces/ISuperToken.sol"; +import "./ISuperToken.sol"; import "./SuperToken.sol"; contract SuperTokenAppGateway is AppGatewayBase, Ownable { diff --git a/test/MockWatcherPrecompileImpl.sol b/test/mock/MockWatcherPrecompileImpl.sol similarity index 89% rename from test/MockWatcherPrecompileImpl.sol rename to test/mock/MockWatcherPrecompileImpl.sol index 5e92693a..0298e103 100644 --- a/test/MockWatcherPrecompileImpl.sol +++ b/test/mock/MockWatcherPrecompileImpl.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -import "../contracts/protocol/watcherPrecompile/WatcherPrecompile.sol"; +import "../../contracts/protocol/watcherPrecompile/WatcherPrecompile.sol"; contract MockWatcherPrecompileImpl is WatcherPrecompile { // Mock function to test reinitialization with version 2 From da0024888e1acaf34b0fc0fee7626b6c24b1a45e Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Thu, 27 Feb 2025 16:22:20 +0400 Subject: [PATCH 170/186] rm: tx status script --- script/transactionStatus.js | 138 ------------------------------------ 1 file changed, 138 deletions(-) delete mode 100644 script/transactionStatus.js diff --git a/script/transactionStatus.js b/script/transactionStatus.js deleted file mode 100644 index ca27bb7c..00000000 --- a/script/transactionStatus.js +++ /dev/null @@ -1,138 +0,0 @@ -const fs = require('fs'); -const path = require('path'); - -// Read script name from command-line arguments -const scriptName = process.argv[2]; // The argument passed to the script -if (!scriptName) { - console.error('Usage: node checkTransactions.js '); - console.error('Example: node checkTransactions.js deployOnchain'); - process.exit(1); -} - -// Construct the JSON file path dynamically -const jsonFilePath = path.join('broadcast', `${scriptName}.s.sol`, '7625382', 'run-latest.json'); - -// Validate that the file exists -if (!fs.existsSync(jsonFilePath)) { - console.error(`Error: File not found at path '${jsonFilePath}'.`); - process.exit(1); -} - -// Load JSON file -const jsonData = JSON.parse(fs.readFileSync(jsonFilePath, 'utf-8')); - -// Extract transaction hashes -const transactions = jsonData.transactions.map((tx) => tx.hash); -console.log(`Found ${transactions.length} transactions to process.`); - -const apiUrl = 'https://apiv2.dev.socket.tech/getDetailsByTxHash?txHash='; -let intervalId; - -// Track statuses for each hash -let statusTracker = transactions.map((hash) => ({ - hash, - status: 'PENDING', - printed: false, - printedPayloads: new Set(), -})); -let allDonePrinted = false; // Prevent multiple prints of the final message - -// Function to perform API requests -const fetchTransactionStatus = async (hash) => { - try { - const response = await fetch(`${apiUrl}${hash}`); - if (!response.ok) throw new Error(`HTTP Error: ${response.status}`); - const data = await response.json(); - return data; - } catch (error) { - console.error(`Error fetching status for hash ${hash}: ${error.message}`); - return null; // Handle errors gracefully - } -}; - -const processMultiplePayloads = (payloads, tx) => { - if (payloads.length > 1) { - payloads.forEach((payload) => { - // Create a unique key for the payload to track printed status - const payloadKey = `${payload.executeDetails.executeTxHash}-${payload.callBackDetails.callbackStatus}`; - - if ( - payload.callBackDetails.callbackStatus === 'PROMISE_RESOLVED' && - payload.executeDetails.executeTxHash && - !tx.printedPayloads.has(payloadKey) - ) { - console.log( - `Hash: ${payload.executeDetails.executeTxHash}, Status: ${payload.callBackDetails.callbackStatus}, ChainId: ${payload.chainSlug}`, - ); - - tx.printedPayloads.add(payloadKey); - } - }); - } -}; - -// Function to check transaction status -const checkTransactionStatus = async () => { - let allCompleted = true; - for (let i = 0; i < statusTracker.length; i++) { - const tx = statusTracker[i]; - - // Skip already printed transactions - if (tx.status === 'COMPLETED' && tx.printed) continue; - - const data = await fetchTransactionStatus(tx.hash); - - if (data && data.status === 'SUCCESS') { - if (data.response.length === 0) { - if (tx.printed === false) { - console.log(`Hash: ${tx.hash}, There are no logs for this transaction hash.`); - tx.status = 'NO_LOGS'; - tx.printed = true; - continue; - } else { - continue; - } - } - - const transactionResponse = data.response[0]; // First response object - const status = transactionResponse.status || 'UNKNOWN'; - const payloads = transactionResponse.payloads || []; - - // Update tracker - tx.status = status; - if (status === 'COMPLETED' && !tx.printed) { - processMultiplePayloads(payloads, tx); - - const deployerDetails = payloads[0].deployerDetails || {}; - - if (Object.keys(deployerDetails).length !== 0) { - console.log(`Hash: ${tx.hash}, Status: ${status}, ChainId: ${payloads[0].chainSlug}`); - console.log(`OnChainAddress: ${deployerDetails.onChainAddress}`); - console.log(`ForwarderAddress: ${deployerDetails.forwarderAddress}`); - } else { - console.log(`Hash: ${tx.hash}, Status: ${status}, ChainId: 7625382`); - } - - tx.printed = true; - } else if (status === 'IN_PROGRESS') { - processMultiplePayloads(payloads, tx); - } - } else { - console.error(`Invalid or empty response for hash: ${tx.hash}`); - } - - // Check if any are still pending - if (tx.status !== 'COMPLETED' && tx.status !== 'NO_LOGS') allCompleted = false; - } - - // Stop script and print final message if all transactions are COMPLETED - if (allCompleted && !allDonePrinted) { - console.log('All transactions are COMPLETED. Stopping script.'); - allDonePrinted = true; // Prevent duplicate final messages - clearInterval(intervalId); - } -}; - -// Start periodic polling every second -console.log('Starting to monitor transaction statuses...'); -intervalId = setInterval(checkTransactionStatus, 2000); From 62598ace3aba5a3f3a3512e577070bf57f17e9ce Mon Sep 17 00:00:00 2001 From: Rookmate <14072042+rookmate@users.noreply.github.com> Date: Thu, 27 Feb 2025 16:25:48 +0000 Subject: [PATCH 171/186] Rename scripts --- .../{deployEVMxCounterApp.s.sol => DeployEVMxCounterApp.s.sol} | 0 .../{deployOnchainCounters.s.sol => DeployOnchainCounters.s.sol} | 0 script/{helpers => counter}/WithdrawFeesArbitrumFeesPlug.s.sol | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename script/counter/{deployEVMxCounterApp.s.sol => DeployEVMxCounterApp.s.sol} (100%) rename script/counter/{deployOnchainCounters.s.sol => DeployOnchainCounters.s.sol} (100%) rename script/{helpers => counter}/WithdrawFeesArbitrumFeesPlug.s.sol (100%) diff --git a/script/counter/deployEVMxCounterApp.s.sol b/script/counter/DeployEVMxCounterApp.s.sol similarity index 100% rename from script/counter/deployEVMxCounterApp.s.sol rename to script/counter/DeployEVMxCounterApp.s.sol diff --git a/script/counter/deployOnchainCounters.s.sol b/script/counter/DeployOnchainCounters.s.sol similarity index 100% rename from script/counter/deployOnchainCounters.s.sol rename to script/counter/DeployOnchainCounters.s.sol diff --git a/script/helpers/WithdrawFeesArbitrumFeesPlug.s.sol b/script/counter/WithdrawFeesArbitrumFeesPlug.s.sol similarity index 100% rename from script/helpers/WithdrawFeesArbitrumFeesPlug.s.sol rename to script/counter/WithdrawFeesArbitrumFeesPlug.s.sol From 6f6ddca93bd4393554934d0c83e19bfa106c9e7e Mon Sep 17 00:00:00 2001 From: Rookmate <14072042+rookmate@users.noreply.github.com> Date: Thu, 27 Feb 2025 16:27:27 +0000 Subject: [PATCH 172/186] Remove unused input params and variables --- test/DeliveryHelper.t.sol | 9 ++------- test/apps/SuperTokenLockable.t.sol | 2 +- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/test/DeliveryHelper.t.sol b/test/DeliveryHelper.t.sol index 4135b3fc..04dc0d3e 100644 --- a/test/DeliveryHelper.t.sol +++ b/test/DeliveryHelper.t.sol @@ -352,16 +352,11 @@ contract DeliveryHelperTest is SetupTest { watcherPrecompile.setAppGateways(gateways, signatureNonce++, watcherSignature); } - function _executeReadBatchSingleChain( - uint32 chainSlug_, - uint256 totalPayloads - ) internal returns (bytes32 asyncId) { + function _executeReadBatchSingleChain() internal returns (bytes32 asyncId) { asyncId = getNextAsyncId(); } - function _executeReadBatchMultiChain( - uint32[] memory chainSlugs_ - ) internal returns (bytes32 asyncId) { + function _executeReadBatchMultiChain() internal returns (bytes32 asyncId) { asyncId = getNextAsyncId(); } diff --git a/test/apps/SuperTokenLockable.t.sol b/test/apps/SuperTokenLockable.t.sol index 749a3067..aee20b19 100644 --- a/test/apps/SuperTokenLockable.t.sol +++ b/test/apps/SuperTokenLockable.t.sol @@ -323,7 +323,6 @@ contract SuperTokenLockableTest is DeliveryHelperTest { vm.expectEmit(true, true, false, true); emit BatchCancelled(bridgeAsyncId); finalizeQuery(payloadIds[1], abi.encode(0.001 ether)); - bytes32 cancelAsyncId = getNextAsyncId(); bytes32[] memory cancelPayloadIds = new bytes32[](1); uint32 srcChainSlug = IForwarder(userOrder.srcToken).getChainSlug(); @@ -334,6 +333,7 @@ contract SuperTokenLockableTest is DeliveryHelperTest { payloadIdCounter++ ); + // bytes32 cancelAsyncId = getNextAsyncId(); // bidAndEndAuction(cancelAsyncId); // finalizeAndExecute( // cancelPayloadIds[0], From b6c58fd23b5bf521139ae30a650726783b41adf3 Mon Sep 17 00:00:00 2001 From: Rookmate <14072042+rookmate@users.noreply.github.com> Date: Thu, 27 Feb 2025 16:28:08 +0000 Subject: [PATCH 173/186] Restrict mutability to view --- test/Storage.t.sol | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/test/Storage.t.sol b/test/Storage.t.sol index d5e91d60..25b684e0 100644 --- a/test/Storage.t.sol +++ b/test/Storage.t.sol @@ -10,13 +10,13 @@ contract StorageTest is DeliveryHelperTest { setUpDeliveryHelper(); } - function testAddressResolverSlot() public { + function testAddressResolverSlot() public view { // Test AddressResolver version at slot 59 bytes32 versionSlot = vm.load(address(addressResolver), bytes32(uint256(59))); assertEq(uint64(uint256(versionSlot)), 1); } - function testWatcherPrecompileSlot() public { + function testWatcherPrecompileSlot() public view { // Test AddressResolver address at slot 109 in WatcherPrecompile bytes32 slotValue = vm.load(address(watcherPrecompile), bytes32(uint256(52))); assertEq(uint256(slotValue), evmxSlug); @@ -25,7 +25,7 @@ contract StorageTest is DeliveryHelperTest { assertEq(address(uint160(uint256(slotValue))), address(addressResolver)); } - function testFeesManagerSlot() public { + function testFeesManagerSlot() public view { bytes32 slotValue = vm.load(address(feesManager), bytes32(uint256(51))); assertEq(uint32(uint256(slotValue)), evmxSlug); @@ -33,7 +33,7 @@ contract StorageTest is DeliveryHelperTest { assertEq(address(uint160(uint256(slotValue))), address(addressResolver)); } - function testAuctionManagerSlot() public { + function testAuctionManagerSlot() public view { bytes32 slotValue = vm.load(address(auctionManager), bytes32(uint256(50))); assertEq(uint32(uint256(slotValue)), evmxSlug); @@ -65,7 +65,7 @@ contract StorageTest is DeliveryHelperTest { assertEq(address(uint160(uint256(slotValue))), address(addressResolver)); } - function testDeliveryHelperSlot() public { + function testDeliveryHelperSlot() public view { bytes32 slotValue = vm.load(address(deliveryHelper), bytes32(uint256(50))); assertEq(uint256(uint256(slotValue)), 0); From b47360cf123eb1802d6e1e47d3c16bc05c1287f7 Mon Sep 17 00:00:00 2001 From: Rookmate <14072042+rookmate@users.noreply.github.com> Date: Thu, 27 Feb 2025 16:31:35 +0000 Subject: [PATCH 174/186] Add empty pre-commit --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index 8529f8ac..505ed586 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,7 @@ "compile": "forge build", "deploy": "bash setupInfraContracts.sh" }, + "pre-commit": [], "author": "", "license": "ISC", "devDependencies": { From 334a8df6dfbc55b8b96d48dde426e5c0289c1e13 Mon Sep 17 00:00:00 2001 From: Rookmate <14072042+rookmate@users.noreply.github.com> Date: Thu, 27 Feb 2025 18:33:28 +0000 Subject: [PATCH 175/186] Update devnet details --- .env.sample | 10 +++++----- foundry.toml | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.env.sample b/.env.sample index 607b51c5..a5db2d93 100644 --- a/.env.sample +++ b/.env.sample @@ -1,5 +1,5 @@ # RPCs -EVMX_RPC="https://rpc.evmx.socket.tech" +EVMX_RPC="https://rpc-evmx-devnet.socket.tech/" SEPOLIA_RPC="https://rpc.ankr.com/eth_sepolia/" ARBITRUM_SEPOLIA_RPC="https://rpc.ankr.com/arbitrum_sepolia" OPTIMISM_SEPOLIA_RPC="https://rpc.ankr.com/optimism_sepolia" @@ -7,10 +7,10 @@ BASE_SEPOLIA_RPC="https://rpc.ankr.com/base_sepolia" # EVMx key addresses # Find the most up to date addresses in deployments/dev_addresses.json -ADDRESS_RESOLVER="0x7480D8D4B1929e751984b01eE877A9D65e1F3737" -AUCTION_MANAGER="0x50E5140d3601812Dc11f49a39CF9520567731c82" -ARBITRUM_FEES_PLUG="0xa08Dac27E27c49A2535b36064c370e6e8B3A0B9a" -FEES_MANAGER="0x80bEc58A00993dc874Ab2fAe56621af24eF06bA5" +ADDRESS_RESOLVER="0xc4AC8186Dac133Cf132bb9FC7e2675e482670047" +AUCTION_MANAGER="0x6e156147B6fe75310D001d0eb0598173FBFB98E4" +FEES_MANAGER="0x9C92cC886Fe92f7700d045580d85A4D2BF3Ebf01" +ARBITRUM_FEES_PLUG="0x89324F93d852cB4fcDC4Ee202456be466ce096bb" # Add your deployer private key here # or remove it from this file if it is already an env var diff --git a/foundry.toml b/foundry.toml index 2b0a2d73..3ab24952 100644 --- a/foundry.toml +++ b/foundry.toml @@ -10,6 +10,6 @@ evm_version = 'paris' # See more config options https://github.com/foundry-rs/foundry/blob/master/crates/config/README.md#all-options [etherscan] -7625382 = { key = "empty", url = "https://evms.cloud.blockscout.com/api?" } +43 = { key = "empty", url = "https://evmx.cloud.blockscout.com/api?" } 421614 = { key = "${ARBISCAN_API_KEY}", url = "https://api-sepolia.arbiscan.io/api?" } 11155420 = { key = "${OPTIMISM_API_KEY}", url = "https://optimism-sepolia.blockscout.com/api?" } From 7aefa5b786cd55b438cb8abaef66b14a9e7dc1a7 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Fri, 28 Feb 2025 13:26:33 +0400 Subject: [PATCH 176/186] fix: ignore address(0) promise --- contracts/base/ProxyFactory.sol | 2 +- .../protocol/payload-delivery/app-gateway/DeliveryHelper.sol | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/contracts/base/ProxyFactory.sol b/contracts/base/ProxyFactory.sol index d6dd269f..0f903337 100644 --- a/contracts/base/ProxyFactory.sol +++ b/contracts/base/ProxyFactory.sol @@ -4,4 +4,4 @@ import {ERC1967Factory} from "solady/utils/ERC1967Factory.sol"; contract ProxyFactory is ERC1967Factory { constructor() {} -} \ No newline at end of file +} diff --git a/contracts/protocol/payload-delivery/app-gateway/DeliveryHelper.sol b/contracts/protocol/payload-delivery/app-gateway/DeliveryHelper.sol index df7cb9bc..c3e5de15 100644 --- a/contracts/protocol/payload-delivery/app-gateway/DeliveryHelper.sol +++ b/contracts/protocol/payload-delivery/app-gateway/DeliveryHelper.sol @@ -62,6 +62,7 @@ contract DeliveryHelper is BatchAsync { if (payloadBatch.lastBatchPromises.length > 0) { // Check if all promises are resolved for (uint256 i = 0; i < payloadBatch.lastBatchPromises.length; i++) { + if (payloadBatch.lastBatchPromises[i] == address(0)) continue; if (!IPromise(payloadBatch.lastBatchPromises[i]).resolved()) { if (isCallback_) revert PromisesNotResolved(); } From 020ada2e56530079ad12281569c5c02ba6567d5f Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Fri, 28 Feb 2025 13:32:12 +0400 Subject: [PATCH 177/186] fix: default auction manager in delivery helper --- .../app-gateway/BatchAsync.sol | 3 ++ .../app-gateway/DeliveryHelper.sol | 4 ++- .../app-gateway/DeliveryHelperStorage.sol | 7 ++-- test/DeliveryHelper.t.sol | 33 ++++++++++--------- 4 files changed, 28 insertions(+), 19 deletions(-) diff --git a/contracts/protocol/payload-delivery/app-gateway/BatchAsync.sol b/contracts/protocol/payload-delivery/app-gateway/BatchAsync.sol index f4415f3c..be2715a5 100644 --- a/contracts/protocol/payload-delivery/app-gateway/BatchAsync.sol +++ b/contracts/protocol/payload-delivery/app-gateway/BatchAsync.sol @@ -63,6 +63,9 @@ abstract contract BatchAsync is QueueAsync { } // Default flow for other cases (including mixed read/write) + if (auctionManager_ == address(0)) { + auctionManager_ = defaultAuctionManager; + } return _deliverPayload(payloadDetailsArray, fees_, auctionManager_, onCompleteData_); } diff --git a/contracts/protocol/payload-delivery/app-gateway/DeliveryHelper.sol b/contracts/protocol/payload-delivery/app-gateway/DeliveryHelper.sol index c3e5de15..0845e8bd 100644 --- a/contracts/protocol/payload-delivery/app-gateway/DeliveryHelper.sol +++ b/contracts/protocol/payload-delivery/app-gateway/DeliveryHelper.sol @@ -16,11 +16,13 @@ contract DeliveryHelper is BatchAsync { function initialize( address addressResolver_, address owner_, - uint128 bidTimeout_ + uint128 bidTimeout_, + address defaultAuctionManager_ ) public reinitializer(1) { _setAddressResolver(addressResolver_); bidTimeout = bidTimeout_; _initializeOwner(owner_); + defaultAuctionManager = defaultAuctionManager_; } function startBatchProcessing( diff --git a/contracts/protocol/payload-delivery/app-gateway/DeliveryHelperStorage.sol b/contracts/protocol/payload-delivery/app-gateway/DeliveryHelperStorage.sol index 1801385a..c6114807 100644 --- a/contracts/protocol/payload-delivery/app-gateway/DeliveryHelperStorage.sol +++ b/contracts/protocol/payload-delivery/app-gateway/DeliveryHelperStorage.sol @@ -52,6 +52,9 @@ abstract contract DeliveryHelperStorage is IDeliveryHelper { // asyncId => PayloadBatch mapping(bytes32 => PayloadBatch) internal _payloadBatches; - // slots [59-108] reserved for gap - uint256[50] _gap_after; + // slot 59 + address public defaultAuctionManager; + + // slots [60-108] reserved for gap + uint256[49] _gap_after; } diff --git a/test/DeliveryHelper.t.sol b/test/DeliveryHelper.t.sol index 04dc0d3e..7b1ad1f4 100644 --- a/test/DeliveryHelper.t.sol +++ b/test/DeliveryHelper.t.sol @@ -60,22 +60,6 @@ contract DeliveryHelperTest is SetupTest { feesManagerData ); - bytes memory deliveryHelperData = abi.encodeWithSelector( - DeliveryHelper.initialize.selector, - address(addressResolver), - address(feesManagerProxy), - owner, - bidTimeout - ); - - vm.expectEmit(true, true, true, false); - emit Initialized(version); - address deliveryHelperProxy = proxyFactory.deployAndCall( - address(deliveryHelperImpl), - watcherEOA, - deliveryHelperData - ); - bytes memory auctionManagerData = abi.encodeWithSelector( AuctionManager.initialize.selector, evmxSlug, @@ -92,6 +76,23 @@ contract DeliveryHelperTest is SetupTest { auctionManagerData ); + bytes memory deliveryHelperData = abi.encodeWithSelector( + DeliveryHelper.initialize.selector, + address(addressResolver), + address(feesManagerProxy), + owner, + bidTimeout, + address(auctionManagerProxy) + ); + + vm.expectEmit(true, true, true, false); + emit Initialized(version); + address deliveryHelperProxy = proxyFactory.deployAndCall( + address(deliveryHelperImpl), + watcherEOA, + deliveryHelperData + ); + // Assign proxy addresses to contract variables feesManager = FeesManager(address(feesManagerProxy)); deliveryHelper = DeliveryHelper(address(deliveryHelperProxy)); From 8a1b4fc37750f3e63aa8b6a2faafa9774a882988 Mon Sep 17 00:00:00 2001 From: Rookmate <14072042+rookmate@users.noreply.github.com> Date: Fri, 28 Feb 2025 14:01:41 +0000 Subject: [PATCH 178/186] Update EVMx addresses --- .env.sample | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.env.sample b/.env.sample index a5db2d93..8aa9c779 100644 --- a/.env.sample +++ b/.env.sample @@ -7,9 +7,9 @@ BASE_SEPOLIA_RPC="https://rpc.ankr.com/base_sepolia" # EVMx key addresses # Find the most up to date addresses in deployments/dev_addresses.json -ADDRESS_RESOLVER="0xc4AC8186Dac133Cf132bb9FC7e2675e482670047" -AUCTION_MANAGER="0x6e156147B6fe75310D001d0eb0598173FBFB98E4" -FEES_MANAGER="0x9C92cC886Fe92f7700d045580d85A4D2BF3Ebf01" +ADDRESS_RESOLVER="0xf3046B22F98C25305E8040286fB1b33378BA10a1" +AUCTION_MANAGER="0x5d6d4DCb0F719F01441377F633F3EdD186e19360" +FEES_MANAGER="0x603723100172D30171B7Fd9870ba80F8baf6FaD4" ARBITRUM_FEES_PLUG="0x89324F93d852cB4fcDC4Ee202456be466ce096bb" # Add your deployer private key here From 05359805c324fa248b2257dbafdda5d4273cc6da Mon Sep 17 00:00:00 2001 From: Akash Date: Fri, 28 Feb 2025 20:24:14 +0400 Subject: [PATCH 179/186] feat: stage deployment done --- deployments/stage_addresses.json | 49 +++++++- deployments/stage_verification.json | 167 +++++++++++++++++++++++++++- foundry.toml | 6 - hardhat-scripts/config/config.ts | 11 +- hardhat-scripts/deploy/1.deploy.ts | 22 +++- hardhat-scripts/deploy/5.upload.ts | 11 +- testScript.sh | 5 +- 7 files changed, 249 insertions(+), 22 deletions(-) diff --git a/deployments/stage_addresses.json b/deployments/stage_addresses.json index 0967ef42..103ae35c 100644 --- a/deployments/stage_addresses.json +++ b/deployments/stage_addresses.json @@ -1 +1,48 @@ -{} +{ + "43": { + "AddressResolver": "0xf3046B22F98C25305E8040286fB1b33378BA10a1", + "AddressResolverImpl": "0x208dC31cd6042a09bbFDdB31614A337a51b870ba", + "AuctionManager": "0x5d6d4DCb0F719F01441377F633F3EdD186e19360", + "AuctionManagerImpl": "0xF4D3BDe438416938217d4624c82AEbEb46CeD371", + "DeliveryHelper": "0x39bC71cC9AfeeA50B0638532e45b0462A5e62111", + "DeliveryHelperImpl": "0x8F18fC10a8b40b548C6F04Fb252481c783A9ace0", + "ERC1967Factory": "0x47116C0E101C4c1b5f21f0A57A86c0aa3F14D994", + "FeesManager": "0x603723100172D30171B7Fd9870ba80F8baf6FaD4", + "FeesManagerImpl": "0x8662FC08dEC7c61Dd3432fAF45a5bC024BB60B00", + "startBlock": 157, + "WatcherPrecompile": "0x4b5BcB38014cBdf852Ae6429871E0b1Ac0a05Df8", + "WatcherPrecompileImpl": "0x3cf47Ad0F040dFF1208E649C8f8e23e6B5A08916" + }, + "84532": { + "ContractFactoryPlug": "0x693bcDb114a57302Cd687b8Af1bD7583ee56748C", + "FastSwitchboard": "0xf0f51Ba62284A98AbB5D447487d5E6B536DB9B72", + "FeesPlug": "0xe3332D21b49d9347913cca2316FcC1b34fa16914", + "Socket": "0x6D54668ba18B425a1DbFC0BD720145c0aeE97f65", + "SocketBatcher": "0xC559BABEbcD92278E91a545308190E4761efc347", + "startBlock": 22449147 + }, + "421614": { + "ContractFactoryPlug": "0x78E3A5d21d0dB60bf0A585Cc2105043F919A404b", + "FastSwitchboard": "0x1448E643AbA68a0F1E4C5a3996bA2a355ce3EA8B", + "FeesPlug": "0x89324F93d852cB4fcDC4Ee202456be466ce096bb", + "Socket": "0xaFBD45A4D8378Bd2893F46d2f42e912F653B8777", + "SocketBatcher": "0x5966fc2e475Ddd0a098c3eCF1A3A1EF5036eCF7e", + "startBlock": 127843398 + }, + "11155111": { + "ContractFactoryPlug": "0xfaf8a3f8f4221398F3eC765836e8BF4A3d975962", + "FastSwitchboard": "0x0d7994B4aAc7cbdFAFEAED0B9B51E7de0586ec6f", + "FeesPlug": "0x7E33B305e12aD0E73B3aedBE67A53B7818732d7d", + "Socket": "0xe3332D21b49d9347913cca2316FcC1b34fa16914", + "SocketBatcher": "0x693bcDb114a57302Cd687b8Af1bD7583ee56748C", + "startBlock": 7797136 + }, + "11155420": { + "ContractFactoryPlug": "0xaD2b8b14DaF98555A0BFC43e70E3AFD6C0743701", + "FastSwitchboard": "0x19618cB6C20b2512dFC5E207301Af0514B9533FD", + "FeesPlug": "0x09FfC007E730fbfEA6e09dC19396CddB7d329FC1", + "Socket": "0x89366513CA2eAc43B9E7a825D69BE8Fee495Ece5", + "SocketBatcher": "0xC8db322fD39D5c6F30Ca925C32a7986c4eA0c421", + "startBlock": 24431972 + } +} diff --git a/deployments/stage_verification.json b/deployments/stage_verification.json index 0967ef42..030eaa6b 100644 --- a/deployments/stage_verification.json +++ b/deployments/stage_verification.json @@ -1 +1,166 @@ -{} +{ + "43": [ + [ + "0xF4D3BDe438416938217d4624c82AEbEb46CeD371", + "AuctionManager", + "contracts/protocol/payload-delivery/AuctionManager.sol", + [] + ], + [ + "0x8F18fC10a8b40b548C6F04Fb252481c783A9ace0", + "DeliveryHelper", + "contracts/protocol/payload-delivery/app-gateway/DeliveryHelper.sol", + [] + ], + [ + "0x8662FC08dEC7c61Dd3432fAF45a5bC024BB60B00", + "FeesManager", + "contracts/protocol/payload-delivery/FeesManager.sol", + [] + ], + [ + "0x3cf47Ad0F040dFF1208E649C8f8e23e6B5A08916", + "WatcherPrecompile", + "contracts/protocol/watcherPrecompile/WatcherPrecompile.sol", + [] + ], + [ + "0x208dC31cd6042a09bbFDdB31614A337a51b870ba", + "AddressResolver", + "contracts/protocol/AddressResolver.sol", + [] + ], + [ + "0x47116C0E101C4c1b5f21f0A57A86c0aa3F14D994", + "ERC1967Factory", + "lib/solady/src/utils/ERC1967Factory.sol", + [] + ], + [ + "0x12103e799d8887034d4560A960C2410ceE751004", + "AuctionManager", + "contracts/protocol/payload-delivery/AuctionManager.sol", + [] + ], + [ + "0xB08306a7D8733CB027dD679AdbfdF64cD52670eb", + "DeliveryHelper", + "contracts/protocol/payload-delivery/app-gateway/DeliveryHelper.sol", + [] + ], + [ + "0xE3A4c7Fb21196425C635B2b12e90F010BCD12Fec", + "FeesManager", + "contracts/protocol/payload-delivery/FeesManager.sol", + [] + ], + [ + "0x279284d399cFB4cF91f2ebe461f43C6DF020148f", + "WatcherPrecompile", + "contracts/protocol/watcherPrecompile/WatcherPrecompile.sol", + [] + ], + [ + "0x82c52D85543029C618B1F0E2fA5f194D2c4DfA2A", + "AddressResolver", + "contracts/protocol/AddressResolver.sol", + [] + ], + [ + "0xC3a6C7Ae16831b86C084CeC8192A14b6c3b53649", + "ERC1967Factory", + "lib/solady/src/utils/ERC1967Factory.sol", + [] + ] + ], + "84532": [ + [ + "0x693bcDb114a57302Cd687b8Af1bD7583ee56748C", + "ContractFactoryPlug", + "contracts/protocol/payload-delivery/ContractFactoryPlug.sol", + [ + "0x6D54668ba18B425a1DbFC0BD720145c0aeE97f65", + "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18" + ] + ], + [ + "0xe3332D21b49d9347913cca2316FcC1b34fa16914", + "FeesPlug", + "contracts/protocol/payload-delivery/FeesPlug.sol", + [ + "0x6D54668ba18B425a1DbFC0BD720145c0aeE97f65", + "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18" + ] + ], + [ + "0xf0f51Ba62284A98AbB5D447487d5E6B536DB9B72", + "FastSwitchboard", + "contracts/protocol/socket/switchboard/FastSwitchboard.sol", + [ + 84532, + "0x6D54668ba18B425a1DbFC0BD720145c0aeE97f65", + "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18" + ] + ], + [ + "0xC559BABEbcD92278E91a545308190E4761efc347", + "SocketBatcher", + "contracts/protocol/socket/SocketBatcher.sol", + [ + "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18", + "0x6D54668ba18B425a1DbFC0BD720145c0aeE97f65" + ] + ], + [ + "0x6D54668ba18B425a1DbFC0BD720145c0aeE97f65", + "Socket", + "contracts/protocol/socket/Socket.sol", + [ + 84532, + "0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18", + "EVMX" + ] + ] + ], + "421614": [], + "7625382": [ + [ + "0xF4D3BDe438416938217d4624c82AEbEb46CeD371", + "AuctionManager", + "contracts/protocol/payload-delivery/AuctionManager.sol", + [] + ], + [ + "0x8F18fC10a8b40b548C6F04Fb252481c783A9ace0", + "DeliveryHelper", + "contracts/protocol/payload-delivery/app-gateway/DeliveryHelper.sol", + [] + ], + [ + "0x8662FC08dEC7c61Dd3432fAF45a5bC024BB60B00", + "FeesManager", + "contracts/protocol/payload-delivery/FeesManager.sol", + [] + ], + [ + "0x3cf47Ad0F040dFF1208E649C8f8e23e6B5A08916", + "WatcherPrecompile", + "contracts/protocol/watcherPrecompile/WatcherPrecompile.sol", + [] + ], + [ + "0x208dC31cd6042a09bbFDdB31614A337a51b870ba", + "AddressResolver", + "contracts/protocol/AddressResolver.sol", + [] + ], + [ + "0x47116C0E101C4c1b5f21f0A57A86c0aa3F14D994", + "ERC1967Factory", + "lib/solady/src/utils/ERC1967Factory.sol", + [] + ] + ], + "11155111": [], + "11155420": [] +} diff --git a/foundry.toml b/foundry.toml index 2b0a2d73..a252544a 100644 --- a/foundry.toml +++ b/foundry.toml @@ -7,9 +7,3 @@ ffi = true optimizer = true optimizer_runs = 200 evm_version = 'paris' - -# See more config options https://github.com/foundry-rs/foundry/blob/master/crates/config/README.md#all-options -[etherscan] -7625382 = { key = "empty", url = "https://evms.cloud.blockscout.com/api?" } -421614 = { key = "${ARBISCAN_API_KEY}", url = "https://api-sepolia.arbiscan.io/api?" } -11155420 = { key = "${OPTIMISM_API_KEY}", url = "https://optimism-sepolia.blockscout.com/api?" } diff --git a/hardhat-scripts/config/config.ts b/hardhat-scripts/config/config.ts index 00c7985d..6cea0d30 100644 --- a/hardhat-scripts/config/config.ts +++ b/hardhat-scripts/config/config.ts @@ -26,14 +26,19 @@ export const logConfig = () => { export const chains: Array = [ ChainSlug.ARBITRUM_SEPOLIA, ChainSlug.OPTIMISM_SEPOLIA, - ChainSlug.SEPOLIA, + // ChainSlug.SEPOLIA, ChainSlug.BASE_SEPOLIA, ]; - +export const EVM_CHAIN_ID_MAP: Record = { + [DeploymentMode.LOCAL]: 7625382, + [DeploymentMode.DEV]: 7625382, + [DeploymentMode.STAGE]: 43, + [DeploymentMode.PROD]: 3605, +} export const auctionEndDelaySeconds = 0; export const watcher = "0xb62505feacC486e809392c65614Ce4d7b051923b"; export const MAX_FEES = ethers.utils.parseEther("0.001"); -export const EVMX_CHAIN_ID = 7625382; +export const EVMX_CHAIN_ID = EVM_CHAIN_ID_MAP[mode]; export const MAX_LIMIT = 100; export const BID_TIMEOUT = 600; export const EXPIRY_TIME = 300; diff --git a/hardhat-scripts/deploy/1.deploy.ts b/hardhat-scripts/deploy/1.deploy.ts index 1b1353e9..f00e6fad 100644 --- a/hardhat-scripts/deploy/1.deploy.ts +++ b/hardhat-scripts/deploy/1.deploy.ts @@ -1,17 +1,17 @@ import { - ChainSlug, - DeploymentMode, ChainAddressesObj, + ChainSlug } from "@socket.tech/socket-protocol-common"; import { config } from "dotenv"; import { Contract, Signer, Wallet, providers } from "ethers"; +import { formatEther } from "ethers/lib/utils"; import { ethers } from "hardhat"; import { BID_TIMEOUT, EVMX_CHAIN_ID, EXPIRY_TIME, MAX_LIMIT } from "../config"; import { auctionEndDelaySeconds, chains, - mode, logConfig, + mode, } from "../config/config"; import { CORE_CONTRACTS, @@ -32,10 +32,26 @@ let EVMxOwner: string; const main = async () => { logConfig(); + await logBalances(); await deployEVMxContracts(); await deploySocketContracts(); }; +const logBalances = async () => { + const evmxDeployer = new ethers.Wallet(process.env.WATCHER_PRIVATE_KEY as string); + const socketDeployer = new ethers.Wallet(process.env.SOCKET_SIGNER_KEY as string); + let provider = getProviderFromChainSlug(EVMX_CHAIN_ID as ChainSlug); + const evmxBalance = await provider.getBalance(evmxDeployer.address); + console.log(`EVMx Deployer ${evmxDeployer.address} balance on ${EVMX_CHAIN_ID}:`, formatEther(evmxBalance)); + await Promise.all(chains.map(async (chain) => { + const provider = getProviderFromChainSlug(chain); + const socketBalance = await provider.getBalance(socketDeployer.address); + console.log(`Socket Deployer ${socketDeployer.address} balance on ${chain}:`, formatEther(socketBalance)); + })); +}; + + + const deployEVMxContracts = async () => { try { let addresses: DeploymentAddresses; diff --git a/hardhat-scripts/deploy/5.upload.ts b/hardhat-scripts/deploy/5.upload.ts index cd34b7d6..1e08325e 100644 --- a/hardhat-scripts/deploy/5.upload.ts +++ b/hardhat-scripts/deploy/5.upload.ts @@ -8,7 +8,7 @@ import { import { config as dotenvConfig } from "dotenv"; import fs from "fs"; import path from "path"; -import { EVMX_CHAIN_ID, mode } from "../config/config"; +import { EVMX_CHAIN_ID, mode, chains } from "../config/config"; dotenvConfig(); @@ -100,11 +100,8 @@ export let config: S3Config = { }, //@ts-ignore supportedChainSlugs: [ - ChainSlug.ARBITRUM_SEPOLIA, - ChainSlug.OPTIMISM_SEPOLIA, - ChainSlug.SEPOLIA, + ...chains, EVMX_CHAIN_ID, - ChainSlug.BASE_SEPOLIA, ], }; // Read the addresses.json file @@ -141,5 +138,5 @@ async function uploadToS3(data: any, fileName: string = getFileName()) { } // Upload config to S3 -uploadToS3(config, "pocConfig.json"); -// uploadToS3(config); +// uploadToS3(config, "pocConfig.json"); +uploadToS3(config); diff --git a/testScript.sh b/testScript.sh index 456bd718..d1515c5b 100644 --- a/testScript.sh +++ b/testScript.sh @@ -12,8 +12,11 @@ source .env && forge script script/counter/deployEVMxCounterApp.s.sol --broadcas source .env && forge script script/counter/DeployCounterOnchain.s.sol --broadcast --skip-simulation ## set limits for the app gateway using API source .env && cast send $APP_GATEWAY "deployContracts(uint32)" 421614 --private-key $PRIVATE_KEY --legacy --gas-price 0 -source .env && cast send $APP_GATEWAY "incrementCounters(address[])" '[0x18a93d520879524e0c215b64f05914da5883540f]' --private-key $PRIVATE_KEY --legacy --gas-price 0 +cast call $APP_GATEWAY "getOnChainAddress(bytes32,uint32)(address)" 0x5ab1536adcb0c297300e651c684f844c311727059d17eb2be15c313b5839b9eb 421614 +cast call $APP_GATEWAY "forwarderAddresses(bytes32,uint32)(address)" 0x5ab1536adcb0c297300e651c684f844c311727059d17eb2be15c313b5839b9eb 421614 +source .env && cast send $APP_GATEWAY "incrementCounters(address[])" '[0xB491b4b9343471d79d33A7c45Dc4d0a7EA818F93]' --private-key $PRIVATE_KEY --legacy --gas-price 0 source .env && cast send $APP_GATEWAY "readCounters(address[])" '[0x18a93d520879524e0c215b64f05914da5883540f]' --private-key $PRIVATE_KEY --legacy --gas-price 0 +source .env && cast send $APP_GATEWAY "withdrawFeeTokens(uint32,address,uint256,address)" 421614 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE 987793576908782 0x3339Cf48f1F9cf31b6F8c2664d144c7444eBBB18 --private-key $PRIVATE_KEY --legacy --gas-price 0 forge script script/counter/incrementCounters.s.sol --broadcast --skip-simulation forge script script/counter/checkCounters.s.sol --broadcast --skip-simulation From 3727dac033b3544e93fc3673b9a1b6201ce7f54f Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Fri, 28 Feb 2025 14:04:38 +0400 Subject: [PATCH 180/186] feat: take auction manager from addr resolver --- .../protocol/payload-delivery/app-gateway/BatchAsync.sol | 2 +- .../payload-delivery/app-gateway/DeliveryHelper.sol | 4 +--- .../payload-delivery/app-gateway/DeliveryHelperStorage.sol | 7 ++----- 3 files changed, 4 insertions(+), 9 deletions(-) diff --git a/contracts/protocol/payload-delivery/app-gateway/BatchAsync.sol b/contracts/protocol/payload-delivery/app-gateway/BatchAsync.sol index be2715a5..09014b7a 100644 --- a/contracts/protocol/payload-delivery/app-gateway/BatchAsync.sol +++ b/contracts/protocol/payload-delivery/app-gateway/BatchAsync.sol @@ -64,7 +64,7 @@ abstract contract BatchAsync is QueueAsync { // Default flow for other cases (including mixed read/write) if (auctionManager_ == address(0)) { - auctionManager_ = defaultAuctionManager; + auctionManager_ = IAddressResolver(addressResolver__).defaultAuctionManager(); } return _deliverPayload(payloadDetailsArray, fees_, auctionManager_, onCompleteData_); } diff --git a/contracts/protocol/payload-delivery/app-gateway/DeliveryHelper.sol b/contracts/protocol/payload-delivery/app-gateway/DeliveryHelper.sol index 0845e8bd..c3e5de15 100644 --- a/contracts/protocol/payload-delivery/app-gateway/DeliveryHelper.sol +++ b/contracts/protocol/payload-delivery/app-gateway/DeliveryHelper.sol @@ -16,13 +16,11 @@ contract DeliveryHelper is BatchAsync { function initialize( address addressResolver_, address owner_, - uint128 bidTimeout_, - address defaultAuctionManager_ + uint128 bidTimeout_ ) public reinitializer(1) { _setAddressResolver(addressResolver_); bidTimeout = bidTimeout_; _initializeOwner(owner_); - defaultAuctionManager = defaultAuctionManager_; } function startBatchProcessing( diff --git a/contracts/protocol/payload-delivery/app-gateway/DeliveryHelperStorage.sol b/contracts/protocol/payload-delivery/app-gateway/DeliveryHelperStorage.sol index c6114807..1801385a 100644 --- a/contracts/protocol/payload-delivery/app-gateway/DeliveryHelperStorage.sol +++ b/contracts/protocol/payload-delivery/app-gateway/DeliveryHelperStorage.sol @@ -52,9 +52,6 @@ abstract contract DeliveryHelperStorage is IDeliveryHelper { // asyncId => PayloadBatch mapping(bytes32 => PayloadBatch) internal _payloadBatches; - // slot 59 - address public defaultAuctionManager; - - // slots [60-108] reserved for gap - uint256[49] _gap_after; + // slots [59-108] reserved for gap + uint256[50] _gap_after; } From 72a30651a72ffcbe8d0bd28e59dbe83772824a98 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Fri, 28 Feb 2025 17:42:47 +0400 Subject: [PATCH 181/186] feat: alphabetically arrange --- contracts/protocol/utils/common/Structs.sol | 60 +++++++++++---------- 1 file changed, 32 insertions(+), 28 deletions(-) diff --git a/contracts/protocol/utils/common/Structs.sol b/contracts/protocol/utils/common/Structs.sol index 64c03016..3774291b 100644 --- a/contracts/protocol/utils/common/Structs.sol +++ b/contracts/protocol/utils/common/Structs.sol @@ -1,6 +1,8 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.21; +//// ENUMS //// + enum CallType { READ, WRITE, @@ -8,9 +10,9 @@ enum CallType { WITHDRAW } -enum Read { - OFF, - ON +enum IsPlug { + YES, + NO } enum Parallel { @@ -18,11 +20,13 @@ enum Parallel { ON } -enum IsPlug { - YES, - NO +enum Read { + OFF, + ON } +//// STRUCTS //// + struct AppGatewayConfig { address plug; address appGateway; @@ -44,21 +48,25 @@ struct AsyncRequest { address[] next; } +struct AttestAndExecutePayloadParams { + bytes32 payloadId; + bytes32 digest; + address switchboard; + address appGateway; + address target; + uint256 executionGasLimit; + uint256 deadline; + bytes proof; + bytes transmitterSignature; + bytes payload; +} + struct Bid { address transmitter; uint256 fee; bytes extraData; } -struct CallFromChainParams { - bytes32 callId; - bytes32 params; - address plug; - address appGateway; - uint32 chainSlug; - bytes payload; -} - struct CallParams { IsPlug isPlug; address asyncPromise; @@ -72,24 +80,20 @@ struct CallParams { bytes initCallData; } +struct CallFromChainParams { + bytes32 callId; + bytes32 params; + address plug; + address appGateway; + uint32 chainSlug; + bytes payload; +} + struct DeployParams { address contractAddr; bytes bytecode; } -struct AttestAndExecutePayloadParams { - bytes32 payloadId; - bytes32 digest; - address switchboard; - address appGateway; - address target; - uint256 executionGasLimit; - uint256 deadline; - bytes proof; - bytes transmitterSignature; - bytes payload; -} - struct Fees { uint32 feePoolChain; address feePoolToken; From 697894695506578818484261c91a75b96181bd82 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Fri, 28 Feb 2025 14:02:36 +0400 Subject: [PATCH 182/186] feat: add auction manager in addr resolver --- contracts/interfaces/IAddressResolver.sol | 5 +++++ contracts/protocol/AddressResolver.sol | 13 +++++++++++-- test/DeliveryHelper.t.sol | 6 +++--- test/SetupTest.t.sol | 5 ++--- 4 files changed, 21 insertions(+), 8 deletions(-) diff --git a/contracts/interfaces/IAddressResolver.sol b/contracts/interfaces/IAddressResolver.sol index 89f5483a..a495af5d 100644 --- a/contracts/interfaces/IAddressResolver.sol +++ b/contracts/interfaces/IAddressResolver.sol @@ -22,6 +22,11 @@ interface IAddressResolver { /// @dev Returns interface pointing to zero address if not configured function feesManager() external view returns (address); + /// @notice Gets the address of the default auction manager contract + /// @return IAuctionManager The auction manager interface + /// @dev Returns interface pointing to zero address if not configured + function defaultAuctionManager() external view returns (address); + /// @notice Gets the watcher precompile contract interface /// @return IWatcherPrecompile The watcher precompile interface /// @dev Returns interface pointing to zero address if not configured diff --git a/contracts/protocol/AddressResolver.sol b/contracts/protocol/AddressResolver.sol index ab519e9f..82c329f4 100644 --- a/contracts/protocol/AddressResolver.sol +++ b/contracts/protocol/AddressResolver.sol @@ -46,8 +46,11 @@ abstract contract AddressResolverStorage is IAddressResolver { // slot 60 mapping(address => address) public override contractsToGateways; - // slots [61-110] reserved for gap - uint256[50] _gap_after; + // slot 61 + address public override defaultAuctionManager; + + // slots [62-110] reserved for gap + uint256[49] _gap_after; } /// @title AddressResolver Contract @@ -250,6 +253,12 @@ contract AddressResolver is AddressResolverStorage, Initializable, Ownable { feesManager = feesManager_; } + /// @notice Updates the address of the default auction manager + /// @param defaultAuctionManager_ The address of the default auction manager + function setDefaultAuctionManager(address defaultAuctionManager_) external onlyOwner { + defaultAuctionManager = defaultAuctionManager_; + } + /// @notice Updates the address of the watcher precompile contract /// @param watcherPrecompile_ The address of the watcher precompile contract function setWatcherPrecompile(address watcherPrecompile_) external onlyOwner { diff --git a/test/DeliveryHelper.t.sol b/test/DeliveryHelper.t.sol index 7b1ad1f4..88c9a549 100644 --- a/test/DeliveryHelper.t.sol +++ b/test/DeliveryHelper.t.sol @@ -98,11 +98,11 @@ contract DeliveryHelperTest is SetupTest { deliveryHelper = DeliveryHelper(address(deliveryHelperProxy)); auctionManager = AuctionManager(address(auctionManagerProxy)); - hoax(watcherEOA); + vm.startPrank(watcherEOA); addressResolver.setDeliveryHelper(address(deliveryHelper)); - - hoax(watcherEOA); + addressResolver.setDefaultAuctionManager(address(auctionManager)); addressResolver.setFeesManager(address(feesManager)); + vm.stopPrank(); // chain core contracts arbConfig = deploySocket(arbChainSlug); diff --git a/test/SetupTest.t.sol b/test/SetupTest.t.sol index 8103bbd6..fa419020 100644 --- a/test/SetupTest.t.sol +++ b/test/SetupTest.t.sol @@ -140,11 +140,10 @@ contract SetupTest is Test { addressResolver = AddressResolver(address(addressResolverProxy)); watcherPrecompile = WatcherPrecompile(address(watcherPrecompileProxy)); - hoax(watcherEOA); + vm.startPrank(watcherEOA); watcherPrecompile.grantRole(WATCHER_ROLE, watcherEOA); - - hoax(watcherEOA); addressResolver.setWatcherPrecompile(address(watcherPrecompile)); + vm.stopPrank(); } function _createSignature( From 91b51431ae666be54edb393eab79d29646058d74 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Mon, 3 Mar 2025 15:15:10 +0400 Subject: [PATCH 183/186] fix: test and deploy script --- hardhat-scripts/deploy/1.deploy.ts | 8 ++++++++ test/DeliveryHelper.t.sol | 4 +--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/hardhat-scripts/deploy/1.deploy.ts b/hardhat-scripts/deploy/1.deploy.ts index 1b1353e9..2993d915 100644 --- a/hardhat-scripts/deploy/1.deploy.ts +++ b/hardhat-scripts/deploy/1.deploy.ts @@ -156,6 +156,14 @@ const deployEVMxContracts = async () => { deployUtils.signer ); + await updateContractSettings( + addressResolver, + "defaultAuctionManager", + "setDefaultAuctionManager", + deployUtils.addresses[EVMxCoreContracts.AuctionManager], + deployUtils.signer + ); + await updateContractSettings( addressResolver, "watcherPrecompile__", diff --git a/test/DeliveryHelper.t.sol b/test/DeliveryHelper.t.sol index 88c9a549..597c113f 100644 --- a/test/DeliveryHelper.t.sol +++ b/test/DeliveryHelper.t.sol @@ -79,10 +79,8 @@ contract DeliveryHelperTest is SetupTest { bytes memory deliveryHelperData = abi.encodeWithSelector( DeliveryHelper.initialize.selector, address(addressResolver), - address(feesManagerProxy), owner, - bidTimeout, - address(auctionManagerProxy) + bidTimeout ); vm.expectEmit(true, true, true, false); From 0b2e542549fe2c4a3ea825aa4879313e0515c878 Mon Sep 17 00:00:00 2001 From: Ameesha Agrawal Date: Mon, 3 Mar 2025 15:26:51 +0400 Subject: [PATCH 184/186] test: new slot use --- test/Storage.t.sol | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/test/Storage.t.sol b/test/Storage.t.sol index 25b684e0..89b5b3b9 100644 --- a/test/Storage.t.sol +++ b/test/Storage.t.sol @@ -14,6 +14,10 @@ contract StorageTest is DeliveryHelperTest { // Test AddressResolver version at slot 59 bytes32 versionSlot = vm.load(address(addressResolver), bytes32(uint256(59))); assertEq(uint64(uint256(versionSlot)), 1); + + // Test auction manager address at slot 61 in AddressResolver + bytes32 slotValue = vm.load(address(addressResolver), bytes32(uint256(61))); + assertEq(address(uint160(uint256(slotValue))), address(auctionManager)); } function testWatcherPrecompileSlot() public view { From 8c875c218a0ccba3cb62da03627f0ceccaf2f1fb Mon Sep 17 00:00:00 2001 From: Akash Date: Mon, 3 Mar 2025 18:10:03 +0400 Subject: [PATCH 185/186] feat: removed auction manager, sbType from appGatewayBase --- contracts/base/AppGatewayBase.sol | 10 +++++++--- .../payload-delivery/app-gateway/BatchAsync.sol | 3 +++ script/counter/DeployEVMxCounterApp.s.sol | 5 +---- test/FeesTest.t.sol | 2 -- test/Inbox.t.sol | 2 -- test/apps/Counter.t.sol | 2 -- test/apps/ParallelCounter.t.sol | 2 -- test/apps/SuperToken.t.sol | 2 -- test/apps/SuperTokenLockable.t.sol | 2 -- test/apps/app-gateways/counter/CounterAppGateway.sol | 4 +--- .../SuperTokenLockableAppGateway.sol | 4 +--- .../app-gateways/super-token/SuperTokenAppGateway.sol | 4 +--- 12 files changed, 14 insertions(+), 28 deletions(-) diff --git a/contracts/base/AppGatewayBase.sol b/contracts/base/AppGatewayBase.sol index f019ff3a..156f98bd 100644 --- a/contracts/base/AppGatewayBase.sol +++ b/contracts/base/AppGatewayBase.sol @@ -9,6 +9,7 @@ import "../interfaces/IPromise.sol"; import {FeesPlugin} from "../protocol/utils/FeesPlugin.sol"; import {InvalidPromise, FeesNotSet} from "../protocol/utils/common/Errors.sol"; +import {FAST} from "../protocol/utils/common/Constants.sol"; /// @title AppGatewayBase /// @notice Abstract contract for the app gateway @@ -51,12 +52,15 @@ abstract contract AppGatewayBase is AddressResolverUtil, IAppGateway, FeesPlugin /// @notice Constructor for AppGatewayBase /// @param addressResolver_ The address resolver address - constructor(address addressResolver_, address auctionManager_, bytes32 sbType_) { + constructor(address addressResolver_) { _setAddressResolver(addressResolver_); - auctionManager = auctionManager_; + sbType = FAST; + } + /// @notice Sets the switchboard type + /// @param sbType_ The switchboard type + function _setSbType(bytes32 sbType_) internal { sbType = sbType_; } - /// @notice Creates a contract ID /// @param contractName_ The contract name /// @return bytes32 The contract ID diff --git a/contracts/protocol/payload-delivery/app-gateway/BatchAsync.sol b/contracts/protocol/payload-delivery/app-gateway/BatchAsync.sol index 09014b7a..825a3149 100644 --- a/contracts/protocol/payload-delivery/app-gateway/BatchAsync.sol +++ b/contracts/protocol/payload-delivery/app-gateway/BatchAsync.sol @@ -314,6 +314,9 @@ abstract contract BatchAsync is QueueAsync { amount_, receiver_ ); + if (auctionManager_ == address(0)) { + auctionManager_ = IAddressResolver(addressResolver__).defaultAuctionManager(); + } _deliverPayload(payloadDetailsArray, fees_, auctionManager_, new bytes(0)); } } diff --git a/script/counter/DeployEVMxCounterApp.s.sol b/script/counter/DeployEVMxCounterApp.s.sol index 922baacd..05d9af02 100644 --- a/script/counter/DeployEVMxCounterApp.s.sol +++ b/script/counter/DeployEVMxCounterApp.s.sol @@ -5,12 +5,11 @@ import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/console.sol"; import {CounterAppGateway} from "../../test/apps/app-gateways/counter/CounterAppGateway.sol"; import {Fees} from "../../contracts/protocol/utils/common/Structs.sol"; -import {ETH_ADDRESS, FAST} from "../../contracts/protocol/utils/common/Constants.sol"; +import {ETH_ADDRESS} from "../../contracts/protocol/utils/common/Constants.sol"; contract CounterDeploy is Script { function run() external { address addressResolver = vm.envAddress("ADDRESS_RESOLVER"); - address auctionManager = vm.envAddress("AUCTION_MANAGER"); string memory rpc = vm.envString("EVMX_RPC"); vm.createSelectFork(rpc); @@ -26,8 +25,6 @@ contract CounterDeploy is Script { CounterAppGateway gateway = new CounterAppGateway( addressResolver, - auctionManager, - FAST, fees ); diff --git a/test/FeesTest.t.sol b/test/FeesTest.t.sol index c04b7a85..793b4622 100644 --- a/test/FeesTest.t.sol +++ b/test/FeesTest.t.sol @@ -22,8 +22,6 @@ contract FeesTest is DeliveryHelperTest { counterGateway = new CounterAppGateway( address(addressResolver), - address(auctionManager), - FAST, createFees(feesAmount) ); depositFees(address(counterGateway), createFees(depositAmount)); diff --git a/test/Inbox.t.sol b/test/Inbox.t.sol index 4d01a599..07bad0a5 100644 --- a/test/Inbox.t.sol +++ b/test/Inbox.t.sol @@ -20,8 +20,6 @@ contract InboxTest is DeliveryHelperTest { // Deploy the gateway with fees gateway = new CounterAppGateway( address(addressResolver), - address(auctionManager), - FAST, createFees(feesAmount) ); gateway.setIsValidPlug(arbChainSlug, address(inbox)); diff --git a/test/apps/Counter.t.sol b/test/apps/Counter.t.sol index 0d3304ca..cd029d40 100644 --- a/test/apps/Counter.t.sol +++ b/test/apps/Counter.t.sol @@ -18,8 +18,6 @@ contract CounterTest is DeliveryHelperTest { counterGateway = new CounterAppGateway( address(addressResolver), - address(auctionManager), - FAST, createFees(feesAmount) ); depositFees(address(counterGateway), createFees(1 ether)); diff --git a/test/apps/ParallelCounter.t.sol b/test/apps/ParallelCounter.t.sol index beec26e5..56261031 100644 --- a/test/apps/ParallelCounter.t.sol +++ b/test/apps/ParallelCounter.t.sol @@ -18,8 +18,6 @@ contract ParallelCounterTest is DeliveryHelperTest { parallelCounterGateway = new CounterAppGateway( address(addressResolver), - address(auctionManager), - FAST, createFees(feesAmount) ); depositFees(address(parallelCounterGateway), createFees(1 ether)); diff --git a/test/apps/SuperToken.t.sol b/test/apps/SuperToken.t.sol index c3c98bdb..34b438ac 100644 --- a/test/apps/SuperToken.t.sol +++ b/test/apps/SuperToken.t.sol @@ -64,9 +64,7 @@ contract SuperTokenTest is DeliveryHelperTest { function deploySuperTokenApp() internal { SuperTokenAppGateway superTokenApp = new SuperTokenAppGateway( address(addressResolver), - address(auctionManager), owner, - FAST, createFees(maxFees), SuperTokenAppGateway.ConstructorParams({ name_: "SUPER TOKEN", diff --git a/test/apps/SuperTokenLockable.t.sol b/test/apps/SuperTokenLockable.t.sol index aee20b19..b1161169 100644 --- a/test/apps/SuperTokenLockable.t.sol +++ b/test/apps/SuperTokenLockable.t.sol @@ -34,9 +34,7 @@ contract SuperTokenLockableTest is DeliveryHelperTest { function deploySuperTokenApp() internal { SuperTokenLockableAppGateway superTokenLockableApp = new SuperTokenLockableAppGateway( address(addressResolver), - address(auctionManager), owner, - FAST, createFees(maxFees), SuperTokenLockableAppGateway.ConstructorParams({ _burnLimit: 10000000000000000000000, diff --git a/test/apps/app-gateways/counter/CounterAppGateway.sol b/test/apps/app-gateways/counter/CounterAppGateway.sol index 1b73aa47..bb415e70 100644 --- a/test/apps/app-gateways/counter/CounterAppGateway.sol +++ b/test/apps/app-gateways/counter/CounterAppGateway.sol @@ -19,10 +19,8 @@ contract CounterAppGateway is AppGatewayBase, Ownable { constructor( address addressResolver_, - address auctionManager_, - bytes32 sbType_, Fees memory fees_ - ) AppGatewayBase(addressResolver_, auctionManager_, sbType_) { + ) AppGatewayBase(addressResolver_) { creationCodeWithArgs[counter] = abi.encodePacked(type(Counter).creationCode); creationCodeWithArgs[counter1] = abi.encodePacked(type(Counter).creationCode); _setOverrides(fees_); diff --git a/test/apps/app-gateways/super-token-lockable/SuperTokenLockableAppGateway.sol b/test/apps/app-gateways/super-token-lockable/SuperTokenLockableAppGateway.sol index cb9fb514..e20bca57 100644 --- a/test/apps/app-gateways/super-token-lockable/SuperTokenLockableAppGateway.sol +++ b/test/apps/app-gateways/super-token-lockable/SuperTokenLockableAppGateway.sol @@ -33,12 +33,10 @@ contract SuperTokenLockableAppGateway is AppGatewayBase, Ownable { constructor( address addressResolver_, - address auctionManager_, address owner_, - bytes32 sbType_, Fees memory fees_, ConstructorParams memory params - ) AppGatewayBase(addressResolver_, auctionManager_, sbType_) { + ) AppGatewayBase(addressResolver_) { creationCodeWithArgs[superTokenLockable] = abi.encodePacked( type(SuperTokenLockable).creationCode, abi.encode( diff --git a/test/apps/app-gateways/super-token/SuperTokenAppGateway.sol b/test/apps/app-gateways/super-token/SuperTokenAppGateway.sol index 1b73ac90..08fd2eac 100644 --- a/test/apps/app-gateways/super-token/SuperTokenAppGateway.sol +++ b/test/apps/app-gateways/super-token/SuperTokenAppGateway.sol @@ -29,12 +29,10 @@ contract SuperTokenAppGateway is AppGatewayBase, Ownable { constructor( address addressResolver_, - address auctionManager_, address owner_, - bytes32 sbType_, Fees memory fees_, ConstructorParams memory params_ - ) AppGatewayBase(addressResolver_, auctionManager_, sbType_) { + ) AppGatewayBase(addressResolver_) { creationCodeWithArgs[superToken] = abi.encodePacked( type(SuperToken).creationCode, abi.encode( From 03dee1030ac66d03b37864a19cf6fab9d6ca785d Mon Sep 17 00:00:00 2001 From: Akash Date: Mon, 3 Mar 2025 18:21:27 +0400 Subject: [PATCH 186/186] fix: upload script, config --- hardhat-scripts/config/config.ts | 11 ++++- hardhat-scripts/deploy/5.upload.ts | 71 +++++++++++------------------- package.json | 2 +- testScript.sh | 4 +- yarn.lock | 14 ++++-- 5 files changed, 48 insertions(+), 54 deletions(-) diff --git a/hardhat-scripts/config/config.ts b/hardhat-scripts/config/config.ts index 00c7985d..97b7a7d2 100644 --- a/hardhat-scripts/config/config.ts +++ b/hardhat-scripts/config/config.ts @@ -23,17 +23,24 @@ export const logConfig = () => { ); }; +export const EVMX_CHAIN_IDS: Record = { + [DeploymentMode.LOCAL]: 7625382, + [DeploymentMode.DEV]: 7625382, + [DeploymentMode.STAGE]: 43, + [DeploymentMode.PROD]: 43, +}; + export const chains: Array = [ ChainSlug.ARBITRUM_SEPOLIA, ChainSlug.OPTIMISM_SEPOLIA, ChainSlug.SEPOLIA, - ChainSlug.BASE_SEPOLIA, + ChainSlug.BASE_SEPOLIA ]; export const auctionEndDelaySeconds = 0; export const watcher = "0xb62505feacC486e809392c65614Ce4d7b051923b"; export const MAX_FEES = ethers.utils.parseEther("0.001"); -export const EVMX_CHAIN_ID = 7625382; +export const EVMX_CHAIN_ID = EVMX_CHAIN_IDS[mode]; export const MAX_LIMIT = 100; export const BID_TIMEOUT = 600; export const EXPIRY_TIME = 300; diff --git a/hardhat-scripts/deploy/5.upload.ts b/hardhat-scripts/deploy/5.upload.ts index cd34b7d6..815d3729 100644 --- a/hardhat-scripts/deploy/5.upload.ts +++ b/hardhat-scripts/deploy/5.upload.ts @@ -1,14 +1,15 @@ import { PutObjectCommand, S3Client } from "@aws-sdk/client-s3"; import { ChainAddressesObj, - EVMxAddressesObj, - ChainSlug, DeploymentMode, + EVMxAddressesObj, + chainSlugToHardhatChainName, + ChainSlug } from "@socket.tech/socket-protocol-common"; import { config as dotenvConfig } from "dotenv"; import fs from "fs"; import path from "path"; -import { EVMX_CHAIN_ID, mode } from "../config/config"; +import { EVMX_CHAIN_ID, chains, mode } from "../config/config"; dotenvConfig(); @@ -58,55 +59,35 @@ type ConfigEntry = { eventBlockRange: number; addresses?: ChainAddressesObj | EVMxAddressesObj; }; - type S3Config = { [chainId: string]: ConfigEntry; }; + +const supportedChainSlugs = [EVMX_CHAIN_ID as ChainSlug, ...chains]; + export let config: S3Config = { - [ChainSlug.ARBITRUM_SEPOLIA]: { - eventBlockRangePerCron: 5000, - rpc: process.env.ARBITRUM_SEPOLIA_RPC, - wssRpc: process.env.ARBITRUM_SEPOLIA_WSS_RPC, - confirmations: 0, - eventBlockRange: 5000, - }, - [ChainSlug.OPTIMISM_SEPOLIA]: { - eventBlockRangePerCron: 5000, - rpc: process.env.OPTIMISM_SEPOLIA_RPC, - wssRpc: process.env.OPTIMISM_SEPOLIA_WSS_RPC, - confirmations: 0, - eventBlockRange: 5000, - }, - [ChainSlug.SEPOLIA]: { - eventBlockRangePerCron: 5000, - rpc: process.env.SEPOLIA_RPC, - wssRpc: process.env.SEPOLIA_WSS_RPC, - confirmations: 0, - eventBlockRange: 5000, - }, - [EVMX_CHAIN_ID]: { - eventBlockRangePerCron: 5000, - rpc: process.env.EVMX_RPC, - wssRpc: process.env.EVMX_WSS_RPC, - confirmations: 0, - eventBlockRange: 5000, - }, - [ChainSlug.BASE_SEPOLIA]: { + //@ts-ignore + supportedChainSlugs: supportedChainSlugs, +}; + +// Add config for each supported chain +supportedChainSlugs.forEach(chainSlug => { + let chainName = + chainSlug === EVMX_CHAIN_ID ? "EVMX" : chainSlugToHardhatChainName[chainSlug].toString().replace("-", "_"); + let rpcKey = `${chainName.toUpperCase()}_RPC`; + let wssRpcKey = `${chainName.toUpperCase()}_WSS_RPC`; + if (!process.env[rpcKey] || !process.env[wssRpcKey]) { + console.log(`Missing RPC or WSS RPC for chain ${chainName}`); + return; + } + config[chainSlug] = { eventBlockRangePerCron: 5000, - rpc: process.env.BASE_SEPOLIA_RPC, - wssRpc: process.env.BASE_SEPOLIA_WSS_RPC, + rpc: process.env[rpcKey], + wssRpc: process.env[wssRpcKey], confirmations: 0, eventBlockRange: 5000, - }, - //@ts-ignore - supportedChainSlugs: [ - ChainSlug.ARBITRUM_SEPOLIA, - ChainSlug.OPTIMISM_SEPOLIA, - ChainSlug.SEPOLIA, - EVMX_CHAIN_ID, - ChainSlug.BASE_SEPOLIA, - ], -}; + }; +}); // Read the addresses.json file const addressesPath = path.join(__dirname, getAddressesPath()); const addresses = JSON.parse(fs.readFileSync(addressesPath, "utf8")); diff --git a/package.json b/package.json index 505ed586..aee7ad7e 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "@aws-sdk/client-s3": "^3.670.0", "@nomicfoundation/hardhat-verify": "^2.0.12", "@nomiclabs/hardhat-ethers": "2.2.3", - "@socket.tech/socket-protocol-common": "1.1.27", + "@socket.tech/socket-protocol-common": "1.1.31", "@typechain/ethers-v5": "^10.0.0", "@typechain/hardhat": "6.0.0", "dotenv": "^16.0.3", diff --git a/testScript.sh b/testScript.sh index 456bd718..31b3fa51 100644 --- a/testScript.sh +++ b/testScript.sh @@ -54,5 +54,5 @@ source .env && forge script script/admin/UpdateLimits.s.sol --broadcast --skip-s # add fees -source .env && forge script script/PayFeesInArbitrumETH.s.sol --broadcast --skip-simulation -source .env && forge script script/AppGatewayFeeBalance.s.sol +source .env && forge script script/helpers/PayFeesInArbitrumETH.s.sol --broadcast --skip-simulation +source .env && forge script script/helpers/AppGatewayFeeBalance.s.sol diff --git a/yarn.lock b/yarn.lock index c90b952e..3cf308a7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2071,16 +2071,22 @@ "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@socket.tech/socket-protocol-common@1.1.27": - version "1.1.27" - resolved "https://registry.yarnpkg.com/@socket.tech/socket-protocol-common/-/socket-protocol-common-1.1.27.tgz#62f1ecee76f9496e98095545a05a03b93bcb3423" - integrity sha512-6zZYNoU0N9dS1UMR0AXBYIqFO84HPopTTxOfM5WTJvOKTiAl/OODza499tOS6o6va/eyaiOaICYW27GoIBJXYw== +"@socket.tech/socket-protocol-common@1.1.31": + version "1.1.31" + resolved "https://registry.yarnpkg.com/@socket.tech/socket-protocol-common/-/socket-protocol-common-1.1.31.tgz#d95b1b6caf69a11c6bd13b18b7871c57e7d283fb" + integrity sha512-Hp1er4kRqCfeuvQFFgxooT0XBbO4nBrpL8/SYB/BNMdWfR9hk6PVE8MUnoIqTUJJTvIePKk+GOajl8MVqPD3VQ== dependencies: + "@socket.tech/socket-protocol" "^1.0.15" axios "^1.7.9" ethers "^5.6.5" pino "^9.6.0" sequelize "^6.21.6" +"@socket.tech/socket-protocol@^1.0.15": + version "1.0.15" + resolved "https://registry.yarnpkg.com/@socket.tech/socket-protocol/-/socket-protocol-1.0.15.tgz#091eaaf954a58658fa74370880a6fe54f09a7ee8" + integrity sha512-aBDYdpFkQro+NVNGUbridJQbtGSEk9ZoqMmtRPA+ti0gT0X2ZAryta0lS2TfqsL4sF2fqbmz1Vd+IuK3wb5dTg== + "@solidity-parser/parser@^0.19.0": version "0.19.0" resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.19.0.tgz#37a8983b2725af9b14ff8c4a475fa0e98d773c3f"