Читая исходный код рукописного ввода ( здесь ), я понимаю, что вызов по контракту - это селектор, объединенный с любыми аргументами функции.
Из теста модуля времени выполнения субстрата, Я использую конструктор 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, написанную на wat here , что может вызывать экспортированный «вызов» без передачи каких-либо параметров.
Полные репозитории также находятся на github для модуля и контракта .