@dappworks/kit 0.4.100 → 0.4.102
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/aiem.d.mts +34 -9
- package/dist/aiem.mjs +67 -19
- package/dist/aiem.mjs.map +1 -1
- package/package.json +3 -3
package/dist/aiem.d.mts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { Abi, Chain, GetContractReturnType, PublicClient, HttpTransport, WalletClient } from 'viem';
|
|
2
|
-
import
|
|
1
|
+
import { Abi, Chain, GetContractReturnType, PublicClient, HttpTransport, WalletClient, AbiFunction } from 'viem';
|
|
2
|
+
import TTLCache from '@isaacs/ttlcache';
|
|
3
3
|
|
|
4
4
|
declare class Cache {
|
|
5
|
-
kv:
|
|
6
|
-
wrap<T>(key: string, fn: () => T | Promise<T>): T | Promise<T>;
|
|
5
|
+
kv: TTLCache<string, any>;
|
|
6
|
+
wrap<T>(key: string, fn: () => T | Promise<T>, config?: TTLCache.Options<any, any>): T | Promise<T>;
|
|
7
7
|
}
|
|
8
8
|
declare class AIem<Contracts extends Record<string, Abi>, Chains extends Record<string, Chain>, Addrs extends {
|
|
9
9
|
[K in keyof Contracts]?: {
|
|
@@ -11,21 +11,46 @@ declare class AIem<Contracts extends Record<string, Abi>, Chains extends Record<
|
|
|
11
11
|
};
|
|
12
12
|
}> {
|
|
13
13
|
static cache?: Cache;
|
|
14
|
-
|
|
14
|
+
cache?: Cache;
|
|
15
|
+
contractMap?: Contracts;
|
|
15
16
|
chainMap?: Chains;
|
|
16
|
-
nameMap
|
|
17
|
+
nameMap?: Addrs;
|
|
17
18
|
contracts: {
|
|
18
19
|
[K in keyof Addrs & keyof Contracts]: {
|
|
19
20
|
[KK in keyof Addrs[K]]: GetContractReturnType<Contracts[K], PublicClient<HttpTransport, Chain, any, any>, any, any>;
|
|
20
21
|
};
|
|
21
22
|
};
|
|
22
|
-
|
|
23
|
+
funcMap?: {
|
|
24
|
+
[key: string]: {
|
|
25
|
+
ttl?: number;
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
get _cache(): Cache;
|
|
23
29
|
getWallet?: () => WalletClient;
|
|
24
|
-
|
|
30
|
+
static Set<Contracts extends Record<string, Abi>, Chains extends Record<string, Chain>, Addrs extends {
|
|
31
|
+
[K in keyof Contracts]?: {
|
|
32
|
+
[key: string]: `${string}-0x${string}`;
|
|
33
|
+
};
|
|
34
|
+
}>(args: Pick<AIem<Contracts, Chains, Addrs>, "contractMap" | "chainMap" | "nameMap" | "getWallet" | "cache" | "funcMap">): AIem<Contracts, Chains, Addrs>;
|
|
35
|
+
Set<Contracts extends Record<string, Abi>, Chains extends Record<string, Chain>, Addrs extends {
|
|
36
|
+
[K in keyof Contracts]?: {
|
|
37
|
+
[key: string]: `${string}-0x${string}`;
|
|
38
|
+
};
|
|
39
|
+
}>(args: Pick<AIem<Contracts, Chains, Addrs>, "contractMap" | "chainMap" | "nameMap" | "getWallet" | "cache" | "funcMap">): AIem<Contracts, Chains, Addrs>;
|
|
40
|
+
constructor(args?: Pick<AIem<Contracts, Chains, Addrs>, "contractMap" | "chainMap" | "nameMap" | "getWallet" | "cache" | "funcMap">);
|
|
25
41
|
PubClient<C extends keyof Chains>(chainId: C): PublicClient<HttpTransport, Chain, any, any>;
|
|
26
42
|
Get<K extends keyof Contracts, C extends keyof Chains, Addr extends `0x${string}`>(contractName: K, chainId: C, address: Addr): GetContractReturnType<Contracts[K], PublicClient<HttpTransport, Chain, any, any>>;
|
|
43
|
+
getContract({ client, address, abi }: {
|
|
44
|
+
client: {
|
|
45
|
+
public: PublicClient<HttpTransport, Chain, any, any>;
|
|
46
|
+
wallet?: WalletClient;
|
|
47
|
+
};
|
|
48
|
+
address: `0x${string}`;
|
|
49
|
+
abi: any;
|
|
50
|
+
}): any;
|
|
27
51
|
static init(): AIem<any, any, any>;
|
|
28
52
|
static Get<TAbi extends Abi = any>(abi: TAbi, chainId: any, address: any, wallet?: WalletClient): GetContractReturnType<TAbi, PublicClient<HttpTransport, Chain, any, any>>;
|
|
29
53
|
}
|
|
54
|
+
type ReadFunctionKeys<T extends Abi> = T[number] extends infer U ? U extends AbiFunction ? U['stateMutability'] extends 'view' | 'pure' ? U['name'] : never : never : never;
|
|
30
55
|
|
|
31
|
-
export { AIem, Cache };
|
|
56
|
+
export { AIem, Cache, type ReadFunctionKeys };
|
package/dist/aiem.mjs
CHANGED
|
@@ -1,35 +1,37 @@
|
|
|
1
1
|
import { __objRest } from './chunk-R4SQKVDQ.mjs';
|
|
2
2
|
import { createPublicClient, http, getContract } from 'viem';
|
|
3
|
-
import QuickLRU from 'quick-lru';
|
|
4
3
|
import md5 from 'md5';
|
|
5
4
|
import { mainnet, iotex, bsc, polygon, iotexTestnet } from 'viem/chains';
|
|
5
|
+
import TTLCache from '@isaacs/ttlcache';
|
|
6
6
|
|
|
7
7
|
mainnet.rpcUrls.default.http = ["https://rpc.ankr.com/eth"];
|
|
8
8
|
mainnet.rpcUrls.default.webSocket = ["wss://ethereum-rpc.publicnode.com"];
|
|
9
9
|
var Cache = class {
|
|
10
10
|
constructor() {
|
|
11
|
-
this.kv = new
|
|
11
|
+
this.kv = new TTLCache({ max: 1e4, ttl: 1e3 * 60 });
|
|
12
12
|
}
|
|
13
|
-
wrap(key, fn) {
|
|
13
|
+
wrap(key, fn, config = {}) {
|
|
14
14
|
if (this.kv.has(key)) {
|
|
15
|
+
console.log(`load ${key} from cache`);
|
|
15
16
|
return this.kv.get(key);
|
|
16
17
|
}
|
|
17
18
|
const result = fn();
|
|
18
19
|
if (result instanceof Promise) {
|
|
19
20
|
const promiseResult = result.then((res) => {
|
|
20
|
-
this.kv.set(key, res);
|
|
21
|
+
this.kv.set(key, res, config);
|
|
21
22
|
return res;
|
|
22
23
|
});
|
|
23
|
-
this.kv.set(key, promiseResult);
|
|
24
|
+
this.kv.set(key, promiseResult, config);
|
|
24
25
|
return promiseResult;
|
|
25
26
|
} else {
|
|
26
|
-
this.kv.set(key, result);
|
|
27
|
+
this.kv.set(key, result, config);
|
|
27
28
|
return result;
|
|
28
29
|
}
|
|
29
30
|
}
|
|
30
31
|
};
|
|
31
32
|
var _AIem = class _AIem {
|
|
32
|
-
constructor(args) {
|
|
33
|
+
constructor(args = {}) {
|
|
34
|
+
this.cache = new Cache();
|
|
33
35
|
//@ts-ignore
|
|
34
36
|
this.chainMap = {
|
|
35
37
|
[iotex.id]: iotex,
|
|
@@ -38,10 +40,14 @@ var _AIem = class _AIem {
|
|
|
38
40
|
[polygon.id]: polygon,
|
|
39
41
|
[iotexTestnet.id]: iotexTestnet
|
|
40
42
|
};
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
43
|
+
this.funcMap = {
|
|
44
|
+
"totalSupply": { ttl: 15 },
|
|
45
|
+
"symbol": { ttl: 60 },
|
|
46
|
+
"name": { ttl: 60 },
|
|
47
|
+
"decimals": { ttl: 60 },
|
|
48
|
+
"balanceOf": { ttl: 5 }
|
|
49
|
+
};
|
|
50
|
+
this.Set(args);
|
|
45
51
|
this.contracts = new Proxy({}, {
|
|
46
52
|
//@ts-ignore
|
|
47
53
|
get: (target, contractName) => {
|
|
@@ -53,8 +59,8 @@ var _AIem = class _AIem {
|
|
|
53
59
|
target[contractName] = new Proxy({}, {
|
|
54
60
|
//@ts-ignore
|
|
55
61
|
get: (innerTarget, contractAlias) => {
|
|
56
|
-
var
|
|
57
|
-
const addressStr = (
|
|
62
|
+
var _a;
|
|
63
|
+
const addressStr = (_a = this.nameMap[contractName]) == null ? void 0 : _a[contractAlias];
|
|
58
64
|
if (!addressStr) {
|
|
59
65
|
throw new Error(`Alias ${String(contractAlias)} for contract ${String(contractName)} not found`);
|
|
60
66
|
}
|
|
@@ -66,9 +72,20 @@ var _AIem = class _AIem {
|
|
|
66
72
|
}
|
|
67
73
|
});
|
|
68
74
|
}
|
|
69
|
-
get
|
|
75
|
+
get _cache() {
|
|
70
76
|
return _AIem.cache;
|
|
71
77
|
}
|
|
78
|
+
static Set(args) {
|
|
79
|
+
return this.init().Set(args);
|
|
80
|
+
}
|
|
81
|
+
Set(args) {
|
|
82
|
+
const _a = args || {}, { chainMap = {}, contractMap = {}, funcMap } = _a, rest = __objRest(_a, ["chainMap", "contractMap", "funcMap"]);
|
|
83
|
+
this.chainMap = Object.assign({}, this.chainMap || {}, chainMap);
|
|
84
|
+
this.contractMap = Object.assign({}, this.contractMap || {}, contractMap);
|
|
85
|
+
this.funcMap = Object.assign({}, this.funcMap || {}, funcMap);
|
|
86
|
+
Object.assign(this, rest);
|
|
87
|
+
return this;
|
|
88
|
+
}
|
|
72
89
|
// WsClient<C extends keyof Chains>(chainId: C): PublicClient<WebSocketTransport, Chain, any, any> {
|
|
73
90
|
// //@ts-ignore
|
|
74
91
|
// return this.cache.wrap(`wsClient-${String(chainId)}`, () => {
|
|
@@ -83,7 +100,7 @@ var _AIem = class _AIem {
|
|
|
83
100
|
// })
|
|
84
101
|
// }
|
|
85
102
|
PubClient(chainId) {
|
|
86
|
-
return this.
|
|
103
|
+
return this._cache.wrap(`publicClient-${String(chainId)}`, () => {
|
|
87
104
|
return createPublicClient({
|
|
88
105
|
//@ts-ignore
|
|
89
106
|
chain: this.chainMap[chainId],
|
|
@@ -95,10 +112,10 @@ var _AIem = class _AIem {
|
|
|
95
112
|
Get(contractName, chainId, address) {
|
|
96
113
|
const wallet = this.getWallet ? this.getWallet() : null;
|
|
97
114
|
const cacheKey = `contract: ${contractName}-${chainId}-${address}-${wallet ? wallet.account.address : wallet}`;
|
|
98
|
-
return this.
|
|
115
|
+
return this._cache.wrap(cacheKey, () => {
|
|
99
116
|
const contract = this.contractMap[contractName];
|
|
100
117
|
const pubClient = this.PubClient(chainId);
|
|
101
|
-
return getContract({
|
|
118
|
+
return this.getContract({
|
|
102
119
|
client: {
|
|
103
120
|
//@ts-ignore
|
|
104
121
|
public: pubClient,
|
|
@@ -110,6 +127,37 @@ var _AIem = class _AIem {
|
|
|
110
127
|
});
|
|
111
128
|
});
|
|
112
129
|
}
|
|
130
|
+
getContract({
|
|
131
|
+
client,
|
|
132
|
+
address,
|
|
133
|
+
abi
|
|
134
|
+
}) {
|
|
135
|
+
const handler = {
|
|
136
|
+
get: (target, funcName) => {
|
|
137
|
+
if (typeof target[funcName] === "function") {
|
|
138
|
+
return async (...args) => {
|
|
139
|
+
var _a;
|
|
140
|
+
const methodConfig = (_a = this.funcMap) == null ? void 0 : _a[funcName];
|
|
141
|
+
const cacheKey = `method:${client.public.chain.id}-${address}-${String(funcName)}-${JSON.stringify(args)}`;
|
|
142
|
+
if (methodConfig) {
|
|
143
|
+
return this.cache.wrap(cacheKey, () => {
|
|
144
|
+
return target[funcName](...args);
|
|
145
|
+
}, methodConfig);
|
|
146
|
+
}
|
|
147
|
+
return target[funcName](...args);
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
return new Proxy(target[funcName], handler);
|
|
151
|
+
}
|
|
152
|
+
};
|
|
153
|
+
const contract = getContract({
|
|
154
|
+
//@ts-ignore
|
|
155
|
+
client,
|
|
156
|
+
address,
|
|
157
|
+
abi
|
|
158
|
+
});
|
|
159
|
+
return new Proxy(contract, handler);
|
|
160
|
+
}
|
|
113
161
|
static init() {
|
|
114
162
|
if (!globalThis.aiem) {
|
|
115
163
|
globalThis.aiem = new _AIem();
|
|
@@ -120,9 +168,9 @@ var _AIem = class _AIem {
|
|
|
120
168
|
static Get(abi, chainId, address, wallet) {
|
|
121
169
|
const aiem = this.init();
|
|
122
170
|
const cacheKey = `contract ${md5(JSON.stringify(abi))}-${chainId}-${address}-${wallet ? wallet.account.address : null}`;
|
|
123
|
-
return aiem.
|
|
171
|
+
return aiem._cache.wrap(cacheKey, () => {
|
|
124
172
|
const pubClient = aiem.PubClient(chainId);
|
|
125
|
-
return getContract({
|
|
173
|
+
return aiem.getContract({
|
|
126
174
|
client: {
|
|
127
175
|
//@ts-ignore
|
|
128
176
|
public: pubClient,
|
package/dist/aiem.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../aiem.ts"],"names":["_a"],"mappings":"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","sourcesContent":["import { type Chain, type GetContractReturnType, createPublicClient, getContract, http, type Abi, PublicClient, HttpTransport, WalletClient } from 'viem'\nimport QuickLRU from 'quick-lru';\nimport md5 from \"md5\"\nimport { iotex, mainnet, bsc, polygon, iotexTestnet, } from 'viem/chains'\n\n\n//@ts-ignore\nmainnet.rpcUrls.default.http = ['https://rpc.ankr.com/eth']\n//@ts-ignore\nmainnet.rpcUrls.default.webSocket = [\"wss://ethereum-rpc.publicnode.com\"]\n\n\n\n\nexport class Cache {\n kv = new QuickLRU<string, any>({ maxSize: 10000 });\n\n wrap<T>(key: string, fn: () => T | Promise<T>): T | Promise<T> {\n if (this.kv.has(key)) {\n return this.kv.get(key);\n }\n\n const result = fn();\n if (result instanceof Promise) {\n const promiseResult = result.then(res => {\n this.kv.set(key, res);\n return res;\n });\n this.kv.set(key, promiseResult);\n return promiseResult;\n } else {\n this.kv.set(key, result);\n return result;\n }\n }\n}\n\nexport class AIem<Contracts extends Record<string, Abi>, Chains extends Record<string, Chain>, Addrs extends { [K in keyof Contracts]?: { [key: string]: `${string}-0x${string}` } }> {\n static cache?: Cache = new Cache()\n contractMap: Contracts\n //@ts-ignore\n chainMap?: Chains = {\n [iotex.id]: iotex,\n [mainnet.id]: mainnet,\n [bsc.id]: bsc,\n [polygon.id]: polygon,\n [iotexTestnet.id]: iotexTestnet,\n }\n nameMap: Addrs\n contracts: {\n [K in keyof Addrs & keyof Contracts]: {\n //@ts-ignore\n [KK in keyof Addrs[K]]: GetContractReturnType<Contracts[K], PublicClient<HttpTransport, Chain, any, any>, any, any>\n }\n }\n\n get cache() {\n return AIem.cache\n }\n\n getWallet?: () => WalletClient\n\n constructor(args: Pick<AIem<Contracts, Chains, Addrs>, \"contractMap\" | \"chainMap\" | \"nameMap\" | \"getWallet\">) {\n\n const { chainMap = {}, contractMap = {}, ...rest } = args || {}\n //@ts-ignore\n this.chainMap = Object.assign({}, this.chainMap || {}, chainMap)\n //@ts-ignore\n this.contractMap = Object.assign({}, this.contractMap || {}, contractMap)\n\n Object.assign(this, rest)\n\n\n this.contracts = new Proxy({}, {\n //@ts-ignore\n get: (target: any, contractName: keyof Addrs & keyof Contracts) => {\n if (target[contractName]) return target[contractName]\n\n if (!this.nameMap[contractName]) {\n throw new Error(`Contract ${String(contractName)} not found`);\n }\n\n target[contractName] = new Proxy({}, {\n //@ts-ignore\n get: (innerTarget: any, contractAlias: keyof Addrs[keyof Addrs]) => {\n const addressStr = this.nameMap[contractName]?.[contractAlias];\n if (!addressStr) {\n throw new Error(`Alias ${String(contractAlias)} for contract ${String(contractName)} not found`);\n }\n const [chainId, address] = addressStr.split('-');\n\n\n // Assuming getContractInstance is a function that retrieves a contract instance\n return this.Get(contractName, String(chainId), address as `0x${string}`);\n }\n });\n return target[contractName];\n }\n }) as any;\n\n }\n\n // WsClient<C extends keyof Chains>(chainId: C): PublicClient<WebSocketTransport, Chain, any, any> {\n // //@ts-ignore\n // return this.cache.wrap(`wsClient-${String(chainId)}`, () => {\n // // const wsUrl = this.chainMap[chainId]?.rpcUrls?.default?.webSocket?.[0]\n // // if (!wsUrl) throw new Error(`rpcUrls.default.webSocket[0] is not defined for chainId ${String(chainId)}`)\n // // //@ts-ignore\n // return createPublicClient({\n // //@ts-ignore\n // chain: this.chainMap[chainId],\n // transport: webSocket()\n // }) as PublicClient<WebSocketTransport, Chain, any, any>\n // })\n // }\n\n\n PubClient<C extends keyof Chains>(chainId: C): PublicClient<HttpTransport, Chain, any, any> {\n //@ts-ignore\n return this.cache.wrap(`publicClient-${String(chainId)}`, () => {\n //@ts-ignore\n return createPublicClient({\n //@ts-ignore\n chain: this.chainMap[chainId],\n transport: http()\n }) as PublicClient<HttpTransport, Chain, any, any>\n })\n }\n\n\n //@ts-ignore\n Get<K extends keyof Contracts, C extends keyof Chains, Addr extends `0x${string}`>(contractName: K, chainId: C, address: Addr): GetContractReturnType<Contracts[K], PublicClient<HttpTransport, Chain, any, any>> {\n const wallet = this.getWallet ? this.getWallet() : null\n //@ts-ignore\n const cacheKey = `contract: ${contractName}-${chainId}-${address}-${wallet ? wallet.account.address : wallet}`\n return this.cache.wrap(cacheKey, () => {\n //@ts-ignore\n const contract = this.contractMap[contractName];\n //@ts-ignore\n const pubClient = this.PubClient(chainId)\n\n //@ts-ignore\n return getContract({\n client: {\n //@ts-ignore\n public: pubClient,\n //@ts-ignore\n wallet\n },\n address,\n abi: contract\n })\n }) as any\n }\n\n\n static init(): AIem<any, any, any> {\n if (!globalThis.aiem) {\n //@ts-ignore\n globalThis.aiem = new AIem();\n }\n\n return globalThis.aiem;\n }\n\n //@ts-ignore\n static Get<TAbi extends Abi = any>(abi: TAbi, chainId: any, address: any, wallet?: WalletClient): GetContractReturnType<TAbi, PublicClient<HttpTransport, Chain, any, any>> {\n const aiem = this.init()\n const cacheKey = `contract ${md5(JSON.stringify(abi))}-${chainId}-${address}-${wallet ? wallet.account.address : null}`\n return aiem.cache.wrap(cacheKey, () => {\n //@ts-ignore\n const pubClient = aiem.PubClient(chainId)\n\n //@ts-ignore\n return getContract({\n client: {\n //@ts-ignore\n public: pubClient,\n //@ts-ignore\n wallet\n },\n address,\n abi\n })\n }) as any\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../aiem.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Chain, type GetContractReturnType, createPublicClient, getContract, http, type Abi, PublicClient, HttpTransport, WalletClient, AbiFunction } from 'viem'\nimport md5 from \"md5\"\nimport { iotex, mainnet, bsc, polygon, iotexTestnet, } from 'viem/chains'\nimport TTLCache from '@isaacs/ttlcache'\n\n//@ts-ignore\nmainnet.rpcUrls.default.http = ['https://rpc.ankr.com/eth']\n//@ts-ignore\nmainnet.rpcUrls.default.webSocket = [\"wss://ethereum-rpc.publicnode.com\"]\n\n\n\n\nexport class Cache {\n kv = new TTLCache<string, any>({ max: 10000, ttl: 1000 * 60, });\n\n wrap<T>(key: string, fn: () => T | Promise<T>, config: TTLCache.Options<any, any> = {}): T | Promise<T> {\n if (this.kv.has(key)) {\n console.log(`load ${key} from cache`)\n return this.kv.get(key);\n }\n\n const result = fn();\n if (result instanceof Promise) {\n const promiseResult = result.then(res => {\n this.kv.set(key, res, config);\n return res;\n });\n this.kv.set(key, promiseResult, config);\n return promiseResult;\n } else {\n this.kv.set(key, result, config);\n return result;\n }\n }\n}\n\n\nexport class AIem<Contracts extends Record<string, Abi>, Chains extends Record<string, Chain>, Addrs extends { [K in keyof Contracts]?: { [key: string]: `${string}-0x${string}` } }> {\n static cache?: Cache = new Cache()\n cache?: Cache = new Cache()\n contractMap?: Contracts\n //@ts-ignore\n chainMap?: Chains = {\n [iotex.id]: iotex,\n [mainnet.id]: mainnet,\n [bsc.id]: bsc,\n [polygon.id]: polygon,\n [iotexTestnet.id]: iotexTestnet,\n }\n nameMap?: Addrs\n contracts: {\n [K in keyof Addrs & keyof Contracts]: {\n //@ts-ignore\n [KK in keyof Addrs[K]]: GetContractReturnType<Contracts[K], PublicClient<HttpTransport, Chain, any, any>, any, any>\n }\n }\n funcMap?: { [key: string]: { ttl?: number } } = {\n \"totalSupply\": { ttl: 15 },\n \"symbol\": { ttl: 60 },\n \"name\": { ttl: 60 },\n \"decimals\": { ttl: 60 },\n \"balanceOf\": { ttl: 5 }\n }\n\n\n get _cache() {\n return AIem.cache\n }\n\n\n //@ts-ignore\n getWallet?: () => WalletClient\n\n static Set<Contracts extends Record<string, Abi>, Chains extends Record<string, Chain>, Addrs extends { [K in keyof Contracts]?: { [key: string]: `${string}-0x${string}` } }>(args: Pick<AIem<Contracts, Chains, Addrs>, \"contractMap\" | \"chainMap\" | \"nameMap\" | \"getWallet\" | \"cache\" | \"funcMap\">) {\n return this.init().Set(args)\n }\n\n Set<Contracts extends Record<string, Abi>, Chains extends Record<string, Chain>, Addrs extends { [K in keyof Contracts]?: { [key: string]: `${string}-0x${string}` } }>(args: Pick<AIem<Contracts, Chains, Addrs>, \"contractMap\" | \"chainMap\" | \"nameMap\" | \"getWallet\" | \"cache\" | \"funcMap\">): AIem<Contracts, Chains, Addrs> {\n const { chainMap = {}, contractMap = {}, funcMap, ...rest } = args || {}\n //@ts-ignore\n this.chainMap = Object.assign({}, this.chainMap || {}, chainMap)\n //@ts-ignore\n this.contractMap = Object.assign({}, this.contractMap || {}, contractMap)\n //@ts-ignore\n this.funcMap = Object.assign({}, this.funcMap || {}, funcMap)\n\n Object.assign(this, rest)\n return this as any\n }\n\n\n constructor(args: Pick<AIem<Contracts, Chains, Addrs>, \"contractMap\" | \"chainMap\" | \"nameMap\" | \"getWallet\" | \"cache\" | \"funcMap\"> = {}) {\n\n\n this.Set(args)\n\n this.contracts = new Proxy({}, {\n //@ts-ignore\n get: (target: any, contractName: keyof Addrs & keyof Contracts) => {\n if (target[contractName]) return target[contractName]\n\n if (!this.nameMap[contractName]) {\n throw new Error(`Contract ${String(contractName)} not found`);\n }\n\n target[contractName] = new Proxy({}, {\n //@ts-ignore\n get: (innerTarget: any, contractAlias: keyof Addrs[keyof Addrs]) => {\n const addressStr = this.nameMap[contractName]?.[contractAlias];\n if (!addressStr) {\n throw new Error(`Alias ${String(contractAlias)} for contract ${String(contractName)} not found`);\n }\n const [chainId, address] = addressStr.split('-');\n\n\n // Assuming getContractInstance is a function that retrieves a contract instance\n return this.Get(contractName, String(chainId), address as `0x${string}`);\n }\n });\n return target[contractName];\n }\n }) as any;\n\n }\n\n // WsClient<C extends keyof Chains>(chainId: C): PublicClient<WebSocketTransport, Chain, any, any> {\n // //@ts-ignore\n // return this.cache.wrap(`wsClient-${String(chainId)}`, () => {\n // // const wsUrl = this.chainMap[chainId]?.rpcUrls?.default?.webSocket?.[0]\n // // if (!wsUrl) throw new Error(`rpcUrls.default.webSocket[0] is not defined for chainId ${String(chainId)}`)\n // // //@ts-ignore\n // return createPublicClient({\n // //@ts-ignore\n // chain: this.chainMap[chainId],\n // transport: webSocket()\n // }) as PublicClient<WebSocketTransport, Chain, any, any>\n // })\n // }\n\n\n PubClient<C extends keyof Chains>(chainId: C): PublicClient<HttpTransport, Chain, any, any> {\n //@ts-ignore\n return this._cache.wrap(`publicClient-${String(chainId)}`, () => {\n //@ts-ignore\n return createPublicClient({\n //@ts-ignore\n chain: this.chainMap[chainId],\n transport: http()\n }) as PublicClient<HttpTransport, Chain, any, any>\n })\n }\n\n\n //@ts-ignore\n Get<K extends keyof Contracts, C extends keyof Chains, Addr extends `0x${string}`>(contractName: K, chainId: C, address: Addr): GetContractReturnType<Contracts[K], PublicClient<HttpTransport, Chain, any, any>> {\n const wallet = this.getWallet ? this.getWallet() : null\n //@ts-ignore\n const cacheKey = `contract: ${contractName}-${chainId}-${address}-${wallet ? wallet.account.address : wallet}`\n return this._cache.wrap(cacheKey, () => {\n //@ts-ignore\n const contract = this.contractMap[contractName];\n //@ts-ignore\n const pubClient = this.PubClient(chainId)\n\n //@ts-ignore\n return this.getContract({\n client: {\n //@ts-ignore\n public: pubClient,\n //@ts-ignore\n wallet\n },\n address,\n abi: contract\n })\n }) as any\n }\n\n getContract({\n client,\n address,\n abi\n }: {\n client: {\n public: PublicClient<HttpTransport, Chain, any, any>\n wallet?: WalletClient\n }\n address: `0x${string}`\n abi: any,\n }) {\n const handler = {\n get: (target: any, funcName: any) => {\n if (typeof target[funcName] === 'function') {\n return async (...args: any[]) => {\n const methodConfig = this.funcMap?.[funcName as string];\n const cacheKey = `method:${client.public.chain.id}-${address}-${String(funcName)}-${JSON.stringify(args)}`;\n\n if (methodConfig) {\n return this.cache.wrap(cacheKey, () => {\n return target[funcName](...args);\n }, methodConfig);\n }\n\n return target[funcName](...args);\n };\n }\n return new Proxy(target[funcName], handler)\n }\n }\n\n //@ts-ignore\n const contract = getContract({\n //@ts-ignore\n client,\n address,\n abi\n })\n return new Proxy(contract, handler) as any\n }\n\n\n static init(): AIem<any, any, any> {\n if (!globalThis.aiem) {\n //@ts-ignore\n globalThis.aiem = new AIem();\n }\n\n return globalThis.aiem;\n }\n\n //@ts-ignore\n static Get<TAbi extends Abi = any>(abi: TAbi, chainId: any, address: any, wallet?: WalletClient): GetContractReturnType<TAbi, PublicClient<HttpTransport, Chain, any, any>> {\n const aiem = this.init()\n\n const cacheKey = `contract ${md5(JSON.stringify(abi))}-${chainId}-${address}-${wallet ? wallet.account.address : null}`\n return aiem._cache.wrap(cacheKey, () => {\n //@ts-ignore\n const pubClient = aiem.PubClient(chainId)\n\n //@ts-ignore\n return aiem.getContract({\n client: {\n //@ts-ignore\n public: pubClient,\n //@ts-ignore\n wallet\n },\n address,\n abi\n })\n }) as any\n }\n}\n\n\nexport type ReadFunctionKeys<T extends Abi> = T[number] extends infer U\n ? U extends AbiFunction\n ? U['stateMutability'] extends 'view' | 'pure'\n ? U['name']\n : never\n : never\n : never;\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dappworks/kit",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.102",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "./dist/index.mjs",
|
|
6
6
|
"types": "./dist/index.d.mts",
|
|
@@ -144,7 +144,7 @@
|
|
|
144
144
|
},
|
|
145
145
|
"dependencies": {
|
|
146
146
|
"@internationalized/date": "^3.5.4",
|
|
147
|
-
"
|
|
148
|
-
"
|
|
147
|
+
"@isaacs/ttlcache": "^1.4.1",
|
|
148
|
+
"md5": "^2.3.0"
|
|
149
149
|
}
|
|
150
150
|
}
|