PHANTOM DOCS
·
WESPRZYJ PROJEKT

Donacje & smart kontrakt

Phantom jest i pozostanie bezpłatny, open-source i bez reklam. Finansowany wyłącznie przez społeczność. Na razie przyjmujemy wyłącznie wpłaty bezpośrednie na adresy poniżej — smart kontrakt jest w budowie.

Kontrakt donacyjny nie został jeszcze wybity (nie jest wdrożony na mainnet). Obecnie wszystkie wpłaty przyjmujemy bezpośrednio na adresy portfeli poniżej. Rejestr publicznych eventów on-chain i przeniesienie ownership na multisig pojawią się dopiero po wybiciu kontraktu.

Smart kontrakt wkrótce

Docelowo wszystkie donacje ETH i ERC-20 obsłuży open-source'owy kontrakt na Ethereum Mainnet, z kodem zweryfikowanym na Etherscan. Sekcja poniżej pokazuje planowany kształt — aktywuje się po wybiciu kontraktu.

0x_REPLACE_AFTER_DEPLOY
Link
Kontrakt na Etherscan etherscan.io ↗
Zweryfikowany kod źródłowy Etherscan → Code ↗
Kod na GitHub P2PDonations.sol ↗

Jak wpłacić ETH

Wyślij ETH bezpośrednio na poniższy adres z dowolnego portfela. To zwykły adres, nie kontrakt — wpłata nie generuje jeszcze publicznego eventu on-chain.

0xdD5775D8F839bDEEc91a0f7E47f3423752Ed6e4F

Wpłata z wiadomością on-chain wkrótce

  1. Otwórz kontrakt na Etherscan

    Przejdź do zakładki Write Contract na stronie kontraktu.

  2. Połącz portfel

    MetaMask, Rabby, Rainbow lub inny portfel kompatybilny z WalletConnect.

  3. Wywołaj donate(message)

    Podaj kwotę ETH i opcjonalną wiadomość. Wiadomość zostanie na stałe zapisana on-chain w evencie Donation.

Nie musisz wchodzić w Write Contract. Zwykły przelew ETH bezpośrednio na adres kontraktu również liczy się jako donacja — kontrakt obsłuży go funkcją receive() i wyemituje event Donation z pustą wiadomością.

Jak wpłacić USDC

Standardowy transfer ERC-20 na adres poniżej — bez zatwierdzania (approve), bo to zwykły adres, nie kontrakt.

0xF6F3ba1E29798226699D93c9924a33683C3c2570
Adres jest kompatybilny ze standardem ERC-20 na Ethereum Mainnet — upewnij się, że wysyłasz USDC w tej samej sieci.

DAI i zatwierdzanie przez kontrakt wkrótce

  1. Zatwierdź kontrakt do wydawania tokenów

    Przejdź do kontraktu USDC lub DAI na Etherscan → Write Contract → approve(spender, amount). Jako spender wpisz adres kontraktu Phantom.

  2. Wywołaj donateToken() na kontrakcie Phantom

    Podaj adres tokenu, kwotę i opcjonalną wiadomość.

Jak wpłacić BTC

Standardowy Bitcoin on-chain. Lightning Network w planach.

bc1qjhcgglnt548q7ch5qpv7fe400dyq5k4n6hq6xa
Smart kontrakt obsługuje wyłącznie Ethereum Mainnet (ETH i tokeny ERC-20). Bitcoin pozostaje osobnym adresem bezpośrednim — wpłaty BTC nie generują eventów on-chain kontraktu ani nie są widoczne w jego licznikach.

Jak kontrakt będzie działał technicznie wkrótce po wybiciu kontraktu

Kilka właściwości planowanego kontraktu istotnych dla darczyńców — aktywne dopiero po wdrożeniu na mainnet.

BRAK POŚREDNIKA

Środki trafiają bezpośrednio do kontraktu. Wypłata możliwa wyłącznie przez właściciela kontraktu — bez możliwości wydatkowania przez osoby trzecie.

PUBLICZNE EVENTY ON-CHAIN

Każda wpłata emituje event Donation (ETH) lub TokenDonation (ERC-20) z adresem darczyńcy, kwotą, wiadomością i timestampem. Wszystko widoczne publicznie na Etherscan.

JAWNE WYPŁATY

Transparentność działa w obie strony. Każda wypłata emituje event Withdrawal lub TokenWithdrawal z adresem docelowym i kwotą — widać nie tylko ile wpłynęło, ale i na co idą środki (patrz: Jak wydajemy środki).

PUBLICZNE LICZNIKI

Kontrakt udostępnia odczyt bez transakcji: totalDonated, totalWithdrawn, donationCount oraz donatedBy(adres). Można je zaciągnąć wprost z blockchainu — bez naszego serwera.

TRANSFEROWALNY OWNER / MULTISIG

Ownership kontraktu zostanie przeniesiony na multisig Safe (dawniej Gnosis Safe) — wypłata wymaga wtedy potwierdzenia przez kilku sygnatariuszy, więc pojedynczy skradziony klucz nie ruszy środków.

// fragment kontraktu P2PDonations.sol
event Donation(
    address indexed donor,
    uint256 amount,
    string  message,
    uint256 timestamp
);

function donate(string calldata message) external payable {
    _registerDonation(msg.sender, msg.value, message);
}

function _registerDonation(address donor, uint256 amount, string memory message) internal {
    if (amount == 0) revert ZeroAmount();
    totalDonated  += amount;
    donationCount += 1;
    donatedBy[donor] += amount;
    emit Donation(donor, amount, message, block.timestamp);
}