@xyo-network/witness-blockchain-abstract 2.79.2 → 2.79.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 (48) hide show
  1. package/dist/browser/index.cjs +76 -1
  2. package/dist/browser/index.cjs.map +1 -1
  3. package/dist/browser/index.js +76 -1
  4. package/dist/browser/index.js.map +1 -1
  5. package/dist/browser/lib/checkIpfsUrl.d.cts +8 -0
  6. package/dist/browser/lib/checkIpfsUrl.d.cts.map +1 -0
  7. package/dist/browser/lib/checkIpfsUrl.d.mts +8 -0
  8. package/dist/browser/lib/checkIpfsUrl.d.mts.map +1 -0
  9. package/dist/browser/lib/checkIpfsUrl.d.ts +8 -0
  10. package/dist/browser/lib/checkIpfsUrl.d.ts.map +1 -0
  11. package/dist/browser/lib/getErc1967Status.d.cts +19 -0
  12. package/dist/browser/lib/getErc1967Status.d.cts.map +1 -0
  13. package/dist/browser/lib/getErc1967Status.d.mts +19 -0
  14. package/dist/browser/lib/getErc1967Status.d.mts.map +1 -0
  15. package/dist/browser/lib/getErc1967Status.d.ts +19 -0
  16. package/dist/browser/lib/getErc1967Status.d.ts.map +1 -0
  17. package/dist/browser/lib/index.d.cts +2 -0
  18. package/dist/browser/lib/index.d.cts.map +1 -1
  19. package/dist/browser/lib/index.d.mts +2 -0
  20. package/dist/browser/lib/index.d.mts.map +1 -1
  21. package/dist/browser/lib/index.d.ts +2 -0
  22. package/dist/browser/lib/index.d.ts.map +1 -1
  23. package/dist/node/index.cjs +84 -2
  24. package/dist/node/index.cjs.map +1 -1
  25. package/dist/node/index.js +76 -1
  26. package/dist/node/index.js.map +1 -1
  27. package/dist/node/lib/checkIpfsUrl.d.cts +8 -0
  28. package/dist/node/lib/checkIpfsUrl.d.cts.map +1 -0
  29. package/dist/node/lib/checkIpfsUrl.d.mts +8 -0
  30. package/dist/node/lib/checkIpfsUrl.d.mts.map +1 -0
  31. package/dist/node/lib/checkIpfsUrl.d.ts +8 -0
  32. package/dist/node/lib/checkIpfsUrl.d.ts.map +1 -0
  33. package/dist/node/lib/getErc1967Status.d.cts +19 -0
  34. package/dist/node/lib/getErc1967Status.d.cts.map +1 -0
  35. package/dist/node/lib/getErc1967Status.d.mts +19 -0
  36. package/dist/node/lib/getErc1967Status.d.mts.map +1 -0
  37. package/dist/node/lib/getErc1967Status.d.ts +19 -0
  38. package/dist/node/lib/getErc1967Status.d.ts.map +1 -0
  39. package/dist/node/lib/index.d.cts +2 -0
  40. package/dist/node/lib/index.d.cts.map +1 -1
  41. package/dist/node/lib/index.d.mts +2 -0
  42. package/dist/node/lib/index.d.mts.map +1 -1
  43. package/dist/node/lib/index.d.ts +2 -0
  44. package/dist/node/lib/index.d.ts.map +1 -1
  45. package/package.json +5 -5
  46. package/src/lib/checkIpfsUrl.ts +29 -0
  47. package/src/lib/getErc1967Status.ts +63 -0
  48. package/src/lib/index.ts +2 -0
@@ -22,11 +22,86 @@ var src_exports = {};
22
22
  __export(src_exports, {
23
23
  AbstractBlockchainWitness: () => AbstractBlockchainWitness,
24
24
  BlockchainWitnessConfigSchema: () => BlockchainWitnessConfigSchema,
25
+ ERC1967_PROXY_ADMIN_STORAGE_SLOT: () => ERC1967_PROXY_ADMIN_STORAGE_SLOT,
26
+ ERC1967_PROXY_BEACON_STORAGE_SLOT: () => ERC1967_PROXY_BEACON_STORAGE_SLOT,
27
+ ERC1967_PROXY_IMPLEMENTATION_STORAGE_SLOT: () => ERC1967_PROXY_IMPLEMENTATION_STORAGE_SLOT,
28
+ ERC1967_PROXY_ROLLBACK_STORAGE_SLOT: () => ERC1967_PROXY_ROLLBACK_STORAGE_SLOT,
29
+ checkIpfsUrl: () => checkIpfsUrl,
30
+ getErc1967Status: () => getErc1967Status,
25
31
  getProviderFromEnv: () => getProviderFromEnv,
26
- getSharedProviderFromEnv: () => getSharedProviderFromEnv
32
+ getSharedProviderFromEnv: () => getSharedProviderFromEnv,
33
+ readAddressFromSlot: () => readAddressFromSlot
27
34
  });
28
35
  module.exports = __toCommonJS(src_exports);
29
36
 
37
+ // src/lib/checkIpfsUrl.ts
38
+ var checkIpfsUrl = (urlToCheck, ipfsGateway) => {
39
+ try {
40
+ const url = new URL(urlToCheck);
41
+ let protocol = url.protocol;
42
+ let host = url.host;
43
+ let path = url.pathname;
44
+ const query = url.search;
45
+ if (protocol === "ipfs:") {
46
+ protocol = "https:";
47
+ host = ipfsGateway;
48
+ path = url.host === "ipfs" ? `ipfs${path}` : `ipfs/${url.host}${path}`;
49
+ const root = `${protocol}//${host}/${path}`;
50
+ return query?.length > 0 ? `${root}?${query}` : root;
51
+ } else {
52
+ return urlToCheck;
53
+ }
54
+ } catch (ex) {
55
+ const error = ex;
56
+ console.error(`${error.name}:${error.message} [${urlToCheck}]`);
57
+ console.log(error.stack);
58
+ return void 0;
59
+ }
60
+ };
61
+
62
+ // src/lib/getErc1967Status.ts
63
+ var import_bignumber = require("@xylabs/bignumber");
64
+ var import_open_zeppelin_typechain = require("@xyo-network/open-zeppelin-typechain");
65
+ var ERC1967_PROXY_IMPLEMENTATION_STORAGE_SLOT = "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc";
66
+ var ERC1967_PROXY_BEACON_STORAGE_SLOT = "0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50";
67
+ var ERC1967_PROXY_ADMIN_STORAGE_SLOT = "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103";
68
+ var ERC1967_PROXY_ROLLBACK_STORAGE_SLOT = "0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143";
69
+ var hexBytesOnlyOnly = (value) => {
70
+ return value.startsWith("0x") ? value.substring(2) : value;
71
+ };
72
+ var addressFromHex = (value) => {
73
+ return `0x${hexBytesOnlyOnly(value).substring(24)}`;
74
+ };
75
+ var isHexZero = (value) => {
76
+ return new import_bignumber.BigNumber(hexBytesOnlyOnly(value), "hex").eqn(0);
77
+ };
78
+ var readAddressFromSlot = async (provider, address, slot) => {
79
+ const slotValue = await provider.getStorageAt(address, slot);
80
+ return addressFromHex(slotValue);
81
+ };
82
+ var getErc1967Status = async (provider, address) => {
83
+ const proxy = {
84
+ admin: await readAddressFromSlot(provider, address, ERC1967_PROXY_ADMIN_STORAGE_SLOT),
85
+ beacon: await readAddressFromSlot(provider, address, ERC1967_PROXY_BEACON_STORAGE_SLOT),
86
+ implementation: await readAddressFromSlot(provider, address, ERC1967_PROXY_IMPLEMENTATION_STORAGE_SLOT),
87
+ rollback: await readAddressFromSlot(provider, address, ERC1967_PROXY_ROLLBACK_STORAGE_SLOT)
88
+ };
89
+ if (!isHexZero(proxy.beacon)) {
90
+ const beacon = import_open_zeppelin_typechain.UpgradeableBeacon__factory.connect(proxy.beacon, provider);
91
+ try {
92
+ proxy.implementation = await beacon.callStatic.implementation();
93
+ } catch (ex) {
94
+ const error = ex;
95
+ console.log(error.message);
96
+ }
97
+ }
98
+ return {
99
+ address,
100
+ implementation: isHexZero(proxy.implementation) ? address : proxy.implementation,
101
+ proxy
102
+ };
103
+ };
104
+
30
105
  // src/lib/getProviderFromEnv.ts
31
106
  var import_providers = require("@ethersproject/providers");
32
107
  var import_assert = require("@xylabs/assert");
