@bitgo-beta/sdk-coin-trx 1.0.2-beta.202 → 1.0.2-beta.2021
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/resources/protobuf/Contract.proto +32 -0
- package/dist/resources/protobuf/tron.d.ts +1478 -214
- package/dist/resources/protobuf/tron.js +6312 -2600
- package/dist/resources/protobuf/tron.proto +6 -0
- package/dist/src/index.js +6 -2
- package/dist/src/lib/accountCreateTxBuilder.d.ts +60 -0
- package/dist/src/lib/accountCreateTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/accountCreateTxBuilder.js +191 -0
- package/dist/src/lib/constants.d.ts +4 -0
- package/dist/src/lib/constants.d.ts.map +1 -0
- package/dist/src/lib/constants.js +7 -0
- package/dist/src/lib/contractCallBuilder.d.ts +1 -35
- package/dist/src/lib/contractCallBuilder.d.ts.map +1 -1
- package/dist/src/lib/contractCallBuilder.js +13 -76
- package/dist/src/lib/delegateResourceTxBuilder.d.ts +27 -0
- package/dist/src/lib/delegateResourceTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/delegateResourceTxBuilder.js +104 -0
- package/dist/src/lib/enum.d.ts +40 -1
- package/dist/src/lib/enum.d.ts.map +1 -1
- package/dist/src/lib/enum.js +44 -4
- package/dist/src/lib/freezeBalanceTxBuilder.d.ts +71 -0
- package/dist/src/lib/freezeBalanceTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/freezeBalanceTxBuilder.js +217 -0
- package/dist/src/lib/iface.d.ts +248 -2
- package/dist/src/lib/iface.d.ts.map +1 -1
- package/dist/src/lib/iface.js +1 -1
- package/dist/src/lib/index.js +23 -9
- package/dist/src/lib/keyPair.d.ts +0 -1
- package/dist/src/lib/keyPair.d.ts.map +1 -1
- package/dist/src/lib/keyPair.js +31 -18
- package/dist/src/lib/resourceManagementTxBuilder.d.ts +72 -0
- package/dist/src/lib/resourceManagementTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/resourceManagementTxBuilder.js +150 -0
- package/dist/src/lib/tokenTransferBuilder.d.ts +1 -1
- package/dist/src/lib/tokenTransferBuilder.js +3 -3
- package/dist/src/lib/transaction.d.ts +3 -0
- package/dist/src/lib/transaction.d.ts.map +1 -1
- package/dist/src/lib/transaction.js +115 -6
- package/dist/src/lib/transactionBuilder.d.ts +53 -6
- package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilder.js +114 -21
- package/dist/src/lib/undelegateResourceTxBuilder.d.ts +27 -0
- package/dist/src/lib/undelegateResourceTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/undelegateResourceTxBuilder.js +104 -0
- package/dist/src/lib/unfreezeBalanceTxBuilder.d.ts +65 -0
- package/dist/src/lib/unfreezeBalanceTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/unfreezeBalanceTxBuilder.js +210 -0
- package/dist/src/lib/utils.d.ts +92 -4
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +482 -47
- package/dist/src/lib/voteWitnessTxBuilder.d.ts +62 -0
- package/dist/src/lib/voteWitnessTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/voteWitnessTxBuilder.js +219 -0
- package/dist/src/lib/withdrawBuilder.d.ts +49 -0
- package/dist/src/lib/withdrawBuilder.d.ts.map +1 -0
- package/dist/src/lib/withdrawBuilder.js +167 -0
- package/dist/src/lib/withdrawExpireUnfreezeTxBuilder.d.ts +49 -0
- package/dist/src/lib/withdrawExpireUnfreezeTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/withdrawExpireUnfreezeTxBuilder.js +167 -0
- package/dist/src/lib/wrappedBuilder.d.ts +67 -1
- package/dist/src/lib/wrappedBuilder.d.ts.map +1 -1
- package/dist/src/lib/wrappedBuilder.js +114 -4
- package/dist/src/trx.d.ts +105 -4
- package/dist/src/trx.d.ts.map +1 -1
- package/dist/src/trx.js +519 -147
- package/dist/src/trxToken.d.ts +2 -2
- package/dist/src/trxToken.d.ts.map +1 -1
- package/dist/src/trxToken.js +47 -6
- package/dist/test/fixtures.d.ts +40 -0
- package/dist/test/fixtures.d.ts.map +1 -0
- package/dist/test/fixtures.js +46 -0
- package/dist/test/resources.d.ts +596 -0
- package/dist/test/resources.d.ts.map +1 -0
- package/dist/test/resources.js +759 -0
- package/dist/test/unit/index.d.ts +2 -0
- package/dist/test/unit/index.d.ts.map +1 -0
- package/dist/test/unit/index.js +19 -0
- package/dist/test/unit/keyPair.d.ts +2 -0
- package/dist/test/unit/keyPair.d.ts.map +1 -0
- package/dist/test/unit/keyPair.js +163 -0
- package/dist/test/unit/transaction.d.ts +2 -0
- package/dist/test/unit/transaction.d.ts.map +1 -0
- package/dist/test/unit/transaction.js +38 -0
- package/dist/test/unit/transactionBuilder/accountCreateTxBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/accountCreateTxBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/accountCreateTxBuilder.js +247 -0
- package/dist/test/unit/transactionBuilder/contractCallBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/contractCallBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/contractCallBuilder.js +315 -0
- package/dist/test/unit/transactionBuilder/delegateResourceTxBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/delegateResourceTxBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/delegateResourceTxBuilder.js +339 -0
- package/dist/test/unit/transactionBuilder/freezeBalanceTxBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/freezeBalanceTxBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/freezeBalanceTxBuilder.js +365 -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 +55 -0
- package/dist/test/unit/transactionBuilder/undelegateResourceTxBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/undelegateResourceTxBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/undelegateResourceTxBuilder.js +339 -0
- package/dist/test/unit/transactionBuilder/unfreezeBalanceTxBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/unfreezeBalanceTxBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/unfreezeBalanceTxBuilder.js +336 -0
- package/dist/test/unit/transactionBuilder/voteWitnessTxBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/voteWitnessTxBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/voteWitnessTxBuilder.js +277 -0
- package/dist/test/unit/transactionBuilder/withdrawBalanceBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/withdrawBalanceBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/withdrawBalanceBuilder.js +213 -0
- package/dist/test/unit/transactionBuilder/withdrawExpireUnfreezeTxBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/withdrawExpireUnfreezeTxBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/withdrawExpireUnfreezeTxBuilder.js +213 -0
- package/dist/test/unit/transactionBuilder/wrappedBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/wrappedBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/wrappedBuilder.js +50 -0
- package/dist/test/unit/transactionBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder.js +178 -0
- package/dist/test/unit/trx.d.ts +2 -0
- package/dist/test/unit/trx.d.ts.map +1 -0
- package/dist/test/unit/trx.js +639 -0
- package/dist/test/unit/trxToken.d.ts +2 -0
- package/dist/test/unit/trxToken.d.ts.map +1 -0
- package/dist/test/unit/trxToken.js +119 -0
- package/dist/test/unit/util.d.ts +2 -0
- package/dist/test/unit/util.d.ts.map +1 -0
- package/dist/test/unit/util.js +141 -0
- package/dist/test/unit/verifyTransaction.d.ts +2 -0
- package/dist/test/unit/verifyTransaction.d.ts.map +1 -0
- package/dist/test/unit/verifyTransaction.js +593 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +22 -16
- package/.eslintignore +0 -5
- package/.mocharc.yml +0 -8
- package/CHANGELOG.md +0 -104
- package/resources/README.md +0 -31
- package/resources/protobuf/Contract.proto +0 -256
- package/resources/protobuf/Discover.proto +0 -44
- package/resources/protobuf/tron.d.ts +0 -11205
- package/resources/protobuf/tron.js +0 -33480
- package/resources/protobuf/tron.proto +0 -677
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { TransactionType, BaseKey } from '@bitgo-beta/sdk-core';
|
|
2
|
+
import { BaseCoin as CoinConfig } from '@bitgo-beta/statics';
|
|
3
|
+
import { TransactionBuilder } from './transactionBuilder';
|
|
4
|
+
import { Transaction } from './transaction';
|
|
5
|
+
import { TransactionReceipt, VoteWitnessData, VoteWitnessContract } from './iface';
|
|
6
|
+
export declare class VoteWitnessTxBuilder extends TransactionBuilder {
|
|
7
|
+
protected _signingKeys: BaseKey[];
|
|
8
|
+
private _votes;
|
|
9
|
+
constructor(_coinConfig: Readonly<CoinConfig>);
|
|
10
|
+
/** @inheritdoc */
|
|
11
|
+
protected get transactionType(): TransactionType;
|
|
12
|
+
/**
|
|
13
|
+
* Set the votes to be used in the transaction
|
|
14
|
+
*
|
|
15
|
+
* @param votes vote data containing vote address and vote count
|
|
16
|
+
* @returns the builder with the new parameter set
|
|
17
|
+
*/
|
|
18
|
+
setVotes(votes: VoteWitnessData[]): this;
|
|
19
|
+
/** @inheritdoc */
|
|
20
|
+
extendValidTo(extensionMs: number): void;
|
|
21
|
+
/**
|
|
22
|
+
* Initialize the transaction builder fields using the transaction data
|
|
23
|
+
*
|
|
24
|
+
* @param {TransactionReceipt | string} rawTransaction the transaction data in a string or JSON format
|
|
25
|
+
* @returns {VoteWitnessTxBuilder} the builder with the transaction data set
|
|
26
|
+
*/
|
|
27
|
+
initBuilder(rawTransaction: TransactionReceipt | string): this;
|
|
28
|
+
/**
|
|
29
|
+
* Initialize the votewitnesscontract call specific data
|
|
30
|
+
*
|
|
31
|
+
* @param {VoteWitnessContract} contractCall object with transfer data
|
|
32
|
+
*/
|
|
33
|
+
protected initVoteWitnessContractCall(voteWitnessContractCall: VoteWitnessContract): void;
|
|
34
|
+
protected buildImplementation(): Promise<Transaction>;
|
|
35
|
+
/**
|
|
36
|
+
* Creates the vote witness transaction
|
|
37
|
+
*/
|
|
38
|
+
private createVoteWitnessContractTransaction;
|
|
39
|
+
/**
|
|
40
|
+
* Helper method to get the vote witness transaction raw data hex
|
|
41
|
+
* @returns vote witness transaction raw data hex
|
|
42
|
+
*/
|
|
43
|
+
private getVoteWitnessRawDataHex;
|
|
44
|
+
/** @inheritdoc */
|
|
45
|
+
protected signImplementation(key: BaseKey): Transaction;
|
|
46
|
+
private applySignatures;
|
|
47
|
+
validateTransaction(transaction: Transaction): void;
|
|
48
|
+
/**
|
|
49
|
+
* Validates the votes array
|
|
50
|
+
*
|
|
51
|
+
* @param {VoteWitnessData[]} votes - The votes array to validate
|
|
52
|
+
* @throws {Error} when the votes array is invalid
|
|
53
|
+
*/
|
|
54
|
+
validateVotes(votes: VoteWitnessData[]): void;
|
|
55
|
+
/**
|
|
56
|
+
* Validates if the transaction is a valid vote transaction
|
|
57
|
+
* @param {TransactionReceipt} transaction - The transaction to validate
|
|
58
|
+
* @throws {InvalidTransactionError} when the transaction is invalid
|
|
59
|
+
*/
|
|
60
|
+
private validateVoteTransactionFields;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=voteWitnessTxBuilder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"voteWitnessTxBuilder.d.ts","sourceRoot":"","sources":["../../../src/lib/voteWitnessTxBuilder.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,OAAO,EAA+D,MAAM,sBAAsB,CAAC;AAC7H,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAanF,qBAAa,oBAAqB,SAAQ,kBAAkB;IAC1D,SAAS,CAAC,YAAY,EAAE,OAAO,EAAE,CAAC;IAClC,OAAO,CAAC,MAAM,CAAoB;gBAEtB,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC;IAM7C,kBAAkB;IAClB,SAAS,KAAK,eAAe,IAAI,eAAe,CAE/C;IAED;;;;;OAKG;IACH,QAAQ,CAAC,KAAK,EAAE,eAAe,EAAE,GAAG,IAAI;IASxC,kBAAkB;IAClB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAoBxC;;;;;OAKG;IACH,WAAW,CAAC,cAAc,EAAE,kBAAkB,GAAG,MAAM,GAAG,IAAI;IAkB9D;;;;OAIG;IACH,SAAS,CAAC,2BAA2B,CAAC,uBAAuB,EAAE,mBAAmB,GAAG,IAAI;cAgBzE,mBAAmB,IAAI,OAAO,CAAC,WAAW,CAAC;IAc3D;;OAEG;IACH,OAAO,CAAC,oCAAoC;IAoB5C;;;OAGG;IACH,OAAO,CAAC,wBAAwB;IAkChC,kBAAkB;IAClB,SAAS,CAAC,kBAAkB,CAAC,GAAG,EAAE,OAAO,GAAG,WAAW;IAUvD,OAAO,CAAC,eAAe;IAOvB,mBAAmB,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI;IAInD;;;;;OAKG;IACH,aAAa,CAAC,KAAK,EAAE,eAAe,EAAE,GAAG,IAAI;IAiB7C;;;;OAIG;IACH,OAAO,CAAC,6BAA6B;CActC"}
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.VoteWitnessTxBuilder = void 0;
|
|
4
|
+
const crypto_1 = require("crypto");
|
|
5
|
+
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
6
|
+
const transactionBuilder_1 = require("./transactionBuilder");
|
|
7
|
+
const transaction_1 = require("./transaction");
|
|
8
|
+
const utils_1 = require("./utils");
|
|
9
|
+
const tron_1 = require("../../resources/protobuf/tron");
|
|
10
|
+
var ContractType = tron_1.protocol.Transaction.Contract.ContractType;
|
|
11
|
+
class VoteWitnessTxBuilder extends transactionBuilder_1.TransactionBuilder {
|
|
12
|
+
constructor(_coinConfig) {
|
|
13
|
+
super(_coinConfig);
|
|
14
|
+
this._signingKeys = [];
|
|
15
|
+
this.transaction = new transaction_1.Transaction(_coinConfig);
|
|
16
|
+
}
|
|
17
|
+
/** @inheritdoc */
|
|
18
|
+
get transactionType() {
|
|
19
|
+
return sdk_core_1.TransactionType.StakingVote;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Set the votes to be used in the transaction
|
|
23
|
+
*
|
|
24
|
+
* @param votes vote data containing vote address and vote count
|
|
25
|
+
* @returns the builder with the new parameter set
|
|
26
|
+
*/
|
|
27
|
+
setVotes(votes) {
|
|
28
|
+
this.validateVotes(votes);
|
|
29
|
+
this._votes = votes.map((vote) => ({
|
|
30
|
+
...vote,
|
|
31
|
+
vote_address: (0, utils_1.getHexAddressFromBase58Address)(vote.vote_address),
|
|
32
|
+
}));
|
|
33
|
+
return this;
|
|
34
|
+
}
|
|
35
|
+
/** @inheritdoc */
|
|
36
|
+
extendValidTo(extensionMs) {
|
|
37
|
+
if (this.transaction.signature && this.transaction.signature.length > 0) {
|
|
38
|
+
throw new sdk_core_1.ExtendTransactionError('Cannot extend a signed transaction');
|
|
39
|
+
}
|
|
40
|
+
if (extensionMs <= 0) {
|
|
41
|
+
throw new Error('Value cannot be below zero');
|
|
42
|
+
}
|
|
43
|
+
if (extensionMs > utils_1.TRANSACTION_MAX_EXPIRATION) {
|
|
44
|
+
throw new sdk_core_1.ExtendTransactionError('The expiration cannot be extended more than one day');
|
|
45
|
+
}
|
|
46
|
+
if (this._expiration) {
|
|
47
|
+
this._expiration = this._expiration + extensionMs;
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
throw new Error('There is not expiration to extend');
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Initialize the transaction builder fields using the transaction data
|
|
55
|
+
*
|
|
56
|
+
* @param {TransactionReceipt | string} rawTransaction the transaction data in a string or JSON format
|
|
57
|
+
* @returns {VoteWitnessTxBuilder} the builder with the transaction data set
|
|
58
|
+
*/
|
|
59
|
+
initBuilder(rawTransaction) {
|
|
60
|
+
this.transaction = this.fromImplementation(rawTransaction);
|
|
61
|
+
this.transaction.setTransactionType(this.transactionType);
|
|
62
|
+
this.validateRawTransaction(rawTransaction);
|
|
63
|
+
const tx = this.fromImplementation(rawTransaction);
|
|
64
|
+
this.transaction = tx;
|
|
65
|
+
this._signingKeys = [];
|
|
66
|
+
const rawData = tx.toJson().raw_data;
|
|
67
|
+
this._refBlockBytes = rawData.ref_block_bytes;
|
|
68
|
+
this._refBlockHash = rawData.ref_block_hash;
|
|
69
|
+
this._expiration = rawData.expiration;
|
|
70
|
+
this._timestamp = rawData.timestamp;
|
|
71
|
+
this.transaction.setTransactionType(sdk_core_1.TransactionType.StakingVote);
|
|
72
|
+
const contractCall = rawData.contract[0];
|
|
73
|
+
this.initVoteWitnessContractCall(contractCall);
|
|
74
|
+
return this;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Initialize the votewitnesscontract call specific data
|
|
78
|
+
*
|
|
79
|
+
* @param {VoteWitnessContract} contractCall object with transfer data
|
|
80
|
+
*/
|
|
81
|
+
initVoteWitnessContractCall(voteWitnessContractCall) {
|
|
82
|
+
const { votes, owner_address } = voteWitnessContractCall.parameter.value;
|
|
83
|
+
if (owner_address) {
|
|
84
|
+
this.source({ address: (0, utils_1.getBase58AddressFromHex)(owner_address) });
|
|
85
|
+
}
|
|
86
|
+
if (votes) {
|
|
87
|
+
this.setVotes(votes.map((vote) => ({
|
|
88
|
+
...vote,
|
|
89
|
+
vote_address: (0, utils_1.getBase58AddressFromHex)(vote.vote_address),
|
|
90
|
+
})));
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
async buildImplementation() {
|
|
94
|
+
this.createVoteWitnessContractTransaction();
|
|
95
|
+
/** @inheritdoccreateTransaction */
|
|
96
|
+
// This method must be extended on child classes
|
|
97
|
+
if (this._signingKeys.length > 0) {
|
|
98
|
+
this.applySignatures();
|
|
99
|
+
}
|
|
100
|
+
if (!this.transaction.id) {
|
|
101
|
+
throw new sdk_core_1.BuildTransactionError('A valid transaction must have an id');
|
|
102
|
+
}
|
|
103
|
+
return Promise.resolve(this.transaction);
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Creates the vote witness transaction
|
|
107
|
+
*/
|
|
108
|
+
createVoteWitnessContractTransaction() {
|
|
109
|
+
const rawDataHex = this.getVoteWitnessRawDataHex();
|
|
110
|
+
const rawData = (0, utils_1.decodeTransaction)(rawDataHex);
|
|
111
|
+
const contract = rawData.contract[0];
|
|
112
|
+
const contractParameter = contract.parameter;
|
|
113
|
+
contractParameter.value.owner_address = this._ownerAddress.toLocaleLowerCase();
|
|
114
|
+
contractParameter.value.votes = this._votes;
|
|
115
|
+
contractParameter.type_url = 'type.googleapis.com/protocol.VoteWitnessContract';
|
|
116
|
+
contract.type = 'VoteWitnessContract';
|
|
117
|
+
const hexBuffer = Buffer.from(rawDataHex, 'hex');
|
|
118
|
+
const id = (0, crypto_1.createHash)('sha256').update(hexBuffer).digest('hex');
|
|
119
|
+
const txRecip = {
|
|
120
|
+
raw_data: rawData,
|
|
121
|
+
raw_data_hex: rawDataHex,
|
|
122
|
+
txID: id,
|
|
123
|
+
signature: this.transaction.signature,
|
|
124
|
+
};
|
|
125
|
+
this.transaction = new transaction_1.Transaction(this._coinConfig, txRecip);
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Helper method to get the vote witness transaction raw data hex
|
|
129
|
+
* @returns vote witness transaction raw data hex
|
|
130
|
+
*/
|
|
131
|
+
getVoteWitnessRawDataHex() {
|
|
132
|
+
const voteArray = this._votes.map((vote) => {
|
|
133
|
+
const voteObject = tron_1.protocol.Vote.fromObject({
|
|
134
|
+
voteAddress: (0, utils_1.getByteArrayFromHexAddress)(vote.vote_address),
|
|
135
|
+
voteCount: vote.vote_count,
|
|
136
|
+
});
|
|
137
|
+
return tron_1.protocol.Vote.create(voteObject);
|
|
138
|
+
});
|
|
139
|
+
const rawContract = {
|
|
140
|
+
ownerAddress: (0, utils_1.getByteArrayFromHexAddress)(this._ownerAddress),
|
|
141
|
+
votes: voteArray,
|
|
142
|
+
};
|
|
143
|
+
const voteWitnessContract = tron_1.protocol.VoteWitnessContract.fromObject(rawContract);
|
|
144
|
+
const voteWitnessContractBytes = tron_1.protocol.VoteWitnessContract.encode(voteWitnessContract).finish();
|
|
145
|
+
const txContract = {
|
|
146
|
+
type: ContractType.VoteWitnessContract,
|
|
147
|
+
parameter: {
|
|
148
|
+
value: voteWitnessContractBytes,
|
|
149
|
+
type_url: 'type.googleapis.com/protocol.VoteWitnessContract',
|
|
150
|
+
},
|
|
151
|
+
};
|
|
152
|
+
const raw = {
|
|
153
|
+
refBlockBytes: Buffer.from(this._refBlockBytes, 'hex'),
|
|
154
|
+
refBlockHash: Buffer.from(this._refBlockHash, 'hex'),
|
|
155
|
+
expiration: this._expiration || Date.now() + utils_1.TRANSACTION_DEFAULT_EXPIRATION,
|
|
156
|
+
timestamp: this._timestamp || Date.now(),
|
|
157
|
+
contract: [txContract],
|
|
158
|
+
};
|
|
159
|
+
const rawTx = tron_1.protocol.Transaction.raw.create(raw);
|
|
160
|
+
return Buffer.from(tron_1.protocol.Transaction.raw.encode(rawTx).finish()).toString('hex');
|
|
161
|
+
}
|
|
162
|
+
/** @inheritdoc */
|
|
163
|
+
signImplementation(key) {
|
|
164
|
+
if (this._signingKeys.some((signingKey) => signingKey.key === key.key)) {
|
|
165
|
+
throw new sdk_core_1.SigningError('Duplicated key');
|
|
166
|
+
}
|
|
167
|
+
this._signingKeys.push(key);
|
|
168
|
+
// We keep this return for compatibility but is not meant to be use
|
|
169
|
+
return this.transaction;
|
|
170
|
+
}
|
|
171
|
+
applySignatures() {
|
|
172
|
+
if (!this.transaction.inputs) {
|
|
173
|
+
throw new sdk_core_1.SigningError('Transaction has no inputs');
|
|
174
|
+
}
|
|
175
|
+
this._signingKeys.forEach((key) => this.applySignature(key));
|
|
176
|
+
}
|
|
177
|
+
validateTransaction(transaction) {
|
|
178
|
+
this.validateVoteTransactionFields();
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Validates the votes array
|
|
182
|
+
*
|
|
183
|
+
* @param {VoteWitnessData[]} votes - The votes array to validate
|
|
184
|
+
* @throws {Error} when the votes array is invalid
|
|
185
|
+
*/
|
|
186
|
+
validateVotes(votes) {
|
|
187
|
+
if (!votes || votes.length === 0) {
|
|
188
|
+
throw new Error('Votes array is missing or empty');
|
|
189
|
+
}
|
|
190
|
+
votes.forEach((vote) => {
|
|
191
|
+
if (!vote.vote_address) {
|
|
192
|
+
throw new Error('Vote address is missing');
|
|
193
|
+
}
|
|
194
|
+
this.validateAddress({ address: vote.vote_address });
|
|
195
|
+
if (vote.vote_count == null || vote.vote_count < 0) {
|
|
196
|
+
throw new Error('Invalid vote count');
|
|
197
|
+
}
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Validates if the transaction is a valid vote transaction
|
|
202
|
+
* @param {TransactionReceipt} transaction - The transaction to validate
|
|
203
|
+
* @throws {InvalidTransactionError} when the transaction is invalid
|
|
204
|
+
*/
|
|
205
|
+
validateVoteTransactionFields() {
|
|
206
|
+
if (!this._ownerAddress) {
|
|
207
|
+
throw new sdk_core_1.BuildTransactionError('Missing parameter: source');
|
|
208
|
+
}
|
|
209
|
+
if (!this._refBlockBytes || !this._refBlockHash) {
|
|
210
|
+
throw new sdk_core_1.BuildTransactionError('Missing block reference information');
|
|
211
|
+
}
|
|
212
|
+
// Validate votes
|
|
213
|
+
if (!this._votes || this._votes.length === 0) {
|
|
214
|
+
throw new sdk_core_1.BuildTransactionError('Missing or empty votes array');
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
exports.VoteWitnessTxBuilder = VoteWitnessTxBuilder;
|
|
219
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidm90ZVdpdG5lc3NUeEJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3ZvdGVXaXRuZXNzVHhCdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1DQUFvQztBQUNwQyxtREFBNkg7QUFFN0gsNkRBQTBEO0FBQzFELCtDQUE0QztBQUU1QyxtQ0FPaUI7QUFDakIsd0RBQXlEO0FBRXpELElBQU8sWUFBWSxHQUFHLGVBQVEsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQztBQUVqRSxNQUFhLG9CQUFxQixTQUFRLHVDQUFrQjtJQUkxRCxZQUFZLFdBQWlDO1FBQzNDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNuQixJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUkseUJBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLElBQWMsZUFBZTtRQUMzQixPQUFPLDBCQUFlLENBQUMsV0FBVyxDQUFDO0lBQ3JDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILFFBQVEsQ0FBQyxLQUF3QjtRQUMvQixJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNqQyxHQUFHLElBQUk7WUFDUCxZQUFZLEVBQUUsSUFBQSxzQ0FBOEIsRUFBQyxJQUFJLENBQUMsWUFBWSxDQUFDO1NBQ2hFLENBQUMsQ0FBQyxDQUFDO1FBQ0osT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLGFBQWEsQ0FBQyxXQUFtQjtRQUMvQixJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMs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Q0FBQztZQUNoRCxNQUFNLElBQUksZ0NBQXFCLENBQUMscUNBQXFDLENBQUMsQ0FBQztRQUN6RSxDQUFDO1FBRUQsaUJBQWlCO1FBQ2pCLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzdDLE1BQU0sSUFBSSxnQ0FBcUIsQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO1FBQ2xFLENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUEzT0Qsb0RBMk9DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvblR5cGUsIEJhc2VLZXksIEJ1aWxkVHJhbnNhY3Rpb25FcnJvciwgU2lnbmluZ0Vycm9yLCBFeHRlbmRUcmFuc2FjdGlvbkVycm9yIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgQmFzZUNvaW4gYXMgQ29pbkNvbmZpZyB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25CdWlsZGVyIH0gZnJvbSAnLi90cmFuc2FjdGlvbkJ1aWxkZXInO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb24gfSBmcm9tICcuL3RyYW5zYWN0aW9uJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uUmVjZWlwdCwgVm90ZVdpdG5lc3NEYXRhLCBWb3RlV2l0bmVzc0NvbnRyYWN0IH0gZnJvbSAnLi9pZmFjZSc7XG5pbXBvcnQge1xuICBkZWNvZGVUcmFuc2FjdGlvbixcbiAgZ2V0SGV4QWRkcmVzc0Zyb21CYXNlNThBZGRyZXNzLFxuICBnZXRCeXRlQXJyYXlGcm9tSGV4QWRkcmVzcyxcbiAgZ2V0QmFzZTU4QWRkcmVzc0Zyb21IZXgsXG4gIFRSQU5TQUNUSU9OX0RFRkFVTFRfRVhQSVJBVElPTixcbiAgVFJBTlNBQ1RJT05fTUFYX0VYUElSQVRJT04sXG59IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgcHJvdG9jb2wgfSBmcm9tICcuLi8uLi9yZXNvdXJjZXMvcHJvdG9idWYvdHJvbic7XG5cbmltcG9ydCBDb250cmFjdFR5cGUgPSBwcm90b2NvbC5UcmFuc2FjdGlvbi5Db250cmFjdC5Db250cmFjdFR5cGU7XG5cbmV4cG9ydCBjbGFzcyBWb3RlV2l0bmVzc1R4QnVpbGRlciBleHRlbmRzIFRyYW5zYWN0aW9uQnVpbGRlciB7XG4gIHByb3RlY3RlZCBfc2lnbmluZ0tleXM6IEJhc2VLZXlbXTtcbiAgcHJpdmF0ZSBfdm90ZXM6IFZvdGVXaXRuZXNzRGF0YVtdO1xuXG4gIGNvbnN0cnVjdG9yKF9jb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPikge1xuICAgIHN1cGVyKF9jb2luQ29uZmlnKTtcbiAgICB0aGlzLl9zaWduaW5nS2V5cyA9IFtdO1xuICAgIHRoaXMudHJhbnNhY3Rpb24gPSBuZXcgVHJhbnNhY3Rpb24oX2NvaW5Db25maWcpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHByb3RlY3RlZCBnZXQgdHJhbnNhY3Rpb25UeXBlKCk6IFRyYW5zYWN0aW9uVHlwZSB7XG4gICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nVm90ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHZvdGVzIHRvIGJlIHVzZWQgaW4gdGhlIHRyYW5zYWN0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB2b3RlcyB2b3RlIGRhdGEgY29udGFpbmluZyB2b3RlIGFkZHJlc3MgYW5kIHZvdGUgY291bnRcbiAgICogQHJldHVybnMgdGhlIGJ1aWxkZXIgd2l0aCB0aGUgbmV3IHBhcmFtZXRlciBzZXRcbiAgICovXG4gIHNldFZvdGVzKHZvdGVzOiBWb3RlV2l0bmVzc0RhdGFbXSk6IHRoaXMge1xuICAgIHRoaXMudmFsaWRhdGVWb3Rlcyh2b3Rlcyk7XG4gICAgdGhpcy5fdm90ZXMgPSB2b3Rlcy5tYXAoKHZvdGUpID0+ICh7XG4gICAgICAuLi52b3RlLFxuICAgICAgdm90ZV9hZGRyZXNzOiBnZXRIZXhBZGRyZXNzRnJvbUJhc2U1OEFkZHJlc3Modm90ZS52b3RlX2FkZHJlc3MpLFxuICAgIH0pKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBleHRlbmRWYWxpZFRvKGV4dGVuc2lvbk1zOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy50cmFuc2FjdGlvbi5zaWduYXR1cmUgJiYgdGhpcy50cmFuc2FjdGlvbi5zaWduYXR1cmUubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEV4dGVuZFRyYW5zYWN0aW9uRXJyb3IoJ0Nhbm5vdCBleHRlbmQgYSBzaWduZWQgdHJhbnNhY3Rpb24nKTtcbiAgICB9XG5cbiAgICBpZiAoZXh0ZW5zaW9uTXMgPD0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdWYWx1ZSBjYW5ub3QgYmUgYmVsb3cgemVybycpO1xuICAgIH1cblxuICAgIGlmIChleHRlbnNpb25NcyA+IFRSQU5TQUNUSU9OX01BWF9FWFBJUkFUSU9OKSB7XG4gICAgICB0aHJvdyBuZXcgRXh0ZW5kVHJhbnNhY3Rpb25FcnJvcignVGhlIGV4cGlyYXRpb24gY2Fubm90IGJlIGV4dGVuZGVkIG1vcmUgdGhhbiBvbmUgZGF5Jyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2V4cGlyYXRpb24pIHtcbiAgICAgIHRoaXMuX2V4cGlyYXRpb24gPSB0aGlzLl9leHBpcmF0aW9uICsgZXh0ZW5zaW9uTXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlcmUgaXMgbm90IGV4cGlyYXRpb24gdG8gZXh0ZW5kJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgdGhlIHRyYW5zYWN0aW9uIGJ1aWxkZXIgZmllbGRzIHVzaW5nIHRoZSB0cmFuc2FjdGlvbiBkYXRhXG4gICAqXG4gICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25SZWNlaXB0IHwgc3RyaW5nfSByYXdUcmFuc2FjdGlvbiB0aGUgdHJhbnNhY3Rpb24gZGF0YSBpbiBhIHN0cmluZyBvciBKU09OIGZvcm1hdFxuICAgKiBAcmV0dXJucyB7Vm90ZVdpdG5lc3NUeEJ1aWxkZXJ9IHRoZSBidWlsZGVyIHdpdGggdGhlIHRyYW5zYWN0aW9uIGRhdGEgc2V0XG4gICAqL1xuICBpbml0QnVpbGRlcihyYXdUcmFuc2FjdGlvbjogVHJhbnNhY3Rpb25SZWNlaXB0IHwgc3RyaW5nKTogdGhpcyB7XG4gICAgdGhpcy50cmFuc2FjdGlvbiA9IHRoaXMuZnJvbUltcGxlbWVudGF0aW9uKHJhd1RyYW5zYWN0aW9uKTtcbiAgICB0aGlzLnRyYW5zYWN0aW9uLnNldFRyYW5zYWN0aW9uVHlwZSh0aGlzLnRyYW5zYWN0aW9uVHlwZSk7XG4gICAgdGhpcy52YWxpZGF0ZVJhd1RyYW5zYWN0aW9uKHJhd1RyYW5zYWN0aW9uKTtcbiAgICBjb25zdCB0eCA9IHRoaXMuZnJvbUltcGxlbWVudGF0aW9uKHJhd1RyYW5zYWN0aW9uKTtcbiAgICB0aGlzLnRyYW5zYWN0aW9uID0gdHg7XG4gICAgdGhpcy5fc2lnbmluZ0tleXMgPSBbXTtcbiAgICBjb25zdCByYXdEYXRhID0gdHgudG9Kc29uKCkucmF3X2RhdGE7XG4gICAgdGhpcy5fcmVmQmxvY2tCeXRlcyA9IHJhd0RhdGEucmVmX2Jsb2NrX2J5dGVzO1xuICAgIHRoaXMuX3JlZkJsb2NrSGFzaCA9IHJhd0RhdGEucmVmX2Jsb2NrX2hhc2g7XG4gICAgdGhpcy5fZXhwaXJhdGlvbiA9IHJhd0RhdGEuZXhwaXJhdGlvbjtcbiAgICB0aGlzLl90aW1lc3RhbXAgPSByYXdEYXRhLnRpbWVzdGFtcDtcbiAgICB0aGlzLnRyYW5zYWN0aW9uLnNldFRyYW5zYWN0aW9uVHlwZShUcmFuc2FjdGlvblR5cGUuU3Rha2luZ1ZvdGUpO1xuICAgIGNvbnN0IGNvbnRyYWN0Q2FsbCA9IHJhd0RhdGEuY29udHJhY3RbMF0gYXMgVm90ZVdpdG5lc3NDb250cmFjdDtcbiAgICB0aGlzLmluaXRWb3RlV2l0bmVzc0NvbnRyYWN0Q2FsbChjb250cmFjdENhbGwpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgdGhlIHZvdGV3aXRuZXNzY29udHJhY3QgY2FsbCBzcGVjaWZpYyBkYXRhXG4gICAqXG4gICAqIEBwYXJhbSB7Vm90ZVdpdG5lc3NDb250cmFjdH0gY29udHJhY3RDYWxsIG9iamVjdCB3aXRoIHRyYW5zZmVyIGRhdGFcbiAgICovXG4gIHByb3RlY3RlZCBpbml0Vm90ZVdpdG5lc3NDb250cmFjdENhbGwodm90ZVdpdG5lc3NDb250cmFjdENhbGw6IFZvdGVXaXRuZXNzQ29udHJhY3QpOiB2b2lkIHtcbiAgICBjb25zdCB7IHZvdGVzLCBvd25lcl9hZGRyZXNzIH0gPSB2b3RlV2l0bmVzc0NvbnRyYWN0Q2FsbC5wYXJhbWV0ZXIudmFsdWU7XG4gICAgaWYgKG93bmVyX2FkZHJlc3MpIHtcbiAgICAgIHRoaXMuc291cmNlKHsgYWRkcmVzczogZ2V0QmFzZTU4QWRkcmVzc0Zyb21IZXgob3duZXJfYWRkcmVzcykgfSk7XG4gICAgfVxuXG4gICAgaWYgKHZvdGVzKSB7XG4gICAgICB0aGlzLnNldFZvdGVzKFxuICAgICAgICB2b3Rlcy5tYXAoKHZvdGUpID0+ICh7XG4gICAgICAgICAgLi4udm90ZSxcbiAgICAgICAgICB2b3RlX2FkZHJlc3M6IGdldEJhc2U1OEFkZHJlc3NGcm9tSGV4KHZvdGUudm90ZV9hZGRyZXNzKSxcbiAgICAgICAgfSkpXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBidWlsZEltcGxlbWVudGF0aW9uKCk6IFByb21pc2U8VHJhbnNhY3Rpb24+IHtcbiAgICB0aGlzLmNyZWF0ZVZvdGVXaXRuZXNzQ29udHJhY3RUcmFuc2FjdGlvbigpO1xuICAgIC8qKiBAaW5oZXJpdGRvY2NyZWF0ZVRyYW5zYWN0aW9uICovXG4gICAgLy8gVGhpcyBtZXRob2QgbXVzdCBiZSBleHRlbmRlZCBvbiBjaGlsZCBjbGFzc2VzXG4gICAgaWYgKHRoaXMuX3NpZ25pbmdLZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuYXBwbHlTaWduYXR1cmVzKCk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnRyYW5zYWN0aW9uLmlkKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdBIHZhbGlkIHRyYW5zYWN0aW9uIG11c3QgaGF2ZSBhbiBpZCcpO1xuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMudHJhbnNhY3Rpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgdGhlIHZvdGUgd2l0bmVzcyB0cmFuc2FjdGlvblxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVWb3RlV2l0bmVzc0NvbnRyYWN0VHJhbnNhY3Rpb24oKTogdm9pZCB7XG4gICAgY29uc3QgcmF3RGF0YUhleCA9IHRoaXMuZ2V0Vm90ZVdpdG5lc3NSYXdEYXRhSGV4KCk7XG4gICAgY29uc3QgcmF3RGF0YSA9IGRlY29kZVRyYW5zYWN0aW9uKHJhd0RhdGFIZXgpO1xuICAgIGNvbnN0IGNvbnRyYWN0ID0gcmF3RGF0YS5jb250cmFjdFswXSBhcyBWb3RlV2l0bmVzc0NvbnRyYWN0O1xuICAgIGNvbnN0IGNvbnRyYWN0UGFyYW1ldGVyID0gY29udHJhY3QucGFyYW1ldGVyO1xuICAgIGNvbnRyYWN0UGFyYW1ldGVyLnZhbHVlLm93bmVyX2FkZHJlc3MgPSB0aGlzLl9vd25lckFkZHJlc3MudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICBjb250cmFjdFBhcmFtZXRlci52YWx1ZS52b3RlcyA9IHRoaXMuX3ZvdGVzO1xuICAgIGNvbnRyYWN0UGFyYW1ldGVyLnR5cGVfdXJsID0gJ3R5cGUuZ29vZ2xlYXBpcy5jb20vcHJvdG9jb2wuVm90ZVdpdG5lc3NDb250cmFjdCc7XG4gICAgY29udHJhY3QudHlwZSA9ICdWb3RlV2l0bmVzc0NvbnRyYWN0JztcbiAgICBjb25zdCBoZXhCdWZmZXIgPSBCdWZmZXIuZnJvbShyYXdEYXRhSGV4LCAnaGV4Jyk7XG4gICAgY29uc3QgaWQgPSBjcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUoaGV4QnVmZmVyKS5kaWdlc3QoJ2hleCcpO1xuICAgIGNvbnN0IHR4UmVjaXA6IFRyYW5zYWN0aW9uUmVjZWlwdCA9IHtcbiAgICAgIHJhd19kYXRhOiByYXdEYXRhLFxuICAgICAgcmF3X2RhdGFfaGV4OiByYXdEYXRhSGV4LFxuICAgICAgdHhJRDogaWQsXG4gICAgICBzaWduYXR1cmU6IHRoaXMudHJhbnNhY3Rpb24uc2lnbmF0dXJlLFxuICAgIH07XG4gICAgdGhpcy50cmFuc2FjdGlvbiA9IG5ldyBUcmFuc2FjdGlvbih0aGlzLl9jb2luQ29uZmlnLCB0eFJlY2lwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXIgbWV0aG9kIHRvIGdldCB0aGUgdm90ZSB3aXRuZXNzIHRyYW5zYWN0aW9uIHJhdyBkYXRhIGhleFxuICAgKiBAcmV0dXJucyB2b3RlIHdpdG5lc3MgdHJhbnNhY3Rpb24gcmF3IGRhdGEgaGV4XG4gICAqL1xuICBwcml2YXRlIGdldFZvdGVXaXRuZXNzUmF3RGF0YUhleCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHZvdGVBcnJheSA9IHRoaXMuX3ZvdGVzLm1hcCgodm90ZSkgPT4ge1xuICAgICAgY29uc3Qgdm90ZU9iamVjdCA9IHByb3RvY29sLlZvdGUuZnJvbU9iamVjdCh7XG4gICAgICAgIHZvdGVBZGRyZXNzOiBnZXRCeXRlQXJyYXlGcm9tSGV4QWRkcmVzcyh2b3RlLnZvdGVfYWRkcmVzcyksXG4gICAgICAgIHZvdGVDb3VudDogdm90ZS52b3RlX2NvdW50LFxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBwcm90b2NvbC5Wb3RlLmNyZWF0ZSh2b3RlT2JqZWN0KTtcbiAgICB9KTtcbiAgICBjb25zdCByYXdDb250cmFjdCA9IHtcbiAgICAgIG93bmVyQWRkcmVzczogZ2V0Qnl0ZUFycmF5RnJvbUhleEFkZHJlc3ModGhpcy5fb3duZXJBZGRyZXNzKSxcbiAgICAgIHZvdGVzOiB2b3RlQXJyYXksXG4gICAgfTtcblxuICAgIGNvbnN0IHZvdGVXaXRuZXNzQ29udHJhY3QgPSBwcm90b2NvbC5Wb3RlV2l0bmVzc0NvbnRyYWN0LmZyb21PYmplY3QocmF3Q29udHJhY3QpO1xuICAgIGNvbnN0IHZvdGVXaXRuZXNzQ29udHJhY3RCeXRlcyA9IHByb3RvY29sLlZvdGVXaXRuZXNzQ29udHJhY3QuZW5jb2RlKHZvdGVXaXRuZXNzQ29udHJhY3QpLmZpbmlzaCgpO1xuICAgIGNvbnN0IHR4Q29udHJhY3QgPSB7XG4gICAgICB0eXBlOiBDb250cmFjdFR5cGUuVm90ZVdpdG5lc3NDb250cmFjdCxcbiAgICAgIHBhcmFtZXRlcjoge1xuICAgICAgICB2YWx1ZTogdm90ZVdpdG5lc3NDb250cmFjdEJ5dGVzLFxuICAgICAgICB0eXBlX3VybDogJ3R5cGUuZ29vZ2xlYXBpcy5jb20vcHJvdG9jb2wuVm90ZVdpdG5lc3NDb250cmFjdCcsXG4gICAgICB9LFxuICAgIH07XG4gICAgY29uc3QgcmF3ID0ge1xuICAgICAgcmVmQmxvY2tCeXRlczogQnVmZmVyLmZyb20odGhpcy5fcmVmQmxvY2tCeXRlcywgJ2hleCcpLFxuICAgICAgcmVmQmxvY2tIYXNoOiBCdWZmZXIuZnJvbSh0aGlzLl9yZWZCbG9ja0hhc2gsICdoZXgnKSxcbiAgICAgIGV4cGlyYXRpb246IHRoaXMuX2V4cGlyYXRpb24gfHwgRGF0ZS5ub3coKSArIFRSQU5TQUNUSU9OX0RFRkFVTFRfRVhQSVJBVElPTixcbiAgICAgIHRpbWVzdGFtcDogdGhpcy5fdGltZXN0YW1wIHx8IERhdGUubm93KCksXG4gICAgICBjb250cmFjdDogW3R4Q29udHJhY3RdLFxuICAgIH07XG4gICAgY29uc3QgcmF3VHggPSBwcm90b2NvbC5UcmFuc2FjdGlvbi5yYXcuY3JlYXRlKHJhdyk7XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKHByb3RvY29sLlRyYW5zYWN0aW9uLnJhdy5lbmNvZGUocmF3VHgpLmZpbmlzaCgpKS50b1N0cmluZygnaGV4Jyk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgcHJvdGVjdGVkIHNpZ25JbXBsZW1lbnRhdGlvbihrZXk6IEJhc2VLZXkpOiBUcmFuc2FjdGlvbiB7XG4gICAgaWYgKHRoaXMuX3NpZ25pbmdLZXlzLnNvbWUoKHNpZ25pbmdLZXkpID0+IHNpZ25pbmdLZXkua2V5ID09PSBrZXkua2V5KSkge1xuICAgICAgdGhyb3cgbmV3IFNpZ25pbmdFcnJvcignRHVwbGljYXRlZCBrZXknKTtcbiAgICB9XG4gICAgdGhpcy5fc2lnbmluZ0tleXMucHVzaChrZXkpO1xuXG4gICAgLy8gV2Uga2VlcCB0aGlzIHJldHVybiBmb3IgY29tcGF0aWJpbGl0eSBidXQgaXMgbm90IG1lYW50IHRvIGJlIHVzZVxuICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9uO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseVNpZ25hdHVyZXMoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnRyYW5zYWN0aW9uLmlucHV0cykge1xuICAgICAgdGhyb3cgbmV3IFNpZ25pbmdFcnJvcignVHJhbnNhY3Rpb24gaGFzIG5vIGlucHV0cycpO1xuICAgIH1cbiAgICB0aGlzLl9zaWduaW5nS2V5cy5mb3JFYWNoKChrZXkpID0+IHRoaXMuYXBwbHlTaWduYXR1cmUoa2V5KSk7XG4gIH1cblxuICB2YWxpZGF0ZVRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbik6IHZvaWQge1xuICAgIHRoaXMudmFsaWRhdGVWb3RlVHJhbnNhY3Rpb25GaWVsZHMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhlIHZvdGVzIGFycmF5XG4gICAqXG4gICAqIEBwYXJhbSB7Vm90ZVdpdG5lc3NEYXRhW119IHZvdGVzIC0gVGhlIHZvdGVzIGFycmF5IHRvIHZhbGlkYXRlXG4gICAqIEB0aHJvd3Mge0Vycm9yfSB3aGVuIHRoZSB2b3RlcyBhcnJheSBpcyBpbnZhbGlkXG4gICAqL1xuICB2YWxpZGF0ZVZvdGVzKHZvdGVzOiBWb3RlV2l0bmVzc0RhdGFbXSk6IHZvaWQge1xuICAgIGlmICghdm90ZXMgfHwgdm90ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1ZvdGVzIGFycmF5IGlzIG1pc3Npbmcgb3IgZW1wdHknKTtcbiAgICB9XG5cbiAgICB2b3Rlcy5mb3JFYWNoKCh2b3RlKSA9PiB7XG4gICAgICBpZiAoIXZvdGUudm90ZV9hZGRyZXNzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVm90ZSBhZGRyZXNzIGlzIG1pc3NpbmcnKTtcbiAgICAgIH1cbiAgICAgIHRoaXMudmFsaWRhdGVBZGRyZXNzKHsgYWRkcmVzczogdm90ZS52b3RlX2FkZHJlc3MgfSk7XG5cbiAgICAgIGlmICh2b3RlLnZvdGVfY291bnQgPT0gbnVsbCB8fCB2b3RlLnZvdGVfY291bnQgPCAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB2b3RlIGNvdW50Jyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIGlmIHRoZSB0cmFuc2FjdGlvbiBpcyBhIHZhbGlkIHZvdGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtUcmFuc2FjdGlvblJlY2VpcHR9IHRyYW5zYWN0aW9uIC0gVGhlIHRyYW5zYWN0aW9uIHRvIHZhbGlkYXRlXG4gICAqIEB0aHJvd3Mge0ludmFsaWRUcmFuc2FjdGlvbkVycm9yfSB3aGVuIHRoZSB0cmFuc2FjdGlvbiBpcyBpbnZhbGlkXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlVm90ZVRyYW5zYWN0aW9uRmllbGRzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fb3duZXJBZGRyZXNzKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdNaXNzaW5nIHBhcmFtZXRlcjogc291cmNlJyk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl9yZWZCbG9ja0J5dGVzIHx8ICF0aGlzLl9yZWZCbG9ja0hhc2gpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ01pc3NpbmcgYmxvY2sgcmVmZXJlbmNlIGluZm9ybWF0aW9uJyk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgdm90ZXNcbiAgICBpZiAoIXRoaXMuX3ZvdGVzIHx8IHRoaXMuX3ZvdGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignTWlzc2luZyBvciBlbXB0eSB2b3RlcyBhcnJheScpO1xuICAgIH1cbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { TransactionType, BaseKey } from '@bitgo-beta/sdk-core';
|
|
2
|
+
import { BaseCoin as CoinConfig } from '@bitgo-beta/statics';
|
|
3
|
+
import { TransactionBuilder } from './transactionBuilder';
|
|
4
|
+
import { Transaction } from './transaction';
|
|
5
|
+
import { TransactionReceipt, WithdrawBalanceContract } from './iface';
|
|
6
|
+
export declare class WithdrawBalanceTxBuilder extends TransactionBuilder {
|
|
7
|
+
protected _signingKeys: BaseKey[];
|
|
8
|
+
constructor(_coinConfig: Readonly<CoinConfig>);
|
|
9
|
+
/** @inheritdoc */
|
|
10
|
+
protected get transactionType(): TransactionType;
|
|
11
|
+
/** @inheritdoc */
|
|
12
|
+
extendValidTo(extensionMs: number): void;
|
|
13
|
+
initBuilder(rawTransaction: TransactionReceipt | string): this;
|
|
14
|
+
/**
|
|
15
|
+
* Initialize the withdraw balance contract call specific data
|
|
16
|
+
*
|
|
17
|
+
* @param {WithdrawBalanceContract} withdrawBalanceContractCall object with freeze txn data
|
|
18
|
+
*/
|
|
19
|
+
protected initWithdrawBalanceContractCall(withdrawBalanceContractCall: WithdrawBalanceContract): void;
|
|
20
|
+
protected buildImplementation(): Promise<Transaction>;
|
|
21
|
+
/**
|
|
22
|
+
* Helper method to create the withdraw balance transaction
|
|
23
|
+
*/
|
|
24
|
+
private createWithdrawBalanceTransaction;
|
|
25
|
+
/**
|
|
26
|
+
* Helper method to get the withdraw expire unfreeze transaction raw data hex
|
|
27
|
+
*
|
|
28
|
+
* @returns {string} the freeze balance transaction raw data hex
|
|
29
|
+
*/
|
|
30
|
+
private getWithdrawBalanceRawDataHex;
|
|
31
|
+
/** @inheritdoc */
|
|
32
|
+
protected signImplementation(key: BaseKey): Transaction;
|
|
33
|
+
private applySignatures;
|
|
34
|
+
/**
|
|
35
|
+
* Validates the transaction
|
|
36
|
+
*
|
|
37
|
+
* @param {Transaction} transaction - The transaction to validate
|
|
38
|
+
* @throws {BuildTransactionError} when the transaction is invalid
|
|
39
|
+
*/
|
|
40
|
+
validateTransaction(transaction: Transaction): void;
|
|
41
|
+
/**
|
|
42
|
+
* Validates if the transaction is a valid withdraw balance transaction
|
|
43
|
+
*
|
|
44
|
+
* @param {TransactionReceipt} transaction - The transaction to validate
|
|
45
|
+
* @throws {BuildTransactionError} when the transaction is invalid
|
|
46
|
+
*/
|
|
47
|
+
private validateWithdrawBalanceTransactionFields;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=withdrawBuilder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"withdrawBuilder.d.ts","sourceRoot":"","sources":["../../../src/lib/withdrawBuilder.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,OAAO,EAA+D,MAAM,sBAAsB,CAAC;AAC7H,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAC;AAYtE,qBAAa,wBAAyB,SAAQ,kBAAkB;IAC9D,SAAS,CAAC,YAAY,EAAE,OAAO,EAAE,CAAC;gBAEtB,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC;IAM7C,kBAAkB;IAClB,SAAS,KAAK,eAAe,IAAI,eAAe,CAE/C;IAED,kBAAkB;IAClB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAoBxC,WAAW,CAAC,cAAc,EAAE,kBAAkB,GAAG,MAAM,GAAG,IAAI;IAiB9D;;;;OAIG;IACH,SAAS,CAAC,+BAA+B,CAAC,2BAA2B,EAAE,uBAAuB,GAAG,IAAI;cAOrF,mBAAmB,IAAI,OAAO,CAAC,WAAW,CAAC;IAc3D;;OAEG;IACH,OAAO,CAAC,gCAAgC;IAmBxC;;;;OAIG;IACH,OAAO,CAAC,4BAA4B;IAwBpC,kBAAkB;IAClB,SAAS,CAAC,kBAAkB,CAAC,GAAG,EAAE,OAAO,GAAG,WAAW;IAUvD,OAAO,CAAC,eAAe;IAQvB;;;;;OAKG;IACH,mBAAmB,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI;IAInD;;;;;OAKG;IACH,OAAO,CAAC,wCAAwC;CASjD"}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WithdrawBalanceTxBuilder = void 0;
|
|
4
|
+
const crypto_1 = require("crypto");
|
|
5
|
+
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
6
|
+
const transactionBuilder_1 = require("./transactionBuilder");
|
|
7
|
+
const transaction_1 = require("./transaction");
|
|
8
|
+
const tron_1 = require("../../resources/protobuf/tron");
|
|
9
|
+
const utils_1 = require("./utils");
|
|
10
|
+
var ContractType = tron_1.protocol.Transaction.Contract.ContractType;
|
|
11
|
+
class WithdrawBalanceTxBuilder extends transactionBuilder_1.TransactionBuilder {
|
|
12
|
+
constructor(_coinConfig) {
|
|
13
|
+
super(_coinConfig);
|
|
14
|
+
this._signingKeys = [];
|
|
15
|
+
this.transaction = new transaction_1.Transaction(_coinConfig);
|
|
16
|
+
}
|
|
17
|
+
/** @inheritdoc */
|
|
18
|
+
get transactionType() {
|
|
19
|
+
return sdk_core_1.TransactionType.StakingClaim;
|
|
20
|
+
}
|
|
21
|
+
/** @inheritdoc */
|
|
22
|
+
extendValidTo(extensionMs) {
|
|
23
|
+
if (this.transaction.signature && this.transaction.signature.length > 0) {
|
|
24
|
+
throw new sdk_core_1.ExtendTransactionError('Cannot extend a signed transaction');
|
|
25
|
+
}
|
|
26
|
+
if (extensionMs <= 0) {
|
|
27
|
+
throw new Error('Value cannot be below zero');
|
|
28
|
+
}
|
|
29
|
+
if (extensionMs > utils_1.TRANSACTION_MAX_EXPIRATION) {
|
|
30
|
+
throw new sdk_core_1.ExtendTransactionError('The expiration cannot be extended more than one day');
|
|
31
|
+
}
|
|
32
|
+
if (this._expiration) {
|
|
33
|
+
this._expiration = this._expiration + extensionMs;
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
throw new Error('There is not expiration to extend');
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
initBuilder(rawTransaction) {
|
|
40
|
+
this.transaction = this.fromImplementation(rawTransaction);
|
|
41
|
+
this.transaction.setTransactionType(this.transactionType);
|
|
42
|
+
this.validateRawTransaction(rawTransaction);
|
|
43
|
+
const tx = this.fromImplementation(rawTransaction);
|
|
44
|
+
this.transaction = tx;
|
|
45
|
+
this._signingKeys = [];
|
|
46
|
+
const rawData = tx.toJson().raw_data;
|
|
47
|
+
this._refBlockBytes = rawData.ref_block_bytes;
|
|
48
|
+
this._refBlockHash = rawData.ref_block_hash;
|
|
49
|
+
this._expiration = rawData.expiration;
|
|
50
|
+
this._timestamp = rawData.timestamp;
|
|
51
|
+
const contractCall = rawData.contract[0];
|
|
52
|
+
this.initWithdrawBalanceContractCall(contractCall);
|
|
53
|
+
return this;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Initialize the withdraw balance contract call specific data
|
|
57
|
+
*
|
|
58
|
+
* @param {WithdrawBalanceContract} withdrawBalanceContractCall object with freeze txn data
|
|
59
|
+
*/
|
|
60
|
+
initWithdrawBalanceContractCall(withdrawBalanceContractCall) {
|
|
61
|
+
const { owner_address } = withdrawBalanceContractCall.parameter.value;
|
|
62
|
+
if (owner_address) {
|
|
63
|
+
this.source({ address: (0, utils_1.getBase58AddressFromHex)(owner_address) });
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
async buildImplementation() {
|
|
67
|
+
this.createWithdrawBalanceTransaction();
|
|
68
|
+
/** @inheritdoccreateTransaction */
|
|
69
|
+
// This method must be extended on child classes
|
|
70
|
+
if (this._signingKeys.length > 0) {
|
|
71
|
+
this.applySignatures();
|
|
72
|
+
}
|
|
73
|
+
if (!this.transaction.id) {
|
|
74
|
+
throw new sdk_core_1.BuildTransactionError('A valid transaction must have an id');
|
|
75
|
+
}
|
|
76
|
+
return Promise.resolve(this.transaction);
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Helper method to create the withdraw balance transaction
|
|
80
|
+
*/
|
|
81
|
+
createWithdrawBalanceTransaction() {
|
|
82
|
+
const rawDataHex = this.getWithdrawBalanceRawDataHex();
|
|
83
|
+
const rawData = (0, utils_1.decodeTransaction)(rawDataHex);
|
|
84
|
+
const contract = rawData.contract[0];
|
|
85
|
+
const contractParameter = contract.parameter;
|
|
86
|
+
contractParameter.value.owner_address = this._ownerAddress.toLocaleLowerCase();
|
|
87
|
+
contractParameter.type_url = 'type.googleapis.com/protocol.WithdrawBalanceContract';
|
|
88
|
+
contract.type = 'WithdrawBalanceContract';
|
|
89
|
+
const hexBuffer = Buffer.from(rawDataHex, 'hex');
|
|
90
|
+
const id = (0, crypto_1.createHash)('sha256').update(hexBuffer).digest('hex');
|
|
91
|
+
const txRecip = {
|
|
92
|
+
raw_data: rawData,
|
|
93
|
+
raw_data_hex: rawDataHex,
|
|
94
|
+
txID: id,
|
|
95
|
+
signature: this.transaction.signature,
|
|
96
|
+
};
|
|
97
|
+
this.transaction = new transaction_1.Transaction(this._coinConfig, txRecip);
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Helper method to get the withdraw expire unfreeze transaction raw data hex
|
|
101
|
+
*
|
|
102
|
+
* @returns {string} the freeze balance transaction raw data hex
|
|
103
|
+
*/
|
|
104
|
+
getWithdrawBalanceRawDataHex() {
|
|
105
|
+
const rawContract = {
|
|
106
|
+
ownerAddress: (0, utils_1.getByteArrayFromHexAddress)(this._ownerAddress),
|
|
107
|
+
};
|
|
108
|
+
const withdrawBalanceContract = tron_1.protocol.WithdrawBalanceContract.fromObject(rawContract);
|
|
109
|
+
const withdrawBalanceContractBytes = tron_1.protocol.WithdrawBalanceContract.encode(withdrawBalanceContract).finish();
|
|
110
|
+
const txContract = {
|
|
111
|
+
type: ContractType.WithdrawBalanceContract,
|
|
112
|
+
parameter: {
|
|
113
|
+
value: withdrawBalanceContractBytes,
|
|
114
|
+
type_url: 'type.googleapis.com/protocol.WithdrawBalanceContract',
|
|
115
|
+
},
|
|
116
|
+
};
|
|
117
|
+
const raw = {
|
|
118
|
+
refBlockBytes: Buffer.from(this._refBlockBytes, 'hex'),
|
|
119
|
+
refBlockHash: Buffer.from(this._refBlockHash, 'hex'),
|
|
120
|
+
expiration: this._expiration || Date.now() + utils_1.TRANSACTION_DEFAULT_EXPIRATION,
|
|
121
|
+
timestamp: this._timestamp || Date.now(),
|
|
122
|
+
contract: [txContract],
|
|
123
|
+
};
|
|
124
|
+
const rawTx = tron_1.protocol.Transaction.raw.create(raw);
|
|
125
|
+
return Buffer.from(tron_1.protocol.Transaction.raw.encode(rawTx).finish()).toString('hex');
|
|
126
|
+
}
|
|
127
|
+
/** @inheritdoc */
|
|
128
|
+
signImplementation(key) {
|
|
129
|
+
if (this._signingKeys.some((signingKey) => signingKey.key === key.key)) {
|
|
130
|
+
throw new sdk_core_1.SigningError('Duplicated key');
|
|
131
|
+
}
|
|
132
|
+
this._signingKeys.push(key);
|
|
133
|
+
// We keep this return for compatibility but is not meant to be use
|
|
134
|
+
return this.transaction;
|
|
135
|
+
}
|
|
136
|
+
applySignatures() {
|
|
137
|
+
if (!this.transaction.inputs) {
|
|
138
|
+
throw new sdk_core_1.SigningError('Transaction has no inputs');
|
|
139
|
+
}
|
|
140
|
+
this._signingKeys.forEach((key) => this.applySignature(key));
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Validates the transaction
|
|
144
|
+
*
|
|
145
|
+
* @param {Transaction} transaction - The transaction to validate
|
|
146
|
+
* @throws {BuildTransactionError} when the transaction is invalid
|
|
147
|
+
*/
|
|
148
|
+
validateTransaction(transaction) {
|
|
149
|
+
this.validateWithdrawBalanceTransactionFields();
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Validates if the transaction is a valid withdraw balance transaction
|
|
153
|
+
*
|
|
154
|
+
* @param {TransactionReceipt} transaction - The transaction to validate
|
|
155
|
+
* @throws {BuildTransactionError} when the transaction is invalid
|
|
156
|
+
*/
|
|
157
|
+
validateWithdrawBalanceTransactionFields() {
|
|
158
|
+
if (!this._ownerAddress) {
|
|
159
|
+
throw new sdk_core_1.BuildTransactionError('Missing parameter: source');
|
|
160
|
+
}
|
|
161
|
+
if (!this._refBlockBytes || !this._refBlockHash) {
|
|
162
|
+
throw new sdk_core_1.BuildTransactionError('Missing block reference information');
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
exports.WithdrawBalanceTxBuilder = WithdrawBalanceTxBuilder;
|
|
167
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aGRyYXdCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi93aXRoZHJhd0J1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbUNBQW9DO0FBQ3BDLG1EQUE2SDtBQUU3SCw2REFBMEQ7QUFDMUQsK0NBQTRDO0FBRTVDLHdEQUF5RDtBQUN6RCxtQ0FNaUI7QUFFakIsSUFBTyxZQUFZLEdBQUcsZUFBUSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDO0FBRWpFLE1BQWEsd0JBQXlCLFNBQVEsdUNBQWtCO0lBRzlELFlBQVksV0FBaUM7UUFDM0MsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ25CLElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSx5QkFBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsSUFBYyxlQUFlO1FBQzNCLE9BQU8sMEJBQWUsQ0FBQyxZQUFZLENBQUM7SUFDdEMsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixhQUFhLENBQUMsV0FBbUI7UUFDL0IsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDeEUsTUFBTSxJQUFJLGlDQUFzQixDQUFDLG9DQUFvQyxDQUFDLENBQUM7UUFDekUsQ0FBQztRQUVELElBQUksV0FBVyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3JCLE1BQU0sSUFBSSxLQUFLLENBQUMsNEJBQTRCLENBQUMsQ0FBQztRQUNoRCxDQUFDO1FBRUQsSUFBSSxXQUFXLEdBQUcsa0NBQTBCLEVBQUUsQ0FBQztZQUM3QyxNQUFNLElBQUksaUNBQXNCLENBQUMscURBQXFELENBQUMsQ0FBQztRQUMxRixDQUFDO1FBRUQsSUFB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LENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsbUJBQW1CLENBQUMsV0FBd0I7UUFDMUMsSUFBSSxDQUFDLHdDQUF3QyxFQUFFLENBQUM7SUFDbEQsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssd0NBQXdDO1FBQzlDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDeEIsTUFBTSxJQUFJLGdDQUFxQixDQUFDLDJCQUEyQixDQUFDLENBQUM7UUFDL0QsQ0FBQztRQUVELElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ2hELE1BQU0sSUFBSSxnQ0FBcUIsQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDO1FBQ3pFLENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUE3S0QsNERBNktDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvblR5cGUsIEJhc2VLZXksIEV4dGVuZFRyYW5zYWN0aW9uRXJyb3IsIEJ1aWxkVHJhbnNhY3Rpb25FcnJvciwgU2lnbmluZ0Vycm9yIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgQmFzZUNvaW4gYXMgQ29pbkNvbmZpZyB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25CdWlsZGVyIH0gZnJvbSAnLi90cmFuc2FjdGlvbkJ1aWxkZXInO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb24gfSBmcm9tICcuL3RyYW5zYWN0aW9uJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uUmVjZWlwdCwgV2l0aGRyYXdCYWxhbmNlQ29udHJhY3QgfSBmcm9tICcuL2lmYWNlJztcbmltcG9ydCB7IHByb3RvY29sIH0gZnJvbSAnLi4vLi4vcmVzb3VyY2VzL3Byb3RvYnVmL3Ryb24nO1xuaW1wb3J0IHtcbiAgZGVjb2RlVHJhbnNhY3Rpb24sXG4gIGdldEJ5dGVBcnJheUZyb21IZXhBZGRyZXNzLFxuICBnZXRCYXNlNThBZGRyZXNzRnJvbUhleCxcbiAgVFJBTlNBQ1RJT05fTUFYX0VYUElSQVRJT04sXG4gIFRSQU5TQUNUSU9OX0RFRkFVTFRfRVhQSVJBVElPTixcbn0gZnJvbSAnLi91dGlscyc7XG5cbmltcG9ydCBDb250cmFjdFR5cGUgPSBwcm90b2NvbC5UcmFuc2FjdGlvbi5Db250cmFjdC5Db250cmFjdFR5cGU7XG5cbmV4cG9ydCBjbGFzcyBXaXRoZHJhd0JhbGFuY2VUeEJ1aWxkZXIgZXh0ZW5kcyBUcmFuc2FjdGlvbkJ1aWxkZXIge1xuICBwcm90ZWN0ZWQgX3NpZ25pbmdLZXlzOiBCYXNlS2V5W107XG5cbiAgY29uc3RydWN0b3IoX2NvaW5Db25maWc6IFJlYWRvbmx5PENvaW5Db25maWc+KSB7XG4gICAgc3VwZXIoX2NvaW5Db25maWcpO1xuICAgIHRoaXMuX3NpZ25pbmdLZXlzID0gW107XG4gICAgdGhpcy50cmFuc2FjdGlvbiA9IG5ldyBUcmFuc2FjdGlvbihfY29pbkNvbmZpZyk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgcHJvdGVjdGVkIGdldCB0cmFuc2FjdGlvblR5cGUoKTogVHJhbnNhY3Rpb25UeXBlIHtcbiAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdDbGFpbTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBleHRlbmRWYWxpZFRvKGV4dGVuc2lvbk1zOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy50cmFuc2FjdGlvbi5zaWduYXR1cmUgJiYgdGhpcy50cmFuc2FjdGlvbi5zaWduYXR1cmUubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEV4dGVuZFRyYW5zYWN0aW9uRXJyb3IoJ0Nhbm5vdCBleHRlbmQgYSBzaWduZWQgdHJhbnNhY3Rpb24nKTtcbiAgICB9XG5cbiAgICBpZiAoZXh0ZW5zaW9uTXMgPD0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdWYWx1ZSBjYW5ub3QgYmUgYmVsb3cgemVybycpO1xuICAgIH1cblxuICAgIGlmIChleHRlbnNpb25NcyA+IFRSQU5TQUNUSU9OX01BWF9FWFBJUkFUSU9OKSB7XG4gICAgICB0aHJvdyBuZXcgRXh0ZW5kVHJhbnNhY3Rpb25FcnJvcignVGhlIGV4cGlyYXRpb24gY2Fubm90IGJlIGV4dGVuZGVkIG1vcmUgdGhhbiBvbmUgZGF5Jyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2V4cGlyYXRpb24pIHtcbiAgICAgIHRoaXMuX2V4cGlyYXRpb24gPSB0aGlzLl9leHBpcmF0aW9uICsgZXh0ZW5zaW9uTXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlcmUgaXMgbm90IGV4cGlyYXRpb24gdG8gZXh0ZW5kJyk7XG4gICAgfVxuICB9XG5cbiAgaW5pdEJ1aWxkZXIocmF3VHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uUmVjZWlwdCB8IHN0cmluZyk6IHRoaXMge1xuICAgIHRoaXMudHJhbnNhY3Rpb24gPSB0aGlzLmZyb21JbXBsZW1lbnRhdGlvbihyYXdUcmFuc2FjdGlvbik7XG4gICAgdGhpcy50cmFuc2FjdGlvbi5zZXRUcmFuc2FjdGlvblR5cGUodGhpcy50cmFuc2FjdGlvblR5cGUpO1xuICAgIHRoaXMudmFsaWRhdGVSYXdUcmFuc2FjdGlvbihyYXdUcmFuc2FjdGlvbik7XG4gICAgY29uc3QgdHggPSB0aGlzLmZyb21JbXBsZW1lbnRhdGlvbihyYXdUcmFuc2FjdGlvbik7XG4gICAgdGhpcy50cmFuc2FjdGlvbiA9IHR4O1xuICAgIHRoaXMuX3NpZ25pbmdLZXlzID0gW107XG4gICAgY29uc3QgcmF3RGF0YSA9IHR4LnRvSnNvbigpLnJhd19kYXRhO1xuICAgIHRoaXMuX3JlZkJsb2NrQnl0ZXMgPSByYXdEYXRhLnJlZl9ibG9ja19ieXRlcztcbiAgICB0aGlzLl9yZWZCbG9ja0hhc2ggPSByYXdEYXRhLnJlZl9ibG9ja19oYXNoO1xuICAgIHRoaXMuX2V4cGlyYXRpb24gPSByYXdEYXRhLmV4cGlyYXRpb247XG4gICAgdGhpcy5fdGltZXN0YW1wID0gcmF3RGF0YS50aW1lc3RhbXA7XG4gICAgY29uc3QgY29udHJhY3RDYWxsID0gcmF3RGF0YS5jb250cmFjdFswXSBhcyBXaXRoZHJhd0JhbGFuY2VDb250cmFjdDtcbiAgICB0aGlzLmluaXRXaXRoZHJhd0JhbGFuY2VDb250cmFjdENhbGwoY29udHJhY3RDYWxsKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIHRoZSB3aXRoZHJhdyBiYWxhbmNlIGNvbnRyYWN0IGNhbGwgc3BlY2lmaWMgZGF0YVxuICAgKlxuICAgKiBAcGFyYW0ge1dpdGhkcmF3QmFsYW5jZUNvbnRyYWN0fSB3aXRoZHJhd0JhbGFuY2VDb250cmFjdENhbGwgb2JqZWN0IHdpdGggZnJlZXplIHR4biBkYXRhXG4gICAqL1xuICBwcm90ZWN0ZWQgaW5pdFdpdGhkcmF3QmFsYW5jZUNvbnRyYWN0Q2FsbCh3aXRoZHJhd0JhbGFuY2VDb250cmFjdENhbGw6IFdpdGhkcmF3QmFsYW5jZUNvbnRyYWN0KTogdm9pZCB7XG4gICAgY29uc3QgeyBvd25lcl9hZGRyZXNzIH0gPSB3aXRoZHJhd0JhbGFuY2VDb250cmFjdENhbGwucGFyYW1ldGVyLnZhbHVlO1xuICAgIGlmIChvd25lcl9hZGRyZXNzKSB7XG4gICAgICB0aGlzLnNvdXJjZSh7IGFkZHJlc3M6IGdldEJhc2U1OEFkZHJlc3NGcm9tSGV4KG93bmVyX2FkZHJlc3MpIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBidWlsZEltcGxlbWVudGF0aW9uKCk6IFByb21pc2U8VHJhbnNhY3Rpb24+IHtcbiAgICB0aGlzLmNyZWF0ZVdpdGhkcmF3QmFsYW5jZVRyYW5zYWN0aW9uKCk7XG4gICAgLyoqIEBpbmhlcml0ZG9jY3JlYXRlVHJhbnNhY3Rpb24gKi9cbiAgICAvLyBUaGlzIG1ldGhvZCBtdXN0IGJlIGV4dGVuZGVkIG9uIGNoaWxkIGNsYXNzZXNcbiAgICBpZiAodGhpcy5fc2lnbmluZ0tleXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5hcHBseVNpZ25hdHVyZXMoKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMudHJhbnNhY3Rpb24uaWQpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0EgdmFsaWQgdHJhbnNhY3Rpb24gbXVzdCBoYXZlIGFuIGlkJyk7XG4gICAgfVxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy50cmFuc2FjdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIG1ldGhvZCB0byBjcmVhdGUgdGhlIHdpdGhkcmF3IGJhbGFuY2UgdHJhbnNhY3Rpb25cbiAgICovXG4gIHByaXZhdGUgY3JlYXRlV2l0aGRyYXdCYWxhbmNlVHJhbnNhY3Rpb24oKTogdm9pZCB7XG4gICAgY29uc3QgcmF3RGF0YUhleCA9IHRoaXMuZ2V0V2l0aGRyYXdCYWxhbmNlUmF3RGF0YUhleCgpO1xuICAgIGNvbnN0IHJhd0RhdGEgPSBkZWNvZGVUcmFuc2FjdGlvbihyYXdEYXRhSGV4KTtcbiAgICBjb25zdCBjb250cmFjdCA9IHJhd0RhdGEuY29udHJhY3RbMF0gYXMgV2l0aGRyYXdCYWxhbmNlQ29udHJhY3Q7XG4gICAgY29uc3QgY29udHJhY3RQYXJhbWV0ZXIgPSBjb250cmFjdC5wYXJhbWV0ZXI7XG4gICAgY29udHJhY3RQYXJhbWV0ZXIudmFsdWUub3duZXJfYWRkcmVzcyA9IHRoaXMuX293bmVyQWRkcmVzcy50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgIGNvbnRyYWN0UGFyYW1ldGVyLnR5cGVfdXJsID0gJ3R5cGUuZ29vZ2xlYXBpcy5jb20vcHJvdG9jb2wuV2l0aGRyYXdCYWxhbmNlQ29udHJhY3QnO1xuICAgIGNvbnRyYWN0LnR5cGUgPSAnV2l0aGRyYXdCYWxhbmNlQ29udHJhY3QnO1xuICAgIGNvbnN0IGhleEJ1ZmZlciA9IEJ1ZmZlci5mcm9tKHJhd0RhdGFIZXgsICdoZXgnKTtcbiAgICBjb25zdCBpZCA9IGNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZShoZXhCdWZmZXIpLmRpZ2VzdCgnaGV4Jyk7XG4gICAgY29uc3QgdHhSZWNpcDogVHJhbnNhY3Rpb25SZWNlaXB0ID0ge1xuICAgICAgcmF3X2RhdGE6IHJhd0RhdGEsXG4gICAgICByYXdfZGF0YV9oZXg6IHJhd0RhdGFIZXgsXG4gICAgICB0eElEOiBpZCxcbiAgICAgIHNpZ25hdHVyZTogdGhpcy50cmFuc2FjdGlvbi5zaWduYXR1cmUsXG4gICAgfTtcbiAgICB0aGlzLnRyYW5zYWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uKHRoaXMuX2NvaW5Db25maWcsIHR4UmVjaXApO1xuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlciBtZXRob2QgdG8gZ2V0IHRoZSB3aXRoZHJhdyBleHBpcmUgdW5mcmVlemUgdHJhbnNhY3Rpb24gcmF3IGRhdGEgaGV4XG4gICAqXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IHRoZSBmcmVlemUgYmFsYW5jZSB0cmFuc2FjdGlvbiByYXcgZGF0YSBoZXhcbiAgICovXG4gIHByaXZhdGUgZ2V0V2l0aGRyYXdCYWxhbmNlUmF3RGF0YUhleCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHJhd0NvbnRyYWN0ID0ge1xuICAgICAgb3duZXJBZGRyZXNzOiBnZXRCeXRlQXJyYXlGcm9tSGV4QWRkcmVzcyh0aGlzLl9vd25lckFkZHJlc3MpLFxuICAgIH07XG4gICAgY29uc3Qgd2l0aGRyYXdCYWxhbmNlQ29udHJhY3QgPSBwcm90b2NvbC5XaXRoZHJhd0JhbGFuY2VDb250cmFjdC5mcm9tT2JqZWN0KHJhd0NvbnRyYWN0KTtcbiAgICBjb25zdCB3aXRoZHJhd0JhbGFuY2VDb250cmFjdEJ5dGVzID0gcHJvdG9jb2wuV2l0aGRyYXdCYWxhbmNlQ29udHJhY3QuZW5jb2RlKHdpdGhkcmF3QmFsYW5jZUNvbnRyYWN0KS5maW5pc2goKTtcbiAgICBjb25zdCB0eENvbnRyYWN0ID0ge1xuICAgICAgdHlwZTogQ29udHJhY3RUeXBlLldpdGhkcmF3QmFsYW5jZUNvbnRyYWN0LFxuICAgICAgcGFyYW1ldGVyOiB7XG4gICAgICAgIHZhbHVlOiB3aXRoZHJhd0JhbGFuY2VDb250cmFjdEJ5dGVzLFxuICAgICAgICB0eXBlX3VybDogJ3R5cGUuZ29vZ2xlYXBpcy5jb20vcHJvdG9jb2wuV2l0aGRyYXdCYWxhbmNlQ29udHJhY3QnLFxuICAgICAgfSxcbiAgICB9O1xuICAgIGNvbnN0IHJhdyA9IHtcbiAgICAgIHJlZkJsb2NrQnl0ZXM6IEJ1ZmZlci5mcm9tKHRoaXMuX3JlZkJsb2NrQnl0ZXMsICdoZXgnKSxcbiAgICAgIHJlZkJsb2NrSGFzaDogQnVmZmVyLmZyb20odGhpcy5fcmVmQmxvY2tIYXNoLCAnaGV4JyksXG4gICAgICBleHBpcmF0aW9uOiB0aGlzLl9leHBpcmF0aW9uIHx8IERhdGUubm93KCkgKyBUUkFOU0FDVElPTl9ERUZBVUxUX0VYUElSQVRJT04sXG4gICAgICB0aW1lc3RhbXA6IHRoaXMuX3RpbWVzdGFtcCB8fCBEYXRlLm5vdygpLFxuICAgICAgY29udHJhY3Q6IFt0eENvbnRyYWN0XSxcbiAgICB9O1xuICAgIGNvbnN0IHJhd1R4ID0gcHJvdG9jb2wuVHJhbnNhY3Rpb24ucmF3LmNyZWF0ZShyYXcpO1xuICAgIHJldHVybiBCdWZmZXIuZnJvbShwcm90b2NvbC5UcmFuc2FjdGlvbi5yYXcuZW5jb2RlKHJhd1R4KS5maW5pc2goKSkudG9TdHJpbmcoJ2hleCcpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHByb3RlY3RlZCBzaWduSW1wbGVtZW50YXRpb24oa2V5OiBCYXNlS2V5KTogVHJhbnNhY3Rpb24ge1xuICAgIGlmICh0aGlzLl9zaWduaW5nS2V5cy5zb21lKChzaWduaW5nS2V5KSA9PiBzaWduaW5nS2V5LmtleSA9PT0ga2V5LmtleSkpIHtcbiAgICAgIHRocm93IG5ldyBTaWduaW5nRXJyb3IoJ0R1cGxpY2F0ZWQga2V5Jyk7XG4gICAgfVxuICAgIHRoaXMuX3NpZ25pbmdLZXlzLnB1c2goa2V5KTtcblxuICAgIC8vIFdlIGtlZXAgdGhpcyByZXR1cm4gZm9yIGNvbXBhdGliaWxpdHkgYnV0IGlzIG5vdCBtZWFudCB0byBiZSB1c2VcbiAgICByZXR1cm4gdGhpcy50cmFuc2FjdGlvbjtcbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlTaWduYXR1cmVzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy50cmFuc2FjdGlvbi5pbnB1dHMpIHtcbiAgICAgIHRocm93IG5ldyBTaWduaW5nRXJyb3IoJ1RyYW5zYWN0aW9uIGhhcyBubyBpbnB1dHMnKTtcbiAgICB9XG5cbiAgICB0aGlzLl9zaWduaW5nS2V5cy5mb3JFYWNoKChrZXkpID0+IHRoaXMuYXBwbHlTaWduYXR1cmUoa2V5KSk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSB0cmFuc2FjdGlvblxuICAgKlxuICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9ufSB0cmFuc2FjdGlvbiAtIFRoZSB0cmFuc2FjdGlvbiB0byB2YWxpZGF0ZVxuICAgKiBAdGhyb3dzIHtCdWlsZFRyYW5zYWN0aW9uRXJyb3J9IHdoZW4gdGhlIHRyYW5zYWN0aW9uIGlzIGludmFsaWRcbiAgICovXG4gIHZhbGlkYXRlVHJhbnNhY3Rpb24odHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uKTogdm9pZCB7XG4gICAgdGhpcy52YWxpZGF0ZVdpdGhkcmF3QmFsYW5jZVRyYW5zYWN0aW9uRmllbGRzKCk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIGlmIHRoZSB0cmFuc2FjdGlvbiBpcyBhIHZhbGlkIHdpdGhkcmF3IGJhbGFuY2UgdHJhbnNhY3Rpb25cbiAgICpcbiAgICogQHBhcmFtIHtUcmFuc2FjdGlvblJlY2VpcHR9IHRyYW5zYWN0aW9uIC0gVGhlIHRyYW5zYWN0aW9uIHRvIHZhbGlkYXRlXG4gICAqIEB0aHJvd3Mge0J1aWxkVHJhbnNhY3Rpb25FcnJvcn0gd2hlbiB0aGUgdHJhbnNhY3Rpb24gaXMgaW52YWxpZFxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVdpdGhkcmF3QmFsYW5jZVRyYW5zYWN0aW9uRmllbGRzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fb3duZXJBZGRyZXNzKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdNaXNzaW5nIHBhcmFtZXRlcjogc291cmNlJyk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl9yZWZCbG9ja0J5dGVzIHx8ICF0aGlzLl9yZWZCbG9ja0hhc2gpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ01pc3NpbmcgYmxvY2sgcmVmZXJlbmNlIGluZm9ybWF0aW9uJyk7XG4gICAgfVxuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { TransactionType, BaseKey } from '@bitgo-beta/sdk-core';
|
|
2
|
+
import { BaseCoin as CoinConfig } from '@bitgo-beta/statics';
|
|
3
|
+
import { TransactionBuilder } from './transactionBuilder';
|
|
4
|
+
import { Transaction } from './transaction';
|
|
5
|
+
import { TransactionReceipt, WithdrawExpireUnfreezeContract } from './iface';
|
|
6
|
+
export declare class WithdrawExpireUnfreezeTxBuilder extends TransactionBuilder {
|
|
7
|
+
protected _signingKeys: BaseKey[];
|
|
8
|
+
constructor(_coinConfig: Readonly<CoinConfig>);
|
|
9
|
+
/** @inheritdoc */
|
|
10
|
+
protected get transactionType(): TransactionType;
|
|
11
|
+
/** @inheritdoc */
|
|
12
|
+
extendValidTo(extensionMs: number): void;
|
|
13
|
+
initBuilder(rawTransaction: TransactionReceipt | string): this;
|
|
14
|
+
/**
|
|
15
|
+
* Initialize the withdraw expire unfreeze contract call specific data
|
|
16
|
+
*
|
|
17
|
+
* @param {WithdrawExpireUnfreezeContract} withdrawExpireUnfreezeContractCall object with freeze txn data
|
|
18
|
+
*/
|
|
19
|
+
protected initWithdrawExpireUnfreezeContractCall(withdrawExpireUnfreezeContractCall: WithdrawExpireUnfreezeContract): void;
|
|
20
|
+
protected buildImplementation(): Promise<Transaction>;
|
|
21
|
+
/**
|
|
22
|
+
* Helper method to create the withdraw expire unfreeze transaction
|
|
23
|
+
*/
|
|
24
|
+
private createWithdrawExpireUnfreezeTransaction;
|
|
25
|
+
/**
|
|
26
|
+
* Helper method to get the withdraw expire unfreeze transaction raw data hex
|
|
27
|
+
*
|
|
28
|
+
* @returns {string} the freeze balance transaction raw data hex
|
|
29
|
+
*/
|
|
30
|
+
private getWithdrawExpireUnfreezeRawDataHex;
|
|
31
|
+
/** @inheritdoc */
|
|
32
|
+
protected signImplementation(key: BaseKey): Transaction;
|
|
33
|
+
private applySignatures;
|
|
34
|
+
/**
|
|
35
|
+
* Validates the transaction
|
|
36
|
+
*
|
|
37
|
+
* @param {Transaction} transaction - The transaction to validate
|
|
38
|
+
* @throws {BuildTransactionError} when the transaction is invalid
|
|
39
|
+
*/
|
|
40
|
+
validateTransaction(transaction: Transaction): void;
|
|
41
|
+
/**
|
|
42
|
+
* Validates if the transaction is a valid withdraw expire unfreeze transaction
|
|
43
|
+
*
|
|
44
|
+
* @param {TransactionReceipt} transaction - The transaction to validate
|
|
45
|
+
* @throws {BuildTransactionError} when the transaction is invalid
|
|
46
|
+
*/
|
|
47
|
+
private validateWithdrawExpireUnfreezeTransactionFields;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=withdrawExpireUnfreezeTxBuilder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"withdrawExpireUnfreezeTxBuilder.d.ts","sourceRoot":"","sources":["../../../src/lib/withdrawExpireUnfreezeTxBuilder.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,OAAO,EAA+D,MAAM,sBAAsB,CAAC;AAC7H,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,8BAA8B,EAAE,MAAM,SAAS,CAAC;AAY7E,qBAAa,+BAAgC,SAAQ,kBAAkB;IACrE,SAAS,CAAC,YAAY,EAAE,OAAO,EAAE,CAAC;gBAEtB,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC;IAM7C,kBAAkB;IAClB,SAAS,KAAK,eAAe,IAAI,eAAe,CAE/C;IAED,kBAAkB;IAClB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAoBxC,WAAW,CAAC,cAAc,EAAE,kBAAkB,GAAG,MAAM,GAAG,IAAI;IAiB9D;;;;OAIG;IACH,SAAS,CAAC,sCAAsC,CAC9C,kCAAkC,EAAE,8BAA8B,GACjE,IAAI;cAOS,mBAAmB,IAAI,OAAO,CAAC,WAAW,CAAC;IAc3D;;OAEG;IACH,OAAO,CAAC,uCAAuC;IAmB/C;;;;OAIG;IACH,OAAO,CAAC,mCAAmC;IAyB3C,kBAAkB;IAClB,SAAS,CAAC,kBAAkB,CAAC,GAAG,EAAE,OAAO,GAAG,WAAW;IAUvD,OAAO,CAAC,eAAe;IAQvB;;;;;OAKG;IACH,mBAAmB,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI;IAInD;;;;;OAKG;IACH,OAAO,CAAC,+CAA+C;CASxD"}
|