diff --git a/package-lock.json b/package-lock.json index 1ba857b1..36884f18 100644 --- a/package-lock.json +++ b/package-lock.json @@ -50,22 +50,22 @@ } }, "node_modules/@axelar-network/axelar-cgp-solidity": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@axelar-network/axelar-cgp-solidity/-/axelar-cgp-solidity-6.2.1.tgz", - "integrity": "sha512-0RaxLYmsp3elXBytn7+eZUil1KFS6jjHR/ECrN/3IC7TeTDPUYunyy6JDxCdNYNtiD6EKgUAfQ7G4DrBb6hRxg==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@axelar-network/axelar-cgp-solidity/-/axelar-cgp-solidity-6.4.0.tgz", + "integrity": "sha512-Xnw5xi234B1cmTCzgudV8zq+DDjJ1d1U362CM0vKH1FWmZprKIdqgmOYkiRyu+QiVhnznKiBURiSEHVrNjtYpw==", "dependencies": { - "@axelar-network/axelar-gmp-sdk-solidity": "5.6.4" + "@axelar-network/axelar-gmp-sdk-solidity": "6.0.6" }, "engines": { - "node": ">=16" + "node": ">=18" } }, "node_modules/@axelar-network/axelar-cgp-solidity/node_modules/@axelar-network/axelar-gmp-sdk-solidity": { - "version": "5.6.4", - "resolved": "https://registry.npmjs.org/@axelar-network/axelar-gmp-sdk-solidity/-/axelar-gmp-sdk-solidity-5.6.4.tgz", - "integrity": "sha512-PQjV+HeJynmSRMhyM3SexwnbFNruSaiRUeNCWjV8/7CkdPsDqypoqIXVRVU8Zk92DUUHeqZZzL/3qP2LYuvlnA==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@axelar-network/axelar-gmp-sdk-solidity/-/axelar-gmp-sdk-solidity-5.10.0.tgz", + "integrity": "sha512-s8SImALvYB+5AeiT3tbfWNBI2Mhqw1x91i/zM3DNpVUCnAR2HKtsB9T84KnUn/OJjOVgb4h0lv7q9smeYniRPw==", "engines": { - "node": ">=16" + "node": ">=18" } }, "node_modules/@axelar-network/axelar-cgp-sui": { @@ -357,9 +357,9 @@ } }, "node_modules/@axelar-network/axelar-gmp-sdk-solidity": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@axelar-network/axelar-gmp-sdk-solidity/-/axelar-gmp-sdk-solidity-5.7.0.tgz", - "integrity": "sha512-JlokiWFxvR6bFQtDjdErtk0mZrr3GH1A8bKps1zVP/Bu4XOHR0WsrWGPVhWIbvT8a8Ag3dva4hskBYgdq+pLig==", + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/@axelar-network/axelar-gmp-sdk-solidity/-/axelar-gmp-sdk-solidity-6.0.6.tgz", + "integrity": "sha512-XIcDlr1HoYSqcxuvvusILmiqerh2bL9NJLwU4lFBAJK5E/st/q3Em9ropBBZML9iuUZ+hDsch8Ev9rMO+ulaSQ==", "engines": { "node": ">=18" } @@ -389,23 +389,23 @@ "link": true }, "node_modules/@axelar-network/interchain-token-service": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@axelar-network/interchain-token-service/-/interchain-token-service-1.2.4.tgz", - "integrity": "sha512-Sgw2M4VzW5hjL9TBe2ljL5wo+paYqlL2XNQlq1dyaDAD6E7PG1MQ+0U44QnfJfhhAwcqZtKQmb92ZNwV+BEdVw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@axelar-network/interchain-token-service/-/interchain-token-service-2.1.0.tgz", + "integrity": "sha512-eRaDL7otxqZixzsSu3rYtMkFQ1buopNGAmc8fEHvJPPD1WYiRARx24z+61OTJjCHcRygBljl9oIlqmqiM6SAYg==", "dependencies": { - "@axelar-network/axelar-cgp-solidity": "6.2.1", - "@axelar-network/axelar-gmp-sdk-solidity": "5.6.4" + "@axelar-network/axelar-cgp-solidity": "6.4.0", + "@axelar-network/axelar-gmp-sdk-solidity": "6.0.4" }, "engines": { - "node": ">=16" + "node": ">=18" } }, "node_modules/@axelar-network/interchain-token-service/node_modules/@axelar-network/axelar-gmp-sdk-solidity": { - "version": "5.6.4", - "resolved": "https://registry.npmjs.org/@axelar-network/axelar-gmp-sdk-solidity/-/axelar-gmp-sdk-solidity-5.6.4.tgz", - "integrity": "sha512-PQjV+HeJynmSRMhyM3SexwnbFNruSaiRUeNCWjV8/7CkdPsDqypoqIXVRVU8Zk92DUUHeqZZzL/3qP2LYuvlnA==", + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/@axelar-network/axelar-gmp-sdk-solidity/-/axelar-gmp-sdk-solidity-6.0.4.tgz", + "integrity": "sha512-o8pv+krIAlEwzid0Ac8qwykDsavc+1DRPvyFQ3V0R0zTQFtYLJIIXXXt7FRb8b+LJDAuX+E0bB3N2X+hlcxk/g==", "engines": { - "node": ">=16" + "node": ">=18" } }, "node_modules/@babel/code-frame": { @@ -15658,19 +15658,6 @@ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "extraneous": true }, - "node_modules/ganache/node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "extraneous": true, - "os": [ - "darwin", - "linux" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/ganache/node_modules/function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -33898,13 +33885,13 @@ }, "packages/axelar-local-dev": { "name": "@axelar-network/axelar-local-dev", - "version": "2.3.3", + "version": "2.3.4", "license": "ISC", "dependencies": { - "@axelar-network/axelar-cgp-solidity": "^6.3.0", + "@axelar-network/axelar-cgp-solidity": "^6.4.0", "@axelar-network/axelar-chains-config": "^1.3.0", - "@axelar-network/axelar-gmp-sdk-solidity": "^5.7.0", - "@axelar-network/interchain-token-service": "^1.2.4", + "@axelar-network/axelar-gmp-sdk-solidity": "^6.0.6", + "@axelar-network/interchain-token-service": "^2.1.0", "ethers": "^5.6.5", "fs-extra": "^10.1.0", "ganache": "^7.1.0", @@ -33972,7 +33959,7 @@ "sinon": "^17.0.1" }, "devDependencies": { - "@axelar-network/axelar-gmp-sdk-solidity": "^5.6.2", + "@axelar-network/axelar-gmp-sdk-solidity": "^6.0.6", "@types/node-fetch": "^2.6.5", "jest": "^29.7.0", "ts-jest": "^29.1.1", @@ -34036,17 +34023,6 @@ "@mysten/sui.js": "^0.41.0" } }, - "packages/axelar-local-dev/node_modules/@axelar-network/axelar-cgp-solidity": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@axelar-network/axelar-cgp-solidity/-/axelar-cgp-solidity-6.3.0.tgz", - "integrity": "sha512-dHE2UgaFZvQvL0ythMi+aBsr4t+eR6zrVGmCU5BxslEqi6Tx+Wmjwg1O1p15EqoztalSqRKj+r57n3GtgeUpig==", - "dependencies": { - "@axelar-network/axelar-gmp-sdk-solidity": "5.7.0" - }, - "engines": { - "node": ">=18" - } - }, "packages/axelar-local-dev/node_modules/@types/node": { "version": "18.19.3", "dev": true, diff --git a/packages/axelar-local-dev-aptos/__tests__/contracts/HelloWorld.sol b/packages/axelar-local-dev-aptos/__tests__/contracts/HelloWorld.sol index 6e3983db..ba04993b 100644 --- a/packages/axelar-local-dev-aptos/__tests__/contracts/HelloWorld.sol +++ b/packages/axelar-local-dev-aptos/__tests__/contracts/HelloWorld.sol @@ -1,33 +1,27 @@ //SPDX-License-Identifier: MIT pragma solidity >=0.8.9 <0.9.0; +import { IAxelarGateway } from '@axelar-network/axelar-gmp-sdk-solidity/contracts/interfaces/IAxelarGateway.sol'; +import { IAxelarGasService } from '@axelar-network/axelar-gmp-sdk-solidity/contracts/interfaces/IAxelarGasService.sol'; import { AxelarExecutable } from '@axelar-network/axelar-gmp-sdk-solidity/contracts/executable/AxelarExecutable.sol'; -import { IAxelarGateway } from '@axelar-network/axelar-cgp-solidity/contracts/interfaces/IAxelarGateway.sol'; -import { IAxelarGasService } from '@axelar-network/axelar-cgp-solidity/contracts/interfaces/IAxelarGasService.sol'; contract HelloWorld is AxelarExecutable { string public value; string public sourceChain; string public sourceAddress; - IAxelarGasService gasService; + IAxelarGasService public immutable gasService; - constructor(address _gateway, address _gasReceiver) - AxelarExecutable(_gateway) - { + constructor(address _gateway, address _gasReceiver) AxelarExecutable(_gateway) { gasService = IAxelarGasService(_gasReceiver); } event Executed(); // Call this function to update the value of this contract along with all its siblings'. - function setRemoteValue( - string memory destinationChain, - string memory destinationAddress, - string calldata message - ) external payable { + function setRemoteValue(string memory destinationChain, string memory destinationAddress, string calldata message) external payable { bytes memory payload = abi.encodePacked(message); if (msg.value > 0) { - gasService.payNativeGasForContractCall{value: msg.value}( + gasService.payNativeGasForContractCall{ value: msg.value }( address(this), destinationChain, destinationAddress, @@ -35,15 +29,11 @@ contract HelloWorld is AxelarExecutable { msg.sender ); } - gateway.callContract(destinationChain, destinationAddress, payload); + IAxelarGateway(gatewayAddress).callContract(destinationChain, destinationAddress, payload); } // Handles calls created by setAndSend. Updates this contract's value - function _execute( - string calldata sourceChain_, - string calldata sourceAddress_, - bytes calldata payload_ - ) internal override { + function _execute(bytes32, string calldata sourceChain_, string calldata sourceAddress_, bytes calldata payload_) internal override { (value) = abi.decode(payload_, (string)); sourceChain = sourceChain_; sourceAddress = sourceAddress_; diff --git a/packages/axelar-local-dev-cosmos/package.json b/packages/axelar-local-dev-cosmos/package.json index c2834bc9..118fab33 100644 --- a/packages/axelar-local-dev-cosmos/package.json +++ b/packages/axelar-local-dev-cosmos/package.json @@ -36,7 +36,7 @@ "license": "ISC", "description": "", "devDependencies": { - "@axelar-network/axelar-gmp-sdk-solidity": "^5.6.2", + "@axelar-network/axelar-gmp-sdk-solidity": "^6.0.6", "@types/node-fetch": "^2.6.5", "jest": "^29.7.0", "ts-jest": "^29.1.1", diff --git a/packages/axelar-local-dev-cosmos/src/__tests__/contracts/SendReceive.sol b/packages/axelar-local-dev-cosmos/src/__tests__/contracts/SendReceive.sol index 36584000..f4aa3e55 100644 --- a/packages/axelar-local-dev-cosmos/src/__tests__/contracts/SendReceive.sol +++ b/packages/axelar-local-dev-cosmos/src/__tests__/contracts/SendReceive.sol @@ -1,9 +1,11 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.9; -import {AxelarExecutable} from "@axelar-network/axelar-gmp-sdk-solidity/contracts/executable/AxelarExecutable.sol"; -import {IAxelarGateway} from "@axelar-network/axelar-gmp-sdk-solidity/contracts/interfaces/IAxelarGateway.sol"; -import {IAxelarGasService} from "@axelar-network/axelar-gmp-sdk-solidity/contracts/interfaces/IAxelarGasService.sol"; + +import { IAxelarGateway } from '@axelar-network/axelar-gmp-sdk-solidity/contracts/interfaces/IAxelarGateway.sol'; +import { IAxelarGasService } from '@axelar-network/axelar-gmp-sdk-solidity/contracts/interfaces/IAxelarGasService.sol'; +import { AxelarExecutable } from '@axelar-network/axelar-gmp-sdk-solidity/contracts/executable/AxelarExecutable.sol'; + import {StringToAddress, AddressToString} from "@axelar-network/axelar-gmp-sdk-solidity/contracts/libs/AddressString.sol"; contract SendReceive is AxelarExecutable { @@ -51,7 +53,7 @@ contract SendReceive is AxelarExecutable { ); // 3. Make GMP call - gateway.callContract(destinationChain, destinationAddress, payload); + IAxelarGateway(gatewayAddress).callContract(destinationChain, destinationAddress, payload); } function _encodePayloadToCosmWasm( @@ -94,6 +96,7 @@ contract SendReceive is AxelarExecutable { } function _execute( + bytes32 /*commandId*/, string calldata /*sourceChain*/, string calldata /*sourceAddress*/, bytes calldata payload diff --git a/packages/axelar-local-dev-multiversx/__tests__/contracts/HelloWorld.sol b/packages/axelar-local-dev-multiversx/__tests__/contracts/HelloWorld.sol index 6e3983db..262b781c 100644 --- a/packages/axelar-local-dev-multiversx/__tests__/contracts/HelloWorld.sol +++ b/packages/axelar-local-dev-multiversx/__tests__/contracts/HelloWorld.sol @@ -1,33 +1,26 @@ //SPDX-License-Identifier: MIT pragma solidity >=0.8.9 <0.9.0; - +import { IAxelarGateway } from '@axelar-network/axelar-gmp-sdk-solidity/contracts/interfaces/IAxelarGateway.sol'; +import { IAxelarGasService } from '@axelar-network/axelar-gmp-sdk-solidity/contracts/interfaces/IAxelarGasService.sol'; import { AxelarExecutable } from '@axelar-network/axelar-gmp-sdk-solidity/contracts/executable/AxelarExecutable.sol'; -import { IAxelarGateway } from '@axelar-network/axelar-cgp-solidity/contracts/interfaces/IAxelarGateway.sol'; -import { IAxelarGasService } from '@axelar-network/axelar-cgp-solidity/contracts/interfaces/IAxelarGasService.sol'; contract HelloWorld is AxelarExecutable { string public value; string public sourceChain; string public sourceAddress; - IAxelarGasService gasService; + IAxelarGasService public immutable gasService; - constructor(address _gateway, address _gasReceiver) - AxelarExecutable(_gateway) - { + constructor(address _gateway, address _gasReceiver) AxelarExecutable(_gateway) { gasService = IAxelarGasService(_gasReceiver); } event Executed(); // Call this function to update the value of this contract along with all its siblings'. - function setRemoteValue( - string memory destinationChain, - string memory destinationAddress, - string calldata message - ) external payable { + function setRemoteValue(string memory destinationChain, string memory destinationAddress, string calldata message) external payable { bytes memory payload = abi.encodePacked(message); if (msg.value > 0) { - gasService.payNativeGasForContractCall{value: msg.value}( + gasService.payNativeGasForContractCall{ value: msg.value }( address(this), destinationChain, destinationAddress, @@ -35,15 +28,11 @@ contract HelloWorld is AxelarExecutable { msg.sender ); } - gateway.callContract(destinationChain, destinationAddress, payload); + IAxelarGateway(gatewayAddress).callContract(destinationChain, destinationAddress, payload); } // Handles calls created by setAndSend. Updates this contract's value - function _execute( - string calldata sourceChain_, - string calldata sourceAddress_, - bytes calldata payload_ - ) internal override { + function _execute(bytes32, string calldata sourceChain_, string calldata sourceAddress_, bytes calldata payload_) internal override { (value) = abi.decode(payload_, (string)); sourceChain = sourceChain_; sourceAddress = sourceAddress_; diff --git a/packages/axelar-local-dev/hardhat.config.js b/packages/axelar-local-dev/hardhat.config.js index 32cb732b..d6927395 100644 --- a/packages/axelar-local-dev/hardhat.config.js +++ b/packages/axelar-local-dev/hardhat.config.js @@ -4,9 +4,10 @@ require('@typechain/hardhat'); /** * @type import('hardhat/config').HardhatUserConfig */ + module.exports = { solidity: { - version: '0.8.9', + version: '0.8.23', settings: { evmVersion: process.env.EVM_VERSION || 'london', optimizer: { diff --git a/packages/axelar-local-dev/package.json b/packages/axelar-local-dev/package.json index 06f717b8..9293182d 100644 --- a/packages/axelar-local-dev/package.json +++ b/packages/axelar-local-dev/package.json @@ -1,6 +1,6 @@ { "name": "@axelar-network/axelar-local-dev", - "version": "2.3.3", + "version": "2.3.5-alpha.1", "description": "", "main": "dist/index.js", "files": [ @@ -13,7 +13,8 @@ "contract-test": "npx hardhat test", "test": "jest", "build-ts": "rm -rf dist && tsc", - "build-contract": "rm -rf src/artifacts artifacts && hardhat clean && hardhat compile && mv artifacts src/artifacts", + "build-cgp-solidity-types": "npx typechain --target=ethers-v5 '../../node_modules/@axelar-network/axelar-cgp-solidity/artifacts/contracts/**/**.json' --out-dir=./src/types/@axelar-network/axelar-cgp-solidity/contracts", + "build-contract": "rm -rf src/artifacts artifacts && hardhat clean && hardhat compile && mv artifacts src/artifacts && npm run build-cgp-solidity-types", "build": "run-s build-contract build-ts", "lint": "solhint 'src/contracts/**/*.sol' && eslint 'test/**/*.js'", "prettier": "prettier --write 'src/contracts/**/*.sol' 'test/**/*.js' 'src/**/*.ts'" @@ -33,10 +34,10 @@ }, "homepage": "https://github.com/axelarnetwork/axelar-local-dev#readme", "dependencies": { - "@axelar-network/axelar-cgp-solidity": "^6.3.0", + "@axelar-network/axelar-cgp-solidity": "^6.4.0", "@axelar-network/axelar-chains-config": "^1.3.0", - "@axelar-network/axelar-gmp-sdk-solidity": "^5.7.0", - "@axelar-network/interchain-token-service": "^1.2.4", + "@axelar-network/axelar-gmp-sdk-solidity": "^6.0.6", + "@axelar-network/interchain-token-service": "^2.1.0", "ethers": "^5.6.5", "fs-extra": "^10.1.0", "ganache": "^7.1.0", diff --git a/packages/axelar-local-dev/src/Network.ts b/packages/axelar-local-dev/src/Network.ts index 481aa768..cae8b95a 100644 --- a/packages/axelar-local-dev/src/Network.ts +++ b/packages/axelar-local-dev/src/Network.ts @@ -20,11 +20,12 @@ import { InterchainTokenService as InterchainTokenServiceContract, InterchainTokenFactory as InterchainTokenFactoryContract, InterchainProxy, + GatewayCaller, } from './contracts'; -import { AxelarGateway__factory as AxelarGatewayFactory } from './types/factories/@axelar-network/axelar-cgp-solidity/contracts/AxelarGateway__factory'; +import { AxelarGateway__factory as AxelarGatewayFactory } from './types/@axelar-network/axelar-cgp-solidity/contracts/factories/AxelarGateway__factory'; import { AxelarGateway } from './types/@axelar-network/axelar-cgp-solidity/contracts/AxelarGateway'; import { InterchainTokenService, InterchainTokenFactory } from './types/@axelar-network/interchain-token-service/contracts'; -import { AxelarGasService__factory as AxelarGasServiceFactory } from './types/factories/@axelar-network/axelar-cgp-solidity/contracts/gas-service/AxelarGasService__factory'; +import { AxelarGasService__factory as AxelarGasServiceFactory } from './types/@axelar-network/axelar-cgp-solidity/contracts/factories/gas-service/AxelarGasService__factory'; import { InterchainTokenService__factory as InterchainTokenServiceFactory, InterchainTokenFactory__factory as InterchainTokenFactoryFactory, @@ -237,6 +238,7 @@ export class Network { const tokenManager = await deployContract(wallet, TokenManager, [interchainTokenServiceAddress]); const tokenHandler = await deployContract(wallet, TokenHandler, []); const interchainTokenFactoryAddress = await this.create3Deployer.deployedAddress('0x', wallet.address, factorySalt); + const gatewayCaller = await deployContract(wallet, GatewayCaller, [this.gateway.address, this.gasService.address]); const tokenServiceImplementation = await deployContract(wallet, InterchainTokenServiceContract, [ tokenManagerDeployer.address, @@ -247,6 +249,7 @@ export class Network { this.name, tokenManager.address, tokenHandler.address, + gatewayCaller.address, ]); const factory = new ContractFactory(InterchainProxy.abi, InterchainProxy.bytecode); let bytecode = factory.getDeployTransaction( diff --git a/packages/axelar-local-dev/src/__tests__/export.spec.ts b/packages/axelar-local-dev/src/__tests__/export.spec.ts index 8a9dbf55..34415eaa 100644 --- a/packages/axelar-local-dev/src/__tests__/export.spec.ts +++ b/packages/axelar-local-dev/src/__tests__/export.spec.ts @@ -6,7 +6,7 @@ import { Wallet } from 'ethers'; import fs from 'fs'; const { expect } = chai; import { deployContract, setLogger, createAndExport, destroyExported, Network, networks, setupAndExport } from '../'; -import { AxelarExpressExecutable__factory as AxelarExpressExecutableFactory } from '../types/factories/@axelar-network/axelar-gmp-sdk-solidity/contracts/express/AxelarExpressExecutable__factory'; +import { AxelarExpressExecutableWithToken__factory as AxelarExpressExecutableFactory } from '../types/factories/@axelar-network/axelar-gmp-sdk-solidity/contracts/express/AxelarExpressExecutableWithToken__factory'; import { ExpressWithToken__factory as ExpressWithTokenFactory } from '../types/factories/src/contracts/test/ExpressWithToken__factory'; import { ExecutableWithToken__factory as ExecuteWithTokenFactory } from '../types/factories/src/contracts/test/ExecutableWithToken__factory'; import ExpressWithToken from '../artifacts/src/contracts/test/ExpressWithToken.sol/ExpressWithToken.json'; diff --git a/packages/axelar-local-dev/src/contracts/GMP.sol b/packages/axelar-local-dev/src/contracts/GMP.sol index 72ffe7b8..8da748ec 100644 --- a/packages/axelar-local-dev/src/contracts/GMP.sol +++ b/packages/axelar-local-dev/src/contracts/GMP.sol @@ -2,14 +2,6 @@ pragma solidity ^0.8.0; -// Axelar CGP SDK -import { TokenDeployer } from '@axelar-network/axelar-cgp-solidity/contracts/TokenDeployer.sol'; -import { AxelarGateway } from '@axelar-network/axelar-cgp-solidity/contracts/AxelarGateway.sol'; -import { AxelarAuthWeighted } from '@axelar-network/axelar-cgp-solidity/contracts/auth/AxelarAuthWeighted.sol'; -import { AxelarGatewayProxy } from '@axelar-network/axelar-cgp-solidity/contracts/AxelarGatewayProxy.sol'; -import { AxelarGasService } from '@axelar-network/axelar-cgp-solidity/contracts/gas-service/AxelarGasService.sol'; -import { AxelarGasServiceProxy } from '@axelar-network/axelar-cgp-solidity/contracts/gas-service/AxelarGasServiceProxy.sol'; - // Axelar GMP SDK import { IAxelarExecutable } from '@axelar-network/axelar-gmp-sdk-solidity/contracts/interfaces/IAxelarExecutable.sol'; -import { AxelarExpressExecutable } from '@axelar-network/axelar-gmp-sdk-solidity/contracts/express/AxelarExpressExecutable.sol'; +import { AxelarExpressExecutableWithToken } from '@axelar-network/axelar-gmp-sdk-solidity/contracts/express/AxelarExpressExecutableWithToken.sol'; diff --git a/packages/axelar-local-dev/src/contracts/ITS.sol b/packages/axelar-local-dev/src/contracts/ITS.sol index 40ddc5d5..b54914b2 100644 --- a/packages/axelar-local-dev/src/contracts/ITS.sol +++ b/packages/axelar-local-dev/src/contracts/ITS.sol @@ -1,9 +1,10 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.9; +pragma solidity ^0.8.9; // Interchain Token Service import { TokenManagerDeployer } from '@axelar-network/interchain-token-service/contracts/utils/TokenManagerDeployer.sol'; +import { GatewayCaller } from '@axelar-network/interchain-token-service/contracts/utils/GatewayCaller.sol'; import { InterchainToken } from '@axelar-network/interchain-token-service/contracts/interchain-token/InterchainToken.sol'; import { InterchainTokenDeployer } from '@axelar-network/interchain-token-service/contracts/utils/InterchainTokenDeployer.sol'; import { TokenManager } from '@axelar-network/interchain-token-service/contracts/token-manager/TokenManager.sol'; diff --git a/packages/axelar-local-dev/src/contracts/index.ts b/packages/axelar-local-dev/src/contracts/index.ts index 16d50d9e..c2a15f0d 100644 --- a/packages/axelar-local-dev/src/contracts/index.ts +++ b/packages/axelar-local-dev/src/contracts/index.ts @@ -1,15 +1,16 @@ -import TokenDeployer from '../artifacts/@axelar-network/axelar-cgp-solidity/contracts/TokenDeployer.sol/TokenDeployer.json'; -import AxelarGatewayProxy from '../artifacts/@axelar-network/axelar-cgp-solidity/contracts/AxelarGatewayProxy.sol/AxelarGatewayProxy.json'; -import AxelarGateway from '../artifacts/@axelar-network/axelar-cgp-solidity/contracts/AxelarGateway.sol/AxelarGateway.json'; -import IAxelarGateway from '../artifacts/@axelar-network/axelar-cgp-solidity/contracts/interfaces/IAxelarGateway.sol/IAxelarGateway.json'; -import BurnableMintableCappedERC20 from '../artifacts/@axelar-network/axelar-cgp-solidity/contracts/BurnableMintableCappedERC20.sol/BurnableMintableCappedERC20.json'; -import Auth from '../artifacts/@axelar-network/axelar-cgp-solidity/contracts/auth/AxelarAuthWeighted.sol/AxelarAuthWeighted.json'; -import AxelarGasReceiver from '../artifacts/@axelar-network/axelar-cgp-solidity/contracts/gas-service/AxelarGasService.sol/AxelarGasService.json'; -import AxelarGasReceiverProxy from '../artifacts/@axelar-network/axelar-cgp-solidity/contracts/gas-service/AxelarGasServiceProxy.sol/AxelarGasServiceProxy.json'; +import TokenDeployer from '@axelar-network/axelar-cgp-solidity/artifacts/contracts/TokenDeployer.sol/TokenDeployer.json'; +import AxelarGatewayProxy from '@axelar-network/axelar-cgp-solidity/artifacts/contracts/AxelarGatewayProxy.sol/AxelarGatewayProxy.json'; +import AxelarGateway from '@axelar-network/axelar-cgp-solidity/artifacts/contracts/AxelarGateway.sol/AxelarGateway.json'; +import IAxelarGateway from '@axelar-network/axelar-cgp-solidity/artifacts/contracts/interfaces/IAxelarGateway.sol/IAxelarGateway.json'; +import BurnableMintableCappedERC20 from '@axelar-network/axelar-cgp-solidity/artifacts/contracts/BurnableMintableCappedERC20.sol/BurnableMintableCappedERC20.json'; +import Auth from '@axelar-network/axelar-cgp-solidity/artifacts/contracts/auth/AxelarAuthWeighted.sol/AxelarAuthWeighted.json'; +import AxelarGasReceiver from '@axelar-network/axelar-cgp-solidity/artifacts/contracts/gas-service/AxelarGasService.sol/AxelarGasService.json'; +import AxelarGasReceiverProxy from '@axelar-network/axelar-cgp-solidity/artifacts/contracts/gas-service/AxelarGasServiceProxy.sol/AxelarGasServiceProxy.json'; import IAxelarGasService from '../artifacts/@axelar-network/axelar-gmp-sdk-solidity/contracts/interfaces/IAxelarGasService.sol/IAxelarGasService.json'; import ConstAddressDeployer from '@axelar-network/axelar-gmp-sdk-solidity/artifacts/contracts/deploy/ConstAddressDeployer.sol/ConstAddressDeployer.json'; import Create3Deployer from '@axelar-network/axelar-gmp-sdk-solidity/artifacts/contracts/deploy/Create3Deployer.sol/Create3Deployer.json'; import IAxelarExecutable from '../artifacts/@axelar-network/axelar-gmp-sdk-solidity/contracts/interfaces/IAxelarExecutable.sol/IAxelarExecutable.json'; +import IAxelarExecutableWithToken from '../artifacts/@axelar-network/axelar-gmp-sdk-solidity/contracts/interfaces/IAxelarExecutableWithToken.sol/IAxelarExecutableWithToken.json'; import TokenManagerDeployer from '../artifacts/@axelar-network/interchain-token-service/contracts/utils/TokenManagerDeployer.sol/TokenManagerDeployer.json'; import InterchainToken from '../artifacts/@axelar-network/interchain-token-service/contracts/interchain-token/InterchainToken.sol/InterchainToken.json'; @@ -21,6 +22,7 @@ import InterchainTokenFactory from '../artifacts/@axelar-network/interchain-toke import InterchainProxy from '../artifacts/@axelar-network/interchain-token-service/contracts/proxies/InterchainProxy.sol/InterchainProxy.json'; import IInterchainTokenService from '../artifacts/@axelar-network/interchain-token-service/contracts/interfaces/IInterchainTokenService.sol/IInterchainTokenService.json'; import IInterchainTokenFactory from '../artifacts/@axelar-network/interchain-token-service/contracts/interfaces/IInterchainTokenFactory.sol/IInterchainTokenFactory.json'; +import GatewayCaller from '../artifacts/@axelar-network/interchain-token-service/contracts/utils/GatewayCaller.sol/GatewayCaller.json'; export { TokenDeployer, @@ -35,6 +37,7 @@ export { Create3Deployer, IAxelarGasService, IAxelarExecutable, + IAxelarExecutableWithToken, TokenManagerDeployer, InterchainToken, InterchainTokenDeployer, @@ -45,4 +48,5 @@ export { InterchainTokenFactory, IInterchainTokenService, IInterchainTokenFactory, + GatewayCaller, }; diff --git a/packages/axelar-local-dev/src/contracts/test/Executable.sol b/packages/axelar-local-dev/src/contracts/test/Executable.sol index ec68d5db..7fc2fb6e 100644 --- a/packages/axelar-local-dev/src/contracts/test/Executable.sol +++ b/packages/axelar-local-dev/src/contracts/test/Executable.sol @@ -2,6 +2,7 @@ pragma solidity ^0.8.0; +import { IAxelarGateway } from '@axelar-network/axelar-gmp-sdk-solidity/contracts/interfaces/IAxelarGateway.sol'; import { IAxelarGasService } from '@axelar-network/axelar-gmp-sdk-solidity/contracts/interfaces/IAxelarGasService.sol'; import { AxelarExecutable } from '@axelar-network/axelar-gmp-sdk-solidity/contracts/executable/AxelarExecutable.sol'; @@ -28,12 +29,17 @@ contract Executable is AxelarExecutable { if (msg.value > 0) { gasService.payNativeGasForContractCall{ value: msg.value }(address(this), chain, siblings[chain], payload, msg.sender); } - gateway.callContract(chain, siblings[chain], payload); + IAxelarGateway(gatewayAddress).callContract(chain, siblings[chain], payload); } /* Handles calls created by setAndSend. Updates this contract's value and gives the token received to the destination specified at the source chain. */ - function _execute(string calldata sourceChain_, string calldata sourceAddress_, bytes calldata payload_) internal override { + function _execute( + bytes32, + string calldata sourceChain_, + string calldata sourceAddress_, + bytes calldata payload_ + ) internal override { (value) = abi.decode(payload_, (string)); sourceChain = sourceChain_; sourceAddress = sourceAddress_; diff --git a/packages/axelar-local-dev/src/contracts/test/ExecutableWithToken.sol b/packages/axelar-local-dev/src/contracts/test/ExecutableWithToken.sol index 4959d866..93997a31 100644 --- a/packages/axelar-local-dev/src/contracts/test/ExecutableWithToken.sol +++ b/packages/axelar-local-dev/src/contracts/test/ExecutableWithToken.sol @@ -3,17 +3,18 @@ pragma solidity ^0.8.0; import { IERC20 } from '@axelar-network/axelar-gmp-sdk-solidity/contracts/interfaces/IERC20.sol'; +import { IAxelarGatewayWithToken } from '@axelar-network/axelar-gmp-sdk-solidity/contracts/interfaces/IAxelarGatewayWithToken.sol'; import { IAxelarGasService } from '@axelar-network/axelar-gmp-sdk-solidity/contracts/interfaces/IAxelarGasService.sol'; -import { AxelarExecutable } from '@axelar-network/axelar-gmp-sdk-solidity/contracts/executable/AxelarExecutable.sol'; +import { AxelarExecutableWithToken } from '@axelar-network/axelar-gmp-sdk-solidity/contracts/executable/AxelarExecutableWithToken.sol'; -contract ExecutableWithToken is AxelarExecutable { +contract ExecutableWithToken is AxelarExecutableWithToken { string public value; string public sourceChain; string public sourceAddress; IAxelarGasService public immutable gasService; mapping(string => string) public siblings; - constructor(address gateway_, address gasService_) AxelarExecutable(gateway_) { + constructor(address gateway_, address gasService_) AxelarExecutableWithToken(gateway_) { gasService = IAxelarGasService(gasService_); } @@ -43,15 +44,16 @@ contract ExecutableWithToken is AxelarExecutable { msg.sender ); } - address token = gateway.tokenAddresses(symbol); + address token = IAxelarGatewayWithToken(gatewayAddress).tokenAddresses(symbol); IERC20(token).transferFrom(msg.sender, address(this), amount); - IERC20(token).approve(address(gateway), amount); - gateway.callContractWithToken(chain, siblings[chain], payload, symbol, amount); + IERC20(token).approve(gatewayAddress, amount); + IAxelarGatewayWithToken(gatewayAddress).callContractWithToken(chain, siblings[chain], payload, symbol, amount); } /*Handles calls created by setAndSend. Updates this contract's value and gives the token received to the destination specified at the source chain. */ function _executeWithToken( + bytes32, string calldata sourceChain_, string calldata sourceAddress_, bytes calldata payload_, @@ -62,7 +64,14 @@ contract ExecutableWithToken is AxelarExecutable { (value, destinationAddress) = abi.decode(payload_, (string, address)); sourceChain = sourceChain_; sourceAddress = sourceAddress_; - address token = gateway.tokenAddresses(symbol); + address token = IAxelarGatewayWithToken(gatewayAddress).tokenAddresses(symbol); IERC20(token).transfer(destinationAddress, amount); } + + function _execute( + bytes32, + string calldata, + string calldata, + bytes calldata + ) internal override {} } diff --git a/packages/axelar-local-dev/src/contracts/test/ExpressWithToken.sol b/packages/axelar-local-dev/src/contracts/test/ExpressWithToken.sol index 0e56f88b..f5b9b7eb 100644 --- a/packages/axelar-local-dev/src/contracts/test/ExpressWithToken.sol +++ b/packages/axelar-local-dev/src/contracts/test/ExpressWithToken.sol @@ -2,16 +2,16 @@ pragma solidity ^0.8.0; import { AxelarExecutable } from '@axelar-network/axelar-gmp-sdk-solidity/contracts/executable/AxelarExecutable.sol'; -import { AxelarExpressExecutable } from '@axelar-network/axelar-gmp-sdk-solidity/contracts/express/AxelarExpressExecutable.sol'; -import { IAxelarGateway } from '@axelar-network/axelar-gmp-sdk-solidity/contracts/interfaces/IAxelarGateway.sol'; +import { AxelarExpressExecutableWithToken } from '@axelar-network/axelar-gmp-sdk-solidity/contracts/express/AxelarExpressExecutableWithToken.sol'; +import { IAxelarGatewayWithToken } from '@axelar-network/axelar-gmp-sdk-solidity/contracts/interfaces/IAxelarGatewayWithToken.sol'; import { IERC20 } from '@axelar-network/axelar-gmp-sdk-solidity/contracts/interfaces/IERC20.sol'; import { IAxelarGasService } from '@axelar-network/axelar-gmp-sdk-solidity/contracts/interfaces/IAxelarGasService.sol'; import { Upgradable } from '@axelar-network/axelar-gmp-sdk-solidity/contracts/upgradable/Upgradable.sol'; -contract ExpressWithToken is AxelarExpressExecutable { +contract ExpressWithToken is AxelarExpressExecutableWithToken { IAxelarGasService public immutable gasService; - constructor(address gateway_, address gasReceiver_) AxelarExpressExecutable(gateway_) { + constructor(address gateway_, address gasReceiver_) AxelarExpressExecutableWithToken(gateway_) { gasService = IAxelarGasService(gasReceiver_); } @@ -22,9 +22,9 @@ contract ExpressWithToken is AxelarExpressExecutable { string memory symbol, uint256 amount ) external payable { - address tokenAddress = gateway.tokenAddresses(symbol); + address tokenAddress = IAxelarGatewayWithToken(gatewayAddress).tokenAddresses(symbol); IERC20(tokenAddress).transferFrom(msg.sender, address(this), amount); - IERC20(tokenAddress).approve(address(gateway), amount); + IERC20(tokenAddress).approve(gatewayAddress, amount); bytes memory payload = abi.encode(destinationAddresses); if (msg.value > 0) { gasService.payNativeGasForExpressCallWithToken{ value: msg.value }( @@ -37,10 +37,18 @@ contract ExpressWithToken is AxelarExpressExecutable { msg.sender ); } - gateway.callContractWithToken(destinationChain, destinationAddress, payload, symbol, amount); + IAxelarGatewayWithToken(gatewayAddress).callContractWithToken(destinationChain, destinationAddress, payload, symbol, amount); } + function _execute( + bytes32 commandId, + string calldata sourceChain, + string calldata sourceAddress, + bytes calldata payload + ) internal override {} + function _executeWithToken( + bytes32, string calldata, string calldata, bytes calldata payload, @@ -48,13 +56,11 @@ contract ExpressWithToken is AxelarExpressExecutable { uint256 amount ) internal override { address[] memory recipients = abi.decode(payload, (address[])); - address tokenAddress = gateway.tokenAddresses(tokenSymbol); + address tokenAddress = IAxelarGatewayWithToken(gatewayAddress).tokenAddresses(tokenSymbol); uint256 sentAmount = amount / recipients.length; for (uint256 i = 0; i < recipients.length; i++) { IERC20(tokenAddress).transfer(recipients[i], sentAmount); } } - - function _execute(string calldata, string calldata, bytes calldata payload) internal override {} } diff --git a/packages/axelar-local-dev/src/its.ts b/packages/axelar-local-dev/src/its.ts index 3f758cb5..ab57b3d7 100644 --- a/packages/axelar-local-dev/src/its.ts +++ b/packages/axelar-local-dev/src/its.ts @@ -48,7 +48,7 @@ export async function setupITS(network: Network) { await ( await factory .connect(wallet) - .deployRemoteCanonicalInterchainToken('', tokenAddress, destinationChain.name, gasValue, { value: gasValue }) + .registerCanonicalInterchainToken(tokenAddress) ).wait(); await relay(); @@ -69,7 +69,8 @@ export async function setupITS(network: Network) { const factory = network.interchainTokenFactory; await (await factory.connect(wallet).deployInterchainToken(salt, name, symbol, decimals, mintAmount, distributor)).wait(); - const tokenAddress = await factory.interchainTokenAddress(wallet.address, salt); + const tokenId = await factory.interchainTokenId(wallet.address, salt); + const tokenAddress = await network.interchainTokenService.interchainTokenAddress(tokenId); return IInterchainTokenFactory.connect(tokenAddress, wallet); }; @@ -91,12 +92,13 @@ export async function setupITS(network: Network) { await ( await factory .connect(wallet) - .deployRemoteInterchainToken('', salt, distributor, destinationChain.name, gasValue, { value: gasValue }) + .deployRemoteInterchainTokenWithMinter(salt, distributor, destinationChain.name, distributor, gasValue, { value: gasValue }) ).wait(); await relay(); - const tokenAddress = await factory.interchainTokenAddress(wallet.address, salt); + const tokenId = await factory.interchainTokenId(wallet.address, salt); + const tokenAddress = await network.interchainTokenService.interchainTokenAddress(tokenId); return IInterchainTokenFactory.connect(tokenAddress, destinationChain.provider); }; } diff --git a/packages/axelar-local-dev/src/networkUtils.ts b/packages/axelar-local-dev/src/networkUtils.ts index 28eb57a6..e22ce0ab 100644 --- a/packages/axelar-local-dev/src/networkUtils.ts +++ b/packages/axelar-local-dev/src/networkUtils.ts @@ -7,8 +7,8 @@ import { ethers, Wallet, Contract, providers, getDefaultProvider } from 'ethers' import { merge } from 'lodash'; import { defaultAccounts, setJSON, httpGet, logger } from './utils'; import { Network, networks, NetworkOptions, NetworkInfo, NetworkSetup } from './Network'; -import { AxelarGateway__factory as AxelarGatewayFactory } from './types/factories/@axelar-network/axelar-cgp-solidity/contracts/AxelarGateway__factory'; -import { AxelarGasService__factory as AxelarGasServiceFactory } from './types/factories/@axelar-network/axelar-cgp-solidity/contracts/gas-service/AxelarGasService__factory'; +import { AxelarGateway__factory as AxelarGatewayFactory } from './types/@axelar-network/axelar-cgp-solidity/contracts/factories/AxelarGateway__factory'; +import { AxelarGasService__factory as AxelarGasServiceFactory } from './types/@axelar-network/axelar-cgp-solidity/contracts/factories/gas-service/AxelarGasService__factory'; import { Server } from 'http'; import { ConstAddressDeployer, Create3Deployer, IInterchainTokenService } from './contracts'; import { diff --git a/packages/axelar-local-dev/src/relay/Command.ts b/packages/axelar-local-dev/src/relay/Command.ts index 32a11109..be830ee4 100644 --- a/packages/axelar-local-dev/src/relay/Command.ts +++ b/packages/axelar-local-dev/src/relay/Command.ts @@ -4,7 +4,7 @@ import { ethers, Contract, ContractReceipt } from 'ethers'; const { defaultAbiCoder } = ethers.utils; import { networks } from '../Network'; import { CallContractArgs, CallContractWithTokenArgs, RelayData } from './types'; -import { IAxelarExecutable } from '../contracts'; +import { IAxelarExecutable, IAxelarExecutableWithToken } from '../contracts'; //An internal class for handling axelar commands. export class Command { @@ -64,7 +64,7 @@ export class Command { const to = networks.find((chain) => chain.name == args.to); if (!to) return; - const contract = new Contract(args.destinationContractAddress, IAxelarExecutable.abi, to.relayerWallet); + const contract = new Contract(args.destinationContractAddress, IAxelarExecutableWithToken.abi, to.relayerWallet); const receipt = await contract .executeWithToken( commandId, diff --git a/packages/axelar-local-dev/src/relay/EvmRelayer.ts b/packages/axelar-local-dev/src/relay/EvmRelayer.ts index 319cea58..2648d761 100644 --- a/packages/axelar-local-dev/src/relay/EvmRelayer.ts +++ b/packages/axelar-local-dev/src/relay/EvmRelayer.ts @@ -11,7 +11,7 @@ import { ContractCallEventObject, ContractCallWithTokenEventObject, } from '../types/@axelar-network/axelar-cgp-solidity/contracts/AxelarGateway'; -import { AxelarExpressExecutable__factory as AxelarExpressExecutableFactory } from '../types/factories/@axelar-network/axelar-gmp-sdk-solidity/contracts/express/AxelarExpressExecutable__factory'; +import { AxelarExpressExecutableWithToken__factory as AxelarExpressExecutableFactory } from '../types/factories/@axelar-network/axelar-gmp-sdk-solidity/contracts/express/AxelarExpressExecutableWithToken__factory'; const AddressZero = ethers.constants.AddressZero;