@@ -1 +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"]}
1
+ {"version":3,"sources":["../../src/index.ts","../../src/lib/checkIpfsUrl.ts","../../src/lib/getErc1967Status.ts","../../src/lib/getProviderFromEnv.ts","../../src/Witness.ts"],"sourcesContent":["export * from './lib'\nexport * from './Witness'\n","/**\n * Returns the equivalent IPFS gateway URL for the supplied URL.\n * @param urlToCheck The URL to check\n * @returns If the supplied URL is an IPFS URL, it converts the URL to the\n * equivalent IPFS gateway URL. Otherwise, returns the original URL.\n */\nexport const checkIpfsUrl = (urlToCheck: string, ipfsGateway: string) => {\n try {\n const url = new URL(urlToCheck)\n let protocol = url.protocol\n let host = url.host\n let path = url.pathname\n const query = url.search\n if (protocol === 'ipfs:') {\n protocol = 'https:'\n host = ipfsGateway\n path = url.host === 'ipfs' ? `ipfs${path}` : `ipfs/${url.host}${path}`\n const root = `${protocol}//${host}/${path}`\n return query?.length > 0 ? `${root}?${query}` : root\n } else {\n return urlToCheck\n }\n } catch (ex) {\n const error = ex as Error\n console.error(`${error.name}:${error.message} [${urlToCheck}]`)\n console.log(error.stack)\n return undefined\n }\n}\n","import { BaseProvider } from '@ethersproject/providers'\nimport { BigNumber } from '@xylabs/bignumber'\nimport { UpgradeableBeacon__factory } from '@xyo-network/open-zeppelin-typechain'\n\nexport const ERC1967_PROXY_IMPLEMENTATION_STORAGE_SLOT = '0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc'\nexport const ERC1967_PROXY_BEACON_STORAGE_SLOT = '0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50'\nexport const ERC1967_PROXY_ADMIN_STORAGE_SLOT = '0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103'\nexport const ERC1967_PROXY_ROLLBACK_STORAGE_SLOT = '0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143'\n\nexport interface Erc1967DataSlots {\n admin: string\n beacon: string\n implementation: string\n rollback: string\n}\n\nexport interface Erc1967Status {\n address: string\n implementation: string\n proxy: Erc1967DataSlots\n}\n\nconst hexBytesOnlyOnly = (value: string) => {\n return value.startsWith('0x') ? value.substring(2) : value\n}\n\nconst addressFromHex = (value: string) => {\n return `0x${hexBytesOnlyOnly(value).substring(24)}`\n}\n\nconst isHexZero = (value: string) => {\n return new BigNumber(hexBytesOnlyOnly(value), 'hex').eqn(0)\n}\n\nexport const readAddressFromSlot = async (provider: BaseProvider, address: string, slot: string) => {\n const slotValue = await provider.getStorageAt(address, slot)\n return addressFromHex(slotValue)\n}\n\nexport const getErc1967Status = async (provider: BaseProvider, address: string): Promise<Erc1967Status> => {\n const proxy: Erc1967DataSlots = {\n admin: await readAddressFromSlot(provider, address, ERC1967_PROXY_ADMIN_STORAGE_SLOT),\n beacon: await readAddressFromSlot(provider, address, ERC1967_PROXY_BEACON_STORAGE_SLOT),\n implementation: await readAddressFromSlot(provider, address, ERC1967_PROXY_IMPLEMENTATION_STORAGE_SLOT),\n rollback: await readAddressFromSlot(provider, address, ERC1967_PROXY_ROLLBACK_STORAGE_SLOT),\n }\n\n if (!isHexZero(proxy.beacon)) {\n const beacon = UpgradeableBeacon__factory.connect(proxy.beacon, provider)\n try {\n proxy.implementation = await beacon.callStatic.implementation()\n } catch (ex) {\n const error = ex as Error\n console.log(error.message)\n }\n }\n\n return {\n address,\n implementation: isHexZero(proxy.implementation) ? address : proxy.implementation,\n proxy,\n }\n}\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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACMO,IAAM,eAAe,CAAC,YAAoB,gBAAwB;AACvE,MAAI;AACF,UAAM,MAAM,IAAI,IAAI,UAAU;AAC9B,QAAI,WAAW,IAAI;AACnB,QAAI,OAAO,IAAI;AACf,QAAI,OAAO,IAAI;AACf,UAAM,QAAQ,IAAI;AAClB,QAAI,aAAa,SAAS;AACxB,iBAAW;AACX,aAAO;AACP,aAAO,IAAI,SAAS,SAAS,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,GAAG,IAAI;AACpE,YAAM,OAAO,GAAG,QAAQ,KAAK,IAAI,IAAI,IAAI;AACzC,aAAO,OAAO,SAAS,IAAI,GAAG,IAAI,IAAI,KAAK,KAAK;AAAA,IAClD,OAAO;AACL,aAAO;AAAA,IACT;AAAA,EACF,SAAS,IAAI;AACX,UAAM,QAAQ;AACd,YAAQ,MAAM,GAAG,MAAM,IAAI,IAAI,MAAM,OAAO,KAAK,UAAU,GAAG;AAC9D,YAAQ,IAAI,MAAM,KAAK;AACvB,WAAO;AAAA,EACT;AACF;;;AC3BA,uBAA0B;AAC1B,qCAA2C;AAEpC,IAAM,4CAA4C;AAClD,IAAM,oCAAoC;AAC1C,IAAM,mCAAmC;AACzC,IAAM,sCAAsC;AAenD,IAAM,mBAAmB,CAAC,UAAkB;AAC1C,SAAO,MAAM,WAAW,IAAI,IAAI,MAAM,UAAU,CAAC,IAAI;AACvD;AAEA,IAAM,iBAAiB,CAAC,UAAkB;AACxC,SAAO,KAAK,iBAAiB,KAAK,EAAE,UAAU,EAAE,CAAC;AACnD;AAEA,IAAM,YAAY,CAAC,UAAkB;AACnC,SAAO,IAAI,2BAAU,iBAAiB,KAAK,GAAG,KAAK,EAAE,IAAI,CAAC;AAC5D;AAEO,IAAM,sBAAsB,OAAO,UAAwB,SAAiB,SAAiB;AAClG,QAAM,YAAY,MAAM,SAAS,aAAa,SAAS,IAAI;AAC3D,SAAO,eAAe,SAAS;AACjC;AAEO,IAAM,mBAAmB,OAAO,UAAwB,YAA4C;AACzG,QAAM,QAA0B;AAAA,IAC9B,OAAO,MAAM,oBAAoB,UAAU,SAAS,gCAAgC;AAAA,IACpF,QAAQ,MAAM,oBAAoB,UAAU,SAAS,iCAAiC;AAAA,IACtF,gBAAgB,MAAM,oBAAoB,UAAU,SAAS,yCAAyC;AAAA,IACtG,UAAU,MAAM,oBAAoB,UAAU,SAAS,mCAAmC;AAAA,EAC5F;AAEA,MAAI,CAAC,UAAU,MAAM,MAAM,GAAG;AAC5B,UAAM,SAAS,0DAA2B,QAAQ,MAAM,QAAQ,QAAQ;AACxE,QAAI;AACF,YAAM,iBAAiB,MAAM,OAAO,WAAW,eAAe;AAAA,IAChE,SAAS,IAAI;AACX,YAAM,QAAQ;AACd,cAAQ,IAAI,MAAM,OAAO;AAAA,IAC3B;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA,gBAAgB,UAAU,MAAM,cAAc,IAAI,UAAU,MAAM;AAAA,IAClE;AAAA,EACF;AACF;;;AC9DA,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"]}
@@ -1,3 +1,71 @@
1
+ // src/lib/checkIpfsUrl.ts
2
+ var checkIpfsUrl = (urlToCheck, ipfsGateway) => {
3
+ try {
4
+ const url = new URL(urlToCheck);
5
+ let protocol = url.protocol;
6
+ let host = url.host;
7
+ let path = url.pathname;
8
+ const query = url.search;
9
+ if (protocol === "ipfs:") {
10
+ protocol = "https:";
11
+ host = ipfsGateway;
12
+ path = url.host === "ipfs" ? `ipfs${path}` : `ipfs/${url.host}${path}`;
13
+ const root = `${protocol}//${host}/${path}`;
14
+ return query?.length > 0 ? `${root}?${query}` : root;
15
+ } else {
16
+ return urlToCheck;
17
+ }
18
+ } catch (ex) {
19
+ const error = ex;
20
+ console.error(`${error.name}:${error.message} [${urlToCheck}]`);
21
+ console.log(error.stack);
22
+ return void 0;
23
+ }
24
+ };
25
+
26
+ // src/lib/getErc1967Status.ts
27
+ import { BigNumber } from "@xylabs/bignumber";
28
+ import { UpgradeableBeacon__factory } from "@xyo-network/open-zeppelin-typechain";
29
+ var ERC1967_PROXY_IMPLEMENTATION_STORAGE_SLOT = "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc";
30
+ var ERC1967_PROXY_BEACON_STORAGE_SLOT = "0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50";
31
+ var ERC1967_PROXY_ADMIN_STORAGE_SLOT = "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103";
32
+ var ERC1967_PROXY_ROLLBACK_STORAGE_SLOT = "0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143";
33
+ var hexBytesOnlyOnly = (value) => {
34
+ return value.startsWith("0x") ? value.substring(2) : value;
35
+ };
36
+ var addressFromHex = (value) => {
37
+ return `0x${hexBytesOnlyOnly(value).substring(24)}`;
38
+ };
39
+ var isHexZero = (value) => {
40
+ return new BigNumber(hexBytesOnlyOnly(value), "hex").eqn(0);
41
+ };
42
+ var readAddressFromSlot = async (provider, address, slot) => {
43
+ const slotValue = await provider.getStorageAt(address, slot);
44
+ return addressFromHex(slotValue);
45
+ };
46
+ var getErc1967Status = async (provider, address) => {
47
+ const proxy = {
48
+ admin: await readAddressFromSlot(provider, address, ERC1967_PROXY_ADMIN_STORAGE_SLOT),
49
+ beacon: await readAddressFromSlot(provider, address, ERC1967_PROXY_BEACON_STORAGE_SLOT),
50
+ implementation: await readAddressFromSlot(provider, address, ERC1967_PROXY_IMPLEMENTATION_STORAGE_SLOT),
51
+ rollback: await readAddressFromSlot(provider, address, ERC1967_PROXY_ROLLBACK_STORAGE_SLOT)
52
+ };
53
+ if (!isHexZero(proxy.beacon)) {
54
+ const beacon = UpgradeableBeacon__factory.connect(proxy.beacon, provider);
55
+ try {
56
+ proxy.implementation = await beacon.callStatic.implementation();
57
+ } catch (ex) {
58
+ const error = ex;
59
+ console.log(error.message);
60
+ }
61
+ }
62
+ return {
63
+ address,
64
+ implementation: isHexZero(proxy.implementation) ? address : proxy.implementation,
65
+ proxy
66
+ };
67
+ };
68
+
1
69
  // src/lib/getProviderFromEnv.ts
