🀝BLS multisig transactions

Shortly, the typical keypair looks like this:

{
   "privateKey":"caad28a7da57fb28879bfdd886714629e4152553a28540caed6f51531f5af61a",
   "pubKey":"7QMxLg6GJwQYjc8B2WBEvaQq3TfeBhgBqHGneFu43oLfwhovrPGykbkUGe94FacSuG"
}
  • 48-bytes Base58 ecoded public key(used as address)

  • 32-bytes hexadecimal private key

  • 96-bytes Base64 encoded signature

Generate BLS keypair(s)

Read detailed information here

BLS => Ed25519 transaction

import Web1337,{crypto} from 'web1337';


let web1337 = new Web1337({

    symbioteID:'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',
    workflowVersion:0,
    nodeURL: 'http://localhost:7332'

});



const publicKey1 = '6Pz5B3xLQKDxtnESqk3tWnsd4kwkVYLNsvgKJy31HssK3eGSy7Tvratk5pZNFW5z8S';
const privateKey1 = '6bcdb86cd8f9d24e9fe934905431de5c224499af8788bf12cae8597f0af4cb23';

const publicKey2 = '5uj1Sgrvo9mwF6v8Z3Kxe4arQcu53Q2z9QBYsRPWCdo972jBeL8hD3Kmo4So3dSLt5';
const privateKey2 = 'e5ca94e2c60cbb3ca9d5f9c233a99f01e3250ef62bd48fbc09caf25ae70040b5';

const publicKey3 = '6ZmLf52hp5FgCxuaNJ6Jmi2M7FSJTr115WRMuV1yCvEihepnEKJBhgopDMpUKLpe2F';
const privateKey3 = 'ead8698b5ef285e6019e22e54dfe2c592c020946e803df8c6e79f98baf849d48';

const publicKey4 = '61tPxmio9Y21GtkiyYG3qTkreKfqm6ktk7MVk2hxqiXVURXxM6qNb9vPfvPPbhpMDn';
const privateKey4 = '414230b72c59ac8db6ec47b629607057edaa5c7c553d44b4b9fd1c0090141c5a';

// General pubkey retrieved from 4 friends public keys
const rootPubKey = crypto.bls.aggregatePublicKeys([publicKey1,publicKey2,publicKey3,publicKey4]);

// Root pubkey of 3 friends who want to use account
const aggregatePubKeyOfThreeFriends = crypto.bls.aggregatePublicKeys([publicKey1,publicKey2,publicKey3]);

// Array of pubkeys of friends who dissenting to sign
const arrayOfAfkSigners = [publicKey4];


// ID of shard where you want to transfer KLY or call contract
const shardID = '7GPupbq1vtKUgaqVeHiDbEJcxS7sSjwPnbht4eRaDBAEJv8ZKHNCSu2Am3CuWnHjta';

// Typical Ed25519
const recipient = 'nXSYHp74u88zKPiRi7t22nv4WCBHXUBpGrVw3V93f2s';

const from = rootPubKey;

const nonce = 0;

const fee = 1;

const amountInKLY = 13.37;



// Now 3 sides need to sign the same tx data locally(on their devices)

let signature1 = await web1337.signDataForMultisigTxAsOneOfTheActiveSigners(shardID,privateKey1,aggregatePubKeyOfThreeFriends,arrayOfAfkSigners,nonce,fee,recipient,amountInKLY);

let signature2 = await web1337.signDataForMultisigTxAsOneOfTheActiveSigners(shardID,privateKey2,aggregatePubKeyOfThreeFriends,arrayOfAfkSigners,nonce,fee,recipient,amountInKLY);

let signature3 = await web1337.signDataForMultisigTxAsOneOfTheActiveSigners(shardID,privateKey3,aggregatePubKeyOfThreeFriends,arrayOfAfkSigners,nonce,fee,recipient,amountInKLY);


console.log('\n============ Partial signatures ============\n');
console.log(`[0] ${signature1}`);
console.log(`[1] ${signature2}`);
console.log(`[2] ${signature3}`);


// Now, build the transaction, aggregate signatures and send to network

let aggregatedSignatureOfActive = crypto.bls.aggregateSignatures([signature1,signature2,signature3]);

