@zama-fhe/sdk 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +28 -0
- package/README.md +649 -0
- package/dist/chunk-AJFSZ47V.js +5115 -0
- package/dist/chunk-AJFSZ47V.js.map +1 -0
- package/dist/chunk-UE6IBC3M.js +101 -0
- package/dist/chunk-UE6IBC3M.js.map +1 -0
- package/dist/chunk-VRLLWHHL.js +278 -0
- package/dist/chunk-VRLLWHHL.js.map +1 -0
- package/dist/ethers/index.d.ts +37 -0
- package/dist/ethers/index.js +131 -0
- package/dist/ethers/index.js.map +1 -0
- package/dist/index.d.ts +32910 -0
- package/dist/index.js +2862 -0
- package/dist/index.js.map +1 -0
- package/dist/node/index.d.ts +158 -0
- package/dist/node/index.js +317 -0
- package/dist/node/index.js.map +1 -0
- package/dist/relayer-sdk.node-worker.d.ts +2 -0
- package/dist/relayer-sdk.node-worker.js +320 -0
- package/dist/relayer-sdk.node-worker.js.map +1 -0
- package/dist/relayer-sdk.types-CFkzNzRy.d.ts +293 -0
- package/dist/relayer-sdk.worker.d.ts +2 -0
- package/dist/relayer-sdk.worker.js +401 -0
- package/dist/relayer-sdk.worker.js.map +1 -0
- package/dist/relayer-utils-D_3834H0.d.ts +46 -0
- package/dist/token.types-CRs1iJh7.d.ts +447 -0
- package/dist/viem/index.d.ts +38 -0
- package/dist/viem/index.js +137 -0
- package/dist/viem/index.js.map +1 -0
- package/package.json +88 -0
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
// src/relayer/relayer-utils.ts
|
|
2
|
+
var MAX_RETRIES = 2;
|
|
3
|
+
var RETRY_BASE_MS = 500;
|
|
4
|
+
async function withRetry(fn, retries = MAX_RETRIES) {
|
|
5
|
+
let lastError;
|
|
6
|
+
for (let attempt = 0; attempt <= retries; attempt++) {
|
|
7
|
+
try {
|
|
8
|
+
return await fn();
|
|
9
|
+
} catch (error) {
|
|
10
|
+
lastError = error;
|
|
11
|
+
if (attempt < retries && isTransientError(error)) {
|
|
12
|
+
await sleep(RETRY_BASE_MS * 2 ** attempt);
|
|
13
|
+
continue;
|
|
14
|
+
}
|
|
15
|
+
throw error;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
throw lastError;
|
|
19
|
+
}
|
|
20
|
+
function isTransientError(error) {
|
|
21
|
+
if (!(error instanceof Error)) return false;
|
|
22
|
+
const msg = error.message.toLowerCase();
|
|
23
|
+
return msg.includes("timed out") || msg.includes("timeout") || msg.includes("econnreset") || msg.includes("econnrefused") || msg.includes("network") || msg.includes("fetch failed") || msg.includes("socket hang up") || msg.includes("502") || msg.includes("503") || msg.includes("504");
|
|
24
|
+
}
|
|
25
|
+
function sleep(ms) {
|
|
26
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
27
|
+
}
|
|
28
|
+
function convertToBigIntRecord(result) {
|
|
29
|
+
const clearValues = {};
|
|
30
|
+
for (const [handle, value] of Object.entries(result)) {
|
|
31
|
+
if (typeof value === "bigint") {
|
|
32
|
+
clearValues[handle] = value;
|
|
33
|
+
} else if (typeof value === "boolean") {
|
|
34
|
+
clearValues[handle] = value ? BigInt(1) : BigInt(0);
|
|
35
|
+
} else if (typeof value === "string" || typeof value === "number") {
|
|
36
|
+
clearValues[handle] = BigInt(value);
|
|
37
|
+
} else {
|
|
38
|
+
throw new TypeError(`Unexpected decrypted value type for handle ${handle}: ${typeof value}`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return clearValues;
|
|
42
|
+
}
|
|
43
|
+
var MainnetConfig = {
|
|
44
|
+
chainId: 1,
|
|
45
|
+
gatewayChainId: 261131,
|
|
46
|
+
relayerUrl: "https://relayer.mainnet.zama.org",
|
|
47
|
+
network: "https://ethereum-rpc.publicnode.com",
|
|
48
|
+
aclContractAddress: "0xcA2E8f1F656CD25C01F05d0b243Ab1ecd4a8ffb6",
|
|
49
|
+
kmsContractAddress: "0x77627828a55156b04Ac0DC0eb30467f1a552BB03",
|
|
50
|
+
inputVerifierContractAddress: "0xCe0FC2e05CFff1B719EFF7169f7D80Af770c8EA2",
|
|
51
|
+
verifyingContractAddressDecryption: "0x0f6024a97684f7d90ddb0fAAD79cB15F2C888D24",
|
|
52
|
+
verifyingContractAddressInputVerification: "0xcB1bB072f38bdAF0F328CdEf1Fc6eDa1DF029287"
|
|
53
|
+
};
|
|
54
|
+
var SepoliaConfig = {
|
|
55
|
+
chainId: 11155111,
|
|
56
|
+
gatewayChainId: 10901,
|
|
57
|
+
relayerUrl: "https://relayer.testnet.zama.org",
|
|
58
|
+
network: "https://ethereum-sepolia-rpc.publicnode.com",
|
|
59
|
+
aclContractAddress: "0xf0Ffdc93b7E186bC2f8CB3dAA75D86d1930A433D",
|
|
60
|
+
kmsContractAddress: "0xbE0E383937d564D7FF0BC3b46c51f0bF8d5C311A",
|
|
61
|
+
inputVerifierContractAddress: "0xBBC1fFCdc7C316aAAd72E807D9b0272BE8F84DA0",
|
|
62
|
+
verifyingContractAddressDecryption: "0x5D8BD78e2ea6bbE41f26dFe9fdaEAa349e077478",
|
|
63
|
+
verifyingContractAddressInputVerification: "0x483b9dE06E4E4C7D35CCf5837A1668487406D955"
|
|
64
|
+
};
|
|
65
|
+
var HardhatConfig = {
|
|
66
|
+
chainId: 31337,
|
|
67
|
+
gatewayChainId: 10901,
|
|
68
|
+
relayerUrl: "",
|
|
69
|
+
network: "http://127.0.0.1:8545",
|
|
70
|
+
aclContractAddress: "0x50157CFfD6bBFA2DECe204a89ec419c23ef5755D",
|
|
71
|
+
inputVerifierContractAddress: "0x36772142b74871f255CbD7A3e89B401d3e45825f",
|
|
72
|
+
kmsContractAddress: "0xbE0E383937d564D7FF0BC3b46c51f0bF8d5C311A",
|
|
73
|
+
verifyingContractAddressDecryption: "0x5ffdaAB0373E62E2ea2944776209aEf29E631A64",
|
|
74
|
+
verifyingContractAddressInputVerification: "0x812b06e1CDCE800494b79fFE4f925A504a9A9810"
|
|
75
|
+
};
|
|
76
|
+
var DefaultConfigs = {
|
|
77
|
+
[1]: MainnetConfig,
|
|
78
|
+
[11155111]: SepoliaConfig,
|
|
79
|
+
[31337]: HardhatConfig
|
|
80
|
+
};
|
|
81
|
+
var DOMAIN_FIELD_TYPES = {
|
|
82
|
+
name: "string",
|
|
83
|
+
version: "string",
|
|
84
|
+
chainId: "uint256",
|
|
85
|
+
verifyingContract: "address",
|
|
86
|
+
salt: "bytes32"
|
|
87
|
+
};
|
|
88
|
+
function buildEIP712DomainType(domain) {
|
|
89
|
+
return Object.keys(DOMAIN_FIELD_TYPES).filter((k) => k in domain).map((k) => ({ name: k, type: DOMAIN_FIELD_TYPES[k] }));
|
|
90
|
+
}
|
|
91
|
+
function mergeFhevmConfig(chainId, overrides) {
|
|
92
|
+
const base = DefaultConfigs[chainId];
|
|
93
|
+
if (!base && (!overrides || Object.keys(overrides).length === 0)) {
|
|
94
|
+
throw new Error(`No config for chainId: ${chainId}`);
|
|
95
|
+
}
|
|
96
|
+
return { ...base, ...overrides };
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
export { HardhatConfig, MainnetConfig, SepoliaConfig, buildEIP712DomainType, convertToBigIntRecord, mergeFhevmConfig, withRetry };
|
|
100
|
+
//# sourceMappingURL=chunk-UE6IBC3M.js.map
|
|
101
|
+
//# sourceMappingURL=chunk-UE6IBC3M.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/relayer/relayer-utils.ts"],"names":[],"mappings":"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","file":"chunk-UE6IBC3M.js","sourcesContent":["import type { EIP712TypedData, FhevmInstanceConfig } from \"./relayer-sdk.types\";\n\nconst MAX_RETRIES = 2;\nconst RETRY_BASE_MS = 500;\n\n/**\n * Retry an async operation with exponential backoff.\n * Only retries on transient errors (timeout, network). Does not retry user-facing errors.\n */\nexport async function withRetry<T>(fn: () => Promise<T>, retries = MAX_RETRIES): Promise<T> {\n let lastError: unknown;\n for (let attempt = 0; attempt <= retries; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error;\n if (attempt < retries && isTransientError(error)) {\n await sleep(RETRY_BASE_MS * 2 ** attempt);\n continue;\n }\n throw error;\n }\n }\n throw lastError;\n}\n\nfunction isTransientError(error: unknown): boolean {\n if (!(error instanceof Error)) return false;\n const msg = error.message.toLowerCase();\n return (\n msg.includes(\"timed out\") ||\n msg.includes(\"timeout\") ||\n msg.includes(\"econnreset\") ||\n msg.includes(\"econnrefused\") ||\n msg.includes(\"network\") ||\n msg.includes(\"fetch failed\") ||\n msg.includes(\"socket hang up\") ||\n msg.includes(\"502\") ||\n msg.includes(\"503\") ||\n msg.includes(\"504\")\n );\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Convert SDK result values to bigint record.\n * Handles bigint, boolean, string, and number values.\n */\nexport function convertToBigIntRecord(result: Record<string, unknown>): Record<string, bigint> {\n const clearValues: Record<string, bigint> = {};\n for (const [handle, value] of Object.entries(result)) {\n if (typeof value === \"bigint\") {\n clearValues[handle] = value;\n } else if (typeof value === \"boolean\") {\n clearValues[handle] = value ? BigInt(1) : BigInt(0);\n } else if (typeof value === \"string\" || typeof value === \"number\") {\n clearValues[handle] = BigInt(value);\n } else {\n throw new TypeError(`Unexpected decrypted value type for handle ${handle}: ${typeof value}`);\n }\n }\n return clearValues;\n}\n\n/** Mainnet network configuration (chainId 1). */\nexport const MainnetConfig: FhevmInstanceConfig = {\n chainId: 1,\n gatewayChainId: 261131,\n relayerUrl: \"https://relayer.mainnet.zama.org\",\n network: \"https://ethereum-rpc.publicnode.com\",\n aclContractAddress: \"0xcA2E8f1F656CD25C01F05d0b243Ab1ecd4a8ffb6\",\n kmsContractAddress: \"0x77627828a55156b04Ac0DC0eb30467f1a552BB03\",\n inputVerifierContractAddress: \"0xCe0FC2e05CFff1B719EFF7169f7D80Af770c8EA2\",\n verifyingContractAddressDecryption: \"0x0f6024a97684f7d90ddb0fAAD79cB15F2C888D24\",\n verifyingContractAddressInputVerification: \"0xcB1bB072f38bdAF0F328CdEf1Fc6eDa1DF029287\",\n} as const;\n\n/** Sepolia testnet network configuration (chainId 11155111). */\nexport const SepoliaConfig: FhevmInstanceConfig = {\n chainId: 11155111,\n gatewayChainId: 10901,\n relayerUrl: \"https://relayer.testnet.zama.org\",\n network: \"https://ethereum-sepolia-rpc.publicnode.com\",\n aclContractAddress: \"0xf0Ffdc93b7E186bC2f8CB3dAA75D86d1930A433D\",\n kmsContractAddress: \"0xbE0E383937d564D7FF0BC3b46c51f0bF8d5C311A\",\n inputVerifierContractAddress: \"0xBBC1fFCdc7C316aAAd72E807D9b0272BE8F84DA0\",\n verifyingContractAddressDecryption: \"0x5D8BD78e2ea6bbE41f26dFe9fdaEAa349e077478\",\n verifyingContractAddressInputVerification: \"0x483b9dE06E4E4C7D35CCf5837A1668487406D955\",\n} as const;\n\n/** Hardhat local network configuration (chainId 31337). */\nexport const HardhatConfig: FhevmInstanceConfig = {\n chainId: 31337,\n gatewayChainId: 10901,\n relayerUrl: \"\",\n network: \"http://127.0.0.1:8545\",\n aclContractAddress: \"0x50157CFfD6bBFA2DECe204a89ec419c23ef5755D\",\n inputVerifierContractAddress: \"0x36772142b74871f255CbD7A3e89B401d3e45825f\",\n kmsContractAddress: \"0xbE0E383937d564D7FF0BC3b46c51f0bF8d5C311A\",\n verifyingContractAddressDecryption: \"0x5ffdaAB0373E62E2ea2944776209aEf29E631A64\",\n verifyingContractAddressInputVerification: \"0x812b06e1CDCE800494b79fFE4f925A504a9A9810\",\n} as const;\n\nexport const DefaultConfigs: Record<number, FhevmInstanceConfig> = {\n [1]: MainnetConfig,\n [11155111]: SepoliaConfig,\n [31337]: HardhatConfig,\n} as const;\n\n/** EIP-712 domain field → Solidity type. Order follows the EIP-712 spec. */\nconst DOMAIN_FIELD_TYPES: Record<string, string> = {\n name: \"string\",\n version: \"string\",\n chainId: \"uint256\",\n verifyingContract: \"address\",\n salt: \"bytes32\",\n};\n\n/**\n * Build `EIP712Domain` type entries from the keys present in a domain object.\n * Order matches the EIP-712 spec (name → version → chainId → verifyingContract → salt).\n */\nexport function buildEIP712DomainType(\n domain: EIP712TypedData[\"domain\"],\n): Array<{ name: string; type: string }> {\n return Object.keys(DOMAIN_FIELD_TYPES)\n .filter((k) => k in domain)\n .map((k) => ({ name: k, type: DOMAIN_FIELD_TYPES[k]! }));\n}\n\n/**\n * Merge user overrides on top of SDK defaults for a given chain.\n */\nexport function mergeFhevmConfig(\n chainId: number,\n overrides?: Partial<FhevmInstanceConfig>,\n): FhevmInstanceConfig {\n const base = DefaultConfigs[chainId];\n if (!base && (!overrides || Object.keys(overrides).length === 0)) {\n throw new Error(`No config for chainId: ${chainId}`);\n }\n return { ...base, ...overrides } as FhevmInstanceConfig;\n}\n"]}
|
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
// src/token/errors.ts
|
|
2
|
+
var TokenErrorCode = {
|
|
3
|
+
/** User rejected the wallet signature prompt. */
|
|
4
|
+
SigningRejected: "SIGNING_REJECTED",
|
|
5
|
+
/** Wallet signature failed for a reason other than rejection. */
|
|
6
|
+
SigningFailed: "SIGNING_FAILED",
|
|
7
|
+
/** FHE encryption failed. */
|
|
8
|
+
EncryptionFailed: "ENCRYPTION_FAILED",
|
|
9
|
+
/** FHE decryption failed. */
|
|
10
|
+
DecryptionFailed: "DECRYPTION_FAILED",
|
|
11
|
+
/** ERC-20 approval transaction failed. */
|
|
12
|
+
ApprovalFailed: "APPROVAL_FAILED",
|
|
13
|
+
/** On-chain transaction reverted. */
|
|
14
|
+
TransactionReverted: "TRANSACTION_REVERTED",
|
|
15
|
+
/** FHE credentials have expired and need regeneration. */
|
|
16
|
+
CredentialExpired: "CREDENTIAL_EXPIRED",
|
|
17
|
+
/** Relayer rejected credentials (stale, expired, or malformed). */
|
|
18
|
+
InvalidCredentials: "INVALID_CREDENTIALS",
|
|
19
|
+
/** No FHE ciphertext exists for this account (never shielded). */
|
|
20
|
+
NoCiphertext: "NO_CIPHERTEXT",
|
|
21
|
+
/** Relayer HTTP request failed. */
|
|
22
|
+
RelayerRequestFailed: "RELAYER_REQUEST_FAILED"
|
|
23
|
+
};
|
|
24
|
+
var TokenError = class extends Error {
|
|
25
|
+
/** Machine-readable error code. */
|
|
26
|
+
code;
|
|
27
|
+
constructor(code, message, options) {
|
|
28
|
+
super(message, options);
|
|
29
|
+
this.name = "TokenError";
|
|
30
|
+
this.code = code;
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
var SigningRejectedError = class extends TokenError {
|
|
34
|
+
constructor(message, options) {
|
|
35
|
+
super(TokenErrorCode.SigningRejected, message, options);
|
|
36
|
+
this.name = "SigningRejectedError";
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
var SigningFailedError = class extends TokenError {
|
|
40
|
+
constructor(message, options) {
|
|
41
|
+
super(TokenErrorCode.SigningFailed, message, options);
|
|
42
|
+
this.name = "SigningFailedError";
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
var EncryptionFailedError = class extends TokenError {
|
|
46
|
+
constructor(message, options) {
|
|
47
|
+
super(TokenErrorCode.EncryptionFailed, message, options);
|
|
48
|
+
this.name = "EncryptionFailedError";
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
var DecryptionFailedError = class extends TokenError {
|
|
52
|
+
constructor(message, options) {
|
|
53
|
+
super(TokenErrorCode.DecryptionFailed, message, options);
|
|
54
|
+
this.name = "DecryptionFailedError";
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
var ApprovalFailedError = class extends TokenError {
|
|
58
|
+
constructor(message, options) {
|
|
59
|
+
super(TokenErrorCode.ApprovalFailed, message, options);
|
|
60
|
+
this.name = "ApprovalFailedError";
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
var TransactionRevertedError = class extends TokenError {
|
|
64
|
+
constructor(message, options) {
|
|
65
|
+
super(TokenErrorCode.TransactionReverted, message, options);
|
|
66
|
+
this.name = "TransactionRevertedError";
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
var CredentialExpiredError = class extends TokenError {
|
|
70
|
+
constructor(message, options) {
|
|
71
|
+
super(TokenErrorCode.CredentialExpired, message, options);
|
|
72
|
+
this.name = "CredentialExpiredError";
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
var InvalidCredentialsError = class extends TokenError {
|
|
76
|
+
constructor(message, options) {
|
|
77
|
+
super(TokenErrorCode.InvalidCredentials, message, options);
|
|
78
|
+
this.name = "InvalidCredentialsError";
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
var NoCiphertextError = class extends TokenError {
|
|
82
|
+
constructor(message, options) {
|
|
83
|
+
super(TokenErrorCode.NoCiphertext, message, options);
|
|
84
|
+
this.name = "NoCiphertextError";
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
var RelayerRequestFailedError = class extends TokenError {
|
|
88
|
+
/** HTTP status code from the relayer, if available. */
|
|
89
|
+
statusCode;
|
|
90
|
+
constructor(message, statusCode, options) {
|
|
91
|
+
super(TokenErrorCode.RelayerRequestFailed, message, options);
|
|
92
|
+
this.name = "RelayerRequestFailedError";
|
|
93
|
+
this.statusCode = statusCode;
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
// src/worker/worker.base-client.ts
|
|
98
|
+
var DEFAULT_TIMEOUT_MS = 3e4;
|
|
99
|
+
var INIT_TIMEOUT_MS = 6e4;
|
|
100
|
+
var BaseWorkerClient = class {
|
|
101
|
+
#worker = null;
|
|
102
|
+
#pendingRequests = /* @__PURE__ */ new Map();
|
|
103
|
+
#initPromise = null;
|
|
104
|
+
config;
|
|
105
|
+
logger;
|
|
106
|
+
constructor(config, logger) {
|
|
107
|
+
this.config = config;
|
|
108
|
+
this.logger = logger;
|
|
109
|
+
}
|
|
110
|
+
// ===========================================================================
|
|
111
|
+
// Shared init / terminate
|
|
112
|
+
// ===========================================================================
|
|
113
|
+
async initWorker() {
|
|
114
|
+
if (this.#worker) return this.#worker;
|
|
115
|
+
if (!this.#initPromise) {
|
|
116
|
+
this.#initPromise = this.#doInitWorker().catch((err) => {
|
|
117
|
+
this.#initPromise = null;
|
|
118
|
+
throw err;
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
return this.#initPromise;
|
|
122
|
+
}
|
|
123
|
+
async #doInitWorker() {
|
|
124
|
+
const worker = this.createWorker();
|
|
125
|
+
this.wireEvents(worker);
|
|
126
|
+
try {
|
|
127
|
+
const { type, payload } = this.getInitPayload();
|
|
128
|
+
await this.sendRequestTo(worker, type, payload, INIT_TIMEOUT_MS);
|
|
129
|
+
this.onWorkerReady?.(worker);
|
|
130
|
+
this.#worker = worker;
|
|
131
|
+
} catch (err) {
|
|
132
|
+
this.terminateWorker(worker);
|
|
133
|
+
throw err;
|
|
134
|
+
}
|
|
135
|
+
return this.#worker;
|
|
136
|
+
}
|
|
137
|
+
terminate() {
|
|
138
|
+
if (this.#worker) {
|
|
139
|
+
for (const [id, pending] of this.#pendingRequests) {
|
|
140
|
+
clearTimeout(pending.timeoutId);
|
|
141
|
+
pending.reject(new Error("Worker terminated"));
|
|
142
|
+
this.#pendingRequests.delete(id);
|
|
143
|
+
}
|
|
144
|
+
this.terminateWorker(this.#worker);
|
|
145
|
+
this.#worker = null;
|
|
146
|
+
}
|
|
147
|
+
this.#initPromise = null;
|
|
148
|
+
}
|
|
149
|
+
// ===========================================================================
|
|
150
|
+
// Message handling (called by subclass event wiring)
|
|
151
|
+
// ===========================================================================
|
|
152
|
+
handleResponse(response) {
|
|
153
|
+
const pending = this.#pendingRequests.get(response.id);
|
|
154
|
+
if (!pending) {
|
|
155
|
+
this.logger?.warn("[WorkerClient] Received response for unknown request", {
|
|
156
|
+
id: response.id
|
|
157
|
+
});
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
const elapsed = Math.round(performance.now() - pending.startTime);
|
|
161
|
+
clearTimeout(pending.timeoutId);
|
|
162
|
+
this.#pendingRequests.delete(response.id);
|
|
163
|
+
if (response.success) {
|
|
164
|
+
this.logger?.debug(`[WorkerClient] \u2190 ${pending.type} OK`, {
|
|
165
|
+
id: response.id,
|
|
166
|
+
elapsed
|
|
167
|
+
});
|
|
168
|
+
pending.resolve(response.data);
|
|
169
|
+
} else {
|
|
170
|
+
this.logger?.error(`[WorkerClient] \u2190 ${pending.type} FAILED`, {
|
|
171
|
+
id: response.id,
|
|
172
|
+
elapsed,
|
|
173
|
+
error: response.error
|
|
174
|
+
});
|
|
175
|
+
const err = new Error(response.error);
|
|
176
|
+
if ("statusCode" in response && typeof response.statusCode === "number") {
|
|
177
|
+
err.statusCode = response.statusCode;
|
|
178
|
+
}
|
|
179
|
+
pending.reject(err);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
handleWorkerError(message) {
|
|
183
|
+
this.logger?.error("[WorkerClient] Worker error", { error: message });
|
|
184
|
+
const worker = this.#worker;
|
|
185
|
+
this.#worker = null;
|
|
186
|
+
this.#rejectAllPending(`Worker error: ${message}`);
|
|
187
|
+
if (worker) this.terminateWorker(worker);
|
|
188
|
+
}
|
|
189
|
+
handleWorkerMessageError() {
|
|
190
|
+
this.logger?.error("[WorkerClient] Message deserialization failed");
|
|
191
|
+
const worker = this.#worker;
|
|
192
|
+
this.#worker = null;
|
|
193
|
+
this.#rejectAllPending("Worker message deserialization failed");
|
|
194
|
+
if (worker) this.terminateWorker(worker);
|
|
195
|
+
}
|
|
196
|
+
// ===========================================================================
|
|
197
|
+
// Request sending
|
|
198
|
+
// ===========================================================================
|
|
199
|
+
sendRequestTo(worker, type, payload, timeoutMs = DEFAULT_TIMEOUT_MS) {
|
|
200
|
+
return new Promise((resolve, reject) => {
|
|
201
|
+
const id = this.generateRequestId();
|
|
202
|
+
const startTime = performance.now();
|
|
203
|
+
this.logger?.debug(`[WorkerClient] \u2192 ${type}`, { id });
|
|
204
|
+
const timeoutId = setTimeout(() => {
|
|
205
|
+
this.#pendingRequests.delete(id);
|
|
206
|
+
const elapsed = Math.round(performance.now() - startTime);
|
|
207
|
+
this.logger?.error(`[WorkerClient] ${type} timed out after ${timeoutMs}ms`, {
|
|
208
|
+
id,
|
|
209
|
+
elapsed
|
|
210
|
+
});
|
|
211
|
+
reject(new Error(`Request ${type} timed out after ${timeoutMs}ms`));
|
|
212
|
+
}, timeoutMs);
|
|
213
|
+
this.#pendingRequests.set(id, {
|
|
214
|
+
resolve,
|
|
215
|
+
reject,
|
|
216
|
+
timeoutId,
|
|
217
|
+
startTime,
|
|
218
|
+
type
|
|
219
|
+
});
|
|
220
|
+
const request = { id, type, payload };
|
|
221
|
+
this.postMessage(worker, request);
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
async sendRequest(type, payload, timeoutMs = DEFAULT_TIMEOUT_MS) {
|
|
225
|
+
const worker = await this.initWorker();
|
|
226
|
+
return this.sendRequestTo(worker, type, payload, timeoutMs);
|
|
227
|
+
}
|
|
228
|
+
// ===========================================================================
|
|
229
|
+
// Domain methods
|
|
230
|
+
// ===========================================================================
|
|
231
|
+
async generateKeypair() {
|
|
232
|
+
return this.sendRequest("GENERATE_KEYPAIR", {});
|
|
233
|
+
}
|
|
234
|
+
async createEIP712(params) {
|
|
235
|
+
return this.sendRequest("CREATE_EIP712", params);
|
|
236
|
+
}
|
|
237
|
+
async encrypt(params) {
|
|
238
|
+
return this.sendRequest("ENCRYPT", params);
|
|
239
|
+
}
|
|
240
|
+
async userDecrypt(params) {
|
|
241
|
+
return this.sendRequest("USER_DECRYPT", params);
|
|
242
|
+
}
|
|
243
|
+
async publicDecrypt(handles) {
|
|
244
|
+
return this.sendRequest("PUBLIC_DECRYPT", { handles });
|
|
245
|
+
}
|
|
246
|
+
async createDelegatedUserDecryptEIP712(params) {
|
|
247
|
+
return this.sendRequest("CREATE_DELEGATED_EIP712", params);
|
|
248
|
+
}
|
|
249
|
+
async delegatedUserDecrypt(params) {
|
|
250
|
+
return this.sendRequest("DELEGATED_USER_DECRYPT", params);
|
|
251
|
+
}
|
|
252
|
+
async requestZKProofVerification(zkProof) {
|
|
253
|
+
return this.sendRequest(
|
|
254
|
+
"REQUEST_ZK_PROOF_VERIFICATION",
|
|
255
|
+
{ zkProof }
|
|
256
|
+
);
|
|
257
|
+
}
|
|
258
|
+
async getPublicKey() {
|
|
259
|
+
return this.sendRequest("GET_PUBLIC_KEY", {});
|
|
260
|
+
}
|
|
261
|
+
async getPublicParams(bits) {
|
|
262
|
+
return this.sendRequest("GET_PUBLIC_PARAMS", { bits });
|
|
263
|
+
}
|
|
264
|
+
// ===========================================================================
|
|
265
|
+
// Internal helpers
|
|
266
|
+
// ===========================================================================
|
|
267
|
+
#rejectAllPending(message) {
|
|
268
|
+
for (const [id, pending] of this.#pendingRequests) {
|
|
269
|
+
clearTimeout(pending.timeoutId);
|
|
270
|
+
pending.reject(new Error(message));
|
|
271
|
+
this.#pendingRequests.delete(id);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
};
|
|
275
|
+
|
|
276
|
+
export { ApprovalFailedError, BaseWorkerClient, CredentialExpiredError, DecryptionFailedError, EncryptionFailedError, InvalidCredentialsError, NoCiphertextError, RelayerRequestFailedError, SigningFailedError, SigningRejectedError, TokenError, TokenErrorCode, TransactionRevertedError };
|
|
277
|
+
//# sourceMappingURL=chunk-VRLLWHHL.js.map
|
|
278
|
+
//# sourceMappingURL=chunk-VRLLWHHL.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/token/errors.ts","../src/worker/worker.base-client.ts"],"names":[],"mappings":"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","file":"chunk-VRLLWHHL.js","sourcesContent":["/**\n * Typed error codes thrown by the SDK.\n * Use `error.code` or `instanceof` to programmatically handle specific failure modes.\n *\n * @example\n * ```ts\n * try {\n * await token.confidentialTransfer(\"0xTo\", 100n);\n * } catch (e) {\n * if (e instanceof SigningRejectedError) {\n * // User rejected the wallet signature\n * }\n * }\n * ```\n */\nexport const TokenErrorCode = {\n /** User rejected the wallet signature prompt. */\n SigningRejected: \"SIGNING_REJECTED\",\n /** Wallet signature failed for a reason other than rejection. */\n SigningFailed: \"SIGNING_FAILED\",\n /** FHE encryption failed. */\n EncryptionFailed: \"ENCRYPTION_FAILED\",\n /** FHE decryption failed. */\n DecryptionFailed: \"DECRYPTION_FAILED\",\n /** ERC-20 approval transaction failed. */\n ApprovalFailed: \"APPROVAL_FAILED\",\n /** On-chain transaction reverted. */\n TransactionReverted: \"TRANSACTION_REVERTED\",\n /** FHE credentials have expired and need regeneration. */\n CredentialExpired: \"CREDENTIAL_EXPIRED\",\n /** Relayer rejected credentials (stale, expired, or malformed). */\n InvalidCredentials: \"INVALID_CREDENTIALS\",\n /** No FHE ciphertext exists for this account (never shielded). */\n NoCiphertext: \"NO_CIPHERTEXT\",\n /** Relayer HTTP request failed. */\n RelayerRequestFailed: \"RELAYER_REQUEST_FAILED\",\n} as const;\n\n/** Union of all {@link TokenErrorCode} string values. */\nexport type TokenErrorCode = (typeof TokenErrorCode)[keyof typeof TokenErrorCode];\n\n/**\n * Base error thrown by all SDK operations.\n * Carries a {@link TokenErrorCode} for programmatic error handling.\n * Prefer catching specific subclasses (e.g. {@link EncryptionFailedError}).\n */\nexport class TokenError extends Error {\n /** Machine-readable error code. */\n readonly code: TokenErrorCode;\n\n constructor(code: TokenErrorCode, message: string, options?: ErrorOptions) {\n super(message, options);\n this.name = \"TokenError\";\n this.code = code;\n }\n}\n\n/** User rejected the wallet signature prompt. */\nexport class SigningRejectedError extends TokenError {\n constructor(message: string, options?: ErrorOptions) {\n super(TokenErrorCode.SigningRejected, message, options);\n this.name = \"SigningRejectedError\";\n }\n}\n\n/** Wallet signature failed for a reason other than rejection. */\nexport class SigningFailedError extends TokenError {\n constructor(message: string, options?: ErrorOptions) {\n super(TokenErrorCode.SigningFailed, message, options);\n this.name = \"SigningFailedError\";\n }\n}\n\n/** FHE encryption failed. */\nexport class EncryptionFailedError extends TokenError {\n constructor(message: string, options?: ErrorOptions) {\n super(TokenErrorCode.EncryptionFailed, message, options);\n this.name = \"EncryptionFailedError\";\n }\n}\n\n/** FHE decryption failed. */\nexport class DecryptionFailedError extends TokenError {\n constructor(message: string, options?: ErrorOptions) {\n super(TokenErrorCode.DecryptionFailed, message, options);\n this.name = \"DecryptionFailedError\";\n }\n}\n\n/** ERC-20 approval transaction failed. */\nexport class ApprovalFailedError extends TokenError {\n constructor(message: string, options?: ErrorOptions) {\n super(TokenErrorCode.ApprovalFailed, message, options);\n this.name = \"ApprovalFailedError\";\n }\n}\n\n/** On-chain transaction reverted. */\nexport class TransactionRevertedError extends TokenError {\n constructor(message: string, options?: ErrorOptions) {\n super(TokenErrorCode.TransactionReverted, message, options);\n this.name = \"TransactionRevertedError\";\n }\n}\n\n/** FHE credentials have expired and need regeneration. */\nexport class CredentialExpiredError extends TokenError {\n constructor(message: string, options?: ErrorOptions) {\n super(TokenErrorCode.CredentialExpired, message, options);\n this.name = \"CredentialExpiredError\";\n }\n}\n\n/** Relayer rejected credentials (stale, expired, or malformed). */\nexport class InvalidCredentialsError extends TokenError {\n constructor(message: string, options?: ErrorOptions) {\n super(TokenErrorCode.InvalidCredentials, message, options);\n this.name = \"InvalidCredentialsError\";\n }\n}\n\n/** No FHE ciphertext exists for this account (never shielded). */\nexport class NoCiphertextError extends TokenError {\n constructor(message: string, options?: ErrorOptions) {\n super(TokenErrorCode.NoCiphertext, message, options);\n this.name = \"NoCiphertextError\";\n }\n}\n\n/** Relayer HTTP request failed. */\nexport class RelayerRequestFailedError extends TokenError {\n /** HTTP status code from the relayer, if available. */\n readonly statusCode: number | undefined;\n\n constructor(message: string, statusCode?: number, options?: ErrorOptions) {\n super(TokenErrorCode.RelayerRequestFailed, message, options);\n this.name = \"RelayerRequestFailedError\";\n this.statusCode = statusCode;\n }\n}\n","import type { ZKProofLike } from \"../relayer/relayer-sdk.types\";\nimport type {\n CreateDelegatedEIP712Payload,\n CreateDelegatedEIP712ResponseData,\n CreateEIP712Payload,\n CreateEIP712ResponseData,\n DelegatedUserDecryptPayload,\n DelegatedUserDecryptResponseData,\n EncryptPayload,\n EncryptResponseData,\n GenerateKeypairResponseData,\n GetPublicKeyResponseData,\n GetPublicParamsResponseData,\n InitResponseData,\n PublicDecryptResponseData,\n RequestZKProofVerificationResponseData,\n UserDecryptPayload,\n UserDecryptResponseData,\n GenericLogger,\n WorkerRequest,\n WorkerRequestType,\n WorkerResponse,\n} from \"./worker.types\";\n\n/** Pending request tracker */\ninterface PendingRequest<T> {\n resolve: (value: T) => void;\n reject: (error: Error) => void;\n timeoutId: ReturnType<typeof setTimeout>;\n startTime: number;\n type: WorkerRequestType;\n}\n\n/** Default timeout for operations (30 seconds) */\nexport const DEFAULT_TIMEOUT_MS = 30_000;\n\n/** Extended timeout for WASM initialization (60 seconds) */\nexport const INIT_TIMEOUT_MS = 60_000;\n\n/**\n * Abstract base class for worker clients (browser Web Worker and Node.js worker_threads).\n * Encapsulates all shared logic: pending request tracking, timeouts, init dedup, domain methods.\n * Subclasses implement the abstract hooks for platform-specific worker creation and messaging.\n */\nexport abstract class BaseWorkerClient<TWorker, TConfig> {\n #worker: TWorker | null = null;\n #pendingRequests = new Map<string, PendingRequest<unknown>>();\n #initPromise: Promise<TWorker> | null = null;\n protected readonly config: TConfig;\n protected readonly logger: GenericLogger | undefined;\n\n constructor(config: TConfig, logger: GenericLogger | undefined) {\n this.config = config;\n this.logger = logger;\n }\n\n // ===========================================================================\n // Abstract hooks — subclasses must implement\n // ===========================================================================\n\n /** Create the platform-specific worker instance. */\n protected abstract createWorker(): TWorker;\n\n /** Wire message/error/messageerror events on the worker. */\n protected abstract wireEvents(worker: TWorker): void;\n\n /** Post a message to the worker. */\n protected abstract postMessage(worker: TWorker, request: WorkerRequest): void;\n\n /** Terminate the platform-specific worker. */\n protected abstract terminateWorker(worker: TWorker): void;\n\n /** Generate a unique request ID. */\n protected abstract generateRequestId(): string;\n\n /** Return the init request type and payload. */\n protected abstract getInitPayload(): {\n type: WorkerRequestType;\n payload: WorkerRequest[\"payload\"];\n };\n\n /** Optional hook called after worker init succeeds (e.g. for node worker.unref()). */\n protected onWorkerReady?(_worker: TWorker): void;\n\n // ===========================================================================\n // Shared init / terminate\n // ===========================================================================\n\n async initWorker(): Promise<TWorker> {\n if (this.#worker) return this.#worker;\n\n if (!this.#initPromise) {\n this.#initPromise = this.#doInitWorker().catch((err) => {\n this.#initPromise = null;\n throw err;\n });\n }\n return this.#initPromise;\n }\n\n async #doInitWorker(): Promise<TWorker> {\n const worker = this.createWorker();\n this.wireEvents(worker);\n\n try {\n const { type, payload } = this.getInitPayload();\n await this.sendRequestTo<InitResponseData>(worker, type, payload, INIT_TIMEOUT_MS);\n this.onWorkerReady?.(worker);\n this.#worker = worker;\n } catch (err) {\n this.terminateWorker(worker);\n throw err;\n }\n\n return this.#worker;\n }\n\n terminate(): void {\n if (this.#worker) {\n for (const [id, pending] of this.#pendingRequests) {\n clearTimeout(pending.timeoutId);\n pending.reject(new Error(\"Worker terminated\"));\n this.#pendingRequests.delete(id);\n }\n\n this.terminateWorker(this.#worker);\n this.#worker = null;\n }\n this.#initPromise = null;\n }\n\n // ===========================================================================\n // Message handling (called by subclass event wiring)\n // ===========================================================================\n\n protected handleResponse(response: WorkerResponse<unknown>): void {\n const pending = this.#pendingRequests.get(response.id);\n\n if (!pending) {\n this.logger?.warn(\"[WorkerClient] Received response for unknown request\", {\n id: response.id,\n });\n return;\n }\n\n const elapsed = Math.round(performance.now() - pending.startTime);\n\n clearTimeout(pending.timeoutId);\n this.#pendingRequests.delete(response.id);\n\n if (response.success) {\n this.logger?.debug(`[WorkerClient] ← ${pending.type} OK`, {\n id: response.id,\n elapsed,\n });\n pending.resolve(response.data);\n } else {\n this.logger?.error(`[WorkerClient] ← ${pending.type} FAILED`, {\n id: response.id,\n elapsed,\n error: response.error,\n });\n const err = new Error(response.error);\n if (\"statusCode\" in response && typeof response.statusCode === \"number\") {\n (err as Error & { statusCode?: number }).statusCode = response.statusCode;\n }\n pending.reject(err);\n }\n }\n\n protected handleWorkerError(message: string): void {\n this.logger?.error(\"[WorkerClient] Worker error\", { error: message });\n const worker = this.#worker;\n this.#worker = null;\n this.#rejectAllPending(`Worker error: ${message}`);\n if (worker) this.terminateWorker(worker);\n }\n\n protected handleWorkerMessageError(): void {\n this.logger?.error(\"[WorkerClient] Message deserialization failed\");\n const worker = this.#worker;\n this.#worker = null;\n this.#rejectAllPending(\"Worker message deserialization failed\");\n if (worker) this.terminateWorker(worker);\n }\n\n // ===========================================================================\n // Request sending\n // ===========================================================================\n\n protected sendRequestTo<T>(\n worker: TWorker,\n type: WorkerRequestType,\n payload: WorkerRequest[\"payload\"],\n timeoutMs: number = DEFAULT_TIMEOUT_MS,\n ): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const id = this.generateRequestId();\n const startTime = performance.now();\n this.logger?.debug(`[WorkerClient] → ${type}`, { id });\n\n const timeoutId = setTimeout(() => {\n this.#pendingRequests.delete(id);\n const elapsed = Math.round(performance.now() - startTime);\n this.logger?.error(`[WorkerClient] ${type} timed out after ${timeoutMs}ms`, {\n id,\n elapsed,\n });\n reject(new Error(`Request ${type} timed out after ${timeoutMs}ms`));\n }, timeoutMs);\n\n this.#pendingRequests.set(id, {\n resolve: resolve as (value: unknown) => void,\n reject,\n timeoutId,\n startTime,\n type,\n });\n\n const request = { id, type, payload } as WorkerRequest;\n this.postMessage(worker, request);\n });\n }\n\n protected async sendRequest<T>(\n type: WorkerRequestType,\n payload: WorkerRequest[\"payload\"],\n timeoutMs: number = DEFAULT_TIMEOUT_MS,\n ): Promise<T> {\n const worker = await this.initWorker();\n return this.sendRequestTo<T>(worker, type, payload, timeoutMs);\n }\n\n // ===========================================================================\n // Domain methods\n // ===========================================================================\n\n async generateKeypair(): Promise<GenerateKeypairResponseData> {\n return this.sendRequest<GenerateKeypairResponseData>(\"GENERATE_KEYPAIR\", {});\n }\n\n async createEIP712(params: CreateEIP712Payload): Promise<CreateEIP712ResponseData> {\n return this.sendRequest<CreateEIP712ResponseData>(\"CREATE_EIP712\", params);\n }\n\n async encrypt(params: EncryptPayload): Promise<EncryptResponseData> {\n return this.sendRequest<EncryptResponseData>(\"ENCRYPT\", params);\n }\n\n async userDecrypt(params: UserDecryptPayload): Promise<UserDecryptResponseData> {\n return this.sendRequest<UserDecryptResponseData>(\"USER_DECRYPT\", params);\n }\n\n async publicDecrypt(handles: string[]): Promise<PublicDecryptResponseData> {\n return this.sendRequest<PublicDecryptResponseData>(\"PUBLIC_DECRYPT\", { handles });\n }\n\n async createDelegatedUserDecryptEIP712(\n params: CreateDelegatedEIP712Payload,\n ): Promise<CreateDelegatedEIP712ResponseData> {\n return this.sendRequest<CreateDelegatedEIP712ResponseData>(\"CREATE_DELEGATED_EIP712\", params);\n }\n\n async delegatedUserDecrypt(\n params: DelegatedUserDecryptPayload,\n ): Promise<DelegatedUserDecryptResponseData> {\n return this.sendRequest<DelegatedUserDecryptResponseData>(\"DELEGATED_USER_DECRYPT\", params);\n }\n\n async requestZKProofVerification(\n zkProof: ZKProofLike,\n ): Promise<RequestZKProofVerificationResponseData> {\n return this.sendRequest<RequestZKProofVerificationResponseData>(\n \"REQUEST_ZK_PROOF_VERIFICATION\",\n { zkProof },\n );\n }\n\n async getPublicKey(): Promise<GetPublicKeyResponseData> {\n return this.sendRequest<GetPublicKeyResponseData>(\"GET_PUBLIC_KEY\", {});\n }\n\n async getPublicParams(bits: number): Promise<GetPublicParamsResponseData> {\n return this.sendRequest<GetPublicParamsResponseData>(\"GET_PUBLIC_PARAMS\", { bits });\n }\n\n // ===========================================================================\n // Internal helpers\n // ===========================================================================\n\n #rejectAllPending(message: string): void {\n for (const [id, pending] of this.#pendingRequests) {\n clearTimeout(pending.timeoutId);\n pending.reject(new Error(message));\n this.#pendingRequests.delete(id);\n }\n }\n}\n"]}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { G as GenericSigner, C as ContractCallConfig, T as TransactionReceipt, B as BatchTransferData } from '../token.types-CRs1iJh7.js';
|
|
2
|
+
import { E as EIP712TypedData, H as Hex } from '../relayer-sdk.types-CFkzNzRy.js';
|
|
3
|
+
import { BrowserProvider, Signer, Provider } from 'ethers';
|
|
4
|
+
import { Address } from '@zama-fhe/relayer-sdk/bundle';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* GenericSigner backed by ethers.
|
|
8
|
+
*
|
|
9
|
+
* Accepts either a `BrowserProvider` (signer resolved lazily via `getSigner()`)
|
|
10
|
+
* or a `Signer` directly (e.g. `Wallet` for Node.js scripts).
|
|
11
|
+
*/
|
|
12
|
+
declare class EthersSigner implements GenericSigner {
|
|
13
|
+
private signerPromise;
|
|
14
|
+
constructor(providerOrSigner: BrowserProvider | Signer);
|
|
15
|
+
getChainId(): Promise<number>;
|
|
16
|
+
getAddress(): Promise<Address>;
|
|
17
|
+
signTypedData(typedData: EIP712TypedData): Promise<Hex>;
|
|
18
|
+
writeContract<C extends ContractCallConfig>(config: C): Promise<Hex>;
|
|
19
|
+
readContract<T, C extends ContractCallConfig>(config: C): Promise<T>;
|
|
20
|
+
waitForTransactionReceipt(hash: Hex): Promise<TransactionReceipt>;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
declare function readConfidentialBalanceOfContract(provider: Provider | Signer, tokenAddress: Address, userAddress: Address): Promise<any>;
|
|
24
|
+
declare function readWrapperForTokenContract(provider: Provider | Signer, coordinator: Address, tokenAddress: Address): Promise<any>;
|
|
25
|
+
declare function readUnderlyingTokenContract(provider: Provider | Signer, wrapperAddress: Address): Promise<any>;
|
|
26
|
+
declare function readWrapperExistsContract(provider: Provider | Signer, coordinator: Address, tokenAddress: Address): Promise<any>;
|
|
27
|
+
declare function readSupportsInterfaceContract(provider: Provider | Signer, tokenAddress: Address, interfaceId: Address): Promise<any>;
|
|
28
|
+
declare function writeConfidentialTransferContract(signer: Signer, tokenAddress: Address, to: Address, handle: Uint8Array, inputProof: Uint8Array): Promise<`0x${string}`>;
|
|
29
|
+
declare function writeConfidentialBatchTransferContract(signer: Signer, batcherAddress: Address, tokenAddress: Address, fromAddress: Address, batchTransferData: BatchTransferData[], fees: bigint): Promise<`0x${string}`>;
|
|
30
|
+
declare function writeUnwrapContract(signer: Signer, encryptedErc20: Address, from: Address, to: Address, encryptedAmount: Uint8Array, inputProof: Uint8Array): Promise<`0x${string}`>;
|
|
31
|
+
declare function writeUnwrapFromBalanceContract(signer: Signer, encryptedErc20: Address, from: Address, to: Address, encryptedBalance: Address): Promise<`0x${string}`>;
|
|
32
|
+
declare function writeFinalizeUnwrapContract(signer: Signer, wrapper: Address, burntAmount: Address, burntAmountCleartext: bigint, decryptionProof: Address): Promise<`0x${string}`>;
|
|
33
|
+
declare function writeSetOperatorContract(signer: Signer, tokenAddress: Address, spender: Address, timestamp?: number): Promise<`0x${string}`>;
|
|
34
|
+
declare function writeWrapContract(signer: Signer, wrapperAddress: Address, to: Address, amount: bigint): Promise<`0x${string}`>;
|
|
35
|
+
declare function writeWrapETHContract(signer: Signer, wrapperAddress: Address, to: Address, amount: bigint, value: bigint): Promise<`0x${string}`>;
|
|
36
|
+
|
|
37
|
+
export { EthersSigner, readConfidentialBalanceOfContract, readSupportsInterfaceContract, readUnderlyingTokenContract, readWrapperExistsContract, readWrapperForTokenContract, writeConfidentialBatchTransferContract, writeConfidentialTransferContract, writeFinalizeUnwrapContract, writeSetOperatorContract, writeUnwrapContract, writeUnwrapFromBalanceContract, writeWrapContract, writeWrapETHContract };
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { confidentialBalanceOfContract, getWrapperContract, underlyingContract, wrapperExistsContract, supportsInterfaceContract, confidentialTransferContract, confidentialBatchTransferContract, unwrapContract, unwrapFromBalanceContract, finalizeUnwrapContract, setOperatorContract, wrapContract, wrapETHContract } from '../chunk-AJFSZ47V.js';
|
|
2
|
+
import { ethers } from 'ethers';
|
|
3
|
+
|
|
4
|
+
function toHex(s) {
|
|
5
|
+
if (!s.startsWith("0x")) throw new TypeError(`Expected hex string, got: ${s}`);
|
|
6
|
+
return s;
|
|
7
|
+
}
|
|
8
|
+
var EthersSigner = class {
|
|
9
|
+
signerPromise;
|
|
10
|
+
constructor(providerOrSigner) {
|
|
11
|
+
if ("getSigner" in providerOrSigner) {
|
|
12
|
+
this.signerPromise = providerOrSigner.getSigner();
|
|
13
|
+
} else {
|
|
14
|
+
this.signerPromise = Promise.resolve(providerOrSigner);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
async getChainId() {
|
|
18
|
+
const signer = await this.signerPromise;
|
|
19
|
+
const provider = signer.provider;
|
|
20
|
+
if (!provider) throw new TypeError("Signer has no provider");
|
|
21
|
+
const network = await provider.getNetwork();
|
|
22
|
+
return Number(network.chainId);
|
|
23
|
+
}
|
|
24
|
+
async getAddress() {
|
|
25
|
+
const signer = await this.signerPromise;
|
|
26
|
+
return toHex(await signer.getAddress());
|
|
27
|
+
}
|
|
28
|
+
async signTypedData(typedData) {
|
|
29
|
+
const signer = await this.signerPromise;
|
|
30
|
+
const { domain, types, message } = typedData;
|
|
31
|
+
const { EIP712Domain: _, ...sigTypes } = types;
|
|
32
|
+
const sig = await signer.signTypedData(domain, sigTypes, message);
|
|
33
|
+
return toHex(sig);
|
|
34
|
+
}
|
|
35
|
+
async writeContract(config) {
|
|
36
|
+
const signer = await this.signerPromise;
|
|
37
|
+
const contract = new ethers.Contract(config.address, config.abi, signer);
|
|
38
|
+
const overrides = {};
|
|
39
|
+
if (config.value !== void 0) overrides.value = config.value;
|
|
40
|
+
const tx = await contract[config.functionName](...config.args, overrides);
|
|
41
|
+
return toHex(tx.hash);
|
|
42
|
+
}
|
|
43
|
+
async readContract(config) {
|
|
44
|
+
const signer = await this.signerPromise;
|
|
45
|
+
const contract = new ethers.Contract(config.address, config.abi, signer);
|
|
46
|
+
return contract[config.functionName](...config.args);
|
|
47
|
+
}
|
|
48
|
+
async waitForTransactionReceipt(hash) {
|
|
49
|
+
const signer = await this.signerPromise;
|
|
50
|
+
const provider = signer.provider;
|
|
51
|
+
if (!provider) throw new TypeError("Signer has no provider");
|
|
52
|
+
const receipt = await provider.waitForTransaction(hash);
|
|
53
|
+
if (!receipt) throw new Error("Transaction receipt not found");
|
|
54
|
+
return {
|
|
55
|
+
logs: receipt.logs.map((log) => ({
|
|
56
|
+
topics: log.topics.filter((t) => t !== null),
|
|
57
|
+
data: log.data
|
|
58
|
+
}))
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
async function ethersRead(provider, config) {
|
|
63
|
+
const contract = new ethers.Contract(config.address, config.abi, provider);
|
|
64
|
+
return contract[config.functionName](...config.args);
|
|
65
|
+
}
|
|
66
|
+
function toHex2(s) {
|
|
67
|
+
if (!s.startsWith("0x")) throw new TypeError(`Expected hex string, got: ${s}`);
|
|
68
|
+
return s;
|
|
69
|
+
}
|
|
70
|
+
async function ethersWrite(signer, config) {
|
|
71
|
+
const contract = new ethers.Contract(config.address, config.abi, signer);
|
|
72
|
+
const tx = await contract[config.functionName](...config.args, {
|
|
73
|
+
value: config.value
|
|
74
|
+
});
|
|
75
|
+
return toHex2(tx.hash);
|
|
76
|
+
}
|
|
77
|
+
function readConfidentialBalanceOfContract(provider, tokenAddress, userAddress) {
|
|
78
|
+
return ethersRead(provider, confidentialBalanceOfContract(tokenAddress, userAddress));
|
|
79
|
+
}
|
|
80
|
+
function readWrapperForTokenContract(provider, coordinator, tokenAddress) {
|
|
81
|
+
return ethersRead(provider, getWrapperContract(coordinator, tokenAddress));
|
|
82
|
+
}
|
|
83
|
+
function readUnderlyingTokenContract(provider, wrapperAddress) {
|
|
84
|
+
return ethersRead(provider, underlyingContract(wrapperAddress));
|
|
85
|
+
}
|
|
86
|
+
function readWrapperExistsContract(provider, coordinator, tokenAddress) {
|
|
87
|
+
return ethersRead(provider, wrapperExistsContract(coordinator, tokenAddress));
|
|
88
|
+
}
|
|
89
|
+
function readSupportsInterfaceContract(provider, tokenAddress, interfaceId) {
|
|
90
|
+
return ethersRead(provider, supportsInterfaceContract(tokenAddress, interfaceId));
|
|
91
|
+
}
|
|
92
|
+
function writeConfidentialTransferContract(signer, tokenAddress, to, handle, inputProof) {
|
|
93
|
+
return ethersWrite(signer, confidentialTransferContract(tokenAddress, to, handle, inputProof));
|
|
94
|
+
}
|
|
95
|
+
function writeConfidentialBatchTransferContract(signer, batcherAddress, tokenAddress, fromAddress, batchTransferData, fees) {
|
|
96
|
+
return ethersWrite(
|
|
97
|
+
signer,
|
|
98
|
+
confidentialBatchTransferContract(
|
|
99
|
+
batcherAddress,
|
|
100
|
+
tokenAddress,
|
|
101
|
+
fromAddress,
|
|
102
|
+
batchTransferData,
|
|
103
|
+
fees
|
|
104
|
+
)
|
|
105
|
+
);
|
|
106
|
+
}
|
|
107
|
+
function writeUnwrapContract(signer, encryptedErc20, from, to, encryptedAmount, inputProof) {
|
|
108
|
+
return ethersWrite(signer, unwrapContract(encryptedErc20, from, to, encryptedAmount, inputProof));
|
|
109
|
+
}
|
|
110
|
+
function writeUnwrapFromBalanceContract(signer, encryptedErc20, from, to, encryptedBalance) {
|
|
111
|
+
return ethersWrite(signer, unwrapFromBalanceContract(encryptedErc20, from, to, encryptedBalance));
|
|
112
|
+
}
|
|
113
|
+
function writeFinalizeUnwrapContract(signer, wrapper, burntAmount, burntAmountCleartext, decryptionProof) {
|
|
114
|
+
return ethersWrite(
|
|
115
|
+
signer,
|
|
116
|
+
finalizeUnwrapContract(wrapper, burntAmount, burntAmountCleartext, decryptionProof)
|
|
117
|
+
);
|
|
118
|
+
}
|
|
119
|
+
function writeSetOperatorContract(signer, tokenAddress, spender, timestamp) {
|
|
120
|
+
return ethersWrite(signer, setOperatorContract(tokenAddress, spender, timestamp));
|
|
121
|
+
}
|
|
122
|
+
function writeWrapContract(signer, wrapperAddress, to, amount) {
|
|
123
|
+
return ethersWrite(signer, wrapContract(wrapperAddress, to, amount));
|
|
124
|
+
}
|
|
125
|
+
function writeWrapETHContract(signer, wrapperAddress, to, amount, value) {
|
|
126
|
+
return ethersWrite(signer, wrapETHContract(wrapperAddress, to, amount, value));
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
export { EthersSigner, readConfidentialBalanceOfContract, readSupportsInterfaceContract, readUnderlyingTokenContract, readWrapperExistsContract, readWrapperForTokenContract, writeConfidentialBatchTransferContract, writeConfidentialTransferContract, writeFinalizeUnwrapContract, writeSetOperatorContract, writeUnwrapContract, writeUnwrapFromBalanceContract, writeWrapContract, writeWrapETHContract };
|
|
130
|
+
//# sourceMappingURL=index.js.map
|
|
131
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/ethers/ethers-signer.ts","../../src/ethers/contracts.ts"],"names":["ethers","toHex"],"mappings":"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","file":"index.js","sourcesContent":["import type {\n GenericSigner,\n ContractCallConfig,\n TransactionReceipt,\n Hex,\n} from \"../token/token.types\";\nimport type { Address, EIP712TypedData } from \"../relayer/relayer-sdk.types\";\nimport { ethers, type BrowserProvider, type Signer } from \"ethers\";\n\n/** Validate and narrow a string to the `Hex` branded type. */\nfunction toHex(s: string): Hex {\n if (!s.startsWith(\"0x\")) throw new TypeError(`Expected hex string, got: ${s}`);\n return s as Hex;\n}\n\n/**\n * GenericSigner backed by ethers.\n *\n * Accepts either a `BrowserProvider` (signer resolved lazily via `getSigner()`)\n * or a `Signer` directly (e.g. `Wallet` for Node.js scripts).\n */\nexport class EthersSigner implements GenericSigner {\n private signerPromise: Promise<Signer>;\n\n constructor(providerOrSigner: BrowserProvider | Signer) {\n if (\"getSigner\" in providerOrSigner) {\n this.signerPromise = providerOrSigner.getSigner();\n } else {\n this.signerPromise = Promise.resolve(providerOrSigner);\n }\n }\n\n async getChainId(): Promise<number> {\n const signer = await this.signerPromise;\n const provider = signer.provider;\n if (!provider) throw new TypeError(\"Signer has no provider\");\n const network = await provider.getNetwork();\n return Number(network.chainId);\n }\n\n async getAddress(): Promise<Address> {\n const signer = await this.signerPromise;\n return toHex(await signer.getAddress()) as Address;\n }\n\n async signTypedData(typedData: EIP712TypedData): Promise<Hex> {\n const signer = await this.signerPromise;\n const { domain, types, message } = typedData;\n const { EIP712Domain: _, ...sigTypes } = types;\n const sig = await signer.signTypedData(domain, sigTypes, message);\n return toHex(sig);\n }\n\n async writeContract<C extends ContractCallConfig>(config: C): Promise<Hex> {\n const signer = await this.signerPromise;\n const contract = new ethers.Contract(config.address, config.abi as ethers.InterfaceAbi, signer);\n const overrides: Record<string, unknown> = {};\n if (config.value !== undefined) overrides.value = config.value;\n const tx = await contract[config.functionName]!(...config.args, overrides);\n return toHex(tx.hash);\n }\n\n async readContract<T, C extends ContractCallConfig>(config: C): Promise<T> {\n const signer = await this.signerPromise;\n const contract = new ethers.Contract(config.address, config.abi as ethers.InterfaceAbi, signer);\n return contract[config.functionName]!(...config.args) as Promise<T>;\n }\n\n async waitForTransactionReceipt(hash: Hex): Promise<TransactionReceipt> {\n const signer = await this.signerPromise;\n const provider = signer.provider;\n if (!provider) throw new TypeError(\"Signer has no provider\");\n const receipt = await provider.waitForTransaction(hash);\n if (!receipt) throw new Error(\"Transaction receipt not found\");\n return {\n logs: receipt.logs.map((log) => ({\n topics: log.topics.filter((t): t is string => t !== null),\n data: log.data,\n })),\n };\n }\n}\n","import { ethers, type Provider, type Signer } from \"ethers\";\nimport type { Address, Hex } from \"../relayer/relayer-sdk.types\";\nimport type { BatchTransferData } from \"../contracts\";\nimport {\n confidentialBalanceOfContract,\n confidentialBatchTransferContract,\n confidentialTransferContract,\n finalizeUnwrapContract,\n getWrapperContract,\n setOperatorContract,\n supportsInterfaceContract,\n underlyingContract,\n unwrapContract,\n unwrapFromBalanceContract,\n wrapContract,\n wrapETHContract,\n wrapperExistsContract,\n} from \"../contracts\";\n\ninterface ContractConfig {\n address: string;\n abi: readonly unknown[];\n functionName: string;\n args: readonly unknown[];\n value?: bigint;\n}\n\nasync function ethersRead(provider: Provider | Signer, config: ContractConfig) {\n const contract = new ethers.Contract(config.address, config.abi as ethers.InterfaceAbi, provider);\n return contract[config.functionName]!(...config.args);\n}\n\n/** Validate and narrow a string to the `Hex` branded type. */\nfunction toHex(s: string): Hex {\n if (!s.startsWith(\"0x\")) throw new TypeError(`Expected hex string, got: ${s}`);\n return s as Hex;\n}\n\nasync function ethersWrite(signer: Signer, config: ContractConfig): Promise<Hex> {\n const contract = new ethers.Contract(config.address, config.abi as ethers.InterfaceAbi, signer);\n const tx = await contract[config.functionName]!(...config.args, {\n value: config.value,\n });\n return toHex(tx.hash);\n}\n\n// ── Read helpers ────────────────────────────────────────────\n\nexport function readConfidentialBalanceOfContract(\n provider: Provider | Signer,\n tokenAddress: Address,\n userAddress: Address,\n) {\n return ethersRead(provider, confidentialBalanceOfContract(tokenAddress, userAddress));\n}\n\nexport function readWrapperForTokenContract(\n provider: Provider | Signer,\n coordinator: Address,\n tokenAddress: Address,\n) {\n return ethersRead(provider, getWrapperContract(coordinator, tokenAddress));\n}\n\nexport function readUnderlyingTokenContract(provider: Provider | Signer, wrapperAddress: Address) {\n return ethersRead(provider, underlyingContract(wrapperAddress));\n}\n\nexport function readWrapperExistsContract(\n provider: Provider | Signer,\n coordinator: Address,\n tokenAddress: Address,\n) {\n return ethersRead(provider, wrapperExistsContract(coordinator, tokenAddress));\n}\n\nexport function readSupportsInterfaceContract(\n provider: Provider | Signer,\n tokenAddress: Address,\n interfaceId: Address,\n) {\n return ethersRead(provider, supportsInterfaceContract(tokenAddress, interfaceId));\n}\n\n// ── Write helpers ───────────────────────────────────────────\n\nexport function writeConfidentialTransferContract(\n signer: Signer,\n tokenAddress: Address,\n to: Address,\n handle: Uint8Array,\n inputProof: Uint8Array,\n) {\n return ethersWrite(signer, confidentialTransferContract(tokenAddress, to, handle, inputProof));\n}\n\nexport function writeConfidentialBatchTransferContract(\n signer: Signer,\n batcherAddress: Address,\n tokenAddress: Address,\n fromAddress: Address,\n batchTransferData: BatchTransferData[],\n fees: bigint,\n) {\n return ethersWrite(\n signer,\n confidentialBatchTransferContract(\n batcherAddress,\n tokenAddress,\n fromAddress,\n batchTransferData,\n fees,\n ),\n );\n}\n\nexport function writeUnwrapContract(\n signer: Signer,\n encryptedErc20: Address,\n from: Address,\n to: Address,\n encryptedAmount: Uint8Array,\n inputProof: Uint8Array,\n) {\n return ethersWrite(signer, unwrapContract(encryptedErc20, from, to, encryptedAmount, inputProof));\n}\n\nexport function writeUnwrapFromBalanceContract(\n signer: Signer,\n encryptedErc20: Address,\n from: Address,\n to: Address,\n encryptedBalance: Address,\n) {\n return ethersWrite(signer, unwrapFromBalanceContract(encryptedErc20, from, to, encryptedBalance));\n}\n\nexport function writeFinalizeUnwrapContract(\n signer: Signer,\n wrapper: Address,\n burntAmount: Address,\n burntAmountCleartext: bigint,\n decryptionProof: Address,\n) {\n return ethersWrite(\n signer,\n finalizeUnwrapContract(wrapper, burntAmount, burntAmountCleartext, decryptionProof),\n );\n}\n\nexport function writeSetOperatorContract(\n signer: Signer,\n tokenAddress: Address,\n spender: Address,\n timestamp?: number,\n) {\n return ethersWrite(signer, setOperatorContract(tokenAddress, spender, timestamp));\n}\n\nexport function writeWrapContract(\n signer: Signer,\n wrapperAddress: Address,\n to: Address,\n amount: bigint,\n) {\n return ethersWrite(signer, wrapContract(wrapperAddress, to, amount));\n}\n\nexport function writeWrapETHContract(\n signer: Signer,\n wrapperAddress: Address,\n to: Address,\n amount: bigint,\n value: bigint,\n) {\n return ethersWrite(signer, wrapETHContract(wrapperAddress, to, amount, value));\n}\n"]}
|