@geoprotocol/geo-sdk 0.6.0 → 0.7.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 +98 -27
- package/dist/contracts.d.ts +1 -0
- package/dist/contracts.d.ts.map +1 -1
- package/dist/contracts.js +1 -0
- package/dist/contracts.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/src/full-flow-test.test.js +43 -59
- package/dist/src/full-flow-test.test.js.map +1 -1
- package/dist/src/graph/index.d.ts +0 -1
- package/dist/src/graph/index.d.ts.map +1 -1
- package/dist/src/graph/index.js +0 -1
- package/dist/src/graph/index.js.map +1 -1
- package/dist/src/personal-space/has-space.d.ts +6 -0
- package/dist/src/personal-space/has-space.d.ts.map +1 -0
- package/dist/src/personal-space/has-space.js +15 -0
- package/dist/src/personal-space/has-space.js.map +1 -0
- package/dist/src/personal-space/index.d.ts +1 -0
- package/dist/src/personal-space/index.d.ts.map +1 -1
- package/dist/src/personal-space/index.js +1 -0
- package/dist/src/personal-space/index.js.map +1 -1
- package/dist/src/smart-account-flow-test.test.d.ts +2 -0
- package/dist/src/smart-account-flow-test.test.d.ts.map +1 -0
- package/dist/src/smart-account-flow-test.test.js +71 -0
- package/dist/src/smart-account-flow-test.test.js.map +1 -0
- package/dist/src/smart-wallet.d.ts +20 -0
- package/dist/src/smart-wallet.d.ts.map +1 -1
- package/dist/src/smart-wallet.js +28 -8
- package/dist/src/smart-wallet.js.map +1 -1
- package/dist/src/smart-wallet.test.js +4 -3
- package/dist/src/smart-wallet.test.js.map +1 -1
- package/package.json +2 -1
- package/dist/scripts/test-publish.d.ts +0 -6
- package/dist/scripts/test-publish.d.ts.map +0 -1
- package/dist/scripts/test-publish.js +0 -121
- package/dist/scripts/test-publish.js.map +0 -1
package/README.md
CHANGED
|
@@ -283,10 +283,8 @@ import {
|
|
|
283
283
|
toHex,
|
|
284
284
|
} from "viem";
|
|
285
285
|
import { SpaceRegistryAbi, getWalletClient } from "@geoprotocol/geo-sdk";
|
|
286
|
+
import { TESTNET } from "@geoprotocol/geo-sdk/contracts";
|
|
286
287
|
|
|
287
|
-
// Contract addresses for testnet
|
|
288
|
-
const SPACE_REGISTRY_ADDRESS =
|
|
289
|
-
"0xB01683b2f0d38d43fcD4D9aAB980166988924132" as const;
|
|
290
288
|
const EDITS_PUBLISHED = keccak256(toHex("GOVERNANCE.EDITS_PUBLISHED"));
|
|
291
289
|
|
|
292
290
|
// You'll need your space ID in hex format (bytes16) and an IPFS CID
|
|
@@ -315,7 +313,7 @@ const calldata = encodeFunctionData({
|
|
|
315
313
|
|
|
316
314
|
const txResult = await walletClient.sendTransaction({
|
|
317
315
|
account: walletClient.account,
|
|
318
|
-
to: SPACE_REGISTRY_ADDRESS,
|
|
316
|
+
to: TESTNET.SPACE_REGISTRY_ADDRESS,
|
|
319
317
|
value: 0n,
|
|
320
318
|
data: calldata,
|
|
321
319
|
});
|
|
@@ -416,9 +414,88 @@ const txHash = await walletClient.sendTransaction({
|
|
|
416
414
|
});
|
|
417
415
|
```
|
|
418
416
|
|
|
419
|
-
## Full Publishing Flow
|
|
417
|
+
## Full Publishing Flow with Smart Account
|
|
420
418
|
|
|
421
|
-
This example shows the complete flow for
|
|
419
|
+
This example shows the complete flow for publishing an edit using a Geo smart account (Safe with Pimlico paymaster) on testnet. Gas is sponsored, so no testnet ETH is required.
|
|
420
|
+
|
|
421
|
+
The smart account address must already have a personal space. You can create one via the [Geo Genesis browser](https://www.geobrowser.io).
|
|
422
|
+
|
|
423
|
+
```ts
|
|
424
|
+
import { createPublicClient, type Hex, http } from "viem";
|
|
425
|
+
import {
|
|
426
|
+
Graph,
|
|
427
|
+
personalSpace,
|
|
428
|
+
getSmartAccountWalletClient,
|
|
429
|
+
SpaceRegistryAbi,
|
|
430
|
+
TESTNET_RPC_URL,
|
|
431
|
+
} from "@geoprotocol/geo-sdk";
|
|
432
|
+
import { TESTNET } from "@geoprotocol/geo-sdk/contracts";
|
|
433
|
+
|
|
434
|
+
// IMPORTANT: Be careful with your private key. Don't commit it to version control.
|
|
435
|
+
// You can get your private key using https://www.geobrowser.io/export-wallet
|
|
436
|
+
const privateKey = `0x${privateKeyFromGeoWallet}` as `0x${string}`;
|
|
437
|
+
|
|
438
|
+
// Get smart account wallet client (Safe + Pimlico paymaster)
|
|
439
|
+
const smartAccount = await getSmartAccountWalletClient({ privateKey });
|
|
440
|
+
const smartAccountAddress = smartAccount.account.address;
|
|
441
|
+
|
|
442
|
+
// Check if a personal space exists for this smart account address
|
|
443
|
+
const hasExistingSpace = await personalSpace.hasSpace({
|
|
444
|
+
address: smartAccountAddress,
|
|
445
|
+
});
|
|
446
|
+
if (!hasExistingSpace) {
|
|
447
|
+
throw new Error("No personal space found for this smart account address.");
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
const publicClient = createPublicClient({
|
|
451
|
+
transport: http(TESTNET_RPC_URL),
|
|
452
|
+
});
|
|
453
|
+
|
|
454
|
+
// Look up the space ID for this smart account address
|
|
455
|
+
const spaceIdHex = (await publicClient.readContract({
|
|
456
|
+
address: TESTNET.SPACE_REGISTRY_ADDRESS,
|
|
457
|
+
abi: SpaceRegistryAbi,
|
|
458
|
+
functionName: "addressToSpaceId",
|
|
459
|
+
args: [smartAccountAddress],
|
|
460
|
+
})) as Hex;
|
|
461
|
+
|
|
462
|
+
// Convert bytes16 hex to UUID string (without dashes)
|
|
463
|
+
const spaceId = spaceIdHex.slice(2, 34).toLowerCase();
|
|
464
|
+
console.log("spaceId", spaceId);
|
|
465
|
+
|
|
466
|
+
// Create an entity
|
|
467
|
+
const { ops, id: entityId } = Graph.createEntity({
|
|
468
|
+
name: "Test Entity",
|
|
469
|
+
});
|
|
470
|
+
console.log("entityId", entityId);
|
|
471
|
+
|
|
472
|
+
// Publish to IPFS and get calldata for on-chain submission
|
|
473
|
+
const { cid, editId, to, calldata } = await personalSpace.publishEdit({
|
|
474
|
+
name: "Test Edit",
|
|
475
|
+
spaceId,
|
|
476
|
+
ops,
|
|
477
|
+
author: smartAccountAddress,
|
|
478
|
+
network: "TESTNET",
|
|
479
|
+
});
|
|
480
|
+
console.log("cid", cid);
|
|
481
|
+
console.log("editId", editId);
|
|
482
|
+
|
|
483
|
+
// Send transaction via smart account (account and chain are baked in)
|
|
484
|
+
const txHash = await smartAccount.sendTransaction({
|
|
485
|
+
to,
|
|
486
|
+
data: calldata,
|
|
487
|
+
});
|
|
488
|
+
console.log("txHash", txHash);
|
|
489
|
+
|
|
490
|
+
const receipt = await publicClient.waitForTransactionReceipt({
|
|
491
|
+
hash: txHash,
|
|
492
|
+
});
|
|
493
|
+
console.log("Successfully published edit to space", spaceId);
|
|
494
|
+
```
|
|
495
|
+
|
|
496
|
+
## Full Publishing Flow (EOA Wallet)
|
|
497
|
+
|
|
498
|
+
This example shows the complete flow for creating a personal space and publishing an edit on testnet using the `personalSpace` module with an EOA wallet.
|
|
422
499
|
|
|
423
500
|
```ts
|
|
424
501
|
import { createPublicClient, type Hex, http } from "viem";
|
|
@@ -428,11 +505,9 @@ import {
|
|
|
428
505
|
personalSpace,
|
|
429
506
|
getWalletClient,
|
|
430
507
|
SpaceRegistryAbi,
|
|
508
|
+
TESTNET_RPC_URL,
|
|
431
509
|
} from "@geoprotocol/geo-sdk";
|
|
432
|
-
|
|
433
|
-
const SPACE_REGISTRY_ADDRESS =
|
|
434
|
-
"0xB01683b2f0d38d43fcD4D9aAB980166988924132" as const;
|
|
435
|
-
const EMPTY_SPACE_ID = "0x00000000000000000000000000000000" as Hex;
|
|
510
|
+
import { TESTNET } from "@geoprotocol/geo-sdk/contracts";
|
|
436
511
|
|
|
437
512
|
// IMPORTANT: Be careful with your private key. Don't commit it to version control.
|
|
438
513
|
// You can get your private key using https://www.geobrowser.io/export-wallet
|
|
@@ -447,22 +522,18 @@ const walletClient = await getWalletClient({
|
|
|
447
522
|
});
|
|
448
523
|
|
|
449
524
|
const account = walletClient.account;
|
|
450
|
-
const rpcUrl = walletClient.chain?.rpcUrls?.default?.http?.[0];
|
|
451
525
|
|
|
452
526
|
const publicClient = createPublicClient({
|
|
453
|
-
transport: http(
|
|
527
|
+
transport: http(TESTNET_RPC_URL),
|
|
454
528
|
});
|
|
455
529
|
|
|
456
530
|
// Check if a personal space already exists for this address
|
|
457
|
-
|
|
458
|
-
address:
|
|
459
|
-
|
|
460
|
-
functionName: "addressToSpaceId",
|
|
461
|
-
args: [account.address],
|
|
462
|
-
})) as Hex;
|
|
531
|
+
const hasExistingSpace = await personalSpace.hasSpace({
|
|
532
|
+
address: account.address,
|
|
533
|
+
});
|
|
463
534
|
|
|
464
535
|
// Create a personal space if one doesn't exist
|
|
465
|
-
if (
|
|
536
|
+
if (!hasExistingSpace) {
|
|
466
537
|
console.log("Creating personal space...");
|
|
467
538
|
|
|
468
539
|
const { to, calldata } = personalSpace.createSpace();
|
|
@@ -474,16 +545,16 @@ if (spaceIdHex.toLowerCase() === EMPTY_SPACE_ID.toLowerCase()) {
|
|
|
474
545
|
});
|
|
475
546
|
|
|
476
547
|
await publicClient.waitForTransactionReceipt({ hash: createSpaceTxHash });
|
|
477
|
-
|
|
478
|
-
// Re-fetch the space ID after creation
|
|
479
|
-
spaceIdHex = (await publicClient.readContract({
|
|
480
|
-
address: SPACE_REGISTRY_ADDRESS,
|
|
481
|
-
abi: SpaceRegistryAbi,
|
|
482
|
-
functionName: "addressToSpaceId",
|
|
483
|
-
args: [account.address],
|
|
484
|
-
})) as Hex;
|
|
485
548
|
}
|
|
486
549
|
|
|
550
|
+
// Look up the space ID
|
|
551
|
+
const spaceIdHex = (await publicClient.readContract({
|
|
552
|
+
address: TESTNET.SPACE_REGISTRY_ADDRESS,
|
|
553
|
+
abi: SpaceRegistryAbi,
|
|
554
|
+
functionName: "addressToSpaceId",
|
|
555
|
+
args: [account.address],
|
|
556
|
+
})) as Hex;
|
|
557
|
+
|
|
487
558
|
// Convert bytes16 hex to UUID string (without dashes)
|
|
488
559
|
const spaceId = spaceIdHex.slice(2, 34).toLowerCase();
|
|
489
560
|
console.log("spaceId", spaceId);
|
package/dist/contracts.d.ts
CHANGED
|
@@ -28,4 +28,5 @@ export declare const TESTNET: {
|
|
|
28
28
|
readonly PLUGIN_SETUP_PROCESSOR_ADDRESS: "0x3C9be4b42B313318091344A261DCDCd02DCd5736";
|
|
29
29
|
readonly SPACE_REGISTRY_ADDRESS: "0xB01683b2f0d38d43fcD4D9aAB980166988924132";
|
|
30
30
|
};
|
|
31
|
+
export declare const EMPTY_SPACE_ID: "0x00000000000000000000000000000000";
|
|
31
32
|
//# sourceMappingURL=contracts.d.ts.map
|
package/dist/contracts.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contracts.d.ts","sourceRoot":"","sources":["../contracts.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;GAEG;AACH,eAAO,MAAM,OAAO;;;;;;;CAOV,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,OAAO;;;;;;;;;CASV,CAAC"}
|
|
1
|
+
{"version":3,"file":"contracts.d.ts","sourceRoot":"","sources":["../contracts.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;GAEG;AACH,eAAO,MAAM,OAAO;;;;;;;CAOV,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,OAAO;;;;;;;;;CASV,CAAC;AAEX,eAAO,MAAM,cAAc,EAAG,oCAA6C,CAAC"}
|
package/dist/contracts.js
CHANGED
|
@@ -28,4 +28,5 @@ export const TESTNET = {
|
|
|
28
28
|
PLUGIN_SETUP_PROCESSOR_ADDRESS: '0x3C9be4b42B313318091344A261DCDCd02DCd5736',
|
|
29
29
|
SPACE_REGISTRY_ADDRESS: '0xB01683b2f0d38d43fcD4D9aAB980166988924132',
|
|
30
30
|
};
|
|
31
|
+
export const EMPTY_SPACE_ID = '0x00000000000000000000000000000000';
|
|
31
32
|
//# sourceMappingURL=contracts.js.map
|
package/dist/contracts.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contracts.js","sourceRoot":"","sources":["../contracts.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,yBAAyB,EAAE,4CAA4C;IACvE,wCAAwC,EAAE,4CAA4C;IACtF,8BAA8B,EAAE,4CAA4C;IAC5E,mBAAmB,EAAE,4CAA4C;IACjE,oBAAoB,EAAE,4CAA4C;IAClE,8BAA8B,EAAE,4CAA4C;CACpE,CAAC;AAEX;;GAEG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,yBAAyB,EAAE,4CAA4C;IACvE,wCAAwC,EAAE,4CAA4C;IACtF,8BAA8B,EAAE,4CAA4C;IAC5E,mBAAmB,EAAE,4CAA4C;IACjE,yBAAyB,EAAE,4CAA4C;IACvE,oBAAoB,EAAE,4CAA4C;IAClE,8BAA8B,EAAE,4CAA4C;IAC5E,sBAAsB,EAAE,4CAA4C;CAC5D,CAAC"}
|
|
1
|
+
{"version":3,"file":"contracts.js","sourceRoot":"","sources":["../contracts.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,yBAAyB,EAAE,4CAA4C;IACvE,wCAAwC,EAAE,4CAA4C;IACtF,8BAA8B,EAAE,4CAA4C;IAC5E,mBAAmB,EAAE,4CAA4C;IACjE,oBAAoB,EAAE,4CAA4C;IAClE,8BAA8B,EAAE,4CAA4C;CACpE,CAAC;AAEX;;GAEG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,yBAAyB,EAAE,4CAA4C;IACvE,wCAAwC,EAAE,4CAA4C;IACtF,8BAA8B,EAAE,4CAA4C;IAC5E,mBAAmB,EAAE,4CAA4C;IACjE,yBAAyB,EAAE,4CAA4C;IACvE,oBAAoB,EAAE,4CAA4C;IAClE,8BAA8B,EAAE,4CAA4C;IAC5E,sBAAsB,EAAE,4CAA4C;CAC5D,CAAC;AAEX,MAAM,CAAC,MAAM,cAAc,GAAG,oCAA6C,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -50,7 +50,7 @@ export * as Rank from './src/ranks/index.js';
|
|
|
50
50
|
* @since 0.0.6
|
|
51
51
|
*/
|
|
52
52
|
export { GraphUrl } from './src/scheme.js';
|
|
53
|
-
export { getSmartAccountWalletClient, getWalletClient, } from './src/smart-wallet.js';
|
|
53
|
+
export { getSmartAccountWalletClient, getWalletClient, TESTNET_RPC_URL, } from './src/smart-wallet.js';
|
|
54
54
|
/**
|
|
55
55
|
* Provides ids for commonly used entities across the Knowledge Graph.
|
|
56
56
|
*/
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACvD;;;GAGG;AACH,OAAO,KAAK,MAAM,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE;;GAEG;AACH,OAAO,KAAK,QAAQ,MAAM,0BAA0B,CAAC;AACrD,OAAO,KAAK,QAAQ,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EACL,wBAAwB,EACxB,0BAA0B,EAC1B,iCAAiC,EACjC,yBAAyB,EACzB,8BAA8B,EAC9B,8BAA8B,EAC9B,wBAAwB,EACxB,0BAA0B,EAC1B,eAAe,GAChB,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,KAAK,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACjC;;;GAGG;AACH,OAAO,KAAK,OAAO,MAAM,mBAAmB,CAAC;AAC7C;;;;;GAKG;AACH,OAAO,KAAK,IAAI,MAAM,eAAe,CAAC;AACtC;;;;GAIG;AACH,OAAO,KAAK,aAAa,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C;;;GAGG;AACH,OAAO,KAAK,IAAI,MAAM,sBAAsB,CAAC;AAE7C;;;;GAIG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE3C,OAAO,EACL,2BAA2B,EAC3B,eAAe,GAChB,MAAM,uBAAuB,CAAC;AAE/B;;GAEG;AACH,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACxE,cAAc,gBAAgB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACvD;;;GAGG;AACH,OAAO,KAAK,MAAM,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE;;GAEG;AACH,OAAO,KAAK,QAAQ,MAAM,0BAA0B,CAAC;AACrD,OAAO,KAAK,QAAQ,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EACL,wBAAwB,EACxB,0BAA0B,EAC1B,iCAAiC,EACjC,yBAAyB,EACzB,8BAA8B,EAC9B,8BAA8B,EAC9B,wBAAwB,EACxB,0BAA0B,EAC1B,eAAe,GAChB,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,KAAK,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACjC;;;GAGG;AACH,OAAO,KAAK,OAAO,MAAM,mBAAmB,CAAC;AAC7C;;;;;GAKG;AACH,OAAO,KAAK,IAAI,MAAM,eAAe,CAAC;AACtC;;;;GAIG;AACH,OAAO,KAAK,aAAa,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C;;;GAGG;AACH,OAAO,KAAK,IAAI,MAAM,sBAAsB,CAAC;AAE7C;;;;GAIG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE3C,OAAO,EACL,2BAA2B,EAC3B,eAAe,EACf,eAAe,GAChB,MAAM,uBAAuB,CAAC;AAE/B;;GAEG;AACH,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACxE,cAAc,gBAAgB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -50,7 +50,7 @@ export * as Rank from './src/ranks/index.js';
|
|
|
50
50
|
* @since 0.0.6
|
|
51
51
|
*/
|
|
52
52
|
export { GraphUrl } from './src/scheme.js';
|
|
53
|
-
export { getSmartAccountWalletClient, getWalletClient, } from './src/smart-wallet.js';
|
|
53
|
+
export { getSmartAccountWalletClient, getWalletClient, TESTNET_RPC_URL, } from './src/smart-wallet.js';
|
|
54
54
|
/**
|
|
55
55
|
* Provides ids for commonly used entities across the Knowledge Graph.
|
|
56
56
|
*/
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACvD;;;GAGG;AACH,OAAO,KAAK,MAAM,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE;;GAEG;AACH,OAAO,KAAK,QAAQ,MAAM,0BAA0B,CAAC;AACrD,OAAO,KAAK,QAAQ,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EACL,wBAAwB,EACxB,0BAA0B,EAC1B,iCAAiC,EACjC,yBAAyB,EACzB,8BAA8B,EAC9B,8BAA8B,EAC9B,wBAAwB,EACxB,0BAA0B,EAC1B,eAAe,GAChB,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,KAAK,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACjC;;;GAGG;AACH,OAAO,KAAK,OAAO,MAAM,mBAAmB,CAAC;AAC7C;;;;;GAKG;AACH,OAAO,KAAK,IAAI,MAAM,eAAe,CAAC;AACtC;;;;GAIG;AACH,OAAO,KAAK,aAAa,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C;;;GAGG;AACH,OAAO,KAAK,IAAI,MAAM,sBAAsB,CAAC;AAE7C;;;;GAIG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE3C,OAAO,EACL,2BAA2B,EAC3B,eAAe,GAChB,MAAM,uBAAuB,CAAC;AAE/B;;GAEG;AACH,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACxE,cAAc,gBAAgB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACvD;;;GAGG;AACH,OAAO,KAAK,MAAM,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE;;GAEG;AACH,OAAO,KAAK,QAAQ,MAAM,0BAA0B,CAAC;AACrD,OAAO,KAAK,QAAQ,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EACL,wBAAwB,EACxB,0BAA0B,EAC1B,iCAAiC,EACjC,yBAAyB,EACzB,8BAA8B,EAC9B,8BAA8B,EAC9B,wBAAwB,EACxB,0BAA0B,EAC1B,eAAe,GAChB,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,KAAK,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACjC;;;GAGG;AACH,OAAO,KAAK,OAAO,MAAM,mBAAmB,CAAC;AAC7C;;;;;GAKG;AACH,OAAO,KAAK,IAAI,MAAM,eAAe,CAAC;AACtC;;;;GAIG;AACH,OAAO,KAAK,aAAa,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C;;;GAGG;AACH,OAAO,KAAK,IAAI,MAAM,sBAAsB,CAAC;AAE7C;;;;GAIG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE3C,OAAO,EACL,2BAA2B,EAC3B,eAAe,EACf,eAAe,GAChB,MAAM,uBAAuB,CAAC;AAE/B;;GAEG;AACH,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACxE,cAAc,gBAAgB,CAAC"}
|
|
@@ -1,16 +1,14 @@
|
|
|
1
1
|
import { createPublicClient, http } from 'viem';
|
|
2
2
|
import { privateKeyToAccount } from 'viem/accounts';
|
|
3
3
|
import { it } from 'vitest';
|
|
4
|
+
import { TESTNET } from '../contracts.js';
|
|
4
5
|
import { SpaceRegistryAbi } from './abis/index.js';
|
|
5
6
|
import { DESCRIPTION_PROPERTY } from './core/ids/system.js';
|
|
6
7
|
import * as daoSpace from './dao-space/index.js';
|
|
7
8
|
import { createEntity } from './graph/create-entity.js';
|
|
8
9
|
import { updateEntity } from './graph/update-entity.js';
|
|
9
10
|
import * as personalSpace from './personal-space/index.js';
|
|
10
|
-
import { getWalletClient } from './smart-wallet.js';
|
|
11
|
-
// Contract addresses for testnet
|
|
12
|
-
const SPACE_REGISTRY_ADDRESS = '0xB01683b2f0d38d43fcD4D9aAB980166988924132';
|
|
13
|
-
const EMPTY_SPACE_ID = '0x00000000000000000000000000000000';
|
|
11
|
+
import { getWalletClient, TESTNET_RPC_URL } from './smart-wallet.js';
|
|
14
12
|
const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000';
|
|
15
13
|
/**
|
|
16
14
|
* Converts a bytes16 hex space ID to a UUID string (without dashes).
|
|
@@ -20,9 +18,11 @@ function hexToUuid(hex) {
|
|
|
20
18
|
return hex.slice(2, 34).toLowerCase();
|
|
21
19
|
}
|
|
22
20
|
it.skip('should create a space and publish an edit', async () => {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
21
|
+
const privateKey = process.env.PRIVATE_KEY;
|
|
22
|
+
if (!privateKey) {
|
|
23
|
+
throw new Error('PRIVATE_KEY environment variable is required. Run `pnpm create-private-key` to generate one.');
|
|
24
|
+
}
|
|
25
|
+
const addressPrivateKey = privateKey;
|
|
26
26
|
const { address } = privateKeyToAccount(addressPrivateKey);
|
|
27
27
|
console.log('address', address);
|
|
28
28
|
// Get wallet client for testnet
|
|
@@ -34,23 +34,12 @@ it.skip('should create a space and publish an edit', async () => {
|
|
|
34
34
|
throw new Error('Wallet client account is undefined');
|
|
35
35
|
}
|
|
36
36
|
// Create a public client for reading contract state
|
|
37
|
-
const rpcUrl = walletClient.chain?.rpcUrls?.default?.http?.[0];
|
|
38
|
-
if (!rpcUrl) {
|
|
39
|
-
throw new Error('Wallet client RPC URL is undefined');
|
|
40
|
-
}
|
|
41
37
|
const publicClient = createPublicClient({
|
|
42
|
-
transport: http(
|
|
38
|
+
transport: http(TESTNET_RPC_URL),
|
|
43
39
|
});
|
|
44
40
|
// Check if a personal space already exists for this address
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
abi: SpaceRegistryAbi,
|
|
48
|
-
functionName: 'addressToSpaceId',
|
|
49
|
-
args: [account.address],
|
|
50
|
-
}));
|
|
51
|
-
console.log('existing spaceIdHex', spaceIdHex);
|
|
52
|
-
// Create a personal space if one doesn't exist
|
|
53
|
-
if (spaceIdHex.toLowerCase() === EMPTY_SPACE_ID.toLowerCase()) {
|
|
41
|
+
const hasExistingSpace = await personalSpace.hasSpace({ address: account.address });
|
|
42
|
+
if (!hasExistingSpace) {
|
|
54
43
|
console.log('Creating personal space...');
|
|
55
44
|
const { to, calldata } = personalSpace.createSpace();
|
|
56
45
|
const createSpaceTxHash = await walletClient.sendTransaction({
|
|
@@ -62,23 +51,23 @@ it.skip('should create a space and publish an edit', async () => {
|
|
|
62
51
|
});
|
|
63
52
|
console.log('createSpaceTxHash', createSpaceTxHash);
|
|
64
53
|
await publicClient.waitForTransactionReceipt({ hash: createSpaceTxHash });
|
|
65
|
-
// Re-fetch the space ID after creation
|
|
66
|
-
spaceIdHex = (await publicClient.readContract({
|
|
67
|
-
address: SPACE_REGISTRY_ADDRESS,
|
|
68
|
-
abi: SpaceRegistryAbi,
|
|
69
|
-
functionName: 'addressToSpaceId',
|
|
70
|
-
args: [account.address],
|
|
71
|
-
}));
|
|
72
|
-
console.log('new spaceIdHex', spaceIdHex);
|
|
73
54
|
}
|
|
74
|
-
|
|
55
|
+
// Verify space exists after potential creation
|
|
56
|
+
const hasSpaceNow = await personalSpace.hasSpace({ address: account.address });
|
|
57
|
+
if (!hasSpaceNow) {
|
|
75
58
|
throw new Error(`Failed to create personal space for address ${account.address}`);
|
|
76
59
|
}
|
|
60
|
+
const spaceIdHex = (await publicClient.readContract({
|
|
61
|
+
address: TESTNET.SPACE_REGISTRY_ADDRESS,
|
|
62
|
+
abi: SpaceRegistryAbi,
|
|
63
|
+
functionName: 'addressToSpaceId',
|
|
64
|
+
args: [account.address],
|
|
65
|
+
}));
|
|
77
66
|
const spaceId = hexToUuid(spaceIdHex);
|
|
78
67
|
console.log('spaceId (UUID)', spaceId);
|
|
79
68
|
// Verify the space address exists
|
|
80
69
|
const spaceAddress = (await publicClient.readContract({
|
|
81
|
-
address: SPACE_REGISTRY_ADDRESS,
|
|
70
|
+
address: TESTNET.SPACE_REGISTRY_ADDRESS,
|
|
82
71
|
abi: SpaceRegistryAbi,
|
|
83
72
|
functionName: 'spaceIdToAddress',
|
|
84
73
|
args: [spaceIdHex],
|
|
@@ -127,9 +116,14 @@ it.skip('should create a space and publish an edit', async () => {
|
|
|
127
116
|
console.log('Successfully published edit to space', spaceId);
|
|
128
117
|
}, 60000);
|
|
129
118
|
it.skip('should create a DAO space and propose an edit', async () => {
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
119
|
+
const privateKeyEnv = process.env.PRIVATE_KEY;
|
|
120
|
+
if (!privateKeyEnv) {
|
|
121
|
+
throw new Error('PRIVATE_KEY environment variable is required. Run `pnpm create-private-key` to generate one.');
|
|
122
|
+
}
|
|
123
|
+
if (!privateKeyEnv.startsWith('0x')) {
|
|
124
|
+
throw new Error('PRIVATE_KEY must be a hex string starting with 0x.');
|
|
125
|
+
}
|
|
126
|
+
const addressPrivateKey = privateKeyEnv;
|
|
133
127
|
const { address } = privateKeyToAccount(addressPrivateKey);
|
|
134
128
|
console.log('address', address);
|
|
135
129
|
// Get wallet client for testnet
|
|
@@ -141,23 +135,12 @@ it.skip('should create a DAO space and propose an edit', async () => {
|
|
|
141
135
|
throw new Error('Wallet client account is undefined');
|
|
142
136
|
}
|
|
143
137
|
// Create a public client for reading contract state
|
|
144
|
-
const rpcUrl = walletClient.chain?.rpcUrls?.default?.http?.[0];
|
|
145
|
-
if (!rpcUrl) {
|
|
146
|
-
throw new Error('Wallet client RPC URL is undefined');
|
|
147
|
-
}
|
|
148
138
|
const publicClient = createPublicClient({
|
|
149
|
-
transport: http(
|
|
139
|
+
transport: http(TESTNET_RPC_URL),
|
|
150
140
|
});
|
|
151
141
|
// Check if a personal space already exists for this address
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
abi: SpaceRegistryAbi,
|
|
155
|
-
functionName: 'addressToSpaceId',
|
|
156
|
-
args: [account.address],
|
|
157
|
-
}));
|
|
158
|
-
console.log('existing spaceIdHex', spaceIdHex);
|
|
159
|
-
// Create a personal space if one doesn't exist (required to be an editor)
|
|
160
|
-
if (spaceIdHex.toLowerCase() === EMPTY_SPACE_ID.toLowerCase()) {
|
|
142
|
+
const hasExistingSpace = await personalSpace.hasSpace({ address: account.address });
|
|
143
|
+
if (!hasExistingSpace) {
|
|
161
144
|
console.log('Creating personal space (required to be a DAO editor)...');
|
|
162
145
|
const { to, calldata } = personalSpace.createSpace();
|
|
163
146
|
const createSpaceTxHash = await walletClient.sendTransaction({
|
|
@@ -169,18 +152,18 @@ it.skip('should create a DAO space and propose an edit', async () => {
|
|
|
169
152
|
});
|
|
170
153
|
console.log('createSpaceTxHash', createSpaceTxHash);
|
|
171
154
|
await publicClient.waitForTransactionReceipt({ hash: createSpaceTxHash });
|
|
172
|
-
// Re-fetch the space ID after creation
|
|
173
|
-
spaceIdHex = (await publicClient.readContract({
|
|
174
|
-
address: SPACE_REGISTRY_ADDRESS,
|
|
175
|
-
abi: SpaceRegistryAbi,
|
|
176
|
-
functionName: 'addressToSpaceId',
|
|
177
|
-
args: [account.address],
|
|
178
|
-
}));
|
|
179
|
-
console.log('new spaceIdHex', spaceIdHex);
|
|
180
155
|
}
|
|
181
|
-
|
|
156
|
+
// Verify space exists after potential creation
|
|
157
|
+
const hasSpaceNow = await personalSpace.hasSpace({ address: account.address });
|
|
158
|
+
if (!hasSpaceNow) {
|
|
182
159
|
throw new Error(`Failed to create personal space for address ${account.address}`);
|
|
183
160
|
}
|
|
161
|
+
const spaceIdHex = (await publicClient.readContract({
|
|
162
|
+
address: TESTNET.SPACE_REGISTRY_ADDRESS,
|
|
163
|
+
abi: SpaceRegistryAbi,
|
|
164
|
+
functionName: 'addressToSpaceId',
|
|
165
|
+
args: [account.address],
|
|
166
|
+
}));
|
|
184
167
|
console.log('Personal space ID (to use as editor):', spaceIdHex);
|
|
185
168
|
// Create a DAO space with the user's personal space as the initial editor
|
|
186
169
|
console.log('Creating DAO space...');
|
|
@@ -224,13 +207,14 @@ it.skip('should create a DAO space and propose an edit', async () => {
|
|
|
224
207
|
console.log('daoSpaceAddress:', daoSpaceAddress);
|
|
225
208
|
// Get the DAO space ID from the registry
|
|
226
209
|
const daoSpaceIdHex = (await publicClient.readContract({
|
|
227
|
-
address: SPACE_REGISTRY_ADDRESS,
|
|
210
|
+
address: TESTNET.SPACE_REGISTRY_ADDRESS,
|
|
228
211
|
abi: SpaceRegistryAbi,
|
|
229
212
|
functionName: 'addressToSpaceId',
|
|
230
213
|
args: [daoSpaceAddress],
|
|
231
214
|
}));
|
|
232
215
|
console.log('daoSpaceIdHex:', daoSpaceIdHex);
|
|
233
|
-
|
|
216
|
+
const hasDaoSpace = await personalSpace.hasSpace({ address: daoSpaceAddress });
|
|
217
|
+
if (!hasDaoSpace) {
|
|
234
218
|
throw new Error('DAO space was not registered in the Space Registry');
|
|
235
219
|
}
|
|
236
220
|
// Now propose an edit to the DAO space
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"full-flow-test.test.js","sourceRoot":"","sources":["../../src/full-flow-test.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAY,IAAI,EAAE,MAAM,MAAM,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE5B,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,KAAK,QAAQ,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,KAAK,aAAa,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,
|
|
1
|
+
{"version":3,"file":"full-flow-test.test.js","sourceRoot":"","sources":["../../src/full-flow-test.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,7 +4,6 @@ export * from './create-entity.js';
|
|
|
4
4
|
export * from './create-image.js';
|
|
5
5
|
export * from './create-property.js';
|
|
6
6
|
export * from './create-relation.js';
|
|
7
|
-
export * from './create-space.js';
|
|
8
7
|
export * from './create-type.js';
|
|
9
8
|
export * from './delete-entity.js';
|
|
10
9
|
export * from './delete-relation.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/graph/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EACL,YAAY,EACZ,kBAAkB,GACnB,MAAM,gBAAgB,CAAC;AACxB,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/graph/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EACL,YAAY,EACZ,kBAAkB,GACnB,MAAM,gBAAgB,CAAC;AACxB,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC"}
|
package/dist/src/graph/index.js
CHANGED
|
@@ -3,7 +3,6 @@ export * from './create-entity.js';
|
|
|
3
3
|
export * from './create-image.js';
|
|
4
4
|
export * from './create-property.js';
|
|
5
5
|
export * from './create-relation.js';
|
|
6
|
-
export * from './create-space.js';
|
|
7
6
|
export * from './create-type.js';
|
|
8
7
|
export * from './delete-entity.js';
|
|
9
8
|
export * from './delete-relation.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/graph/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,YAAY,EACZ,kBAAkB,GACnB,MAAM,gBAAgB,CAAC;AACxB,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/graph/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,YAAY,EACZ,kBAAkB,GACnB,MAAM,gBAAgB,CAAC;AACxB,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"has-space.d.ts","sourceRoot":"","sources":["../../../src/personal-space/has-space.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,GAAG,EAAQ,MAAM,MAAM,CAAC;AAK1D,wBAAsB,QAAQ,CAAC,EAC7B,OAAO,EACP,MAAwB,GACzB,EAAE;IACD,OAAO,EAAE,GAAG,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAAC,OAAO,CAAC,CASnB"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { createPublicClient, http } from 'viem';
|
|
2
|
+
import { EMPTY_SPACE_ID, TESTNET } from '../../contracts.js';
|
|
3
|
+
import { SpaceRegistryAbi } from '../abis/index.js';
|
|
4
|
+
import { TESTNET_RPC_URL } from '../smart-wallet.js';
|
|
5
|
+
export async function hasSpace({ address, rpcUrl = TESTNET_RPC_URL, }) {
|
|
6
|
+
const publicClient = createPublicClient({ transport: http(rpcUrl) });
|
|
7
|
+
const spaceIdHex = (await publicClient.readContract({
|
|
8
|
+
address: TESTNET.SPACE_REGISTRY_ADDRESS,
|
|
9
|
+
abi: SpaceRegistryAbi,
|
|
10
|
+
functionName: 'addressToSpaceId',
|
|
11
|
+
args: [address],
|
|
12
|
+
}));
|
|
13
|
+
return spaceIdHex.toLowerCase() !== EMPTY_SPACE_ID.toLowerCase();
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=has-space.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"has-space.js","sourceRoot":"","sources":["../../../src/personal-space/has-space.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAY,IAAI,EAAE,MAAM,MAAM,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,EAC7B,OAAO,EACP,MAAM,GAAG,eAAe,GAIzB;IACC,MAAM,YAAY,GAAG,kBAAkB,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACrE,MAAM,UAAU,GAAG,CAAC,MAAM,YAAY,CAAC,YAAY,CAAC;QAClD,OAAO,EAAE,OAAO,CAAC,sBAAsB;QACvC,GAAG,EAAE,gBAAgB;QACrB,YAAY,EAAE,kBAAkB;QAChC,IAAI,EAAE,CAAC,OAAO,CAAC;KAChB,CAAC,CAAQ,CAAC;IACX,OAAO,UAAU,CAAC,WAAW,EAAE,KAAK,cAAc,CAAC,WAAW,EAAE,CAAC;AACnE,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export { createSpace } from './create-space.js';
|
|
2
|
+
export { hasSpace } from './has-space.js';
|
|
2
3
|
export { publishEdit } from './publish-edit.js';
|
|
3
4
|
export type { CreateSpaceResult, PublishEditParams, PublishEditResult } from './types.js';
|
|
4
5
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/personal-space/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/personal-space/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/personal-space/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/personal-space/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"smart-account-flow-test.test.d.ts","sourceRoot":"","sources":["../../src/smart-account-flow-test.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { createPublicClient, http } from 'viem';
|
|
2
|
+
import { it } from 'vitest';
|
|
3
|
+
import { TESTNET } from '../contracts.js';
|
|
4
|
+
import { SpaceRegistryAbi } from './abis/index.js';
|
|
5
|
+
import { createEntity } from './graph/create-entity.js';
|
|
6
|
+
import * as personalSpace from './personal-space/index.js';
|
|
7
|
+
import { getSmartAccountWalletClient, TESTNET_RPC_URL } from './smart-wallet.js';
|
|
8
|
+
/**
|
|
9
|
+
* Converts a bytes16 hex space ID to a UUID string (without dashes).
|
|
10
|
+
*/
|
|
11
|
+
function hexToUuid(hex) {
|
|
12
|
+
return hex.slice(2, 34).toLowerCase();
|
|
13
|
+
}
|
|
14
|
+
it.skip('should publish an edit to personal space via smart account', async () => {
|
|
15
|
+
const privateKeyEnv = process.env.PRIVY_PRIVATE_KEY;
|
|
16
|
+
if (!privateKeyEnv) {
|
|
17
|
+
throw new Error('PRIVY_PRIVATE_KEY environment variable is required.');
|
|
18
|
+
}
|
|
19
|
+
const privateKey = (privateKeyEnv.startsWith('0x') ? privateKeyEnv : `0x${privateKeyEnv}`);
|
|
20
|
+
// Get smart account wallet client (Safe + Pimlico paymaster)
|
|
21
|
+
const smartAccount = await getSmartAccountWalletClient({ privateKey });
|
|
22
|
+
const smartAccountAddress = smartAccount.account.address;
|
|
23
|
+
console.log('Smart account address:', smartAccountAddress);
|
|
24
|
+
// Create a public client for reading contract state
|
|
25
|
+
const publicClient = createPublicClient({
|
|
26
|
+
transport: http(TESTNET_RPC_URL),
|
|
27
|
+
});
|
|
28
|
+
// Check if a personal space exists for this smart account address
|
|
29
|
+
const hasExistingSpace = await personalSpace.hasSpace({ address: smartAccountAddress });
|
|
30
|
+
if (!hasExistingSpace) {
|
|
31
|
+
throw new Error(`No personal space found for smart account address ${smartAccountAddress}. Create one first.`);
|
|
32
|
+
}
|
|
33
|
+
const spaceIdHex = (await publicClient.readContract({
|
|
34
|
+
address: TESTNET.SPACE_REGISTRY_ADDRESS,
|
|
35
|
+
abi: SpaceRegistryAbi,
|
|
36
|
+
functionName: 'addressToSpaceId',
|
|
37
|
+
args: [smartAccountAddress],
|
|
38
|
+
}));
|
|
39
|
+
const spaceId = hexToUuid(spaceIdHex);
|
|
40
|
+
console.log('spaceId (UUID)', spaceId);
|
|
41
|
+
// Create an entity
|
|
42
|
+
const { ops, id: entityId } = createEntity({
|
|
43
|
+
name: 'Smart Account Test Entity',
|
|
44
|
+
});
|
|
45
|
+
console.log('entityId', entityId);
|
|
46
|
+
// Publish the edit to IPFS and get calldata
|
|
47
|
+
const { cid, editId, to, calldata } = await personalSpace.publishEdit({
|
|
48
|
+
name: 'Smart Account Test Edit',
|
|
49
|
+
spaceId,
|
|
50
|
+
ops,
|
|
51
|
+
author: smartAccountAddress,
|
|
52
|
+
network: 'TESTNET',
|
|
53
|
+
});
|
|
54
|
+
console.log('cid', cid);
|
|
55
|
+
console.log('editId', editId);
|
|
56
|
+
// Send transaction via smart account (account and chain are baked in)
|
|
57
|
+
const txHash = await smartAccount.sendTransaction({
|
|
58
|
+
to,
|
|
59
|
+
data: calldata,
|
|
60
|
+
});
|
|
61
|
+
console.log('txHash', txHash);
|
|
62
|
+
const receipt = await publicClient.waitForTransactionReceipt({
|
|
63
|
+
hash: txHash,
|
|
64
|
+
});
|
|
65
|
+
console.log('receipt status', receipt.status);
|
|
66
|
+
if (receipt.status === 'reverted') {
|
|
67
|
+
throw new Error(`Transaction reverted: ${txHash}`);
|
|
68
|
+
}
|
|
69
|
+
console.log('Successfully published edit to space', spaceId, 'via smart account');
|
|
70
|
+
}, 60000);
|
|
71
|
+
//# sourceMappingURL=smart-account-flow-test.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"smart-account-flow-test.test.js","sourceRoot":"","sources":["../../src/smart-account-flow-test.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,25 @@
|
|
|
1
1
|
import type { Hex, WalletClient } from 'viem';
|
|
2
2
|
import type { GeoSmartAccount } from './types.js';
|
|
3
|
+
export declare const TESTNET_RPC_URL = "https://rpc-geo-test-zc16z3tcvf.t.conduit.xyz";
|
|
4
|
+
/**
|
|
5
|
+
* Custom Safe contract addresses for Geo Testnet.
|
|
6
|
+
*
|
|
7
|
+
* Safe uses deterministic deployment so the canonical addresses are the same on
|
|
8
|
+
* every chain. On Geo Mainnet (80451) those canonical addresses exist, so the
|
|
9
|
+
* permissionless library's defaults work. On Geo Testnet (19411) the canonical
|
|
10
|
+
* deployer was never run — the Safe contracts were deployed separately and
|
|
11
|
+
* landed at different addresses. We pass them explicitly to toSafeSmartAccount.
|
|
12
|
+
*
|
|
13
|
+
* Source of truth: curator-app packages/curator-utils/src/utils/smart-account-constants.ts
|
|
14
|
+
*/
|
|
15
|
+
export declare const GEO_TESTNET_SAFE_ADDRESSES: {
|
|
16
|
+
readonly safeModuleSetupAddress: Hex;
|
|
17
|
+
readonly safe4337ModuleAddress: Hex;
|
|
18
|
+
readonly safeProxyFactoryAddress: Hex;
|
|
19
|
+
readonly safeSingletonAddress: Hex;
|
|
20
|
+
readonly multiSendAddress: Hex;
|
|
21
|
+
readonly multiSendCallOnlyAddress: Hex;
|
|
22
|
+
};
|
|
3
23
|
type GetSmartAccountWalletClientParams = {
|
|
4
24
|
privateKey: Hex;
|
|
5
25
|
rpcUrl?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"smart-wallet.d.ts","sourceRoot":"","sources":["../../src/smart-wallet.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAS,GAAG,EAAE,YAAY,EAAE,MAAM,MAAM,CAAC;AAIrD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"smart-wallet.d.ts","sourceRoot":"","sources":["../../src/smart-wallet.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAS,GAAG,EAAE,YAAY,EAAE,MAAM,MAAM,CAAC;AAIrD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAGlD,eAAO,MAAM,eAAe,kDAAkD,CAAC;AAQ/E;;;;;;;;;;GAUG;AACH,eAAO,MAAM,0BAA0B;qCACmC,GAAG;oCACJ,GAAG;sCACD,GAAG;mCACN,GAAG;+BACP,GAAG;uCACK,GAAG;CACrE,CAAC;AAEX,KAAK,iCAAiC,GAAG;IACvC,UAAU,EAAE,GAAG,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAyBF;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,2BAA2B,GAAU,yBAG/C,iCAAiC,KAAG,OAAO,CAAC,eAAe,CA4C7D,CAAC;AAEF,eAAO,MAAM,eAAe,GAAU,yBAGnC,iCAAiC,KAAG,OAAO,CAAC,YAAY,CAS1D,CAAC"}
|
package/dist/src/smart-wallet.js
CHANGED
|
@@ -4,13 +4,32 @@ import { createPimlicoClient } from 'permissionless/clients/pimlico';
|
|
|
4
4
|
import { createPublicClient, createWalletClient, http } from 'viem';
|
|
5
5
|
import { entryPoint07Address } from 'viem/account-abstraction';
|
|
6
6
|
import { privateKeyToAccount } from 'viem/accounts';
|
|
7
|
-
const
|
|
8
|
-
const
|
|
7
|
+
const _MAINNET_DEFAULT_RPC_URL = 'https://rpc-geo-genesis-h0q2s21xx8.t.conduit.xyz';
|
|
8
|
+
export const TESTNET_RPC_URL = 'https://rpc-geo-test-zc16z3tcvf.t.conduit.xyz';
|
|
9
9
|
/**
|
|
10
10
|
* We provide a fallback API key for gas sponsorship for the duration of the
|
|
11
11
|
* Geo Genesis early access period. This API key is gas-limited.
|
|
12
12
|
*/
|
|
13
13
|
const DEFAULT_API_KEY = 'pim_KqHm63txxhbCYjdDaWaHqH';
|
|
14
|
+
/**
|
|
15
|
+
* Custom Safe contract addresses for Geo Testnet.
|
|
16
|
+
*
|
|
17
|
+
* Safe uses deterministic deployment so the canonical addresses are the same on
|
|
18
|
+
* every chain. On Geo Mainnet (80451) those canonical addresses exist, so the
|
|
19
|
+
* permissionless library's defaults work. On Geo Testnet (19411) the canonical
|
|
20
|
+
* deployer was never run — the Safe contracts were deployed separately and
|
|
21
|
+
* landed at different addresses. We pass them explicitly to toSafeSmartAccount.
|
|
22
|
+
*
|
|
23
|
+
* Source of truth: curator-app packages/curator-utils/src/utils/smart-account-constants.ts
|
|
24
|
+
*/
|
|
25
|
+
export const GEO_TESTNET_SAFE_ADDRESSES = {
|
|
26
|
+
safeModuleSetupAddress: '0x2dd68b007B46fBe91B9A7c3EDa5A7a1063cB5b47',
|
|
27
|
+
safe4337ModuleAddress: '0x75cf11467937ce3F2f357CE24ffc3DBF8fD5c226',
|
|
28
|
+
safeProxyFactoryAddress: '0xd9d2Ba03a7754250FDD71333F444636471CACBC4',
|
|
29
|
+
safeSingletonAddress: '0x639245e8476E03e789a244f279b5843b9633b2E7',
|
|
30
|
+
multiSendAddress: '0x7B21BBDBdE8D01Df591fdc2dc0bE9956Dde1e16C',
|
|
31
|
+
multiSendCallOnlyAddress: '0x32228dDEA8b9A2bd7f2d71A958fF241D79ca5eEC',
|
|
32
|
+
};
|
|
14
33
|
const createChain = (network, rpcUrl) => {
|
|
15
34
|
const chain = {
|
|
16
35
|
id: network === 'TESTNET' ? Number('19411') : Number('80451'),
|
|
@@ -22,10 +41,10 @@ const createChain = (network, rpcUrl) => {
|
|
|
22
41
|
},
|
|
23
42
|
rpcUrls: {
|
|
24
43
|
default: {
|
|
25
|
-
http: [rpcUrl
|
|
44
|
+
http: [rpcUrl],
|
|
26
45
|
},
|
|
27
46
|
public: {
|
|
28
|
-
http: [rpcUrl
|
|
47
|
+
http: [rpcUrl],
|
|
29
48
|
},
|
|
30
49
|
},
|
|
31
50
|
};
|
|
@@ -48,8 +67,8 @@ const createChain = (network, rpcUrl) => {
|
|
|
48
67
|
* @param params – {@link GetSmartAccountWalletClientParams}
|
|
49
68
|
* @returns – {@link SmartAccountClient}
|
|
50
69
|
*/
|
|
51
|
-
export const getSmartAccountWalletClient = async ({ privateKey, rpcUrl =
|
|
52
|
-
const chain = createChain('
|
|
70
|
+
export const getSmartAccountWalletClient = async ({ privateKey, rpcUrl = TESTNET_RPC_URL, }) => {
|
|
71
|
+
const chain = createChain('TESTNET', rpcUrl);
|
|
53
72
|
const transport = http(rpcUrl);
|
|
54
73
|
const publicClient = createPublicClient({
|
|
55
74
|
transport,
|
|
@@ -64,8 +83,9 @@ export const getSmartAccountWalletClient = async ({ privateKey, rpcUrl = MAINNET
|
|
|
64
83
|
version: '0.7',
|
|
65
84
|
},
|
|
66
85
|
version: '1.4.1',
|
|
86
|
+
...GEO_TESTNET_SAFE_ADDRESSES,
|
|
67
87
|
});
|
|
68
|
-
const bundlerTransport = http(`https://api.pimlico.io/v2/
|
|
88
|
+
const bundlerTransport = http(`https://api.pimlico.io/v2/19411/rpc?apikey=${DEFAULT_API_KEY}`);
|
|
69
89
|
const paymasterClient = createPimlicoClient({
|
|
70
90
|
transport: bundlerTransport,
|
|
71
91
|
chain,
|
|
@@ -87,7 +107,7 @@ export const getSmartAccountWalletClient = async ({ privateKey, rpcUrl = MAINNET
|
|
|
87
107
|
});
|
|
88
108
|
return smartAccount;
|
|
89
109
|
};
|
|
90
|
-
export const getWalletClient = async ({ privateKey, rpcUrl =
|
|
110
|
+
export const getWalletClient = async ({ privateKey, rpcUrl = TESTNET_RPC_URL, }) => {
|
|
91
111
|
const chain = createChain('TESTNET', rpcUrl);
|
|
92
112
|
const transport = http(rpcUrl);
|
|
93
113
|
const wallet = createWalletClient({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"smart-wallet.js","sourceRoot":"","sources":["../../src/smart-wallet.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAA2B,MAAM,gBAAgB,CAAC;AACnF,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAErE,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAGpD,MAAM,
|
|
1
|
+
{"version":3,"file":"smart-wallet.js","sourceRoot":"","sources":["../../src/smart-wallet.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@ import { createPublicClient, http } from 'viem';
|
|
|
3
3
|
import { entryPoint07Address } from 'viem/account-abstraction';
|
|
4
4
|
import { privateKeyToAccount } from 'viem/accounts';
|
|
5
5
|
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
|
6
|
-
import { getSmartAccountWalletClient } from './smart-wallet.js';
|
|
6
|
+
import { GEO_TESTNET_SAFE_ADDRESSES, getSmartAccountWalletClient } from './smart-wallet.js';
|
|
7
7
|
// mock all external dependencies
|
|
8
8
|
vi.mock('permissionless', () => ({
|
|
9
9
|
createSmartAccountClient: vi.fn().mockReturnValue({ mockSmartAccountClient: true }),
|
|
@@ -33,9 +33,9 @@ describe('getSmartAccountWalletClient', () => {
|
|
|
33
33
|
});
|
|
34
34
|
it('should create a client with the default RPC URL when no RPC URL is provided', async () => {
|
|
35
35
|
await getSmartAccountWalletClient({ privateKey: mockPrivateKey });
|
|
36
|
-
expect(http).toHaveBeenCalledWith('https://rpc-geo-
|
|
36
|
+
expect(http).toHaveBeenCalledWith('https://rpc-geo-test-zc16z3tcvf.t.conduit.xyz');
|
|
37
37
|
expect(createPublicClient).toHaveBeenCalledWith(expect.objectContaining({
|
|
38
|
-
transport: { mockTransport: true, url: 'https://rpc-geo-
|
|
38
|
+
transport: { mockTransport: true, url: 'https://rpc-geo-test-zc16z3tcvf.t.conduit.xyz' },
|
|
39
39
|
}));
|
|
40
40
|
});
|
|
41
41
|
it('should create a client with a custom RPC URL when provided', async () => {
|
|
@@ -60,6 +60,7 @@ describe('getSmartAccountWalletClient', () => {
|
|
|
60
60
|
version: '0.7',
|
|
61
61
|
},
|
|
62
62
|
version: '1.4.1',
|
|
63
|
+
...GEO_TESTNET_SAFE_ADDRESSES,
|
|
63
64
|
}));
|
|
64
65
|
});
|
|
65
66
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"smart-wallet.test.js","sourceRoot":"","sources":["../../src/smart-wallet.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9D,OAAO,EAAE,2BAA2B,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"smart-wallet.test.js","sourceRoot":"","sources":["../../src/smart-wallet.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@geoprotocol/geo-sdk",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"module": "./dist/index.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -40,6 +40,7 @@
|
|
|
40
40
|
"test": "vitest",
|
|
41
41
|
"lint": "biome check",
|
|
42
42
|
"lint:fix": "biome check --write --unsafe",
|
|
43
|
+
"create-private-key": "node --experimental-strip-types create-private-key.ts",
|
|
43
44
|
"deploy": "pnpm clean && pnpm build && pnpm changeset publish",
|
|
44
45
|
"bump": "pnpm changeset version"
|
|
45
46
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"test-publish.d.ts","sourceRoot":"","sources":["../../scripts/test-publish.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Test script to verify publish-edit encoding fix.
|
|
3
|
-
* Uses smart account for gas sponsorship on Geo testnet (L3).
|
|
4
|
-
*/
|
|
5
|
-
import { personalSpace, Graph } from '../index.js';
|
|
6
|
-
import { createPublicClient, http } from 'viem';
|
|
7
|
-
import { createSmartAccountClient } from 'permissionless';
|
|
8
|
-
import { toSafeSmartAccount } from 'permissionless/accounts';
|
|
9
|
-
import { createPimlicoClient } from 'permissionless/clients/pimlico';
|
|
10
|
-
import { entryPoint07Address } from 'viem/account-abstraction';
|
|
11
|
-
import { privateKeyToAccount } from 'viem/accounts';
|
|
12
|
-
const SPACE_ID = '7fc1dc5b76b8b69624b9abc6c7978c00';
|
|
13
|
-
const PIMLICO_API_KEY = 'pim_KqHm63txxhbCYjdDaWaHqH';
|
|
14
|
-
const TESTNET_RPC_URL = 'https://rpc-geo-test-zc16z3tcvf.t.conduit.xyz';
|
|
15
|
-
const TESTNET_CHAIN_ID = 19411;
|
|
16
|
-
// Custom Safe contract addresses deployed on Geo testnet
|
|
17
|
-
const TESTNET_SAFE_ADDRESSES = {
|
|
18
|
-
safeModuleSetupAddress: "0x2dd68b007B46fBe91B9A7c3EDa5A7a1063cB5b47",
|
|
19
|
-
safe4337ModuleAddress: "0x75cf11467937ce3F2f357CE24ffc3DBF8fD5c226",
|
|
20
|
-
safeProxyFactoryAddress: "0xd9d2Ba03a7754250FDD71333F444636471CACBC4",
|
|
21
|
-
safeSingletonAddress: "0x639245e8476E03e789a244f279b5843b9633b2E7",
|
|
22
|
-
multiSendAddress: "0x7B21BBDBdE8D01Df591fdc2dc0bE9956Dde1e16C",
|
|
23
|
-
multiSendCallOnlyAddress: "0x32228dDEA8b9A2bd7f2d71A958fF241D79ca5eEC",
|
|
24
|
-
};
|
|
25
|
-
// Define Geo testnet chain
|
|
26
|
-
const geoTestnet = {
|
|
27
|
-
id: TESTNET_CHAIN_ID,
|
|
28
|
-
name: 'Geo Testnet',
|
|
29
|
-
nativeCurrency: {
|
|
30
|
-
name: 'Ethereum',
|
|
31
|
-
symbol: 'ETH',
|
|
32
|
-
decimals: 18,
|
|
33
|
-
},
|
|
34
|
-
rpcUrls: {
|
|
35
|
-
default: { http: [TESTNET_RPC_URL] },
|
|
36
|
-
public: { http: [TESTNET_RPC_URL] },
|
|
37
|
-
},
|
|
38
|
-
};
|
|
39
|
-
async function main() {
|
|
40
|
-
const privateKey = process.env.GEO_PRIVATE_KEY || process.env.PRIVATE_KEY;
|
|
41
|
-
if (!privateKey) {
|
|
42
|
-
console.error('Set GEO_PRIVATE_KEY or PRIVATE_KEY environment variable');
|
|
43
|
-
process.exit(1);
|
|
44
|
-
}
|
|
45
|
-
const account = privateKeyToAccount(privateKey);
|
|
46
|
-
console.log('EOA address:', account.address);
|
|
47
|
-
const publicClient = createPublicClient({
|
|
48
|
-
chain: geoTestnet,
|
|
49
|
-
transport: http(TESTNET_RPC_URL),
|
|
50
|
-
});
|
|
51
|
-
const safeAccount = await toSafeSmartAccount({
|
|
52
|
-
client: publicClient,
|
|
53
|
-
owners: [account],
|
|
54
|
-
entryPoint: {
|
|
55
|
-
address: entryPoint07Address,
|
|
56
|
-
version: '0.7',
|
|
57
|
-
},
|
|
58
|
-
version: '1.4.1',
|
|
59
|
-
...TESTNET_SAFE_ADDRESSES,
|
|
60
|
-
});
|
|
61
|
-
console.log('Smart account address:', safeAccount.address);
|
|
62
|
-
const bundlerUrl = `https://api.pimlico.io/v2/${TESTNET_CHAIN_ID}/rpc?apikey=${PIMLICO_API_KEY}`;
|
|
63
|
-
const paymasterClient = createPimlicoClient({
|
|
64
|
-
transport: http(bundlerUrl),
|
|
65
|
-
chain: geoTestnet,
|
|
66
|
-
entryPoint: {
|
|
67
|
-
address: entryPoint07Address,
|
|
68
|
-
version: '0.7',
|
|
69
|
-
},
|
|
70
|
-
});
|
|
71
|
-
const smartAccountClient = createSmartAccountClient({
|
|
72
|
-
chain: geoTestnet,
|
|
73
|
-
account: safeAccount,
|
|
74
|
-
paymaster: paymasterClient,
|
|
75
|
-
bundlerTransport: http(bundlerUrl),
|
|
76
|
-
userOperation: {
|
|
77
|
-
estimateFeesPerGas: async () => {
|
|
78
|
-
return (await paymasterClient.getUserOperationGasPrice()).fast;
|
|
79
|
-
},
|
|
80
|
-
},
|
|
81
|
-
});
|
|
82
|
-
const { id, ops } = Graph.createEntity({
|
|
83
|
-
name: 'SDK Test Entity ' + Date.now(),
|
|
84
|
-
types: [],
|
|
85
|
-
});
|
|
86
|
-
console.log('Created entity:', id);
|
|
87
|
-
console.log('\nPublishing to IPFS...');
|
|
88
|
-
const { editId, cid, to, calldata } = await personalSpace.publishEdit({
|
|
89
|
-
name: 'Test publish from SDK',
|
|
90
|
-
spaceId: SPACE_ID,
|
|
91
|
-
ops,
|
|
92
|
-
author: safeAccount.address,
|
|
93
|
-
network: 'TESTNET',
|
|
94
|
-
});
|
|
95
|
-
console.log('Edit ID:', editId);
|
|
96
|
-
console.log('CID:', cid);
|
|
97
|
-
console.log('Contract (to):', to);
|
|
98
|
-
console.log('\nSending transaction via smart account...');
|
|
99
|
-
const hash = await smartAccountClient.sendTransaction({
|
|
100
|
-
to,
|
|
101
|
-
data: calldata,
|
|
102
|
-
});
|
|
103
|
-
console.log('Transaction hash:', hash);
|
|
104
|
-
console.log('\nWaiting for transaction receipt...');
|
|
105
|
-
const receipt = await publicClient.waitForTransactionReceipt({ hash });
|
|
106
|
-
console.log('Receipt status:', receipt.status);
|
|
107
|
-
console.log('Block number:', receipt.blockNumber);
|
|
108
|
-
if (receipt.status === 'success') {
|
|
109
|
-
console.log('\n✅ Transaction confirmed!');
|
|
110
|
-
console.log('Edit ID:', editId);
|
|
111
|
-
console.log('CID:', cid);
|
|
112
|
-
}
|
|
113
|
-
else {
|
|
114
|
-
console.log('\n❌ Transaction reverted!');
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
main().catch(err => {
|
|
118
|
-
console.error('Error:', err.message || err);
|
|
119
|
-
process.exit(1);
|
|
120
|
-
});
|
|
121
|
-
//# sourceMappingURL=test-publish.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"test-publish.js","sourceRoot":"","sources":["../../scripts/test-publish.ts"],"names":[],"mappings":"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"}
|