Skip to content

Instantly share code, notes, and snippets.

@planethouki
Last active February 7, 2019 12:49
Show Gist options
  • Save planethouki/5c66a0b5beb0fa5b6fa74ac2d3542ad8 to your computer and use it in GitHub Desktop.
Save planethouki/5c66a0b5beb0fa5b6fa74ac2d3542ad8 to your computer and use it in GitHub Desktop.
NEM2カタパルトで双方向ペイメントチャネルするには その2 トランザクションは作れるのか ref: https://qiita.com/planethouki/items/53415a14b34bebd450fc
function createOpeningTransaction(multisigPublicAccount, account1, account2, accountG) {
return new Promise((resolve, reject) => {
const account1Tx = TransferTransaction.create(
Deadline.create(),
multisigPublicAccount.address,
[XEM.createRelative(5)],
PlainMessage.create('opening tx 5XEM'),
NetworkType.MIJIN_TEST,
);
const publicAccount2Tx = TransferTransaction.create(
Deadline.create(),
multisigPublicAccount.address,
[XEM.createRelative(5)],
PlainMessage.create('opening tx 5XEM'),
NetworkType.MIJIN_TEST,
);
const opningTransaction = AggregateTransaction.createBonded(
Deadline.create(),
[
account1Tx.toAggregate(account1.publicAccount),
publicAccount2Tx.toAggregate(account2.publicAccount),
],
NetworkType.MIJIN_TEST
);
const signedTransaction = account1.sign(opningTransaction);
console.log(signedTransaction.hash);
const lockFundsTransaction = LockFundsTransaction.create(
Deadline.create(),
XEM.createRelative(10),
UInt64.fromUint(480),
signedTransaction,
NetworkType.MIJIN_TEST
);
const signedLockFundsTransaction = accountG.sign(lockFundsTransaction);
console.log(signedLockFundsTransaction.hash);
const cosignAggregateBondedTransaction = function(transaction, account) {
const cosignatureTransaction = CosignatureTransaction.create(transaction);
const signedTransaction = account.signCosignatureTransaction(cosignatureTransaction);
return signedTransaction;
};
const listener = new Listener(ENDPOINT);
const transactionHttp = new TransactionHttp(ENDPOINT);
listener.open().then(() => {
transactionHttp.announce(signedLockFundsTransaction).subscribe(
x => console.log(x),
err => console.error(err)
);
listener.confirmed(accountG.address).pipe(
filter((transaction) => transaction.transactionInfo !== undefined
&& transaction.transactionInfo.hash === signedLockFundsTransaction.hash),
flatMap(ignored => transactionHttp.announceAggregateBonded(signedTransaction))
).subscribe(
x => console.log(x),
err => console.error(err)
);
listener.aggregateBondedAdded(account2.address).pipe(
filter((_) => !_.signedByAccount(account2.publicAccount)),
map(transaction => cosignAggregateBondedTransaction(transaction, account2)),
flatMap(cosignatureSignedTransaction => transactionHttp.announceAggregateBondedCosignature(cosignatureSignedTransaction))
).subscribe(
x => console.log(x),
err => console.error(err)
);
listener.confirmed(account1.address).pipe(
filter((transaction) => transaction.transactionInfo !== undefined
&& transaction.transactionInfo.hash === signedTransaction.hash)
).subscribe(
ignore => {
listener.close();
resolve();
},
err => console.error(err)
);
}).catch((error) => {
console.error(error);
});
});
}
function createCommitmentTransaction(multisigPublicAccount, account1, account2, accountG, amount1, amount2, secret) {
return new Promise((resolve, reject) => {
const account1Tx = TransferTransaction.create(
Deadline.create(),
account1.address,
[XEM.createRelative(amount1)],
PlainMessage.create(`commitment tx ${amount1}XEM`),
NetworkType.MIJIN_TEST,
);
const account2Tx = TransferTransaction.create(
Deadline.create(),
account2.address,
[XEM.createRelative(amount2)],
PlainMessage.create(`commitment tx ${amount2}XEM`),
NetworkType.MIJIN_TEST,
);
const secretLockTx = SecretLockTransaction.create(
Deadline.create(),
XEM.createRelative(amount2),
UInt64.fromUint(1000 * 10),
HashType.SHA3_512,
secret,
account1.address,
NetworkType.MIJIN_TEST
);
const commitmentTransaction = AggregateTransaction.createBonded(
Deadline.create(),
[
account1Tx.toAggregate(multisigPublicAccount),
account2Tx.toAggregate(multisigPublicAccount),
secretLockTx.toAggregate(account2.publicAccount),
],
NetworkType.MIJIN_TEST
);
const signedTransaction = account1.sign(commitmentTransaction);
console.log(signedTransaction.hash);
const lockFundsTransaction = LockFundsTransaction.create(
Deadline.create(),
XEM.createRelative(10),
UInt64.fromUint(480),
signedTransaction,
NetworkType.MIJIN_TEST
);
const signedLockFundsTransaction = accountG.sign(lockFundsTransaction);
console.log(signedLockFundsTransaction.hash);
const cosignAggregateBondedTransaction = function(transaction, account) {
const cosignatureTransaction = CosignatureTransaction.create(transaction);
const signedTransaction = account.signCosignatureTransaction(cosignatureTransaction);
return signedTransaction;
};
const listener = new Listener(ENDPOINT);
const transactionHttp = new TransactionHttp(ENDPOINT);
listener.open().then(() => {
transactionHttp.announce(signedLockFundsTransaction).subscribe(
x => console.log(x),
err => console.error(err)
);
listener.confirmed(accountG.address).pipe(
filter((transaction) => transaction.transactionInfo !== undefined
&& transaction.transactionInfo.hash === signedLockFundsTransaction.hash),
flatMap(ignored => transactionHttp.announceAggregateBonded(signedTransaction))
).subscribe(
x => console.log(x),
err => console.error(err)
);
listener.aggregateBondedAdded(account2.address).pipe(
filter((_) => !_.signedByAccount(account2.publicAccount)),
map(transaction => cosignAggregateBondedTransaction(transaction, account2)),
flatMap(cosignatureSignedTransaction => transactionHttp.announceAggregateBondedCosignature(cosignatureSignedTransaction))
).subscribe(
x => console.log(x),
err => console.error(err)
);
listener.confirmed(account1.address).pipe(
filter((transaction) => transaction.transactionInfo !== undefined
&& transaction.transactionInfo.hash === signedTransaction.hash)
).subscribe(
ignore => {
listener.close();
resolve();
},
err => console.error(err)
);
}).catch((error) => {
console.error(error);
});
});
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment