@socket.tech/dl-common 1.0.16 → 1.0.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (112) hide show
  1. package/dist/constants/confirmations.d.ts +5 -0
  2. package/dist/constants/confirmations.js +17 -0
  3. package/dist/constants/enums.d.ts +44 -0
  4. package/dist/constants/enums.js +52 -0
  5. package/dist/constants/index.d.ts +3 -0
  6. package/dist/constants/index.js +19 -0
  7. package/dist/constants/types.d.ts +136 -0
  8. package/dist/constants/types.js +53 -0
  9. package/dist/constants/waitTime.d.ts +8 -0
  10. package/dist/constants/waitTime.js +45 -0
  11. package/dist/dl-common/constants/index.d.ts +1 -0
  12. package/dist/dl-common/constants/index.js +1 -0
  13. package/dist/dl-common/constants/index.js.map +1 -1
  14. package/dist/dl-common/constants/relay-types.d.ts +70 -0
  15. package/dist/dl-common/constants/relay-types.js +23 -0
  16. package/dist/dl-common/constants/relay-types.js.map +1 -0
  17. package/dist/dl-common/utils/index.d.ts +1 -0
  18. package/dist/dl-common/utils/index.js +1 -0
  19. package/dist/dl-common/utils/index.js.map +1 -1
  20. package/dist/dl-common/utils/relaySigner.d.ts +2 -0
  21. package/dist/dl-common/utils/relaySigner.js +16 -0
  22. package/dist/dl-common/utils/relaySigner.js.map +1 -1
  23. package/dist/dl-common/utils/relayUtils.d.ts +2 -0
  24. package/dist/dl-common/utils/relayUtils.js +21 -0
  25. package/dist/dl-common/utils/relayUtils.js.map +1 -0
  26. package/dist/dl-common/utils/signer/adapter.js.map +1 -1
  27. package/dist/dl-common/utils/signer/kms-ethers-signer.js.map +1 -1
  28. package/dist/dl-common/utils/signer/kms-signer.js +1 -1
  29. package/dist/index.d.ts +4 -0
  30. package/dist/index.js +36 -0
  31. package/dist/models/attestSignature.d.ts +35 -0
  32. package/dist/models/attestSignature.js +53 -0
  33. package/dist/models/attestation.d.ts +70 -0
  34. package/dist/models/attestation.js +86 -0
  35. package/dist/models/index.d.ts +7 -0
  36. package/dist/models/index.js +23 -0
  37. package/dist/models/lastBlock.d.ts +28 -0
  38. package/dist/models/lastBlock.js +27 -0
  39. package/dist/models/message.d.ts +171 -0
  40. package/dist/models/message.js +193 -0
  41. package/dist/models/packet.d.ts +240 -0
  42. package/dist/models/packet.js +249 -0
  43. package/dist/models/proposal.d.ts +127 -0
  44. package/dist/models/proposal.js +141 -0
  45. package/dist/models/switchboard.d.ts +69 -0
  46. package/dist/models/switchboard.js +92 -0
  47. package/dist/models/transaction.d.ts +0 -0
  48. package/dist/models/transaction.js +280 -0
  49. package/dist/services/cacheService.d.ts +14 -0
  50. package/dist/services/cacheService.js +77 -0
  51. package/dist/services/eventBridgeService.d.ts +8 -0
  52. package/dist/services/eventBridgeService.js +40 -0
  53. package/dist/services/index.d.ts +3 -0
  54. package/dist/services/index.js +20 -0
  55. package/dist/services/queueService.d.ts +10 -0
  56. package/dist/services/queueService.js +62 -0
  57. package/dist/src/constants/gasEstimation.d.ts +8 -0
  58. package/dist/src/constants/gasEstimation.js +61 -0
  59. package/dist/src/relayers/propose/main.js.map +1 -1
  60. package/dist/src/relayers/proposeRelayer.d.ts +7 -0
  61. package/dist/src/relayers/proposeRelayer.js +587 -0
  62. package/dist/src/services/batcherService.d.ts +9 -0
  63. package/dist/src/services/batcherService.js +197 -0
  64. package/dist/src/services/executeService.d.ts +16 -0
  65. package/dist/src/services/executeService.js +209 -0
  66. package/dist/utils/address.d.ts +2 -0
  67. package/dist/utils/address.js +8 -0
  68. package/dist/utils/axios.d.ts +2 -0
  69. package/dist/utils/axios.js +54 -0
  70. package/dist/utils/dataStructHelper.d.ts +2 -0
  71. package/dist/utils/dataStructHelper.js +10 -0
  72. package/dist/utils/discord.d.ts +2 -0
  73. package/dist/utils/discord.js +43 -0
  74. package/dist/utils/ethersAwsKmsSigner.d.ts +2 -0
  75. package/dist/utils/ethersAwsKmsSigner.js +26 -0
  76. package/dist/utils/eventGetter.d.ts +4 -0
  77. package/dist/utils/eventGetter.js +50 -0
  78. package/dist/utils/extraUtils.d.ts +32 -0
  79. package/dist/utils/extraUtils.js +103 -0
  80. package/dist/utils/idUtils.d.ts +14 -0
  81. package/dist/utils/idUtils.js +50 -0
  82. package/dist/utils/index.d.ts +13 -0
  83. package/dist/utils/index.js +29 -0
  84. package/dist/utils/relaySigner.d.ts +21 -0
  85. package/dist/utils/relaySigner.js +68 -0
  86. package/dist/utils/s3Service.d.ts +11 -0
  87. package/dist/utils/s3Service.js +70 -0
  88. package/dist/utils/secretManagerService.d.ts +2 -0
  89. package/dist/utils/secretManagerService.js +33 -0
  90. package/dist/utils/signer/adapter.d.ts +18 -0
  91. package/dist/utils/signer/adapter.js +71 -0
  92. package/dist/utils/signer/address.d.ts +9 -0
  93. package/dist/utils/signer/address.js +42 -0
  94. package/dist/utils/signer/asn1-parser.d.ts +10 -0
  95. package/dist/utils/signer/asn1-parser.js +79 -0
  96. package/dist/utils/signer/crypto.d.ts +5 -0
  97. package/dist/utils/signer/crypto.js +33 -0
  98. package/dist/utils/signer/index.d.ts +5 -0
  99. package/dist/utils/signer/index.js +21 -0
  100. package/dist/utils/signer/kms-ethers-signer.d.ts +19 -0
  101. package/dist/utils/signer/kms-ethers-signer.js +32 -0
  102. package/dist/utils/signer/kms-signer.d.ts +13 -0
  103. package/dist/utils/signer/kms-signer.js +46 -0
  104. package/dist/utils/signer/signature.d.ts +16 -0
  105. package/dist/utils/signer/signature.js +65 -0
  106. package/dist/utils/signer/signer.d.ts +6 -0
  107. package/dist/utils/signer/signer.js +2 -0
  108. package/dist/utils/signer/socketSigner.d.ts +39 -0
  109. package/dist/utils/signer/socketSigner.js +153 -0
  110. package/dist/utils/time.d.ts +2 -0
  111. package/dist/utils/time.js +7 -0
  112. package/package.json +4 -4
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.parsePublicKey = parsePublicKey;
27
+ exports.parseSignature = parseSignature;
28
+ const asn1js = __importStar(require("asn1js"));
29
+ function toArrayBuffer(buffer) {
30
+ const ab = new ArrayBuffer(buffer.length);
31
+ const view = new Uint8Array(ab);
32
+ for (let i = 0; i < buffer.length; ++i) {
33
+ view[i] = buffer[i];
34
+ }
35
+ return ab;
36
+ }
37
+ function isUnsignedInteger(buffer) {
38
+ return buffer[0] === 0;
39
+ }
40
+ function pad(params) {
41
+ const { buffer, length, element } = params;
42
+ const padding = Buffer.alloc(length - buffer.length, element);
43
+ return Buffer.concat([padding, buffer]);
44
+ }
45
+ function parsePublicKey(buf) {
46
+ const { result } = asn1js.fromBER(toArrayBuffer(buf));
47
+ const values = result.valueBlock.value;
48
+ const value = values[1];
49
+ return Buffer.from(value.valueBlock.valueHex.slice(1));
50
+ }
51
+ /**
52
+ * Parse signature from the given signature.
53
+ * @param buf The buffer of the signature which following ASN.1 format.
54
+ * @returns The set consists of, `r` and `s`. The `r` and `s` are parsed from the given signature and converted to 32 statically sized format from ASN.1 format. For example, if there is 33-bytes unsigned integer formatted by ASN.1, it will be converted into 32-length bytes which dropped the first byte. (e.g. `00e26f7c547cf497959af070ec7c43ebdbb3e4341395912d6ccc950b43e886781b` → `e26f7c547cf497959af070ec7c43ebdbb3e4341395912d6ccc950b43e886781b`). And, if there is 31-bytes integer formatted by ASN.1, it will be padded into 32-length bytes with `0` byte. (e.g. `74e3e4d71e7385ae71042b0f99f7fbbf66e7760dd513ed2fcea754e2a9131c` → `0074e3e4d71e7385ae71042b0f99f7fbbf66e7760dd513ed2fcea754e2a9131c`).
55
+ */
56
+ function parseSignature(buf) {
57
+ const { result } = asn1js.fromBER(toArrayBuffer(buf));
58
+ const values = result.valueBlock.value;
59
+ const getHex = (value) => Buffer.from(value.valueBlock.valueHex);
60
+ let r = getHex(values[0]);
61
+ let s = getHex(values[1]);
62
+ if (isUnsignedInteger(r)) {
63
+ r = r.slice(1);
64
+ }
65
+ if (isUnsignedInteger(s)) {
66
+ s = s.slice(1);
67
+ }
68
+ r = pad({
69
+ buffer: r,
70
+ length: 32,
71
+ element: 0,
72
+ });
73
+ s = pad({
74
+ buffer: s,
75
+ length: 32,
76
+ element: 0,
77
+ });
78
+ return { r, s };
79
+ }
@@ -0,0 +1,5 @@
1
+ export type Hash = string;
2
+ export type Address = string;
3
+ export declare function removeHexadecimalPrefix(x: string): string;
4
+ export declare function addHexadecimalPrefix(x: string): string;
5
+ export declare function recover(digest: Buffer, r: Buffer, s: Buffer, v: number): Buffer;
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.removeHexadecimalPrefix = removeHexadecimalPrefix;
7
+ exports.addHexadecimalPrefix = addHexadecimalPrefix;
8
+ exports.recover = recover;
9
+ const secp256k1_1 = __importDefault(require("secp256k1"));
10
+ function removeHexadecimalPrefix(x) {
11
+ if (x.startsWith("0x")) {
12
+ return x.slice(2);
13
+ }
14
+ return x;
15
+ }
16
+ function addHexadecimalPrefix(x) {
17
+ if (x.startsWith("0x")) {
18
+ return x;
19
+ }
20
+ return `0x${x}`;
21
+ }
22
+ function recover(digest, r, s, v) {
23
+ if (r.length !== 32) {
24
+ throw new Error("invalid signature length");
25
+ }
26
+ if (s.length !== 32) {
27
+ throw new Error("invalid signature length");
28
+ }
29
+ const publicKey = secp256k1_1.default
30
+ .ecdsaRecover(Uint8Array.from(Buffer.concat([r, s])), v, Uint8Array.from(digest), false)
31
+ .slice(1);
32
+ return Buffer.from(publicKey);
33
+ }
@@ -0,0 +1,5 @@
1
+ export * from "./address";
2
+ export * from "./signature";
3
+ export * from "./kms-signer";
4
+ export * from "./kms-ethers-signer";
5
+ export * from "./socketSigner";
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./address"), exports);
18
+ __exportStar(require("./signature"), exports);
19
+ __exportStar(require("./kms-signer"), exports);
20
+ __exportStar(require("./kms-ethers-signer"), exports);
21
+ __exportStar(require("./socketSigner"), exports);
@@ -0,0 +1,19 @@
1
+ import { Signer } from "@ethersproject/abstract-signer";
2
+ import type { Deferrable } from "@ethersproject/properties";
3
+ import type { Bytes } from "@ethersproject/bytes";
4
+ import type { Provider, TransactionRequest } from "@ethersproject/abstract-provider";
5
+ import type { KMSClientConfig } from "@aws-sdk/client-kms";
6
+ export type KmsEthersSignerConfig = {
7
+ keyId: string;
8
+ kmsClientConfig?: KMSClientConfig;
9
+ };
10
+ export declare class KmsEthersSigner extends Signer {
11
+ private readonly config;
12
+ private readonly kmsSigner;
13
+ private readonly adapter;
14
+ constructor(config: KmsEthersSignerConfig, provider?: Provider);
15
+ getAddress(): Promise<string>;
16
+ signMessage(message: Bytes | string): Promise<string>;
17
+ signTransaction(deferrableTransaction: Deferrable<TransactionRequest>): Promise<string>;
18
+ connect(provider: Provider): KmsEthersSigner;
19
+ }
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.KmsEthersSigner = void 0;
4
+ const abstract_signer_1 = require("@ethersproject/abstract-signer");
5
+ const properties_1 = require("@ethersproject/properties");
6
+ const kms_signer_1 = require("./kms-signer");
7
+ const adapter_1 = require("./adapter");
8
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
9
+ const version = "1.0.3";
10
+ class KmsEthersSigner extends abstract_signer_1.Signer {
11
+ constructor(config, provider) {
12
+ var _a;
13
+ super();
14
+ this.config = config;
15
+ (0, properties_1.defineReadOnly)(this, "provider", provider);
16
+ this.kmsSigner = new kms_signer_1.KmsSigner(config.keyId, (_a = config.kmsClientConfig) !== null && _a !== void 0 ? _a : {});
17
+ this.adapter = new adapter_1.Adapter({ signer: this.kmsSigner, version }, provider);
18
+ }
19
+ async getAddress() {
20
+ return this.adapter.getAddress();
21
+ }
22
+ async signMessage(message) {
23
+ return this.adapter.signMessage(message);
24
+ }
25
+ async signTransaction(deferrableTransaction) {
26
+ return this.adapter.signTransaction(deferrableTransaction);
27
+ }
28
+ connect(provider) {
29
+ return new KmsEthersSigner(this.config, provider);
30
+ }
31
+ }
32
+ exports.KmsEthersSigner = KmsEthersSigner;
@@ -0,0 +1,13 @@
1
+ import { KMSClientConfig } from "@aws-sdk/client-kms";
2
+ import { Signature } from "./signature";
3
+ import { Address } from "./address";
4
+ import { Signer } from "./signer";
5
+ export declare class KmsSigner implements Signer {
6
+ private readonly keyId;
7
+ private readonly client;
8
+ constructor(keyId: string, config?: KMSClientConfig);
9
+ sign(digest: Buffer): Promise<Signature>;
10
+ getAddress(): Promise<Address>;
11
+ getPublicKey(): Promise<Buffer>;
12
+ private _sign;
13
+ }
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.KmsSigner = void 0;
4
+ const client_kms_1 = require("@aws-sdk/client-kms");
5
+ const signature_1 = require("./signature");
6
+ const asn1_parser_1 = require("./asn1-parser");
7
+ const address_1 = require("./address");
8
+ class KmsSigner {
9
+ constructor(keyId, config) {
10
+ this.keyId = keyId;
11
+ this.client = new client_kms_1.KMSClient(config !== null && config !== void 0 ? config : {});
12
+ }
13
+ async sign(digest) {
14
+ const asn1Signature = await this._sign(digest);
15
+ const address = await this.getAddress();
16
+ const { r, s } = (0, asn1_parser_1.parseSignature)(asn1Signature);
17
+ return signature_1.Signature.fromDigest(digest, address, r, s);
18
+ }
19
+ async getAddress() {
20
+ const asn1PublicKey = await this.getPublicKey();
21
+ const publicKey = (0, asn1_parser_1.parsePublicKey)(asn1PublicKey);
22
+ return address_1.Address.fromPublicKey(publicKey);
23
+ }
24
+ async getPublicKey() {
25
+ const command = new client_kms_1.GetPublicKeyCommand({ KeyId: this.keyId });
26
+ const response = await this.client.send(command);
27
+ if (!response.PublicKey) {
28
+ throw new TypeError("PublicKey is undefined");
29
+ }
30
+ return Buffer.from(response.PublicKey);
31
+ }
32
+ async _sign(digest) {
33
+ const command = new client_kms_1.SignCommand({
34
+ KeyId: this.keyId,
35
+ Message: digest,
36
+ MessageType: "DIGEST",
37
+ SigningAlgorithm: "ECDSA_SHA_256",
38
+ });
39
+ const response = await this.client.send(command);
40
+ if (!response.Signature) {
41
+ throw new TypeError("Signature is undefined");
42
+ }
43
+ return Buffer.from(response.Signature);
44
+ }
45
+ }
46
+ exports.KmsSigner = KmsSigner;
@@ -0,0 +1,16 @@
1
+ import BN from "bn.js";
2
+ import { Address } from "./address";
3
+ export declare const secp256k1N: BN;
4
+ export declare const secp256k1halfN: BN;
5
+ export declare class Signature {
6
+ private readonly buffer;
7
+ constructor(buffer: Buffer);
8
+ static fromRSV(r: Buffer, s: Buffer, v: number): Signature;
9
+ static fromDigest(digest: Buffer, address: Address, r: Buffer, s: Buffer): Signature;
10
+ get r(): Buffer;
11
+ get s(): Buffer;
12
+ get v(): number;
13
+ get recovery(): number;
14
+ isCompatibleEip2(): boolean;
15
+ toString(): string;
16
+ }
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.Signature = exports.secp256k1halfN = exports.secp256k1N = void 0;
7
+ const bn_js_1 = __importDefault(require("bn.js"));
8
+ const crypto_1 = require("./crypto");
9
+ const address_1 = require("./address");
10
+ exports.secp256k1N = new bn_js_1.default("fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141", 16);
11
+ exports.secp256k1halfN = exports.secp256k1N.div(new bn_js_1.default(2));
12
+ class Signature {
13
+ constructor(buffer) {
14
+ if (buffer.length !== 65) {
15
+ throw TypeError(`Signature: invalid signature. buffer length must be 65. actual: ${buffer.length}`);
16
+ }
17
+ this.buffer = buffer;
18
+ if (![27, 28].includes(this.recovery)) {
19
+ throw Error(`Signature: invalid signature. V must be 27 or 28. actual: ${this.recovery}`);
20
+ }
21
+ if (!this.isCompatibleEip2()) {
22
+ const s = new bn_js_1.default(this.s);
23
+ const recovery = Buffer.alloc(1);
24
+ recovery.writeUInt8((this.v % 2) + 27, 0);
25
+ const reverseS = exports.secp256k1N.sub(s).toArrayLike(Buffer, "be", 32);
26
+ this.buffer = Buffer.concat([this.r, reverseS, recovery]);
27
+ }
28
+ }
29
+ static fromRSV(r, s, v) {
30
+ const recovery = Buffer.alloc(1);
31
+ recovery.writeUInt8(v, 0);
32
+ return new Signature(Buffer.concat([r, s, recovery]));
33
+ }
34
+ static fromDigest(digest, address, r, s) {
35
+ const candidate = [...new Array(2).keys()].filter((v) => {
36
+ const publicKey = (0, crypto_1.recover)(digest, r, s, v);
37
+ return address.equals(address_1.Address.fromPublicKey(publicKey));
38
+ });
39
+ if (candidate.length === 1) {
40
+ const v = candidate[0] + 27;
41
+ return Signature.fromRSV(r, s, v);
42
+ }
43
+ throw new Error(`Signature: failed to solve V.`);
44
+ }
45
+ get r() {
46
+ return this.buffer.slice(0, 32);
47
+ }
48
+ get s() {
49
+ return this.buffer.slice(32, 64);
50
+ }
51
+ get v() {
52
+ return this.buffer.readUInt8(64);
53
+ }
54
+ get recovery() {
55
+ return this.v;
56
+ }
57
+ isCompatibleEip2() {
58
+ const s = new bn_js_1.default(this.s);
59
+ return exports.secp256k1halfN.cmp(s) > 0;
60
+ }
61
+ toString() {
62
+ return this.buffer.toString("hex");
63
+ }
64
+ }
65
+ exports.Signature = Signature;
@@ -0,0 +1,6 @@
1
+ import { Address } from "./address";
2
+ import { Signature } from "./signature";
3
+ export interface Signer {
4
+ sign(digest: Buffer): Promise<Signature>;
5
+ getAddress(): Promise<Address>;
6
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,39 @@
1
+ import { type Provider, type TransactionRequest, type TransactionResponse } from "@ethersproject/abstract-provider";
2
+ import { type Deferrable } from "@ethersproject/properties";
3
+ import { SocketRelaySigner } from "../relaySigner";
4
+ import { Contract, ethers, type Wallet } from "ethers";
5
+ export declare const EIP712_SAFE_TX_TYPE: {
6
+ SafeTx: {
7
+ type: string;
8
+ name: string;
9
+ }[];
10
+ };
11
+ export declare class SocketSigner extends SocketRelaySigner {
12
+ readonly provider: Provider;
13
+ readonly chainId: number;
14
+ readonly safeAddress: string;
15
+ readonly safeWrapperAddress: string;
16
+ readonly relayUrl: string;
17
+ readonly relayerAPIKey: string;
18
+ readonly signingWallet?: Wallet | undefined;
19
+ readonly useSafe: boolean;
20
+ readonly useEOA: boolean;
21
+ readonly sequential: boolean;
22
+ readonly isCritical: boolean;
23
+ readonly metadata: object;
24
+ readonly safeWrapperContract: Contract;
25
+ readonly safeContract: Contract;
26
+ readonly address: string;
27
+ constructor(provider: Provider, chainId: number, safeAddress: string, safeWrapperAddress: string, relayUrl: string, relayerAPIKey: string, signingWallet?: Wallet | undefined, useSafe?: boolean, useEOA?: boolean, sequential?: boolean, isCritical?: boolean, metadata?: object);
28
+ setSigningWallet(signingWallet: Wallet): SocketRelaySigner;
29
+ setSafeWrapperAddress(safeWrapperAddress: string): SocketRelaySigner;
30
+ setSafeAddress(safeAddress: string): SocketRelaySigner;
31
+ getAddress(): Promise<string>;
32
+ sendTransaction(transaction: Deferrable<TransactionRequest>): Promise<TransactionResponse>;
33
+ signMessage(message: ethers.utils.Bytes | string): Promise<string>;
34
+ isTxHashSubmitted(transaction: Deferrable<TransactionRequest>): Promise<boolean>;
35
+ checkAndSendTransaction(transaction: Deferrable<TransactionRequest>): Promise<{
36
+ txSent: boolean;
37
+ txHash: string;
38
+ }>;
39
+ }
@@ -0,0 +1,153 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.SocketSigner = exports.EIP712_SAFE_TX_TYPE = void 0;
7
+ const relaySigner_1 = require("../relaySigner");
8
+ const ethers_1 = require("ethers");
9
+ const MultiSigWrapper_json_1 = __importDefault(require("@socket.tech/dl-core/artifacts/abi/MultiSigWrapper.json"));
10
+ const Safe_json_1 = __importDefault(require("@socket.tech/dl-core/artifacts/abi/Safe.json"));
11
+ const utils_1 = require("ethers/lib/utils");
12
+ exports.EIP712_SAFE_TX_TYPE = {
13
+ // "SafeTx(address to,uint256 value,bytes data,uint8 operation,uint256 safeTxGas,uint256 baseGas,uint256 gasPrice,address gasToken,address refundReceiver,uint256 nonce)"
14
+ SafeTx: [
15
+ { type: "address", name: "to" },
16
+ { type: "uint256", name: "value" },
17
+ { type: "bytes", name: "data" },
18
+ { type: "uint8", name: "operation" },
19
+ { type: "uint256", name: "safeTxGas" },
20
+ { type: "uint256", name: "baseGas" },
21
+ { type: "uint256", name: "gasPrice" },
22
+ { type: "address", name: "gasToken" },
23
+ { type: "address", name: "refundReceiver" },
24
+ { type: "uint256", name: "nonce" },
25
+ ],
26
+ };
27
+ class SocketSigner extends relaySigner_1.SocketRelaySigner {
28
+ constructor(provider, chainId,
29
+ // address of safe
30
+ safeAddress,
31
+ // address of safe wrapper to store sign
32
+ safeWrapperAddress, relayUrl, relayerAPIKey,
33
+ // wallet for signing safe hash data
34
+ signingWallet,
35
+ // if you want to relay tx to wrapper
36
+ useSafe = false,
37
+ // if you want to relay tx using EOA, otherwise it will use relayer
38
+ useEOA = false, sequential = false,
39
+ // if isCritical is set to true, will try multiple relayers
40
+ // to get the transaction included
41
+ isCritical = false, metadata = {}) {
42
+ super(provider, chainId, relayUrl, relayerAPIKey, sequential, isCritical, metadata);
43
+ this.provider = provider;
44
+ this.chainId = chainId;
45
+ this.safeAddress = safeAddress;
46
+ this.safeWrapperAddress = safeWrapperAddress;
47
+ this.relayUrl = relayUrl;
48
+ this.relayerAPIKey = relayerAPIKey;
49
+ this.signingWallet = signingWallet;
50
+ this.useSafe = useSafe;
51
+ this.useEOA = useEOA;
52
+ this.sequential = sequential;
53
+ this.isCritical = isCritical;
54
+ this.metadata = metadata;
55
+ this.address =
56
+ this.signingWallet != null
57
+ ? this.signingWallet.address
58
+ : "0x5367Efc17020Aa1CF0943bA7eD17f1D3e4c7d7EE";
59
+ if (this.safeWrapperAddress.length !== 0 ||
60
+ this.safeWrapperAddress !== ethers_1.constants.AddressZero)
61
+ this.safeWrapperContract = new ethers_1.Contract(this.safeWrapperAddress, MultiSigWrapper_json_1.default, this.provider);
62
+ if (this.safeAddress.length !== 0 ||
63
+ this.safeAddress !== ethers_1.constants.AddressZero)
64
+ this.safeContract = new ethers_1.Contract(this.safeAddress, Safe_json_1.default, this.provider);
65
+ }
66
+ setSigningWallet(signingWallet) {
67
+ return new SocketSigner(this.provider, this.chainId, this.safeAddress, this.safeWrapperAddress, this.relayUrl, this.relayerAPIKey, signingWallet, this.useSafe, this.useEOA, this.sequential, this.isCritical, this.metadata);
68
+ }
69
+ setSafeWrapperAddress(safeWrapperAddress) {
70
+ return new SocketSigner(this.provider, this.chainId, this.safeAddress, safeWrapperAddress, this.relayUrl, this.relayerAPIKey, this.signingWallet, this.useSafe, this.useEOA, this.sequential, this.isCritical, this.metadata);
71
+ }
72
+ setSafeAddress(safeAddress) {
73
+ return new SocketSigner(this.provider, this.chainId, safeAddress, this.safeWrapperAddress, this.relayUrl, this.relayerAPIKey, this.signingWallet, this.useSafe, this.useEOA, this.sequential, this.isCritical, this.metadata);
74
+ }
75
+ async getAddress() {
76
+ if (this.signingWallet != null)
77
+ return this.signingWallet.address;
78
+ return await super.getAddress();
79
+ }
80
+ async sendTransaction(transaction) {
81
+ var _a, _b;
82
+ if (this.useSafe) {
83
+ if (this.safeAddress.length === 0 ||
84
+ this.safeAddress === ethers_1.constants.AddressZero)
85
+ throw new Error("safeAddress not provided");
86
+ if (this.safeWrapperContract == null)
87
+ throw new Error("safe wrapper not provided");
88
+ if (this.signingWallet == null)
89
+ throw new Error("signingWallet not provided");
90
+ const signerAddress = await this.getAddress();
91
+ const safeNonce = Number(await this.safeContract.nonce());
92
+ let nonce = Number(await this.safeWrapperContract.lastNonce(signerAddress));
93
+ if (safeNonce != 0) {
94
+ nonce = safeNonce > nonce ? safeNonce : nonce + 1;
95
+ }
96
+ else if (nonce !== 0)
97
+ nonce++;
98
+ if (await this.isTxHashSubmitted(transaction))
99
+ throw new Error("tx already submitted!");
100
+ const contractData = {
101
+ to: transaction.to,
102
+ value: (_a = transaction.value) !== null && _a !== void 0 ? _a : 0,
103
+ data: (_b = transaction.data) !== null && _b !== void 0 ? _b : "0x",
104
+ operation: 0,
105
+ safeTxGas: 0,
106
+ baseGas: 0,
107
+ gasPrice: 0,
108
+ gasToken: ethers_1.constants.AddressZero,
109
+ refundReceiver: ethers_1.constants.AddressZero,
110
+ nonce,
111
+ };
112
+ const signature = await this.signingWallet._signTypedData({ verifyingContract: this.safeAddress, chainId: this.chainId }, exports.EIP712_SAFE_TX_TYPE, contractData);
113
+ // update to & data
114
+ transaction.data = this.safeWrapperContract.interface.encodeFunctionData("storeOrRelaySignatures", [
115
+ this.signingWallet.address,
116
+ contractData.to,
117
+ nonce,
118
+ contractData.value,
119
+ contractData.data,
120
+ signature,
121
+ ]);
122
+ transaction.to = this.safeWrapperAddress;
123
+ }
124
+ if (this.useEOA) {
125
+ if (this.signingWallet == null)
126
+ throw new Error("signingWallet not provided");
127
+ return await this.signingWallet.sendTransaction(transaction);
128
+ }
129
+ return await super.sendTransaction(transaction);
130
+ }
131
+ async signMessage(message) {
132
+ if (!this.signingWallet)
133
+ throw Error("No Signing Wallet found!");
134
+ return await this.signingWallet.signMessage(message);
135
+ }
136
+ async isTxHashSubmitted(transaction) {
137
+ var _a, _b;
138
+ if (!this.signingWallet)
139
+ throw Error("No Signing Wallet found!");
140
+ const dataHash = (0, utils_1.keccak256)(utils_1.defaultAbiCoder.encode(["address", "uint256", "bytes"], [transaction.to, (_a = transaction.value) !== null && _a !== void 0 ? _a : 0, (_b = transaction.data) !== null && _b !== void 0 ? _b : "0x"]));
141
+ const safeParams = await this.safeWrapperContract.safeParams(dataHash, this.signingWallet.address);
142
+ return safeParams[1] !== "0x";
143
+ }
144
+ async checkAndSendTransaction(transaction) {
145
+ const isSubmitted = await this.isTxHashSubmitted(transaction);
146
+ if (isSubmitted)
147
+ return { txSent: false, txHash: "" };
148
+ const tx = await this.sendTransaction(transaction);
149
+ await tx.wait();
150
+ return { txSent: true, txHash: tx.hash };
151
+ }
152
+ }
153
+ exports.SocketSigner = SocketSigner;
@@ -0,0 +1,2 @@
1
+ export declare const currentTimestampInSeconds: () => number;
2
+ export declare const sleep: (ms: number) => Promise<unknown>;
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.sleep = exports.currentTimestampInSeconds = void 0;
4
+ const currentTimestampInSeconds = () => Math.floor(new Date().getTime() / 1000);
5
+ exports.currentTimestampInSeconds = currentTimestampInSeconds;
6
+ const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
7
+ exports.sleep = sleep;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@socket.tech/dl-common",
3
- "version": "1.0.16",
3
+ "version": "1.0.17",
4
4
  "main": "./dist/dl-common/index.js",
5
5
  "types": "./dist/dl-common/index.d.ts",
6
6
  "description": "common utilities for socket data layer.",
@@ -113,9 +113,9 @@
113
113
  "serverless-plugin-aws-alerts": "^1.7.5",
114
114
  "ts-jest": "^29.1.1",
115
115
  "ts-node": "^10.7.0",
116
- "typescript": "*",
117
- "typescript-eslint": "^7.6.0",
118
116
  "tsc-alias": "^1.8.10",
119
- "tsconfig-paths": "^4.2.0"
117
+ "tsconfig-paths": "^4.2.0",
118
+ "typescript": "*",
119
+ "typescript-eslint": "^7.6.0"
120
120
  }
121
121
  }