如何验证在 Rust 智能合约测试中是否创建了正确的承诺?



在这里使用linkdrop合约:https://github.com/nearprotocol/near-linkdrop/blob/master/src/lib.rs

我正在编写一种新方法来部署具有有限访问密钥的合约。我想检查我的承诺是否成功创建,并在其他测试中找到此评论:

// TODO: verify that promise was created with funds for given username.

我将如何验证我的承诺是否正确创建。测试通过没有错误/恐慌,但是在测试之前可以完成的所有操作near-shell吗?

在我自己的叉子上从这个分支中工作:https://github.com/mattlockyer/near-linkdrop/tree/deploy-contract

这是我的新方法:

/// Create and fund new account with limited access key to contract methods.
pub fn create_limited_contract_account(
&mut self,
new_account_id: AccountId,
new_public_key: Base58PublicKey,
allowance: u128,
contract_bytes: Vec<u8>,
method_names: Vec<u8>,
) -> Promise {
assert_eq!(
env::predecessor_account_id(),
env::current_account_id(),
"Create account and claim only can come from this account"
);
assert!(
env::is_valid_account_id(new_account_id.as_bytes()),
"Invalid account id"
);
let amount = self
.accounts
.remove(&env::signer_account_pk())
.expect("Unexpected public key");
Promise::new(new_account_id.clone())
.create_account()
.transfer(amount)
.deploy_contract(contract_bytes)
.add_access_key(
new_public_key.into(),
allowance,
new_account_id,
method_names
).then(
ext_self::on_account_created_and_claimed(
amount.into(),
&env::current_account_id(),
NO_DEPOSIT,
ON_CREATE_ACCOUNT_CALLBACK_GAS,
))
}

这是我的测试:

#[test]
fn test_create_limited_contract_account() {
let mut contract = LinkDrop::default();
let pk: Base58PublicKey = "qSq3LoufLvTCTNGC3LJePMDGrok8dHMQ5A1YD9psbiz"
.try_into()
.unwrap();
// Deposit money to linkdrop contract.
let deposit = ACCESS_KEY_ALLOWANCE * 100;
testing_env!(VMContextBuilder::new()
.current_account_id(linkdrop())
.attached_deposit(deposit)
.finish());
contract.send(pk.clone());
// Now, send new transaction to link drop contract.
let context = VMContextBuilder::new()
.current_account_id(linkdrop())
.predecessor_account_id(linkdrop())
.signer_account_pk(pk.into())
.account_balance(deposit)
.finish();
testing_env!(context);
let pk2 = "2S87aQ1PM9o6eBcEXnTR5yBAVRTiNmvj8J8ngZ6FzSca"
.try_into()
.unwrap();
let contract_bytes = include_bytes!("../res/multisig.wasm").to_vec();
let method_names = "multisig_method_a,multisig_method_b".as_bytes().to_vec();
contract.create_limited_contract_account(
bob(),
pk2,
LIMITED_ACCESS_KEY_ALLOWANCE,
contract_bytes,
method_names
);
}

这是目前的一个难题。 但是,目前测试它的最佳方法(并且正在进行中(是独立运行时,它允许您创建可以处理事务的模拟运行时。 例如,您可以创建一个事务,该事务调用一个进行承诺调用的函数,然后可以只处理该事务或它生成的所有后续收据。

以下是其用法的示例: 在这里,还要看看如何设置它的实用程序。

最新更新