Funkcje systemu

Co można w systemie wywołać, kto może to zrobić i kiedy system odmówi. Pominęliśmy standardowe funkcje, które ma każdy token, i opisaliśmy te, które naprawdę coś robią w DAF.

Odczyt
tylko sprawdza, nic nie zmienia i nic nie kosztuje
Zmiana
zapisuje coś w systemie, to podpisana transakcja
Zawsze odmawia
istnieje, ale celowo nic nie robi

DAF

Główny token. Tu są przelewy, weryfikacja, blokady, emisja, redeem i dokumenty.

Przelewy

Przelew DAF

Zmiana

transfer(to, amount)

Przelewa DAF z własnego konta na wskazane konto. Gdy wymóg KYC jest włączony, obie strony muszą być zweryfikowane. Czarna lista, zamrożenie konta i awaryjne wstrzymanie blokują przelew zawsze.

Podstawowy sposób przekazania DAF innej osobie. Kwity na koncie nadawcy go nie ograniczają.

Kto może
Posiadacz
Odmawia, gdy
  • Odbiorca to adres zerowy.
  • Włączone jest awaryjne wstrzymanie.
  • Nadawca lub odbiorca jest na czarnej liście albo ma zamrożone konto.
  • Wymóg KYC jest włączony, a nadawca lub odbiorca nie jest zweryfikowany.
  • Nadawca ma za mało DAF.
Parametry
to
Konto odbiorcy.
amount
Kwota DAF do przelania. Może wynosić zero, ale blokady i tak obowiązują.
Zwraca
Potwierdzenie, że przelew się udał.

Przelew w imieniu posiadacza

Zmiana

transferFrom(from, to, amount)

Przelewa DAF z konta posiadacza na wskazane konto, w granicach zgody, której posiadacz udzielił wykonującemu przelew. Zgoda maleje o przelaną kwotę, chyba że jest nieograniczona.

Służy pośrednikom, na przykład programom, które kierują zlecenia na giełdy. Nadawca i odbiorca muszą spełniać te same warunki co przy zwykłym przelewie. Pełnomocnikiem jest adres, który wywołuje DAF. Gdy przelew idzie przez Permit2 (kontrakt Uniswapa z własnym rejestrem zgód), sprawdzany jest Permit2, a nie osoba, której posiadacz dał zgodę wewnątrz niego: czarna lista i zamrożenie jej nie zatrzymają.

Kto może
Pełnomocnik posiadaczaPełnomocnik nie musi być zweryfikowany, nawet przy włączonym wymogu KYC, ale nie może być na czarnej liście ani mieć zamrożonego konta.
Odmawia, gdy
  • Nadawca lub odbiorca to adres zerowy.
  • Pełnomocnik jest na czarnej liście albo ma zamrożone konto.
  • Zwykły przelew od nadawcy do odbiorcy zostałby zablokowany, na przykład przez awaryjne wstrzymanie, czarną listę albo brak weryfikacji przy włączonym wymogu KYC.
  • Brak zgody albo zgoda niższa od kwoty. Przy kwocie zero pełnomocnik też potrzebuje zgody większej od zera.
  • Nadawca ma za mało DAF.
Parametry
from
Konto posiadacza, z którego schodzą DAF.
to
Konto odbiorcy.
amount
Kwota DAF do przelania.
Zwraca
Potwierdzenie, że przelew się udał.

Sprawdzenie, czy przelew przejdzie

Odczyt

canTransfer(from, to)canTransferFrom(spender, from, to)

Sprawdzają, czy zwykły przelew DAF od nadawcy do odbiorcy byłby teraz dozwolony, z uwzględnieniem wymogu KYC. Druga funkcja sprawdza też, czy pełnomocnik nie jest na czarnej liście i nie ma zamrożonego konta.

Aplikacja może ostrzec użytkownika przed wysłaniem przelewu. Nie dotyczą emisji, redeem ani usunięcia DAF, które mają własne zasady.

Kto może
Każdy
Parametry
from
Konto nadawcy.
to
Konto odbiorcy.
spender
Pełnomocnik, który miałby wykonać przelew w imieniu nadawcy.
Zwraca
Tak albo nie. Weryfikacja liczy się tylko przy włączonym wymogu KYC, a czarna lista, zamrożenie kont i awaryjne wstrzymanie zawsze. Odpowiedź nie uwzględnia salda nadawcy ani wysokości zgody. Gdy nadawca lub odbiorca to adres zerowy, odpowiedź zawsze brzmi nie.

Weryfikacja i blokady

Stan konta i awaryjnego wstrzymania

Odczyt

isWhitelisted(account)isBlacklisted(account)isAccountFrozen(account)frozen()

Sprawdzają, czy konto jest na liście zweryfikowanych, czy jest na czarnej liście i czy jest zamrożone, a także czy włączone jest awaryjne wstrzymanie.

System kwitów sprawdza za ich pomocą czarną listę przy wystawianiu kwitów, a przy claim także zamrożenie konta i awaryjne wstrzymanie. Aplikacja może dzięki nim wyjaśnić, dlaczego coś jest zablokowane.

Kto może
Każdy
Parametry
account
Sprawdzane konto.
Zwraca
Tak albo nie. Trzy stany konta są od siebie niezależne: wpis na czarną listę nie usuwa weryfikacji. Wpis na liście zweryfikowanych widać także przy wyłączonym wymogu KYC, choć wtedy jego brak niczego nie blokuje. Zaraz po wdrożeniu zweryfikowane są tylko główny sejf, sam kontrakt DAF i system kwitów. Nowy główny sejf zostaje zweryfikowany automatycznie w chwili przejęcia.

