Icon Link处理合约日志

当你在合约方法中记录一个值时,它会生成一个日志条目,添加到日志收据中,并且变量类型会记录在合约的 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);

这种方法让你可以无缝地处理合约中记录的值,使得更容易理解和调试合约的行为。