Skip to content

Commit 2acc455

Browse files
authored
feat: asset lock special transaction (#288)
* feat: asset lock tx payload * refactor: get rid of SubTxRegisterPayload * refactor: removed rest legacy platform special transactions * refactor: unused code
1 parent b98bf01 commit 2acc455

29 files changed

+527
-3999
lines changed

docs/usage/transaction.md

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -444,14 +444,6 @@ The argument function MUST NOT modify the order of the original array
444444
**Parameters**: None.
445445
**Returns**: Array
446446

447-
## .canHaveNoUtxo()
448-
449-
**Description**:
450-
451-
**Parameters**: None.
452-
453-
**Returns**: Boolean
454-
455447
## .toObject() / .toJSON()
456448

457449
**Description**: Will return an object representation of the transaction

index.d.ts

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -64,11 +64,6 @@ export { ProRegTxPayload } from './typings/transaction/payload/ProRegTxPayload';
6464
export { ProUpRegTxPayload } from './typings/transaction/payload/ProUpRegTxPayload';
6565
export { ProUpRevTxPayload } from './typings/transaction/payload/ProUpRevTxPayload';
6666
export { ProUpServTxPayload } from './typings/transaction/payload/ProUpServTxPayload';
67-
export { SubTxCloseAccountPayload } from './typings/transaction/payload/SubTxCloseAccountPayload';
68-
export { SubTxRegisterPayload } from './typings/transaction/payload/SubTxRegisterPayload';
69-
export { SubTxResetKeyPayload } from './typings/transaction/payload/SubTxResetKeyPayload';
70-
export { SubTxTopupPayload } from './typings/transaction/payload/SubTxTopupPayload';
71-
export { SubTxTransitionPayload } from './typings/transaction/payload/SubTxTransitionPayload';
7267

7368
export { Output } from './typings/transaction/Output';
7469

lib/constants/index.js

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,7 @@ module.exports = {
2424
TRANSACTION_PROVIDER_UPDATE_REVOKE: 4,
2525
TRANSACTION_COINBASE: 5,
2626
TRANSACTION_QUORUM_COMMITMENT: 6,
27-
TRANSACTION_SUBTX_REGISTER: 8,
28-
TRANSACTION_SUBTX_TOPUP: 9,
29-
TRANSACTION_SUBTX_RESETKEY: 10,
30-
TRANSACTION_SUBTX_CLOSEACCOUNT: 11,
31-
TRANSACTION_SUBTX_TRANSITION: 12,
27+
TRANSACTION_ASSET_LOCK: 8,
3228
},
3329
EMPTY_SIGNATURE_SIZE: 0,
3430
primitives: {
Lines changed: 172 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,172 @@
1+
/* eslint-disable */
2+
// TODO: Remove previous line and work through linting issues at next edit
3+
4+
var Preconditions = require('../../util/preconditions');
5+
var BufferWriter = require('../../encoding/bufferwriter');
6+
var BufferReader = require('../../encoding/bufferreader');
7+
var AbstractPayload = require('./abstractpayload');
8+
var utils = require('../../util/js');
9+
const _ = require('lodash');
10+
const Output = require('../output');
11+
12+
var isUnsignedInteger = utils.isUnsignedInteger;
13+
14+
var CURRENT_PAYLOAD_VERSION = 1;
15+
16+
/**
17+
* @typedef {Object} AssetLockPayloadJSON
18+
* @property {number} version
19+
* @property {object} creditOutputs
20+
*/
21+
22+
/**
23+
* @class AssetLockPayload
24+
* @property {Output[]} creditOutputs
25+
*/
26+
function AssetLockPayload() {
27+
AbstractPayload.call(this);
28+
this.version = CURRENT_PAYLOAD_VERSION;
29+
this.creditOutputs = [];
30+
}
31+
32+
AssetLockPayload.prototype = Object.create(AbstractPayload.prototype);
33+
AssetLockPayload.prototype.constructor = AbstractPayload;
34+
35+
/* Static methods */
36+
37+
/**
38+
* Parse raw transition payload
39+
* @param {Buffer} rawPayload
40+
* @return {AssetLockPayload}
41+
*/
42+
AssetLockPayload.fromBuffer = function (rawPayload) {
43+
var payloadBufferReader = new BufferReader(rawPayload);
44+
var payload = new AssetLockPayload();
45+
payload.version = payloadBufferReader.readUInt8();
46+
var numCreditOutputs = payloadBufferReader.readVarintNum();
47+
for (var i = 0; i < numCreditOutputs; i++) {
48+
payload.creditOutputs.push(Output.fromBufferReader(payloadBufferReader));
49+
}
50+
51+
if (!payloadBufferReader.finished()) {
52+
throw new Error(
53+
'Failed to parse payload: raw payload is bigger than expected.'
54+
);
55+
}
56+
57+
payload.validate();
58+
return payload;
59+
};
60+
61+
/**
62+
* Create new instance of payload from JSON
63+
* @param {string|AssetLockPayloadJSON} payloadJson
64+
* @return {AssetLockPayload}
65+
*/
66+
AssetLockPayload.fromJSON = function fromJSON(payloadJson) {
67+
var payload = new AssetLockPayload();
68+
payload.version = payloadJson.version;
69+
70+
var creditOutputs = [];
71+
_.each(payloadJson.creditOutputs, function (output) {
72+
creditOutputs.push(new Output(output));
73+
});
74+
75+
payload.creditOutputs = creditOutputs;
76+
77+
payload.validate();
78+
return payload;
79+
};
80+
81+
/* Instance methods */
82+
83+
/**
84+
* Validates payload data
85+
* @return {boolean}
86+
*/
87+
AssetLockPayload.prototype.validate = function () {
88+
Preconditions.checkArgument(
89+
isUnsignedInteger(this.version),
90+
'Expect version to be an unsigned integer'
91+
);
92+
93+
Preconditions.checkArgument(
94+
this.version !== 0 && this.version <= CURRENT_PAYLOAD_VERSION,
95+
'Invalid version'
96+
);
97+
98+
Preconditions.checkArgument(
99+
this.creditOutputs.length > 0,
100+
'Empty credit outputs'
101+
);
102+
103+
_.each(this.creditOutputs, function (output, index) {
104+
Preconditions.checkArgument(
105+
output instanceof Output,
106+
'Credit output ' + index + ' is not an instance of Output'
107+
);
108+
});
109+
110+
_.each(this.creditOutputs, function (output, index) {
111+
Preconditions.checkArgument(
112+
output.script.isPublicKeyHashOut(),
113+
'Credit output ' + index + ' is not P2PKH'
114+
);
115+
});
116+
117+
_.each(this.creditOutputs, function (output, index) {
118+
Preconditions.checkArgument(
119+
output.script.isPublicKeyHashOut(),
120+
'Credit output ' + index + ' is not P2PKH'
121+
);
122+
});
123+
124+
return true;
125+
};
126+
127+
/**
128+
* Serializes payload to JSON
129+
* @return {AssetLockPayloadJSON}
130+
*/
131+
AssetLockPayload.prototype.toJSON = function toJSON() {
132+
this.validate();
133+
const creditOutputs = [];
134+
_.each(this.creditOutputs, function (output) {
135+
creditOutputs.push(output.toJSON());
136+
});
137+
var json = {
138+
version: this.version,
139+
creditOutputs
140+
};
141+
142+
return json;
143+
};
144+
145+
/**
146+
* Serialize payload to buffer
147+
* @return {Buffer}
148+
*/
149+
AssetLockPayload.prototype.toBuffer = function toBuffer() {
150+
this.validate();
151+
var payloadBufferWriter = new BufferWriter();
152+
153+
payloadBufferWriter
154+
.writeUInt8(this.version)
155+
.writeVarintNum(this.creditOutputs.length);
156+
157+
_.each(this.creditOutputs, function (output) {
158+
output.toBufferWriter(payloadBufferWriter);
159+
});
160+
161+
return payloadBufferWriter.toBuffer();
162+
};
163+
164+
/**
165+
* Copy payload instance
166+
* @return {AssetLockPayload}
167+
*/
168+
AssetLockPayload.prototype.copy = function copy() {
169+
return AssetLockPayload.fromJSON(this.toJSON());
170+
};
171+
172+
module.exports = AssetLockPayload;

lib/transaction/payload/index.js

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,9 @@ Payload.ProRegTxPayload = require('./proregtxpayload');
77
Payload.ProUpRegTxPayload = require('./proupregtxpayload');
88
Payload.ProUpRevTxPayload = require('./prouprevtxpayload');
99
Payload.ProTxUpServPayload = require('./proupservtxpayload');
10-
Payload.SubTxCloseAccountPayload = require('./subtxcloseaccountpayload');
11-
Payload.SubTxRegisterPayload = require('./subtxregisterpayload');
12-
Payload.SubTxResetKeyPayload = require('./subtxresetkeypayload');
13-
Payload.SubTxTopupPayload = require('./subtxtopuppayload');
14-
Payload.SubTxTransitionPayload = require('./subtxtransitionpayload');
1510
Payload.CoinbasePayload = require('./coinbasepayload');
1611
Payload.constants = require('../../constants');
1712
Payload.CommitmentTxPayload = require('./commitmenttxpayload');
13+
Payload.AssetLockPayload = require('./assetlockpayload');
1814

1915
module.exports = Payload;

lib/transaction/payload/payload.js

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,29 +4,15 @@
44
var RegisteredPayloadTypes =
55
require('../../constants').registeredTransactionTypes;
66
var AbstractPayload = require('./abstractpayload');
7-
var SubTxCloseAccountPayload = require('./subtxcloseaccountpayload');
8-
var SubTxRegisterPayload = require('./subtxregisterpayload');
9-
var SubTxResetKeyPayload = require('./subtxresetkeypayload');
10-
var SubTxTopUpPayload = require('./subtxtopuppayload');
11-
var SubTxTransitionPayload = require('./subtxtransitionpayload');
127
var CoinbasePayload = require('./coinbasepayload');
138
var CommitmentTxPayload = require('./commitmenttxpayload');
149
var ProRegTxPayload = require('./proregtxpayload');
1510
var ProTxUpServPayload = require('./proupservtxpayload');
1611
var ProUpRegTxPayload = require('./proupregtxpayload');
1712
var ProUpRevTxPayload = require('./prouprevtxpayload');
13+
var AssetLockPayload = require('./assetlockpayload');
1814

1915
var PayloadClasses = {};
20-
PayloadClasses[RegisteredPayloadTypes.TRANSACTION_SUBTX_CLOSEACCOUNT] =
21-
SubTxCloseAccountPayload;
22-
PayloadClasses[RegisteredPayloadTypes.TRANSACTION_SUBTX_REGISTER] =
23-
SubTxRegisterPayload;
24-
PayloadClasses[RegisteredPayloadTypes.TRANSACTION_SUBTX_RESETKEY] =
25-
SubTxResetKeyPayload;
26-
PayloadClasses[RegisteredPayloadTypes.TRANSACTION_SUBTX_TOPUP] =
27-
SubTxTopUpPayload;
28-
PayloadClasses[RegisteredPayloadTypes.TRANSACTION_SUBTX_TRANSITION] =
29-
SubTxTransitionPayload;
3016
PayloadClasses[RegisteredPayloadTypes.TRANSACTION_COINBASE] = CoinbasePayload;
3117
PayloadClasses[RegisteredPayloadTypes.TRANSACTION_QUORUM_COMMITMENT] =
3218
CommitmentTxPayload;
@@ -38,6 +24,8 @@ PayloadClasses[RegisteredPayloadTypes.TRANSACTION_PROVIDER_UPDATE_REGISTRAR] =
3824
ProUpRegTxPayload;
3925
PayloadClasses[RegisteredPayloadTypes.TRANSACTION_PROVIDER_UPDATE_REVOKE] =
4026
ProUpRevTxPayload;
27+
PayloadClasses[RegisteredPayloadTypes.TRANSACTION_ASSET_LOCK] =
28+
AssetLockPayload;
4129

4230
/**
4331
*

0 commit comments

Comments
 (0)