@xylabs/eth-address 2.13.18 → 2.13.20

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.
@@ -1,4 +1,3 @@
1
- import { BigNumber } from '@xylabs/bignumber';
2
1
  export declare const isEthAddress: (obj: {
3
2
  type: string;
4
3
  }) => boolean;
@@ -11,7 +10,7 @@ export declare class EthAddress {
11
10
  static parse(value: unknown, base?: number): EthAddress | undefined;
12
11
  static validate(address: string): boolean;
13
12
  equals(address?: EthAddress | string | null): boolean;
14
- toBigNumber(): BigNumber;
13
+ toBigNumber(): bigint;
15
14
  toHex(): string;
16
15
  toJSON(): string;
17
16
  toLowerCaseString(): string;
@@ -1 +1 @@
1
- {"version":3,"file":"EthAddress.d.ts","sourceRoot":"","sources":["../../src/EthAddress.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAM7C,eAAO,MAAM,YAAY,QAAS;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,YAAkC,CAAA;AAEpF,qBAAa,UAAU;IACrB,MAAM,CAAC,QAAQ,CAAC,IAAI,gBAAe;IAEnC,IAAI,SAAkB;IAEtB,OAAO,CAAC,OAAO,CAAW;IAE1B,OAAO;IAIP,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,IAAI,SAAK;IAO3C,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,MAAM;IAM1C,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM;IAI/B,MAAM,CAAC,OAAO,CAAC,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI,GAAG,OAAO;IAarD,WAAW;IAIX,KAAK;IAIL,MAAM,IAAI,MAAM;IAIhB,iBAAiB;IAIjB,aAAa,CAAC,MAAM,SAAI;IAIxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM;IAe7C,QAAQ;CAGT"}
1
+ {"version":3,"file":"EthAddress.d.ts","sourceRoot":"","sources":["../../src/EthAddress.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,YAAY,QAAS;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,YAAkC,CAAA;AAEpF,qBAAa,UAAU;IACrB,MAAM,CAAC,QAAQ,CAAC,IAAI,gBAAe;IAEnC,IAAI,SAAkB;IAEtB,OAAO,CAAC,OAAO,CAAQ;IAEvB,OAAO;IAIP,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,IAAI,SAAK;IAO3C,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,MAAM;IAM1C,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM;IAI/B,MAAM,CAAC,OAAO,CAAC,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI,GAAG,OAAO;IAarD,WAAW;IAIX,KAAK;IAIL,MAAM,IAAI,MAAM;IAIhB,iBAAiB;IAIjB,aAAa,CAAC,MAAM,SAAI;IAIxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM;IAQ7C,QAAQ;CAGT"}
@@ -1,4 +1,3 @@
1
- import { BigNumber } from '@xylabs/bignumber';
2
1
  export declare const isEthAddress: (obj: {
3
2
  type: string;
4
3
  }) => boolean;
@@ -11,7 +10,7 @@ export declare class EthAddress {
11
10
  static parse(value: unknown, base?: number): EthAddress | undefined;
12
11
  static validate(address: string): boolean;
13
12
  equals(address?: EthAddress | string | null): boolean;
14
- toBigNumber(): BigNumber;
13
+ toBigNumber(): bigint;
15
14
  toHex(): string;
16
15
  toJSON(): string;
17
16
  toLowerCaseString(): string;
@@ -1 +1 @@
1
- {"version":3,"file":"EthAddress.d.ts","sourceRoot":"","sources":["../../src/EthAddress.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAM7C,eAAO,MAAM,YAAY,QAAS;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,YAAkC,CAAA;AAEpF,qBAAa,UAAU;IACrB,MAAM,CAAC,QAAQ,CAAC,IAAI,gBAAe;IAEnC,IAAI,SAAkB;IAEtB,OAAO,CAAC,OAAO,CAAW;IAE1B,OAAO;IAIP,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,IAAI,SAAK;IAO3C,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,MAAM;IAM1C,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM;IAI/B,MAAM,CAAC,OAAO,CAAC,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI,GAAG,OAAO;IAarD,WAAW;IAIX,KAAK;IAIL,MAAM,IAAI,MAAM;IAIhB,iBAAiB;IAIjB,aAAa,CAAC,MAAM,SAAI;IAIxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM;IAe7C,QAAQ;CAGT"}
1
+ {"version":3,"file":"EthAddress.d.ts","sourceRoot":"","sources":["../../src/EthAddress.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,YAAY,QAAS;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,YAAkC,CAAA;AAEpF,qBAAa,UAAU;IACrB,MAAM,CAAC,QAAQ,CAAC,IAAI,gBAAe;IAEnC,IAAI,SAAkB;IAEtB,OAAO,CAAC,OAAO,CAAQ;IAEvB,OAAO;IAIP,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,IAAI,SAAK;IAO3C,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,MAAM;IAM1C,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM;IAI/B,MAAM,CAAC,OAAO,CAAC,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI,GAAG,OAAO;IAarD,WAAW;IAIX,KAAK;IAIL,MAAM,IAAI,MAAM;IAIhB,iBAAiB;IAIjB,aAAa,CAAC,MAAM,SAAI;IAIxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM;IAQ7C,QAAQ;CAGT"}
@@ -1,4 +1,3 @@
1
- import { BigNumber } from '@xylabs/bignumber';
2
1
  export declare const isEthAddress: (obj: {
3
2
  type: string;
4
3
  }) => boolean;
@@ -11,7 +10,7 @@ export declare class EthAddress {
11
10
  static parse(value: unknown, base?: number): EthAddress | undefined;
12
11
  static validate(address: string): boolean;
13
12
  equals(address?: EthAddress | string | null): boolean;
14
- toBigNumber(): BigNumber;
13
+ toBigNumber(): bigint;
15
14
  toHex(): string;
16
15
  toJSON(): string;
17
16
  toLowerCaseString(): string;
@@ -1 +1 @@
1
- {"version":3,"file":"EthAddress.d.ts","sourceRoot":"","sources":["../../src/EthAddress.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAM7C,eAAO,MAAM,YAAY,QAAS;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,YAAkC,CAAA;AAEpF,qBAAa,UAAU;IACrB,MAAM,CAAC,QAAQ,CAAC,IAAI,gBAAe;IAEnC,IAAI,SAAkB;IAEtB,OAAO,CAAC,OAAO,CAAW;IAE1B,OAAO;IAIP,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,IAAI,SAAK;IAO3C,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,MAAM;IAM1C,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM;IAI/B,MAAM,CAAC,OAAO,CAAC,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI,GAAG,OAAO;IAarD,WAAW;IAIX,KAAK;IAIL,MAAM,IAAI,MAAM;IAIhB,iBAAiB;IAIjB,aAAa,CAAC,MAAM,SAAI;IAIxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM;IAe7C,QAAQ;CAGT"}
1
+ {"version":3,"file":"EthAddress.d.ts","sourceRoot":"","sources":["../../src/EthAddress.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,YAAY,QAAS;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,YAAkC,CAAA;AAEpF,qBAAa,UAAU;IACrB,MAAM,CAAC,QAAQ,CAAC,IAAI,gBAAe;IAEnC,IAAI,SAAkB;IAEtB,OAAO,CAAC,OAAO,CAAQ;IAEvB,OAAO;IAIP,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,IAAI,SAAK;IAO3C,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,MAAM;IAM1C,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM;IAI/B,MAAM,CAAC,OAAO,CAAC,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI,GAAG,OAAO;IAarD,WAAW;IAIX,KAAK;IAIL,MAAM,IAAI,MAAM;IAIhB,iBAAiB;IAIjB,aAAa,CAAC,MAAM,SAAI;IAIxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM;IAQ7C,QAAQ;CAGT"}
@@ -1,9 +1,7 @@
1
1
  "use strict";
2
- var __create = Object.create;
3
2
  var __defProp = Object.defineProperty;
4
3
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
4
  var __getOwnPropNames = Object.getOwnPropertyNames;
6
- var __getProtoOf = Object.getPrototypeOf;
7
5
  var __hasOwnProp = Object.prototype.hasOwnProperty;
8
6
  var __export = (target, all) => {
9
7
  for (var name in all)
@@ -17,14 +15,6 @@ var __copyProps = (to, from, except, desc) => {
17
15
  }
18
16
  return to;
19
17
  };
20
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
- // If the importer is in node compatibility mode or this is not an ESM
22
- // file that has been converted to a CommonJS file using a Babel-
23
- // compatible transform (i.e. "__esModule" has not been set), then set
24
- // "default" to the CommonJS "module.exports" for node compatibility.
25
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
- mod
27
- ));
28
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
19
 
30
20
  // src/index.ts
@@ -46,8 +36,7 @@ var ellipsize = (value, length = 2) => {
46
36
 
47
37
  // src/EthAddress.ts
48
38
  var import_assert = require("@xylabs/assert");
49
- var import_bignumber = require("@xylabs/bignumber");
50
- var import_keccak256 = __toESM(require("keccak256"), 1);
39
+ var import_ethers = require("ethers");
51
40
 
52
41
  // src/padHex.ts
53
42
  var padHex = (hex, byteCount) => {
@@ -74,8 +63,8 @@ var EthAddress = class _EthAddress {
74
63
  }
75
64
  static fromString(value, base = 16) {
76
65
  if (value) {
77
- const bn = new import_bignumber.BigNumber(value.startsWith("0x") ? value.substring(2) : value, base);
78
- return new _EthAddress(bn);
66
+ const bi = base === 16 ? BigInt(value.startsWith("0x") ? value : `0x${value}`) : BigInt(value);
67
+ return new _EthAddress(bi);
79
68
  }
80
69
  }
81
70
  static parse(value, base) {
@@ -94,7 +83,7 @@ var EthAddress = class _EthAddress {
94
83
  } else {
95
84
  inAddress = address;
96
85
  }
97
- return this.address.eq(inAddress.address);
86
+ return this.address === inAddress.address;
98
87
  }
99
88
  return false;
100
89
  }
@@ -116,12 +105,7 @@ var EthAddress = class _EthAddress {
116
105
  toString(checksum, chainId) {
117
106
  if (checksum) {
118
107
  const strippedAddress = this.toHex();
119
- const keccakHash = (0, import_keccak256.default)(chainId !== void 0 ? `${chainId}0x${strippedAddress}` : strippedAddress).toString("hex");
120
- let checksumAddress = "0x";
121
- for (let i = 0; i < strippedAddress.length; i++) {
122
- checksumAddress += parseInt(keccakHash[i], 16) >= 8 ? strippedAddress[i].toUpperCase() : strippedAddress[i];
123
- }
124
- return checksumAddress;
108
+ return (0, import_ethers.getAddress)(chainId !== void 0 ? `${chainId}0x${strippedAddress}` : `0x${strippedAddress}`);
125
109
  }
126
110
  return `0x${this.toHex()}`;
127
111
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.ts","../../src/ellipsize.ts","../../src/EthAddress.ts","../../src/padHex.ts"],"sourcesContent":["export * from './ellipsize'\nexport * from './EthAddress'\nexport * from './padHex'\n","export const ellipsize = (value: string, length = 2) => {\n const part1 = value.slice(0, length)\n const part2 = value.slice(value.length - length, value.length)\n return `${part1}...${part2}`\n}\n","import { assertEx } from '@xylabs/assert'\nimport { BigNumber } from '@xylabs/bignumber'\nimport keccak256 from 'keccak256'\n\nimport { ellipsize } from './ellipsize'\nimport { padHex } from './padHex'\n\nexport const isEthAddress = (obj: { type: string }) => obj?.type === EthAddress.type\n\nexport class EthAddress {\n static readonly type = 'EthAddress'\n\n type = EthAddress.type\n\n private address: BigNumber\n\n private constructor(address: BigNumber) {\n this.address = address\n }\n\n static fromString(value?: string, base = 16) {\n if (value) {\n const bn = new BigNumber(value.startsWith('0x') ? value.substring(2) : value, base)\n return new EthAddress(bn)\n }\n }\n\n static parse(value: unknown, base?: number) {\n if (typeof value === 'string') {\n return this.fromString(value, base)\n }\n }\n\n static validate(address: string) {\n return /^(0x)?[0-9a-f]{40}$/i.test(address)\n }\n\n equals(address?: EthAddress | string | null): boolean {\n if (address) {\n let inAddress: EthAddress\n if (typeof address === 'string') {\n inAddress = assertEx(EthAddress.fromString(address), 'Bad Address')\n } else {\n inAddress = address\n }\n return this.address.eq(inAddress.address)\n }\n return false\n }\n\n toBigNumber() {\n return this.address\n }\n\n toHex() {\n return padHex(this.address.toString(16), 20)\n }\n\n toJSON(): string {\n return `0x${this.toHex()}`\n }\n\n toLowerCaseString() {\n return this.toString().toLowerCase()\n }\n\n toShortString(length = 2) {\n return `0x${ellipsize(this.toHex(), length)}`\n }\n\n toString(checksum?: boolean, chainId?: string) {\n if (checksum) {\n const strippedAddress = this.toHex()\n const keccakHash = keccak256(chainId !== undefined ? `${chainId}0x${strippedAddress}` : strippedAddress).toString('hex')\n let checksumAddress = '0x'\n\n for (let i = 0; i < strippedAddress.length; i++) {\n checksumAddress += parseInt(keccakHash[i], 16) >= 8 ? strippedAddress[i].toUpperCase() : strippedAddress[i]\n }\n\n return checksumAddress\n }\n return `0x${this.toHex()}`\n }\n\n validate() {\n return EthAddress.validate(this.toString())\n }\n}\n","const padHex = (hex: string, byteCount?: number) => {\n let result = hex\n if (hex.length % 2 !== 0) {\n result = `0${hex}`\n }\n if (byteCount) {\n while (result.length / 2 < byteCount) {\n result = `00${result}`\n }\n }\n return result\n}\n\nexport { padHex }\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAO,IAAM,YAAY,CAAC,OAAe,SAAS,MAAM;AACtD,QAAM,QAAQ,MAAM,MAAM,GAAG,MAAM;AACnC,QAAM,QAAQ,MAAM,MAAM,MAAM,SAAS,QAAQ,MAAM,MAAM;AAC7D,SAAO,GAAG,KAAK,MAAM,KAAK;AAC5B;;;ACJA,oBAAyB;AACzB,uBAA0B;AAC1B,uBAAsB;;;ACFtB,IAAM,SAAS,CAAC,KAAa,cAAuB;AAClD,MAAI,SAAS;AACb,MAAI,IAAI,SAAS,MAAM,GAAG;AACxB,aAAS,IAAI,GAAG;AAAA,EAClB;AACA,MAAI,WAAW;AACb,WAAO,OAAO,SAAS,IAAI,WAAW;AACpC,eAAS,KAAK,MAAM;AAAA,IACtB;AAAA,EACF;AACA,SAAO;AACT;;;ADJO,IAAM,eAAe,CAAC,QAA0B,KAAK,SAAS,WAAW;AAEzE,IAAM,aAAN,MAAM,YAAW;AAAA,EACtB,OAAgB,OAAO;AAAA,EAEvB,OAAO,YAAW;AAAA,EAEV;AAAA,EAEA,YAAY,SAAoB;AACtC,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,OAAO,WAAW,OAAgB,OAAO,IAAI;AAC3C,QAAI,OAAO;AACT,YAAM,KAAK,IAAI,2BAAU,MAAM,WAAW,IAAI,IAAI,MAAM,UAAU,CAAC,IAAI,OAAO,IAAI;AAClF,aAAO,IAAI,YAAW,EAAE;AAAA,IAC1B;AAAA,EACF;AAAA,EAEA,OAAO,MAAM,OAAgB,MAAe;AAC1C,QAAI,OAAO,UAAU,UAAU;AAC7B,aAAO,KAAK,WAAW,OAAO,IAAI;AAAA,IACpC;AAAA,EACF;AAAA,EAEA,OAAO,SAAS,SAAiB;AAC/B,WAAO,uBAAuB,KAAK,OAAO;AAAA,EAC5C;AAAA,EAEA,OAAO,SAA+C;AACpD,QAAI,SAAS;AACX,UAAI;AACJ,UAAI,OAAO,YAAY,UAAU;AAC/B,wBAAY,wBAAS,YAAW,WAAW,OAAO,GAAG,aAAa;AAAA,MACpE,OAAO;AACL,oBAAY;AAAA,MACd;AACA,aAAO,KAAK,QAAQ,GAAG,UAAU,OAAO;AAAA,IAC1C;AACA,WAAO;AAAA,EACT;AAAA,EAEA,cAAc;AACZ,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,QAAQ;AACN,WAAO,OAAO,KAAK,QAAQ,SAAS,EAAE,GAAG,EAAE;AAAA,EAC7C;AAAA,EAEA,SAAiB;AACf,WAAO,KAAK,KAAK,MAAM,CAAC;AAAA,EAC1B;AAAA,EAEA,oBAAoB;AAClB,WAAO,KAAK,SAAS,EAAE,YAAY;AAAA,EACrC;AAAA,EAEA,cAAc,SAAS,GAAG;AACxB,WAAO,KAAK,UAAU,KAAK,MAAM,GAAG,MAAM,CAAC;AAAA,EAC7C;AAAA,EAEA,SAAS,UAAoB,SAAkB;AAC7C,QAAI,UAAU;AACZ,YAAM,kBAAkB,KAAK,MAAM;AACnC,YAAM,iBAAa,iBAAAA,SAAU,YAAY,SAAY,GAAG,OAAO,KAAK,eAAe,KAAK,eAAe,EAAE,SAAS,KAAK;AACvH,UAAI,kBAAkB;AAEtB,eAAS,IAAI,GAAG,IAAI,gBAAgB,QAAQ,KAAK;AAC/C,2BAAmB,SAAS,WAAW,CAAC,GAAG,EAAE,KAAK,IAAI,gBAAgB,CAAC,EAAE,YAAY,IAAI,gBAAgB,CAAC;AAAA,MAC5G;AAEA,aAAO;AAAA,IACT;AACA,WAAO,KAAK,KAAK,MAAM,CAAC;AAAA,EAC1B;AAAA,EAEA,WAAW;AACT,WAAO,YAAW,SAAS,KAAK,SAAS,CAAC;AAAA,EAC5C;AACF;","names":["keccak256"]}
1
+ {"version":3,"sources":["../../src/index.ts","../../src/ellipsize.ts","../../src/EthAddress.ts","../../src/padHex.ts"],"sourcesContent":["export * from './ellipsize'\nexport * from './EthAddress'\nexport * from './padHex'\n","export const ellipsize = (value: string, length = 2) => {\n const part1 = value.slice(0, length)\n const part2 = value.slice(value.length - length, value.length)\n return `${part1}...${part2}`\n}\n","import { assertEx } from '@xylabs/assert'\nimport { getAddress } from 'ethers'\n\nimport { ellipsize } from './ellipsize'\nimport { padHex } from './padHex'\n\nexport const isEthAddress = (obj: { type: string }) => obj?.type === EthAddress.type\n\nexport class EthAddress {\n static readonly type = 'EthAddress'\n\n type = EthAddress.type\n\n private address: bigint\n\n private constructor(address: bigint) {\n this.address = address\n }\n\n static fromString(value?: string, base = 16) {\n if (value) {\n const bi = base === 16 ? BigInt(value.startsWith('0x') ? value : `0x${value}`) : BigInt(value)\n return new EthAddress(bi)\n }\n }\n\n static parse(value: unknown, base?: number) {\n if (typeof value === 'string') {\n return this.fromString(value, base)\n }\n }\n\n static validate(address: string) {\n return /^(0x)?[0-9a-f]{40}$/i.test(address)\n }\n\n equals(address?: EthAddress | string | null): boolean {\n if (address) {\n let inAddress: EthAddress\n if (typeof address === 'string') {\n inAddress = assertEx(EthAddress.fromString(address), 'Bad Address')\n } else {\n inAddress = address\n }\n return this.address === inAddress.address\n }\n return false\n }\n\n toBigNumber() {\n return this.address\n }\n\n toHex() {\n return padHex(this.address.toString(16), 20)\n }\n\n toJSON(): string {\n return `0x${this.toHex()}`\n }\n\n toLowerCaseString() {\n return this.toString().toLowerCase()\n }\n\n toShortString(length = 2) {\n return `0x${ellipsize(this.toHex(), length)}`\n }\n\n toString(checksum?: boolean, chainId?: string) {\n if (checksum) {\n const strippedAddress = this.toHex()\n return getAddress(chainId !== undefined ? `${chainId}0x${strippedAddress}` : `0x${strippedAddress}`)\n }\n return `0x${this.toHex()}`\n }\n\n validate() {\n return EthAddress.validate(this.toString())\n }\n}\n","const padHex = (hex: string, byteCount?: number) => {\n let result = hex\n if (hex.length % 2 !== 0) {\n result = `0${hex}`\n }\n if (byteCount) {\n while (result.length / 2 < byteCount) {\n result = `00${result}`\n }\n }\n return result\n}\n\nexport { padHex }\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAO,IAAM,YAAY,CAAC,OAAe,SAAS,MAAM;AACtD,QAAM,QAAQ,MAAM,MAAM,GAAG,MAAM;AACnC,QAAM,QAAQ,MAAM,MAAM,MAAM,SAAS,QAAQ,MAAM,MAAM;AAC7D,SAAO,GAAG,KAAK,MAAM,KAAK;AAC5B;;;ACJA,oBAAyB;AACzB,oBAA2B;;;ACD3B,IAAM,SAAS,CAAC,KAAa,cAAuB;AAClD,MAAI,SAAS;AACb,MAAI,IAAI,SAAS,MAAM,GAAG;AACxB,aAAS,IAAI,GAAG;AAAA,EAClB;AACA,MAAI,WAAW;AACb,WAAO,OAAO,SAAS,IAAI,WAAW;AACpC,eAAS,KAAK,MAAM;AAAA,IACtB;AAAA,EACF;AACA,SAAO;AACT;;;ADLO,IAAM,eAAe,CAAC,QAA0B,KAAK,SAAS,WAAW;AAEzE,IAAM,aAAN,MAAM,YAAW;AAAA,EACtB,OAAgB,OAAO;AAAA,EAEvB,OAAO,YAAW;AAAA,EAEV;AAAA,EAEA,YAAY,SAAiB;AACnC,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,OAAO,WAAW,OAAgB,OAAO,IAAI;AAC3C,QAAI,OAAO;AACT,YAAM,KAAK,SAAS,KAAK,OAAO,MAAM,WAAW,IAAI,IAAI,QAAQ,KAAK,KAAK,EAAE,IAAI,OAAO,KAAK;AAC7F,aAAO,IAAI,YAAW,EAAE;AAAA,IAC1B;AAAA,EACF;AAAA,EAEA,OAAO,MAAM,OAAgB,MAAe;AAC1C,QAAI,OAAO,UAAU,UAAU;AAC7B,aAAO,KAAK,WAAW,OAAO,IAAI;AAAA,IACpC;AAAA,EACF;AAAA,EAEA,OAAO,SAAS,SAAiB;AAC/B,WAAO,uBAAuB,KAAK,OAAO;AAAA,EAC5C;AAAA,EAEA,OAAO,SAA+C;AACpD,QAAI,SAAS;AACX,UAAI;AACJ,UAAI,OAAO,YAAY,UAAU;AAC/B,wBAAY,wBAAS,YAAW,WAAW,OAAO,GAAG,aAAa;AAAA,MACpE,OAAO;AACL,oBAAY;AAAA,MACd;AACA,aAAO,KAAK,YAAY,UAAU;AAAA,IACpC;AACA,WAAO;AAAA,EACT;AAAA,EAEA,cAAc;AACZ,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,QAAQ;AACN,WAAO,OAAO,KAAK,QAAQ,SAAS,EAAE,GAAG,EAAE;AAAA,EAC7C;AAAA,EAEA,SAAiB;AACf,WAAO,KAAK,KAAK,MAAM,CAAC;AAAA,EAC1B;AAAA,EAEA,oBAAoB;AAClB,WAAO,KAAK,SAAS,EAAE,YAAY;AAAA,EACrC;AAAA,EAEA,cAAc,SAAS,GAAG;AACxB,WAAO,KAAK,UAAU,KAAK,MAAM,GAAG,MAAM,CAAC;AAAA,EAC7C;AAAA,EAEA,SAAS,UAAoB,SAAkB;AAC7C,QAAI,UAAU;AACZ,YAAM,kBAAkB,KAAK,MAAM;AACnC,iBAAO,0BAAW,YAAY,SAAY,GAAG,OAAO,KAAK,eAAe,KAAK,KAAK,eAAe,EAAE;AAAA,IACrG;AACA,WAAO,KAAK,KAAK,MAAM,CAAC;AAAA,EAC1B;AAAA,EAEA,WAAW;AACT,WAAO,YAAW,SAAS,KAAK,SAAS,CAAC;AAAA,EAC5C;AACF;","names":[]}
@@ -7,8 +7,7 @@ var ellipsize = (value, length = 2) => {
7
7
 
8
8
  // src/EthAddress.ts
9
9
  import { assertEx } from "@xylabs/assert";
10
- import { BigNumber } from "@xylabs/bignumber";
11
- import keccak256 from "keccak256";
10
+ import { getAddress } from "ethers";
12
11
 
13
12
  // src/padHex.ts
14
13
  var padHex = (hex, byteCount) => {
@@ -35,8 +34,8 @@ var EthAddress = class _EthAddress {
35
34
  }
36
35
  static fromString(value, base = 16) {
37
36
  if (value) {
38
- const bn = new BigNumber(value.startsWith("0x") ? value.substring(2) : value, base);
39
- return new _EthAddress(bn);
37
+ const bi = base === 16 ? BigInt(value.startsWith("0x") ? value : `0x${value}`) : BigInt(value);
38
+ return new _EthAddress(bi);
40
39
  }
41
40
  }
42
41
  static parse(value, base) {
@@ -55,7 +54,7 @@ var EthAddress = class _EthAddress {
55
54
  } else {
56
55
  inAddress = address;
57
56
  }
58
- return this.address.eq(inAddress.address);
57
+ return this.address === inAddress.address;
59
58
  }
60
59
  return false;
61
60
  }
@@ -77,12 +76,7 @@ var EthAddress = class _EthAddress {
77
76
  toString(checksum, chainId) {
78
77
  if (checksum) {
79
78
  const strippedAddress = this.toHex();
80
- const keccakHash = keccak256(chainId !== void 0 ? `${chainId}0x${strippedAddress}` : strippedAddress).toString("hex");
81
- let checksumAddress = "0x";
82
- for (let i = 0; i < strippedAddress.length; i++) {
83
- checksumAddress += parseInt(keccakHash[i], 16) >= 8 ? strippedAddress[i].toUpperCase() : strippedAddress[i];
84
- }
85
- return checksumAddress;
79
+ return getAddress(chainId !== void 0 ? `${chainId}0x${strippedAddress}` : `0x${strippedAddress}`);
86
80
  }
87
81
  return `0x${this.toHex()}`;
88
82
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/ellipsize.ts","../../src/EthAddress.ts","../../src/padHex.ts"],"sourcesContent":["export const ellipsize = (value: string, length = 2) => {\n const part1 = value.slice(0, length)\n const part2 = value.slice(value.length - length, value.length)\n return `${part1}...${part2}`\n}\n","import { assertEx } from '@xylabs/assert'\nimport { BigNumber } from '@xylabs/bignumber'\nimport keccak256 from 'keccak256'\n\nimport { ellipsize } from './ellipsize'\nimport { padHex } from './padHex'\n\nexport const isEthAddress = (obj: { type: string }) => obj?.type === EthAddress.type\n\nexport class EthAddress {\n static readonly type = 'EthAddress'\n\n type = EthAddress.type\n\n private address: BigNumber\n\n private constructor(address: BigNumber) {\n this.address = address\n }\n\n static fromString(value?: string, base = 16) {\n if (value) {\n const bn = new BigNumber(value.startsWith('0x') ? value.substring(2) : value, base)\n return new EthAddress(bn)\n }\n }\n\n static parse(value: unknown, base?: number) {\n if (typeof value === 'string') {\n return this.fromString(value, base)\n }\n }\n\n static validate(address: string) {\n return /^(0x)?[0-9a-f]{40}$/i.test(address)\n }\n\n equals(address?: EthAddress | string | null): boolean {\n if (address) {\n let inAddress: EthAddress\n if (typeof address === 'string') {\n inAddress = assertEx(EthAddress.fromString(address), 'Bad Address')\n } else {\n inAddress = address\n }\n return this.address.eq(inAddress.address)\n }\n return false\n }\n\n toBigNumber() {\n return this.address\n }\n\n toHex() {\n return padHex(this.address.toString(16), 20)\n }\n\n toJSON(): string {\n return `0x${this.toHex()}`\n }\n\n toLowerCaseString() {\n return this.toString().toLowerCase()\n }\n\n toShortString(length = 2) {\n return `0x${ellipsize(this.toHex(), length)}`\n }\n\n toString(checksum?: boolean, chainId?: string) {\n if (checksum) {\n const strippedAddress = this.toHex()\n const keccakHash = keccak256(chainId !== undefined ? `${chainId}0x${strippedAddress}` : strippedAddress).toString('hex')\n let checksumAddress = '0x'\n\n for (let i = 0; i < strippedAddress.length; i++) {\n checksumAddress += parseInt(keccakHash[i], 16) >= 8 ? strippedAddress[i].toUpperCase() : strippedAddress[i]\n }\n\n return checksumAddress\n }\n return `0x${this.toHex()}`\n }\n\n validate() {\n return EthAddress.validate(this.toString())\n }\n}\n","const padHex = (hex: string, byteCount?: number) => {\n let result = hex\n if (hex.length % 2 !== 0) {\n result = `0${hex}`\n }\n if (byteCount) {\n while (result.length / 2 < byteCount) {\n result = `00${result}`\n }\n }\n return result\n}\n\nexport { padHex }\n"],"mappings":";AAAO,IAAM,YAAY,CAAC,OAAe,SAAS,MAAM;AACtD,QAAM,QAAQ,MAAM,MAAM,GAAG,MAAM;AACnC,QAAM,QAAQ,MAAM,MAAM,MAAM,SAAS,QAAQ,MAAM,MAAM;AAC7D,SAAO,GAAG,KAAK,MAAM,KAAK;AAC5B;;;ACJA,SAAS,gBAAgB;AACzB,SAAS,iBAAiB;AAC1B,OAAO,eAAe;;;ACFtB,IAAM,SAAS,CAAC,KAAa,cAAuB;AAClD,MAAI,SAAS;AACb,MAAI,IAAI,SAAS,MAAM,GAAG;AACxB,aAAS,IAAI,GAAG;AAAA,EAClB;AACA,MAAI,WAAW;AACb,WAAO,OAAO,SAAS,IAAI,WAAW;AACpC,eAAS,KAAK,MAAM;AAAA,IACtB;AAAA,EACF;AACA,SAAO;AACT;;;ADJO,IAAM,eAAe,CAAC,QAA0B,KAAK,SAAS,WAAW;AAEzE,IAAM,aAAN,MAAM,YAAW;AAAA,EACtB,OAAgB,OAAO;AAAA,EAEvB,OAAO,YAAW;AAAA,EAEV;AAAA,EAEA,YAAY,SAAoB;AACtC,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,OAAO,WAAW,OAAgB,OAAO,IAAI;AAC3C,QAAI,OAAO;AACT,YAAM,KAAK,IAAI,UAAU,MAAM,WAAW,IAAI,IAAI,MAAM,UAAU,CAAC,IAAI,OAAO,IAAI;AAClF,aAAO,IAAI,YAAW,EAAE;AAAA,IAC1B;AAAA,EACF;AAAA,EAEA,OAAO,MAAM,OAAgB,MAAe;AAC1C,QAAI,OAAO,UAAU,UAAU;AAC7B,aAAO,KAAK,WAAW,OAAO,IAAI;AAAA,IACpC;AAAA,EACF;AAAA,EAEA,OAAO,SAAS,SAAiB;AAC/B,WAAO,uBAAuB,KAAK,OAAO;AAAA,EAC5C;AAAA,EAEA,OAAO,SAA+C;AACpD,QAAI,SAAS;AACX,UAAI;AACJ,UAAI,OAAO,YAAY,UAAU;AAC/B,oBAAY,SAAS,YAAW,WAAW,OAAO,GAAG,aAAa;AAAA,MACpE,OAAO;AACL,oBAAY;AAAA,MACd;AACA,aAAO,KAAK,QAAQ,GAAG,UAAU,OAAO;AAAA,IAC1C;AACA,WAAO;AAAA,EACT;AAAA,EAEA,cAAc;AACZ,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,QAAQ;AACN,WAAO,OAAO,KAAK,QAAQ,SAAS,EAAE,GAAG,EAAE;AAAA,EAC7C;AAAA,EAEA,SAAiB;AACf,WAAO,KAAK,KAAK,MAAM,CAAC;AAAA,EAC1B;AAAA,EAEA,oBAAoB;AAClB,WAAO,KAAK,SAAS,EAAE,YAAY;AAAA,EACrC;AAAA,EAEA,cAAc,SAAS,GAAG;AACxB,WAAO,KAAK,UAAU,KAAK,MAAM,GAAG,MAAM,CAAC;AAAA,EAC7C;AAAA,EAEA,SAAS,UAAoB,SAAkB;AAC7C,QAAI,UAAU;AACZ,YAAM,kBAAkB,KAAK,MAAM;AACnC,YAAM,aAAa,UAAU,YAAY,SAAY,GAAG,OAAO,KAAK,eAAe,KAAK,eAAe,EAAE,SAAS,KAAK;AACvH,UAAI,kBAAkB;AAEtB,eAAS,IAAI,GAAG,IAAI,gBAAgB,QAAQ,KAAK;AAC/C,2BAAmB,SAAS,WAAW,CAAC,GAAG,EAAE,KAAK,IAAI,gBAAgB,CAAC,EAAE,YAAY,IAAI,gBAAgB,CAAC;AAAA,MAC5G;AAEA,aAAO;AAAA,IACT;AACA,WAAO,KAAK,KAAK,MAAM,CAAC;AAAA,EAC1B;AAAA,EAEA,WAAW;AACT,WAAO,YAAW,SAAS,KAAK,SAAS,CAAC;AAAA,EAC5C;AACF;","names":[]}
1
+ {"version":3,"sources":["../../src/ellipsize.ts","../../src/EthAddress.ts","../../src/padHex.ts"],"sourcesContent":["export const ellipsize = (value: string, length = 2) => {\n const part1 = value.slice(0, length)\n const part2 = value.slice(value.length - length, value.length)\n return `${part1}...${part2}`\n}\n","import { assertEx } from '@xylabs/assert'\nimport { getAddress } from 'ethers'\n\nimport { ellipsize } from './ellipsize'\nimport { padHex } from './padHex'\n\nexport const isEthAddress = (obj: { type: string }) => obj?.type === EthAddress.type\n\nexport class EthAddress {\n static readonly type = 'EthAddress'\n\n type = EthAddress.type\n\n private address: bigint\n\n private constructor(address: bigint) {\n this.address = address\n }\n\n static fromString(value?: string, base = 16) {\n if (value) {\n const bi = base === 16 ? BigInt(value.startsWith('0x') ? value : `0x${value}`) : BigInt(value)\n return new EthAddress(bi)\n }\n }\n\n static parse(value: unknown, base?: number) {\n if (typeof value === 'string') {\n return this.fromString(value, base)\n }\n }\n\n static validate(address: string) {\n return /^(0x)?[0-9a-f]{40}$/i.test(address)\n }\n\n equals(address?: EthAddress | string | null): boolean {\n if (address) {\n let inAddress: EthAddress\n if (typeof address === 'string') {\n inAddress = assertEx(EthAddress.fromString(address), 'Bad Address')\n } else {\n inAddress = address\n }\n return this.address === inAddress.address\n }\n return false\n }\n\n toBigNumber() {\n return this.address\n }\n\n toHex() {\n return padHex(this.address.toString(16), 20)\n }\n\n toJSON(): string {\n return `0x${this.toHex()}`\n }\n\n toLowerCaseString() {\n return this.toString().toLowerCase()\n }\n\n toShortString(length = 2) {\n return `0x${ellipsize(this.toHex(), length)}`\n }\n\n toString(checksum?: boolean, chainId?: string) {\n if (checksum) {\n const strippedAddress = this.toHex()\n return getAddress(chainId !== undefined ? `${chainId}0x${strippedAddress}` : `0x${strippedAddress}`)\n }\n return `0x${this.toHex()}`\n }\n\n validate() {\n return EthAddress.validate(this.toString())\n }\n}\n","const padHex = (hex: string, byteCount?: number) => {\n let result = hex\n if (hex.length % 2 !== 0) {\n result = `0${hex}`\n }\n if (byteCount) {\n while (result.length / 2 < byteCount) {\n result = `00${result}`\n }\n }\n return result\n}\n\nexport { padHex }\n"],"mappings":";AAAO,IAAM,YAAY,CAAC,OAAe,SAAS,MAAM;AACtD,QAAM,QAAQ,MAAM,MAAM,GAAG,MAAM;AACnC,QAAM,QAAQ,MAAM,MAAM,MAAM,SAAS,QAAQ,MAAM,MAAM;AAC7D,SAAO,GAAG,KAAK,MAAM,KAAK;AAC5B;;;ACJA,SAAS,gBAAgB;AACzB,SAAS,kBAAkB;;;ACD3B,IAAM,SAAS,CAAC,KAAa,cAAuB;AAClD,MAAI,SAAS;AACb,MAAI,IAAI,SAAS,MAAM,GAAG;AACxB,aAAS,IAAI,GAAG;AAAA,EAClB;AACA,MAAI,WAAW;AACb,WAAO,OAAO,SAAS,IAAI,WAAW;AACpC,eAAS,KAAK,MAAM;AAAA,IACtB;AAAA,EACF;AACA,SAAO;AACT;;;ADLO,IAAM,eAAe,CAAC,QAA0B,KAAK,SAAS,WAAW;AAEzE,IAAM,aAAN,MAAM,YAAW;AAAA,EACtB,OAAgB,OAAO;AAAA,EAEvB,OAAO,YAAW;AAAA,EAEV;AAAA,EAEA,YAAY,SAAiB;AACnC,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,OAAO,WAAW,OAAgB,OAAO,IAAI;AAC3C,QAAI,OAAO;AACT,YAAM,KAAK,SAAS,KAAK,OAAO,MAAM,WAAW,IAAI,IAAI,QAAQ,KAAK,KAAK,EAAE,IAAI,OAAO,KAAK;AAC7F,aAAO,IAAI,YAAW,EAAE;AAAA,IAC1B;AAAA,EACF;AAAA,EAEA,OAAO,MAAM,OAAgB,MAAe;AAC1C,QAAI,OAAO,UAAU,UAAU;AAC7B,aAAO,KAAK,WAAW,OAAO,IAAI;AAAA,IACpC;AAAA,EACF;AAAA,EAEA,OAAO,SAAS,SAAiB;AAC/B,WAAO,uBAAuB,KAAK,OAAO;AAAA,EAC5C;AAAA,EAEA,OAAO,SAA+C;AACpD,QAAI,SAAS;AACX,UAAI;AACJ,UAAI,OAAO,YAAY,UAAU;AAC/B,oBAAY,SAAS,YAAW,WAAW,OAAO,GAAG,aAAa;AAAA,MACpE,OAAO;AACL,oBAAY;AAAA,MACd;AACA,aAAO,KAAK,YAAY,UAAU;AAAA,IACpC;AACA,WAAO;AAAA,EACT;AAAA,EAEA,cAAc;AACZ,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,QAAQ;AACN,WAAO,OAAO,KAAK,QAAQ,SAAS,EAAE,GAAG,EAAE;AAAA,EAC7C;AAAA,EAEA,SAAiB;AACf,WAAO,KAAK,KAAK,MAAM,CAAC;AAAA,EAC1B;AAAA,EAEA,oBAAoB;AAClB,WAAO,KAAK,SAAS,EAAE,YAAY;AAAA,EACrC;AAAA,EAEA,cAAc,SAAS,GAAG;AACxB,WAAO,KAAK,UAAU,KAAK,MAAM,GAAG,MAAM,CAAC;AAAA,EAC7C;AAAA,EAEA,SAAS,UAAoB,SAAkB;AAC7C,QAAI,UAAU;AACZ,YAAM,kBAAkB,KAAK,MAAM;AACnC,aAAO,WAAW,YAAY,SAAY,GAAG,OAAO,KAAK,eAAe,KAAK,KAAK,eAAe,EAAE;AAAA,IACrG;AACA,WAAO,KAAK,KAAK,MAAM,CAAC;AAAA,EAC1B;AAAA,EAEA,WAAW;AACT,WAAO,YAAW,SAAS,KAAK,SAAS,CAAC;AAAA,EAC5C;AACF;","names":[]}
@@ -1,4 +1,3 @@
1
- import { BigNumber } from '@xylabs/bignumber';
2
1
  export declare const isEthAddress: (obj: {
3
2
  type: string;
4
3
  }) => boolean;
@@ -11,7 +10,7 @@ export declare class EthAddress {
11
10
  static parse(value: unknown, base?: number): EthAddress | undefined;
12
11
  static validate(address: string): boolean;
13
12
  equals(address?: EthAddress | string | null): boolean;
14
- toBigNumber(): BigNumber;
13
+ toBigNumber(): bigint;
15
14
  toHex(): string;
16
15
  toJSON(): string;
17
16
  toLowerCaseString(): string;
@@ -1 +1 @@
1
- {"version":3,"file":"EthAddress.d.ts","sourceRoot":"","sources":["../../src/EthAddress.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAM7C,eAAO,MAAM,YAAY,QAAS;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,YAAkC,CAAA;AAEpF,qBAAa,UAAU;IACrB,MAAM,CAAC,QAAQ,CAAC,IAAI,gBAAe;IAEnC,IAAI,SAAkB;IAEtB,OAAO,CAAC,OAAO,CAAW;IAE1B,OAAO;IAIP,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,IAAI,SAAK;IAO3C,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,MAAM;IAM1C,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM;IAI/B,MAAM,CAAC,OAAO,CAAC,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI,GAAG,OAAO;IAarD,WAAW;IAIX,KAAK;IAIL,MAAM,IAAI,MAAM;IAIhB,iBAAiB;IAIjB,aAAa,CAAC,MAAM,SAAI;IAIxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM;IAe7C,QAAQ;CAGT"}
1
+ {"version":3,"file":"EthAddress.d.ts","sourceRoot":"","sources":["../../src/EthAddress.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,YAAY,QAAS;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,YAAkC,CAAA;AAEpF,qBAAa,UAAU;IACrB,MAAM,CAAC,QAAQ,CAAC,IAAI,gBAAe;IAEnC,IAAI,SAAkB;IAEtB,OAAO,CAAC,OAAO,CAAQ;IAEvB,OAAO;IAIP,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,IAAI,SAAK;IAO3C,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,MAAM;IAM1C,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM;IAI/B,MAAM,CAAC,OAAO,CAAC,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI,GAAG,OAAO;IAarD,WAAW;IAIX,KAAK;IAIL,MAAM,IAAI,MAAM;IAIhB,iBAAiB;IAIjB,aAAa,CAAC,MAAM,SAAI;IAIxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM;IAQ7C,QAAQ;CAGT"}
@@ -1,4 +1,3 @@
1
- import { BigNumber } from '@xylabs/bignumber';
2
1
  export declare const isEthAddress: (obj: {
3
2
  type: string;
4
3
  }) => boolean;
@@ -11,7 +10,7 @@ export declare class EthAddress {
11
10
  static parse(value: unknown, base?: number): EthAddress | undefined;
12
11
  static validate(address: string): boolean;
13
12
  equals(address?: EthAddress | string | null): boolean;
14
- toBigNumber(): BigNumber;
13
+ toBigNumber(): bigint;
15
14
  toHex(): string;
16
15
  toJSON(): string;
17
16
  toLowerCaseString(): string;
@@ -1 +1 @@
1
- {"version":3,"file":"EthAddress.d.ts","sourceRoot":"","sources":["../../src/EthAddress.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAM7C,eAAO,MAAM,YAAY,QAAS;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,YAAkC,CAAA;AAEpF,qBAAa,UAAU;IACrB,MAAM,CAAC,QAAQ,CAAC,IAAI,gBAAe;IAEnC,IAAI,SAAkB;IAEtB,OAAO,CAAC,OAAO,CAAW;IAE1B,OAAO;IAIP,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,IAAI,SAAK;IAO3C,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,MAAM;IAM1C,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM;IAI/B,MAAM,CAAC,OAAO,CAAC,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI,GAAG,OAAO;IAarD,WAAW;IAIX,KAAK;IAIL,MAAM,IAAI,MAAM;IAIhB,iBAAiB;IAIjB,aAAa,CAAC,MAAM,SAAI;IAIxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM;IAe7C,QAAQ;CAGT"}
1
+ {"version":3,"file":"EthAddress.d.ts","sourceRoot":"","sources":["../../src/EthAddress.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,YAAY,QAAS;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,YAAkC,CAAA;AAEpF,qBAAa,UAAU;IACrB,MAAM,CAAC,QAAQ,CAAC,IAAI,gBAAe;IAEnC,IAAI,SAAkB;IAEtB,OAAO,CAAC,OAAO,CAAQ;IAEvB,OAAO;IAIP,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,IAAI,SAAK;IAO3C,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,MAAM;IAM1C,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM;IAI/B,MAAM,CAAC,OAAO,CAAC,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI,GAAG,OAAO;IAarD,WAAW;IAIX,KAAK;IAIL,MAAM,IAAI,MAAM;IAIhB,iBAAiB;IAIjB,aAAa,CAAC,MAAM,SAAI;IAIxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM;IAQ7C,QAAQ;CAGT"}
@@ -1,4 +1,3 @@
1
- import { BigNumber } from '@xylabs/bignumber';
2
1
  export declare const isEthAddress: (obj: {
3
2
  type: string;
4
3
  }) => boolean;
@@ -11,7 +10,7 @@ export declare class EthAddress {
11
10
  static parse(value: unknown, base?: number): EthAddress | undefined;
12
11
  static validate(address: string): boolean;
13
12
  equals(address?: EthAddress | string | null): boolean;
14
- toBigNumber(): BigNumber;
13
+ toBigNumber(): bigint;
15
14
  toHex(): string;
16
15
  toJSON(): string;
17
16
  toLowerCaseString(): string;
@@ -1 +1 @@
1
- {"version":3,"file":"EthAddress.d.ts","sourceRoot":"","sources":["../../src/EthAddress.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAM7C,eAAO,MAAM,YAAY,QAAS;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,YAAkC,CAAA;AAEpF,qBAAa,UAAU;IACrB,MAAM,CAAC,QAAQ,CAAC,IAAI,gBAAe;IAEnC,IAAI,SAAkB;IAEtB,OAAO,CAAC,OAAO,CAAW;IAE1B,OAAO;IAIP,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,IAAI,SAAK;IAO3C,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,MAAM;IAM1C,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM;IAI/B,MAAM,CAAC,OAAO,CAAC,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI,GAAG,OAAO;IAarD,WAAW;IAIX,KAAK;IAIL,MAAM,IAAI,MAAM;IAIhB,iBAAiB;IAIjB,aAAa,CAAC,MAAM,SAAI;IAIxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM;IAe7C,QAAQ;CAGT"}
1
+ {"version":3,"file":"EthAddress.d.ts","sourceRoot":"","sources":["../../src/EthAddress.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,YAAY,QAAS;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,YAAkC,CAAA;AAEpF,qBAAa,UAAU;IACrB,MAAM,CAAC,QAAQ,CAAC,IAAI,gBAAe;IAEnC,IAAI,SAAkB;IAEtB,OAAO,CAAC,OAAO,CAAQ;IAEvB,OAAO;IAIP,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,IAAI,SAAK;IAO3C,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,MAAM;IAM1C,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM;IAI/B,MAAM,CAAC,OAAO,CAAC,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI,GAAG,OAAO;IAarD,WAAW;IAIX,KAAK;IAIL,MAAM,IAAI,MAAM;IAIhB,iBAAiB;IAIjB,aAAa,CAAC,MAAM,SAAI;IAIxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM;IAQ7C,QAAQ;CAGT"}
@@ -1,9 +1,7 @@
1
1
  "use strict";
2
- var __create = Object.create;
3
2
  var __defProp = Object.defineProperty;
4
3
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
4
  var __getOwnPropNames = Object.getOwnPropertyNames;
6
- var __getProtoOf = Object.getPrototypeOf;
7
5
  var __hasOwnProp = Object.prototype.hasOwnProperty;
8
6
  var __export = (target, all) => {
9
7
  for (var name in all)
@@ -17,14 +15,6 @@ var __copyProps = (to, from, except, desc) => {
17
15
  }
18
16
  return to;
19
17
  };
20
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
- // If the importer is in node compatibility mode or this is not an ESM
22
- // file that has been converted to a CommonJS file using a Babel-
23
- // compatible transform (i.e. "__esModule" has not been set), then set
24
- // "default" to the CommonJS "module.exports" for node compatibility.
25
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
- mod
27
- ));
28
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
19
 
30
20
  // src/index.ts
@@ -46,8 +36,7 @@ var ellipsize = (value, length = 2) => {
46
36
 
47
37
  // src/EthAddress.ts
48
38
  var import_assert = require("@xylabs/assert");
49
- var import_bignumber = require("@xylabs/bignumber");
50
- var import_keccak256 = __toESM(require("keccak256"), 1);
39
+ var import_ethers = require("ethers");
51
40
 
52
41
  // src/padHex.ts
53
42
  var padHex = (hex, byteCount) => {
@@ -74,8 +63,8 @@ var EthAddress = class _EthAddress {
74
63
  }
75
64
  static fromString(value, base = 16) {
76
65
  if (value) {
77
- const bn = new import_bignumber.BigNumber(value.startsWith("0x") ? value.substring(2) : value, base);
78
- return new _EthAddress(bn);
66
+ const bi = base === 16 ? BigInt(value.startsWith("0x") ? value : `0x${value}`) : BigInt(value);
67
+ return new _EthAddress(bi);
79
68
  }
80
69
  }
81
70
  static parse(value, base) {
@@ -94,7 +83,7 @@ var EthAddress = class _EthAddress {
94
83
  } else {
95
84
  inAddress = address;
96
85
  }
97
- return this.address.eq(inAddress.address);
86
+ return this.address === inAddress.address;
98
87
  }
99
88
  return false;
100
89
  }
@@ -116,12 +105,7 @@ var EthAddress = class _EthAddress {
116
105
  toString(checksum, chainId) {
117
106
  if (checksum) {
118
107
  const strippedAddress = this.toHex();
119
- const keccakHash = (0, import_keccak256.default)(chainId !== void 0 ? `${chainId}0x${strippedAddress}` : strippedAddress).toString("hex");
120
- let checksumAddress = "0x";
121
- for (let i = 0; i < strippedAddress.length; i++) {
122
- checksumAddress += parseInt(keccakHash[i], 16) >= 8 ? strippedAddress[i].toUpperCase() : strippedAddress[i];
123
- }
124
- return checksumAddress;
108
+ return (0, import_ethers.getAddress)(chainId !== void 0 ? `${chainId}0x${strippedAddress}` : `0x${strippedAddress}`);
125
109
  }
126
110
  return `0x${this.toHex()}`;
127
111
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.ts","../../src/ellipsize.ts","../../src/EthAddress.ts","../../src/padHex.ts"],"sourcesContent":["export * from './ellipsize'\nexport * from './EthAddress'\nexport * from './padHex'\n","export const ellipsize = (value: string, length = 2) => {\n const part1 = value.slice(0, length)\n const part2 = value.slice(value.length - length, value.length)\n return `${part1}...${part2}`\n}\n","import { assertEx } from '@xylabs/assert'\nimport { BigNumber } from '@xylabs/bignumber'\nimport keccak256 from 'keccak256'\n\nimport { ellipsize } from './ellipsize'\nimport { padHex } from './padHex'\n\nexport const isEthAddress = (obj: { type: string }) => obj?.type === EthAddress.type\n\nexport class EthAddress {\n static readonly type = 'EthAddress'\n\n type = EthAddress.type\n\n private address: BigNumber\n\n private constructor(address: BigNumber) {\n this.address = address\n }\n\n static fromString(value?: string, base = 16) {\n if (value) {\n const bn = new BigNumber(value.startsWith('0x') ? value.substring(2) : value, base)\n return new EthAddress(bn)\n }\n }\n\n static parse(value: unknown, base?: number) {\n if (typeof value === 'string') {\n return this.fromString(value, base)\n }\n }\n\n static validate(address: string) {\n return /^(0x)?[0-9a-f]{40}$/i.test(address)\n }\n\n equals(address?: EthAddress | string | null): boolean {\n if (address) {\n let inAddress: EthAddress\n if (typeof address === 'string') {\n inAddress = assertEx(EthAddress.fromString(address), 'Bad Address')\n } else {\n inAddress = address\n }\n return this.address.eq(inAddress.address)\n }\n return false\n }\n\n toBigNumber() {\n return this.address\n }\n\n toHex() {\n return padHex(this.address.toString(16), 20)\n }\n\n toJSON(): string {\n return `0x${this.toHex()}`\n }\n\n toLowerCaseString() {\n return this.toString().toLowerCase()\n }\n\n toShortString(length = 2) {\n return `0x${ellipsize(this.toHex(), length)}`\n }\n\n toString(checksum?: boolean, chainId?: string) {\n if (checksum) {\n const strippedAddress = this.toHex()\n const keccakHash = keccak256(chainId !== undefined ? `${chainId}0x${strippedAddress}` : strippedAddress).toString('hex')\n let checksumAddress = '0x'\n\n for (let i = 0; i < strippedAddress.length; i++) {\n checksumAddress += parseInt(keccakHash[i], 16) >= 8 ? strippedAddress[i].toUpperCase() : strippedAddress[i]\n }\n\n return checksumAddress\n }\n return `0x${this.toHex()}`\n }\n\n validate() {\n return EthAddress.validate(this.toString())\n }\n}\n","const padHex = (hex: string, byteCount?: number) => {\n let result = hex\n if (hex.length % 2 !== 0) {\n result = `0${hex}`\n }\n if (byteCount) {\n while (result.length / 2 < byteCount) {\n result = `00${result}`\n }\n }\n return result\n}\n\nexport { padHex }\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAO,IAAM,YAAY,CAAC,OAAe,SAAS,MAAM;AACtD,QAAM,QAAQ,MAAM,MAAM,GAAG,MAAM;AACnC,QAAM,QAAQ,MAAM,MAAM,MAAM,SAAS,QAAQ,MAAM,MAAM;AAC7D,SAAO,GAAG,KAAK,MAAM,KAAK;AAC5B;;;ACJA,oBAAyB;AACzB,uBAA0B;AAC1B,uBAAsB;;;ACFtB,IAAM,SAAS,CAAC,KAAa,cAAuB;AAClD,MAAI,SAAS;AACb,MAAI,IAAI,SAAS,MAAM,GAAG;AACxB,aAAS,IAAI,GAAG;AAAA,EAClB;AACA,MAAI,WAAW;AACb,WAAO,OAAO,SAAS,IAAI,WAAW;AACpC,eAAS,KAAK,MAAM;AAAA,IACtB;AAAA,EACF;AACA,SAAO;AACT;;;ADJO,IAAM,eAAe,CAAC,SAA0B,2BAAK,UAAS,WAAW;AAEzE,IAAM,aAAN,MAAM,YAAW;AAAA,EACtB,OAAgB,OAAO;AAAA,EAEvB,OAAO,YAAW;AAAA,EAEV;AAAA,EAEA,YAAY,SAAoB;AACtC,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,OAAO,WAAW,OAAgB,OAAO,IAAI;AAC3C,QAAI,OAAO;AACT,YAAM,KAAK,IAAI,2BAAU,MAAM,WAAW,IAAI,IAAI,MAAM,UAAU,CAAC,IAAI,OAAO,IAAI;AAClF,aAAO,IAAI,YAAW,EAAE;AAAA,IAC1B;AAAA,EACF;AAAA,EAEA,OAAO,MAAM,OAAgB,MAAe;AAC1C,QAAI,OAAO,UAAU,UAAU;AAC7B,aAAO,KAAK,WAAW,OAAO,IAAI;AAAA,IACpC;AAAA,EACF;AAAA,EAEA,OAAO,SAAS,SAAiB;AAC/B,WAAO,uBAAuB,KAAK,OAAO;AAAA,EAC5C;AAAA,EAEA,OAAO,SAA+C;AACpD,QAAI,SAAS;AACX,UAAI;AACJ,UAAI,OAAO,YAAY,UAAU;AAC/B,wBAAY,wBAAS,YAAW,WAAW,OAAO,GAAG,aAAa;AAAA,MACpE,OAAO;AACL,oBAAY;AAAA,MACd;AACA,aAAO,KAAK,QAAQ,GAAG,UAAU,OAAO;AAAA,IAC1C;AACA,WAAO;AAAA,EACT;AAAA,EAEA,cAAc;AACZ,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,QAAQ;AACN,WAAO,OAAO,KAAK,QAAQ,SAAS,EAAE,GAAG,EAAE;AAAA,EAC7C;AAAA,EAEA,SAAiB;AACf,WAAO,KAAK,KAAK,MAAM,CAAC;AAAA,EAC1B;AAAA,EAEA,oBAAoB;AAClB,WAAO,KAAK,SAAS,EAAE,YAAY;AAAA,EACrC;AAAA,EAEA,cAAc,SAAS,GAAG;AACxB,WAAO,KAAK,UAAU,KAAK,MAAM,GAAG,MAAM,CAAC;AAAA,EAC7C;AAAA,EAEA,SAAS,UAAoB,SAAkB;AAC7C,QAAI,UAAU;AACZ,YAAM,kBAAkB,KAAK,MAAM;AACnC,YAAM,iBAAa,iBAAAA,SAAU,YAAY,SAAY,GAAG,OAAO,KAAK,eAAe,KAAK,eAAe,EAAE,SAAS,KAAK;AACvH,UAAI,kBAAkB;AAEtB,eAAS,IAAI,GAAG,IAAI,gBAAgB,QAAQ,KAAK;AAC/C,2BAAmB,SAAS,WAAW,CAAC,GAAG,EAAE,KAAK,IAAI,gBAAgB,CAAC,EAAE,YAAY,IAAI,gBAAgB,CAAC;AAAA,MAC5G;AAEA,aAAO;AAAA,IACT;AACA,WAAO,KAAK,KAAK,MAAM,CAAC;AAAA,EAC1B;AAAA,EAEA,WAAW;AACT,WAAO,YAAW,SAAS,KAAK,SAAS,CAAC;AAAA,EAC5C;AACF;","names":["keccak256"]}
1
+ {"version":3,"sources":["../../src/index.ts","../../src/ellipsize.ts","../../src/EthAddress.ts","../../src/padHex.ts"],"sourcesContent":["export * from './ellipsize'\nexport * from './EthAddress'\nexport * from './padHex'\n","export const ellipsize = (value: string, length = 2) => {\n const part1 = value.slice(0, length)\n const part2 = value.slice(value.length - length, value.length)\n return `${part1}...${part2}`\n}\n","import { assertEx } from '@xylabs/assert'\nimport { getAddress } from 'ethers'\n\nimport { ellipsize } from './ellipsize'\nimport { padHex } from './padHex'\n\nexport const isEthAddress = (obj: { type: string }) => obj?.type === EthAddress.type\n\nexport class EthAddress {\n static readonly type = 'EthAddress'\n\n type = EthAddress.type\n\n private address: bigint\n\n private constructor(address: bigint) {\n this.address = address\n }\n\n static fromString(value?: string, base = 16) {\n if (value) {\n const bi = base === 16 ? BigInt(value.startsWith('0x') ? value : `0x${value}`) : BigInt(value)\n return new EthAddress(bi)\n }\n }\n\n static parse(value: unknown, base?: number) {\n if (typeof value === 'string') {\n return this.fromString(value, base)\n }\n }\n\n static validate(address: string) {\n return /^(0x)?[0-9a-f]{40}$/i.test(address)\n }\n\n equals(address?: EthAddress | string | null): boolean {\n if (address) {\n let inAddress: EthAddress\n if (typeof address === 'string') {\n inAddress = assertEx(EthAddress.fromString(address), 'Bad Address')\n } else {\n inAddress = address\n }\n return this.address === inAddress.address\n }\n return false\n }\n\n toBigNumber() {\n return this.address\n }\n\n toHex() {\n return padHex(this.address.toString(16), 20)\n }\n\n toJSON(): string {\n return `0x${this.toHex()}`\n }\n\n toLowerCaseString() {\n return this.toString().toLowerCase()\n }\n\n toShortString(length = 2) {\n return `0x${ellipsize(this.toHex(), length)}`\n }\n\n toString(checksum?: boolean, chainId?: string) {\n if (checksum) {\n const strippedAddress = this.toHex()\n return getAddress(chainId !== undefined ? `${chainId}0x${strippedAddress}` : `0x${strippedAddress}`)\n }\n return `0x${this.toHex()}`\n }\n\n validate() {\n return EthAddress.validate(this.toString())\n }\n}\n","const padHex = (hex: string, byteCount?: number) => {\n let result = hex\n if (hex.length % 2 !== 0) {\n result = `0${hex}`\n }\n if (byteCount) {\n while (result.length / 2 < byteCount) {\n result = `00${result}`\n }\n }\n return result\n}\n\nexport { padHex }\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAO,IAAM,YAAY,CAAC,OAAe,SAAS,MAAM;AACtD,QAAM,QAAQ,MAAM,MAAM,GAAG,MAAM;AACnC,QAAM,QAAQ,MAAM,MAAM,MAAM,SAAS,QAAQ,MAAM,MAAM;AAC7D,SAAO,GAAG,KAAK,MAAM,KAAK;AAC5B;;;ACJA,oBAAyB;AACzB,oBAA2B;;;ACD3B,IAAM,SAAS,CAAC,KAAa,cAAuB;AAClD,MAAI,SAAS;AACb,MAAI,IAAI,SAAS,MAAM,GAAG;AACxB,aAAS,IAAI,GAAG;AAAA,EAClB;AACA,MAAI,WAAW;AACb,WAAO,OAAO,SAAS,IAAI,WAAW;AACpC,eAAS,KAAK,MAAM;AAAA,IACtB;AAAA,EACF;AACA,SAAO;AACT;;;ADLO,IAAM,eAAe,CAAC,SAA0B,2BAAK,UAAS,WAAW;AAEzE,IAAM,aAAN,MAAM,YAAW;AAAA,EACtB,OAAgB,OAAO;AAAA,EAEvB,OAAO,YAAW;AAAA,EAEV;AAAA,EAEA,YAAY,SAAiB;AACnC,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,OAAO,WAAW,OAAgB,OAAO,IAAI;AAC3C,QAAI,OAAO;AACT,YAAM,KAAK,SAAS,KAAK,OAAO,MAAM,WAAW,IAAI,IAAI,QAAQ,KAAK,KAAK,EAAE,IAAI,OAAO,KAAK;AAC7F,aAAO,IAAI,YAAW,EAAE;AAAA,IAC1B;AAAA,EACF;AAAA,EAEA,OAAO,MAAM,OAAgB,MAAe;AAC1C,QAAI,OAAO,UAAU,UAAU;AAC7B,aAAO,KAAK,WAAW,OAAO,IAAI;AAAA,IACpC;AAAA,EACF;AAAA,EAEA,OAAO,SAAS,SAAiB;AAC/B,WAAO,uBAAuB,KAAK,OAAO;AAAA,EAC5C;AAAA,EAEA,OAAO,SAA+C;AACpD,QAAI,SAAS;AACX,UAAI;AACJ,UAAI,OAAO,YAAY,UAAU;AAC/B,wBAAY,wBAAS,YAAW,WAAW,OAAO,GAAG,aAAa;AAAA,MACpE,OAAO;AACL,oBAAY;AAAA,MACd;AACA,aAAO,KAAK,YAAY,UAAU;AAAA,IACpC;AACA,WAAO;AAAA,EACT;AAAA,EAEA,cAAc;AACZ,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,QAAQ;AACN,WAAO,OAAO,KAAK,QAAQ,SAAS,EAAE,GAAG,EAAE;AAAA,EAC7C;AAAA,EAEA,SAAiB;AACf,WAAO,KAAK,KAAK,MAAM,CAAC;AAAA,EAC1B;AAAA,EAEA,oBAAoB;AAClB,WAAO,KAAK,SAAS,EAAE,YAAY;AAAA,EACrC;AAAA,EAEA,cAAc,SAAS,GAAG;AACxB,WAAO,KAAK,UAAU,KAAK,MAAM,GAAG,MAAM,CAAC;AAAA,EAC7C;AAAA,EAEA,SAAS,UAAoB,SAAkB;AAC7C,QAAI,UAAU;AACZ,YAAM,kBAAkB,KAAK,MAAM;AACnC,iBAAO,0BAAW,YAAY,SAAY,GAAG,OAAO,KAAK,eAAe,KAAK,KAAK,eAAe,EAAE;AAAA,IACrG;AACA,WAAO,KAAK,KAAK,MAAM,CAAC;AAAA,EAC1B;AAAA,EAEA,WAAW;AACT,WAAO,YAAW,SAAS,KAAK,SAAS,CAAC;AAAA,EAC5C;AACF;","names":[]}
@@ -7,8 +7,7 @@ var ellipsize = (value, length = 2) => {
7
7
 
8
8
  // src/EthAddress.ts
9
9
  import { assertEx } from "@xylabs/assert";
10
- import { BigNumber } from "@xylabs/bignumber";
11
- import keccak256 from "keccak256";
10
+ import { getAddress } from "ethers";
12
11
 
13
12
  // src/padHex.ts
14
13
  var padHex = (hex, byteCount) => {
@@ -35,8 +34,8 @@ var EthAddress = class _EthAddress {
35
34
  }
36
35
  static fromString(value, base = 16) {
37
36
  if (value) {
38
- const bn = new BigNumber(value.startsWith("0x") ? value.substring(2) : value, base);
39
- return new _EthAddress(bn);
37
+ const bi = base === 16 ? BigInt(value.startsWith("0x") ? value : `0x${value}`) : BigInt(value);
38
+ return new _EthAddress(bi);
40
39
  }
41
40
  }
42
41
  static parse(value, base) {
@@ -55,7 +54,7 @@ var EthAddress = class _EthAddress {
55
54
  } else {
56
55
  inAddress = address;
57
56
  }
58
- return this.address.eq(inAddress.address);
57
+ return this.address === inAddress.address;
59
58
  }
60
59
  return false;
61
60
  }
@@ -77,12 +76,7 @@ var EthAddress = class _EthAddress {
77
76
  toString(checksum, chainId) {
78
77
  if (checksum) {
79
78
  const strippedAddress = this.toHex();
80
- const keccakHash = keccak256(chainId !== void 0 ? `${chainId}0x${strippedAddress}` : strippedAddress).toString("hex");
81
- let checksumAddress = "0x";
82
- for (let i = 0; i < strippedAddress.length; i++) {
83
- checksumAddress += parseInt(keccakHash[i], 16) >= 8 ? strippedAddress[i].toUpperCase() : strippedAddress[i];
84
- }
85
- return checksumAddress;
79
+ return getAddress(chainId !== void 0 ? `${chainId}0x${strippedAddress}` : `0x${strippedAddress}`);
86
80
  }
87
81
  return `0x${this.toHex()}`;
88
82
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/ellipsize.ts","../../src/EthAddress.ts","../../src/padHex.ts"],"sourcesContent":["export const ellipsize = (value: string, length = 2) => {\n const part1 = value.slice(0, length)\n const part2 = value.slice(value.length - length, value.length)\n return `${part1}...${part2}`\n}\n","import { assertEx } from '@xylabs/assert'\nimport { BigNumber } from '@xylabs/bignumber'\nimport keccak256 from 'keccak256'\n\nimport { ellipsize } from './ellipsize'\nimport { padHex } from './padHex'\n\nexport const isEthAddress = (obj: { type: string }) => obj?.type === EthAddress.type\n\nexport class EthAddress {\n static readonly type = 'EthAddress'\n\n type = EthAddress.type\n\n private address: BigNumber\n\n private constructor(address: BigNumber) {\n this.address = address\n }\n\n static fromString(value?: string, base = 16) {\n if (value) {\n const bn = new BigNumber(value.startsWith('0x') ? value.substring(2) : value, base)\n return new EthAddress(bn)\n }\n }\n\n static parse(value: unknown, base?: number) {\n if (typeof value === 'string') {\n return this.fromString(value, base)\n }\n }\n\n static validate(address: string) {\n return /^(0x)?[0-9a-f]{40}$/i.test(address)\n }\n\n equals(address?: EthAddress | string | null): boolean {\n if (address) {\n let inAddress: EthAddress\n if (typeof address === 'string') {\n inAddress = assertEx(EthAddress.fromString(address), 'Bad Address')\n } else {\n inAddress = address\n }\n return this.address.eq(inAddress.address)\n }\n return false\n }\n\n toBigNumber() {\n return this.address\n }\n\n toHex() {\n return padHex(this.address.toString(16), 20)\n }\n\n toJSON(): string {\n return `0x${this.toHex()}`\n }\n\n toLowerCaseString() {\n return this.toString().toLowerCase()\n }\n\n toShortString(length = 2) {\n return `0x${ellipsize(this.toHex(), length)}`\n }\n\n toString(checksum?: boolean, chainId?: string) {\n if (checksum) {\n const strippedAddress = this.toHex()\n const keccakHash = keccak256(chainId !== undefined ? `${chainId}0x${strippedAddress}` : strippedAddress).toString('hex')\n let checksumAddress = '0x'\n\n for (let i = 0; i < strippedAddress.length; i++) {\n checksumAddress += parseInt(keccakHash[i], 16) >= 8 ? strippedAddress[i].toUpperCase() : strippedAddress[i]\n }\n\n return checksumAddress\n }\n return `0x${this.toHex()}`\n }\n\n validate() {\n return EthAddress.validate(this.toString())\n }\n}\n","const padHex = (hex: string, byteCount?: number) => {\n let result = hex\n if (hex.length % 2 !== 0) {\n result = `0${hex}`\n }\n if (byteCount) {\n while (result.length / 2 < byteCount) {\n result = `00${result}`\n }\n }\n return result\n}\n\nexport { padHex }\n"],"mappings":";AAAO,IAAM,YAAY,CAAC,OAAe,SAAS,MAAM;AACtD,QAAM,QAAQ,MAAM,MAAM,GAAG,MAAM;AACnC,QAAM,QAAQ,MAAM,MAAM,MAAM,SAAS,QAAQ,MAAM,MAAM;AAC7D,SAAO,GAAG,KAAK,MAAM,KAAK;AAC5B;;;ACJA,SAAS,gBAAgB;AACzB,SAAS,iBAAiB;AAC1B,OAAO,eAAe;;;ACFtB,IAAM,SAAS,CAAC,KAAa,cAAuB;AAClD,MAAI,SAAS;AACb,MAAI,IAAI,SAAS,MAAM,GAAG;AACxB,aAAS,IAAI,GAAG;AAAA,EAClB;AACA,MAAI,WAAW;AACb,WAAO,OAAO,SAAS,IAAI,WAAW;AACpC,eAAS,KAAK,MAAM;AAAA,IACtB;AAAA,EACF;AACA,SAAO;AACT;;;ADJO,IAAM,eAAe,CAAC,SAA0B,2BAAK,UAAS,WAAW;AAEzE,IAAM,aAAN,MAAM,YAAW;AAAA,EACtB,OAAgB,OAAO;AAAA,EAEvB,OAAO,YAAW;AAAA,EAEV;AAAA,EAEA,YAAY,SAAoB;AACtC,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,OAAO,WAAW,OAAgB,OAAO,IAAI;AAC3C,QAAI,OAAO;AACT,YAAM,KAAK,IAAI,UAAU,MAAM,WAAW,IAAI,IAAI,MAAM,UAAU,CAAC,IAAI,OAAO,IAAI;AAClF,aAAO,IAAI,YAAW,EAAE;AAAA,IAC1B;AAAA,EACF;AAAA,EAEA,OAAO,MAAM,OAAgB,MAAe;AAC1C,QAAI,OAAO,UAAU,UAAU;AAC7B,aAAO,KAAK,WAAW,OAAO,IAAI;AAAA,IACpC;AAAA,EACF;AAAA,EAEA,OAAO,SAAS,SAAiB;AAC/B,WAAO,uBAAuB,KAAK,OAAO;AAAA,EAC5C;AAAA,EAEA,OAAO,SAA+C;AACpD,QAAI,SAAS;AACX,UAAI;AACJ,UAAI,OAAO,YAAY,UAAU;AAC/B,oBAAY,SAAS,YAAW,WAAW,OAAO,GAAG,aAAa;AAAA,MACpE,OAAO;AACL,oBAAY;AAAA,MACd;AACA,aAAO,KAAK,QAAQ,GAAG,UAAU,OAAO;AAAA,IAC1C;AACA,WAAO;AAAA,EACT;AAAA,EAEA,cAAc;AACZ,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,QAAQ;AACN,WAAO,OAAO,KAAK,QAAQ,SAAS,EAAE,GAAG,EAAE;AAAA,EAC7C;AAAA,EAEA,SAAiB;AACf,WAAO,KAAK,KAAK,MAAM,CAAC;AAAA,EAC1B;AAAA,EAEA,oBAAoB;AAClB,WAAO,KAAK,SAAS,EAAE,YAAY;AAAA,EACrC;AAAA,EAEA,cAAc,SAAS,GAAG;AACxB,WAAO,KAAK,UAAU,KAAK,MAAM,GAAG,MAAM,CAAC;AAAA,EAC7C;AAAA,EAEA,SAAS,UAAoB,SAAkB;AAC7C,QAAI,UAAU;AACZ,YAAM,kBAAkB,KAAK,MAAM;AACnC,YAAM,aAAa,UAAU,YAAY,SAAY,GAAG,OAAO,KAAK,eAAe,KAAK,eAAe,EAAE,SAAS,KAAK;AACvH,UAAI,kBAAkB;AAEtB,eAAS,IAAI,GAAG,IAAI,gBAAgB,QAAQ,KAAK;AAC/C,2BAAmB,SAAS,WAAW,CAAC,GAAG,EAAE,KAAK,IAAI,gBAAgB,CAAC,EAAE,YAAY,IAAI,gBAAgB,CAAC;AAAA,MAC5G;AAEA,aAAO;AAAA,IACT;AACA,WAAO,KAAK,KAAK,MAAM,CAAC;AAAA,EAC1B;AAAA,EAEA,WAAW;AACT,WAAO,YAAW,SAAS,KAAK,SAAS,CAAC;AAAA,EAC5C;AACF;","names":[]}
1
+ {"version":3,"sources":["../../src/ellipsize.ts","../../src/EthAddress.ts","../../src/padHex.ts"],"sourcesContent":["export const ellipsize = (value: string, length = 2) => {\n const part1 = value.slice(0, length)\n const part2 = value.slice(value.length - length, value.length)\n return `${part1}...${part2}`\n}\n","import { assertEx } from '@xylabs/assert'\nimport { getAddress } from 'ethers'\n\nimport { ellipsize } from './ellipsize'\nimport { padHex } from './padHex'\n\nexport const isEthAddress = (obj: { type: string }) => obj?.type === EthAddress.type\n\nexport class EthAddress {\n static readonly type = 'EthAddress'\n\n type = EthAddress.type\n\n private address: bigint\n\n private constructor(address: bigint) {\n this.address = address\n }\n\n static fromString(value?: string, base = 16) {\n if (value) {\n const bi = base === 16 ? BigInt(value.startsWith('0x') ? value : `0x${value}`) : BigInt(value)\n return new EthAddress(bi)\n }\n }\n\n static parse(value: unknown, base?: number) {\n if (typeof value === 'string') {\n return this.fromString(value, base)\n }\n }\n\n static validate(address: string) {\n return /^(0x)?[0-9a-f]{40}$/i.test(address)\n }\n\n equals(address?: EthAddress | string | null): boolean {\n if (address) {\n let inAddress: EthAddress\n if (typeof address === 'string') {\n inAddress = assertEx(EthAddress.fromString(address), 'Bad Address')\n } else {\n inAddress = address\n }\n return this.address === inAddress.address\n }\n return false\n }\n\n toBigNumber() {\n return this.address\n }\n\n toHex() {\n return padHex(this.address.toString(16), 20)\n }\n\n toJSON(): string {\n return `0x${this.toHex()}`\n }\n\n toLowerCaseString() {\n return this.toString().toLowerCase()\n }\n\n toShortString(length = 2) {\n return `0x${ellipsize(this.toHex(), length)}`\n }\n\n toString(checksum?: boolean, chainId?: string) {\n if (checksum) {\n const strippedAddress = this.toHex()\n return getAddress(chainId !== undefined ? `${chainId}0x${strippedAddress}` : `0x${strippedAddress}`)\n }\n return `0x${this.toHex()}`\n }\n\n validate() {\n return EthAddress.validate(this.toString())\n }\n}\n","const padHex = (hex: string, byteCount?: number) => {\n let result = hex\n if (hex.length % 2 !== 0) {\n result = `0${hex}`\n }\n if (byteCount) {\n while (result.length / 2 < byteCount) {\n result = `00${result}`\n }\n }\n return result\n}\n\nexport { padHex }\n"],"mappings":";AAAO,IAAM,YAAY,CAAC,OAAe,SAAS,MAAM;AACtD,QAAM,QAAQ,MAAM,MAAM,GAAG,MAAM;AACnC,QAAM,QAAQ,MAAM,MAAM,MAAM,SAAS,QAAQ,MAAM,MAAM;AAC7D,SAAO,GAAG,KAAK,MAAM,KAAK;AAC5B;;;ACJA,SAAS,gBAAgB;AACzB,SAAS,kBAAkB;;;ACD3B,IAAM,SAAS,CAAC,KAAa,cAAuB;AAClD,MAAI,SAAS;AACb,MAAI,IAAI,SAAS,MAAM,GAAG;AACxB,aAAS,IAAI,GAAG;AAAA,EAClB;AACA,MAAI,WAAW;AACb,WAAO,OAAO,SAAS,IAAI,WAAW;AACpC,eAAS,KAAK,MAAM;AAAA,IACtB;AAAA,EACF;AACA,SAAO;AACT;;;ADLO,IAAM,eAAe,CAAC,SAA0B,2BAAK,UAAS,WAAW;AAEzE,IAAM,aAAN,MAAM,YAAW;AAAA,EACtB,OAAgB,OAAO;AAAA,EAEvB,OAAO,YAAW;AAAA,EAEV;AAAA,EAEA,YAAY,SAAiB;AACnC,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,OAAO,WAAW,OAAgB,OAAO,IAAI;AAC3C,QAAI,OAAO;AACT,YAAM,KAAK,SAAS,KAAK,OAAO,MAAM,WAAW,IAAI,IAAI,QAAQ,KAAK,KAAK,EAAE,IAAI,OAAO,KAAK;AAC7F,aAAO,IAAI,YAAW,EAAE;AAAA,IAC1B;AAAA,EACF;AAAA,EAEA,OAAO,MAAM,OAAgB,MAAe;AAC1C,QAAI,OAAO,UAAU,UAAU;AAC7B,aAAO,KAAK,WAAW,OAAO,IAAI;AAAA,IACpC;AAAA,EACF;AAAA,EAEA,OAAO,SAAS,SAAiB;AAC/B,WAAO,uBAAuB,KAAK,OAAO;AAAA,EAC5C;AAAA,EAEA,OAAO,SAA+C;AACpD,QAAI,SAAS;AACX,UAAI;AACJ,UAAI,OAAO,YAAY,UAAU;AAC/B,oBAAY,SAAS,YAAW,WAAW,OAAO,GAAG,aAAa;AAAA,MACpE,OAAO;AACL,oBAAY;AAAA,MACd;AACA,aAAO,KAAK,YAAY,UAAU;AAAA,IACpC;AACA,WAAO;AAAA,EACT;AAAA,EAEA,cAAc;AACZ,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,QAAQ;AACN,WAAO,OAAO,KAAK,QAAQ,SAAS,EAAE,GAAG,EAAE;AAAA,EAC7C;AAAA,EAEA,SAAiB;AACf,WAAO,KAAK,KAAK,MAAM,CAAC;AAAA,EAC1B;AAAA,EAEA,oBAAoB;AAClB,WAAO,KAAK,SAAS,EAAE,YAAY;AAAA,EACrC;AAAA,EAEA,cAAc,SAAS,GAAG;AACxB,WAAO,KAAK,UAAU,KAAK,MAAM,GAAG,MAAM,CAAC;AAAA,EAC7C;AAAA,EAEA,SAAS,UAAoB,SAAkB;AAC7C,QAAI,UAAU;AACZ,YAAM,kBAAkB,KAAK,MAAM;AACnC,aAAO,WAAW,YAAY,SAAY,GAAG,OAAO,KAAK,eAAe,KAAK,KAAK,eAAe,EAAE;AAAA,IACrG;AACA,WAAO,KAAK,KAAK,MAAM,CAAC;AAAA,EAC1B;AAAA,EAEA,WAAW;AACT,WAAO,YAAW,SAAS,KAAK,SAAS,CAAC;AAAA,EAC5C;AACF;","names":[]}
package/package.json CHANGED
@@ -38,9 +38,8 @@
38
38
  "esm"
39
39
  ],
40
40
  "dependencies": {
41
- "@xylabs/assert": "~2.13.18",
42
- "@xylabs/bignumber": "~2.13.18",
43
- "keccak256": "^1.0.6"
41
+ "@xylabs/assert": "~2.13.20",
42
+ "ethers": "^6.9.0"
44
43
  },
45
44
  "devDependencies": {
46
45
  "@xylabs/ts-scripts-yarn3": "^3.2.10",
@@ -56,6 +55,6 @@
56
55
  "url": "https://github.com/xylabs/sdk-js.git"
57
56
  },
58
57
  "sideEffects": false,
59
- "version": "2.13.18",
58
+ "version": "2.13.20",
60
59
  "type": "module"
61
60
  }
package/src/EthAddress.ts CHANGED
@@ -1,6 +1,5 @@
1
1
  import { assertEx } from '@xylabs/assert'
2
- import { BigNumber } from '@xylabs/bignumber'
3
- import keccak256 from 'keccak256'
2
+ import { getAddress } from 'ethers'
4
3
 
5
4
  import { ellipsize } from './ellipsize'
6
5
  import { padHex } from './padHex'
@@ -12,16 +11,16 @@ export class EthAddress {
12
11
 
13
12
  type = EthAddress.type
14
13
 
15
- private address: BigNumber
14
+ private address: bigint
16
15
 
17
- private constructor(address: BigNumber) {
16
+ private constructor(address: bigint) {
18
17
  this.address = address
19
18
  }
20
19
 
21
20
  static fromString(value?: string, base = 16) {
22
21
  if (value) {
23
- const bn = new BigNumber(value.startsWith('0x') ? value.substring(2) : value, base)
24
- return new EthAddress(bn)
22
+ const bi = base === 16 ? BigInt(value.startsWith('0x') ? value : `0x${value}`) : BigInt(value)
23
+ return new EthAddress(bi)
25
24
  }
26
25
  }
27
26
 
@@ -43,7 +42,7 @@ export class EthAddress {
43
42
  } else {
44
43
  inAddress = address
45
44
  }
46
- return this.address.eq(inAddress.address)
45
+ return this.address === inAddress.address
47
46
  }
48
47
  return false
49
48
  }
@@ -71,14 +70,7 @@ export class EthAddress {
71
70
  toString(checksum?: boolean, chainId?: string) {
72
71
  if (checksum) {
73
72
  const strippedAddress = this.toHex()
74
- const keccakHash = keccak256(chainId !== undefined ? `${chainId}0x${strippedAddress}` : strippedAddress).toString('hex')
75
- let checksumAddress = '0x'
76
-
77
- for (let i = 0; i < strippedAddress.length; i++) {
78
- checksumAddress += parseInt(keccakHash[i], 16) >= 8 ? strippedAddress[i].toUpperCase() : strippedAddress[i]
79
- }
80
-
81
- return checksumAddress
73
+ return getAddress(chainId !== undefined ? `${chainId}0x${strippedAddress}` : `0x${strippedAddress}`)
82
74
  }
83
75
  return `0x${this.toHex()}`
84
76
  }