@geoprotocol/geo-sdk 0.18.0 → 0.18.2
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 +13 -9
- package/dist/src/dao-space/index.d.ts +3 -1
- package/dist/src/dao-space/index.d.ts.map +1 -1
- package/dist/src/dao-space/index.js +2 -0
- package/dist/src/dao-space/index.js.map +1 -1
- package/dist/src/dao-space/propose-add-editor.d.ts +27 -0
- package/dist/src/dao-space/propose-add-editor.d.ts.map +1 -0
- package/dist/src/dao-space/propose-add-editor.js +97 -0
- package/dist/src/dao-space/propose-add-editor.js.map +1 -0
- package/dist/src/dao-space/propose-add-editor.test.d.ts +2 -0
- package/dist/src/dao-space/propose-add-editor.test.d.ts.map +1 -0
- package/dist/src/dao-space/propose-add-editor.test.js +105 -0
- package/dist/src/dao-space/propose-add-editor.test.js.map +1 -0
- package/dist/src/dao-space/propose-remove-editor.d.ts +29 -0
- package/dist/src/dao-space/propose-remove-editor.d.ts.map +1 -0
- package/dist/src/dao-space/propose-remove-editor.js +104 -0
- package/dist/src/dao-space/propose-remove-editor.js.map +1 -0
- package/dist/src/dao-space/propose-remove-editor.test.d.ts +2 -0
- package/dist/src/dao-space/propose-remove-editor.test.d.ts.map +1 -0
- package/dist/src/dao-space/propose-remove-editor.test.js +167 -0
- package/dist/src/dao-space/propose-remove-editor.test.js.map +1 -0
- package/dist/src/dao-space/types.d.ts +72 -0
- package/dist/src/dao-space/types.d.ts.map +1 -1
- package/dist/src/graph/create-proposal-review.d.ts +4 -2
- package/dist/src/graph/create-proposal-review.d.ts.map +1 -1
- package/dist/src/graph/create-proposal-review.js +12 -3
- package/dist/src/graph/create-proposal-review.js.map +1 -1
- package/dist/src/graph/create-proposal-review.test.js +51 -1
- package/dist/src/graph/create-proposal-review.test.js.map +1 -1
- package/dist/src/graph/update-proposal-review.d.ts +4 -2
- package/dist/src/graph/update-proposal-review.d.ts.map +1 -1
- package/dist/src/graph/update-proposal-review.js +12 -3
- package/dist/src/graph/update-proposal-review.js.map +1 -1
- package/dist/src/graph/update-proposal-review.test.js +51 -1
- package/dist/src/graph/update-proposal-review.test.js.map +1 -1
- package/dist/src/types.d.ts +4 -0
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/types.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -8,6 +8,10 @@ A collection of tools for interacting with The Graph.
|
|
|
8
8
|
npm install @geoprotocol/geo-sdk
|
|
9
9
|
```
|
|
10
10
|
|
|
11
|
+
## AI Harnesses
|
|
12
|
+
|
|
13
|
+
If you're using an AI coding assistant (e.g. Claude Code, Codex, Cursor) to work with this SDK, check out [geobrowser/geo-skills](https://github.com/geobrowser/geo-skills) for skills and prompts that help agents use the Geo SDK effectively.
|
|
14
|
+
|
|
11
15
|
## Overview
|
|
12
16
|
|
|
13
17
|
### Data flow
|
|
@@ -277,8 +281,8 @@ const { ops: updateOps } = Graph.updateEntity({
|
|
|
277
281
|
const { ops: unsetOps } = Graph.updateEntity({
|
|
278
282
|
id: entityId,
|
|
279
283
|
unset: [
|
|
280
|
-
{ property: propertyId },
|
|
281
|
-
{ property: propertyId2, language: { type: "all" } },
|
|
284
|
+
{ property: propertyId }, // unset all languages
|
|
285
|
+
{ property: propertyId2, language: { type: "all" } }, // explicit all languages
|
|
282
286
|
],
|
|
283
287
|
});
|
|
284
288
|
```
|
|
@@ -310,7 +314,7 @@ import { Graph, Position } from "@geoprotocol/geo-sdk";
|
|
|
310
314
|
const { id: relationId, ops: createRelOps } = Graph.createRelation({
|
|
311
315
|
fromEntity: personId,
|
|
312
316
|
toEntity: restaurantId,
|
|
313
|
-
type: likesPropertyId,
|
|
317
|
+
type: likesPropertyId, // the relation type property
|
|
314
318
|
position: Position.generateBetween(), // optional ordering
|
|
315
319
|
});
|
|
316
320
|
|
|
@@ -403,8 +407,8 @@ import { personalSpace } from "@geoprotocol/geo-sdk";
|
|
|
403
407
|
|
|
404
408
|
const { cid, editId, to, calldata } = await personalSpace.publishEdit({
|
|
405
409
|
name: "My Edit",
|
|
406
|
-
spaceId,
|
|
407
|
-
ops,
|
|
410
|
+
spaceId, // your personal space ID (dashless hex UUID)
|
|
411
|
+
ops, // array of Op from Graph.* functions
|
|
408
412
|
author: spaceId, // your personal space ID (same as spaceId for personal spaces)
|
|
409
413
|
network: "TESTNET",
|
|
410
414
|
});
|
|
@@ -428,10 +432,10 @@ const { ops } = Graph.createEntity({ name: "New Entity" });
|
|
|
428
432
|
const { editId, cid, to, calldata, proposalId } = await daoSpace.proposeEdit({
|
|
429
433
|
name: "Add new entity",
|
|
430
434
|
ops,
|
|
431
|
-
author: callerSpaceId,
|
|
432
|
-
daoSpaceAddress: "0xDAOSpaceContractAddress",
|
|
433
|
-
callerSpaceId: "0xCallerBytes16SpaceId",
|
|
434
|
-
daoSpaceId: "0xDAOBytes16SpaceId",
|
|
435
|
+
author: callerSpaceId, // your personal space ID (as `0x${string}`)
|
|
436
|
+
daoSpaceAddress: "0xDAOSpaceContractAddress", // the DAO space contract address
|
|
437
|
+
callerSpaceId: "0xCallerBytes16SpaceId", // your personal space ID (bytes16 hex)
|
|
438
|
+
daoSpaceId: "0xDAOBytes16SpaceId", // the DAO space ID (bytes16 hex)
|
|
435
439
|
network: "TESTNET",
|
|
436
440
|
});
|
|
437
441
|
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
export { createSpace } from './create-space.js';
|
|
2
2
|
export { executeProposal } from './execute-proposal.js';
|
|
3
|
+
export { proposeAddEditor } from './propose-add-editor.js';
|
|
3
4
|
export { proposeAddMember } from './propose-add-member.js';
|
|
4
5
|
export { proposeEdit } from './propose-edit.js';
|
|
6
|
+
export { proposeRemoveEditor } from './propose-remove-editor.js';
|
|
5
7
|
export { proposeRemoveMember } from './propose-remove-member.js';
|
|
6
8
|
export { proposeRequestMembership } from './propose-request-membership.js';
|
|
7
|
-
export type { CreateSpaceParams, CreateSpaceResult, ExecuteProposalParams, ExecuteProposalResult, ProposeAddMemberParams, ProposeAddMemberResult, ProposeEditParams, ProposeEditResult, ProposeRemoveMemberParams, ProposeRemoveMemberResult, ProposeRequestMembershipParams, ProposeRequestMembershipResult, VoteOption, VoteProposalParams, VoteProposalResult, VotingMode, } from './types.js';
|
|
9
|
+
export type { CreateSpaceParams, CreateSpaceResult, ExecuteProposalParams, ExecuteProposalResult, ProposeAddEditorParams, ProposeAddEditorResult, ProposeAddMemberParams, ProposeAddMemberResult, ProposeEditParams, ProposeEditResult, ProposeRemoveEditorParams, ProposeRemoveEditorResult, ProposeRemoveMemberParams, ProposeRemoveMemberResult, ProposeRequestMembershipParams, ProposeRequestMembershipResult, VoteOption, VoteProposalParams, VoteProposalResult, VotingMode, } from './types.js';
|
|
8
10
|
export { voteProposal } from './vote-proposal.js';
|
|
9
11
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/dao-space/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,YAAY,EACV,iBAAiB,EACjB,iBAAiB,EACjB,qBAAqB,EACrB,qBAAqB,EACrB,sBAAsB,EACtB,sBAAsB,EACtB,iBAAiB,EACjB,iBAAiB,EACjB,yBAAyB,EACzB,yBAAyB,EACzB,8BAA8B,EAC9B,8BAA8B,EAC9B,UAAU,EACV,kBAAkB,EAClB,kBAAkB,EAClB,UAAU,GACX,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/dao-space/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,YAAY,EACV,iBAAiB,EACjB,iBAAiB,EACjB,qBAAqB,EACrB,qBAAqB,EACrB,sBAAsB,EACtB,sBAAsB,EACtB,sBAAsB,EACtB,sBAAsB,EACtB,iBAAiB,EACjB,iBAAiB,EACjB,yBAAyB,EACzB,yBAAyB,EACzB,yBAAyB,EACzB,yBAAyB,EACzB,8BAA8B,EAC9B,8BAA8B,EAC9B,UAAU,EACV,kBAAkB,EAClB,kBAAkB,EAClB,UAAU,GACX,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
export { createSpace } from './create-space.js';
|
|
2
2
|
export { executeProposal } from './execute-proposal.js';
|
|
3
|
+
export { proposeAddEditor } from './propose-add-editor.js';
|
|
3
4
|
export { proposeAddMember } from './propose-add-member.js';
|
|
4
5
|
export { proposeEdit } from './propose-edit.js';
|
|
6
|
+
export { proposeRemoveEditor } from './propose-remove-editor.js';
|
|
5
7
|
export { proposeRemoveMember } from './propose-remove-member.js';
|
|
6
8
|
export { proposeRequestMembership } from './propose-request-membership.js';
|
|
7
9
|
export { voteProposal } from './vote-proposal.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/dao-space/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/dao-space/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAuB3E,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { ProposeAddEditorParams, ProposeAddEditorResult } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Creates a proposal to add an editor to a DAO space.
|
|
4
|
+
*
|
|
5
|
+
* This function encodes a proposal that, when executed, will call the DAO
|
|
6
|
+
* space's `addEditor()` function to add the given editor space ID.
|
|
7
|
+
* The proposal is submitted via SpaceRegistry's `enter()` function.
|
|
8
|
+
*
|
|
9
|
+
* @param params - The parameters for creating the proposal
|
|
10
|
+
* @returns Object containing `to` (Space Registry address), `calldata`, and `proposalId`
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```ts
|
|
14
|
+
* import { daoSpace } from '@geoprotocol/geo-sdk';
|
|
15
|
+
*
|
|
16
|
+
* const { to, calldata, proposalId } = daoSpace.proposeAddEditor({
|
|
17
|
+
* authorSpaceId: '0xProposerBytes16SpaceId...',
|
|
18
|
+
* spaceId: '0xDAOBytes16SpaceId...',
|
|
19
|
+
* newEditorSpaceId: '0xNewEditorBytes16SpaceId...',
|
|
20
|
+
* });
|
|
21
|
+
*
|
|
22
|
+
* // Submit the transaction using viem or another client
|
|
23
|
+
* await walletClient.sendTransaction({ to, data: calldata });
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
export declare function proposeAddEditor(params: ProposeAddEditorParams): ProposeAddEditorResult;
|
|
27
|
+
//# sourceMappingURL=propose-add-editor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"propose-add-editor.d.ts","sourceRoot":"","sources":["../../../src/dao-space/propose-add-editor.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAEjF;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,sBAAsB,GAAG,sBAAsB,CAyFvF"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
2
|
+
import { encodeAbiParameters, encodeFunctionData } from 'viem';
|
|
3
|
+
import { DaoSpaceAbi, SpaceRegistryAbi } from '../abis/index.js';
|
|
4
|
+
import { bytes16ToBytes32LeftAligned, EMPTY_SIGNATURE, ensure0xPrefix, getContractAddressesBasedOnNetwork, isBytes16Hex, PROPOSAL_CREATED_ACTION, } from './constants.js';
|
|
5
|
+
/**
|
|
6
|
+
* Creates a proposal to add an editor to a DAO space.
|
|
7
|
+
*
|
|
8
|
+
* This function encodes a proposal that, when executed, will call the DAO
|
|
9
|
+
* space's `addEditor()` function to add the given editor space ID.
|
|
10
|
+
* The proposal is submitted via SpaceRegistry's `enter()` function.
|
|
11
|
+
*
|
|
12
|
+
* @param params - The parameters for creating the proposal
|
|
13
|
+
* @returns Object containing `to` (Space Registry address), `calldata`, and `proposalId`
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```ts
|
|
17
|
+
* import { daoSpace } from '@geoprotocol/geo-sdk';
|
|
18
|
+
*
|
|
19
|
+
* const { to, calldata, proposalId } = daoSpace.proposeAddEditor({
|
|
20
|
+
* authorSpaceId: '0xProposerBytes16SpaceId...',
|
|
21
|
+
* spaceId: '0xDAOBytes16SpaceId...',
|
|
22
|
+
* newEditorSpaceId: '0xNewEditorBytes16SpaceId...',
|
|
23
|
+
* });
|
|
24
|
+
*
|
|
25
|
+
* // Submit the transaction using viem or another client
|
|
26
|
+
* await walletClient.sendTransaction({ to, data: calldata });
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
export function proposeAddEditor(params) {
|
|
30
|
+
const { authorSpaceId: rawAuthorSpaceId, spaceId: rawSpaceId, newEditorSpaceId: rawNewEditorSpaceId, votingMode = 'SLOW', proposalId: rawProposalId, network = 'TESTNET', } = params;
|
|
31
|
+
// Validate inputs
|
|
32
|
+
const authorSpaceId = ensure0xPrefix(rawAuthorSpaceId);
|
|
33
|
+
const newEditorSpaceId = ensure0xPrefix(rawNewEditorSpaceId);
|
|
34
|
+
const spaceId = ensure0xPrefix(rawSpaceId);
|
|
35
|
+
if (!isBytes16Hex(authorSpaceId)) {
|
|
36
|
+
throw new Error(`authorSpaceId must be bytes16 hex (0x followed by 32 hex chars). Received: ${authorSpaceId}`);
|
|
37
|
+
}
|
|
38
|
+
if (!isBytes16Hex(spaceId)) {
|
|
39
|
+
throw new Error(`spaceId must be bytes16 hex (0x followed by 32 hex chars). Received: ${spaceId}`);
|
|
40
|
+
}
|
|
41
|
+
if (!isBytes16Hex(newEditorSpaceId)) {
|
|
42
|
+
throw new Error(`newEditorSpaceId must be bytes16 hex (0x followed by 32 hex chars). Received: ${newEditorSpaceId}`);
|
|
43
|
+
}
|
|
44
|
+
const proposalId = rawProposalId
|
|
45
|
+
? ensure0xPrefix(rawProposalId)
|
|
46
|
+
: `0x${uuidv4().replaceAll('-', '')}`;
|
|
47
|
+
// Encode the addEditor function call: addEditor(bytes16 _newEditorSpaceId)
|
|
48
|
+
const proposalActionCalldata = encodeFunctionData({
|
|
49
|
+
abi: DaoSpaceAbi,
|
|
50
|
+
functionName: 'addEditor',
|
|
51
|
+
args: [newEditorSpaceId],
|
|
52
|
+
});
|
|
53
|
+
const contracts = getContractAddressesBasedOnNetwork(network);
|
|
54
|
+
// Create the proposal action (calling addEditor on the DAO space)
|
|
55
|
+
const proposalActions = [
|
|
56
|
+
{
|
|
57
|
+
to: contracts.SPACE_REGISTRY_ADDRESS,
|
|
58
|
+
value: 0n,
|
|
59
|
+
data: proposalActionCalldata,
|
|
60
|
+
},
|
|
61
|
+
];
|
|
62
|
+
// Encode the proposal data: abi.encode(bytes16 proposalId, VotingMode votingMode, Action[] actions)
|
|
63
|
+
const data = encodeAbiParameters([
|
|
64
|
+
{ type: 'bytes16', name: 'proposalId' },
|
|
65
|
+
{ type: 'uint8', name: 'votingMode' },
|
|
66
|
+
{
|
|
67
|
+
type: 'tuple[]',
|
|
68
|
+
name: 'actions',
|
|
69
|
+
components: [
|
|
70
|
+
{ type: 'address', name: 'to' },
|
|
71
|
+
{ type: 'uint256', name: 'value' },
|
|
72
|
+
{ type: 'bytes', name: 'data' },
|
|
73
|
+
],
|
|
74
|
+
},
|
|
75
|
+
], [proposalId, votingMode === 'FAST' ? 1 : 0, proposalActions]);
|
|
76
|
+
// Convert proposalId to bytes32 for the topic (left-aligned)
|
|
77
|
+
const topic = bytes16ToBytes32LeftAligned(proposalId);
|
|
78
|
+
// Encode the SpaceRegistry.enter() call
|
|
79
|
+
const calldata = encodeFunctionData({
|
|
80
|
+
abi: SpaceRegistryAbi,
|
|
81
|
+
functionName: 'enter',
|
|
82
|
+
args: [
|
|
83
|
+
authorSpaceId, // fromSpaceId
|
|
84
|
+
spaceId, // toSpaceId
|
|
85
|
+
PROPOSAL_CREATED_ACTION, // action
|
|
86
|
+
topic, // topic (proposalId left-aligned to bytes32)
|
|
87
|
+
data, // data (encoded proposal)
|
|
88
|
+
EMPTY_SIGNATURE, // signature (unused when msg.sender == fromSpace)
|
|
89
|
+
],
|
|
90
|
+
});
|
|
91
|
+
return {
|
|
92
|
+
to: contracts.SPACE_REGISTRY_ADDRESS,
|
|
93
|
+
calldata,
|
|
94
|
+
proposalId,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=propose-add-editor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"propose-add-editor.js","sourceRoot":"","sources":["../../../src/dao-space/propose-add-editor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"propose-add-editor.test.d.ts","sourceRoot":"","sources":["../../../src/dao-space/propose-add-editor.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { TESTNET } from '../../contracts.js';
|
|
3
|
+
import { proposeAddEditor } from './propose-add-editor.js';
|
|
4
|
+
describe('proposeAddEditor', () => {
|
|
5
|
+
const validAuthorSpaceId = '0x0eed5491b917cf58b33ac81255fe7ae9';
|
|
6
|
+
const validSpaceId = '0xabcdef12345678901234567890abcdef';
|
|
7
|
+
const validNewEditorSpaceId = '0x11111111111111111111111111111111';
|
|
8
|
+
it('should return correct structure', () => {
|
|
9
|
+
const result = proposeAddEditor({
|
|
10
|
+
authorSpaceId: validAuthorSpaceId,
|
|
11
|
+
spaceId: validSpaceId,
|
|
12
|
+
newEditorSpaceId: validNewEditorSpaceId,
|
|
13
|
+
});
|
|
14
|
+
expect(result).toHaveProperty('to');
|
|
15
|
+
expect(result).toHaveProperty('calldata');
|
|
16
|
+
expect(result).toHaveProperty('proposalId');
|
|
17
|
+
});
|
|
18
|
+
it('should return the correct contract address (Space Registry)', () => {
|
|
19
|
+
const { to } = proposeAddEditor({
|
|
20
|
+
authorSpaceId: validAuthorSpaceId,
|
|
21
|
+
spaceId: validSpaceId,
|
|
22
|
+
newEditorSpaceId: validNewEditorSpaceId,
|
|
23
|
+
});
|
|
24
|
+
expect(to).toBe(TESTNET.SPACE_REGISTRY_ADDRESS);
|
|
25
|
+
});
|
|
26
|
+
it('should return valid calldata', () => {
|
|
27
|
+
const { calldata } = proposeAddEditor({
|
|
28
|
+
authorSpaceId: validAuthorSpaceId,
|
|
29
|
+
spaceId: validSpaceId,
|
|
30
|
+
newEditorSpaceId: validNewEditorSpaceId,
|
|
31
|
+
});
|
|
32
|
+
expect(calldata).toBeTypeOf('string');
|
|
33
|
+
expect(calldata.startsWith('0x')).toBe(true);
|
|
34
|
+
});
|
|
35
|
+
it('should return valid proposalId (bytes16 hex)', () => {
|
|
36
|
+
const { proposalId } = proposeAddEditor({
|
|
37
|
+
authorSpaceId: validAuthorSpaceId,
|
|
38
|
+
spaceId: validSpaceId,
|
|
39
|
+
newEditorSpaceId: validNewEditorSpaceId,
|
|
40
|
+
});
|
|
41
|
+
expect(proposalId).toMatch(/^0x[0-9a-fA-F]{32}$/);
|
|
42
|
+
});
|
|
43
|
+
it('should accept custom proposalId', () => {
|
|
44
|
+
const customProposalId = '0x22222222222222222222222222222222';
|
|
45
|
+
const { proposalId } = proposeAddEditor({
|
|
46
|
+
authorSpaceId: validAuthorSpaceId,
|
|
47
|
+
spaceId: validSpaceId,
|
|
48
|
+
newEditorSpaceId: validNewEditorSpaceId,
|
|
49
|
+
proposalId: customProposalId,
|
|
50
|
+
});
|
|
51
|
+
expect(proposalId).toBe(customProposalId);
|
|
52
|
+
});
|
|
53
|
+
it('should default to SLOW voting mode and produce valid calldata', () => {
|
|
54
|
+
const result = proposeAddEditor({
|
|
55
|
+
authorSpaceId: validAuthorSpaceId,
|
|
56
|
+
spaceId: validSpaceId,
|
|
57
|
+
newEditorSpaceId: validNewEditorSpaceId,
|
|
58
|
+
});
|
|
59
|
+
expect(result.calldata).toBeTruthy();
|
|
60
|
+
});
|
|
61
|
+
it('should accept FAST voting mode', () => {
|
|
62
|
+
const result = proposeAddEditor({
|
|
63
|
+
authorSpaceId: validAuthorSpaceId,
|
|
64
|
+
spaceId: validSpaceId,
|
|
65
|
+
newEditorSpaceId: validNewEditorSpaceId,
|
|
66
|
+
votingMode: 'FAST',
|
|
67
|
+
});
|
|
68
|
+
expect(result.calldata).toBeTruthy();
|
|
69
|
+
});
|
|
70
|
+
it('should generate unique proposalIds for the same input', () => {
|
|
71
|
+
const result1 = proposeAddEditor({
|
|
72
|
+
authorSpaceId: validAuthorSpaceId,
|
|
73
|
+
spaceId: validSpaceId,
|
|
74
|
+
newEditorSpaceId: validNewEditorSpaceId,
|
|
75
|
+
});
|
|
76
|
+
const result2 = proposeAddEditor({
|
|
77
|
+
authorSpaceId: validAuthorSpaceId,
|
|
78
|
+
spaceId: validSpaceId,
|
|
79
|
+
newEditorSpaceId: validNewEditorSpaceId,
|
|
80
|
+
});
|
|
81
|
+
expect(result1.proposalId).not.toBe(result2.proposalId);
|
|
82
|
+
});
|
|
83
|
+
it('should throw for invalid spaceId format', () => {
|
|
84
|
+
expect(() => proposeAddEditor({
|
|
85
|
+
authorSpaceId: '0xinvalid',
|
|
86
|
+
spaceId: validSpaceId,
|
|
87
|
+
newEditorSpaceId: validNewEditorSpaceId,
|
|
88
|
+
})).toThrow('authorSpaceId must be bytes16 hex');
|
|
89
|
+
});
|
|
90
|
+
it('should throw for invalid daoSpaceId format', () => {
|
|
91
|
+
expect(() => proposeAddEditor({
|
|
92
|
+
authorSpaceId: validAuthorSpaceId,
|
|
93
|
+
spaceId: '0xtooshort',
|
|
94
|
+
newEditorSpaceId: validNewEditorSpaceId,
|
|
95
|
+
})).toThrow('spaceId must be bytes16 hex');
|
|
96
|
+
});
|
|
97
|
+
it('should throw for invalid newEditorSpaceId format', () => {
|
|
98
|
+
expect(() => proposeAddEditor({
|
|
99
|
+
authorSpaceId: validAuthorSpaceId,
|
|
100
|
+
spaceId: validSpaceId,
|
|
101
|
+
newEditorSpaceId: '0xinvalid',
|
|
102
|
+
})).toThrow('newEditorSpaceId must be bytes16 hex');
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
//# sourceMappingURL=propose-add-editor.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"propose-add-editor.test.js","sourceRoot":"","sources":["../../../src/dao-space/propose-add-editor.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { ProposeRemoveEditorParams, ProposeRemoveEditorResult } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Creates a proposal to remove an editor from a DAO space.
|
|
4
|
+
*
|
|
5
|
+
* This function:
|
|
6
|
+
* 1. Validates the author, DAO space, and editor IDs
|
|
7
|
+
* 2. Encodes the `removeEditor()` call as the proposal action
|
|
8
|
+
* 3. Encodes the SpaceRegistry's `enter()` call with the `PROPOSAL_CREATED` action
|
|
9
|
+
*
|
|
10
|
+
* @param params - The parameters for proposing editor removal
|
|
11
|
+
* @returns Object containing `to` (Space Registry address), `calldata`, and `proposalId`
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```ts
|
|
15
|
+
* import { daoSpace } from '@geoprotocol/geo-sdk';
|
|
16
|
+
*
|
|
17
|
+
* const { to, calldata, proposalId } = daoSpace.proposeRemoveEditor({
|
|
18
|
+
* authorSpaceId: '0xAuthorBytes16SpaceId...',
|
|
19
|
+
* spaceId: '0xDAOBytes16SpaceId...',
|
|
20
|
+
* editorToRemoveSpaceId: '0xEditorBytes16SpaceId...',
|
|
21
|
+
* network: 'TESTNET',
|
|
22
|
+
* });
|
|
23
|
+
*
|
|
24
|
+
* // Submit the transaction using viem or another client
|
|
25
|
+
* await walletClient.sendTransaction({ to, data: calldata });
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
export declare function proposeRemoveEditor(params: ProposeRemoveEditorParams): ProposeRemoveEditorResult;
|
|
29
|
+
//# sourceMappingURL=propose-remove-editor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"propose-remove-editor.d.ts","sourceRoot":"","sources":["../../../src/dao-space/propose-remove-editor.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAEvF;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,yBAAyB,GAAG,yBAAyB,CA0FhG"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
2
|
+
import { encodeAbiParameters, encodeFunctionData } from 'viem';
|
|
3
|
+
import { TESTNET } from '../../contracts.js';
|
|
4
|
+
import { DaoSpaceAbi, SpaceRegistryAbi } from '../abis/index.js';
|
|
5
|
+
import { bytes16ToBytes32LeftAligned, EMPTY_SIGNATURE, ensure0xPrefix, isBytes16Hex, PROPOSAL_CREATED_ACTION, } from './constants.js';
|
|
6
|
+
/**
|
|
7
|
+
* Creates a proposal to remove an editor from a DAO space.
|
|
8
|
+
*
|
|
9
|
+
* This function:
|
|
10
|
+
* 1. Validates the author, DAO space, and editor IDs
|
|
11
|
+
* 2. Encodes the `removeEditor()` call as the proposal action
|
|
12
|
+
* 3. Encodes the SpaceRegistry's `enter()` call with the `PROPOSAL_CREATED` action
|
|
13
|
+
*
|
|
14
|
+
* @param params - The parameters for proposing editor removal
|
|
15
|
+
* @returns Object containing `to` (Space Registry address), `calldata`, and `proposalId`
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```ts
|
|
19
|
+
* import { daoSpace } from '@geoprotocol/geo-sdk';
|
|
20
|
+
*
|
|
21
|
+
* const { to, calldata, proposalId } = daoSpace.proposeRemoveEditor({
|
|
22
|
+
* authorSpaceId: '0xAuthorBytes16SpaceId...',
|
|
23
|
+
* spaceId: '0xDAOBytes16SpaceId...',
|
|
24
|
+
* editorToRemoveSpaceId: '0xEditorBytes16SpaceId...',
|
|
25
|
+
* network: 'TESTNET',
|
|
26
|
+
* });
|
|
27
|
+
*
|
|
28
|
+
* // Submit the transaction using viem or another client
|
|
29
|
+
* await walletClient.sendTransaction({ to, data: calldata });
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
export function proposeRemoveEditor(params) {
|
|
33
|
+
const { authorSpaceId: rawAuthorSpaceId, spaceId: rawSpaceId, editorToRemoveSpaceId: rawEditorToRemoveSpaceId, votingMode = 'SLOW', proposalId: rawProposalId, } = params;
|
|
34
|
+
// Ensure 0x prefix on all IDs
|
|
35
|
+
const authorSpaceId = ensure0xPrefix(rawAuthorSpaceId);
|
|
36
|
+
const spaceId = ensure0xPrefix(rawSpaceId);
|
|
37
|
+
const editorToRemoveSpaceId = ensure0xPrefix(rawEditorToRemoveSpaceId);
|
|
38
|
+
// Validate inputs
|
|
39
|
+
if (!isBytes16Hex(authorSpaceId)) {
|
|
40
|
+
throw new Error(`authorSpaceId must be bytes16 hex (32 hex chars). Received: ${rawAuthorSpaceId}`);
|
|
41
|
+
}
|
|
42
|
+
if (!isBytes16Hex(spaceId)) {
|
|
43
|
+
throw new Error(`spaceId must be bytes16 hex (32 hex chars). Received: ${rawSpaceId}`);
|
|
44
|
+
}
|
|
45
|
+
if (!isBytes16Hex(editorToRemoveSpaceId)) {
|
|
46
|
+
throw new Error(`editorToRemoveSpaceId must be bytes16 hex (32 hex chars). Received: ${rawEditorToRemoveSpaceId}`);
|
|
47
|
+
}
|
|
48
|
+
// Generate or use provided proposal ID (UUID v4 as bytes16 hex)
|
|
49
|
+
const proposalId = rawProposalId
|
|
50
|
+
? ensure0xPrefix(rawProposalId)
|
|
51
|
+
: `0x${uuidv4().replaceAll('-', '')}`;
|
|
52
|
+
if (!isBytes16Hex(proposalId)) {
|
|
53
|
+
throw new Error(`proposalId must be bytes16 hex (32 hex chars). Received: ${rawProposalId}`);
|
|
54
|
+
}
|
|
55
|
+
// Encode the removeEditor function call: removeEditor(bytes16 _oldEditorSpaceId)
|
|
56
|
+
const proposalActionCalldata = encodeFunctionData({
|
|
57
|
+
abi: DaoSpaceAbi,
|
|
58
|
+
functionName: 'removeEditor',
|
|
59
|
+
args: [editorToRemoveSpaceId],
|
|
60
|
+
});
|
|
61
|
+
// Create the proposal action (calling removeEditor on the Space Registry)
|
|
62
|
+
const proposalActions = [
|
|
63
|
+
{
|
|
64
|
+
to: TESTNET.SPACE_REGISTRY_ADDRESS,
|
|
65
|
+
value: 0n,
|
|
66
|
+
data: proposalActionCalldata,
|
|
67
|
+
},
|
|
68
|
+
];
|
|
69
|
+
// Encode the proposal data: abi.encode(bytes16 proposalId, VotingMode votingMode, Action[] actions)
|
|
70
|
+
const data = encodeAbiParameters([
|
|
71
|
+
{ type: 'bytes16', name: 'proposalId' },
|
|
72
|
+
{ type: 'uint8', name: 'votingMode' },
|
|
73
|
+
{
|
|
74
|
+
type: 'tuple[]',
|
|
75
|
+
name: 'actions',
|
|
76
|
+
components: [
|
|
77
|
+
{ type: 'address', name: 'to' },
|
|
78
|
+
{ type: 'uint256', name: 'value' },
|
|
79
|
+
{ type: 'bytes', name: 'data' },
|
|
80
|
+
],
|
|
81
|
+
},
|
|
82
|
+
], [proposalId, votingMode === 'FAST' ? 1 : 0, proposalActions]);
|
|
83
|
+
// Convert proposalId to bytes32 for the topic (left-aligned)
|
|
84
|
+
const topic = bytes16ToBytes32LeftAligned(proposalId);
|
|
85
|
+
// Encode the SpaceRegistry.enter() call
|
|
86
|
+
const calldata = encodeFunctionData({
|
|
87
|
+
abi: SpaceRegistryAbi,
|
|
88
|
+
functionName: 'enter',
|
|
89
|
+
args: [
|
|
90
|
+
authorSpaceId, // fromSpaceId
|
|
91
|
+
spaceId, // toSpaceId
|
|
92
|
+
PROPOSAL_CREATED_ACTION, // action
|
|
93
|
+
topic, // topic (proposalId left-aligned to bytes32)
|
|
94
|
+
data, // data (encoded proposal)
|
|
95
|
+
EMPTY_SIGNATURE, // signature (unused when msg.sender == fromSpace)
|
|
96
|
+
],
|
|
97
|
+
});
|
|
98
|
+
return {
|
|
99
|
+
to: TESTNET.SPACE_REGISTRY_ADDRESS,
|
|
100
|
+
calldata,
|
|
101
|
+
proposalId,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=propose-remove-editor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"propose-remove-editor.js","sourceRoot":"","sources":["../../../src/dao-space/propose-remove-editor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"propose-remove-editor.test.d.ts","sourceRoot":"","sources":["../../../src/dao-space/propose-remove-editor.test.ts"],"names":[],"mappings":""}
|