@bitgo-beta/abstract-eth 1.0.2-beta.51 → 1.0.2-beta.510
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 +1220 -0
- package/dist/src/abstractEthLikeCoin.d.ts +10 -5
- package/dist/src/abstractEthLikeCoin.d.ts.map +1 -1
- package/dist/src/abstractEthLikeCoin.js +13 -10
- package/dist/src/abstractEthLikeNewCoins.d.ts +635 -0
- package/dist/src/abstractEthLikeNewCoins.d.ts.map +1 -0
- package/dist/src/abstractEthLikeNewCoins.js +1842 -0
- package/dist/src/ethLikeToken.d.ts +27 -4
- package/dist/src/ethLikeToken.d.ts.map +1 -1
- package/dist/src/ethLikeToken.js +254 -7
- package/dist/src/index.d.ts +2 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +3 -1
- package/dist/src/lib/contractCall.d.ts +8 -0
- package/dist/src/lib/contractCall.d.ts.map +1 -0
- package/dist/src/lib/contractCall.js +17 -0
- package/dist/src/lib/iface.d.ts +131 -0
- package/dist/src/lib/iface.d.ts.map +1 -0
- package/dist/src/lib/iface.js +8 -0
- package/dist/src/lib/index.d.ts +15 -0
- package/dist/src/lib/index.d.ts.map +1 -0
- package/dist/src/lib/index.js +42 -0
- package/dist/src/lib/keyPair.d.ts +26 -0
- package/dist/src/lib/keyPair.d.ts.map +1 -0
- package/dist/src/lib/keyPair.js +66 -0
- package/dist/src/lib/transaction.d.ts +64 -0
- package/dist/src/lib/transaction.d.ts.map +1 -0
- package/dist/src/lib/transaction.js +137 -0
- package/dist/src/lib/transactionBuilder.d.ts +239 -0
- package/dist/src/lib/transactionBuilder.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilder.js +708 -0
- package/dist/src/lib/transferBuilder.d.ts +67 -0
- package/dist/src/lib/transferBuilder.d.ts.map +1 -0
- package/dist/src/lib/transferBuilder.js +242 -0
- package/dist/src/lib/transferBuilders/baseNFTTransferBuilder.d.ts +52 -0
- package/dist/src/lib/transferBuilders/baseNFTTransferBuilder.d.ts.map +1 -0
- package/dist/src/lib/transferBuilders/baseNFTTransferBuilder.js +114 -0
- package/dist/src/lib/transferBuilders/index.d.ts +4 -0
- package/dist/src/lib/transferBuilders/index.d.ts.map +1 -0
- package/dist/src/lib/transferBuilders/index.js +16 -0
- package/dist/src/lib/transferBuilders/transferBuilderERC1155.d.ts +16 -0
- package/dist/src/lib/transferBuilders/transferBuilderERC1155.d.ts.map +1 -0
- package/dist/src/lib/transferBuilders/transferBuilderERC1155.js +93 -0
- package/dist/src/lib/transferBuilders/transferBuilderERC721.d.ts +15 -0
- package/dist/src/lib/transferBuilders/transferBuilderERC721.d.ts.map +1 -0
- package/dist/src/lib/transferBuilders/transferBuilderERC721.js +78 -0
- package/dist/src/lib/types.d.ts +39 -0
- package/dist/src/lib/types.d.ts.map +1 -0
- package/dist/src/lib/types.js +137 -0
- package/dist/src/lib/utils.d.ts +260 -0
- package/dist/src/lib/utils.d.ts.map +1 -0
- package/dist/src/lib/utils.js +650 -0
- package/dist/src/lib/walletUtil.d.ts +28 -0
- package/dist/src/lib/walletUtil.d.ts.map +1 -0
- package/dist/src/lib/walletUtil.js +31 -0
- package/dist/tsconfig.tsbuildinfo +1 -7914
- package/package.json +24 -9
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ERC1155TransferBuilder = void 0;
|
|
4
|
+
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
5
|
+
const utils_1 = require("ethers/lib/utils");
|
|
6
|
+
const contractCall_1 = require("../contractCall");
|
|
7
|
+
const utils_2 = require("../utils");
|
|
8
|
+
const walletUtil_1 = require("../walletUtil");
|
|
9
|
+
const baseNFTTransferBuilder_1 = require("./baseNFTTransferBuilder");
|
|
10
|
+
const statics_1 = require("@bitgo-beta/statics");
|
|
11
|
+
class ERC1155TransferBuilder extends baseNFTTransferBuilder_1.BaseNFTTransferBuilder {
|
|
12
|
+
constructor(serializedData) {
|
|
13
|
+
super(serializedData);
|
|
14
|
+
this.bytes(0);
|
|
15
|
+
if (serializedData) {
|
|
16
|
+
this.decodeTransferData(serializedData);
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
this._tokenIds = [];
|
|
20
|
+
this._values = [];
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
coin(coin) {
|
|
24
|
+
this._coin = statics_1.coins.get(coin);
|
|
25
|
+
this._nativeCoinOperationHashPrefix = this._coin.network.nativeCoinOperationHashPrefix;
|
|
26
|
+
return this;
|
|
27
|
+
}
|
|
28
|
+
tokenContractAddress(address) {
|
|
29
|
+
if (utils_2.isValidEthAddress(address)) {
|
|
30
|
+
this._tokenContractAddress = address;
|
|
31
|
+
return this;
|
|
32
|
+
}
|
|
33
|
+
throw new sdk_core_1.InvalidParameterValueError('Invalid address');
|
|
34
|
+
}
|
|
35
|
+
entry(tokenId, value) {
|
|
36
|
+
this._tokenIds.push(tokenId.toString());
|
|
37
|
+
this._values.push(value.toString());
|
|
38
|
+
return this;
|
|
39
|
+
}
|
|
40
|
+
bytes(bytesInNumber) {
|
|
41
|
+
this._bytes = utils_1.hexZeroPad(utils_1.hexlify(bytesInNumber), 32);
|
|
42
|
+
return this;
|
|
43
|
+
}
|
|
44
|
+
signAndBuild(chainId) {
|
|
45
|
+
this._chainId = chainId;
|
|
46
|
+
const hasMandatoryFields = this.hasMandatoryFields();
|
|
47
|
+
if (hasMandatoryFields) {
|
|
48
|
+
this._data = this.build();
|
|
49
|
+
return utils_2.sendMultiSigData(this._tokenContractAddress, '0', // dummy amount value
|
|
50
|
+
this._data, this._expirationTime, this._sequenceId, this.getSignature());
|
|
51
|
+
}
|
|
52
|
+
throw new sdk_core_1.BuildTransactionError(`Missing transfer mandatory fields.
|
|
53
|
+
Destination (to) address, source (from) address, sequenceID, the token contract address, tokenIDs and their values are mandatory`);
|
|
54
|
+
}
|
|
55
|
+
hasMandatoryFields() {
|
|
56
|
+
return (this._tokenIds !== undefined &&
|
|
57
|
+
this._tokenIds.length !== 0 &&
|
|
58
|
+
this._values.length !== 0 &&
|
|
59
|
+
this._tokenIds.length === this._values.length &&
|
|
60
|
+
this._toAddress !== undefined &&
|
|
61
|
+
this._fromAddress !== undefined &&
|
|
62
|
+
this._tokenContractAddress !== undefined &&
|
|
63
|
+
this._sequenceId !== undefined);
|
|
64
|
+
}
|
|
65
|
+
decodeTransferData(data) {
|
|
66
|
+
const transferData = utils_2.decodeERC1155TransferData(data);
|
|
67
|
+
this._toAddress = transferData.to;
|
|
68
|
+
this._fromAddress = transferData.from;
|
|
69
|
+
this._expirationTime = transferData.expireTime;
|
|
70
|
+
this._sequenceId = transferData.sequenceId;
|
|
71
|
+
this._signature = transferData.signature;
|
|
72
|
+
this._tokenContractAddress = transferData.tokenContractAddress;
|
|
73
|
+
this._tokenIds = transferData.tokenIds;
|
|
74
|
+
this._values = transferData.values;
|
|
75
|
+
if (transferData.data) {
|
|
76
|
+
this._data = transferData.data;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
build() {
|
|
80
|
+
if (this._tokenIds.length === 1) {
|
|
81
|
+
const values = [this._fromAddress, this._toAddress, this._tokenIds[0], this._values[0], this._bytes];
|
|
82
|
+
const contractCall = new contractCall_1.ContractCall(walletUtil_1.ERC1155SafeTransferTypeMethodId, walletUtil_1.ERC1155SafeTransferTypes, values);
|
|
83
|
+
return contractCall.serialize();
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
const values = [this._fromAddress, this._toAddress, this._tokenIds, this._values, this._bytes];
|
|
87
|
+
const contractCall = new contractCall_1.ContractCall(walletUtil_1.ERC1155BatchTransferTypeMethodId, walletUtil_1.ERC1155BatchTransferTypes, values);
|
|
88
|
+
return contractCall.serialize();
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
exports.ERC1155TransferBuilder = ERC1155TransferBuilder;
|
|
93
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmZXJCdWlsZGVyRVJDMTE1NS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvdHJhbnNmZXJCdWlsZGVycy90cmFuc2ZlckJ1aWxkZXJFUkMxMTU1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1EQUF5RjtBQUN6Riw0Q0FBdUQ7QUFFdkQsa0RBQStDO0FBQy9DLG9DQUEwRjtBQUMxRiw4Q0FLdUI7QUFDdkIscUVBQWtFO0FBQ2xFLGlEQUErRTtBQUUvRSxNQUFhLHNCQUF1QixTQUFRLCtDQUFzQjtJQUtoRSxZQUFZLGNBQXVCO1FBQ2pDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUN0QixJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2QsSUFBSSxjQUFjLEVBQUU7WUFDbEIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGNBQWMsQ0FBQyxDQUFDO1NBQ3pDO2FBQU07WUFDTCxJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztZQUNwQixJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztTQUNuQjtJQUNILENBQUM7SUFFRCxJQUFJLENBQUMsSUFBWTtRQUNmLElBQUksQ0FBQyxLQUFLLEdBQUcsZUFBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3QixJQUFJLENBQUMsOEJBQThCLEdBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUEwQixDQUFDLDZCQUE2QixDQUFDO1FBQzNHLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELG9CQUFvQixDQUFDLE9BQWU7UUFDbEMsSUFBSSx5QkFBaUIsQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUM5QixJQUFJLENBQUMscUJBQXFCLEdBQUcsT0FBTyxDQUFDO1lBQ3JDLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFDRCxNQUFNLElBQUkscUNBQTBCLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lB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QUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDckcsTUFBTSxZQUFZLEdBQUcsSUFBSSwyQkFBWSxDQUFDLDRDQUErQixFQUFFLHFDQUF3QixFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ3pHLE9BQU8sWUFBWSxDQUFDLFNBQVMsRUFBRSxDQUFDO1NBQ2pDO2FBQU07WUFDTCxNQUFNLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQy9GLE1BQU0sWUFBWSxHQUFHLElBQUksMkJBQVksQ0FBQyw2Q0FBZ0MsRUFBRSxzQ0FBeUIsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUMzRyxPQUFPLFlBQVksQ0FBQyxTQUFTLEVBQUUsQ0FBQztTQUNqQztJQUNILENBQUM7Q0FDRjtBQXBHRCx3REFvR0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IsIEludmFsaWRQYXJhbWV0ZXJWYWx1ZUVycm9yIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgaGV4bGlmeSwgaGV4WmVyb1BhZCB9IGZyb20gJ2V0aGVycy9saWIvdXRpbHMnO1xuXG5pbXBvcnQgeyBDb250cmFjdENhbGwgfSBmcm9tICcuLi9jb250cmFjdENhbGwnO1xuaW1wb3J0IHsgZGVjb2RlRVJDMTE1NVRyYW5zZmVyRGF0YSwgaXNWYWxpZEV0aEFkZHJlc3MsIHNlbmRNdWx0aVNpZ0RhdGEgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQge1xuICBFUkMxMTU1QmF0Y2hUcmFuc2ZlclR5cGVzLFxuICBFUkMxMTU1U2FmZVRyYW5zZmVyVHlwZXMsXG4gIEVSQzExNTVCYXRjaFRyYW5zZmVyVHlwZU1ldGhvZElkLFxuICBFUkMxMTU1U2FmZVRyYW5zZmVyVHlwZU1ldGhvZElkLFxufSBmcm9tICcuLi93YWxsZXRVdGlsJztcbmltcG9ydCB7IEJhc2VORlRUcmFuc2ZlckJ1aWxkZXIgfSBmcm9tICcuL2Jhc2VORlRUcmFuc2ZlckJ1aWxkZXInO1xuaW1wb3J0IHsgY29pbnMsIEV0aGVyZXVtTmV0d29yayBhcyBFdGhMaWtlTmV0d29yayB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuXG5leHBvcnQgY2xhc3MgRVJDMTE1NVRyYW5zZmVyQnVpbGRlciBleHRlbmRzIEJhc2VORlRUcmFuc2ZlckJ1aWxkZXIge1xuICBwcml2YXRlIF90b2tlbklkczogc3RyaW5nW107XG4gIHByaXZhdGUgX3ZhbHVlczogc3RyaW5nW107XG4gIHByaXZhdGUgX2J5dGVzOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Ioc2VyaWFsaXplZERhdGE/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihzZXJpYWxpemVkRGF0YSk7XG4gICAgdGhpcy5ieXRlcygwKTtcbiAgICBpZiAoc2VyaWFsaXplZERhdGEpIHtcbiAgICAgIHRoaXMuZGVjb2RlVHJhbnNmZXJEYXRhKHNlcmlhbGl6ZWREYXRhKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fdG9rZW5JZHMgPSBbXTtcbiAgICAgIHRoaXMuX3ZhbHVlcyA9IFtdO1xuICAgIH1cbiAgfVxuXG4gIGNvaW4oY29pbjogc3RyaW5nKTogRVJDMTE1NVRyYW5zZmVyQnVpbGRlciB7XG4gICAgdGhpcy5fY29pbiA9IGNvaW5zLmdldChjb2luKTtcbiAgICB0aGlzLl9uYXRpdmVDb2luT3BlcmF0aW9uSGFzaFByZWZpeCA9ICh0aGlzLl9jb2luLm5ldHdvcmsgYXMgRXRoTGlrZU5ldHdvcmspLm5hdGl2ZUNvaW5PcGVyYXRpb25IYXNoUHJlZml4O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgdG9rZW5Db250cmFjdEFkZHJlc3MoYWRkcmVzczogc3RyaW5nKTogRVJDMTE1NVRyYW5zZmVyQnVpbGRlciB7XG4gICAgaWYgKGlzVmFsaWRFdGhBZGRyZXNzKGFkZHJlc3MpKSB7XG4gICAgICB0aGlzLl90b2tlbkNvbnRyYWN0QWRkcmVzcyA9IGFkZHJlc3M7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgdGhyb3cgbmV3IEludmFsaWRQYXJhbWV0ZXJWYWx1ZUVycm9yKCdJbnZhbGlkIGFkZHJlc3MnKTtcbiAgfVxuXG4gIGVudHJ5KHRva2VuSWQ6IG51bWJlciwgdmFsdWU6IG51bWJlcik6IEVSQzExNTVUcmFuc2ZlckJ1aWxkZXIge1xuICAgIHRoaXMuX3Rva2VuSWRzLnB1c2godG9rZW5JZC50b1N0cmluZygpKTtcbiAgICB0aGlzLl92YWx1ZXMucHVzaCh2YWx1ZS50b1N0cmluZygpKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGJ5dGVzKGJ5dGVzSW5OdW1iZXI6IG51bWJlcik6IEVSQzExNTVUcmFuc2ZlckJ1aWxkZXIge1xuICAgIHRoaXMuX2J5dGVzID0gaGV4WmVyb1BhZChoZXhsaWZ5KGJ5dGVzSW5OdW1iZXIpLCAzMik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzaWduQW5kQnVpbGQoY2hhaW5JZD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgdGhpcy5fY2hhaW5JZCA9IGNoYWluSWQ7XG4gICAgY29uc3QgaGFzTWFuZGF0b3J5RmllbGRzID0gdGhpcy5oYXNNYW5kYXRvcnlGaWVsZHMoKTtcbiAgICBpZiAoaGFzTWFuZGF0b3J5RmllbGRzKSB7XG4gICAgICB0aGlzLl9kYXRhID0gdGhpcy5idWlsZCgpO1xuXG4gICAgICByZXR1cm4gc2VuZE11bHRpU2lnRGF0YShcbiAgICAgICAgdGhpcy5fdG9rZW5Db250cmFjdEFkZHJlc3MsXG4gICAgICAgICcwJywgLy8gZHVtbXkgYW1vdW50IHZhbHVlXG4gICAgICAgIHRoaXMuX2RhdGEsXG4gICAgICAgIHRoaXMuX2V4cGlyYXRpb25UaW1lLFxuICAgICAgICB0aGlzLl9zZXF1ZW5jZUlkLFxuICAgICAgICB0aGlzLmdldFNpZ25hdHVyZSgpXG4gICAgICApO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKFxuICAgICAgYE1pc3NpbmcgdHJhbnNmZXIgbWFuZGF0b3J5IGZpZWxkcy4gXG4gICAgICAgRGVzdGluYXRpb24gKHRvKSBhZGRyZXNzLCBzb3VyY2UgKGZyb20pIGFkZHJlc3MsIHNlcXVlbmNlSUQsIHRoZSB0b2tlbiBjb250cmFjdCBhZGRyZXNzLCB0b2tlbklEcyBhbmQgdGhlaXIgdmFsdWVzIGFyZSBtYW5kYXRvcnlgXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFzTWFuZGF0b3J5RmllbGRzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLl90b2tlbklkcyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICB0aGlzLl90b2tlbklkcy5sZW5ndGggIT09IDAgJiZcbiAgICAgIHRoaXMuX3ZhbHVlcy5sZW5ndGggIT09IDAgJiZcbiAgICAgIHRoaXMuX3Rva2VuSWRzLmxlbmd0aCA9PT0gdGhpcy5fdmFsdWVzLmxlbmd0aCAmJlxuICAgICAgdGhpcy5fdG9BZGRyZXNzICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIHRoaXMuX2Zyb21BZGRyZXNzICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIHRoaXMuX3Rva2VuQ29udHJhY3RBZGRyZXNzICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIHRoaXMuX3NlcXVlbmNlSWQgIT09IHVuZGVmaW5lZFxuICAgICk7XG4gIH1cbiAgcHJpdmF0ZSBkZWNvZGVUcmFuc2ZlckRhdGEoZGF0YTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgdHJhbnNmZXJEYXRhID0gZGVjb2RlRVJDMTE1NVRyYW5zZmVyRGF0YShkYXRhKTtcbiAgICB0aGlzLl90b0FkZHJlc3MgPSB0cmFuc2ZlckRhdGEudG87XG4gICAgdGhpcy5fZnJvbUFkZHJlc3MgPSB0cmFuc2ZlckRhdGEuZnJvbTtcbiAgICB0aGlzLl9leHBpcmF0aW9uVGltZSA9IHRyYW5zZmVyRGF0YS5leHBpcmVUaW1lO1xuICAgIHRoaXMuX3NlcXVlbmNlSWQgPSB0cmFuc2ZlckRhdGEuc2VxdWVuY2VJZDtcbiAgICB0aGlzLl9zaWduYXR1cmUgPSB0cmFuc2ZlckRhdGEuc2lnbmF0dXJlO1xuICAgIHRoaXMuX3Rva2VuQ29udHJhY3RBZGRyZXNzID0gdHJhbnNmZXJEYXRhLnRva2VuQ29udHJhY3RBZGRyZXNzO1xuICAgIHRoaXMuX3Rva2VuSWRzID0gdHJhbnNmZXJEYXRhLnRva2VuSWRzO1xuICAgIHRoaXMuX3ZhbHVlcyA9IHRyYW5zZmVyRGF0YS52YWx1ZXM7XG4gICAgaWYgKHRyYW5zZmVyRGF0YS5kYXRhKSB7XG4gICAgICB0aGlzLl9kYXRhID0gdHJhbnNmZXJEYXRhLmRhdGE7XG4gICAgfVxuICB9XG5cbiAgYnVpbGQoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5fdG9rZW5JZHMubGVuZ3RoID09PSAxKSB7XG4gICAgICBjb25zdCB2YWx1ZXMgPSBbdGhpcy5fZnJvbUFkZHJlc3MsIHRoaXMuX3RvQWRkcmVzcywgdGhpcy5fdG9rZW5JZHNbMF0sIHRoaXMuX3ZhbHVlc1swXSwgdGhpcy5fYnl0ZXNdO1xuICAgICAgY29uc3QgY29udHJhY3RDYWxsID0gbmV3IENvbnRyYWN0Q2FsbChFUkMxMTU1U2FmZVRyYW5zZmVyVHlwZU1ldGhvZElkLCBFUkMxMTU1U2FmZVRyYW5zZmVyVHlwZXMsIHZhbHVlcyk7XG4gICAgICByZXR1cm4gY29udHJhY3RDYWxsLnNlcmlhbGl6ZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB2YWx1ZXMgPSBbdGhpcy5fZnJvbUFkZHJlc3MsIHRoaXMuX3RvQWRkcmVzcywgdGhpcy5fdG9rZW5JZHMsIHRoaXMuX3ZhbHVlcywgdGhpcy5fYnl0ZXNdO1xuICAgICAgY29uc3QgY29udHJhY3RDYWxsID0gbmV3IENvbnRyYWN0Q2FsbChFUkMxMTU1QmF0Y2hUcmFuc2ZlclR5cGVNZXRob2RJZCwgRVJDMTE1NUJhdGNoVHJhbnNmZXJUeXBlcywgdmFsdWVzKTtcbiAgICAgIHJldHVybiBjb250cmFjdENhbGwuc2VyaWFsaXplKCk7XG4gICAgfVxuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { BaseNFTTransferBuilder } from './baseNFTTransferBuilder';
|
|
2
|
+
export declare class ERC721TransferBuilder extends BaseNFTTransferBuilder {
|
|
3
|
+
private _tokenId;
|
|
4
|
+
private _bytes;
|
|
5
|
+
constructor(serializedData?: string);
|
|
6
|
+
coin(coin: string): ERC721TransferBuilder;
|
|
7
|
+
tokenContractAddress(address: string): ERC721TransferBuilder;
|
|
8
|
+
tokenId(token: string): ERC721TransferBuilder;
|
|
9
|
+
bytes(bytesInNumber: number): ERC721TransferBuilder;
|
|
10
|
+
build(): string;
|
|
11
|
+
signAndBuild(chainId?: string): string;
|
|
12
|
+
private hasMandatoryFields;
|
|
13
|
+
private decodeTransferData;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=transferBuilderERC721.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transferBuilderERC721.d.ts","sourceRoot":"","sources":["../../../../src/lib/transferBuilders/transferBuilderERC721.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAIlE,qBAAa,qBAAsB,SAAQ,sBAAsB;IAC/D,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,MAAM,CAAS;gBAEX,cAAc,CAAC,EAAE,MAAM;IAQnC,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,qBAAqB;IAMzC,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,qBAAqB;IAQ5D,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,qBAAqB;IAK7C,KAAK,CAAC,aAAa,EAAE,MAAM,GAAG,qBAAqB;IAKnD,KAAK,IAAI,MAAM;IAOf,YAAY,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM;IAqBtC,OAAO,CAAC,kBAAkB;IAU1B,OAAO,CAAC,kBAAkB;CAa3B"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ERC721TransferBuilder = void 0;
|
|
4
|
+
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
5
|
+
const utils_1 = require("ethers/lib/utils");
|
|
6
|
+
const contractCall_1 = require("../contractCall");
|
|
7
|
+
const utils_2 = require("../utils");
|
|
8
|
+
const baseNFTTransferBuilder_1 = require("./baseNFTTransferBuilder");
|
|
9
|
+
const walletUtil_1 = require("../walletUtil");
|
|
10
|
+
const statics_1 = require("@bitgo-beta/statics");
|
|
11
|
+
class ERC721TransferBuilder extends baseNFTTransferBuilder_1.BaseNFTTransferBuilder {
|
|
12
|
+
constructor(serializedData) {
|
|
13
|
+
super(serializedData);
|
|
14
|
+
this.bytes(0);
|
|
15
|
+
if (serializedData) {
|
|
16
|
+
this.decodeTransferData(serializedData);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
coin(coin) {
|
|
20
|
+
this._coin = statics_1.coins.get(coin);
|
|
21
|
+
this._nativeCoinOperationHashPrefix = this._coin.network.nativeCoinOperationHashPrefix;
|
|
22
|
+
return this;
|
|
23
|
+
}
|
|
24
|
+
tokenContractAddress(address) {
|
|
25
|
+
if (utils_2.isValidEthAddress(address)) {
|
|
26
|
+
this._tokenContractAddress = address;
|
|
27
|
+
return this;
|
|
28
|
+
}
|
|
29
|
+
throw new sdk_core_1.InvalidParameterValueError('Invalid address');
|
|
30
|
+
}
|
|
31
|
+
tokenId(token) {
|
|
32
|
+
this._tokenId = token;
|
|
33
|
+
return this;
|
|
34
|
+
}
|
|
35
|
+
bytes(bytesInNumber) {
|
|
36
|
+
this._bytes = utils_1.hexZeroPad(utils_1.hexlify(bytesInNumber), 32);
|
|
37
|
+
return this;
|
|
38
|
+
}
|
|
39
|
+
build() {
|
|
40
|
+
const types = walletUtil_1.ERC721SafeTransferTypes;
|
|
41
|
+
const values = [this._fromAddress, this._toAddress, this._tokenId, this._bytes];
|
|
42
|
+
const contractCall = new contractCall_1.ContractCall(walletUtil_1.ERC721SafeTransferTypeMethodId, types, values);
|
|
43
|
+
return contractCall.serialize();
|
|
44
|
+
}
|
|
45
|
+
signAndBuild(chainId) {
|
|
46
|
+
this._chainId = chainId;
|
|
47
|
+
if (this.hasMandatoryFields()) {
|
|
48
|
+
this._data = this.build();
|
|
49
|
+
return utils_2.sendMultiSigData(this._tokenContractAddress, // to
|
|
50
|
+
'0', // dummy amount value
|
|
51
|
+
this._data, this._expirationTime, this._sequenceId, this.getSignature());
|
|
52
|
+
}
|
|
53
|
+
throw new sdk_core_1.BuildTransactionError(`Missing transfer mandatory fields.
|
|
54
|
+
Destination (to) address, Source (from) address, sequenceID, the token contract address and tokenID are mandatory`);
|
|
55
|
+
}
|
|
56
|
+
hasMandatoryFields() {
|
|
57
|
+
return (this._tokenId !== undefined &&
|
|
58
|
+
this._toAddress !== undefined &&
|
|
59
|
+
this._fromAddress !== undefined &&
|
|
60
|
+
this._tokenContractAddress !== undefined &&
|
|
61
|
+
this._sequenceId !== undefined);
|
|
62
|
+
}
|
|
63
|
+
decodeTransferData(data) {
|
|
64
|
+
const transferData = utils_2.decodeERC721TransferData(data);
|
|
65
|
+
this._toAddress = transferData.to;
|
|
66
|
+
this._fromAddress = transferData.from;
|
|
67
|
+
this._expirationTime = transferData.expireTime;
|
|
68
|
+
this._sequenceId = transferData.sequenceId;
|
|
69
|
+
this._signature = transferData.signature;
|
|
70
|
+
this._tokenContractAddress = transferData.tokenContractAddress;
|
|
71
|
+
this._tokenId = transferData.tokenId;
|
|
72
|
+
if (transferData.data) {
|
|
73
|
+
this._data = transferData.data;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
exports.ERC721TransferBuilder = ERC721TransferBuilder;
|
|
78
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmZXJCdWlsZGVyRVJDNzIxLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi90cmFuc2ZlckJ1aWxkZXJzL3RyYW5zZmVyQnVpbGRlckVSQzcyMS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtREFBeUY7QUFDekYsNENBQXVEO0FBRXZELGtEQUErQztBQUMvQyxvQ0FBeUY7QUFDekYscUVBQWtFO0FBQ2xFLDhDQUF3RjtBQUN4RixpREFBK0U7QUFFL0UsTUFBYSxxQkFBc0IsU0FBUSwrQ0FBc0I7SUFJL0QsWUFBWSxjQUF1QjtRQUNqQyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDdEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNkLElBQUksY0FBYyxFQUFFO1lBQ2xCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxjQUFjLENBQUMsQ0FBQztTQUN6QztJQUNILENBQUM7SUFFRCxJQUFJLENBQUMsSUFBWTtRQUNmLElBQUksQ0FBQyxLQUFLLEdBQUcsZUFBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3QixJQUFJLENBQUMsOEJBQThCLEdBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUEwQixDQUFDLDZCQUE2QixDQUFDO1FBQzNHLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELG9CQUFvQixDQUFDLE9BQWU7UUFDbEMsSUFBSSx5QkFBaUIsQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUM5QixJQUFJLENBQUMscUJBQXFCLEdBQUcsT0FBTyxDQUFDO1lBQ3JDLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFDRCxNQUFNLElBQUkscUNBQTBCLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRUQsT0FBTyxDQUFDLEtBQWE7UUFDbkIsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7UUFDdEIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsS0FBSyxDQUFDLGFBQXFCO1FBQ3pCLElBQUksQ0FBQyxNQUFNLEdBQUcsa0JBQVUsQ0FBQyxlQUFPLENBQUMsYUFBYSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDckQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsS0FBSztRQUNILE1BQU0sS0FBSyxHQUFHLG9DQUF1QixDQUFDO1FBQ3RDLE1BQU0sTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2hGLE1BQU0sWUFBWSxHQUFHLElBQUksMkJBQVksQ0FBQywyQ0FBOEIsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDckYsT0FBTyxZQUFZLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDbEMsQ0FBQztJQUVELFlBQVksQ0FBQyxPQUFnQjtRQUMzQixJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQztRQUN4QixJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxFQUFFO1lBQzdCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBRTFCLE9BQU8sd0JBQWdCLENBQ3JCLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxLQUFLO1lBQ2pDLEdBQUcsRUFBRSxxQkFBcUI7WUFDMUIsSUFBSSxDQUFDLEtBQUssRUFDVixJQUFJLENBQUMsZUFBZSxFQUNwQixJQUFJLENBQUMsV0FBVyxFQUNoQixJQUFJLENBQUMsWUFBWSxFQUFFLENBQ3BCLENBQUM7U0FDSDtRQUVELE1BQU0sSUFBSSxnQ0FBcUIsQ0FDN0I7eUhBQ21ILENBQ3BILENBQUM7SUFDSixDQUFDO0lBRU8sa0JBQWtCO1FBQ3hCLE9BQU8sQ0FDTCxJQUFJLENBQUMsUUFBUSxLQUFLLFNBQVM7WUFDM0IsSUFBSSxDQUFDLFVBQVUsS0FBSyxTQUFTO1lBQzdCLElBQUksQ0FBQyxZQUFZLEtBQUssU0FBUztZQUMvQixJQUFJLENBQUMscUJBQXFCLEtBQUssU0FBUztZQUN4QyxJQUFJLENBQUMsV0FBVyxLQUFLLFNBQVMsQ0FDL0IsQ0FBQztJQUNKLENBQUM7SUFFTyxrQkFBa0IsQ0FBQyxJQUFZO1FBQ3JDLE1BQU0sWUFBWSxHQUFHLGdDQUF3QixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxVQUFVLEdBQUcsWUFBWSxDQUFDLEVBQUUsQ0FBQztRQUNsQyxJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUM7UUFDdEMsSUFBSSxDQUFDLGVBQWUsR0FBRyxZQUFZLENBQUMsVUFBVSxDQUFDO1FBQy9DLElBQUksQ0FBQyxXQUFXLEdBQUcsWUFBWSxDQUFDLFVBQVUsQ0FBQztRQUMzQyxJQUFJLENBQUMsVUFBVSxHQUFHLFlBQVksQ0FBQyxTQUFTLENBQUM7UUFDekMsSUFBSSxDQUFDLHFCQUFxQixHQUFHLFlBQVksQ0FBQyxvQkFBb0IsQ0FBQztRQUMvRCxJQUFJLENBQUMsUUFBUSxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUM7UUFDckMsSUFBSSxZQUFZLENBQUMsSUFBSSxFQUFFO1lBQ3JCLElBQUksQ0FBQyxLQUFLLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQztTQUNoQztJQUNILENBQUM7Q0FDRjtBQXZGRCxzREF1RkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IsIEludmFsaWRQYXJhbWV0ZXJWYWx1ZUVycm9yIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgaGV4bGlmeSwgaGV4WmVyb1BhZCB9IGZyb20gJ2V0aGVycy9saWIvdXRpbHMnO1xuXG5pbXBvcnQgeyBDb250cmFjdENhbGwgfSBmcm9tICcuLi9jb250cmFjdENhbGwnO1xuaW1wb3J0IHsgZGVjb2RlRVJDNzIxVHJhbnNmZXJEYXRhLCBpc1ZhbGlkRXRoQWRkcmVzcywgc2VuZE11bHRpU2lnRGF0YSB9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7IEJhc2VORlRUcmFuc2ZlckJ1aWxkZXIgfSBmcm9tICcuL2Jhc2VORlRUcmFuc2ZlckJ1aWxkZXInO1xuaW1wb3J0IHsgRVJDNzIxU2FmZVRyYW5zZmVyVHlwZU1ldGhvZElkLCBFUkM3MjFTYWZlVHJhbnNmZXJUeXBlcyB9IGZyb20gJy4uL3dhbGxldFV0aWwnO1xuaW1wb3J0IHsgY29pbnMsIEV0aGVyZXVtTmV0d29yayBhcyBFdGhMaWtlTmV0d29yayB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuXG5leHBvcnQgY2xhc3MgRVJDNzIxVHJhbnNmZXJCdWlsZGVyIGV4dGVuZHMgQmFzZU5GVFRyYW5zZmVyQnVpbGRlciB7XG4gIHByaXZhdGUgX3Rva2VuSWQ6IHN0cmluZztcbiAgcHJpdmF0ZSBfYnl0ZXM6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihzZXJpYWxpemVkRGF0YT86IHN0cmluZykge1xuICAgIHN1cGVyKHNlcmlhbGl6ZWREYXRhKTtcbiAgICB0aGlzLmJ5dGVzKDApO1xuICAgIGlmIChzZXJpYWxpemVkRGF0YSkge1xuICAgICAgdGhpcy5kZWNvZGVUcmFuc2ZlckRhdGEoc2VyaWFsaXplZERhdGEpO1xuICAgIH1cbiAgfVxuXG4gIGNvaW4oY29pbjogc3RyaW5nKTogRVJDNzIxVHJhbnNmZXJCdWlsZGVyIHtcbiAgICB0aGlzLl9jb2luID0gY29pbnMuZ2V0KGNvaW4pO1xuICAgIHRoaXMuX25hdGl2ZUNvaW5PcGVyYXRpb25IYXNoUHJlZml4ID0gKHRoaXMuX2NvaW4ubmV0d29yayBhcyBFdGhMaWtlTmV0d29yaykubmF0aXZlQ29pbk9wZXJhdGlvbkhhc2hQcmVmaXg7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB0b2tlbkNvbnRyYWN0QWRkcmVzcyhhZGRyZXNzOiBzdHJpbmcpOiBFUkM3MjFUcmFuc2ZlckJ1aWxkZXIge1xuICAgIGlmIChpc1ZhbGlkRXRoQWRkcmVzcyhhZGRyZXNzKSkge1xuICAgICAgdGhpcy5fdG9rZW5Db250cmFjdEFkZHJlc3MgPSBhZGRyZXNzO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHRocm93IG5ldyBJbnZhbGlkUGFyYW1ldGVyVmFsdWVFcnJvcignSW52YWxpZCBhZGRyZXNzJyk7XG4gIH1cblxuICB0b2tlbklkKHRva2VuOiBzdHJpbmcpOiBFUkM3MjFUcmFuc2ZlckJ1aWxkZXIge1xuICAgIHRoaXMuX3Rva2VuSWQgPSB0b2tlbjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGJ5dGVzKGJ5dGVzSW5OdW1iZXI6IG51bWJlcik6IEVSQzcyMVRyYW5zZmVyQnVpbGRlciB7XG4gICAgdGhpcy5fYnl0ZXMgPSBoZXhaZXJvUGFkKGhleGxpZnkoYnl0ZXNJbk51bWJlciksIDMyKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGJ1aWxkKCk6IHN0cmluZyB7XG4gICAgY29uc3QgdHlwZXMgPSBFUkM3MjFTYWZlVHJhbnNmZXJUeXBlcztcbiAgICBjb25zdCB2YWx1ZXMgPSBbdGhpcy5fZnJvbUFkZHJlc3MsIHRoaXMuX3RvQWRkcmVzcywgdGhpcy5fdG9rZW5JZCwgdGhpcy5fYnl0ZXNdO1xuICAgIGNvbnN0IGNvbnRyYWN0Q2FsbCA9IG5ldyBDb250cmFjdENhbGwoRVJDNzIxU2FmZVRyYW5zZmVyVHlwZU1ldGhvZElkLCB0eXBlcywgdmFsdWVzKTtcbiAgICByZXR1cm4gY29udHJhY3RDYWxsLnNlcmlhbGl6ZSgpO1xuICB9XG5cbiAgc2lnbkFuZEJ1aWxkKGNoYWluSWQ/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHRoaXMuX2NoYWluSWQgPSBjaGFpbklkO1xuICAgIGlmICh0aGlzLmhhc01hbmRhdG9yeUZpZWxkcygpKSB7XG4gICAgICB0aGlzLl9kYXRhID0gdGhpcy5idWlsZCgpO1xuXG4gICAgICByZXR1cm4gc2VuZE11bHRpU2lnRGF0YShcbiAgICAgICAgdGhpcy5fdG9rZW5Db250cmFjdEFkZHJlc3MsIC8vIHRvXG4gICAgICAgICcwJywgLy8gZHVtbXkgYW1vdW50IHZhbHVlXG4gICAgICAgIHRoaXMuX2RhdGEsXG4gICAgICAgIHRoaXMuX2V4cGlyYXRpb25UaW1lLFxuICAgICAgICB0aGlzLl9zZXF1ZW5jZUlkLFxuICAgICAgICB0aGlzLmdldFNpZ25hdHVyZSgpXG4gICAgICApO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoXG4gICAgICBgTWlzc2luZyB0cmFuc2ZlciBtYW5kYXRvcnkgZmllbGRzLiBcbiAgICAgICBEZXN0aW5hdGlvbiAodG8pIGFkZHJlc3MsIFNvdXJjZSAoZnJvbSkgYWRkcmVzcywgc2VxdWVuY2VJRCwgdGhlIHRva2VuIGNvbnRyYWN0IGFkZHJlc3MgYW5kIHRva2VuSUQgYXJlIG1hbmRhdG9yeWBcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNNYW5kYXRvcnlGaWVsZHMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuX3Rva2VuSWQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgdGhpcy5fdG9BZGRyZXNzICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIHRoaXMuX2Zyb21BZGRyZXNzICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIHRoaXMuX3Rva2VuQ29udHJhY3RBZGRyZXNzICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIHRoaXMuX3NlcXVlbmNlSWQgIT09IHVuZGVmaW5lZFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGRlY29kZVRyYW5zZmVyRGF0YShkYXRhOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCB0cmFuc2ZlckRhdGEgPSBkZWNvZGVFUkM3MjFUcmFuc2ZlckRhdGEoZGF0YSk7XG4gICAgdGhpcy5fdG9BZGRyZXNzID0gdHJhbnNmZXJEYXRhLnRvO1xuICAgIHRoaXMuX2Zyb21BZGRyZXNzID0gdHJhbnNmZXJEYXRhLmZyb207XG4gICAgdGhpcy5fZXhwaXJhdGlvblRpbWUgPSB0cmFuc2ZlckRhdGEuZXhwaXJlVGltZTtcbiAgICB0aGlzLl9zZXF1ZW5jZUlkID0gdHJhbnNmZXJEYXRhLnNlcXVlbmNlSWQ7XG4gICAgdGhpcy5fc2lnbmF0dXJlID0gdHJhbnNmZXJEYXRhLnNpZ25hdHVyZTtcbiAgICB0aGlzLl90b2tlbkNvbnRyYWN0QWRkcmVzcyA9IHRyYW5zZmVyRGF0YS50b2tlbkNvbnRyYWN0QWRkcmVzcztcbiAgICB0aGlzLl90b2tlbklkID0gdHJhbnNmZXJEYXRhLnRva2VuSWQ7XG4gICAgaWYgKHRyYW5zZmVyRGF0YS5kYXRhKSB7XG4gICAgICB0aGlzLl9kYXRhID0gdHJhbnNmZXJEYXRhLmRhdGE7XG4gICAgfVxuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { TypedTransaction } from '@ethereumjs/tx';
|
|
2
|
+
import EthereumCommon from '@ethereumjs/common';
|
|
3
|
+
import { EthLikeTransactionData, TxData } from './iface';
|
|
4
|
+
import { KeyPair } from './keyPair';
|
|
5
|
+
/**
|
|
6
|
+
* An Ethereum transaction with helpers for serialization and deserialization.
|
|
7
|
+
*/
|
|
8
|
+
export declare class EthTransactionData implements EthLikeTransactionData {
|
|
9
|
+
private tx;
|
|
10
|
+
protected args?: {
|
|
11
|
+
deployedAddress?: string;
|
|
12
|
+
chainId?: string;
|
|
13
|
+
};
|
|
14
|
+
constructor(tx: TypedTransaction, args?: {
|
|
15
|
+
deployedAddress?: string;
|
|
16
|
+
chainId?: string;
|
|
17
|
+
});
|
|
18
|
+
/**
|
|
19
|
+
* Build an thereum transaction from its JSON representation
|
|
20
|
+
*
|
|
21
|
+
* @param {TxData} tx The JSON representation of the transaction
|
|
22
|
+
* @param {EthereumCommon} common Class to access chain and hardfork parameters
|
|
23
|
+
* @returns {EthTransactionData} a new ethereum transaction object
|
|
24
|
+
*/
|
|
25
|
+
static fromJson(tx: TxData, common: EthereumCommon): EthTransactionData;
|
|
26
|
+
/**
|
|
27
|
+
* Build an ethereum transaction from its string serialization
|
|
28
|
+
*
|
|
29
|
+
* @param tx The string serialization of the ethereum transaction
|
|
30
|
+
* @param common
|
|
31
|
+
*/
|
|
32
|
+
static fromSerialized(tx: string, common: EthereumCommon): EthTransactionData;
|
|
33
|
+
sign(keyPair: KeyPair): void;
|
|
34
|
+
/** @inheritdoc */
|
|
35
|
+
toJson(): TxData;
|
|
36
|
+
/** @inheritdoc */
|
|
37
|
+
toSerialized(): string;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/lib/types.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,gBAAgB,EAIjB,MAAM,gBAAgB,CAAC;AACxB,OAAO,cAAc,MAAM,oBAAoB,CAAC;AAEhD,OAAO,EAA6B,sBAAsB,EAAoC,MAAM,EAAE,MAAM,SAAS,CAAC;AACtH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC;;GAEG;AACH,qBAAa,kBAAmB,YAAW,sBAAsB;IAC/D,OAAO,CAAC,EAAE,CAAmB;IAC7B,SAAS,CAAC,IAAI,CAAC,EAAE;QAAE,eAAe,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;gBAEpD,EAAE,EAAE,gBAAgB,EAAE,IAAI,CAAC,EAAE;QAAE,eAAe,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE;IAKvF;;;;;;OAMG;WACW,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,kBAAkB;IAuC9E;;;;;OAKG;WACW,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,kBAAkB;IAMpF,IAAI,CAAC,OAAO,EAAE,OAAO;IAKrB,kBAAkB;IAClB,MAAM,IAAI,MAAM;IA2DhB,kBAAkB;IAClB,YAAY,IAAI,MAAM;CAGvB"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.EthTransactionData = void 0;
|
|
7
|
+
const assert_1 = __importDefault(require("assert"));
|
|
8
|
+
const bignumber_js_1 = __importDefault(require("bignumber.js"));
|
|
9
|
+
const tx_1 = require("@ethereumjs/tx");
|
|
10
|
+
const ethereumjs_util_1 = require("ethereumjs-util");
|
|
11
|
+
const iface_1 = require("./iface");
|
|
12
|
+
// https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/transactionFactory.ts#L31
|
|
13
|
+
const LEGACY_TX_TYPE = 0;
|
|
14
|
+
const EIP1559_TX_TYPE = 2;
|
|
15
|
+
/**
|
|
16
|
+
* An Ethereum transaction with helpers for serialization and deserialization.
|
|
17
|
+
*/
|
|
18
|
+
class EthTransactionData {
|
|
19
|
+
constructor(tx, args) {
|
|
20
|
+
this.tx = tx;
|
|
21
|
+
this.args = args;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Build an thereum transaction from its JSON representation
|
|
25
|
+
*
|
|
26
|
+
* @param {TxData} tx The JSON representation of the transaction
|
|
27
|
+
* @param {EthereumCommon} common Class to access chain and hardfork parameters
|
|
28
|
+
* @returns {EthTransactionData} a new ethereum transaction object
|
|
29
|
+
*/
|
|
30
|
+
static fromJson(tx, common) {
|
|
31
|
+
const nonce = ethereumjs_util_1.addHexPrefix(new bignumber_js_1.default(tx.nonce).toString(16));
|
|
32
|
+
const value = ethereumjs_util_1.addHexPrefix(new bignumber_js_1.default(tx.value).toString(16));
|
|
33
|
+
const gasLimit = ethereumjs_util_1.addHexPrefix(new bignumber_js_1.default(tx.gasLimit).toString(16));
|
|
34
|
+
const chainId = tx.chainId ? ethereumjs_util_1.addHexPrefix(new bignumber_js_1.default(tx.chainId).toString(16)) : undefined;
|
|
35
|
+
const gasPrice = isLegacyTx(tx) ? ethereumjs_util_1.addHexPrefix(new bignumber_js_1.default(tx.gasPrice).toString(16)) : undefined;
|
|
36
|
+
const maxFeePerGas = isEIP1559Txn(tx) ? ethereumjs_util_1.addHexPrefix(new bignumber_js_1.default(tx.maxFeePerGas).toString(16)) : undefined;
|
|
37
|
+
const maxPriorityFeePerGas = isEIP1559Txn(tx)
|
|
38
|
+
? ethereumjs_util_1.addHexPrefix(new bignumber_js_1.default(tx.maxPriorityFeePerGas).toString(16))
|
|
39
|
+
: undefined;
|
|
40
|
+
return new EthTransactionData(tx_1.TransactionFactory.fromTxData({
|
|
41
|
+
type: isLegacyTx(tx) ? LEGACY_TX_TYPE : EIP1559_TX_TYPE,
|
|
42
|
+
chainId,
|
|
43
|
+
nonce,
|
|
44
|
+
to: tx.to,
|
|
45
|
+
gasPrice,
|
|
46
|
+
gasLimit,
|
|
47
|
+
maxFeePerGas,
|
|
48
|
+
maxPriorityFeePerGas,
|
|
49
|
+
value,
|
|
50
|
+
data: tx.data,
|
|
51
|
+
v: tx.v,
|
|
52
|
+
r: tx.r,
|
|
53
|
+
s: tx.s,
|
|
54
|
+
}, { common: common }), {
|
|
55
|
+
deployedAddress: tx.deployedAddress,
|
|
56
|
+
chainId: ethereumjs_util_1.addHexPrefix(new bignumber_js_1.default(Number(tx.chainId)).toString(16)),
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Build an ethereum transaction from its string serialization
|
|
61
|
+
*
|
|
62
|
+
* @param tx The string serialization of the ethereum transaction
|
|
63
|
+
* @param common
|
|
64
|
+
*/
|
|
65
|
+
static fromSerialized(tx, common) {
|
|
66
|
+
return new EthTransactionData(tx_1.TransactionFactory.fromSerializedData(ethereumjs_util_1.toBuffer(ethereumjs_util_1.addHexPrefix(tx)), { common: common }));
|
|
67
|
+
}
|
|
68
|
+
sign(keyPair) {
|
|
69
|
+
const privateKey = Buffer.from(keyPair.getKeys().prv, 'hex');
|
|
70
|
+
this.tx = this.tx.sign(privateKey);
|
|
71
|
+
}
|
|
72
|
+
/** @inheritdoc */
|
|
73
|
+
toJson() {
|
|
74
|
+
const result = {
|
|
75
|
+
nonce: ethereumjs_util_1.bufferToInt(ethereumjs_util_1.toUnsigned(this.tx.nonce)),
|
|
76
|
+
gasLimit: new bignumber_js_1.default(ethereumjs_util_1.bufferToHex(ethereumjs_util_1.toUnsigned(this.tx.gasLimit)), 16).toString(10),
|
|
77
|
+
value: this.tx.value.toString(10),
|
|
78
|
+
data: ethereumjs_util_1.bufferToHex(this.tx.data),
|
|
79
|
+
};
|
|
80
|
+
if (this.tx.isSigned()) {
|
|
81
|
+
result.id = ethereumjs_util_1.addHexPrefix(ethereumjs_util_1.bufferToHex(this.tx.hash()));
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
result.id = ethereumjs_util_1.addHexPrefix(ethereumjs_util_1.bufferToHex(this.tx.getMessageToSign()));
|
|
85
|
+
}
|
|
86
|
+
if (this.tx.to) {
|
|
87
|
+
result.to = ethereumjs_util_1.bufferToHex(this.tx.to.toBuffer());
|
|
88
|
+
}
|
|
89
|
+
if (this.tx.verifySignature()) {
|
|
90
|
+
result.from = ethereumjs_util_1.bufferToHex(this.tx.getSenderAddress().toBuffer());
|
|
91
|
+
assert_1.default(this.tx.r != undefined);
|
|
92
|
+
result.r = ethereumjs_util_1.bufferToHex(ethereumjs_util_1.toUnsigned(this.tx.r));
|
|
93
|
+
assert_1.default(this.tx.s != undefined);
|
|
94
|
+
result.s = ethereumjs_util_1.bufferToHex(ethereumjs_util_1.toUnsigned(this.tx.s));
|
|
95
|
+
}
|
|
96
|
+
if (this.tx.v) {
|
|
97
|
+
result.v = ethereumjs_util_1.bufferToHex(ethereumjs_util_1.toUnsigned(this.tx.v));
|
|
98
|
+
}
|
|
99
|
+
result.chainId = ethereumjs_util_1.addHexPrefix(this.tx.common.chainIdBN().toString(16));
|
|
100
|
+
if (this.args && this.args.deployedAddress) {
|
|
101
|
+
result.deployedAddress = this.args.deployedAddress;
|
|
102
|
+
}
|
|
103
|
+
if (this.tx instanceof tx_1.Transaction) {
|
|
104
|
+
const gasPrice = new bignumber_js_1.default(ethereumjs_util_1.bufferToHex(ethereumjs_util_1.toUnsigned(this.tx.gasPrice)), 16).toString(10);
|
|
105
|
+
return {
|
|
106
|
+
...result,
|
|
107
|
+
_type: iface_1.ETHTransactionType.LEGACY,
|
|
108
|
+
gasPrice,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
else if (this.tx instanceof tx_1.FeeMarketEIP1559Transaction) {
|
|
112
|
+
const maxFeePerGas = new bignumber_js_1.default(ethereumjs_util_1.bufferToHex(ethereumjs_util_1.toUnsigned(this.tx.maxFeePerGas)), 16).toString(10);
|
|
113
|
+
const maxPriorityFeePerGas = new bignumber_js_1.default(ethereumjs_util_1.bufferToHex(ethereumjs_util_1.toUnsigned(this.tx.maxPriorityFeePerGas)), 16).toString(10);
|
|
114
|
+
return {
|
|
115
|
+
...result,
|
|
116
|
+
_type: iface_1.ETHTransactionType.EIP1559,
|
|
117
|
+
maxFeePerGas,
|
|
118
|
+
maxPriorityFeePerGas,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
throw new Error(`Unsupported tx type: ${tx_1.AccessListEIP2930Transaction.name}`);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
/** @inheritdoc */
|
|
126
|
+
toSerialized() {
|
|
127
|
+
return ethereumjs_util_1.addHexPrefix(this.tx.serialize().toString('hex'));
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
exports.EthTransactionData = EthTransactionData;
|
|
131
|
+
function isLegacyTx(tx) {
|
|
132
|
+
return tx._type === iface_1.ETHTransactionType.LEGACY;
|
|
133
|
+
}
|
|
134
|
+
function isEIP1559Txn(tx) {
|
|
135
|
+
return tx._type === iface_1.ETHTransactionType.EIP1559;
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLG9EQUE0QjtBQUM1QixnRUFBcUM7QUFDckMsdUNBTXdCO0FBRXhCLHFEQUErRjtBQUMvRixtQ0FBc0g7QUFHdEgsMEdBQTBHO0FBQzFHLE1BQU0sY0FBYyxHQUFHLENBQUMsQ0FBQztBQUN6QixNQUFNLGVBQWUsR0FBRyxDQUFDLENBQUM7QUFFMUI7O0dBRUc7QUFDSCxNQUFhLGtCQUFrQjtJQUk3QixZQUFZLEVBQW9CLEVBQUUsSUFBcUQ7UUFDckYsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7UUFDYixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztJQUNuQixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFVLEVBQUUsTUFBc0I7UUFDdkQsTUFBTSxLQUFLLEdBQUcsOEJBQVksQ0FBQyxJQUFJLHNCQUFTLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2pFLE1BQU0sS0FBSyxHQUFHLDhCQUFZLENBQUMsSUFBSSxzQkFBUyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNqRSxNQUFNLFFBQVEsR0FBRyw4QkFBWSxDQUFDLElBQUksc0JBQVMsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdkUsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsOEJBQVksQ0FBQyxJQUFJLHNCQUFTLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FB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RSxDQUNILENBQUM7WUFFRixPQUFPO2dCQUNMLEdBQUcsTUFBTTtnQkFDVCxLQUFLLEVBQUUsMEJBQWtCLENBQUMsT0FBTztnQkFDakMsWUFBWTtnQkFDWixvQkFBb0I7YUFDckIsQ0FBQztTQUNIO2FBQU07WUFDTCxNQUFNLElBQUksS0FBSyxDQUFDLHdCQUF3QixpQ0FBNEIsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1NBQzlFO0lBQ0gsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixZQUFZO1FBQ1YsT0FBTyw4QkFBWSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDM0QsQ0FBQztDQUNGO0FBeElELGdEQXdJQztBQUVELFNBQVMsVUFBVSxDQUFDLEVBQVU7SUFDNUIsT0FBTyxFQUFFLENBQUMsS0FBSyxLQUFLLDBCQUFrQixDQUFDLE1BQU0sQ0FBQztBQUNoRCxDQUFDO0FBRUQsU0FBUyxZQUFZLENBQUMsRUFBVTtJQUM5QixPQUFPLEVBQUUsQ0FBQyxLQUFLLEtBQUssMEJBQWtCLENBQUMsT0FBTyxDQUFDO0FBQ2pELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgQmlnTnVtYmVyIGZyb20gJ2JpZ251bWJlci5qcyc7XG5pbXBvcnQge1xuICBUcmFuc2FjdGlvbkZhY3RvcnksXG4gIFR5cGVkVHJhbnNhY3Rpb24sXG4gIFRyYW5zYWN0aW9uIGFzIExlZ2FjeVRyYW5zYWN0aW9uLFxuICBGZWVNYXJrZXRFSVAxNTU5VHJhbnNhY3Rpb24sXG4gIEFjY2Vzc0xpc3RFSVAyOTMwVHJhbnNhY3Rpb24sXG59IGZyb20gJ0BldGhlcmV1bWpzL3R4JztcbmltcG9ydCBFdGhlcmV1bUNvbW1vbiBmcm9tICdAZXRoZXJldW1qcy9jb21tb24nO1xuaW1wb3J0IHsgYnVmZmVyVG9IZXgsIGJ1ZmZlclRvSW50LCB0b0J1ZmZlciwgdG9VbnNpZ25lZCwgYWRkSGV4UHJlZml4IH0gZnJvbSAnZXRoZXJldW1qcy11dGlsJztcbmltcG9ydCB7IEJhc2VUeERhdGEsIEVJUDE1NTlUeERhdGEsIEV0aExpa2VUcmFuc2FjdGlvbkRhdGEsIExlZ2FjeVR4RGF0YSwgRVRIVHJhbnNhY3Rpb25UeXBlLCBUeERhdGEgfSBmcm9tICcuL2lmYWNlJztcbmltcG9ydCB7IEtleVBhaXIgfSBmcm9tICcuL2tleVBhaXInO1xuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vZXRoZXJldW1qcy9ldGhlcmV1bWpzLW1vbm9yZXBvL2Jsb2IvbWFzdGVyL3BhY2thZ2VzL3R4L3NyYy90cmFuc2FjdGlvbkZhY3RvcnkudHMjTDMxXG5jb25zdCBMRUdBQ1lfVFhfVFlQRSA9IDA7XG5jb25zdCBFSVAxNTU5X1RYX1RZUEUgPSAyO1xuXG4vKipcbiAqIEFuIEV0aGVyZXVtIHRyYW5zYWN0aW9uIHdpdGggaGVscGVycyBmb3Igc2VyaWFsaXphdGlvbiBhbmQgZGVzZXJpYWxpemF0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgRXRoVHJhbnNhY3Rpb25EYXRhIGltcGxlbWVudHMgRXRoTGlrZVRyYW5zYWN0aW9uRGF0YSB7XG4gIHByaXZhdGUgdHg6IFR5cGVkVHJhbnNhY3Rpb247XG4gIHByb3RlY3RlZCBhcmdzPzogeyBkZXBsb3llZEFkZHJlc3M/OiBzdHJpbmc7IGNoYWluSWQ/OiBzdHJpbmcgfTtcblxuICBjb25zdHJ1Y3Rvcih0eDogVHlwZWRUcmFuc2FjdGlvbiwgYXJncz86IHsgZGVwbG95ZWRBZGRyZXNzPzogc3RyaW5nOyBjaGFpbklkPzogc3RyaW5nIH0pIHtcbiAgICB0aGlzLnR4ID0gdHg7XG4gICAgdGhpcy5hcmdzID0gYXJncztcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBhbiB0aGVyZXVtIHRyYW5zYWN0aW9uIGZyb20gaXRzIEpTT04gcmVwcmVzZW50YXRpb25cbiAgICpcbiAgICogQHBhcmFtIHtUeERhdGF9IHR4IFRoZSBKU09OIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge0V0aGVyZXVtQ29tbW9ufSBjb21tb24gQ2xhc3MgdG8gYWNjZXNzIGNoYWluIGFuZCBoYXJkZm9yayBwYXJhbWV0ZXJzXG4gICAqIEByZXR1cm5zIHtFdGhUcmFuc2FjdGlvbkRhdGF9IGEgbmV3IGV0aGVyZXVtIHRyYW5zYWN0aW9uIG9iamVjdFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tSnNvbih0eDogVHhEYXRhLCBjb21tb246IEV0aGVyZXVtQ29tbW9uKTogRXRoVHJhbnNhY3Rpb25EYXRhIHtcbiAgICBjb25zdCBub25jZSA9IGFkZEhleFByZWZpeChuZXcgQmlnTnVtYmVyKHR4Lm5vbmNlKS50b1N0cmluZygxNikpO1xuICAgIGNvbnN0IHZhbHVlID0gYWRkSGV4UHJlZml4KG5ldyBCaWdOdW1iZXIodHgudmFsdWUpLnRvU3RyaW5nKDE2KSk7XG4gICAgY29uc3QgZ2FzTGltaXQgPSBhZGRIZXhQcmVmaXgobmV3IEJpZ051bWJlcih0eC5nYXNMaW1pdCkudG9TdHJpbmcoMTYpKTtcbiAgICBjb25zdCBjaGFpbklkID0gdHguY2hhaW5JZCA/IGFkZEhleFByZWZpeChuZXcgQmlnTnVtYmVyKHR4LmNoYWluSWQpLnRvU3RyaW5nKDE2KSkgOiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBnYXNQcmljZSA9IGlzTGVnYWN5VHgodHgpID8gYWRkSGV4UHJlZml4KG5ldyBCaWdOdW1iZXIodHguZ2FzUHJpY2UpLnRvU3RyaW5nKDE2KSkgOiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBtYXhGZWVQZXJHYXMgPSBpc0VJUDE1NTlUeG4odHgpID8gYWRkSGV4UHJlZml4KG5ldyBCaWdOdW1iZXIodHgubWF4RmVlUGVyR2FzKS50b1N0cmluZygxNikpIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IG1heFByaW9yaXR5RmVlUGVyR2FzID0gaXNFSVAxNTU5VHhuKHR4KVxuICAgICAgPyBhZGRIZXhQcmVmaXgobmV3IEJpZ051bWJlcih0eC5tYXhQcmlvcml0eUZlZVBlckdhcykudG9TdHJpbmcoMTYpKVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICByZXR1cm4gbmV3IEV0aFRyYW5zYWN0aW9uRGF0YShcbiAgICAgIFRyYW5zYWN0aW9uRmFjdG9yeS5mcm9tVHhEYXRhKFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogaXNMZWdhY3lUeCh0eCkgPyBMRUdBQ1lfVFhfVFlQRSA6IEVJUDE1NTlfVFhfVFlQRSxcbiAgICAgICAgICBjaGFpbklkLFxuICAgICAgICAgIG5vbmNlLFxuICAgICAgICAgIHRvOiB0eC50byxcbiAgICAgICAgICBnYXNQcmljZSxcbiAgICAgICAgICBnYXNMaW1pdCxcbiAgICAgICAgICBtYXhGZWVQZXJHYXMsXG4gICAgICAgICAgbWF4UHJpb3JpdHlGZWVQZXJHYXMsXG4gICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgZGF0YTogdHguZGF0YSxcbiAgICAgICAgICB2OiB0eC52LFxuICAgICAgICAgIHI6IHR4LnIsXG4gICAgICAgICAgczogdHgucyxcbiAgICAgICAgfSxcbiAgICAgICAgeyBjb21tb246IGNvbW1vbiB9XG4gICAgICApLFxuICAgICAge1xuICAgICAgICBkZXBsb3llZEFkZHJlc3M6IHR4LmRlcGxveWVkQWRkcmVzcyxcbiAgICAgICAgY2hhaW5JZDogYWRkSGV4UHJlZml4KG5ldyBCaWdOdW1iZXIoTnVtYmVyKHR4LmNoYWluSWQpKS50b1N0cmluZygxNikpLFxuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgYW4gZXRoZXJldW0gdHJhbnNhY3Rpb24gZnJvbSBpdHMgc3RyaW5nIHNlcmlhbGl6YXRpb25cbiAgICpcbiAgICogQHBhcmFtIHR4IFRoZSBzdHJpbmcgc2VyaWFsaXphdGlvbiBvZiB0aGUgZXRoZXJldW0gdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIGNvbW1vblxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tU2VyaWFsaXplZCh0eDogc3RyaW5nLCBjb21tb246IEV0aGVyZXVtQ29tbW9uKTogRXRoVHJhbnNhY3Rpb25EYXRhIHtcbiAgICByZXR1cm4gbmV3IEV0aFRyYW5zYWN0aW9uRGF0YShcbiAgICAgIFRyYW5zYWN0aW9uRmFjdG9yeS5mcm9tU2VyaWFsaXplZERhdGEodG9CdWZmZXIoYWRkSGV4UHJlZml4KHR4KSksIHsgY29tbW9uOiBjb21tb24gfSlcbiAgICApO1xuICB9XG5cbiAgc2lnbihrZXlQYWlyOiBLZXlQYWlyKSB7XG4gICAgY29uc3QgcHJpdmF0ZUtleSA9IEJ1ZmZlci5mcm9tKGtleVBhaXIuZ2V0S2V5cygpLnBydiBhcyBzdHJpbmcsICdoZXgnKTtcbiAgICB0aGlzLnR4ID0gdGhpcy50eC5zaWduKHByaXZhdGVLZXkpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHRvSnNvbigpOiBUeERhdGEge1xuICAgIGNvbnN0IHJlc3VsdDogQmFzZVR4RGF0YSA9IHtcbiAgICAgIG5vbmNlOiBidWZmZXJUb0ludCh0b1Vuc2lnbmVkKHRoaXMudHgubm9uY2UpKSxcbiAgICAgIGdhc0xpbWl0OiBuZXcgQmlnTnVtYmVyKGJ1ZmZlclRvSGV4KHRvVW5zaWduZWQodGhpcy50eC5nYXNMaW1pdCkpLCAxNikudG9TdHJpbmcoMTApLFxuICAgICAgdmFsdWU6IHRoaXMudHgudmFsdWUudG9TdHJpbmcoMTApLFxuICAgICAgZGF0YTogYnVmZmVyVG9IZXgodGhpcy50eC5kYXRhKSxcbiAgICB9O1xuXG4gICAgaWYgKHRoaXMudHguaXNTaWduZWQoKSkge1xuICAgICAgcmVzdWx0LmlkID0gYWRkSGV4UHJlZml4KGJ1ZmZlclRvSGV4KHRoaXMudHguaGFzaCgpKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdC5pZCA9IGFkZEhleFByZWZpeChidWZmZXJUb0hleCh0aGlzLnR4LmdldE1lc3NhZ2VUb1NpZ24oKSkpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnR4LnRvKSB7XG4gICAgICByZXN1bHQudG8gPSBidWZmZXJUb0hleCh0aGlzLnR4LnRvLnRvQnVmZmVyKCkpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnR4LnZlcmlmeVNpZ25hdHVyZSgpKSB7XG4gICAgICByZXN1bHQuZnJvbSA9IGJ1ZmZlclRvSGV4KHRoaXMudHguZ2V0U2VuZGVyQWRkcmVzcygpLnRvQnVmZmVyKCkpO1xuICAgICAgYXNzZXJ0KHRoaXMudHguciAhPSB1bmRlZmluZWQpO1xuICAgICAgcmVzdWx0LnIgPSBidWZmZXJUb0hleCh0b1Vuc2lnbmVkKHRoaXMudHgucikpO1xuICAgICAgYXNzZXJ0KHRoaXMudHgucyAhPSB1bmRlZmluZWQpO1xuICAgICAgcmVzdWx0LnMgPSBidWZmZXJUb0hleCh0b1Vuc2lnbmVkKHRoaXMudHgucykpO1xuICAgIH1cbiAgICBpZiAodGhpcy50eC52KSB7XG4gICAgICByZXN1bHQudiA9IGJ1ZmZlclRvSGV4KHRvVW5zaWduZWQodGhpcy50eC52KSk7XG4gICAgfVxuICAgIHJlc3VsdC5jaGFpbklkID0gYWRkSGV4UHJlZml4KHRoaXMudHguY29tbW9uLmNoYWluSWRCTigpLnRvU3RyaW5nKDE2KSk7XG5cbiAgICBpZiAodGhpcy5hcmdzICYmIHRoaXMuYXJncy5kZXBsb3llZEFkZHJlc3MpIHtcbiAgICAgIHJlc3VsdC5kZXBsb3llZEFkZHJlc3MgPSB0aGlzLmFyZ3MuZGVwbG95ZWRBZGRyZXNzO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnR4IGluc3RhbmNlb2YgTGVnYWN5VHJhbnNhY3Rpb24pIHtcbiAgICAgIGNvbnN0IGdhc1ByaWNlID0gbmV3IEJpZ051bWJlcihidWZmZXJUb0hleCh0b1Vuc2lnbmVkKHRoaXMudHguZ2FzUHJpY2UpKSwgMTYpLnRvU3RyaW5nKDEwKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4ucmVzdWx0LFxuICAgICAgICBfdHlwZTogRVRIVHJhbnNhY3Rpb25UeXBlLkxFR0FDWSxcbiAgICAgICAgZ2FzUHJpY2UsXG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAodGhpcy50eCBpbnN0YW5jZW9mIEZlZU1hcmtldEVJUDE1NTlUcmFuc2FjdGlvbikge1xuICAgICAgY29uc3QgbWF4RmVlUGVyR2FzID0gbmV3IEJpZ051bWJlcihidWZmZXJUb0hleCh0b1Vuc2lnbmVkKHRoaXMudHgubWF4RmVlUGVyR2FzKSksIDE2KS50b1N0cmluZygxMCk7XG4gICAgICBjb25zdCBtYXhQcmlvcml0eUZlZVBlckdhcyA9IG5ldyBCaWdOdW1iZXIoYnVmZmVyVG9IZXgodG9VbnNpZ25lZCh0aGlzLnR4Lm1heFByaW9yaXR5RmVlUGVyR2FzKSksIDE2KS50b1N0cmluZyhcbiAgICAgICAgMTBcbiAgICAgICk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnJlc3VsdCxcbiAgICAgICAgX3R5cGU6IEVUSFRyYW5zYWN0aW9uVHlwZS5FSVAxNTU5LFxuICAgICAgICBtYXhGZWVQZXJHYXMsXG4gICAgICAgIG1heFByaW9yaXR5RmVlUGVyR2FzLFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCB0eCB0eXBlOiAke0FjY2Vzc0xpc3RFSVAyOTMwVHJhbnNhY3Rpb24ubmFtZX1gKTtcbiAgICB9XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgdG9TZXJpYWxpemVkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGFkZEhleFByZWZpeCh0aGlzLnR4LnNlcmlhbGl6ZSgpLnRvU3RyaW5nKCdoZXgnKSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNMZWdhY3lUeCh0eDogVHhEYXRhKTogdHggaXMgTGVnYWN5VHhEYXRhIHtcbiAgcmV0dXJuIHR4Ll90eXBlID09PSBFVEhUcmFuc2FjdGlvblR5cGUuTEVHQUNZO1xufVxuXG5mdW5jdGlvbiBpc0VJUDE1NTlUeG4odHg6IFR4RGF0YSk6IHR4IGlzIEVJUDE1NTlUeERhdGEge1xuICByZXR1cm4gdHguX3R5cGUgPT09IEVUSFRyYW5zYWN0aW9uVHlwZS5FSVAxNTU5O1xufVxuIl19
|