let finalTx = await web1337.createMultisigTransaction(from,aggregatePubKeyOfThreeFriends,aggregatedSignatureOfActive,arrayOfAfkSigners,nonce,fee,recipient,amountInKLY);



console.log('\n============ Final signed tx ready to be deployed ============\n');
console.log(finalTx);

Output:

============ Partial signatures ============

[0] pmrIRfD4+F9bn4zh79wnsc06Q4qaaKO6i305OCoths7orSLMYuM2Drvt4D05mjEyBwku7ePFXubj++syTgf9go8S9ZKexLh9BGlxjzjJB8o41437wAYUNexqeDHsAM3k
[1] gpveFYOucx7yW9ON0vLRUpnkBmDcJL1cAuHee8glj6w1JCmeDf5gQvUbfgtJHI7ACBHjViGe0kE8tks1gRfxknklaJ9e4y4rtCipXUBYr/nYkSHhCSpOFqUm/hO43LF1
[2] kbwUBydyWyPF4/ufRTSSvTIL2mPNyynKHsZdoS+b4sHplZTwKZs6lqtebBmTzadZE0TqtxTXxATe6WdSfipS5Ky8zAdBHH4FvbFFhhpoBOr4lbBit8gPpqkDCbvH6FNq

============ Final signed tx ready to be deployed ============

{
  v: 0,
  creator: '68Bpgi6MbRX9q3T9h8DDWomPGu85HqWSfPMT23r6g29xyn1dN7qfquwxpfFNMdMpU1',
  type: 'TX',
  nonce: 0,
  fee: 1,
  payload: {
    type: 'M',
    active: '6Li9DhTfbx9f6Z964ApK6b8Y6MZGrgik2Gf2scXM1bTKsKBddiLL4Duba8qP1rLK26',
    afk: [
      '61tPxmio9Y21GtkiyYG3qTkreKfqm6ktk7MVk2hxqiXVURXxM6qNb9vPfvPPbhpMDn'
    ],
    to: 'nXSYHp74u88zKPiRi7t22nv4WCBHXUBpGrVw3V93f2s',
    amount: 13.37
  },
  sig: 'lWGvpM+eKRc3bz0SXp6hX/8zxcASlp1A/ip/RrcRkqDaBpR3QJ8OIeTiD7V1Xm05FjudsOVADJJJP/Cvrx//cn8t2gdDu00zMbCmqreCDu4Hq1Ap8ZTSwFIpIINKf5my'
}

Now, you can deploy this transaction:

let result = await web1337.sendTransaction(finalTx)

BLS => BLS(multisig address) transaction

import Web1337,{crypto} from 'web1337';


let web1337 = new Web1337({

    symbioteID:'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',
    workflowVersion:0,
    nodeURL: 'http://localhost:7332'

});



const publicKey1 = '6Pz5B3xLQKDxtnESqk3tWnsd4kwkVYLNsvgKJy31HssK3eGSy7Tvratk5pZNFW5z8S';
const privateKey1 = '6bcdb86cd8f9d24e9fe934905431de5c224499af8788bf12cae8597f0af4cb23';

const publicKey2 = '5uj1Sgrvo9mwF6v8Z3Kxe4arQcu53Q2z9QBYsRPWCdo972jBeL8hD3Kmo4So3dSLt5';
const privateKey2 = 'e5ca94e2c60cbb3ca9d5f9c233a99f01e3250ef62bd48fbc09caf25ae70040b5';

const publicKey3 = '6ZmLf52hp5FgCxuaNJ6Jmi2M7FSJTr115WRMuV1yCvEihepnEKJBhgopDMpUKLpe2F';
const privateKey3 = 'ead8698b5ef285e6019e22e54dfe2c592c020946e803df8c6e79f98baf849d48';

const publicKey4 = '61tPxmio9Y21GtkiyYG3qTkreKfqm6ktk7MVk2hxqiXVURXxM6qNb9vPfvPPbhpMDn';
const privateKey4 = '414230b72c59ac8db6ec47b629607057edaa5c7c553d44b4b9fd1c0090141c5a';

// General pubkey retrieved from 4 friends public keys
const rootPubKey = crypto.bls.aggregatePublicKeys([publicKey1,publicKey2,publicKey3,publicKey4]);

// Root pubkey of 3 friends who want to use account
const aggregatePubKeyOfThreeFriends = crypto.bls.aggregatePublicKeys([publicKey1,publicKey2,publicKey3]);

