LayerZero-Labs / LayerZero

An Omnichain Interoperability Protocol
Other
1.95k stars 1.25k forks source link

LayerZero: Wrong path data #37

Open devon-bfs opened 9 months ago

devon-bfs commented 9 months ago

I am trying to send an OFNTv2 from fuji to goerli I am running into LayerZero: wrong path data error but cannot see where the contract calls the send function.

Below is my code:

const { ethers } = require("hardhat")
require('dotenv').config()

// Initiate token names
const NAME = "TestBridge"
const SYMBOL = "TESTBRIDGE"
const SHARED_DECIMALS = 5

const firstEndpoint = '0x93f54D755A063cE7bB9e6Ac47Eccc8e33411d706'
const secondEndpoint = '0xbfD2135BFfbb0B5378b56643c2Df8a87552Bfa23'
const firstLZId = 10106
const secondLZId = 10121

// Initiate two ethers instances 1 for each chain
const firstProvider = new ethers.JsonRpcProvider(process.env.FUJI_RPC_URL)
const secondProvider = new ethers.JsonRpcProvider(process.env.GOERLI_RPC_URL)
const firstWallet = new ethers.Wallet(process.env.PRIVATE_KEY, firstProvider)
const secondWallet = new ethers.Wallet(process.env.PRIVATE_KEY, secondProvider)

const initialAmount = ethers.parseEther("1.00000001").toString() // 1 ether
const amount = ethers.parseEther("1.00000000")
const dust = ethers.parseEther("0.00000001")

const abiCoder = ethers.AbiCoder.defaultAbiCoder()
const walletAddressBytes32 = abiCoder.encode(["address"], [firstWallet.address])

async function main() {
  await deployContracts()
}
main()

// Get contract factories
async function deployContracts() {
  console.log('Getting contract factories...\n')
  const ERC20 = await ethers.getContractFactory("ERC20Mock", firstWallet)
  const ProxyOFTV2 = await ethers.getContractFactory("ProxyOFTV2", firstWallet)
  const OFTV2 = await ethers.getContractFactory("OFTV2", secondWallet)

  // const erc20Address = "0xF49c606621280Ec3Be5861c2eb0e919C8d171F54"
  // const localOFTAddress = "0xBa8a5316744A3Cb4C07f9bEb428447b8Af4448a6"
  // const remoteOFTAddress = "0x6B50f3dA64742dE3cAC38c818f528A4F90988eCF"

  // const erc20 = ERC20.attach(erc20Address)
  // const localOFT = ProxyOFTV2.attach(localOFTAddress)
  // const remoteOFT = OFTV2.attach(remoteOFTAddress)

  // Deploy ERC20 on Fuji chain
  // Deploy proxy on Fuji chain
  // Deploy OFTV2 on Mumbai chain
  console.log('Deploying Contracts...\n')
  const erc20ConstructorArgs = [NAME, SYMBOL]
  const erc20 = await ERC20.deploy(...erc20ConstructorArgs) // Deploy token
  await erc20.waitForDeployment()
  const erc20Address = await erc20.getAddress()
  console.log("ERC20: ", erc20Address)

  const localOFTConstructorArgs = [erc20Address, SHARED_DECIMALS, firstEndpoint]
  const localOFT = await ProxyOFTV2.deploy(...localOFTConstructorArgs) // Deploy proxy to token with token address and local endpoint address
  await localOFT.waitForDeployment()
  const localOFTAddress = await localOFT.getAddress()
  console.log("Fuji OFT: ", localOFTAddress)

  const remoteOFTConstructructorArgs = [NAME, SYMBOL, SHARED_DECIMALS, secondEndpoint]
  const remoteOFT = await OFTV2.deploy(...remoteOFTConstructructorArgs) // Deploy remote token with remote endpoint address
  await remoteOFT.waitForDeployment()
  const remoteOFTAddress = await remoteOFT.getAddress()
  console.log("Remote OFT: ", remoteOFTAddress)

  // Set paths
  console.log('Setting Paths...\n')
  firstPath = ethers.solidityPacked(["address", "address"], [secondEndpoint, firstEndpoint])
  secondPath = ethers.solidityPacked(["address", "address"], [firstEndpoint, secondEndpoint])
  await localOFT.setTrustedRemote(secondLZId, firstPath) // for A, set B
  console.log('Set path for first')
  await remoteOFT.setTrustedRemote(firstLZId, secondPath) // for B, set A
  console.log('Set path for second')

  // Mint tokens
  console.log('Minting Tokens...\n')
  let tx = await erc20.mint(firstWallet, initialAmount)
  await tx.wait()

  // SWAP TOKENS FROM ALICE TO BOB

  // 1. Approve the proxy to swap your tokens
  console.log('Approving Tokens...\n')
  tx = await erc20.approve(localOFTAddress, initialAmount)
  await tx.wait()

  // Set min gas fee
  console.log('Setting min dst gas...\n')
  tx = await localOFT.setMinDstGas(secondLZId, 0, 200000)
  await tx.wait()
  tx = await localOFT.setMinDstGas(secondLZId, 1, 200000)
  await tx.wait()
  tx = await remoteOFT.setMinDstGas(firstLZId, 0, 200000)
  await tx.wait()
  tx = await remoteOFT.setMinDstGas(firstLZId, 1, 200000)
  await tx.wait()

  // 3. Estimate gas
  console.log('Estimating Fee...\n')
  let nativeFee = (await localOFT.estimateSendFee(
    secondLZId, // layezero chain id
    walletAddressBytes32,
    initialAmount,
    false,
    "0x"
  )).nativeFee

  let adapterParams = ethers.solidityPacked(["uint16", "uint256"], [0, 200000]) // 0 for sendFrom

  // 4. Send to end chain
  console.log('Sending Transaction...\n')

  tx = await localOFT.sendFrom(
    firstWallet.address, // from address to send from
    secondLZId, // layerzero chain id
    walletAddressBytes32, // bytes of to address
    initialAmount, // amount to send
    [
      firstWallet.address,
      ethers.ZeroAddress,
      adapterParams
    ],
    { value: nativeFee }
  )
  const receipt = await tx.wait()
  console.log(receipt)
  console.log('\n\n\nSwap has been made \n\n\n')

  // SEND TOKENS BACK TO START CHAIN
  const halfAmount = amount.div(2)

  // 1. Create bytes32 of alice's address
  const aliceAddressBytes32 = abiCoder.encode(["address"], [firstWallet.address])

  // 2. Estimate gas fee
  nativeFee = (await remoteOFT.estimateSendFee(firstLZId, aliceAddressBytes32, halfAmount, false, "0x")).nativeFee

  // 3. Send to alice
  tx = await remoteOFT.sendFrom(
    firstWallet.address,
    firstLZId,
    aliceAddressBytes32,
    halfAmount,
    [firstWallet.address, ethers.ZeroAddress, "0x"],
    { value: nativeFee }
  )
  const receipt2 = await tx.wait()
  console.log(receipt2)
  // TOKENS HAVE BEEN SWAPPED
  console.log('\n\n\nSwapped back\n\n\n')

}
Babat0 commented 9 months ago

