Skip to content

Commit

Permalink
fix: transfer instead of wrapp when its origin chain
Browse files Browse the repository at this point in the history
  • Loading branch information
wellitongervickas committed Dec 7, 2023
1 parent 0de14cb commit c6a490e
Show file tree
Hide file tree
Showing 7 changed files with 244 additions and 17 deletions.
18 changes: 11 additions & 7 deletions contracts-left.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,34 +14,38 @@ pnpm hardhat deploy-bridge-contract --network 80001

=========================

pnpm hardhat deploy-adapter-contract --network 80001 --adapter "CCIPAdapter" --bridge-address 0x2d834f337BB3aBb451aB0D05afeeAa4B88a5A930 --router-address 0x70499c328e1e2a3c41108bd3730f6670a44595d1 --fee-token-name LINK
pnpm hardhat deploy-adapter-contract --network 80001 --adapter "CCIPAdapter" --bridge-address 0xBA70e221fF13Ace063868304719D9C67Aa274989 --router-address 0x70499c328e1e2a3c41108bd3730f6670a44595d1 --fee-token-name LINK

# Set chain settings

=========================

pnpm hardhat set-chain-settings --network 80001 --bridge-address 0x2d834f337BB3aBb451aB0D05afeeAa4B88a5A930 --evm-chain-id 43113 --non-evm-chain-id 14767482510784806043 --adapter-address 0xc51B10A545d646A6D648F6e25B037D07B9ED1211 ---target-adapter-address 0xe929743b5e4Ec0966bDc08dF8320802BD5A8C63D --is-enabled true --gas-limit 4000000
pnpm hardhat set-chain-settings --network 80001 --bridge-address 0xBA70e221fF13Ace063868304719D9C67Aa274989 --evm-chain-id 43113 --non-evm-chain-id 14767482510784806043 --adapter-address 0x533088e7bC6eC082F64BE2F54E303aFc8358ed24 ---target-adapter-address 0xB0c0867cA7a90f7F33D3f65fCb53B1259CCeC291 --is-enabled true --gas-limit 4000000

# Setup bridge adapter roles

=========================

pnpm hardhat setup-bridge-adapter --network 80001 --bridge-address 0x2d834f337BB3aBb451aB0D05afeeAa4B88a5A930 --adapter-address 0xc51B10A545d646A6D648F6e25B037D07B9ED1211 --adapter-router-address 0x70499c328e1e2a3c41108bd3730f6670a44595d1 --router-to-adapter-function-selector ccipReceive ----bridge-to-adapter-function-selector sendMessageUsingERC20 --adapter-contract-name CCIPAdapter
pnpm hardhat setup-bridge-adapter --network 80001 --bridge-address 0xBA70e221fF13Ace063868304719D9C67Aa274989 --adapter-address 0x533088e7bC6eC082F64BE2F54E303aFc8358ed24 --adapter-router-address 0x70499c328e1e2a3c41108bd3730f6670a44595d1 --router-to-adapter-function-selector ccipReceive ----bridge-to-adapter-function-selector sendMessageUsingERC20 --adapter-contract-name CCIPAdapter

# Verify

=========================

pnpm hardhat verify --network 80001 --contract contracts/adapters/CCIPAdapter.sol:CCIPAdapter 0xc51B10A545d646A6D648F6e25B037D07B9ED1211 0x2d834f337BB3aBb451aB0D05afeeAa4B88a5A930 0xBbd6d4dC3BF45fdbc286a01916eb7611b727957c 0x70499c328e1e2a3c41108bd3730f6670a44595d1 0x326C977E6efc84E512bB9C30f76E30c160eD06FB
pnpm hardhat verify --network 80001 --contract contracts/Bridge.sol:Bridge 0xBA70e221fF13Ace063868304719D9C67Aa274989 0xBbd6d4dC3BF45fdbc286a01916eb7611b727957c 80001

