@1inch/solidity-utils 1.2.8 → 2.0.4

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/LICENSE.md ADDED
@@ -0,0 +1,7 @@
1
+ Copyright (c) 2019-2021 1inch
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
4
+
5
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
6
+
7
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
package/README.md CHANGED
@@ -44,4 +44,4 @@ This repository contains frequently used smart contracts, libraries and interfac
44
44
 
45
45
  ### UTILS
46
46
 
47
- ...
47
+ ...
@@ -7,7 +7,7 @@ import "@openzeppelin/contracts/utils/Strings.sol";
7
7
 
8
8
  contract GasChecker {
9
9
  using Strings for uint256;
10
-
10
+
11
11
  modifier checkGasCost(uint256 expectedGasCost) {
12
12
  uint256 gas = gasleft();
13
13
  _;
@@ -18,14 +18,24 @@ library AddressArray {
18
18
 
19
19
  function get(Data storage self) internal view returns(address[] memory arr) {
20
20
  uint256 lengthAndFirst = self._raw[0];
21
+ arr = new address[](lengthAndFirst >> 160);
22
+ _get(self, arr, lengthAndFirst);
23
+ }
24
+
25
+ function get(Data storage self, address[] memory output) internal view returns(address[] memory) {
26
+ return _get(self, output, self._raw[0]);
27
+ }
28
+
29
+ function _get(Data storage self, address[] memory output, uint256 lengthAndFirst) private view returns(address[] memory) {
21
30
  uint256 len = lengthAndFirst >> 160;
22
- arr = new address[](len);
31
+ require(len <= output.length, "AddressArray: too small output");
23
32
  if (len > 0) {
24
- arr[0] = address(uint160(lengthAndFirst));
33
+ output[0] = address(uint160(lengthAndFirst));
25
34
  for (uint i = 1; i < len; i++) {
26
- arr[i] = address(uint160(self._raw[i]));
35
+ output[i] = address(uint160(self._raw[i]));
27
36
  }
28
37
  }
38
+ return output;
29
39
  }
30
40
 
31
41
  function push(Data storage self, address account) internal returns(uint256) {
@@ -15,7 +15,7 @@ import "./StringUtil.sol";
15
15
  library RevertReasonParser {
16
16
  using StringUtil for uint256;
17
17
  using StringUtil for bytes;
18
-
18
+
19
19
  bytes4 constant private _ERROR_SELECTOR = bytes4(keccak256("Error(string)"));
20
20
  bytes4 constant private _PANIC_SELECTOR = bytes4(keccak256("Panic(uint256)"));
21
21
 
@@ -58,10 +58,10 @@ library StringUtil {
58
58
  mstore(toPtr, 0x3078000000000000000000000000000000000000000000000000000000000000) // set 0x as first two bytes
59
59
  toPtr := add(toPtr, 0x02)
60
60
 
61
- for {
61
+ for {
62
62
  let fromPtr := add(data, 0x20)
63
63
  let endPtr := add(fromPtr, length)
64
- } lt(fromPtr, endPtr) {
64
+ } lt(fromPtr, endPtr) {
65
65
  fromPtr := add(fromPtr, 0x20)
66
66
  } {
67
67
  let rawData := mload(fromPtr)
@@ -60,4 +60,4 @@ library UniERC20 {
60
60
  require(abi.decode(result, (bool)), "ERC20 operation did not succeed");
61
61
  }
62
62
  }
63
- }
63
+ }
@@ -0,0 +1,3 @@
1
+ import BN from 'bn.js';
2
+ export declare function toBNExtended(value: string | number | BN): BN;
3
+ export declare function assertRoughlyEqualValues(expected: string | number | BN, actual: string | number | BN, relativeDiff: number): void;
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.assertRoughlyEqualValues = exports.toBNExtended = void 0;
4
+ const prelude_1 = require("./prelude");
5
+ function toBNExtended(value) {
6
+ if (typeof value === 'string' || typeof value === 'number') {
7
+ return (0, prelude_1.toBN)(value);
8
+ }
9
+ return value;
10
+ }
11
+ exports.toBNExtended = toBNExtended;
12
+ function assertRoughlyEqualValues(expected, actual, relativeDiff) {
13
+ const expectedBN = toBNExtended(expected);
14
+ const actualBN = toBNExtended(actual);
15
+ let multiplerNumerator = relativeDiff;
16
+ let multiplerDenominator = (0, prelude_1.toBN)('1');
17
+ while (!Number.isInteger(multiplerNumerator)) {
18
+ multiplerDenominator = multiplerDenominator.mul((0, prelude_1.toBN)('10'));
19
+ multiplerNumerator *= 10;
20
+ }
21
+ const diff = expectedBN.sub(actualBN).abs();
22
+ const treshold = expectedBN.mul((0, prelude_1.toBN)(multiplerNumerator.toString())).div(multiplerDenominator);
23
+ if (!diff.lte(treshold)) {
24
+ (0, prelude_1.expect)(actualBN).to.be.bignumber.equal(expectedBN, `${actualBN} != ${expectedBN} with ${relativeDiff} precision`);
25
+ }
26
+ }
27
+ exports.assertRoughlyEqualValues = assertRoughlyEqualValues;
28
+ //# sourceMappingURL=asserts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asserts.js","sourceRoot":"","sources":["../../src/asserts.ts"],"names":[],"mappings":";;;AAAA,uCAAyC;AAGzC,SAAgB,YAAY,CAAE,KAA2B;IACrD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;QACxD,OAAO,IAAA,cAAI,EAAC,KAAK,CAAC,CAAC;KACtB;IACD,OAAO,KAAK,CAAC;AACjB,CAAC;AALD,oCAKC;AAED,SAAgB,wBAAwB,CAAE,QAA8B,EAAE,MAA4B,EAAE,YAAoB;IACxH,MAAM,UAAU,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IAC1C,MAAM,QAAQ,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IAEtC,IAAI,kBAAkB,GAAG,YAAY,CAAC;IACtC,IAAI,oBAAoB,GAAG,IAAA,cAAI,EAAC,GAAG,CAAC,CAAC;IACrC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,kBAAkB,CAAC,EAAE;QAC1C,oBAAoB,GAAG,oBAAoB,CAAC,GAAG,CAAC,IAAA,cAAI,EAAC,IAAI,CAAC,CAAC,CAAC;QAC5D,kBAAkB,IAAI,EAAE,CAAC;KAC5B;IACD,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,GAAG,EAAE,CAAC;IAC5C,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,IAAA,cAAI,EAAC,kBAAkB,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IAC/F,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;QACrB,IAAA,gBAAM,EAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,UAAU,EAAE,GAAG,QAAQ,OAAO,UAAU,SAAS,YAAY,YAAY,CAAC,CAAC;KACrH;AACL,CAAC;AAfD,4DAeC"}
@@ -0,0 +1,5 @@
1
+ export * from './asserts';
2
+ export * from './permit';
3
+ export * from './prelude';
4
+ export * from './profileEVM';
5
+ export * from './utils';
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ // created from 'create-ts-index'
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const tslib_1 = require("tslib");
5
+ (0, tslib_1.__exportStar)(require("./asserts"), exports);
6
+ (0, tslib_1.__exportStar)(require("./permit"), exports);
7
+ (0, tslib_1.__exportStar)(require("./prelude"), exports);
8
+ (0, tslib_1.__exportStar)(require("./profileEVM"), exports);
9
+ (0, tslib_1.__exportStar)(require("./utils"), exports);
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA,iCAAiC;;;AAEjC,yDAA0B;AAC1B,wDAAyB;AACzB,yDAA0B;AAC1B,4DAA6B;AAC7B,uDAAwB"}
@@ -0,0 +1,79 @@
1
+ import { MessageTypes, SignTypedDataVersion, TypedMessage } from '@metamask/eth-sig-util';
2
+ import { Token } from './utils';
3
+ export declare const TypedDataVersion = SignTypedDataVersion.V3;
4
+ export declare const defaultDeadline: string;
5
+ export declare const EIP712Domain: {
6
+ name: string;
7
+ type: string;
8
+ }[];
9
+ export declare const Permit: {
10
+ name: string;
11
+ type: string;
12
+ }[];
13
+ export declare const DaiLikePermit: {
14
+ name: string;
15
+ type: string;
16
+ }[];
17
+ export declare function trim0x(bigNumber: BN | string): string;
18
+ export declare function cutSelector(data: string): string;
19
+ export declare function domainSeparator(name: string, version: string, chainId: string, verifyingContract: string): string;
20
+ export declare function buildData(name: string, version: string, chainId: number, verifyingContract: string, owner: string, spender: string, value: string, nonce: string, deadline?: string): {
21
+ readonly primaryType: "Permit";
22
+ readonly types: {
23
+ readonly EIP712Domain: {
24
+ name: string;
25
+ type: string;
26
+ }[];
27
+ readonly Permit: {
28
+ name: string;
29
+ type: string;
30
+ }[];
31
+ };
32
+ readonly domain: {
33
+ readonly name: string;
34
+ readonly version: string;
35
+ readonly chainId: number;
36
+ readonly verifyingContract: string;
37
+ };
38
+ readonly message: {
39
+ readonly owner: string;
40
+ readonly spender: string;
41
+ readonly value: string;
42
+ readonly nonce: string;
43
+ readonly deadline: string;
44
+ };
45
+ };
46
+ export declare function buildDataLikeDai(name: string, version: string, chainId: number, verifyingContract: string, holder: string, spender: string, nonce: string, allowed: boolean, expiry?: string): {
47
+ readonly primaryType: "Permit";
48
+ readonly types: {
49
+ readonly EIP712Domain: {
50
+ name: string;
51
+ type: string;
52
+ }[];
53
+ readonly Permit: {
54
+ name: string;
55
+ type: string;
56
+ }[];
57
+ };
58
+ readonly domain: {
59
+ readonly name: string;
60
+ readonly version: string;
61
+ readonly chainId: number;
62
+ readonly verifyingContract: string;
63
+ };
64
+ readonly message: {
65
+ readonly holder: string;
66
+ readonly spender: string;
67
+ readonly nonce: string;
68
+ readonly expiry: string;
69
+ readonly allowed: boolean;
70
+ };
71
+ };
72
+ export interface PermittableToken extends Token {
73
+ nonces(owner: string, txDetails?: Truffle.TransactionDetails): Promise<BN>;
74
+ name(txDetails?: Truffle.TransactionDetails): Promise<string>;
75
+ }
76
+ export declare function signWithPk<T extends MessageTypes>(privateKey: string, data: TypedMessage<T>): string;
77
+ export declare function getPermit(owner: string, ownerPrivateKey: string, permitContract: PermittableToken, tokenVersion: string, chainId: number, spender: string, value: string, deadline?: string): Promise<string>;
78
+ export declare function getPermitLikeDai(holder: string, holderPrivateKey: string, permitContract: PermittableToken, tokenVersion: string, chainId: number, spender: string, allowed: boolean, expiry?: string): Promise<string>;
79
+ export declare function withTarget(target: BN | string, data: BN | string): string;
@@ -0,0 +1,98 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.withTarget = exports.getPermitLikeDai = exports.getPermit = exports.signWithPk = exports.buildDataLikeDai = exports.buildData = exports.domainSeparator = exports.cutSelector = exports.trim0x = exports.DaiLikePermit = exports.Permit = exports.EIP712Domain = exports.defaultDeadline = exports.TypedDataVersion = void 0;
4
+ const eth_sig_util_1 = require("@metamask/eth-sig-util");
5
+ const ethereumjs_util_1 = require("ethereumjs-util");
6
+ const prelude_1 = require("./prelude");
7
+ exports.TypedDataVersion = eth_sig_util_1.SignTypedDataVersion.V3;
8
+ exports.defaultDeadline = prelude_1.constants.MAX_UINT256;
9
+ exports.EIP712Domain = [
10
+ { name: 'name', type: 'string' },
11
+ { name: 'version', type: 'string' },
12
+ { name: 'chainId', type: 'uint256' },
13
+ { name: 'verifyingContract', type: 'address' },
14
+ ];
15
+ exports.Permit = [
16
+ { name: 'owner', type: 'address' },
17
+ { name: 'spender', type: 'address' },
18
+ { name: 'value', type: 'uint256' },
19
+ { name: 'nonce', type: 'uint256' },
20
+ { name: 'deadline', type: 'uint256' },
21
+ ];
22
+ exports.DaiLikePermit = [
23
+ { name: 'holder', type: 'address' },
24
+ { name: 'spender', type: 'address' },
25
+ { name: 'nonce', type: 'uint256' },
26
+ { name: 'expiry', type: 'uint256' },
27
+ { name: 'allowed', type: 'bool' },
28
+ ];
29
+ function trim0x(bigNumber) {
30
+ const s = bigNumber.toString();
31
+ if (s.startsWith('0x')) {
32
+ return s.substring(2);
33
+ }
34
+ return s;
35
+ }
36
+ exports.trim0x = trim0x;
37
+ function cutSelector(data) {
38
+ const hexPrefix = '0x';
39
+ return hexPrefix + data.substr(hexPrefix.length + 8);
40
+ }
41
+ exports.cutSelector = cutSelector;
42
+ function domainSeparator(name, version, chainId, verifyingContract) {
43
+ return '0x' + eth_sig_util_1.TypedDataUtils.hashStruct('EIP712Domain', { name, version, chainId, verifyingContract }, { EIP712Domain: exports.EIP712Domain }, exports.TypedDataVersion).toString('hex');
44
+ }
45
+ exports.domainSeparator = domainSeparator;
46
+ function buildData(name, version, chainId, verifyingContract, owner, spender, value, nonce, deadline = exports.defaultDeadline) {
47
+ return {
48
+ primaryType: 'Permit',
49
+ types: { EIP712Domain: exports.EIP712Domain, Permit: exports.Permit },
50
+ domain: { name, version, chainId, verifyingContract },
51
+ message: { owner, spender, value, nonce, deadline },
52
+ };
53
+ }
54
+ exports.buildData = buildData;
55
+ function buildDataLikeDai(name, version, chainId, verifyingContract, holder, spender, nonce, allowed, expiry = exports.defaultDeadline) {
56
+ return {
57
+ primaryType: 'Permit',
58
+ types: { EIP712Domain: exports.EIP712Domain, Permit: exports.DaiLikePermit },
59
+ domain: { name, version, chainId, verifyingContract },
60
+ message: { holder, spender, nonce, expiry, allowed },
61
+ };
62
+ }
63
+ exports.buildDataLikeDai = buildDataLikeDai;
64
+ function signWithPk(privateKey, data) {
65
+ return (0, eth_sig_util_1.signTypedData)({ privateKey: Buffer.from(trim0x(privateKey), 'hex'), data, version: exports.TypedDataVersion });
66
+ }
67
+ exports.signWithPk = signWithPk;
68
+ /*
69
+ * @param permitContract The contract object with ERC20Permit type and token address for which the permit creating.
70
+ */
71
+ async function getPermit(owner, ownerPrivateKey, permitContract, tokenVersion, chainId, spender, value, deadline = exports.defaultDeadline) {
72
+ const nonce = await permitContract.nonces(owner);
73
+ const name = await permitContract.name();
74
+ const data = buildData(name, tokenVersion, chainId, permitContract.address, owner, spender, value, nonce.toString(), deadline);
75
+ const signature = signWithPk(ownerPrivateKey, data);
76
+ const { v, r, s } = (0, ethereumjs_util_1.fromRpcSig)(signature);
77
+ const permitCall = permitContract.contract.methods.permit(owner, spender, value, deadline, v, r, s).encodeABI();
78
+ return cutSelector(permitCall);
79
+ }
80
+ exports.getPermit = getPermit;
81
+ /*
82
+ * @param permitContract The contract object with ERC20PermitLikeDai type and token address for which the permit creating.
83
+ */
84
+ async function getPermitLikeDai(holder, holderPrivateKey, permitContract, tokenVersion, chainId, spender, allowed, expiry = exports.defaultDeadline) {
85
+ const nonce = await permitContract.nonces(holder);
86
+ const name = await permitContract.name();
87
+ const data = buildDataLikeDai(name, tokenVersion, chainId, permitContract.address, holder, spender, nonce.toString(), allowed, expiry);
88
+ const signature = signWithPk(holderPrivateKey, data);
89
+ const { v, r, s } = (0, ethereumjs_util_1.fromRpcSig)(signature);
90
+ const permitCall = permitContract.contract.methods.permit(holder, spender, nonce, expiry, allowed, v, r, s).encodeABI();
91
+ return cutSelector(permitCall);
92
+ }
93
+ exports.getPermitLikeDai = getPermitLikeDai;
94
+ function withTarget(target, data) {
95
+ return target.toString() + trim0x(data);
96
+ }
97
+ exports.withTarget = withTarget;
98
+ //# sourceMappingURL=permit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permit.js","sourceRoot":"","sources":["../../src/permit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { Assertion, AssertionError, assert, expect, config, should } from 'chai';
2
+ import 'chai-bn';
3
+ import { toBN } from 'web3-utils';
4
+ import BN from 'bn.js';
5
+ export declare const constants: {
6
+ readonly ZERO_ADDRESS: "0x0000000000000000000000000000000000000000";
7
+ readonly EEE_ADDRESS: "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE";
8
+ readonly ZERO_BYTES32: "0x0000000000000000000000000000000000000000000000000000000000000000";
9
+ readonly MAX_UINT256: string;
10
+ readonly MAX_INT256: string;
11
+ readonly MIN_INT256: string;
12
+ };
13
+ export { toBN, };
14
+ export declare type Time = {
15
+ increaseTo: (target: string | number | BN) => Promise<BN>;
16
+ latest: () => Promise<BN>;
17
+ };
18
+ export declare const time: Time;
19
+ export declare function ether(n: string): BN;
20
+ export { Assertion, AssertionError, assert, expect, config, should, };
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.should = exports.config = exports.expect = exports.assert = exports.AssertionError = exports.Assertion = exports.ether = exports.time = exports.toBN = exports.constants = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const chai_1 = (0, tslib_1.__importStar)(require("chai"));
6
+ Object.defineProperty(exports, "Assertion", { enumerable: true, get: function () { return chai_1.Assertion; } });
7
+ Object.defineProperty(exports, "AssertionError", { enumerable: true, get: function () { return chai_1.AssertionError; } });
8
+ Object.defineProperty(exports, "assert", { enumerable: true, get: function () { return chai_1.assert; } });
9
+ Object.defineProperty(exports, "expect", { enumerable: true, get: function () { return chai_1.expect; } });
10
+ Object.defineProperty(exports, "config", { enumerable: true, get: function () { return chai_1.config; } });
11
+ Object.defineProperty(exports, "should", { enumerable: true, get: function () { return chai_1.should; } });
12
+ require("chai-bn");
13
+ const chai_as_promised_1 = (0, tslib_1.__importDefault)(require("chai-as-promised"));
14
+ const web3_utils_1 = require("web3-utils");
15
+ Object.defineProperty(exports, "toBN", { enumerable: true, get: function () { return web3_utils_1.toBN; } });
16
+ chai_1.default.use(chai_as_promised_1.default);
17
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
18
+ const { time: timeImpl } = require('@openzeppelin/test-helpers');
19
+ exports.constants = {
20
+ ZERO_ADDRESS: '0x0000000000000000000000000000000000000000',
21
+ EEE_ADDRESS: '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE',
22
+ ZERO_BYTES32: '0x0000000000000000000000000000000000000000000000000000000000000000',
23
+ MAX_UINT256: (0, web3_utils_1.toBN)('2').pow((0, web3_utils_1.toBN)('256')).sub((0, web3_utils_1.toBN)('1')).toString(),
24
+ MAX_INT256: (0, web3_utils_1.toBN)('2').pow((0, web3_utils_1.toBN)('255')).sub((0, web3_utils_1.toBN)('1')).toString(),
25
+ MIN_INT256: (0, web3_utils_1.toBN)('2').pow((0, web3_utils_1.toBN)('255')).mul((0, web3_utils_1.toBN)('-1')).toString(),
26
+ };
27
+ exports.time = timeImpl;
28
+ function ether(n) {
29
+ return (0, web3_utils_1.toBN)((0, web3_utils_1.toWei)(n, 'ether'));
30
+ }
31
+ exports.ether = ether;
32
+ //# sourceMappingURL=prelude.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prelude.js","sourceRoot":"","sources":["../../src/prelude.ts"],"names":[],"mappings":";;;;AAAA,0DAAuF;AAqCnF,0FArCW,gBAAS,OAqCX;AACT,+FAtCsB,qBAAc,OAsCtB;AACd,uFAvCsC,aAAM,OAuCtC;AACN,uFAxC8C,aAAM,OAwC9C;AACN,uFAzCsD,aAAM,OAyCtD;AACN,uFA1C8D,aAAM,OA0C9D;AAzCV,mBAAiB;AACjB,qFAA8C;AAC9C,2CAAyC;AAiBrC,qFAjBK,iBAAI,OAiBL;AAfR,cAAI,CAAC,GAAG,CAAC,0BAAc,CAAC,CAAC;AACzB,8DAA8D;AAC9D,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,4BAA4B,CAAC,CAAC;AAEpD,QAAA,SAAS,GAAG;IACrB,YAAY,EAAE,4CAA4C;IAC1D,WAAW,EAAE,4CAA4C;IACzD,YAAY,EAAE,oEAAoE;IAClF,WAAW,EAAE,IAAA,iBAAI,EAAC,GAAG,CAAC,CAAC,GAAG,CAAC,IAAA,iBAAI,EAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,IAAA,iBAAI,EAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE;IACjE,UAAU,EAAE,IAAA,iBAAI,EAAC,GAAG,CAAC,CAAC,GAAG,CAAC,IAAA,iBAAI,EAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,IAAA,iBAAI,EAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE;IAChE,UAAU,EAAE,IAAA,iBAAI,EAAC,GAAG,CAAC,CAAC,GAAG,CAAC,IAAA,iBAAI,EAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,IAAA,iBAAI,EAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE;CAC3D,CAAC;AAaE,QAAA,IAAI,GAAS,QAAQ,CAAC;AAEnC,SAAgB,KAAK,CAAE,CAAS;IAC5B,OAAO,IAAA,iBAAI,EAAC,IAAA,kBAAK,EAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;AACnC,CAAC;AAFD,sBAEC"}
@@ -0,0 +1,9 @@
1
+ /// <reference types="node" />
2
+ import { PathLike, promises as fs } from 'fs';
3
+ export declare const gasspectOptionsDefault: {
4
+ minOpGasCost: number;
5
+ args: boolean;
6
+ res: boolean;
7
+ };
8
+ export declare function profileEVM(txHash: string, instruction: string[], optionalTraceFile?: PathLike | fs.FileHandle): Promise<number[]>;
9
+ export declare function gasspectEVM(txHash: string, gasspectOptions?: Record<string, unknown>, optionalTraceFile?: PathLike | fs.FileHandle): Promise<string[]>;
@@ -1,27 +1,27 @@
1
- const { promisify } = require('util');
2
- const fs = require('fs').promises;
3
-
4
- const gasspectOptionsDefault = {
5
- minOpGasCost: 300, // minimal gas cost of returned operations
6
- args: false, // return operations arguments
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.gasspectEVM = exports.profileEVM = exports.gasspectOptionsDefault = void 0;
4
+ const util_1 = require("util");
5
+ const fs_1 = require("fs");
6
+ const prelude_1 = require("./prelude");
7
+ exports.gasspectOptionsDefault = {
8
+ minOpGasCost: 300,
9
+ args: false,
7
10
  res: false, // return operations results
8
11
  };
9
-
10
- function _normalizeOp (ops, i) {
12
+ function _normalizeOp(ops, i) {
11
13
  if (ops[i].op === 'STATICCALL') {
12
14
  ops[i].gasCost = ops[i].gasCost - ops[i + 1].gas;
13
-
14
15
  if (ops[i].stack.length > 8 && ops[i].stack[ops[i].stack.length - 8] === '0000000000000000000000000000000000000000000000000000000000000001') {
15
16
  ops[i].op = 'STATICCALL-ECRECOVER';
16
- } else if (ops[i].stack.length > 8 && ops[i].stack[ops[i].stack.length - 8] <= '00000000000000000000000000000000000000000000000000000000000000FF') {
17
+ }
18
+ else if (ops[i].stack.length > 8 && ops[i].stack[ops[i].stack.length - 8] <= '00000000000000000000000000000000000000000000000000000000000000FF') {
17
19
  ops[i].op = 'STATICCALL-' + ops[i].stack[ops[i].stack.length - 8].substr(62, 2);
18
- } else {
20
+ }
21
+ else {
19
22
  ops[i].args = [
20
23
  '0x' + ops[i].stack[ops[i].stack.length - 2].substr(24),
21
- '0x' + (ops[i].memory || []).join('').substr(
22
- 2 * web3.utils.toBN(ops[i].stack[ops[i].stack.length - 3]).toNumber(),
23
- 2 * web3.utils.toBN(ops[i].stack[ops[i].stack.length - 4]).toNumber(),
24
- ),
24
+ '0x' + (ops[i].memory || []).join('').substr(2 * (0, prelude_1.toBN)(ops[i].stack[ops[i].stack.length - 3]).toNumber(), 2 * (0, prelude_1.toBN)(ops[i].stack[ops[i].stack.length - 4]).toNumber()),
25
25
  ];
26
26
  if (ops[i].gasCost === 100) {
27
27
  ops[i].op += '_R';
@@ -31,14 +31,10 @@ function _normalizeOp (ops, i) {
31
31
  if (['CALL', 'DELEGATECALL', 'CALLCODE'].indexOf(ops[i].op) !== -1) {
32
32
  ops[i].args = [
33
33
  '0x' + ops[i].stack[ops[i].stack.length - 2].substr(24),
34
- '0x' + (ops[i].memory || []).join('').substr(
35
- 2 * web3.utils.toBN(ops[i].stack[ops[i].stack.length - 4]).toNumber(),
36
- 2 * web3.utils.toBN(ops[i].stack[ops[i].stack.length - 5]).toNumber(),
37
- ),
34
+ '0x' + (ops[i].memory || []).join('').substr(2 * (0, prelude_1.toBN)(ops[i].stack[ops[i].stack.length - 4]).toNumber(), 2 * (0, prelude_1.toBN)(ops[i].stack[ops[i].stack.length - 5]).toNumber()),
38
35
  ];
39
36
  ops[i].gasCost = ops[i].gasCost - ops[i + 1].gas;
40
37
  ops[i].res = ops[i + 1].stack[ops[i + 1].stack.length - 1];
41
-
42
38
  if (ops[i].gasCost === 100) {
43
39
  ops[i].op += '_R';
44
40
  }
@@ -59,7 +55,6 @@ function _normalizeOp (ops, i) {
59
55
  if (ops[i].gasCost === 20000) {
60
56
  ops[i].op += '_I';
61
57
  }
62
-
63
58
  if (ops[i].op.startsWith('SLOAD')) {
64
59
  ops[i].res = ops[i + 1].stack[ops[i + 1].stack.length - 1];
65
60
  }
@@ -71,70 +66,60 @@ function _normalizeOp (ops, i) {
71
66
  ops[i].res = ops[i + 1].stack[ops[i + 1].stack.length - 1];
72
67
  }
73
68
  }
74
-
75
- async function profileEVM (txHash, instruction, optionalTraceFile) {
76
- const trace = await promisify(web3.currentProvider.send.bind(web3.currentProvider))({
69
+ async function profileEVM(txHash, instruction, optionalTraceFile) {
70
+ if (!web3.currentProvider || typeof web3.currentProvider === 'string' || !web3.currentProvider.send) {
71
+ throw new Error('Unsupported provider');
72
+ }
73
+ const trace = await (0, util_1.promisify)(web3.currentProvider.send.bind(web3.currentProvider))({
77
74
  jsonrpc: '2.0',
78
75
  method: 'debug_traceTransaction',
79
76
  params: [txHash, {}],
80
77
  id: new Date().getTime(),
81
78
  });
82
-
83
79
  const str = JSON.stringify(trace);
84
-
85
80
  if (optionalTraceFile) {
86
- await fs.writeFile(optionalTraceFile, str);
87
- }
88
-
89
- if (Array.isArray(instruction)) {
90
- return instruction.map(instr => {
91
- return str.split('"' + instr.toUpperCase() + '"').length - 1;
92
- });
81
+ await fs_1.promises.writeFile(optionalTraceFile, str);
93
82
  }
94
-
95
- return str.split('"' + instruction.toUpperCase() + '"').length - 1;
83
+ return instruction.map(instr => {
84
+ return str.split('"' + instr.toUpperCase() + '"').length - 1;
85
+ });
96
86
  }
97
-
98
- async function gasspectEVM (txHash, options = gasspectOptionsDefault, optionalTraceFile) {
99
- options = { ...gasspectOptionsDefault, ...options };
100
-
101
- const trace = await promisify(web3.currentProvider.send.bind(web3.currentProvider))({
87
+ exports.profileEVM = profileEVM;
88
+ async function gasspectEVM(txHash, gasspectOptions = {}, optionalTraceFile) {
89
+ const options = { ...exports.gasspectOptionsDefault, ...gasspectOptions };
90
+ if (!web3.currentProvider) {
91
+ throw new Error('Provider not set');
92
+ }
93
+ if (!web3.currentProvider || typeof web3.currentProvider === 'string' || !web3.currentProvider.send) {
94
+ throw new Error('Unsupported provider');
95
+ }
96
+ const trace = await (0, util_1.promisify)(web3.currentProvider.send.bind(web3.currentProvider))({
102
97
  jsonrpc: '2.0',
103
98
  method: 'debug_traceTransaction',
104
99
  params: [txHash, {}],
105
100
  id: new Date().getTime(),
106
101
  });
107
-
108
- const ops = trace.result.structLogs;
109
-
102
+ const ops = trace === null || trace === void 0 ? void 0 : trace.result.structLogs;
110
103
  const traceAddress = [0, -1];
111
104
  for (const [i, op] of ops.entries()) {
112
105
  op.traceAddress = traceAddress.slice(0, traceAddress.length - 1);
113
106
  _normalizeOp(ops, i);
114
-
115
107
  if (op.depth + 2 > traceAddress.length) {
116
108
  traceAddress[traceAddress.length - 1] += 1;
117
109
  traceAddress.push(-1);
118
110
  }
119
-
120
111
  if (op.depth + 2 < traceAddress.length) {
121
112
  traceAddress.pop();
122
113
  }
123
114
  }
124
-
125
115
  const result = ops.filter(op => op.gasCost > options.minOpGasCost).map(op => op.traceAddress.join('-') + '-' + op.op +
126
- (options.args ? '(' + (op.args || []).join(',') + ')' : '') +
127
- (options.res ? (op.res ? ':0x' + op.res : '') : '') +
128
- ' = ' + op.gasCost);
129
-
116
+ (options.args ? '(' + (op.args || []).join(',') + ')' : '') +
117
+ (options.res ? (op.res ? ':0x' + op.res : '') : '') +
118
+ ' = ' + op.gasCost);
130
119
  if (optionalTraceFile) {
131
- await fs.writeFile(optionalTraceFile, JSON.stringify(result));
120
+ await fs_1.promises.writeFile(optionalTraceFile, JSON.stringify(result));
132
121
  }
133
-
134
122
  return result;
135
123
  }
136
-
137
- module.exports = {
138
- profileEVM,
139
- gasspectEVM,
140
- };
124
+ exports.gasspectEVM = gasspectEVM;
125
+ //# sourceMappingURL=profileEVM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profileEVM.js","sourceRoot":"","sources":["../../src/profileEVM.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /// <reference types="bn.js" />
2
+ import { constants } from './prelude';
3
+ export declare function timeIncreaseTo(seconds: number | string | BN): Promise<void>;
4
+ export interface Token extends Truffle.ContractInstance {
5
+ balanceOf(account: string, txDetails?: Truffle.TransactionDetails): Promise<BN>;
6
+ }
7
+ export declare function trackReceivedTokenAndTx<T extends unknown[], U extends Truffle.AnyEvent>(token: Token | {
8
+ address: typeof constants.ZERO_ADDRESS;
9
+ } | {
10
+ address: typeof constants.EEE_ADDRESS;
11
+ }, wallet: string, txPromise: (...args: T) => Promise<Truffle.TransactionResponse<U>>, ...args: T): Promise<readonly [import("bn.js"), Truffle.TransactionResponse<U>]>;
12
+ export declare function fixSignature(signature: string): string;
13
+ export declare function signMessage(signer: string, messageHex?: string): Promise<string>;
14
+ export declare function countInstructions(txHash: string, instructions: string[]): Promise<number[]>;