gate-evm-tools 1.0.22 → 1.0.23

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 (45) hide show
  1. package/README.md +47 -0
  2. package/dist/custody/credential.d.ts +16 -0
  3. package/dist/custody/credential.d.ts.map +1 -0
  4. package/dist/custody/credential.js +68 -0
  5. package/dist/custody/credential.js.map +1 -0
  6. package/dist/custody/hardhat-runtime.d.ts +16 -0
  7. package/dist/custody/hardhat-runtime.d.ts.map +1 -0
  8. package/dist/custody/hardhat-runtime.js +101 -0
  9. package/dist/custody/hardhat-runtime.js.map +1 -0
  10. package/dist/custody/hardhat.d.ts +3 -0
  11. package/dist/custody/hardhat.d.ts.map +1 -0
  12. package/dist/custody/hardhat.js +8 -0
  13. package/dist/custody/hardhat.js.map +1 -0
  14. package/dist/custody/index.d.ts +6 -0
  15. package/dist/custody/index.d.ts.map +1 -0
  16. package/dist/custody/index.js +6 -0
  17. package/dist/custody/index.js.map +1 -0
  18. package/dist/custody/service.d.ts +16 -0
  19. package/dist/custody/service.d.ts.map +1 -0
  20. package/dist/custody/service.js +100 -0
  21. package/dist/custody/service.js.map +1 -0
  22. package/dist/custody/signer.d.ts +13 -0
  23. package/dist/custody/signer.d.ts.map +1 -0
  24. package/dist/custody/signer.js +258 -0
  25. package/dist/custody/signer.js.map +1 -0
  26. package/dist/custody/version.d.ts +4 -0
  27. package/dist/custody/version.d.ts.map +1 -0
  28. package/dist/custody/version.js +13 -0
  29. package/dist/custody/version.js.map +1 -0
  30. package/dist-cjs/custody/credential.js +74 -0
  31. package/dist-cjs/custody/credential.js.map +1 -0
  32. package/dist-cjs/custody/hardhat-runtime.js +104 -0
  33. package/dist-cjs/custody/hardhat-runtime.js.map +1 -0
  34. package/dist-cjs/custody/hardhat.js +15 -0
  35. package/dist-cjs/custody/hardhat.js.map +1 -0
  36. package/dist-cjs/custody/index.js +18 -0
  37. package/dist-cjs/custody/index.js.map +1 -0
  38. package/dist-cjs/custody/service.js +105 -0
  39. package/dist-cjs/custody/service.js.map +1 -0
  40. package/dist-cjs/custody/signer.js +261 -0
  41. package/dist-cjs/custody/signer.js.map +1 -0
  42. package/dist-cjs/custody/version.js +16 -0
  43. package/dist-cjs/custody/version.js.map +1 -0
  44. package/dist-cjs/package.json +3 -0
  45. package/package.json +32 -4
package/README.md CHANGED
@@ -163,6 +163,53 @@ module.exports = {
163
163
  };