pnpm hardhat verify --network 80001 --contract contracts/Bridge.sol:Bridge 0x2d834f337BB3aBb451aB0D05afeeAa4B88a5A930 0xBbd6d4dC3BF45fdbc286a01916eb7611b727957c 80001
pnpm hardhat verify --network 80001 --contract contracts/adapters/CCIPAdapter.sol:CCIPAdapter 0x533088e7bC6eC082F64BE2F54E303aFc8358ed24 0xBA70e221fF13Ace063868304719D9C67Aa274989 0xBbd6d4dC3BF45fdbc286a01916eb7611b727957c 0x70499c328e1e2a3c41108bd3730f6670a44595d1 0x326C977E6efc84E512bB9C30f76E30c160eD06FB

# Bridge ERC721 using ERC20 token as fee

=========================

pnpm hardhat bridge-erc721-using-erc20 --network 80001 --token-name "hello" --token-symbol "world" --bridge-address 0x2d834f337BB3aBb451aB0D05afeeAa4B88a5A930 --adapter-address 0xc51B10A545d646A6D648F6e25B037D07B9ED1211 --target-network 43113 --fee-token-name LINK
pnpm hardhat bridge-erc721-using-erc20 --network 80001 --token-name "Doodle" --token-symbol "DOD" --bridge-address 0xBA70e221fF13Ace063868304719D9C67Aa274989 --adapter-address 0x533088e7bC6eC082F64BE2F54E303aFc8358ed24 --target-network 43113 --fee-token-name LINK

# Execute

pnpm hardhat execute-message --network 80001 --adapter-address 0x989BdC1DC4d116d30edc8Fd8D2465a0cD0E273b5
pnpm hardhat execute-message --network 80001 --adapter-address 0x533088e7bC6eC082F64BE2F54E303aFc8358ed24

=========================

pnpm hardhat bridge-erc721 --network 80001 --token-address 0x46bef163d6c470a4774f9585f3500ae3b642e751 --token-id 529 --bridge-address 0xBA70e221fF13Ace063868304719D9C67Aa274989 --adapter-address 0x533088e7bC6eC082F64BE2F54E303aFc8358ed24 --target-network 43113 --fee-token-name LINK --origin-chain-evm-id 80001
18 changes: 11 additions & 7 deletions contracts-right.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,34 +14,38 @@ pnpm hardhat deploy-bridge-contract --network 43113

=========================

pnpm hardhat deploy-adapter-contract --network 43113 --adapter "CCIPAdapter" --bridge-address 0x95A253D055bACD9e3B8c943b8c23a44a455f62bF --router-address 0x554472a2720e5e7d5d3c817529aba05eed5f82d8 --fee-token-name LINK
pnpm hardhat deploy-adapter-contract --network 43113 --adapter "CCIPAdapter" --bridge-address 0xcae74Ff0366797EB0d65E019A5375d949B02a165 --router-address 0x554472a2720e5e7d5d3c817529aba05eed5f82d8 --fee-token-name LINK

# Set chain settings

=========================

pnpm hardhat set-chain-settings --network 43113 --bridge-address 0x95A253D055bACD9e3B8c943b8c23a44a455f62bF --evm-chain-id 80001 --non-evm-chain-id 12532609583862916517 --adapter-address 0xe929743b5e4Ec0966bDc08dF8320802BD5A8C63D ---target-adapter-address 0xc51B10A545d646A6D648F6e25B037D07B9ED1211 --is-enabled true --gas-limit 4000000
pnpm hardhat set-chain-settings --network 43113 --bridge-address 0xcae74Ff0366797EB0d65E019A5375d949B02a165 --evm-chain-id 80001 --non-evm-chain-id 12532609583862916517 --adapter-address 0xB0c0867cA7a90f7F33D3f65fCb53B1259CCeC291 ---target-adapter-address 0x533088e7bC6eC082F64BE2F54E303aFc8358ed24 --is-enabled true --gas-limit 4000000

# Setup bridge adapter roles

==========================

