Set Up Swap Transaction is the first step in an atomic swap process. The purpose of this transaction is to create a swap state on the chain to temporarily hold the token and assets. These assets and token is guarded by a hash lock which is a sha3-256 output of a random number. In order to get the assets and token, a receiver must know this random number. Once the transaction is passed, the assets and token are transferred to the swap state and are locked till a block number specified by the locktime.

Normally, Set Up Swap transaction should happen in pairs across two chains. For example, if Alice sets up a swap for Bob on chain A, Bob should set up a swap for Alice on chain B by using the same hashlock as the next step of the overall atomic swap process.

Protocol definition

SetupSwapTx is defined:

message SetupSwapTx {
  BigUint value = 1;
  repeated string assets = 2;
  string receiver = 3;
  bytes hashlock = 4;
  uint32 locktime = 5;

  google.protobuf.Any data = 15;
  • value is amount of token to swap.
  • assets are the addresses of assets to swap.
  • receiver is the address of the account who is the only one allowed to get the token and assets.
  • hashlock is the sha3-256 value of the random number.
  • locktime is the block height before which the swap cannot be revoked by the sender.

SwapState is defined:

message SwapState {
  string hash = 1;
  string address = 2;
  bytes hashkey = 3;
  string sender = 4;
  string receiver = 5;
  BigUint value = 6;
  repeated string assets = 7;
  uint32 locktime = 8;
  bytes hashlock = 9;
  StateContext context = 10;
  • hash is the hash of the SetupSwapTx.
  • adress is the address of the swap state. Note, the swap address is generated based on the hash.
  • hashkey is the random number determined by the sender. It is empty right after creation.
  • sender is the address of the sender.
  • receiver is the address of the receiver.
  • value is the token to swap.
  • assets is the list of assets addresses to swap.
  • locktime is the block height before which the swap cannot be revoked by the sender.
  • hashlock is the sha3-256 value of the random number.
  • context is state context of the swap state.


Here's an example of how to send a set up swap transaction.

# Declare sender and receiver
sender = ForgeSdk.create_wallet()
ForgeSdk.declare( "alice"), wallet: w)
receiver = ForgeSdk.create_wallet()
ForgeSdk.declare( "bob"), wallet: w)

# Generate a random number as hashkey.
hashkey = :crypto.strong_rand_bytes(32)
# Calculate the sha3 output as hashlock.
hashlock = Mcrypto.hash(%Mcrypto.Hasher.Sha3{}, hashkey)

# Assemble and send the SetupSwapTx
itx =
  value: ForgeAbi.token_to_unit(1),
  assets: [],
  receiver: receiver.address,
  locktime: 1000000,
  hashlock: hashlock
ForgeSdk.setup_swap(itx, wallet: sender, send: :commit)