Как закодировать данные звонка в контракт
Читая исходный код рукописного ввода (здесь), я понимаю, что вызов контракта - это селектор, объединенный с любыми аргументами функции.
В тесте модуля среды выполнения 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.