соси хуй мудила

пт, 6 жовт. 2023 р. о 16:41 devon-bfs @.***> пише:

I am trying to send an OFNTv2 from fuji to goerli I am running into LayerZero: wrong path data error but cannot see where the contract calls the send function.

Below is my code:

const { ethers } = require("hardhat") require('dotenv').config()

// Initiate token names const NAME = "TestBridge" const SYMBOL = "TESTBRIDGE" const SHARED_DECIMALS = 5

const firstEndpoint = '0x93f54D755A063cE7bB9e6Ac47Eccc8e33411d706' const secondEndpoint = '0xbfD2135BFfbb0B5378b56643c2Df8a87552Bfa23' const firstLZId = 10106 const secondLZId = 10121

// Initiate two ethers instances 1 for each chain const firstProvider = new ethers.JsonRpcProvider(process.env.FUJI_RPC_URL) const secondProvider = new ethers.JsonRpcProvider(process.env.GOERLI_RPC_URL) const firstWallet = new ethers.Wallet(process.env.PRIVATE_KEY, firstProvider) const secondWallet = new ethers.Wallet(process.env.PRIVATE_KEY, secondProvider)

const initialAmount = ethers.parseEther("1.00000001").toString() // 1 ether const amount = ethers.parseEther("1.00000000") const dust = ethers.parseEther("0.00000001")

const abiCoder = ethers.AbiCoder.defaultAbiCoder() const walletAddressBytes32 = abiCoder.encode(["address"], [firstWallet.address])

async function main() { await deployContracts() } main()

// Get contract factories async function deployContracts() { console.log('Getting contract factories...\n') const ERC20 = await ethers.getContractFactory("ERC20Mock", firstWallet) const ProxyOFTV2 = await ethers.getContractFactory("ProxyOFTV2", firstWallet) const OFTV2 = await ethers.getContractFactory("OFTV2", secondWallet)

// const erc20Address = "0xF49c606621280Ec3Be5861c2eb0e919C8d171F54" // const localOFTAddress = "0xBa8a5316744A3Cb4C07f9bEb428447b8Af4448a6" // const remoteOFTAddress = "0x6B50f3dA64742dE3cAC38c818f528A4F90988eCF"

// const erc20 = ERC20.attach(erc20Address) // const localOFT = ProxyOFTV2.attach(localOFTAddress) // const remoteOFT = OFTV2.attach(remoteOFTAddress)

