Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(evm)!: support ITS v2.1 release #502

Merged
merged 21 commits into from
Jan 21, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 19 additions & 4 deletions .github/workflows/test-evm.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -118,9 +118,6 @@ jobs:
- name: Upgrade ITS using create2
run: node evm/deploy-its.js -m create2 -u -y

- name: InterchainTokenService deploy interchain token on current chain
run: node evm/its.js --action deployInterchainToken --name "test" --symbol "TST" --decimals 18 --minter 0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266 --destinationChain '' --gasValue 0 --salt "salt" -y

- name: InterchainTokenService set hub
run: node evm/its.js --action setTrustedAddress --trustedChain axelar --trustedAddress axelar1xyz -y

Expand All @@ -131,12 +128,30 @@ jobs:
run: node evm/interchainTokenFactory.js --action deployInterchainToken --name "test" --symbol "TST" --decimals 18 --minter 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 --salt "salt" -y

- name: InterchainTokenFactory deploy interchain token to destination chain
run: node evm/interchainTokenFactory.js --action deployRemoteInterchainToken --destinationChain remote --minter 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 --salt "salt" -y
run: node evm/interchainTokenFactory.js --action deployRemoteInterchainToken --destinationChain remote --salt "salt" -y

# Note that tokenAddress is hardcoded since it's derivation must always be the same
milapsheth marked this conversation as resolved.
Show resolved Hide resolved
- name: InterchainTokenService register token metadata
run: node evm/its.js --action registerTokenMetadata --tokenAddress 0x49c06259B42540a025A73a32eF2Fd183c0FDB1D2 -y

- name: InterchainTokenFactory register custom token
run: node evm/interchainTokenFactory.js --action registerCustomToken --tokenAddress 0x49c06259B42540a025A73a32eF2Fd183c0FDB1D2 --tokenManagerType 4 --operator 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 --salt "salt" -y

- name: InterchainTokenFactory link token
run: node evm/interchainTokenFactory.js --action linkToken --destinationChain remote --destinationTokenAddress "0x1234" --tokenManagerType 4 --linkParams "0x5678" --salt "salt" -y

# Note that tokenId is hardcoded since it's derivation must always be the same
- name: InterchainTokenService interchain transfer to destination chain
run: node evm/its.js --action interchainTransfer --destinationChain remote --tokenId 0x88a9d17b8f4e6e4aaceb3c8f53d54eedb144276f1dd2b9f2d17de784aa090be7 --destinationAddress 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 --amount 1 --gasValue 0 -y

# Note that tokenId is hardcoded since it's derivation must always be the same
- name: InterchainTokenService set flow limit
run: node evm/its.js --action setFlowLimits --tokenIds 0x88a9d17b8f4e6e4aaceb3c8f53d54eedb144276f1dd2b9f2d17de784aa090be7 --flowLimits 123 -y

# Note that tokenId is hardcoded since it's derivation must always be the same
- name: InterchainTokenService get flow limit
run: node evm/its.js --action flowLimit --tokenId 0x88a9d17b8f4e6e4aaceb3c8f53d54eedb144276f1dd2b9f2d17de784aa090be7 -y