Stan wymogu KYC

Odczyt

kycRequired()isKycCleared(account)

Pierwsza sprawdza, czy wymóg KYC jest włączony. Druga sprawdza, czy konto spełnia wymóg KYC: tak, gdy wymóg jest wyłączony albo konto jest na liście zweryfikowanych.

Z drugiej korzysta system kwitów przy wystawianiu kwitów i claim. Nie uwzględnia czarnej listy, zamrożenia ani awaryjnego wstrzymania, które sprawdza się osobno.

Kto może
Każdy
Parametry
account
Sprawdzane konto.
Zwraca
Tak albo nie. Od wdrożenia wymóg KYC jest włączony.

Zmiana listy zweryfikowanych

Zmiana

setWhitelisted(account, value)setWhitelistedBatch(accounts, value)

Dodaje konto do listy zweryfikowanych albo je z niej usuwa. Wersja zbiorcza obsługuje wiele kont naraz.

Konto trafia na listę po weryfikacji tożsamości (KYC). Przy włączonym wymogu konto bez wpisu nie wyśle ani nie odbierze przelewu DAF, nie zrobi redeem ani claim i nie dostanie kwitu. Listę można zmieniać także przy wyłączonym wymogu KYC.

Kto może
Główny sejf lub sejf działu zgodności
Odmawia, gdy
  • Wywołuje ktoś inny niż główny sejf lub sejf działu zgodności.
  • Wskazane konto to adres zerowy. W wersji zbiorczej jeden taki wpis cofa całość.
Parametry
account
Konto do zmiany.
accounts
Lista kont do zmiany.
value
Tak: dodać do listy. Nie: usunąć z listy.

Włączenie lub wyłączenie wymogu KYC

Zmiana

setKycRequired(required)

Włącza lub wyłącza wymóg KYC w całym systemie: przy przelewach DAF, redeem przez posiadaczy, wystawianiu kwitów i claim. Wymóg jest włączony od wdrożenia. Po wyłączeniu lista zweryfikowanych zostaje, można ją dalej zmieniać, a po ponownym włączeniu znów działa.

Czy inwestorzy muszą być zweryfikowani, to decyzja z zakresu zgodności z przepisami, a nie sprawa operacyjna. Czarna lista, zamrożenie kont i awaryjne wstrzymanie obowiązują zawsze, także przy wyłączonym wymogu.

Kto może
Główny sejfTylko główny sejf, zarówno przy włączaniu, jak i przy wyłączaniu. Sejf działu zgodności zmienia listę zweryfikowanych, ale nie sam wymóg.
Odmawia, gdy
  • Wywołuje ktoś inny niż główny sejf, nawet adres ze wszystkimi uprawnieniami.
  • Wymóg KYC jest już w wybranym stanie.
Parametry
required
Tak: włączyć wymóg KYC. Nie: wyłączyć go.

Zmiana czarnej listy

Zmiana

setBlacklisted(account, value)setBlacklistedBatch(accounts, value)

Wpisuje konto na czarną listę albo je z niej zdejmuje. Wersja zbiorcza obsługuje wiele kont naraz.

Konto z czarnej listy nie wyśle ani nie odbierze DAF, nie zrobi redeem, nie przeleje cudzych DAF jako pełnomocnik, nie dostanie kwitu i nie zrobi claim, także przy wyłączonym wymogu KYC. Jego weryfikacja się nie zmienia. Usunięcie jego DAF i anulowanie jego kwitów nadal działają.

Kto może
Główny sejf lub sejf działu zgodności
Odmawia, gdy
  • Wywołuje ktoś inny niż główny sejf lub sejf działu zgodności.
  • Wskazane konto to adres zerowy. W wersji zbiorczej jeden taki wpis cofa całość.
Parametry
account
Konto do zmiany.
accounts
Lista kont do zmiany.
value
Tak: wpisać na czarną listę. Nie: zdjąć z czarnej listy.

Zamrożenie konta

Zmiana

setAccountFrozen(account, value)setAccountFrozenBatch(accounts, value)

Zamraża konto albo je odmraża. Wersja zbiorcza obsługuje wiele kont naraz.

Służy do tymczasowej blokady jednego konta. Zamrożone konto nie wyśle ani nie odbierze DAF, nie zrobi redeem, nie przeleje cudzych DAF jako pełnomocnik i nie zrobi claim, także przy wyłączonym wymogu KYC. Nowy kwit nadal można na nie wystawić.

Kto może
Główny sejf lub sejf awaryjnyZamrozić może główny sejf lub sejf awaryjny. Odmrozić tylko główny sejf, więc przejęty sejf awaryjny nie uwolni konta.
Odmawia, gdy
  • Wywołuje ktoś inny niż główny sejf lub sejf awaryjny.
  • Konto próbuje odmrozić ktoś inny niż główny sejf.
  • Wskazane konto to adres zerowy. W wersji zbiorczej jeden taki wpis cofa całość.
Parametry
account
Konto do zmiany.
accounts
Lista kont do zmiany.
value
Tak: zamrozić. Nie: odmrozić.

Awaryjne wstrzymanie

Włączenie awaryjnego wstrzymania

Zmiana

freeze()

