@bitgo-beta/utxo-staking 1.1.1-beta.9 → 1.1.1-beta.900
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/scripts/babylon-sync.d.ts +2 -0
- package/dist/cjs/scripts/babylon-sync.d.ts.map +1 -0
- package/dist/cjs/scripts/babylon-sync.js +126 -0
- package/dist/cjs/src/babylon/delegationMessage.d.ts +38 -0
- package/dist/cjs/src/babylon/delegationMessage.d.ts.map +1 -0
- package/dist/cjs/src/babylon/delegationMessage.js +285 -0
- package/dist/cjs/src/babylon/descriptor.d.ts +48 -0
- package/dist/cjs/src/babylon/descriptor.d.ts.map +1 -0
- package/dist/cjs/src/babylon/descriptor.js +97 -0
- package/dist/cjs/src/babylon/index.d.ts +8 -0
- package/dist/cjs/src/babylon/index.d.ts.map +1 -0
- package/dist/cjs/src/babylon/index.js +51 -0
- package/dist/cjs/src/babylon/network.d.ts +7 -0
- package/dist/cjs/src/babylon/network.d.ts.map +1 -0
- package/dist/cjs/src/babylon/network.js +66 -0
- package/dist/cjs/src/babylon/params.mainnet.json +152 -0
- package/dist/cjs/src/babylon/params.testnet.json +212 -0
- package/dist/cjs/src/babylon/parseDescriptor.d.ts +26 -0
- package/dist/cjs/src/babylon/parseDescriptor.d.ts.map +1 -0
- package/dist/cjs/src/babylon/parseDescriptor.js +159 -0
- package/dist/cjs/src/babylon/stakingManager.d.ts +6 -0
- package/dist/cjs/src/babylon/stakingManager.d.ts.map +1 -0
- package/dist/cjs/src/babylon/stakingManager.js +120 -0
- package/dist/cjs/src/babylon/stakingParams.d.ts +40 -0
- package/dist/cjs/src/babylon/stakingParams.d.ts.map +1 -0
- package/dist/cjs/src/babylon/stakingParams.js +132 -0
- package/dist/cjs/src/babylon/undelegation/UndelegationResponse.d.ts +24 -0
- package/dist/cjs/src/babylon/undelegation/UndelegationResponse.d.ts.map +1 -0
- package/dist/cjs/src/babylon/undelegation/UndelegationResponse.js +55 -0
- package/dist/cjs/src/babylon/undelegation/index.d.ts +3 -0
- package/dist/cjs/src/babylon/undelegation/index.d.ts.map +1 -0
- package/dist/{src → cjs/src/babylon/undelegation}/index.js +3 -4
- package/dist/cjs/src/babylon/undelegation/unbonding.d.ts +16 -0
- package/dist/cjs/src/babylon/undelegation/unbonding.d.ts.map +1 -0
- package/dist/cjs/src/babylon/undelegation/unbonding.js +111 -0
- package/dist/{src → cjs/src}/coreDao/descriptor.d.ts +4 -4
- package/dist/cjs/src/coreDao/descriptor.d.ts.map +1 -0
- package/dist/cjs/src/coreDao/descriptor.js +38 -0
- package/dist/cjs/src/coreDao/index.d.ts.map +1 -0
- package/dist/{src → cjs/src}/coreDao/index.js +1 -1
- package/dist/{src → cjs/src}/coreDao/opReturn.d.ts +5 -5
- package/dist/cjs/src/coreDao/opReturn.d.ts.map +1 -0
- package/dist/cjs/src/coreDao/opReturn.js +183 -0
- package/dist/{src → cjs/src}/coreDao/transaction.d.ts +16 -9
- package/dist/cjs/src/coreDao/transaction.d.ts.map +1 -0
- package/dist/cjs/src/coreDao/transaction.js +34 -0
- package/dist/cjs/src/index.d.ts +3 -0
- package/dist/cjs/src/index.d.ts.map +1 -0
- package/dist/cjs/src/index.js +39 -0
- package/dist/cjs/test/unit/babylon/bug71.d.ts +2 -0
- package/dist/cjs/test/unit/babylon/bug71.d.ts.map +1 -0
- package/dist/cjs/test/unit/babylon/bug71.js +108 -0
- package/dist/cjs/test/unit/babylon/key.utils.d.ts +6 -0
- package/dist/cjs/test/unit/babylon/key.utils.d.ts.map +1 -0
- package/dist/cjs/test/unit/babylon/key.utils.js +68 -0
- package/dist/cjs/test/unit/babylon/transactions.d.ts +2 -0
- package/dist/cjs/test/unit/babylon/transactions.d.ts.map +1 -0
- package/dist/cjs/test/unit/babylon/transactions.js +338 -0
- package/dist/cjs/test/unit/babylon/undelegation.d.ts +2 -0
- package/dist/cjs/test/unit/babylon/undelegation.d.ts.map +1 -0
- package/dist/cjs/test/unit/babylon/undelegation.js +156 -0
- package/dist/cjs/test/unit/babylon/vendor.utils.d.ts +13 -0
- package/dist/cjs/test/unit/babylon/vendor.utils.d.ts.map +1 -0
- package/dist/cjs/test/unit/babylon/vendor.utils.js +78 -0
- package/dist/cjs/test/unit/coreDao/descriptor.d.ts +2 -0
- package/dist/cjs/test/unit/coreDao/descriptor.d.ts.map +1 -0
- package/dist/cjs/test/unit/coreDao/descriptor.js +144 -0
- package/dist/cjs/test/unit/coreDao/opReturn.d.ts +2 -0
- package/dist/cjs/test/unit/coreDao/opReturn.d.ts.map +1 -0
- package/dist/cjs/test/unit/coreDao/opReturn.js +275 -0
- package/dist/cjs/test/unit/coreDao/utils.d.ts +5 -0
- package/dist/cjs/test/unit/coreDao/utils.d.ts.map +1 -0
- package/dist/cjs/test/unit/coreDao/utils.js +54 -0
- package/dist/cjs/test/unit/fixtures.utils.d.ts +9 -0
- package/dist/cjs/test/unit/fixtures.utils.d.ts.map +1 -0
- package/dist/cjs/test/unit/fixtures.utils.js +91 -0
- package/dist/cjs/tsconfig.tsbuildinfo +1 -0
- package/dist/esm/babylon/delegationMessage.d.ts +38 -0
- package/dist/esm/babylon/delegationMessage.d.ts.map +1 -0
- package/dist/esm/babylon/delegationMessage.js +239 -0
- package/dist/esm/babylon/descriptor.d.ts +48 -0
- package/dist/esm/babylon/descriptor.d.ts.map +1 -0
- package/dist/esm/babylon/descriptor.js +91 -0
- package/dist/esm/babylon/index.d.ts +8 -0
- package/dist/esm/babylon/index.d.ts.map +1 -0
- package/dist/esm/babylon/index.js +13 -0
- package/dist/esm/babylon/network.d.ts +7 -0
- package/dist/esm/babylon/network.d.ts.map +1 -0
- package/dist/esm/babylon/network.js +29 -0
- package/dist/esm/babylon/params.mainnet.json +152 -0
- package/dist/esm/babylon/params.testnet.json +212 -0
- package/dist/esm/babylon/parseDescriptor.d.ts +26 -0
- package/dist/esm/babylon/parseDescriptor.d.ts.map +1 -0
- package/dist/esm/babylon/parseDescriptor.js +155 -0
- package/dist/esm/babylon/stakingManager.d.ts +6 -0
- package/dist/esm/babylon/stakingManager.d.ts.map +1 -0
- package/dist/esm/babylon/stakingManager.js +83 -0
- package/dist/esm/babylon/stakingParams.d.ts +40 -0
- package/dist/esm/babylon/stakingParams.d.ts.map +1 -0
- package/dist/esm/babylon/stakingParams.js +86 -0
- package/dist/esm/babylon/undelegation/UndelegationResponse.d.ts +24 -0
- package/dist/esm/babylon/undelegation/UndelegationResponse.d.ts.map +1 -0
- package/dist/esm/babylon/undelegation/UndelegationResponse.js +18 -0
- package/dist/esm/babylon/undelegation/index.d.ts +3 -0
- package/dist/esm/babylon/undelegation/index.d.ts.map +1 -0
- package/dist/esm/babylon/undelegation/index.js +3 -0
- package/dist/esm/babylon/undelegation/unbonding.d.ts +16 -0
- package/dist/esm/babylon/undelegation/unbonding.d.ts.map +1 -0
- package/dist/esm/babylon/undelegation/unbonding.js +70 -0
- package/dist/esm/coreDao/descriptor.d.ts +18 -0
- package/dist/esm/coreDao/descriptor.d.ts.map +1 -0
- package/dist/esm/coreDao/descriptor.js +35 -0
- package/dist/esm/coreDao/index.d.ts +4 -0
- package/dist/esm/coreDao/index.js +4 -0
- package/dist/esm/coreDao/opReturn.d.ts +41 -0
- package/dist/esm/coreDao/opReturn.d.ts.map +1 -0
- package/dist/esm/coreDao/opReturn.js +175 -0
- package/dist/esm/coreDao/transaction.d.ts +28 -0
- package/dist/esm/coreDao/transaction.d.ts.map +1 -0
- package/dist/esm/coreDao/transaction.js +30 -0
- package/dist/esm/index.d.ts +3 -0
- package/dist/{src → esm}/index.d.ts.map +1 -1
- package/dist/esm/index.js +3 -0
- package/package.json +42 -12
- package/.eslintignore +0 -5
- package/.mocharc.yml +0 -8
- package/CHANGELOG.md +0 -24
- package/dist/src/coreDao/descriptor.d.ts.map +0 -1
- package/dist/src/coreDao/descriptor.js +0 -31
- package/dist/src/coreDao/opReturn.d.ts.map +0 -1
- package/dist/src/coreDao/opReturn.js +0 -175
- package/dist/src/coreDao/transaction.d.ts.map +0 -1
- package/dist/src/coreDao/transaction.js +0 -27
- package/dist/src/index.d.ts +0 -3
- package/dist/src/transaction.d.ts +0 -34
- package/dist/src/transaction.d.ts.map +0 -1
- package/dist/src/transaction.js +0 -55
- /package/dist/{src → cjs/src}/coreDao/index.d.ts +0 -0
- /package/dist/{src → esm}/coreDao/index.d.ts.map +0 -0
|
@@ -1,175 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.toString = exports.parseCoreDaoOpReturnOutputScript = exports.createCoreDaoOpReturnOutputScript = exports.decodeTimelock = exports.encodeTimelock = exports.CORE_DAO_SATOSHI_PLUS_IDENTIFIER = exports.CORE_DAO_MAINNET_CHAIN_ID = exports.CORE_DAO_TESTNET_CHAIN_ID = void 0;
|
|
4
|
-
const utxo_lib_1 = require("@bitgo-beta/utxo-lib");
|
|
5
|
-
// Source: https://docs.coredao.org/docs/Learn/products/btc-staking/design
|
|
6
|
-
exports.CORE_DAO_TESTNET_CHAIN_ID = Buffer.from('045b', 'hex');
|
|
7
|
-
exports.CORE_DAO_MAINNET_CHAIN_ID = Buffer.from('045c', 'hex');
|
|
8
|
-
exports.CORE_DAO_SATOSHI_PLUS_IDENTIFIER = Buffer.from('5341542b', 'hex');
|
|
9
|
-
// https://github.com/bitcoin/bitcoin/blob/5961b23898ee7c0af2626c46d5d70e80136578d3/src/script/script.h#L47
|
|
10
|
-
const OP_RETURN_IDENTIFIER = Buffer.from('6a', 'hex');
|
|
11
|
-
function encodeTimelock(timelock) {
|
|
12
|
-
const buff = Buffer.alloc(4);
|
|
13
|
-
buff.writeUInt32LE(timelock);
|
|
14
|
-
return buff;
|
|
15
|
-
}
|
|
16
|
-
exports.encodeTimelock = encodeTimelock;
|
|
17
|
-
function decodeTimelock(buffer) {
|
|
18
|
-
if (buffer.length !== 4) {
|
|
19
|
-
throw new Error('Invalid timelock buffer length');
|
|
20
|
-
}
|
|
21
|
-
return buffer.readUInt32LE();
|
|
22
|
-
}
|
|
23
|
-
exports.decodeTimelock = decodeTimelock;
|
|
24
|
-
/**
|
|
25
|
-
* Create a CoreDAO OP_RETURN output script
|
|
26
|
-
*
|
|
27
|
-
* @param version Version of the OP_RETURN
|
|
28
|
-
* @param chainId Chain ID
|
|
29
|
-
* @param delegator Delegator address
|
|
30
|
-
* @param validator Validator address
|
|
31
|
-
* @param fee Fee for relayer
|
|
32
|
-
* @param redeemScript Redeem script of the staking output
|
|
33
|
-
* @param timelock Timelock for the staking output
|
|
34
|
-
* @returns Buffer OP_RETURN buffer
|
|
35
|
-
*/
|
|
36
|
-
function createCoreDaoOpReturnOutputScript({ version, chainId, delegator, validator, fee, ...rest }) {
|
|
37
|
-
/**
|
|
38
|
-
* As of v2, this is the construction of the OP_RETURN:
|
|
39
|
-
* Source: https://docs.coredao.org/docs/Learn/products/btc-staking/design#op_return-output
|
|
40
|
-
*
|
|
41
|
-
* The OP_RETURN output should contain all staking information in order, and be composed in the following format:
|
|
42
|
-
*
|
|
43
|
-
* Satoshi Plus Identifier: (SAT+) 4 bytes
|
|
44
|
-
* Version: (0x01) 1 byte
|
|
45
|
-
* Chain ID: (0x045b (1115) for Core Testnet and 0x045c (1116) for Core Mainnet) 2 bytes
|
|
46
|
-
* Delegator: The Core address to receive rewards, 20 bytes
|
|
47
|
-
* Validator: The Core validator address to stake to, 20 bytes
|
|
48
|
-
* Fee: Fee for relayer, 1 byte, range [0,255], measured in CORE
|
|
49
|
-
* (Optional) RedeemScript
|
|
50
|
-
* (Optional) Timelock: 4 bytes
|
|
51
|
-
*
|
|
52
|
-
* Either RedeemScript or Timelock must be available, the purpose is to allow relayer to
|
|
53
|
-
* obtain the RedeemScript and submit transactions on Core. If a RedeemScript is provided,
|
|
54
|
-
* relayer will use it directly. Otherwise, relayer will construct the redeem script based
|
|
55
|
-
* on the timelock and the information in the transaction inputs.
|
|
56
|
-
*
|
|
57
|
-
* Note that any length > 80 bytes wont be relayed by nodes and therefore we will throw an error.
|
|
58
|
-
*/
|
|
59
|
-
if (version < 0 || version > 255) {
|
|
60
|
-
throw new Error('Invalid version - out of range');
|
|
61
|
-
}
|
|
62
|
-
const versionBuffer = Buffer.alloc(1, version);
|
|
63
|
-
if (!(chainId.equals(exports.CORE_DAO_TESTNET_CHAIN_ID) || chainId.equals(exports.CORE_DAO_MAINNET_CHAIN_ID))) {
|
|
64
|
-
throw new Error('Invalid chain ID');
|
|
65
|
-
}
|
|
66
|
-
if (delegator.length !== 20) {
|
|
67
|
-
throw new Error('Invalid delegator address');
|
|
68
|
-
}
|
|
69
|
-
if (validator.length !== 20) {
|
|
70
|
-
throw new Error('Invalid validator address');
|
|
71
|
-
}
|
|
72
|
-
if (fee < 0 || fee > 255) {
|
|
73
|
-
throw new Error('Invalid fee - out of range');
|
|
74
|
-
}
|
|
75
|
-
const feeBuffer = Buffer.alloc(1, fee);
|
|
76
|
-
if (feeBuffer.length !== 1) {
|
|
77
|
-
throw new Error('Invalid fee');
|
|
78
|
-
}
|
|
79
|
-
const redeemScriptBuffer = 'redeemScript' in rest ? rest.redeemScript : Buffer.from([]);
|
|
80
|
-
if ('timelock' in rest && (rest.timelock < 0 || rest.timelock > 4294967295)) {
|
|
81
|
-
throw new Error('Invalid timelock - out of range');
|
|
82
|
-
}
|
|
83
|
-
// encode the number into a 4-byte buffer
|
|
84
|
-
// if timelock is provided, write it into 32-bit little-endian
|
|
85
|
-
const timelockBuffer = 'timelock' in rest ? encodeTimelock(rest.timelock) : Buffer.from([]);
|
|
86
|
-
const data = Buffer.concat([
|
|
87
|
-
exports.CORE_DAO_SATOSHI_PLUS_IDENTIFIER,
|
|
88
|
-
versionBuffer,
|
|
89
|
-
chainId,
|
|
90
|
-
delegator,
|
|
91
|
-
validator,
|
|
92
|
-
feeBuffer,
|
|
93
|
-
redeemScriptBuffer,
|
|
94
|
-
timelockBuffer,
|
|
95
|
-
]);
|
|
96
|
-
if (data.length > 80) {
|
|
97
|
-
throw new Error('OP_RETURN outputs cannot have a length larger than 80 bytes');
|
|
98
|
-
}
|
|
99
|
-
const payment = utxo_lib_1.payments.embed({
|
|
100
|
-
data: [data],
|
|
101
|
-
network: chainId.equals(exports.CORE_DAO_TESTNET_CHAIN_ID) ? utxo_lib_1.networks.testnet : utxo_lib_1.networks.bitcoin,
|
|
102
|
-
});
|
|
103
|
-
if (!payment.output) {
|
|
104
|
-
throw new Error('Unable to create OP_RETURN output');
|
|
105
|
-
}
|
|
106
|
-
return payment.output;
|
|
107
|
-
}
|
|
108
|
-
exports.createCoreDaoOpReturnOutputScript = createCoreDaoOpReturnOutputScript;
|
|
109
|
-
/**
|
|
110
|
-
* Parse a CoreDAO OP_RETURN output script into the constituent parts
|
|
111
|
-
* @param script
|
|
112
|
-
* @returns OpReturnParams
|
|
113
|
-
*/
|
|
114
|
-
function parseCoreDaoOpReturnOutputScript(script) {
|
|
115
|
-
if (!script.subarray(0, 1).equals(OP_RETURN_IDENTIFIER)) {
|
|
116
|
-
throw new Error('First byte must be an OP_RETURN');
|
|
117
|
-
}
|
|
118
|
-
const payment = utxo_lib_1.payments.embed({
|
|
119
|
-
output: script,
|
|
120
|
-
});
|
|
121
|
-
const data = payment.data;
|
|
122
|
-
if (!data || data.length !== 1) {
|
|
123
|
-
throw new Error('Invalid OP_RETURN output');
|
|
124
|
-
}
|
|
125
|
-
const dataBuffer = data[0];
|
|
126
|
-
if (dataBuffer.length > 80) {
|
|
127
|
-
throw new Error(`OP_RETURN outputs cannot have a length larger than 80 bytes`);
|
|
128
|
-
}
|
|
129
|
-
let offset = 0;
|
|
130
|
-
// Decode satoshi+ identifier
|
|
131
|
-
if (!dataBuffer.subarray(offset, offset + 4).equals(exports.CORE_DAO_SATOSHI_PLUS_IDENTIFIER)) {
|
|
132
|
-
throw new Error('Invalid satoshi+ identifier');
|
|
133
|
-
}
|
|
134
|
-
offset += 4;
|
|
135
|
-
// Decode version
|
|
136
|
-
const version = dataBuffer[offset];
|
|
137
|
-
offset += 1;
|
|
138
|
-
// Decode chainId
|
|
139
|
-
const chainId = Buffer.from(dataBuffer.subarray(offset, offset + 2));
|
|
140
|
-
if (!(chainId.equals(exports.CORE_DAO_TESTNET_CHAIN_ID) || chainId.equals(exports.CORE_DAO_MAINNET_CHAIN_ID))) {
|
|
141
|
-
throw new Error(`Invalid ChainID: ${chainId.toString('hex')}. Must be either 0x045b (testnet) or 0x045c (mainnet).`);
|
|
142
|
-
}
|
|
143
|
-
offset += 2;
|
|
144
|
-
// Decode delegator
|
|
145
|
-
const delegator = Buffer.from(dataBuffer.subarray(offset, offset + 20));
|
|
146
|
-
offset += 20;
|
|
147
|
-
// Decode validator
|
|
148
|
-
const validator = Buffer.from(dataBuffer.subarray(offset, offset + 20));
|
|
149
|
-
offset += 20;
|
|
150
|
-
// Decode fee
|
|
151
|
-
const fee = dataBuffer[offset];
|
|
152
|
-
offset += 1;
|
|
153
|
-
const baseParams = { version, chainId, delegator, validator, fee };
|
|
154
|
-
// Decode redeemScript or timelock
|
|
155
|
-
if (offset === dataBuffer.length - 4) {
|
|
156
|
-
return { ...baseParams, timelock: decodeTimelock(dataBuffer.subarray(offset)) };
|
|
157
|
-
}
|
|
158
|
-
else {
|
|
159
|
-
return { ...baseParams, redeemScript: Buffer.from(dataBuffer.subarray(offset)) };
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
exports.parseCoreDaoOpReturnOutputScript = parseCoreDaoOpReturnOutputScript;
|
|
163
|
-
function toString(params) {
|
|
164
|
-
return JSON.stringify({
|
|
165
|
-
version: params.version,
|
|
166
|
-
chainId: params.chainId.toString('hex'),
|
|
167
|
-
delegator: params.delegator.toString('hex'),
|
|
168
|
-
validator: params.validator.toString('hex'),
|
|
169
|
-
fee: params.fee,
|
|
170
|
-
...('redeemScript' in params ? { redeemScript: params.redeemScript.toString('hex') } : {}),
|
|
171
|
-
...('timelock' in params ? { timelock: params.timelock } : {}),
|
|
172
|
-
});
|
|
173
|
-
}
|
|
174
|
-
exports.toString = toString;
|
|
175
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BSZXR1cm4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29yZURhby9vcFJldHVybi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtREFBMEQ7QUFFMUQsMEVBQTBFO0FBQzdELFFBQUEseUJBQXlCLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDdkQsUUFBQSx5QkFBeUIsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztBQUN2RCxRQUFBLGdDQUFnQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQy9FLDJHQUEyRztBQUMzRyxNQUFNLG9CQUFvQixHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBRXRELFNBQWdCLGNBQWMsQ0FBQyxRQUFnQjtJQUM3QyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzdCLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDN0IsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBSkQsd0NBSUM7QUFFRCxTQUFnQixjQUFjLENBQUMsTUFBYztJQUMzQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1FBQ3ZCLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztLQUNuRDtJQUNELE9BQU8sTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDO0FBQy9CLENBQUM7QUFMRCx3Q0FLQztBQVlEOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsU0FBZ0IsaUNBQWlDLENBQUMsRUFDaEQsT0FBTyxFQUNQLE9BQU8sRUFDUCxTQUFTLEVBQ1QsU0FBUyxFQUNULEdBQUcsRUFDSCxHQUFHLElBQUksRUFDUTtJQUNmOzs7Ozs7Ozs7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QU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQztLQUNsRjtBQUNILENBQUM7QUF6REQsNEVBeURDO0FBRUQsU0FBZ0IsUUFBUSxDQUFDLE1BQXNCO0lBQzdDLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUNwQixPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU87UUFDdkIsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztRQUN2QyxTQUFTLEVBQUUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1FBQzNDLFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7UUFDM0MsR0FBRyxFQUFFLE1BQU0sQ0FBQyxHQUFHO1FBQ2YsR0FBRyxDQUFDLGNBQWMsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxFQUFFLE1BQU0sQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUMxRixHQUFHLENBQUMsVUFBVSxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7S0FDL0QsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQVZELDRCQVVDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcGF5bWVudHMsIG5ldHdvcmtzIH0gZnJvbSAnQGJpdGdvLWJldGEvdXR4by1saWInO1xuXG4vLyBTb3VyY2U6IGh0dHBzOi8vZG9jcy5jb3JlZGFvLm9yZy9kb2NzL0xlYXJuL3Byb2R1Y3RzL2J0Yy1zdGFraW5nL2Rlc2lnblxuZXhwb3J0IGNvbnN0IENPUkVfREFPX1RFU1RORVRfQ0hBSU5fSUQgPSBCdWZmZXIuZnJvbSgnMDQ1YicsICdoZXgnKTtcbmV4cG9ydCBjb25zdCBDT1JFX0RBT19NQUlOTkVUX0NIQUlOX0lEID0gQnVmZmVyLmZyb20oJzA0NWMnLCAnaGV4Jyk7XG5leHBvcnQgY29uc3QgQ09SRV9EQU9fU0FUT1NISV9QTFVTX0lERU5USUZJRVIgPSBCdWZmZXIuZnJvbSgnNTM0MTU0MmInLCAnaGV4Jyk7XG4vLyBodHRwczovL2dpdGh1Yi5jb20vYml0Y29pbi9iaXRjb2luL2Jsb2IvNTk2MWIyMzg5OGVlN2MwYWYyNjI2YzQ2ZDVkNzBlODAxMzY1NzhkMy9zcmMvc2NyaXB0L3NjcmlwdC5oI0w0N1xuY29uc3QgT1BfUkVUVVJOX0lERU5USUZJRVIgPSBCdWZmZXIuZnJvbSgnNmEnLCAnaGV4Jyk7XG5cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVUaW1lbG9jayh0aW1lbG9jazogbnVtYmVyKTogQnVmZmVyIHtcbiAgY29uc3QgYnVmZiA9IEJ1ZmZlci5hbGxvYyg0KTtcbiAgYnVmZi53cml0ZVVJbnQzMkxFKHRpbWVsb2NrKTtcbiAgcmV0dXJuIGJ1ZmY7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVUaW1lbG9jayhidWZmZXI6IEJ1ZmZlcik6IG51bWJlciB7XG4gIGlmIChidWZmZXIubGVuZ3RoICE9PSA0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHRpbWVsb2NrIGJ1ZmZlciBsZW5ndGgnKTtcbiAgfVxuICByZXR1cm4gYnVmZmVyLnJlYWRVSW50MzJMRSgpO1xufVxuXG50eXBlIEJhc2VQYXJhbXMgPSB7XG4gIHZlcnNpb246IG51bWJlcjtcbiAgY2hhaW5JZDogQnVmZmVyO1xuICBkZWxlZ2F0b3I6IEJ1ZmZlcjtcbiAgdmFsaWRhdG9yOiBCdWZmZXI7XG4gIGZlZTogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgT3BSZXR1cm5QYXJhbXMgPSBCYXNlUGFyYW1zICYgKHsgcmVkZWVtU2NyaXB0OiBCdWZmZXIgfSB8IHsgdGltZWxvY2s6IG51bWJlciB9KTtcblxuLyoqXG4gKiBDcmVhdGUgYSBDb3JlREFPIE9QX1JFVFVSTiBvdXRwdXQgc2NyaXB0XG4gKlxuICogQHBhcmFtIHZlcnNpb24gVmVyc2lvbiBvZiB0aGUgT1BfUkVUVVJOXG4gKiBAcGFyYW0gY2hhaW5JZCBDaGFpbiBJRFxuICogQHBhcmFtIGRlbGVnYXRvciBEZWxlZ2F0b3IgYWRkcmVzc1xuICogQHBhcmFtIHZhbGlkYXRvciBWYWxpZGF0b3IgYWRkcmVzc1xuICogQHBhcmFtIGZlZSBGZWUgZm9yIHJlbGF5ZXJcbiAqIEBwYXJhbSByZWRlZW1TY3JpcHQgUmVkZWVtIHNjcmlwdCBvZiB0aGUgc3Rha2luZyBvdXRwdXRcbiAqIEBwYXJhbSB0aW1lbG9jayBUaW1lbG9jayBmb3IgdGhlIHN0YWtpbmcgb3V0cHV0XG4gKiBAcmV0dXJucyBCdWZmZXIgT1BfUkVUVVJOIGJ1ZmZlclxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ29yZURhb09wUmV0dXJuT3V0cHV0U2NyaXB0KHtcbiAgdmVyc2lvbixcbiAgY2hhaW5JZCxcbiAgZGVsZWdhdG9yLFxuICB2YWxpZGF0b3IsXG4gIGZlZSxcbiAgLi4ucmVzdFxufTogT3BSZXR1cm5QYXJhbXMpOiBCdWZmZXIge1xuICAvKipcbiAgICogQXMgb2YgdjIsIHRoaXMgaXMgdGhlIGNvbnN0cnVjdGlvbiBvZiB0aGUgT1BfUkVUVVJOOlxuICAgKiBTb3VyY2U6IGh0dHBzOi8vZG9jcy5jb3JlZGFvLm9yZy9kb2NzL0xlYXJuL3Byb2R1Y3RzL2J0Yy1zdGFraW5nL2Rlc2lnbiNvcF9yZXR1cm4tb3V0cHV0XG4gICAqXG4gICAqIFRoZSBPUF9SRVRVUk4gb3V0cHV0IHNob3VsZCBjb250YWluIGFsbCBzdGFraW5nIGluZm9ybWF0aW9uIGluIG9yZGVyLCBhbmQgYmUgY29tcG9zZWQgaW4gdGhlIGZvbGxvd2luZyBmb3JtYXQ6XG4gICAqXG4gICAqIFNhdG9zaGkgUGx1cyBJZGVudGlmaWVyOiAoU0FUKykgNCBieXRlc1xuICAgKiBWZXJzaW9uOiAoMHgwMSkgMSBieXRlXG4gICAqIENoYWluIElEOiAoMHgwNDViICgxMTE1KSBmb3IgQ29yZSBUZXN0bmV0IGFuZCAweDA0NWMgKDExMTYpIGZvciBDb3JlIE1haW5uZXQpIDIgYnl0ZXNcbiAgICogRGVsZWdhdG9yOiBUaGUgQ29yZSBhZGRyZXNzIHRvIHJlY2VpdmUgcmV3YXJkcywgMjAgYnl0ZXNcbiAgICogVmFsaWRhdG9yOiBUaGUgQ29yZSB2YWxpZGF0b3IgYWRkcmVzcyB0byBzdGFrZSB0bywgMjAgYnl0ZXNcbiAgICogRmVlOiBGZWUgZm9yIHJlbGF5ZXIsIDEgYnl0ZSwgcmFuZ2UgWzAsMjU1XSwgbWVhc3VyZWQgaW4gQ09SRVxuICAgKiAoT3B0aW9uYWwpIFJlZGVlbVNjcmlwdFxuICAgKiAoT3B0aW9uYWwpIFRpbWVsb2NrOiA0IGJ5dGVzXG4gICAqXG4gICAqIEVpdGhlciBSZWRlZW1TY3JpcHQgb3IgVGltZWxvY2sgbXVzdCBiZSBhdmFpbGFibGUsIHRoZSBwdXJwb3NlIGlzIHRvIGFsbG93IHJlbGF5ZXIgdG9cbiAgICogb2J0YWluIHRoZSBSZWRlZW1TY3JpcHQgYW5kIHN1Ym1pdCB0cmFuc2FjdGlvbnMgb24gQ29yZS4gSWYgYSBSZWRlZW1TY3JpcHQgaXMgcHJvdmlkZWQsXG4gICAqIHJlbGF5ZXIgd2lsbCB1c2UgaXQgZGlyZWN0bHkuIE90aGVyd2lzZSwgcmVsYXllciB3aWxsIGNvbnN0cnVjdCB0aGUgcmVkZWVtIHNjcmlwdCBiYXNlZFxuICAgKiBvbiB0aGUgdGltZWxvY2sgYW5kIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgdHJhbnNhY3Rpb24gaW5wdXRzLlxuICAgKlxuICAgKiBOb3RlIHRoYXQgYW55IGxlbmd0aCA+IDgwIGJ5dGVzIHdvbnQgYmUgcmVsYXllZCBieSBub2RlcyBhbmQgdGhlcmVmb3JlIHdlIHdpbGwgdGhyb3cgYW4gZXJyb3IuXG4gICAqL1xuICBpZiAodmVyc2lvbiA8IDAgfHwgdmVyc2lvbiA+IDI1NSkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB2ZXJzaW9uIC0gb3V0IG9mIHJhbmdlJyk7XG4gIH1cbiAgY29uc3QgdmVyc2lvbkJ1ZmZlciA9IEJ1ZmZlci5hbGxvYygxLCB2ZXJzaW9uKTtcblxuICBpZiAoIShjaGFpbklkLmVxdWFscyhDT1JFX0RBT19URVNUTkVUX0NIQUlOX0lEKSB8fCBjaGFpbklkLmVxdWFscyhDT1JFX0RBT19NQUlOTkVUX0NIQUlOX0lEKSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY2hhaW4gSUQnKTtcbiAgfVxuXG4gIGlmIChkZWxlZ2F0b3IubGVuZ3RoICE9PSAyMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBkZWxlZ2F0b3IgYWRkcmVzcycpO1xuICB9XG5cbiAgaWYgKHZhbGlkYXRvci5sZW5ndGggIT09IDIwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHZhbGlkYXRvciBhZGRyZXNzJyk7XG4gIH1cblxuICBpZiAoZmVlIDwgMCB8fCBmZWUgPiAyNTUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZmVlIC0gb3V0IG9mIHJhbmdlJyk7XG4gIH1cbiAgY29uc3QgZmVlQnVmZmVyID0gQnVmZmVyLmFsbG9jKDEsIGZlZSk7XG5cbiAgaWYgKGZlZUJ1ZmZlci5sZW5ndGggIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZmVlJyk7XG4gIH1cblxuICBjb25zdCByZWRlZW1TY3JpcHRCdWZmZXIgPSAncmVkZWVtU2NyaXB0JyBpbiByZXN0ID8gcmVzdC5yZWRlZW1TY3JpcHQgOiBCdWZmZXIuZnJvbShbXSk7XG4gIGlmICgndGltZWxvY2snIGluIHJlc3QgJiYgKHJlc3QudGltZWxvY2sgPCAwIHx8IHJlc3QudGltZWxvY2sgPiA0Mjk0OTY3Mjk1KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB0aW1lbG9jayAtIG91dCBvZiByYW5nZScpO1xuICB9XG5cbiAgLy8gZW5jb2RlIHRoZSBudW1iZXIgaW50byBhIDQtYnl0ZSBidWZmZXJcbiAgLy8gaWYgdGltZWxvY2sgaXMgcHJvdmlkZWQsIHdyaXRlIGl0IGludG8gMzItYml0IGxpdHRsZS1lbmRpYW5cbiAgY29uc3QgdGltZWxvY2tCdWZmZXIgPSAndGltZWxvY2snIGluIHJlc3QgPyBlbmNvZGVUaW1lbG9jayhyZXN0LnRpbWVsb2NrKSA6IEJ1ZmZlci5mcm9tKFtdKTtcbiAgY29uc3QgZGF0YSA9IEJ1ZmZlci5jb25jYXQoW1xuICAgIENPUkVfREFPX1NBVE9TSElfUExVU19JREVOVElGSUVSLFxuICAgIHZlcnNpb25CdWZmZXIsXG4gICAgY2hhaW5JZCxcbiAgICBkZWxlZ2F0b3IsXG4gICAgdmFsaWRhdG9yLFxuICAgIGZlZUJ1ZmZlcixcbiAgICByZWRlZW1TY3JpcHRCdWZmZXIsXG4gICAgdGltZWxvY2tCdWZmZXIsXG4gIF0pO1xuICBpZiAoZGF0YS5sZW5ndGggPiA4MCkge1xuICAgIHRocm93IG5ldyBFcnJvcignT1BfUkVUVVJOIG91dHB1dHMgY2Fubm90IGhhdmUgYSBsZW5ndGggbGFyZ2VyIHRoYW4gODAgYnl0ZXMnKTtcbiAgfVxuXG4gIGNvbnN0IHBheW1lbnQgPSBwYXltZW50cy5lbWJlZCh7XG4gICAgZGF0YTogW2RhdGFdLFxuICAgIG5ldHdvcms6IGNoYWluSWQuZXF1YWxzKENPUkVfREFPX1RFU1RORVRfQ0hBSU5fSUQpID8gbmV0d29ya3MudGVzdG5ldCA6IG5ldHdvcmtzLmJpdGNvaW4sXG4gIH0pO1xuICBpZiAoIXBheW1lbnQub3V0cHV0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gY3JlYXRlIE9QX1JFVFVSTiBvdXRwdXQnKTtcbiAgfVxuXG4gIHJldHVybiBwYXltZW50Lm91dHB1dDtcbn1cblxuLyoqXG4gKiBQYXJzZSBhIENvcmVEQU8gT1BfUkVUVVJOIG91dHB1dCBzY3JpcHQgaW50byB0aGUgY29uc3RpdHVlbnQgcGFydHNcbiAqIEBwYXJhbSBzY3JpcHRcbiAqIEByZXR1cm5zIE9wUmV0dXJuUGFyYW1zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUNvcmVEYW9PcFJldHVybk91dHB1dFNjcmlwdChzY3JpcHQ6IEJ1ZmZlcik6IE9wUmV0dXJuUGFyYW1zIHtcbiAgaWYgKCFzY3JpcHQuc3ViYXJyYXkoMCwgMSkuZXF1YWxzKE9QX1JFVFVSTl9JREVOVElGSUVSKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignRmlyc3QgYnl0ZSBtdXN0IGJlIGFuIE9QX1JFVFVSTicpO1xuICB9XG5cbiAgY29uc3QgcGF5bWVudCA9IHBheW1lbnRzLmVtYmVkKHtcbiAgICBvdXRwdXQ6IHNjcmlwdCxcbiAgfSk7XG4gIGNvbnN0IGRhdGEgPSBwYXltZW50LmRhdGE7XG4gIGlmICghZGF0YSB8fCBkYXRhLmxlbmd0aCAhPT0gMSkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBPUF9SRVRVUk4gb3V0cHV0Jyk7XG4gIH1cbiAgY29uc3QgZGF0YUJ1ZmZlciA9IGRhdGFbMF07XG4gIGlmIChkYXRhQnVmZmVyLmxlbmd0aCA+IDgwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBPUF9SRVRVUk4gb3V0cHV0cyBjYW5ub3QgaGF2ZSBhIGxlbmd0aCBsYXJnZXIgdGhhbiA4MCBieXRlc2ApO1xuICB9XG4gIGxldCBvZmZzZXQgPSAwO1xuXG4gIC8vIERlY29kZSBzYXRvc2hpKyBpZGVudGlmaWVyXG4gIGlmICghZGF0YUJ1ZmZlci5zdWJhcnJheShvZmZzZXQsIG9mZnNldCArIDQpLmVxdWFscyhDT1JFX0RBT19TQVRPU0hJX1BMVVNfSURFTlRJRklFUikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgc2F0b3NoaSsgaWRlbnRpZmllcicpO1xuICB9XG4gIG9mZnNldCArPSA0O1xuXG4gIC8vIERlY29kZSB2ZXJzaW9uXG4gIGNvbnN0IHZlcnNpb24gPSBkYXRhQnVmZmVyW29mZnNldF07XG4gIG9mZnNldCArPSAxO1xuXG4gIC8vIERlY29kZSBjaGFpbklkXG4gIGNvbnN0IGNoYWluSWQgPSBCdWZmZXIuZnJvbShkYXRhQnVmZmVyLnN1YmFycmF5KG9mZnNldCwgb2Zmc2V0ICsgMikpO1xuICBpZiAoIShjaGFpbklkLmVxdWFscyhDT1JFX0RBT19URVNUTkVUX0NIQUlOX0lEKSB8fCBjaGFpbklkLmVxdWFscyhDT1JFX0RBT19NQUlOTkVUX0NIQUlOX0lEKSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgSW52YWxpZCBDaGFpbklEOiAke2NoYWluSWQudG9TdHJpbmcoJ2hleCcpfS4gTXVzdCBiZSBlaXRoZXIgMHgwNDViICh0ZXN0bmV0KSBvciAweDA0NWMgKG1haW5uZXQpLmBcbiAgICApO1xuICB9XG4gIG9mZnNldCArPSAyO1xuXG4gIC8vIERlY29kZSBkZWxlZ2F0b3JcbiAgY29uc3QgZGVsZWdhdG9yID0gQnVmZmVyLmZyb20oZGF0YUJ1ZmZlci5zdWJhcnJheShvZmZzZXQsIG9mZnNldCArIDIwKSk7XG4gIG9mZnNldCArPSAyMDtcblxuICAvLyBEZWNvZGUgdmFsaWRhdG9yXG4gIGNvbnN0IHZhbGlkYXRvciA9IEJ1ZmZlci5mcm9tKGRhdGFCdWZmZXIuc3ViYXJyYXkob2Zmc2V0LCBvZmZzZXQgKyAyMCkpO1xuICBvZmZzZXQgKz0gMjA7XG5cbiAgLy8gRGVjb2RlIGZlZVxuICBjb25zdCBmZWUgPSBkYXRhQnVmZmVyW29mZnNldF07XG4gIG9mZnNldCArPSAxO1xuXG4gIGNvbnN0IGJhc2VQYXJhbXMgPSB7IHZlcnNpb24sIGNoYWluSWQsIGRlbGVnYXRvciwgdmFsaWRhdG9yLCBmZWUgfTtcblxuICAvLyBEZWNvZGUgcmVkZWVtU2NyaXB0IG9yIHRpbWVsb2NrXG4gIGlmIChvZmZzZXQgPT09IGRhdGFCdWZmZXIubGVuZ3RoIC0gNCkge1xuICAgIHJldHVybiB7IC4uLmJhc2VQYXJhbXMsIHRpbWVsb2NrOiBkZWNvZGVUaW1lbG9jayhkYXRhQnVmZmVyLnN1YmFycmF5KG9mZnNldCkpIH07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHsgLi4uYmFzZVBhcmFtcywgcmVkZWVtU2NyaXB0OiBCdWZmZXIuZnJvbShkYXRhQnVmZmVyLnN1YmFycmF5KG9mZnNldCkpIH07XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvU3RyaW5nKHBhcmFtczogT3BSZXR1cm5QYXJhbXMpOiBzdHJpbmcge1xuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe1xuICAgIHZlcnNpb246IHBhcmFtcy52ZXJzaW9uLFxuICAgIGNoYWluSWQ6IHBhcmFtcy5jaGFpbklkLnRvU3RyaW5nKCdoZXgnKSxcbiAgICBkZWxlZ2F0b3I6IHBhcmFtcy5kZWxlZ2F0b3IudG9TdHJpbmcoJ2hleCcpLFxuICAgIHZhbGlkYXRvcjogcGFyYW1zLnZhbGlkYXRvci50b1N0cmluZygnaGV4JyksXG4gICAgZmVlOiBwYXJhbXMuZmVlLFxuICAgIC4uLigncmVkZWVtU2NyaXB0JyBpbiBwYXJhbXMgPyB7IHJlZGVlbVNjcmlwdDogcGFyYW1zLnJlZGVlbVNjcmlwdC50b1N0cmluZygnaGV4JykgfSA6IHt9KSxcbiAgICAuLi4oJ3RpbWVsb2NrJyBpbiBwYXJhbXMgPyB7IHRpbWVsb2NrOiBwYXJhbXMudGltZWxvY2sgfSA6IHt9KSxcbiAgfSk7XG59XG4iXX0=
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"transaction.d.ts","sourceRoot":"","sources":["../../../src/coreDao/transaction.ts"],"names":[],"mappings":";;AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEpD,OAAO,EAAqC,cAAc,EAAE,MAAM,YAAY,CAAC;AAE/E;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAClC,aAAa,EAAE;IACb,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,UAAU,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,EACD,cAAc,EAAE,cAAc,GAC7B;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EAAE,CAgBtC"}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.createStakingOutputs = void 0;
|
|
4
|
-
const opReturn_1 = require("./opReturn");
|
|
5
|
-
/**
|
|
6
|
-
* Create the staking outputs for a CoreDAO staking transaction. This is the ordering
|
|
7
|
-
* in which to add into the transaction.
|
|
8
|
-
* @param stakingParams how to create the timelocked stake output
|
|
9
|
-
* @param stakingParams.descriptor if stakingParams.index is not provided, then this is assumed to be a `definite` descriptor.
|
|
10
|
-
* If stakingParams.index is provided, then this is assumed to be a `derivable` descriptor.
|
|
11
|
-
* @param opReturnParams to create the OP_RETURN output
|
|
12
|
-
*/
|
|
13
|
-
function createStakingOutputs(stakingParams, opReturnParams) {
|
|
14
|
-
if (stakingParams.descriptor.hasWildcard() && stakingParams.index === undefined) {
|
|
15
|
-
throw new Error('Cannot create staking outputs with a wildcard descriptor and no derivation index');
|
|
16
|
-
}
|
|
17
|
-
const outputScript = Buffer.from(stakingParams.index === undefined
|
|
18
|
-
? stakingParams.descriptor.scriptPubkey()
|
|
19
|
-
: stakingParams.descriptor.atDerivationIndex(stakingParams.index).scriptPubkey());
|
|
20
|
-
const opReturnScript = (0, opReturn_1.createCoreDaoOpReturnOutputScript)(opReturnParams);
|
|
21
|
-
return [
|
|
22
|
-
{ script: outputScript, amount: stakingParams.amount },
|
|
23
|
-
{ script: opReturnScript, amount: BigInt(0) },
|
|
24
|
-
];
|
|
25
|
-
}
|
|
26
|
-
exports.createStakingOutputs = createStakingOutputs;
|
|
27
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29yZURhby90cmFuc2FjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFFQSx5Q0FBK0U7QUFFL0U7Ozs7Ozs7R0FPRztBQUNILFNBQWdCLG9CQUFvQixDQUNsQyxhQUlDLEVBQ0QsY0FBOEI7SUFFOUIsSUFBSSxhQUFhLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRSxJQUFJLGFBQWEsQ0FBQyxLQUFLLEtBQUssU0FBUyxFQUFFO1FBQy9FLE1BQU0sSUFBSSxLQUFLLENBQUMsa0ZBQWtGLENBQUMsQ0FBQztLQUNyRztJQUVELE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQzlCLGFBQWEsQ0FBQyxLQUFLLEtBQUssU0FBUztRQUMvQixDQUFDLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxZQUFZLEVBQUU7UUFDekMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUNuRixDQUFDO0lBQ0YsTUFBTSxjQUFjLEdBQUcsSUFBQSw0Q0FBaUMsRUFBQyxjQUFjLENBQUMsQ0FBQztJQUV6RSxPQUFPO1FBQ0wsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxhQUFhLENBQUMsTUFBTSxFQUFFO1FBQ3RELEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFO0tBQzlDLENBQUM7QUFDSixDQUFDO0FBdkJELG9EQXVCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERlc2NyaXB0b3IgfSBmcm9tICdAYml0Z28vd2FzbS1taW5pc2NyaXB0JztcblxuaW1wb3J0IHsgY3JlYXRlQ29yZURhb09wUmV0dXJuT3V0cHV0U2NyaXB0LCBPcFJldHVyblBhcmFtcyB9IGZyb20gJy4vb3BSZXR1cm4nO1xuXG4vKipcbiAqIENyZWF0ZSB0aGUgc3Rha2luZyBvdXRwdXRzIGZvciBhIENvcmVEQU8gc3Rha2luZyB0cmFuc2FjdGlvbi4gVGhpcyBpcyB0aGUgb3JkZXJpbmdcbiAqIGluIHdoaWNoIHRvIGFkZCBpbnRvIHRoZSB0cmFuc2FjdGlvbi5cbiAqIEBwYXJhbSBzdGFraW5nUGFyYW1zIGhvdyB0byBjcmVhdGUgdGhlIHRpbWVsb2NrZWQgc3Rha2Ugb3V0cHV0XG4gKiBAcGFyYW0gc3Rha2luZ1BhcmFtcy5kZXNjcmlwdG9yIGlmIHN0YWtpbmdQYXJhbXMuaW5kZXggaXMgbm90IHByb3ZpZGVkLCB0aGVuIHRoaXMgaXMgYXNzdW1lZCB0byBiZSBhIGBkZWZpbml0ZWAgZGVzY3JpcHRvci5cbiAqIElmIHN0YWtpbmdQYXJhbXMuaW5kZXggaXMgcHJvdmlkZWQsIHRoZW4gdGhpcyBpcyBhc3N1bWVkIHRvIGJlIGEgYGRlcml2YWJsZWAgZGVzY3JpcHRvci5cbiAqIEBwYXJhbSBvcFJldHVyblBhcmFtcyB0byBjcmVhdGUgdGhlIE9QX1JFVFVSTiBvdXRwdXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVN0YWtpbmdPdXRwdXRzKFxuICBzdGFraW5nUGFyYW1zOiB7XG4gICAgYW1vdW50OiBiaWdpbnQ7XG4gICAgZGVzY3JpcHRvcjogRGVzY3JpcHRvcjtcbiAgICBpbmRleD86IG51bWJlcjtcbiAgfSxcbiAgb3BSZXR1cm5QYXJhbXM6IE9wUmV0dXJuUGFyYW1zXG4pOiB7IHNjcmlwdDogQnVmZmVyOyBhbW91bnQ6IGJpZ2ludCB9W10ge1xuICBpZiAoc3Rha2luZ1BhcmFtcy5kZXNjcmlwdG9yLmhhc1dpbGRjYXJkKCkgJiYgc3Rha2luZ1BhcmFtcy5pbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY3JlYXRlIHN0YWtpbmcgb3V0cHV0cyB3aXRoIGEgd2lsZGNhcmQgZGVzY3JpcHRvciBhbmQgbm8gZGVyaXZhdGlvbiBpbmRleCcpO1xuICB9XG5cbiAgY29uc3Qgb3V0cHV0U2NyaXB0ID0gQnVmZmVyLmZyb20oXG4gICAgc3Rha2luZ1BhcmFtcy5pbmRleCA9PT0gdW5kZWZpbmVkXG4gICAgICA/IHN0YWtpbmdQYXJhbXMuZGVzY3JpcHRvci5zY3JpcHRQdWJrZXkoKVxuICAgICAgOiBzdGFraW5nUGFyYW1zLmRlc2NyaXB0b3IuYXREZXJpdmF0aW9uSW5kZXgoc3Rha2luZ1BhcmFtcy5pbmRleCkuc2NyaXB0UHVia2V5KClcbiAgKTtcbiAgY29uc3Qgb3BSZXR1cm5TY3JpcHQgPSBjcmVhdGVDb3JlRGFvT3BSZXR1cm5PdXRwdXRTY3JpcHQob3BSZXR1cm5QYXJhbXMpO1xuXG4gIHJldHVybiBbXG4gICAgeyBzY3JpcHQ6IG91dHB1dFNjcmlwdCwgYW1vdW50OiBzdGFraW5nUGFyYW1zLmFtb3VudCB9LFxuICAgIHsgc2NyaXB0OiBvcFJldHVyblNjcmlwdCwgYW1vdW50OiBCaWdJbnQoMCkgfSxcbiAgXTtcbn1cbiJdfQ==
|
package/dist/src/index.d.ts
DELETED
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
/// <reference types="node" />
|
|
2
|
-
/// <reference types="node" />
|
|
3
|
-
import * as utxolib from '@bitgo-beta/utxo-lib';
|
|
4
|
-
/**
|
|
5
|
-
* Build a staking transaction for a wallet that assumes 2-of-3 multisig for the inputs
|
|
6
|
-
*
|
|
7
|
-
* Given the inputs and the staking outputs, we will create the PSBT with the desired fee rate.
|
|
8
|
-
* We always add the change address as the last output.
|
|
9
|
-
*
|
|
10
|
-
* @param rootWalletKeys
|
|
11
|
-
* @param unspents
|
|
12
|
-
* @param createStakingOutputs
|
|
13
|
-
* @param changeAddressInfo
|
|
14
|
-
* @param feeRateSatKB
|
|
15
|
-
* @param network
|
|
16
|
-
*/
|
|
17
|
-
export declare function buildFixedWalletStakingPsbt({ rootWalletKeys, unspents, outputs, changeAddressInfo, feeRateSatKB, network, skipNonWitnessUtxo, dustAmount, }: {
|
|
18
|
-
rootWalletKeys: utxolib.bitgo.RootWalletKeys;
|
|
19
|
-
unspents: utxolib.bitgo.WalletUnspent<bigint>[];
|
|
20
|
-
outputs: {
|
|
21
|
-
script: Buffer;
|
|
22
|
-
value: bigint;
|
|
23
|
-
}[];
|
|
24
|
-
changeAddressInfo: {
|
|
25
|
-
chain: utxolib.bitgo.ChainCode;
|
|
26
|
-
index: number;
|
|
27
|
-
address: string;
|
|
28
|
-
};
|
|
29
|
-
feeRateSatKB: number;
|
|
30
|
-
network: utxolib.Network;
|
|
31
|
-
skipNonWitnessUtxo?: boolean;
|
|
32
|
-
dustAmount?: bigint;
|
|
33
|
-
}): utxolib.bitgo.UtxoPsbt;
|
|
34
|
-
//# sourceMappingURL=transaction.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"transaction.d.ts","sourceRoot":"","sources":["../../src/transaction.ts"],"names":[],"mappings":";;AAAA,OAAO,KAAK,OAAO,MAAM,sBAAsB,CAAC;AAGhD;;;;;;;;;;;;GAYG;AACH,wBAAgB,2BAA2B,CAAC,EAC1C,cAAc,EACd,QAAQ,EACR,OAAO,EACP,iBAAiB,EACjB,YAAY,EACZ,OAAO,EACP,kBAAkB,EAClB,UAAsB,GACvB,EAAE;IACD,cAAc,EAAE,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC;IAC7C,QAAQ,EAAE,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;IAChD,OAAO,EAAE;QACP,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;KACf,EAAE,CAAC;IACJ,iBAAiB,EAAE;QACjB,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC;QAC/B,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC;IACzB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,CA0DzB"}
|
package/dist/src/transaction.js
DELETED
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.buildFixedWalletStakingPsbt = void 0;
|
|
4
|
-
const utxolib = require("@bitgo-beta/utxo-lib");
|
|
5
|
-
const unspents_1 = require("@bitgo-beta/unspents");
|
|
6
|
-
/**
|
|
7
|
-
* Build a staking transaction for a wallet that assumes 2-of-3 multisig for the inputs
|
|
8
|
-
*
|
|
9
|
-
* Given the inputs and the staking outputs, we will create the PSBT with the desired fee rate.
|
|
10
|
-
* We always add the change address as the last output.
|
|
11
|
-
*
|
|
12
|
-
* @param rootWalletKeys
|
|
13
|
-
* @param unspents
|
|
14
|
-
* @param createStakingOutputs
|
|
15
|
-
* @param changeAddressInfo
|
|
16
|
-
* @param feeRateSatKB
|
|
17
|
-
* @param network
|
|
18
|
-
*/
|
|
19
|
-
function buildFixedWalletStakingPsbt({ rootWalletKeys, unspents, outputs, changeAddressInfo, feeRateSatKB, network, skipNonWitnessUtxo, dustAmount = BigInt(0), }) {
|
|
20
|
-
if (feeRateSatKB < 1000) {
|
|
21
|
-
throw new Error('Fee rate must be at least 1 sat/vbyte');
|
|
22
|
-
}
|
|
23
|
-
if (unspents.length === 0 || outputs.length === 0) {
|
|
24
|
-
throw new Error('Must have at least one input and one output');
|
|
25
|
-
}
|
|
26
|
-
// Check the change address info
|
|
27
|
-
const changeScript = utxolib.bitgo.outputScripts.createOutputScript2of3(rootWalletKeys.deriveForChainAndIndex(changeAddressInfo.chain, changeAddressInfo.index).publicKeys, utxolib.bitgo.scriptTypeForChain(changeAddressInfo.chain), network).scriptPubKey;
|
|
28
|
-
if (!changeScript.equals(utxolib.addressFormat.toOutputScriptTryFormats(changeAddressInfo.address, network))) {
|
|
29
|
-
throw new Error('Change address info does not match the derived change script');
|
|
30
|
-
}
|
|
31
|
-
const psbt = utxolib.bitgo.createPsbtForNetwork({ network });
|
|
32
|
-
utxolib.bitgo.addXpubsToPsbt(psbt, rootWalletKeys);
|
|
33
|
-
const inputAmount = unspents.reduce((sum, unspent) => sum + unspent.value, BigInt(0));
|
|
34
|
-
const outputAmount = outputs.reduce((sum, output) => sum + output.value, BigInt(0));
|
|
35
|
-
unspents.forEach((unspent) => utxolib.bitgo.addWalletUnspentToPsbt(psbt, unspent, rootWalletKeys, 'user', 'bitgo', {
|
|
36
|
-
isReplaceableByFee: true,
|
|
37
|
-
skipNonWitnessUtxo,
|
|
38
|
-
}));
|
|
39
|
-
outputs.forEach((output) => psbt.addOutput(output));
|
|
40
|
-
const fee = Math.ceil((unspents_1.Dimensions.fromPsbt(psbt)
|
|
41
|
-
.plus(unspents_1.Dimensions.fromOutput({ script: changeScript }))
|
|
42
|
-
.getVSize() *
|
|
43
|
-
feeRateSatKB) /
|
|
44
|
-
1000);
|
|
45
|
-
const changeAmount = inputAmount - (outputAmount + BigInt(fee));
|
|
46
|
-
if (changeAmount < BigInt(0)) {
|
|
47
|
-
throw new Error(`Input amount ${inputAmount.toString()} cannot cover the staking amount ${outputAmount} and the fee: ${fee}`);
|
|
48
|
-
}
|
|
49
|
-
if (changeAmount > dustAmount) {
|
|
50
|
-
utxolib.bitgo.addWalletOutputToPsbt(psbt, rootWalletKeys, changeAddressInfo.chain, changeAddressInfo.index, changeAmount);
|
|
51
|
-
}
|
|
52
|
-
return psbt;
|
|
53
|
-
}
|
|
54
|
-
exports.buildFixedWalletStakingPsbt = buildFixedWalletStakingPsbt;
|
|
55
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHJhbnNhY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsZ0RBQWdEO0FBQ2hELG1EQUFrRDtBQUVsRDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxTQUFnQiwyQkFBMkIsQ0FBQyxFQUMxQyxjQUFjLEVBQ2QsUUFBUSxFQUNSLE9BQU8sRUFDUCxpQkFBaUIsRUFDakIsWUFBWSxFQUNaLE9BQU8sRUFDUCxrQkFBa0IsRUFDbEIsVUFBVSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FpQnZCO0lBQ0MsSUFBSSxZQUFZLEdBQUcsSUFBSSxFQUFFO1FBQ3ZCLE1BQU0sSUFBSSxLQUFLLENBQUMsdUNBQXVDLENBQUMsQ0FBQztLQUMxRDtJQUNELElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDakQsTUFBTSxJQUFJLEtBQUssQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFDO0tBQ2hFO0lBRUQsZ0NBQWdDO0lBQ2hDLE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLHNCQUFzQixDQUNyRSxjQUFjLENBQUMsc0JBQXNCLENBQUMsaUJBQWlCLENBQUMsS0FBSyxFQUFFLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDLFVBQVUsRUFDbEcsT0FBTyxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsRUFDekQsT0FBTyxDQUNSLENBQUMsWUFBWSxDQUFDO0lBQ2YsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyx3QkFBd0IsQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUMsRUFBRTtRQUM1RyxNQUFNLElBQUksS0FBSyxDQUFDLDhEQUE4RCxDQUFDLENBQUM7S0FDakY7SUFFRCxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLG9CQUFvQixDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUM3RCxPQUFPLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFFbkQsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxPQUFPLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3RGLE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVwRixRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FDM0IsT0FBTyxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFO1FBQ25GLGtCQUFrQixFQUFFLElBQUk7UUFDeEIsa0JBQWtCO0tBQ25CLENBQUMsQ0FDSCxDQUFDO0lBQ0YsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBRXBELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQ25CLENBQUMscUJBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO1NBQ3ZCLElBQUksQ0FBQyxxQkFBVSxDQUFDLFVBQVUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFDO1NBQ3JELFFBQVEsRUFBRTtRQUNYLFlBQVksQ0FBQztRQUNiLElBQUksQ0FDUCxDQUFDO0lBRUYsTUFBTSxZQUFZLEdBQUcsV0FBVyxHQUFHLENBQUMsWUFBWSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ2hFLElBQUksWUFBWSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUM1QixNQUFNLElBQUksS0FBSyxDQUNiLGdCQUFnQixXQUFXLENBQUMsUUFBUSxFQUFFLG9DQUFvQyxZQUFZLGtCQUFrQixHQUFHLEVBQUUsQ0FDOUcsQ0FBQztLQUNIO0lBRUQsSUFBSSxZQUFZLEdBQUcsVUFBVSxFQUFFO1FBQzdCLE9BQU8sQ0FBQyxLQUFLLENBQUMscUJBQXFCLENBQ2pDLElBQUksRUFDSixjQUFjLEVBQ2QsaUJBQWlCLENBQUMsS0FBSyxFQUN2QixpQkFBaUIsQ0FBQyxLQUFLLEVBQ3ZCLFlBQVksQ0FDYixDQUFDO0tBQ0g7SUFFRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFuRkQsa0VBbUZDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgdXR4b2xpYiBmcm9tICdAYml0Z28tYmV0YS91dHhvLWxpYic7XG5pbXBvcnQgeyBEaW1lbnNpb25zIH0gZnJvbSAnQGJpdGdvLWJldGEvdW5zcGVudHMnO1xuXG4vKipcbiAqIEJ1aWxkIGEgc3Rha2luZyB0cmFuc2FjdGlvbiBmb3IgYSB3YWxsZXQgdGhhdCBhc3N1bWVzIDItb2YtMyBtdWx0aXNpZyBmb3IgdGhlIGlucHV0c1xuICpcbiAqIEdpdmVuIHRoZSBpbnB1dHMgYW5kIHRoZSBzdGFraW5nIG91dHB1dHMsIHdlIHdpbGwgY3JlYXRlIHRoZSBQU0JUIHdpdGggdGhlIGRlc2lyZWQgZmVlIHJhdGUuXG4gKiBXZSBhbHdheXMgYWRkIHRoZSBjaGFuZ2UgYWRkcmVzcyBhcyB0aGUgbGFzdCBvdXRwdXQuXG4gKlxuICogQHBhcmFtIHJvb3RXYWxsZXRLZXlzXG4gKiBAcGFyYW0gdW5zcGVudHNcbiAqIEBwYXJhbSBjcmVhdGVTdGFraW5nT3V0cHV0c1xuICogQHBhcmFtIGNoYW5nZUFkZHJlc3NJbmZvXG4gKiBAcGFyYW0gZmVlUmF0ZVNhdEtCXG4gKiBAcGFyYW0gbmV0d29ya1xuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRGaXhlZFdhbGxldFN0YWtpbmdQc2J0KHtcbiAgcm9vdFdhbGxldEtleXMsXG4gIHVuc3BlbnRzLFxuICBvdXRwdXRzLFxuICBjaGFuZ2VBZGRyZXNzSW5mbyxcbiAgZmVlUmF0ZVNhdEtCLFxuICBuZXR3b3JrLFxuICBza2lwTm9uV2l0bmVzc1V0eG8sXG4gIGR1c3RBbW91bnQgPSBCaWdJbnQoMCksXG59OiB7XG4gIHJvb3RXYWxsZXRLZXlzOiB1dHhvbGliLmJpdGdvLlJvb3RXYWxsZXRLZXlzO1xuICB1bnNwZW50czogdXR4b2xpYi5iaXRnby5XYWxsZXRVbnNwZW50PGJpZ2ludD5bXTtcbiAgb3V0cHV0czoge1xuICAgIHNjcmlwdDogQnVmZmVyO1xuICAgIHZhbHVlOiBiaWdpbnQ7XG4gIH1bXTtcbiAgY2hhbmdlQWRkcmVzc0luZm86IHtcbiAgICBjaGFpbjogdXR4b2xpYi5iaXRnby5DaGFpbkNvZGU7XG4gICAgaW5kZXg6IG51bWJlcjtcbiAgICBhZGRyZXNzOiBzdHJpbmc7XG4gIH07XG4gIGZlZVJhdGVTYXRLQjogbnVtYmVyO1xuICBuZXR3b3JrOiB1dHhvbGliLk5ldHdvcms7XG4gIHNraXBOb25XaXRuZXNzVXR4bz86IGJvb2xlYW47XG4gIGR1c3RBbW91bnQ/OiBiaWdpbnQ7XG59KTogdXR4b2xpYi5iaXRnby5VdHhvUHNidCB7XG4gIGlmIChmZWVSYXRlU2F0S0IgPCAxMDAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdGZWUgcmF0ZSBtdXN0IGJlIGF0IGxlYXN0IDEgc2F0L3ZieXRlJyk7XG4gIH1cbiAgaWYgKHVuc3BlbnRzLmxlbmd0aCA9PT0gMCB8fCBvdXRwdXRzLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignTXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBpbnB1dCBhbmQgb25lIG91dHB1dCcpO1xuICB9XG5cbiAgLy8gQ2hlY2sgdGhlIGNoYW5nZSBhZGRyZXNzIGluZm9cbiAgY29uc3QgY2hhbmdlU2NyaXB0ID0gdXR4b2xpYi5iaXRnby5vdXRwdXRTY3JpcHRzLmNyZWF0ZU91dHB1dFNjcmlwdDJvZjMoXG4gICAgcm9vdFdhbGxldEtleXMuZGVyaXZlRm9yQ2hhaW5BbmRJbmRleChjaGFuZ2VBZGRyZXNzSW5mby5jaGFpbiwgY2hhbmdlQWRkcmVzc0luZm8uaW5kZXgpLnB1YmxpY0tleXMsXG4gICAgdXR4b2xpYi5iaXRnby5zY3JpcHRUeXBlRm9yQ2hhaW4oY2hhbmdlQWRkcmVzc0luZm8uY2hhaW4pLFxuICAgIG5ldHdvcmtcbiAgKS5zY3JpcHRQdWJLZXk7XG4gIGlmICghY2hhbmdlU2NyaXB0LmVxdWFscyh1dHhvbGliLmFkZHJlc3NGb3JtYXQudG9PdXRwdXRTY3JpcHRUcnlGb3JtYXRzKGNoYW5nZUFkZHJlc3NJbmZvLmFkZHJlc3MsIG5ldHdvcmspKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignQ2hhbmdlIGFkZHJlc3MgaW5mbyBkb2VzIG5vdCBtYXRjaCB0aGUgZGVyaXZlZCBjaGFuZ2Ugc2NyaXB0Jyk7XG4gIH1cblxuICBjb25zdCBwc2J0ID0gdXR4b2xpYi5iaXRnby5jcmVhdGVQc2J0Rm9yTmV0d29yayh7IG5ldHdvcmsgfSk7XG4gIHV0eG9saWIuYml0Z28uYWRkWHB1YnNUb1BzYnQocHNidCwgcm9vdFdhbGxldEtleXMpO1xuXG4gIGNvbnN0IGlucHV0QW1vdW50ID0gdW5zcGVudHMucmVkdWNlKChzdW0sIHVuc3BlbnQpID0+IHN1bSArIHVuc3BlbnQudmFsdWUsIEJpZ0ludCgwKSk7XG4gIGNvbnN0IG91dHB1dEFtb3VudCA9IG91dHB1dHMucmVkdWNlKChzdW0sIG91dHB1dCkgPT4gc3VtICsgb3V0cHV0LnZhbHVlLCBCaWdJbnQoMCkpO1xuXG4gIHVuc3BlbnRzLmZvckVhY2goKHVuc3BlbnQpID0+XG4gICAgdXR4b2xpYi5iaXRnby5hZGRXYWxsZXRVbnNwZW50VG9Qc2J0KHBzYnQsIHVuc3BlbnQsIHJvb3RXYWxsZXRLZXlzLCAndXNlcicsICdiaXRnbycsIHtcbiAgICAgIGlzUmVwbGFjZWFibGVCeUZlZTogdHJ1ZSxcbiAgICAgIHNraXBOb25XaXRuZXNzVXR4byxcbiAgICB9KVxuICApO1xuICBvdXRwdXRzLmZvckVhY2goKG91dHB1dCkgPT4gcHNidC5hZGRPdXRwdXQob3V0cHV0KSk7XG5cbiAgY29uc3QgZmVlID0gTWF0aC5jZWlsKFxuICAgIChEaW1lbnNpb25zLmZyb21Qc2J0KHBzYnQpXG4gICAgICAucGx1cyhEaW1lbnNpb25zLmZyb21PdXRwdXQoeyBzY3JpcHQ6IGNoYW5nZVNjcmlwdCB9KSlcbiAgICAgIC5nZXRWU2l6ZSgpICpcbiAgICAgIGZlZVJhdGVTYXRLQikgL1xuICAgICAgMTAwMFxuICApO1xuXG4gIGNvbnN0IGNoYW5nZUFtb3VudCA9IGlucHV0QW1vdW50IC0gKG91dHB1dEFtb3VudCArIEJpZ0ludChmZWUpKTtcbiAgaWYgKGNoYW5nZUFtb3VudCA8IEJpZ0ludCgwKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBJbnB1dCBhbW91bnQgJHtpbnB1dEFtb3VudC50b1N0cmluZygpfSBjYW5ub3QgY292ZXIgdGhlIHN0YWtpbmcgYW1vdW50ICR7b3V0cHV0QW1vdW50fSBhbmQgIHRoZSBmZWU6ICR7ZmVlfWBcbiAgICApO1xuICB9XG5cbiAgaWYgKGNoYW5nZUFtb3VudCA+IGR1c3RBbW91bnQpIHtcbiAgICB1dHhvbGliLmJpdGdvLmFkZFdhbGxldE91dHB1dFRvUHNidChcbiAgICAgIHBzYnQsXG4gICAgICByb290V2FsbGV0S2V5cyxcbiAgICAgIGNoYW5nZUFkZHJlc3NJbmZvLmNoYWluLFxuICAgICAgY2hhbmdlQWRkcmVzc0luZm8uaW5kZXgsXG4gICAgICBjaGFuZ2VBbW91bnRcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIHBzYnQ7XG59XG4iXX0=
|
|
File without changes
|
|
File without changes
|