From c17b6212243bb59a9b35a852806d6c7216c41566 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Tue, 3 Dec 2024 16:41:40 -0500 Subject: [PATCH] teleporter -> icm-contracts --- CONTRIBUTING.md | 8 ++++---- contracts/governance/ValidatorSetSig.sol | 2 +- contracts/ictt/README.md | 4 ++-- contracts/ictt/TokenHome/ERC20TokenHome.sol | 2 +- contracts/ictt/TokenHome/ERC20TokenHomeUpgradeable.sol | 4 ++-- contracts/ictt/TokenHome/NativeTokenHome.sol | 2 +- .../ictt/TokenHome/NativeTokenHomeUpgradeable.sol | 4 ++-- contracts/ictt/TokenHome/TokenHome.sol | 2 +- .../ictt/TokenHome/interfaces/IERC20TokenHome.sol | 2 +- .../ictt/TokenHome/interfaces/INativeTokenHome.sol | 2 +- contracts/ictt/TokenRemote/ERC20TokenRemote.sol | 2 +- .../ictt/TokenRemote/ERC20TokenRemoteUpgradeable.sol | 2 +- contracts/ictt/TokenRemote/NativeTokenRemote.sol | 2 +- .../ictt/TokenRemote/NativeTokenRemoteUpgradeable.sol | 2 +- contracts/ictt/TokenRemote/TokenRemote.sol | 2 +- contracts/ictt/TokenRemote/interfaces/ITokenRemote.sol | 2 +- contracts/ictt/interfaces/IERC20TokenTransferrer.sol | 2 +- contracts/ictt/interfaces/INativeTokenTransferrer.sol | 2 +- contracts/ictt/interfaces/ITokenTransferrer.sol | 2 +- contracts/ictt/interfaces/IWrappedNativeToken.sol | 2 +- contracts/teleporter/ITeleporterMessenger.sol | 2 +- contracts/teleporter/ITeleporterReceiver.sol | 2 +- contracts/teleporter/README.md | 6 +++--- contracts/teleporter/ReceiptQueue.sol | 2 +- contracts/teleporter/TeleporterMessenger.sol | 2 +- contracts/teleporter/registry/TeleporterRegistry.sol | 2 +- .../teleporter/registry/TeleporterRegistryApp.sol | 2 +- .../registry/TeleporterRegistryAppUpgradeable.sol | 2 +- .../registry/TeleporterRegistryOwnableApp.sol | 2 +- .../TeleporterRegistryOwnableAppUpgradeable.sol | 2 +- contracts/utilities/ReentrancyGuards.sol | 2 +- contracts/utilities/SafeERC20TransferFrom.sol | 2 +- contracts/utilities/SafeWrappedNativeTokenDeposit.sol | 2 +- contracts/utilities/SendReentrancyGuardUpgradeable.sol | 2 +- .../validator-manager/ERC20TokenStakingManager.sol | 2 +- .../validator-manager/NativeTokenStakingManager.sol | 2 +- contracts/validator-manager/PoAValidatorManager.sol | 2 +- contracts/validator-manager/PoSValidatorManager.sol | 2 +- contracts/validator-manager/ValidatorManager.sol | 2 +- go.mod | 3 ++- go.sum | 2 ++ scripts/deploy_registry.sh | 6 +++--- scripts/deploy_teleporter.sh | 10 +++++----- 43 files changed, 59 insertions(+), 56 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 5dd02652e..b52f318d0 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -12,12 +12,12 @@ To start developing on Teleporter, you'll need Solidity >= v0.8.25. [Foundry](ht ### Making an Issue -- Check that the issue you're filing doesn't already exist by searching under [issues](https://github.com/ava-labs/teleporter/issues). -- If you're unable to find an open issue addressing the problem, [open a new one](https://github.com/ava-labs/teleporter/issues/new/choose). Be sure to include a _title and clear description_ with as much relevant information as possible. +- Check that the issue you're filing doesn't already exist by searching under [issues](https://github.com/ava-labs/icm-contracts/issues). +- If you're unable to find an open issue addressing the problem, [open a new one](https://github.com/ava-labs/icm-contracts/issues/new/choose). Be sure to include a _title and clear description_ with as much relevant information as possible. ## Features -- If you want to start a discussion about the development of a new feature or the modfiication of an existing one, start a thread under GitHub [discussions](https://github.com/ava-labs/teleporter/discussions/categories/ideas). +- If you want to start a discussion about the development of a new feature or the modfiication of an existing one, start a thread under GitHub [discussions](https://github.com/ava-labs/icm-contracts/discussions/categories/ideas). - Post a thread about your idea and why it should be added to Teleporter. - Don't start working on a pull request until you've received positive feedback from the maintainers. @@ -49,4 +49,4 @@ See [E2E Tests](./README.md#e2e-tests) ### Do you have questions about the source code? -- Ask any question about ICM or ICM contracts under GitHub [discussions](https://github.com/ava-labs/teleporter/discussions/categories/q-a). +- Ask any question about ICM or ICM contracts under GitHub [discussions](https://github.com/ava-labs/icm-contracts/discussions/categories/q-a). diff --git a/contracts/governance/ValidatorSetSig.sol b/contracts/governance/ValidatorSetSig.sol index f706fbe4e..dcf90a4e8 100644 --- a/contracts/governance/ValidatorSetSig.sol +++ b/contracts/governance/ValidatorSetSig.sol @@ -45,7 +45,7 @@ struct ValidatorSetSigMessage { * to deploy an `Ownable` target contract that is owned by an instance of this contract and adding the * `onlyOwner` modifier to the functions that should be governed. * - * @custom:security-contact https://github.com/ava-labs/teleporter/blob/main/SECURITY.md + * @custom:security-contact https://github.com/ava-labs/icm-contracts/blob/main/SECURITY.md */ contract ValidatorSetSig is ReentrancyGuard { /** diff --git a/contracts/ictt/README.md b/contracts/ictt/README.md index 464943bb9..fa08e65b7 100644 --- a/contracts/ictt/README.md +++ b/contracts/ictt/README.md @@ -2,7 +2,7 @@ ## Overview -Avalanche Interchain Token Transfer (ICTT) is an application that allows users to transfer tokens between L1s. The implementation is a set of smart contracts that are deployed across multiple L1s, and leverages [ICM](https://github.com/ava-labs/teleporter) for cross-chain communication. +Avalanche Interchain Token Transfer (ICTT) is an application that allows users to transfer tokens between L1s. The implementation is a set of smart contracts that are deployed across multiple L1s, and leverages [ICM](https://github.com/ava-labs/icm-contracts) for cross-chain communication. Each token transferrer instance consists of one "home" contract and at least one but possibly many "remote" contracts. Each home contract instance manages one asset to be transferred out to `TokenRemote` instances. The home contract lives on the L1 where the asset to be transferred exists. A transfer consists of locking the asset as collateral on the home L1 and minting a representation of the asset on the remote L1. The remote contracts, each of which has a single specified home contract, live on other L1s that want to import the asset transferred by their specified home. The token transferrers are designed to be permissionless: anyone can register compatible `TokenRemote` instances to allow for transferring tokens from the `TokenHome` instance to that new `TokenRemote` instance. The home contract keeps track of token balances transferred to each `TokenRemote` instance, and handles returning the original tokens back to the user when assets are transferred back to the `TokenHome` instance. `TokenRemote` instances are registered with their home contract via an ICM message upon creation. @@ -82,6 +82,6 @@ Note that the value returned by `totalNativeAssetSupply` is an upper bound on th ## ICM Message Fees -Fees can be optionally added to ICM messages in order to incentivize relayers to deliver them, as documented [here](https://github.com/ava-labs/teleporter/tree/main/contracts/teleporter#fees). The token transfer contracts in this repository allow for specifying any ERC20 token and amount to be used as the ICM message fee for single-hop transfers in either direction between `TokenHome` and `TokenRemote` instances. Fee amounts must be pre-approved to be spent by the token transfer contract before initiating a transfer. +Fees can be optionally added to ICM messages in order to incentivize relayers to deliver them, as documented [here](https://github.com/ava-labs/icm-contracts/tree/main/contracts/teleporter#fees). The token transfer contracts in this repository allow for specifying any ERC20 token and amount to be used as the ICM message fee for single-hop transfers in either direction between `TokenHome` and `TokenRemote` instances. Fee amounts must be pre-approved to be spent by the token transfer contract before initiating a transfer. Multi-hop transfers between two `TokenRemote` instances involve two ICM messages: the first from the initiating `TokenRemote` instance to its home, and the second from its home to the destination `TokenRemote` instance. In the multi-hop case, the first message fee can be paid in any ERC20 token and amount (similar to the single-hop case), but the second message fee must be paid in-kind of the asset being transferred and is deducted from the amount being transferred. This restriction on the secondary message fee is necessary because the transaction on the intermediate chain routing the funds to the destination `TokenRemote` instance is not sent by the wallet performing the transfer. Because of this, it can not directly spend an arbitrary ERC20 token from that wallet. Using the asset being transferred for the optional secondary fee allows users to perform an incentivized multi-hop transfer without needing to make any interaction with the home themselves. If there is a need for the second message from the home to the destination `TokenRemote` instance to pay a fee in another asset, it is recommended to perform two single-hop transfers, which allows for specifying an arbitrary ERC20 token to be used for the fee of each. diff --git a/contracts/ictt/TokenHome/ERC20TokenHome.sol b/contracts/ictt/TokenHome/ERC20TokenHome.sol index 447f3a16f..e3ac920f9 100644 --- a/contracts/ictt/TokenHome/ERC20TokenHome.sol +++ b/contracts/ictt/TokenHome/ERC20TokenHome.sol @@ -11,7 +11,7 @@ import {ICMInitializable} from "@utilities/ICMInitializable.sol"; /** * @title ERC20TokenHome * @notice A non-upgradeable version of {ERC20TokenHomeUpgradeable} that calls the parent upgradeable contract's initialize function. - * @custom:security-contact https://github.com/ava-labs/teleporter/blob/main/SECURITY.md + * @custom:security-contact https://github.com/ava-labs/icm-contracts/blob/main/SECURITY.md */ contract ERC20TokenHome is ERC20TokenHomeUpgradeable { constructor( diff --git a/contracts/ictt/TokenHome/ERC20TokenHomeUpgradeable.sol b/contracts/ictt/TokenHome/ERC20TokenHomeUpgradeable.sol index 54e08f9ee..c9cf5e49f 100644 --- a/contracts/ictt/TokenHome/ERC20TokenHomeUpgradeable.sol +++ b/contracts/ictt/TokenHome/ERC20TokenHomeUpgradeable.sol @@ -23,7 +23,7 @@ import {ICMInitializable} from "@utilities/ICMInitializable.sol"; * @title ERC20TokenHomeUpgradeable * @notice An {IERC20TokenHome} implementation that locks a specified ERC20 token to be sent to * TokenRemote instances on other chains. - * @custom:security-contact https://github.com/ava-labs/teleporter/blob/main/SECURITY.md + * @custom:security-contact https://github.com/ava-labs/icm-contracts/blob/main/SECURITY.md */ contract ERC20TokenHomeUpgradeable is IERC20TokenHome, TokenHome { using SafeERC20 for IERC20; @@ -65,7 +65,7 @@ contract ERC20TokenHomeUpgradeable is IERC20TokenHome, TokenHome { /** * @notice Initializes the token TokenHome instance to send ERC20 tokens to TokenRemote instances on other chains. * @param teleporterRegistryAddress The current blockchain ID's Teleporter registry - * address. See here for details: https://github.com/ava-labs/teleporter/tree/main/contracts/teleporter/registry + * address. See here for details: https://github.com/ava-labs/icm-contracts/tree/main/contracts/teleporter/registry * @param teleporterManager Address that manages this contract's integration with the * Teleporter registry and Teleporter versions. * @param minTeleporterVersion Minimum Teleporter version supported by this contract. diff --git a/contracts/ictt/TokenHome/NativeTokenHome.sol b/contracts/ictt/TokenHome/NativeTokenHome.sol index 574b22c67..c175d5547 100644 --- a/contracts/ictt/TokenHome/NativeTokenHome.sol +++ b/contracts/ictt/TokenHome/NativeTokenHome.sol @@ -11,7 +11,7 @@ import {ICMInitializable} from "@utilities/ICMInitializable.sol"; /** * @title NativeTokenHome * @notice A non-upgradeable version of {NativeTokenHomeUpgradeable} that calls the parent upgradeable contract's initialize function. - * @custom:security-contact https://github.com/ava-labs/teleporter/blob/main/SECURITY.md + * @custom:security-contact https://github.com/ava-labs/icm-contracts/blob/main/SECURITY.md */ contract NativeTokenHome is NativeTokenHomeUpgradeable { constructor( diff --git a/contracts/ictt/TokenHome/NativeTokenHomeUpgradeable.sol b/contracts/ictt/TokenHome/NativeTokenHomeUpgradeable.sol index 9ad999984..4c30e0c1f 100644 --- a/contracts/ictt/TokenHome/NativeTokenHomeUpgradeable.sol +++ b/contracts/ictt/TokenHome/NativeTokenHomeUpgradeable.sol @@ -23,7 +23,7 @@ import {ICMInitializable} from "@utilities/ICMInitializable.sol"; * @title NativeTokenHomeUpgradeable * @notice An {INativeTokenHome} implementation that locks the native token of this chain to be transferred to * TokenRemote instances on other chains. - * @custom:security-contact https://github.com/ava-labs/teleporter/blob/main/SECURITY.md + * @custom:security-contact https://github.com/ava-labs/icm-contracts/blob/main/SECURITY.md */ contract NativeTokenHomeUpgradeable is INativeTokenHome, TokenHome { using Address for address payable; @@ -68,7 +68,7 @@ contract NativeTokenHomeUpgradeable is INativeTokenHome, TokenHome { * @notice Initializes this token TokenHome instance to send native tokens to TokenRemote instances on other chains. * Always uses a {tokenDecimals} value of 18 since it is the denomination of the native token of EVM instances. * @param teleporterRegistryAddress The current blockchain ID's Teleporter registry - * address. See here for details: https://github.com/ava-labs/teleporter/tree/main/contracts/teleporter/registry + * address. See here for details: https://github.com/ava-labs/icm-contracts/tree/main/contracts/teleporter/registry * @param teleporterManager Address that manages this contract's integration with the * Teleporter registry and Teleporter versions. * @param minTeleporterVersion Minimum Teleporter version supported by this contract. diff --git a/contracts/ictt/TokenHome/TokenHome.sol b/contracts/ictt/TokenHome/TokenHome.sol index b6d1c945d..b02e5c048 100644 --- a/contracts/ictt/TokenHome/TokenHome.sol +++ b/contracts/ictt/TokenHome/TokenHome.sol @@ -34,7 +34,7 @@ import {IERC20} from "@openzeppelin/contracts@5.0.2/token/ERC20/ERC20.sol"; * This contract also handles multi-hop transfers, where tokens sent from a {TokenRemote} * instance are forwarded to another {TokenRemote} instance. * - * @custom:security-contact https://github.com/ava-labs/teleporter/blob/main/SECURITY.md + * @custom:security-contact https://github.com/ava-labs/icm-contracts/blob/main/SECURITY.md */ abstract contract TokenHome is ITokenHome, diff --git a/contracts/ictt/TokenHome/interfaces/IERC20TokenHome.sol b/contracts/ictt/TokenHome/interfaces/IERC20TokenHome.sol index ff0526dcd..52b8c8122 100644 --- a/contracts/ictt/TokenHome/interfaces/IERC20TokenHome.sol +++ b/contracts/ictt/TokenHome/interfaces/IERC20TokenHome.sol @@ -12,7 +12,7 @@ import {ITokenHome} from "./ITokenHome.sol"; * @notice Interface for a ERC20 token "home" contract that locks its specified ERC20 * token on its chain to be transferred to supported remote token transfer contracts on other chains. * - * @custom:security-contact https://github.com/ava-labs/teleporter/blob/main/SECURITY.md + * @custom:security-contact https://github.com/ava-labs/icm-contracts/blob/main/SECURITY.md */ interface IERC20TokenHome is IERC20TokenTransferrer, ITokenHome { /** diff --git a/contracts/ictt/TokenHome/interfaces/INativeTokenHome.sol b/contracts/ictt/TokenHome/interfaces/INativeTokenHome.sol index 863450650..2412030b5 100644 --- a/contracts/ictt/TokenHome/interfaces/INativeTokenHome.sol +++ b/contracts/ictt/TokenHome/interfaces/INativeTokenHome.sol @@ -12,7 +12,7 @@ import {ITokenHome} from "./ITokenHome.sol"; * @notice Interface for a native token "home" contract that locks the native token * on its chain to be transferred to supported remote token transfer contracts on other chains. * - * @custom:security-contact https://github.com/ava-labs/teleporter/blob/main/SECURITY.md + * @custom:security-contact https://github.com/ava-labs/icm-contracts/blob/main/SECURITY.md */ interface INativeTokenHome is INativeTokenTransferrer, ITokenHome { /** diff --git a/contracts/ictt/TokenRemote/ERC20TokenRemote.sol b/contracts/ictt/TokenRemote/ERC20TokenRemote.sol index b37ed2142..8032dc709 100644 --- a/contracts/ictt/TokenRemote/ERC20TokenRemote.sol +++ b/contracts/ictt/TokenRemote/ERC20TokenRemote.sol @@ -12,7 +12,7 @@ import {ICMInitializable} from "@utilities/ICMInitializable.sol"; /** * @title ERC20TokenRemote * @notice A non-upgradeable version of {ERC20TokenRemoteUpgradeable} that calls the parent upgradeable contract's initialize function. - * @custom:security-contact https://github.com/ava-labs/teleporter/blob/main/SECURITY.md + * @custom:security-contact https://github.com/ava-labs/icm-contracts/blob/main/SECURITY.md */ contract ERC20TokenRemote is ERC20TokenRemoteUpgradeable { constructor( diff --git a/contracts/ictt/TokenRemote/ERC20TokenRemoteUpgradeable.sol b/contracts/ictt/TokenRemote/ERC20TokenRemoteUpgradeable.sol index 1ced3942e..d34f35d87 100644 --- a/contracts/ictt/TokenRemote/ERC20TokenRemoteUpgradeable.sol +++ b/contracts/ictt/TokenRemote/ERC20TokenRemoteUpgradeable.sol @@ -25,7 +25,7 @@ import {ICMInitializable} from "@utilities/ICMInitializable.sol"; * @title ERC20TokenRemoteUpgradeable * @notice This contract is an {IERC20TokenTransferrer} that receives tokens from its specifed {TokenHome} instance, * and represents the received tokens with an ERC20 token on this chain. - * @custom:security-contact https://github.com/ava-labs/teleporter/blob/main/SECURITY.md + * @custom:security-contact https://github.com/ava-labs/icm-contracts/blob/main/SECURITY.md */ contract ERC20TokenRemoteUpgradeable is IERC20TokenTransferrer, ERC20Upgradeable, TokenRemote { // solhint-disable private-vars-leading-underscore diff --git a/contracts/ictt/TokenRemote/NativeTokenRemote.sol b/contracts/ictt/TokenRemote/NativeTokenRemote.sol index ea19ad3f9..73eb5a6c0 100644 --- a/contracts/ictt/TokenRemote/NativeTokenRemote.sol +++ b/contracts/ictt/TokenRemote/NativeTokenRemote.sol @@ -12,7 +12,7 @@ import {ICMInitializable} from "@utilities/ICMInitializable.sol"; /** * @title NativeTokenRemote * @notice A non-upgradeable version of {NativeTokenRemoteUpgradeable} that calls the parent upgradeable contract's initialize function. - * @custom:security-contact https://github.com/ava-labs/teleporter/blob/main/SECURITY.md + * @custom:security-contact https://github.com/ava-labs/icm-contracts/blob/main/SECURITY.md */ contract NativeTokenRemote is NativeTokenRemoteUpgradeable { constructor( diff --git a/contracts/ictt/TokenRemote/NativeTokenRemoteUpgradeable.sol b/contracts/ictt/TokenRemote/NativeTokenRemoteUpgradeable.sol index 3c00304fc..6cddc6634 100644 --- a/contracts/ictt/TokenRemote/NativeTokenRemoteUpgradeable.sol +++ b/contracts/ictt/TokenRemote/NativeTokenRemoteUpgradeable.sol @@ -34,7 +34,7 @@ import {ICMInitializable} from "@utilities/ICMInitializable.sol"; * @title NativeTokenRemoteUpgradeable * @notice This contract is an {INativeTokenRemote} that receives tokens from its specifed {TokenHome} instance, * and represents the received tokens as the native token on this chain. - * @custom:security-contact https://github.com/ava-labs/teleporter/blob/main/SECURITY.md + * @custom:security-contact https://github.com/ava-labs/icm-contracts/blob/main/SECURITY.md */ contract NativeTokenRemoteUpgradeable is INativeTokenRemote, diff --git a/contracts/ictt/TokenRemote/TokenRemote.sol b/contracts/ictt/TokenRemote/TokenRemote.sol index 7a9924cc7..dd742aefd 100644 --- a/contracts/ictt/TokenRemote/TokenRemote.sol +++ b/contracts/ictt/TokenRemote/TokenRemote.sol @@ -30,7 +30,7 @@ import {TokenScalingUtils} from "@utilities/TokenScalingUtils.sol"; * @dev Abstract contract for a token transferrer remote that receives tokens from its specified token TokenHome instance, and * allows for burning that token to redeem the backing asset on the home chain, or transferring to other remotes. * - * @custom:security-contact https://github.com/ava-labs/teleporter/blob/main/SECURITY.md + * @custom:security-contact https://github.com/ava-labs/icm-contracts/blob/main/SECURITY.md */ abstract contract TokenRemote is ITokenRemote, diff --git a/contracts/ictt/TokenRemote/interfaces/ITokenRemote.sol b/contracts/ictt/TokenRemote/interfaces/ITokenRemote.sol index b2ace8c28..eeee987f1 100644 --- a/contracts/ictt/TokenRemote/interfaces/ITokenRemote.sol +++ b/contracts/ictt/TokenRemote/interfaces/ITokenRemote.sol @@ -11,7 +11,7 @@ import {TeleporterFeeInfo} from "@teleporter/ITeleporterMessenger.sol"; /** * @notice Settings for constructing a {ITokenRemote} contract. * @param teleporterRegistryAddress The current blockchain ID's Teleporter registry - * address. See here for details: https://github.com/ava-labs/teleporter/tree/main/contracts/teleporter/registry. + * address. See here for details: https://github.com/ava-labs/icm-contracts/tree/main/contracts/teleporter/registry. * @param teleporterManager Address that manages this contract's integration with the * Teleporter registry and Teleporter versions. * @param minTeleporterVersion Minimum Teleporter version supported by this contract. diff --git a/contracts/ictt/interfaces/IERC20TokenTransferrer.sol b/contracts/ictt/interfaces/IERC20TokenTransferrer.sol index 341a92aab..90129f4ba 100644 --- a/contracts/ictt/interfaces/IERC20TokenTransferrer.sol +++ b/contracts/ictt/interfaces/IERC20TokenTransferrer.sol @@ -10,7 +10,7 @@ import {ITokenTransferrer, SendTokensInput, SendAndCallInput} from "./ITokenTran /** * @notice Interface for an Avalanche interchain token transferrer that sends ERC20 tokens to another chain. * - * @custom:security-contact https://github.com/ava-labs/teleporter/blob/main/SECURITY.md + * @custom:security-contact https://github.com/ava-labs/icm-contracts/blob/main/SECURITY.md */ interface IERC20TokenTransferrer is ITokenTransferrer { /** diff --git a/contracts/ictt/interfaces/INativeTokenTransferrer.sol b/contracts/ictt/interfaces/INativeTokenTransferrer.sol index f18fddd98..9954ef65b 100644 --- a/contracts/ictt/interfaces/INativeTokenTransferrer.sol +++ b/contracts/ictt/interfaces/INativeTokenTransferrer.sol @@ -10,7 +10,7 @@ import {ITokenTransferrer, SendTokensInput, SendAndCallInput} from "./ITokenTran /** * @notice Interface for an Avalanche interchain token transferrer that sends native tokens to another chain. * - * @custom:security-contact https://github.com/ava-labs/teleporter/blob/main/SECURITY.md + * @custom:security-contact https://github.com/ava-labs/icm-contracts/blob/main/SECURITY.md */ interface INativeTokenTransferrer is ITokenTransferrer { /** diff --git a/contracts/ictt/interfaces/ITokenTransferrer.sol b/contracts/ictt/interfaces/ITokenTransferrer.sol index 8863cf90e..6992a699a 100644 --- a/contracts/ictt/interfaces/ITokenTransferrer.sol +++ b/contracts/ictt/interfaces/ITokenTransferrer.sol @@ -165,7 +165,7 @@ struct MultiHopCallMessage { /** * @notice Interface for an Avalanche interchain token transferrer that sends tokens to another chain. * - * @custom:security-contact https://github.com/ava-labs/teleporter/blob/main/SECURITY.md + * @custom:security-contact https://github.com/ava-labs/icm-contracts/blob/main/SECURITY.md */ interface ITokenTransferrer is ITeleporterReceiver { /** diff --git a/contracts/ictt/interfaces/IWrappedNativeToken.sol b/contracts/ictt/interfaces/IWrappedNativeToken.sol index 895cf82a0..08dd9fd1b 100644 --- a/contracts/ictt/interfaces/IWrappedNativeToken.sol +++ b/contracts/ictt/interfaces/IWrappedNativeToken.sol @@ -12,7 +12,7 @@ import {IERC20} from "@openzeppelin/contracts@5.0.2/token/ERC20/IERC20.sol"; * @notice Interface for a wrapped native token * @dev Implements the {IERC20} interface, and adds deposit and withdraw functions. * - * @custom:security-contact https://github.com/ava-labs/teleporter/blob/main/SECURITY.md + * @custom:security-contact https://github.com/ava-labs/icm-contracts/blob/main/SECURITY.md */ interface IWrappedNativeToken is IERC20 { /** diff --git a/contracts/teleporter/ITeleporterMessenger.sol b/contracts/teleporter/ITeleporterMessenger.sol index 29054ebc1..426f898ca 100644 --- a/contracts/teleporter/ITeleporterMessenger.sol +++ b/contracts/teleporter/ITeleporterMessenger.sol @@ -49,7 +49,7 @@ struct TeleporterFeeInfo { /** * @dev Interface that describes functionalities for a cross-chain messenger implementing the Teleporter protcol. * - * @custom:security-contact https://github.com/ava-labs/teleporter/blob/main/SECURITY.md + * @custom:security-contact https://github.com/ava-labs/icm-contracts/blob/main/SECURITY.md */ interface ITeleporterMessenger { /** diff --git a/contracts/teleporter/ITeleporterReceiver.sol b/contracts/teleporter/ITeleporterReceiver.sol index f2214eaa1..4d856df85 100644 --- a/contracts/teleporter/ITeleporterReceiver.sol +++ b/contracts/teleporter/ITeleporterReceiver.sol @@ -8,7 +8,7 @@ pragma solidity 0.8.25; /** * @dev Interface that cross-chain applications must implement to receive messages from Teleporter. * - * @custom:security-contact https://github.com/ava-labs/teleporter/blob/main/SECURITY.md + * @custom:security-contact https://github.com/ava-labs/icm-contracts/blob/main/SECURITY.md */ interface ITeleporterReceiver { /** diff --git a/contracts/teleporter/README.md b/contracts/teleporter/README.md index ec73df0a6..cd9cfdc98 100644 --- a/contracts/teleporter/README.md +++ b/contracts/teleporter/README.md @@ -110,7 +110,7 @@ As an example, to include `TeleporterMessenger` `v1.0.0` in the genesis file, in } ``` -The values above are taken from the `v1.0.0` [release artifacts](https://github.com/ava-labs/teleporter/releases/tag/v1.0.0). The contract address, deployed bytecode, and deployer address are unique per major release. All of the other values should remain the same. +The values above are taken from the `v1.0.0` [release artifacts](https://github.com/ava-labs/icm-contracts/releases/tag/v1.0.0). The contract address, deployed bytecode, and deployer address are unique per major release. All of the other values should remain the same. ## Deployed Addresses @@ -146,7 +146,7 @@ From the root of the repo, the TeleporterMessenger contract can be deployed by c Required arguments: -- `--version ` Specify the release version to deploy. These will all be of the form `v1.X.0`. Each `TeleporterMessenger` version can only send and receive messages from the **same** `TeleporterMessenger` version on another chain. You can see a list of released versions at https://github.com/ava-labs/teleporter/releases. +- `--version ` Specify the release version to deploy. These will all be of the form `v1.X.0`. Each `TeleporterMessenger` version can only send and receive messages from the **same** `TeleporterMessenger` version on another chain. You can see a list of released versions at https://github.com/ava-labs/icm-contracts/releases. - `--rpc-url ` Specify the rpc url of the node to use. Options: @@ -155,7 +155,7 @@ Options: To ensure that `TeleporterMessenger` can be deployed to the same address on every EVM based chain, it uses [Nick's Method](https://yamenmerhi.medium.com/nicks-method-ethereum-keyless-execution-168a6659479c) to deploy from a static deployer address. Teleporter costs exactly `10eth` in the Avalanche L1's native gas token to deploy, which must be sent to the deployer address. -`deploy_teleporter.sh` will send the necessary native tokens to the deployer address if it is provided with a private key for an account with sufficient funds. Alternatively, the deployer address can be funded externally. The deployer address for each version can be found by looking up the appropriate version at https://github.com/ava-labs/teleporter/releases and downloading `TeleporterMessenger_Deployer_Address_.txt`. +`deploy_teleporter.sh` will send the necessary native tokens to the deployer address if it is provided with a private key for an account with sufficient funds. Alternatively, the deployer address can be funded externally. The deployer address for each version can be found by looking up the appropriate version at https://github.com/ava-labs/icm-contracts/releases and downloading `TeleporterMessenger_Deployer_Address_.txt`. Alternatively for new Avalanche L1s, the `TeleporterMessenger` contract can be directly included in the genesis file as documented [here](./contracts/teleporter/README.md#teleporter-messenger-contract-deployment). diff --git a/contracts/teleporter/ReceiptQueue.sol b/contracts/teleporter/ReceiptQueue.sol index 6bfdda581..db2fb0211 100644 --- a/contracts/teleporter/ReceiptQueue.sol +++ b/contracts/teleporter/ReceiptQueue.sol @@ -13,7 +13,7 @@ import {TeleporterMessageReceipt} from "./ITeleporterMessenger.sol"; * TeleporterMessageReceipt structs. It provides FIFO properties. * Note: All functions in this library are internal so that the library is not deployed as a contract. * - * @custom:security-contact https://github.com/ava-labs/teleporter/blob/main/SECURITY.md + * @custom:security-contact https://github.com/ava-labs/icm-contracts/blob/main/SECURITY.md */ library ReceiptQueue { // A receipt queue represents a FIFO list of receipts. diff --git a/contracts/teleporter/TeleporterMessenger.sol b/contracts/teleporter/TeleporterMessenger.sol index 025b6180e..083ca3536 100644 --- a/contracts/teleporter/TeleporterMessenger.sol +++ b/contracts/teleporter/TeleporterMessenger.sol @@ -30,7 +30,7 @@ import {ReentrancyGuards} from "@utilities/ReentrancyGuards.sol"; * and to receive messages sent from other chains. Teleporter contracts should be deployed through Nick's method * of universal deployer, such that the same contract is deployed at the same address on all chains. * - * @custom:security-contact https://github.com/ava-labs/teleporter/blob/main/SECURITY.md + * @custom:security-contact https://github.com/ava-labs/icm-contracts/blob/main/SECURITY.md */ contract TeleporterMessenger is ITeleporterMessenger, ReentrancyGuards { using SafeERC20 for IERC20; diff --git a/contracts/teleporter/registry/TeleporterRegistry.sol b/contracts/teleporter/registry/TeleporterRegistry.sol index 9eb83a8e9..d24e9cbb2 100644 --- a/contracts/teleporter/registry/TeleporterRegistry.sol +++ b/contracts/teleporter/registry/TeleporterRegistry.sol @@ -21,7 +21,7 @@ struct ProtocolRegistryEntry { * @dev TeleporterRegistry contract provides an upgrade mechanism for {ITeleporterMessenger} contracts * through Warp off-chain messages * - * @custom:security-contact https://github.com/ava-labs/teleporter/blob/main/SECURITY.md + * @custom:security-contact https://github.com/ava-labs/icm-contracts/blob/main/SECURITY.md */ contract TeleporterRegistry { /** diff --git a/contracts/teleporter/registry/TeleporterRegistryApp.sol b/contracts/teleporter/registry/TeleporterRegistryApp.sol index 86ba956b9..c73e1cc4d 100644 --- a/contracts/teleporter/registry/TeleporterRegistryApp.sol +++ b/contracts/teleporter/registry/TeleporterRegistryApp.sol @@ -21,7 +21,7 @@ import {IERC20} from "@openzeppelin/contracts@5.0.2/token/ERC20/IERC20.sol"; * upgrade mechanism. It provides an interface that restricts access to only Teleporter * versions that are greater than or equal to `minTeleporterVersion`. * - * @custom:security-contact https://github.com/ava-labs/teleporter/blob/main/SECURITY.md + * @custom:security-contact https://github.com/ava-labs/icm-contracts/blob/main/SECURITY.md */ abstract contract TeleporterRegistryApp is Context, ITeleporterReceiver, ReentrancyGuard { using SafeERC20 for IERC20; diff --git a/contracts/teleporter/registry/TeleporterRegistryAppUpgradeable.sol b/contracts/teleporter/registry/TeleporterRegistryAppUpgradeable.sol index 55f2f8ae1..2444623db 100644 --- a/contracts/teleporter/registry/TeleporterRegistryAppUpgradeable.sol +++ b/contracts/teleporter/registry/TeleporterRegistryAppUpgradeable.sol @@ -25,7 +25,7 @@ import {Initializable} from * upgrade mechanism. It provides an interface that restricts access to only Teleporter * versions that are greater than or equal to `minTeleporterVersion`. * - * @custom:security-contact https://github.com/ava-labs/teleporter/blob/main/SECURITY.md + * @custom:security-contact https://github.com/ava-labs/icm-contracts/blob/main/SECURITY.md */ abstract contract TeleporterRegistryAppUpgradeable is Initializable, diff --git a/contracts/teleporter/registry/TeleporterRegistryOwnableApp.sol b/contracts/teleporter/registry/TeleporterRegistryOwnableApp.sol index 42601e48e..730540c07 100644 --- a/contracts/teleporter/registry/TeleporterRegistryOwnableApp.sol +++ b/contracts/teleporter/registry/TeleporterRegistryOwnableApp.sol @@ -13,7 +13,7 @@ import {Ownable} from "@openzeppelin/contracts@5.0.2/access/Ownable.sol"; * only owners of the contract to update the minimum Teleporter version or * pause and unpause specific Teleporter versions. * - * @custom:security-contact https://github.com/ava-labs/teleporter/blob/main/SECURITY.md + * @custom:security-contact https://github.com/ava-labs/icm-contracts/blob/main/SECURITY.md */ abstract contract TeleporterRegistryOwnableApp is TeleporterRegistryApp, Ownable { constructor( diff --git a/contracts/teleporter/registry/TeleporterRegistryOwnableAppUpgradeable.sol b/contracts/teleporter/registry/TeleporterRegistryOwnableAppUpgradeable.sol index 49a7a4743..8ef770e26 100644 --- a/contracts/teleporter/registry/TeleporterRegistryOwnableAppUpgradeable.sol +++ b/contracts/teleporter/registry/TeleporterRegistryOwnableAppUpgradeable.sol @@ -14,7 +14,7 @@ import {OwnableUpgradeable} from * only owners of the contract to update the minimum Teleporter version or * pause and unpause specific Teleporter versions. * - * @custom:security-contact https://github.com/ava-labs/teleporter/blob/main/SECURITY.md + * @custom:security-contact https://github.com/ava-labs/icm-contracts/blob/main/SECURITY.md */ abstract contract TeleporterRegistryOwnableAppUpgradeable is TeleporterRegistryAppUpgradeable, diff --git a/contracts/utilities/ReentrancyGuards.sol b/contracts/utilities/ReentrancyGuards.sol index e1bb46b33..1b657e786 100644 --- a/contracts/utilities/ReentrancyGuards.sol +++ b/contracts/utilities/ReentrancyGuards.sol @@ -14,7 +14,7 @@ pragma solidity 0.8.25; * Calls between send and receive functions should also be allowed, but not in the case it ends up being a recursive * send or receive call. For example the following should fail: send -> receive -> send. * - * @custom:security-contact https://github.com/ava-labs/teleporter/blob/main/SECURITY.md + * @custom:security-contact https://github.com/ava-labs/icm-contracts/blob/main/SECURITY.md */ abstract contract ReentrancyGuards { // Send and Receive reentrancy guards diff --git a/contracts/utilities/SafeERC20TransferFrom.sol b/contracts/utilities/SafeERC20TransferFrom.sol index 62b4c251f..62df1427f 100644 --- a/contracts/utilities/SafeERC20TransferFrom.sol +++ b/contracts/utilities/SafeERC20TransferFrom.sol @@ -18,7 +18,7 @@ import {SafeERC20} from "@openzeppelin/contracts@5.0.2/token/ERC20/utils/SafeERC * Note: A reentrancy guard must always be used when calling token.safeTransferFrom in order to * prevent against possible "before-after" pattern vulnerabilities. * - * @custom:security-contact https://github.com/ava-labs/teleporter/blob/main/SECURITY.md + * @custom:security-contact https://github.com/ava-labs/icm-contracts/blob/main/SECURITY.md */ library SafeERC20TransferFrom { using SafeERC20 for IERC20; diff --git a/contracts/utilities/SafeWrappedNativeTokenDeposit.sol b/contracts/utilities/SafeWrappedNativeTokenDeposit.sol index e9002b4ed..2bb5643b4 100644 --- a/contracts/utilities/SafeWrappedNativeTokenDeposit.sol +++ b/contracts/utilities/SafeWrappedNativeTokenDeposit.sol @@ -17,7 +17,7 @@ import {IWrappedNativeToken} from "../ictt/interfaces/IWrappedNativeToken.sol"; * Note: A reentrancy guard must always be used when calling token.safeDeposit in order to * prevent against possible "before-after" pattern vulnerabilities. * - * @custom:security-contact https://github.com/ava-labs/teleporter/blob/main/SECURITY.md + * @custom:security-contact https://github.com/ava-labs/icm-contracts/blob/main/SECURITY.md */ library SafeWrappedNativeTokenDeposit { /** diff --git a/contracts/utilities/SendReentrancyGuardUpgradeable.sol b/contracts/utilities/SendReentrancyGuardUpgradeable.sol index 611808828..ab949cd3b 100644 --- a/contracts/utilities/SendReentrancyGuardUpgradeable.sol +++ b/contracts/utilities/SendReentrancyGuardUpgradeable.sol @@ -17,7 +17,7 @@ import {Initializable} from * as a part of processing a multi-hop transfer, or as a part of an external call made to process a "sendAndCall" * message. * - * @custom:security-contact https://github.com/ava-labs/teleporter/blob/main/SECURITY.md + * @custom:security-contact https://github.com/ava-labs/icm-contracts/blob/main/SECURITY.md */ abstract contract SendReentrancyGuardUpgradeable is Initializable { // solhint-disable private-vars-leading-underscore diff --git a/contracts/validator-manager/ERC20TokenStakingManager.sol b/contracts/validator-manager/ERC20TokenStakingManager.sol index a5e6af656..e0cea5923 100644 --- a/contracts/validator-manager/ERC20TokenStakingManager.sol +++ b/contracts/validator-manager/ERC20TokenStakingManager.sol @@ -19,7 +19,7 @@ import {SafeERC20} from "@openzeppelin/contracts@5.0.2/token/ERC20/utils/SafeERC /** * @dev Implementation of the {IERC20TokenStakingManager} interface. * - * @custom:security-contact https://github.com/ava-labs/teleporter/blob/main/SECURITY.md + * @custom:security-contact https://github.com/ava-labs/icm-contracts/blob/main/SECURITY.md */ contract ERC20TokenStakingManager is Initializable, diff --git a/contracts/validator-manager/NativeTokenStakingManager.sol b/contracts/validator-manager/NativeTokenStakingManager.sol index b641a94b5..facf37a56 100644 --- a/contracts/validator-manager/NativeTokenStakingManager.sol +++ b/contracts/validator-manager/NativeTokenStakingManager.sol @@ -19,7 +19,7 @@ import {Initializable} from /** * @dev Implementation of the {INativeTokenStakingManager} interface. * - * @custom:security-contact https://github.com/ava-labs/teleporter/blob/main/SECURITY.md + * @custom:security-contact https://github.com/ava-labs/icm-contracts/blob/main/SECURITY.md */ contract NativeTokenStakingManager is Initializable, diff --git a/contracts/validator-manager/PoAValidatorManager.sol b/contracts/validator-manager/PoAValidatorManager.sol index ad38db6eb..b62a30557 100644 --- a/contracts/validator-manager/PoAValidatorManager.sol +++ b/contracts/validator-manager/PoAValidatorManager.sol @@ -18,7 +18,7 @@ import {OwnableUpgradeable} from /** * @dev Implementation of the {IPoAValidatorManager} interface. * - * @custom:security-contact https://github.com/ava-labs/teleporter/blob/main/SECURITY.md + * @custom:security-contact https://github.com/ava-labs/icm-contracts/blob/main/SECURITY.md */ contract PoAValidatorManager is IPoAValidatorManager, ValidatorManager, OwnableUpgradeable { constructor(ICMInitializable init) { diff --git a/contracts/validator-manager/PoSValidatorManager.sol b/contracts/validator-manager/PoSValidatorManager.sol index def1c8903..cb824b888 100644 --- a/contracts/validator-manager/PoSValidatorManager.sol +++ b/contracts/validator-manager/PoSValidatorManager.sol @@ -28,7 +28,7 @@ import {ReentrancyGuardUpgradeable} from /** * @dev Implementation of the {IPoSValidatorManager} interface. * - * @custom:security-contact https://github.com/ava-labs/teleporter/blob/main/SECURITY.md + * @custom:security-contact https://github.com/ava-labs/icm-contracts/blob/main/SECURITY.md */ abstract contract PoSValidatorManager is IPoSValidatorManager, diff --git a/contracts/validator-manager/ValidatorManager.sol b/contracts/validator-manager/ValidatorManager.sol index 6df7be3a2..d1c58c680 100644 --- a/contracts/validator-manager/ValidatorManager.sol +++ b/contracts/validator-manager/ValidatorManager.sol @@ -29,7 +29,7 @@ import {Initializable} from /** * @dev Implementation of the {IValidatorManager} interface. * - * @custom:security-contact https://github.com/ava-labs/teleporter/blob/main/SECURITY.md + * @custom:security-contact https://github.com/ava-labs/icm-contracts/blob/main/SECURITY.md */ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValidatorManager { // solhint-disable private-vars-leading-underscore diff --git a/go.mod b/go.mod index 46c13bdbc..00e7908f3 100644 --- a/go.mod +++ b/go.mod @@ -1,4 +1,4 @@ -module github.com/ava-labs/teleporter +module github.com/ava-labs/icm-contracts go 1.22.8 @@ -10,6 +10,7 @@ require ( require ( github.com/ava-labs/awm-relayer v1.4.1-0.20241122202209-75359d908260 github.com/ava-labs/subnet-evm v0.6.12 + github.com/ava-labs/teleporter v1.0.8-0.20241122194201-a6e92843c3b1 github.com/ethereum/go-ethereum v1.13.14 github.com/onsi/ginkgo/v2 v2.22.0 github.com/onsi/gomega v1.36.0 diff --git a/go.sum b/go.sum index 075cebcf9..445a226e0 100644 --- a/go.sum +++ b/go.sum @@ -66,6 +66,8 @@ github.com/ava-labs/coreth v0.13.9-rc.1 h1:qIICpC/OZGYUP37QnLgIqqwGmxnLwLpZaUlqJ github.com/ava-labs/coreth v0.13.9-rc.1/go.mod h1:7aMsRIo/3GBE44qWZMjnfqdqfcfZ5yShTTm2LObLaYo= github.com/ava-labs/subnet-evm v0.6.12 h1:jL3FmjdFcNfS0qwbehwN6DkAg9y7zexB1riiGBxRsM0= github.com/ava-labs/subnet-evm v0.6.12/go.mod h1:vffwL4UqAh7ibpWjveUuUhamm3a9w75q92bG5vXdX5k= +github.com/ava-labs/teleporter v1.0.8-0.20241122194201-a6e92843c3b1 h1:y1zjdfGlfTZQoPyUyPjsu9FjDK8w19OWUTpgVzQSh0w= +github.com/ava-labs/teleporter v1.0.8-0.20241122194201-a6e92843c3b1/go.mod h1:45NrpvVlms+xHL/rFZT7VrRJqajT7UUW78lzBe3hAzU= github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= diff --git a/scripts/deploy_registry.sh b/scripts/deploy_registry.sh index 193e59f52..d092e3d75 100755 --- a/scripts/deploy_registry.sh +++ b/scripts/deploy_registry.sh @@ -23,7 +23,7 @@ function printHelp() { echo "Usage: ./scripts/deploy_registry.sh --version --rpc-url --private-key [OPTIONS]" echo "" echo "Deploys a selected TeleporterRegistry contract to the specified chain" - echo "For a list of releases, go to https://github.com/ava-labs/teleporter/releases" + echo "For a list of releases, go to https://github.com/ava-labs/icm-contracts/releases" printUsage } @@ -78,8 +78,8 @@ if [[ $teleporter_version == "" || $rpc_url == "" || $user_private_key == "" ]]; printHelp && exit 1 fi -teleporter_registry_bytecode=$(curl -sL https://github.com/ava-labs/teleporter/releases/download/$teleporter_version/TeleporterRegistry_Bytecode_$teleporter_version.txt) -teleporter_contract_address=$(curl -sL https://github.com/ava-labs/teleporter/releases/download/$teleporter_version/TeleporterMessenger_Contract_Address_$teleporter_version.txt) +teleporter_registry_bytecode=$(curl -sL https://github.com/ava-labs/icm-contracts/releases/download/$teleporter_version/TeleporterRegistry_Bytecode_$teleporter_version.txt) +teleporter_contract_address=$(curl -sL https://github.com/ava-labs/icm-contracts/releases/download/$teleporter_version/TeleporterMessenger_Contract_Address_$teleporter_version.txt) if [ "$teleporter_registry_bytecode" == "Not Found" ]; then echo "Error: TeleporterRegistry $teleporter_version byte code not found." exit 1 diff --git a/scripts/deploy_teleporter.sh b/scripts/deploy_teleporter.sh index 606fe76f6..cc6ff4d08 100755 --- a/scripts/deploy_teleporter.sh +++ b/scripts/deploy_teleporter.sh @@ -23,7 +23,7 @@ function printHelp() { echo "Usage: ./scripts/deploy_teleporter.sh --version --rpc-url [OPTIONS]" echo "" echo "Deploys a selected TeleporterMessenger contract to the specified chain" - echo "For a list of releases, go to https://github.com/ava-labs/teleporter/releases" + echo "For a list of releases, go to https://github.com/ava-labs/icm-contracts/releases" printUsage } @@ -84,12 +84,12 @@ fi gas_tokens_required=10000000000000000000 # 10^19 wei = 10 eth # Download the artifacts for this release. -teleporter_contract_address=$(curl -sL https://github.com/ava-labs/teleporter/releases/download/$teleporter_version/TeleporterMessenger_Contract_Address_$teleporter_version.txt) +teleporter_contract_address=$(curl -sL https://github.com/ava-labs/icm-contracts/releases/download/$teleporter_version/TeleporterMessenger_Contract_Address_$teleporter_version.txt) echo "TeleporterMessenger $teleporter_version contract address: $teleporter_contract_address" -teleporter_deployer_address=$(curl -sL https://github.com/ava-labs/teleporter/releases/download/$teleporter_version/TeleporterMessenger_Deployer_Address_$teleporter_version.txt) +teleporter_deployer_address=$(curl -sL https://github.com/ava-labs/icm-contracts/releases/download/$teleporter_version/TeleporterMessenger_Deployer_Address_$teleporter_version.txt) echo "TeleporterMessenger $teleporter_version deployer address: $teleporter_deployer_address" -teleporter_deploy_tx=$(curl -sL https://github.com/ava-labs/teleporter/releases/download/$teleporter_version/TeleporterMessenger_Deployment_Transaction_$teleporter_version.txt) -teleporter_messenger_bytecode=$(curl -sL https://github.com/ava-labs/teleporter/releases/download/$teleporter_version/TeleporterMessenger_Bytecode_$teleporter_version.txt) +teleporter_deploy_tx=$(curl -sL https://github.com/ava-labs/icm-contracts/releases/download/$teleporter_version/TeleporterMessenger_Deployment_Transaction_$teleporter_version.txt) +teleporter_messenger_bytecode=$(curl -sL https://github.com/ava-labs/icm-contracts/releases/download/$teleporter_version/TeleporterMessenger_Bytecode_$teleporter_version.txt) if [ "$teleporter_contract_address" == "Not Found" ]; then echo "Error: TeleporterMessenger $teleporter_version contract address not found." exit 1