@xyo-network/witness-blockchain-abstract 2.79.1

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 (64) hide show
  1. package/LICENSE +165 -0
  2. package/README.md +13 -0
  3. package/dist/browser/Witness.d.cts +20 -0
  4. package/dist/browser/Witness.d.cts.map +1 -0
  5. package/dist/browser/Witness.d.mts +20 -0
  6. package/dist/browser/Witness.d.mts.map +1 -0
  7. package/dist/browser/Witness.d.ts +20 -0
  8. package/dist/browser/Witness.d.ts.map +1 -0
  9. package/dist/browser/index.cjs +107 -0
  10. package/dist/browser/index.cjs.map +1 -0
  11. package/dist/browser/index.d.cts +3 -0
  12. package/dist/browser/index.d.cts.map +1 -0
  13. package/dist/browser/index.d.mts +3 -0
  14. package/dist/browser/index.d.mts.map +1 -0
  15. package/dist/browser/index.d.ts +3 -0
  16. package/dist/browser/index.d.ts.map +1 -0
  17. package/dist/browser/index.js +84 -0
  18. package/dist/browser/index.js.map +1 -0
  19. package/dist/browser/lib/getProviderFromEnv.d.cts +12 -0
  20. package/dist/browser/lib/getProviderFromEnv.d.cts.map +1 -0
  21. package/dist/browser/lib/getProviderFromEnv.d.mts +12 -0
  22. package/dist/browser/lib/getProviderFromEnv.d.mts.map +1 -0
  23. package/dist/browser/lib/getProviderFromEnv.d.ts +12 -0
  24. package/dist/browser/lib/getProviderFromEnv.d.ts.map +1 -0
  25. package/dist/browser/lib/index.d.cts +2 -0
  26. package/dist/browser/lib/index.d.cts.map +1 -0
  27. package/dist/browser/lib/index.d.mts +2 -0
  28. package/dist/browser/lib/index.d.mts.map +1 -0
  29. package/dist/browser/lib/index.d.ts +2 -0
  30. package/dist/browser/lib/index.d.ts.map +1 -0
  31. package/dist/node/Witness.d.cts +20 -0
  32. package/dist/node/Witness.d.cts.map +1 -0
  33. package/dist/node/Witness.d.mts +20 -0
  34. package/dist/node/Witness.d.mts.map +1 -0
  35. package/dist/node/Witness.d.ts +20 -0
  36. package/dist/node/Witness.d.ts.map +1 -0
  37. package/dist/node/index.cjs +114 -0
  38. package/dist/node/index.cjs.map +1 -0
  39. package/dist/node/index.d.cts +3 -0
  40. package/dist/node/index.d.cts.map +1 -0
  41. package/dist/node/index.d.mts +3 -0
  42. package/dist/node/index.d.mts.map +1 -0
  43. package/dist/node/index.d.ts +3 -0
  44. package/dist/node/index.d.ts.map +1 -0
  45. package/dist/node/index.js +84 -0
  46. package/dist/node/index.js.map +1 -0
  47. package/dist/node/lib/getProviderFromEnv.d.cts +12 -0
  48. package/dist/node/lib/getProviderFromEnv.d.cts.map +1 -0
  49. package/dist/node/lib/getProviderFromEnv.d.mts +12 -0
  50. package/dist/node/lib/getProviderFromEnv.d.mts.map +1 -0
  51. package/dist/node/lib/getProviderFromEnv.d.ts +12 -0
  52. package/dist/node/lib/getProviderFromEnv.d.ts.map +1 -0
  53. package/dist/node/lib/index.d.cts +2 -0
  54. package/dist/node/lib/index.d.cts.map +1 -0
  55. package/dist/node/lib/index.d.mts +2 -0
  56. package/dist/node/lib/index.d.mts.map +1 -0
  57. package/dist/node/lib/index.d.ts +2 -0
  58. package/dist/node/lib/index.d.ts.map +1 -0
  59. package/package.json +69 -0
  60. package/src/Witness.ts +45 -0
  61. package/src/index.ts +2 -0
  62. package/src/lib/getProviderFromEnv.ts +82 -0
  63. package/src/lib/index.ts +1 -0
  64. package/typedoc.json +5 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Witness.d.ts","sourceRoot":"","sources":["../../src/Witness.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAC/D,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAC/D,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAA;AACpD,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,sBAAsB,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAElH,eAAO,MAAM,6BAA6B,mCAAmC,CAAA;AAC7E,MAAM,MAAM,6BAA6B,GAAG,OAAO,6BAA6B,CAAA;AAEhF,MAAM,MAAM,uBAAuB,CAAC,WAAW,SAAS,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,GAAG,IAAI,GAAG,IAAI,EAAE,OAAO,SAAS,MAAM,GAAG,IAAI,GAAG,IAAI,IAAI,aAAa,CAClJ,WAAW,GAAG;IAAE,MAAM,EAAE,OAAO,SAAS,IAAI,GAAG,CAAC,WAAW,SAAS,IAAI,GAAG,MAAM,GAAG,6BAA6B,CAAC,GAAG,OAAO,CAAA;CAAE,CAC/H,CAAA;AAED,MAAM,MAAM,iCAAiC,GAAG;IAC9C,SAAS,EAAE,YAAY,EAAE,CAAA;CAC1B,CAAA;AAED,MAAM,MAAM,uBAAuB,CACjC,OAAO,SAAS,uBAAuB,GAAG,uBAAuB,EACjE,iBAAiB,SAAS,SAAS,GAAG,IAAI,GAAG,IAAI,IAC/C,aAAa,CACf,OAAO,EACP,cAAc,CACZ;IACE,SAAS,EAAE,YAAY,EAAE,CAAA;CAC1B,EACD,iBAAiB,CAClB,CACF,CAAA;AAED,8BAAsB,yBAAyB,CAC7C,OAAO,SAAS,uBAAuB,GAAG,uBAAuB,EACjE,GAAG,SAAS,OAAO,GAAG,OAAO,EAC7B,IAAI,SAAS,OAAO,GAAG,OAAO,EAC9B,UAAU,SAAS,sBAAsB,CAAC,eAAe,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,sBAAsB,CAChH,eAAe,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,EACnC,GAAG,EACH,IAAI,CACL,CACD,SAAQ,eAAe,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,CAAC;IACvD,IAAI,QAAQ,iBAGX;CACF"}
