Невозможно преобразовать обратно в исходное число из данных события через api polkadot js
Я установил тип значения как u128 в контракте чернил следующим образом:
#[ink(storage)]
struct SimpleContract {
test_u128: storage::Value<u128>
}
#[ink(event)]
struct U128Event {
#[ink(topic)]
val: u128,
}
#[ink(message)]
fn set_test_u128(&mut self, val: u128) {
self.test_u128.set(val);
self.env()
.emit_event(
U128Event {
val: val,
}
);
}
И вызовем функцию контракта через a pi polkadot js:
exports.call_contract = async function(api, contract_addr, caller, method_name, selectorData) {
const callTx=api.tx.contracts.call(contract_addr, 0, 1000000000000, selectorData);
return new Promise((resolve, reject) => {
let returnArr = [];
callTx.signAndSend(caller, ({events=[], status}) => {
if(status.isInBlock) {
console.log(`callTx (${method_name}) is in block`);
events.forEach(({event, phase}) => {
console.log(phase.toString());
console.log(event.meta.documentation.toString());
console.log(event.toString());
if(event.section=="contracts" && event.method=="ContractExecution") {
console.log("call from", event.data[0].toString(), "with event data", event.data[1].toString());
console.log("raw event data: ", event.data[1]);
returnArr.push(event.data[1].toString());
}
});
resolve(returnArr);
} else {
console.log('\n', `callTx (${method_name}) waiting to be in block`);
}
});
});
}
async function call_set_test_u128(i) {
const { api, abiArr, bob } = await base.connect(abiPaths);
const contractAddr = getContractAddr('contractAddr_simpleC');
const selector = abiArr[0].messages.setTestU128(i);
let results = await base.call_contract(api, contractAddr, bob, 'set_test_u128()', selector);
console.log(results);
return results;
}
Но когда я попытался установить значение как 273, я получил "0x11010000000000000000000000000000" в качестве результата, который не может преобразовать обратно в исходное значение 273. Правильная шестнадцатеричная строка должна быть "0x01110000000000000000000000000000", не так ли?
Я также проверил необработанный Uint8Array. Из данных события - "[ 17, 1, 0, 0, registry: TypeRegistry {} ]", но используйте numberToU8a(273), это "Uint8Array [ 1, 17 ]".
Я пропустил некоторые шаги? Почему я не могу вернуть правильную шестнадцатеричную строку?