Невозможно преобразовать обратно в исходное число из данных события через 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 ]".

Я пропустил некоторые шаги? Почему я не могу вернуть правильную шестнадцатеричную строку?

0 ответов

Другие вопросы по тегам