@@ -0,0 +1,20 @@
1
+ import { BaseProvider } from '@ethersproject/providers';
2
+ import { AbstractWitness } from '@xyo-network/abstract-witness';
3
+ import { AnyObject, WithAdditional } from '@xyo-network/object';
4
+ import { Payload } from '@xyo-network/payload-model';
5
+ import { WitnessConfig, WitnessInstance, WitnessModuleEventData, WitnessParams } from '@xyo-network/witness-model';
6
+ export declare const BlockchainWitnessConfigSchema = "network.xyo.blockchain.witness";
7
+ export type BlockchainWitnessConfigSchema = typeof BlockchainWitnessConfigSchema;
8
+ export type BlockchainWitnessConfig<TAdditional extends Omit<Payload, 'schema'> | void = void, TSchema extends string | void = void> = WitnessConfig<TAdditional & {
9
+ schema: TSchema extends void ? (TAdditional extends void ? string : BlockchainWitnessConfigSchema) : TSchema;
10
+ }>;
11
+ export type AdditionalBlockchainWitnessParams = {
12
+ providers: BaseProvider[];
13
+ };
14
+ export type BlockchainWitnessParams<TConfig extends BlockchainWitnessConfig = BlockchainWitnessConfig, TAdditionalParams extends AnyObject | void = void> = WitnessParams<TConfig, WithAdditional<{
15
+ providers: BaseProvider[];
16
+ }, TAdditionalParams>>;
17
+ export declare abstract class AbstractBlockchainWitness<TParams extends BlockchainWitnessParams = BlockchainWitnessParams, TIn extends Payload = Payload, TOut extends Payload = Payload, TEventData extends WitnessModuleEventData<WitnessInstance<TParams, TIn, TOut>, TIn, TOut> = WitnessModuleEventData<WitnessInstance<TParams, TIn, TOut>, TIn, TOut>> extends AbstractWitness<TParams, TIn, TOut, TEventData> {
18
+ get provider(): BaseProvider;
19
+ }
20
+ //# sourceMappingURL=Witness.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Witness.d.ts","sourceRoot":"","sources":["../../src/Witness.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAC/D,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAC/D,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAA;AACpD,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,sBAAsB,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAElH,eAAO,MAAM,6BAA6B,mCAAmC,CAAA;AAC7E,MAAM,MAAM,6BAA6B,GAAG,OAAO,6BAA6B,CAAA;AAEhF,MAAM,MAAM,uBAAuB,CAAC,WAAW,SAAS,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,GAAG,IAAI,GAAG,IAAI,EAAE,OAAO,SAAS,MAAM,GAAG,IAAI,GAAG,IAAI,IAAI,aAAa,CAClJ,WAAW,GAAG;IAAE,MAAM,EAAE,OAAO,SAAS,IAAI,GAAG,CAAC,WAAW,SAAS,IAAI,GAAG,MAAM,GAAG,6BAA6B,CAAC,GAAG,OAAO,CAAA;CAAE,CAC/H,CAAA;AAED,MAAM,MAAM,iCAAiC,GAAG;IAC9C,SAAS,EAAE,YAAY,EAAE,CAAA;CAC1B,CAAA;AAED,MAAM,MAAM,uBAAuB,CACjC,OAAO,SAAS,uBAAuB,GAAG,uBAAuB,EACjE,iBAAiB,SAAS,SAAS,GAAG,IAAI,GAAG,IAAI,IAC/C,aAAa,CACf,OAAO,EACP,cAAc,CACZ;IACE,SAAS,EAAE,YAAY,EAAE,CAAA;CAC1B,EACD,iBAAiB,CAClB,CACF,CAAA;AAED,8BAAsB,yBAAyB,CAC7C,OAAO,SAAS,uBAAuB,GAAG,uBAAuB,EACjE,GAAG,SAAS,OAAO,GAAG,OAAO,EAC7B,IAAI,SAAS,OAAO,GAAG,OAAO,EAC9B,UAAU,SAAS,sBAAsB,CAAC,eAAe,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,sBAAsB,CAChH,eAAe,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,EACnC,GAAG,EACH,IAAI,CACL,CACD,SAAQ,eAAe,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,CAAC;IACvD,IAAI,QAAQ,iBAGX;CACF"}
@@ -0,0 +1,114 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var src_exports = {};
22
+ __export(src_exports, {
23
+ AbstractBlockchainWitness: () => AbstractBlockchainWitness,
24
+ BlockchainWitnessConfigSchema: () => BlockchainWitnessConfigSchema,
25
+ getProviderFromEnv: () => getProviderFromEnv,
26
+ getSharedProviderFromEnv: () => getSharedProviderFromEnv
27
+ });
28
+ module.exports = __toCommonJS(src_exports);
29
+
30
+ // src/lib/getProviderFromEnv.ts
31
+ var import_providers = require("@ethersproject/providers");
32
+ var import_assert = require("@xylabs/assert");
33
+ var createInfuraRpc = (chainId) => {
34
+ return new import_providers.InfuraProvider(chainId, {
35
+ projectId: process.env.INFURA_PROJECT_ID,
36
+ projectSecret: process.env.INFURA_PROJECT_SECRET
37
+ });
38
+ };
39
+ var createInfuraWss = (chainId) => {
40
+ return new import_providers.InfuraWebSocketProvider(chainId, {
41
+ projectId: process.env.INFURA_PROJECT_ID
42
+ });
43
+ };
44
+ var createQuicknodeWss = (chainId) => {
45
+ const quickNodeWSSUri = process.env.QUICKNODE_WSS_URI;
46
+ return quickNodeWSSUri ? new import_providers.WebSocketProvider(quickNodeWSSUri, chainId) : void 0;
47
+ };
48
+ var createQuicknodeRpc = (chainId) => {
49
+ const quickNodeHttpsUri = process.env.QUICKNODE_HTTPS_URI;
50
+ return quickNodeHttpsUri ? new import_providers.JsonRpcProvider(quickNodeHttpsUri, chainId) : void 0;
51
+ };
52
+ var getProviderFromEnv = (chainId = 1, options) => {
53
+ const { providerSource, providerType } = options ?? {};
54
+ let provider = void 0;
55
+ switch (providerSource) {
56
+ case "quicknode": {
57
+ switch (providerType) {
58
+ case "rpc": {
59
+ provider = createQuicknodeRpc(chainId);
60
+ break;
61
+ }
62
+ case "wss":
63
+ default: {
64
+ provider = createQuicknodeWss(chainId);
65
+ break;
66
+ }
67
+ }
68
+ break;
69
+ }
70
+ default:
71
+ case "infura": {
72
+ switch (providerType) {
73
+ case "rpc": {
74
+ provider = createInfuraRpc(chainId);
75
+ break;
76
+ }
77
+ case "wss":
78
+ default: {
79
+ provider = createInfuraWss(chainId);
80
+ break;
81
+ }
82
+ }
83
+ break;
84
+ }
85
+ }
86
+ if (!provider) {
87
+ provider = createInfuraWss(chainId) ?? createInfuraRpc(chainId) ?? createQuicknodeRpc(chainId);
88
+ }
89
+ return (0, import_assert.assertEx)(provider, `Unable to create provider [${chainId}]: ${options ? JSON.stringify(options) : "default"}`);
90
+ };
91
+ var providers = {};
92
+ var getSharedProviderFromEnv = (chainId = 1, options) => {
93
+ const key = `${chainId}:${options ? JSON.stringify(options) : "default"}`;
94
+ providers[key] = providers[key] ?? getProviderFromEnv(chainId, options);
95
+ return providers[key];
96
+ };
97
+
98
+ // src/Witness.ts
99
+ var import_abstract_witness = require("@xyo-network/abstract-witness");
100
+ var BlockchainWitnessConfigSchema = "network.xyo.blockchain.witness";
101
+ var AbstractBlockchainWitness = class extends import_abstract_witness.AbstractWitness {
102
+ get provider() {
103
+ const { providers: providers2 } = this.params;
104
+ return providers2[Date.now() % providers2.length];
105
+ }
106
+ };
107
+ // Annotate the CommonJS export names for ESM import in node:
108
+ 0 && (module.exports = {
109
+ AbstractBlockchainWitness,
110
+ BlockchainWitnessConfigSchema,
111
+ getProviderFromEnv,
112
+ getSharedProviderFromEnv
113
+ });
114
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/index.ts","../../src/lib/getProviderFromEnv.ts","../../src/Witness.ts"],"sourcesContent":["export * from './lib'\nexport * from './Witness'\n","import { BaseProvider, InfuraProvider, InfuraWebSocketProvider, JsonRpcProvider, WebSocketProvider } from '@ethersproject/providers'\nimport { assertEx } from '@xylabs/assert'\n\nexport type ProviderSource = 'infura' | 'quicknode'\nexport type ProviderType = 'rpc' | 'wss'\n\nconst createInfuraRpc = (chainId: number) => {\n return new InfuraProvider(chainId, {\n projectId: process.env.INFURA_PROJECT_ID,\n projectSecret: process.env.INFURA_PROJECT_SECRET,\n })\n}\n\nconst createInfuraWss = (chainId: number) => {\n return new InfuraWebSocketProvider(chainId, {\n projectId: process.env.INFURA_PROJECT_ID,\n })\n}\n\nconst createQuicknodeWss = (chainId: number) => {\n const quickNodeWSSUri = process.env.QUICKNODE_WSS_URI\n return quickNodeWSSUri ? new WebSocketProvider(quickNodeWSSUri, chainId) : undefined\n}\n\nconst createQuicknodeRpc = (chainId: number) => {\n const quickNodeHttpsUri = process.env.QUICKNODE_HTTPS_URI\n return quickNodeHttpsUri ? new JsonRpcProvider(quickNodeHttpsUri, chainId) : undefined\n}\n\nexport const getProviderFromEnv = (\n chainId: number = 0x01,\n options?: { providerSource?: ProviderSource; providerType?: ProviderType },\n): BaseProvider => {\n const { providerSource, providerType } = options ?? {}\n let provider: BaseProvider | undefined = undefined\n switch (providerSource) {\n case 'quicknode': {\n switch (providerType) {\n case 'rpc': {\n provider = createQuicknodeRpc(chainId)\n break\n }\n case 'wss':\n default: {\n provider = createQuicknodeWss(chainId)\n break\n }\n }\n break\n }\n default:\n case 'infura': {\n switch (providerType) {\n case 'rpc': {\n provider = createInfuraRpc(chainId)\n break\n }\n case 'wss':\n default: {\n provider = createInfuraWss(chainId)\n break\n }\n }\n break\n }\n }\n if (!provider) {\n provider = createInfuraWss(chainId) ?? createInfuraRpc(chainId) ?? createQuicknodeRpc(chainId)\n }\n return assertEx(provider, `Unable to create provider [${chainId}]: ${options ? JSON.stringify(options) : 'default'}`)\n}\n\nconst providers: Record<string, BaseProvider> = {}\n\nexport const getSharedProviderFromEnv = (\n chainId: number = 0x01,\n options?: { providerSource?: ProviderSource; providerType?: ProviderType },\n): BaseProvider => {\n const key = `${chainId}:${options ? JSON.stringify(options) : 'default'}`\n providers[key] = providers[key] ?? getProviderFromEnv(chainId, options)\n return providers[key]\n}\n","import { BaseProvider } from '@ethersproject/providers'\nimport { AbstractWitness } from '@xyo-network/abstract-witness'\nimport { AnyObject, WithAdditional } from '@xyo-network/object'\nimport { Payload } from '@xyo-network/payload-model'\nimport { WitnessConfig, WitnessInstance, WitnessModuleEventData, WitnessParams } from '@xyo-network/witness-model'\n\nexport const BlockchainWitnessConfigSchema = 'network.xyo.blockchain.witness'\nexport type BlockchainWitnessConfigSchema = typeof BlockchainWitnessConfigSchema\n\nexport type BlockchainWitnessConfig<TAdditional extends Omit<Payload, 'schema'> | void = void, TSchema extends string | void = void> = WitnessConfig<\n TAdditional & { schema: TSchema extends void ? (TAdditional extends void ? string : BlockchainWitnessConfigSchema) : TSchema }\n>\n\nexport type AdditionalBlockchainWitnessParams = {\n providers: BaseProvider[]\n}\n\nexport type BlockchainWitnessParams<\n TConfig extends BlockchainWitnessConfig = BlockchainWitnessConfig,\n TAdditionalParams extends AnyObject | void = void,\n> = WitnessParams<\n TConfig,\n WithAdditional<\n {\n providers: BaseProvider[]\n },\n TAdditionalParams\n >\n>\n\nexport abstract class AbstractBlockchainWitness<\n TParams extends BlockchainWitnessParams = BlockchainWitnessParams,\n TIn extends Payload = Payload,\n TOut extends Payload = Payload,\n TEventData extends WitnessModuleEventData<WitnessInstance<TParams, TIn, TOut>, TIn, TOut> = WitnessModuleEventData<\n WitnessInstance<TParams, TIn, TOut>,\n TIn,\n TOut\n >,\n> extends AbstractWitness<TParams, TIn, TOut, TEventData> {\n get provider() {\n const { providers } = this.params\n return providers[Date.now() % providers.length] //pick a random provider\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,uBAA0G;AAC1G,oBAAyB;AAKzB,IAAM,kBAAkB,CAAC,YAAoB;AAC3C,SAAO,IAAI,gCAAe,SAAS;AAAA,IACjC,WAAW,QAAQ,IAAI;AAAA,IACvB,eAAe,QAAQ,IAAI;AAAA,EAC7B,CAAC;AACH;AAEA,IAAM,kBAAkB,CAAC,YAAoB;AAC3C,SAAO,IAAI,yCAAwB,SAAS;AAAA,IAC1C,WAAW,QAAQ,IAAI;AAAA,EACzB,CAAC;AACH;AAEA,IAAM,qBAAqB,CAAC,YAAoB;AAC9C,QAAM,kBAAkB,QAAQ,IAAI;AACpC,SAAO,kBAAkB,IAAI,mCAAkB,iBAAiB,OAAO,IAAI;AAC7E;AAEA,IAAM,qBAAqB,CAAC,YAAoB;AAC9C,QAAM,oBAAoB,QAAQ,IAAI;AACtC,SAAO,oBAAoB,IAAI,iCAAgB,mBAAmB,OAAO,IAAI;AAC/E;AAEO,IAAM,qBAAqB,CAChC,UAAkB,GAClB,YACiB;AACjB,QAAM,EAAE,gBAAgB,aAAa,IAAI,WAAW,CAAC;AACrD,MAAI,WAAqC;AACzC,UAAQ,gBAAgB;AAAA,IACtB,KAAK,aAAa;AAChB,cAAQ,cAAc;AAAA,QACpB,KAAK,OAAO;AACV,qBAAW,mBAAmB,OAAO;AACrC;AAAA,QACF;AAAA,QACA,KAAK;AAAA,QACL,SAAS;AACP,qBAAW,mBAAmB,OAAO;AACrC;AAAA,QACF;AAAA,MACF;AACA;AAAA,IACF;AAAA,IACA;AAAA,IACA,KAAK,UAAU;AACb,cAAQ,cAAc;AAAA,QACpB,KAAK,OAAO;AACV,qBAAW,gBAAgB,OAAO;AAClC;AAAA,QACF;AAAA,QACA,KAAK;AAAA,QACL,SAAS;AACP,qBAAW,gBAAgB,OAAO;AAClC;AAAA,QACF;AAAA,MACF;AACA;AAAA,IACF;AAAA,EACF;AACA,MAAI,CAAC,UAAU;AACb,eAAW,gBAAgB,OAAO,KAAK,gBAAgB,OAAO,KAAK,mBAAmB,OAAO;AAAA,EAC/F;AACA,aAAO,wBAAS,UAAU,8BAA8B,OAAO,MAAM,UAAU,KAAK,UAAU,OAAO,IAAI,SAAS,EAAE;AACtH;AAEA,IAAM,YAA0C,CAAC;AAE1C,IAAM,2BAA2B,CACtC,UAAkB,GAClB,YACiB;AACjB,QAAM,MAAM,GAAG,OAAO,IAAI,UAAU,KAAK,UAAU,OAAO,IAAI,SAAS;AACvE,YAAU,GAAG,IAAI,UAAU,GAAG,KAAK,mBAAmB,SAAS,OAAO;AACtE,SAAO,UAAU,GAAG;AACtB;;;AChFA,8BAAgC;AAKzB,IAAM,gCAAgC;AAwBtC,IAAe,4BAAf,cASG,wCAAgD;AAAA,EACxD,IAAI,WAAW;AACb,UAAM,EAAE,WAAAA,WAAU,IAAI,KAAK;AAC3B,WAAOA,WAAU,KAAK,IAAI,IAAIA,WAAU,MAAM;AAAA,EAChD;AACF;","names":["providers"]}
@@ -0,0 +1,3 @@
1
+ export * from './lib';
2
+ export * from './Witness';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,OAAO,CAAA;AACrB,cAAc,WAAW,CAAA"}
@@ -0,0 +1,3 @@
1
+ export * from './lib';
2
+ export * from './Witness';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,OAAO,CAAA;AACrB,cAAc,WAAW,CAAA"}
@@ -0,0 +1,3 @@
1
+ export * from './lib';
2
+ export * from './Witness';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,OAAO,CAAA;AACrB,cAAc,WAAW,CAAA"}
@@ -0,0 +1,84 @@
1
+ // src/lib/getProviderFromEnv.ts
2
+ import { InfuraProvider, InfuraWebSocketProvider, JsonRpcProvider, WebSocketProvider } from "@ethersproject/providers";
3
+ import { assertEx } from "@xylabs/assert";
4
+ var createInfuraRpc = (chainId) => {
5
+ return new InfuraProvider(chainId, {
6
+ projectId: process.env.INFURA_PROJECT_ID,
7
+ projectSecret: process.env.INFURA_PROJECT_SECRET
8
+ });
9
+ };
10
+ var createInfuraWss = (chainId) => {
11
+ return new InfuraWebSocketProvider(chainId, {
12
+ projectId: process.env.INFURA_PROJECT_ID
13
+ });
14
+ };
15
+ var createQuicknodeWss = (chainId) => {
16
+ const quickNodeWSSUri = process.env.QUICKNODE_WSS_URI;
17
+ return quickNodeWSSUri ? new WebSocketProvider(quickNodeWSSUri, chainId) : void 0;
18
+ };
19
+ var createQuicknodeRpc = (chainId) => {
20
+ const quickNodeHttpsUri = process.env.QUICKNODE_HTTPS_URI;
21
+ return quickNodeHttpsUri ? new JsonRpcProvider(quickNodeHttpsUri, chainId) : void 0;
22
+ };
23
+ var getProviderFromEnv = (chainId = 1, options) => {
24
+ const { providerSource, providerType } = options ?? {};
25
+ let provider = void 0;
26
+ switch (providerSource) {
27
+ case "quicknode": {
28
+ switch (providerType) {
29
+ case "rpc": {
30
+ provider = createQuicknodeRpc(chainId);
31
+ break;
32
+ }
33
+ case "wss":
34
+ default: {
35
+ provider = createQuicknodeWss(chainId);
36
+ break;
37
+ }
38
+ }
39
+ break;
40
+ }
41
+ default:
42
+ case "infura": {
43
+ switch (providerType) {
44
+ case "rpc": {
45
+ provider = createInfuraRpc(chainId);
46
+ break;
47
+ }
48
+ case "wss":
49
+ default: {
50
+ provider = createInfuraWss(chainId);
51
+ break;
52
+ }
53
+ }
54
+ break;
55
+ }
56
+ }
57
+ if (!provider) {
58
+ provider = createInfuraWss(chainId) ?? createInfuraRpc(chainId) ?? createQuicknodeRpc(chainId);
59
+ }
60
+ return assertEx(provider, `Unable to create provider [${chainId}]: ${options ? JSON.stringify(options) : "default"}`);
61
+ };
62
+ var providers = {};
63
+ var getSharedProviderFromEnv = (chainId = 1, options) => {
64
+ const key = `${chainId}:${options ? JSON.stringify(options) : "default"}`;
65
+ providers[key] = providers[key] ?? getProviderFromEnv(chainId, options);
66
+ return providers[key];
67
+ };
68
+
69
+ // src/Witness.ts
70
+ import { AbstractWitness } from "@xyo-network/abstract-witness";
71
+ var BlockchainWitnessConfigSchema = "network.xyo.blockchain.witness";
72
+ var AbstractBlockchainWitness = class extends AbstractWitness {
73
+ get provider() {
74
+ const { providers: providers2 } = this.params;
75
+ return providers2[Date.now() % providers2.length];
76
+ }
77
+ };
78
+ export {
79
+ AbstractBlockchainWitness,
80
+ BlockchainWitnessConfigSchema,
81
+ getProviderFromEnv,
82
+ getSharedProviderFromEnv
83
+ };
84
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/lib/getProviderFromEnv.ts","../../src/Witness.ts"],"sourcesContent":["import { BaseProvider, InfuraProvider, InfuraWebSocketProvider, JsonRpcProvider, WebSocketProvider } from '@ethersproject/providers'\nimport { assertEx } from '@xylabs/assert'\n\nexport type ProviderSource = 'infura' | 'quicknode'\nexport type ProviderType = 'rpc' | 'wss'\n\nconst createInfuraRpc = (chainId: number) => {\n return new InfuraProvider(chainId, {\n projectId: process.env.INFURA_PROJECT_ID,\n projectSecret: process.env.INFURA_PROJECT_SECRET,\n })\n}\n\nconst createInfuraWss = (chainId: number) => {\n return new InfuraWebSocketProvider(chainId, {\n projectId: process.env.INFURA_PROJECT_ID,\n })\n}\n\nconst createQuicknodeWss = (chainId: number) => {\n const quickNodeWSSUri = process.env.QUICKNODE_WSS_URI\n return quickNodeWSSUri ? new WebSocketProvider(quickNodeWSSUri, chainId) : undefined\n}\n\nconst createQuicknodeRpc = (chainId: number) => {\n const quickNodeHttpsUri = process.env.QUICKNODE_HTTPS_URI\n return quickNodeHttpsUri ? new JsonRpcProvider(quickNodeHttpsUri, chainId) : undefined\n}\n\nexport const getProviderFromEnv = (\n chainId: number = 0x01,\n options?: { providerSource?: ProviderSource; providerType?: ProviderType },\n): BaseProvider => {\n const { providerSource, providerType } = options ?? {}\n let provider: BaseProvider | undefined = undefined\n switch (providerSource) {\n case 'quicknode': {\n switch (providerType) {\n case 'rpc': {\n provider = createQuicknodeRpc(chainId)\n break\n }\n case 'wss':\n default: {\n provider = createQuicknodeWss(chainId)\n break\n }\n }\n break\n }\n default:\n case 'infura': {\n switch (providerType) {\n case 'rpc': {\n provider = createInfuraRpc(chainId)\n break\n }\n case 'wss':\n default: {\n provider = createInfuraWss(chainId)\n break\n }\n }\n break\n }\n }\n if (!provider) {\n provider = createInfuraWss(chainId) ?? createInfuraRpc(chainId) ?? createQuicknodeRpc(chainId)\n }\n return assertEx(provider, `Unable to create provider [${chainId}]: ${options ? JSON.stringify(options) : 'default'}`)\n}\n\nconst providers: Record<string, BaseProvider> = {}\n\nexport const getSharedProviderFromEnv = (\n chainId: number = 0x01,\n options?: { providerSource?: ProviderSource; providerType?: ProviderType },\n): BaseProvider => {\n const key = `${chainId}:${options ? JSON.stringify(options) : 'default'}`\n providers[key] = providers[key] ?? getProviderFromEnv(chainId, options)\n return providers[key]\n}\n","import { BaseProvider } from '@ethersproject/providers'\nimport { AbstractWitness } from '@xyo-network/abstract-witness'\nimport { AnyObject, WithAdditional } from '@xyo-network/object'\nimport { Payload } from '@xyo-network/payload-model'\nimport { WitnessConfig, WitnessInstance, WitnessModuleEventData, WitnessParams } from '@xyo-network/witness-model'\n\nexport const BlockchainWitnessConfigSchema = 'network.xyo.blockchain.witness'\nexport type BlockchainWitnessConfigSchema = typeof BlockchainWitnessConfigSchema\n\nexport type BlockchainWitnessConfig<TAdditional extends Omit<Payload, 'schema'> | void = void, TSchema extends string | void = void> = WitnessConfig<\n TAdditional & { schema: TSchema extends void ? (TAdditional extends void ? string : BlockchainWitnessConfigSchema) : TSchema }\n>\n\nexport type AdditionalBlockchainWitnessParams = {\n providers: BaseProvider[]\n}\n\nexport type BlockchainWitnessParams<\n TConfig extends BlockchainWitnessConfig = BlockchainWitnessConfig,\n TAdditionalParams extends AnyObject | void = void,\n> = WitnessParams<\n TConfig,\n WithAdditional<\n {\n providers: BaseProvider[]\n },\n TAdditionalParams\n >\n>\n\nexport abstract class AbstractBlockchainWitness<\n TParams extends BlockchainWitnessParams = BlockchainWitnessParams,\n TIn extends Payload = Payload,\n TOut extends Payload = Payload,\n TEventData extends WitnessModuleEventData<WitnessInstance<TParams, TIn, TOut>, TIn, TOut> = WitnessModuleEventData<\n WitnessInstance<TParams, TIn, TOut>,\n TIn,\n TOut\n >,\n> extends AbstractWitness<TParams, TIn, TOut, TEventData> {\n get provider() {\n const { providers } = this.params\n return providers[Date.now() % providers.length] //pick a random provider\n }\n}\n"],"mappings":";AAAA,SAAuB,gBAAgB,yBAAyB,iBAAiB,yBAAyB;AAC1G,SAAS,gBAAgB;AAKzB,IAAM,kBAAkB,CAAC,YAAoB;AAC3C,SAAO,IAAI,eAAe,SAAS;AAAA,IACjC,WAAW,QAAQ,IAAI;AAAA,IACvB,eAAe,QAAQ,IAAI;AAAA,EAC7B,CAAC;AACH;AAEA,IAAM,kBAAkB,CAAC,YAAoB;AAC3C,SAAO,IAAI,wBAAwB,SAAS;AAAA,IAC1C,WAAW,QAAQ,IAAI;AAAA,EACzB,CAAC;AACH;AAEA,IAAM,qBAAqB,CAAC,YAAoB;AAC9C,QAAM,kBAAkB,QAAQ,IAAI;AACpC,SAAO,kBAAkB,IAAI,kBAAkB,iBAAiB,OAAO,IAAI;AAC7E;AAEA,IAAM,qBAAqB,CAAC,YAAoB;AAC9C,QAAM,oBAAoB,QAAQ,IAAI;AACtC,SAAO,oBAAoB,IAAI,gBAAgB,mBAAmB,OAAO,IAAI;AAC/E;AAEO,IAAM,qBAAqB,CAChC,UAAkB,GAClB,YACiB;AACjB,QAAM,EAAE,gBAAgB,aAAa,IAAI,WAAW,CAAC;AACrD,MAAI,WAAqC;AACzC,UAAQ,gBAAgB;AAAA,IACtB,KAAK,aAAa;AAChB,cAAQ,cAAc;AAAA,QACpB,KAAK,OAAO;AACV,qBAAW,mBAAmB,OAAO;AACrC;AAAA,QACF;AAAA,QACA,KAAK;AAAA,QACL,SAAS;AACP,qBAAW,mBAAmB,OAAO;AACrC;AAAA,QACF;AAAA,MACF;AACA;AAAA,IACF;AAAA,IACA;AAAA,IACA,KAAK,UAAU;AACb,cAAQ,cAAc;AAAA,QACpB,KAAK,OAAO;AACV,qBAAW,gBAAgB,OAAO;AAClC;AAAA,QACF;AAAA,QACA,KAAK;AAAA,QACL,SAAS;AACP,qBAAW,gBAAgB,OAAO;AAClC;AAAA,QACF;AAAA,MACF;AACA;AAAA,IACF;AAAA,EACF;AACA,MAAI,CAAC,UAAU;AACb,eAAW,gBAAgB,OAAO,KAAK,gBAAgB,OAAO,KAAK,mBAAmB,OAAO;AAAA,EAC/F;AACA,SAAO,SAAS,UAAU,8BAA8B,OAAO,MAAM,UAAU,KAAK,UAAU,OAAO,IAAI,SAAS,EAAE;AACtH;AAEA,IAAM,YAA0C,CAAC;AAE1C,IAAM,2BAA2B,CACtC,UAAkB,GAClB,YACiB;AACjB,QAAM,MAAM,GAAG,OAAO,IAAI,UAAU,KAAK,UAAU,OAAO,IAAI,SAAS;AACvE,YAAU,GAAG,IAAI,UAAU,GAAG,KAAK,mBAAmB,SAAS,OAAO;AACtE,SAAO,UAAU,GAAG;AACtB;;;AChFA,SAAS,uBAAuB;AAKzB,IAAM,gCAAgC;AAwBtC,IAAe,4BAAf,cASG,gBAAgD;AAAA,EACxD,IAAI,WAAW;AACb,UAAM,EAAE,WAAAA,WAAU,IAAI,KAAK;AAC3B,WAAOA,WAAU,KAAK,IAAI,IAAIA,WAAU,MAAM;AAAA,EAChD;AACF;","names":["providers"]}
@@ -0,0 +1,12 @@
1
+ import { BaseProvider } from '@ethersproject/providers';
2
+ export type ProviderSource = 'infura' | 'quicknode';
3
+ export type ProviderType = 'rpc' | 'wss';
4
+ export declare const getProviderFromEnv: (chainId?: number, options?: {
5
+ providerSource?: ProviderSource;
6
+ providerType?: ProviderType;
7
+ }) => BaseProvider;
8
+ export declare const getSharedProviderFromEnv: (chainId?: number, options?: {
9
+ providerSource?: ProviderSource;
10
+ providerType?: ProviderType;
11
+ }) => BaseProvider;
12
+ //# sourceMappingURL=getProviderFromEnv.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getProviderFromEnv.d.ts","sourceRoot":"","sources":["../../../src/lib/getProviderFromEnv.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAA+E,MAAM,0BAA0B,CAAA;AAGpI,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,WAAW,CAAA;AACnD,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,KAAK,CAAA;AAyBxC,eAAO,MAAM,kBAAkB,aACpB,MAAM,YACL;IAAE,cAAc,CAAC,EAAE,cAAc,CAAC;IAAC,YAAY,CAAC,EAAE,YAAY,CAAA;CAAE,KACzE,YAsCF,CAAA;AAID,eAAO,MAAM,wBAAwB,aAC1B,MAAM,YACL;IAAE,cAAc,CAAC,EAAE,cAAc,CAAC;IAAC,YAAY,CAAC,EAAE,YAAY,CAAA;CAAE,KACzE,YAIF,CAAA"}
@@ -0,0 +1,12 @@
1
+ import { BaseProvider } from '@ethersproject/providers';
2
+ export type ProviderSource = 'infura' | 'quicknode';
3
+ export type ProviderType = 'rpc' | 'wss';
4
+ export declare const getProviderFromEnv: (chainId?: number, options?: {
5
+ providerSource?: ProviderSource;
6
+ providerType?: ProviderType;
7
+ }) => BaseProvider;
8
+ export declare const getSharedProviderFromEnv: (chainId?: number, options?: {
9
+ providerSource?: ProviderSource;
10
+ providerType?: ProviderType;
11
+ }) => BaseProvider;
12
+ //# sourceMappingURL=getProviderFromEnv.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getProviderFromEnv.d.ts","sourceRoot":"","sources":["../../../src/lib/getProviderFromEnv.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAA+E,MAAM,0BAA0B,CAAA;AAGpI,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,WAAW,CAAA;AACnD,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,KAAK,CAAA;AAyBxC,eAAO,MAAM,kBAAkB,aACpB,MAAM,YACL;IAAE,cAAc,CAAC,EAAE,cAAc,CAAC;IAAC,YAAY,CAAC,EAAE,YAAY,CAAA;CAAE,KACzE,YAsCF,CAAA;AAID,eAAO,MAAM,wBAAwB,aAC1B,MAAM,YACL;IAAE,cAAc,CAAC,EAAE,cAAc,CAAC;IAAC,YAAY,CAAC,EAAE,YAAY,CAAA;CAAE,KACzE,YAIF,CAAA"}
@@ -0,0 +1,12 @@
1
+ import { BaseProvider } from '@ethersproject/providers';
2
+ export type ProviderSource = 'infura' | 'quicknode';
3
+ export type ProviderType = 'rpc' | 'wss';
4
+ export declare const getProviderFromEnv: (chainId?: number, options?: {
5
+ providerSource?: ProviderSource;
6
+ providerType?: ProviderType;
7
+ }) => BaseProvider;
8
+ export declare const getSharedProviderFromEnv: (chainId?: number, options?: {
9
+ providerSource?: ProviderSource;
10
+ providerType?: ProviderType;
11
+ }) => BaseProvider;
12
+ //# sourceMappingURL=getProviderFromEnv.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getProviderFromEnv.d.ts","sourceRoot":"","sources":["../../../src/lib/getProviderFromEnv.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAA+E,MAAM,0BAA0B,CAAA;AAGpI,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,WAAW,CAAA;AACnD,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,KAAK,CAAA;AAyBxC,eAAO,MAAM,kBAAkB,aACpB,MAAM,YACL;IAAE,cAAc,CAAC,EAAE,cAAc,CAAC;IAAC,YAAY,CAAC,EAAE,YAAY,CAAA;CAAE,KACzE,YAsCF,CAAA;AAID,eAAO,MAAM,wBAAwB,aAC1B,MAAM,YACL;IAAE,cAAc,CAAC,EAAE,cAAc,CAAC;IAAC,YAAY,CAAC,EAAE,YAAY,CAAA;CAAE,KACzE,YAIF,CAAA"}
@@ -0,0 +1,2 @@
1
+ export * from './getProviderFromEnv';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAA"}
@@ -0,0 +1,2 @@
1
+ export * from './getProviderFromEnv';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAA"}
@@ -0,0 +1,2 @@
1
+ export * from './getProviderFromEnv';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAA"}
package/package.json ADDED
@@ -0,0 +1,69 @@
1
+ {
2
+ "name": "@xyo-network/witness-blockchain-abstract",
3
+ "author": {
4
+ "email": "support@xyo.network",
5
+ "name": "XYO Development Team",
6
+ "url": "https://xyo.network"
7
+ },
8
+ "bugs": {
9
+ "email": "support@xyo.network",
10
+ "url": "https://github.com/XYOracleNetwork/sdk-xyo-client-js/issues"
11
+ },
12
+ "dependencies": {
13
+ "@xylabs/assert": "^2.13.3",
14
+ "@xyo-network/abstract-witness": "~2.79.1",
15
+ "@xyo-network/object": "~2.79.1",
16
+ "@xyo-network/payload-model": "~2.79.1",
17
+ "@xyo-network/witness-model": "~2.79.1"
18
+ },
19
+ "devDependencies": {
20
+ "@ethersproject/providers": "^5.7.2",
21
+ "@xylabs/jest-helpers": "^2.13.3",
22
+ "@xylabs/ts-scripts-yarn3": "^3.1.21",
23
+ "@xylabs/tsconfig": "^3.1.21",
24
+ "ethers": "^5.7.2",
25
+ "jest": "^29.7.0",
26
+ "typescript": "^5.2.2"
27
+ },
28
+ "description": "Primary SDK for using XYO Protocol 2.0",
29
+ "types": "dist/node/index.d.mts",
30
+ "exports": {
31
+ ".": {
32
+ "browser": {
33
+ "require": {
34
+ "types": "./dist/browser/index.d.cts",
35
+ "default": "./dist/browser/index.cjs"
36
+ },
37
+ "import": {
38
+ "types": "./dist/browser/index.d.mts",
39
+ "default": "./dist/browser/index.js"
40
+ }
41
+ },
42
+ "node": {
43
+ "require": {
44
+ "types": "./dist/node/index.d.mts",
45
+ "default": "./dist/node/index.cjs"
46
+ },
47
+ "import": {
48
+ "types": "./dist/node/index.d.mts",
49
+ "default": "./dist/node/index.js"
50
+ }
51
+ }
52
+ },
53
+ "./package.json": "./package.json"
54
+ },
55
+ "main": "dist/node/index.cjs",
56
+ "module": "dist/node/index.js",
57
+ "homepage": "https://xyo.network",
58
+ "license": "LGPL-3.0-only",
59
+ "publishConfig": {
60
+ "access": "public"
61
+ },
62
+ "repository": {
63
+ "type": "git",
64
+ "url": "https://github.com/XYOracleNetwork/sdk-xyo-client-js.git"
65
+ },
66
+ "sideEffects": false,
67
+ "version": "2.79.1",
68
+ "type": "module"
69
+ }
package/src/Witness.ts ADDED
@@ -0,0 +1,45 @@
1
+ import { BaseProvider } from '@ethersproject/providers'
2
+ import { AbstractWitness } from '@xyo-network/abstract-witness'
3
+ import { AnyObject, WithAdditional } from '@xyo-network/object'
4
+ import { Payload } from '@xyo-network/payload-model'
5
+ import { WitnessConfig, WitnessInstance, WitnessModuleEventData, WitnessParams } from '@xyo-network/witness-model'
6
+
7
+ export const BlockchainWitnessConfigSchema = 'network.xyo.blockchain.witness'
8
+ export type BlockchainWitnessConfigSchema = typeof BlockchainWitnessConfigSchema
9
+
10
+ export type BlockchainWitnessConfig<TAdditional extends Omit<Payload, 'schema'> | void = void, TSchema extends string | void = void> = WitnessConfig<
11
+ TAdditional & { schema: TSchema extends void ? (TAdditional extends void ? string : BlockchainWitnessConfigSchema) : TSchema }
12
+ >
13
+
14
+ export type AdditionalBlockchainWitnessParams = {
15
+ providers: BaseProvider[]
16
+ }
17
+
18
+ export type BlockchainWitnessParams<
19
+ TConfig extends BlockchainWitnessConfig = BlockchainWitnessConfig,
20
+ TAdditionalParams extends AnyObject | void = void,
21
+ > = WitnessParams<
22
+ TConfig,
23
+ WithAdditional<
24
+ {
25
+ providers: BaseProvider[]
26
+ },
27
+ TAdditionalParams
28
+ >
29
+ >
30
+
31
+ export abstract class AbstractBlockchainWitness<
32
+ TParams extends BlockchainWitnessParams = BlockchainWitnessParams,
33
+ TIn extends Payload = Payload,
34
+ TOut extends Payload = Payload,
35
+ TEventData extends WitnessModuleEventData<WitnessInstance<TParams, TIn, TOut>, TIn, TOut> = WitnessModuleEventData<
36
+ WitnessInstance<TParams, TIn, TOut>,
37
+ TIn,
38
+ TOut
39
+ >,
40
+ > extends AbstractWitness<TParams, TIn, TOut, TEventData> {
41
+ get provider() {
42
+ const { providers } = this.params
43
+ return providers[Date.now() % providers.length] //pick a random provider
44
+ }
45
+ }
package/src/index.ts ADDED
@@ -0,0 +1,2 @@
1
+ export * from './lib'
2
+ export * from './Witness'
@@ -0,0 +1,82 @@
1
+ import { BaseProvider, InfuraProvider, InfuraWebSocketProvider, JsonRpcProvider, WebSocketProvider } from '@ethersproject/providers'
2
+ import { assertEx } from '@xylabs/assert'
3
+
4
+ export type ProviderSource = 'infura' | 'quicknode'
5
+ export type ProviderType = 'rpc' | 'wss'
6
+
7
+ const createInfuraRpc = (chainId: number) => {
8
+ return new InfuraProvider(chainId, {
9
+ projectId: process.env.INFURA_PROJECT_ID,
10
+ projectSecret: process.env.INFURA_PROJECT_SECRET,
11
+ })
12
+ }
13
+
14
+ const createInfuraWss = (chainId: number) => {
15
+ return new InfuraWebSocketProvider(chainId, {
16
+ projectId: process.env.INFURA_PROJECT_ID,
17
+ })
18
+ }
19
+
20
+ const createQuicknodeWss = (chainId: number) => {
21
+ const quickNodeWSSUri = process.env.QUICKNODE_WSS_URI
22
+ return quickNodeWSSUri ? new WebSocketProvider(quickNodeWSSUri, chainId) : undefined
23
+ }
24
+
25
+ const createQuicknodeRpc = (chainId: number) => {
26
+ const quickNodeHttpsUri = process.env.QUICKNODE_HTTPS_URI
27
+ return quickNodeHttpsUri ? new JsonRpcProvider(quickNodeHttpsUri, chainId) : undefined
28
+ }
29
+
30
+ export const getProviderFromEnv = (
31
+ chainId: number = 0x01,
32
+ options?: { providerSource?: ProviderSource; providerType?: ProviderType },
33
+ ): BaseProvider => {
34
+ const { providerSource, providerType } = options ?? {}
35
+ let provider: BaseProvider | undefined = undefined
36
+ switch (providerSource) {
37
+ case 'quicknode': {
38
+ switch (providerType) {
39
+ case 'rpc': {
40
+ provider = createQuicknodeRpc(chainId)
41
+ break
42
+ }
43
+ case 'wss':
44
+ default: {
45
+ provider = createQuicknodeWss(chainId)
46
+ break
47
+ }
48
+ }
49
+ break
50
+ }
51
+ default:
52
+ case 'infura': {
53
+ switch (providerType) {
54
+ case 'rpc': {
55
+ provider = createInfuraRpc(chainId)
56
+ break
57
+ }
58
+ case 'wss':
59
+ default: {
60
+ provider = createInfuraWss(chainId)
61
+ break
62
+ }
63
+ }
64
+ break
65
+ }
66
+ }
67
+ if (!provider) {
68
+ provider = createInfuraWss(chainId) ?? createInfuraRpc(chainId) ?? createQuicknodeRpc(chainId)
69
+ }
70
+ return assertEx(provider, `Unable to create provider [${chainId}]: ${options ? JSON.stringify(options) : 'default'}`)
71
+ }
72
+
73
+ const providers: Record<string, BaseProvider> = {}
74
+
75
+ export const getSharedProviderFromEnv = (
76
+ chainId: number = 0x01,
77
+ options?: { providerSource?: ProviderSource; providerType?: ProviderType },
78
+ ): BaseProvider => {
79
+ const key = `${chainId}:${options ? JSON.stringify(options) : 'default'}`
80
+ providers[key] = providers[key] ?? getProviderFromEnv(chainId, options)
81
+ return providers[key]
82
+ }
@@ -0,0 +1 @@
1
+ export * from './getProviderFromEnv'
package/typedoc.json ADDED
@@ -0,0 +1,5 @@
1
+ {
2
+ "$schema": "https://typedoc.org/schema.json",
3
+ "entryPoints": ["./src/index.ts"],
4
+ "tsconfig": "./tsconfig.typedoc.json"
5
+ }