Włącza awaryjne wstrzymanie DAF. Zatrzymuje przelewy, każdą emisję DAF, a więc także claim kwitów, oraz redeem wykonywany przez samych posiadaczy. Ponowne włączenie, gdy wstrzymanie już działa, niczego nie zmienia i nie jest błędem, więc paczka awaryjna w sejfie nie przepada, gdy inny sejf zdążył pierwszy.

Służy na wypadek incydentu. Usunięcie DAF i redeem w imieniu posiadacza nadal działają. Wystawiania kwitów nie zatrzymuje: do tego służy wstrzymanie systemu kwitów.

Kto może
Główny sejf lub sejf awaryjnyWyłączyć je może tylko główny sejf.
Odmawia, gdy
  • Wywołuje ktoś inny niż główny sejf lub sejf awaryjny.

Wyłączenie awaryjnego wstrzymania

Zmiana

unfreeze()

Wyłącza awaryjne wstrzymanie DAF. Przelewy, emisja i redeem wykonywany przez posiadaczy znów działają. Claim kwitów też, o ile nie jest włączone wstrzymanie systemu kwitów.

Sejf awaryjny może wstrzymanie tylko włączyć, więc przejęty sejf awaryjny nie wznowi działania DAF. Zamrożone konta pozostają zamrożone.

Kto może
Główny sejf
Odmawia, gdy
  • Wywołuje ktoś inny niż główny sejf, nawet sejf awaryjny.
  • Awaryjne wstrzymanie nie jest włączone.

Emisja, redeem i usuwanie

Emisja DAF

Zmiana

mint(to, amount)mintBatch(to, amounts)

Tworzy nowy DAF na wskazanym koncie, bez górnego limitu. Odbiorca nie musi być zweryfikowany, ale przy włączonym wymogu KYC nie może nim dysponować, dopóki nie przejdzie weryfikacji.

W ten sposób główny sejf wydaje DAF bezpośrednio, a system kwitów przy claim kwitów. Wersja zbiorcza obsługuje wiele kont naraz. Jeden błędny wpis cofa całość.

Kto może
Główny sejf lub system kwitówSystem kwitów tworzy DAF tylko przy claim kwitów. Sam sprawdza wtedy posiadacza, w tym jego weryfikację przy włączonym wymogu KYC.
Odmawia, gdy
  • Wywołuje ktoś inny niż główny sejf lub system kwitów.
  • W wersji zbiorczej liczba odbiorców nie zgadza się z liczbą kwot.
  • Odbiorca to adres zerowy albo kwota wynosi zero.
  • Włączone jest awaryjne wstrzymanie.
  • Odbiorca jest na czarnej liście albo ma zamrożone konto.
Parametry
to
Konto odbiorcy. W wersji zbiorczej lista odbiorców.
amount
Kwota DAF do utworzenia.
amounts
Lista kwot, w tej samej kolejności co lista odbiorców.

Redeem własnych DAF

Zmiana

redeem(amount, redemptionRef)

Posiadacz robi redeem swoich DAF. Tokeny przestają istnieć, a system zapisuje redeem razem z podanym numerem referencyjnym.

Służy do rozliczenia z posiadaczem poza systemem. Redeem jest zapisywany osobno od usunięć, a numer pozwala dopasować go do rozliczenia. Samego rozliczenia system nie wykonuje.

Kto może
PosiadaczBlokady obowiązują tu każdego, także główny sejf: czarna lista, zamrożenie konta i awaryjne wstrzymanie zawsze, a weryfikacja przy włączonym wymogu KYC.
Odmawia, gdy
  • Kwota wynosi zero.
  • Włączone jest awaryjne wstrzymanie.
  • Posiadacz jest na czarnej liście albo ma zamrożone konto.
  • Wymóg KYC jest włączony, a posiadacz nie jest zweryfikowany.
  • Posiadacz ma mniej DAF, niż wynosi kwota.
Parametry
amount
Kwota DAF, która ma przestać istnieć.
redemptionRef
Numer referencyjny redeem, na przykład numer zgłoszenia albo faktury. Może być pusty.

Redeem w imieniu posiadacza

Zmiana

redeemOnBehalf(holder, amount, redemptionRef)

Robi redeem DAF z konta wskazanego posiadacza i zapisuje go jako redeem z numerem referencyjnym, a nie jako usunięcie. Nie korzysta ze zgód udzielonych pełnomocnikom i ich nie zmienia.

Służy wtedy, gdy posiadacz zgłosił redeem poza systemem, na przykład w obsłudze klienta. Działa mimo czarnej listy, zamrożenia konta, braku weryfikacji i awaryjnego wstrzymania.

Kto może
Główny sejf lub sejf usuwania
Odmawia, gdy
  • Wywołuje ktoś inny niż główny sejf lub sejf usuwania.
  • Posiadacz to adres zerowy albo kwota wynosi zero.
  • Posiadacz ma mniej DAF, niż wynosi kwota.
Parametry
holder
Konto posiadacza, z którego znikną DAF.
amount
Kwota DAF, która ma przestać istnieć.
redemptionRef
Numer referencyjny redeem, na przykład numer zgłoszenia. Może być pusty.

Usunięcie DAF

Zmiana

burn(from, amount)

Usuwa DAF z dowolnego konta. Działa także na kontach z czarnej listy, zamrożonych i niezweryfikowanych oraz podczas awaryjnego wstrzymania.

Stosuje się je na przykład po incydencie albo na żądanie uprawnionego organu. System zapisuje to jako usunięcie, nie jako redeem. Tą drogą nie da się przenieść DAF na inne konto, można je tylko usunąć.

