@blindmarket/sdk 0.1.4

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 (244) hide show
  1. package/README.md +72 -0
  2. package/biome.json +19 -0
  3. package/dist/BlindEscrowClient-CyPuKMge.d.cts +54 -0
  4. package/dist/BlindEscrowClient-R7iGpE-n.d.ts +54 -0
  5. package/dist/KeyStore-Be_SSpCt.d.cts +21 -0
  6. package/dist/KeyStore-k1JgYPJY.d.ts +21 -0
  7. package/dist/Signer-BnqH_qew.d.cts +38 -0
  8. package/dist/Signer-LColE0Uo.d.ts +38 -0
  9. package/dist/Storage-4QOrh7rm.d.ts +17 -0
  10. package/dist/Storage-Cf4IJRMk.d.cts +17 -0
  11. package/dist/TaskRegistryClient-Ch6lYqM_.d.ts +24 -0
  12. package/dist/TaskRegistryClient-CrQjddDc.d.cts +24 -0
  13. package/dist/aes-J-7HrHze.d.cts +17 -0
  14. package/dist/aes-J-7HrHze.d.ts +17 -0
  15. package/dist/agent/Agent.d.ts +59 -0
  16. package/dist/agent/Agent.js +73 -0
  17. package/dist/agent/index.cjs +425 -0
  18. package/dist/agent/index.cjs.map +1 -0
  19. package/dist/agent/index.d.cts +63 -0
  20. package/dist/agent/index.d.ts +1 -0
  21. package/dist/agent/index.js +1 -0
  22. package/dist/agent/index.js.map +1 -0
  23. package/dist/api/index.cjs +4 -0
  24. package/dist/api/index.cjs.map +1 -0
  25. package/dist/api/index.d.cts +2 -0
  26. package/dist/api/index.d.ts +1 -0
  27. package/dist/api/index.js +1 -0
  28. package/dist/api/index.js.map +1 -0
  29. package/dist/chain/BlindEscrowClient.d.ts +51 -0
  30. package/dist/chain/BlindEscrowClient.js +142 -0
  31. package/dist/chain/BlindReputationClient.d.ts +16 -0
  32. package/dist/chain/BlindReputationClient.js +45 -0
  33. package/dist/chain/ChainClient.d.ts +26 -0
  34. package/dist/chain/ChainClient.js +46 -0
  35. package/dist/chain/TaskRegistryClient.d.ts +21 -0
  36. package/dist/chain/TaskRegistryClient.js +70 -0
  37. package/dist/chain/abi/BlindEscrow.json +1113 -0
  38. package/dist/chain/abi/BlindReputation.json +447 -0
  39. package/dist/chain/abi/TaskRegistry.json +586 -0
  40. package/dist/chain/abi/index.d.ts +4 -0
  41. package/dist/chain/abi/index.js +4 -0
  42. package/dist/chain/errors.d.ts +8 -0
  43. package/dist/chain/errors.js +32 -0
  44. package/dist/chain/index.cjs +2484 -0
  45. package/dist/chain/index.cjs.map +1 -0
  46. package/dist/chain/index.d.cts +2305 -0
  47. package/dist/chain/index.d.ts +6 -0
  48. package/dist/chain/index.js +6 -0
  49. package/dist/chain/index.js.map +1 -0
  50. package/dist/compute/index.cjs +4 -0
  51. package/dist/compute/index.cjs.map +1 -0
  52. package/dist/compute/index.d.cts +2 -0
  53. package/dist/compute/index.d.ts +1 -0
  54. package/dist/compute/index.js +1 -0
  55. package/dist/compute/index.js.map +1 -0
  56. package/dist/crypto/aes.d.ts +15 -0
  57. package/dist/crypto/aes.js +81 -0
  58. package/dist/crypto/constants.d.ts +7 -0
  59. package/dist/crypto/constants.js +7 -0
  60. package/dist/crypto/ecies.d.ts +8 -0
  61. package/dist/crypto/ecies.js +51 -0
  62. package/dist/crypto/envelope.d.ts +35 -0
  63. package/dist/crypto/envelope.js +103 -0
  64. package/dist/crypto/hkdf.d.ts +5 -0
  65. package/dist/crypto/hkdf.js +34 -0
  66. package/dist/crypto/index.cjs +424 -0
  67. package/dist/crypto/index.cjs.map +1 -0
  68. package/dist/crypto/index.d.cts +74 -0
  69. package/dist/crypto/index.d.ts +6 -0
  70. package/dist/crypto/index.js +6 -0
  71. package/dist/crypto/index.js.map +1 -0
  72. package/dist/crypto/keys.d.ts +12 -0
  73. package/dist/crypto/keys.js +42 -0
  74. package/dist/errors/BlindBountyError.d.ts +14 -0
  75. package/dist/errors/BlindBountyError.js +30 -0
  76. package/dist/errors/codes.d.ts +19 -0
  77. package/dist/errors/codes.js +48 -0
  78. package/dist/errors/index.cjs +136 -0
  79. package/dist/errors/index.cjs.map +1 -0
  80. package/dist/errors/index.d.cts +60 -0
  81. package/dist/errors/index.d.ts +3 -0
  82. package/dist/errors/index.js +3 -0
  83. package/dist/errors/index.js.map +1 -0
  84. package/dist/errors/subclasses.d.ts +26 -0
  85. package/dist/errors/subclasses.js +41 -0
  86. package/dist/events/EventBus.d.ts +13 -0
  87. package/dist/events/EventBus.js +41 -0
  88. package/dist/events/index.cjs +41 -0
  89. package/dist/events/index.cjs.map +1 -0
  90. package/dist/events/index.d.cts +61 -0
  91. package/dist/events/index.d.ts +2 -0
  92. package/dist/events/index.js +2 -0
  93. package/dist/events/index.js.map +1 -0
  94. package/dist/events/types.d.ts +45 -0
  95. package/dist/events/types.js +1 -0
  96. package/dist/index.cjs +4 -0
  97. package/dist/index.cjs.map +1 -0
  98. package/dist/index.d.cts +2 -0
  99. package/dist/index.d.ts +129 -0
  100. package/dist/index.js +154 -0
  101. package/dist/index.js.map +1 -0
  102. package/dist/keystore/InMemoryKeyStore.d.ts +21 -0
  103. package/dist/keystore/InMemoryKeyStore.js +111 -0
  104. package/dist/keystore/KeyStore.d.ts +18 -0
  105. package/dist/keystore/KeyStore.js +1 -0
  106. package/dist/keystore/index.cjs +335 -0
  107. package/dist/keystore/index.cjs.map +1 -0
  108. package/dist/keystore/index.d.cts +23 -0
  109. package/dist/keystore/index.d.ts +2 -0
  110. package/dist/keystore/index.js +2 -0
  111. package/dist/keystore/index.js.map +1 -0
  112. package/dist/network/index.cjs +74 -0
  113. package/dist/network/index.cjs.map +1 -0
  114. package/dist/network/index.d.cts +36 -0
  115. package/dist/network/index.d.ts +3 -0
  116. package/dist/network/index.js +3 -0
  117. package/dist/network/index.js.map +1 -0
  118. package/dist/network/presets.d.ts +24 -0
  119. package/dist/network/presets.js +23 -0
  120. package/dist/network/resolve.d.ts +7 -0
  121. package/dist/network/resolve.js +17 -0
  122. package/dist/network/types.d.ts +16 -0
  123. package/dist/network/types.js +1 -0
  124. package/dist/signer/EthersSigner.d.ts +24 -0
  125. package/dist/signer/EthersSigner.js +68 -0
  126. package/dist/signer/PrivateKeySigner.d.ts +14 -0
  127. package/dist/signer/PrivateKeySigner.js +18 -0
  128. package/dist/signer/Signer.d.ts +35 -0
  129. package/dist/signer/Signer.js +1 -0
  130. package/dist/signer/index.cjs +121 -0
  131. package/dist/signer/index.cjs.map +1 -0
  132. package/dist/signer/index.d.cts +40 -0
  133. package/dist/signer/index.d.ts +3 -0
  134. package/dist/signer/index.js +3 -0
  135. package/dist/signer/index.js.map +1 -0
  136. package/dist/storage/MemoryStorage.d.ts +18 -0
  137. package/dist/storage/MemoryStorage.js +40 -0
  138. package/dist/storage/Storage.d.ts +14 -0
  139. package/dist/storage/Storage.js +1 -0
  140. package/dist/storage/ZgStorage.d.ts +24 -0
  141. package/dist/storage/ZgStorage.js +102 -0
  142. package/dist/storage/index.cjs +221 -0
  143. package/dist/storage/index.cjs.map +1 -0
  144. package/dist/storage/index.d.cts +44 -0
  145. package/dist/storage/index.d.ts +3 -0
  146. package/dist/storage/index.js +3 -0
  147. package/dist/storage/index.js.map +1 -0
  148. package/dist/testing/index.cjs +4 -0
  149. package/dist/testing/index.cjs.map +1 -0
  150. package/dist/testing/index.d.cts +2 -0
  151. package/dist/testing/index.d.ts +1 -0
  152. package/dist/testing/index.js +1 -0
  153. package/dist/testing/index.js.map +1 -0
  154. package/dist/types-BOG5Ub1z.d.cts +31 -0
  155. package/dist/types-BOG5Ub1z.d.ts +31 -0
  156. package/dist/types-V7_ZmUb-.d.cts +19 -0
  157. package/dist/types-hAsITUQ7.d.ts +19 -0
  158. package/dist/types.d.ts +58 -0
  159. package/dist/types.js +1 -0
  160. package/dist/verifier/index.cjs +4 -0
  161. package/dist/verifier/index.cjs.map +1 -0
  162. package/dist/verifier/index.d.cts +2 -0
  163. package/dist/verifier/index.d.ts +1 -0
  164. package/dist/verifier/index.js +1 -0
  165. package/dist/verifier/index.js.map +1 -0
  166. package/dist/worker/Worker.d.ts +53 -0
  167. package/dist/worker/Worker.js +53 -0
  168. package/dist/worker/index.cjs +382 -0
  169. package/dist/worker/index.cjs.map +1 -0
  170. package/dist/worker/index.d.cts +58 -0
  171. package/dist/worker/index.d.ts +1 -0
  172. package/dist/worker/index.js +1 -0
  173. package/dist/worker/index.js.map +1 -0
  174. package/examples/agent-demo.ts +121 -0
  175. package/package.json +46 -0
  176. package/scripts/gen-crypto-fixtures.mjs +72 -0
  177. package/src/agent/Agent.ts +122 -0
  178. package/src/agent/index.ts +1 -0
  179. package/src/api/index.ts +1 -0
  180. package/src/chain/BlindEscrowClient.ts +182 -0
  181. package/src/chain/BlindReputationClient.ts +55 -0
  182. package/src/chain/ChainClient.ts +59 -0
  183. package/src/chain/TaskRegistryClient.ts +82 -0
  184. package/src/chain/abi/BlindEscrow.json +1113 -0
  185. package/src/chain/abi/BlindReputation.json +447 -0
  186. package/src/chain/abi/TaskRegistry.json +586 -0
  187. package/src/chain/abi/index.ts +5 -0
  188. package/src/chain/errors.ts +43 -0
  189. package/src/chain/index.ts +6 -0
  190. package/src/compute/index.ts +1 -0
  191. package/src/crypto/aes.ts +104 -0
  192. package/src/crypto/constants.ts +7 -0
  193. package/src/crypto/ecies.ts +60 -0
  194. package/src/crypto/envelope.ts +131 -0
  195. package/src/crypto/hkdf.ts +45 -0
  196. package/src/crypto/index.ts +6 -0
  197. package/src/crypto/keys.ts +56 -0
  198. package/src/errors/BlindMarketError.ts +38 -0
  199. package/src/errors/codes.ts +67 -0
  200. package/src/errors/index.ts +3 -0
  201. package/src/errors/subclasses.ts +59 -0
  202. package/src/events/EventBus.ts +45 -0
  203. package/src/events/index.ts +2 -0
  204. package/src/events/types.ts +13 -0
  205. package/src/index.ts +222 -0
  206. package/src/keystore/InMemoryKeyStore.ts +146 -0
  207. package/src/keystore/KeyStore.ts +19 -0
  208. package/src/keystore/index.ts +2 -0
  209. package/src/network/index.ts +3 -0
  210. package/src/network/presets.ts +27 -0
  211. package/src/network/resolve.ts +19 -0
  212. package/src/network/types.ts +18 -0
  213. package/src/signer/EthersSigner.ts +82 -0
  214. package/src/signer/PrivateKeySigner.ts +19 -0
  215. package/src/signer/Signer.ts +40 -0
  216. package/src/signer/index.ts +3 -0
  217. package/src/storage/MemoryStorage.ts +49 -0
  218. package/src/storage/Storage.ts +15 -0
  219. package/src/storage/ZgStorage.ts +124 -0
  220. package/src/storage/index.ts +3 -0
  221. package/src/testing/index.ts +1 -0
  222. package/src/types.ts +76 -0
  223. package/src/verifier/index.ts +1 -0
  224. package/src/worker/Worker.ts +98 -0
  225. package/src/worker/index.ts +1 -0
  226. package/test/agent.test.ts +193 -0
  227. package/test/chain.test.ts +145 -0
  228. package/test/crypto.aes.test.ts +81 -0
  229. package/test/crypto.compat.test.ts +33 -0
  230. package/test/crypto.ecies.test.ts +64 -0
  231. package/test/envelope.test.ts +82 -0
  232. package/test/errors.test.ts +64 -0
  233. package/test/events.test.ts +59 -0
  234. package/test/fixtures/crypto.json +16 -0
  235. package/test/keystore.test.ts +103 -0
  236. package/test/network.test.ts +53 -0
  237. package/test/signer.test.ts +66 -0
  238. package/test/smoke.test.ts +7 -0
  239. package/test/storage.test.ts +55 -0
  240. package/test/worker.test.ts +181 -0
  241. package/tsconfig.build.json +1 -0
  242. package/tsconfig.json +13 -0
  243. package/tsup.config.ts +32 -0
  244. package/vitest.config.ts +17 -0