pnpm hardhat setup-bridge-adapter --network 43113 --bridge-address 0x95A253D055bACD9e3B8c943b8c23a44a455f62bF --adapter-address 0xe929743b5e4Ec0966bDc08dF8320802BD5A8C63D --adapter-router-address 0x554472a2720e5e7d5d3c817529aba05eed5f82d8 --router-to-adapter-function-selector ccipReceive ----bridge-to-adapter-function-selector sendMessageUsingERC20 --adapter-contract-name CCIPAdapter
pnpm hardhat setup-bridge-adapter --network 43113 --bridge-address 0xcae74Ff0366797EB0d65E019A5375d949B02a165 --adapter-address 0xB0c0867cA7a90f7F33D3f65fCb53B1259CCeC291 --adapter-router-address 0x554472a2720e5e7d5d3c817529aba05eed5f82d8 --router-to-adapter-function-selector ccipReceive ----bridge-to-adapter-function-selector sendMessageUsingERC20 --adapter-contract-name CCIPAdapter

# Verify

=========================

pnpm hardhat verify --network 43113 --contract contracts/adapters/CCIPAdapter.sol:CCIPAdapter 0xe929743b5e4Ec0966bDc08dF8320802BD5A8C63D 0x95A253D055bACD9e3B8c943b8c23a44a455f62bF 0x554472a2720e5e7d5d3c817529aba05eed5f82d8 0x7953C478A5F5d53C263Bd1251BfC4c418d8C5568 0x0b9d5D9136855f6FEc3c0993feE6E9CE8a297846
pnpm hardhat verify --network 43113 --contract contracts/Bridge.sol:Bridge 0xcae74Ff0366797EB0d65E019A5375d949B02a165 0x7953C478A5F5d53C263Bd1251BfC4c418d8C5568 43113

pnpm hardhat verify --network 43113 --contract contracts/Bridge.sol:Bridge 0x95A253D055bACD9e3B8c943b8c23a44a455f62bF 0x7953C478A5F5d53C263Bd1251BfC4c418d8C5568 43113
pnpm hardhat verify --network 43113 --contract contracts/adapters/CCIPAdapter.sol:CCIPAdapter 0xB0c0867cA7a90f7F33D3f65fCb53B1259CCeC291 0xcae74Ff0366797EB0d65E019A5375d949B02a165 0x554472a2720e5e7d5d3c817529aba05eed5f82d8 0x7953C478A5F5d53C263Bd1251BfC4c418d8C5568 0x0b9d5D9136855f6FEc3c0993feE6E9CE8a297846

# Bridge ERC721 using ERC20 token as fee

=========================
pnpm hardhat bridge-erc721-using-erc20 --network 43113 --token-name "hello" --token-symbol "world" --bridge-address 0x95A253D055bACD9e3B8c943b8c23a44a455f62bF --adapter-address 0xe929743b5e4Ec0966bDc08dF8320802BD5A8C63D --target-network 80001 --fee-token-name LINK
pnpm hardhat bridge-erc721-using-erc20 --network 43113--token-name "Doodle" --token-symbol "DOD" --bridge-address 0xcae74Ff0366797EB0d65E019A5375d949B02a165 --adapter-address 0xB0c0867cA7a90f7F33D3f65fCb53B1259CCeC291 --target-network 80001 --fee-token-name LINK

# Execute

==========================
pnpm hardhat execute-message --network 43113 --adapter-address 0x7f188288e39197B7e55EC4E08a9f19f56A8580e8
pnpm hardhat execute-message --network 43113 --adapter-address 0xB0c0867cA7a90f7F33D3f65fCb53B1259CCeC291

===============================

