Rahoitus on pelkkä TransferChecked-siirto jalan escrow-tilille, joten mikä
tahansa lompakko tai säilytysjärjestelmä, joka pystyy lähettämään token-siirron,
voi rahoittaa jalan. Vain kauppatietueen lukeminen ennen rahoitusta vaatii
DvP-asiakasohjelman. Ohjelma tarkistaa escrow-saldot vasta selvityksessä;
mikään ei tarkista siirtoa sen saapuessa, joten kunkin osapuolen on luettava
kauppatietue ennen siirtoa.
Tämä sivu jatkuu sivulta kaupan luominen; asiakasohjelma ja allekirjoittajat siirtyvät sellaisinaan.
Tarkista ehdot
Tietueen luominen ei vaadi lupaa, ja escrow-osoitteet johdetaan pelkästään
tietueesta ja mintistä, ei koskaan ehdoista. Siirto escrow-tilille voi siksi
kohdistua ehtoihin, joista et ole koskaan sopinut, mukaan lukien
selvityskohteet, jotka ohjaavat vastapuolesi tuotot kolmanteen osoitteeseen.
Lue ennen rahoitusta SwapDvp-tili ja vertaa sitä sovittuun kauppaan.
verifySwapDvp TypeScriptissä ja verify::decode_swap_dvp_account Rustissa
varmistavat, että tili on DvP-ohjelman omistama, sen koko on tasan 458 tavua ja
se sijaitsee osoitteessa, joka johdetaan sen omista kentistä
(fetchSwapDvpChecked tekee vain kaksi ensimmäistä tarkistusta). Pelkät
fetchSwapDvp- ja decodeSwapDvp-lukijat eivät tee mitään näistä
tarkistuksista. Osapuolten, määrien, aikojen ja kohteiden tarkistukset tekee
kutsuja sovittua kauppaa vasten.
import { unwrapOption } from "@solana/kit";import { verifySwapDvp } from "./dvp";const trade = await verifySwapDvp(client.rpc, swapDvp);const t = trade.data;const expectedAmountA = 1_000_000_000n;const expectedAmountB = 998_500_000n;const expectedEarliestSettlement: bigint | null = null; // as agreedconst expectedExpiry = 1_798_761_600n; // as agreed, unix secondsif (t.userA !== userA ||t.userB !== userB ||t.mintA !== mintA ||t.mintB !== mintB ||t.settlementAuthority !== settlementAuthority ||t.tokenProgramA !== tokenProgramA ||t.tokenProgramB !== tokenProgramB ||t.amountA !== expectedAmountA ||t.amountB !== expectedAmountB ||unwrapOption(t.earliestSettlementTimestamp) !== expectedEarliestSettlement ||t.expiryTimestamp !== expectedExpiry ||t.userASettlementDestination !== userA ||t.userBSettlementDestination !== userB) {throw new Error("Stored terms do not match the agreed trade; do not fund");}if (t.expiryTimestamp <= BigInt(Math.floor(Date.now() / 1000)) + 60n) {throw new Error("Trade expires too soon to fund safely");}
Jos vastapuolesi tai selvityksen valtuutettu loi tietueen, vertaa jokaista kenttää ehtoihin, joista sovit kirjanpidon ulkopuolella. Jos loit sen itse, tämä lukeminen vahvistaa, että se tallentui lähetetyssä muodossa.
Siirto escrow-tilille
Rahoita jalka täsmälleen sovitulla määrällä. Ohjelma rajaa selvityksen määrään
amount_x ja palauttaa ylimääräisen jalan osapuolelle, joten ylijäämä ei mene
hukkaan, mutta se lisää selvityksessä toisen siirron ja voi epäonnistua joidenkin
transfer hookien kanssa (katso alla olevat huomautukset).
Käytä TransferChecked-siirtoa, älä tarkistamatonta Transfer-siirtoa.
Token-2022-mintit, joiden laajennukset riippuvat mint account -tilistä, kuten
Pausable, hylkäävät siirron, joka ei sisällä sitä, ja mint, jolla on transfer
hook, tarvitsee hookin tilit selvitettyinä ja liitettyinä samalla tavalla kuin
minkä tahansa muun kyseisen tokenin siirrossa.
Omaisuusjalan osapuoli rahoittaa allekirjoittajana userASigner escrow A:n:
import {findAssociatedTokenPda,getTransferCheckedInstruction,} from "@solana-program/token-2022";const [userAAtaA] = await findAssociatedTokenPda({mint: mintA,owner: userA,tokenProgram: tokenProgramA,});const [userBAtaB] = await findAssociatedTokenPda({mint: mintB,owner: userB,tokenProgram: tokenProgramB,});const fundAssetLeg = getTransferCheckedInstruction({source: userAAtaA,mint: mintA,destination: escrowA,authority: userASigner,amount: t.amountA,decimals: 6,}, { programAddress: tokenProgramA });await client.sendTransaction([fundAssetLeg]);
Käteisjalan osapuoli tekee saman escrow B:lle käyttäen arvoja userBAtaB, mintB,
userBSigner, t.amountB ja { programAddress: tokenProgramB }.
Tilassa confirmed nähty rahoitussiirto
voidaan silti korvata. Ohjelma lukee escrow-saldon ketjussa selvityksen
hetkellä, joten Settle, joka lähetetään sellaista rahoitussiirtoa vasten, joka
ei mennyt läpi, epäonnistuu virheeseen LegNotFunded eikä mikään liiku;
hintana on epäonnistunut Settle ja uusinta. Katso jalka rahoitetuksi vasta, kun
sen siirto on tilassa finalized.
Huomautukset
- Wrapped SOL -jalat. Ohjelma lukee natiivin escrow-tilin saldon synkronoinnin jälkeen, joten järjestelmäsiirrolla wrapped SOL -escrow-tilille lähetetyt lamports lasketaan mukaan. Älä koskaan lähetä SOL-tokeneita escrow-tilille minkään muun mintin osalta: ohjelma ei voi palauttaa niitä, ja ne päätyvät sille, joka sulkee tilin.
- Rajatut mintit. Mintillä, jonka Default Account State on frozen, escrow luodaan jäädytettynä ja siirto epäonnistuu, kunnes liikkeeseenlaskija sulattaa tai hyväksyy sen. Yleiskatsaus kuvaa yhteistoiminnan Token ACL:n kanssa.
- Transfer hookit. Rahoita hookin sisältävät escrow-tilit täsmälleen sovitulla määrällä. Jos ylijäämä pakottaa palautuksen selvityksessä, palautus käyttää uudelleen jalan hook-tilejä eri kohteella ja määrällä, minkä jotkin hookit hylkäävät. Korjaus on Reclaim, uudelleenrahoitus tarkalla määrällä ja uusi selvitys.
- Rahoitus erääntymisen jälkeen. Mikään ei estä siirtoa
expiry_timestamp-ajan jälkeen. Se menee perille, selvitys ei ole enää mahdollinen, ja jalan osapuoli saa sen takaisin Reclaimilla kaupan ollessa avoin tai Recoverilla sen sulkeuduttua. Katso kaupan purkaminen. - Kuka rahoittaa ensin. Ohjelma ei järjestä kahta jalkaa jonoon. Järjestys on osapuolten asia; kumpi tahansa osapuoli voi lunastaa oman jalkansa takaisin milloin tahansa ennen selvitystä, ellei mint authority (freeze, pause tai transfer hook) estä escrow-tiliä.
Seuraavat vaiheet
- Selvitä kauppa: selvityksen valtuutettu vaihtaa molemmat jalat yhdessä transaktiossa
- Pura kauppa: rahoitetun jalan palauttaminen, kun kauppa ei selviä
Is this page helpful?