我正试图建立一个简单的合同,只需将任何传入的转账金额转发到一个设置的钱包地址。我设法使用带有以太坊地址的Remix IDE使这份合同生效,但我现在无法将其移植到Tron。在TronIDE中,我无法编译声明钱包地址的行。
这是我正在使用的合同代码。有人能告诉我们tron钱包地址需要采用什么格式吗?我试着将其转换为十六进制(transferTo变量(,但它不起作用,我试着使用base58地址,但它没有起作用。
遗憾的是,它在以太坊地址的TronIDE编译器中确实编译得很好,但我甚至成功地将它部署到了Shasta,没有任何问题(当然,除了它转发实际转移的金额(。
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;
contract PaymentForwarder {
address constant transferTo = 414dbc78301522ae1529d01f4093ae3daad3f26827; // this throws a ParseError: Identifier-start is not allowed at end of a number.
address constant transferToAlternative = TH4EovGaTrmWxhJSmeMVKy5ZpnDGE3DgJ8; // this thows a DeclarationError: Undeclared identifier.
address constant workingDeclaration = 0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2; // this works fine in the tron solidity compiler even though it's an ethereum address
event TransferReceived(address _from, uint _amount);
constructor() {
}
receive() payable external {
address payable paya = payable(transferTo);
paya.transfer(msg.value);
emit TransferReceived(msg.sender, msg.value);
}
}
有人能解释一下为什么会这样,钱包地址需要采用什么格式吗?
谢谢
如果你已经有了像transferTo
这样的六进制字符串(快速浏览(,那么你可以简单地添加开头有0x
的六进制串,并使用以下函数将其转换为EVM地址。
/**
* @dev convert uint256 (HexString add 0x at beginning) tron address to solidity address type
* @param tronAddress uint256 tronAddress, begin with 0x, followed by HexString
* @return Solidity address type
*/
function convertFromTronInt(uint256 tronAddress) public view returns(address){
return address(tronAddress);
}
另一方面,transferToAlternative
仍然是其原始的TRON地址形式,那么您需要使用tronweb
TRON的官方库,并使用以下函数将地址转换为其十六进制形式:
tronWeb.address.toHex("TH4EovGaTrmWxhJSmeMVKy5ZpnDGE3DgJ8")
然后简单地,继续上面的步骤,将其完全转换为EVM地址。
希望这能有所帮助!
来源:
- 在Solidity语言中使用的合同地址:https://developers.tron.network/v4.4.0/docs/contract-address-using-in-solidity-language
- Tronweb
address
参考:https://developers.tron.network/reference/address
干杯~