Rahoita jalat

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 agreed
const expectedExpiry = 1_798_761_600n; // as agreed, unix seconds
if (
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?

Sisällysluettelo

Muokkaa sivua
© 2026 Solana Foundation. Kaikki oikeudet pidätetään.