Kto może
Główny sejf lub sejf usuwania
Odmawia, gdy
  • Wywołuje ktoś inny niż główny sejf lub sejf usuwania.
  • Konto to adres zerowy albo kwota wynosi zero.
  • Konto ma mniej DAF, niż wynosi kwota.
Parametry
from
Konto, z którego DAF zostaną usunięte.
amount
Kwota DAF do usunięcia.

Dokumenty

Publikacja dokumentu

Zmiana

publishDocument(name, description, uri)

Dodaje nowy dokument: nazwę, opis i adres pliku. System zapisuje też chwilę publikacji i to, kto go opublikował, i nadaje mu kolejny numer. Dokumentu nie można potem zmienić ani usunąć.

Służy do jawnego udostępniania dokumentów, na przykład opieczętowanego raportu z półrocznego audytu skarbca w Belgii, zapisanego w IPFS. Działa także podczas awaryjnego wstrzymania.

Kto może
Główny sejf lub sejf dokumentówSystem zapisuje, kto opublikował dokument: główny sejf czy sejf dokumentów.
Odmawia, gdy
  • Wywołuje ktoś inny niż główny sejf lub sejf dokumentów.
  • Nazwa albo adres pliku są puste.
Parametry
name
Nazwa dokumentu, na przykład Audyt skarbca, I półrocze. Nie może być pusta.
description
Krótki opis dokumentu. Może być pusty.
uri
Adres pliku, na przykład w IPFS. Nie może być pusty. Adres w IPFS wynika z treści pliku, więc pod tym samym adresem nie da się podstawić innego pliku. System przechowuje tylko adres i nie sprawdza samego pliku.
Zwraca
Numer nadany dokumentowi. Pierwszy dokument ma numer 0.

Wycofanie dokumentu

Zmiana

withdrawDocument(id, reason)

Oznacza dokument jako wycofany. Nazwa, opis, adres pliku i nadawca się nie zmieniają, a dokument nadal można odczytać. Nic nie jest usuwane. Powód i chwila wycofania trafiają do zapisu zdarzenia.

Służy na przykład wtedy, gdy dokument opublikowano przez pomyłkę albo zastąpiła go nowsza wersja, opublikowana jako nowy dokument. Wycofanie jest ostateczne. Działa także podczas awaryjnego wstrzymania.

Kto może
Główny sejfTylko główny sejf. Sejf dokumentów może dokumenty dodawać, ale nie wycofywać, więc przejęcie jego klucza nie pozwoli podważyć prawdziwego audytu.
Odmawia, gdy
  • Wywołuje ktoś inny niż główny sejf, także sejf dokumentów.
  • Nie ma dokumentu o tym numerze.
  • Dokument jest już wycofany.
Parametry
id
Numer dokumentu nadany przy publikacji.
reason
Powód wycofania. Może być pusty. Widać go w zapisie wycofania, a nie w danych samego dokumentu.

Podgląd dokumentów

Odczyt

documentCount()documentAt(id)

Pierwsza podaje liczbę opublikowanych dokumentów, łącznie z wycofanymi. Druga podaje jeden dokument według numeru: nazwę, opis, adres pliku, chwilę publikacji, to, czy został wycofany, i kto go opublikował.

Strona internetowa lub aplikacja może pokazać pełną listę dokumentów wprost z kontraktu. Numery idą kolejno od zera.

Kto może
Każdy
Odmawia, gdy
  • Nie ma dokumentu o podanym numerze. Dotyczy odczytu jednego dokumentu.
Parametry
id
Numer dokumentu, od 0 do liczby dokumentów minus jeden.
Zwraca
Liczba dokumentów albo dane jednego dokumentu. Chwila publikacji to znacznik czasu w sekundach. Powodu wycofania tu nie ma: widać go w zapisie wycofania.

LDAF

System kwitów (kontrakt LockedDAF). Tu powstają kwity z zakupów i tu robi się ich claim na DAF.

Wystawianie kwitów

Wystawienie kwitu

Zmiana

issue(holder, amount, unlockAt)issueBatch(holders, amounts, unlockAts)

Zapisuje zakup jako kwit z kwotą i chwilą odblokowania. Saldo LDAF kupującego rośnie o tę kwotę. Wersja zbiorcza zapisuje wiele zakupów naraz i odrzuca całość, gdy choć jeden wpis jest błędny.

Tak firma rejestruje zakup. Zakup z tą samą chwilą odblokowania dopisuje się do istniejącego kwitu. Wystawienia nie blokuje zamrożenie konta ani awaryjne wstrzymanie DAF.

Kto może
Główny sejf lub sejf sprzedaży
Odmawia, gdy
  • System kwitów jest wstrzymany.
  • Wywołuje ktoś inny niż główny sejf lub sejf sprzedaży.
  • W wersji zbiorczej listy mają różną długość.
  • Adres kupującego jest zerowy albo jest adresem DAF lub systemu kwitów.
  • Kwota wynosi zero.
  • Chwila odblokowania wypada wcześniej niż za dobę albo później niż za 3650 dni.
  • Kupujący jest na czarnej liście, także przy wyłączonym wymogu KYC.
  • Wymóg KYC jest włączony, a kupujący nie jest zweryfikowany.
  • Kupujący ma już 256 kwitów i żaden z nich nie ma tej chwili odblokowania.
