Как закодировать данные звонка в контракт

Читая исходный код рукописного ввода (здесь), я понимаю, что вызов контракта - это селектор, объединенный с любыми аргументами функции.

В тесте модуля среды выполнения Substrate я использую конструктор CallData, который выполняет описанные ниже действия.

let mut call = CallData::new( Selector::from_str("foo") );
call.push_arg(&0);

А затем сделать звонок через модуль рамки контрактов

let res = <contracts::Module<Test>>::bare_call(      
    ALICE,                                                      
    contract_addr,                                                       
    0,                                                          
    100_000,                                                                                    
    //codec::Encode::encode(&call.to_bytes().to_vec()));        
    call.to_bytes().to_vec());                                  

К контракту функция подписи

fn foo(&self, x: AccountId)

Это возвращает успешное выполнение (Ok(())), но не вызывает контрактную функцию.

Стоит сказать, что тест использует type AccountId = u64 и чернила используют struct AccountId([u8;32]), но я пробовал передавать как 32 байта, и это не имело значения.

Я подтвердил, что окружающий тестовый код должен работать, вызывая wasm программу, написанную на очист здесь, могущие вызвать экспортированный "вызов" без передачи каких - либо параметров.

Полные репозитории для модуля и контракта также находятся на github.

0 ответов

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