TRC-20合约交互
下面以Shasta测试网上的USDT通证为例,介绍如何同TRC-20合约进行交互。
以下工具可能会帮助您更好理解:
在tronscan上查看示例USDT通证
编码转换工具
说明:
由于合约中的一些方法是constant,这类方法在调用的时候,是可以通过triggerconstantcontract来进行的,这样就不用广播这笔交易,可以直接获得结果。
当然前提是你请求的节点是支持constant调用的(节点的配置项supportConstant需要设置为true)。
name
调用TRC20合约的name()函数获取通证的名称。
HTTP API :
demo: 查询USDT通证资产的名称
/wallet/triggerconstantcontract
curl -X POST https://127.0.0.1:8090/wallet/triggerconstantcontract -d '{
"contract_address":"419E62BE7F4F103C36507CB2A753418791B1CDC182",
"function_selector":"name()",
"owner_address":"41977C20977F412C2A1AA4EF3D49FEE5EC4C31CDFB"
}'
返回结果:
{"result":{"result":true},"constant_result":["000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000045553445400000000000000000000000000000000000000000000000000000000"],"transaction":{"ret":[{}],"visible":false,"txID":"7e2e68a039ac4ffb250412c3a8eb556f25c0e5d2b823a0f50f69fb6560be26f7","raw_data":{"contract":[{"parameter":{"value":{"data":"06fdde03","owner_address":"41977c20977f412c2a1aa4ef3d49fee5ec4c31cdfb","contract_address":"419e62be7f4f103c36507cb2a753418791b1cdc182"},"type_url":"type.googleapis.com/protocol.TriggerSmartContract"},"type":"TriggerSmartContract"}],"ref_block_bytes":"616c","ref_block_hash":"5206423380cc41fd","expiration":1590388398000,"timestamp":1590388339236},"raw_data_hex":"0a02616c22085206423380cc41fd40b0afa4d4a42e5a6d081f12690a31747970652e676f6f676c65617069732e636f6d2f70726f746f636f6c2e54726967676572536d617274436f6e747261637412340a1541977c20977f412c2a1aa4ef3d49fee5ec4c31cdfb1215419e62be7f4f103c36507cb2a753418791b1cdc182220406fdde0370a4e4a0d4a42e"}}
返回结果中constant_result就是USDT通证的名称,以hex string的格式进行返回。
此处为大家详细解释一下,由于返回值为string类型,虚拟机中string被认为是一个变长类型,它的数据包含长度和实际值两部分,因此上面的返回值在解析是需要拆成三部分(每32字节进行一次拆分):
0000000000000000000000000000000000000000000000000000000000000020代表指针
0000000000000000000000000000000000000000000000000000000000000004代表长度
5553445400000000000000000000000000000000000000000000000000000000代表实际值
解析为语义就是该string数据是从第32字节起(16进制的20代表十进制32)开始读取,长度为4个字节,实际数据是"55534454", 再将其转换为字符串形式就是"USDT"。
tronweb 示例:
const TronWeb = require('tronweb')
const HttpProvider = TronWeb.providers.HttpProvider;
const fullNode = new HttpProvider("https://127.0.0.1:8090");
const solidityNode = new HttpProvider("https://127.0.0.1:8090");
const eventServer = new HttpProvider("https://127.0.0.1:8090");
const privateKey = "your private key";
const tronWeb = new TronWeb(fullNode,solidityNode,eventServer,privateKey);
async function triggerSmartContract() {
const trc20ContractAddress = "TQQg4EL8o1BSeKJY4MJ8TB8XK7xufxFBvK";//contract address
try {
let contract = await tronWeb.contract().at(trc20ContractAddress);
//Use call to execute a pure or view smart contract method.
// These methods do not modify the blockchain, do not cost anything to execute and are also not broadcasted to the network.
let result = await contract.name().call();
console.log('result: ', result);
} catch(error) {
console.error("trigger smart contract error",error)
}
}
Wallet-cli示例:
TriggerConstantContract TQQg4EL8o1BSeKJY4MJ8TB8XK7xufxFBvK name() # false
用法:TriggerConstantContract [ownerAddress] [contractAddress] [method] [args] [isHex]
参数说明:
ownerAddress: 调用者地址
contractAdress:TRC20合约地址
method: 合约函数
args:函数参数,如果没有参数用#占位
isHex: 命令参数的地址是否是16进制格式
symbol
调用TRC20合约的symbol函数获取代币的符号。
HTTP API :
demo: 查询USDT通证的符号
/wallet/triggerconstantcontract
curl -X POST https://127.0.0.1:8090/wallet/triggerconstantcontract -d '{
"contract_address":"419E62BE7F4F103C36507CB2A753418791B1CDC182",
"function_selector":"symbol()",
"owner_address":"41977C20977F412C2A1AA4EF3D49FEE5EC4C31CDFB"
}'
返回结果:
{"result":{"result":true},"constant_result":["000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000055553445424000000000000000000000000000000000000000000000000000000"],"transaction":{"ret":[{}],"visible":false,"txID":"cd149b5c5c726786601467240adb5b66ee78f8b001136bd4ea2d91e84261d10d","raw_data":{"contract":[{"parameter":{"value":{"data":"95d89b41","owner_address":"41977c20977f412c2a1aa4ef3d49fee5ec4c31cdfb","contract_address":"419e62be7f4f103c36507cb2a753418791b1cdc182"},"type_url":"type.googleapis.com/protocol.TriggerSmartContract"},"type":"TriggerSmartContract"}],"ref_block_bytes":"6273","ref_block_hash":"0ac4e00c0b259e6d","expiration":1590389253000,"timestamp":1590389195937},"raw_data_hex":"0a02627322080ac4e00c0b259e6d4088c7d8d4a42e5a6d081f12690a31747970652e676f6f676c65617069732e636f6d2f70726f746f636f6c2e54726967676572536d617274436f6e747261637412340a1541977c20977f412c2a1aa4ef3d49fee5ec4c31cdfb1215419e62be7f4f103c36507cb2a753418791b1cdc182220495d89b4170a189d5d4a42e"}}
返回结果中constant_result就是USDT通证的符号,以hex string的格式进行返回。
解析过程和上面调用的name()方法类似,请参考name()的详细解释说明。
解析的结果为 "USDT$" 。
Tronweb示例:
const TronWeb = require('tronweb')
const HttpProvider = TronWeb.providers.HttpProvider;
const fullNode = new HttpProvider("https://127.0.0.1:8090");
const solidityNode = new HttpProvider("https://127.0.0.1:8090");
const eventServer = new HttpProvider("https://127.0.0.1:8090");
const privateKey = "your private key";
const tronWeb = new TronWeb(fullNode,solidityNode,eventServer,privateKey);
async function triggerSmartContract() {
const trc20ContractAddress = "TQQg4EL8o1BSeKJY4MJ8TB8XK7xufxFBvK";//contract address
try {
let contract = await tronWeb.contract().at(trc20ContractAddress);
//Use call to execute a pure or view smart contract method.
// These methods do not modify the blockchain, do not cost anything to execute and are also not broadcasted to the network.
let result = await contract.symbol().call();
console.log('result: ', result);
} catch(error) {
console.error("trigger smart contract error",error)
}
}
Wallet-cli示例:
TriggerConstantContract TQQg4EL8o1BSeKJY4MJ8TB8XK7xufxFBvK symbol() # false
用法:TriggerConstantContract [ownerAddress] [contractAddress] [method] [args] [isHex]
参数说明:
ownerAddress: 调用者地址
contractAdress:TRC20合约地址
method: 合约函数
args:函数参数,如果没有参数用#占位
isHex: 命令参数的地址是否是16进制格式
decimals
调用TRC20合约的decimals函数获取代币的精度。
HTTP API :
demo: 查询USDT通证的精度
/wallet/triggerconstantcontract
curl -X POST https://127.0.0.1:8090/wallet/triggerconstantcontract -d '{
"contract_address":"419E62BE7F4F103C36507CB2A753418791B1CDC182",
"function_selector":"decimals()",
"owner_address":"41977C20977F412C2A1AA4EF3D49FEE5EC4C31CDFB"
}'
返回结果:
{"result":{"result":true},"constant_result":["0000000000000000000000000000000000000000000000000000000000000006"],"transaction":{"ret":[{}],"visible":false,"txID":"18ee58a895c7b9ca2fdb4956e19482e1c023424ee5d3c3b79841cbd07af46a68","raw_data":{"contract":[{"parameter":{"value":{"data":"313ce567","owner_address":"41977c20977f412c2a1aa4ef3d49fee5ec4c31cdfb","contract_address":"419e62be7f4f103c36507cb2a753418791b1cdc182"},"type_url":"type.googleapis.com/protocol.TriggerSmartContract"},"type":"TriggerSmartContract"}],"ref_block_bytes":"5a8e","ref_block_hash":"696524d781f4bb88","expiration":1590382704000,"timestamp":1590382644808},"raw_data_hex":"0a025a8e2208696524d781f4bb884080ebc8d1a42e5a6d081f12690a31747970652e676f6f676c65617069732e636f6d2f70726f746f636f6c2e54726967676572536d617274436f6e747261637412340a1541977c20977f412c2a1aa4ef3d49fee5ec4c31cdfb1215419e62be7f4f103c36507cb2a753418791b1cdc1822204313ce56770c89cc5d1a42e"}}
返回结果中constant_result就是USDT通证的精度,以hex string的格式进行返回,将它进行转换就是6。
Tronweb示例:
const TronWeb = require('tronweb')
const HttpProvider = TronWeb.providers.HttpProvider;
const fullNode = new HttpProvider("https://127.0.0.1:8090");
const solidityNode = new HttpProvider("https://127.0.0.1:8090");
const eventServer = new HttpProvider("https://127.0.0.1:8090");
const privateKey = "your private key";
const tronWeb = new TronWeb(fullNode,solidityNode,eventServer,privateKey);
async function triggerSmartContract() {
const trc20ContractAddress = "TQQg4EL8o1BSeKJY4MJ8TB8XK7xufxFBvK";//contract address
try {
let contract = await tronWeb.contract().at(trc20ContractAddress);
//Use call to execute a pure or view smart contract method.
// These methods do not modify the blockchain, do not cost anything to execute and are also not broadcasted to the network.
let result = await contract.decimals().call();
console.log('result: ', result);
} catch(error) {
console.error("trigger smart contract error",error)
}
}
Wallet-cli示例:
TriggerConstantContract TQQg4EL8o1BSeKJY4MJ8TB8XK7xufxFBvK decimals() # false
用法:TriggerConstantContract [ownerAddress] [contractAddress] [method] [args] [isHex]
参数说明:
ownerAddress: 调用者地址
contractAdress:TRC20合约地址
method: 合约函数
args:函数参数,如果没有参数用#占位
isHex: 命令参数的地址是否是16进制格式
totalSupply
调用TRC20合约的totalSupply函数获取代币的总供应量。
HTTP API :
demo:查询USDT通证的发行总量
/wallet/triggerconstantcontract
curl -X POST https://127.0.0.1:8090/wallet/triggerconstantcontract -d '{
"contract_address":"419E62BE7F4F103C36507CB2A753418791B1CDC182",
"function_selector":"totalSupply()",
"owner_address":"41977C20977F412C2A1AA4EF3D49FEE5EC4C31CDFB"
}'
返回结果:
{"result":{"result":true},"constant_result":["000000000000000000000000000000000000000000000000000000e8d4a51000"],"transaction":{"ret":[{}],"visible":false,"txID":"397d14fa396c2e3365391a09cf7c91a386a80a9490e55cd46eea2bc3bfe82ebe","raw_data":{"contract":[{"parameter":{"value":{"data":"18160ddd","owner_address":"41977c20977f412c2a1aa4ef3d49fee5ec4c31cdfb","contract_address":"419e62be7f4f103c36507cb2a753418791b1cdc182"},"type_url":"type.googleapis.com/protocol.TriggerSmartContract"},"type":"TriggerSmartContract"}],"ref_block_bytes":"5629","ref_block_hash":"2c34e5774dd06d40","expiration":1590379059000,"timestamp":1590379001737},"raw_data_hex":"0a02562922082c34e5774dd06d4040b8aeeacfa42e5a6d081f12690a31747970652e676f6f676c65617069732e636f6d2f70726f746f636f6c2e54726967676572536d617274436f6e747261637412340a1541977c20977f412c2a1aa4ef3d49fee5ec4c31cdfb1215419e62be7f4f103c36507cb2a753418791b1cdc182220418160ddd7089efe6cfa42e"}}
返回结果中constant_result就是USDT总供应量,以hex string的格式进行返回,将它进行转换就是1000000000000。
Tronweb示例:
const TronWeb = require('tronweb')
const HttpProvider = TronWeb.providers.HttpProvider;
const fullNode = new HttpProvider("https://127.0.0.1:8090");
const solidityNode = new HttpProvider("https://127.0.0.1:8090");
const eventServer = new HttpProvider("https://127.0.0.1:8090");
const privateKey = "your private key";
const tronWeb = new TronWeb(fullNode,solidityNode,eventServer,privateKey);
async function triggerSmartContract() {
const trc20ContractAddress = "TQQg4EL8o1BSeKJY4MJ8TB8XK7xufxFBvK";//contract address
try {
let contract = await tronWeb.contract().at(trc20ContractAddress);
//Use call to execute a pure or view smart contract method.
// These methods do not modify the blockchain, do not cost anything to execute and are also not broadcasted to the network.
let result = await contract.totalSupply().call();
console.log('result: ', result);
} catch(error) {
console.error("trigger smart contract error",error)
}
}
Wallet-cli示例:
TriggerConstantContract TQQg4EL8o1BSeKJY4MJ8TB8XK7xufxFBvK totalSupply() # false
用法:TriggerConstantContract [ownerAddress] [contractAddress] [method] [args] [isHex]
参数说明:
ownerAddress: 调用者地址
contractAdress:TRC20合约地址
method: 合约函数
args:函数参数,如果没有参数用#占位
isHex: 命令参数的地址是否是16进制格式
balanceOf
调用TRC20合约的balanceOf函数获取指定账户的代币余额。
HTTP API :
demo: 查询某个地址拥有的USDT通证数量
/wallet/triggerconstantcontract
curl -X POST https://127.0.0.1:8090/wallet/triggerconstantcontract -d '{
"contract_address":"419E62BE7F4F103C36507CB2A753418791B1CDC182",
"function_selector":"balanceOf(address)",
"parameter":"000000000000000000000041977C20977F412C2A1AA4EF3D49FEE5EC4C31CDFB",
"owner_address":"41977C20977F412C2A1AA4EF3D49FEE5EC4C31CDFB"
}'
参数说明:
contract_address是合约的地址的hexstring格式
owner_address是触发合约方法的地址的hexstring格式
function_selector是要触发的合约方法
parameter是合约方法要传入的参数,本例中应该传入的是address。由于波场的地址结构是地址前缀"41"+20字节地址,传地址参数的时候要求是32字节的,所以前面用"0"进行补齐。
返回结果:
{"result":{"result":true},"constant_result":["0000000000000000000000000000000000000000000000000000000430e1b700"],"transaction":{"ret":[{}],"visible":false,"txID":"7f47212aed2fdab232195feece54fc302bde2ce379e92ffd0d0e95206ce7a3bb","raw_data":{"contract":[{"parameter":{"value":{"data":"70a08231000000000000000000000041977c20977f412c2a1aa4ef3d49fee5ec4c31cdfb","owner_address":"41977c20977f412c2a1aa4ef3d49fee5ec4c31cdfb","contract_address":"419e62be7f4f103c36507cb2a753418791b1cdc182"},"type_url":"type.googleapis.com/protocol.TriggerSmartContract"},"type":"TriggerSmartContract"}],"ref_block_bytes":"5ab1","ref_block_hash":"f24f075df912f43e","expiration":1590382815000,"timestamp":1590382762536},"raw_data_hex":"0a025ab12208f24f075df912f43e4098cecfd1a42e5a8e01081f1289010a31747970652e676f6f676c65617069732e636f6d2f70726f746f636f6c2e54726967676572536d617274436f6e747261637412540a1541977c20977f412c2a1aa4ef3d49fee5ec4c31cdfb1215419e62be7f4f103c36507cb2a753418791b1cdc182222470a08231000000000000000000000041977c20977f412c2a1aa4ef3d49fee5ec4c31cdfb70a8b4ccd1a42e"}}
返回结果中constant_result就是地址41977c20977f412c2a1aa4ef3d49fee5ec4c31cdfb拥有的USDT通证数量,以hex string的格式进行返回,将它进行转换就是17999968000
Tronweb示例:
const TronWeb = require('tronweb')
const HttpProvider = TronWeb.providers.HttpProvider;
const fullNode = new HttpProvider("https://127.0.0.1:8090");
const solidityNode = new HttpProvider("https://127.0.0.1:8090");
const eventServer = new HttpProvider("https://127.0.0.1:8090");
const privateKey = "your private key";
const tronWeb = new TronWeb(fullNode,solidityNode,eventServer,privateKey);
async function triggerSmartContract() {
const trc20ContractAddress = "TQQg4EL8o1BSeKJY4MJ8TB8XK7xufxFBvK";//contract address
var address = "TM2TmqauSEiRf16CyFgzHV2BVxBe...";
try {
let contract = await tronWeb.contract().at(trc20ContractAddress);
//Use call to execute a pure or view smart contract method.
// These methods do not modify the blockchain, do not cost anything to execute and are also not broadcasted to the network.
let result = await contract.balanceOf(address).call();
console.log('result: ', result);
} catch(error) {
console.error("trigger smart contract error",error)
}
}
Wallet-cli示例:
TriggerConstantContract TQQg4EL8o1BSeKJY4MJ8TB8XK7xufxFBvK balanceOf(address) "TM2TmqauSEiRf16CyFgzHV2BVxBejY9iyR" false
用法:TriggerConstantContract [ownerAddress] [contractAddress] [method] [args] [isHex]
参数说明:
ownerAddress: 调用者地址
contractAdress:TRC20合约地址
method: 合约函数
args:函数参数,如果没有参数用#占位
isHex: 命令参数的地址是否是16进制格式
transfer
调用TRC20合约的transfer函数进行代币转账。
HTTP API :
demo: 向某个账号地址转账USDT通证资产
wallet/triggersmartcontract
curl -X POST https://127.0.0.1:8090/wallet/triggersmartcontract -d '{
"contract_address":"419E62BE7F4F103C36507CB2A753418791B1CDC182",
"function_selector":"transfer(address,uint256)",
"parameter":"00000000000000000000004115208EF33A926919ED270E2FA61367B2DA3753DA0000000000000000000000000000000000000000000000000000000000000032",
"fee_limit":100000000,
"call_value":0,
"owner_address":"41977C20977F412C2A1AA4EF3D49FEE5EC4C31CDFB"
}'
parameter参数是对transfer(address,uint256)中的address和uint256进行编码,具体参考参数编码和解码文档
提示:调用完该HTTP API,还需要调用签名,和广播的API。
Tronweb示例:
const TronWeb = require('tronweb')
const HttpProvider = TronWeb.providers.HttpProvider;
const fullNode = new HttpProvider("https://127.0.0.1:8090");
const solidityNode = new HttpProvider("https://127.0.0.1:8090");
const eventServer = new HttpProvider("https://127.0.0.1:8090");
const privateKey = "your private key";
const tronWeb = new TronWeb(fullNode,solidityNode,eventServer,privateKey);
async function triggerSmartContract() {
const trc20ContractAddress = "TQQg4EL8o1BSeKJY4MJ8TB8XK7xufxFBvK";//contract address
var address = "TM2TmqauSEiRf16CyFgzHV2BVxBe...";
try {
let contract = await tronWeb.contract().at(trc20ContractAddress);
//Use send to execute a non-pure or modify smart contract method on a given smart contract that modify or change values on the blockchain.
// These methods consume resources(bandwidth and energy) to perform as the changes need to be broadcasted out to the network.
let result = await contract.transfer(
"TVDGp...", //address _to
1000000 //amount
).send({
feeLimit: 1000000
}).then(output => {console.log('- Output:', output, '\n');});
console.log('result: ', result);
} catch(error) {
console.error("trigger smart contract error",error)
}
}
Wallet-cli示例:
TriggerContract TQQg4EL8o1BSeKJY4MJ8TB8XK7xufxFBvK transfer(address,uint256) "TBQDyqoJ2ZJHTRDsrGQasyqBm4nUVLbWee",100 false 100000000 0 0 #
用法:
TriggerContract [ownerAddress] [contractAddress] [method] [args] [isHex] [fee_limit] [value] [token_value] [token_id]
参数说明:
ownerAddress: 调用者地址
contractAdress:TRC20合约地址
method: 合约函数
args:函数参数,如果没有参数用#占位
isHex: 命令参数的地址是否是16进制格式
fee_limit: 本次调用合约最大的trx消耗,单位是sun
value: 调用合约的同时向合约转账TRX额度。本例不需要发送TRX资产,故设置为0.
token_value: 调用合约的同时向合约转账TRC10代币额度。本例不需要发送TRC10资产,故设置为0。
token_id:调用合约的同时向合约转账TRC10代币ID。本例不需要发送TRC10资产,故用参数#进行占位。
交易确认:
根据getTransactionInfoById 查询转账TRC20是否成功。
approve
调用TRC20合约的approve函数给一个地址授权一部分额度供其转账。
HTTP API :
demo:向某个
wallet/triggersmartcontract
curl -X POST https://127.0.0.1:8090/wallet/triggersmartcontract -d '{
"contract_address":"419E62BE7F4F103C36507CB2A753418791B1CDC182",
"function_selector":"approve(address,uint256)",
"parameter":"0000000000000000000000410FB357921DFB0E32CBC9D1B30F09AAD13017F2CD0000000000000000000000000000000000000000000000000000000000000064",
"fee_limit":100000000,
"call_value":0,
"owner_address":"41977C20977F412C2A1AA4EF3D49FEE5EC4C31CDFB"
}'
提示:调用完该HTTP API,还需要调用签名,和广播的API。
Tronweb示例:
const TronWeb = require('tronweb')
const HttpProvider = TronWeb.providers.HttpProvider;
const fullNode = new HttpProvider("https://127.0.0.1:8090");
const solidityNode = new HttpProvider("https://127.0.0.1:8090");
const eventServer = new HttpProvider("https://127.0.0.1:8090");
const privateKey = "your private key";
const tronWeb = new TronWeb(fullNode,solidityNode,eventServer,privateKey);
async function triggerSmartContract() {
//User A allows user B to use 10USDT of A: A calls approve (B,10)
const trc20ContractAddress = "TQQg4EL8o1BSeKJY4MJ8TB8XK7xufxFBvK";//contract address
try {
let contract = await tronWeb.contract().at(trc20ContractAddress);
//Use send to execute a non-pure or modify smart contract method on a given smart contract that modify or change values on the blockchain.
// These methods consume resources(bandwidth and energy) to perform as the changes need to be broadcasted out to the network.
await contract.approve(
"TA1g2WQiXbU...", //address _spender
10000000 //amount
).send({
feeLimit: 100000000
}).then(output => {console.log('- Output:', output, '\n');});
} catch(error) {
console.error("trigger smart contract error",error)
}
}
Wallet-cli示例:
TriggerContract TQQg4EL8o1BSeKJY4MJ8TB8XK7xufxFBvK approve(address,uint256) "TBQDyqoJ2ZJHTRDsrGQasyqBm4nUVLbWee",100 false 100000000 0 0 #
用法:
TriggerContract [ownerAddress] [contractAddress] [method] [args] [isHex] [fee_limit] [value] [token_value] [token_id]
参数说明:
ownerAddress: 调用者地址
contractAdress:TRC20合约地址
method: 合约函数
args:函数参数,如果没有参数用#占位
isHex: 命令参数的地址是否是16进制格式
fee_limit: 本次调用合约最大的trx消耗,单位是sun
value: 调用合约的同时向合约转账TRX额度
token_value: 调用合约的同时向合约转账TRC10代币额度
token_id:调用合约的同时向合约转账TRC10代币ID,如果不需要转账TRC10用#占位
transferFrom
被授权(approve函数)的地址调用TRC20合约的transferFrom函数从授权账户中使用代币。
HTTP API :
wallet/triggersmartcontract
demo: curl -X POST https://127.0.0.1:8090/wallet/triggersmartcontract -d '{
"contract_address":"419E62BE7F4F103C36507CB2A753418791B1CDC182",
"function_selector":"transferFrom(address,address,uint256)",
"parameter":"00000000000000000000004109669733965A37BA3582E70CCC5302F8D254675D0000000000000000000000410FB357921DFB0E32CBC9D1B30F09AAD13017F2CD0000000000000000000000000000000000000000000000000000000000000032",
"fee_limit":100000000,
"call_value":0,
"owner_address":"41977C20977F412C2A1AA4EF3D49FEE5EC4C31CDFB"
}'
提示:调用完该HTTP API,还需要调用签名,和广播的API。
Tronweb示例:
const TronWeb = require('tronweb')
const HttpProvider = TronWeb.providers.HttpProvider;
const fullNode = new HttpProvider("https://127.0.0.1:8090");
const solidityNode = new HttpProvider("https://127.0.0.1:8090");
const eventServer = new HttpProvider("https://127.0.0.1:8090");
const privateKey = "your private key";
const tronWeb = new TronWeb(fullNode,solidityNode,eventServer,privateKey);
async function triggerSmartContract() {
// Address B transfers 10 USDT from address A to C: B calls transferFrom (A, C, 10)
const trc20ContractAddress = "TQQg4EL8o1BSeKJY4MJ8TB8XK7xufxFBvK";//contract address
try {
let contract = await tronWeb.contract().at(trc20ContractAddress);
//Use send to execute a non-pure or modify smart contract method on a given smart contract that modify or change values on the blockchain.
// These methods consume resources(bandwidth and energy) to perform as the changes need to be broadcasted out to the network.
await contract.transferFrom(
"TM2TmqauSEiRf16CyFgzHV2BVxBej...", //address _from
"TVDGpn4hCSzJ5nkHPLetk8KQBtwaT...", //address _to
100000 //amount
).send({
feeLimit: 10000000
}).then(output => {console.log('- Output:', output, '\n');});
} catch(error) {
console.error("trigger smart contract error",error)
}
}
Wallet-cli示例:
TriggerContract TQQg4EL8o1BSeKJY4MJ8TB8XK7xufxFBvK transferFrom(address,address,uint256) "TApuyuazZnGgxvbNbaGcrUijEFn1oidsAH","TBQDyqoJ2ZJHTRDsrGQasyqBm4nUVLbWee",50 false 100000000 0 0 #
用法:
TriggerContract [ownerAddress] [contractAddress] [method] [args] [isHex] [fee_limit] [value] [token_value] [token_id]
参数说明:
ownerAddress: 调用者地址
contractAdress:TRC20合约地址
method: 合约函数
args:函数参数,如果没有参数用#占位
isHex: 命令参数的地址是否是16进制格式
fee_limit: 本次调用合约最大的trx消耗,单位是sun
value: 调用合约的同时向合约转账TRX额度
token_value: 调用合约的同时向合约转账TRC10代币额度
token_id:调用合约的同时向合约转账TRC10代币ID,如果不需要转账TRC10用#占位
allowance
被授权(approve函数)的地址调用TRC20合约的allowance函数查询授权账户中自己当前的可用额度。
HTTP API :
/wallet/triggerconstantcontract
demo: curl -X POST https://127.0.0.1:8090/wallet/triggersmartcontract -d '{
"contract_address":"419E62BE7F4F103C36507CB2A753418791B1CDC182",
"function_selector":"allowance(address,address)",
"parameter":"00000000000000000000004109669733965A37BA3582E70CCC5302F8D254675D000000000000000000000041A245B99ECB47B18C6A90ED1D51100C5A9F0641A7",
"owner_address":"41977C20977F412C2A1AA4EF3D49FEE5EC4C31CDFB"
}'
Tronweb示例:
const TronWeb = require('tronweb')
const HttpProvider = TronWeb.providers.HttpProvider;
const fullNode = new HttpProvider("https://127.0.0.1:8090");
const solidityNode = new HttpProvider("https://127.0.0.1:8090");
const eventServer = new HttpProvider("https://127.0.0.1:8090");
const privateKey = "your private key";
const tronWeb = new TronWeb(fullNode,solidityNode,eventServer,privateKey);
async function triggerSmartContract() {
//Query the USDT balance that Account A can use for Account B: Account B calls allowance (A, B)
const trc20ContractAddress = "TQQg4EL8o1BSeKJY4MJ8TB8XK7xufxFBvK";//contract address
try {
let contract = await tronWeb.contract().at(trc20ContractAddress);
//Use send to execute a non-pure or modify smart contract method on a given smart contract that modify or change values on the blockchain.
// These methods consume resources(bandwidth and energy) to perform as the changes need to be broadcasted out to the network.
const value = await contract.allowance(
"TM2TmqauSEiRf16CyFgzHV2BVxBejY9...", //address _owner
"TA1g2WQiXbU5GnYBTJ5Cp22dvSjT3ug..." //address _spender
).call();
console.log('- Output:', value, '\n');
} catch(error) {
console.error("trigger smart contract error",error)
}
}
Wallet-cli示例:
TriggerConstantContract TQQg4EL8o1BSeKJY4MJ8TB8XK7xufxFBvK allowance(address,address) "TApuyuazZnGgxvbNbaGcrUijEFn1oidsAH","TQmDzierQxEFJm1dT5YXnTXqVAfdN9HtXj" false
用法:
TriggerContract [ownerAddress] [contractAddress] [method] [args] [isHex]
参数说明:
ownerAddress: 调用者地址
contractAdress:TRC20合约地址
method: 合约函数
args:函数参数,如果没有参数用#占位
isHex: 命令参数的地址是否是16进制格式
Updated about 1 year ago