Parametry
holder
Konto kupującego, na które trafia kwit.
amount
Kwota kwitu w najmniejszych jednostkach tokena. Po claim daje dokładnie tyle samo DAF.
unlockAt
Chwila odblokowania jako znacznik czasu w sekundach. Musi wypadać najwcześniej za dobę i najpóźniej za 3650 dni. Ta doba daje czas, by wstrzymać system kwitów i anulować kwit wystawiony bezprawnie, na przykład z przejętego sejfu sprzedaży. Do istniejącego kwitu można dopisać zakup najpóźniej dobę przed jego odblokowaniem.
holders
Wersja zbiorcza: lista kont kupujących.
amounts
Wersja zbiorcza: lista kwot w tej samej kolejności co konta.
unlockAts
Wersja zbiorcza: lista chwil odblokowania w tej samej kolejności. Wszystkie trzy listy muszą mieć równą długość.

Sprawdzenie przed wystawieniem

Odczyt

canIssue(holder, amount, unlockAt)

Sprawdza, czy wystawienie kwitu z tymi danymi udałoby się teraz. Nie ocenia, kto je zleca. Ocenia wpis wobec obecnego stanu, więc nie uwzględnia wcześniejszych wpisów z tego samego wystawienia zbiorczego.

Firma może odsiać błędne wpisy przed wysłaniem. Chwilę odblokowania warto wybrać z zapasem ponad dobę, bo transakcja trafia do sieci później.

Kto może
Każdy
Parametry
holder
Konto kupującego.
amount
Planowana kwota kwitu w najmniejszych jednostkach tokena.
unlockAt
Planowana chwila odblokowania jako znacznik czasu w sekundach.
Zwraca
Tak, jeśli wystawienie udałoby się teraz. Nie, gdy system kwitów jest wstrzymany, adres kupującego jest nieprawidłowy, kwota wynosi zero lub przekracza techniczny limit tokena, chwila odblokowania wypada poza dozwolonym zakresem, kupujący jest na czarnej liście, przy włączonym wymogu KYC nie jest zweryfikowany albo nie ma już miejsca na kwit z nową chwilą odblokowania.

Claim

Claim własnych kwitów

Zmiana

claim()

Kupujący robi claim wszystkich swoich odblokowanych kwitów naraz. Te kwity znikają, a na jego konto trafia tyle samo nowego DAF. Kwity jeszcze nieodblokowane czekają dalej.

Kupujący może odebrać DAF sam, bez czekania na relayera.

Kto może
KupującyTylko dla własnych kwitów.
Odmawia, gdy
  • System kwitów jest wstrzymany.
  • Trwa awaryjne wstrzymanie DAF.
  • System kwitów nie ma uprawnienia do emisji DAF, bo na przykład odebrał mu je główny sejf.
  • Konto jest na czarnej liście albo jest zamrożone, także przy wyłączonym wymogu KYC.
  • Wymóg KYC jest włączony, a konto nie jest zweryfikowane.
  • Żaden kwit nie jest jeszcze odblokowany.
Zwraca
Kwota DAF, która trafiła na konto.

Claim za kupującego

Zmiana

claimFor(holder)

Robi claim wszystkich odblokowanych kwitów wskazanego konta. DAF zawsze trafia do właściciela kwitów, nigdy do wykonującego claim. Gdy żaden kwit nie jest odblokowany albo konto nie może dostać DAF, odmawia i podaje powód.

Kupujący nie musi pamiętać o dacie. Wiele kont naraz obsługuje claim zbiorczy.

Kto może
Główny sejf lub relayerRelayer ma własny klucz i nie jest sejfem. Działa bez dodatkowych podpisów, bo może tylko wypłacić DAF właścicielowi odblokowanego kwitu.
Odmawia, gdy
  • System kwitów jest wstrzymany.
  • Wywołuje ktoś inny niż główny sejf lub relayer.
  • Trwa awaryjne wstrzymanie DAF.
  • System kwitów nie ma uprawnienia do emisji DAF, bo na przykład odebrał mu je główny sejf.
  • Konto jest na czarnej liście albo jest zamrożone, także przy wyłączonym wymogu KYC.
  • Wymóg KYC jest włączony, a konto nie jest zweryfikowane.
  • Żaden kwit tego konta nie jest jeszcze odblokowany.
Parametry
holder
Konto, którego kwity obejmuje claim. To ono dostaje DAF.
Zwraca
Kwota DAF, która trafiła na konto kupującego.

Claim zbiorczy

Zmiana

claimForMany(holders)

Robi claim odblokowanych kwitów wielu kont w jednej transakcji. Bez błędu pomija konta bez odblokowanych kwitów, konta z czarnej listy lub zamrożone, a przy włączonym wymogu KYC także niezweryfikowane. Ich kwity czekają.

Konto, które nie może dostać DAF, nie zatrzymuje pozostałych. Pominięcie jest ciche, więc firma musi sama śledzić takie konta. Gdy funkcja odmawia, nikt z listy nie dostaje DAF.

Kto może
Główny sejf lub relayerRelayer ma własny klucz i nie jest sejfem. Działa bez dodatkowych podpisów, bo może tylko wypłacić DAF właścicielowi odblokowanego kwitu.
Odmawia, gdy
  • System kwitów jest wstrzymany.
  • Wywołuje ktoś inny niż główny sejf lub relayer.
  • Trwa awaryjne wstrzymanie DAF.
  • System kwitów nie ma uprawnienia do emisji DAF, bo na przykład odebrał mu je główny sejf.
Parametry
holders
Lista kont do obsłużenia. Konto podane kilka razy dostaje DAF tylko raz.
Zwraca
Łączna kwota DAF, która trafiła do kont z listy. Zero, gdy wszystkie konta pominięto albo lista jest pusta.

