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/CounterAppGateway.sol b/contracts/apps/counter/CounterAppGateway.sol deleted file mode 100644 index dc6943cb..00000000 --- a/contracts/apps/counter/CounterAppGateway.sol +++ /dev/null @@ -1,66 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0 -pragma solidity >=0.7.0 <0.9.0; - -import "../../base/AppGatewayBase.sol"; -import "./Counter.sol"; -import "./ICounter.sol"; -import "../../interfaces/IForwarder.sol"; -import "../../interfaces/IPromise.sol"; - -contract CounterAppGateway is AppGatewayBase { - uint256 arbCounter; - uint256 optCounter; - - constructor( - address addressResolver_, - address deployerContract_, - address auctionManager_, - Fees memory fees_ - ) AppGatewayBase(addressResolver_, auctionManager_) { - addressResolver__.setContractsToGateways(deployerContract_); - _setOverrides(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++) { - ICounter(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); - 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(Read.OFF, Parallel.OFF); - ICounter(instances_[0]).increase(); - } - - function setCounterValues(bytes memory data, bytes memory returnData) external onlyPromises { - uint256 counterValue = abi.decode(returnData, (uint256)); - uint32 chainSlug = abi.decode(data, (uint32)); - if (chainSlug == 421614) { - arbCounter = counterValue; - } else if (chainSlug == 11155420) { - optCounter = counterValue; - } - } - - 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/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 deleted file mode 100644 index 92a96e06..00000000 --- a/contracts/apps/super-token-lockable/SuperTokenLockableAppGateway.sol +++ /dev/null @@ -1,72 +0,0 @@ -// SPDX-License-Identifier: Unlicense -pragma solidity ^0.8.21; - -import "../../base/AppGatewayBase.sol"; -import {ISuperToken} from "../../interfaces/ISuperToken.sol"; -import "solady/auth/Ownable.sol"; - -contract SuperTokenLockableAppGateway is AppGatewayBase, Ownable { - uint256 public idCounter; - - event Bridged(bytes32 asyncId); - - struct UserOrder { - address srcToken; - address dstToken; - address user; - uint256 srcAmount; - uint256 deadline; - } - - constructor( - address addressResolver_, - address deployerContract_, - address auctionManager_, - Fees memory fees_ - ) AppGatewayBase(addressResolver_, auctionManager_) { - addressResolver__.setContractsToGateways(deployerContract_); - _setOverrides(fees_); - _initializeOwner(msg.sender); - } - - function checkBalance(bytes memory data_, bytes memory returnData_) external onlyPromises { - (UserOrder memory order, bytes32 asyncId) = abi.decode(data_, (UserOrder, bytes32)); - - uint256 balance = abi.decode(returnData_, (uint256)); - if (balance < order.srcAmount) { - _revertTx(asyncId); - return; - } - _unlockTokens(order.srcToken, order.user, order.srcAmount); - } - - function _unlockTokens(address srcToken_, address user_, uint256 amount_) internal async { - ISuperToken(srcToken_).unlockTokens(user_, amount_); - } - - function bridge(bytes memory order_) external async returns (bytes32 asyncId_) { - UserOrder memory order = abi.decode(order_, (UserOrder)); - asyncId_ = _getCurrentAsyncId(); - ISuperToken(order.srcToken).lockTokens(order.user, order.srcAmount); - - _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(Read.OFF); - ISuperToken(order.dstToken).mint(order.user, order.srcAmount); - ISuperToken(order.srcToken).burn(order.user, order.srcAmount); - - emit Bridged(asyncId_); - } - - function withdrawFeeTokens( - uint32 chainSlug_, - address token_, - uint256 amount_, - address receiver_ - ) external onlyOwner { - _withdrawFeeTokens(chainSlug_, token_, amount_, receiver_); - } -} 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 deleted file mode 100644 index 2527ab7e..00000000 --- a/contracts/apps/super-token/SuperTokenAppGateway.sol +++ /dev/null @@ -1,41 +0,0 @@ -// SPDX-License-Identifier: Unlicense -pragma solidity ^0.8.21; - -import "../../base/AppGatewayBase.sol"; -import "../../interfaces/ISuperToken.sol"; -import "solady/auth/Ownable.sol"; - -contract SuperTokenAppGateway is AppGatewayBase, Ownable { - event Transferred(bytes32 asyncId); - - struct TransferOrder { - address srcToken; - address dstToken; - address user; - uint256 srcAmount; - uint256 deadline; - } - - constructor( - address addressResolver_, - address deployerContract_, - Fees memory fees_, - address auctionManager_ - ) AppGatewayBase(addressResolver_, auctionManager_) { - // called to connect the deployer contract with this app - addressResolver__.setContractsToGateways(deployerContract_); - - // 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); - } - - function transfer(bytes memory order_) external async { - TransferOrder memory order = abi.decode(order_, (TransferOrder)); - ISuperToken(order.srcToken).burn(order.user, order.srcAmount); - ISuperToken(order.dstToken).mint(order.user, order.srcAmount); - - emit Transferred(_getCurrentAsyncId()); - } -} 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..f019ff3a 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() { @@ -34,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 @@ -47,9 +51,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 +84,82 @@ 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_, true); + 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(); + } + //////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////// TX OVERRIDE HELPERS /////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////// @@ -177,12 +258,23 @@ 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 { + if (payloadBatch_.onCompleteData.length == 0) return; + + (uint32 chainSlug, bool isDeploy) = abi.decode( + payloadBatch_.onCompleteData, + (uint32, bool) + ); + if (isDeploy) { + initialize(chainSlug); + } + } function callFromChain( uint32 chainSlug_, @@ -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/IAddressResolver.sol b/contracts/interfaces/IAddressResolver.sol index 8d062286..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); @@ -66,7 +61,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/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/interfaces/IMultiChainAppDeployer.sol b/contracts/interfaces/IMultiChainAppDeployer.sol deleted file mode 100644 index e36020c1..00000000 --- a/contracts/interfaces/IMultiChainAppDeployer.sol +++ /dev/null @@ -1,11 +0,0 @@ -// 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 { - /// @notice deploy contracts to multiple chains - function deployMultiChainContracts(uint32[] memory chainSlugs_) external; -} 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/AddressResolver.sol b/contracts/protocol/AddressResolver.sol index 238d0a81..ab519e9f 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; } @@ -88,7 +85,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 +102,7 @@ contract AddressResolver is AddressResolverStorage, Initializable, Ownable { ); newForwarder = _deployProxy(salt, address(forwarderBeacon), initData); - _setConfig(appDeployer_, newForwarder); + _setConfig(appGateway_, newForwarder); emit ForwarderDeployed(newForwarder, salt); } @@ -222,9 +219,8 @@ contract AddressResolver is AddressResolverStorage, Initializable, Ownable { LibClone.predictDeterministicAddressERC1967BeaconProxy(beacon_, salt_, address(this)); } - function _setConfig(address appDeployer_, address newForwarder_) internal { - address gateway = contractsToGateways[appDeployer_]; - gatewaysToContracts[gateway] = newForwarder_; + function _setConfig(address appGateway_, address newForwarder_) internal { + address gateway = contractsToGateways[appGateway_]; contractsToGateways[newForwarder_] = gateway; } diff --git a/script/counter-inbox/CheckGatewayCounter.s.sol b/script/counter-inbox/CheckGatewayCounter.s.sol index c9855b7d..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 {CounterInboxAppGateway} from "../../contracts/apps/counter-inbox/CounterInboxAppGateway.sol"; +import {CounterAppGateway} from "../../test/apps/app-gateways/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..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 {CounterInbox} from "../../contracts/apps/counter-inbox/CounterInbox.sol"; -import {CounterInboxAppGateway} from "../../contracts/apps/counter-inbox/CounterInboxAppGateway.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"; @@ -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..b63f6c83 100644 --- a/script/counter/IncrementCountersFromApp.s.sol +++ b/script/counter/IncrementCountersFromApp.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 "../../test/apps/app-gateways/counter/CounterAppGateway.sol"; contract IncrementCounters is Script { function run() external { @@ -13,21 +12,17 @@ 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(), - 84532 - ); + address counterForwarderBaseSepolia = gateway.forwarderAddresses(gateway.counter(), 84532); //address counterForwarderSepolia = deployer.forwarderAddresses( // deployer.counter(), // 11155111 diff --git a/script/counter/ReadOnchainCounters.s.sol b/script/counter/ReadOnchainCounters.s.sol index 56a91796..850f7e9c 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 {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 { - 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/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 97d4f68d..922baacd 100644 --- a/script/counter/deployEVMxCounterApp.s.sol +++ b/script/counter/deployEVMxCounterApp.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 {CounterAppGateway} from "../../contracts/apps//counter/CounterAppGateway.sol"; -import {CounterDeployer} from "../../contracts/apps//counter/CounterDeployer.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"; @@ -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..fd75c155 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 "../../test/apps/app-gateways/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..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 {CronAppGateway} from "../../contracts/apps/cron/CronAppGateway.sol"; +import {CounterAppGateway} from "../../test/apps/app-gateways/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..fa04b108 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 {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 { - 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..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 {ParallelCounterDeployer} from "../../contracts/apps/parallel-counter/ParallelCounterDeployer.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 { @@ -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..ab03e084 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 "../../test/apps/app-gateways/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..34fc36bf 100644 --- a/script/super-token-lockable/Bridge.s.sol +++ b/script/super-token-lockable/Bridge.s.sol @@ -4,43 +4,41 @@ 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 {SuperTokenLockableAppGateway} from "../../test/apps/app-gateways/super-token-lockable/SuperTokenLockableAppGateway.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..df001e0f 100644 --- a/script/super-token-lockable/DeployContracts.s.sol +++ b/script/super-token-lockable/DeployContracts.s.sol @@ -3,22 +3,21 @@ 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 {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 { - 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..8a2be2a8 100644 --- a/script/super-token-lockable/DeployGateway.s.sol +++ b/script/super-token-lockable/DeployGateway.s.sol @@ -3,9 +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 {SuperTokenLockableDeployer} from "../../contracts/apps/super-token-lockable/SuperTokenLockableDeployer.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"; @@ -25,12 +24,13 @@ contract DeployGateway is Script { amount: 0.001 ether }); - SuperTokenLockableDeployer deployer = new SuperTokenLockableDeployer( + SuperTokenLockableAppGateway gateway = new SuperTokenLockableAppGateway( addressResolver, - owner, address(auctionManager), + owner, FAST, - SuperTokenLockableDeployer.ConstructorParams({ + fees, + SuperTokenLockableAppGateway.ConstructorParams({ _burnLimit: 1000000000 ether, _mintLimit: 1000000000 ether, name_: "SUPER TOKEN", @@ -38,23 +38,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/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 08cc9989..d007bcc3 100644 --- a/script/super-token/DeployContracts.s.sol +++ b/script/super-token/DeployContracts.s.sol @@ -3,16 +3,15 @@ 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 {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(); - 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..61df966a 100644 --- a/script/super-token/DeployGateway.s.sol +++ b/script/super-token/DeployGateway.s.sol @@ -3,9 +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 {SuperTokenDeployer} from "../../contracts/apps/super-token/SuperTokenDeployer.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"; @@ -23,33 +22,25 @@ contract DeployGateway is Script { amount: 0.001 ether }); - SuperTokenDeployer deployer = new SuperTokenDeployer( + SuperTokenAppGateway gateway = new SuperTokenAppGateway( addressResolver, - owner, address(auctionManager), + owner, 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 96639dd0..4135b3fc 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"; @@ -312,8 +311,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_); @@ -324,54 +322,26 @@ contract DeliveryHelperTest is SetupTest { totalPayloads ); - appDeployer_.deployContracts(chainSlug_); - bidAndExecute(payloadIds, asyncId); - setupGatewayAndPlugs(chainSlug_, appDeployer_, appGateway_, contractIds); - } - - function _deployParallel( - bytes32[] memory contractIds, - uint32[] memory chainSlugs_, - IMultiChainAppDeployer appDeployer_, - address 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; - - appDeployer_.deployMultiChainContracts(chainSlugs_); + appGateway_.deployContracts(chainSlug_); bidAndExecute(payloadIds, asyncId); - for (uint i = 0; i < chainSlugs_.length; i++) { - setupGatewayAndPlugs(chainSlugs_[i], appDeployer_, appGateway_, contractIds); - } + setupGatewayAndPlugs(chainSlug_, 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, chainSlug: chainSlug_, - appGateway: appGateway_, + appGateway: address(appGateway_), switchboard: address(socketConfig.switchboard) }); } @@ -683,10 +653,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/FeesTest.t.sol b/test/FeesTest.t.sol index 060f4af2..c04b7a85 100644 --- a/test/FeesTest.t.sol +++ b/test/FeesTest.t.sol @@ -2,9 +2,8 @@ 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"; +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; @@ -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 9e8da63d..4d01a599 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 "./apps/app-gateways/counter/CounterAppGateway.sol"; +import {Counter} from "./apps/app-gateways/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( @@ -53,13 +53,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, @@ -75,6 +74,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 7531cd91..0d3304ca 100644 --- a/test/apps/Counter.t.sol +++ b/test/apps/Counter.t.sol @@ -1,9 +1,8 @@ // SPDX-License-Identifier: UNLICENSED 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 {CounterAppGateway} from "./app-gateways/counter/CounterAppGateway.sol"; +import {Counter} from "./app-gateways/counter/Counter.sol"; import "../DeliveryHelper.t.sol"; contract CounterTest is DeliveryHelperTest { @@ -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 963aa1e1..beec26e5 100644 --- a/test/apps/ParallelCounter.t.sol +++ b/test/apps/ParallelCounter.t.sol @@ -1,8 +1,7 @@ // 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 "./app-gateways/counter/CounterAppGateway.sol"; import "../DeliveryHelper.t.sol"; contract ParallelCounterTest is DeliveryHelperTest { @@ -12,39 +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, - IMultiChainAppDeployer(address(parallelCounterDeployer)), - address(parallelCounterGateway) - ); + asyncId = _deployParallel(chainSlugs); } function testParallelCounterDeployment() external { @@ -57,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( @@ -127,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..c3c98bdb 100644 --- a/test/apps/SuperToken.t.sol +++ b/test/apps/SuperToken.t.sol @@ -1,9 +1,8 @@ // 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 {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"; @@ -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 ce2de6b4..749a3067 100644 --- a/test/apps/SuperTokenLockable.t.sol +++ b/test/apps/SuperTokenLockable.t.sol @@ -1,10 +1,9 @@ // 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"; +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"; @@ -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) ); @@ -141,20 +130,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( @@ -205,30 +193,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__()), @@ -245,23 +227,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); } @@ -270,11 +240,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 ), diff --git a/contracts/apps/counter/Counter.sol b/test/apps/app-gateways/counter/Counter.sol similarity index 63% rename from contracts/apps/counter/Counter.sol rename to test/apps/app-gateways/counter/Counter.sol index 44054091..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; @@ -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/test/apps/app-gateways/counter/CounterAppGateway.sol b/test/apps/app-gateways/counter/CounterAppGateway.sol new file mode 100644 index 00000000..1b73aa47 --- /dev/null +++ b/test/apps/app-gateways/counter/CounterAppGateway.sol @@ -0,0 +1,137 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.7.0 <0.9.0; + +import "../../../../contracts/base/AppGatewayBase.sol"; +import "../../../../contracts/interfaces/IForwarder.sol"; +import "../../../../contracts/interfaces/IPromise.sol"; +import "./Counter.sol"; +import "./ICounter.sol"; + +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 auctionManager_, + bytes32 sbType_, + Fees memory fees_ + ) 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 { + // the increase function is called on given list of instances + // this + for (uint256 i = 0; i < instances_.length; i++) { + ICounter(instances_[i]).increase(); + } + } + + // 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); + 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(Read.OFF, Parallel.OFF); + ICounter(instances_[0]).increase(); + } + + function setCounterValues(bytes memory data, bytes memory returnData) external onlyPromises { + uint256 counterValue = abi.decode(returnData, (uint256)); + uint32 chainSlug = abi.decode(data, (uint32)); + if (chainSlug == 421614) { + arbCounter = counterValue; + } else if (chainSlug == 11155420) { + optCounter = counterValue; + } + } + + // 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_; + } + + function withdrawFeeTokens( + uint32 chainSlug_, + address token_, + uint256 amount_, + address receiver_ + ) external { + _withdrawFeeTokens(chainSlug_, token_, amount_, receiver_); + } +} 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/test/apps/app-gateways/super-token-lockable/SuperTokenLockableAppGateway.sol b/test/apps/app-gateways/super-token-lockable/SuperTokenLockableAppGateway.sol new file mode 100644 index 00000000..a1b3c125 --- /dev/null +++ b/test/apps/app-gateways/super-token-lockable/SuperTokenLockableAppGateway.sol @@ -0,0 +1,120 @@ +// SPDX-License-Identifier: Unlicense +pragma solidity ^0.8.21; + +import "solady/auth/Ownable.sol"; +import {ISuperToken} from "../../../../contracts/interfaces/ISuperToken.sol"; +import "../../../../contracts/base/AppGatewayBase.sol"; +import "./SuperTokenLockable.sol"; +import "./LimitHook.sol"; + +contract SuperTokenLockableAppGateway is AppGatewayBase, Ownable { + bytes32 public superTokenLockable = _createContractId("superTokenLockable"); + bytes32 public limitHook = _createContractId("limitHook"); + + event Bridged(bytes32 asyncId); + + struct UserOrder { + address srcToken; + address dstToken; + address user; + uint256 srcAmount; + uint256 deadline; + } + + struct ConstructorParams { + uint256 _burnLimit; + uint256 _mintLimit; + string name_; + string symbol_; + uint8 decimals_; + address initialSupplyHolder_; + uint256 initialSupply_; + } + + constructor( + address addressResolver_, + address auctionManager_, + address owner_, + 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(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 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)); + + uint256 balance = abi.decode(returnData_, (uint256)); + if (balance < order.srcAmount) { + _revertTx(asyncId); + return; + } + _unlockTokens(order.srcToken, order.user, order.srcAmount); + } + + function _unlockTokens(address srcToken_, address user_, uint256 amount_) internal async { + ISuperToken(srcToken_).unlockTokens(user_, amount_); + } + + function bridge(bytes memory order_) external async returns (bytes32 asyncId_) { + UserOrder memory order = abi.decode(order_, (UserOrder)); + asyncId_ = _getCurrentAsyncId(); + ISuperToken(order.srcToken).lockTokens(order.user, order.srcAmount); + + _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(Read.OFF); + ISuperToken(order.dstToken).mint(order.user, order.srcAmount); + ISuperToken(order.srcToken).burn(order.user, order.srcAmount); + + emit Bridged(asyncId_); + } + + function withdrawFeeTokens( + uint32 chainSlug_, + address token_, + uint256 amount_, + address receiver_ + ) external onlyOwner { + _withdrawFeeTokens(chainSlug_, token_, amount_, receiver_); + } +} 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/SuperTokenDeployer.sol b/test/apps/app-gateways/super-token/SuperTokenAppGateway.sol similarity index 55% rename from contracts/apps/super-token/SuperTokenDeployer.sol rename to test/apps/app-gateways/super-token/SuperTokenAppGateway.sol index 53e06964..a73b8e39 100644 --- a/contracts/apps/super-token/SuperTokenDeployer.sol +++ b/test/apps/app-gateways/super-token/SuperTokenAppGateway.sol @@ -1,12 +1,16 @@ // SPDX-License-Identifier: Unlicense pragma solidity ^0.8.21; -import "./SuperToken.sol"; -import "../../base/AppDeployerBase.sol"; import "solady/auth/Ownable.sol"; +import "../../../../contracts/base/AppGatewayBase.sol"; +import "../../../../contracts/interfaces/ISuperToken.sol"; +import "./SuperToken.sol"; -contract SuperTokenDeployer is AppDeployerBase, Ownable { +contract SuperTokenAppGateway is AppGatewayBase, Ownable { bytes32 public superToken = _createContractId("superToken"); + + event Transferred(bytes32 asyncId); + struct ConstructorParams { string name_; string symbol_; @@ -15,15 +19,22 @@ contract SuperTokenDeployer is AppDeployerBase, Ownable { uint256 initialSupply_; } + struct TransferOrder { + address srcToken; + address dstToken; + address user; + uint256 srcAmount; + uint256 deadline; + } + constructor( address addressResolver_, - address owner_, address auctionManager_, + address owner_, bytes32 sbType_, - ConstructorParams memory params_, - Fees memory fees_ - ) AppDeployerBase(addressResolver_, auctionManager_, sbType_) { - _initializeOwner(owner_); + Fees memory fees_, + ConstructorParams memory params_ + ) AppGatewayBase(addressResolver_, auctionManager_, sbType_) { creationCodeWithArgs[superToken] = abi.encodePacked( type(SuperToken).creationCode, abi.encode( @@ -34,7 +45,11 @@ contract SuperTokenDeployer is AppDeployerBase, Ownable { params_.initialSupply_ ) ); + + // 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(owner_); } function deployContracts(uint32 chainSlug_) external async { @@ -43,8 +58,16 @@ contract SuperTokenDeployer is AppDeployerBase, Ownable { } // no need to call this directly, will be called automatically after all contracts are deployed. - // check AppDeployerBase._deploy and AppDeployerBase.onBatchComplete + // 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); + ISuperToken(order.dstToken).mint(order.user, order.srcAmount); + + emit Transferred(_getCurrentAsyncId()); + } } 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