Skip to content

Latest commit

 

History

History
66 lines (44 loc) · 10.4 KB

README.md

File metadata and controls

66 lines (44 loc) · 10.4 KB

Мультикошелек Ærly Birds

mn

Этот пользовательский интерфейс обеспечивает функциональность «N-из-M мультиподписей»: N подтверждающих сторон из предопределенного набора M подтверждающих должны одобрить Заявку для его выполнения.

Каждая Заявка может содержать произвольное количество действий: исходящие сообщения и обновления параметров. Поскольку содержание сообщений произвольно, Заявка может выполнять произвольные высокоуровневые взаимодействия в сети TON: отправка TON, отправка/выпуск жетонов, выполнение административных действий и т.д.

⚠️ Мультикошелек не ограничивает содержание действий Заявки, поэтому Заявка может включать в себя абсолютно любые действия, включая те, которые создают новые заявки или подтиверждают существующие заявки или действия изменяющие конфигурацию мультикошелька (например, список Подтверждающих).

Интерфейс умеет полностью анализировать содержимое заявок и четко сообщает обо всех действиях, которые будут выполнены. Этот инструмент также сообщает об ошибках парсинга или действиях неизвестного типа.

Подтверждающие участники должны одобрить заявку только после полного прочтения его содержания.

⚠️ Пользовательский интерфейс мультикошелька отображает все созданные и невыполненные заявки (их можно найти в исходящих сообщениях мультикошелька), а также соответствие списка подтверждающих, текущему списку, чтобы пользователи четко видели все активные заявки, которые могут быть одобрены.

Такие параметры, как пороговое значение N, список подтверждающих и другие, могут быть обновлены только с согласия текущих подтверждающих N-из-M.

Любой подтверждающий может предложить новую Заявку. Кошелек также позволяет назначать роль Предлагающего: Предлагающий может предлагать новые заявки, но не может их подтверждать.

Каждая Заявка имеет срок действия, по истечении которого она не может быть исполнена.

Каждый подтверждающий может быть кошельком, аппаратным кошельком, мультикошельком, а также другим смарт-контрактом со своей собственной логикой.

Этот мультикошелек был разработан с учетом требований Safe{Wallet} .

Гарантии

  • Никто, кроме участников, Предлагающих и Подтверждающих, не может инициировать создание новой заявки, никто, кроме участников, Подтверждающих, не может одобрить новую заявку.
  • Изменение набора Подтверждающих делает недействительными все заявки с другим набором. Грубо говоря, заявка действительна только тогда, когда текущие Подтверждающие мультикошелька равны Подтверждающим заявки.
  • Компрометация Подтверждающих, в частности, компрометация меньшего числа Подтверждающих - N , не препятствует выполнению заявок или предложению новых (включая заявки, которые удалят адреса скомпрометированных Подтверждающих из списка)
  • Компрометация Предлагающих не препятствует выполнению заявок или предложению новых (включая заявки, которые удалят скомпрометированного Предлагающего из списка предлагающих)
  • Логика кошелька с мультиподписью не может быть изменена после развертывания

Архитектура

Вся система состоит из четырех частей:

  • Подписывающие — независимые деятели, которые подтверждают исполнение заявок.
  • Предлагающие — вспомогательные деятели, которые могут предлагать новые заявки для исполнения.
  • Мультикошелек — контракт, который выполняет утвержденные заявки, таким образом, это адрес, которому будут принадлежать активы и разрешения; контракт мультикошелька также хранит информацию о количестве заявок, текущих списков подтверждающих и предлагающих участников.
  • Заявки - дочерние контракты, каждый из которых содержит информацию об одной заявке: содержание заявки и подтверждения.

Порядок действий выглядит следующим образом:

  1. Предлагающий создает новую заявку (адрес из наборов Предлагающих или Подтверждающих), который состоит из произвольных значений с адреса мультикошелька и отправляет запрос в Мультикошелек для начала подтверждения этой заявки.
  2. Мультикошелек получает запрос, проверяет, что он отправлен уполномоченным субъектом, и развертывает дочерний субконтракт Заявки, содержащий предложение.
  3. Подписывающие, независимо друг от друга отправляют сообщения об одобрении заявки на контракт.
  4. Как только заявка получает достаточное количество одобрений, она отправляет запрос на выполнение в Мультикошелек.
  5. Мультиподпись подтверждает подлинность заявки (что она действительно отправлена заявкой, а не кем-то другим), а также что список подтверждающих все еще актуален, и выполняет заявку (отправляет транзакции из заявки)
  6. Если заявке необходимо более 255 операций (лимит за одную транзакцию), избыточные транзакции могут быть упакованы в следующий перевод из Мультикошелька на свой адрес как internal_execute
  7. Мультикошелек получает internal_execute, проверяет, что он отправлен от себя, и продолжает выполнение.

Все комиссии за обработку заявки (за исключением самого исполнения заявки): создание контракта заявки и комиссии за его хранение несет лицо, предлагающее эту заявку (будь то Предлагающая сторона или Подписывающий).

Помимо переводов, заявка может также содержать действия на обновление мультикошелька.

Примечание:

  • Пороговое значение должно быть > 0 и <= количество подписывающих.

  • По замыслу смарт-контракт Заявки не уведомляетт об обновлении конфигурации мультиподписи (подтверждающие, предлагающие, пороговое значение). Такая заявка будет продолжать принимать подтверждения, но при исполнении она будет отклонена, поскольку конфигурация мультиподписи изменилась.

  • Баланс TON просроченной заявки можно вернуть в Мультикошелек. Для этого заявка должна собрать достаточно Подтверждений - она будет отправлен на одобрение, статуса одобрения не будет, но TON будут возвращены в Мультикошелек.

  • approve_accepted - Вспомогательное уведомление не отправляется, если заявка инициализируется и выполняется немедленно (approve_on_init с порогом = 1).