Gotowość do claim

Odczyt

canClaim(holder)claimableOf(holder)

Pierwsza sprawdza, czy claim dla konta udałby się teraz. Nie ocenia, kto go zleca. Druga podaje kwotę już odblokowanych kwitów, bez sprawdzania, czy konto może dostać DAF.

Relayer i aplikacja mogą sprawdzić konto przed zleceniem claim i pokazać kupującemu kwotę gotową do odbioru.

Kto może
Każdy
Parametry
holder
Sprawdzane konto.
Zwraca
Pierwsza: tak tylko wtedy, gdy nie trwa ani wstrzymanie systemu kwitów, ani awaryjne wstrzymanie DAF, system kwitów ma uprawnienie do emisji DAF, a konto nie jest ani na czarnej liście, ani zamrożone i ma odblokowany kwit. Przy włączonym wymogu KYC konto musi też być zweryfikowane. Druga: suma odblokowanych kwitów, dla których nie zrobiono jeszcze claim. Zero, gdy nic nie jest gotowe.

Anulowanie

Anulowanie kwitu lub jego części

Zmiana

cancelLot(holder, unlockAt, amount)

Zmniejsza jeden kwit o podaną kwotę albo usuwa go w całości. Saldo LDAF maleje o tę kwotę i nie powstaje za nią żaden DAF. Działa bez względu na weryfikację, czarną listę i zamrożenie konta, także podczas obu wstrzymań.

Służy do zwrotów. Działa także po odblokowaniu, dopóki nie zrobiono claim tego kwitu.

Kto może
Główny sejf lub sejf anulowań
Odmawia, gdy
  • Wywołuje ktoś inny niż główny sejf lub sejf anulowań.
  • Kwota wynosi zero.
  • Konto nie ma kwitu z tą chwilą odblokowania, bo na przykład zrobiono już jego claim albo go anulowano.
  • Kwota przekracza to, co zostało w kwicie.
Parametry
holder
Konto, do którego należy kwit.
unlockAt
Dokładna chwila odblokowania kwitu. Po niej system rozpoznaje, o który kwit chodzi.
amount
Kwota do anulowania, najwyżej cała kwota pozostała w kwicie.

Anulowanie wszystkich kwitów konta

Zmiana

cancelAll(holder)

Usuwa wszystkie kwity konta, także już odblokowane, a saldo LDAF spada do zera. Nie powstaje za nie żaden DAF. Działa bez względu na weryfikację, czarną listę i zamrożenie konta, także podczas obu wstrzymań.

Stosuje się ją przy pełnym zwrocie albo gdy konto objęły sankcje.

Kto może
Główny sejf lub sejf anulowań
Odmawia, gdy
  • Wywołuje ktoś inny niż główny sejf lub sejf anulowań.
  • Konto nie ma żadnego kwitu.
Parametry
holder
Konto, którego kwity są anulowane.
Zwraca
Łączna kwota anulowanych kwitów.

Podgląd kwitów

Podgląd kwitów konta

Odczyt

lotsOf(holder)lotOf(holder, unlockAt)lotCountOf(holder)

Podaje kwity konta: wszystkie naraz, jeden wskazany chwilą odblokowania albo samą ich liczbę. Obejmuje też kwity odblokowane, dla których nie zrobiono jeszcze claim.

Aplikacja i firma widzą, z jakich kwitów składa się saldo LDAF i kiedy każdy z nich się odblokuje.

Kto może
Każdy
Parametry
holder
Sprawdzane konto.
unlockAt
Tylko przy podglądzie jednego kwitu: jego chwila odblokowania.
Zwraca
Pełny podgląd: dwie listy tej samej długości, chwile odblokowania i kwoty, dopasowane pozycja po pozycji. Kolejność nie ma znaczenia i może się zmieniać. Jeden kwit: pozostała kwota albo zero, gdy takiego kwitu nie ma. Liczba kwitów: najwyżej 256.

Najbliższe odblokowanie

Odczyt

nextUnlockOf(holder)

Podaje najwcześniejszą chwilę odblokowania spośród kwitów konta.

Pozwala pokazać kupującemu najbliższą datę i zaplanować claim.

Kto może
Każdy
Parametry
holder
Sprawdzane konto.
Zwraca
Znacznik czasu w sekundach. Zero, gdy konto nie ma kwitów. Jeśli ta chwila już nadeszła, co najmniej jeden kwit jest odblokowany i czeka na claim.

Wstrzymanie

Wstrzymanie systemu kwitów

Zmiana

pause()

Wstrzymuje system kwitów: zatrzymuje wystawianie kwitów i claim. Anulowanie kwitów działa dalej. Nie wpływa na przelewy DAF, a odblokowane kwity czekają do wznowienia. Ponowne wstrzymanie, gdy system już stoi, niczego nie zmienia i nie jest błędem, więc paczka awaryjna w sejfie nie przepada, gdy inny sejf zdążył pierwszy.

Służy na wypadek zagrożenia, na przykład przejęcia sejfu sprzedaży. Żeby zatrzymać także DAF, trzeba osobno włączyć awaryjne wstrzymanie.

Kto może
Główny sejf lub sejf awaryjnyWyłączyć wstrzymanie może tylko główny sejf.
Odmawia, gdy
  • Wywołuje ktoś inny niż główny sejf lub sejf awaryjny.

Wznowienie systemu kwitów

Zmiana

unpause()