2
70
  import { InfuraProvider, InfuraWebSocketProvider, JsonRpcProvider, WebSocketProvider } from "@ethersproject/providers";
3
71
  import { assertEx } from "@xylabs/assert";
@@ -78,7 +146,14 @@ var AbstractBlockchainWitness = class extends AbstractWitness {
78
146
  export {
79
147
  AbstractBlockchainWitness,
80
148
  BlockchainWitnessConfigSchema,
149
+ ERC1967_PROXY_ADMIN_STORAGE_SLOT,
150
+ ERC1967_PROXY_BEACON_STORAGE_SLOT,
151
+ ERC1967_PROXY_IMPLEMENTATION_STORAGE_SLOT,
152
+ ERC1967_PROXY_ROLLBACK_STORAGE_SLOT,
153
+ checkIpfsUrl,
154
+ getErc1967Status,
81
155
  getProviderFromEnv,
82
- getSharedProviderFromEnv
156
+ getSharedProviderFromEnv,
157
+ readAddressFromSlot
83
158
  };
84
159
  //# sourceMappingURL=index.js.map
@@ -1 +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"]}
1
+ {"version":3,"sources":["../../src/lib/checkIpfsUrl.ts","../../src/lib/getErc1967Status.ts","../../src/lib/getProviderFromEnv.ts","../../src/Witness.ts"],"sourcesContent":["/**\n * Returns the equivalent IPFS gateway URL for the supplied URL.\n * @param urlToCheck The URL to check\n * @returns If the supplied URL is an IPFS URL, it converts the URL to the\n * equivalent IPFS gateway URL. Otherwise, returns the original URL.\n */\nexport const checkIpfsUrl = (urlToCheck: string, ipfsGateway: string) => {\n try {\n const url = new URL(urlToCheck)\n let protocol = url.protocol\n let host = url.host\n let path = url.pathname\n const query = url.search\n if (protocol === 'ipfs:') {\n protocol = 'https:'\n host = ipfsGateway\n path = url.host === 'ipfs' ? `ipfs${path}` : `ipfs/${url.host}${path}`\n const root = `${protocol}//${host}/${path}`\n return query?.length > 0 ? `${root}?${query}` : root\n } else {\n return urlToCheck\n }\n } catch (ex) {\n const error = ex as Error\n console.error(`${error.name}:${error.message} [${urlToCheck}]`)\n console.log(error.stack)\n return undefined\n }\n}\n","import { BaseProvider } from '@ethersproject/providers'\nimport { BigNumber } from '@xylabs/bignumber'\nimport { UpgradeableBeacon__factory } from '@xyo-network/open-zeppelin-typechain'\n\nexport const ERC1967_PROXY_IMPLEMENTATION_STORAGE_SLOT = '0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc'\nexport const ERC1967_PROXY_BEACON_STORAGE_SLOT = '0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50'\nexport const ERC1967_PROXY_ADMIN_STORAGE_SLOT = '0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103'\nexport const ERC1967_PROXY_ROLLBACK_STORAGE_SLOT = '0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143'\n\nexport interface Erc1967DataSlots {\n admin: string\n beacon: string\n implementation: string\n rollback: string\n}\n\nexport interface Erc1967Status {\n address: string\n implementation: string\n proxy: Erc1967DataSlots\n}\n\nconst hexBytesOnlyOnly = (value: string) => {\n return value.startsWith('0x') ? value.substring(2) : value\n}\n\nconst addressFromHex = (value: string) => {\n return `0x${hexBytesOnlyOnly(value).substring(24)}`\n}\n\nconst isHexZero = (value: string) => {\n return new BigNumber(hexBytesOnlyOnly(value), 'hex').eqn(0)\n}\n\nexport const readAddressFromSlot = async (provider: BaseProvider, address: string, slot: string) => {\n const slotValue = await provider.getStorageAt(address, slot)\n return addressFromHex(slotValue)\n}\n\nexport const getErc1967Status = async (provider: BaseProvider, address: string): Promise<Erc1967Status> => {\n const proxy: Erc1967DataSlots = {\n admin: await readAddressFromSlot(provider, address, ERC1967_PROXY_ADMIN_STORAGE_SLOT),\n beacon: await readAddressFromSlot(provider, address, ERC1967_PROXY_BEACON_STORAGE_SLOT),\n implementation: await readAddressFromSlot(provider, address, ERC1967_PROXY_IMPLEMENTATION_STORAGE_SLOT),\n rollback: await readAddressFromSlot(provider, address, ERC1967_PROXY_ROLLBACK_STORAGE_SLOT),\n }\n\n if (!isHexZero(proxy.beacon)) {\n const beacon = UpgradeableBeacon__factory.connect(proxy.beacon, provider)\n try {\n proxy.implementation = await beacon.callStatic.implementation()\n } catch (ex) {\n const error = ex as Error\n console.log(error.message)\n }\n }\n\n return {\n address,\n implementation: isHexZero(proxy.implementation) ? address : proxy.implementation,\n proxy,\n }\n}\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":"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","names":["providers"]}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Returns the equivalent IPFS gateway URL for the supplied URL.
3
+ * @param urlToCheck The URL to check
4
+ * @returns If the supplied URL is an IPFS URL, it converts the URL to the
5
+ * equivalent IPFS gateway URL. Otherwise, returns the original URL.
6
+ */
7
+ export declare const checkIpfsUrl: (urlToCheck: string, ipfsGateway: string) => string | undefined;
8
+ //# sourceMappingURL=checkIpfsUrl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkIpfsUrl.d.ts","sourceRoot":"","sources":["../../../src/lib/checkIpfsUrl.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,eAAO,MAAM,YAAY,eAAgB,MAAM,eAAe,MAAM,uBAsBnE,CAAA"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Returns the equivalent IPFS gateway URL for the supplied URL.
3
+ * @param urlToCheck The URL to check
4
+ * @returns If the supplied URL is an IPFS URL, it converts the URL to the
5
+ * equivalent IPFS gateway URL. Otherwise, returns the original URL.
6
+ */
7
+ export declare const checkIpfsUrl: (urlToCheck: string, ipfsGateway: string) => string | undefined;
8
+ //# sourceMappingURL=checkIpfsUrl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkIpfsUrl.d.ts","sourceRoot":"","sources":["../../../src/lib/checkIpfsUrl.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,eAAO,MAAM,YAAY,eAAgB,MAAM,eAAe,MAAM,uBAsBnE,CAAA"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Returns the equivalent IPFS gateway URL for the supplied URL.
3
+ * @param urlToCheck The URL to check
4
+ * @returns If the supplied URL is an IPFS URL, it converts the URL to the
5
+ * equivalent IPFS gateway URL. Otherwise, returns the original URL.
6
+ */
7
+ export declare const checkIpfsUrl: (urlToCheck: string, ipfsGateway: string) => string | undefined;
8
+ //# sourceMappingURL=checkIpfsUrl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkIpfsUrl.d.ts","sourceRoot":"","sources":["../../../src/lib/checkIpfsUrl.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,eAAO,MAAM,YAAY,eAAgB,MAAM,eAAe,MAAM,uBAsBnE,CAAA"}
@@ -0,0 +1,19 @@
1
+ import { BaseProvider } from '@ethersproject/providers';
2
+ export declare const ERC1967_PROXY_IMPLEMENTATION_STORAGE_SLOT = "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc";
3
+ export declare const ERC1967_PROXY_BEACON_STORAGE_SLOT = "0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50";
4
+ export declare const ERC1967_PROXY_ADMIN_STORAGE_SLOT = "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103";
5
+ export declare const ERC1967_PROXY_ROLLBACK_STORAGE_SLOT = "0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143";
6
+ export interface Erc1967DataSlots {
7
+ admin: string;
8
+ beacon: string;
9
+ implementation: string;
10
+ rollback: string;
11
+ }
12
+ export interface Erc1967Status {
13
+ address: string;
14
+ implementation: string;
15
+ proxy: Erc1967DataSlots;
16
+ }
17
+ export declare const readAddressFromSlot: (provider: BaseProvider, address: string, slot: string) => Promise<string>;
18
+ export declare const getErc1967Status: (provider: BaseProvider, address: string) => Promise<Erc1967Status>;
19
+ //# sourceMappingURL=getErc1967Status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getErc1967Status.d.ts","sourceRoot":"","sources":["../../../src/lib/getErc1967Status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAIvD,eAAO,MAAM,yCAAyC,uEAAuE,CAAA;AAC7H,eAAO,MAAM,iCAAiC,uEAAuE,CAAA;AACrH,eAAO,MAAM,gCAAgC,uEAAuE,CAAA;AACpH,eAAO,MAAM,mCAAmC,uEAAuE,CAAA;AAEvH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,cAAc,EAAE,MAAM,CAAA;IACtB,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAA;IACf,cAAc,EAAE,MAAM,CAAA;IACtB,KAAK,EAAE,gBAAgB,CAAA;CACxB;AAcD,eAAO,MAAM,mBAAmB,aAAoB,YAAY,WAAW,MAAM,QAAQ,MAAM,oBAG9F,CAAA;AAED,eAAO,MAAM,gBAAgB,aAAoB,YAAY,WAAW,MAAM,KAAG,QAAQ,aAAa,CAuBrG,CAAA"}
@@ -0,0 +1,19 @@
1
+ import { BaseProvider } from '@ethersproject/providers';
2
+ export declare const ERC1967_PROXY_IMPLEMENTATION_STORAGE_SLOT = "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc";
3
+ export declare const ERC1967_PROXY_BEACON_STORAGE_SLOT = "0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50";
4
+ export declare const ERC1967_PROXY_ADMIN_STORAGE_SLOT = "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103";
5
+ export declare const ERC1967_PROXY_ROLLBACK_STORAGE_SLOT = "0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143";
6
+ export interface Erc1967DataSlots {
7
+ admin: string;
8
+ beacon: string;
9
+ implementation: string;
10
+ rollback: string;
11
+ }
12
+ export interface Erc1967Status {
13
+ address: string;
14
+ implementation: string;
15
+ proxy: Erc1967DataSlots;
16
+ }
17
+ export declare const readAddressFromSlot: (provider: BaseProvider, address: string, slot: string) => Promise<string>;
18
+ export declare const getErc1967Status: (provider: BaseProvider, address: string) => Promise<Erc1967Status>;
19
+ //# sourceMappingURL=getErc1967Status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getErc1967Status.d.ts","sourceRoot":"","sources":["../../../src/lib/getErc1967Status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAIvD,eAAO,MAAM,yCAAyC,uEAAuE,CAAA;AAC7H,eAAO,MAAM,iCAAiC,uEAAuE,CAAA;AACrH,eAAO,MAAM,gCAAgC,uEAAuE,CAAA;AACpH,eAAO,MAAM,mCAAmC,uEAAuE,CAAA;AAEvH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,cAAc,EAAE,MAAM,CAAA;IACtB,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAA;IACf,cAAc,EAAE,MAAM,CAAA;IACtB,KAAK,EAAE,gBAAgB,CAAA;CACxB;AAcD,eAAO,MAAM,mBAAmB,aAAoB,YAAY,WAAW,MAAM,QAAQ,MAAM,oBAG9F,CAAA;AAED,eAAO,MAAM,gBAAgB,aAAoB,YAAY,WAAW,MAAM,KAAG,QAAQ,aAAa,CAuBrG,CAAA"}
@@ -0,0 +1,19 @@
1
+ import { BaseProvider } from '@ethersproject/providers';
2
+ export declare const ERC1967_PROXY_IMPLEMENTATION_STORAGE_SLOT = "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc";
3
+ export declare const ERC1967_PROXY_BEACON_STORAGE_SLOT = "0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50";
4
+ export declare const ERC1967_PROXY_ADMIN_STORAGE_SLOT = "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103";
5
+ export declare const ERC1967_PROXY_ROLLBACK_STORAGE_SLOT = "0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143";
6
+ export interface Erc1967DataSlots {
7
+ admin: string;
8
+ beacon: string;
9
+ implementation: string;
10
+ rollback: string;
11
+ }
12
+ export interface Erc1967Status {
13
+ address: string;
14
+ implementation: string;
15
+ proxy: Erc1967DataSlots;
16
+ }
17
+ export declare const readAddressFromSlot: (provider: BaseProvider, address: string, slot: string) => Promise<string>;
18
+ export declare const getErc1967Status: (provider: BaseProvider, address: string) => Promise<Erc1967Status>;
19
+ //# sourceMappingURL=getErc1967Status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getErc1967Status.d.ts","sourceRoot":"","sources":["../../../src/lib/getErc1967Status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAIvD,eAAO,MAAM,yCAAyC,uEAAuE,CAAA;AAC7H,eAAO,MAAM,iCAAiC,uEAAuE,CAAA;AACrH,eAAO,MAAM,gCAAgC,uEAAuE,CAAA;AACpH,eAAO,MAAM,mCAAmC,uEAAuE,CAAA;AAEvH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,cAAc,EAAE,MAAM,CAAA;IACtB,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAA;IACf,cAAc,EAAE,MAAM,CAAA;IACtB,KAAK,EAAE,gBAAgB,CAAA;CACxB;AAcD,eAAO,MAAM,mBAAmB,aAAoB,YAAY,WAAW,MAAM,QAAQ,MAAM,oBAG9F,CAAA;AAED,eAAO,MAAM,gBAAgB,aAAoB,YAAY,WAAW,MAAM,KAAG,QAAQ,aAAa,CAuBrG,CAAA"}
@@ -1,2 +1,4 @@
1
+ export * from './checkIpfsUrl';
2
+ export * from './getErc1967Status';
1
3
  export * from './getProviderFromEnv';
2
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAA;AAC9B,cAAc,oBAAoB,CAAA;AAClC,cAAc,sBAAsB,CAAA"}
@@ -1,2 +1,4 @@
1
+ export * from './checkIpfsUrl';
2
+ export * from './getErc1967Status';
1
3
  export * from './getProviderFromEnv';
2
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAA;AAC9B,cAAc,oBAAoB,CAAA;AAClC,cAAc,sBAAsB,CAAA"}
@@ -1,2 +1,4 @@
1
+ export * from './checkIpfsUrl';
2
+ export * from './getErc1967Status';
1
3
  export * from './getProviderFromEnv';
2
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAA;AAC9B,cAAc,oBAAoB,CAAA;AAClC,cAAc,sBAAsB,CAAA"}
@@ -22,11 +22,86 @@ var src_exports = {};
22
22
  __export(src_exports, {
23
23
  AbstractBlockchainWitness: () => AbstractBlockchainWitness,
24
24
  BlockchainWitnessConfigSchema: () => BlockchainWitnessConfigSchema,
25
+ ERC1967_PROXY_ADMIN_STORAGE_SLOT: () => ERC1967_PROXY_ADMIN_STORAGE_SLOT,
26
+ ERC1967_PROXY_BEACON_STORAGE_SLOT: () => ERC1967_PROXY_BEACON_STORAGE_SLOT,
27
+ ERC1967_PROXY_IMPLEMENTATION_STORAGE_SLOT: () => ERC1967_PROXY_IMPLEMENTATION_STORAGE_SLOT,
28
+ ERC1967_PROXY_ROLLBACK_STORAGE_SLOT: () => ERC1967_PROXY_ROLLBACK_STORAGE_SLOT,
29
+ checkIpfsUrl: () => checkIpfsUrl,
30
+ getErc1967Status: () => getErc1967Status,
25
31
  getProviderFromEnv: () => getProviderFromEnv,
26
- getSharedProviderFromEnv: () => getSharedProviderFromEnv
32
+ getSharedProviderFromEnv: () => getSharedProviderFromEnv,
33
+ readAddressFromSlot: () => readAddressFromSlot
27
34
  });
28
35
  module.exports = __toCommonJS(src_exports);
29
36
 
37
+ // src/lib/checkIpfsUrl.ts
38
+ var checkIpfsUrl = (urlToCheck, ipfsGateway) => {
39
+ try {
40
+ const url = new URL(urlToCheck);
41
+ let protocol = url.protocol;
42
+ let host = url.host;
43
+ let path = url.pathname;
44
+ const query = url.search;
45
+ if (protocol === "ipfs:") {
46
+ protocol = "https:";
47
+ host = ipfsGateway;
48
+ path = url.host === "ipfs" ? `ipfs${path}` : `ipfs/${url.host}${path}`;
49
+ const root = `${protocol}//${host}/${path}`;
50
+ return (query == null ? void 0 : query.length) > 0 ? `${root}?${query}` : root;
51
+ } else {
52
+ return urlToCheck;
53
+ }
54
+ } catch (ex) {
55
+ const error = ex;
56
+ console.error(`${error.name}:${error.message} [${urlToCheck}]`);
57
+ console.log(error.stack);
58
+ return void 0;
59
+ }
60
+ };
61
+
62
+ // src/lib/getErc1967Status.ts
63
+ var import_bignumber = require("@xylabs/bignumber");
64
+ var import_open_zeppelin_typechain = require("@xyo-network/open-zeppelin-typechain");
65
+ var ERC1967_PROXY_IMPLEMENTATION_STORAGE_SLOT = "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc";
66
+ var ERC1967_PROXY_BEACON_STORAGE_SLOT = "0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50";
67
+ var ERC1967_PROXY_ADMIN_STORAGE_SLOT = "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103";
68
+ var ERC1967_PROXY_ROLLBACK_STORAGE_SLOT = "0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143";
69
+ var hexBytesOnlyOnly = (value) => {
70
+ return value.startsWith("0x") ? value.substring(2) : value;
71
+ };
72
+ var addressFromHex = (value) => {
73
+ return `0x${hexBytesOnlyOnly(value).substring(24)}`;
74
+ };
75
+ var isHexZero = (value) => {
76
+ return new import_bignumber.BigNumber(hexBytesOnlyOnly(value), "hex").eqn(0);
77
+ };
78
+ var readAddressFromSlot = async (provider, address, slot) => {
79
+ const slotValue = await provider.getStorageAt(address, slot);
80
+ return addressFromHex(slotValue);
81
+ };
82
+ var getErc1967Status = async (provider, address) => {
83
+ const proxy = {
84
+ admin: await readAddressFromSlot(provider, address, ERC1967_PROXY_ADMIN_STORAGE_SLOT),
85
+ beacon: await readAddressFromSlot(provider, address, ERC1967_PROXY_BEACON_STORAGE_SLOT),
86
+ implementation: await readAddressFromSlot(provider, address, ERC1967_PROXY_IMPLEMENTATION_STORAGE_SLOT),
87
+ rollback: await readAddressFromSlot(provider, address, ERC1967_PROXY_ROLLBACK_STORAGE_SLOT)
88
+ };
89
+ if (!isHexZero(proxy.beacon)) {
90
+ const beacon = import_open_zeppelin_typechain.UpgradeableBeacon__factory.connect(proxy.beacon, provider);
91
+ try {
92
+ proxy.implementation = await beacon.callStatic.implementation();
93
+ } catch (ex) {
94
+ const error = ex;
95
+ console.log(error.message);
96
+ }
97
+ }
98
+ return {
99
+ address,
100
+ implementation: isHexZero(proxy.implementation) ? address : proxy.implementation,
101
+ proxy
102
+ };
103
+ };
104
+
30
105
  // src/lib/getProviderFromEnv.ts
31
106
  var import_providers = require("@ethersproject/providers");
32
107
  var import_assert = require("@xylabs/assert");
@@ -108,7 +183,14 @@ var AbstractBlockchainWitness = class extends import_abstract_witness.AbstractWi
108
183
  0 && (module.exports = {
109
184
  AbstractBlockchainWitness,
110
185
  BlockchainWitnessConfigSchema,
186
+ ERC1967_PROXY_ADMIN_STORAGE_SLOT,
187
+ ERC1967_PROXY_BEACON_STORAGE_SLOT,
188
+ ERC1967_PROXY_IMPLEMENTATION_STORAGE_SLOT,
189
+ ERC1967_PROXY_ROLLBACK_STORAGE_SLOT,
190
+ checkIpfsUrl,
191
+ getErc1967Status,
111
192
  getProviderFromEnv,
112
- getSharedProviderFromEnv
193
+ getSharedProviderFromEnv,
194
+ readAddressFromSlot
113
195
  });
114
196
  //# sourceMappingURL=index.cjs.map
@@ -1 +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"]}
1
+ {"version":3,"sources":["../../src/index.ts","../../src/lib/checkIpfsUrl.ts","../../src/lib/getErc1967Status.ts","../../src/lib/getProviderFromEnv.ts","../../src/Witness.ts"],"sourcesContent":["export * from './lib'\nexport * from './Witness'\n","/**\n * Returns the equivalent IPFS gateway URL for the supplied URL.\n * @param urlToCheck The URL to check\n * @returns If the supplied URL is an IPFS URL, it converts the URL to the\n * equivalent IPFS gateway URL. Otherwise, returns the original URL.\n */\nexport const checkIpfsUrl = (urlToCheck: string, ipfsGateway: string) => {\n try {\n const url = new URL(urlToCheck)\n let protocol = url.protocol\n let host = url.host\n let path = url.pathname\n const query = url.search\n if (protocol === 'ipfs:') {\n protocol = 'https:'\n host = ipfsGateway\n path = url.host === 'ipfs' ? `ipfs${path}` : `ipfs/${url.host}${path}`\n const root = `${protocol}//${host}/${path}`\n return query?.length > 0 ? `${root}?${query}` : root\n } else {\n return urlToCheck\n }\n } catch (ex) {\n const error = ex as Error\n console.error(`${error.name}:${error.message} [${urlToCheck}]`)\n console.log(error.stack)\n return undefined\n }\n}\n","import { BaseProvider } from '@ethersproject/providers'\nimport { BigNumber } from '@xylabs/bignumber'\nimport { UpgradeableBeacon__factory } from '@xyo-network/open-zeppelin-typechain'\n\nexport const ERC1967_PROXY_IMPLEMENTATION_STORAGE_SLOT = '0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc'\nexport const ERC1967_PROXY_BEACON_STORAGE_SLOT = '0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50'\nexport const ERC1967_PROXY_ADMIN_STORAGE_SLOT = '0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103'\nexport const ERC1967_PROXY_ROLLBACK_STORAGE_SLOT = '0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143'\n\nexport interface Erc1967DataSlots {\n admin: string\n beacon: string\n implementation: string\n rollback: string\n}\n\nexport interface Erc1967Status {\n address: string\n implementation: string\n proxy: Erc1967DataSlots\n}\n\nconst hexBytesOnlyOnly = (value: string) => {\n return value.startsWith('0x') ? value.substring(2) : value\n}\n\nconst addressFromHex = (value: string) => {\n return `0x${hexBytesOnlyOnly(value).substring(24)}`\n}\n\nconst isHexZero = (value: string) => {\n return new BigNumber(hexBytesOnlyOnly(value), 'hex').eqn(0)\n}\n\nexport const readAddressFromSlot = async (provider: BaseProvider, address: string, slot: string) => {\n const slotValue = await provider.getStorageAt(address, slot)\n return addressFromHex(slotValue)\n}\n\nexport const getErc1967Status = async (provider: BaseProvider, address: string): Promise<Erc1967Status> => {\n const proxy: Erc1967DataSlots = {\n admin: await readAddressFromSlot(provider, address, ERC1967_PROXY_ADMIN_STORAGE_SLOT),\n beacon: await readAddressFromSlot(provider, address, ERC1967_PROXY_BEACON_STORAGE_SLOT),\n implementation: await readAddressFromSlot(provider, address, ERC1967_PROXY_IMPLEMENTATION_STORAGE_SLOT),\n rollback: await readAddressFromSlot(provider, address, ERC1967_PROXY_ROLLBACK_STORAGE_SLOT),\n }\n\n if (!isHexZero(proxy.beacon)) {\n const beacon = UpgradeableBeacon__factory.connect(proxy.beacon, provider)\n try {\n proxy.implementation = await beacon.callStatic.implementation()\n } catch (ex) {\n const error = ex as Error\n console.log(error.message)\n }\n }\n\n return {\n address,\n implementation: isHexZero(proxy.implementation) ? address : proxy.implementation,\n proxy,\n }\n}\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":"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","names":["providers"]}
@@ -1,3 +1,71 @@
1
+ // src/lib/checkIpfsUrl.ts
2
+ var checkIpfsUrl = (urlToCheck, ipfsGateway) => {
3
+ try {
4
+ const url = new URL(urlToCheck);
5
+ let protocol = url.protocol;
6
+ let host = url.host;
7
+ let path = url.pathname;
8
+ const query = url.search;
9
+ if (protocol === "ipfs:") {
10
+ protocol = "https:";
11
+ host = ipfsGateway;
12
+ path = url.host === "ipfs" ? `ipfs${path}` : `ipfs/${url.host}${path}`;
13
+ const root = `${protocol}//${host}/${path}`;
14
+ return (query == null ? void 0 : query.length) > 0 ? `${root}?${query}` : root;
15
+ } else {
16
+ return urlToCheck;
17
+ }
18
+ } catch (ex) {
19
+ const error = ex;
20
+ console.error(`${error.name}:${error.message} [${urlToCheck}]`);
21
+ console.log(error.stack);
22
+ return void 0;
23
+ }
24
+ };
25
+
26
+ // src/lib/getErc1967Status.ts
27
+ import { BigNumber } from "@xylabs/bignumber";
28
+ import { UpgradeableBeacon__factory } from "@xyo-network/open-zeppelin-typechain";
29
+ var ERC1967_PROXY_IMPLEMENTATION_STORAGE_SLOT = "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc";
30
+ var ERC1967_PROXY_BEACON_STORAGE_SLOT = "0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50";
31
+ var ERC1967_PROXY_ADMIN_STORAGE_SLOT = "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103";
32
+ var ERC1967_PROXY_ROLLBACK_STORAGE_SLOT = "0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143";
33
+ var hexBytesOnlyOnly = (value) => {
34
+ return value.startsWith("0x") ? value.substring(2) : value;
35
+ };
36
+ var addressFromHex = (value) => {
37
+ return `0x${hexBytesOnlyOnly(value).substring(24)}`;
38
+ };
39
+ var isHexZero = (value) => {
40
+ return new BigNumber(hexBytesOnlyOnly(value), "hex").eqn(0);
41
+ };
42
+ var readAddressFromSlot = async (provider, address, slot) => {
43
+ const slotValue = await provider.getStorageAt(address, slot);
44
+ return addressFromHex(slotValue);
45
+ };
46
+ var getErc1967Status = async (provider, address) => {
47
+ const proxy = {
48
+ admin: await readAddressFromSlot(provider, address, ERC1967_PROXY_ADMIN_STORAGE_SLOT),
49
+ beacon: await readAddressFromSlot(provider, address, ERC1967_PROXY_BEACON_STORAGE_SLOT),
50
+ implementation: await readAddressFromSlot(provider, address, ERC1967_PROXY_IMPLEMENTATION_STORAGE_SLOT),
51
+ rollback: await readAddressFromSlot(provider, address, ERC1967_PROXY_ROLLBACK_STORAGE_SLOT)
52
+ };
53
+ if (!isHexZero(proxy.beacon)) {
54
+ const beacon = UpgradeableBeacon__factory.connect(proxy.beacon, provider);
55
+ try {
56
+ proxy.implementation = await beacon.callStatic.implementation();
57
+ } catch (ex) {
58
+ const error = ex;
59
+ console.log(error.message);
60
+ }
61
+ }
62
+ return {
63
+ address,
64
+ implementation: isHexZero(proxy.implementation) ? address : proxy.implementation,
65
+ proxy
66
+ };
67
+ };
68
+
1
69
  // src/lib/getProviderFromEnv.ts
2
70
  import { InfuraProvider, InfuraWebSocketProvider, JsonRpcProvider, WebSocketProvider } from "@ethersproject/providers";
3
71
  import { assertEx } from "@xylabs/assert";
@@ -78,7 +146,14 @@ var AbstractBlockchainWitness = class extends AbstractWitness {
78
146
  export {
79
147
  AbstractBlockchainWitness,
80
148
  BlockchainWitnessConfigSchema,
149
+ ERC1967_PROXY_ADMIN_STORAGE_SLOT,
150
+ ERC1967_PROXY_BEACON_STORAGE_SLOT,
151
+ ERC1967_PROXY_IMPLEMENTATION_STORAGE_SLOT,
152
+ ERC1967_PROXY_ROLLBACK_STORAGE_SLOT,
153
+ checkIpfsUrl,
154
+ getErc1967Status,
81
155
  getProviderFromEnv,
82
- getSharedProviderFromEnv
156
+ getSharedProviderFromEnv,
157
+ readAddressFromSlot
83
158
  };
84
159
  //# sourceMappingURL=index.js.map
@@ -1 +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"]}
1
+ {"version":3,"sources":["../../src/lib/checkIpfsUrl.ts","../../src/lib/getErc1967Status.ts","../../src/lib/getProviderFromEnv.ts","../../src/Witness.ts"],"sourcesContent":["/**\n * Returns the equivalent IPFS gateway URL for the supplied URL.\n * @param urlToCheck The URL to check\n * @returns If the supplied URL is an IPFS URL, it converts the URL to the\n * equivalent IPFS gateway URL. Otherwise, returns the original URL.\n */\nexport const checkIpfsUrl = (urlToCheck: string, ipfsGateway: string) => {\n try {\n const url = new URL(urlToCheck)\n let protocol = url.protocol\n let host = url.host\n let path = url.pathname\n const query = url.search\n if (protocol === 'ipfs:') {\n protocol = 'https:'\n host = ipfsGateway\n path = url.host === 'ipfs' ? `ipfs${path}` : `ipfs/${url.host}${path}`\n const root = `${protocol}//${host}/${path}`\n return query?.length > 0 ? `${root}?${query}` : root\n } else {\n return urlToCheck\n }\n } catch (ex) {\n const error = ex as Error\n console.error(`${error.name}:${error.message} [${urlToCheck}]`)\n console.log(error.stack)\n return undefined\n }\n}\n","import { BaseProvider } from '@ethersproject/providers'\nimport { BigNumber } from '@xylabs/bignumber'\nimport { UpgradeableBeacon__factory } from '@xyo-network/open-zeppelin-typechain'\n\nexport const ERC1967_PROXY_IMPLEMENTATION_STORAGE_SLOT = '0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc'\nexport const ERC1967_PROXY_BEACON_STORAGE_SLOT = '0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50'\nexport const ERC1967_PROXY_ADMIN_STORAGE_SLOT = '0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103'\nexport const ERC1967_PROXY_ROLLBACK_STORAGE_SLOT = '0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143'\n\nexport interface Erc1967DataSlots {\n admin: string\n beacon: string\n implementation: string\n rollback: string\n}\n\nexport interface Erc1967Status {\n address: string\n implementation: string\n proxy: Erc1967DataSlots\n}\n\nconst hexBytesOnlyOnly = (value: string) => {\n return value.startsWith('0x') ? value.substring(2) : value\n}\n\nconst addressFromHex = (value: string) => {\n return `0x${hexBytesOnlyOnly(value).substring(24)}`\n}\n\nconst isHexZero = (value: string) => {\n return new BigNumber(hexBytesOnlyOnly(value), 'hex').eqn(0)\n}\n\nexport const readAddressFromSlot = async (provider: BaseProvider, address: string, slot: string) => {\n const slotValue = await provider.getStorageAt(address, slot)\n return addressFromHex(slotValue)\n}\n\nexport const getErc1967Status = async (provider: BaseProvider, address: string): Promise<Erc1967Status> => {\n const proxy: Erc1967DataSlots = {\n admin: await readAddressFromSlot(provider, address, ERC1967_PROXY_ADMIN_STORAGE_SLOT),\n beacon: await readAddressFromSlot(provider, address, ERC1967_PROXY_BEACON_STORAGE_SLOT),\n implementation: await readAddressFromSlot(provider, address, ERC1967_PROXY_IMPLEMENTATION_STORAGE_SLOT),\n rollback: await readAddressFromSlot(provider, address, ERC1967_PROXY_ROLLBACK_STORAGE_SLOT),\n }\n\n if (!isHexZero(proxy.beacon)) {\n const beacon = UpgradeableBeacon__factory.connect(proxy.beacon, provider)\n try {\n proxy.implementation = await beacon.callStatic.implementation()\n } catch (ex) {\n const error = ex as Error\n console.log(error.message)\n }\n }\n\n return {\n address,\n implementation: isHexZero(proxy.implementation) ? address : proxy.implementation,\n proxy,\n }\n}\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":";AAMO,IAAM,eAAe,CAAC,YAAoB,gBAAwB;AACvE,MAAI;AACF,UAAM,MAAM,IAAI,IAAI,UAAU;AAC9B,QAAI,WAAW,IAAI;AACnB,QAAI,OAAO,IAAI;AACf,QAAI,OAAO,IAAI;AACf,UAAM,QAAQ,IAAI;AAClB,QAAI,aAAa,SAAS;AACxB,iBAAW;AACX,aAAO;AACP,aAAO,IAAI,SAAS,SAAS,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,GAAG,IAAI;AACpE,YAAM,OAAO,GAAG,QAAQ,KAAK,IAAI,IAAI,IAAI;AACzC,cAAO,+BAAO,UAAS,IAAI,GAAG,IAAI,IAAI,KAAK,KAAK;AAAA,IAClD,OAAO;AACL,aAAO;AAAA,IACT;AAAA,EACF,SAAS,IAAI;AACX,UAAM,QAAQ;AACd,YAAQ,MAAM,GAAG,MAAM,IAAI,IAAI,MAAM,OAAO,KAAK,UAAU,GAAG;AAC9D,YAAQ,IAAI,MAAM,KAAK;AACvB,WAAO;AAAA,EACT;AACF;;;AC3BA,SAAS,iBAAiB;AAC1B,SAAS,kCAAkC;AAEpC,IAAM,4CAA4C;AAClD,IAAM,oCAAoC;AAC1C,IAAM,mCAAmC;AACzC,IAAM,sCAAsC;AAenD,IAAM,mBAAmB,CAAC,UAAkB;AAC1C,SAAO,MAAM,WAAW,IAAI,IAAI,MAAM,UAAU,CAAC,IAAI;AACvD;AAEA,IAAM,iBAAiB,CAAC,UAAkB;AACxC,SAAO,KAAK,iBAAiB,KAAK,EAAE,UAAU,EAAE,CAAC;AACnD;AAEA,IAAM,YAAY,CAAC,UAAkB;AACnC,SAAO,IAAI,UAAU,iBAAiB,KAAK,GAAG,KAAK,EAAE,IAAI,CAAC;AAC5D;AAEO,IAAM,sBAAsB,OAAO,UAAwB,SAAiB,SAAiB;AAClG,QAAM,YAAY,MAAM,SAAS,aAAa,SAAS,IAAI;AAC3D,SAAO,eAAe,SAAS;AACjC;AAEO,IAAM,mBAAmB,OAAO,UAAwB,YAA4C;AACzG,QAAM,QAA0B;AAAA,IAC9B,OAAO,MAAM,oBAAoB,UAAU,SAAS,gCAAgC;AAAA,IACpF,QAAQ,MAAM,oBAAoB,UAAU,SAAS,iCAAiC;AAAA,IACtF,gBAAgB,MAAM,oBAAoB,UAAU,SAAS,yCAAyC;AAAA,IACtG,UAAU,MAAM,oBAAoB,UAAU,SAAS,mCAAmC;AAAA,EAC5F;AAEA,MAAI,CAAC,UAAU,MAAM,MAAM,GAAG;AAC5B,UAAM,SAAS,2BAA2B,QAAQ,MAAM,QAAQ,QAAQ;AACxE,QAAI;AACF,YAAM,iBAAiB,MAAM,OAAO,WAAW,eAAe;AAAA,IAChE,SAAS,IAAI;AACX,YAAM,QAAQ;AACd,cAAQ,IAAI,MAAM,OAAO;AAAA,IAC3B;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA,gBAAgB,UAAU,MAAM,cAAc,IAAI,UAAU,MAAM;AAAA,IAClE;AAAA,EACF;AACF;;;AC9DA,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,8 @@
1
+ /**
2
+ * Returns the equivalent IPFS gateway URL for the supplied URL.
3
+ * @param urlToCheck The URL to check
4
+ * @returns If the supplied URL is an IPFS URL, it converts the URL to the
5
+ * equivalent IPFS gateway URL. Otherwise, returns the original URL.
6
+ */
7
+ export declare const checkIpfsUrl: (urlToCheck: string, ipfsGateway: string) => string | undefined;
8
+ //# sourceMappingURL=checkIpfsUrl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkIpfsUrl.d.ts","sourceRoot":"","sources":["../../../src/lib/checkIpfsUrl.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,eAAO,MAAM,YAAY,eAAgB,MAAM,eAAe,MAAM,uBAsBnE,CAAA"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Returns the equivalent IPFS gateway URL for the supplied URL.
3
+ * @param urlToCheck The URL to check
4
+ * @returns If the supplied URL is an IPFS URL, it converts the URL to the
5
+ * equivalent IPFS gateway URL. Otherwise, returns the original URL.
6
+ */
7
+ export declare const checkIpfsUrl: (urlToCheck: string, ipfsGateway: string) => string | undefined;
8
+ //# sourceMappingURL=checkIpfsUrl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkIpfsUrl.d.ts","sourceRoot":"","sources":["../../../src/lib/checkIpfsUrl.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,eAAO,MAAM,YAAY,eAAgB,MAAM,eAAe,MAAM,uBAsBnE,CAAA"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Returns the equivalent IPFS gateway URL for the supplied URL.
3
+ * @param urlToCheck The URL to check
4
+ * @returns If the supplied URL is an IPFS URL, it converts the URL to the
5
+ * equivalent IPFS gateway URL. Otherwise, returns the original URL.
6
+ */
7
+ export declare const checkIpfsUrl: (urlToCheck: string, ipfsGateway: string) => string | undefined;
8
+ //# sourceMappingURL=checkIpfsUrl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkIpfsUrl.d.ts","sourceRoot":"","sources":["../../../src/lib/checkIpfsUrl.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,eAAO,MAAM,YAAY,eAAgB,MAAM,eAAe,MAAM,uBAsBnE,CAAA"}
@@ -0,0 +1,19 @@
1
+ import { BaseProvider } from '@ethersproject/providers';
2
+ export declare const ERC1967_PROXY_IMPLEMENTATION_STORAGE_SLOT = "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc";
3
+ export declare const ERC1967_PROXY_BEACON_STORAGE_SLOT = "0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50";
4
+ export declare const ERC1967_PROXY_ADMIN_STORAGE_SLOT = "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103";
5
+ export declare const ERC1967_PROXY_ROLLBACK_STORAGE_SLOT = "0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143";
6
+ export interface Erc1967DataSlots {
7
+ admin: string;
8
+ beacon: string;
9
+ implementation: string;
10
+ rollback: string;
11
+ }
12
+ export interface Erc1967Status {
13
+ address: string;
14
+ implementation: string;
15
+ proxy: Erc1967DataSlots;
16
+ }
17
+ export declare const readAddressFromSlot: (provider: BaseProvider, address: string, slot: string) => Promise<string>;
18
+ export declare const getErc1967Status: (provider: BaseProvider, address: string) => Promise<Erc1967Status>;
19
+ //# sourceMappingURL=getErc1967Status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getErc1967Status.d.ts","sourceRoot":"","sources":["../../../src/lib/getErc1967Status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAIvD,eAAO,MAAM,yCAAyC,uEAAuE,CAAA;AAC7H,eAAO,MAAM,iCAAiC,uEAAuE,CAAA;AACrH,eAAO,MAAM,gCAAgC,uEAAuE,CAAA;AACpH,eAAO,MAAM,mCAAmC,uEAAuE,CAAA;AAEvH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,cAAc,EAAE,MAAM,CAAA;IACtB,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAA;IACf,cAAc,EAAE,MAAM,CAAA;IACtB,KAAK,EAAE,gBAAgB,CAAA;CACxB;AAcD,eAAO,MAAM,mBAAmB,aAAoB,YAAY,WAAW,MAAM,QAAQ,MAAM,oBAG9F,CAAA;AAED,eAAO,MAAM,gBAAgB,aAAoB,YAAY,WAAW,MAAM,KAAG,QAAQ,aAAa,CAuBrG,CAAA"}
@@ -0,0 +1,19 @@
1
+ import { BaseProvider } from '@ethersproject/providers';
2
+ export declare const ERC1967_PROXY_IMPLEMENTATION_STORAGE_SLOT = "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc";
3
+ export declare const ERC1967_PROXY_BEACON_STORAGE_SLOT = "0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50";
4
+ export declare const ERC1967_PROXY_ADMIN_STORAGE_SLOT = "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103";
5
+ export declare const ERC1967_PROXY_ROLLBACK_STORAGE_SLOT = "0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143";
6
+ export interface Erc1967DataSlots {
7
+ admin: string;
8
+ beacon: string;
9
+ implementation: string;
10
+ rollback: string;
11
+ }
12
+ export interface Erc1967Status {
13
+ address: string;
14
+ implementation: string;
15
+ proxy: Erc1967DataSlots;
16
+ }
17
+ export declare const readAddressFromSlot: (provider: BaseProvider, address: string, slot: string) => Promise<string>;
18
+ export declare const getErc1967Status: (provider: BaseProvider, address: string) => Promise<Erc1967Status>;
19
+ //# sourceMappingURL=getErc1967Status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getErc1967Status.d.ts","sourceRoot":"","sources":["../../../src/lib/getErc1967Status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAIvD,eAAO,MAAM,yCAAyC,uEAAuE,CAAA;AAC7H,eAAO,MAAM,iCAAiC,uEAAuE,CAAA;AACrH,eAAO,MAAM,gCAAgC,uEAAuE,CAAA;AACpH,eAAO,MAAM,mCAAmC,uEAAuE,CAAA;AAEvH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,cAAc,EAAE,MAAM,CAAA;IACtB,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAA;IACf,cAAc,EAAE,MAAM,CAAA;IACtB,KAAK,EAAE,gBAAgB,CAAA;CACxB;AAcD,eAAO,MAAM,mBAAmB,aAAoB,YAAY,WAAW,MAAM,QAAQ,MAAM,oBAG9F,CAAA;AAED,eAAO,MAAM,gBAAgB,aAAoB,YAAY,WAAW,MAAM,KAAG,QAAQ,aAAa,CAuBrG,CAAA"}
@@ -0,0 +1,19 @@
1
+ import { BaseProvider } from '@ethersproject/providers';
2
+ export declare const ERC1967_PROXY_IMPLEMENTATION_STORAGE_SLOT = "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc";
3
+ export declare const ERC1967_PROXY_BEACON_STORAGE_SLOT = "0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50";
4
+ export declare const ERC1967_PROXY_ADMIN_STORAGE_SLOT = "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103";
5
+ export declare const ERC1967_PROXY_ROLLBACK_STORAGE_SLOT = "0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143";
6
+ export interface Erc1967DataSlots {
7
+ admin: string;
8
+ beacon: string;
9
+ implementation: string;
10
+ rollback: string;
11
+ }
12
+ export interface Erc1967Status {
13
+ address: string;
14
+ implementation: string;
15
+ proxy: Erc1967DataSlots;
16
+ }
17
+ export declare const readAddressFromSlot: (provider: BaseProvider, address: string, slot: string) => Promise<string>;
18
+ export declare const getErc1967Status: (provider: BaseProvider, address: string) => Promise<Erc1967Status>;
19
+ //# sourceMappingURL=getErc1967Status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getErc1967Status.d.ts","sourceRoot":"","sources":["../../../src/lib/getErc1967Status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAIvD,eAAO,MAAM,yCAAyC,uEAAuE,CAAA;AAC7H,eAAO,MAAM,iCAAiC,uEAAuE,CAAA;AACrH,eAAO,MAAM,gCAAgC,uEAAuE,CAAA;AACpH,eAAO,MAAM,mCAAmC,uEAAuE,CAAA;AAEvH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,cAAc,EAAE,MAAM,CAAA;IACtB,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAA;IACf,cAAc,EAAE,MAAM,CAAA;IACtB,KAAK,EAAE,gBAAgB,CAAA;CACxB;AAcD,eAAO,MAAM,mBAAmB,aAAoB,YAAY,WAAW,MAAM,QAAQ,MAAM,oBAG9F,CAAA;AAED,eAAO,MAAM,gBAAgB,aAAoB,YAAY,WAAW,MAAM,KAAG,QAAQ,aAAa,CAuBrG,CAAA"}
@@ -1,2 +1,4 @@
1
+ export * from './checkIpfsUrl';
2
+ export * from './getErc1967Status';
1
3
  export * from './getProviderFromEnv';
2
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAA;AAC9B,cAAc,oBAAoB,CAAA;AAClC,cAAc,sBAAsB,CAAA"}
@@ -1,2 +1,4 @@
1
+ export * from './checkIpfsUrl';
2
+ export * from './getErc1967Status';
1
3
  export * from './getProviderFromEnv';
2
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAA;AAC9B,cAAc,oBAAoB,CAAA;AAClC,cAAc,sBAAsB,CAAA"}
@@ -1,2 +1,4 @@
1
+ export * from './checkIpfsUrl';
2
+ export * from './getErc1967Status';
1
3
  export * from './getProviderFromEnv';
2
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAA;AAC9B,cAAc,oBAAoB,CAAA;AAClC,cAAc,sBAAsB,CAAA"}
package/package.json CHANGED
@@ -11,10 +11,10 @@
11
11
  },
12
12
  "dependencies": {
13
13
  "@xylabs/assert": "^2.13.3",
14
- "@xyo-network/abstract-witness": "~2.79.2",
15
- "@xyo-network/object": "~2.79.2",
16
- "@xyo-network/payload-model": "~2.79.2",
17
- "@xyo-network/witness-model": "~2.79.2"
14
+ "@xyo-network/abstract-witness": "~2.79.4",
15
+ "@xyo-network/object": "~2.79.4",
16
+ "@xyo-network/payload-model": "~2.79.4",
17
+ "@xyo-network/witness-model": "~2.79.4"
18
18
  },
19
19
  "devDependencies": {
20
20
  "@ethersproject/providers": "^5.7.2",
@@ -64,6 +64,6 @@
64
64
  "url": "https://github.com/XYOracleNetwork/sdk-xyo-client-js.git"
65
65
  },
66
66
  "sideEffects": false,
67
- "version": "2.79.2",
67
+ "version": "2.79.4",
68
68
  "type": "module"
69
69
  }
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Returns the equivalent IPFS gateway URL for the supplied URL.
3
+ * @param urlToCheck The URL to check
4
+ * @returns If the supplied URL is an IPFS URL, it converts the URL to the
5
+ * equivalent IPFS gateway URL. Otherwise, returns the original URL.
6
+ */
7
+ export const checkIpfsUrl = (urlToCheck: string, ipfsGateway: string) => {
8
+ try {
9
+ const url = new URL(urlToCheck)
10
+ let protocol = url.protocol
11
+ let host = url.host
12
+ let path = url.pathname
13
+ const query = url.search
14
+ if (protocol === 'ipfs:') {
15
+ protocol = 'https:'
16
+ host = ipfsGateway
17
+ path = url.host === 'ipfs' ? `ipfs${path}` : `ipfs/${url.host}${path}`
18
+ const root = `${protocol}//${host}/${path}`
19
+ return query?.length > 0 ? `${root}?${query}` : root
20
+ } else {
21
+ return urlToCheck
22
+ }
23
+ } catch (ex) {
24
+ const error = ex as Error
25
+ console.error(`${error.name}:${error.message} [${urlToCheck}]`)
26
+ console.log(error.stack)
27
+ return undefined
28
+ }
29
+ }
@@ -0,0 +1,63 @@
1
+ import { BaseProvider } from '@ethersproject/providers'
2
+ import { BigNumber } from '@xylabs/bignumber'
3
+ import { UpgradeableBeacon__factory } from '@xyo-network/open-zeppelin-typechain'
4
+
5
+ export const ERC1967_PROXY_IMPLEMENTATION_STORAGE_SLOT = '0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc'
6
+ export const ERC1967_PROXY_BEACON_STORAGE_SLOT = '0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50'
7
+ export const ERC1967_PROXY_ADMIN_STORAGE_SLOT = '0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103'
8
+ export const ERC1967_PROXY_ROLLBACK_STORAGE_SLOT = '0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143'
9
+
10
+ export interface Erc1967DataSlots {
11
+ admin: string
12
+ beacon: string
13
+ implementation: string
14
+ rollback: string
15
+ }
16
+
17
+ export interface Erc1967Status {
18
+ address: string
19
+ implementation: string
20
+ proxy: Erc1967DataSlots
21
+ }
22
+
23
+ const hexBytesOnlyOnly = (value: string) => {
24
+ return value.startsWith('0x') ? value.substring(2) : value
25
+ }
26
+
27
+ const addressFromHex = (value: string) => {
28
+ return `0x${hexBytesOnlyOnly(value).substring(24)}`
29
+ }
30
+
31
+ const isHexZero = (value: string) => {
32
+ return new BigNumber(hexBytesOnlyOnly(value), 'hex').eqn(0)
33
+ }
34
+
35
+ export const readAddressFromSlot = async (provider: BaseProvider, address: string, slot: string) => {
36
+ const slotValue = await provider.getStorageAt(address, slot)
37
+ return addressFromHex(slotValue)
38
+ }
39
+
40
+ export const getErc1967Status = async (provider: BaseProvider, address: string): Promise<Erc1967Status> => {
41
+ const proxy: Erc1967DataSlots = {
42
+ admin: await readAddressFromSlot(provider, address, ERC1967_PROXY_ADMIN_STORAGE_SLOT),
43
+ beacon: await readAddressFromSlot(provider, address, ERC1967_PROXY_BEACON_STORAGE_SLOT),
44
+ implementation: await readAddressFromSlot(provider, address, ERC1967_PROXY_IMPLEMENTATION_STORAGE_SLOT),
45
+ rollback: await readAddressFromSlot(provider, address, ERC1967_PROXY_ROLLBACK_STORAGE_SLOT),
46
+ }
47
+
48
+ if (!isHexZero(proxy.beacon)) {
49
+ const beacon = UpgradeableBeacon__factory.connect(proxy.beacon, provider)
50
+ try {
51
+ proxy.implementation = await beacon.callStatic.implementation()
52
+ } catch (ex) {
53
+ const error = ex as Error
54
+ console.log(error.message)
55
+ }
56
+ }
57
+
58
+ return {
59
+ address,
60
+ implementation: isHexZero(proxy.implementation) ? address : proxy.implementation,
61
+ proxy,
62
+ }
63
+ }
package/src/lib/index.ts CHANGED
@@ -1 +1,3 @@
1
+ export * from './checkIpfsUrl'
2
+ export * from './getErc1967Status'
1
3
  export * from './getProviderFromEnv'