- name: Add gasOptions to local.json
run: |
jq '.chains.test += {"gasOptions": {"gasLimit": 8000000}} | .chains.test.contracts.AxelarGateway += {"gasOptions": {"gasLimit": 8000000}}' ./axelar-chains-config/info/local.json > temp.json && mv temp.json ./axelar-chains-config/info/local.json
Expand Down
74 changes: 69 additions & 5 deletions evm/interchainTokenFactory.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ async function processCommand(config, chain, options) {

const contracts = chain.contracts;
const contractName = 'InterchainTokenFactory';

const interchainTokenFactoryAddress = address || contracts.InterchainTokenFactory?.address;
const interchainTokenServiceAddress = contracts.InterchainTokenService?.address;

Expand Down Expand Up @@ -143,30 +142,29 @@ async function processCommand(config, chain, options) {

const tokenId = await interchainTokenFactory.interchainTokenId(wallet.address, deploymentSalt);
printInfo('tokenId', tokenId);
printInfo('Token address', await interchainTokenService.registeredTokenAddress(tokenId));

await handleTx(tx, chain, interchainTokenService, options.action, 'TokenManagerDeployed', 'InterchainTokenDeploymentStarted');

break;
}

case 'deployRemoteInterchainToken': {
const { minter, destinationChain, gasValue } = options;
const { destinationChain, gasValue } = options;

const deploymentSalt = getDeploymentSalt(options);

validateParameters({
isNonEmptyString: { destinationChain },
isAddress: { minter },
isValidNumber: { gasValue },
});

if ((await interchainTokenService.trustedAddress(destinationChain)) === '') {
throw new Error(`Destination chain ${destinationChain} is not trusted by ITS`);
}

const tx = await interchainTokenFactory['deployRemoteInterchainToken(bytes32,address,string,uint256)'](
const tx = await interchainTokenFactory['deployRemoteInterchainToken(bytes32,string,uint256)'](
deploymentSalt,
minter,
destinationChain,
gasValue,
{
Expand Down Expand Up @@ -225,6 +223,66 @@ async function processCommand(config, chain, options) {
break;
}

case 'registerCustomToken': {
milapsheth marked this conversation as resolved.
Show resolved Hide resolved
Foivos marked this conversation as resolved.
Show resolved Hide resolved
const { tokenAddress, tokenManagerType, operator, gasValue } = options;

const deploymentSalt = getDeploymentSalt(options);

validateParameters({
isValidAddress: { tokenAddress },
isAddress: { operator },
isValidNumber: { tokenManagerType, gasValue },
});

const tx = await interchainTokenFactory.registerCustomToken(
deploymentSalt,
tokenAddress,
tokenManagerType,
operator,
gasValue,
{ value: gasValue, ...gasOptions },
);
const tokenId = await interchainTokenFactory.linkedTokenId(wallet.address, deploymentSalt);
milapsheth marked this conversation as resolved.
Show resolved Hide resolved
printInfo('tokenId', tokenId);

await handleTx(tx, chain, interchainTokenService, options.action, 'TokenManagerDeployed', 'InterchainTokenDeploymentStarted');

break;
}

case 'linkToken': {
const { destinationChain, destinationTokenAddress, tokenManagerType, linkParams, gasValue } = options;

const deploymentSalt = getDeploymentSalt(options);

if ((await interchainTokenService.trustedAddress(destinationChain)) === '') {
throw new Error(`Destination chain ${destinationChain} is not trusted by ITS`);
}

validateParameters({
isNonEmptyString: { destinationChain },
isValidNumber: { tokenManagerType, gasValue },
isValidBytesArray: { linkParams, destinationTokenAddress },
});

const tx = await interchainTokenFactory.linkToken(
deploymentSalt,
destinationChain,
destinationTokenAddress,
tokenManagerType,
linkParams,
gasValue,
{ value: gasValue, ...gasOptions },
);

const tokenId = await interchainTokenFactory.linkedTokenId(wallet.address, deploymentSalt);
printInfo('tokenId', tokenId);

await handleTx(tx, chain, interchainTokenService, options.action, 'LinkTokenStarted');

break;
}

default: {
throw new Error(`Unknown action ${action}`);
}
Expand Down Expand Up @@ -255,6 +313,8 @@ if (require.main === module) {
'deployRemoteInterchainToken',
'registerCanonicalInterchainToken',
'deployRemoteCanonicalInterchainToken',
'registerCustomToken',
'linkToken',
])
.makeOptionMandatory(true),
);
Expand All @@ -267,11 +327,15 @@ if (require.main === module) {
program.addOption(new Option('--symbol <symbol>', 'token symbol'));
program.addOption(new Option('--decimals <decimals>', 'token decimals'));
program.addOption(new Option('--minter <minter>', 'token minter').default(AddressZero));
program.addOption(new Option('--operator <operator>', 'token manager operator').default(AddressZero));
program.addOption(new Option('--tokenManagerType <tokenManagerType>', 'token manager type'));
program.addOption(new Option('--initialSupply <initialSupply>', 'initial supply').default(1e9));
program.addOption(new Option('--destinationChain <destinationChain>', 'destination chain'));
program.addOption(new Option('--destinationAddress <destinationAddress>', 'destination address'));
program.addOption(new Option('--gasValue <gasValue>', 'gas value').default(0));
program.addOption(new Option('--rawSalt <rawSalt>', 'raw deployment salt').env('RAW_SALT'));
program.addOption(new Option('--destinationTokenAddress <destinationTokenAddress>', 'destination token address'));
program.addOption(new Option('--linkParams <linkParams>', 'parameters to use for linking'));

program.action((options) => {
main(options);
Expand Down
Loading
Loading