1 | "use strict";
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | exports.getCreate2Address = exports.getContractAddress = exports.getIcapAddress = exports.isAddress = exports.getAddress = void 0;
|
4 | var bytes_1 = require("@ethersproject/bytes");
|
5 | var bignumber_1 = require("@ethersproject/bignumber");
|
6 | var keccak256_1 = require("@ethersproject/keccak256");
|
7 | var rlp_1 = require("@ethersproject/rlp");
|
8 | var logger_1 = require("@ethersproject/logger");
|
9 | var _version_1 = require("./_version");
|
10 | var logger = new logger_1.Logger(_version_1.version);
|
11 | function getChecksumAddress(address) {
|
12 | if (!(0, bytes_1.isHexString)(address, 20)) {
|
13 | logger.throwArgumentError("invalid address", "address", address);
|
14 | }
|
15 | address = address.toLowerCase();
|
16 | var chars = address.substring(2).split("");
|
17 | var expanded = new Uint8Array(40);
|
18 | for (var i = 0; i < 40; i++) {
|
19 | expanded[i] = chars[i].charCodeAt(0);
|
20 | }
|
21 | var hashed = (0, bytes_1.arrayify)((0, keccak256_1.keccak256)(expanded));
|
22 | for (var i = 0; i < 40; i += 2) {
|
23 | if ((hashed[i >> 1] >> 4) >= 8) {
|
24 | chars[i] = chars[i].toUpperCase();
|
25 | }
|
26 | if ((hashed[i >> 1] & 0x0f) >= 8) {
|
27 | chars[i + 1] = chars[i + 1].toUpperCase();
|
28 | }
|
29 | }
|
30 | return "0x" + chars.join("");
|
31 | }
|
32 |
|
33 | var MAX_SAFE_INTEGER = 0x1fffffffffffff;
|
34 | function log10(x) {
|
35 | if (Math.log10) {
|
36 | return Math.log10(x);
|
37 | }
|
38 | return Math.log(x) / Math.LN10;
|
39 | }
|
40 |
|
41 |
|
42 | var ibanLookup = {};
|
43 | for (var i = 0; i < 10; i++) {
|
44 | ibanLookup[String(i)] = String(i);
|
45 | }
|
46 | for (var i = 0; i < 26; i++) {
|
47 | ibanLookup[String.fromCharCode(65 + i)] = String(10 + i);
|
48 | }
|
49 |
|
50 | var safeDigits = Math.floor(log10(MAX_SAFE_INTEGER));
|
51 | function ibanChecksum(address) {
|
52 | address = address.toUpperCase();
|
53 | address = address.substring(4) + address.substring(0, 2) + "00";
|
54 | var expanded = address.split("").map(function (c) { return ibanLookup[c]; }).join("");
|
55 |
|
56 | while (expanded.length >= safeDigits) {
|
57 | var block = expanded.substring(0, safeDigits);
|
58 | expanded = parseInt(block, 10) % 97 + expanded.substring(block.length);
|
59 | }
|
60 | var checksum = String(98 - (parseInt(expanded, 10) % 97));
|
61 | while (checksum.length < 2) {
|
62 | checksum = "0" + checksum;
|
63 | }
|
64 | return checksum;
|
65 | }
|
66 | ;
|
67 | function getAddress(address) {
|
68 | var result = null;
|
69 | if (typeof (address) !== "string") {
|
70 | logger.throwArgumentError("invalid address", "address", address);
|
71 | }
|
72 | if (address.match(/^(0x)?[0-9a-fA-F]{40}$/)) {
|
73 |
|
74 | if (address.substring(0, 2) !== "0x") {
|
75 | address = "0x" + address;
|
76 | }
|
77 | result = getChecksumAddress(address);
|
78 |
|
79 | if (address.match(/([A-F].*[a-f])|([a-f].*[A-F])/) && result !== address) {
|
80 | logger.throwArgumentError("bad address checksum", "address", address);
|
81 | }
|
82 |
|
83 | }
|
84 | else if (address.match(/^XE[0-9]{2}[0-9A-Za-z]{30,31}$/)) {
|
85 |
|
86 | if (address.substring(2, 4) !== ibanChecksum(address)) {
|
87 | logger.throwArgumentError("bad icap checksum", "address", address);
|
88 | }
|
89 | result = (0, bignumber_1._base36To16)(address.substring(4));
|
90 | while (result.length < 40) {
|
91 | result = "0" + result;
|
92 | }
|
93 | result = getChecksumAddress("0x" + result);
|
94 | }
|
95 | else {
|
96 | logger.throwArgumentError("invalid address", "address", address);
|
97 | }
|
98 | return result;
|
99 | }
|
100 | exports.getAddress = getAddress;
|
101 | function isAddress(address) {
|
102 | try {
|
103 | getAddress(address);
|
104 | return true;
|
105 | }
|
106 | catch (error) { }
|
107 | return false;
|
108 | }
|
109 | exports.isAddress = isAddress;
|
110 | function getIcapAddress(address) {
|
111 | var base36 = (0, bignumber_1._base16To36)(getAddress(address).substring(2)).toUpperCase();
|
112 | while (base36.length < 30) {
|
113 | base36 = "0" + base36;
|
114 | }
|
115 | return "XE" + ibanChecksum("XE00" + base36) + base36;
|
116 | }
|
117 | exports.getIcapAddress = getIcapAddress;
|
118 |
|
119 | function getContractAddress(transaction) {
|
120 | var from = null;
|
121 | try {
|
122 | from = getAddress(transaction.from);
|
123 | }
|
124 | catch (error) {
|
125 | logger.throwArgumentError("missing from address", "transaction", transaction);
|
126 | }
|
127 | var nonce = (0, bytes_1.stripZeros)((0, bytes_1.arrayify)(bignumber_1.BigNumber.from(transaction.nonce).toHexString()));
|
128 | return getAddress((0, bytes_1.hexDataSlice)((0, keccak256_1.keccak256)((0, rlp_1.encode)([from, nonce])), 12));
|
129 | }
|
130 | exports.getContractAddress = getContractAddress;
|
131 | function getCreate2Address(from, salt, initCodeHash) {
|
132 | if ((0, bytes_1.hexDataLength)(salt) !== 32) {
|
133 | logger.throwArgumentError("salt must be 32 bytes", "salt", salt);
|
134 | }
|
135 | if ((0, bytes_1.hexDataLength)(initCodeHash) !== 32) {
|
136 | logger.throwArgumentError("initCodeHash must be 32 bytes", "initCodeHash", initCodeHash);
|
137 | }
|
138 | return getAddress((0, bytes_1.hexDataSlice)((0, keccak256_1.keccak256)((0, bytes_1.concat)(["0xff", getAddress(from), salt, initCodeHash])), 12));
|
139 | }
|
140 | exports.getCreate2Address = getCreate2Address;
|
141 |
|
\ | No newline at end of file |