164
164
  ```
165
165
 
166
+ #### 托管钱包 Signer(ethers v5 / v6)
167
+
168
+ `gate-evm-tools` 支持把真实私钥和托管钱包统一放在同一个配置项中:
169
+
170
+ ```text
171
+ # 真实私钥
172
+ PRIVATE_KEY=0x...
173
+
174
+ # 或托管钱包凭证
175
+ PRIVATE_KEY=custody:<ProjectSecret>:<WalletAddress>
176
+ CUSTODY_API_BASE_URL=https://custody.example.com
177
+ ```
178
+
179
+ `CUSTODY_API_BASE_URL` must be an HTTP(S) base URL without embedded
180
+ credentials, query parameters, or fragments.
181
+
182
+ 也可以用 `WALLET_CREDENTIAL` 代替 `PRIVATE_KEY`。如果两个变量同时存在,值必须一致,否则会拒绝启动,避免误用账户。
183
+
184
+ Hardhat 配置需要在 ethers 和 OpenZeppelin 插件之后加载托管插件,并用 `resolveHardhatAccounts` 处理网络账户:
185
+
186
+ ```typescript
187
+ import "@nomicfoundation/hardhat-ethers";
188
+ import "@openzeppelin/hardhat-upgrades";
189
+ import "gate-evm-tools/hardhat";
190
+ import { resolveHardhatAccounts } from "gate-evm-tools/hardhat";
191
+
192
+ const walletCredential =
193
+ process.env.WALLET_CREDENTIAL ?? process.env.PRIVATE_KEY ?? "";
194
+
195
+ export default {
196
+ networks: {
197
+ sepolia: {
198
+ url: process.env.SEPOLIA_RPC_URL,
199
+ accounts: resolveHardhatAccounts(walletCredential),
200
+ },
201
+ },
202
+ };
203
+ ```
204
+
205
+ - 真实私钥返回给原生 `networks.accounts`,部署行为保持不变。
206
+ - 托管凭证让原生 accounts 保持为空,并自动替换 `ethers.getSigners()`、匹配地址的 `ethers.getSigner()` 和 `ethers.provider.getSigner(0)`。
207
+ - 实际 ethers 主版本取自 `hre.ethers.version`;v5 使用运行时 `Signer`,v6 使用运行时 `AbstractSigner`,包内不会固定加载某个 ethers 版本。
208
+ - 业务部署脚本无需传入额外 signer;`ethers.getContractFactory()`、`deployContract()` 和 `upgrades.deployProxy()` 会取得托管 signer。
209
+ - 完整托管凭证通过 Bearer 发送,服务端拆解 Project Secret 与绑定钱包地址;凭证不会写入日志,每次签名请求都会生成独立的 `Idempotency-Key`。
210
+
211
+ 托管服务只返回签名或 raw transaction,不负责广播。交易最终仍由当前 Hardhat ethers Provider 广播。现有 OpenZeppelin CREATE2/Multicall 补丁与 signer 注入是两套独立能力,升级项目应继续保留原补丁。
212
+
166
213
  ### 4. 编译合约
167
214
 
168
215
  ```bash
