After the first day of idea generation and the second day of learning, I thought I'd get into the more practial side of it and try to get something up to play around with.
Here's what I did:
- Connect to a Interledger testnet with moneyd
- Create an ILP stream server to connect to the moneyd instance.
- Generate stream credentials and send money
Run npx moneyd local
to start the moneyd instance with a local testnet.
Next, set up a simple node project:
npm init -y
npm i -S ilp-protocol-stream ilp-plugin @interledger/connection-tag-utils
mkdir src
touch src/index.js
// src/index.js
const { randomBytes } = require("crypto");
const { createServer, createConnection } = require("ilp-protocol-stream");
const { encode, decode } = require("@interledger/connection-tag-utils");
const createPlugin = require("ilp-plugin");
// Used for encoding and decoding connectionTag
const SECRET_KEY = randomBytes(32);
async function createStreamServer() {
const server = await createServer({ plugin: createPlugin() });
server.on("connection", (connection) => {
// connectionTag contains encrypted data, in this case about the user account
const { account } = JSON.parse(
decode(SECRET_KEY, connection.connectionTag)
);
connection.on("stream", (stream) => {
stream.setReceiveMax(10000);
stream.on("money", (amount) => {
console.log(`Received payment from ${account} for: ${amount}`);
});
});
});
return server;
}
async function sendMoney({ amount, destinationAccount, sharedSecret }) {
const connection = await createConnection({
plugin: createPlugin(),
destinationAccount,
sharedSecret,
});
const stream = connection.createStream();
await stream.sendTotal(amount);
await connection.end();
}
async function run() {
const server = await createStreamServer();
// Encode the user account here so we can use when we receive money
const data = encode(SECRET_KEY, JSON.stringify({ account: "userAccountId" }));
const { destinationAccount, sharedSecret } = server.generateAddressAndSecret(
data
);
const amount = 10000;
await sendMoney({ amount, destinationAccount, sharedSecret });
await server.close();
}
run().catch((err) => console.log(err));
And finally run it:
npx nodemon src/index.js
Received payment from userAccountId for: 10000
- Plugins such as
ilp-plugin
determines where the server connects. It looks for env variableILP_BTP_SERVER
and defaults tobtp+ws://localhost:7768
if not found. This is the local moneyd instance. - Data such as information about user or invoice can be encoded in the connectionTag. This will allow us to update databases for example.
- To create a stream client and send money we need:
destinationAccount
andsharedSecret
which we can get from a server.
Possible next steps
- Connect to a non-local testnet
- Send money between other wallets
- Build a REST server and handle different users and payment pointers
- Build a browser extension to handle the functionality currently in
sendMoney
Top comments (0)