Dört instruction, takası sonuçlandırmadan fonları iade eder: takas açıkken Reclaim, Cancel ve Reject; takas kapandıktan sonra gelen bir mevduat için ise Recover. Hiçbiri son kullanma süresini kontrol etmez. Dondurulmuş bir escrow ya da değişmiş bir mint, sondaki notlarda açıklandığı gibi bir bacağı yine de tutabilir.
| Instruction | İmzalayan | Kapsam | Sonrasında takas |
|---|---|---|---|
ReclaimDvp | user_a veya user_b | İmzalayanın kendi bacağı | Hâlâ açık |
CancelDvp | Takas yetkilisi (settlement authority) | Her iki bacak | Kapalı |
RejectDvp | user_a veya user_b | Her iki bacak | Kapalı |
RecoverDvp | user_a veya user_b | İmzalayanın bacağı, kapanıştan sonra | Zaten kapalı |
Her durumda escrow'da ne varsa bacağın tarafına boşaltılır:
escrow A, user_a'nın mint_a için token account'una; escrow B, user_b'nin
mint_b için token account'una, kim fonlamış olursa olsun. Memo gerektiren iade
hesapları için memo program account'u sağlanır.
Bu sayfa önceki adımlardan devam eder: takas oluşturma adımındaki client ve imzalayanlar,
bacakları fonlama adımındaki userAAtaA ve
userBAtaB, takası sonuçlandırma adımındaki
MEMO_PROGRAM_ID ve authority buraya taşınır.
Bir bacağı geri çekme (Reclaim)
Reclaim, imzalayanın bacağını iade eder ve takası açık bırakır; böylece bacak yeniden fonlanabilir. Sorun karşı tarafın bacağındaysa kullanın; Cancel ve Reject ise takasın tamamını kapatır.
import { MEMO_PROGRAM_ADDRESS } from "@solana-program/memo";import { getReclaimDvpInstruction } from "./dvp";// The asset-leg party takes its asset back.const reclaimInstruction = getReclaimDvpInstruction({signer: userASigner,swapDvp,mint: mintA,dvpSourceAta: escrowA,signerDestAta: userAAtaA,tokenProgram: tokenProgramA,memoProgram: MEMO_PROGRAM_ADDRESS,});await client.sendTransaction([reclaimInstruction]);
İptal etme veya reddetme (Cancel / Reject)
Cancel, settlement authority tarafından; Reject ise taraflardan biri tarafından imzalanır. İkisi de her escrow'daki tutarı bacağın tarafına iade eder, kaydı ve her iki escrow'u kapatır; kapatılan hesapların rent'i imzalayana gider. İki instruction aynı hesapları alır; yalnızca imzalayan farklıdır.
import { getCancelDvpInstruction, getRejectDvpInstruction } from "./dvp";const unwindAccounts = {swapDvp,mintA,mintB,dvpAtaA: escrowA,dvpAtaB: escrowB,userAAtaA,userBAtaB,tokenProgramA,tokenProgramB,memoProgram: MEMO_PROGRAM_ADDRESS,legAExtrasCount: 0,};// Signed by the settlement authority:const cancelInstruction = getCancelDvpInstruction({settlementAuthority: authoritySigner,...unwindAccounts,});// Or signed by either party:const rejectInstruction = getRejectDvpInstruction({signer: userBSigner,...unwindAccounts,});
İade hesapları (userAAtaA, userBAtaB), bakiye tutan her bacak için mevcut olmalıdır;
başlatılmamış bir iade hesabı token transferinin başarısız olmasına ve instruction'ın
geri alınmasına (revert) yol açar. Hiç fonlanmamış bir bacak için transfer gerekmez
ve eksik bir hesaba tolerans gösterilir.
Geç gelen bir mevduatı kurtarma (Recover)
Settle, Cancel ve Reject, her iki escrow token account'unu da kapatır; bu nedenle kapalı bir escrow'a yapılan düz transfer başarısız olur. Bir mevduat, kapanıştan sonra ancak escrow önce yeniden oluşturulursa ulaşabilir; örneğin transferden önce create-idempotent associated token account instruction'ı içeren ve karşı taraf Reject gönderdiğinde henüz işlemdeki bir fonlama işlemi gibi. Bu durumda token'lar artık var olmayan bir takasın escrow'unda kalır: kayıt silinmiştir, bu yüzden Reclaim onu bulamaz ve nonce tombstone'u, aynı adreste yeni bir takas oluşturulup mevduatın ele geçirilmesini engeller.
RecoverDvp kullanmak için bacağın tarafı orijinal seed girdilerini sağlar
(settlement authority, her iki taraf, her iki mint, nonce). Program kayıt adresini yeniden
türetir, takasın var olduğunun kanıtı olarak tombstone'unu şart koşar, escrow'u
imzalayanın kendi token account'una boşaltır ve kapatır; escrow rent'i imzalayana
geri döner. İmzalayanın bacağı, hangi tarafın imzaladığına göre belirlenir:
user_a için mint_a, user_b için mint_b.
import { getAddressEncoder, getProgramDerivedAddress } from "@solana/kit";import { DVP_SWAP_PROGRAM_PROGRAM_ADDRESS, getRecoverDvpInstruction } from "./dvp";const [nonceTombstone] = await getProgramDerivedAddress({programAddress: DVP_SWAP_PROGRAM_PROGRAM_ADDRESS,seeds: ["nonce", getAddressEncoder().encode(swapDvp)],});const recoverInstruction = getRecoverDvpInstruction({signer: userASigner,swapDvp,nonceTombstone,mint: mintA,dvpEscrowAta: escrowA,signerDestAta: userAAtaA,tokenProgram: tokenProgramA,memoProgram: MEMO_PROGRAM_ADDRESS,settlementAuthority,userA,userB,mintA,mintB,nonce,});await client.sendTransaction([recoverInstruction]);
Kurtarma, tarafın oluşturma parametrelerini saklamasına bağlıdır. Takasları fonlayan bir sistem, takas kapanana ve escrow bakiyelerinin boş olduğu doğrulanana kadar seed girdilerini her emirle birlikte saklar.
Notlar
- Dondurulmuş bacaklar. Kapılı (gated) bir mint'te, dondurulmuş bir escrow, freeze authority dondurmayı kaldırana kadar bu instruction'ların gerçekleştirdiği token transferini engeller. Bkz. genel bakış.
- Oluşturma sonrası mint değişiklikleri. Geri alma yolları, programın kendi kontrollerinin kurtarmayı engellememesi için extension ve mint-authority kontrollerini atlar. token program'ın kendi kuralları yine geçerlidir. Bir mint yalnızca arz sıfırken kapatılabilir; bu nedenle escrow'da bakiye dururken değişemez, ancak geç bir mevduat gelmeden önce kapatılıp NonTransferable olarak ya da transfer ücretiyle yeniden oluşturulan bir mint, o mevduatı taşınamaz veya ücretli hale getirebilir. Desteklenen token'lar altında listelenen mint-authority bağımlılığı budur.
Sonraki adımlar
- DvP programı: genel bakış, desteklenen token'lar ve mint yapılandırma kısıtları
- Delegasyon kullanarak Delivery vs Payment (DvP): aynı takas, program olmadan yetki devri üzerinden
Is this page helpful?