如何在没有 "invalid opcode" 的情况下在(分叉的)开发网络上引用 LINK 令牌?

How to reference LINK token on (forked) development network without "invalid opcode"?

我喜欢运行一些本地测试。在 rinkeby 和其他测试链上一切正常。但是,本地 development 链不同意我的配置。 当我 运行 分叉开发网络时:

brownie console --network mainnet-fork

ganache-cli 按预期启动:

Brownie v1.18.1 - Python development framework for Ethereum

BlockchainProject is the active project.

Launching 'ganache-cli --accounts 10 --hardfork istanbul --fork https://mainnet.infura.io/v3/6a633a4ecae8449abbc69974cdd3a9b9 --gasLimit 12000000 --mnemonic brownie --port 8545 --chainId 1'...
Brownie environment is ready.

然而,即使是最简单的合约交互也会失败:

>>> link_token = Contract.from_explorer("0x514910771AF9Ca656af840dff83E8264EcF986CA")
Fetching source of 0x514910771AF9Ca656af840dff83E8264EcF986CA from api.etherscan.io...
>>> accounts[0].balance()
100000000000000000000
>>> accounts[1].balance()
100000000000000000000
>>> link_token.transfer(accounts[0].address, 100, {'from': accounts[0].address})
Transaction sent: 0x1542b679e4d09b2f4523427c7f5048ed01ee0d194c34cd27b82bbd177e1b3f23
  Gas price: 0.0 gwei   Gas limit: 12000000   Nonce: 2
  LinkToken.transfer confirmed (invalid opcode)   Block: 14604608   Gas used: 12000000 (100.00%)

<Transaction '0x1542b679e4d09b2f4523427c7f5048ed01ee0d194c34cd27b82bbd177e1b3f23'>

由于 Link 标记是使用不受支持的编译器编译的,所以我没有得到任何关于为什么会导致 LinkToken.transfer confirmed (invalid opcode).

的进一步信息

我如何(正确地)运行 使用 brownie 针对分叉 development 网络的链链接代码 - 我是否遗漏了资金等步骤??

我在 brownie-config.yaml 中的 networks: 配置:

networks:
  mainnet-fork:
    vrf_coordinator: '0xf0d54349aDdcf704F77AE15b96510dEA15cb7952'
    link_token: '0x514910771AF9Ca656af840dff83E8264EcF986CA'
    keyhash: '0xAA77729D3466CA35AE8D28B3BBAC7CC36A5031EFDC430821C02BC31A238AF445'

我确实尝试过 rm -rf build 但这并没有改变任何东西。

系统环境:

在这种情况下,用于 Link 代币注资的帐户没有任何 Link。由于某种原因,交易没有被恢复,但是 brownieunlock: 选项提供了帮助。

首先调整 networks: 设置以包含具有大量 Link 余额的任意帐户:

  mainnet-fork:
    cmd_settings:
      unlock:
        - 0xf37c348b7d19b17b29cd5cfa64cfa48e2d6eb8db
    vrf_coordinator: '0xf0d54349aDdcf704F77AE15b96510dEA15cb7952'
    link_token: '0x514910771AF9Ca656af840dff83E8264EcF986CA'
    keyhash: '0xAA77729D3466CA35AE8D28B3BBAC7CC36A5031EFDC430821C02BC31A238AF445'

其次,运行一个mainnet-fork如前:

brownie console --network mainnet-fork

三、确认解锁账户可用并入金:

>>> accounts[10]
<Account '0xF37C348B7d19b17B29CD5CfA64cfA48E2d6eb8Db'>
>>> accounts[10].balance()
426496436000000000

四、实例化token的合约,Link本例为:

link_token = Contract.from_explorer("0x514910771AF9Ca656af840dff83E8264EcF986CA")

最后,将Link从解锁账户转入其他账户(或合约):

link_token.transfer(accounts[0], 20, {"from": accounts[10]})

或者,用 Link 资助主网地址,或者甚至解锁 Link 所有者并铸造新的 Link 也可以...