// Array of pubkeys of friends who dissenting to sign
const arrayOfAfkSigners = [publicKey4];


// ID of shard where you want to transfer KLY or call contract
const shardID = '7GPupbq1vtKUgaqVeHiDbEJcxS7sSjwPnbht4eRaDBAEJv8ZKHNCSu2Am3CuWnHjta';

// Now it's multisig
const recipient = '7QMxLg6GJwQYjc8B2WBEvaQq3TfeBhgBqHGneFu43oLfwhovrPGykbkUGe94FacSuG';

// Since recipient is multisig - add the final <rev_t> param. Imagine that in this case it's 1(for example, when 2/3, so 1 address of 3 can be dissenting)
const rev_t = 1;

const from = rootPubKey;

const nonce = 0;

const fee = 1;

const amountInKLY = 13.37;


// Now 3 sides need to sign the same tx data locally(on their devices)

let signature1 = await web1337.signDataForMultisigTxAsOneOfTheActiveSigners(shardID,privateKey1,aggregatePubKeyOfThreeFriends,arrayOfAfkSigners,nonce,fee,recipient,amountInKLY,rev_t);

let signature2 = await web1337.signDataForMultisigTxAsOneOfTheActiveSigners(shardID,privateKey2,aggregatePubKeyOfThreeFriends,arrayOfAfkSigners,nonce,fee,recipient,amountInKLY,rev_t);

let signature3 = await web1337.signDataForMultisigTxAsOneOfTheActiveSigners(shardID,privateKey3,aggregatePubKeyOfThreeFriends,arrayOfAfkSigners,nonce,fee,recipient,amountInKLY,rev_t);


console.log('\n============ Partial signatures ============\n');
console.log(`[0] ${signature1}`);
console.log(`[1] ${signature2}`);
console.log(`[2] ${signature3}`);


// Now, build the transaction, aggregate signatures and send to network

let aggregatedSignatureOfActive = crypto.bls.aggregateSignatures([signature1,signature2,signature3]);

let finalTx = await web1337.createMultisigTransaction(from,aggregatePubKeyOfThreeFriends,aggregatedSignatureOfActive,arrayOfAfkSigners,nonce,fee,recipient,amountInKLY,rev_t);



console.log('\n============ Final signed tx ready to be deployed ============\n');
console.log(finalTx);

Output:

============ Partial signatures ============

[0] mcJ1bbEGPmSb0hKDlNUkPKfk+lSKU+KABoc10GRxJtK/4Ak9U7pdAXtS+UV6M9RqGIHZ/kAV7oi3wr8B0TURerUWxYgl/WQjKinIyGPmJJmd5RNHyYkgr+N5GeS3/KzG
[1] sSOR7RPtWbtTAgw41R146x85Xdg9JCnCGAQ1/kzE0LsyDpdtFTisQ1Y+5/J9mlsBBY6EmiQopGHT/puSIZGR76/ErG7FJnpTnh6dAyW4xyidT5/8Zv4VAYPsBGXdlnsZ
[2] spfLhunZ8GhDGB5LiUwwL1jZp0ZFzMXlhfwPvsFQvOc7Ef5DMgv3YZIUK3JK+IalAZivbPHHPGp9tN15rPdh4SeHXEz/6DuoUhzrr0Syr9Ze9a//qeHQ5DvhEIvg9Lrq

============ Final signed tx ready to be deployed ============

{
  v: 0,
  creator: '68Bpgi6MbRX9q3T9h8DDWomPGu85HqWSfPMT23r6g29xyn1dN7qfquwxpfFNMdMpU1',
  type: 'TX',
  nonce: 0,
  fee: 1,
  payload: {
    type: 'M',
    active: '6Li9DhTfbx9f6Z964ApK6b8Y6MZGrgik2Gf2scXM1bTKsKBddiLL4Duba8qP1rLK26',
    afk: [
      '61tPxmio9Y21GtkiyYG3qTkreKfqm6ktk7MVk2hxqiXVURXxM6qNb9vPfvPPbhpMDn'
    ],
    to: '7QMxLg6GJwQYjc8B2WBEvaQq3TfeBhgBqHGneFu43oLfwhovrPGykbkUGe94FacSuG',
    amount: 13.37,
    rev_t: 1
  },
  sig: 'iXJTgKSBfsykK9upqWBAeb/D+FF0t0Ho6NwxyvqsSOQCGs/bvtabqLIvuVztk/EmGC+hnKPD/PTJaop5xP1wx0yVQXvcivWb7dLvoWHmdr25p8uZk5YMD9d0gFZY+txE'
}

