@bitgo/sdk-coin-avaxp 0.2.0-dev.1 → 1.0.1-rc.2
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/CHANGELOG.md +218 -0
- package/README.md +39 -0
- package/dist/src/avaxp.d.ts +60 -0
- package/dist/src/avaxp.d.ts.map +1 -0
- package/dist/src/avaxp.js +175 -0
- package/dist/src/iface.d.ts +20 -41
- package/dist/src/iface.d.ts.map +1 -1
- package/dist/src/iface.js +1 -15
- package/dist/src/index.d.ts +4 -18
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +9 -28
- package/dist/src/{delegatorTxBuilder.d.ts → lib/delegatorTxBuilder.d.ts} +21 -6
- package/dist/src/lib/delegatorTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/delegatorTxBuilder.js +240 -0
- package/dist/src/{errors.d.ts → lib/errors.d.ts} +0 -0
- package/dist/src/lib/errors.d.ts.map +1 -0
- package/dist/src/lib/errors.js +19 -0
- package/dist/src/lib/iface.d.ts +42 -0
- package/dist/src/lib/iface.d.ts.map +1 -0
- package/dist/src/lib/iface.js +12 -0
- package/dist/src/lib/index.d.ts +9 -0
- package/dist/src/lib/index.d.ts.map +1 -0
- package/dist/src/lib/index.js +29 -0
- package/dist/src/{keyPair.d.ts → lib/keyPair.d.ts} +13 -2
- package/dist/src/lib/keyPair.d.ts.map +1 -0
- package/dist/src/lib/keyPair.js +156 -0
- package/dist/src/lib/transaction.d.ts +73 -0
- package/dist/src/lib/transaction.d.ts.map +1 -0
- package/dist/src/lib/transaction.js +247 -0
- package/dist/src/{transactionBuilder.d.ts → lib/transactionBuilder.d.ts} +25 -22
- package/dist/src/lib/transactionBuilder.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilder.js +181 -0
- package/dist/src/{transactionBuilderFactory.d.ts → lib/transactionBuilderFactory.d.ts} +3 -4
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilderFactory.js +50 -0
- package/dist/src/{transferBuilder.d.ts → lib/transferBuilder.d.ts} +0 -0
- package/dist/src/lib/transferBuilder.d.ts.map +1 -0
- package/dist/src/lib/transferBuilder.js +31 -0
- package/dist/src/lib/utils.d.ts +130 -0
- package/dist/src/lib/utils.d.ts.map +1 -0
- package/dist/src/lib/utils.js +257 -0
- package/dist/src/{validatorTxBuilder.d.ts → lib/validatorTxBuilder.d.ts} +11 -3
- package/dist/src/lib/validatorTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/validatorTxBuilder.js +73 -0
- package/dist/src/tavaxp.d.ts +9 -0
- package/dist/src/tavaxp.d.ts.map +1 -0
- package/dist/src/tavaxp.js +14 -0
- package/dist/tsconfig.tsbuildinfo +973 -2827
- package/package.json +15 -10
- package/dist/src/delegatorTxBuilder.d.ts.map +0 -1
- package/dist/src/delegatorTxBuilder.js +0 -183
- package/dist/src/errors.d.ts.map +0 -1
- package/dist/src/errors.js +0 -19
- package/dist/src/keyPair.d.ts.map +0 -1
- package/dist/src/keyPair.js +0 -130
- package/dist/src/transaction.d.ts +0 -43
- package/dist/src/transaction.d.ts.map +0 -1
- package/dist/src/transaction.js +0 -98
- package/dist/src/transactionBuilder.d.ts.map +0 -1
- package/dist/src/transactionBuilder.js +0 -171
- package/dist/src/transactionBuilderFactory.d.ts.map +0 -1
- package/dist/src/transactionBuilderFactory.js +0 -53
- package/dist/src/transferBuilder.d.ts.map +0 -1
- package/dist/src/transferBuilder.js +0 -31
- package/dist/src/utils.d.ts +0 -50
- package/dist/src/utils.d.ts.map +0 -1
- package/dist/src/utils.js +0 -98
- package/dist/src/validatorTxBuilder.d.ts.map +0 -1
- package/dist/src/validatorTxBuilder.js +0 -58
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
5
|
+
}) : (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
o[k2] = m[k];
|
|
8
|
+
}));
|
|
9
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
10
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
11
|
+
}) : function(o, v) {
|
|
12
|
+
o["default"] = v;
|
|
13
|
+
});
|
|
14
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
15
|
+
if (mod && mod.__esModule) return mod;
|
|
16
|
+
var result = {};
|
|
17
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
18
|
+
__setModuleDefault(result, mod);
|
|
19
|
+
return result;
|
|
20
|
+
};
|
|
21
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
22
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
23
|
+
};
|
|
24
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
|
+
exports.KeyPair = exports.addressFormat = void 0;
|
|
26
|
+
const sdk_core_1 = require("@bitgo/sdk-core");
|
|
27
|
+
const avalanche_1 = require("avalanche");
|
|
28
|
+
const common_1 = require("avalanche/dist/common");
|
|
29
|
+
const bip32 = __importStar(require("bip32"));
|
|
30
|
+
const bitcoinjs_lib_1 = require("bitcoinjs-lib");
|
|
31
|
+
const crypto_1 = require("crypto");
|
|
32
|
+
const utils_1 = __importDefault(require("./utils"));
|
|
33
|
+
const DEFAULT_SEED_SIZE_BYTES = 16;
|
|
34
|
+
var addressFormat;
|
|
35
|
+
(function (addressFormat) {
|
|
36
|
+
addressFormat["testnet"] = "fuji";
|
|
37
|
+
addressFormat["mainnet"] = "avax";
|
|
38
|
+
})(addressFormat = exports.addressFormat || (exports.addressFormat = {}));
|
|
39
|
+
class KeyPair extends sdk_core_1.Secp256k1ExtendedKeyPair {
|
|
40
|
+
/**
|
|
41
|
+
* Public constructor. By default, creates a key pair with a random master seed.
|
|
42
|
+
*
|
|
43
|
+
* @param { KeyPairOptions } source Either a master seed, a private key, or a public key
|
|
44
|
+
*/
|
|
45
|
+
constructor(source) {
|
|
46
|
+
super(source);
|
|
47
|
+
if (!source) {
|
|
48
|
+
const seed = crypto_1.randomBytes(DEFAULT_SEED_SIZE_BYTES);
|
|
49
|
+
this.hdNode = bip32.fromSeed(seed);
|
|
50
|
+
}
|
|
51
|
+
else if (sdk_core_1.isSeed(source)) {
|
|
52
|
+
this.hdNode = bip32.fromSeed(source.seed);
|
|
53
|
+
}
|
|
54
|
+
else if (sdk_core_1.isPrivateKey(source)) {
|
|
55
|
+
this.recordKeysFromPrivateKey(source.prv);
|
|
56
|
+
}
|
|
57
|
+
else if (sdk_core_1.isPublicKey(source)) {
|
|
58
|
+
this.recordKeysFromPublicKey(source.pub);
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
throw new Error('Invalid key pair options');
|
|
62
|
+
}
|
|
63
|
+
if (this.hdNode) {
|
|
64
|
+
this.keyPair = sdk_core_1.Secp256k1ExtendedKeyPair.toKeyPair(this.hdNode);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Build a keypair from a protocol private key or extended private key.
|
|
69
|
+
*
|
|
70
|
+
* @param {string} prv A raw private key
|
|
71
|
+
*/
|
|
72
|
+
recordKeysFromPrivateKey(prv) {
|
|
73
|
+
if (prv.startsWith('PrivateKey-')) {
|
|
74
|
+
this.keyPair = bitcoinjs_lib_1.ECPair.fromPrivateKey(Buffer.from(utils_1.default.cb58Decode(prv.split('-')[1])));
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
if (!utils_1.default.isValidPrivateKey(prv)) {
|
|
78
|
+
throw new Error('Unsupported private key');
|
|
79
|
+
}
|
|
80
|
+
if (sdk_core_1.isValidXprv(prv)) {
|
|
81
|
+
this.hdNode = bip32.fromBase58(prv);
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
this.keyPair = bitcoinjs_lib_1.ECPair.fromPrivateKey(Buffer.from(prv.slice(0, 64), 'hex'));
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Build an ECPair from a protocol public key or extended public key.
|
|
89
|
+
*
|
|
90
|
+
* @param {string} pub A raw public key
|
|
91
|
+
*/
|
|
92
|
+
recordKeysFromPublicKey(pub) {
|
|
93
|
+
try {
|
|
94
|
+
if (sdk_core_1.isValidXpub(pub)) {
|
|
95
|
+
this.hdNode = bip32.fromBase58(pub);
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
this.keyPair = bitcoinjs_lib_1.ECPair.fromPublicKey(Buffer.from(pub, 'hex'));
|
|
99
|
+
}
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
catch (e) {
|
|
103
|
+
try {
|
|
104
|
+
this.keyPair = bitcoinjs_lib_1.ECPair.fromPublicKey(Buffer.from(utils_1.default.cb58Decode(pub)));
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
catch (e) {
|
|
108
|
+
throw new Error('Unsupported public key');
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Default keys format is a pair of Uint8Array keys
|
|
114
|
+
*
|
|
115
|
+
* @returns { DefaultKeys } The keys in the defined format
|
|
116
|
+
*/
|
|
117
|
+
getKeys() {
|
|
118
|
+
var _a;
|
|
119
|
+
return {
|
|
120
|
+
pub: this.getPublicKey({ compressed: true }).toString('hex'),
|
|
121
|
+
prv: (_a = this.getPrivateKey()) === null || _a === void 0 ? void 0 : _a.toString('hex'),
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Get an Avalanche P-Chain public mainnet address
|
|
126
|
+
*
|
|
127
|
+
* @param {string} format - avalanche hrp - select Mainnet(avax) or Testnet(fuji) for the address
|
|
128
|
+
* @returns {string} The mainnet address derived from the public key
|
|
129
|
+
*/
|
|
130
|
+
getAddress(format = 'mainnet') {
|
|
131
|
+
return this.getAvaxPAddress(addressFormat[format]);
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Get a public address of public key.
|
|
135
|
+
*
|
|
136
|
+
* @param {string} hrp - select Mainnet(avax) or Testnet(fuji) for the address
|
|
137
|
+
* @returns {string} The address derived from the public key and hrp
|
|
138
|
+
*/
|
|
139
|
+
getAvaxPAddress(hrp) {
|
|
140
|
+
const publicKey = avalanche_1.Buffer.from(this.keyPair.publicKey);
|
|
141
|
+
const addrressBuffer = common_1.SECP256k1KeyPair.addressFromPublicKey(publicKey);
|
|
142
|
+
return utils_1.default.addressToString(hrp, 'P', addrressBuffer);
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Get an Avalanche P-Chain public mainnet address
|
|
146
|
+
*
|
|
147
|
+
* @param {string} format - avalanche hrp - select Mainnet(avax) or Testnet(fuji) for the address
|
|
148
|
+
* @returns {string} The mainnet address derived from the public key
|
|
149
|
+
*/
|
|
150
|
+
getAddressBuffer() {
|
|
151
|
+
const publicKey = avalanche_1.Buffer.from(this.keyPair.publicKey);
|
|
152
|
+
return Buffer.from(common_1.SECP256k1KeyPair.addressFromPublicKey(publicKey));
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
exports.KeyPair = KeyPair;
|
|
156
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5UGFpci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIva2V5UGFpci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsOENBU3lCO0FBQ3pCLHlDQUFpRDtBQUNqRCxrREFBeUQ7QUFDekQsNkNBQStCO0FBQy9CLGlEQUF1QztBQUN2QyxtQ0FBcUM7QUFDckMsb0RBQTRCO0FBRTVCLE1BQU0sdUJBQXVCLEdBQUcsRUFBRSxDQUFDO0FBQ25DLElBQVksYUFHWDtBQUhELFdBQVksYUFBYTtJQUN2QixpQ0FBZ0IsQ0FBQTtJQUNoQixpQ0FBZ0IsQ0FBQTtBQUNsQixDQUFDLEVBSFcsYUFBYSxHQUFiLHFCQUFhLEtBQWIscUJBQWEsUUFHeEI7QUFFRCxNQUFhLE9BQVEsU0FBUSxtQ0FBd0I7SUFDbkQ7Ozs7T0FJRztJQUNILFlBQVksTUFBdUI7UUFDakMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2QsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNYLE1BQU0sSUFBSSxHQUFHLG9CQUFXLENBQUMsdUJBQXVCLENBQUMsQ0FBQztZQUNsRCxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDcEM7YUFBTSxJQUFJLGlCQUFNLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDekIsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUMzQzthQUFNLElBQUksdUJBQVksQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUMvQixJQUFJLENBQUMsd0JBQXdCLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQzNDO2FBQU0sSUFBSSxzQkFBVyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQzlCLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENB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O1FBQ3BGLE9BQU8sZUFBSyxDQUFDLGVBQWUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLGNBQWMsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILGdCQUFnQjtRQUNkLE1BQU0sU0FBUyxHQUFHLGtCQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDMUQsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLHlCQUFnQixDQUFDLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFDdkUsQ0FBQztDQUNGO0FBaEhELDBCQWdIQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIERlZmF1bHRLZXlzLFxuICBpc1ByaXZhdGVLZXksXG4gIGlzUHVibGljS2V5LFxuICBpc1NlZWQsXG4gIGlzVmFsaWRYcHJ2LFxuICBpc1ZhbGlkWHB1YixcbiAgS2V5UGFpck9wdGlvbnMsXG4gIFNlY3AyNTZrMUV4dGVuZGVkS2V5UGFpcixcbn0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcbmltcG9ydCB7IEJ1ZmZlciBhcyBCdWZmZXJBdmF4IH0gZnJvbSAnYXZhbGFuY2hlJztcbmltcG9ydCB7IFNFQ1AyNTZrMUtleVBhaXIgfSBmcm9tICdhdmFsYW5jaGUvZGlzdC9jb21tb24nO1xuaW1wb3J0ICogYXMgYmlwMzIgZnJvbSAnYmlwMzInO1xuaW1wb3J0IHsgRUNQYWlyIH0gZnJvbSAnYml0Y29pbmpzLWxpYic7XG5pbXBvcnQgeyByYW5kb21CeXRlcyB9IGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgdXRpbHMgZnJvbSAnLi91dGlscyc7XG5cbmNvbnN0IERFRkFVTFRfU0VFRF9TSVpFX0JZVEVTID0gMTY7XG5leHBvcnQgZW51bSBhZGRyZXNzRm9ybWF0IHtcbiAgdGVzdG5ldCA9ICdmdWppJyxcbiAgbWFpbm5ldCA9ICdhdmF4Jyxcbn1cblxuZXhwb3J0IGNsYXNzIEtleVBhaXIgZXh0ZW5kcyBTZWNwMjU2azFFeHRlbmRlZEtleVBhaXIge1xuICAvKipcbiAgICogUHVibGljIGNvbnN0cnVjdG9yLiBCeSBkZWZhdWx0LCBjcmVhdGVzIGEga2V5IHBhaXIgd2l0aCBhIHJhbmRvbSBtYXN0ZXIgc2VlZC5cbiAgICpcbiAgICogQHBhcmFtIHsgS2V5UGFpck9wdGlvbnMgfSBzb3VyY2UgRWl0aGVyIGEgbWFzdGVyIHNlZWQsIGEgcHJpdmF0ZSBrZXksIG9yIGEgcHVibGljIGtleVxuICAgKi9cbiAgY29uc3RydWN0b3Ioc291cmNlPzogS2V5UGFpck9wdGlvbnMpIHtcbiAgICBzdXBlcihzb3VyY2UpO1xuICAgIGlmICghc291cmNlKSB7XG4gICAgICBjb25zdCBzZWVkID0gcmFuZG9tQnl0ZXMoREVGQVVMVF9TRUVEX1NJWkVfQllURVMpO1xuICAgICAgdGhpcy5oZE5vZGUgPSBiaXAzMi5mcm9tU2VlZChzZWVkKTtcbiAgICB9IGVsc2UgaWYgKGlzU2VlZChzb3VyY2UpKSB7XG4gICAgICB0aGlzLmhkTm9kZSA9IGJpcDMyLmZyb21TZWVkKHNvdXJjZS5zZWVkKTtcbiAgICB9IGVsc2UgaWYgKGlzUHJpdmF0ZUtleShzb3VyY2UpKSB7XG4gICAgICB0aGlzLnJlY29yZEtleXNGcm9tUHJpdmF0ZUtleShzb3VyY2UucHJ2KTtcbiAgICB9IGVsc2UgaWYgKGlzUHVibGljS2V5KHNvdXJjZSkpIHtcbiAgICAgIHRoaXMucmVjb3JkS2V5c0Zyb21QdWJsaWNLZXkoc291cmNlLnB1Yik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBrZXkgcGFpciBvcHRpb25zJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaGROb2RlKSB7XG4gICAgICB0aGlzLmtleVBhaXIgPSBTZWNwMjU2azFFeHRlbmRlZEtleVBhaXIudG9LZXlQYWlyKHRoaXMuaGROb2RlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgYSBrZXlwYWlyIGZyb20gYSBwcm90b2NvbCBwcml2YXRlIGtleSBvciBleHRlbmRlZCBwcml2YXRlIGtleS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBydiBBIHJhdyBwcml2YXRlIGtleVxuICAgKi9cbiAgcmVjb3JkS2V5c0Zyb21Qcml2YXRlS2V5KHBydjogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHBydi5zdGFydHNXaXRoKCdQcml2YXRlS2V5LScpKSB7XG4gICAgICB0aGlzLmtleVBhaXIgPSBFQ1BhaXIuZnJvbVByaXZhdGVLZXkoQnVmZmVyLmZyb20odXRpbHMuY2I1OERlY29kZShwcnYuc3BsaXQoJy0nKVsxXSkpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF1dGlscy5pc1ZhbGlkUHJpdmF0ZUtleShwcnYpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIHByaXZhdGUga2V5Jyk7XG4gICAgfVxuICAgIGlmIChpc1ZhbGlkWHBydihwcnYpKSB7XG4gICAgICB0aGlzLmhkTm9kZSA9IGJpcDMyLmZyb21CYXNlNTgocHJ2KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5rZXlQYWlyID0gRUNQYWlyLmZyb21Qcml2YXRlS2V5KEJ1ZmZlci5mcm9tKHBydi5zbGljZSgwLCA2NCksICdoZXgnKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGFuIEVDUGFpciBmcm9tIGEgcHJvdG9jb2wgcHVibGljIGtleSBvciBleHRlbmRlZCBwdWJsaWMga2V5LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcHViIEEgcmF3IHB1YmxpYyBrZXlcbiAgICovXG4gIHJlY29yZEtleXNGcm9tUHVibGljS2V5KHB1Yjogc3RyaW5nKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChpc1ZhbGlkWHB1YihwdWIpKSB7XG4gICAgICAgIHRoaXMuaGROb2RlID0gYmlwMzIuZnJvbUJhc2U1OChwdWIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5rZXlQYWlyID0gRUNQYWlyLmZyb21QdWJsaWNLZXkoQnVmZmVyLmZyb20ocHViLCAnaGV4JykpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMua2V5UGFpciA9IEVDUGFpci5mcm9tUHVibGljS2V5KEJ1ZmZlci5mcm9tKHV0aWxzLmNiNThEZWNvZGUocHViKSkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgcHVibGljIGtleScpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZhdWx0IGtleXMgZm9ybWF0IGlzIGEgcGFpciBvZiBVaW50OEFycmF5IGtleXNcbiAgICpcbiAgICogQHJldHVybnMgeyBEZWZhdWx0S2V5cyB9IFRoZSBrZXlzIGluIHRoZSBkZWZpbmVkIGZvcm1hdFxuICAgKi9cbiAgZ2V0S2V5cygpOiBEZWZhdWx0S2V5cyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHB1YjogdGhpcy5nZXRQdWJsaWNLZXkoeyBjb21wcmVzc2VkOiB0cnVlIH0pLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHBydjogdGhpcy5nZXRQcml2YXRlS2V5KCk/LnRvU3RyaW5nKCdoZXgnKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbiBBdmFsYW5jaGUgUC1DaGFpbiBwdWJsaWMgbWFpbm5ldCBhZGRyZXNzXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmb3JtYXQgLSBhdmFsYW5jaGUgaHJwIC0gc2VsZWN0IE1haW5uZXQoYXZheCkgb3IgVGVzdG5ldChmdWppKSBmb3IgdGhlIGFkZHJlc3NcbiAgICogQHJldHVybnMge3N0cmluZ30gVGhlIG1haW5uZXQgYWRkcmVzcyBkZXJpdmVkIGZyb20gdGhlIHB1YmxpYyBrZXlcbiAgICovXG4gIGdldEFkZHJlc3MoZm9ybWF0ID0gJ21haW5uZXQnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRBdmF4UEFkZHJlc3MoYWRkcmVzc0Zvcm1hdFtmb3JtYXRdKTtcbiAgfVxuICAvKipcbiAgICogR2V0IGEgcHVibGljIGFkZHJlc3Mgb2YgcHVibGljIGtleS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGhycCAtIHNlbGVjdCBNYWlubmV0KGF2YXgpIG9yIFRlc3RuZXQoZnVqaSkgZm9yIHRoZSBhZGRyZXNzXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBhZGRyZXNzIGRlcml2ZWQgZnJvbSB0aGUgcHVibGljIGtleSBhbmQgaHJwXG4gICAqL1xuICBnZXRBdmF4UEFkZHJlc3MoaHJwOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHB1YmxpY0tleSA9IEJ1ZmZlckF2YXguZnJvbSh0aGlzLmtleVBhaXIucHVibGljS2V5KTtcbiAgICBjb25zdCBhZGRycmVzc0J1ZmZlcjogQnVmZmVyQXZheCA9IFNFQ1AyNTZrMUtleVBhaXIuYWRkcmVzc0Zyb21QdWJsaWNLZXkocHVibGljS2V5KTtcbiAgICByZXR1cm4gdXRpbHMuYWRkcmVzc1RvU3RyaW5nKGhycCwgJ1AnLCBhZGRycmVzc0J1ZmZlcik7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFuIEF2YWxhbmNoZSBQLUNoYWluIHB1YmxpYyBtYWlubmV0IGFkZHJlc3NcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZvcm1hdCAtIGF2YWxhbmNoZSBocnAgLSBzZWxlY3QgTWFpbm5ldChhdmF4KSBvciBUZXN0bmV0KGZ1amkpIGZvciB0aGUgYWRkcmVzc1xuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgbWFpbm5ldCBhZGRyZXNzIGRlcml2ZWQgZnJvbSB0aGUgcHVibGljIGtleVxuICAgKi9cbiAgZ2V0QWRkcmVzc0J1ZmZlcigpOiBCdWZmZXIge1xuICAgIGNvbnN0IHB1YmxpY0tleSA9IEJ1ZmZlckF2YXguZnJvbSh0aGlzLmtleVBhaXIucHVibGljS2V5KTtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20oU0VDUDI1NmsxS2V5UGFpci5hZGRyZXNzRnJvbVB1YmxpY0tleShwdWJsaWNLZXkpKTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/// <reference types="bn.js" />
|
|
2
|
+
/// <reference types="node" />
|
|
3
|
+
import { AvalancheNetwork, BaseCoin as CoinConfig } from '@bitgo/statics';
|
|
4
|
+
import { BaseKey, BaseTransaction, Entry, TransactionType } from '@bitgo/sdk-core';
|
|
5
|
+
import { KeyPair } from './keyPair';
|
|
6
|
+
import { DecodedUtxoObj, TransactionExplanation, TxData } from './iface';
|
|
7
|
+
import { BaseTx, Tx } from 'avalanche/dist/apis/platformvm';
|
|
8
|
+
import { BN, Buffer as BufferAvax } from 'avalanche';
|
|
9
|
+
import { Credential } from 'avalanche/dist/common';
|
|
10
|
+
export declare class Transaction extends BaseTransaction {
|
|
11
|
+
protected _avaxpTransaction: Tx;
|
|
12
|
+
_type: TransactionType;
|
|
13
|
+
_network: AvalancheNetwork;
|
|
14
|
+
_networkID: number;
|
|
15
|
+
_assetId: BufferAvax;
|
|
16
|
+
_blockchainID: BufferAvax;
|
|
17
|
+
_memo?: BufferAvax;
|
|
18
|
+
_threshold: number;
|
|
19
|
+
_locktime: BN;
|
|
20
|
+
_fromAddresses: BufferAvax[];
|
|
21
|
+
_utxos: DecodedUtxoObj[];
|
|
22
|
+
_txFee: BN;
|
|
23
|
+
constructor(coinConfig: Readonly<CoinConfig>);
|
|
24
|
+
get avaxPTransaction(): BaseTx;
|
|
25
|
+
get signature(): string[];
|
|
26
|
+
get credentials(): Credential[];
|
|
27
|
+
get hasCredentials(): boolean;
|
|
28
|
+
/** @inheritdoc */
|
|
29
|
+
canSign({ key }: BaseKey): boolean;
|
|
30
|
+
/**
|
|
31
|
+
* Sign a avaxp transaction and update the transaction hex
|
|
32
|
+
* validator, delegator, import, exports extend baseTx
|
|
33
|
+
* unsignedTx: UnsignedTx = new UnsignedTx(baseTx) (baseTx = addValidatorTx)
|
|
34
|
+
* const tx: Tx = unsignedTx.sign(keychain) (tx is type standard signed tx)
|
|
35
|
+
* get baseTx then create new unsignedTx then sign
|
|
36
|
+
*
|
|
37
|
+
* @param {KeyPair} keyPair
|
|
38
|
+
*/
|
|
39
|
+
sign(keyPair: KeyPair): void;
|
|
40
|
+
/** @inheritdoc */
|
|
41
|
+
/**
|
|
42
|
+
* should be of signedTx doing this with baseTx
|
|
43
|
+
*/
|
|
44
|
+
toBroadcastFormat(): string;
|
|
45
|
+
toJson(): TxData;
|
|
46
|
+
setTransaction(tx: Tx): void;
|
|
47
|
+
/**
|
|
48
|
+
* Set the transaction type
|
|
49
|
+
*
|
|
50
|
+
* @param {TransactionType} transactionType The transaction type to be set
|
|
51
|
+
*/
|
|
52
|
+
setTransactionType(transactionType: TransactionType): void;
|
|
53
|
+
/**
|
|
54
|
+
* Returns the portion of the transaction that needs to be signed in Buffer format.
|
|
55
|
+
* Only needed for coins that support adding signatures directly (e.g. TSS).
|
|
56
|
+
*/
|
|
57
|
+
get signablePayload(): Buffer;
|
|
58
|
+
get id(): string;
|
|
59
|
+
get fromAddresses(): string[];
|
|
60
|
+
/**
|
|
61
|
+
* Get the list of outputs. Amounts are expressed in absolute value.
|
|
62
|
+
*/
|
|
63
|
+
get outputs(): Entry[];
|
|
64
|
+
/**
|
|
65
|
+
* Avax wrapper to create signature and return it for credentials
|
|
66
|
+
* @param prv
|
|
67
|
+
* @return hexstring
|
|
68
|
+
*/
|
|
69
|
+
createSignature(prv: Buffer): string;
|
|
70
|
+
/** @inheritdoc */
|
|
71
|
+
explainTransaction(): TransactionExplanation;
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=transaction.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transaction.d.ts","sourceRoot":"","sources":["../../../src/lib/transaction.ts"],"names":[],"mappings":";;AAAA,OAAO,EAAE,gBAAgB,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC1E,OAAO,EACL,OAAO,EACP,eAAe,EACf,KAAK,EAGL,eAAe,EAChB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACzE,OAAO,EAAgC,MAAM,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AAC1F,OAAO,EAAY,EAAE,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,WAAW,CAAC;AAG/D,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAyCnD,qBAAa,WAAY,SAAQ,eAAe;IAC9C,SAAS,CAAC,iBAAiB,EAAE,EAAE,CAAC;IACzB,KAAK,EAAE,eAAe,CAAC;IACvB,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,UAAU,CAAC;IACrB,aAAa,EAAE,UAAU,CAAC;IAC1B,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,UAAU,SAAK;IACf,SAAS,EAAE,EAAE,CAAa;IAC1B,cAAc,EAAE,UAAU,EAAE,CAAM;IAClC,MAAM,EAAE,cAAc,EAAE,CAAM;IAC9B,MAAM,EAAE,EAAE,CAAC;gBAEN,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC;IAS5C,IAAI,gBAAgB,IAAI,MAAM,CAE7B;IAED,IAAI,SAAS,IAAI,MAAM,EAAE,CAMxB;IAED,IAAI,WAAW,IAAI,UAAU,EAAE,CAE9B;IAED,IAAI,cAAc,IAAI,OAAO,CAE5B;IAED,kBAAkB;IAClB,OAAO,CAAC,EAAE,GAAG,EAAE,EAAE,OAAO,GAAG,OAAO;IAYlC;;;;;;;;OAQG;IACH,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IA4B5B,kBAAkB;IAClB;;OAEG;IACH,iBAAiB,IAAI,MAAM;IAS3B,MAAM,IAAI,MAAM;IAgBhB,cAAc,CAAC,EAAE,EAAE,EAAE,GAAG,IAAI;IAI5B;;;;OAIG;IACH,kBAAkB,CAAC,eAAe,EAAE,eAAe,GAAG,IAAI;IAI1D;;;OAGG;IACH,IAAI,eAAe,IAAI,MAAM,CAG5B;IAED,IAAI,EAAE,IAAI,MAAM,CAEf;IAED,IAAI,aAAa,IAAI,MAAM,EAAE,CAE5B;IACD;;OAEG;IACH,IAAI,OAAO,IAAI,KAAK,EAAE,CAsBrB;IAED;;;;OAIG;IACH,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IASpC,kBAAkB;IAClB,kBAAkB,IAAI,sBAAsB;CAc7C"}
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
5
|
+
}) : (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
o[k2] = m[k];
|
|
8
|
+
}));
|
|
9
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
10
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
11
|
+
}) : function(o, v) {
|
|
12
|
+
o["default"] = v;
|
|
13
|
+
});
|
|
14
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
15
|
+
if (mod && mod.__esModule) return mod;
|
|
16
|
+
var result = {};
|
|
17
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
18
|
+
__setModuleDefault(result, mod);
|
|
19
|
+
return result;
|
|
20
|
+
};
|
|
21
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
22
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
23
|
+
};
|
|
24
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
|
+
exports.Transaction = void 0;
|
|
26
|
+
const sdk_core_1 = require("@bitgo/sdk-core");
|
|
27
|
+
const keyPair_1 = require("./keyPair");
|
|
28
|
+
const avalanche_1 = require("avalanche");
|
|
29
|
+
const utils_1 = __importDefault(require("./utils"));
|
|
30
|
+
const createHash = __importStar(require("create-hash"));
|
|
31
|
+
function isEmptySignature(s) {
|
|
32
|
+
return !!s && s.startsWith(''.padStart(90, '0'));
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Signatures are prestore as empty buffer for hsm and address of signar for first signature.
|
|
36
|
+
* When sign is required, this method return the function that identify a signature to be replaced.
|
|
37
|
+
* @param signatures any signatures as samples to identify which signature required replace.
|
|
38
|
+
*/
|
|
39
|
+
function generateSelectorSignature(signatures) {
|
|
40
|
+
if (signatures.every((sig) => isEmptySignature(sig.bytes))) {
|
|
41
|
+
// Look for address.
|
|
42
|
+
return function (sig, address) {
|
|
43
|
+
try {
|
|
44
|
+
if (!isEmptySignature(sig.bytes))
|
|
45
|
+
return false;
|
|
46
|
+
const pub = sig.bytes.substring(90);
|
|
47
|
+
return pub === address;
|
|
48
|
+
}
|
|
49
|
+
catch (e) {
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
// Look for empty string
|
|
56
|
+
return function (sig, address) {
|
|
57
|
+
if (isEmptySignature(sig.bytes))
|
|
58
|
+
return true;
|
|
59
|
+
return false;
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
// end region utils for sign
|
|
64
|
+
class Transaction extends sdk_core_1.BaseTransaction {
|
|
65
|
+
constructor(coinConfig) {
|
|
66
|
+
super(coinConfig);
|
|
67
|
+
this._threshold = 2;
|
|
68
|
+
this._locktime = new avalanche_1.BN(0);
|
|
69
|
+
this._fromAddresses = [];
|
|
70
|
+
this._utxos = [];
|
|
71
|
+
this._network = coinConfig.network;
|
|
72
|
+
this._assetId = utils_1.default.cb58Decode(this._network.avaxAssetID);
|
|
73
|
+
this._blockchainID = utils_1.default.cb58Decode(this._network.blockchainID);
|
|
74
|
+
this._networkID = this._network.networkID;
|
|
75
|
+
this._txFee = new avalanche_1.BN(this._network.txFee.toString());
|
|
76
|
+
}
|
|
77
|
+
get avaxPTransaction() {
|
|
78
|
+
return this._avaxpTransaction.getUnsignedTx().getTransaction();
|
|
79
|
+
}
|
|
80
|
+
get signature() {
|
|
81
|
+
if (this.credentials.length === 0) {
|
|
82
|
+
return [];
|
|
83
|
+
}
|
|
84
|
+
const obj = this.credentials[0].serialize();
|
|
85
|
+
return obj.sigArray.map((s) => s.bytes).filter((s) => !isEmptySignature(s));
|
|
86
|
+
}
|
|
87
|
+
get credentials() {
|
|
88
|
+
return this._avaxpTransaction.getCredentials();
|
|
89
|
+
}
|
|
90
|
+
get hasCredentials() {
|
|
91
|
+
return this.credentials !== undefined && this.credentials.length > 0;
|
|
92
|
+
}
|
|
93
|
+
/** @inheritdoc */
|
|
94
|
+
canSign({ key }) {
|
|
95
|
+
try {
|
|
96
|
+
const kp = new keyPair_1.KeyPair({ prv: key });
|
|
97
|
+
const privateKey = kp.getPrivateKey();
|
|
98
|
+
if (!privateKey)
|
|
99
|
+
return false;
|
|
100
|
+
const address = utils_1.default.parseAddress(kp.getAvaxPAddress(this._network.hrp));
|
|
101
|
+
return this._fromAddresses.find((a) => address.equals(a)) !== undefined;
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Sign a avaxp transaction and update the transaction hex
|
|
109
|
+
* validator, delegator, import, exports extend baseTx
|
|
110
|
+
* unsignedTx: UnsignedTx = new UnsignedTx(baseTx) (baseTx = addValidatorTx)
|
|
111
|
+
* const tx: Tx = unsignedTx.sign(keychain) (tx is type standard signed tx)
|
|
112
|
+
* get baseTx then create new unsignedTx then sign
|
|
113
|
+
*
|
|
114
|
+
* @param {KeyPair} keyPair
|
|
115
|
+
*/
|
|
116
|
+
sign(keyPair) {
|
|
117
|
+
const prv = keyPair.getPrivateKey();
|
|
118
|
+
const addressHex = keyPair.getAddressBuffer().toString('hex');
|
|
119
|
+
if (!prv) {
|
|
120
|
+
throw new sdk_core_1.SigningError('Missing private key');
|
|
121
|
+
}
|
|
122
|
+
if (!this.avaxPTransaction) {
|
|
123
|
+
throw new sdk_core_1.InvalidTransactionError('empty transaction to sign');
|
|
124
|
+
}
|
|
125
|
+
if (!this.hasCredentials) {
|
|
126
|
+
throw new sdk_core_1.InvalidTransactionError('empty credentials to sign');
|
|
127
|
+
}
|
|
128
|
+
const signature = this.createSignature(prv);
|
|
129
|
+
let checkSign = undefined;
|
|
130
|
+
this.credentials.forEach((c) => {
|
|
131
|
+
const cs = c.serialize();
|
|
132
|
+
if (checkSign === undefined) {
|
|
133
|
+
checkSign = generateSelectorSignature(cs.sigArray);
|
|
134
|
+
}
|
|
135
|
+
cs.sigArray.forEach((sig) => {
|
|
136
|
+
if (checkSign && checkSign(sig, addressHex)) {
|
|
137
|
+
sig.bytes = signature;
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
c.deserialize(cs);
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
/** @inheritdoc */
|
|
144
|
+
/**
|
|
145
|
+
* should be of signedTx doing this with baseTx
|
|
146
|
+
*/
|
|
147
|
+
toBroadcastFormat() {
|
|
148
|
+
if (!this.avaxPTransaction) {
|
|
149
|
+
throw new sdk_core_1.InvalidTransactionError('Empty transaction data');
|
|
150
|
+
}
|
|
151
|
+
const bintools = avalanche_1.BinTools.getInstance();
|
|
152
|
+
return bintools.addChecksum(this._avaxpTransaction.toBuffer()).toString('hex');
|
|
153
|
+
}
|
|
154
|
+
// types - stakingTransaction, import, export
|
|
155
|
+
toJson() {
|
|
156
|
+
if (!this.avaxPTransaction) {
|
|
157
|
+
throw new sdk_core_1.InvalidTransactionError('Empty transaction data');
|
|
158
|
+
}
|
|
159
|
+
return {
|
|
160
|
+
id: this.id,
|
|
161
|
+
fromAddresses: this.fromAddresses,
|
|
162
|
+
threshold: this._threshold,
|
|
163
|
+
locktime: this._locktime.toString(),
|
|
164
|
+
type: this.type,
|
|
165
|
+
memo: utils_1.default.bufferToString(this.avaxPTransaction.getMemo()),
|
|
166
|
+
signatures: this.signature,
|
|
167
|
+
outputs: this.outputs,
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
setTransaction(tx) {
|
|
171
|
+
this._avaxpTransaction = tx;
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Set the transaction type
|
|
175
|
+
*
|
|
176
|
+
* @param {TransactionType} transactionType The transaction type to be set
|
|
177
|
+
*/
|
|
178
|
+
setTransactionType(transactionType) {
|
|
179
|
+
this._type = transactionType;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Returns the portion of the transaction that needs to be signed in Buffer format.
|
|
183
|
+
* Only needed for coins that support adding signatures directly (e.g. TSS).
|
|
184
|
+
*/
|
|
185
|
+
get signablePayload() {
|
|
186
|
+
const txbuff = this._avaxpTransaction.getUnsignedTx().toBuffer();
|
|
187
|
+
return createHash.default('sha256').update(txbuff).digest();
|
|
188
|
+
}
|
|
189
|
+
get id() {
|
|
190
|
+
return utils_1.default.cb58Encode(avalanche_1.Buffer.from(utils_1.default.sha256(avalanche_1.Buffer.from(this.toBroadcastFormat(), 'hex'))));
|
|
191
|
+
}
|
|
192
|
+
get fromAddresses() {
|
|
193
|
+
return this._fromAddresses.map((a) => utils_1.default.addressToString(this._network.hrp, this._network.alias, a));
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Get the list of outputs. Amounts are expressed in absolute value.
|
|
197
|
+
*/
|
|
198
|
+
get outputs() {
|
|
199
|
+
if (this.type === sdk_core_1.TransactionType.addValidator) {
|
|
200
|
+
const addValidatorTx = this.avaxPTransaction;
|
|
201
|
+
return [
|
|
202
|
+
{
|
|
203
|
+
address: addValidatorTx.getNodeIDString(),
|
|
204
|
+
value: addValidatorTx.getStakeAmount().toString(),
|
|
205
|
+
},
|
|
206
|
+
];
|
|
207
|
+
}
|
|
208
|
+
// general support any transaction type, but it's scoped yet
|
|
209
|
+
return this.avaxPTransaction.getOuts().map((output) => {
|
|
210
|
+
const amountOutput = output.getOutput();
|
|
211
|
+
const address = amountOutput
|
|
212
|
+
.getAddresses()
|
|
213
|
+
.map((a) => utils_1.default.addressToString(this._network.hrp, this._network.alias, a))
|
|
214
|
+
.join(', ');
|
|
215
|
+
return {
|
|
216
|
+
value: amountOutput.getAmount().toString(),
|
|
217
|
+
address,
|
|
218
|
+
};
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Avax wrapper to create signature and return it for credentials
|
|
223
|
+
* @param prv
|
|
224
|
+
* @return hexstring
|
|
225
|
+
*/
|
|
226
|
+
createSignature(prv) {
|
|
227
|
+
const signval = utils_1.default.createSignatureAvaxBuffer(this._network, avalanche_1.Buffer.from(this.signablePayload), avalanche_1.Buffer.from(prv));
|
|
228
|
+
return signval.toString('hex');
|
|
229
|
+
}
|
|
230
|
+
/** @inheritdoc */
|
|
231
|
+
explainTransaction() {
|
|
232
|
+
const txJson = this.toJson();
|
|
233
|
+
const displayOrder = ['id', 'outputAmount', 'changeAmount', 'outputs', 'changeOutputs', 'fee', 'type'];
|
|
234
|
+
return {
|
|
235
|
+
displayOrder,
|
|
236
|
+
id: txJson.id,
|
|
237
|
+
outputs: txJson.outputs.map((o) => ({ address: o.address, amount: o.value, memo: txJson.memo })),
|
|
238
|
+
outputAmount: txJson.outputs.reduce((p, n) => p.add(new avalanche_1.BN(n.value)), new avalanche_1.BN(0)).toString(),
|
|
239
|
+
changeOutputs: [],
|
|
240
|
+
changeAmount: '0',
|
|
241
|
+
fee: { fee: this._txFee.toString() },
|
|
242
|
+
type: txJson.type,
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
exports.Transaction = Transaction;
|
|
247
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3RyYW5zYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQSw4Q0FPeUI7QUFDekIsdUNBQW9DO0FBR3BDLHlDQUErRDtBQUMvRCxvREFBNEI7QUFDNUIsd0RBQTBDO0FBVzFDLFNBQVMsZ0JBQWdCLENBQUMsQ0FBUztJQUNqQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ25ELENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyx5QkFBeUIsQ0FBQyxVQUFpQztJQUNsRSxJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO1FBQzFELG9CQUFvQjtRQUNwQixPQUFPLFVBQVUsR0FBRyxFQUFFLE9BQU87WUFDM0IsSUFBSTtnQkFDRixJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQztvQkFBRSxPQUFPLEtBQUssQ0FBQztnQkFDL0MsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ3BDLE9BQU8sR0FBRyxLQUFLLE9BQU8sQ0FBQzthQUN4QjtZQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUNWLE9BQU8sS0FBSyxDQUFDO2FBQ2Q7UUFDSCxDQUFDLENBQUM7S0FDSDtTQUFNO1FBQ0wsd0JBQXdCO1FBQ3hCLE9BQU8sVUFBVSxHQUFHLEVBQUUsT0FBTztZQUMzQixJQUFJLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUM7Z0JBQUUsT0FBTyxJQUFJLENBQUM7WUFD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QUksRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUNoRyxZQUFZLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksY0FBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksY0FBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFO1lBQzNGLGFBQWEsRUFBRSxFQUFFO1lBQ2pCLFlBQVksRUFBRSxHQUFHO1lBQ2pCLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxFQUFFO1lBQ3BDLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTtTQUNsQixDQUFDO0lBQ0osQ0FBQztDQUNGO0FBL01ELGtDQStNQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEF2YWxhbmNoZU5ldHdvcmssIEJhc2VDb2luIGFzIENvaW5Db25maWcgfSBmcm9tICdAYml0Z28vc3RhdGljcyc7XG5pbXBvcnQge1xuICBCYXNlS2V5LFxuICBCYXNlVHJhbnNhY3Rpb24sXG4gIEVudHJ5LFxuICBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcixcbiAgU2lnbmluZ0Vycm9yLFxuICBUcmFuc2FjdGlvblR5cGUsXG59IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgeyBLZXlQYWlyIH0gZnJvbSAnLi9rZXlQYWlyJztcbmltcG9ydCB7IERlY29kZWRVdHhvT2JqLCBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uLCBUeERhdGEgfSBmcm9tICcuL2lmYWNlJztcbmltcG9ydCB7IEFkZFZhbGlkYXRvclR4LCBBbW91bnRPdXRwdXQsIEJhc2VUeCwgVHggfSBmcm9tICdhdmFsYW5jaGUvZGlzdC9hcGlzL3BsYXRmb3Jtdm0nO1xuaW1wb3J0IHsgQmluVG9vbHMsIEJOLCBCdWZmZXIgYXMgQnVmZmVyQXZheCB9IGZyb20gJ2F2YWxhbmNoZSc7XG5pbXBvcnQgdXRpbHMgZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgKiBhcyBjcmVhdGVIYXNoIGZyb20gJ2NyZWF0ZS1oYXNoJztcbmltcG9ydCB7IENyZWRlbnRpYWwgfSBmcm9tICdhdmFsYW5jaGUvZGlzdC9jb21tb24nO1xuXG4vLyByZWdpb24gdXRpbHMgdG8gc2lnblxuaW50ZXJmYWNlIHNpZ25hdHVyZVNlcmlhbGl6ZWQge1xuICBieXRlczogc3RyaW5nO1xufVxuaW50ZXJmYWNlIENoZWNrU2lnbmF0dXJlIHtcbiAgKHNpZ2F0dXJlOiBzaWduYXR1cmVTZXJpYWxpemVkLCBhZGRyZXNzSGV4OiBzdHJpbmcpOiBib29sZWFuO1xufVxuXG5mdW5jdGlvbiBpc0VtcHR5U2lnbmF0dXJlKHM6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gISFzICYmIHMuc3RhcnRzV2l0aCgnJy5wYWRTdGFydCg5MCwgJzAnKSk7XG59XG5cbi8qKlxuICogU2lnbmF0dXJlcyBhcmUgcHJlc3RvcmUgYXMgZW1wdHkgYnVmZmVyIGZvciBoc20gYW5kIGFkZHJlc3Mgb2Ygc2lnbmFyIGZvciBmaXJzdCBzaWduYXR1cmUuXG4gKiBXaGVuIHNpZ24gaXMgcmVxdWlyZWQsIHRoaXMgbWV0aG9kIHJldHVybiB0aGUgZnVuY3Rpb24gdGhhdCBpZGVudGlmeSBhIHNpZ25hdHVyZSB0byBiZSByZXBsYWNlZC5cbiAqIEBwYXJhbSBzaWduYXR1cmVzIGFueSBzaWduYXR1cmVzIGFzIHNhbXBsZXMgdG8gaWRlbnRpZnkgd2hpY2ggc2lnbmF0dXJlIHJlcXVpcmVkIHJlcGxhY2UuXG4gKi9cbmZ1bmN0aW9uIGdlbmVyYXRlU2VsZWN0b3JTaWduYXR1cmUoc2lnbmF0dXJlczogc2lnbmF0dXJlU2VyaWFsaXplZFtdKTogQ2hlY2tTaWduYXR1cmUge1xuICBpZiAoc2lnbmF0dXJlcy5ldmVyeSgoc2lnKSA9PiBpc0VtcHR5U2lnbmF0dXJlKHNpZy5ieXRlcykpKSB7XG4gICAgLy8gTG9vayBmb3IgYWRkcmVzcy5cbiAgICByZXR1cm4gZnVuY3Rpb24gKHNpZywgYWRkcmVzcyk6IGJvb2xlYW4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFpc0VtcHR5U2lnbmF0dXJlKHNpZy5ieXRlcykpIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3QgcHViID0gc2lnLmJ5dGVzLnN1YnN0cmluZyg5MCk7XG4gICAgICAgIHJldHVybiBwdWIgPT09IGFkZHJlc3M7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIC8vIExvb2sgZm9yIGVtcHR5IHN0cmluZ1xuICAgIHJldHVybiBmdW5jdGlvbiAoc2lnLCBhZGRyZXNzKTogYm9vbGVhbiB7XG4gICAgICBpZiAoaXNFbXB0eVNpZ25hdHVyZShzaWcuYnl0ZXMpKSByZXR1cm4gdHJ1ZTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICB9XG59XG4vLyBlbmQgcmVnaW9uIHV0aWxzIGZvciBzaWduXG5cbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvbiBleHRlbmRzIEJhc2VUcmFuc2FjdGlvbiB7XG4gIHByb3RlY3RlZCBfYXZheHBUcmFuc2FjdGlvbjogVHg7XG4gIHB1YmxpYyBfdHlwZTogVHJhbnNhY3Rpb25UeXBlO1xuICBwdWJsaWMgX25ldHdvcms6IEF2YWxhbmNoZU5ldHdvcms7XG4gIHB1YmxpYyBfbmV0d29ya0lEOiBudW1iZXI7XG4gIHB1YmxpYyBfYXNzZXRJZDogQnVmZmVyQXZheDtcbiAgcHVibGljIF9ibG9ja2NoYWluSUQ6IEJ1ZmZlckF2YXg7XG4gIHB1YmxpYyBfbWVtbz86IEJ1ZmZlckF2YXg7XG4gIHB1YmxpYyBfdGhyZXNob2xkID0gMjtcbiAgcHVibGljIF9sb2NrdGltZTogQk4gPSBuZXcgQk4oMCk7XG4gIHB1YmxpYyBfZnJvbUFkZHJlc3NlczogQnVmZmVyQXZheFtdID0gW107XG4gIHB1YmxpYyBfdXR4b3M6IERlY29kZWRVdHhvT2JqW10gPSBbXTtcbiAgcHVibGljIF90eEZlZTogQk47XG5cbiAgY29uc3RydWN0b3IoY29pbkNvbmZpZzogUmVhZG9ubHk8Q29pbkNvbmZpZz4pIHtcbiAgICBzdXBlcihjb2luQ29uZmlnKTtcbiAgICB0aGlzLl9uZXR3b3JrID0gY29pbkNvbmZpZy5uZXR3b3JrIGFzIEF2YWxhbmNoZU5ldHdvcms7XG4gICAgdGhpcy5fYXNzZXRJZCA9IHV0aWxzLmNiNThEZWNvZGUodGhpcy5fbmV0d29yay5hdmF4QXNzZXRJRCk7XG4gICAgdGhpcy5fYmxvY2tjaGFpbklEID0gdXRpbHMuY2I1OERlY29kZSh0aGlzLl9uZXR3b3JrLmJsb2NrY2hhaW5JRCk7XG4gICAgdGhpcy5fbmV0d29ya0lEID0gdGhpcy5fbmV0d29yay5uZXR3b3JrSUQ7XG4gICAgdGhpcy5fdHhGZWUgPSBuZXcgQk4odGhpcy5fbmV0d29yay50eEZlZS50b1N0cmluZygpKTtcbiAgfVxuXG4gIGdldCBhdmF4UFRyYW5zYWN0aW9uKCk6IEJhc2VUeCB7XG4gICAgcmV0dXJuIHRoaXMuX2F2YXhwVHJhbnNhY3Rpb24uZ2V0VW5zaWduZWRUeCgpLmdldFRyYW5zYWN0aW9uKCk7XG4gIH1cblxuICBnZXQgc2lnbmF0dXJlKCk6IHN0cmluZ1tdIHtcbiAgICBpZiAodGhpcy5jcmVkZW50aWFscy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgY29uc3Qgb2JqOiBhbnkgPSB0aGlzLmNyZWRlbnRpYWxzWzBdLnNlcmlhbGl6ZSgpO1xuICAgIHJldHVybiBvYmouc2lnQXJyYXkubWFwKChzKSA9PiBzLmJ5dGVzKS5maWx0ZXIoKHMpID0+ICFpc0VtcHR5U2lnbmF0dXJlKHMpKTtcbiAgfVxuXG4gIGdldCBjcmVkZW50aWFscygpOiBDcmVkZW50aWFsW10ge1xuICAgIHJldHVybiB0aGlzLl9hdmF4cFRyYW5zYWN0aW9uLmdldENyZWRlbnRpYWxzKCk7XG4gIH1cblxuICBnZXQgaGFzQ3JlZGVudGlhbHMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlZGVudGlhbHMgIT09IHVuZGVmaW5lZCAmJiB0aGlzLmNyZWRlbnRpYWxzLmxlbmd0aCA+IDA7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgY2FuU2lnbih7IGtleSB9OiBCYXNlS2V5KTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGtwID0gbmV3IEtleVBhaXIoeyBwcnY6IGtleSB9KTtcbiAgICAgIGNvbnN0IHByaXZhdGVLZXkgPSBrcC5nZXRQcml2YXRlS2V5KCk7XG4gICAgICBpZiAoIXByaXZhdGVLZXkpIHJldHVybiBmYWxzZTtcbiAgICAgIGNvbnN0IGFkZHJlc3MgPSB1dGlscy5wYXJzZUFkZHJlc3Moa3AuZ2V0QXZheFBBZGRyZXNzKHRoaXMuX25ldHdvcmsuaHJwKSk7XG4gICAgICByZXR1cm4gdGhpcy5fZnJvbUFkZHJlc3Nlcy5maW5kKChhKSA9PiBhZGRyZXNzLmVxdWFscyhhKSkgIT09IHVuZGVmaW5lZDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2lnbiBhIGF2YXhwIHRyYW5zYWN0aW9uIGFuZCB1cGRhdGUgdGhlIHRyYW5zYWN0aW9uIGhleFxuICAgKiB2YWxpZGF0b3IsIGRlbGVnYXRvciwgaW1wb3J0LCBleHBvcnRzIGV4dGVuZCBiYXNlVHhcbiAgICogdW5zaWduZWRUeDogVW5zaWduZWRUeCA9IG5ldyBVbnNpZ25lZFR4KGJhc2VUeCkgIChiYXNlVHggPSBhZGRWYWxpZGF0b3JUeClcbiAgICogY29uc3QgdHg6IFR4ID0gdW5zaWduZWRUeC5zaWduKGtleWNoYWluKSAodHggaXMgdHlwZSBzdGFuZGFyZCBzaWduZWQgdHgpXG4gICAqIGdldCBiYXNlVHggdGhlbiBjcmVhdGUgbmV3IHVuc2lnbmVkVHggdGhlbiBzaWduXG4gICAqXG4gICAqIEBwYXJhbSB7S2V5UGFpcn0ga2V5UGFpclxuICAgKi9cbiAgc2lnbihrZXlQYWlyOiBLZXlQYWlyKTogdm9pZCB7XG4gICAgY29uc3QgcHJ2ID0ga2V5UGFpci5nZXRQcml2YXRlS2V5KCk7XG4gICAgY29uc3QgYWRkcmVzc0hleCA9IGtleVBhaXIuZ2V0QWRkcmVzc0J1ZmZlcigpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICBpZiAoIXBydikge1xuICAgICAgdGhyb3cgbmV3IFNpZ25pbmdFcnJvcignTWlzc2luZyBwcml2YXRlIGtleScpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuYXZheFBUcmFuc2FjdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdlbXB0eSB0cmFuc2FjdGlvbiB0byBzaWduJyk7XG4gICAgfVxuICAgIGlmICghdGhpcy5oYXNDcmVkZW50aWFscykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdlbXB0eSBjcmVkZW50aWFscyB0byBzaWduJyk7XG4gICAgfVxuICAgIGNvbnN0IHNpZ25hdHVyZSA9IHRoaXMuY3JlYXRlU2lnbmF0dXJlKHBydik7XG4gICAgbGV0IGNoZWNrU2lnbjogQ2hlY2tTaWduYXR1cmUgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5jcmVkZW50aWFscy5mb3JFYWNoKChjKSA9PiB7XG4gICAgICBjb25zdCBjczogYW55ID0gYy5zZXJpYWxpemUoKTtcbiAgICAgIGlmIChjaGVja1NpZ24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjaGVja1NpZ24gPSBnZW5lcmF0ZVNlbGVjdG9yU2lnbmF0dXJlKGNzLnNpZ0FycmF5KTtcbiAgICAgIH1cbiAgICAgIGNzLnNpZ0FycmF5LmZvckVhY2goKHNpZykgPT4ge1xuICAgICAgICBpZiAoY2hlY2tTaWduICYmIGNoZWNrU2lnbihzaWcsIGFkZHJlc3NIZXgpKSB7XG4gICAgICAgICAgc2lnLmJ5dGVzID0gc2lnbmF0dXJlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGMuZGVzZXJpYWxpemUoY3MpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIC8qKlxuICAgKiBzaG91bGQgYmUgb2Ygc2lnbmVkVHggZG9pbmcgdGhpcyB3aXRoIGJhc2VUeFxuICAgKi9cbiAgdG9Ccm9hZGNhc3RGb3JtYXQoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuYXZheFBUcmFuc2FjdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdFbXB0eSB0cmFuc2FjdGlvbiBkYXRhJyk7XG4gICAgfVxuICAgIGNvbnN0IGJpbnRvb2xzID0gQmluVG9vbHMuZ2V0SW5zdGFuY2UoKTtcbiAgICByZXR1cm4gYmludG9vbHMuYWRkQ2hlY2tzdW0odGhpcy5fYXZheHBUcmFuc2FjdGlvbi50b0J1ZmZlcigpKS50b1N0cmluZygnaGV4Jyk7XG4gIH1cblxuICAvLyB0eXBlcyAtIHN0YWtpbmdUcmFuc2FjdGlvbiwgaW1wb3J0LCBleHBvcnRcbiAgdG9Kc29uKCk6IFR4RGF0YSB7XG4gICAgaWYgKCF0aGlzLmF2YXhQVHJhbnNhY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignRW1wdHkgdHJhbnNhY3Rpb24gZGF0YScpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICBmcm9tQWRkcmVzc2VzOiB0aGlzLmZyb21BZGRyZXNzZXMsXG4gICAgICB0aHJlc2hvbGQ6IHRoaXMuX3RocmVzaG9sZCxcbiAgICAgIGxvY2t0aW1lOiB0aGlzLl9sb2NrdGltZS50b1N0cmluZygpLFxuICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgbWVtbzogdXRpbHMuYnVmZmVyVG9TdHJpbmcodGhpcy5hdmF4UFRyYW5zYWN0aW9uLmdldE1lbW8oKSksXG4gICAgICBzaWduYXR1cmVzOiB0aGlzLnNpZ25hdHVyZSxcbiAgICAgIG91dHB1dHM6IHRoaXMub3V0cHV0cyxcbiAgICB9O1xuICB9XG5cbiAgc2V0VHJhbnNhY3Rpb24odHg6IFR4KTogdm9pZCB7XG4gICAgdGhpcy5fYXZheHBUcmFuc2FjdGlvbiA9IHR4O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgdHJhbnNhY3Rpb24gdHlwZVxuICAgKlxuICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uVHlwZX0gdHJhbnNhY3Rpb25UeXBlIFRoZSB0cmFuc2FjdGlvbiB0eXBlIHRvIGJlIHNldFxuICAgKi9cbiAgc2V0VHJhbnNhY3Rpb25UeXBlKHRyYW5zYWN0aW9uVHlwZTogVHJhbnNhY3Rpb25UeXBlKTogdm9pZCB7XG4gICAgdGhpcy5fdHlwZSA9IHRyYW5zYWN0aW9uVHlwZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBwb3J0aW9uIG9mIHRoZSB0cmFuc2FjdGlvbiB0aGF0IG5lZWRzIHRvIGJlIHNpZ25lZCBpbiBCdWZmZXIgZm9ybWF0LlxuICAgKiBPbmx5IG5lZWRlZCBmb3IgY29pbnMgdGhhdCBzdXBwb3J0IGFkZGluZyBzaWduYXR1cmVzIGRpcmVjdGx5IChlLmcuIFRTUykuXG4gICAqL1xuICBnZXQgc2lnbmFibGVQYXlsb2FkKCk6IEJ1ZmZlciB7XG4gICAgY29uc3QgdHhidWZmID0gdGhpcy5fYXZheHBUcmFuc2FjdGlvbi5nZXRVbnNpZ25lZFR4KCkudG9CdWZmZXIoKTtcbiAgICByZXR1cm4gY3JlYXRlSGFzaC5kZWZhdWx0KCdzaGEyNTYnKS51cGRhdGUodHhidWZmKS5kaWdlc3QoKTtcbiAgfVxuXG4gIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB1dGlscy5jYjU4RW5jb2RlKEJ1ZmZlckF2YXguZnJvbSh1dGlscy5zaGEyNTYoQnVmZmVyQXZheC5mcm9tKHRoaXMudG9Ccm9hZGNhc3RGb3JtYXQoKSwgJ2hleCcpKSkpO1xuICB9XG5cbiAgZ2V0IGZyb21BZGRyZXNzZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLl9mcm9tQWRkcmVzc2VzLm1hcCgoYSkgPT4gdXRpbHMuYWRkcmVzc1RvU3RyaW5nKHRoaXMuX25ldHdvcmsuaHJwLCB0aGlzLl9uZXR3b3JrLmFsaWFzLCBhKSk7XG4gIH1cbiAgLyoqXG4gICAqIEdldCB0aGUgbGlzdCBvZiBvdXRwdXRzLiBBbW91bnRzIGFyZSBleHByZXNzZWQgaW4gYWJzb2x1dGUgdmFsdWUuXG4gICAqL1xuICBnZXQgb3V0cHV0cygpOiBFbnRyeVtdIHtcbiAgICBpZiAodGhpcy50eXBlID09PSBUcmFuc2FjdGlvblR5cGUuYWRkVmFsaWRhdG9yKSB7XG4gICAgICBjb25zdCBhZGRWYWxpZGF0b3JUeCA9IHRoaXMuYXZheFBUcmFuc2FjdGlvbiBhcyBBZGRWYWxpZGF0b3JUeDtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIHtcbiAgICAgICAgICBhZGRyZXNzOiBhZGRWYWxpZGF0b3JUeC5nZXROb2RlSURTdHJpbmcoKSxcbiAgICAgICAgICB2YWx1ZTogYWRkVmFsaWRhdG9yVHguZ2V0U3Rha2VBbW91bnQoKS50b1N0cmluZygpLFxuICAgICAgICB9LFxuICAgICAgXTtcbiAgICB9XG4gICAgLy8gZ2VuZXJhbCBzdXBwb3J0IGFueSB0cmFuc2FjdGlvbiB0eXBlLCBidXQgaXQncyBzY29wZWQgeWV0XG4gICAgcmV0dXJuIHRoaXMuYXZheFBUcmFuc2FjdGlvbi5nZXRPdXRzKCkubWFwKChvdXRwdXQpID0+IHtcbiAgICAgIGNvbnN0IGFtb3VudE91dHB1dCA9IG91dHB1dC5nZXRPdXRwdXQoKSBhcyBhbnkgYXMgQW1vdW50T3V0cHV0O1xuICAgICAgY29uc3QgYWRkcmVzcyA9IGFtb3VudE91dHB1dFxuICAgICAgICAuZ2V0QWRkcmVzc2VzKClcbiAgICAgICAgLm1hcCgoYSkgPT4gdXRpbHMuYWRkcmVzc1RvU3RyaW5nKHRoaXMuX25ldHdvcmsuaHJwLCB0aGlzLl9uZXR3b3JrLmFsaWFzLCBhKSlcbiAgICAgICAgLmpvaW4oJywgJyk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogYW1vdW50T3V0cHV0LmdldEFtb3VudCgpLnRvU3RyaW5nKCksXG4gICAgICAgIGFkZHJlc3MsXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEF2YXggd3JhcHBlciB0byBjcmVhdGUgc2lnbmF0dXJlIGFuZCByZXR1cm4gaXQgZm9yIGNyZWRlbnRpYWxzXG4gICAqIEBwYXJhbSBwcnZcbiAgICogQHJldHVybiBoZXhzdHJpbmdcbiAgICovXG4gIGNyZWF0ZVNpZ25hdHVyZShwcnY6IEJ1ZmZlcik6IHN0cmluZyB7XG4gICAgY29uc3Qgc2lnbnZhbCA9IHV0aWxzLmNyZWF0ZVNpZ25hdHVyZUF2YXhCdWZmZXIoXG4gICAgICB0aGlzLl9uZXR3b3JrLFxuICAgICAgQnVmZmVyQXZheC5mcm9tKHRoaXMuc2lnbmFibGVQYXlsb2FkKSxcbiAgICAgIEJ1ZmZlckF2YXguZnJvbShwcnYpXG4gICAgKTtcbiAgICByZXR1cm4gc2lnbnZhbC50b1N0cmluZygnaGV4Jyk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgZXhwbGFpblRyYW5zYWN0aW9uKCk6IFRyYW5zYWN0aW9uRXhwbGFuYXRpb24ge1xuICAgIGNvbnN0IHR4SnNvbiA9IHRoaXMudG9Kc29uKCk7XG4gICAgY29uc3QgZGlzcGxheU9yZGVyID0gWydpZCcsICdvdXRwdXRBbW91bnQnLCAnY2hhbmdlQW1vdW50JywgJ291dHB1dHMnLCAnY2hhbmdlT3V0cHV0cycsICdmZWUnLCAndHlwZSddO1xuICAgIHJldHVybiB7XG4gICAgICBkaXNwbGF5T3JkZXIsXG4gICAgICBpZDogdHhKc29uLmlkLFxuICAgICAgb3V0cHV0czogdHhKc29uLm91dHB1dHMubWFwKChvKSA9PiAoeyBhZGRyZXNzOiBvLmFkZHJlc3MsIGFtb3VudDogby52YWx1ZSwgbWVtbzogdHhKc29uLm1lbW8gfSkpLFxuICAgICAgb3V0cHV0QW1vdW50OiB0eEpzb24ub3V0cHV0cy5yZWR1Y2UoKHAsIG4pID0+IHAuYWRkKG5ldyBCTihuLnZhbHVlKSksIG5ldyBCTigwKSkudG9TdHJpbmcoKSxcbiAgICAgIGNoYW5nZU91dHB1dHM6IFtdLCAvLyBhY2NvdW50IGJhc2VkIGRvZXMgbm90IHVzZSBjaGFuZ2Ugb3V0cHV0c1xuICAgICAgY2hhbmdlQW1vdW50OiAnMCcsIC8vIGFjY291bnQgYmFzZSBkb2VzIG5vdCBtYWtlIGNoYW5nZVxuICAgICAgZmVlOiB7IGZlZTogdGhpcy5fdHhGZWUudG9TdHJpbmcoKSB9LFxuICAgICAgdHlwZTogdHhKc29uLnR5cGUsXG4gICAgfTtcbiAgfVxufVxuIl19
|
|
@@ -1,26 +1,22 @@
|
|
|
1
1
|
/// <reference types="bn.js" />
|
|
2
|
-
import {
|
|
2
|
+
import { BaseCoin as CoinConfig } from '@bitgo/statics';
|
|
3
3
|
import BigNumber from 'bignumber.js';
|
|
4
|
-
import { BaseAddress, BaseKey, BaseTransactionBuilder, TransactionType } from '@bitgo/sdk-core';
|
|
4
|
+
import { BaseAddress, BaseKey, BaseTransactionBuilder, TransactionType, BaseTransaction } from '@bitgo/sdk-core';
|
|
5
5
|
import { Transaction } from './transaction';
|
|
6
6
|
import { KeyPair } from './keyPair';
|
|
7
|
-
import { BN
|
|
8
|
-
import { BaseTx } from 'avalanche/dist/apis/platformvm/basetx';
|
|
7
|
+
import { BN } from 'avalanche';
|
|
9
8
|
import { DecodedUtxoObj } from './iface';
|
|
9
|
+
import { Tx } from 'avalanche/dist/apis/platformvm';
|
|
10
10
|
export declare abstract class TransactionBuilder extends BaseTransactionBuilder {
|
|
11
11
|
private _transaction;
|
|
12
|
-
|
|
13
|
-
protected
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
protected _fromPubKeys: Buffer[];
|
|
21
|
-
protected _utxos: DecodedUtxoObj[];
|
|
22
|
-
protected _txFee: BN;
|
|
23
|
-
private _credentials;
|
|
12
|
+
_signer: KeyPair[];
|
|
13
|
+
protected recoverSigner: boolean;
|
|
14
|
+
/**
|
|
15
|
+
* When using recovery key must be set here
|
|
16
|
+
* TODO: STLX-17317 recovery key signing
|
|
17
|
+
* @param recoverSigner
|
|
18
|
+
*/
|
|
19
|
+
recoverMode(recoverSigner?: boolean): this;
|
|
24
20
|
constructor(_coinConfig: Readonly<CoinConfig>);
|
|
25
21
|
/**
|
|
26
22
|
* commented out check until multisig signing is in effect
|
|
@@ -43,18 +39,20 @@ export declare abstract class TransactionBuilder extends BaseTransactionBuilder
|
|
|
43
39
|
*
|
|
44
40
|
* @param {Transaction} tx the transaction data
|
|
45
41
|
*/
|
|
46
|
-
initBuilder(tx
|
|
42
|
+
initBuilder(tx: Tx): this;
|
|
47
43
|
/** @inheritdoc */
|
|
48
44
|
protected fromImplementation(rawTransaction: string): Transaction;
|
|
45
|
+
get hasSigner(): boolean;
|
|
49
46
|
/** @inheritdoc */
|
|
50
47
|
protected buildImplementation(): Promise<Transaction>;
|
|
51
48
|
/**
|
|
52
|
-
* Builds the avaxp transaction
|
|
53
|
-
* @return {Transaction} avaxp sdk transaction
|
|
49
|
+
* Builds the avaxp transaction. transaction field is changed.
|
|
54
50
|
*/
|
|
55
|
-
protected abstract buildAvaxpTransaction():
|
|
51
|
+
protected abstract buildAvaxpTransaction(): void;
|
|
56
52
|
/** @inheritdoc */
|
|
57
53
|
protected get transaction(): Transaction;
|
|
54
|
+
protected set transaction(transaction: Transaction);
|
|
55
|
+
protected signImplementation({ key }: BaseKey): BaseTransaction;
|
|
58
56
|
protected abstract get transactionType(): TransactionType;
|
|
59
57
|
/**
|
|
60
58
|
* Validates the threshold
|
|
@@ -69,8 +67,13 @@ export declare abstract class TransactionBuilder extends BaseTransactionBuilder
|
|
|
69
67
|
/** @inheritdoc */
|
|
70
68
|
validateAddress(address: BaseAddress, addressFormat?: string): void;
|
|
71
69
|
/** @inheritdoc */
|
|
72
|
-
validateKey(key: BaseKey): void;
|
|
73
|
-
/**
|
|
70
|
+
validateKey({ key }: BaseKey): void;
|
|
71
|
+
/**
|
|
72
|
+
* Check the raw transaction has a valid format in the blockchain context, throw otherwise.
|
|
73
|
+
* It overrides abstract method from BaseTransactionBuilder
|
|
74
|
+
*
|
|
75
|
+
* @param rawTransaction Transaction in any format
|
|
76
|
+
*/
|
|
74
77
|
validateRawTransaction(rawTransaction: string): void;
|
|
75
78
|
/** @inheritdoc */
|
|
76
79
|
validateTransaction(transaction?: Transaction): void;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transactionBuilder.d.ts","sourceRoot":"","sources":["../../../src/lib/transactionBuilder.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,SAAS,MAAM,cAAc,CAAC;AACrC,OAAO,EAEL,WAAW,EACX,OAAO,EACP,sBAAsB,EACtB,eAAe,EAEf,eAAe,EAChB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,EAAE,EAAwB,MAAM,WAAW,CAAC;AAErD,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AAEpD,8BAAsB,kBAAmB,SAAQ,sBAAsB;IACrE,OAAO,CAAC,YAAY,CAAc;IAC3B,OAAO,EAAE,OAAO,EAAE,CAAM;IAC/B,SAAS,CAAC,aAAa,UAAS;IAEhC;;;;OAIG;IACI,WAAW,CAAC,aAAa,UAAO,GAAG,IAAI;gBAKlC,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC;IAK7C;;;;OAIG;IAEH,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAM9B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAMtC,UAAU,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI;IAMjD,KAAK,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,IAAI;IAKpC;;;;;OAKG;IACH,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAKzB;;;;OAIG;IACH,WAAW,CAAC,EAAE,EAAE,EAAE,GAAG,IAAI;IAqBzB,kBAAkB;IAClB,SAAS,CAAC,kBAAkB,CAAC,cAAc,EAAE,MAAM,GAAG,WAAW;IAOjE,IAAI,SAAS,IAAI,OAAO,CAEvB;IACD,kBAAkB;cACF,mBAAmB,IAAI,OAAO,CAAC,WAAW,CAAC;IAS3D;;OAEG;IACH,SAAS,CAAC,QAAQ,CAAC,qBAAqB,IAAI,IAAI;IAGhD,kBAAkB;IAClB,SAAS,KAAK,WAAW,IAAI,WAAW,CAEvC;IACD,SAAS,KAAK,WAAW,CAAC,WAAW,EAAE,WAAW,EAEjD;IAED,SAAS,CAAC,kBAAkB,CAAC,EAAE,GAAG,EAAE,EAAE,OAAO,GAAG,eAAe;IAK/D,SAAS,CAAC,QAAQ,KAAK,eAAe,IAAI,eAAe,CAAC;IAM1D;;;OAGG;IACH,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAM1C;;;OAGG;IACH,gBAAgB,CAAC,QAAQ,EAAE,EAAE,GAAG,IAAI;IAMpC,kBAAkB;IAClB,eAAe,CAAC,OAAO,EAAE,WAAW,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI;IAInE,kBAAkB;IAClB,WAAW,CAAC,EAAE,GAAG,EAAE,EAAE,OAAO,GAAG,IAAI;IAMnC;;;;;OAKG;IACH,sBAAsB,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI;IAIpD,kBAAkB;IAClB,mBAAmB,CAAC,WAAW,CAAC,EAAE,WAAW,GAAG,IAAI;IAIpD,kBAAkB;IAClB,aAAa,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAMrC,aAAa,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,IAAI;IAO7C,YAAY,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI;CAO1C"}
|