Wyłącza wstrzymanie systemu kwitów. Wystawianie kwitów i claim znów działają, a kwity odblokowane w czasie przerwy dają przy claim pełną kwotę.

Sejf awaryjny może system zatrzymać, ale nie wznowić. Awaryjne wstrzymanie DAF wyłącza się osobno. Dopóki trwa, claim nie działa.

Kto może
Główny sejf
Odmawia, gdy
  • Wywołuje ktoś inny niż główny sejf, nawet sejf awaryjny.
  • System kwitów nie jest wstrzymany.

Przeniesienia

Przelewy i pełnomocnictwa

Zawsze odmawia

transfer(_, _)transferFrom(_, _, _)approve(_, _)permit(_, _, _, _, _, _, _)

Standardowe funkcje tokena: przelew, przelew przez pełnomocnika, zgoda dla pełnomocnika i taka sama zgoda udzielona podpisem. W LDAF każda z nich zawsze odmawia, a podane wartości nie mają znaczenia.

Kwit jest przypisany do kupującego, więc nie da się go przelać, sprzedać ani powierzyć komuś innemu. Saldo LDAF w portfelu służy tylko do podglądu.

Kto może
NiktOdmawia każdemu, także głównemu sejfowi.
Dlaczego
  • Kwitu nie można przenieść ani dać do niego zgody pełnomocnikowi, nawet z ważnym podpisem.

Administracja

Funkcje wspólne dla obu kontraktów oraz jednorazowe wdrożenie systemu.

Własność i uprawnienia

Jednorazowe przekazanie własności

Zmiana

DAF i LDAF

transferOwnership(newOwner)

Przekazuje własność kontraktu w jednym kroku, bez potwierdzenia przez nowego właściciela. Działa tylko raz: tak fabryka oddaje oba kontrakty głównemu sejfowi. W DAF nowy właściciel trafia też na listę zweryfikowanych.

Później własność można przekazać już tylko dwuetapowo. Dzięki temu adres wpisany z błędem nie może zostać właścicielem.

Kto może
Fabryka wdrożeniowaTylko raz, w trakcie wdrożenia, gdy fabryka jest jeszcze właścicielem. Potem odmawia każdemu, także głównemu sejfowi.
Odmawia, gdy
  • Wywołuje ktoś inny niż obecny właściciel.
  • Przekazanie jednoetapowe wykorzystano już przy wdrożeniu, więc odmawia każdemu, także głównemu sejfowi.
  • Nowy właściciel to adres zerowy albo sam kontrakt. W systemie kwitów także adres DAF.
Parametry
newOwner
Adres nowego właściciela.

Dwuetapowe przekazanie własności

Zmiana

DAF i LDAF

requestOwnershipHandover()cancelOwnershipHandover()completeOwnershipHandover(pendingOwner)

Przyszły właściciel prosi o przekazanie, a główny sejf zatwierdza tę prośbę w ciągu 48 godzin. Przed zatwierdzeniem przyszły właściciel może prośbę wycofać. W DAF nowy właściciel trafia na listę zweryfikowanych, a poprzedni na niej zostaje.

W obecnej wersji kodu to jedyny sposób, by po wdrożeniu zmienić główny sejf. Prośba dowodzi tylko, że ktoś kontroluje ten adres, więc przed zatwierdzeniem trzeba sprawdzić, czy to właściwy sejf. Każdy kontrakt przekazuje się osobno.

Kto może
Przyszły właściciel i główny sejfKażdy adres może poprosić o przekazanie dla siebie albo wycofać swoją prośbę, ale bez zatwierdzenia przez główny sejf nic się nie zmienia.
Odmawia, gdy
  • Nowy właściciel to adres zerowy albo sam kontrakt. W systemie kwitów także adres DAF.
  • Zatwierdza ktoś inny niż obecny główny sejf.
  • Wskazany adres nie złożył prośby, wycofał ją albo od prośby minęło ponad 48 godzin.
Parametry
pendingOwner
Adres, który poprosił o przekazanie i ma zostać nowym właścicielem.

Nadawanie i odbieranie uprawnień

Zmiana

DAF i LDAF

grantRoles(user, roles)revokeRoles(user, roles)renounceRoles(roles)

Nadaje lub odbiera uprawnienia wskazanemu adresowi. Kilka uprawnień można zmienić naraz. Uprawnienia mają numery, a ten sam numer oznacza w DAF i w systemie kwitów co innego, więc trzeba wybrać właściwy kontrakt.

Tak główny sejf przydziela zadania osobnym sejfom i relayerowi. Sam nie potrzebuje nadanych uprawnień, bo może zrobić wszystko, co one. Odebranie systemowi kwitów prawa emisji DAF zatrzymuje claim kwitów.

Kto może
Główny sejfZe swoich uprawnień każdy adres może zrezygnować sam, bez zgody głównego sejfu.
Odmawia, gdy
  • Nadaje lub odbiera uprawnienia ktoś inny niż główny sejf, nawet adres ze wszystkimi uprawnieniami.
Parametry
user
Adres, któremu nadaje się lub odbiera uprawnienia.
roles
Suma numerów uprawnień, na przykład 3 oznacza numery 1 i 2. W DAF: 1 emisja DAF, 2 usunięcie DAF i redeem w imieniu posiadacza, 4 lista zweryfikowanych i czarna lista, 8 włączanie awaryjnego wstrzymania i zamrażanie kont, 16 odzyskiwanie pomyłkowych wpłat, 32 publikacja dokumentów. W systemie kwitów: 1 wystawianie kwitów, 2 claim za kupujących, 4 anulowanie kwitów, 8 wstrzymanie systemu kwitów, 16 odzyskiwanie pomyłkowych wpłat. Wyłączyć oba wstrzymania, odmrozić konto, przełączyć wymóg KYC i wycofać dokument może tylko główny sejf.

