All Projects → ZenGo-X → JugglingSwap

ZenGo-X / JugglingSwap

Licence: GPL-3.0 License
Scriptless atomic cross-chain (and cross-curve) swap protocol based on a fair exchange of secrets.

Programming Languages

typescript
32286 projects

JugglingSwap

A scriptless atomic cross-chain (and cross-curve) swap protocol based on a fair exchange of secrets and threshold-signatures. See paper. Demonstrating a BTC/ETH swap.

Installation

  1. Install Rust.
    This demo was tested on rustc 1.38.0-nightly (0b680cfce 2019-07-09);
  2. Clone and build the repository:
$ git clone https://github.com/KZen-networks/atomic-swaps
$ cd ./atomic-swaps
$ yarn install
$ yarn run build 

Demo

You can use the command line demo, using 3 different shells, one for each of the different actors: a maker, a taker and a server.

Server

The server functions as both the co-signer of wallet owners (i.e. the maker and the taker) and as a hub for communication between them when performing a make/take order request and the atomic swap itself.

$ cd ./dist/demo
$ export DEBUG=server  # see useful logs throughout the demo
$ chmod +x ./server.js
$ ./server.js run
Server listening on port 8001

Maker

$ cd ./dist/demo
$ export DEBUG=user,maker  # see useful logs throughout the demo
$ chmod +x ./maker.js
$ ./maker.js --help
Usage: maker [options] [command]

Options:
  -h, --help                                                      display help for command

Commands:
  address|a [options]
  balance|b
  make|m <sourceCurrency> <sourceAmount> <toCurrency> <toAmount>  Make an order
  help [command]                                                  display help for command

For example, the maker would want to swap BTC for ETH.
You'll first need to send some Bitcoin Testnet coins to the maker's address. One available faucet is: https://testnet-faucet.mempool.co/.
To get the maker's address:

$ ./maker.js address
mys4d22g8t9h9j3W3JDDbPynYgh2dBj9tw

Then, you can make an order request (do not kill the process when done):

$ ./maker.js make BTC 0.0001 ETH 0.001
done

Taker

$ cd ./dist/demo
$ export DEBUG=user,taker  # see useful logs throughout the demo
$ chmod +x ./taker.js
$ ./taker.js --help
Usage: taker [options] [command]

Options:
  -h, --help           display help for command

Commands:
  address|a [options]
  balance|b
  orders|o             Get all orders
  take|t <orderId>     Take an order
  help [command]       display help for command

First, deposit some (ropsten) ether into the taker's ETH address. One available faucet is: https://faucet.ropsten.be/.
To get the taker's address:

$ ./taker.js address
0x6eddb5f4826f0943069f5b09cade32c5e0bbcae6

Get all available orders (made by makers):

$ ./taker.js orders
[ { id: '10121dc1-49ac-426d-823a-af757c798aad',
    sourceCurrency: 'BTC',
    destinationCurrency: 'ETH',
    sourceAmount: '0.0001',
    destinationAmount: '0.001' } ]

Then, execute an order using its id:

./taker.js take 10121dc1-49ac-426d-823a-af757c798aad

Eventually, you'll see logs of the following formats at the maker's and taker's shells, respectively:

Executed ETH withdraw: 0x5b780bdb57a69fc0c5b0e1c8a43764a702e50202eb3a73524db48744396c94a7
Executed BTC withdraw: edef8ac64f9dcd2a1ee8dcea964249a4a23e9f83f827f17ea65d0f2ed7aefcf8

These transactions complete the cross-chains atomic-swap between the parties.

Demo

Contact

Feel free to reach out or join ZenGo X Telegram for discussions on code and research.

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].