@circles/transfer

Find maximum flow and transitive transfer steps in a trust graph

Usage no npm install needed!

<script type="module">
  import circlesTransfer from 'https://cdn.skypack.dev/@circles/transfer';
</script>

README

Circles Transfer

npm Version License Build Status Follow Circles

Utility module for Circles to find the Maximum flow and necessary transitive transfer steps in a trust graph with multiple tokens.

For performance reasons this module uses the native pathfinder process by chriseth to find the transfer steps.

Requirements

  • NodeJS

Installation

# Make it a dependency
npm i @circles/transfer

# Copy the native pathfinder process into your project folder
cp ./node_modules/@circles/transfer/pathfinder ./pathfinder

Usage

import findTransitiveTransfer from '@circles/transfer';

// Define a weighted trust graph between trusted tokens. Each edge describes
// how much ("capacity") of what token ("token") can be sent from which node
// ("from") to which ("to").
//
// Store this json file somewhere (for example ./graph.json):
//
// [
//  {
//    from: '0x5534d2ba89ad1c01c186efafee7105dba071134a',
//    to: '0x83d878a6123efd548341b468f017af31d96b09b6',
//    token: '0x5534d2ba89ad1c01c186efafee7105dba071134a',
//    capacity: '10'
//  },
//  {
//    from: '0x83d878a6123efd548341b468f017af31d96b09b6',
//    to: '0xe08fe38204075884b5dbdcb0ddca0e033f9481a7',
//    token: '0x83d878a6123efd548341b468f017af31d96b09b6',
//    capacity: '7'
//  },
//  {
//    from: '0x83d878a6123efd548341b468f017af31d96b09b6',
//    to: '0xe08fe38204075884b5dbdcb0ddca0e033f9481a7',
//    token: '0xe08fe38204075884b5dbdcb0ddca0e033f9481a7',
//    capacity: '5'
//  },
//  ...
// ];

// Find required transfer steps to send tokens transitively between two nodes:
const { transferSteps, maxFlowValue } = await findTransitiveTransfer({
  from: '0x5534d2ba89ad1c01c186efafee7105dba071134a',
  to: '0x29003579d2ca6d47c1860c4ed36656542a28f012',
  value: '5',
}, {
  edgesFile: './graph.json', // Path to graph file
  pathfinderExecutable: './pathfinder', // Path to `pathfinder` program
  timeout: 1000 * 5, // Stop process when it takes longer than x milliseconds
});

// ... we get the maximum possible value. If transfer value is smaller it will
// be the same:
console.log(`Can send max. ${maxFlowValue}`);

// ... and finally the transfer steps:
transferSteps.forEach(({ step, from, to, value, token }) => {
  console.log(`${step}.: Send ${value} of ${token} from ${from} to ${to}`);
});

Development

circles-transfer is a JavaScript module, tested with Jest, transpiled with Babel and bundled with Rollup.

// Install dependencies
npm install

// Run test suite
npm run test
npm run test:watch

// Check code formatting
npm run lint

// Build it!
npm run build

pathfinder is a C++ program by chriseth compiled for Linux arm64 in this repository. Compile it for your own platform with the following steps and move the target into your project:

cmake .
make

License

GNU Affero General Public License v3.0 AGPL-3.0