@@ -0,0 +1,16 @@
1
+ export declare const PRIVATE_KEY_PATTERN: RegExp;
2
+ export declare const PROJECT_SECRET_PATTERN: RegExp;
3
+ export type PrivateKeyCredential = {
4
+ kind: 'private-key';
5
+ privateKey: string;
6
+ };
7
+ export type CustodyCredential = {
8
+ kind: 'custody';
9
+ secret: string;
10
+ address: string;
11
+ };
12
+ export type ParsedWalletCredential = PrivateKeyCredential | CustodyCredential;
13
+ export declare function parseWalletCredential(value: string): ParsedWalletCredential;
14
+ export declare function resolveWalletCredential(env?: NodeJS.ProcessEnv): ParsedWalletCredential | undefined;
15
+ export declare function resolveHardhatAccounts(value?: string): string[];
16
+ //# sourceMappingURL=credential.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credential.d.ts","sourceRoot":"","sources":["../../src/custody/credential.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,mBAAmB,QAA6B,CAAC;AAC9D,eAAO,MAAM,sBAAsB,QACkB,CAAC;AAMtD,MAAM,MAAM,oBAAoB,GAAG;IACjC,IAAI,EAAE,aAAa,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,SAAS,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG,oBAAoB,GAAG,iBAAiB,CAAC;AAE9E,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,sBAAsB,CAmB3E;AAED,wBAAgB,uBAAuB,CACrC,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,sBAAsB,GAAG,SAAS,CAUpC;AAED,wBAAgB,sBAAsB,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAQ/D"}
@@ -0,0 +1,68 @@
1
+ export const PRIVATE_KEY_PATTERN = /^(?:0x)?[0-9a-fA-F]{64}$/;
2
+ export const PROJECT_SECRET_PATTERN = /^sk-(?:test|live)-[A-Z0-9_-]+\.[A-Za-z0-9_-]{32}$/;
3
+ const ADDRESS_PATTERN = /^0x[0-9a-fA-F]{40}$/;
4
+ const ZERO_ADDRESS = /^0x0{40}$/i;
5
+ const CUSTODY_PREFIX = 'custody:';
6
+ export function parseWalletCredential(value) {
7
+ const credential = value.trim();
8
+ if (PRIVATE_KEY_PATTERN.test(credential)) {
9
+ return {
10
+ kind: 'private-key',
11
+ privateKey: credential.startsWith('0x')
12
+ ? credential
13
+ : `0x${credential}`,
14
+ };
15
+ }
16
+ if (credential.startsWith(CUSTODY_PREFIX)) {
17
+ return parseCustodyCredential(credential);
18
+ }
19
+ throw new Error('不支持的钱包凭证格式:请传入 64 位十六进制私钥或 custody 凭证');
20
+ }
21
+ export function resolveWalletCredential(env = process.env) {
22
+ const unified = normalizeOptionalValue(env.WALLET_CREDENTIAL);
23
+ const legacy = normalizeOptionalValue(env.PRIVATE_KEY);
24
+ if (unified !== undefined && legacy !== undefined && unified !== legacy) {
25
+ throw new Error('WALLET_CREDENTIAL 与 PRIVATE_KEY 配置冲突');
26
+ }
27
+ const value = unified ?? legacy;
28
+ return value === undefined ? undefined : parseWalletCredential(value);
29
+ }
30
+ export function resolveHardhatAccounts(value) {
31
+ const normalized = normalizeOptionalValue(value);
32
+ if (normalized === undefined) {
33
+ return [];
34
+ }
35
+ const credential = parseWalletCredential(normalized);
36
+ return credential.kind === 'private-key' ? [credential.privateKey] : [];
37
+ }
38
+ function parseCustodyCredential(value) {
39
+ const remainder = value.slice(CUSTODY_PREFIX.length);
40
+ const separatorIndex = remainder.lastIndexOf(':');
41
+ if (separatorIndex <= 0) {
42
+ throw new Error('托管钱包凭证格式无效');
43
+ }
44
+ const secret = remainder.slice(0, separatorIndex);
45
+ const address = remainder.slice(separatorIndex + 1);
46
+ if (!PROJECT_SECRET_PATTERN.test(secret)) {
47
+ throw new Error('托管钱包凭证中的 Project Secret 格式无效');
48
+ }
49
+ if (!ADDRESS_PATTERN.test(address)) {
50
+ throw new Error('托管钱包凭证中的钱包地址格式无效');
51
+ }
52
+ if (ZERO_ADDRESS.test(address)) {
53
+ throw new Error('托管钱包地址不能是零地址');
54
+ }
55
+ return {
56
+ kind: 'custody',
57
+ secret,
58
+ address,
59
+ };
60
+ }
61
+ function normalizeOptionalValue(value) {
62
+ if (value === undefined) {
63
+ return undefined;
64
+ }
65
+ const normalized = value.trim();
66
+ return normalized === '' ? undefined : normalized;
67
+ }
68
+ //# sourceMappingURL=credential.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credential.js","sourceRoot":"","sources":["../../src/custody/credential.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ type HardhatRuntimeLike = {
2
+ ethers: Record<string, any> & {
3
+ version?: unknown;
4
+ provider: Record<string, any>;
5
+ getSigner: (...args: any[]) => Promise<any>;
6
+ getSigners: (...args: any[]) => Promise<any[]>;
7
+ };
8
+ };
9
+ export type InstallCustodyHardhatRuntimeOptions = {
10
+ env?: NodeJS.ProcessEnv;
11
+ logger?: (message: string) => void;
12
+ fetchImpl?: typeof fetch;
13
+ };
14
+ export declare function installCustodyHardhatRuntime(hre: HardhatRuntimeLike, options?: InstallCustodyHardhatRuntimeOptions): void;
15
+ export {};
16
+ //# sourceMappingURL=hardhat-runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hardhat-runtime.d.ts","sourceRoot":"","sources":["../../src/custody/hardhat-runtime.ts"],"names":[],"mappings":"AAOA,KAAK,kBAAkB,GAAG;IACxB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG;QAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC9B,SAAS,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;QAC5C,UAAU,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;KAChD,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,mCAAmC,GAAG;IAChD,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B,CAAC;AAIF,wBAAgB,4BAA4B,CAC1C,GAAG,EAAE,kBAAkB,EACvB,OAAO,GAAE,mCAAwC,GAChD,IAAI,CA4GN"}
@@ -0,0 +1,101 @@
1
+ import { resolveWalletCredential, } from './credential.js';
2
+ import { createSigner } from './signer.js';
3
+ import { detectEthersMajor } from './version.js';
4
+ const installedEnvironments = new WeakSet();
5
+ export function installCustodyHardhatRuntime(hre, options = {}) {
6
+ if (installedEnvironments.has(hre)) {
7
+ return;
8
+ }
9
+ const ethersRuntime = hre.ethers;
10
+ if (typeof ethersRuntime !== 'object' ||
11
+ ethersRuntime === null ||
12
+ typeof ethersRuntime.getSigners !== 'function' ||
13
+ typeof ethersRuntime.getSigner !== 'function' ||
14
+ typeof ethersRuntime.provider?.getSigner !== 'function') {
15
+ throw new Error('gate-evm-tools/hardhat 必须在 Hardhat ethers 插件之后加载');
16
+ }
17
+ const env = options.env ?? process.env;
18
+ const logger = options.logger ?? ((message) => console.info(message));
19
+ const originalGetSigners = ethersRuntime.getSigners;
20
+ const originalGetSigner = ethersRuntime.getSigner;
21
+ const originalProviderGetSigner = ethersRuntime.provider.getSigner;
22
+ let cachedKey;
23
+ let cachedSigner;
24
+ const readCustodyCredential = () => {
25
+ if (env.GATE_MIGRATION_READ_ONLY?.trim() === '1') {
26
+ return undefined;
27
+ }
28
+ const credential = resolveWalletCredential(env);
29
+ return credential?.kind === 'custody' ? credential : undefined;
30
+ };
31
+ const getCustodySigner = (credential) => {
32
+ const baseUrl = env.CUSTODY_API_BASE_URL?.trim();
33
+ if (!baseUrl) {
34
+ throw new Error('托管钱包模式必须配置 CUSTODY_API_BASE_URL');
35
+ }
36
+ const credentialValue = `custody:${credential.secret}:${credential.address}`;
37
+ const cacheKey = `${credentialValue}\n${baseUrl}`;
38
+ if (cachedSigner !== undefined && cachedKey === cacheKey) {
39
+ return cachedSigner;
40
+ }
41
+ cachedSigner = createSigner({
42
+ ethers: ethersRuntime,
43
+ credential: credentialValue,
44
+ provider: ethersRuntime.provider,
45
+ baseUrl,
46
+ fetchImpl: options.fetchImpl,
47
+ });
48
+ cachedKey = cacheKey;
49
+ const major = detectEthersMajor(ethersRuntime);
50
+ logger(`[gate-evm-tools] custody signer enabled (ethers v${major}, ${credential.address})`);
51
+ return cachedSigner;
52
+ };
53
+ ethersRuntime.getSigners = async (...args) => {
54
+ const credential = readCustodyCredential();
55
+ if (credential === undefined) {
56
+ return originalGetSigners.apply(ethersRuntime, args);
57
+ }
58
+ return [getCustodySigner(credential)];
59
+ };
60
+ ethersRuntime.getSigner = async (...args) => {
61
+ const credential = readCustodyCredential();
62
+ const requestedAddress = args[0];
63
+ if (credential !== undefined &&
64
+ typeof requestedAddress === 'string' &&
65
+ addressesMatch(ethersRuntime, credential.address, requestedAddress)) {
66
+ return getCustodySigner(credential);
67
+ }
68
+ return originalGetSigner.apply(ethersRuntime, args);
69
+ };
70
+ ethersRuntime.provider.getSigner = (...args) => {
71
+ const credential = readCustodyCredential();
72
+ const requestedAccount = args[0];
73
+ if (credential !== undefined &&
74
+ (requestedAccount === undefined ||
75
+ requestedAccount === null ||
76
+ requestedAccount === 0 ||
77
+ (typeof requestedAccount === 'string' &&
78
+ addressesMatch(ethersRuntime, credential.address, requestedAccount)))) {
79
+ const signer = getCustodySigner(credential);
80
+ return detectEthersMajor(ethersRuntime) === 6
81
+ ? Promise.resolve(signer)
82
+ : signer;
83
+ }
84
+ return originalProviderGetSigner.apply(ethersRuntime.provider, args);
85
+ };
86
+ installedEnvironments.add(hre);
87
+ }
88
+ function addressesMatch(ethersRuntime, first, second) {
89
+ try {
90
+ const major = detectEthersMajor(ethersRuntime);
91
+ const getAddress = major === 6 ? ethersRuntime.getAddress : ethersRuntime.utils?.getAddress;
92
+ if (typeof getAddress !== 'function') {
93
+ return first.toLowerCase() === second.toLowerCase();
94
+ }
95
+ return getAddress(first) === getAddress(second);
96
+ }
97
+ catch {
98
+ return false;
99
+ }
100
+ }
101
+ //# sourceMappingURL=hardhat-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hardhat-runtime.js","sourceRoot":"","sources":["../../src/custody/hardhat-runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { installCustodyHardhatRuntime, type InstallCustodyHardhatRuntimeOptions, } from './hardhat-runtime.js';
2
+ export { parseWalletCredential, resolveHardhatAccounts, resolveWalletCredential, type ParsedWalletCredential, } from './credential.js';
3
+ //# sourceMappingURL=hardhat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hardhat.d.ts","sourceRoot":"","sources":["../../src/custody/hardhat.ts"],"names":[],"mappings":"AAQA,OAAO,EACL,4BAA4B,EAC5B,KAAK,mCAAmC,GACzC,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,uBAAuB,EACvB,KAAK,sBAAsB,GAC5B,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { extendEnvironment } from 'hardhat/config.js';
2
+ import { installCustodyHardhatRuntime } from './hardhat-runtime.js';
3
+ extendEnvironment((hre) => {
4
+ installCustodyHardhatRuntime(hre);
5
+ });
6
+ export { installCustodyHardhatRuntime, } from './hardhat-runtime.js';
7
+ export { parseWalletCredential, resolveHardhatAccounts, resolveWalletCredential, } from './credential.js';
8
+ //# sourceMappingURL=hardhat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hardhat.js","sourceRoot":"","sources":["../../src/custody/hardhat.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD,OAAO,EAAE,4BAA4B,EAAE,MAAM,sBAAsB,CAAC;AAEpE,iBAAiB,CAAC,CAAC,GAAG,EAAE,EAAE;IACxB,4BAA4B,CAAC,GAAU,CAAC,CAAC;AAC3C,CAAC,CAAC,CAAC;AAEH,OAAO,EACL,4BAA4B,GAE7B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,uBAAuB,GAExB,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,6 @@
1
+ export { PRIVATE_KEY_PATTERN, PROJECT_SECRET_PATTERN, parseWalletCredential, resolveHardhatAccounts, resolveWalletCredential, type CustodyCredential, type ParsedWalletCredential, type PrivateKeyCredential, } from './credential.js';
2
+ export { detectEthersMajor } from './version.js';
3
+ export { createSigner, type CreateSignerOptions } from './signer.js';
4
+ export { CustodyServiceClient, type CustodyServiceClientOptions, } from './service.js';
5
+ export { installCustodyHardhatRuntime, type InstallCustodyHardhatRuntimeOptions, } from './hardhat-runtime.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/custody/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,sBAAsB,EACtB,qBAAqB,EACrB,sBAAsB,EACtB,uBAAuB,EACvB,KAAK,iBAAiB,EACtB,KAAK,sBAAsB,EAC3B,KAAK,oBAAoB,GAC1B,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,KAAK,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACrE,OAAO,EACL,oBAAoB,EACpB,KAAK,2BAA2B,GACjC,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,4BAA4B,EAC5B,KAAK,mCAAmC,GACzC,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,6 @@
1
+ export { PRIVATE_KEY_PATTERN, PROJECT_SECRET_PATTERN, parseWalletCredential, resolveHardhatAccounts, resolveWalletCredential, } from './credential.js';
2
+ export { detectEthersMajor } from './version.js';
3
+ export { createSigner } from './signer.js';
4
+ export { CustodyServiceClient, } from './service.js';
5
+ export { installCustodyHardhatRuntime, } from './hardhat-runtime.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/custody/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,sBAAsB,EACtB,qBAAqB,EACrB,sBAAsB,EACtB,uBAAuB,GAIxB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,YAAY,EAA4B,MAAM,aAAa,CAAC;AACrE,OAAO,EACL,oBAAoB,GAErB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,4BAA4B,GAE7B,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,16 @@
1
+ export type JsonObject = Record<string, unknown>;
2
+ export type CustodyServiceClientOptions = {
3
+ credential: string;
4
+ address: string;
5
+ baseUrl?: string;
6
+ fetchImpl?: typeof fetch;
7
+ };
8
+ export declare class CustodyServiceClient {
9
+ #private;
10
+ constructor(options: CustodyServiceClientOptions);
11
+ signTransaction(body: JsonObject): Promise<JsonObject>;
12
+ signMessage(body: JsonObject): Promise<JsonObject>;
13
+ signTypedData(body: JsonObject): Promise<JsonObject>;
14
+ }
15
+ export declare function requireResponseString(payload: JsonObject, field: string): string;
16
+ //# sourceMappingURL=service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/custody/service.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEjD,MAAM,MAAM,2BAA2B,GAAG;IACxC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B,CAAC;AAEF,qBAAa,oBAAoB;;gBAMnB,OAAO,EAAE,2BAA2B;IAWhD,eAAe,CAAC,IAAI,EAAE,UAAU;IAIhC,WAAW,CAAC,IAAI,EAAE,UAAU;IAI5B,aAAa,CAAC,IAAI,EAAE,UAAU;CA+B/B;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAMhF"}
@@ -0,0 +1,100 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ export class CustodyServiceClient {
3
+ #credential;
4
+ #address;
5
+ #baseUrl;
6
+ #fetchImpl;
7
+ constructor(options) {
8
+ this.#credential = options.credential;
9
+ this.#address = options.address;
10
+ this.#baseUrl = normalizeBaseUrl(options.baseUrl);
11
+ this.#fetchImpl = options.fetchImpl ?? globalThis.fetch;
12
+ if (typeof this.#fetchImpl !== 'function') {
13
+ throw new Error('当前运行环境不支持 fetch,请显式传入 fetchImpl');
14
+ }
15
+ }
16
+ signTransaction(body) {
17
+ return this.#post('sign-transaction', body);
18
+ }
19
+ signMessage(body) {
20
+ return this.#post('sign-message', body);
21
+ }
22
+ signTypedData(body) {
23
+ return this.#post('sign-typed-data', body);
24
+ }
25
+ async #post(operation, body) {
26
+ const path = `/api/custody/wallets/${encodeURIComponent(this.#address)}/${operation}`;
27
+ let response;
28
+ try {
29
+ response = await this.#fetchImpl(`${this.#baseUrl}${path}`, {
30
+ method: 'POST',
31
+ headers: {
32
+ 'content-type': 'application/json',
33
+ authorization: `Bearer ${this.#credential}`,
34
+ 'idempotency-key': randomUUID(),
35
+ },
36
+ body: stringifyJson(body),
37
+ });
38
+ }
39
+ catch (error) {
40
+ throw new Error('无法连接托管签名服务', { cause: error });
41
+ }
42
+ const payload = await readJsonResponse(response);
43
+ if (!response.ok) {
44
+ const message = typeof payload.error === 'string'
45
+ ? payload.error
46
+ : `托管签名请求失败(HTTP ${response.status})`;
47
+ throw new Error(message);
48
+ }
49
+ return payload;
50
+ }
51
+ }
52
+ export function requireResponseString(payload, field) {
53
+ const value = payload[field];
54
+ if (typeof value !== 'string' || value.length === 0) {
55
+ throw new Error(`托管服务响应缺少 ${field}`);
56
+ }
57
+ return value;
58
+ }
59
+ async function readJsonResponse(response) {
60
+ let payload;
61
+ try {
62
+ payload = await response.json();
63
+ }
64
+ catch {
65
+ throw new Error(`托管签名服务返回了无效 JSON(HTTP ${response.status})`);
66
+ }
67
+ if (typeof payload !== 'object' || payload === null || Array.isArray(payload)) {
68
+ throw new Error(`托管签名服务返回了无效响应(HTTP ${response.status})`);
69
+ }
70
+ return payload;
71
+ }
72
+ function normalizeBaseUrl(baseUrl) {
73
+ if (baseUrl === undefined || baseUrl.trim() === '') {
74
+ return '';
75
+ }
76
+ const normalized = baseUrl.trim();
77
+ if (normalized.includes('?') || normalized.includes('#')) {
78
+ throw invalidBaseUrl();
79
+ }
80
+ let parsed;
81
+ try {
82
+ parsed = new URL(normalized);
83
+ }
84
+ catch {
85
+ throw invalidBaseUrl();
86
+ }
87
+ if ((parsed.protocol !== 'http:' && parsed.protocol !== 'https:') ||
88
+ parsed.username !== '' ||
89
+ parsed.password !== '') {
90
+ throw invalidBaseUrl();
91
+ }
92
+ return normalized.replace(/\/+$/, '');
93
+ }
94
+ function invalidBaseUrl() {
95
+ return new Error('CUSTODY_API_BASE_URL 必须是无账号、查询参数和片段的 HTTP(S) 地址');
96
+ }
97
+ function stringifyJson(value) {
98
+ return JSON.stringify(value, (_key, fieldValue) => typeof fieldValue === 'bigint' ? fieldValue.toString() : fieldValue);
99
+ }
100
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/custody/service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ type EthersRuntime = Record<string, any> & {
2
+ version?: unknown;
3
+ };
4
+ export type CreateSignerOptions = {
5
+ ethers: EthersRuntime;
6
+ credential: string;
7
+ provider?: any;
8
+ baseUrl?: string;
9
+ fetchImpl?: typeof fetch;
10
+ };
11
+ export declare function createSigner(options: CreateSignerOptions): any;
12
+ export {};
13
+ //# sourceMappingURL=signer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signer.d.ts","sourceRoot":"","sources":["../../src/custody/signer.ts"],"names":[],"mappings":"AASA,KAAK,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAEjE,MAAM,MAAM,mBAAmB,GAAG;IAChC,MAAM,EAAE,aAAa,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,GAAG,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B,CAAC;AAEF,wBAAgB,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,GAAG,CAyB9D"}