-
Notifications
You must be signed in to change notification settings - Fork 3
Workflow работы с multisig contract
Всё взаимодействие, как и в случае с токенами, осуществляется через специальное свойство транзакции:
multisig
Сформировать транзакцию на адрес multisig factory contract, установить свойство multisig
=> new_wallet:[0xaddr1, ... 0xaddrN]:K
, где N - количество адресов, K - количество подписей для совершения транзакции.
Сформировать транзакцию на адрес multisig wallet contract, установить свойство multisig
=> new_request:0xADDRESS
, где 0xADDRESS - это адрес получателя денег. Сумма запроса берется из суммы перевода транзакции.
Сформировать транзакцию на адрес 0xADDRESS, установить свойство multisig
=> confirm:REQ_ID
, где 0xADDRESS - это адрес multisig wallet contract, REQ_ID - ID запроса на перевод денег.
Сформировать транзакцию на адрес 0xADDRESS, установить свойство multisig
=> revoke:REQ_ID
, где 0xADDRESS - это адрес multisig wallet contract, REQ_ID - ID запроса на перевод денег.
исходный код Контракта-фабрики
При создании контракта фабрикой в логах контракта фабрики появятся лог
Event:ContractInstantiation( где на первом месте будет адрес создателя нового смартконтракта(может не являться участником кошелька), на втором адрес созданного контракта multisig кошелька)
Мы должны распарсить входную транзакцию на контракт. В поле Data первые 4 байта f8f73808
- id функции(create(address[],uint256)
) после этого идет массив адресов которые будут являться owner-ам контракта( владельцами кошелька) и количество подтверждений необходимых для отправки транзакции в этом кошельке.
Пример транзакции создания multisig кошелька там указанны два адреса владельцев кошелька [0xfad9edb6094fc4909c6f1b236ca4dd77c1165f53, 0x4168432255d9991791dea5c24379e70261632c7c]
и одно подтверждение необходимое для отправки с этого кошелька.
контракт залитый в тестовую сеть
исходный код контракта multisig
логи:
event Deposit(address indexed sender(адрес отправитель), uint value(Количество переведенных ETH));
Такая транзакция выглядит как обычный перевод между аккаунтами. она оставляет логи описанные выше/\
функция submitTransaction(address destination, uint256 value, bytes data)(c6427474) передаваемые значения:
-
адрес получателя
, -
количество ETH
, поле data
(Должен отправлять owner контракта иначе будет отклонена транзакция)
логи:
event Submission(uint indexed transactionId(индекс новой транзакции, он используется в последствии для подтверждения транзакции другими владельцами кошелька) );
появляется когда пользователь владелец кошелька(они только и могут дергать метод submitTransaction)
event Confirmation(address indexed sender(адрес владельца подтвердившего транзакцию ), uint indexed transactionId (Номер подтверджаемой транзакции ));
после того как транзакция появилась пример транзакции
confirmTransaction(uint256 transactionId)(0xc01a8c84) передаваемые значения:
номер подтверждаемой транзакции
владелец кошелька может отправить подтверждение транзакции присланной от бэкенда
логи:
event Confirmation(address indexed sender(адрес владельца подтвердившего транзакцию ), uint indexed transactionId (Номер подтверджаемой транзакции ));
После того как подтвердил транзакцию, можно отвернуть конфирмацию этим методом (эти действия обратимы вызовом снова метода confirmTransaction)
revokeConfirmation(uint256)(0x20ea8d86) передаваемое значение
Номер транзакции в которой хотят убрать свое подтверждение
Логи:
event Revocation(address indexed sender(адрес того кто отвернул свое подтверждение), uint indexed transactionId(Индекс транзакции в которой убрано подтверждение));
этот метод вызывается сразу после последней конфирмации не получилось его протестить т.к. транзакции сразу отправлялись
Методы описанные выше мы имеем возможность вызывать. Если предыдущая транзакция ждет всех подтверждений, то создавать еще одну транзакцию на подтверждение можно, они будут в листе ожидания и отправятся как только придет подтверждение. Если подтверждений будет недостаточно, то они просто останутся висеть в блокчейне.