@airgap/ethereum 0.13.45-beta.3 → 0.13.45-beta.5

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 (82) hide show
  1. package/package.json +5 -5
  2. package/v0/index.js +10 -10
  3. package/v0/index.js.map +1 -1
  4. package/v0/protocol/BaseEthereumProtocol.d.ts +1 -0
  5. package/v0/protocol/BaseEthereumProtocol.js +872 -460
  6. package/v0/protocol/BaseEthereumProtocol.js.map +1 -1
  7. package/v0/protocol/EthereumAddress.d.ts +1 -0
  8. package/v0/protocol/EthereumAddress.js +17 -26
  9. package/v0/protocol/EthereumAddress.js.map +1 -1
  10. package/v0/protocol/EthereumClassicProtocol.js +23 -6
  11. package/v0/protocol/EthereumClassicProtocol.js.map +1 -1
  12. package/v0/protocol/EthereumCryptoClient.js +125 -66
  13. package/v0/protocol/EthereumCryptoClient.js.map +1 -1
  14. package/v0/protocol/EthereumProtocol.js +28 -9
  15. package/v0/protocol/EthereumProtocol.js.map +1 -1
  16. package/v0/protocol/EthereumProtocolOptions.d.ts +1 -1
  17. package/v0/protocol/EthereumProtocolOptions.js +117 -36
  18. package/v0/protocol/EthereumProtocolOptions.js.map +1 -1
  19. package/v0/protocol/EthereumRopstenProtocol.js +23 -6
  20. package/v0/protocol/EthereumRopstenProtocol.js.map +1 -1
  21. package/v0/protocol/clients/info-clients/EtherscanInfoClient.js +186 -86
  22. package/v0/protocol/clients/info-clients/EtherscanInfoClient.js.map +1 -1
  23. package/v0/protocol/clients/info-clients/InfoClient.js +4 -3
  24. package/v0/protocol/clients/info-clients/InfoClient.js.map +1 -1
  25. package/v0/protocol/clients/node-clients/AirGapNodeClient.js +298 -126
  26. package/v0/protocol/clients/node-clients/AirGapNodeClient.js.map +1 -1
  27. package/v0/protocol/clients/node-clients/NodeClient.js +4 -3
  28. package/v0/protocol/clients/node-clients/NodeClient.js.map +1 -1
  29. package/v0/protocol/erc20/ERC20.js +4 -4
  30. package/v0/protocol/erc20/ERC20.js.map +1 -1
  31. package/v0/protocol/erc20/GenericERC20.js +300 -161
  32. package/v0/protocol/erc20/GenericERC20.js.map +1 -1
  33. package/v0/protocol/utils/utils.js +55 -52
  34. package/v0/protocol/utils/utils.js.map +1 -1
  35. package/v0/serializer/validators/transaction-validator.js +31 -23
  36. package/v0/serializer/validators/transaction-validator.js.map +1 -1
  37. package/v0/serializer/validators/validators.js +73 -25
  38. package/v0/serializer/validators/validators.js.map +1 -1
  39. package/v1/block-explorer/EtherscanBlockExplorer.js +61 -12
  40. package/v1/block-explorer/EtherscanBlockExplorer.js.map +1 -1
  41. package/v1/clients/crypto/EthereumCryptoClient.js +124 -69
  42. package/v1/clients/crypto/EthereumCryptoClient.js.map +1 -1
  43. package/v1/clients/info/EthereumInfoClient.d.ts +1 -1
  44. package/v1/clients/info/EthereumInfoClient.js +4 -3
  45. package/v1/clients/info/EthereumInfoClient.js.map +1 -1
  46. package/v1/clients/info/EtherscanInfoClient.js +162 -84
  47. package/v1/clients/info/EtherscanInfoClient.js.map +1 -1
  48. package/v1/clients/node/HttpEthereumNodeClient.d.ts +2 -2
  49. package/v1/clients/node/HttpEthereumNodeClient.js +375 -164
  50. package/v1/clients/node/HttpEthereumNodeClient.js.map +1 -1
  51. package/v1/data/EthereumAddress.js +20 -29
  52. package/v1/data/EthereumAddress.js.map +1 -1
  53. package/v1/index.js +14 -14
  54. package/v1/index.js.map +1 -1
  55. package/v1/module/EthereumModule.js +112 -43
  56. package/v1/module/EthereumModule.js.map +1 -1
  57. package/v1/module.js +3 -2
  58. package/v1/module.js.map +1 -1
  59. package/v1/protocol/EthereumBaseProtocol.js +788 -467
  60. package/v1/protocol/EthereumBaseProtocol.js.map +1 -1
  61. package/v1/protocol/EthereumProtocol.js +46 -15
  62. package/v1/protocol/EthereumProtocol.js.map +1 -1
  63. package/v1/protocol/erc20/ERC20Protocol.js +360 -213
  64. package/v1/protocol/erc20/ERC20Protocol.js.map +1 -1
  65. package/v1/protocol/erc20/ERC20Token.d.ts +1 -1
  66. package/v1/protocol/erc20/ERC20Token.js +113 -35
  67. package/v1/protocol/erc20/ERC20Token.js.map +1 -1
  68. package/v1/serializer/v3/schemas/converter/transaction-converter.js +42 -25
  69. package/v1/serializer/v3/schemas/converter/transaction-converter.js.map +1 -1
  70. package/v1/serializer/v3/serializer-companion.js +148 -71
  71. package/v1/serializer/v3/serializer-companion.js.map +1 -1
  72. package/v1/serializer/v3/validators/transaction-validator.js +17 -14
  73. package/v1/serializer/v3/validators/transaction-validator.js.map +1 -1
  74. package/v1/types/crypto.d.ts +1 -1
  75. package/v1/types/protocol.d.ts +1 -1
  76. package/v1/types/transaction.d.ts +1 -1
  77. package/v1/utils/EthereumUtils.js +60 -57
  78. package/v1/utils/EthereumUtils.js.map +1 -1
  79. package/v1/utils/key.js +19 -28
  80. package/v1/utils/key.js.map +1 -1
  81. package/v1/utils/protocol.js +21 -33
  82. package/v1/utils/protocol.js.map +1 -1
@@ -1,4 +1,30 @@
1
1
  "use strict";
2
+ var __extends = (this && this.__extends) || (function () {
3
+ var extendStatics = function (d, b) {
4
+ extendStatics = Object.setPrototypeOf ||
5
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
6
+ function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
7
+ return extendStatics(d, b);
8
+ };
9
+ return function (d, b) {
10
+ if (typeof b !== "function" && b !== null)
11
+ throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
12
+ extendStatics(d, b);
13
+ function __() { this.constructor = d; }
14
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
15
+ };
16
+ })();
17
+ var __assign = (this && this.__assign) || function () {
18
+ __assign = Object.assign || function(t) {
19
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
20
+ s = arguments[i];
21
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
22
+ t[p] = s[p];
23
+ }
24
+ return t;
25
+ };
26
+ return __assign.apply(this, arguments);
27
+ };
2
28
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
29
  if (k2 === undefined) k2 = k;
4
30
  var desc = Object.getOwnPropertyDescriptor(m, k);
@@ -15,236 +41,357 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
15
41
  }) : function(o, v) {
16
42
  o["default"] = v;
17
43
  });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
44
+ var __importStar = (this && this.__importStar) || function (mod) {
45
+ if (mod && mod.__esModule) return mod;
46
+ var result = {};
47
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
48
+ __setModuleDefault(result, mod);
49
+ return result;
50
+ };
51
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
52
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
53
+ return new (P || (P = Promise))(function (resolve, reject) {
54
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
55
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
56
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
57
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
58
+ });
59
+ };
60
+ var __generator = (this && this.__generator) || function (thisArg, body) {
61
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
62
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
63
+ function verb(n) { return function (v) { return step([n, v]); }; }
64
+ function step(op) {
65
+ if (f) throw new TypeError("Generator is already executing.");
66
+ while (_) try {
67
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
68
+ if (y = 0, t) op = [op[0] & 2, t.value];
69
+ switch (op[0]) {
70
+ case 0: case 1: t = op; break;
71
+ case 4: _.label++; return { value: op[1], done: false };
72
+ case 5: _.label++; y = op[1]; op = [0]; continue;
73
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
74
+ default:
75
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
76
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
77
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
78
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
79
+ if (t[2]) _.ops.pop();
80
+ _.trys.pop(); continue;
81
+ }
82
+ op = body.call(thisArg, _);
83
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
84
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
85
+ }
86
+ };
35
87
  var __importDefault = (this && this.__importDefault) || function (mod) {
36
88
  return (mod && mod.__esModule) ? mod : { "default": mod };
37
89
  };
38
90
  Object.defineProperty(exports, "__esModule", { value: true });
39
91
  exports.ERC20ProtocolImpl = void 0;
40
- const coinlib_core_1 = require("@airgap/coinlib-core");
41
- const bignumber_1 = __importDefault(require("@airgap/coinlib-core/dependencies/src/bignumber.js-9.0.0/bignumber"));
92
+ var coinlib_core_1 = require("@airgap/coinlib-core");
93
+ var bignumber_1 = __importDefault(require("@airgap/coinlib-core/dependencies/src/bignumber.js-9.0.0/bignumber"));
42
94
  // @ts-ignore
43
- const ethUtil = __importStar(require("@airgap/coinlib-core/dependencies/src/ethereumjs-util-5.2.0"));
44
- const errors_1 = require("@airgap/coinlib-core/errors");
45
- const hex_1 = require("@airgap/coinlib-core/utils/hex");
46
- const module_kit_1 = require("@airgap/module-kit");
47
- const tx_1 = require("@ethereumjs/tx");
48
- const HttpEthereumNodeClient_1 = require("../../clients/node/HttpEthereumNodeClient");
49
- const EthereumUtils_1 = require("../../utils/EthereumUtils");
50
- const EthereumBaseProtocol_1 = require("../EthereumBaseProtocol");
51
- const EthereumTransaction = require('@airgap/coinlib-core/dependencies/src/ethereumjs-tx-1.3.7/index');
95
+ var ethUtil = __importStar(require("@airgap/coinlib-core/dependencies/src/ethereumjs-util-5.2.0"));
96
+ var errors_1 = require("@airgap/coinlib-core/errors");
97
+ var hex_1 = require("@airgap/coinlib-core/utils/hex");
98
+ var module_kit_1 = require("@airgap/module-kit");
99
+ var tx_1 = require("@ethereumjs/tx");
100
+ var HttpEthereumNodeClient_1 = require("../../clients/node/HttpEthereumNodeClient");
101
+ var EthereumUtils_1 = require("../../utils/EthereumUtils");
102
+ var EthereumBaseProtocol_1 = require("../EthereumBaseProtocol");
103
+ var EthereumTransaction = require('@airgap/coinlib-core/dependencies/src/ethereumjs-tx-1.3.7/index');
52
104
  // Implementation
53
- class ERC20ProtocolImpl extends EthereumBaseProtocol_1.EthereumBaseProtocolImpl {
54
- constructor(nodeClient, infoClient, options) {
55
- super(nodeClient, infoClient, {
105
+ var ERC20ProtocolImpl = /** @class */ (function (_super) {
106
+ __extends(ERC20ProtocolImpl, _super);
107
+ function ERC20ProtocolImpl(nodeClient, infoClient, options) {
108
+ var _this = _super.call(this, nodeClient, infoClient, {
56
109
  network: options.network,
57
110
  name: options.name,
58
111
  identifier: options.identifier,
59
112
  units: options.units,
60
113
  mainUnit: options.mainUnit
61
- });
62
- this.contractAddress = options.contractAddress;
114
+ }) || this;
115
+ _this.contractAddress = options.contractAddress;
116
+ return _this;
63
117
  }
64
118
  // Common
65
- async getDetailsFromTransaction(transaction, publicKey) {
66
- const ethTransactionDetails = await super.getDetailsFromTransaction(transaction, publicKey);
67
- switch (transaction.type) {
68
- case 'signed':
69
- return this.getDetailsFromSignedContractTransaction(transaction, ethTransactionDetails);
70
- case 'unsigned':
71
- return this.getDetailsFromUnsignedContractTransaction(transaction, ethTransactionDetails);
72
- default:
73
- (0, coinlib_core_1.assertNever)(transaction);
74
- throw new errors_1.UnsupportedError(coinlib_core_1.Domain.ETHEREUM, 'Unsupported transaction type.');
75
- }
76
- }
77
- async getDetailsFromSignedContractTransaction(transaction, ethTransactionDetails) {
78
- if (ethTransactionDetails.length !== 1) {
79
- throw new errors_1.ConditionViolationError(coinlib_core_1.Domain.ERC20, 'More than one ETH transaction detected.');
80
- }
81
- const extractedTx = new EthereumTransaction(transaction.serialized);
82
- const tokenTransferDetails = new HttpEthereumNodeClient_1.EthereumRPCDataTransfer(`0x${extractedTx.data.toString('hex')}`);
83
- return [
84
- {
85
- ...ethTransactionDetails[0],
86
- to: [ethUtil.toChecksumAddress(tokenTransferDetails.recipient)],
87
- amount: (0, module_kit_1.newAmount)(tokenTransferDetails.amount, 'blockchain')
88
- }
89
- ];
90
- }
91
- async getDetailsFromUnsignedContractTransaction(transaction, ethTransactionDetails) {
92
- if (ethTransactionDetails.length !== 1) {
93
- throw new errors_1.ConditionViolationError(coinlib_core_1.Domain.ERC20, 'More than one ETH transaction detected.');
94
- }
95
- let data;
96
- if (transaction.ethereumType === 'raw') {
97
- data = transaction.data;
98
- }
99
- else {
100
- const typedTransaction = tx_1.TransactionFactory.fromSerializedData(Buffer.from(transaction.serialized, 'hex'));
101
- data = typedTransaction.data.toString('hex');
102
- }
103
- const tokenTransferDetails = new HttpEthereumNodeClient_1.EthereumRPCDataTransfer(data);
104
- return [
105
- {
106
- ...ethTransactionDetails[0],
107
- to: [ethUtil.toChecksumAddress(tokenTransferDetails.recipient)],
108
- amount: (0, module_kit_1.newAmount)(tokenTransferDetails.amount, 'blockchain')
109
- }
110
- ];
111
- }
119
+ ERC20ProtocolImpl.prototype.getDetailsFromTransaction = function (transaction, publicKey) {
120
+ return __awaiter(this, void 0, void 0, function () {
121
+ var ethTransactionDetails;
122
+ return __generator(this, function (_a) {
123
+ switch (_a.label) {
124
+ case 0: return [4 /*yield*/, _super.prototype.getDetailsFromTransaction.call(this, transaction, publicKey)];
125
+ case 1:
126
+ ethTransactionDetails = _a.sent();
127
+ switch (transaction.type) {
128
+ case 'signed':
129
+ return [2 /*return*/, this.getDetailsFromSignedContractTransaction(transaction, ethTransactionDetails)];
130
+ case 'unsigned':
131
+ return [2 /*return*/, this.getDetailsFromUnsignedContractTransaction(transaction, ethTransactionDetails)];
132
+ default:
133
+ (0, coinlib_core_1.assertNever)(transaction);
134
+ throw new errors_1.UnsupportedError(coinlib_core_1.Domain.ETHEREUM, 'Unsupported transaction type.');
135
+ }
136
+ return [2 /*return*/];
137
+ }
138
+ });
139
+ });
140
+ };
141
+ ERC20ProtocolImpl.prototype.getDetailsFromSignedContractTransaction = function (transaction, ethTransactionDetails) {
142
+ return __awaiter(this, void 0, void 0, function () {
143
+ var extractedTx, tokenTransferDetails;
144
+ return __generator(this, function (_a) {
145
+ if (ethTransactionDetails.length !== 1) {
146
+ throw new errors_1.ConditionViolationError(coinlib_core_1.Domain.ERC20, 'More than one ETH transaction detected.');
147
+ }
148
+ extractedTx = new EthereumTransaction(transaction.serialized);
149
+ tokenTransferDetails = new HttpEthereumNodeClient_1.EthereumRPCDataTransfer("0x".concat(extractedTx.data.toString('hex')));
150
+ return [2 /*return*/, [
151
+ __assign(__assign({}, ethTransactionDetails[0]), { to: [ethUtil.toChecksumAddress(tokenTransferDetails.recipient)], amount: (0, module_kit_1.newAmount)(tokenTransferDetails.amount, 'blockchain') })
152
+ ]];
153
+ });
154
+ });
155
+ };
156
+ ERC20ProtocolImpl.prototype.getDetailsFromUnsignedContractTransaction = function (transaction, ethTransactionDetails) {
157
+ return __awaiter(this, void 0, void 0, function () {
158
+ var data, typedTransaction, tokenTransferDetails;
159
+ return __generator(this, function (_a) {
160
+ if (ethTransactionDetails.length !== 1) {
161
+ throw new errors_1.ConditionViolationError(coinlib_core_1.Domain.ERC20, 'More than one ETH transaction detected.');
162
+ }
163
+ if (transaction.ethereumType === 'raw') {
164
+ data = transaction.data;
165
+ }
166
+ else {
167
+ typedTransaction = tx_1.TransactionFactory.fromSerializedData(Buffer.from(transaction.serialized, 'hex'));
168
+ data = typedTransaction.data.toString('hex');
169
+ }
170
+ tokenTransferDetails = new HttpEthereumNodeClient_1.EthereumRPCDataTransfer(data);
171
+ return [2 /*return*/, [
172
+ __assign(__assign({}, ethTransactionDetails[0]), { to: [ethUtil.toChecksumAddress(tokenTransferDetails.recipient)], amount: (0, module_kit_1.newAmount)(tokenTransferDetails.amount, 'blockchain') })
173
+ ]];
174
+ });
175
+ });
176
+ };
112
177
  // Offline
113
- async signTransactionWithSecretKey(transaction, secretKey) {
114
- if (transaction.ethereumType !== 'raw') {
115
- // no v0 implementation
116
- throw new errors_1.ConditionViolationError(coinlib_core_1.Domain.ERC20, 'Unsupported unsigned transaction type.');
117
- }
118
- const rawTransaction = {
119
- ...transaction,
120
- data: !transaction.data || transaction.data === '0x'
121
- ? new HttpEthereumNodeClient_1.EthereumRPCDataTransfer(transaction.to, transaction.value).abiEncoded()
122
- : transaction.data
123
- };
124
- return super.signTransactionWithSecretKey(rawTransaction, secretKey);
125
- }
178
+ ERC20ProtocolImpl.prototype.signTransactionWithSecretKey = function (transaction, secretKey) {
179
+ return __awaiter(this, void 0, void 0, function () {
180
+ var rawTransaction;
181
+ return __generator(this, function (_a) {
182
+ if (transaction.ethereumType !== 'raw') {
183
+ // no v0 implementation
184
+ throw new errors_1.ConditionViolationError(coinlib_core_1.Domain.ERC20, 'Unsupported unsigned transaction type.');
185
+ }
186
+ rawTransaction = __assign(__assign({}, transaction), { data: !transaction.data || transaction.data === '0x'
187
+ ? new HttpEthereumNodeClient_1.EthereumRPCDataTransfer(transaction.to, transaction.value).abiEncoded()
188
+ : transaction.data });
189
+ return [2 /*return*/, _super.prototype.signTransactionWithSecretKey.call(this, rawTransaction, secretKey)];
190
+ });
191
+ });
192
+ };
126
193
  // Online
127
- async getTransactionsForPublicKey(publicKey, limit, cursor) {
128
- const address = await this.getAddressFromPublicKey(publicKey);
129
- return this.getTransactionsForAddress(address, limit, cursor);
130
- }
131
- async getTransactionsForAddress(address, limit, cursor) {
132
- return this.getTransactionsForAddresses([address], limit, cursor);
133
- }
134
- async getTransactionsForAddresses(addresses, limit, cursor) {
135
- return new Promise((overallResolve, overallReject) => {
136
- const promises = [];
137
- for (const address of addresses) {
138
- promises.push(this.infoClient.fetchContractTransactions(this.contractAddress, address, limit, cursor));
139
- }
140
- Promise.all(promises)
141
- .then((values) => {
142
- const page = Math.max(...values.map((txResult) => txResult.cursor.page));
143
- const transactions = values.reduce((acc, current) => {
144
- return acc.concat(current.transactions.map((tx) => ({
145
- ...tx,
146
- amount: (0, module_kit_1.newAmount)(tx.amount.value, 'blockchain'),
147
- fee: (0, module_kit_1.newAmount)(tx.fee.value, 'blockchain'),
148
- network: this.options.network
149
- })));
150
- }, []);
151
- const hasNext = transactions.length >= limit;
152
- overallResolve({
153
- transactions,
154
- cursor: {
155
- hasNext,
156
- page: hasNext ? page : undefined
157
- }
158
- });
159
- })
160
- .catch(overallReject);
194
+ ERC20ProtocolImpl.prototype.getTransactionsForPublicKey = function (publicKey, limit, cursor) {
195
+ return __awaiter(this, void 0, void 0, function () {
196
+ var address;
197
+ return __generator(this, function (_a) {
198
+ switch (_a.label) {
199
+ case 0: return [4 /*yield*/, this.getAddressFromPublicKey(publicKey)];
200
+ case 1:
201
+ address = _a.sent();
202
+ return [2 /*return*/, this.getTransactionsForAddress(address, limit, cursor)];
203
+ }
204
+ });
161
205
  });
162
- }
163
- async getBalanceOfPublicKey(publicKey) {
164
- const address = await this.getAddressFromPublicKey(publicKey);
165
- return this.getBalanceOfAddress(address);
166
- }
167
- async getBalanceOfAddress(address) {
168
- return this.getBalanceOfAddresses([address]);
169
- }
170
- async getBalanceOfAddresses(addresses) {
171
- const balances = await Promise.all(addresses.map((address) => {
172
- return this.nodeClient.callBalanceOf(this.contractAddress, address);
173
- }));
174
- const totalBalance = balances.reduce((a, b) => a.plus(b));
175
- return { total: (0, module_kit_1.newAmount)(totalBalance, 'blockchain') };
176
- }
177
- async getTransactionMaxAmountWithPublicKey(publicKey, to, configuration) {
178
- const balance = await this.getBalanceOfPublicKey(publicKey);
179
- return balance.transferable ?? balance.total;
180
- }
181
- async prepareTransactionWithPublicKey(publicKey, details, configuration) {
182
- if (details.length !== 1) {
183
- throw new errors_1.ConditionViolationError(coinlib_core_1.Domain.ETHEREUM, 'you cannot have 0 transaction details');
184
- }
185
- let fee;
186
- if (configuration?.fee !== undefined) {
187
- fee = configuration.fee;
188
- }
189
- else {
190
- const estimatedFee = await this.getTransactionFeeWithPublicKey(publicKey, details);
191
- fee = estimatedFee.medium;
192
- }
193
- const wrappedFee = new bignumber_1.default((0, module_kit_1.newAmount)(fee).blockchain(this.feeUnits).value);
194
- const wrappedAmount = new bignumber_1.default((0, module_kit_1.newAmount)(details[0].amount).blockchain(this.units).value);
195
- const balance = await this.getBalanceOfPublicKey(publicKey);
196
- const wrappedBalance = new bignumber_1.default((0, module_kit_1.newAmount)(balance.transferable ?? balance.total).blockchain(this.units).value);
197
- if (wrappedBalance.isGreaterThanOrEqualTo(wrappedAmount)) {
198
- const address = await this.getAddressFromPublicKey(publicKey);
199
- const ethBalance = await super.getBalanceOfAddresses([address]);
200
- const wrappedEthBalance = new bignumber_1.default((0, module_kit_1.newAmount)(ethBalance.total).blockchain(this.units).value);
201
- const estimatedGas = await this.estimateGas(address, details[0].to, wrappedAmount);
202
- if (wrappedEthBalance.isGreaterThanOrEqualTo(wrappedFee)) {
203
- const txCount = await this.nodeClient.fetchTransactionCount(address);
204
- const gasPrice = wrappedFee.isEqualTo(0)
205
- ? new bignumber_1.default(0)
206
- : wrappedFee.div(estimatedGas).integerValue(bignumber_1.default.ROUND_CEIL);
207
- const transaction = (0, module_kit_1.newUnsignedTransaction)({
208
- ethereumType: 'raw',
209
- nonce: EthereumUtils_1.EthereumUtils.toHex(txCount),
210
- gasLimit: EthereumUtils_1.EthereumUtils.toHex(estimatedGas.toFixed()),
211
- gasPrice: EthereumUtils_1.EthereumUtils.toHex(gasPrice.toFixed()),
212
- to: this.contractAddress,
213
- value: EthereumUtils_1.EthereumUtils.toHex(new bignumber_1.default(0).toFixed()),
214
- chainId: this.options.network.chainId,
215
- data: new HttpEthereumNodeClient_1.EthereumRPCDataTransfer(details[0].to, EthereumUtils_1.EthereumUtils.toHex(wrappedAmount.toFixed())).abiEncoded()
216
- });
217
- return transaction;
218
- }
219
- else {
220
- throw new errors_1.BalanceError(coinlib_core_1.Domain.ERC20, 'not enough ETH balance');
221
- }
222
- }
223
- else {
224
- throw new errors_1.BalanceError(coinlib_core_1.Domain.ERC20, 'not enough token balance');
225
- }
226
- }
206
+ };
207
+ ERC20ProtocolImpl.prototype.getTransactionsForAddress = function (address, limit, cursor) {
208
+ return __awaiter(this, void 0, void 0, function () {
209
+ return __generator(this, function (_a) {
210
+ return [2 /*return*/, this.getTransactionsForAddresses([address], limit, cursor)];
211
+ });
212
+ });
213
+ };
214
+ ERC20ProtocolImpl.prototype.getTransactionsForAddresses = function (addresses, limit, cursor) {
215
+ return __awaiter(this, void 0, void 0, function () {
216
+ var _this = this;
217
+ return __generator(this, function (_a) {
218
+ return [2 /*return*/, new Promise(function (overallResolve, overallReject) {
219
+ var promises = [];
220
+ for (var _i = 0, addresses_1 = addresses; _i < addresses_1.length; _i++) {
221
+ var address = addresses_1[_i];
222
+ promises.push(_this.infoClient.fetchContractTransactions(_this.contractAddress, address, limit, cursor));
223
+ }
224
+ Promise.all(promises)
225
+ .then(function (values) {
226
+ var page = Math.max.apply(Math, values.map(function (txResult) { return txResult.cursor.page; }));
227
+ var transactions = values.reduce(function (acc, current) {
228
+ return acc.concat(current.transactions.map(function (tx) { return (__assign(__assign({}, tx), { amount: (0, module_kit_1.newAmount)(tx.amount.value, 'blockchain'), fee: (0, module_kit_1.newAmount)(tx.fee.value, 'blockchain'), network: _this.options.network })); }));
229
+ }, []);
230
+ var hasNext = transactions.length >= limit;
231
+ overallResolve({
232
+ transactions: transactions,
233
+ cursor: {
234
+ hasNext: hasNext,
235
+ page: hasNext ? page : undefined
236
+ }
237
+ });
238
+ })
239
+ .catch(overallReject);
240
+ })];
241
+ });
242
+ });
243
+ };
244
+ ERC20ProtocolImpl.prototype.getBalanceOfPublicKey = function (publicKey) {
245
+ return __awaiter(this, void 0, void 0, function () {
246
+ var address;
247
+ return __generator(this, function (_a) {
248
+ switch (_a.label) {
249
+ case 0: return [4 /*yield*/, this.getAddressFromPublicKey(publicKey)];
250
+ case 1:
251
+ address = _a.sent();
252
+ return [2 /*return*/, this.getBalanceOfAddress(address)];
253
+ }
254
+ });
255
+ });
256
+ };
257
+ ERC20ProtocolImpl.prototype.getBalanceOfAddress = function (address) {
258
+ return __awaiter(this, void 0, void 0, function () {
259
+ return __generator(this, function (_a) {
260
+ return [2 /*return*/, this.getBalanceOfAddresses([address])];
261
+ });
262
+ });
263
+ };
264
+ ERC20ProtocolImpl.prototype.getBalanceOfAddresses = function (addresses) {
265
+ return __awaiter(this, void 0, void 0, function () {
266
+ var balances, totalBalance;
267
+ var _this = this;
268
+ return __generator(this, function (_a) {
269
+ switch (_a.label) {
270
+ case 0: return [4 /*yield*/, Promise.all(addresses.map(function (address) {
271
+ return _this.nodeClient.callBalanceOf(_this.contractAddress, address);
272
+ }))];
273
+ case 1:
274
+ balances = _a.sent();
275
+ totalBalance = balances.reduce(function (a, b) { return a.plus(b); });
276
+ return [2 /*return*/, { total: (0, module_kit_1.newAmount)(totalBalance, 'blockchain') }];
277
+ }
278
+ });
279
+ });
280
+ };
281
+ ERC20ProtocolImpl.prototype.getTransactionMaxAmountWithPublicKey = function (publicKey, to, configuration) {
282
+ var _a;
283
+ return __awaiter(this, void 0, void 0, function () {
284
+ var balance;
285
+ return __generator(this, function (_b) {
286
+ switch (_b.label) {
287
+ case 0: return [4 /*yield*/, this.getBalanceOfPublicKey(publicKey)];
288
+ case 1:
289
+ balance = _b.sent();
290
+ return [2 /*return*/, (_a = balance.transferable) !== null && _a !== void 0 ? _a : balance.total];
291
+ }
292
+ });
293
+ });
294
+ };
295
+ ERC20ProtocolImpl.prototype.prepareTransactionWithPublicKey = function (publicKey, details, configuration) {
296
+ var _a;
297
+ return __awaiter(this, void 0, void 0, function () {
298
+ var fee, estimatedFee, wrappedFee, wrappedAmount, balance, wrappedBalance, address, ethBalance, wrappedEthBalance, estimatedGas, txCount, gasPrice, transaction;
299
+ return __generator(this, function (_b) {
300
+ switch (_b.label) {
301
+ case 0:
302
+ if (details.length !== 1) {
303
+ throw new errors_1.ConditionViolationError(coinlib_core_1.Domain.ETHEREUM, 'you cannot have 0 transaction details');
304
+ }
305
+ if (!((configuration === null || configuration === void 0 ? void 0 : configuration.fee) !== undefined)) return [3 /*break*/, 1];
306
+ fee = configuration.fee;
307
+ return [3 /*break*/, 3];
308
+ case 1: return [4 /*yield*/, this.getTransactionFeeWithPublicKey(publicKey, details)];
309
+ case 2:
310
+ estimatedFee = _b.sent();
311
+ fee = estimatedFee.medium;
312
+ _b.label = 3;
313
+ case 3:
314
+ wrappedFee = new bignumber_1.default((0, module_kit_1.newAmount)(fee).blockchain(this.feeUnits).value);
315
+ wrappedAmount = new bignumber_1.default((0, module_kit_1.newAmount)(details[0].amount).blockchain(this.units).value);
316
+ return [4 /*yield*/, this.getBalanceOfPublicKey(publicKey)];
317
+ case 4:
318
+ balance = _b.sent();
319
+ wrappedBalance = new bignumber_1.default((0, module_kit_1.newAmount)((_a = balance.transferable) !== null && _a !== void 0 ? _a : balance.total).blockchain(this.units).value);
320
+ if (!wrappedBalance.isGreaterThanOrEqualTo(wrappedAmount)) return [3 /*break*/, 11];
321
+ return [4 /*yield*/, this.getAddressFromPublicKey(publicKey)];
322
+ case 5:
323
+ address = _b.sent();
324
+ return [4 /*yield*/, _super.prototype.getBalanceOfAddresses.call(this, [address])];
325
+ case 6:
326
+ ethBalance = _b.sent();
327
+ wrappedEthBalance = new bignumber_1.default((0, module_kit_1.newAmount)(ethBalance.total).blockchain(this.units).value);
328
+ return [4 /*yield*/, this.estimateGas(address, details[0].to, wrappedAmount)];
329
+ case 7:
330
+ estimatedGas = _b.sent();
331
+ if (!wrappedEthBalance.isGreaterThanOrEqualTo(wrappedFee)) return [3 /*break*/, 9];
332
+ return [4 /*yield*/, this.nodeClient.fetchTransactionCount(address)];
333
+ case 8:
334
+ txCount = _b.sent();
335
+ gasPrice = wrappedFee.isEqualTo(0)
336
+ ? new bignumber_1.default(0)
337
+ : wrappedFee.div(estimatedGas).integerValue(bignumber_1.default.ROUND_CEIL);
338
+ transaction = (0, module_kit_1.newUnsignedTransaction)({
339
+ ethereumType: 'raw',
340
+ nonce: EthereumUtils_1.EthereumUtils.toHex(txCount),
341
+ gasLimit: EthereumUtils_1.EthereumUtils.toHex(estimatedGas.toFixed()),
342
+ gasPrice: EthereumUtils_1.EthereumUtils.toHex(gasPrice.toFixed()),
343
+ to: this.contractAddress,
344
+ value: EthereumUtils_1.EthereumUtils.toHex(new bignumber_1.default(0).toFixed()),
345
+ chainId: this.options.network.chainId,
346
+ data: new HttpEthereumNodeClient_1.EthereumRPCDataTransfer(details[0].to, EthereumUtils_1.EthereumUtils.toHex(wrappedAmount.toFixed())).abiEncoded()
347
+ });
348
+ return [2 /*return*/, transaction];
349
+ case 9: throw new errors_1.BalanceError(coinlib_core_1.Domain.ERC20, 'not enough ETH balance');
350
+ case 10: return [3 /*break*/, 12];
351
+ case 11: throw new errors_1.BalanceError(coinlib_core_1.Domain.ERC20, 'not enough token balance');
352
+ case 12: return [2 /*return*/];
353
+ }
354
+ });
355
+ });
356
+ };
227
357
  // Custom
228
- async name() {
229
- return this.nodeClient.getContractName(this.contractAddress);
230
- }
231
- async symbol() {
232
- return this.nodeClient.getContractSymbol(this.contractAddress);
233
- }
234
- async decimals() {
235
- return this.nodeClient.getContractDecimals(this.contractAddress);
236
- }
237
- async estimateGas(fromAddress, toAddress, amount, _data) {
238
- let hexAmount;
239
- if (typeof amount === 'string' && (0, hex_1.isHex)(amount)) {
240
- hexAmount = amount;
241
- }
242
- else {
243
- const blockchainAmount = (0, module_kit_1.isAmount)(amount) ? (0, module_kit_1.newAmount)(amount).blockchain(this.units) : (0, module_kit_1.newAmount)(amount, 'blockchain');
244
- hexAmount = EthereumUtils_1.EthereumUtils.toHex(blockchainAmount.value);
245
- }
246
- return this.nodeClient.estimateTransferGas(this.contractAddress, fromAddress, toAddress, hexAmount);
247
- }
248
- }
358
+ ERC20ProtocolImpl.prototype.name = function () {
359
+ return __awaiter(this, void 0, void 0, function () {
360
+ return __generator(this, function (_a) {
361
+ return [2 /*return*/, this.nodeClient.getContractName(this.contractAddress)];
362
+ });
363
+ });
364
+ };
365
+ ERC20ProtocolImpl.prototype.symbol = function () {
366
+ return __awaiter(this, void 0, void 0, function () {
367
+ return __generator(this, function (_a) {
368
+ return [2 /*return*/, this.nodeClient.getContractSymbol(this.contractAddress)];
369
+ });
370
+ });
371
+ };
372
+ ERC20ProtocolImpl.prototype.decimals = function () {
373
+ return __awaiter(this, void 0, void 0, function () {
374
+ return __generator(this, function (_a) {
375
+ return [2 /*return*/, this.nodeClient.getContractDecimals(this.contractAddress)];
376
+ });
377
+ });
378
+ };
379
+ ERC20ProtocolImpl.prototype.estimateGas = function (fromAddress, toAddress, amount, _data) {
380
+ return __awaiter(this, void 0, void 0, function () {
381
+ var hexAmount, blockchainAmount;
382
+ return __generator(this, function (_a) {
383
+ if (typeof amount === 'string' && (0, hex_1.isHex)(amount)) {
384
+ hexAmount = amount;
385
+ }
386
+ else {
387
+ blockchainAmount = (0, module_kit_1.isAmount)(amount) ? (0, module_kit_1.newAmount)(amount).blockchain(this.units) : (0, module_kit_1.newAmount)(amount, 'blockchain');
388
+ hexAmount = EthereumUtils_1.EthereumUtils.toHex(blockchainAmount.value);
389
+ }
390
+ return [2 /*return*/, this.nodeClient.estimateTransferGas(this.contractAddress, fromAddress, toAddress, hexAmount)];
391
+ });
392
+ });
393
+ };
394
+ return ERC20ProtocolImpl;
395
+ }(EthereumBaseProtocol_1.EthereumBaseProtocolImpl));
249
396
  exports.ERC20ProtocolImpl = ERC20ProtocolImpl;
250
397
  //# sourceMappingURL=ERC20Protocol.js.map