@xyo-network/witness-blockchain-abstract 2.79.2 → 2.79.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/index.cjs +76 -1
- package/dist/browser/index.cjs.map +1 -1
- package/dist/browser/index.js +76 -1
- package/dist/browser/index.js.map +1 -1
- package/dist/browser/lib/checkIpfsUrl.d.cts +8 -0
- package/dist/browser/lib/checkIpfsUrl.d.cts.map +1 -0
- package/dist/browser/lib/checkIpfsUrl.d.mts +8 -0
- package/dist/browser/lib/checkIpfsUrl.d.mts.map +1 -0
- package/dist/browser/lib/checkIpfsUrl.d.ts +8 -0
- package/dist/browser/lib/checkIpfsUrl.d.ts.map +1 -0
- package/dist/browser/lib/getErc1967Status.d.cts +19 -0
- package/dist/browser/lib/getErc1967Status.d.cts.map +1 -0
- package/dist/browser/lib/getErc1967Status.d.mts +19 -0
- package/dist/browser/lib/getErc1967Status.d.mts.map +1 -0
- package/dist/browser/lib/getErc1967Status.d.ts +19 -0
- package/dist/browser/lib/getErc1967Status.d.ts.map +1 -0
- package/dist/browser/lib/index.d.cts +2 -0
- package/dist/browser/lib/index.d.cts.map +1 -1
- package/dist/browser/lib/index.d.mts +2 -0
- package/dist/browser/lib/index.d.mts.map +1 -1
- package/dist/browser/lib/index.d.ts +2 -0
- package/dist/browser/lib/index.d.ts.map +1 -1
- package/dist/node/index.cjs +84 -2
- package/dist/node/index.cjs.map +1 -1
- package/dist/node/index.js +76 -1
- package/dist/node/index.js.map +1 -1
- package/dist/node/lib/checkIpfsUrl.d.cts +8 -0
- package/dist/node/lib/checkIpfsUrl.d.cts.map +1 -0
- package/dist/node/lib/checkIpfsUrl.d.mts +8 -0
- package/dist/node/lib/checkIpfsUrl.d.mts.map +1 -0
- package/dist/node/lib/checkIpfsUrl.d.ts +8 -0
- package/dist/node/lib/checkIpfsUrl.d.ts.map +1 -0
- package/dist/node/lib/getErc1967Status.d.cts +19 -0
- package/dist/node/lib/getErc1967Status.d.cts.map +1 -0
- package/dist/node/lib/getErc1967Status.d.mts +19 -0
- package/dist/node/lib/getErc1967Status.d.mts.map +1 -0
- package/dist/node/lib/getErc1967Status.d.ts +19 -0
- package/dist/node/lib/getErc1967Status.d.ts.map +1 -0
- package/dist/node/lib/index.d.cts +2 -0
- package/dist/node/lib/index.d.cts.map +1 -1
- package/dist/node/lib/index.d.mts +2 -0
- package/dist/node/lib/index.d.mts.map +1 -1
- package/dist/node/lib/index.d.ts +2 -0
- package/dist/node/lib/index.d.ts.map +1 -1
- package/package.json +5 -5
- package/src/lib/checkIpfsUrl.ts +29 -0
- package/src/lib/getErc1967Status.ts +63 -0
- package/src/lib/index.ts +2 -0
package/dist/browser/index.cjs
CHANGED
|
@@ -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":"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","names":["providers"]}
|
package/dist/browser/index.js
CHANGED
|
@@ -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 +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 +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 +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/dist/node/index.cjs
CHANGED
|
@@ -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
|
package/dist/node/index.cjs.map
CHANGED
|
@@ -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"]}
|
package/dist/node/index.js
CHANGED
|
@@ -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
|
package/dist/node/index.js.map
CHANGED
|
@@ -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 +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 +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/dist/node/lib/index.d.ts
CHANGED
|
@@ -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.
|
|
15
|
-
"@xyo-network/object": "~2.79.
|
|
16
|
-
"@xyo-network/payload-model": "~2.79.
|
|
17
|
-
"@xyo-network/witness-model": "~2.79.
|
|
14
|
+
"@xyo-network/abstract-witness": "~2.79.3",
|
|
15
|
+
"@xyo-network/object": "~2.79.3",
|
|
16
|
+
"@xyo-network/payload-model": "~2.79.3",
|
|
17
|
+
"@xyo-network/witness-model": "~2.79.3"
|
|
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.
|
|
67
|
+
"version": "2.79.3",
|
|
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