当你在合约方法中记录一个值时,它会生成一个日志条目,添加到日志收据中,并且变量类型会记录在合约的 ABI 中。SDK 可以让你将这些值解析为 TypeScript 类型。
考虑下面的示例合约:
contract;
use std::logging::log;
abi LogValues {
fn log_values(val1: u64, val2: b256, val3: str[4], val4: [u8; 3]);
}
impl LogValues for Contract {
fn log_values(val1: u64, val2: b256, val3: str[4], val4: [u8; 3]) {
log(val1);
log(val2);
log(val3);
log(val4);
}
}
要在 TypeScript 中访问记录的值,可以使用合约调用结果的 FunctionInvocationResult
中的 logs
属性。日志数据将存储在一个 Array<any>
中:
const value1 = 500;
const value2 = '0xef86afa9696cf0dc6385e2c407a6e159a1103cefb7e2ae0636fb33d3cb2a9e4a';
const value3 = 'Fuel';
const value4 = [1, 2, 3];
const { logs } = await contract.functions.log_values(value1, value2, value3, value4).call();
expect(new BN(logs[0]).toNumber()).toBe(value1);
expect(logs[1]).toBe(value2);
expect(logs[2]).toBe(value3);
expect(logs[3]).toEqual(value4);
这种方法让你可以无缝地处理合约中记录的值,使得更容易理解和调试合约的行为。