Rückerstattung
Wir können jetzt zur refund Anweisung übergehen, die sich in der refund.rs befindet und folgende Aktionen ausführen wird:
Schließen des Escrow PDA und Rücksendung seiner Rent-Lamports an den Ersteller.
Verschieben des gesamten Token A-Guthabens aus dem Tresor zurück zum Ersteller und anschließendes Schließen des Tresorkontos.
Konten
Die in diesem Kontext benötigten Konten sind:
maker: der Benutzer, der die Bedingungen des Austauschs festgelegt hatescrow: das Konto, in dem alle Bedingungen dieses Austauschs gespeichert sindmint_a: der Token, den dermakereingezahlt hatvault: das Token-Konto, das mit demescrowundmint_averknüpft ist, wo die Tokens eingezahlt wurdenmaker_ata_a: das Token-Konto, das mit demmakerundmint_averknüpft ist und die Tokens vomvaulterhalten wirdassociated_token_program: das Associated Token Program, das zur Erstellung der zugehörigen Token-Konten verwendet wirdtoken_program: das Token-Programm, das für den CPI-Transfer verwendet wirdsystem_program: das System-Programm, das zur Erstellung desEscrowverwendet wird
Diesmal werden wir dir nicht helfen, indem wir das Context erstellen, also versuche es selbst! Bitte stelle sicher, dass du die richtige Reihenfolge der Konten verwendest, sonst werden unsere Tests fehlschlagen.
Logik
Die Logik ähnelt der take Anweisung, aber diesmal verschieben wir die Tokens nur vom vault zum maker_ata_a, bevor wir den nun leeren Tresor schließen.
Diesmal bist du an der Reihe, selbst zu lernen, wie man es macht, daher werden wir dir nicht verraten, wie die Lösung aussieht.
Beachte, dass sobald dies ausgeführt wird, das Angebot ungültig ist, der Tresor verschwindet und der Ersteller sein Token A und die Miete zurück in seiner Wallet hat.
Entrypoint
Nachdem wir alle Funktionen in den verschiedenen Anweisungen erstellt haben, können wir endlich den lib.rs mit allen erstellten Funktionen füllen; so:
#[program]
pub mod blueshift_anchor_escrow {
use super::*;
pub fn make(ctx: Context<Make>, seed: u64, receive: u64, amount: u64) -> Result<()> {
instructions::make::handler(ctx, seed, receive, amount)
}
pub fn take(ctx: Context<Take>) -> Result<()> {
instructions::take::handler(ctx)
}
pub fn refund(ctx: Context<Refund>) -> Result<()> {
instructions::refund::handler(ctx)
}
}Conclusion
Du kannst jetzt dein Programm gegen unsere Unit-Tests testen und deine NFTs beanspruchen!
Beginne damit, dein Programm mit folgendem Befehl in deinem Terminal zu bauen
anchor buildDies erzeugt eine .so Datei direkt in deinem target/deploy Ordner.
Klicke jetzt auf die Schaltfläche take challenge und lege die Datei dort ab!