BLS => TBLS(thresholdsig address) transaction

Here we omit the part of explanations because you just need to know the TBLS root public key of group to send transactions to.

import Web1337,{crypto} from 'web1337';


let web1337 = new Web1337({

    symbioteID:'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',
    workflowVersion:0,
    nodeURL: 'http://localhost:7332'

});



const publicKey1 = '6Pz5B3xLQKDxtnESqk3tWnsd4kwkVYLNsvgKJy31HssK3eGSy7Tvratk5pZNFW5z8S';
const privateKey1 = '6bcdb86cd8f9d24e9fe934905431de5c224499af8788bf12cae8597f0af4cb23';

const publicKey2 = '5uj1Sgrvo9mwF6v8Z3Kxe4arQcu53Q2z9QBYsRPWCdo972jBeL8hD3Kmo4So3dSLt5';
const privateKey2 = 'e5ca94e2c60cbb3ca9d5f9c233a99f01e3250ef62bd48fbc09caf25ae70040b5';

const publicKey3 = '6ZmLf52hp5FgCxuaNJ6Jmi2M7FSJTr115WRMuV1yCvEihepnEKJBhgopDMpUKLpe2F';
const privateKey3 = 'ead8698b5ef285e6019e22e54dfe2c592c020946e803df8c6e79f98baf849d48';

const publicKey4 = '61tPxmio9Y21GtkiyYG3qTkreKfqm6ktk7MVk2hxqiXVURXxM6qNb9vPfvPPbhpMDn';
const privateKey4 = '414230b72c59ac8db6ec47b629607057edaa5c7c553d44b4b9fd1c0090141c5a';

// General pubkey retrieved from 4 friends public keys
const rootPubKey = crypto.bls.aggregatePublicKeys([publicKey1,publicKey2,publicKey3,publicKey4]);

// Root pubkey of 3 friends who want to use account
const aggregatePubKeyOfThreeFriends = crypto.bls.aggregatePublicKeys([publicKey1,publicKey2,publicKey3]);

// Array of pubkeys of friends who dissenting to sign
const arrayOfAfkSigners = [publicKey4];


// ID of shard where you want to transfer KLY or call contract
const shardID = '7GPupbq1vtKUgaqVeHiDbEJcxS7sSjwPnbht4eRaDBAEJv8ZKHNCSu2Am3CuWnHjta';

// Now it's TBLS
const recipient = 'bedc88644f0deea4c0a77ba687712f494a1af7d8869f09768a0db42284f89d17b7b9225e0c87c2cb5511907dfd5eae3a53d789298721039e833770de29595880';

const from = rootPubKey;

const nonce = 0;

const fee = 1;

const amountInKLY = 13.37;


// Now 3 sides need to sign the same tx data locally(on their devices)

let signature1 = await web1337.signDataForMultisigTxAsOneOfTheActiveSigners(shardID,privateKey1,aggregatePubKeyOfThreeFriends,arrayOfAfkSigners,nonce,fee,recipient,amountInKLY);

let signature2 = await web1337.signDataForMultisigTxAsOneOfTheActiveSigners(shardID,privateKey2,aggregatePubKeyOfThreeFriends,arrayOfAfkSigners,nonce,fee,recipient,amountInKLY);

let signature3 = await web1337.signDataForMultisigTxAsOneOfTheActiveSigners(shardID,privateKey3,aggregatePubKeyOfThreeFriends,arrayOfAfkSigners,nonce,fee,recipient,amountInKLY);


console.log('\n============ Partial signatures ============\n');
console.log(`[0] ${signature1}`);
console.log(`[1] ${signature2}`);
console.log(`[2] ${signature3}`);


// Now, build the transaction, aggregate signatures and send to network

let aggregatedSignatureOfActive = crypto.bls.aggregateSignatures([signature1,signature2,signature3]);

let finalTx = await web1337.createMultisigTransaction(from,aggregatePubKeyOfThreeFriends,aggregatedSignatureOfActive,arrayOfAfkSigners,nonce,fee,recipient,amountInKLY);