// Deploy ERC20 on Fuji chain // Deploy proxy on Fuji chain // Deploy OFTV2 on Mumbai chain console.log('Deploying Contracts...\n') const erc20ConstructorArgs = [NAME, SYMBOL] const erc20 = await ERC20.deploy(...erc20ConstructorArgs) // Deploy token await erc20.waitForDeployment() const erc20Address = await erc20.getAddress() console.log("ERC20: ", erc20Address)

const localOFTConstructorArgs = [erc20Address, SHARED_DECIMALS, firstEndpoint] const localOFT = await ProxyOFTV2.deploy(...localOFTConstructorArgs) // Deploy proxy to token with token address and local endpoint address await localOFT.waitForDeployment() const localOFTAddress = await localOFT.getAddress() console.log("Fuji OFT: ", localOFTAddress)

const remoteOFTConstructructorArgs = [NAME, SYMBOL, SHARED_DECIMALS, secondEndpoint] const remoteOFT = await OFTV2.deploy(...remoteOFTConstructructorArgs) // Deploy remote token with remote endpoint address await remoteOFT.waitForDeployment() const remoteOFTAddress = await remoteOFT.getAddress() console.log("Remote OFT: ", remoteOFTAddress)

// Set paths console.log('Setting Paths...\n') firstPath = ethers.solidityPacked(["address", "address"], [secondEndpoint, firstEndpoint]) secondPath = ethers.solidityPacked(["address", "address"], [firstEndpoint, secondEndpoint]) await localOFT.setTrustedRemote(secondLZId, firstPath) // for A, set B console.log('Set path for first') await remoteOFT.setTrustedRemote(firstLZId, secondPath) // for B, set A console.log('Set path for second')

// Mint tokens console.log('Minting Tokens...\n') let tx = await erc20.mint(firstWallet, initialAmount) await tx.wait()

// SWAP TOKENS FROM ALICE TO BOB

// 1. Approve the proxy to swap your tokens console.log('Approving Tokens...\n') tx = await erc20.approve(localOFTAddress, initialAmount) await tx.wait()

// Set min gas fee console.log('Setting min dst gas...\n') tx = await localOFT.setMinDstGas(secondLZId, 0, 200000) await tx.wait() tx = await localOFT.setMinDstGas(secondLZId, 1, 200000) await tx.wait() tx = await remoteOFT.setMinDstGas(firstLZId, 0, 200000) await tx.wait() tx = await remoteOFT.setMinDstGas(firstLZId, 1, 200000) await tx.wait()

// 3. Estimate gas console.log('Estimating Fee...\n') let nativeFee = (await localOFT.estimateSendFee( secondLZId, // layezero chain id walletAddressBytes32, initialAmount, false, "0x" )).nativeFee

let adapterParams = ethers.solidityPacked(["uint16", "uint256"], [0, 200000]) // 0 for sendFrom

// 4. Send to end chain console.log('Sending Transaction...\n')

tx = await localOFT.sendFrom( firstWallet.address, // from address to send from secondLZId, // layerzero chain id walletAddressBytes32, // bytes of to address initialAmount, // amount to send [ firstWallet.address, ethers.ZeroAddress, adapterParams ], { value: nativeFee } ) const receipt = await tx.wait() console.log(receipt) console.log('\n\n\nSwap has been made \n\n\n')

// SEND TOKENS BACK TO START CHAIN const halfAmount = amount.div(2)

// 1. Create bytes32 of alice's address const aliceAddressBytes32 = abiCoder.encode(["address"], [firstWallet.address])

// 2. Estimate gas fee nativeFee = (await remoteOFT.estimateSendFee(firstLZId, aliceAddressBytes32, halfAmount, false, "0x")).nativeFee

// 3. Send to alice tx = await remoteOFT.sendFrom( firstWallet.address, firstLZId, aliceAddressBytes32, halfAmount, [firstWallet.address, ethers.ZeroAddress, "0x"], { value: nativeFee } ) const receipt2 = await tx.wait() console.log(receipt2) // TOKENS HAVE BEEN SWAPPED console.log('\n\n\nSwapped back\n\n\n')

}

— Reply to this email directly, view it on GitHub https://github.com/LayerZero-Labs/LayerZero/issues/37, or unsubscribe https://github.com/notifications/unsubscribe-auth/BB26QK2WKYCS3LIP27MHSKTX6ARDXAVCNFSM6AAAAAA5WAIPO6VHI2DSMVQWIX3LMV43ASLTON2WKOZRHEZTANBWGY4DKMI . You are receiving this because you are subscribed to this thread.Message ID: @.***>

devon-bfs commented 9 months ago

соси хуй мудила

As in I need to do more of that or less of that to make the code work?

Ahliyor25 commented 1 month ago

As in I need to do more of that or less of that to make the code work?

const { ethers } = require("hardhat") require('dotenv').config()

