我目前正在为多边形区块链开发一份捐赠智能合同。捐赠合同应接受多种类型的硬币(马季奇、USDT、USDC等)。
我首先做的捐赠功能如下所示:
function donate(address donor, address token, bool isNativeCoin, uint256 amount);但后来,我注意到多边形网络的马季奇地址不同于其他基于evm的链。
因此,我在方法params中删除了isNativeCoin标志变量。
function donate(address donor, address token, uint256 amount);但我不知道这是真实的马季奇地址是什么和多边形是如何区别于其他链。
这是我对马季奇多边形和WMATIC地址的研究。
如果我将0x0000000000000000000000000000000000001010作为代名词在我的元问题钱包中进口,它显示出与马季奇本土余额相同的余额。太有趣了。
这是完整的模拟代码。
address MATIC_TOKEN = 0x0000000000000000000000000000000000001010;
DonationInfo[] donations;
function _safeTransferMatic(address to, uint256 amount) internal {
(bool success, ) = to.call{value: amount}("");
require(success, "MATIC_TRANSFER_FAILED");
}
function donate(address donor, address token, uint256 amount) {
donations.push(DonationInfo(donor, token, amount);
}
function sendDonation(uint256 donateIndex) {
if (donations[donateIndex].token == MATIC_TOKEN) {
_safeTransferMatic(charityPartner, donations[donateIndex].amount);
} else {
IERC20(donations[donateIndex].token).safeTransfer(charityPartner,donations[donateIndex].amount);
}
}上面的代码是正确的还是应该使用isNativeCoin标志变量?
发布于 2022-12-06 04:51:16
它并不是您所认为的真正的ERC20令牌,合同部署在address(0x1010)上的多边形上,主要是从和到达really的桥梁。它存储每个人的马季奇平衡(这就是元问询获得平衡的原因,它只是查找balanceOf()函数并返回其输出),并实现了ERC20标准中的一些方法(包含令牌元数据的方法,如name()、symbol()、decimals()),但它本身并不是一个令牌契约。它不实现任何传输方法,因此您将无法像对任何其他ERC20那样使用ERC20(马季奇是本机链令牌,并且与其他链上的任何其他本地令牌一样被传输)。
现在要回答你关于bool旗子的问题,这真的不重要。每当我需要编写一个可以同时接受本机链令牌和ERC20s作为输入的函数时,我就使用address(0)来表示本机令牌,并执行如下操作:
function useToken(address token, uint amount) {
if(token == address(0)) {
// Ignore `amount` and use `msg.value` instead
}
else {
// normal ERC20 logic
}
}例如,AAVE使用相同的方法(除了使用0xeeeeee...eee)来表示本机令牌。但是拥有一个bool标志,甚至有两个单独的函数(比如Uniswap)也是非常好的。
https://ethereum.stackexchange.com/questions/140664
复制相似问题