Aktualizacja

Przejście na nową wersję kodu

Zmiana

DAF i LDAF

upgradeToAndCall(newImplementation, data)

Przełącza kontrakt na nową wersję kodu i może przy tym wykonać dodatkowe polecenie. Działa natychmiast. Samo przełączenie nie zmienia sald, kwitów, list kont, dokumentów ani uprawnień.

Służy do poprawek i nowych funkcji, w każdym kontrakcie osobno. System sprawdza tylko, czy nowy kod nadaje się do aktualizacji. Jego treść musi ocenić główny sejf.

Kto może
Główny sejf
Odmawia, gdy
  • Wywołuje ktoś inny niż główny sejf, nawet adres ze wszystkimi uprawnieniami.
  • Pod podanym adresem nie ma kodu przygotowanego do aktualizacji, na przykład podano adres zerowy albo zwykły portfel.
  • Dodatkowe polecenie nie powiodło się, więc cała zmiana zostaje cofnięta.
  • Wywołanie trafiło pod adres samego kodu, a nie pod adres kontraktu.
Parametry
newImplementation
Adres nowej wersji kodu, wgranej wcześniej.
data
Dodatkowe polecenie wykonywane zaraz po zmianie, na przykład przeniesienie danych. Puste, gdy nie jest potrzebne.

Odzyskiwanie pomyłkowych wpłat

Odzyskanie pomyłkowych wpłat

Zmiana

DAF i LDAF

recoverERC20(token, to, amount)recoverETH(to, amount)

Wysyła wskazanemu odbiorcy tokeny lub ETH, które trafiły do kontraktu przez pomyłkę. Nie zmienia sald posiadaczy ani kwitów. Odzyskanie DAF działa jak zwykły przelew: obowiązują te same blokady, a weryfikacja tylko przy włączonym wymogu KYC.

Bez tego środki wysłane przez pomyłkę zostałyby w kontrakcie na zawsze. Zwykły przelew ETH kontrakty odrzucają, ale ETH może do nich trafić inną drogą.

Kto może
Główny sejf lub sejf odzyskiwaniaSejf odzyskiwania dostaje to uprawnienie osobno w każdym kontrakcie.
Odmawia, gdy
  • Wywołuje ktoś inny niż główny sejf lub sejf odzyskiwania tego kontraktu.
  • Adres tokenu lub odbiorcy jest zerowy albo kwota wynosi zero.
  • Przy odzyskiwaniu DAF: trwa awaryjne wstrzymanie, odbiorca lub kontrakt, z którego wysyła się DAF, jest na czarnej liście lub ma zamrożone konto albo, przy włączonym wymogu KYC, nie jest zweryfikowany.
  • Kontrakt ma za mało środków, pod adresem tokenu nie ma kontraktu, token odrzucił przelew albo odbiorca nie przyjmuje ETH. Kwitów nie da się tak odzyskać, bo nie można ich przelać.
Parametry
token
Adres tokenu do odzyskania.
to
Adres odbiorcy.
amount
Kwota w najmniejszych jednostkach tokenu lub ETH.

Wdrożenie

Wdrożenie całego systemu

Zmiana

Fabryka wdrożeniowa

deploy(owner, dafImplementation, lockedImplementation, cfg)

W jednej transakcji tworzy DAF i system kwitów, łączy je i daje systemowi kwitów prawo emisji DAF. Na listę zweryfikowanych trafiają główny sejf, system kwitów i sam kontrakt DAF. Wymóg KYC jest włączony od początku. Oba kontrakty przechodzą do głównego sejfu, a fabryka nie zachowuje żadnych uprawnień.

Jeden krok nie daje nikomu okazji do przejęcia kontraktów w trakcie wdrożenia. Liczbę wymaganych podpisów sejfu sprawdza skrypt wdrożeniowy, nie fabryka.

Kto może
WdrażającyTylko adres wskazany przy tworzeniu fabryki.
Odmawia, gdy
  • Wywołuje ktoś inny niż adres wskazany przy tworzeniu fabryki.
  • Fabryka już raz wdrożyła system. Każda fabryka stawia tylko jeden, więc nikt nie zbuduje z niej kopii pod tym samym szyldem.
  • Adres głównego sejfu jest zerowy albo jest adresem fabryki, któregoś z tworzonych kontraktów lub podanego kodu DAF bądź systemu kwitów.
  • Pod podanym adresem kodu DAF lub systemu kwitów nie ma kontraktu albo jest tam niewłaściwy kod, na przykład gdy adresy zamieniono miejscami.
Parametry
owner
Adres głównego sejfu, przyszłego właściciela obu kontraktów.
dafImplementation
Adres wcześniej wgranego kodu DAF.
lockedImplementation
Adres wcześniej wgranego kodu systemu kwitów (kontraktu LockedDAF).
cfg
Nazwa, symbol i liczba miejsc po przecinku DAF oraz nazwa i symbol LDAF. Skrypt wdrożeniowy podaje domyślnie nazwę i symbol DAF, 18 miejsc po przecinku oraz nazwę Locked DAF i symbol LDAF. LDAF przejmuje liczbę miejsc po przecinku od DAF.
Zwraca
Adresy nowego DAF i nowego systemu kwitów.