@nimiq/libswap
Version:
Typed Javascript library to handle atomic swaps.
120 lines (100 loc) • 3.06 kB
Markdown
# libswap - Fastspot Atomic Swap Library
A Typescript handler class to handle and process atomic swaps with Fastspot.
The library does not work _only_ with Fastspot, but it uses the Fastspot API types.
## Package
This package can be installed from NPM as
```
/libswap
```
https://www.npmjs.com/package/@nimiq/libswap
## API
```js
import { SwapHandler } from '@nimiq/libswap'
// Setup for swaps from NIM to BTC
// This fulfills the `Swap` type from @nimiq/fastspot-api
const swap = {
from: {
asset: 'NIM',
amount: 1000e5, // 1000 NIM
},
to: {
asset: 'BTC',
amount: 0.001e8, // 1 mBTC
},
hash: '<swap hash (hashRoot) as HEX>',
contracts: {
NIM: {
htlc: {
address: '<HTLC address>',
data: '<HTLC creation data as HEX>',
}
},
BTC: {
htlc: {
address: '<HTLC address>',
script: '<HTLC script as HEX>',
}
},
/* For EUR: */
// EUR: {
// htlc: {
// address: '<HTLC ID>',
// }
// },
}
}
/**
* Initialize a SwapHandler with the swap object, the client for
* the FROM asset and the client for the TO asset:
*/
const swapHandler = new SwapHandler(swap, nimiqClient, electrumClient)
/****************************************
** General process for any swap pair: **
****************************************/
/**
* 1. Wait for swap partner to create their HTLC
*
* This method validates the HTLC data against the swap object
* and resolves when the HTLC is valid.
*
* The optional `onUpdate` callback receives the transaction/HTLC object:
* @type {(tx: Transaction<ToAsset>) => any} onUpdate
*/
await swapHandler.awaitIncoming(onUpdate)
/**
* 2.A Create our HTLC
*
* The optional `onPending` callback receives the transaction object:
* @type {(tx: Transaction<FromAsset>) => any} onPending
*/
await swapHandler.createOutgoing(serializedFundingTx, onPending)
/**
* 2.B Alternatively, await HTLC funding from external wallet
*
* The optional `onUpdate` callback receives the transaction object:
* @type {(tx: Transaction<FromAsset>) => any} onUpdate
*/
await swapHandler.awaitOutgoing(onUpdate)
/**
* 3. Wait for the swap secret to be published on-chain
*/
const secret = await swapHandler.awaitSecret()
/**
* 4. Settle the incoming HTLC with the swap secret
*
* The `serializedSettlementTx` (HEX string) must have a string of 0s (zeros) in place of
* the swap secret, which will be replaced with the secret automatically.
*/
await swapHandler.settleIncoming(serializedSettlementTx, secret)
/**
* 5. Await confirmation of settled HTLC
*
* This is especially relevant for EUR contracts, as they may take a
* few minutes to confirm after they were settled.
*
* The optional `onUpdate` callback receives the transaction object:
* @type {(tx: Transaction<ToAsset>) => any} onUpdate
*/
await swapHandler.awaitIncomingConfirmation(onUpdate)
// Done!
```