console.log('\n============ Final signed tx ready to be deployed ============\n');
console.log(finalTx);

Output:

============ Partial signatures ============

[0] qA5ToDOzpWAYLHY2LB2HuMqxmEXHFyXpKYhFr/0lQe7sF+BLpwKjsN17qBi54aRRGZtFGcOPDfxmGmx59z5qyJPjB1vY/kkiBrFLPE+UqnxRfRY5m+17msu+gagr67zU
[1] hKY+R9E1RTSWg8DnCO7QW4EU8s+jE+MiWTaq7rwg9LMMrCFQc/Cn+wBJf7CJBJh3AGoeO2/sUCdCoNemjY8yMk3XkevWF1r9kqMhsX3PQyr0CI5YR42pOpS3mK2xtGew
[2] mIUSk/MjcEC1y0dtZ2vgXUuV1IJtIanWNxVJ+wSG0U053L5/cbBr3BycRUPRx/5oENz4+6z0ToQL1OSesHHxtFsTUUyfhI9k7E1YPAgJ+zAvvi0ObzeUM3LThWkhP4OA

============ Final signed tx ready to be deployed ============

{
  v: 0,
  creator: '68Bpgi6MbRX9q3T9h8DDWomPGu85HqWSfPMT23r6g29xyn1dN7qfquwxpfFNMdMpU1',
  type: 'TX',
  nonce: 0,
  fee: 1,
  payload: {
    type: 'M',
    active: '6Li9DhTfbx9f6Z964ApK6b8Y6MZGrgik2Gf2scXM1bTKsKBddiLL4Duba8qP1rLK26',
    afk: [
      '61tPxmio9Y21GtkiyYG3qTkreKfqm6ktk7MVk2hxqiXVURXxM6qNb9vPfvPPbhpMDn'
    ],
    to: 'bedc88644f0deea4c0a77ba687712f494a1af7d8869f09768a0db42284f89d17b7b9225e0c87c2cb5511907dfd5eae3a53d789298721039e833770de29595880',
    amount: 13.37
  },
  sig: 'ugCi0fPlhXJFa0xwHQBCsJ+p+vjZtM0ebD2JMXJLZYaphx1Wm0Sc9aJKV5ed9EFiB+ov9z/AqSg4vakie+wieu5TCRNrxg30/hJaMwrfWzIjdctn/u7QufFViJBC3XND'
}

BLS => PostQuantum(Dilithium/BLISS) transaction

Here we omit the part of explanations because you just need to know the hash of public key to send transactions to.

import Web1337,{crypto} from 'web1337';


let web1337 = new Web1337({

    symbioteID:'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',
    workflowVersion:0,
    nodeURL: 'http://localhost:7332'

});



const publicKey1 = '6Pz5B3xLQKDxtnESqk3tWnsd4kwkVYLNsvgKJy31HssK3eGSy7Tvratk5pZNFW5z8S';
const privateKey1 = '6bcdb86cd8f9d24e9fe934905431de5c224499af8788bf12cae8597f0af4cb23';

const publicKey2 = '5uj1Sgrvo9mwF6v8Z3Kxe4arQcu53Q2z9QBYsRPWCdo972jBeL8hD3Kmo4So3dSLt5';
const privateKey2 = 'e5ca94e2c60cbb3ca9d5f9c233a99f01e3250ef62bd48fbc09caf25ae70040b5';

const publicKey3 = '6ZmLf52hp5FgCxuaNJ6Jmi2M7FSJTr115WRMuV1yCvEihepnEKJBhgopDMpUKLpe2F';
const privateKey3 = 'ead8698b5ef285e6019e22e54dfe2c592c020946e803df8c6e79f98baf849d48';

const publicKey4 = '61tPxmio9Y21GtkiyYG3qTkreKfqm6ktk7MVk2hxqiXVURXxM6qNb9vPfvPPbhpMDn';
const privateKey4 = '414230b72c59ac8db6ec47b629607057edaa5c7c553d44b4b9fd1c0090141c5a';

// General pubkey retrieved from 4 friends public keys
const rootPubKey = crypto.bls.aggregatePublicKeys([publicKey1,publicKey2,publicKey3,publicKey4]);

