Remix 无法识别数组中的 WMATIC 地址
Remix not recognizing WMATIC address in an array
我一直在尝试使用 Remix 编译合约。我正在初始化一个数组,如下所示:
address[] public wmaticToUsdcPath =[0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270, 0x2791bca1f2de4661ed88a30c99a7a9449aa84174];
但 Remix 无法编译并抱怨 0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270 不是错误。确切的错误是,这看起来像一个数组,但有一个无效的校验和。它建议我在其前面加上“00”并将我引导至 https://docs.soliditylang.org/en/develop/types.html#address-literals,但我似乎无法理解该怎么做。前置“00”将更改地址。我正在 MATIC/Polygon 网络上工作。
有趣的是,如果我声明一个地址变量并将 WMATIC 地址分配给它,它会被编译器接受。
有谁知道为什么数组中不接受 MATIC 地址。
您需要对地址进行校验和。
地址的校验和基本上是根据地址哈希值调整字母的大小写(十六进制值 a-f)。有一些工具可以计算地址校验和,例如this one. You can see the second half of 更详细的解释。
pragma solidity ^0.8;
contract MyContract {
address[] public wmaticToUsdcPath = [
0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270, // instead of 0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270
0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174 // mind the capitalization of the letters
];
}
原来我只需要按照错误消息中的说明进行操作即可。我在地址前加上“00”前缀,问题就解决了。这个问题是因为 WMATIC(还有 USDC)的地址格式不会通过更高版本的 solidity 的校验和。通过添加“00”,它将使其在编译期间通过校验和,但地址在部署时仍将相同(我担心添加它会更改令牌的地址)。我的最终解决方案如下所示:
address[] public wmaticToUsdcPath =[address(0x000d500b1d8e8ef31e21c99d1db9a6444d3adf1270), address(0x002791bca1f2de4661ed88a30c99a7a9449aa84174)];
我一直在尝试使用 Remix 编译合约。我正在初始化一个数组,如下所示:
address[] public wmaticToUsdcPath =[0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270, 0x2791bca1f2de4661ed88a30c99a7a9449aa84174];
但 Remix 无法编译并抱怨 0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270 不是错误。确切的错误是,这看起来像一个数组,但有一个无效的校验和。它建议我在其前面加上“00”并将我引导至 https://docs.soliditylang.org/en/develop/types.html#address-literals,但我似乎无法理解该怎么做。前置“00”将更改地址。我正在 MATIC/Polygon 网络上工作。
有趣的是,如果我声明一个地址变量并将 WMATIC 地址分配给它,它会被编译器接受。
有谁知道为什么数组中不接受 MATIC 地址。
您需要对地址进行校验和。
地址的校验和基本上是根据地址哈希值调整字母的大小写(十六进制值 a-f)。有一些工具可以计算地址校验和,例如this one. You can see the second half of
pragma solidity ^0.8;
contract MyContract {
address[] public wmaticToUsdcPath = [
0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270, // instead of 0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270
0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174 // mind the capitalization of the letters
];
}
原来我只需要按照错误消息中的说明进行操作即可。我在地址前加上“00”前缀,问题就解决了。这个问题是因为 WMATIC(还有 USDC)的地址格式不会通过更高版本的 solidity 的校验和。通过添加“00”,它将使其在编译期间通过校验和,但地址在部署时仍将相同(我担心添加它会更改令牌的地址)。我的最终解决方案如下所示:
address[] public wmaticToUsdcPath =[address(0x000d500b1d8e8ef31e21c99d1db9a6444d3adf1270), address(0x002791bca1f2de4661ed88a30c99a7a9449aa84174)];