@bitgo-beta/sdk-coin-polyx 1.0.1-beta.45 → 1.0.1-beta.451
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/src/index.d.ts +1 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +2 -1
- package/dist/src/lib/baseBuilder.d.ts +24 -0
- package/dist/src/lib/baseBuilder.d.ts.map +1 -0
- package/dist/src/lib/baseBuilder.js +31 -0
- package/dist/src/lib/batchStakingBuilder.d.ts +79 -0
- package/dist/src/lib/batchStakingBuilder.d.ts.map +1 -0
- package/dist/src/lib/batchStakingBuilder.js +299 -0
- package/dist/src/lib/batchUnstakingBuilder.d.ts +39 -0
- package/dist/src/lib/batchUnstakingBuilder.d.ts.map +1 -0
- package/dist/src/lib/batchUnstakingBuilder.js +127 -0
- package/dist/src/lib/bondExtraBuilder.d.ts +37 -0
- package/dist/src/lib/bondExtraBuilder.d.ts.map +1 -0
- package/dist/src/lib/bondExtraBuilder.js +101 -0
- package/dist/src/lib/constants.d.ts +12 -0
- package/dist/src/lib/constants.d.ts.map +1 -0
- package/dist/src/lib/constants.js +15 -0
- package/dist/src/lib/iface.d.ts +126 -3
- package/dist/src/lib/iface.d.ts.map +1 -1
- package/dist/src/lib/iface.js +36 -1
- package/dist/src/lib/index.d.ts +15 -7
- package/dist/src/lib/index.d.ts.map +1 -1
- package/dist/src/lib/index.js +42 -36
- package/dist/src/lib/preApproveAssetBuilder.d.ts +33 -0
- package/dist/src/lib/preApproveAssetBuilder.d.ts.map +1 -0
- package/dist/src/lib/preApproveAssetBuilder.js +77 -0
- package/dist/src/lib/registerDidWithCDDBuilder.d.ts +34 -0
- package/dist/src/lib/registerDidWithCDDBuilder.d.ts.map +1 -0
- package/dist/src/lib/registerDidWithCDDBuilder.js +83 -0
- package/dist/src/lib/tokenTransferBuilder.d.ts +58 -0
- package/dist/src/lib/tokenTransferBuilder.d.ts.map +1 -0
- package/dist/src/lib/tokenTransferBuilder.js +159 -0
- package/dist/src/lib/transaction.d.ts +18 -4
- package/dist/src/lib/transaction.d.ts.map +1 -1
- package/dist/src/lib/transaction.js +136 -8
- package/dist/src/lib/transactionBuilderFactory.d.ts +27 -5
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilderFactory.js +112 -8
- package/dist/src/lib/transferBuilder.d.ts +51 -3
- package/dist/src/lib/transferBuilder.d.ts.map +1 -1
- package/dist/src/lib/transferBuilder.js +109 -3
- package/dist/src/lib/txnSchema.d.ts +49 -0
- package/dist/src/lib/txnSchema.d.ts.map +1 -0
- package/dist/src/lib/txnSchema.js +145 -0
- package/dist/src/lib/unbondBuilder.d.ts +37 -0
- package/dist/src/lib/unbondBuilder.d.ts.map +1 -0
- package/dist/src/lib/unbondBuilder.js +98 -0
- package/dist/src/lib/utils.d.ts +15 -14
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +40 -23
- package/dist/src/lib/withdrawUnbondedBuilder.d.ts +35 -0
- package/dist/src/lib/withdrawUnbondedBuilder.d.ts.map +1 -0
- package/dist/src/lib/withdrawUnbondedBuilder.js +89 -0
- package/dist/src/polyx.d.ts +50 -9
- package/dist/src/polyx.d.ts.map +1 -1
- package/dist/src/polyx.js +270 -16
- package/dist/src/polyxToken.d.ts +20 -0
- package/dist/src/polyxToken.d.ts.map +1 -0
- package/dist/src/polyxToken.js +55 -0
- package/dist/src/register.d.ts.map +1 -1
- package/dist/src/register.js +5 -1
- package/dist/src/resources/index.d.ts +3 -0
- package/dist/src/resources/index.d.ts.map +1 -0
- package/dist/src/resources/index.js +19 -0
- package/dist/src/resources/mainnet.d.ts +13 -0
- package/dist/src/resources/mainnet.d.ts.map +1 -0
- package/dist/src/resources/mainnet.js +16 -0
- package/dist/src/resources/testnet.d.ts +13 -0
- package/dist/src/resources/testnet.d.ts.map +1 -0
- package/dist/src/resources/testnet.js +16 -0
- package/dist/src/tpolyx.d.ts +7 -0
- package/dist/src/tpolyx.d.ts.map +1 -1
- package/dist/src/tpolyx.js +11 -1
- package/dist/test/integration/index.d.ts +1 -0
- package/dist/test/integration/index.d.ts.map +1 -0
- package/dist/test/integration/index.js +1 -0
- package/dist/test/resources/index.d.ts +102 -0
- package/dist/test/resources/index.d.ts.map +1 -0
- package/dist/test/resources/index.js +108 -0
- package/dist/test/resources/mainnet.d.ts +2 -0
- package/dist/test/resources/mainnet.d.ts.map +1 -0
- package/dist/test/resources/mainnet.js +5 -0
- package/dist/test/resources/materialData.json +8 -0
- package/dist/test/resources/materialDataModified.json +8 -0
- package/dist/test/resources/testnet.d.ts +2 -0
- package/dist/test/resources/testnet.d.ts.map +1 -0
- package/dist/test/resources/testnet.js +5 -0
- package/dist/test/resources/wrwUsers.d.ts +19 -0
- package/dist/test/resources/wrwUsers.d.ts.map +1 -0
- package/dist/test/resources/wrwUsers.js +60 -0
- package/dist/test/unit/polyx.d.ts +2 -0
- package/dist/test/unit/polyx.d.ts.map +1 -0
- package/dist/test/unit/polyx.js +209 -0
- package/dist/test/unit/transactionBuilder/base.d.ts +4 -0
- package/dist/test/unit/transactionBuilder/base.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/base.js +245 -0
- package/dist/test/unit/transactionBuilder/batchStakingBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/batchStakingBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/batchStakingBuilder.js +263 -0
- package/dist/test/unit/transactionBuilder/batchUnstakingBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/batchUnstakingBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/batchUnstakingBuilder.js +159 -0
- package/dist/test/unit/transactionBuilder/bondExtraBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/bondExtraBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/bondExtraBuilder.js +158 -0
- package/dist/test/unit/transactionBuilder/preApproveAssetBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/preApproveAssetBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/preApproveAssetBuilder.js +115 -0
- package/dist/test/unit/transactionBuilder/registerDidWithCDDBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/registerDidWithCDDBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/registerDidWithCDDBuilder.js +302 -0
- package/dist/test/unit/transactionBuilder/singletonRegistry.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/singletonRegistry.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/singletonRegistry.js +59 -0
- package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/tokenTransferBuilder.js +140 -0
- package/dist/test/unit/transactionBuilder/transactionBuilderFactory.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/transactionBuilderFactory.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/transactionBuilderFactory.js +74 -0
- package/dist/test/unit/transactionBuilder/transferBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/transferBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/transferBuilder.js +326 -0
- package/dist/test/unit/transactionBuilder/unbondBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/unbondBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/unbondBuilder.js +144 -0
- package/dist/test/unit/transactionBuilder/withdrawUnbondedBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/withdrawUnbondedBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/withdrawUnbondedBuilder.js +138 -0
- package/dist/test/unit/utils.d.ts +2 -0
- package/dist/test/unit/utils.d.ts.map +1 -0
- package/dist/test/unit/utils.js +143 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +19 -10
- package/.eslintignore +0 -4
- package/.mocharc.yml +0 -8
- package/CHANGELOG.md +0 -8
- package/dist/src/lib/keyPair.d.ts +0 -12
- package/dist/src/lib/keyPair.d.ts.map +0 -1
- package/dist/src/lib/keyPair.js +0 -24
- package/dist/src/lib/transactionBuilder.d.ts +0 -43
- package/dist/src/lib/transactionBuilder.d.ts.map +0 -1
- package/dist/src/lib/transactionBuilder.js +0 -78
|
@@ -1,17 +1,145 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
2
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
6
|
exports.Transaction = void 0;
|
|
7
|
+
const abstract_substrate_1 = require("@bitgo-beta/abstract-substrate");
|
|
4
8
|
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
const txwrapper_polkadot_1 = require("@substrate/txwrapper-polkadot");
|
|
10
|
+
const keyring_1 = require("@polkadot/keyring");
|
|
11
|
+
const utils_1 = __importDefault(require("./utils"));
|
|
12
|
+
class Transaction extends abstract_substrate_1.Transaction {
|
|
13
|
+
/**
|
|
14
|
+
* Override the getAddressFormat method to return different values based on network type
|
|
15
|
+
* Returns 12 for mainnet and 42 for testnet
|
|
16
|
+
*
|
|
17
|
+
* @returns {number} The address format to use
|
|
18
|
+
* @override
|
|
19
|
+
*/
|
|
20
|
+
getAddressFormat() {
|
|
21
|
+
return utils_1.default.getAddressFormat(this._coinConfig.name);
|
|
11
22
|
}
|
|
23
|
+
/** @inheritdoc */
|
|
12
24
|
toJson() {
|
|
13
|
-
|
|
25
|
+
if (!this._substrateTransaction) {
|
|
26
|
+
throw new sdk_core_1.InvalidTransactionError('Empty transaction');
|
|
27
|
+
}
|
|
28
|
+
const decodedTx = (0, txwrapper_polkadot_1.decode)(this._substrateTransaction, {
|
|
29
|
+
metadataRpc: this._substrateTransaction.metadataRpc,
|
|
30
|
+
registry: this._registry,
|
|
31
|
+
isImmortalEra: abstract_substrate_1.utils.isZeroHex(this._substrateTransaction.era),
|
|
32
|
+
});
|
|
33
|
+
const result = {
|
|
34
|
+
id: txwrapper_polkadot_1.construct.txHash(this.toBroadcastFormat()),
|
|
35
|
+
sender: decodedTx.address,
|
|
36
|
+
referenceBlock: decodedTx.blockHash,
|
|
37
|
+
blockNumber: decodedTx.blockNumber,
|
|
38
|
+
genesisHash: decodedTx.genesisHash,
|
|
39
|
+
nonce: decodedTx.nonce,
|
|
40
|
+
specVersion: decodedTx.specVersion,
|
|
41
|
+
transactionVersion: decodedTx.transactionVersion,
|
|
42
|
+
eraPeriod: decodedTx.eraPeriod,
|
|
43
|
+
chainName: this._chainName,
|
|
44
|
+
tip: decodedTx.tip ? Number(decodedTx.tip) : 0,
|
|
45
|
+
};
|
|
46
|
+
const txMethod = decodedTx.method.args;
|
|
47
|
+
if (this.type === sdk_core_1.TransactionType.WalletInitialization) {
|
|
48
|
+
const { targetAccount } = txMethod;
|
|
49
|
+
const keypairDest = new abstract_substrate_1.KeyPair({
|
|
50
|
+
pub: Buffer.from((0, keyring_1.decodeAddress)(targetAccount)).toString('hex'),
|
|
51
|
+
});
|
|
52
|
+
result.to = keypairDest.getAddress(this.getAddressFormat());
|
|
53
|
+
result.amount = '0'; // RegisterDidWithCDD does not transfer any value
|
|
54
|
+
}
|
|
55
|
+
else if (this.type === sdk_core_1.TransactionType.TrustLine) {
|
|
56
|
+
const { assetId } = txMethod;
|
|
57
|
+
result.assetId = assetId;
|
|
58
|
+
result.sender = decodedTx.address;
|
|
59
|
+
result.amount = '0'; // Pre-approval does not transfer any value
|
|
60
|
+
}
|
|
61
|
+
else if (this.type === sdk_core_1.TransactionType.SendToken) {
|
|
62
|
+
const sendTokenArgs = txMethod;
|
|
63
|
+
result.fromDID = sendTokenArgs.legs[0].fungible.sender.did;
|
|
64
|
+
result.toDID = sendTokenArgs.legs[0].fungible.receiver.did;
|
|
65
|
+
result.amount = sendTokenArgs.legs[0].fungible.amount.toString();
|
|
66
|
+
result.assetId = sendTokenArgs.legs[0].fungible.assetId;
|
|
67
|
+
result.memo = sendTokenArgs.instructionMemo;
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
return super.toJson();
|
|
71
|
+
}
|
|
72
|
+
return result;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Load the input and output data on this transaction.
|
|
76
|
+
*/
|
|
77
|
+
loadInputsAndOutputs() {
|
|
78
|
+
super.loadInputsAndOutputs();
|
|
79
|
+
const decodedTx = (0, txwrapper_polkadot_1.decode)(this._substrateTransaction, {
|
|
80
|
+
metadataRpc: this._substrateTransaction.metadataRpc,
|
|
81
|
+
registry: this._registry,
|
|
82
|
+
isImmortalEra: abstract_substrate_1.utils.isZeroHex(this._substrateTransaction.era),
|
|
83
|
+
});
|
|
84
|
+
if (this.type === sdk_core_1.TransactionType.WalletInitialization) {
|
|
85
|
+
this.decodeInputsAndOutputsForRegisterDidWithCDD(decodedTx);
|
|
86
|
+
}
|
|
87
|
+
else if (this.type === sdk_core_1.TransactionType.TrustLine) {
|
|
88
|
+
this.decodeInputsAndOutputsForPreApproveAsset(decodedTx);
|
|
89
|
+
}
|
|
90
|
+
else if (this.type === sdk_core_1.TransactionType.SendToken) {
|
|
91
|
+
this.decodeInputsAndOutputsForSendToken(decodedTx);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
decodeInputsAndOutputsForRegisterDidWithCDD(decodedTx) {
|
|
95
|
+
const txMethod = decodedTx.method.args;
|
|
96
|
+
const keypairDest = new abstract_substrate_1.KeyPair({
|
|
97
|
+
pub: Buffer.from((0, keyring_1.decodeAddress)(txMethod.targetAccount)).toString('hex'),
|
|
98
|
+
});
|
|
99
|
+
const to = keypairDest.getAddress(this.getAddressFormat());
|
|
100
|
+
const value = '0';
|
|
101
|
+
const from = decodedTx.address;
|
|
102
|
+
this._inputs.push({
|
|
103
|
+
address: from,
|
|
104
|
+
value,
|
|
105
|
+
coin: this._coinConfig.name,
|
|
106
|
+
});
|
|
107
|
+
this._outputs.push({
|
|
108
|
+
address: to,
|
|
109
|
+
value,
|
|
110
|
+
coin: this._coinConfig.name,
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
decodeInputsAndOutputsForPreApproveAsset(decodedTx) {
|
|
114
|
+
const sender = decodedTx.address;
|
|
115
|
+
const value = '0'; // Pre-approval does not transfer any value
|
|
116
|
+
this._inputs.push({
|
|
117
|
+
address: sender,
|
|
118
|
+
value,
|
|
119
|
+
coin: this._coinConfig.name,
|
|
120
|
+
});
|
|
121
|
+
this._outputs.push({
|
|
122
|
+
address: sender, // In pre-approval, the output is the same as the input
|
|
123
|
+
value,
|
|
124
|
+
coin: this._coinConfig.name,
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
decodeInputsAndOutputsForSendToken(decodedTx) {
|
|
128
|
+
const txMethod = decodedTx.method.args;
|
|
129
|
+
const fromDID = txMethod.legs[0].fungible.sender.did;
|
|
130
|
+
const toDID = txMethod.legs[0].fungible.receiver.did;
|
|
131
|
+
const amount = txMethod.legs[0].fungible.amount.toString();
|
|
132
|
+
this._inputs.push({
|
|
133
|
+
address: fromDID,
|
|
134
|
+
value: amount,
|
|
135
|
+
coin: this._coinConfig.name,
|
|
136
|
+
});
|
|
137
|
+
this._outputs.push({
|
|
138
|
+
address: toDID,
|
|
139
|
+
value: amount,
|
|
140
|
+
coin: this._coinConfig.name,
|
|
141
|
+
});
|
|
14
142
|
}
|
|
15
143
|
}
|
|
16
144
|
exports.Transaction = Transaction;
|
|
17
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3RyYW5zYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1EQUFnRTtBQUdoRSxNQUFhLFdBQVksU0FBUSwwQkFBZTtJQUM5QyxPQUFPLENBQUMsR0FBWTtRQUNsQixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxpQkFBaUI7UUFDZixNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVELE1BQU07UUFDSixNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQUM7SUFDN0MsQ0FBQztDQUNGO0FBWkQsa0NBWUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCYXNlS2V5LCBCYXNlVHJhbnNhY3Rpb24gfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgeyBUeERhdGEgfSBmcm9tICcuL2lmYWNlJztcblxuZXhwb3J0IGNsYXNzIFRyYW5zYWN0aW9uIGV4dGVuZHMgQmFzZVRyYW5zYWN0aW9uIHtcbiAgY2FuU2lnbihrZXk6IEJhc2VLZXkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB0b0Jyb2FkY2FzdEZvcm1hdCgpOiBzdHJpbmcge1xuICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgfVxuXG4gIHRvSnNvbigpOiBUeERhdGEge1xuICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgfVxufVxuIl19
|
|
145
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3RyYW5zYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLHVFQUFxRztBQUNyRyxtREFBZ0Y7QUFDaEYsc0VBQWtFO0FBQ2xFLCtDQUFrRDtBQUVsRCxvREFBaUM7QUFFakMsTUFBYSxXQUFZLFNBQVEsZ0NBQW9CO0lBQ25EOzs7Ozs7T0FNRztJQUNPLGdCQUFnQjtRQUN4QixPQUFPLGVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsTUFBTTtRQUNKLElBQUksQ0FBQyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUNoQyxNQUFNLElBQUksa0NBQXVCLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUN6RCxDQUFDO1FBRUQsTUFBTSxTQUFTLEdBQUcsSUFBQSwyQkFBTSxFQUFDLElBQUksQ0FBQyxxQkFBcUIsRUFBRTtZQUNuRCxXQUFXLEVBQUUsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFdBQVc7WUFDbkQsUUFBUSxFQUFFLElBQUksQ0FBQyxTQUFTO1lBQ3hCLGFBQWEsRUFBRSwwQkFBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsR0FBRyxDQUFDO1NBQy9ELENBQXlCLENBQUM7UUFFM0IsTUFBTSxNQUFNLEdBQVc7WUFDckIsRUFBRSxFQUFFLDhCQUFTLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQzlDLE1BQU0sRUFBRSxTQUFTLENBQUMsT0FBTztZQUN6QixjQUFjLEVBQUUsU0FBUyxDQUFDLFNBQVM7WUFDbkMsV0FBVyxFQUFFLFNBQVMsQ0FBQyxXQUFXO1lBQ2xDLFdBQVcsRUFBRSxTQUFTLENBQUMsV0FBVztZQUNsQyxLQUFLLEVBQUUsU0FBUyxDQUFD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RUgsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7WUFDakIsT0FBTyxFQUFFLEtBQUs7WUFDZCxLQUFLLEVBQUUsTUFBTTtZQUNiLElBQUksRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUk7U0FDNUIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBL0lELGtDQStJQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRyYW5zYWN0aW9uIGFzIFN1YnN0cmF0ZVRyYW5zYWN0aW9uLCB1dGlscywgS2V5UGFpciB9IGZyb20gJ0BiaXRnby1iZXRhL2Fic3RyYWN0LXN1YnN0cmF0ZSc7XG5pbXBvcnQgeyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvciwgVHJhbnNhY3Rpb25UeXBlIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgY29uc3RydWN0LCBkZWNvZGUgfSBmcm9tICdAc3Vic3RyYXRlL3R4d3JhcHBlci1wb2xrYWRvdCc7XG5pbXBvcnQgeyBkZWNvZGVBZGRyZXNzIH0gZnJvbSAnQHBvbGthZG90L2tleXJpbmcnO1xuaW1wb3J0IHsgRGVjb2RlZFR4LCBSZWdpc3RlckRpZFdpdGhDRERBcmdzLCBQcmVBcHByb3ZlQXNzZXRBcmdzLCBUeERhdGEsIEFkZEFuZEFmZmlybVdpdGhNZWRpYXRvcnNBcmdzIH0gZnJvbSAnLi9pZmFjZSc7XG5pbXBvcnQgcG9seXhVdGlscyBmcm9tICcuL3V0aWxzJztcblxuZXhwb3J0IGNsYXNzIFRyYW5zYWN0aW9uIGV4dGVuZHMgU3Vic3RyYXRlVHJhbnNhY3Rpb24ge1xuICAvKipcbiAgICogT3ZlcnJpZGUgdGhlIGdldEFkZHJlc3NGb3JtYXQgbWV0aG9kIHRvIHJldHVybiBkaWZmZXJlbnQgdmFsdWVzIGJhc2VkIG9uIG5ldHdvcmsgdHlwZVxuICAgKiBSZXR1cm5zIDEyIGZvciBtYWlubmV0IGFuZCA0MiBmb3IgdGVzdG5ldFxuICAgKlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgYWRkcmVzcyBmb3JtYXQgdG8gdXNlXG4gICAqIEBvdmVycmlkZVxuICAgKi9cbiAgcHJvdGVjdGVkIGdldEFkZHJlc3NGb3JtYXQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gcG9seXhVdGlscy5nZXRBZGRyZXNzRm9ybWF0KHRoaXMuX2NvaW5Db25maWcubmFtZSk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgdG9Kc29uKCk6IFR4RGF0YSB7XG4gICAgaWYgKCF0aGlzLl9zdWJzdHJhdGVUcmFuc2FjdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdFbXB0eSB0cmFuc2FjdGlvbicpO1xuICAgIH1cblxuICAgIGNvbnN0IGRlY29kZWRUeCA9IGRlY29kZSh0aGlzLl9zdWJzdHJhdGVUcmFuc2FjdGlvbiwge1xuICAgICAgbWV0YWRhdGFScGM6IHRoaXMuX3N1YnN0cmF0ZVRyYW5zYWN0aW9uLm1ldGFkYXRhUnBjLFxuICAgICAgcmVnaXN0cnk6IHRoaXMuX3JlZ2lzdHJ5LFxuICAgICAgaXNJbW1vcnRhbEVyYTogdXRpbHMuaXNaZXJvSGV4KHRoaXMuX3N1YnN0cmF0ZVRyYW5zYWN0aW9uLmVyYSksXG4gICAgfSkgYXMgdW5rbm93biBhcyBEZWNvZGVkVHg7XG5cbiAgICBjb25zdCByZXN1bHQ6IFR4RGF0YSA9IHtcbiAgICAgIGlkOiBjb25zdHJ1Y3QudHhIYXNoKHRoaXMudG9Ccm9hZGNhc3RGb3JtYXQoKSksXG4gICAgICBzZW5kZXI6IGRlY29kZWRUeC5hZGRyZXNzLFxuICAgICAgcmVmZXJlbmNlQmxvY2s6IGRlY29kZWRUeC5ibG9ja0hhc2gsXG4gICAgICBibG9ja051bWJlcjogZGVjb2RlZFR4LmJsb2NrTnVtYmVyLFxuICAgICAgZ2VuZXNpc0hhc2g6IGRlY29kZWRUeC5nZW5lc2lzSGFzaCxcbiAgICAgIG5vbmNlOiBkZWNvZGVkVHgubm9uY2UsXG4gICAgICBzcGVjVmVyc2lvbjogZGVjb2RlZFR4LnNwZWNWZXJzaW9uLFxuICAgICAgdHJhbnNhY3Rpb25WZXJzaW9uOiBkZWNvZGVkVHgudHJhbnNhY3Rpb25WZXJzaW9uLFxuICAgICAgZXJhUGVyaW9kOiBkZWNvZGVkVHguZXJhUGVyaW9kLFxuICAgICAgY2hhaW5OYW1lOiB0aGlzLl9jaGFpbk5hbWUsXG4gICAgICB0aXA6IGRlY29kZWRUeC50aXAgPyBOdW1iZXIoZGVjb2RlZFR4LnRpcCkgOiAwLFxuICAgIH07XG5cbiAgICBjb25zdCB0eE1ldGhvZCA9IGRlY29kZWRUeC5tZXRob2QuYXJncztcbiAgICBpZiAodGhpcy50eXBlID09PSBUcmFuc2FjdGlvblR5cGUuV2FsbGV0SW5pdGlhbGl6YXRpb24pIHtcbiAgICAgIGNvbnN0IHsgdGFyZ2V0QWNjb3VudCB9ID0gdHhNZXRob2QgYXMgUmVnaXN0ZXJEaWRXaXRoQ0REQXJncztcbiAgICAgIGNvbnN0IGtleXBhaXJEZXN0ID0gbmV3IEtleVBhaXIoe1xuICAgICAgICBwdWI6IEJ1ZmZlci5mcm9tKGRlY29kZUFkZHJlc3ModGFyZ2V0QWNjb3VudCkpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIH0pO1xuICAgICAgcmVzdWx0LnRvID0ga2V5cGFpckRlc3QuZ2V0QWRkcmVzcyh0aGlzLmdldEFkZHJlc3NGb3JtYXQoKSk7XG4gICAgICByZXN1bHQuYW1vdW50ID0gJzAnOyAvLyBSZWdpc3RlckRpZFdpdGhDREQgZG9lcyBub3QgdHJhbnNmZXIgYW55IHZhbHVlXG4gICAgfSBlbHNlIGlmICh0aGlzLnR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5UcnVzdExpbmUpIHtcbiAgICAgIGNvbnN0IHsgYXNzZXRJZCB9ID0gdHhNZXRob2QgYXMgUHJlQXBwcm92ZUFzc2V0QXJncztcbiAgICAgIHJlc3VsdC5hc3NldElkID0gYXNzZXRJZDtcbiAgICAgIHJlc3VsdC5zZW5kZXIgPSBkZWNvZGVkVHguYWRkcmVzcztcbiAgICAgIHJlc3VsdC5hbW91bnQgPSAnMCc7IC8vIFByZS1hcHByb3ZhbCBkb2VzIG5vdCB0cmFuc2ZlciBhbnkgdmFsdWVcbiAgICB9IGVsc2UgaWYgKHRoaXMudHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLlNlbmRUb2tlbikge1xuICAgICAgY29uc3Qgc2VuZFRva2VuQXJncyA9IHR4TWV0aG9kIGFzIEFkZEFuZEFmZmlybVdpdGhNZWRpYXRvcnNBcmdzO1xuICAgICAgcmVzdWx0LmZyb21ESUQgPSBzZW5kVG9rZW5BcmdzLmxlZ3NbMF0uZnVuZ2libGUuc2VuZGVyLmRpZDtcbiAgICAgIHJlc3VsdC50b0RJRCA9IHNlbmRUb2tlbkFyZ3MubGVnc1swXS5mdW5naWJsZS5yZWNlaXZlci5kaWQ7XG4gICAgICByZXN1bHQuYW1vdW50ID0gc2VuZFRva2VuQXJncy5sZWdzWzBdLmZ1bmdpYmxlLmFtb3VudC50b1N0cmluZygpO1xuICAgICAgcmVzdWx0LmFzc2V0SWQgPSBzZW5kVG9rZW5BcmdzLmxlZ3NbMF0uZnVuZ2libGUuYXNzZXRJZDtcbiAgICAgIHJlc3VsdC5tZW1vID0gc2VuZFRva2VuQXJncy5pbnN0cnVjdGlvbk1lbW87XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBzdXBlci50b0pzb24oKSBhcyBUeERhdGE7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGRhdGEgb24gdGhpcyB0cmFuc2FjdGlvbi5cbiAgICovXG4gIGxvYWRJbnB1dHNBbmRPdXRwdXRzKCk6IHZvaWQge1xuICAgIHN1cGVyLmxvYWRJbnB1dHNBbmRPdXRwdXRzKCk7XG5cbiAgICBjb25zdCBkZWNvZGVkVHggPSBkZWNvZGUodGhpcy5fc3Vic3RyYXRlVHJhbnNhY3Rpb24sIHtcbiAgICAgIG1ldGFkYXRhUnBjOiB0aGlzLl9zdWJzdHJhdGVUcmFuc2FjdGlvbi5tZXRhZGF0YVJwYyxcbiAgICAgIHJlZ2lzdHJ5OiB0aGlzLl9yZWdpc3RyeSxcbiAgICAgIGlzSW1tb3J0YWxFcmE6IHV0aWxzLmlzWmVyb0hleCh0aGlzLl9zdWJzdHJhdGVUcmFuc2FjdGlvbi5lcmEpLFxuICAgIH0pIGFzIHVua25vd24gYXMgRGVjb2RlZFR4O1xuXG4gICAgaWYgKHRoaXMudHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLldhbGxldEluaXRpYWxpemF0aW9uKSB7XG4gICAgICB0aGlzLmRlY29kZUlucHV0c0FuZE91dHB1dHNGb3JSZWdpc3RlckRpZFdpdGhDREQoZGVjb2RlZFR4KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMudHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLlRydXN0TGluZSkge1xuICAgICAgdGhpcy5kZWNvZGVJbnB1dHNBbmRPdXRwdXRzRm9yUHJlQXBwcm92ZUFzc2V0KGRlY29kZWRUeCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5TZW5kVG9rZW4pIHtcbiAgICAgIHRoaXMuZGVjb2RlSW5wdXRzQW5kT3V0cHV0c0ZvclNlbmRUb2tlbihkZWNvZGVkVHgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZGVjb2RlSW5wdXRzQW5kT3V0cHV0c0ZvclJlZ2lzdGVyRGlkV2l0aENERChkZWNvZGVkVHg6IERlY29kZWRUeCkge1xuICAgIGNvbnN0IHR4TWV0aG9kID0gZGVjb2RlZFR4Lm1ldGhvZC5hcmdzIGFzIFJlZ2lzdGVyRGlkV2l0aENEREFyZ3M7XG4gICAgY29uc3Qga2V5cGFpckRlc3QgPSBuZXcgS2V5UGFpcih7XG4gICAgICBwdWI6IEJ1ZmZlci5mcm9tKGRlY29kZUFkZHJlc3ModHhNZXRob2QudGFyZ2V0QWNjb3VudCkpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICB9KTtcbiAgICBjb25zdCB0byA9IGtleXBhaXJEZXN0LmdldEFkZHJlc3ModGhpcy5nZXRBZGRyZXNzRm9ybWF0KCkpO1xuICAgIGNvbnN0IHZhbHVlID0gJzAnO1xuICAgIGNvbnN0IGZyb20gPSBkZWNvZGVkVHguYWRkcmVzcztcblxuICAgIHRoaXMuX2lucHV0cy5wdXNoKHtcbiAgICAgIGFkZHJlc3M6IGZyb20sXG4gICAgICB2YWx1ZSxcbiAgICAgIGNvaW46IHRoaXMuX2NvaW5Db25maWcubmFtZSxcbiAgICB9KTtcblxuICAgIHRoaXMuX291dHB1dHMucHVzaCh7XG4gICAgICBhZGRyZXNzOiB0byxcbiAgICAgIHZhbHVlLFxuICAgICAgY29pbjogdGhpcy5fY29pbkNvbmZpZy5uYW1lLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBkZWNvZGVJbnB1dHNBbmRPdXRwdXRzRm9yUHJlQXBwcm92ZUFzc2V0KGRlY29kZWRUeDogRGVjb2RlZFR4KSB7XG4gICAgY29uc3Qgc2VuZGVyID0gZGVjb2RlZFR4LmFkZHJlc3M7XG4gICAgY29uc3QgdmFsdWUgPSAnMCc7IC8vIFByZS1hcHByb3ZhbCBkb2VzIG5vdCB0cmFuc2ZlciBhbnkgdmFsdWVcblxuICAgIHRoaXMuX2lucHV0cy5wdXNoKHtcbiAgICAgIGFkZHJlc3M6IHNlbmRlcixcbiAgICAgIHZhbHVlLFxuICAgICAgY29pbjogdGhpcy5fY29pbkNvbmZpZy5uYW1lLFxuICAgIH0pO1xuXG4gICAgdGhpcy5fb3V0cHV0cy5wdXNoKHtcbiAgICAgIGFkZHJlc3M6IHNlbmRlciwgLy8gSW4gcHJlLWFwcHJvdmFsLCB0aGUgb3V0cHV0IGlzIHRoZSBzYW1lIGFzIHRoZSBpbnB1dFxuICAgICAgdmFsdWUsXG4gICAgICBjb2luOiB0aGlzLl9jb2luQ29uZmlnLm5hbWUsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGRlY29kZUlucHV0c0FuZE91dHB1dHNGb3JTZW5kVG9rZW4oZGVjb2RlZFR4OiBEZWNvZGVkVHgpIHtcbiAgICBjb25zdCB0eE1ldGhvZCA9IGRlY29kZWRUeC5tZXRob2QuYXJncyBhcyBBZGRBbmRBZmZpcm1XaXRoTWVkaWF0b3JzQXJncztcbiAgICBjb25zdCBmcm9tRElEID0gdHhNZXRob2QubGVnc1swXS5mdW5naWJsZS5zZW5kZXIuZGlkO1xuICAgIGNvbnN0IHRvRElEID0gdHhNZXRob2QubGVnc1swXS5mdW5naWJsZS5yZWNlaXZlci5kaWQ7XG4gICAgY29uc3QgYW1vdW50ID0gdHhNZXRob2QubGVnc1swXS5mdW5naWJsZS5hbW91bnQudG9TdHJpbmcoKTtcblxuICAgIHRoaXMuX2lucHV0cy5wdXNoKHtcbiAgICAgIGFkZHJlc3M6IGZyb21ESUQsXG4gICAgICB2YWx1ZTogYW1vdW50LFxuICAgICAgY29pbjogdGhpcy5fY29pbkNvbmZpZy5uYW1lLFxuICAgIH0pO1xuXG4gICAgdGhpcy5fb3V0cHV0cy5wdXNoKHtcbiAgICAgIGFkZHJlc3M6IHRvRElELFxuICAgICAgdmFsdWU6IGFtb3VudCxcbiAgICAgIGNvaW46IHRoaXMuX2NvaW5Db25maWcubmFtZSxcbiAgICB9KTtcbiAgfVxufVxuIl19
|
|
@@ -1,12 +1,34 @@
|
|
|
1
1
|
import { BaseTransactionBuilderFactory } from '@bitgo-beta/sdk-core';
|
|
2
|
-
import {
|
|
2
|
+
import { BaseCoin as CoinConfig } from '@bitgo-beta/statics';
|
|
3
3
|
import { TransferBuilder } from './transferBuilder';
|
|
4
|
+
import { RegisterDidWithCDDBuilder } from './registerDidWithCDDBuilder';
|
|
5
|
+
import { BondExtraBuilder } from './bondExtraBuilder';
|
|
6
|
+
import { BatchStakingBuilder } from './batchStakingBuilder';
|
|
7
|
+
import { BatchUnstakingBuilder } from './batchUnstakingBuilder';
|
|
8
|
+
import { UnbondBuilder } from './unbondBuilder';
|
|
9
|
+
import { WithdrawUnbondedBuilder } from './withdrawUnbondedBuilder';
|
|
10
|
+
import { Interface, TransactionBuilder } from './';
|
|
11
|
+
import { TxMethod } from './iface';
|
|
12
|
+
import { Transaction as BaseTransaction } from '@bitgo-beta/abstract-substrate';
|
|
13
|
+
import { Transaction as PolyxTransaction } from './transaction';
|
|
14
|
+
import { PreApproveAssetBuilder } from './preApproveAssetBuilder';
|
|
15
|
+
import { TokenTransferBuilder } from './tokenTransferBuilder';
|
|
16
|
+
export type SupportedTransaction = BaseTransaction | PolyxTransaction;
|
|
4
17
|
export declare class TransactionBuilderFactory extends BaseTransactionBuilderFactory {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
/** @inheritdoc */
|
|
18
|
+
protected _material: Interface.Material;
|
|
19
|
+
constructor(_coinConfig: Readonly<CoinConfig>);
|
|
8
20
|
getTransferBuilder(): TransferBuilder;
|
|
9
|
-
|
|
21
|
+
getRegisterDidWithCDDBuilder(): RegisterDidWithCDDBuilder;
|
|
22
|
+
getPreApproveAssetBuilder(): PreApproveAssetBuilder;
|
|
23
|
+
getTokenTransferBuilder(): TokenTransferBuilder;
|
|
24
|
+
getBondExtraBuilder(): BondExtraBuilder;
|
|
25
|
+
getBatchBuilder(): BatchStakingBuilder;
|
|
26
|
+
getBatchUnstakingBuilder(): BatchUnstakingBuilder;
|
|
27
|
+
getUnbondBuilder(): UnbondBuilder;
|
|
28
|
+
getWithdrawUnbondedBuilder(): WithdrawUnbondedBuilder;
|
|
10
29
|
getWalletInitializationBuilder(): void;
|
|
30
|
+
from(rawTxn: string): TransactionBuilder<TxMethod, SupportedTransaction>;
|
|
31
|
+
material(material: Interface.Material): this;
|
|
32
|
+
private getBuilder;
|
|
11
33
|
}
|
|
12
34
|
//# sourceMappingURL=transactionBuilderFactory.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transactionBuilderFactory.d.ts","sourceRoot":"","sources":["../../../src/lib/transactionBuilderFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,6BAA6B,
|
|
1
|
+
{"version":3,"file":"transactionBuilderFactory.d.ts","sourceRoot":"","sources":["../../../src/lib/transactionBuilderFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,6BAA6B,EAAuB,MAAM,sBAAsB,CAAC;AAC1F,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAE7D,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,OAAO,EAAE,SAAS,EAAqB,kBAAkB,EAAE,MAAM,IAAI,CAAC;AACtE,OAAO,EAAE,QAAQ,EAAgC,MAAM,SAAS,CAAC;AACjE,OAAO,EAAE,WAAW,IAAI,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAChF,OAAO,EAAE,WAAW,IAAI,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAChE,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9D,MAAM,MAAM,oBAAoB,GAAG,eAAe,GAAG,gBAAgB,CAAC;AAEtE,qBAAa,yBAA0B,SAAQ,6BAA6B;IAC1E,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,QAAQ,CAAC;gBAE5B,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC;IAK7C,kBAAkB,IAAI,eAAe;IAIrC,4BAA4B,IAAI,yBAAyB;IAIzD,yBAAyB,IAAI,sBAAsB;IAInD,uBAAuB,IAAI,oBAAoB;IAI/C,mBAAmB,IAAI,gBAAgB;IAIvC,eAAe,IAAI,mBAAmB;IAItC,wBAAwB,IAAI,qBAAqB;IAIjD,gBAAgB,IAAI,aAAa;IAIjC,0BAA0B,IAAI,uBAAuB;IAIrD,8BAA8B,IAAI,IAAI;IAItC,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,kBAAkB,CAAC,QAAQ,EAAE,oBAAoB,CAAC;IAMxE,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC,QAAQ,GAAG,IAAI;IAK5C,OAAO,CAAC,UAAU;CAmDnB"}
|
|
@@ -1,20 +1,124 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
2
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
6
|
exports.TransactionBuilderFactory = void 0;
|
|
4
7
|
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
8
|
+
const txwrapper_polkadot_1 = require("@substrate/txwrapper-polkadot");
|
|
9
|
+
const transferBuilder_1 = require("./transferBuilder");
|
|
10
|
+
const registerDidWithCDDBuilder_1 = require("./registerDidWithCDDBuilder");
|
|
11
|
+
const bondExtraBuilder_1 = require("./bondExtraBuilder");
|
|
12
|
+
const batchStakingBuilder_1 = require("./batchStakingBuilder");
|
|
13
|
+
const batchUnstakingBuilder_1 = require("./batchUnstakingBuilder");
|
|
14
|
+
const unbondBuilder_1 = require("./unbondBuilder");
|
|
15
|
+
const withdrawUnbondedBuilder_1 = require("./withdrawUnbondedBuilder");
|
|
16
|
+
const utils_1 = __importDefault(require("./utils"));
|
|
17
|
+
const _1 = require("./");
|
|
18
|
+
const iface_1 = require("./iface");
|
|
19
|
+
const preApproveAssetBuilder_1 = require("./preApproveAssetBuilder");
|
|
20
|
+
const tokenTransferBuilder_1 = require("./tokenTransferBuilder");
|
|
5
21
|
class TransactionBuilderFactory extends sdk_core_1.BaseTransactionBuilderFactory {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
22
|
+
constructor(_coinConfig) {
|
|
23
|
+
super(_coinConfig);
|
|
24
|
+
this._material = utils_1.default.getMaterial(_coinConfig.network.type);
|
|
9
25
|
}
|
|
10
|
-
/** @inheritdoc */
|
|
11
26
|
getTransferBuilder() {
|
|
12
|
-
|
|
27
|
+
return new transferBuilder_1.TransferBuilder(this._coinConfig).material(this._material);
|
|
28
|
+
}
|
|
29
|
+
getRegisterDidWithCDDBuilder() {
|
|
30
|
+
return new registerDidWithCDDBuilder_1.RegisterDidWithCDDBuilder(this._coinConfig).material(this._material);
|
|
31
|
+
}
|
|
32
|
+
getPreApproveAssetBuilder() {
|
|
33
|
+
return new preApproveAssetBuilder_1.PreApproveAssetBuilder(this._coinConfig).material(this._material);
|
|
34
|
+
}
|
|
35
|
+
getTokenTransferBuilder() {
|
|
36
|
+
return new tokenTransferBuilder_1.TokenTransferBuilder(this._coinConfig).material(this._material);
|
|
37
|
+
}
|
|
38
|
+
getBondExtraBuilder() {
|
|
39
|
+
return new bondExtraBuilder_1.BondExtraBuilder(this._coinConfig).material(this._material);
|
|
40
|
+
}
|
|
41
|
+
getBatchBuilder() {
|
|
42
|
+
return new batchStakingBuilder_1.BatchStakingBuilder(this._coinConfig).material(this._material);
|
|
43
|
+
}
|
|
44
|
+
getBatchUnstakingBuilder() {
|
|
45
|
+
return new batchUnstakingBuilder_1.BatchUnstakingBuilder(this._coinConfig).material(this._material);
|
|
46
|
+
}
|
|
47
|
+
getUnbondBuilder() {
|
|
48
|
+
return new unbondBuilder_1.UnbondBuilder(this._coinConfig).material(this._material);
|
|
49
|
+
}
|
|
50
|
+
getWithdrawUnbondedBuilder() {
|
|
51
|
+
return new withdrawUnbondedBuilder_1.WithdrawUnbondedBuilder(this._coinConfig).material(this._material);
|
|
13
52
|
}
|
|
14
|
-
/** @inheritdoc */
|
|
15
53
|
getWalletInitializationBuilder() {
|
|
16
|
-
throw new
|
|
54
|
+
throw new sdk_core_1.NotImplementedError(`walletInitialization for ${this._coinConfig.name} not implemented`);
|
|
55
|
+
}
|
|
56
|
+
from(rawTxn) {
|
|
57
|
+
const builder = this.getBuilder(rawTxn);
|
|
58
|
+
builder.from(rawTxn);
|
|
59
|
+
return builder;
|
|
60
|
+
}
|
|
61
|
+
material(material) {
|
|
62
|
+
this._material = material;
|
|
63
|
+
return this;
|
|
64
|
+
}
|
|
65
|
+
getBuilder(rawTxn) {
|
|
66
|
+
const registry = _1.SingletonRegistry.getInstance(this._material);
|
|
67
|
+
const decodedTxn = (0, txwrapper_polkadot_1.decode)(rawTxn, {
|
|
68
|
+
metadataRpc: this._material.metadata,
|
|
69
|
+
registry: registry,
|
|
70
|
+
});
|
|
71
|
+
const methodName = decodedTxn.method?.name;
|
|
72
|
+
if (methodName === _1.Interface.MethodNames.TransferWithMemo) {
|
|
73
|
+
return this.getTransferBuilder();
|
|
74
|
+
}
|
|
75
|
+
else if (methodName === iface_1.MethodNames.RegisterDidWithCDD) {
|
|
76
|
+
return this.getRegisterDidWithCDDBuilder();
|
|
77
|
+
}
|
|
78
|
+
else if (methodName === iface_1.MethodNames.PreApproveAsset) {
|
|
79
|
+
return this.getPreApproveAssetBuilder();
|
|
80
|
+
}
|
|
81
|
+
else if (methodName === iface_1.MethodNames.AddAndAffirmWithMediators) {
|
|
82
|
+
return this.getTokenTransferBuilder();
|
|
83
|
+
}
|
|
84
|
+
else if (methodName === 'bondExtra') {
|
|
85
|
+
return this.getBondExtraBuilder();
|
|
86
|
+
}
|
|
87
|
+
else if (methodName === 'batchAll') {
|
|
88
|
+
const args = decodedTxn.method.args;
|
|
89
|
+
if (args.calls && args.calls.length === 2) {
|
|
90
|
+
// Decode method names from the calls using utils.decodeMethodName
|
|
91
|
+
const firstCallMethod = utils_1.default.decodeMethodName(args.calls[0], registry);
|
|
92
|
+
const secondCallMethod = utils_1.default.decodeMethodName(args.calls[1], registry);
|
|
93
|
+
// Check for batch staking pattern: bond + nominate
|
|
94
|
+
if (firstCallMethod === 'bond' && secondCallMethod === 'nominate') {
|
|
95
|
+
return this.getBatchBuilder();
|
|
96
|
+
}
|
|
97
|
+
// Check for batch unstaking pattern: chill + unbond
|
|
98
|
+
if (firstCallMethod === 'chill' && secondCallMethod === 'unbond') {
|
|
99
|
+
return this.getBatchUnstakingBuilder();
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
// Fall back to general batch builder for other batchAll cases
|
|
103
|
+
return this.getBatchBuilder();
|
|
104
|
+
}
|
|
105
|
+
else if (methodName === 'batch') {
|
|
106
|
+
return this.getBatchBuilder();
|
|
107
|
+
}
|
|
108
|
+
else if (methodName === 'bond') {
|
|
109
|
+
return this.getBatchBuilder();
|
|
110
|
+
}
|
|
111
|
+
else if (methodName === 'nominate') {
|
|
112
|
+
return this.getBatchBuilder();
|
|
113
|
+
}
|
|
114
|
+
else if (methodName === 'unbond') {
|
|
115
|
+
return this.getUnbondBuilder();
|
|
116
|
+
}
|
|
117
|
+
else if (methodName === 'withdrawUnbonded') {
|
|
118
|
+
return this.getWithdrawUnbondedBuilder();
|
|
119
|
+
}
|
|
120
|
+
throw new Error('Transaction cannot be parsed or has an unsupported transaction type');
|
|
17
121
|
}
|
|
18
122
|
}
|
|
19
123
|
exports.TransactionBuilderFactory = TransactionBuilderFactory;
|
|
20
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvdHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtREFBcUU7QUFJckUsTUFBYSx5QkFBMEIsU0FBUSx3Q0FBNkI7SUFDMUUsa0JBQWtCO0lBQ2xCLElBQUksQ0FBQyxHQUFXO1FBQ2QsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsa0JBQWtCO1FBQ2hCLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLDhCQUE4QjtRQUM1QixNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQUM7SUFDN0MsQ0FBQztDQUNGO0FBZkQsOERBZUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCYXNlVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeSB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQnVpbGRlciB9IGZyb20gJy4vdHJhbnNhY3Rpb25CdWlsZGVyJztcbmltcG9ydCB7IFRyYW5zZmVyQnVpbGRlciB9IGZyb20gJy4vdHJhbnNmZXJCdWlsZGVyJztcblxuZXhwb3J0IGNsYXNzIFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkgZXh0ZW5kcyBCYXNlVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeSB7XG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBmcm9tKHJhdzogc3RyaW5nKTogVHJhbnNhY3Rpb25CdWlsZGVyIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJyk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgZ2V0VHJhbnNmZXJCdWlsZGVyKCk6IFRyYW5zZmVyQnVpbGRlciB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGdldFdhbGxldEluaXRpYWxpemF0aW9uQnVpbGRlcigpOiB2b2lkIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJyk7XG4gIH1cbn1cbiJdfQ==
|
|
124
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvdHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxtREFBMEY7QUFFMUYsc0VBQXVEO0FBQ3ZELHVEQUFvRDtBQUNwRCwyRUFBd0U7QUFDeEUseURBQXNEO0FBQ3RELCtEQUE0RDtBQUM1RCxtRUFBZ0U7QUFDaEUsbURBQWdEO0FBQ2hELHVFQUFvRTtBQUNwRSxvREFBNEI7QUFDNUIseUJBQXNFO0FBQ3RFLG1DQUFpRTtBQUdqRSxxRUFBa0U7QUFDbEUsaUVBQThEO0FBSTlELE1BQWEseUJBQTBCLFNBQVEsd0NBQTZCO0lBRzFFLFlBQVksV0FBaUM7UUFDM0MsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ25CLElBQUksQ0FBQyxTQUFTLEdBQUcsZUFBSyxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQy9ELENBQUM7SUFFRCxrQkFBa0I7UUFDaEIsT0FBTyxJQUFJLGlDQUFlLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUVELDRCQUE0QjtRQUMxQixPQUFPLElBQUkscURBQXlCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDbEYsQ0FBQztJQUVELHlCQUF5QjtRQUN2QixPQUFPLElBQUksK0NBQXNCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDL0UsQ0FBQztJQUVELHVCQUF1QjtRQUNyQixPQUFPLElBQUksMkNBQW9CLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxD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LFVBQVUsS0FBSyxrQkFBa0IsRUFBRSxDQUFDO1lBQzdDLE9BQU8sSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7UUFDM0MsQ0FBQztRQUVELE1BQU0sSUFBSSxLQUFLLENBQUMscUVBQXFFLENBQUMsQ0FBQztJQUN6RixDQUFDO0NBQ0Y7QUE5R0QsOERBOEdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQmFzZVRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnksIE5vdEltcGxlbWVudGVkRXJyb3IgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgeyBCYXNlQ29pbiBhcyBDb2luQ29uZmlnIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgeyBkZWNvZGUgfSBmcm9tICdAc3Vic3RyYXRlL3R4d3JhcHBlci1wb2xrYWRvdCc7XG5pbXBvcnQgeyBUcmFuc2ZlckJ1aWxkZXIgfSBmcm9tICcuL3RyYW5zZmVyQnVpbGRlcic7XG5pbXBvcnQgeyBSZWdpc3RlckRpZFdpdGhDRERCdWlsZGVyIH0gZnJvbSAnLi9yZWdpc3RlckRpZFdpdGhDRERCdWlsZGVyJztcbmltcG9ydCB7IEJvbmRFeHRyYUJ1aWxkZXIgfSBmcm9tICcuL2JvbmRFeHRyYUJ1aWxkZXInO1xuaW1wb3J0IHsgQmF0Y2hTdGFraW5nQnVpbGRlciB9IGZyb20gJy4vYmF0Y2hTdGFraW5nQnVpbGRlcic7XG5pbXBvcnQgeyBCYXRjaFVuc3Rha2luZ0J1aWxkZXIgfSBmcm9tICcuL2JhdGNoVW5zdGFraW5nQnVpbGRlcic7XG5pbXBvcnQgeyBVbmJvbmRCdWlsZGVyIH0gZnJvbSAnLi91bmJvbmRCdWlsZGVyJztcbmltcG9ydCB7IFdpdGhkcmF3VW5ib25kZWRCdWlsZGVyIH0gZnJvbSAnLi93aXRoZHJhd1VuYm9uZGVkQnVpbGRlcic7XG5pbXBvcnQgdXRpbHMgZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyBJbnRlcmZhY2UsIFNpbmdsZXRvblJlZ2lzdHJ5LCBUcmFuc2FjdGlvbkJ1aWxkZXIgfSBmcm9tICcuLyc7XG5pbXBvcnQgeyBUeE1ldGhvZCwgQmF0Y2hDYWxsT2JqZWN0LCBNZXRob2ROYW1lcyB9IGZyb20gJy4vaWZhY2UnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb24gYXMgQmFzZVRyYW5zYWN0aW9uIH0gZnJvbSAnQGJpdGdvLWJldGEvYWJzdHJhY3Qtc3Vic3RyYXRlJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uIGFzIFBvbHl4VHJhbnNhY3Rpb24gfSBmcm9tICcuL3RyYW5zYWN0aW9uJztcbmltcG9ydCB7IFByZUFwcHJvdmVBc3NldEJ1aWxkZXIgfSBmcm9tICcuL3ByZUFwcHJvdmVBc3NldEJ1aWxkZXInO1xuaW1wb3J0IHsgVG9rZW5UcmFuc2ZlckJ1aWxkZXIgfSBmcm9tICcuL3Rva2VuVHJhbnNmZXJCdWlsZGVyJztcblxuZXhwb3J0IHR5cGUgU3VwcG9ydGVkVHJhbnNhY3Rpb24gPSBCYXNlVHJhbnNhY3Rpb24gfCBQb2x5eFRyYW5zYWN0aW9uO1xuXG5leHBvcnQgY2xhc3MgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeSBleHRlbmRzIEJhc2VUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5IHtcbiAgcHJvdGVjdGVkIF9tYXRlcmlhbDogSW50ZXJmYWNlLk1hdGVyaWFsO1xuXG4gIGNvbnN0cnVjdG9yKF9jb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPikge1xuICAgIHN1cGVyKF9jb2luQ29uZmlnKTtcbiAgICB0aGlzLl9tYXRlcmlhbCA9IHV0aWxzLmdldE1hdGVyaWFsKF9jb2luQ29uZmlnLm5ldHdvcmsudHlwZSk7XG4gIH1cblxuICBnZXRUcmFuc2ZlckJ1aWxkZXIoKTogVHJhbnNmZXJCdWlsZGVyIHtcbiAgICByZXR1cm4gbmV3IFRyYW5zZmVyQnVpbGRlcih0aGlzLl9jb2luQ29uZmlnKS5tYXRlcmlhbCh0aGlzLl9tYXRlcmlhbCk7XG4gIH1cblxuICBnZXRSZWdpc3RlckRpZFdpdGhDRERCdWlsZGVyKCk6IFJlZ2lzdGVyRGlkV2l0aENEREJ1aWxkZXIge1xuICAgIHJldHVybiBuZXcgUmVnaXN0ZXJEaWRXaXRoQ0REQnVpbGRlcih0aGlzLl9jb2luQ29uZmlnKS5tYXRlcmlhbCh0aGlzLl9tYXRlcmlhbCk7XG4gIH1cblxuICBnZXRQcmVBcHByb3ZlQXNzZXRCdWlsZGVyKCk6IFByZUFwcHJvdmVBc3NldEJ1aWxkZXIge1xuICAgIHJldHVybiBuZXcgUHJlQXBwcm92ZUFzc2V0QnVpbGRlcih0aGlzLl9jb2luQ29uZmlnKS5tYXRlcmlhbCh0aGlzLl9tYXRlcmlhbCk7XG4gIH1cblxuICBnZXRUb2tlblRyYW5zZmVyQnVpbGRlcigpOiBUb2tlblRyYW5zZmVyQnVpbGRlciB7XG4gICAgcmV0dXJuIG5ldyBUb2tlblRyYW5zZmVyQnVpbGRlcih0aGlzLl9jb2luQ29uZmlnKS5tYXRlcmlhbCh0aGlzLl9tYXRlcmlhbCk7XG4gIH1cblxuICBnZXRCb25kRXh0cmFCdWlsZGVyKCk6IEJvbmRFeHRyYUJ1aWxkZXIge1xuICAgIHJldHVybiBuZXcgQm9uZEV4dHJhQnVpbGRlcih0aGlzLl9jb2luQ29uZmlnKS5tYXRlcmlhbCh0aGlzLl9tYXRlcmlhbCk7XG4gIH1cblxuICBnZXRCYXRjaEJ1aWxkZXIoKTogQmF0Y2hTdGFraW5nQnVpbGRlciB7XG4gICAgcmV0dXJuIG5ldyBCYXRjaFN0YWtpbmdCdWlsZGVyKHRoaXMuX2NvaW5Db25maWcpLm1hdGVyaWFsKHRoaXMuX21hdGVyaWFsKTtcbiAgfVxuXG4gIGdldEJhdGNoVW5zdGFraW5nQnVpbGRlcigpOiBCYXRjaFVuc3Rha2luZ0J1aWxkZXIge1xuICAgIHJldHVybiBuZXcgQmF0Y2hVbnN0YWtpbmdCdWlsZGVyKHRoaXMuX2NvaW5Db25maWcpLm1hdGVyaWFsKHRoaXMuX21hdGVyaWFsKTtcbiAgfVxuXG4gIGdldFVuYm9uZEJ1aWxkZXIoKTogVW5ib25kQnVpbGRlciB7XG4gICAgcmV0dXJuIG5ldyBVbmJvbmRCdWlsZGVyKHRoaXMuX2NvaW5Db25maWcpLm1hdGVyaWFsKHRoaXMuX21hdGVyaWFsKTtcbiAgfVxuXG4gIGdldFdpdGhkcmF3VW5ib25kZWRCdWlsZGVyKCk6IFdpdGhkcmF3VW5ib25kZWRCdWlsZGVyIHtcbiAgICByZXR1cm4gbmV3IFdpdGhkcmF3VW5ib25kZWRCdWlsZGVyKHRoaXMuX2NvaW5Db25maWcpLm1hdGVyaWFsKHRoaXMuX21hdGVyaWFsKTtcbiAgfVxuXG4gIGdldFdhbGxldEluaXRpYWxpemF0aW9uQnVpbGRlcigpOiB2b2lkIHtcbiAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcihgd2FsbGV0SW5pdGlhbGl6YXRpb24gZm9yICR7dGhpcy5fY29pbkNvbmZpZy5uYW1lfSBub3QgaW1wbGVtZW50ZWRgKTtcbiAgfVxuXG4gIGZyb20ocmF3VHhuOiBzdHJpbmcpOiBUcmFuc2FjdGlvbkJ1aWxkZXI8VHhNZXRob2QsIFN1cHBvcnRlZFRyYW5zYWN0aW9uPiB7XG4gICAgY29uc3QgYnVpbGRlciA9IHRoaXMuZ2V0QnVpbGRlcihyYXdUeG4pO1xuICAgIGJ1aWxkZXIuZnJvbShyYXdUeG4pO1xuICAgIHJldHVybiBidWlsZGVyO1xuICB9XG5cbiAgbWF0ZXJpYWwobWF0ZXJpYWw6IEludGVyZmFjZS5NYXRlcmlhbCk6IHRoaXMge1xuICAgIHRoaXMuX21hdGVyaWFsID0gbWF0ZXJpYWw7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBwcml2YXRlIGdldEJ1aWxkZXIocmF3VHhuOiBzdHJpbmcpOiBUcmFuc2FjdGlvbkJ1aWxkZXI8VHhNZXRob2QsIFN1cHBvcnRlZFRyYW5zYWN0aW9uPiB7XG4gICAgY29uc3QgcmVnaXN0cnkgPSBTaW5nbGV0b25SZWdpc3RyeS5nZXRJbnN0YW5jZSh0aGlzLl9tYXRlcmlhbCk7XG4gICAgY29uc3QgZGVjb2RlZFR4biA9IGRlY29kZShyYXdUeG4sIHtcbiAgICAgIG1ldGFkYXRhUnBjOiB0aGlzLl9tYXRlcmlhbC5tZXRhZGF0YSxcbiAgICAgIHJlZ2lzdHJ5OiByZWdpc3RyeSxcbiAgICB9KTtcblxuICAgIGNvbnN0IG1ldGhvZE5hbWUgPSBkZWNvZGVkVHhuLm1ldGhvZD8ubmFtZTtcbiAgICBpZiAobWV0aG9kTmFtZSA9PT0gSW50ZXJmYWNlLk1ldGhvZE5hbWVzLlRyYW5zZmVyV2l0aE1lbW8pIHtcbiAgICAgIHJldHVybiB0aGlzLmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgIH0gZWxzZSBpZiAobWV0aG9kTmFtZSA9PT0gTWV0aG9kTmFtZXMuUmVnaXN0ZXJEaWRXaXRoQ0REKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRSZWdpc3RlckRpZFdpdGhDRERCdWlsZGVyKCk7XG4gICAgfSBlbHNlIGlmIChtZXRob2ROYW1lID09PSBNZXRob2ROYW1lcy5QcmVBcHByb3ZlQXNzZXQpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldFByZUFwcHJvdmVBc3NldEJ1aWxkZXIoKTtcbiAgICB9IGVsc2UgaWYgKG1ldGhvZE5hbWUgPT09IE1ldGhvZE5hbWVzLkFkZEFuZEFmZmlybVdpdGhNZWRpYXRvcnMpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldFRva2VuVHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgfSBlbHNlIGlmIChtZXRob2ROYW1lID09PSAnYm9uZEV4dHJhJykge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0Qm9uZEV4dHJhQnVpbGRlcigpO1xuICAgIH0gZWxzZSBpZiAobWV0aG9kTmFtZSA9PT0gJ2JhdGNoQWxsJykge1xuICAgICAgY29uc3QgYXJncyA9IGRlY29kZWRUeG4ubWV0aG9kLmFyZ3MgYXMgeyBjYWxscz86IEJhdGNoQ2FsbE9iamVjdFtdIH07XG5cbiAgICAgIGlmIChhcmdzLmNhbGxzICYmIGFyZ3MuY2FsbHMubGVuZ3RoID09PSAyKSB7XG4gICAgICAgIC8vIERlY29kZSBtZXRob2QgbmFtZXMgZnJvbSB0aGUgY2FsbHMgdXNpbmcgdXRpbHMuZGVjb2RlTWV0aG9kTmFtZVxuICAgICAgICBjb25zdCBmaXJzdENhbGxNZXRob2QgPSB1dGlscy5kZWNvZGVNZXRob2ROYW1lKGFyZ3MuY2FsbHNbMF0sIHJlZ2lzdHJ5KTtcbiAgICAgICAgY29uc3Qgc2Vjb25kQ2FsbE1ldGhvZCA9IHV0aWxzLmRlY29kZU1ldGhvZE5hbWUoYXJncy5jYWxsc1sxXSwgcmVnaXN0cnkpO1xuXG4gICAgICAgIC8vIENoZWNrIGZvciBiYXRjaCBzdGFraW5nIHBhdHRlcm46IGJvbmQgKyBub21pbmF0ZVxuICAgICAgICBpZiAoZmlyc3RDYWxsTWV0aG9kID09PSAnYm9uZCcgJiYgc2Vjb25kQ2FsbE1ldGhvZCA9PT0gJ25vbWluYXRlJykge1xuICAgICAgICAgIHJldHVybiB0aGlzLmdldEJhdGNoQnVpbGRlcigpO1xuICAgICAgICB9XG4gICAgICAgIC8vIENoZWNrIGZvciBiYXRjaCB1bnN0YWtpbmcgcGF0dGVybjogY2hpbGwgKyB1bmJvbmRcbiAgICAgICAgaWYgKGZpcnN0Q2FsbE1ldGhvZCA9PT0gJ2NoaWxsJyAmJiBzZWNvbmRDYWxsTWV0aG9kID09PSAndW5ib25kJykge1xuICAgICAgICAgIHJldHVybiB0aGlzLmdldEJhdGNoVW5zdGFraW5nQnVpbGRlcigpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBGYWxsIGJhY2sgdG8gZ2VuZXJhbCBiYXRjaCBidWlsZGVyIGZvciBvdGhlciBiYXRjaEFsbCBjYXNlc1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0QmF0Y2hCdWlsZGVyKCk7XG4gICAgfSBlbHNlIGlmIChtZXRob2ROYW1lID09PSAnYmF0Y2gnKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRCYXRjaEJ1aWxkZXIoKTtcbiAgICB9IGVsc2UgaWYgKG1ldGhvZE5hbWUgPT09ICdib25kJykge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0QmF0Y2hCdWlsZGVyKCk7XG4gICAgfSBlbHNlIGlmIChtZXRob2ROYW1lID09PSAnbm9taW5hdGUnKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRCYXRjaEJ1aWxkZXIoKTtcbiAgICB9IGVsc2UgaWYgKG1ldGhvZE5hbWUgPT09ICd1bmJvbmQnKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRVbmJvbmRCdWlsZGVyKCk7XG4gICAgfSBlbHNlIGlmIChtZXRob2ROYW1lID09PSAnd2l0aGRyYXdVbmJvbmRlZCcpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldFdpdGhkcmF3VW5ib25kZWRCdWlsZGVyKCk7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKCdUcmFuc2FjdGlvbiBjYW5ub3QgYmUgcGFyc2VkIG9yIGhhcyBhbiB1bnN1cHBvcnRlZCB0cmFuc2FjdGlvbiB0eXBlJyk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,8 +1,56 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Transaction } from './transaction';
|
|
2
|
+
import { TxMethod } from './iface';
|
|
3
|
+
import { PolyxBaseBuilder } from './baseBuilder';
|
|
4
|
+
import { DecodedSignedTx, DecodedSigningPayload, UnsignedTransaction } from '@substrate/txwrapper-core';
|
|
2
5
|
import { BaseCoin as CoinConfig } from '@bitgo-beta/statics';
|
|
3
|
-
import { TransactionType } from '@bitgo-beta/sdk-core';
|
|
4
|
-
export declare class TransferBuilder extends
|
|
6
|
+
import { BaseAddress, TransactionType } from '@bitgo-beta/sdk-core';
|
|
7
|
+
export declare class TransferBuilder extends PolyxBaseBuilder<TxMethod, Transaction> {
|
|
8
|
+
protected _amount: string;
|
|
9
|
+
protected _to: string;
|
|
10
|
+
protected _memo: string;
|
|
5
11
|
constructor(_coinConfig: Readonly<CoinConfig>);
|
|
6
12
|
protected get transactionType(): TransactionType;
|
|
13
|
+
/**
|
|
14
|
+
* Construct an unsigned `transferWithMemo` transaction using the provided details.
|
|
15
|
+
*
|
|
16
|
+
* @returns {UnsignedTransaction} The constructed unsigned transferWithMemo transaction.
|
|
17
|
+
*/
|
|
18
|
+
protected buildTransaction(): UnsignedTransaction;
|
|
19
|
+
/**
|
|
20
|
+
*
|
|
21
|
+
* The amount for transfer transaction.
|
|
22
|
+
*
|
|
23
|
+
* @param {string} amount
|
|
24
|
+
* @returns {TransferBuilder} This transfer builder.
|
|
25
|
+
*/
|
|
26
|
+
amount(amount: string): this;
|
|
27
|
+
/**
|
|
28
|
+
*
|
|
29
|
+
* The destination address for transfer transaction.
|
|
30
|
+
*
|
|
31
|
+
* @param {string} dest
|
|
32
|
+
* @returns {TransferBuilder} This transfer builder.
|
|
33
|
+
*/
|
|
34
|
+
to({ address }: BaseAddress): this;
|
|
35
|
+
/**
|
|
36
|
+
* The memo to attach to the transfer transaction.
|
|
37
|
+
* Pads the memo on the left with zeros to ensure it is 32 characters long.
|
|
38
|
+
*
|
|
39
|
+
* @param {string} memo The memo string to include.
|
|
40
|
+
* @returns {TransferBuilder} This transfer builder.
|
|
41
|
+
*/
|
|
42
|
+
memo(memo: string): this;
|
|
43
|
+
/** @inheritdoc */
|
|
44
|
+
validateDecodedTransaction(decodedTxn: DecodedSigningPayload | DecodedSignedTx, rawTransaction?: string): void;
|
|
45
|
+
/** @inheritdoc */
|
|
46
|
+
protected fromImplementation(rawTransaction: string): Transaction;
|
|
47
|
+
/**
|
|
48
|
+
* Construct a transaction to transfer funds with an attached memo.
|
|
49
|
+
*
|
|
50
|
+
* @param {Interface.TransferWithMemoArgs} args Arguments to be passed to the transferWithMemo method
|
|
51
|
+
* @param {Interface.CreateBaseTxInfo} info Base txn info required to construct the transfer transaction
|
|
52
|
+
* @returns {UnsignedTransaction} An unsigned transferWithMemo transaction
|
|
53
|
+
*/
|
|
54
|
+
private TransferWithMemo;
|
|
7
55
|
}
|
|
8
56
|
//# sourceMappingURL=transferBuilder.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transferBuilder.d.ts","sourceRoot":"","sources":["../../../src/lib/transferBuilder.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"transferBuilder.d.ts","sourceRoot":"","sources":["../../../src/lib/transferBuilder.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAgB,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACtH,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,WAAW,EAA2B,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAI7F,qBAAa,eAAgB,SAAQ,gBAAgB,CAAC,QAAQ,EAAE,WAAW,CAAC;IAC1E,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,GAAG,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC;gBAEZ,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC;IAK7C,SAAS,KAAK,eAAe,IAAI,eAAe,CAE/C;IAED;;;;OAIG;IACH,SAAS,CAAC,gBAAgB,IAAI,mBAAmB;IAYjD;;;;;;OAMG;IACH,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAM5B;;;;;;OAMG;IACH,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,WAAW,GAAG,IAAI;IAMlC;;;;;;OAMG;IACH,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAMxB,kBAAkB;IAClB,0BAA0B,CAAC,UAAU,EAAE,qBAAqB,GAAG,eAAe,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI;IAc9G,kBAAkB;IAClB,SAAS,CAAC,kBAAkB,CAAC,cAAc,EAAE,MAAM,GAAG,WAAW;IAmBjE;;;;;;OAMG;IACH,OAAO,CAAC,gBAAgB;CAgBzB"}
|
|
@@ -1,15 +1,121 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
2
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
6
|
exports.TransferBuilder = void 0;
|
|
4
|
-
const
|
|
7
|
+
const bignumber_js_1 = __importDefault(require("bignumber.js"));
|
|
8
|
+
const abstract_substrate_1 = require("@bitgo-beta/abstract-substrate");
|
|
9
|
+
const baseBuilder_1 = require("./baseBuilder");
|
|
10
|
+
const txwrapper_core_1 = require("@substrate/txwrapper-core");
|
|
5
11
|
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
6
|
-
|
|
12
|
+
const utils_1 = __importDefault(require("./utils"));
|
|
13
|
+
class TransferBuilder extends baseBuilder_1.PolyxBaseBuilder {
|
|
7
14
|
constructor(_coinConfig) {
|
|
8
15
|
super(_coinConfig);
|
|
16
|
+
this.material(utils_1.default.getMaterial(_coinConfig.network.type));
|
|
9
17
|
}
|
|
10
18
|
get transactionType() {
|
|
11
19
|
return sdk_core_1.TransactionType.Send;
|
|
12
20
|
}
|
|
21
|
+
/**
|
|
22
|
+
* Construct an unsigned `transferWithMemo` transaction using the provided details.
|
|
23
|
+
*
|
|
24
|
+
* @returns {UnsignedTransaction} The constructed unsigned transferWithMemo transaction.
|
|
25
|
+
*/
|
|
26
|
+
buildTransaction() {
|
|
27
|
+
const baseTxInfo = this.createBaseTxInfo();
|
|
28
|
+
return this.TransferWithMemo({
|
|
29
|
+
dest: { id: this._to },
|
|
30
|
+
value: this._amount,
|
|
31
|
+
memo: this._memo,
|
|
32
|
+
}, baseTxInfo);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
*
|
|
36
|
+
* The amount for transfer transaction.
|
|
37
|
+
*
|
|
38
|
+
* @param {string} amount
|
|
39
|
+
* @returns {TransferBuilder} This transfer builder.
|
|
40
|
+
*/
|
|
41
|
+
amount(amount) {
|
|
42
|
+
this.validateValue(new bignumber_js_1.default(amount));
|
|
43
|
+
this._amount = amount;
|
|
44
|
+
return this;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
*
|
|
48
|
+
* The destination address for transfer transaction.
|
|
49
|
+
*
|
|
50
|
+
* @param {string} dest
|
|
51
|
+
* @returns {TransferBuilder} This transfer builder.
|
|
52
|
+
*/
|
|
53
|
+
to({ address }) {
|
|
54
|
+
this.validateAddress({ address });
|
|
55
|
+
this._to = address;
|
|
56
|
+
return this;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* The memo to attach to the transfer transaction.
|
|
60
|
+
* Pads the memo on the left with zeros to ensure it is 32 characters long.
|
|
61
|
+
*
|
|
62
|
+
* @param {string} memo The memo string to include.
|
|
63
|
+
* @returns {TransferBuilder} This transfer builder.
|
|
64
|
+
*/
|
|
65
|
+
memo(memo) {
|
|
66
|
+
const paddedMemo = memo.padStart(32, '0');
|
|
67
|
+
this._memo = paddedMemo;
|
|
68
|
+
return this;
|
|
69
|
+
}
|
|
70
|
+
/** @inheritdoc */
|
|
71
|
+
validateDecodedTransaction(decodedTxn, rawTransaction) {
|
|
72
|
+
if (decodedTxn.method?.name === abstract_substrate_1.Interface.MethodNames.TransferWithMemo) {
|
|
73
|
+
const txMethod = decodedTxn.method.args;
|
|
74
|
+
const amount = `${txMethod.value}`;
|
|
75
|
+
const to = txMethod.dest.id;
|
|
76
|
+
const memo = txMethod.memo;
|
|
77
|
+
const validationResult = abstract_substrate_1.Schema.TransferWithMemoTransactionSchema.validate({ amount, to, memo });
|
|
78
|
+
if (validationResult.error) {
|
|
79
|
+
throw new sdk_core_1.InvalidTransactionError(`Invalid transaction: ${validationResult.error.message}`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/** @inheritdoc */
|
|
84
|
+
fromImplementation(rawTransaction) {
|
|
85
|
+
const tx = super.fromImplementation(rawTransaction);
|
|
86
|
+
if (!this._method || !this._method.args) {
|
|
87
|
+
throw new sdk_core_1.InvalidTransactionError('Transaction method or args are undefined');
|
|
88
|
+
}
|
|
89
|
+
if (this._method?.name === abstract_substrate_1.Interface.MethodNames.TransferWithMemo) {
|
|
90
|
+
const txMethod = this._method.args;
|
|
91
|
+
this.amount(txMethod.value);
|
|
92
|
+
this.to({
|
|
93
|
+
address: utils_1.default.decodeSubstrateAddress(txMethod.dest.id, utils_1.default.getAddressFormat(this._coinConfig.name)),
|
|
94
|
+
});
|
|
95
|
+
this.memo(txMethod.memo);
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
throw new sdk_core_1.InvalidTransactionError(`Invalid Transaction Type: ${this._method.name}. Expected transferWithMemo`);
|
|
99
|
+
}
|
|
100
|
+
return tx;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Construct a transaction to transfer funds with an attached memo.
|
|
104
|
+
*
|
|
105
|
+
* @param {Interface.TransferWithMemoArgs} args Arguments to be passed to the transferWithMemo method
|
|
106
|
+
* @param {Interface.CreateBaseTxInfo} info Base txn info required to construct the transfer transaction
|
|
107
|
+
* @returns {UnsignedTransaction} An unsigned transferWithMemo transaction
|
|
108
|
+
*/
|
|
109
|
+
TransferWithMemo(args, info) {
|
|
110
|
+
return (0, txwrapper_core_1.defineMethod)({
|
|
111
|
+
method: {
|
|
112
|
+
args,
|
|
113
|
+
name: 'transferWithMemo',
|
|
114
|
+
pallet: 'balances',
|
|
115
|
+
},
|
|
116
|
+
...info.baseTxInfo,
|
|
117
|
+
}, info.options);
|
|
118
|
+
}
|
|
13
119
|
}
|
|
14
120
|
exports.TransferBuilder = TransferBuilder;
|
|
15
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmZXJCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi90cmFuc2ZlckJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkRBQTBEO0FBRTFELG1EQUF1RDtBQUV2RCxNQUFhLGVBQWdCLFNBQVEsdUNBQWtCO0lBQ3JELFlBQVksV0FBaUM7UUFDM0MsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3JCLENBQUM7SUFFRCxJQUFjLGVBQWU7UUFDM0IsT0FBTywwQkFBZSxDQUFDLElBQUksQ0FBQztJQUM5QixDQUFDO0NBQ0Y7QUFSRCwwQ0FRQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRyYW5zYWN0aW9uQnVpbGRlciB9IGZyb20gJy4vdHJhbnNhY3Rpb25CdWlsZGVyJztcbmltcG9ydCB7IEJhc2VDb2luIGFzIENvaW5Db25maWcgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uVHlwZSB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcblxuZXhwb3J0IGNsYXNzIFRyYW5zZmVyQnVpbGRlciBleHRlbmRzIFRyYW5zYWN0aW9uQnVpbGRlciB7XG4gIGNvbnN0cnVjdG9yKF9jb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPikge1xuICAgIHN1cGVyKF9jb2luQ29uZmlnKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgdHJhbnNhY3Rpb25UeXBlKCk6IFRyYW5zYWN0aW9uVHlwZSB7XG4gICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5TZW5kO1xuICB9XG59XG4iXX0=
|
|
121
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmZXJCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi90cmFuc2ZlckJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsZ0VBQXFDO0FBRXJDLHVFQUFtRTtBQUduRSwrQ0FBaUQ7QUFDakQsOERBQXNIO0FBRXRILG1EQUE2RjtBQUU3RixvREFBNEI7QUFFNUIsTUFBYSxlQUFnQixTQUFRLDhCQUF1QztJQUsxRSxZQUFZLFdBQWlDO1FBQzNDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNuQixJQUFJLENBQUMsUUFBUSxDQUFDLGVBQUssQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFFRCxJQUFjLGVBQWU7UUFDM0IsT0FBTywwQkFBZSxDQUFDLElBQUksQ0FBQztJQUM5QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNPLGdCQUFnQjtRQUN4QixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUMzQyxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FDMUI7WUFDRSxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUN0QixLQUFLLEVBQUUsSUFBSSxDQUFDLE9BQU87WUFDbkIsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLO1NBQ2pCLEVBQ0QsVUFBVSxDQUNYLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsTUFBTSxDQUFDLE1BQWM7UUFDbkIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLHNCQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUMxQyxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztRQUN0QixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxFQUFFLENBQUMsRUFBRSxP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VUFBVTtTQUNuQixFQUNELElBQUksQ0FBQyxPQUFPLENBQ2IsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQWhJRCwwQ0FnSUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQmlnTnVtYmVyIGZyb20gJ2JpZ251bWJlci5qcyc7XG5cbmltcG9ydCB7IEludGVyZmFjZSwgU2NoZW1hIH0gZnJvbSAnQGJpdGdvLWJldGEvYWJzdHJhY3Qtc3Vic3RyYXRlJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uIH0gZnJvbSAnLi90cmFuc2FjdGlvbic7XG5pbXBvcnQgeyBUeE1ldGhvZCB9IGZyb20gJy4vaWZhY2UnO1xuaW1wb3J0IHsgUG9seXhCYXNlQnVpbGRlciB9IGZyb20gJy4vYmFzZUJ1aWxkZXInO1xuaW1wb3J0IHsgRGVjb2RlZFNpZ25lZFR4LCBEZWNvZGVkU2lnbmluZ1BheWxvYWQsIGRlZmluZU1ldGhvZCwgVW5zaWduZWRUcmFuc2FjdGlvbiB9IGZyb20gJ0BzdWJzdHJhdGUvdHh3cmFwcGVyLWNvcmUnO1xuaW1wb3J0IHsgQmFzZUNvaW4gYXMgQ29pbkNvbmZpZyB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuaW1wb3J0IHsgQmFzZUFkZHJlc3MsIEludmFsaWRUcmFuc2FjdGlvbkVycm9yLCBUcmFuc2FjdGlvblR5cGUgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5cbmltcG9ydCB1dGlscyBmcm9tICcuL3V0aWxzJztcblxuZXhwb3J0IGNsYXNzIFRyYW5zZmVyQnVpbGRlciBleHRlbmRzIFBvbHl4QmFzZUJ1aWxkZXI8VHhNZXRob2QsIFRyYW5zYWN0aW9uPiB7XG4gIHByb3RlY3RlZCBfYW1vdW50OiBzdHJpbmc7XG4gIHByb3RlY3RlZCBfdG86IHN0cmluZztcbiAgcHJvdGVjdGVkIF9tZW1vOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoX2NvaW5Db25maWc6IFJlYWRvbmx5PENvaW5Db25maWc+KSB7XG4gICAgc3VwZXIoX2NvaW5Db25maWcpO1xuICAgIHRoaXMubWF0ZXJpYWwodXRpbHMuZ2V0TWF0ZXJpYWwoX2NvaW5Db25maWcubmV0d29yay50eXBlKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IHRyYW5zYWN0aW9uVHlwZSgpOiBUcmFuc2FjdGlvblR5cGUge1xuICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuU2VuZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3QgYW4gdW5zaWduZWQgYHRyYW5zZmVyV2l0aE1lbW9gIHRyYW5zYWN0aW9uIHVzaW5nIHRoZSBwcm92aWRlZCBkZXRhaWxzLlxuICAgKlxuICAgKiBAcmV0dXJucyB7VW5zaWduZWRUcmFuc2FjdGlvbn0gVGhlIGNvbnN0cnVjdGVkIHVuc2lnbmVkIHRyYW5zZmVyV2l0aE1lbW8gdHJhbnNhY3Rpb24uXG4gICAqL1xuICBwcm90ZWN0ZWQgYnVpbGRUcmFuc2FjdGlvbigpOiBVbnNpZ25lZFRyYW5zYWN0aW9uIHtcbiAgICBjb25zdCBiYXNlVHhJbmZvID0gdGhpcy5jcmVhdGVCYXNlVHhJbmZvKCk7XG4gICAgcmV0dXJuIHRoaXMuVHJhbnNmZXJXaXRoTWVtbyhcbiAgICAgIHtcbiAgICAgICAgZGVzdDogeyBpZDogdGhpcy5fdG8gfSxcbiAgICAgICAgdmFsdWU6IHRoaXMuX2Ftb3VudCxcbiAgICAgICAgbWVtbzogdGhpcy5fbWVtbyxcbiAgICAgIH0sXG4gICAgICBiYXNlVHhJbmZvXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBUaGUgYW1vdW50IGZvciB0cmFuc2ZlciB0cmFuc2FjdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFtb3VudFxuICAgKiBAcmV0dXJucyB7VHJhbnNmZXJCdWlsZGVyfSBUaGlzIHRyYW5zZmVyIGJ1aWxkZXIuXG4gICAqL1xuICBhbW91bnQoYW1vdW50OiBzdHJpbmcpOiB0aGlzIHtcbiAgICB0aGlzLnZhbGlkYXRlVmFsdWUobmV3IEJpZ051bWJlcihhbW91bnQpKTtcbiAgICB0aGlzLl9hbW91bnQgPSBhbW91bnQ7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogVGhlIGRlc3RpbmF0aW9uIGFkZHJlc3MgZm9yIHRyYW5zZmVyIHRyYW5zYWN0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGVzdFxuICAgKiBAcmV0dXJucyB7VHJhbnNmZXJCdWlsZGVyfSBUaGlzIHRyYW5zZmVyIGJ1aWxkZXIuXG4gICAqL1xuICB0byh7IGFkZHJlc3MgfTogQmFzZUFkZHJlc3MpOiB0aGlzIHtcbiAgICB0aGlzLnZhbGlkYXRlQWRkcmVzcyh7IGFkZHJlc3MgfSk7XG4gICAgdGhpcy5fdG8gPSBhZGRyZXNzO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBtZW1vIHRvIGF0dGFjaCB0byB0aGUgdHJhbnNmZXIgdHJhbnNhY3Rpb24uXG4gICAqIFBhZHMgdGhlIG1lbW8gb24gdGhlIGxlZnQgd2l0aCB6ZXJvcyB0byBlbnN1cmUgaXQgaXMgMzIgY2hhcmFjdGVycyBsb25nLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWVtbyBUaGUgbWVtbyBzdHJpbmcgdG8gaW5jbHVkZS5cbiAgICogQHJldHVybnMge1RyYW5zZmVyQnVpbGRlcn0gVGhpcyB0cmFuc2ZlciBidWlsZGVyLlxuICAgKi9cbiAgbWVtbyhtZW1vOiBzdHJpbmcpOiB0aGlzIHtcbiAgICBjb25zdCBwYWRkZWRNZW1vID0gbWVtby5wYWRTdGFydCgzMiwgJzAnKTtcbiAgICB0aGlzLl9tZW1vID0gcGFkZGVkTWVtbztcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICB2YWxpZGF0ZURlY29kZWRUcmFuc2FjdGlvbihkZWNvZGVkVHhuOiBEZWNvZGVkU2lnbmluZ1BheWxvYWQgfCBEZWNvZGVkU2lnbmVkVHgsIHJhd1RyYW5zYWN0aW9uPzogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKGRlY29kZWRUeG4ubWV0aG9kPy5uYW1lID09PSBJbnRlcmZhY2UuTWV0aG9kTmFtZXMuVHJhbnNmZXJXaXRoTWVtbykge1xuICAgICAgY29uc3QgdHhNZXRob2QgPSBkZWNvZGVkVHhuLm1ldGhvZC5hcmdzIGFzIEludGVyZmFjZS5UcmFuc2ZlcldpdGhNZW1vQXJncztcbiAgICAgIGNvbnN0IGFtb3VudCA9IGAke3R4TWV0aG9kLnZhbHVlfWA7XG4gICAgICBjb25zdCB0byA9IHR4TWV0aG9kLmRlc3QuaWQ7XG4gICAgICBjb25zdCBtZW1vID0gdHhNZXRob2QubWVtbztcblxuICAgICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IFNjaGVtYS5UcmFuc2ZlcldpdGhNZW1vVHJhbnNhY3Rpb25TY2hlbWEudmFsaWRhdGUoeyBhbW91bnQsIHRvLCBtZW1vIH0pO1xuICAgICAgaWYgKHZhbGlkYXRpb25SZXN1bHQuZXJyb3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKGBJbnZhbGlkIHRyYW5zYWN0aW9uOiAke3ZhbGlkYXRpb25SZXN1bHQuZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgcHJvdGVjdGVkIGZyb21JbXBsZW1lbnRhdGlvbihyYXdUcmFuc2FjdGlvbjogc3RyaW5nKTogVHJhbnNhY3Rpb24ge1xuICAgIGNvbnN0IHR4ID0gc3VwZXIuZnJvbUltcGxlbWVudGF0aW9uKHJhd1RyYW5zYWN0aW9uKTtcbiAgICBpZiAoIXRoaXMuX21ldGhvZCB8fCAhdGhpcy5fbWV0aG9kLmFyZ3MpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignVHJhbnNhY3Rpb24gbWV0aG9kIG9yIGFyZ3MgYXJlIHVuZGVmaW5lZCcpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9tZXRob2Q/Lm5hbWUgPT09IEludGVyZmFjZS5NZXRob2ROYW1lcy5UcmFuc2ZlcldpdGhNZW1vKSB7XG4gICAgICBjb25zdCB0eE1ldGhvZCA9IHRoaXMuX21ldGhvZC5hcmdzIGFzIEludGVyZmFjZS5UcmFuc2ZlcldpdGhNZW1vQXJncztcbiAgICAgIHRoaXMuYW1vdW50KHR4TWV0aG9kLnZhbHVlKTtcbiAgICAgIHRoaXMudG8oe1xuICAgICAgICBhZGRyZXNzOiB1dGlscy5kZWNvZGVTdWJzdHJhdGVBZGRyZXNzKHR4TWV0aG9kLmRlc3QuaWQsIHV0aWxzLmdldEFkZHJlc3NGb3JtYXQodGhpcy5fY29pbkNvbmZpZy5uYW1lKSksXG4gICAgICB9KTtcbiAgICAgIHRoaXMubWVtbyh0eE1ldGhvZC5tZW1vKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKGBJbnZhbGlkIFRyYW5zYWN0aW9uIFR5cGU6ICR7dGhpcy5fbWV0aG9kLm5hbWV9LiBFeHBlY3RlZCB0cmFuc2ZlcldpdGhNZW1vYCk7XG4gICAgfVxuICAgIHJldHVybiB0eDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3QgYSB0cmFuc2FjdGlvbiB0byB0cmFuc2ZlciBmdW5kcyB3aXRoIGFuIGF0dGFjaGVkIG1lbW8uXG4gICAqXG4gICAqIEBwYXJhbSB7SW50ZXJmYWNlLlRyYW5zZmVyV2l0aE1lbW9BcmdzfSBhcmdzIEFyZ3VtZW50cyB0byBiZSBwYXNzZWQgdG8gdGhlIHRyYW5zZmVyV2l0aE1lbW8gbWV0aG9kXG4gICAqIEBwYXJhbSB7SW50ZXJmYWNlLkNyZWF0ZUJhc2VUeEluZm99IGluZm8gQmFzZSB0eG4gaW5mbyByZXF1aXJlZCB0byBjb25zdHJ1Y3QgdGhlIHRyYW5zZmVyIHRyYW5zYWN0aW9uXG4gICAqIEByZXR1cm5zIHtVbnNpZ25lZFRyYW5zYWN0aW9ufSBBbiB1bnNpZ25lZCB0cmFuc2ZlcldpdGhNZW1vIHRyYW5zYWN0aW9uXG4gICAqL1xuICBwcml2YXRlIFRyYW5zZmVyV2l0aE1lbW8oXG4gICAgYXJnczogSW50ZXJmYWNlLlRyYW5zZmVyV2l0aE1lbW9BcmdzLFxuICAgIGluZm86IEludGVyZmFjZS5DcmVhdGVCYXNlVHhJbmZvXG4gICk6IFVuc2lnbmVkVHJhbnNhY3Rpb24ge1xuICAgIHJldHVybiBkZWZpbmVNZXRob2QoXG4gICAgICB7XG4gICAgICAgIG1ldGhvZDoge1xuICAgICAgICAgIGFyZ3MsXG4gICAgICAgICAgbmFtZTogJ3RyYW5zZmVyV2l0aE1lbW8nLFxuICAgICAgICAgIHBhbGxldDogJ2JhbGFuY2VzJyxcbiAgICAgICAgfSxcbiAgICAgICAgLi4uaW5mby5iYXNlVHhJbmZvLFxuICAgICAgfSxcbiAgICAgIGluZm8ub3B0aW9uc1xuICAgICk7XG4gIH1cbn1cbiJdfQ==
|