// Root pubkey of 3 friends who want to use account
const aggregatePubKeyOfThreeFriends = crypto.bls.aggregatePublicKeys([publicKey1,publicKey2,publicKey3]);

// Array of pubkeys of friends who dissenting to sign
const arrayOfAfkSigners = [publicKey4];


// ID of shard where you want to transfer KLY or call contract
const shardID = '7GPupbq1vtKUgaqVeHiDbEJcxS7sSjwPnbht4eRaDBAEJv8ZKHNCSu2Am3CuWnHjta';

// Now it's PQC
const recipient = 'f5091405e28455880fc4191cbda9f1e57f72399e732222d4639294b66d3a5076';

const from = rootPubKey;

const nonce = 0;

const fee = 1;

const amountInKLY = 13.37;


// Now 3 sides need to sign the same tx data locally(on their devices)

let signature1 = await web1337.signDataForMultisigTxAsOneOfTheActiveSigners(shardID,privateKey1,aggregatePubKeyOfThreeFriends,arrayOfAfkSigners,nonce,fee,recipient,amountInKLY);

let signature2 = await web1337.signDataForMultisigTxAsOneOfTheActiveSigners(shardID,privateKey2,aggregatePubKeyOfThreeFriends,arrayOfAfkSigners,nonce,fee,recipient,amountInKLY);

let signature3 = await web1337.signDataForMultisigTxAsOneOfTheActiveSigners(shardID,privateKey3,aggregatePubKeyOfThreeFriends,arrayOfAfkSigners,nonce,fee,recipient,amountInKLY);


console.log('\n============ Partial signatures ============\n');
console.log(`[0] ${signature1}`);
console.log(`[1] ${signature2}`);
console.log(`[2] ${signature3}`);


// Now, build the transaction, aggregate signatures and send to network

let aggregatedSignatureOfActive = crypto.bls.aggregateSignatures([signature1,signature2,signature3]);

let finalTx = await web1337.createMultisigTransaction(from,aggregatePubKeyOfThreeFriends,aggregatedSignatureOfActive,arrayOfAfkSigners,nonce,fee,recipient,amountInKLY);



console.log('\n============ Final signed tx ready to be deployed ============\n');
console.log(finalTx);

Output:

============ Partial signatures ============

[0] k9/aKDekSg61Q/YYcFcwxqIKYFo6FCLYBQQ7T3Sqo4z/a0d3SmSN7bjK/e0g02EnGRcdngynj5ysK8sbYggk4XxJL/dhaKflkVRiKcyHn7iWuDxCVwIwaLDJz0jLWF7z
[1] suEEb7Tq6aQYpLV8HUe817WFpERqRsxsAivv2UdWdgA019BD1jsnZZAq524rgFMmGQl/TZQsTBVw6EvMul3/UTu2PU7EKeqof+Id/J+qfW269j7zrQciPu/tQLHXb6zw
[2] sd98Ri/V6H2Ww5JH4c+jKwA8Q3sajL9gtruYc/MDWHT5gX8p9wUV8dhhqowKtCAsDy3TdF9SuCh5cjggLaH/fsQuCyPU4w07wRnqteo926KVG02B/4Kt+Bm0zej7mLdT

============ Final signed tx ready to be deployed ============

{
  v: 0,
  creator: '68Bpgi6MbRX9q3T9h8DDWomPGu85HqWSfPMT23r6g29xyn1dN7qfquwxpfFNMdMpU1',
  type: 'TX',
  nonce: 0,
  fee: 1,
  payload: {
    type: 'M',
    active: '6Li9DhTfbx9f6Z964ApK6b8Y6MZGrgik2Gf2scXM1bTKsKBddiLL4Duba8qP1rLK26',
    afk: [
      '61tPxmio9Y21GtkiyYG3qTkreKfqm6ktk7MVk2hxqiXVURXxM6qNb9vPfvPPbhpMDn'
    ],
    to: 'f5091405e28455880fc4191cbda9f1e57f72399e732222d4639294b66d3a5076',
    amount: 13.37
  },
  sig: 'i1JskWEYiJvJQDMhi4rDBUI1he8kefOOiDJJa4fYoTxrPBVtIzSK5FXlBnGeEKwXDiw+c9bzYpMcMqu8LGJ8Pm7cWjCP6DYhKBnFqBN5Bs5tvngF+UWmPg8xzgeWejEg'
}

Last updated