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

LayerZero: Wrong path data #37

Open
devon-bfs opened this issue Oct 6, 2023 · 3 comments
Open

LayerZero: Wrong path data #37

devon-bfs opened this issue Oct 6, 2023 · 3 comments

Comments

@devon-bfs
Copy link

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
Copy link

Babat0 commented Oct 6, 2023 via email

@devon-bfs
Copy link
Author

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

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

@Ahliyor25
Copy link

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')
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants