wallet-http: pass network to the transaction options validator.

This commit is contained in:
Nodari Chkuaselidze 2025-01-17 12:58:06 +04:00
parent dd7249f601
commit 1ccbb79efc
No known key found for this signature in database
GPG key ID: B018A7BB437D1F05
3 changed files with 49 additions and 36 deletions

View file

@ -5,12 +5,15 @@
.eslint*
.git*
.mocharc*
.nyc_output/
.yarnignore
bench/
browser/hsd*
build/
coverage/
docker_data/
docs/
eslint.config.cjs
node_modules/
npm-debug.log
package-lock.json

View file

@ -28,6 +28,9 @@ const HDPublicKey = require('../hd/public');
const {Resource} = require('../dns/resource');
const common = require('./common');
/** @typedef {import('../types').NetworkType} NetworkType */
/** @typedef {ReturnType<Validator['fromRequest']>} RequestValidator */
/**
* HTTP
* @alias module:wallet.HTTP
@ -459,7 +462,7 @@ class HTTP extends Server {
this.post('/wallet/:id/send', async (req, res) => {
const valid = Validator.fromRequest(req);
const options = TransactionOptions.fromValidator(valid);
const options = TransactionOptions.fromValidator(valid, this.network);
const tx = await req.wallet.send(options);
const details = await req.wallet.getDetails(tx.hash());
@ -474,7 +477,7 @@ class HTTP extends Server {
// TODO: Add create TX with locks for used Coins and/or
// adds to the pending list.
const options = TransactionOptions.fromValidator(valid);
const options = TransactionOptions.fromValidator(valid, this.network);
const tx = await req.wallet.createTX(options);
if (sign)
@ -496,12 +499,12 @@ class HTTP extends Server {
enforce(raw, 'TX is required.');
const tx = MTX.decode(raw);
tx.view = await req.wallet.getCoinView(tx);
const mtx = MTX.decode(raw);
mtx.view = await req.wallet.getCoinView(mtx);
await req.wallet.sign(tx, passphrase);
await req.wallet.sign(mtx, passphrase);
res.json(200, tx.getJSON(this.network));
res.json(200, mtx.getJSON(this.network));
});
// Zap Wallet TXs
@ -1072,7 +1075,7 @@ class HTTP extends Server {
enforce(name, 'Name is required.');
enforce(broadcast ? sign : true, 'Must sign when broadcasting.');
const options = TransactionOptions.fromValidator(valid);
const options = TransactionOptions.fromValidator(valid, this.network);
if (broadcast) {
// TODO: Add abort signal to close when request closes.
@ -1109,7 +1112,7 @@ class HTTP extends Server {
enforce(lockup != null, 'Lockup is required.');
enforce(broadcast ? sign : true, 'Must sign when broadcasting.');
const options = TransactionOptions.fromValidator(valid);
const options = TransactionOptions.fromValidator(valid, this.network);
if (broadcast) {
// TODO: Add abort signal to close when request closes.
@ -1148,7 +1151,7 @@ class HTTP extends Server {
enforce(broadcastBid != null, 'broadcastBid is required.');
enforce(broadcastBid ? sign : true, 'Must sign when broadcasting.');
const options = TransactionOptions.fromValidator(valid);
const options = TransactionOptions.fromValidator(valid, this.network);
const auctionTXs = await req.wallet.createAuctionTXs(
name,
bid,
@ -1189,7 +1192,7 @@ class HTTP extends Server {
enforce(broadcast ? sign : true, 'Must sign when broadcasting.');
const options = TransactionOptions.fromValidator(valid);
const options = TransactionOptions.fromValidator(valid, this.network);
if (broadcast) {
let tx;
@ -1235,7 +1238,7 @@ class HTTP extends Server {
enforce(broadcast ? sign : true, 'Must sign when broadcasting.');
const options = TransactionOptions.fromValidator(valid);
const options = TransactionOptions.fromValidator(valid, this.network);
if (broadcast) {
let tx;
@ -1291,7 +1294,7 @@ class HTTP extends Server {
return res.json(400);
}
const options = TransactionOptions.fromValidator(valid);
const options = TransactionOptions.fromValidator(valid, this.network);
if (broadcast) {
// TODO: Add abort signal to close when request closes.
@ -1324,7 +1327,7 @@ class HTTP extends Server {
enforce(broadcast ? sign : true, 'Must sign when broadcasting.');
enforce(name, 'Must pass name.');
const options = TransactionOptions.fromValidator(valid);
const options = TransactionOptions.fromValidator(valid, this.network);
if (broadcast) {
// TODO: Add abort signal to close when request closes.
@ -1358,7 +1361,7 @@ class HTTP extends Server {
enforce(address, 'Must pass address.');
const addr = Address.fromString(address, this.network);
const options = TransactionOptions.fromValidator(valid);
const options = TransactionOptions.fromValidator(valid, this.network);
if (broadcast) {
// TODO: Add abort signal to close when request closes.
@ -1391,7 +1394,7 @@ class HTTP extends Server {
enforce(broadcast ? sign : true, 'Must sign when broadcasting.');
enforce(name, 'Must pass name.');
const options = TransactionOptions.fromValidator(valid);
const options = TransactionOptions.fromValidator(valid, this.network);
if (broadcast) {
// TODO: Add abort signal to close when request closes.
@ -1424,7 +1427,7 @@ class HTTP extends Server {
enforce(broadcast ? sign : true, 'Must sign when broadcasting.');
enforce(name, 'Must pass name.');
const options = TransactionOptions.fromValidator(valid);
const options = TransactionOptions.fromValidator(valid, this.network);
if (broadcast) {
// TODO: Add abort signal to close when request closes.
@ -1455,7 +1458,7 @@ class HTTP extends Server {
enforce(broadcast ? sign : true, 'Must sign when broadcasting.');
enforce(name, 'Must pass name.');
const options = TransactionOptions.fromValidator(valid);
const options = TransactionOptions.fromValidator(valid, this.network);
if (broadcast) {
// TODO: Add abort signal to close when request closes.
@ -1571,7 +1574,6 @@ class HTTP extends Server {
/**
* Handle new websocket.
* @private
* @param {WebSocket} socket
*/
@ -1823,22 +1825,24 @@ class TransactionOptions {
* TransactionOptions
* @alias module:http.TransactionOptions
* @constructor
* @param {Validator} valid
* @param {RequestValidator} [valid]
* @param {(NetworkType|Network)?} [network]
*/
constructor(valid) {
constructor(valid, network) {
if (valid)
return this.fromValidator(valid);
return this.fromValidator(valid, network);
}
/**
* Inject properties from Validator.
* @private
* @param {Validator} valid
* @param {RequestValidator} valid
* @param {(NetworkType|Network)?} [network]
* @returns {TransactionOptions}
*/
fromValidator(valid) {
fromValidator(valid, network) {
assert(valid);
this.rate = valid.u64('rate');
@ -1863,10 +1867,11 @@ class TransactionOptions {
for (const output of outputs) {
const valid = new Validator(output);
let addr = valid.str('address');
const addrstr = valid.str('address');
let addr;
if (addr)
addr = Address.fromString(addr, this.network);
if (addrstr)
addr = Address.fromString(addrstr, network);
let covenant = valid.obj('covenant');
@ -1884,15 +1889,16 @@ class TransactionOptions {
return this;
}
/*
/**
* Instantiate transaction options
* from Validator.
* @param {Validator} valid
* @param {RequestValidator} [valid]
* @param {(NetworkType|Network)?} [network]
* @returns {TransactionOptions}
*/
static fromValidator(valid) {
return new this().fromValidator(valid);
static fromValidator(valid, network) {
return new this().fromValidator(valid, network);
}
}

View file

@ -525,18 +525,22 @@ describe('Wallet HTTP', function() {
it('should allow covenants with create tx', async () => {
const {address} = await wallet.createChange('default');
const output = openOutput(name, address);
const output = openOutput(name, address, network);
const tx = await wallet.createTX({outputs: [output]});
const tx = await wallet.createTX({
outputs: [output.getJSON(network)]
});
assert.equal(tx.outputs[0].covenant.type, types.OPEN);
});
it('should allow covenants with send tx', async () => {
const {address} = await wallet.createChange('default');
const output = openOutput(name, address);
const output = openOutput(name, address, network);
const tx = await wallet.send({outputs: [output]});;
const tx = await wallet.send({
outputs: [output.getJSON(network)]
});;
assert.equal(tx.outputs[0].covenant.type, types.OPEN);
});
@ -2703,12 +2707,12 @@ describe('Wallet HTTP', function() {
});
// create an OPEN output
function openOutput(name, address) {
function openOutput(name, address, network) {
const nameHash = rules.hashName(name);
const rawName = Buffer.from(name, 'ascii');
const output = new Output();
output.address = Address.fromString(address);
output.address = Address.fromString(address, network);
output.value = 0;
output.covenant.setOpen(nameHash, rawName);