const NAME = "TestBridge" const SYMBOL = "TESTBRIDGE" const SHARED_DECIMALS = 5

const firstEndpoint = '0x93f54D755A063cE7bB9e6Ac47Eccc8e33411d706' const secondEndpoint = '0xbfD2135BFfbb0B5378b56643c2Df8a87552Bfa23' const firstLZId = 10106 const secondLZId = 10121

const firstProvider = new ethers.JsonRpcProvider(process.env.FUJI_RPC_URL) const secondProvider = new ethers.JsonRpcProvider(process.env.GOERLI_RPC_URL) const firstWallet = new ethers.Wallet(process.env.PRIVATE_KEY, firstProvider) const secondWallet = new ethers.Wallet(process.env.PRIVATE_KEY, secondProvider)

const initialAmount = ethers.parseEther("1.00000001").toString() const amount = ethers.parseEther("1.00000000") const dust = ethers.parseEther("0.00000001")

const abiCoder = ethers.AbiCoder.defaultAbiCoder() const walletAddressBytes32 = abiCoder.encode(["address"], [firstWallet.address])

async function main() { await deployContracts() } main()

async function deployContracts() { console.log('Getting contract factories...\n') const ERC20 = await ethers.getContractFactory("ERC20Mock", firstWallet) const ProxyOFTV2 = await ethers.getContractFactory("ProxyOFTV2", firstWallet) const OFTV2 = await ethers.getContractFactory("OFTV2", secondWallet)

console.log('Deploying Contracts...\n') const erc20ConstructorArgs = [NAME, SYMBOL] const erc20 = await ERC20.deploy(...erc20ConstructorArgs) await erc20.waitForDeployment() const erc20Address = await erc20.getAddress() console.log("ERC20: ", erc20Address)

const localOFTConstructorArgs = [erc20Address, SHARED_DECIMALS, firstEndpoint] const localOFT = await ProxyOFTV2.deploy(...localOFTConstructorArgs) await localOFT.waitForDeployment() const localOFTAddress = await localOFT.getAddress() console.log("Fuji OFT: ", localOFTAddress)

const remoteOFTConstructructorArgs = [NAME, SYMBOL, SHARED_DECIMALS, secondEndpoint] const remoteOFT = await OFTV2.deploy(...remoteOFTConstructructorArgs) await remoteOFT.waitForDeployment() const remoteOFTAddress = await remoteOFT.getAddress() console.log("Remote OFT: ", remoteOFTAddress)

console.log('Setting Paths...\n') firstPath = ethers.solidityPacked(["address", "address"], [remoteOFTAddress, localOFTAddress]) secondPath = ethers.solidityPacked(["address", "address"], [localOFTAddress, remoteOFTAddress]) await localOFT.setTrustedRemote(secondLZId, firstPath) console.log('Set path for first: ', firstPath) await remoteOFT.setTrustedRemote(firstLZId, secondPath) console.log('Set path for second: ', secondPath)

console.log('Minting Tokens...\n') let tx = await erc20.mint(firstWallet, initialAmount) await tx.wait()

console.log('Approving Tokens...\n') tx = await erc20.approve(localOFTAddress, initialAmount) await tx.wait()

console.log('Setting min dst gas...\n') tx = await localOFT.setMinDstGas(secondLZId, 0, 200000) await tx.wait() tx = await localOFT.setMinDstGas(secondLZId, 1, 200000) await tx.wait() tx = await remoteOFT.setMinDstGas(firstLZId, 0, 200000) await tx.wait() tx = await remoteOFT.setMinDstGas(firstLZId, 1, 200000) await tx.wait()

console.log('Estimating Fee...\n') let nativeFee = (await localOFT.estimateSendFee( secondLZId, walletAddressBytes32, initialAmount, false, "0x" )).nativeFee

let adapterParams = ethers.solidityPacked(["uint16", "uint256"], [0, 200000])

console.log('Sending Transaction...\n') tx = await localOFT.sendFrom( firstWallet.address, secondLZId, walletAddressBytes32, initialAmount, [ firstWallet.address, ethers.ZeroAddress, adapterParams ], { value: nativeFee } ) const receipt = await tx.wait() console.log(receipt) console.log('\n\n\nSwap has been made \n\n\n')

const halfAmount = amount.div(2)

const aliceAddressBytes32 = abiCoder.encode(["address"], [firstWallet.address])

nativeFee = (await remoteOFT.estimateSendFee(firstLZId, aliceAddressBytes32, halfAmount, false, "0x")).nativeFee

tx = await remoteOFT.sendFrom( firstWallet.address, firstLZId, aliceAddressBytes32, halfAmount, [firstWallet.address, ethers.ZeroAddress, "0x"], { value: nativeFee } ) const receipt2 = await tx.wait() console.log(receipt2) console.log('\n\n\nSwapped back\n\n\n') }