pnpm hardhat bridge-erc721 --network 43113 --token-address 0xa7Ef3a94D78c444054FB15d583FeD9127D4b5C81 --token-id 1 --bridge-address 0xcae74Ff0366797EB0d65E019A5375d949B02a165 --adapter-address 0xB0c0867cA7a90f7F33D3f65fCb53B1259CCeC291 --target-network 80001 --fee-token-name LINK --origin-chain-evm-id 80001
12 changes: 10 additions & 2 deletions contracts/Bridge.sol
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ contract Bridge is IBridge, AccessManaged {
/// @dev nonEvmChainId => evmChainId
mapping(uint256 => uint256) private s_nonEvmChains;

/// @dev originAddress -> wrapped token
/// @dev originAddress -> wrapped token details
mapping(address => IBridge.ERC721Wrapped) private s_wrappedERC721Tokens;

/// @dev wrapped token address -> origin address
Expand Down Expand Up @@ -195,14 +195,22 @@ contract Bridge is IBridge, AccessManaged {
EvmChainSettings memory offRampChainSettings = getChainSettings(evmChainId_, IBridge.RampType.OffRamp);
IERC721Metadata metadata = IERC721Metadata(token_);

IBridge.ERC721Wrapped memory wrappedToken = s_wrappedERC721Tokens[s_wrappedERC721TokenOrigin[token_]];

/// @dev use token address if its origin address
address originTokenAddress = wrappedToken.originAddress == address(0) ? token_ : wrappedToken.originAddress;

/// @dev use source chain id if its origin chain id
uint256 originChainId = wrappedToken.originEvmChainId == 0 ? s_chainId : wrappedToken.originEvmChainId;

return
IBaseAdapter.MessageSend({
gasLimit: offRampChainSettings.gasLimit,
toChain: offRampChainSettings.nonEvmChainId, /// @dev adapter use nonvEvmChainId to handle message
receiver: offRampChainSettings.adapter, /// @dev adatper address that will receive the message
data: _getEncodedPayloadData(
msg.sender, /// @dev address that will receive the ERC721 wrapped in the other chain
abi.encode(s_chainId, token_, tokenId_),
abi.encode(originChainId, originTokenAddress, tokenId_),
abi.encode(metadata.name(), metadata.symbol(), metadata.tokenURI(tokenId_))
)
});
Expand Down
4 changes: 3 additions & 1 deletion tasks/bridge-erc721-using-erc20.ts
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,9 @@ task('bridge-erc721-using-erc20', 'bridge ERC721 contract using erc20 token')
*
*/

console.log(`ℹ️ Sending ERC721 to bridge using ${feeTokenName}`)
console.log(
`ℹ️ Sending ERC721 ${ERC721Address} to bridge using ${feeTokenName}`
)

const tx3 = await bridge.sendERC721UsingERC20(
targetChainSettings.evmChainId,
Expand Down
207 changes: 207 additions & 0 deletions tasks/bridge-erc721.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,207 @@
import { task, types } from 'hardhat/config'
import { Spinner } from '../scripts/spinner'
import cliSpinner from 'cli-spinners'
import { allowedChainsConfig } from '@/config/config'
import { RampType } from './set-chain-settings'

const spinner: Spinner = new Spinner(cliSpinner.aesthetic)

export type DeployTestERC721ContractTask = {
bridgeAddress: string
adapterAddress: string
targetNetwork: number
feeTokenName: 'LINK'
accountIndex: number
tokenAddress: string
tokenId: number
originChainEvmId: number
}

task('bridge-erc721', 'bridge ERC721 contract using erc20 token')
.addParam('tokenAddress', 'token address')
.addParam('tokenId', 'token id')
.addParam('originChainEvmId', 'origin chain evm id')
.addParam('bridgeAddress', 'bridge address')
.addParam('adapterAddress', 'adapter address')
.addParam('targetNetwork', 'target network')
.addParam('feeTokenName', 'fee token address')
.addOptionalParam(
'accountIndex',
'Account index to use for deployment',
0,
types.int
)
.setAction(
async (
{
bridgeAddress,
targetNetwork,
adapterAddress,
accountIndex,
feeTokenName,
tokenAddress,
tokenId,
originChainEvmId
}: DeployTestERC721ContractTask,
hre
) => {
spinner.start()

try {
const chainConfig = allowedChainsConfig[+hre.network.name]
if (!chainConfig) {
spinner.stop()
throw new Error('Chain config not found')
}

const provider = new hre.ethers.JsonRpcProvider(
chainConfig.rpcUrls.default.http[0],
chainConfig.id
)

const deployer = new hre.ethers.Wallet(
chainConfig.accounts[accountIndex],
provider
)

const ERC721 = await hre.ethers.getContractAt(
'ERC721',
tokenAddress,
deployer
)

const tokenName = await ERC721.name()
const tokenSymbol = await ERC721.symbol()

console.log(
`ℹ️ Briding ERC721 ${tokenName} with symbol ${tokenSymbol} to ${chainConfig.id}`
)

/**
*
*/

console.log('ℹ️ Getting required fee from adapter')

const bridge = await hre.ethers.getContractAt(
'Bridge',
bridgeAddress,
deployer
)

await bridge.waitForDeployment()

const adapter = await hre.ethers.getContractAt(
'CCIPAdapter',
adapterAddress,
deployer
)

await adapter.waitForDeployment()

const abiCoder = hre.ethers.AbiCoder.defaultAbiCoder()

const targetChainSettings = await bridge.getChainSettings(
targetNetwork,
RampType.OnRamp
)

const payload = {
toChain: targetChainSettings.nonEvmChainId,
receiver: targetChainSettings.adapter,
gasLimit: targetChainSettings.gasLimit,
data: abiCoder.encode(
['address', 'bytes', 'bytes'],
[
deployer.address,
abiCoder.encode(
['uint256', 'address', 'uint256'],
[originChainEvmId, tokenAddress, tokenId]
),
abiCoder.encode(
['string', 'string', 'string'],
[tokenName, tokenSymbol, await ERC721.tokenURI(tokenId)]
)
]
)
}

const fee = await adapter.getFee(payload)

console.log('ℹ️ Required feee:', fee)

/**
*
*/

console.log('ℹ️ Approving ERC721 to bridge')
const tx2 = await ERC721.approve(bridgeAddress, tokenId)
await tx2.wait()

const receipt2 = await tx2.wait()
const gasUsed2 = receipt2?.gasUsed || 0n
console.log('ℹ️ Done and gas used: ', gasUsed2)
/**
*
*/

console.log(`ℹ️ Approving bridge to spend ERC20 tokens`)

const ERC20 = await hre.ethers.getContractAt(
'ERC20',
chainConfig.assets[feeTokenName].address,
deployer
)

const tx4 = await ERC20.approve(bridgeAddress, fee)
const receipt4 = await tx4.wait()
const gasUsed4 = receipt4?.gasUsed || 0n

console.log('ℹ️ Done and gas used: ', gasUsed4)

/**
*
*/

console.log('ℹ️ Estimating gas')

const estimateGas = await bridge.sendERC721UsingERC20.estimateGas(
targetChainSettings.evmChainId,
tokenAddress,
tokenId,
fee
)

console.log('ℹ️ Gas estimate', estimateGas)

/**
*
*/

console.log(`ℹ️ Sending ERC721 to bridge using ${feeTokenName}`)

const tx3 = await bridge.sendERC721UsingERC20(
targetChainSettings.evmChainId,
tokenAddress,
tokenId,
fee
)

const receipt3 = await tx3.wait()
const gasUsed3 = receipt3?.gasUsed || 0n

console.log('ℹ️ Done and gas used: ', gasUsed3)

/**
*
*/

spinner.stop()
console.log(`✅ ERC721 ${tokenName} transfered`)
} catch (error) {
spinner.stop()
console.log(error)
console.log(`❌ ERC721 bridge failed`)
}
}
)
1 change: 1 addition & 0 deletions tasks/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,4 @@ import './bridge-erc721-using-native'
import './bridge-erc721-using-erc20'
import './deploy-wrapped-contract'
import './execute-message'
import './bridge-erc721'
1 change: 1 addition & 0 deletions test/bridge/Bridge.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1115,6 +1115,7 @@ describe('Bridge', function () {
expect(wrappedTokenOwner).to.be.equal(currentOwner.address)
})

/// @dev todo: revalidate that test
it('should transfer to receive ERC721 original when it is origin evm chain id', async function () {
const [, currentOwner] = await getSigners()
const evmChainId = 137
Expand Down

0 comments on commit c6a490e

Please sign in to comment.