pyth-crosschain/docs/solana_program.md

11 KiB
Raw Blame History

Solana Wormhole Program

The Wormhole program acts as a bridge for Solana <> Foreign Chain transfers using the WhP (WormHoleProtocol).

Instructions

Initialize

Initializes a new Bridge at bridge.

Index Name Type signer writeable empty derived
0 owner Account
0 bridge BridgeConfig
Lock

Burns a wrapped asset token from sender on the Solana chain.

The transfer proposal will be tracked at a new account proposal where VPAs will be submitted by guardians.

Parameters:

Index Name Type signer writeable empty derived
0 sender TokenAccount
1 bridge BridgeConfig
2 proposal LockProposal
3 token WrappedAsset
LockNative

Locks a Solana native token (spl-token) token from sender on the Solana chain by transferring it to the custody_account.

The transfer proposal will be tracked at a new account proposal where VPAs will be submitted by guardians.

Index Name Type signer writeable empty derived
0 sender TokenAccount
1 bridge BridgeConfig
2 proposal LockProposal
3 token Mint
4 custody_account Mint opt
PostVPA

Submits a VPA signed by guardian on a valid proposal.

Index Name Type signer writeable empty derived
0 guardian Account
1 bridge BridgeConfig
2 proposal LockProposal
Reclaim

Reclaim tokens that did not receive enough VPAs on the proposal within the SIGN_PERIOD to finish the transfer. claimant will get back the locked_token previously locked via ILock.

Index Name Type signer writeable empty derived
0 claimant TokenAccount
1 bridge BridgeConfig
2 proposal LockProposal
3 locked_token WrappedAsset
ReclaimNative

Reclaim tokens that did not receive enough VPAs on the proposal within the SIGN_PERIOD to finish the transfer. claimant will get back the locked_token previously locked via ILockNative from the custody_account.

Index Name Type signer writeable empty derived
0 claimant TokenAccount
1 bridge BridgeConfig
2 proposal LockProposal
3 locked_token Mint
4 custody_account Mint
EvictLock

Deletes a proposal after the BRIDGE_WAIT_PERIOD to free up space on chain. This returns the rent to guardian.

Index Name Type signer writeable empty derived
0 guardian Account
1 bridge BridgeConfig
2 proposal LockProposal
ConfirmForeignLockup

The guardian confirms that a user locked up a foreign asset on a foreign chain. This creates or updates a proposal to mint the wrapped asset token to destination. If enough confirmations have been submitted, this instruction mints the token.

Index Name Type signer writeable empty derived
0 guardian Account
1 bridge BridgeConfig
2 proposal ReleaseWrappedProposal opt
3 token WrappedAsset opt
4 destination TokenAccount opt?
ConfirmForeignLockupOfNative

The guardian confirms that a user locked up a native asset on a foreign chain. This creates or updates a proposal to release the token to destination from custody_src. If enough confirmations have been submitted, this instruction releases the token.

Index Name Type signer writeable empty derived
0 guardian Account
1 bridge BridgeConfig
2 proposal ReleaseWrappedProposal opt opt
3 token WrappedAsset
4 custody_src TokenAccount
5 destination TokenAccount opt?
EvictRelease

Deletes a proposal after the RELEASE_WRAPPED_TIMEOUT_PERIOD to free up space on chain. This returns the rent to guardian.

Index Name Type signer writeable empty derived
0 guardian Account
1 bridge BridgeConfig
2 proposal ReleaseWrappedProposal
ChangeGuardianAdmin

This instruction is used to change the admin account of a guardian i.e. the account that manages rewards and the signer account.

Index Name Type signer writeable empty derived
0 guardian Account
1 bridge BridgeConfig
2 new_guardian Account
ChangeGuardianSigner

This instruction is used to change the signer account of a guardian.

Index Name Type signer writeable empty derived
0 guardian Account
1 bridge BridgeConfig
2 new_signer Account

Accounts

The following types of accounts are owned by creators of bridges:

BridgeConfig Account

This account tracks the configuration of the transfer bridge.

Parameter Description
SIGN_PERIOD The period in which enough foreign chain signatures need to be aggregated before tokens are freed up again
BRIDGE_WAIT_PERIOD The period after enough signatures have been published to a lock account after which the account can be evicted. This exists to guarantee data availability
RELEASE_WRAPPED_TIMEOUT_PERIOD The period in which enough votes need to be cast for an asset to be minted.

Program Accounts

The program own the following types of accounts:

LockProposal Account

Seed derivation: lock_<chain>_<asset>_<lock_hash>

chain: CHAIN_ID of the native chain of this asset

asset: address of the asset

lock_hash: Random ID of the lock

This account is created when a user wants to lock tokens to transfer them to a foreign chain using the ILock instruction.

It tracks the progress of validator signatures. If not enough valid signatures are submitted within SIGN_PERIOD, the tokens can be claimed by the user using the IReclaim instruction.

If enough signatures have been submitted, the account can be deleted using IEvictLock after BRIDGE_WAIT_PERIOD, freeing up the rent.

ReleaseWrappedProposal Account

Seed derivation: release_<chain>_<asset>_<foreign_lock_hash>

chain: CHAIN_ID of the native chain of this asset

asset: address of the asset

foreign_lock_hash: Hash of the foreign chain lock transaction

This account is created when the first validator sees a fully confirmed Lockup of an asset on a foreign chain.

It tracks the confirmations of validators that have also seen the Lockup using IConfirmForeignLockup.

Once enough votes have been cast within the RELEASE_WRAPPED_TIMEOUT_PERIOD, this account is evicted and wrapped tokens are minted or native tokens released.

If not enough votes are cast within the RELEASE_WRAPPED_TIMEOUT_PERIOD, the account can be evicted and the release aborted using IEvictRelease.

WrappedAsset Mint

Seed derivation: wrapped_<chain>_<asset>

chain: CHAIN_ID of the native chain of this asset

asset: address of the asset on the foreign chain

This account is an instance of spl-token/Mint tracks a wrapped asset on the Solana chain.

NativeAsset TokenAccount

Seed derivation: custody_<asset>

asset: address of the asset on the native chain

This account is an instance of spl-token/TokenAccount and holds spl tokens in custody that have been transferred to a foreign chain.