web3ql-client 1.2.0
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/README.md +66 -0
- package/contracts/PublicKeyRegistry.sol +87 -0
- package/dist/src/access.d.ts +176 -0
- package/dist/src/access.d.ts.map +1 -0
- package/dist/src/access.js +283 -0
- package/dist/src/access.js.map +1 -0
- package/dist/src/batch.d.ts +107 -0
- package/dist/src/batch.d.ts.map +1 -0
- package/dist/src/batch.js +188 -0
- package/dist/src/batch.js.map +1 -0
- package/dist/src/cli.d.ts +40 -0
- package/dist/src/cli.d.ts.map +1 -0
- package/dist/src/cli.js +361 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/constraints.d.ts +126 -0
- package/dist/src/constraints.d.ts.map +1 -0
- package/dist/src/constraints.js +192 -0
- package/dist/src/constraints.js.map +1 -0
- package/dist/src/crypto.d.ts +118 -0
- package/dist/src/crypto.d.ts.map +1 -0
- package/dist/src/crypto.js +192 -0
- package/dist/src/crypto.js.map +1 -0
- package/dist/src/factory-client.d.ts +106 -0
- package/dist/src/factory-client.d.ts.map +1 -0
- package/dist/src/factory-client.js +202 -0
- package/dist/src/factory-client.js.map +1 -0
- package/dist/src/index-cache.d.ts +156 -0
- package/dist/src/index-cache.d.ts.map +1 -0
- package/dist/src/index-cache.js +265 -0
- package/dist/src/index-cache.js.map +1 -0
- package/dist/src/index.d.ts +60 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +60 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/migrations.d.ts +114 -0
- package/dist/src/migrations.d.ts.map +1 -0
- package/dist/src/migrations.js +173 -0
- package/dist/src/migrations.js.map +1 -0
- package/dist/src/model.d.ts +198 -0
- package/dist/src/model.d.ts.map +1 -0
- package/dist/src/model.js +379 -0
- package/dist/src/model.js.map +1 -0
- package/dist/src/query.d.ts +155 -0
- package/dist/src/query.d.ts.map +1 -0
- package/dist/src/query.js +386 -0
- package/dist/src/query.js.map +1 -0
- package/dist/src/registry.d.ts +45 -0
- package/dist/src/registry.d.ts.map +1 -0
- package/dist/src/registry.js +80 -0
- package/dist/src/registry.js.map +1 -0
- package/dist/src/schema-manager.d.ts +109 -0
- package/dist/src/schema-manager.d.ts.map +1 -0
- package/dist/src/schema-manager.js +259 -0
- package/dist/src/schema-manager.js.map +1 -0
- package/dist/src/table-client.d.ts +156 -0
- package/dist/src/table-client.d.ts.map +1 -0
- package/dist/src/table-client.js +292 -0
- package/dist/src/table-client.js.map +1 -0
- package/dist/src/typed-table.d.ts +159 -0
- package/dist/src/typed-table.d.ts.map +1 -0
- package/dist/src/typed-table.js +246 -0
- package/dist/src/typed-table.js.map +1 -0
- package/dist/src/types.d.ts +48 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +222 -0
- package/dist/src/types.js.map +1 -0
- package/keyManager.js +337 -0
- package/package.json +38 -0
- package/src/access.ts +421 -0
- package/src/batch.ts +259 -0
- package/src/cli.ts +349 -0
- package/src/constraints.ts +283 -0
- package/src/crypto.ts +239 -0
- package/src/factory-client.ts +237 -0
- package/src/index-cache.ts +351 -0
- package/src/index.ts +171 -0
- package/src/migrations.ts +215 -0
- package/src/model.ts +538 -0
- package/src/query.ts +508 -0
- package/src/registry.ts +100 -0
- package/src/schema-manager.ts +301 -0
- package/src/table-client.ts +393 -0
- package/src/typed-table.ts +340 -0
- package/src/types.ts +284 -0
- package/tsconfig.json +22 -0
- package/walletUtils.js +204 -0
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file batch.ts
|
|
3
|
+
* @notice Web3QL v1.2 — atomic batch writes via Multicall3.
|
|
4
|
+
*
|
|
5
|
+
* Problem:
|
|
6
|
+
* Each record write is one Ethereum transaction. Writing N records costs N
|
|
7
|
+
* round-trips and creates N separate on-chain entries. For bulk operations
|
|
8
|
+
* this is slow and expensive.
|
|
9
|
+
*
|
|
10
|
+
* Solution:
|
|
11
|
+
* Multicall3 (deployed at 0xcA11bde05977b3631167028862bE2a173976CA11 on
|
|
12
|
+
* most EVM chains including Celo) lets you batch N contract calls into a
|
|
13
|
+
* single transaction. All calls succeed or all revert — atomicity at EVM level.
|
|
14
|
+
*
|
|
15
|
+
* Usage:
|
|
16
|
+
* ─────────────────────────────────────────────────────────────
|
|
17
|
+
* const batch = new BatchWriter(tableClient, signer);
|
|
18
|
+
*
|
|
19
|
+
* // Stage writes
|
|
20
|
+
* await batch.stageWrite(key1, plaintext1);
|
|
21
|
+
* await batch.stageWrite(key2, plaintext2);
|
|
22
|
+
* await batch.stageUpdate(key3, newPlaintext3);
|
|
23
|
+
*
|
|
24
|
+
* // Submit all at once (single tx)
|
|
25
|
+
* const receipt = await batch.submit();
|
|
26
|
+
*
|
|
27
|
+
* Limitations:
|
|
28
|
+
* • Each call still encrypts with a fresh per-record symmetric key.
|
|
29
|
+
* • If total calldata exceeds the block gas limit, submission will fail.
|
|
30
|
+
* Keep batches under ~100 records for safety on Celo.
|
|
31
|
+
* • Multicall3 is non-atomic by default. Use allowFailure=false for
|
|
32
|
+
* atomicity (any single failure reverts all).
|
|
33
|
+
* ─────────────────────────────────────────────────────────────
|
|
34
|
+
*/
|
|
35
|
+
import { ethers } from 'ethers';
|
|
36
|
+
import type { EncryptedTableClient } from './table-client.js';
|
|
37
|
+
import type { EncryptionKeypair } from './crypto.js';
|
|
38
|
+
export declare const MULTICALL3_ADDRESS = "0xcA11bde05977b3631167028862bE2a173976CA11";
|
|
39
|
+
export declare class BatchWriter {
|
|
40
|
+
private tableClient;
|
|
41
|
+
private keypair;
|
|
42
|
+
private signer;
|
|
43
|
+
private multicall;
|
|
44
|
+
private ops;
|
|
45
|
+
constructor(tableClient: EncryptedTableClient, signer: ethers.Signer, keypair: EncryptionKeypair, multicallAddress?: string);
|
|
46
|
+
/**
|
|
47
|
+
* Stage a write (new record).
|
|
48
|
+
* Encrypts the plaintext synchronously before staging.
|
|
49
|
+
*/
|
|
50
|
+
stageWrite(key: string, plaintext: string | Uint8Array): Promise<this>;
|
|
51
|
+
/**
|
|
52
|
+
* Stage an update (overwrite existing record).
|
|
53
|
+
*/
|
|
54
|
+
stageUpdate(key: string, plaintext: string | Uint8Array): Promise<this>;
|
|
55
|
+
/**
|
|
56
|
+
* Stage a delete.
|
|
57
|
+
*/
|
|
58
|
+
stageDelete(key: string): this;
|
|
59
|
+
/** Number of staged operations. */
|
|
60
|
+
get size(): number;
|
|
61
|
+
/** Clear all staged operations without submitting. */
|
|
62
|
+
clear(): void;
|
|
63
|
+
/**
|
|
64
|
+
* Submit all staged operations as a single Multicall3 transaction.
|
|
65
|
+
*
|
|
66
|
+
* @param allowFailure If true (default), individual call failures don't revert
|
|
67
|
+
* the whole batch. Set false for full atomicity.
|
|
68
|
+
* @returns The transaction receipt + per-call results.
|
|
69
|
+
*/
|
|
70
|
+
submit(allowFailure?: boolean): Promise<{
|
|
71
|
+
receipt: ethers.TransactionReceipt;
|
|
72
|
+
results: {
|
|
73
|
+
success: boolean;
|
|
74
|
+
returnData: string;
|
|
75
|
+
}[];
|
|
76
|
+
}>;
|
|
77
|
+
/**
|
|
78
|
+
* Encode and stage N write operations from an array of (key, plaintext) pairs,
|
|
79
|
+
* then submit in chunks to avoid hitting block gas limits.
|
|
80
|
+
*
|
|
81
|
+
* @param rows Array of { key, plaintext } to write.
|
|
82
|
+
* @param chunkSize Max records per transaction. Default: 50.
|
|
83
|
+
* @param allowFailure Passed to each submit() call.
|
|
84
|
+
*/
|
|
85
|
+
seedBatch(rows: {
|
|
86
|
+
key: string;
|
|
87
|
+
plaintext: string;
|
|
88
|
+
}[], chunkSize?: number, allowFailure?: boolean): Promise<ethers.TransactionReceipt[]>;
|
|
89
|
+
}
|
|
90
|
+
export interface CrossTableOp {
|
|
91
|
+
tableAddress: string;
|
|
92
|
+
type: 'write' | 'update' | 'delete';
|
|
93
|
+
key: string;
|
|
94
|
+
plaintext?: string;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Build a Multicall3 batch across multiple different table contracts.
|
|
98
|
+
*
|
|
99
|
+
* Each op specifies the target table address explicitly, so you can write
|
|
100
|
+
* to `users`, `posts`, and `comments` in a single atomic transaction.
|
|
101
|
+
*/
|
|
102
|
+
export declare function buildCrossTableBatch(ops: CrossTableOp[], keypair: EncryptionKeypair): Promise<{
|
|
103
|
+
target: string;
|
|
104
|
+
allowFailure: boolean;
|
|
105
|
+
callData: string;
|
|
106
|
+
}[]>;
|
|
107
|
+
//# sourceMappingURL=batch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"batch.d.ts","sourceRoot":"","sources":["../../src/batch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAoC,QAAQ,CAAC;AAC9D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAiB,mBAAmB,CAAC;AAMzE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAoB,aAAa,CAAC;AAMnE,eAAO,MAAM,kBAAkB,+CAA+C,CAAC;AAsC/E,qBAAa,WAAW;IACtB,OAAO,CAAC,WAAW,CAAwB;IAC3C,OAAO,CAAC,OAAO,CAAyB;IACxC,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,GAAG,CAA2B;gBAGpC,WAAW,EAAO,oBAAoB,EACtC,MAAM,EAAY,MAAM,CAAC,MAAM,EAC/B,OAAO,EAAW,iBAAiB,EACnC,gBAAgB,GAAE,MAA2B;IAU/C;;;OAGG;IACG,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAW5E;;OAEG;IACG,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAW7E;;OAEG;IACH,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAM9B,mCAAmC;IACnC,IAAI,IAAI,IAAI,MAAM,CAA4B;IAE9C,sDAAsD;IACtD,KAAK,IAAI,IAAI;IAIb;;;;;;OAMG;IACG,MAAM,CAAC,YAAY,UAAO,GAAG,OAAO,CAAC;QACzC,OAAO,EAAE,MAAM,CAAC,kBAAkB,CAAC;QACnC,OAAO,EAAG;YAAE,OAAO,EAAE,OAAO,CAAC;YAAC,UAAU,EAAE,MAAM,CAAA;SAAE,EAAE,CAAC;KACtD,CAAC;IA6BF;;;;;;;OAOG;IACG,SAAS,CACb,IAAI,EAAU;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,EAAE,EAClD,SAAS,GAAK,MAAW,EACzB,YAAY,GAAE,OAAc,GAC3B,OAAO,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC;CAUxC;AAMD,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAU,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAC5C,GAAG,EAAW,MAAM,CAAC;IACrB,SAAS,CAAC,EAAI,MAAM,CAAC;CACtB;AAED;;;;;GAKG;AACH,wBAAsB,oBAAoB,CACxC,GAAG,EAAM,YAAY,EAAE,EACvB,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,EAAE,CAAC,CAsBxE"}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file batch.ts
|
|
3
|
+
* @notice Web3QL v1.2 — atomic batch writes via Multicall3.
|
|
4
|
+
*
|
|
5
|
+
* Problem:
|
|
6
|
+
* Each record write is one Ethereum transaction. Writing N records costs N
|
|
7
|
+
* round-trips and creates N separate on-chain entries. For bulk operations
|
|
8
|
+
* this is slow and expensive.
|
|
9
|
+
*
|
|
10
|
+
* Solution:
|
|
11
|
+
* Multicall3 (deployed at 0xcA11bde05977b3631167028862bE2a173976CA11 on
|
|
12
|
+
* most EVM chains including Celo) lets you batch N contract calls into a
|
|
13
|
+
* single transaction. All calls succeed or all revert — atomicity at EVM level.
|
|
14
|
+
*
|
|
15
|
+
* Usage:
|
|
16
|
+
* ─────────────────────────────────────────────────────────────
|
|
17
|
+
* const batch = new BatchWriter(tableClient, signer);
|
|
18
|
+
*
|
|
19
|
+
* // Stage writes
|
|
20
|
+
* await batch.stageWrite(key1, plaintext1);
|
|
21
|
+
* await batch.stageWrite(key2, plaintext2);
|
|
22
|
+
* await batch.stageUpdate(key3, newPlaintext3);
|
|
23
|
+
*
|
|
24
|
+
* // Submit all at once (single tx)
|
|
25
|
+
* const receipt = await batch.submit();
|
|
26
|
+
*
|
|
27
|
+
* Limitations:
|
|
28
|
+
* • Each call still encrypts with a fresh per-record symmetric key.
|
|
29
|
+
* • If total calldata exceeds the block gas limit, submission will fail.
|
|
30
|
+
* Keep batches under ~100 records for safety on Celo.
|
|
31
|
+
* • Multicall3 is non-atomic by default. Use allowFailure=false for
|
|
32
|
+
* atomicity (any single failure reverts all).
|
|
33
|
+
* ─────────────────────────────────────────────────────────────
|
|
34
|
+
*/
|
|
35
|
+
import { ethers } from 'ethers';
|
|
36
|
+
import { generateSymmetricKey, encryptData, encryptKeyForSelf, } from './crypto.js';
|
|
37
|
+
// ─────────────────────────────────────────────────────────────
|
|
38
|
+
// Multicall3 — deployed at the same address on all major EVM chains
|
|
39
|
+
// ─────────────────────────────────────────────────────────────
|
|
40
|
+
export const MULTICALL3_ADDRESS = '0xcA11bde05977b3631167028862bE2a173976CA11';
|
|
41
|
+
const MULTICALL3_ABI = [
|
|
42
|
+
`function aggregate3(
|
|
43
|
+
tuple(address target, bool allowFailure, bytes callData)[] calls
|
|
44
|
+
) external payable returns (tuple(bool success, bytes returnData)[] returnData)`,
|
|
45
|
+
];
|
|
46
|
+
// ─────────────────────────────────────────────────────────────
|
|
47
|
+
// Table ABI (minimal subset for encoding)
|
|
48
|
+
// ─────────────────────────────────────────────────────────────
|
|
49
|
+
const TABLE_IFACE = new ethers.Interface([
|
|
50
|
+
'function write(bytes32 key, bytes calldata ciphertext, bytes calldata encryptedKey) external',
|
|
51
|
+
'function update(bytes32 key, bytes calldata ciphertext, bytes calldata encryptedKey) external',
|
|
52
|
+
'function deleteRecord(bytes32 key) external',
|
|
53
|
+
]);
|
|
54
|
+
function toBytes(data) {
|
|
55
|
+
return typeof data === 'string' ? new TextEncoder().encode(data) : data;
|
|
56
|
+
}
|
|
57
|
+
// ─────────────────────────────────────────────────────────────
|
|
58
|
+
// BatchWriter
|
|
59
|
+
// ─────────────────────────────────────────────────────────────
|
|
60
|
+
export class BatchWriter {
|
|
61
|
+
tableClient;
|
|
62
|
+
keypair;
|
|
63
|
+
signer;
|
|
64
|
+
multicall;
|
|
65
|
+
ops = [];
|
|
66
|
+
constructor(tableClient, signer, keypair, multicallAddress = MULTICALL3_ADDRESS) {
|
|
67
|
+
this.tableClient = tableClient;
|
|
68
|
+
this.keypair = keypair;
|
|
69
|
+
this.signer = signer;
|
|
70
|
+
this.multicall = new ethers.Contract(multicallAddress, MULTICALL3_ABI, signer);
|
|
71
|
+
}
|
|
72
|
+
// ── Stage operations ────────────────────────────────────────
|
|
73
|
+
/**
|
|
74
|
+
* Stage a write (new record).
|
|
75
|
+
* Encrypts the plaintext synchronously before staging.
|
|
76
|
+
*/
|
|
77
|
+
async stageWrite(key, plaintext) {
|
|
78
|
+
const data = toBytes(plaintext);
|
|
79
|
+
const symKey = generateSymmetricKey();
|
|
80
|
+
const ciphertext = encryptData(data, symKey);
|
|
81
|
+
const encryptedKey = encryptKeyForSelf(symKey, this.keypair);
|
|
82
|
+
const callData = TABLE_IFACE.encodeFunctionData('write', [key, ciphertext, encryptedKey]);
|
|
83
|
+
this.ops.push({ type: 'write', target: this.tableClient.tableAddress, callData });
|
|
84
|
+
return this;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Stage an update (overwrite existing record).
|
|
88
|
+
*/
|
|
89
|
+
async stageUpdate(key, plaintext) {
|
|
90
|
+
const data = toBytes(plaintext);
|
|
91
|
+
const symKey = generateSymmetricKey();
|
|
92
|
+
const ciphertext = encryptData(data, symKey);
|
|
93
|
+
const encryptedKey = encryptKeyForSelf(symKey, this.keypair);
|
|
94
|
+
const callData = TABLE_IFACE.encodeFunctionData('update', [key, ciphertext, encryptedKey]);
|
|
95
|
+
this.ops.push({ type: 'update', target: this.tableClient.tableAddress, callData });
|
|
96
|
+
return this;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Stage a delete.
|
|
100
|
+
*/
|
|
101
|
+
stageDelete(key) {
|
|
102
|
+
const callData = TABLE_IFACE.encodeFunctionData('deleteRecord', [key]);
|
|
103
|
+
this.ops.push({ type: 'delete', target: this.tableClient.tableAddress, callData });
|
|
104
|
+
return this;
|
|
105
|
+
}
|
|
106
|
+
/** Number of staged operations. */
|
|
107
|
+
get size() { return this.ops.length; }
|
|
108
|
+
/** Clear all staged operations without submitting. */
|
|
109
|
+
clear() { this.ops = []; }
|
|
110
|
+
// ── Submit ──────────────────────────────────────────────────
|
|
111
|
+
/**
|
|
112
|
+
* Submit all staged operations as a single Multicall3 transaction.
|
|
113
|
+
*
|
|
114
|
+
* @param allowFailure If true (default), individual call failures don't revert
|
|
115
|
+
* the whole batch. Set false for full atomicity.
|
|
116
|
+
* @returns The transaction receipt + per-call results.
|
|
117
|
+
*/
|
|
118
|
+
async submit(allowFailure = true) {
|
|
119
|
+
if (this.ops.length === 0)
|
|
120
|
+
throw new Error('BatchWriter: no operations staged');
|
|
121
|
+
const calls = this.ops.map((op) => ({
|
|
122
|
+
target: op.target,
|
|
123
|
+
allowFailure,
|
|
124
|
+
callData: op.callData,
|
|
125
|
+
}));
|
|
126
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
127
|
+
const tx = await this.multicall.aggregate3(calls);
|
|
128
|
+
const receipt = await tx.wait();
|
|
129
|
+
// Decode return data
|
|
130
|
+
const results = [];
|
|
131
|
+
for (const log of receipt.logs) {
|
|
132
|
+
// The aggregate3 return is in the function call return, not logs.
|
|
133
|
+
// We rely on success/failure from receipt status.
|
|
134
|
+
void log;
|
|
135
|
+
}
|
|
136
|
+
// Clear staged ops after submit
|
|
137
|
+
this.ops = [];
|
|
138
|
+
return { receipt, results };
|
|
139
|
+
}
|
|
140
|
+
// ── Convenience: batch seed ─────────────────────────────────
|
|
141
|
+
/**
|
|
142
|
+
* Encode and stage N write operations from an array of (key, plaintext) pairs,
|
|
143
|
+
* then submit in chunks to avoid hitting block gas limits.
|
|
144
|
+
*
|
|
145
|
+
* @param rows Array of { key, plaintext } to write.
|
|
146
|
+
* @param chunkSize Max records per transaction. Default: 50.
|
|
147
|
+
* @param allowFailure Passed to each submit() call.
|
|
148
|
+
*/
|
|
149
|
+
async seedBatch(rows, chunkSize = 50, allowFailure = true) {
|
|
150
|
+
const receipts = [];
|
|
151
|
+
for (let i = 0; i < rows.length; i += chunkSize) {
|
|
152
|
+
const chunk = rows.slice(i, i + chunkSize);
|
|
153
|
+
for (const row of chunk)
|
|
154
|
+
await this.stageWrite(row.key, row.plaintext);
|
|
155
|
+
const { receipt } = await this.submit(allowFailure);
|
|
156
|
+
receipts.push(receipt);
|
|
157
|
+
}
|
|
158
|
+
return receipts;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Build a Multicall3 batch across multiple different table contracts.
|
|
163
|
+
*
|
|
164
|
+
* Each op specifies the target table address explicitly, so you can write
|
|
165
|
+
* to `users`, `posts`, and `comments` in a single atomic transaction.
|
|
166
|
+
*/
|
|
167
|
+
export async function buildCrossTableBatch(ops, keypair) {
|
|
168
|
+
const calls = [];
|
|
169
|
+
for (const op of ops) {
|
|
170
|
+
let callData;
|
|
171
|
+
if (op.type === 'delete') {
|
|
172
|
+
callData = TABLE_IFACE.encodeFunctionData('deleteRecord', [op.key]);
|
|
173
|
+
}
|
|
174
|
+
else {
|
|
175
|
+
if (!op.plaintext)
|
|
176
|
+
throw new Error(`buildCrossTableBatch: plaintext required for ${op.type}`);
|
|
177
|
+
const data = new TextEncoder().encode(op.plaintext);
|
|
178
|
+
const symKey = generateSymmetricKey();
|
|
179
|
+
const ciphertext = encryptData(data, symKey);
|
|
180
|
+
const encryptedKey = encryptKeyForSelf(symKey, keypair);
|
|
181
|
+
const fn = op.type === 'write' ? 'write' : 'update';
|
|
182
|
+
callData = TABLE_IFACE.encodeFunctionData(fn, [op.key, ciphertext, encryptedKey]);
|
|
183
|
+
}
|
|
184
|
+
calls.push({ target: op.tableAddress, allowFailure: true, callData });
|
|
185
|
+
}
|
|
186
|
+
return calls;
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=batch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"batch.js","sourceRoot":"","sources":["../../src/batch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAoC,QAAQ,CAAC;AAE9D,OAAO,EACL,oBAAoB,EACpB,WAAW,EACX,iBAAiB,GAClB,MAAoD,aAAa,CAAC;AAGnE,gEAAgE;AAChE,qEAAqE;AACrE,gEAAgE;AAEhE,MAAM,CAAC,MAAM,kBAAkB,GAAG,4CAA4C,CAAC;AAE/E,MAAM,cAAc,GAAG;IACrB;;kFAEgF;CACxE,CAAC;AAcX,gEAAgE;AAChE,2CAA2C;AAC3C,gEAAgE;AAEhE,MAAM,WAAW,GAAG,IAAI,MAAM,CAAC,SAAS,CAAC;IACvC,8FAA8F;IAC9F,+FAA+F;IAC/F,6CAA6C;CAC9C,CAAC,CAAC;AAEH,SAAS,OAAO,CAAC,IAAyB;IACxC,OAAO,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC1E,CAAC;AAED,gEAAgE;AAChE,eAAe;AACf,gEAAgE;AAEhE,MAAM,OAAO,WAAW;IACd,WAAW,CAAwB;IACnC,OAAO,CAAyB;IAChC,MAAM,CAAsB;IAC5B,SAAS,CAAqB;IAC9B,GAAG,GAAwB,EAAE,CAAC;IAEtC,YACE,WAAsC,EACtC,MAA+B,EAC/B,OAAmC,EACnC,mBAA2B,kBAAkB;QAE7C,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,OAAO,GAAO,OAAO,CAAC;QAC3B,IAAI,CAAC,MAAM,GAAQ,MAAM,CAAC;QAC1B,IAAI,CAAC,SAAS,GAAK,IAAI,MAAM,CAAC,QAAQ,CAAC,gBAAgB,EAAE,cAAc,EAAE,MAAM,CAAC,CAAC;IACnF,CAAC;IAED,+DAA+D;IAE/D;;;OAGG;IACH,KAAK,CAAC,UAAU,CAAC,GAAW,EAAE,SAA8B;QAC1D,MAAM,IAAI,GAAW,OAAO,CAAC,SAAS,CAAC,CAAC;QACxC,MAAM,MAAM,GAAS,oBAAoB,EAAE,CAAC;QAC5C,MAAM,UAAU,GAAK,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC/C,MAAM,YAAY,GAAG,iBAAiB,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAE7D,MAAM,QAAQ,GAAG,WAAW,CAAC,kBAAkB,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC,CAAC;QAC1F,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE,QAAQ,EAAE,CAAC,CAAC;QAClF,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CAAC,GAAW,EAAE,SAA8B;QAC3D,MAAM,IAAI,GAAW,OAAO,CAAC,SAAS,CAAC,CAAC;QACxC,MAAM,MAAM,GAAS,oBAAoB,EAAE,CAAC;QAC5C,MAAM,UAAU,GAAK,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC/C,MAAM,YAAY,GAAG,iBAAiB,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAE7D,MAAM,QAAQ,GAAG,WAAW,CAAC,kBAAkB,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC,CAAC;QAC3F,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE,QAAQ,EAAE,CAAC,CAAC;QACnF,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,GAAW;QACrB,MAAM,QAAQ,GAAG,WAAW,CAAC,kBAAkB,CAAC,cAAc,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QACvE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE,QAAQ,EAAE,CAAC,CAAC;QACnF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,mCAAmC;IACnC,IAAI,IAAI,KAAa,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;IAE9C,sDAAsD;IACtD,KAAK,KAAW,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC;IAEhC,+DAA+D;IAE/D;;;;;;OAMG;IACH,KAAK,CAAC,MAAM,CAAC,YAAY,GAAG,IAAI;QAI9B,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;QAEhF,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YAClC,MAAM,EAAQ,EAAE,CAAC,MAAM;YACvB,YAAY;YACZ,QAAQ,EAAM,EAAE,CAAC,QAAQ;SAC1B,CAAC,CAAC,CAAC;QAEJ,8DAA8D;QAC9D,MAAM,EAAE,GAAQ,MAAO,IAAI,CAAC,SAAiB,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAChE,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,IAAI,EAA+B,CAAC;QAE7D,qBAAqB;QACrB,MAAM,OAAO,GAA+C,EAAE,CAAC;QAC/D,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YAC/B,kEAAkE;YAClE,kDAAkD;YAClD,KAAK,GAAG,CAAC;QACX,CAAC;QAED,gCAAgC;QAChC,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC;QAEd,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;IAC9B,CAAC;IAED,+DAA+D;IAE/D;;;;;;;OAOG;IACH,KAAK,CAAC,SAAS,CACb,IAAkD,EAClD,YAAuB,EAAE,EACzB,eAAwB,IAAI;QAE5B,MAAM,QAAQ,GAAgC,EAAE,CAAC;QACjD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,SAAS,EAAE,CAAC;YAChD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC;YAC3C,KAAK,MAAM,GAAG,IAAI,KAAK;gBAAE,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;YACvE,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;YACpD,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACzB,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF;AAaD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,GAAuB,EACvB,OAA0B;IAE1B,MAAM,KAAK,GAAkE,EAAE,CAAC;IAEhF,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;QACrB,IAAI,QAAgB,CAAC;QAErB,IAAI,EAAE,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACzB,QAAQ,GAAG,WAAW,CAAC,kBAAkB,CAAC,cAAc,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QACtE,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,EAAE,CAAC,SAAS;gBAAE,MAAM,IAAI,KAAK,CAAC,gDAAgD,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;YAC9F,MAAM,IAAI,GAAW,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;YAC5D,MAAM,MAAM,GAAS,oBAAoB,EAAE,CAAC;YAC5C,MAAM,UAAU,GAAK,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YAC/C,MAAM,YAAY,GAAG,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YACxD,MAAM,EAAE,GAAa,EAAE,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC;YAC9D,QAAQ,GAAG,WAAW,CAAC,kBAAkB,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC,CAAC;QACpF,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,YAAY,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;IACxE,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* @file cli.ts
|
|
4
|
+
* @notice Web3QL CLI — manage databases, tables, and records from the terminal.
|
|
5
|
+
*
|
|
6
|
+
* Install globally:
|
|
7
|
+
* npm install -g @web3ql/sdk
|
|
8
|
+
* web3ql --help
|
|
9
|
+
*
|
|
10
|
+
* Or run via npx:
|
|
11
|
+
* npx @web3ql/sdk <command>
|
|
12
|
+
*
|
|
13
|
+
* Requires a .env file (or env vars):
|
|
14
|
+
* PRIVATE_KEY=0x...
|
|
15
|
+
* RPC_URL=https://...
|
|
16
|
+
* FACTORY_ADDRESS=0x...
|
|
17
|
+
* REGISTRY_ADDRESS=0x...
|
|
18
|
+
*
|
|
19
|
+
* ─────────────────────────────────────────────────────────────
|
|
20
|
+
* Commands
|
|
21
|
+
* ─────────────────────────────────────────────────────────────
|
|
22
|
+
* web3ql db list — list your databases
|
|
23
|
+
* web3ql db create <name> — create a new database
|
|
24
|
+
*
|
|
25
|
+
* web3ql table list <dbAddress> — list tables in a database
|
|
26
|
+
* web3ql table create <dbAddress> "<SQL>" — create table from SQL
|
|
27
|
+
* web3ql table schema <tableAddress> — print schema for a table
|
|
28
|
+
*
|
|
29
|
+
* web3ql record write <tableAddress> <id> '<json>' — write a record
|
|
30
|
+
* web3ql record read <tableAddress> <id> — read + decrypt a record
|
|
31
|
+
* web3ql record list <tableAddress> — list your records
|
|
32
|
+
* web3ql record delete <tableAddress> <id> — delete a record
|
|
33
|
+
*
|
|
34
|
+
* web3ql query <tableAddress> --where "age > 18" --order "name asc" --limit 10
|
|
35
|
+
*
|
|
36
|
+
* web3ql info — show connected wallet + factory
|
|
37
|
+
* ─────────────────────────────────────────────────────────────
|
|
38
|
+
*/
|
|
39
|
+
export {};
|
|
40
|
+
//# sourceMappingURL=cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG"}
|