See this doc for more implementation details
Since this program is extended from the original Escrow Program, I assumed you have gone through the original blog post at least once.
However, there is one major difference between this exmaple and the original Escrow program: Instead of letting initializer create a token account to be reset to a PDA authority, we create Vault Authority(PDA)'s associated token account (ATA) directly without transferring authority.
Initializer can send a transaction to the escrow program to initialize the Vault. In this transaction, two new accounts: Vault Authority's ATA and Escrow State, will be created and tokens (Token A) to be exchanged will be transferred from Initializer to Vault(short for vault authority's ATA).
Initializer can also send a transaction to the escrow program to cancel the demand of escrow. The tokens will be transferred back to the Initializer and both Vault and Escrow State will be closed in this case.
Taker can send a transaction to the escrow to exchange Token B for Token A. First, tokens (Token B) will be transferred from Taker to Initializer. Afterward, the tokens (Token A) kept in the Vault will be transferred to Taker. Finally, both Vault and Escrow State will be closed.
Let's run the test once to see what happens.
First, make sure that anchor is installed:
Install avm:
$ cargo install --git https://github.com/coral-xyz/anchor avm --locked --force
...Install latest anchor version:
$ avm install 0.27.0
...
$ avm use 0.27.0
...If you haven't installed
cargo, please refer to this doc for installation steps.
You may have to install some extra dependencies on Linux (ex. Ubuntu):
$ sudo apt-get update && sudo apt-get upgrade && sudo apt-get install -y pkg-config build-essential libudev-dev
...Check if Anchor is successfully installed:
$ anchor --version
anchor-cli 0.27.0Next, install dependencies:
$ yarn
Get the public key of the deploy key. This keypair is generated automatically so a different key is exptected:
$ anchor keys list
anchor_escrow: Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnSReplace the default value of program_id with this new value:
# Anchor.toml
[programs.localnet]
anchor_escrow = "Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS"
...// lib.rs
...
declare_id!("Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS");
...Build the program:
$ anchor build
Let's deploy the program. Notice that anchor-escrow will be deployed on a mainnet-fork test validator run by Dappio:
$ solana config set --url localhost
...
$ anchor deploy
...
Program Id: Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS
Deploy success
Finally, run the test:
$ anchor test --skip-deploy --skip-build --skip-local-validator