在跨合约调用中将用户令牌余额转移到合约
Transferring user token balance to contract in cross contract call
合同 A
#[payable]
pub fn add_liquidity(&mut self, tokens: u128, avrit_id: AccountId) -> u128 {
let amount = env::attached_deposit();
Promise::new(avrit_id).function_call(
b"transfer".to_vec(),
json!({"new_owner_id":"avrit.testnet", "amount": U128(tokens)}).to_string().as_bytes().to_vec(),
38600000000000000000000,
env::prepaid_gas() - GAS_FOR_SWAP,
);
amount
}
Promise 函数调用是由合约 A 而不是调用 add_liquidity 的人完成的。
如何调用 Promise,其中前任是调用 add_liquidity 而不是合约 A 地址的用户? Explorer
你说得对。如果前任是当前帐户以外的其他帐户,则无法进行 Promise 函数调用。
这是 NEAR 合约开发的一个重要安全特性。因为如果您可以伪造前任帐户 ID,那么您就可以伪装成该帐户并代表该帐户执行操作。
相反,当合约进行跨合约调用时,前任成为该合约而不是交易签署者。接收合约将能够看到是哪个账户直接调用了它。
合同 A
#[payable]
pub fn add_liquidity(&mut self, tokens: u128, avrit_id: AccountId) -> u128 {
let amount = env::attached_deposit();
Promise::new(avrit_id).function_call(
b"transfer".to_vec(),
json!({"new_owner_id":"avrit.testnet", "amount": U128(tokens)}).to_string().as_bytes().to_vec(),
38600000000000000000000,
env::prepaid_gas() - GAS_FOR_SWAP,
);
amount
}
Promise 函数调用是由合约 A 而不是调用 add_liquidity 的人完成的。
如何调用 Promise,其中前任是调用 add_liquidity 而不是合约 A 地址的用户? Explorer
你说得对。如果前任是当前帐户以外的其他帐户,则无法进行 Promise 函数调用。
这是 NEAR 合约开发的一个重要安全特性。因为如果您可以伪造前任帐户 ID,那么您就可以伪装成该帐户并代表该帐户执行操作。
相反,当合约进行跨合约调用时,前任成为该合约而不是交易签署者。接收合约将能够看到是哪个账户直接调用了它。