@@ -0,0 +1,74 @@
1
+ 'use strict';
2
+
3
+ // src/network/presets.ts
4
+ var networks = {
5
+ testnet: {
6
+ name: "0g-galileo-testnet",
7
+ chainId: 16602n,
8
+ rpc: ["https://evmrpc-testnet.0g.ai"],
9
+ contracts: {
10
+ escrow: "0xFd4F93F5A7BE144c405D1D8fbEC63Fb776207681",
11
+ registry: "0xeE52d780A47F77E8a4a1cEb236e3C65A48FbD828",
12
+ reputation: "0x4A6374Fae37E19E69ba43E7cf6994AC15F63256e",
13
+ usdc: "0x317227efcA18D004E12CA8046AEf7E1597458F25"
14
+ },
15
+ indexer: "https://indexer-storage-testnet-turbo.0g.ai",
16
+ broker: "https://broker.testnet.0g.ai",
17
+ explorer: "https://chainscan-galileo.0g.ai"
18
+ }
19
+ };
20
+
21
+ // src/errors/BlindBountyError.ts
22
+ var BlindBountyError = class extends Error {
23
+ code;
24
+ retriable;
25
+ context;
26
+ cause;
27
+ constructor(code, message, opts = {}) {
28
+ super(message);
29
+ this.code = code;
30
+ this.retriable = opts.retriable ?? false;
31
+ if (opts.context !== void 0) this.context = opts.context;
32
+ if (opts.cause !== void 0) this.cause = opts.cause;
33
+ Object.defineProperty(this, "name", {
34
+ value: this.constructor.name,
35
+ enumerable: false,
36
+ configurable: true,
37
+ writable: true
38
+ });
39
+ }
40
+ toJSON() {
41
+ return {
42
+ name: this.name,
43
+ code: this.code,
44
+ message: this.message,
45
+ retriable: this.retriable,
46
+ ...this.context ? { context: this.context } : {}
47
+ };
48
+ }
49
+ };
50
+
51
+ // src/errors/subclasses.ts
52
+ var ConfigError = class extends BlindBountyError {
53
+ constructor(code, msg, opts) {
54
+ super(code, msg, opts);
55
+ }
56
+ };
57
+
58
+ // src/network/resolve.ts
59
+ function resolveNetwork(arg) {
60
+ if (typeof arg === "string") {
61
+ const preset = networks[arg];
62
+ if (!preset) {
63
+ const known = Object.keys(networks).join(", ");
64
+ throw new ConfigError("CONFIG/INVALID_NETWORK", `unknown network '${arg}' (known: ${known})`);
65
+ }
66
+ return preset;
67
+ }
68
+ return arg;
69
+ }
70
+
71
+ exports.networks = networks;
72
+ exports.resolveNetwork = resolveNetwork;
73
+ //# sourceMappingURL=index.cjs.map
74
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/network/presets.ts","../../src/errors/BlindBountyError.ts","../../src/errors/subclasses.ts","../../src/network/resolve.ts"],"names":[],"mappings":";;;AASO,IAAM,QAAA,GAAW;AAAA,EACtB,OAAA,EAAS;AAAA,IACP,IAAA,EAAM,oBAAA;AAAA,IACN,OAAA,EAAS,MAAA;AAAA,IACT,GAAA,EAAK,CAAC,8BAA8B,CAAA;AAAA,IACpC,SAAA,EAAW;AAAA,MACT,MAAA,EAAQ,4CAAA;AAAA,MACR,QAAA,EAAU,4CAAA;AAAA,MACV,UAAA,EAAY,4CAAA;AAAA,MACZ,IAAA,EAAM;AAAA,KACR;AAAA,IACA,OAAA,EAAS,6CAAA;AAAA,IACT,MAAA,EAAQ,8BAAA;AAAA,IACR,QAAA,EAAU;AAAA;AAEd;;;AChBO,IAAe,gBAAA,GAAf,cAAwC,KAAA,CAAM;AAAA,EAC1C,IAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACS,KAAA;AAAA,EAElB,WAAA,CAAY,IAAA,EAAiB,OAAA,EAAiB,IAAA,GAAqB,EAAC,EAAG;AACrE,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,SAAA,GAAY,KAAK,SAAA,IAAa,KAAA;AACnC,IAAA,IAAI,IAAA,CAAK,OAAA,KAAY,MAAA,EAAW,IAAA,CAAK,UAAU,IAAA,CAAK,OAAA;AACpD,IAAA,IAAI,IAAA,CAAK,KAAA,KAAU,MAAA,EAAW,IAAA,CAAK,QAAQ,IAAA,CAAK,KAAA;AAChD,IAAA,MAAA,CAAO,cAAA,CAAe,MAAM,MAAA,EAAQ;AAAA,MAClC,KAAA,EAAO,KAAK,WAAA,CAAY,IAAA;AAAA,MACxB,UAAA,EAAY,KAAA;AAAA,MACZ,YAAA,EAAc,IAAA;AAAA,MACd,QAAA,EAAU;AAAA,KACX,CAAA;AAAA,EACH;AAAA,EAEA,MAAA,GAAkC;AAChC,IAAA,OAAO;AAAA,MACL,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,GAAI,KAAK,OAAA,GAAU,EAAE,SAAS,IAAA,CAAK,OAAA,KAAY;AAAC,KAClD;AAAA,EACF;AACF,CAAA;;;ACzBO,IAAM,WAAA,GAAN,cAA0B,gBAAA,CAAiB;AAAA,EAChD,WAAA,CAAY,IAAA,EAAkB,GAAA,EAAa,IAAA,EAAqB;AAC9D,IAAA,KAAA,CAAM,IAAA,EAAM,KAAK,IAAI,CAAA;AAAA,EACvB;AACF,CAAA;;;ACRO,SAAS,eAAe,GAAA,EAAqC;AAClE,EAAA,IAAI,OAAO,QAAQ,QAAA,EAAU;AAC3B,IAAA,MAAM,MAAA,GAAU,SAAiD,GAAG,CAAA;AACpE,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,QAAQ,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA,CAAE,KAAK,IAAI,CAAA;AAC7C,MAAA,MAAM,IAAI,WAAA,CAAY,wBAAA,EAA0B,oBAAoB,GAAG,CAAA,UAAA,EAAa,KAAK,CAAA,CAAA,CAAG,CAAA;AAAA,IAC9F;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAO,GAAA;AACT","file":"index.cjs","sourcesContent":["import type { Network } from './types.js';\n\n/**\n * Known-good network presets. Addresses pinned per SDK version so upgrading\n * the SDK cannot silently move contracts under a consumer.\n *\n * testnet = 0G Galileo (chainId 16602) — addresses from\n * contracts/deployments/0g-testnet.json (deployed 2026-04-15).\n */\nexport const networks = {\n testnet: {\n name: '0g-galileo-testnet',\n chainId: 16602n,\n rpc: ['https://evmrpc-testnet.0g.ai'],\n contracts: {\n escrow: '0xFd4F93F5A7BE144c405D1D8fbEC63Fb776207681',\n registry: '0xeE52d780A47F77E8a4a1cEb236e3C65A48FbD828',\n reputation: '0x4A6374Fae37E19E69ba43E7cf6994AC15F63256e',\n usdc: '0x317227efcA18D004E12CA8046AEf7E1597458F25',\n },\n indexer: 'https://indexer-storage-testnet-turbo.0g.ai',\n broker: 'https://broker.testnet.0g.ai',\n explorer: 'https://chainscan-galileo.0g.ai',\n },\n} as const satisfies Record<string, Network>;\n\nexport type NetworkName = keyof typeof networks;\n","import type { ErrorCode } from './codes.js';\n\nexport interface ErrorOptions {\n retriable?: boolean;\n context?: Record<string, unknown>;\n cause?: unknown;\n}\n\nexport abstract class BlindBountyError extends Error {\n readonly code: ErrorCode;\n readonly retriable: boolean;\n readonly context?: Record<string, unknown>;\n override readonly cause?: unknown;\n\n constructor(code: ErrorCode, message: string, opts: ErrorOptions = {}) {\n super(message);\n this.code = code;\n this.retriable = opts.retriable ?? false;\n if (opts.context !== undefined) this.context = opts.context;\n if (opts.cause !== undefined) this.cause = opts.cause;\n Object.defineProperty(this, 'name', {\n value: this.constructor.name,\n enumerable: false,\n configurable: true,\n writable: true,\n });\n }\n\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n code: this.code,\n message: this.message,\n retriable: this.retriable,\n ...(this.context ? { context: this.context } : {}),\n };\n }\n}\n","import { BlindBountyError, type ErrorOptions } from './BlindBountyError.js';\nimport type {\n ApiCode,\n ChainCode,\n ComputeCode,\n ConfigCode,\n CryptoCode,\n LifecycleCode,\n StorageCode,\n TimeoutCode,\n} from './codes.js';\n\nexport class ConfigError extends BlindBountyError {\n constructor(code: ConfigCode, msg: string, opts?: ErrorOptions) {\n super(code, msg, opts);\n }\n}\n\nexport class CryptoError extends BlindBountyError {\n constructor(code: CryptoCode, msg: string, opts?: ErrorOptions) {\n super(code, msg, opts);\n }\n}\n\nexport class StorageError extends BlindBountyError {\n constructor(code: StorageCode, msg: string, opts?: ErrorOptions) {\n super(code, msg, opts);\n }\n}\n\nexport class ChainError extends BlindBountyError {\n constructor(code: ChainCode, msg: string, opts?: ErrorOptions) {\n super(code, msg, opts);\n }\n}\n\nexport class ComputeError extends BlindBountyError {\n constructor(code: ComputeCode, msg: string, opts?: ErrorOptions) {\n super(code, msg, opts);\n }\n}\n\nexport class ApiError extends BlindBountyError {\n constructor(code: ApiCode, msg: string, opts?: ErrorOptions) {\n super(code, msg, opts);\n }\n}\n\nexport class LifecycleError extends BlindBountyError {\n constructor(code: LifecycleCode, msg: string, opts?: ErrorOptions) {\n super(code, msg, opts);\n }\n}\n\nexport class TimeoutError extends BlindBountyError {\n constructor(code: TimeoutCode, msg: string, opts?: ErrorOptions) {\n super(code, msg, opts);\n }\n}\n","import { ConfigError } from '../errors/index.js';\nimport { networks, type NetworkName } from './presets.js';\nimport type { Network } from './types.js';\n\n/**\n * Resolve a preset name or a literal Network object into the canonical\n * Network used throughout the SDK. Throws ConfigError for unknown names.\n */\nexport function resolveNetwork(arg: NetworkName | Network): Network {\n if (typeof arg === 'string') {\n const preset = (networks as Record<string, Network | undefined>)[arg];\n if (!preset) {\n const known = Object.keys(networks).join(', ');\n throw new ConfigError('CONFIG/INVALID_NETWORK', `unknown network '${arg}' (known: ${known})`);\n }\n return preset;\n }\n return arg;\n}\n"]}
@@ -0,0 +1,36 @@
1
+ import { N as Network } from '../types-V7_ZmUb-.cjs';
2
+ export { a as NetworkContracts } from '../types-V7_ZmUb-.cjs';
3
+ import '../types-BOG5Ub1z.cjs';
4
+
5
+ /**
6
+ * Known-good network presets. Addresses pinned per SDK version so upgrading
7
+ * the SDK cannot silently move contracts under a consumer.
8
+ *
9
+ * testnet = 0G Galileo (chainId 16602) — addresses from
10
+ * contracts/deployments/0g-testnet.json (deployed 2026-04-15).
11
+ */
12
+ declare const networks: {
13
+ readonly testnet: {
14
+ readonly name: "0g-galileo-testnet";
15
+ readonly chainId: 16602n;
16
+ readonly rpc: ["https://evmrpc-testnet.0g.ai"];
17
+ readonly contracts: {
18
+ readonly escrow: "0xFd4F93F5A7BE144c405D1D8fbEC63Fb776207681";
19
+ readonly registry: "0xeE52d780A47F77E8a4a1cEb236e3C65A48FbD828";
20
+ readonly reputation: "0x4A6374Fae37E19E69ba43E7cf6994AC15F63256e";
21
+ readonly usdc: "0x317227efcA18D004E12CA8046AEf7E1597458F25";
22
+ };
23
+ readonly indexer: "https://indexer-storage-testnet-turbo.0g.ai";
24
+ readonly broker: "https://broker.testnet.0g.ai";
25
+ readonly explorer: "https://chainscan-galileo.0g.ai";
26
+ };
27
+ };
28
+ type NetworkName = keyof typeof networks;
29
+
30
+ /**
31
+ * Resolve a preset name or a literal Network object into the canonical
32
+ * Network used throughout the SDK. Throws ConfigError for unknown names.
33
+ */
34
+ declare function resolveNetwork(arg: NetworkName | Network): Network;
35
+
36
+ export { Network, type NetworkName, networks, resolveNetwork };
@@ -0,0 +1,3 @@
1
+ export * from './types.js';
2
+ export * from './presets.js';
3
+ export * from './resolve.js';
@@ -0,0 +1,3 @@
1
+ export * from './types.js';
2
+ export * from './presets.js';
3
+ export * from './resolve.js';
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/network/presets.ts","../../src/errors/BlindBountyError.ts","../../src/errors/subclasses.ts","../../src/network/resolve.ts"],"names":[],"mappings":";AASO,IAAM,QAAA,GAAW;AAAA,EACtB,OAAA,EAAS;AAAA,IACP,IAAA,EAAM,oBAAA;AAAA,IACN,OAAA,EAAS,MAAA;AAAA,IACT,GAAA,EAAK,CAAC,8BAA8B,CAAA;AAAA,IACpC,SAAA,EAAW;AAAA,MACT,MAAA,EAAQ,4CAAA;AAAA,MACR,QAAA,EAAU,4CAAA;AAAA,MACV,UAAA,EAAY,4CAAA;AAAA,MACZ,IAAA,EAAM;AAAA,KACR;AAAA,IACA,OAAA,EAAS,6CAAA;AAAA,IACT,MAAA,EAAQ,8BAAA;AAAA,IACR,QAAA,EAAU;AAAA;AAEd;;;AChBO,IAAe,gBAAA,GAAf,cAAwC,KAAA,CAAM;AAAA,EAC1C,IAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACS,KAAA;AAAA,EAElB,WAAA,CAAY,IAAA,EAAiB,OAAA,EAAiB,IAAA,GAAqB,EAAC,EAAG;AACrE,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,SAAA,GAAY,KAAK,SAAA,IAAa,KAAA;AACnC,IAAA,IAAI,IAAA,CAAK,OAAA,KAAY,MAAA,EAAW,IAAA,CAAK,UAAU,IAAA,CAAK,OAAA;AACpD,IAAA,IAAI,IAAA,CAAK,KAAA,KAAU,MAAA,EAAW,IAAA,CAAK,QAAQ,IAAA,CAAK,KAAA;AAChD,IAAA,MAAA,CAAO,cAAA,CAAe,MAAM,MAAA,EAAQ;AAAA,MAClC,KAAA,EAAO,KAAK,WAAA,CAAY,IAAA;AAAA,MACxB,UAAA,EAAY,KAAA;AAAA,MACZ,YAAA,EAAc,IAAA;AAAA,MACd,QAAA,EAAU;AAAA,KACX,CAAA;AAAA,EACH;AAAA,EAEA,MAAA,GAAkC;AAChC,IAAA,OAAO;AAAA,MACL,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,GAAI,KAAK,OAAA,GAAU,EAAE,SAAS,IAAA,CAAK,OAAA,KAAY;AAAC,KAClD;AAAA,EACF;AACF,CAAA;;;ACzBO,IAAM,WAAA,GAAN,cAA0B,gBAAA,CAAiB;AAAA,EAChD,WAAA,CAAY,IAAA,EAAkB,GAAA,EAAa,IAAA,EAAqB;AAC9D,IAAA,KAAA,CAAM,IAAA,EAAM,KAAK,IAAI,CAAA;AAAA,EACvB;AACF,CAAA;;;ACRO,SAAS,eAAe,GAAA,EAAqC;AAClE,EAAA,IAAI,OAAO,QAAQ,QAAA,EAAU;AAC3B,IAAA,MAAM,MAAA,GAAU,SAAiD,GAAG,CAAA;AACpE,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,QAAQ,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA,CAAE,KAAK,IAAI,CAAA;AAC7C,MAAA,MAAM,IAAI,WAAA,CAAY,wBAAA,EAA0B,oBAAoB,GAAG,CAAA,UAAA,EAAa,KAAK,CAAA,CAAA,CAAG,CAAA;AAAA,IAC9F;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAO,GAAA;AACT","file":"index.js","sourcesContent":["import type { Network } from './types.js';\n\n/**\n * Known-good network presets. Addresses pinned per SDK version so upgrading\n * the SDK cannot silently move contracts under a consumer.\n *\n * testnet = 0G Galileo (chainId 16602) — addresses from\n * contracts/deployments/0g-testnet.json (deployed 2026-04-15).\n */\nexport const networks = {\n testnet: {\n name: '0g-galileo-testnet',\n chainId: 16602n,\n rpc: ['https://evmrpc-testnet.0g.ai'],\n contracts: {\n escrow: '0xFd4F93F5A7BE144c405D1D8fbEC63Fb776207681',\n registry: '0xeE52d780A47F77E8a4a1cEb236e3C65A48FbD828',\n reputation: '0x4A6374Fae37E19E69ba43E7cf6994AC15F63256e',\n usdc: '0x317227efcA18D004E12CA8046AEf7E1597458F25',\n },\n indexer: 'https://indexer-storage-testnet-turbo.0g.ai',\n broker: 'https://broker.testnet.0g.ai',\n explorer: 'https://chainscan-galileo.0g.ai',\n },\n} as const satisfies Record<string, Network>;\n\nexport type NetworkName = keyof typeof networks;\n","import type { ErrorCode } from './codes.js';\n\nexport interface ErrorOptions {\n retriable?: boolean;\n context?: Record<string, unknown>;\n cause?: unknown;\n}\n\nexport abstract class BlindBountyError extends Error {\n readonly code: ErrorCode;\n readonly retriable: boolean;\n readonly context?: Record<string, unknown>;\n override readonly cause?: unknown;\n\n constructor(code: ErrorCode, message: string, opts: ErrorOptions = {}) {\n super(message);\n this.code = code;\n this.retriable = opts.retriable ?? false;\n if (opts.context !== undefined) this.context = opts.context;\n if (opts.cause !== undefined) this.cause = opts.cause;\n Object.defineProperty(this, 'name', {\n value: this.constructor.name,\n enumerable: false,\n configurable: true,\n writable: true,\n });\n }\n\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n code: this.code,\n message: this.message,\n retriable: this.retriable,\n ...(this.context ? { context: this.context } : {}),\n };\n }\n}\n","import { BlindBountyError, type ErrorOptions } from './BlindBountyError.js';\nimport type {\n ApiCode,\n ChainCode,\n ComputeCode,\n ConfigCode,\n CryptoCode,\n LifecycleCode,\n StorageCode,\n TimeoutCode,\n} from './codes.js';\n\nexport class ConfigError extends BlindBountyError {\n constructor(code: ConfigCode, msg: string, opts?: ErrorOptions) {\n super(code, msg, opts);\n }\n}\n\nexport class CryptoError extends BlindBountyError {\n constructor(code: CryptoCode, msg: string, opts?: ErrorOptions) {\n super(code, msg, opts);\n }\n}\n\nexport class StorageError extends BlindBountyError {\n constructor(code: StorageCode, msg: string, opts?: ErrorOptions) {\n super(code, msg, opts);\n }\n}\n\nexport class ChainError extends BlindBountyError {\n constructor(code: ChainCode, msg: string, opts?: ErrorOptions) {\n super(code, msg, opts);\n }\n}\n\nexport class ComputeError extends BlindBountyError {\n constructor(code: ComputeCode, msg: string, opts?: ErrorOptions) {\n super(code, msg, opts);\n }\n}\n\nexport class ApiError extends BlindBountyError {\n constructor(code: ApiCode, msg: string, opts?: ErrorOptions) {\n super(code, msg, opts);\n }\n}\n\nexport class LifecycleError extends BlindBountyError {\n constructor(code: LifecycleCode, msg: string, opts?: ErrorOptions) {\n super(code, msg, opts);\n }\n}\n\nexport class TimeoutError extends BlindBountyError {\n constructor(code: TimeoutCode, msg: string, opts?: ErrorOptions) {\n super(code, msg, opts);\n }\n}\n","import { ConfigError } from '../errors/index.js';\nimport { networks, type NetworkName } from './presets.js';\nimport type { Network } from './types.js';\n\n/**\n * Resolve a preset name or a literal Network object into the canonical\n * Network used throughout the SDK. Throws ConfigError for unknown names.\n */\nexport function resolveNetwork(arg: NetworkName | Network): Network {\n if (typeof arg === 'string') {\n const preset = (networks as Record<string, Network | undefined>)[arg];\n if (!preset) {\n const known = Object.keys(networks).join(', ');\n throw new ConfigError('CONFIG/INVALID_NETWORK', `unknown network '${arg}' (known: ${known})`);\n }\n return preset;\n }\n return arg;\n}\n"]}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Known-good network presets. Addresses pinned per SDK version so upgrading
3
+ * the SDK cannot silently move contracts under a consumer.
4
+ *
5
+ * testnet = 0G Galileo (chainId 16602) — addresses from
6
+ * contracts/deployments/0g-testnet.json (deployed 2026-04-15).
7
+ */
8
+ export declare const networks: {
9
+ readonly testnet: {
10
+ readonly name: "0g-galileo-testnet";
11
+ readonly chainId: 16602n;
12
+ readonly rpc: ["https://evmrpc-testnet.0g.ai"];
13
+ readonly contracts: {
14
+ readonly escrow: "0xFd4F93F5A7BE144c405D1D8fbEC63Fb776207681";
15
+ readonly registry: "0xeE52d780A47F77E8a4a1cEb236e3C65A48FbD828";
16
+ readonly reputation: "0x4A6374Fae37E19E69ba43E7cf6994AC15F63256e";
17
+ readonly usdc: "0x317227efcA18D004E12CA8046AEf7E1597458F25";
18
+ };
19
+ readonly indexer: "https://indexer-storage-testnet-turbo.0g.ai";
20
+ readonly broker: "https://broker.testnet.0g.ai";
21
+ readonly explorer: "https://chainscan-galileo.0g.ai";
22
+ };
23
+ };
24
+ export type NetworkName = keyof typeof networks;
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Known-good network presets. Addresses pinned per SDK version so upgrading
3
+ * the SDK cannot silently move contracts under a consumer.
4
+ *
5
+ * testnet = 0G Galileo (chainId 16602) — addresses from
6
+ * contracts/deployments/0g-testnet.json (deployed 2026-04-15).
7
+ */
8
+ export const networks = {
9
+ testnet: {
10
+ name: '0g-galileo-testnet',
11
+ chainId: 16602n,
12
+ rpc: ['https://evmrpc-testnet.0g.ai'],
13
+ contracts: {
14
+ escrow: '0xFd4F93F5A7BE144c405D1D8fbEC63Fb776207681',
15
+ registry: '0xeE52d780A47F77E8a4a1cEb236e3C65A48FbD828',
16
+ reputation: '0x4A6374Fae37E19E69ba43E7cf6994AC15F63256e',
17
+ usdc: '0x317227efcA18D004E12CA8046AEf7E1597458F25',
18
+ },
19
+ indexer: 'https://indexer-storage-testnet-turbo.0g.ai',
20
+ broker: 'https://broker.testnet.0g.ai',
21
+ explorer: 'https://chainscan-galileo.0g.ai',
22
+ },
23
+ };
@@ -0,0 +1,7 @@
1
+ import { type NetworkName } from './presets.js';
2
+ import type { Network } from './types.js';
3
+ /**
4
+ * Resolve a preset name or a literal Network object into the canonical
5
+ * Network used throughout the SDK. Throws ConfigError for unknown names.
6
+ */
7
+ export declare function resolveNetwork(arg: NetworkName | Network): Network;
@@ -0,0 +1,17 @@
1
+ import { ConfigError } from '../errors/index.js';
2
+ import { networks } from './presets.js';
3
+ /**
4
+ * Resolve a preset name or a literal Network object into the canonical
5
+ * Network used throughout the SDK. Throws ConfigError for unknown names.
6
+ */
7
+ export function resolveNetwork(arg) {
8
+ if (typeof arg === 'string') {
9
+ const preset = networks[arg];
10
+ if (!preset) {
11
+ const known = Object.keys(networks).join(', ');
12
+ throw new ConfigError('CONFIG/INVALID_NETWORK', `unknown network '${arg}' (known: ${known})`);
13
+ }
14
+ return preset;
15
+ }
16
+ return arg;
17
+ }
@@ -0,0 +1,16 @@
1
+ import type { Address } from '../types.js';
2
+ export interface NetworkContracts {
3
+ escrow: Address;
4
+ registry: Address;
5
+ reputation: Address;
6
+ usdc: Address;
7
+ }
8
+ export interface Network {
9
+ name: string;
10
+ chainId: bigint;
11
+ rpc: string[];
12
+ contracts: NetworkContracts;
13
+ indexer: string;
14
+ broker: string;
15
+ explorer?: string;
16
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,24 @@
1
+ import { ethers } from 'ethers';
2
+ import type { Address, Hex } from '../types.js';
3
+ import type { Signer, TxRequest, TypedDataDomain, TypedDataField } from './Signer.js';
4
+ /**
5
+ * Wraps any ethers v6 Signer. The most common path — accepts ethers.Wallet,
6
+ * ethers.BrowserProvider signer, JsonRpcSigner, etc. Caches the recovered
7
+ * public key after the first successful getPublicKey() call.
8
+ */
9
+ export declare class EthersSigner implements Signer {
10
+ private readonly inner;
11
+ private publicKeyCache;
12
+ constructor(inner: ethers.Signer);
13
+ getAddress(): Promise<Address>;
14
+ chainId(): Promise<bigint>;
15
+ signMessage(msg: string | Uint8Array): Promise<Hex>;
16
+ signTypedData(domain: TypedDataDomain, types: Record<string, TypedDataField[]>, value: Record<string, unknown>): Promise<Hex>;
17
+ signTransaction(tx: TxRequest): Promise<Hex>;
18
+ /**
19
+ * Recovers the uncompressed secp256k1 public key from the signer. For Wallet
20
+ * signers we can read it directly; for generic Signers we sign a canonical
21
+ * probe message once and recover from the signature.
22
+ */
23
+ getPublicKey(): Promise<Hex>;
24
+ }
@@ -0,0 +1,68 @@
1
+ import { ethers } from 'ethers';
2
+ import { ChainError, ConfigError } from '../errors/index.js';
3
+ /**
4
+ * Wraps any ethers v6 Signer. The most common path — accepts ethers.Wallet,
5
+ * ethers.BrowserProvider signer, JsonRpcSigner, etc. Caches the recovered
6
+ * public key after the first successful getPublicKey() call.
7
+ */
8
+ export class EthersSigner {
9
+ inner;
10
+ publicKeyCache;
11
+ constructor(inner) {
12
+ this.inner = inner;
13
+ }
14
+ async getAddress() {
15
+ return (await this.inner.getAddress());
16
+ }
17
+ async chainId() {
18
+ const provider = this.inner.provider;
19
+ if (!provider) {
20
+ throw new ConfigError('CONFIG/BAD_CONFIG', 'signer has no attached provider; cannot read chainId');
21
+ }
22
+ const net = await provider.getNetwork();
23
+ return net.chainId;
24
+ }
25
+ async signMessage(msg) {
26
+ return (await this.inner.signMessage(msg));
27
+ }
28
+ async signTypedData(domain, types, value) {
29
+ return (await this.inner.signTypedData(domain, types, value));
30
+ }
31
+ async signTransaction(tx) {
32
+ try {
33
+ return (await this.inner.signTransaction({
34
+ to: tx.to,
35
+ ...(tx.from !== undefined ? { from: tx.from } : {}),
36
+ ...(tx.data !== undefined ? { data: tx.data } : {}),
37
+ ...(tx.value !== undefined ? { value: tx.value } : {}),
38
+ ...(tx.gasLimit !== undefined ? { gasLimit: tx.gasLimit } : {}),
39
+ ...(tx.nonce !== undefined ? { nonce: tx.nonce } : {}),
40
+ ...(tx.chainId !== undefined ? { chainId: tx.chainId } : {}),
41
+ }));
42
+ }
43
+ catch (cause) {
44
+ throw new ChainError('CHAIN/TX_REVERTED', 'signTransaction failed', { cause });
45
+ }
46
+ }
47
+ /**
48
+ * Recovers the uncompressed secp256k1 public key from the signer. For Wallet
49
+ * signers we can read it directly; for generic Signers we sign a canonical
50
+ * probe message once and recover from the signature.
51
+ */
52
+ async getPublicKey() {
53
+ if (this.publicKeyCache)
54
+ return this.publicKeyCache;
55
+ // Fast path: ethers.Wallet exposes signingKey.publicKey directly.
56
+ const maybeWallet = this.inner;
57
+ if (maybeWallet.signingKey?.publicKey) {
58
+ this.publicKeyCache = maybeWallet.signingKey.publicKey;
59
+ return this.publicKeyCache;
60
+ }
61
+ // Slow path: sign a probe message and recover the public key.
62
+ const probe = 'BlindBounty-PublicKey-Recovery-v1';
63
+ const sig = await this.inner.signMessage(probe);
64
+ const recovered = ethers.SigningKey.recoverPublicKey(ethers.hashMessage(probe), sig);
65
+ this.publicKeyCache = recovered;
66
+ return this.publicKeyCache;
67
+ }
68
+ }
@@ -0,0 +1,14 @@
1
+ import { ethers } from 'ethers';
2
+ import { EthersSigner } from './EthersSigner.js';
3
+ /**
4
+ * Convenience factory for Node / headless agents: builds an EthersSigner
5
+ * backed by a fresh ethers.Wallet from a raw private key (hex, with or
6
+ * without 0x prefix). Optionally attaches an RPC provider so chainId()
7
+ * and on-chain reads work.
8
+ *
9
+ * NEVER pass a private key you don't control — prefer KMS, browser wallet,
10
+ * or hardware signer for production.
11
+ */
12
+ export declare class PrivateKeySigner extends EthersSigner {
13
+ constructor(privateKey: string, provider?: ethers.Provider);
14
+ }
@@ -0,0 +1,18 @@
1
+ import { ethers } from 'ethers';
2
+ import { EthersSigner } from './EthersSigner.js';
3
+ /**
4
+ * Convenience factory for Node / headless agents: builds an EthersSigner
5
+ * backed by a fresh ethers.Wallet from a raw private key (hex, with or
6
+ * without 0x prefix). Optionally attaches an RPC provider so chainId()
7
+ * and on-chain reads work.
8
+ *
9
+ * NEVER pass a private key you don't control — prefer KMS, browser wallet,
10
+ * or hardware signer for production.
11
+ */
12
+ export class PrivateKeySigner extends EthersSigner {
13
+ constructor(privateKey, provider) {
14
+ const pk = privateKey.startsWith('0x') ? privateKey : `0x${privateKey}`;
15
+ const wallet = provider ? new ethers.Wallet(pk, provider) : new ethers.Wallet(pk);
16
+ super(wallet);
17
+ }
18
+ }
@@ -0,0 +1,35 @@
1
+ import type { Address, Hex } from '../types.js';
2
+ export interface TxRequest {
3
+ to: Address;
4
+ from?: Address;
5
+ data?: Hex;
6
+ value?: bigint;
7
+ gasLimit?: bigint;
8
+ nonce?: number;
9
+ chainId?: bigint;
10
+ }
11
+ export interface TypedDataDomain {
12
+ name?: string;
13
+ version?: string;
14
+ chainId?: bigint | number;
15
+ verifyingContract?: Address;
16
+ salt?: Hex;
17
+ }
18
+ export type TypedDataField = {
19
+ name: string;
20
+ type: string;
21
+ };
22
+ /**
23
+ * Uniform signing interface used across the SDK. Adapters wrap ethers Signer,
24
+ * raw private keys, EIP-1193 providers, or KMS. Implementations MUST return
25
+ * hex-encoded signatures (0x-prefixed) and addresses (0x-prefixed, 20 bytes).
26
+ */
27
+ export interface Signer {
28
+ getAddress(): Promise<Address>;
29
+ chainId(): Promise<bigint>;
30
+ signMessage(msg: string | Uint8Array): Promise<Hex>;
31
+ signTypedData(domain: TypedDataDomain, types: Record<string, TypedDataField[]>, value: Record<string, unknown>): Promise<Hex>;
32
+ signTransaction(tx: TxRequest): Promise<Hex>;
33
+ /** Uncompressed secp256k1 public key, 0x04-prefixed (hex). */
34
+ getPublicKey(): Promise<Hex>;
35
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,121 @@
1
+ 'use strict';
2
+
3
+ var ethers = require('ethers');
4
+
5
+ // src/signer/EthersSigner.ts
6
+
7
+ // src/errors/BlindBountyError.ts
8
+ var BlindBountyError = class extends Error {
9
+ code;
10
+ retriable;
11
+ context;
12
+ cause;
13
+ constructor(code, message, opts = {}) {
14
+ super(message);
15
+ this.code = code;
16
+ this.retriable = opts.retriable ?? false;
17
+ if (opts.context !== void 0) this.context = opts.context;
18
+ if (opts.cause !== void 0) this.cause = opts.cause;
19
+ Object.defineProperty(this, "name", {
20
+ value: this.constructor.name,
21
+ enumerable: false,
22
+ configurable: true,
23
+ writable: true
24
+ });
25
+ }
26
+ toJSON() {
27
+ return {
28
+ name: this.name,
29
+ code: this.code,
30
+ message: this.message,
31
+ retriable: this.retriable,
32
+ ...this.context ? { context: this.context } : {}
33
+ };
34
+ }
35
+ };
36
+
37
+ // src/errors/subclasses.ts
38
+ var ConfigError = class extends BlindBountyError {
39
+ constructor(code, msg, opts) {
40
+ super(code, msg, opts);
41
+ }
42
+ };
43
+ var ChainError = class extends BlindBountyError {
44
+ constructor(code, msg, opts) {
45
+ super(code, msg, opts);
46
+ }
47
+ };
48
+
49
+ // src/signer/EthersSigner.ts
50
+ var EthersSigner = class {
51
+ constructor(inner) {
52
+ this.inner = inner;
53
+ }
54
+ inner;
55
+ publicKeyCache;
56
+ async getAddress() {
57
+ return await this.inner.getAddress();
58
+ }
59
+ async chainId() {
60
+ const provider = this.inner.provider;
61
+ if (!provider) {
62
+ throw new ConfigError("CONFIG/BAD_CONFIG", "signer has no attached provider; cannot read chainId");
63
+ }
64
+ const net = await provider.getNetwork();
65
+ return net.chainId;
66
+ }
67
+ async signMessage(msg) {
68
+ return await this.inner.signMessage(msg);
69
+ }
70
+ async signTypedData(domain, types, value) {
71
+ return await this.inner.signTypedData(domain, types, value);
72
+ }
73
+ async signTransaction(tx) {
74
+ try {
75
+ return await this.inner.signTransaction({
76
+ to: tx.to,
77
+ ...tx.from !== void 0 ? { from: tx.from } : {},
78
+ ...tx.data !== void 0 ? { data: tx.data } : {},
79
+ ...tx.value !== void 0 ? { value: tx.value } : {},
80
+ ...tx.gasLimit !== void 0 ? { gasLimit: tx.gasLimit } : {},
81
+ ...tx.nonce !== void 0 ? { nonce: tx.nonce } : {},
82
+ ...tx.chainId !== void 0 ? { chainId: tx.chainId } : {}
83
+ });
84
+ } catch (cause) {
85
+ throw new ChainError("CHAIN/TX_REVERTED", "signTransaction failed", { cause });
86
+ }
87
+ }
88
+ /**
89
+ * Recovers the uncompressed secp256k1 public key from the signer. For Wallet
90
+ * signers we can read it directly; for generic Signers we sign a canonical
91
+ * probe message once and recover from the signature.
92
+ */
93
+ async getPublicKey() {
94
+ if (this.publicKeyCache) return this.publicKeyCache;
95
+ const maybeWallet = this.inner;
96
+ if (maybeWallet.signingKey?.publicKey) {
97
+ this.publicKeyCache = maybeWallet.signingKey.publicKey;
98
+ return this.publicKeyCache;
99
+ }
100
+ const probe = "BlindBounty-PublicKey-Recovery-v1";
101
+ const sig = await this.inner.signMessage(probe);
102
+ const recovered = ethers.ethers.SigningKey.recoverPublicKey(
103
+ ethers.ethers.hashMessage(probe),
104
+ sig
105
+ );
106
+ this.publicKeyCache = recovered;
107
+ return this.publicKeyCache;
108
+ }
109
+ };
110
+ var PrivateKeySigner = class extends EthersSigner {
111
+ constructor(privateKey, provider) {
112
+ const pk = privateKey.startsWith("0x") ? privateKey : `0x${privateKey}`;
113
+ const wallet = provider ? new ethers.ethers.Wallet(pk, provider) : new ethers.ethers.Wallet(pk);
114
+ super(wallet);
115
+ }
116
+ };
117
+
118
+ exports.EthersSigner = EthersSigner;
119
+ exports.PrivateKeySigner = PrivateKeySigner;
120
+ //# sourceMappingURL=index.cjs.map
121
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/errors/BlindBountyError.ts","../../src/errors/subclasses.ts","../../src/signer/EthersSigner.ts","../../src/signer/PrivateKeySigner.ts"],"names":["ethers"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { ErrorCode } from './codes.js';\n\nexport interface ErrorOptions {\n retriable?: boolean;\n context?: Record<string, unknown>;\n cause?: unknown;\n}\n\nexport abstract class BlindBountyError extends Error {\n readonly code: ErrorCode;\n readonly retriable: boolean;\n readonly context?: Record<string, unknown>;\n override readonly cause?: unknown;\n\n constructor(code: ErrorCode, message: string, opts: ErrorOptions = {}) {\n super(message);\n this.code = code;\n this.retriable = opts.retriable ?? false;\n if (opts.context !== undefined) this.context = opts.context;\n if (opts.cause !== undefined) this.cause = opts.cause;\n Object.defineProperty(this, 'name', {\n value: this.constructor.name,\n enumerable: false,\n configurable: true,\n writable: true,\n });\n }\n\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n code: this.code,\n message: this.message,\n retriable: this.retriable,\n ...(this.context ? { context: this.context } : {}),\n };\n }\n}\n","import { BlindBountyError, type ErrorOptions } from './BlindBountyError.js';\nimport type {\n ApiCode,\n ChainCode,\n ComputeCode,\n ConfigCode,\n CryptoCode,\n LifecycleCode,\n StorageCode,\n TimeoutCode,\n} from './codes.js';\n\nexport class ConfigError extends BlindBountyError {\n constructor(code: ConfigCode, msg: string, opts?: ErrorOptions) {\n super(code, msg, opts);\n }\n}\n\nexport class CryptoError extends BlindBountyError {\n constructor(code: CryptoCode, msg: string, opts?: ErrorOptions) {\n super(code, msg, opts);\n }\n}\n\nexport class StorageError extends BlindBountyError {\n constructor(code: StorageCode, msg: string, opts?: ErrorOptions) {\n super(code, msg, opts);\n }\n}\n\nexport class ChainError extends BlindBountyError {\n constructor(code: ChainCode, msg: string, opts?: ErrorOptions) {\n super(code, msg, opts);\n }\n}\n\nexport class ComputeError extends BlindBountyError {\n constructor(code: ComputeCode, msg: string, opts?: ErrorOptions) {\n super(code, msg, opts);\n }\n}\n\nexport class ApiError extends BlindBountyError {\n constructor(code: ApiCode, msg: string, opts?: ErrorOptions) {\n super(code, msg, opts);\n }\n}\n\nexport class LifecycleError extends BlindBountyError {\n constructor(code: LifecycleCode, msg: string, opts?: ErrorOptions) {\n super(code, msg, opts);\n }\n}\n\nexport class TimeoutError extends BlindBountyError {\n constructor(code: TimeoutCode, msg: string, opts?: ErrorOptions) {\n super(code, msg, opts);\n }\n}\n","import { ethers } from 'ethers';\nimport { ChainError, ConfigError } from '../errors/index.js';\nimport type { Address, Hex } from '../types.js';\nimport type { Signer, TxRequest, TypedDataDomain, TypedDataField } from './Signer.js';\n\n/**\n * Wraps any ethers v6 Signer. The most common path — accepts ethers.Wallet,\n * ethers.BrowserProvider signer, JsonRpcSigner, etc. Caches the recovered\n * public key after the first successful getPublicKey() call.\n */\nexport class EthersSigner implements Signer {\n private publicKeyCache: Hex | undefined;\n\n constructor(private readonly inner: ethers.Signer) {}\n\n async getAddress(): Promise<Address> {\n return (await this.inner.getAddress()) as Address;\n }\n\n async chainId(): Promise<bigint> {\n const provider = this.inner.provider;\n if (!provider) {\n throw new ConfigError('CONFIG/BAD_CONFIG', 'signer has no attached provider; cannot read chainId');\n }\n const net = await provider.getNetwork();\n return net.chainId;\n }\n\n async signMessage(msg: string | Uint8Array): Promise<Hex> {\n return (await this.inner.signMessage(msg)) as Hex;\n }\n\n async signTypedData(\n domain: TypedDataDomain,\n types: Record<string, TypedDataField[]>,\n value: Record<string, unknown>,\n ): Promise<Hex> {\n return (await this.inner.signTypedData(domain, types, value)) as Hex;\n }\n\n async signTransaction(tx: TxRequest): Promise<Hex> {\n try {\n return (await this.inner.signTransaction({\n to: tx.to,\n ...(tx.from !== undefined ? { from: tx.from } : {}),\n ...(tx.data !== undefined ? { data: tx.data } : {}),\n ...(tx.value !== undefined ? { value: tx.value } : {}),\n ...(tx.gasLimit !== undefined ? { gasLimit: tx.gasLimit } : {}),\n ...(tx.nonce !== undefined ? { nonce: tx.nonce } : {}),\n ...(tx.chainId !== undefined ? { chainId: tx.chainId } : {}),\n })) as Hex;\n } catch (cause) {\n throw new ChainError('CHAIN/TX_REVERTED', 'signTransaction failed', { cause });\n }\n }\n\n /**\n * Recovers the uncompressed secp256k1 public key from the signer. For Wallet\n * signers we can read it directly; for generic Signers we sign a canonical\n * probe message once and recover from the signature.\n */\n async getPublicKey(): Promise<Hex> {\n if (this.publicKeyCache) return this.publicKeyCache;\n\n // Fast path: ethers.Wallet exposes signingKey.publicKey directly.\n const maybeWallet = this.inner as unknown as { signingKey?: { publicKey: string } };\n if (maybeWallet.signingKey?.publicKey) {\n this.publicKeyCache = maybeWallet.signingKey.publicKey as Hex;\n return this.publicKeyCache;\n }\n\n // Slow path: sign a probe message and recover the public key.\n const probe = 'BlindBounty-PublicKey-Recovery-v1';\n const sig = await this.inner.signMessage(probe);\n const recovered = ethers.SigningKey.recoverPublicKey(\n ethers.hashMessage(probe),\n sig,\n );\n this.publicKeyCache = recovered as Hex;\n return this.publicKeyCache;\n }\n}\n","import { ethers } from 'ethers';\nimport { EthersSigner } from './EthersSigner.js';\n\n/**\n * Convenience factory for Node / headless agents: builds an EthersSigner\n * backed by a fresh ethers.Wallet from a raw private key (hex, with or\n * without 0x prefix). Optionally attaches an RPC provider so chainId()\n * and on-chain reads work.\n *\n * NEVER pass a private key you don't control — prefer KMS, browser wallet,\n * or hardware signer for production.\n */\nexport class PrivateKeySigner extends EthersSigner {\n constructor(privateKey: string, provider?: ethers.Provider) {\n const pk = privateKey.startsWith('0x') ? privateKey : `0x${privateKey}`;\n const wallet = provider ? new ethers.Wallet(pk, provider) : new ethers.Wallet(pk);\n super(wallet);\n }\n}\n"]}
@@ -0,0 +1,40 @@
1
+ import { S as Signer, T as TypedDataDomain, a as TypedDataField, b as TxRequest } from '../Signer-BnqH_qew.cjs';
2
+ import { ethers } from 'ethers';
3
+ import { A as Address, H as Hex } from '../types-BOG5Ub1z.cjs';
4
+
5
+ /**
6
+ * Wraps any ethers v6 Signer. The most common path — accepts ethers.Wallet,
7
+ * ethers.BrowserProvider signer, JsonRpcSigner, etc. Caches the recovered
8
+ * public key after the first successful getPublicKey() call.
9
+ */
10
+ declare class EthersSigner implements Signer {
11
+ private readonly inner;
12
+ private publicKeyCache;
13
+ constructor(inner: ethers.Signer);
14
+ getAddress(): Promise<Address>;
15
+ chainId(): Promise<bigint>;
16
+ signMessage(msg: string | Uint8Array): Promise<Hex>;
17
+ signTypedData(domain: TypedDataDomain, types: Record<string, TypedDataField[]>, value: Record<string, unknown>): Promise<Hex>;
18
+ signTransaction(tx: TxRequest): Promise<Hex>;
19
+ /**
20
+ * Recovers the uncompressed secp256k1 public key from the signer. For Wallet
21
+ * signers we can read it directly; for generic Signers we sign a canonical
22
+ * probe message once and recover from the signature.
23
+ */
24
+ getPublicKey(): Promise<Hex>;
25
+ }
26
+
27
+ /**
28
+ * Convenience factory for Node / headless agents: builds an EthersSigner
29
+ * backed by a fresh ethers.Wallet from a raw private key (hex, with or
30
+ * without 0x prefix). Optionally attaches an RPC provider so chainId()
31
+ * and on-chain reads work.
32
+ *
33
+ * NEVER pass a private key you don't control — prefer KMS, browser wallet,
34
+ * or hardware signer for production.
35
+ */
36
+ declare class PrivateKeySigner extends EthersSigner {
37
+ constructor(privateKey: string, provider?: ethers.Provider);
38
+ }
39
+
40
+ export { EthersSigner, PrivateKeySigner, Signer, TxRequest, TypedDataDomain, TypedDataField };
@@ -0,0 +1,3 @@
1
+ export * from './Signer.js';
2
+ export * from './EthersSigner.js';
3
+ export * from './PrivateKeySigner.js';
@@ -0,0 +1,3 @@
1
+ export * from './Signer.js';
2
+ export * from './EthersSigner.js';
3
+ export * from './PrivateKeySigner.js';
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/errors/BlindBountyError.ts","../../src/errors/subclasses.ts","../../src/signer/EthersSigner.ts","../../src/signer/PrivateKeySigner.ts"],"names":["ethers"],"mappings":"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","file":"index.js","sourcesContent":["import type { ErrorCode } from './codes.js';\n\nexport interface ErrorOptions {\n retriable?: boolean;\n context?: Record<string, unknown>;\n cause?: unknown;\n}\n\nexport abstract class BlindBountyError extends Error {\n readonly code: ErrorCode;\n readonly retriable: boolean;\n readonly context?: Record<string, unknown>;\n override readonly cause?: unknown;\n\n constructor(code: ErrorCode, message: string, opts: ErrorOptions = {}) {\n super(message);\n this.code = code;\n this.retriable = opts.retriable ?? false;\n if (opts.context !== undefined) this.context = opts.context;\n if (opts.cause !== undefined) this.cause = opts.cause;\n Object.defineProperty(this, 'name', {\n value: this.constructor.name,\n enumerable: false,\n configurable: true,\n writable: true,\n });\n }\n\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n code: this.code,\n message: this.message,\n retriable: this.retriable,\n ...(this.context ? { context: this.context } : {}),\n };\n }\n}\n","import { BlindBountyError, type ErrorOptions } from './BlindBountyError.js';\nimport type {\n ApiCode,\n ChainCode,\n ComputeCode,\n ConfigCode,\n CryptoCode,\n LifecycleCode,\n StorageCode,\n TimeoutCode,\n} from './codes.js';\n\nexport class ConfigError extends BlindBountyError {\n constructor(code: ConfigCode, msg: string, opts?: ErrorOptions) {\n super(code, msg, opts);\n }\n}\n\nexport class CryptoError extends BlindBountyError {\n constructor(code: CryptoCode, msg: string, opts?: ErrorOptions) {\n super(code, msg, opts);\n }\n}\n\nexport class StorageError extends BlindBountyError {\n constructor(code: StorageCode, msg: string, opts?: ErrorOptions) {\n super(code, msg, opts);\n }\n}\n\nexport class ChainError extends BlindBountyError {\n constructor(code: ChainCode, msg: string, opts?: ErrorOptions) {\n super(code, msg, opts);\n }\n}\n\nexport class ComputeError extends BlindBountyError {\n constructor(code: ComputeCode, msg: string, opts?: ErrorOptions) {\n super(code, msg, opts);\n }\n}\n\nexport class ApiError extends BlindBountyError {\n constructor(code: ApiCode, msg: string, opts?: ErrorOptions) {\n super(code, msg, opts);\n }\n}\n\nexport class LifecycleError extends BlindBountyError {\n constructor(code: LifecycleCode, msg: string, opts?: ErrorOptions) {\n super(code, msg, opts);\n }\n}\n\nexport class TimeoutError extends BlindBountyError {\n constructor(code: TimeoutCode, msg: string, opts?: ErrorOptions) {\n super(code, msg, opts);\n }\n}\n","import { ethers } from 'ethers';\nimport { ChainError, ConfigError } from '../errors/index.js';\nimport type { Address, Hex } from '../types.js';\nimport type { Signer, TxRequest, TypedDataDomain, TypedDataField } from './Signer.js';\n\n/**\n * Wraps any ethers v6 Signer. The most common path — accepts ethers.Wallet,\n * ethers.BrowserProvider signer, JsonRpcSigner, etc. Caches the recovered\n * public key after the first successful getPublicKey() call.\n */\nexport class EthersSigner implements Signer {\n private publicKeyCache: Hex | undefined;\n\n constructor(private readonly inner: ethers.Signer) {}\n\n async getAddress(): Promise<Address> {\n return (await this.inner.getAddress()) as Address;\n }\n\n async chainId(): Promise<bigint> {\n const provider = this.inner.provider;\n if (!provider) {\n throw new ConfigError('CONFIG/BAD_CONFIG', 'signer has no attached provider; cannot read chainId');\n }\n const net = await provider.getNetwork();\n return net.chainId;\n }\n\n async signMessage(msg: string | Uint8Array): Promise<Hex> {\n return (await this.inner.signMessage(msg)) as Hex;\n }\n\n async signTypedData(\n domain: TypedDataDomain,\n types: Record<string, TypedDataField[]>,\n value: Record<string, unknown>,\n ): Promise<Hex> {\n return (await this.inner.signTypedData(domain, types, value)) as Hex;\n }\n\n async signTransaction(tx: TxRequest): Promise<Hex> {\n try {\n return (await this.inner.signTransaction({\n to: tx.to,\n ...(tx.from !== undefined ? { from: tx.from } : {}),\n ...(tx.data !== undefined ? { data: tx.data } : {}),\n ...(tx.value !== undefined ? { value: tx.value } : {}),\n ...(tx.gasLimit !== undefined ? { gasLimit: tx.gasLimit } : {}),\n ...(tx.nonce !== undefined ? { nonce: tx.nonce } : {}),\n ...(tx.chainId !== undefined ? { chainId: tx.chainId } : {}),\n })) as Hex;\n } catch (cause) {\n throw new ChainError('CHAIN/TX_REVERTED', 'signTransaction failed', { cause });\n }\n }\n\n /**\n * Recovers the uncompressed secp256k1 public key from the signer. For Wallet\n * signers we can read it directly; for generic Signers we sign a canonical\n * probe message once and recover from the signature.\n */\n async getPublicKey(): Promise<Hex> {\n if (this.publicKeyCache) return this.publicKeyCache;\n\n // Fast path: ethers.Wallet exposes signingKey.publicKey directly.\n const maybeWallet = this.inner as unknown as { signingKey?: { publicKey: string } };\n if (maybeWallet.signingKey?.publicKey) {\n this.publicKeyCache = maybeWallet.signingKey.publicKey as Hex;\n return this.publicKeyCache;\n }\n\n // Slow path: sign a probe message and recover the public key.\n const probe = 'BlindBounty-PublicKey-Recovery-v1';\n const sig = await this.inner.signMessage(probe);\n const recovered = ethers.SigningKey.recoverPublicKey(\n ethers.hashMessage(probe),\n sig,\n );\n this.publicKeyCache = recovered as Hex;\n return this.publicKeyCache;\n }\n}\n","import { ethers } from 'ethers';\nimport { EthersSigner } from './EthersSigner.js';\n\n/**\n * Convenience factory for Node / headless agents: builds an EthersSigner\n * backed by a fresh ethers.Wallet from a raw private key (hex, with or\n * without 0x prefix). Optionally attaches an RPC provider so chainId()\n * and on-chain reads work.\n *\n * NEVER pass a private key you don't control — prefer KMS, browser wallet,\n * or hardware signer for production.\n */\nexport class PrivateKeySigner extends EthersSigner {\n constructor(privateKey: string, provider?: ethers.Provider) {\n const pk = privateKey.startsWith('0x') ? privateKey : `0x${privateKey}`;\n const wallet = provider ? new ethers.Wallet(pk, provider) : new ethers.Wallet(pk);\n super(wallet);\n }\n}\n"]}