@bitgo-beta/abstract-eth 1.0.2-beta.52 → 1.0.2-beta.520

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.
Files changed (57) hide show
  1. package/CHANGELOG.md +1233 -0
  2. package/dist/src/abstractEthLikeCoin.d.ts +10 -5
  3. package/dist/src/abstractEthLikeCoin.d.ts.map +1 -1
  4. package/dist/src/abstractEthLikeCoin.js +13 -10
  5. package/dist/src/abstractEthLikeNewCoins.d.ts +625 -0
  6. package/dist/src/abstractEthLikeNewCoins.d.ts.map +1 -0
  7. package/dist/src/abstractEthLikeNewCoins.js +1833 -0
  8. package/dist/src/ethLikeToken.d.ts +34 -4
  9. package/dist/src/ethLikeToken.d.ts.map +1 -1
  10. package/dist/src/ethLikeToken.js +281 -7
  11. package/dist/src/index.d.ts +2 -0
  12. package/dist/src/index.d.ts.map +1 -1
  13. package/dist/src/index.js +3 -1
  14. package/dist/src/lib/contractCall.d.ts +8 -0
  15. package/dist/src/lib/contractCall.d.ts.map +1 -0
  16. package/dist/src/lib/contractCall.js +17 -0
  17. package/dist/src/lib/iface.d.ts +131 -0
  18. package/dist/src/lib/iface.d.ts.map +1 -0
  19. package/dist/src/lib/iface.js +8 -0
  20. package/dist/src/lib/index.d.ts +15 -0
  21. package/dist/src/lib/index.d.ts.map +1 -0
  22. package/dist/src/lib/index.js +42 -0
  23. package/dist/src/lib/keyPair.d.ts +26 -0
  24. package/dist/src/lib/keyPair.d.ts.map +1 -0
  25. package/dist/src/lib/keyPair.js +66 -0
  26. package/dist/src/lib/transaction.d.ts +64 -0
  27. package/dist/src/lib/transaction.d.ts.map +1 -0
  28. package/dist/src/lib/transaction.js +137 -0
  29. package/dist/src/lib/transactionBuilder.d.ts +239 -0
  30. package/dist/src/lib/transactionBuilder.d.ts.map +1 -0
  31. package/dist/src/lib/transactionBuilder.js +708 -0
  32. package/dist/src/lib/transferBuilder.d.ts +67 -0
  33. package/dist/src/lib/transferBuilder.d.ts.map +1 -0
  34. package/dist/src/lib/transferBuilder.js +242 -0
  35. package/dist/src/lib/transferBuilders/baseNFTTransferBuilder.d.ts +52 -0
  36. package/dist/src/lib/transferBuilders/baseNFTTransferBuilder.d.ts.map +1 -0
  37. package/dist/src/lib/transferBuilders/baseNFTTransferBuilder.js +114 -0
  38. package/dist/src/lib/transferBuilders/index.d.ts +4 -0
  39. package/dist/src/lib/transferBuilders/index.d.ts.map +1 -0
  40. package/dist/src/lib/transferBuilders/index.js +16 -0
  41. package/dist/src/lib/transferBuilders/transferBuilderERC1155.d.ts +16 -0
  42. package/dist/src/lib/transferBuilders/transferBuilderERC1155.d.ts.map +1 -0
  43. package/dist/src/lib/transferBuilders/transferBuilderERC1155.js +93 -0
  44. package/dist/src/lib/transferBuilders/transferBuilderERC721.d.ts +15 -0
  45. package/dist/src/lib/transferBuilders/transferBuilderERC721.d.ts.map +1 -0
  46. package/dist/src/lib/transferBuilders/transferBuilderERC721.js +78 -0
  47. package/dist/src/lib/types.d.ts +39 -0
  48. package/dist/src/lib/types.d.ts.map +1 -0
  49. package/dist/src/lib/types.js +137 -0
  50. package/dist/src/lib/utils.d.ts +260 -0
  51. package/dist/src/lib/utils.d.ts.map +1 -0
  52. package/dist/src/lib/utils.js +650 -0
  53. package/dist/src/lib/walletUtil.d.ts +28 -0
  54. package/dist/src/lib/walletUtil.d.ts.map +1 -0
  55. package/dist/src/lib/walletUtil.js +31 -0
  56. package/dist/tsconfig.tsbuildinfo +1 -7914
  57. 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