@geoprotocol/geo-sdk 0.19.0 → 0.20.0-beta.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.
Files changed (170) hide show
  1. package/README.md +98 -45
  2. package/dist/index.d.ts +1 -1
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +1 -1
  5. package/dist/index.js.map +1 -1
  6. package/dist/src/abis/dao-space-factory.d.ts +43 -6
  7. package/dist/src/abis/dao-space-factory.d.ts.map +1 -1
  8. package/dist/src/abis/dao-space-factory.js +38 -27
  9. package/dist/src/abis/dao-space-factory.js.map +1 -1
  10. package/dist/src/abis/dao-space.d.ts +98 -7
  11. package/dist/src/abis/dao-space.d.ts.map +1 -1
  12. package/dist/src/abis/dao-space.js +61 -99
  13. package/dist/src/abis/dao-space.js.map +1 -1
  14. package/dist/src/abis/index.d.ts +2 -2
  15. package/dist/src/abis/index.d.ts.map +1 -1
  16. package/dist/src/abis/index.js +2 -2
  17. package/dist/src/abis/index.js.map +1 -1
  18. package/dist/src/api-surface.e2e.test.d.ts +2 -0
  19. package/dist/src/api-surface.e2e.test.d.ts.map +1 -0
  20. package/dist/src/{e2e-api-surface.test.js → api-surface.e2e.test.js} +87 -101
  21. package/dist/src/api-surface.e2e.test.js.map +1 -0
  22. package/dist/src/client/dao-spaces.d.ts +65 -33
  23. package/dist/src/client/dao-spaces.d.ts.map +1 -1
  24. package/dist/src/client/dao-spaces.js +133 -42
  25. package/dist/src/client/dao-spaces.js.map +1 -1
  26. package/dist/src/client/dao-spaces.test.js +277 -79
  27. package/dist/src/client/dao-spaces.test.js.map +1 -1
  28. package/dist/src/client/personal-spaces.js +2 -2
  29. package/dist/src/client/personal-spaces.js.map +1 -1
  30. package/dist/src/client/spaces.test.js +9 -7
  31. package/dist/src/client/spaces.test.js.map +1 -1
  32. package/dist/src/client.d.ts +19 -16
  33. package/dist/src/client.d.ts.map +1 -1
  34. package/dist/src/client.js +48 -59
  35. package/dist/src/client.js.map +1 -1
  36. package/dist/src/client.test.js +8 -3
  37. package/dist/src/client.test.js.map +1 -1
  38. package/dist/src/dao-space/constants.d.ts +10 -0
  39. package/dist/src/dao-space/constants.d.ts.map +1 -1
  40. package/dist/src/dao-space/constants.js +10 -0
  41. package/dist/src/dao-space/constants.js.map +1 -1
  42. package/dist/src/dao-space/execute-proposal.d.ts +1 -1
  43. package/dist/src/dao-space/execute-proposal.js +2 -2
  44. package/dist/src/dao-space/execute-proposal.js.map +1 -1
  45. package/dist/src/dao-space/index.d.ts +2 -1
  46. package/dist/src/dao-space/index.d.ts.map +1 -1
  47. package/dist/src/dao-space/index.js +1 -0
  48. package/dist/src/dao-space/index.js.map +1 -1
  49. package/dist/src/dao-space/propose-add-editor.d.ts +1 -20
  50. package/dist/src/dao-space/propose-add-editor.d.ts.map +1 -1
  51. package/dist/src/dao-space/propose-add-editor.js +12 -87
  52. package/dist/src/dao-space/propose-add-editor.js.map +1 -1
  53. package/dist/src/dao-space/propose-add-editor.test.js +16 -4
  54. package/dist/src/dao-space/propose-add-editor.test.js.map +1 -1
  55. package/dist/src/dao-space/propose-add-member.d.ts +1 -20
  56. package/dist/src/dao-space/propose-add-member.d.ts.map +1 -1
  57. package/dist/src/dao-space/propose-add-member.js +12 -87
  58. package/dist/src/dao-space/propose-add-member.js.map +1 -1
  59. package/dist/src/dao-space/propose-add-member.test.js +13 -0
  60. package/dist/src/dao-space/propose-add-member.test.js.map +1 -1
  61. package/dist/src/dao-space/propose-edit.test.js +45 -0
  62. package/dist/src/dao-space/propose-edit.test.js.map +1 -1
  63. package/dist/src/dao-space/propose-remove-editor.d.ts +1 -22
  64. package/dist/src/dao-space/propose-remove-editor.d.ts.map +1 -1
  65. package/dist/src/dao-space/propose-remove-editor.js +12 -94
  66. package/dist/src/dao-space/propose-remove-editor.js.map +1 -1
  67. package/dist/src/dao-space/propose-remove-editor.test.js +22 -4
  68. package/dist/src/dao-space/propose-remove-editor.test.js.map +1 -1
  69. package/dist/src/dao-space/propose-remove-member.d.ts +1 -22
  70. package/dist/src/dao-space/propose-remove-member.d.ts.map +1 -1
  71. package/dist/src/dao-space/propose-remove-member.js +12 -94
  72. package/dist/src/dao-space/propose-remove-member.js.map +1 -1
  73. package/dist/src/dao-space/propose-remove-member.test.js +19 -0
  74. package/dist/src/dao-space/propose-remove-member.test.js.map +1 -1
  75. package/dist/src/dao-space/types.d.ts +72 -11
  76. package/dist/src/dao-space/types.d.ts.map +1 -1
  77. package/dist/src/dao-space/vote-proposal.d.ts +1 -1
  78. package/dist/src/dao-space/vote-proposal.js +2 -2
  79. package/dist/src/dao-space/vote-proposal.js.map +1 -1
  80. package/dist/src/dao-space/vote-proposal.test.js +54 -0
  81. package/dist/src/dao-space/vote-proposal.test.js.map +1 -1
  82. package/dist/src/e2e-test-environment.d.ts +26 -0
  83. package/dist/src/e2e-test-environment.d.ts.map +1 -0
  84. package/dist/src/e2e-test-environment.js +150 -0
  85. package/dist/src/e2e-test-environment.js.map +1 -0
  86. package/dist/src/encodings/get-create-dao-space-calldata.d.ts +32 -9
  87. package/dist/src/encodings/get-create-dao-space-calldata.d.ts.map +1 -1
  88. package/dist/src/encodings/get-create-dao-space-calldata.js +63 -16
  89. package/dist/src/encodings/get-create-dao-space-calldata.js.map +1 -1
  90. package/dist/src/encodings/get-create-dao-space-calldata.test.js +90 -23
  91. package/dist/src/encodings/get-create-dao-space-calldata.test.js.map +1 -1
  92. package/dist/src/full-flow-test.test.js +5 -2
  93. package/dist/src/full-flow-test.test.js.map +1 -1
  94. package/dist/src/legacy-api-surface.e2e.test.d.ts +2 -0
  95. package/dist/src/legacy-api-surface.e2e.test.d.ts.map +1 -0
  96. package/dist/src/{e2e-legacy-api-surface.test.js → legacy-api-surface.e2e.test.js} +91 -71
  97. package/dist/src/legacy-api-surface.e2e.test.js.map +1 -0
  98. package/dist/src/personal-space/constants.d.ts +1 -1
  99. package/dist/src/personal-space/constants.d.ts.map +1 -1
  100. package/dist/src/personal-space/constants.js +1 -1
  101. package/dist/src/personal-space/constants.js.map +1 -1
  102. package/dist/src/personal-space/create-space.d.ts +2 -2
  103. package/dist/src/personal-space/create-space.d.ts.map +1 -1
  104. package/dist/src/personal-space/create-space.js +4 -3
  105. package/dist/src/personal-space/create-space.js.map +1 -1
  106. package/dist/src/personal-space/types.d.ts +4 -1
  107. package/dist/src/personal-space/types.d.ts.map +1 -1
  108. package/package.json +3 -2
  109. package/dist/proto.d.ts +0 -5
  110. package/dist/proto.d.ts.map +0 -1
  111. package/dist/proto.js +0 -5
  112. package/dist/proto.js.map +0 -1
  113. package/dist/src/client/proposals.d.ts +0 -185
  114. package/dist/src/client/proposals.d.ts.map +0 -1
  115. package/dist/src/client/proposals.js +0 -294
  116. package/dist/src/client/proposals.js.map +0 -1
  117. package/dist/src/client/proposals.test.d.ts +0 -2
  118. package/dist/src/client/proposals.test.d.ts.map +0 -1
  119. package/dist/src/client/proposals.test.js +0 -243
  120. package/dist/src/client/proposals.test.js.map +0 -1
  121. package/dist/src/contracts-v2/abis.d.ts +0 -196
  122. package/dist/src/contracts-v2/abis.d.ts.map +0 -1
  123. package/dist/src/contracts-v2/abis.js +0 -110
  124. package/dist/src/contracts-v2/abis.js.map +0 -1
  125. package/dist/src/contracts-v2/actions.d.ts +0 -56
  126. package/dist/src/contracts-v2/actions.d.ts.map +0 -1
  127. package/dist/src/contracts-v2/actions.js +0 -83
  128. package/dist/src/contracts-v2/actions.js.map +0 -1
  129. package/dist/src/contracts-v2/encoding.d.ts +0 -80
  130. package/dist/src/contracts-v2/encoding.d.ts.map +0 -1
  131. package/dist/src/contracts-v2/encoding.js +0 -193
  132. package/dist/src/contracts-v2/encoding.js.map +0 -1
  133. package/dist/src/contracts-v2/encoding.test.d.ts +0 -2
  134. package/dist/src/contracts-v2/encoding.test.d.ts.map +0 -1
  135. package/dist/src/contracts-v2/encoding.test.js +0 -93
  136. package/dist/src/contracts-v2/encoding.test.js.map +0 -1
  137. package/dist/src/contracts-v2/voting-settings.d.ts +0 -48
  138. package/dist/src/contracts-v2/voting-settings.d.ts.map +0 -1
  139. package/dist/src/contracts-v2/voting-settings.js +0 -69
  140. package/dist/src/contracts-v2/voting-settings.js.map +0 -1
  141. package/dist/src/e2e/local-geobrowser.d.ts +0 -9
  142. package/dist/src/e2e/local-geobrowser.d.ts.map +0 -1
  143. package/dist/src/e2e/local-geobrowser.js +0 -35
  144. package/dist/src/e2e/local-geobrowser.js.map +0 -1
  145. package/dist/src/e2e/v2-contracts.test.d.ts +0 -2
  146. package/dist/src/e2e/v2-contracts.test.d.ts.map +0 -1
  147. package/dist/src/e2e/v2-contracts.test.js +0 -25
  148. package/dist/src/e2e/v2-contracts.test.js.map +0 -1
  149. package/dist/src/e2e-api-surface.test.d.ts +0 -2
  150. package/dist/src/e2e-api-surface.test.d.ts.map +0 -1
  151. package/dist/src/e2e-api-surface.test.js.map +0 -1
  152. package/dist/src/e2e-flows.test.d.ts +0 -2
  153. package/dist/src/e2e-flows.test.d.ts.map +0 -1
  154. package/dist/src/e2e-flows.test.js +0 -445
  155. package/dist/src/e2e-flows.test.js.map +0 -1
  156. package/dist/src/e2e-legacy-api-surface.test.d.ts +0 -2
  157. package/dist/src/e2e-legacy-api-surface.test.d.ts.map +0 -1
  158. package/dist/src/e2e-legacy-api-surface.test.js.map +0 -1
  159. package/dist/src/graph/create-space.d.ts +0 -37
  160. package/dist/src/graph/create-space.d.ts.map +0 -1
  161. package/dist/src/graph/create-space.js +0 -67
  162. package/dist/src/graph/create-space.js.map +0 -1
  163. package/dist/src/ops/images.d.ts +0 -37
  164. package/dist/src/ops/images.d.ts.map +0 -1
  165. package/dist/src/ops/images.js +0 -69
  166. package/dist/src/ops/images.js.map +0 -1
  167. package/dist/src/proto/index.d.ts +0 -7
  168. package/dist/src/proto/index.d.ts.map +0 -1
  169. package/dist/src/proto/index.js +0 -7
  170. package/dist/src/proto/index.js.map +0 -1
@@ -0,0 +1,150 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { defineGeoNetworkConfig, GeoTestnetConfig } from './networks.js';
3
+ const DEFAULT_LOCAL_GEOBROWSER_PRIVATE_KEY = '0x5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a';
4
+ const INDEXED_LOCAL_GEOBROWSER_DAO_FACTORIES = {
5
+ // First deterministic local-geobrowser deployment. The running hermes-substream
6
+ // may still be compiled against this registry after contracts are redeployed.
7
+ '0xe7f1725e7734ce288f8367e1bb143e90bb3f0512': '0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9',
8
+ };
9
+ function requireHexPrivateKey(value, source) {
10
+ if (!value) {
11
+ throw new Error(`${source} is required for e2e tests.`);
12
+ }
13
+ if (!value.startsWith('0x')) {
14
+ throw new Error(`${source} must be a hex string starting with 0x.`);
15
+ }
16
+ return value;
17
+ }
18
+ function requireEnv(value, source) {
19
+ if (!value) {
20
+ throw new Error(`${source} is required for local-geobrowser e2e tests. Set GEO_E2E_NETWORK=TESTNET to run against testnet.`);
21
+ }
22
+ return value;
23
+ }
24
+ function requireNetworkRpcUrl(network) {
25
+ const rpcUrl = network.chain?.rpcUrl;
26
+ if (!rpcUrl) {
27
+ throw new Error(`Geo network "${network.name}" is missing an RPC URL`);
28
+ }
29
+ return rpcUrl;
30
+ }
31
+ function requireNetworkContract(network, name) {
32
+ const address = network.contracts?.[name];
33
+ if (!address) {
34
+ throw new Error(`Geo network "${network.name}" is missing ${name}`);
35
+ }
36
+ return address;
37
+ }
38
+ function createChain(network, rpcUrl) {
39
+ const chainConfig = network.chain;
40
+ if (!chainConfig) {
41
+ throw new Error(`Geo network "${network.name}" is missing chain config`);
42
+ }
43
+ return {
44
+ id: chainConfig.id,
45
+ name: chainConfig.name,
46
+ nativeCurrency: {
47
+ name: 'Ethereum',
48
+ symbol: 'ETH',
49
+ decimals: 18,
50
+ },
51
+ rpcUrls: {
52
+ default: { http: [rpcUrl] },
53
+ public: { http: [rpcUrl] },
54
+ },
55
+ };
56
+ }
57
+ function readLocalGeobrowserDeployments() {
58
+ if (process.env.GEO_E2E_NETWORK === 'TESTNET') {
59
+ return undefined;
60
+ }
61
+ const localGeobrowserPath = requireEnv(process.env.GEO_LOCAL_GEOBROWSER_PATH, 'GEO_LOCAL_GEOBROWSER_PATH');
62
+ const deploymentsPath = process.env.GEO_LOCAL_GEOBROWSER_DEPLOYMENTS ?? `${localGeobrowserPath}/.deployments.json`;
63
+ try {
64
+ return {
65
+ path: localGeobrowserPath,
66
+ deployments: JSON.parse(readFileSync(deploymentsPath, 'utf8')),
67
+ };
68
+ }
69
+ catch {
70
+ throw new Error(`Could not read local-geobrowser deployments from ${deploymentsPath}. Set GEO_LOCAL_GEOBROWSER_DEPLOYMENTS to override the path.`);
71
+ }
72
+ }
73
+ function readIndexedLocalSpaceRegistry(localGeobrowserPath) {
74
+ try {
75
+ const source = readFileSync(`${localGeobrowserPath}/gaia/hermes-substream/src/lib.rs`, 'utf8');
76
+ const match = /\nconst SPACE_REGISTRY_ADDRESS:[\s\S]*?=\s*\[([\s\S]*?)\];/.exec(source);
77
+ const bytes = match?.[1]?.match(/0x[0-9a-fA-F]{2}/g);
78
+ if (!bytes || bytes.length !== 20) {
79
+ return undefined;
80
+ }
81
+ return `0x${bytes.map(byte => byte.slice(2)).join('')}`;
82
+ }
83
+ catch {
84
+ return undefined;
85
+ }
86
+ }
87
+ export function createE2ETestEnvironment() {
88
+ const local = readLocalGeobrowserDeployments();
89
+ if (local) {
90
+ const rpcUrl = process.env.GEO_LOCAL_GEOBROWSER_RPC_URL ?? local.deployments.rpcUrl ?? 'http://localhost:8545';
91
+ const apiOrigin = process.env.GEO_LOCAL_GEOBROWSER_API_ORIGIN ?? 'http://localhost:3000';
92
+ const indexedSpaceRegistry = readIndexedLocalSpaceRegistry(local.path);
93
+ const spaceRegistryAddress = process.env.GEO_LOCAL_GEOBROWSER_SPACE_REGISTRY_ADDRESS ??
94
+ indexedSpaceRegistry ??
95
+ local.deployments.spaceRegistry;
96
+ const daoSpaceFactoryAddress = process.env.GEO_LOCAL_GEOBROWSER_DAO_SPACE_FACTORY_ADDRESS ??
97
+ (spaceRegistryAddress.toLowerCase() === local.deployments.spaceRegistry.toLowerCase()
98
+ ? local.deployments.daoSpaceFactory
99
+ : (INDEXED_LOCAL_GEOBROWSER_DAO_FACTORIES[spaceRegistryAddress.toLowerCase()] ??
100
+ local.deployments.daoSpaceFactory));
101
+ const network = defineGeoNetworkConfig({
102
+ id: 'LOCAL_GEOBROWSER',
103
+ name: 'Local Geobrowser',
104
+ apiOrigin,
105
+ chain: {
106
+ id: Number(process.env.GEO_LOCAL_GEOBROWSER_CHAIN_ID ?? 1337),
107
+ name: 'Anvil',
108
+ rpcUrl,
109
+ },
110
+ contracts: {
111
+ SPACE_REGISTRY_ADDRESS: spaceRegistryAddress,
112
+ DAO_SPACE_FACTORY_ADDRESS: daoSpaceFactoryAddress,
113
+ },
114
+ });
115
+ return {
116
+ network,
117
+ networkish: network,
118
+ privateKey: requireHexPrivateKey(process.env.GEO_LOCAL_GEOBROWSER_PRIVATE_KEY ??
119
+ process.env.GEO_E2E_PRIVATE_KEY ??
120
+ DEFAULT_LOCAL_GEOBROWSER_PRIVATE_KEY, 'GEO_LOCAL_GEOBROWSER_PRIVATE_KEY'),
121
+ rpcUrl,
122
+ apiOrigin,
123
+ chain: createChain(network, rpcUrl),
124
+ contracts: {
125
+ SPACE_REGISTRY_ADDRESS: spaceRegistryAddress,
126
+ DAO_SPACE_FACTORY_ADDRESS: daoSpaceFactoryAddress,
127
+ },
128
+ localGeobrowserPath: local.path,
129
+ localGeobrowserDeployments: local.deployments,
130
+ };
131
+ }
132
+ const rpcUrl = process.env.GEO_E2E_RPC_URL ?? requireNetworkRpcUrl(GeoTestnetConfig);
133
+ const network = defineGeoNetworkConfig({
134
+ ...GeoTestnetConfig,
135
+ chain: GeoTestnetConfig.chain ? { ...GeoTestnetConfig.chain, rpcUrl } : undefined,
136
+ });
137
+ return {
138
+ network,
139
+ networkish: 'TESTNET',
140
+ privateKey: requireHexPrivateKey(process.env.GEO_E2E_PRIVATE_KEY ?? process.env.PRIVATE_KEY, 'PRIVATE_KEY'),
141
+ rpcUrl,
142
+ apiOrigin: network.apiOrigin,
143
+ chain: createChain(network, rpcUrl),
144
+ contracts: {
145
+ SPACE_REGISTRY_ADDRESS: requireNetworkContract(network, 'SPACE_REGISTRY_ADDRESS'),
146
+ DAO_SPACE_FACTORY_ADDRESS: requireNetworkContract(network, 'DAO_SPACE_FACTORY_ADDRESS'),
147
+ },
148
+ };
149
+ }
150
+ //# sourceMappingURL=e2e-test-environment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"e2e-test-environment.js","sourceRoot":"","sources":["../../src/e2e-test-environment.ts"],"names":[],"mappings":"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"}
@@ -3,32 +3,49 @@
3
3
  * 100% = 10e6 (10,000,000), so 50% = 5e6 (5,000,000)
4
4
  */
5
5
  export declare const RATIO_BASE: bigint;
6
- /** Minimum voting duration in seconds (2 days) */
6
+ /** Minimum voting duration in seconds, matching the contracts v2 lower bound. */
7
7
  export declare const MINIMUM_VOTING_DURATION: bigint;
8
8
  /** Minimum voting duration in days */
9
- export declare const MINIMUM_VOTING_DURATION_DAYS = 2;
9
+ export declare const MINIMUM_VOTING_DURATION_DAYS: number;
10
+ /** Minimum execution grace period in seconds, matching the contracts v2 lower bound. */
11
+ export declare const MINIMUM_EXECUTION_GRACE_PERIOD: bigint;
12
+ /** Minimum execution grace period in days */
13
+ export declare const MINIMUM_EXECUTION_GRACE_PERIOD_DAYS: number;
10
14
  /**
11
15
  * User-friendly voting settings input (using percentages and days)
12
16
  */
13
17
  export interface VotingSettingsInput {
14
- /** Percentage threshold for slow path (0-100) */
15
- slowPathPercentageThreshold: number;
18
+ /** Partial percentage threshold for slow path late execution (0-100) */
19
+ partialPercentageSupportThreshold: number;
20
+ /** Universal percentage threshold for slow path early execution (0-100) */
21
+ universalPercentageSupportThreshold: number;
16
22
  /** Number of editors required for fast path approval */
17
- fastPathFlatThreshold: number;
23
+ flatSupportThreshold: number;
18
24
  /** Minimum number of editors required to vote */
19
25
  quorum: number;
20
- /** Voting duration in days (minimum 2 days) */
26
+ /** Voting duration in days */
21
27
  durationInDays: number;
28
+ /** Whether newly added members start without fast-path access */
29
+ disableFastPathAccessForNewMembers: boolean;
30
+ /** Execution grace period in days */
31
+ executionGracePeriodInDays: number;
22
32
  }
23
33
  /**
24
34
  * Contract-level voting settings (using raw values)
25
35
  */
26
36
  export interface VotingSettings {
27
- slowPathPercentageThreshold: bigint;
28
- fastPathFlatThreshold: bigint;
37
+ partialPercentageSupportThreshold: bigint;
38
+ universalPercentageSupportThreshold: bigint;
39
+ flatSupportThreshold: bigint;
29
40
  quorum: bigint;
30
41
  duration: bigint;
42
+ disableFastPathAccessForNewMembers: boolean;
43
+ executionGracePeriod: bigint;
31
44
  }
45
+ /**
46
+ * Sensible user-friendly defaults for contracts v2 DAO spaces.
47
+ */
48
+ export declare const DEFAULT_VOTING_SETTINGS: VotingSettingsInput;
32
49
  /**
33
50
  * Convert a percentage (0-100) to the contract's ratio format.
34
51
  */
@@ -47,8 +64,14 @@ export declare function toContractVotingSettings(input: VotingSettingsInput): Vo
47
64
  export declare function validateIpfsUri(uri: string): string | null;
48
65
  /**
49
66
  * Validate voting settings input.
67
+ *
68
+ * When `totalEditors` is provided, the flat support threshold and quorum are
69
+ * also checked against that known editor count. For existing DAO spaces the
70
+ * current editor count may be unknown client-side, so callers can omit it and
71
+ * still get deterministic local validation for numeric shape, percentages, and
72
+ * duration lower bounds before the contract enforces editor-count limits.
50
73
  */
51
- export declare function validateVotingSettingsInput(settings: VotingSettingsInput, totalEditors: number): string | null;
74
+ export declare function validateVotingSettingsInput(settings: VotingSettingsInput, totalEditors?: number): string | null;
52
75
  export type CreateDaoSpaceCalldataParams = {
53
76
  /** Voting settings for the DAO space */
54
77
  votingSettings: VotingSettingsInput;
@@ -1 +1 @@
1
- {"version":3,"file":"get-create-dao-space-calldata.d.ts","sourceRoot":"","sources":["../../../src/encodings/get-create-dao-space-calldata.ts"],"names":[],"mappings":"AAIA;;;GAGG;AACH,eAAO,MAAM,UAAU,QAAe,CAAC;AAEvC,kDAAkD;AAClD,eAAO,MAAM,uBAAuB,QAA2B,CAAC;AAEhE,sCAAsC;AACtC,eAAO,MAAM,4BAA4B,IAAI,CAAC;AAE9C;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,iDAAiD;IACjD,2BAA2B,EAAE,MAAM,CAAC;IACpC,wDAAwD;IACxD,qBAAqB,EAAE,MAAM,CAAC;IAC9B,iDAAiD;IACjD,MAAM,EAAE,MAAM,CAAC;IACf,+CAA+C;IAC/C,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,2BAA2B,EAAE,MAAM,CAAC;IACpC,qBAAqB,EAAE,MAAM,CAAC;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAElD;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,mBAAmB,GAAG,cAAc,CAOnF;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAkB1D;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAc9G;AAED,MAAM,MAAM,4BAA4B,GAAG;IACzC,wCAAwC;IACxC,cAAc,EAAE,mBAAmB,CAAC;IACpC,wGAAwG;IACxG,qBAAqB,EAAE,KAAK,MAAM,EAAE,EAAE,CAAC;IACvC,+FAA+F;IAC/F,qBAAqB,EAAE,KAAK,MAAM,EAAE,EAAE,CAAC;IACvC,gEAAgE;IAChE,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,6FAA6F;IAC7F,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,4BAA4B,GAAG,KAAK,MAAM,EAAE,CA+C3F"}
1
+ {"version":3,"file":"get-create-dao-space-calldata.d.ts","sourceRoot":"","sources":["../../../src/encodings/get-create-dao-space-calldata.ts"],"names":[],"mappings":"AAIA;;;GAGG;AACH,eAAO,MAAM,UAAU,QAAe,CAAC;AAEvC,iFAAiF;AACjF,eAAO,MAAM,uBAAuB,QAAa,CAAC;AAElD,sCAAsC;AACtC,eAAO,MAAM,4BAA4B,QAAc,CAAC;AAExD,wFAAwF;AACxF,eAAO,MAAM,8BAA8B,QAAkB,CAAC;AAE9D,6CAA6C;AAC7C,eAAO,MAAM,mCAAmC,QAAS,CAAC;AAE1D;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,wEAAwE;IACxE,iCAAiC,EAAE,MAAM,CAAC;IAC1C,2EAA2E;IAC3E,mCAAmC,EAAE,MAAM,CAAC;IAC5C,wDAAwD;IACxD,oBAAoB,EAAE,MAAM,CAAC;IAC7B,iDAAiD;IACjD,MAAM,EAAE,MAAM,CAAC;IACf,8BAA8B;IAC9B,cAAc,EAAE,MAAM,CAAC;IACvB,iEAAiE;IACjE,kCAAkC,EAAE,OAAO,CAAC;IAC5C,qCAAqC;IACrC,0BAA0B,EAAE,MAAM,CAAC;CACpC;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,iCAAiC,EAAE,MAAM,CAAC;IAC1C,mCAAmC,EAAE,MAAM,CAAC;IAC5C,oBAAoB,EAAE,MAAM,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,kCAAkC,EAAE,OAAO,CAAC;IAC5C,oBAAoB,EAAE,MAAM,CAAC;CAC9B;AAED;;GAEG;AACH,eAAO,MAAM,uBAAuB,EAAE,mBAQrC,CAAC;AAEF;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAElD;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,mBAAmB,GAAG,cAAc,CAUnF;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAkB1D;AAMD;;;;;;;;GAQG;AACH,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,mBAAmB,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAqC/G;AAED,MAAM,MAAM,4BAA4B,GAAG;IACzC,wCAAwC;IACxC,cAAc,EAAE,mBAAmB,CAAC;IACpC,wGAAwG;IACxG,qBAAqB,EAAE,KAAK,MAAM,EAAE,EAAE,CAAC;IACvC,+FAA+F;IAC/F,qBAAqB,EAAE,KAAK,MAAM,EAAE,EAAE,CAAC;IACvC,gEAAgE;IAChE,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,6FAA6F;IAC7F,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,4BAA4B,GAAG,KAAK,MAAM,EAAE,CAiD3F"}
@@ -1,14 +1,30 @@
1
- import { encodeAbiParameters, encodeFunctionData } from 'viem';
1
+ import { encodeFunctionData, toHex } from 'viem';
2
2
  import { DaoSpaceFactoryAbi } from '../abis/index.js';
3
3
  /**
4
4
  * The base value for percentage ratios in the contract.
5
5
  * 100% = 10e6 (10,000,000), so 50% = 5e6 (5,000,000)
6
6
  */
7
7
  export const RATIO_BASE = BigInt(10e6);
8
- /** Minimum voting duration in seconds (2 days) */
9
- export const MINIMUM_VOTING_DURATION = BigInt(2 * 24 * 60 * 60);
8
+ /** Minimum voting duration in seconds, matching the contracts v2 lower bound. */
9
+ export const MINIMUM_VOTING_DURATION = BigInt(60);
10
10
  /** Minimum voting duration in days */
11
- export const MINIMUM_VOTING_DURATION_DAYS = 2;
11
+ export const MINIMUM_VOTING_DURATION_DAYS = 1 / 24 / 60;
12
+ /** Minimum execution grace period in seconds, matching the contracts v2 lower bound. */
13
+ export const MINIMUM_EXECUTION_GRACE_PERIOD = BigInt(60 * 60);
14
+ /** Minimum execution grace period in days */
15
+ export const MINIMUM_EXECUTION_GRACE_PERIOD_DAYS = 1 / 24;
16
+ /**
17
+ * Sensible user-friendly defaults for contracts v2 DAO spaces.
18
+ */
19
+ export const DEFAULT_VOTING_SETTINGS = {
20
+ partialPercentageSupportThreshold: 50,
21
+ universalPercentageSupportThreshold: 90,
22
+ flatSupportThreshold: 1,
23
+ quorum: 1,
24
+ durationInDays: 2,
25
+ disableFastPathAccessForNewMembers: true,
26
+ executionGracePeriodInDays: 14,
27
+ };
12
28
  /**
13
29
  * Convert a percentage (0-100) to the contract's ratio format.
14
30
  */
@@ -26,10 +42,13 @@ export function daysToSeconds(days) {
26
42
  */
27
43
  export function toContractVotingSettings(input) {
28
44
  return {
29
- slowPathPercentageThreshold: percentageToRatio(input.slowPathPercentageThreshold),
30
- fastPathFlatThreshold: BigInt(input.fastPathFlatThreshold),
45
+ partialPercentageSupportThreshold: percentageToRatio(input.partialPercentageSupportThreshold),
46
+ universalPercentageSupportThreshold: percentageToRatio(input.universalPercentageSupportThreshold),
47
+ flatSupportThreshold: BigInt(input.flatSupportThreshold),
31
48
  quorum: BigInt(input.quorum),
32
49
  duration: daysToSeconds(input.durationInDays),
50
+ disableFastPathAccessForNewMembers: input.disableFastPathAccessForNewMembers,
51
+ executionGracePeriod: daysToSeconds(input.executionGracePeriodInDays),
33
52
  };
34
53
  }
35
54
  /**
@@ -50,22 +69,48 @@ export function validateIpfsUri(uri) {
50
69
  }
51
70
  return null;
52
71
  }
72
+ function isNonNegativeInteger(value) {
73
+ return Number.isInteger(value) && value >= 0;
74
+ }
53
75
  /**
54
76
  * Validate voting settings input.
77
+ *
78
+ * When `totalEditors` is provided, the flat support threshold and quorum are
79
+ * also checked against that known editor count. For existing DAO spaces the
80
+ * current editor count may be unknown client-side, so callers can omit it and
81
+ * still get deterministic local validation for numeric shape, percentages, and
82
+ * duration lower bounds before the contract enforces editor-count limits.
55
83
  */
56
84
  export function validateVotingSettingsInput(settings, totalEditors) {
57
- if (settings.slowPathPercentageThreshold < 0 || settings.slowPathPercentageThreshold > 100) {
58
- return 'slowPathPercentageThreshold must be between 0 and 100';
85
+ if (!Number.isFinite(settings.partialPercentageSupportThreshold) ||
86
+ settings.partialPercentageSupportThreshold < 0 ||
87
+ settings.partialPercentageSupportThreshold > 100) {
88
+ return 'partialPercentageSupportThreshold must be between 0 and 100';
89
+ }
90
+ if (!Number.isFinite(settings.universalPercentageSupportThreshold) ||
91
+ settings.universalPercentageSupportThreshold < 0 ||
92
+ settings.universalPercentageSupportThreshold > 100) {
93
+ return 'universalPercentageSupportThreshold must be between 0 and 100';
59
94
  }
60
- if (settings.fastPathFlatThreshold < 0 || settings.fastPathFlatThreshold > totalEditors) {
61
- return `fastPathFlatThreshold must be between 0 and ${totalEditors} (number of initial editors)`;
95
+ if (!isNonNegativeInteger(settings.flatSupportThreshold)) {
96
+ return 'flatSupportThreshold must be a non-negative integer';
62
97
  }
63
- if (settings.quorum < 0 || settings.quorum > totalEditors) {
98
+ if (totalEditors !== undefined && settings.flatSupportThreshold > totalEditors) {
99
+ return `flatSupportThreshold must be between 0 and ${totalEditors} (number of initial editors)`;
100
+ }
101
+ if (!isNonNegativeInteger(settings.quorum)) {
102
+ return 'quorum must be a non-negative integer';
103
+ }
104
+ if (totalEditors !== undefined && settings.quorum > totalEditors) {
64
105
  return `quorum must be between 0 and ${totalEditors} (number of initial editors)`;
65
106
  }
66
- if (settings.durationInDays < MINIMUM_VOTING_DURATION_DAYS) {
107
+ if (!Number.isFinite(settings.durationInDays) || settings.durationInDays < MINIMUM_VOTING_DURATION_DAYS) {
67
108
  return `durationInDays must be at least ${MINIMUM_VOTING_DURATION_DAYS} days`;
68
109
  }
110
+ if (!Number.isFinite(settings.executionGracePeriodInDays) ||
111
+ settings.executionGracePeriodInDays < MINIMUM_EXECUTION_GRACE_PERIOD_DAYS) {
112
+ return `executionGracePeriodInDays must be at least ${MINIMUM_EXECUTION_GRACE_PERIOD_DAYS} days`;
113
+ }
69
114
  return null;
70
115
  }
71
116
  /**
@@ -91,7 +136,7 @@ export function getCreateDaoSpaceCalldata(args) {
91
136
  if (ipfsError) {
92
137
  throw new Error(ipfsError);
93
138
  }
94
- initialEditsContentUri = encodeAbiParameters([{ type: 'string' }], [args.initialEditsContentUri]);
139
+ initialEditsContentUri = toHex(args.initialEditsContentUri);
95
140
  }
96
141
  let initialTopicId = '0x00000000000000000000000000000000';
97
142
  if (args.initialTopicId) {
@@ -102,17 +147,19 @@ export function getCreateDaoSpaceCalldata(args) {
102
147
  functionName: 'createDAOSpaceProxy',
103
148
  args: [
104
149
  {
105
- slowPathPercentageThreshold: contractVotingSettings.slowPathPercentageThreshold,
106
- fastPathFlatThreshold: contractVotingSettings.fastPathFlatThreshold,
150
+ partialPercentageSupportThreshold: contractVotingSettings.partialPercentageSupportThreshold,
151
+ universalPercentageSupportThreshold: contractVotingSettings.universalPercentageSupportThreshold,
152
+ flatSupportThreshold: contractVotingSettings.flatSupportThreshold,
107
153
  quorum: contractVotingSettings.quorum,
108
154
  duration: contractVotingSettings.duration,
155
+ disableFastPathAccessForNewMembers: contractVotingSettings.disableFastPathAccessForNewMembers,
156
+ executionGracePeriod: contractVotingSettings.executionGracePeriod,
109
157
  },
110
158
  initialEditorSpaceIds,
111
159
  initialMemberSpaceIds,
112
160
  initialEditsContentUri,
113
161
  '0x',
114
162
  initialTopicId,
115
- '0x',
116
163
  ],
117
164
  });
118
165
  }
@@ -1 +1 @@
1
- {"version":3,"file":"get-create-dao-space-calldata.js","sourceRoot":"","sources":["../../../src/encodings/get-create-dao-space-calldata.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"get-create-dao-space-calldata.js","sourceRoot":"","sources":["../../../src/encodings/get-create-dao-space-calldata.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,KAAK,EAAE,MAAM,MAAM,CAAC;AAEjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEtD;;;GAGG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;AAEvC,iFAAiF;AACjF,MAAM,CAAC,MAAM,uBAAuB,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC;AAElD,sCAAsC;AACtC,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;AAExD,wFAAwF;AACxF,MAAM,CAAC,MAAM,8BAA8B,GAAG,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;AAE9D,6CAA6C;AAC7C,MAAM,CAAC,MAAM,mCAAmC,GAAG,CAAC,GAAG,EAAE,CAAC;AAmC1D;;GAEG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAwB;IAC1D,iCAAiC,EAAE,EAAE;IACrC,mCAAmC,EAAE,EAAE;IACvC,oBAAoB,EAAE,CAAC;IACvB,MAAM,EAAE,CAAC;IACT,cAAc,EAAE,CAAC;IACjB,kCAAkC,EAAE,IAAI;IACxC,0BAA0B,EAAE,EAAE;CAC/B,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,UAAkB;IAClD,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;AACvD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;AACjD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB,CAAC,KAA0B;IACjE,OAAO;QACL,iCAAiC,EAAE,iBAAiB,CAAC,KAAK,CAAC,iCAAiC,CAAC;QAC7F,mCAAmC,EAAE,iBAAiB,CAAC,KAAK,CAAC,mCAAmC,CAAC;QACjG,oBAAoB,EAAE,MAAM,CAAC,KAAK,CAAC,oBAAoB,CAAC;QACxD,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC;QAC5B,QAAQ,EAAE,aAAa,CAAC,KAAK,CAAC,cAAc,CAAC;QAC7C,kCAAkC,EAAE,KAAK,CAAC,kCAAkC;QAC5E,oBAAoB,EAAE,aAAa,CAAC,KAAK,CAAC,0BAA0B,CAAC;KACtE,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,GAAW;IACzC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC/B,OAAO,oCAAoC,CAAC;IAC9C,CAAC;IAED,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACzB,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO,6CAA6C,CAAC;IACvD,CAAC;IAED,MAAM,YAAY,GAAG,8BAA8B,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC9D,MAAM,YAAY,GAAG,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAElD,IAAI,CAAC,YAAY,IAAI,CAAC,YAAY,EAAE,CAAC;QACnC,OAAO,yCAAyC,CAAC;IACnD,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAa;IACzC,OAAO,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AAC/C,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,2BAA2B,CAAC,QAA6B,EAAE,YAAqB;IAC9F,IACE,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,iCAAiC,CAAC;QAC5D,QAAQ,CAAC,iCAAiC,GAAG,CAAC;QAC9C,QAAQ,CAAC,iCAAiC,GAAG,GAAG,EAChD,CAAC;QACD,OAAO,6DAA6D,CAAC;IACvE,CAAC;IACD,IACE,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,mCAAmC,CAAC;QAC9D,QAAQ,CAAC,mCAAmC,GAAG,CAAC;QAChD,QAAQ,CAAC,mCAAmC,GAAG,GAAG,EAClD,CAAC;QACD,OAAO,+DAA+D,CAAC;IACzE,CAAC;IACD,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,CAAC;QACzD,OAAO,qDAAqD,CAAC;IAC/D,CAAC;IACD,IAAI,YAAY,KAAK,SAAS,IAAI,QAAQ,CAAC,oBAAoB,GAAG,YAAY,EAAE,CAAC;QAC/E,OAAO,8CAA8C,YAAY,8BAA8B,CAAC;IAClG,CAAC;IACD,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3C,OAAO,uCAAuC,CAAC;IACjD,CAAC;IACD,IAAI,YAAY,KAAK,SAAS,IAAI,QAAQ,CAAC,MAAM,GAAG,YAAY,EAAE,CAAC;QACjE,OAAO,gCAAgC,YAAY,8BAA8B,CAAC;IACpF,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,QAAQ,CAAC,cAAc,GAAG,4BAA4B,EAAE,CAAC;QACxG,OAAO,mCAAmC,4BAA4B,OAAO,CAAC;IAChF,CAAC;IACD,IACE,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,0BAA0B,CAAC;QACrD,QAAQ,CAAC,0BAA0B,GAAG,mCAAmC,EACzE,CAAC;QACD,OAAO,+CAA+C,mCAAmC,OAAO,CAAC;IACnG,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAeD;;;;;GAKG;AACH,MAAM,UAAU,yBAAyB,CAAC,IAAkC;IAC1E,MAAM,qBAAqB,GAAG,IAAI,CAAC,qBAAqB,CAAC;IACzD,MAAM,qBAAqB,GAAG,IAAI,CAAC,qBAAqB,CAAC;IAEzD,IAAI,qBAAqB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACtE,CAAC;IAED,MAAM,eAAe,GAAG,2BAA2B,CAAC,IAAI,CAAC,cAAc,EAAE,qBAAqB,CAAC,MAAM,CAAC,CAAC;IACvG,IAAI,eAAe,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;IACnC,CAAC;IAED,MAAM,sBAAsB,GAAG,wBAAwB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAE7E,IAAI,sBAAsB,GAAkB,IAAI,CAAC;IACjD,IAAI,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAChC,MAAM,SAAS,GAAG,eAAe,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QAC/D,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;QAC7B,CAAC;QACD,sBAAsB,GAAG,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IAC9D,CAAC;IAED,IAAI,cAAc,GAAkB,oCAAoC,CAAC;IACzE,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;QACxB,cAAc,GAAG,KAAK,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC;IAChE,CAAC;IAED,OAAO,kBAAkB,CAAC;QACxB,GAAG,EAAE,kBAAkB;QACvB,YAAY,EAAE,qBAAqB;QACnC,IAAI,EAAE;YACJ;gBACE,iCAAiC,EAAE,sBAAsB,CAAC,iCAAiC;gBAC3F,mCAAmC,EAAE,sBAAsB,CAAC,mCAAmC;gBAC/F,oBAAoB,EAAE,sBAAsB,CAAC,oBAAoB;gBACjE,MAAM,EAAE,sBAAsB,CAAC,MAAM;gBACrC,QAAQ,EAAE,sBAAsB,CAAC,QAAQ;gBACzC,kCAAkC,EAAE,sBAAsB,CAAC,kCAAkC;gBAC7F,oBAAoB,EAAE,sBAAsB,CAAC,oBAAoB;aAClE;YACD,qBAAqB;YACrB,qBAAqB;YACrB,sBAAsB;YACtB,IAAI;YACJ,cAAc;SACf;KACF,CAAC,CAAC;AACL,CAAC"}
@@ -1,5 +1,7 @@
1
+ import { decodeFunctionData, hexToString } from 'viem';
1
2
  import { describe, expect, it } from 'vitest';
2
- import { daysToSeconds, getCreateDaoSpaceCalldata, MINIMUM_VOTING_DURATION, MINIMUM_VOTING_DURATION_DAYS, percentageToRatio, RATIO_BASE, toContractVotingSettings, validateIpfsUri, validateVotingSettingsInput, } from './get-create-dao-space-calldata.js';
3
+ import { DaoSpaceFactoryAbi } from '../abis/index.js';
4
+ import { DEFAULT_VOTING_SETTINGS, daysToSeconds, getCreateDaoSpaceCalldata, MINIMUM_EXECUTION_GRACE_PERIOD, MINIMUM_EXECUTION_GRACE_PERIOD_DAYS, MINIMUM_VOTING_DURATION, MINIMUM_VOTING_DURATION_DAYS, percentageToRatio, RATIO_BASE, toContractVotingSettings, validateIpfsUri, validateVotingSettingsInput, } from './get-create-dao-space-calldata.js';
3
5
  describe('percentageToRatio', () => {
4
6
  it('should convert 100% to RATIO_BASE', () => {
5
7
  expect(percentageToRatio(100)).toBe(RATIO_BASE);
@@ -19,7 +21,10 @@ describe('daysToSeconds', () => {
19
21
  expect(daysToSeconds(1)).toBe(BigInt(86400));
20
22
  });
21
23
  it('should convert 2 days to 172800 seconds', () => {
22
- expect(daysToSeconds(2)).toBe(MINIMUM_VOTING_DURATION);
24
+ expect(daysToSeconds(2)).toBe(BigInt(172800));
25
+ });
26
+ it('should expose the contracts v2 minimum duration', () => {
27
+ expect(MINIMUM_VOTING_DURATION).toBe(BigInt(60));
23
28
  });
24
29
  it('should handle fractional days', () => {
25
30
  expect(daysToSeconds(0.5)).toBe(BigInt(43200));
@@ -28,16 +33,22 @@ describe('daysToSeconds', () => {
28
33
  describe('toContractVotingSettings', () => {
29
34
  it('should convert user-friendly settings to contract format', () => {
30
35
  const input = {
31
- slowPathPercentageThreshold: 50,
32
- fastPathFlatThreshold: 3,
36
+ partialPercentageSupportThreshold: 50,
37
+ universalPercentageSupportThreshold: 90,
38
+ flatSupportThreshold: 3,
33
39
  quorum: 2,
34
40
  durationInDays: 7,
41
+ disableFastPathAccessForNewMembers: true,
42
+ executionGracePeriodInDays: 14,
35
43
  };
36
44
  const result = toContractVotingSettings(input);
37
- expect(result.slowPathPercentageThreshold).toBe(percentageToRatio(50));
38
- expect(result.fastPathFlatThreshold).toBe(BigInt(3));
45
+ expect(result.partialPercentageSupportThreshold).toBe(percentageToRatio(50));
46
+ expect(result.universalPercentageSupportThreshold).toBe(percentageToRatio(90));
47
+ expect(result.flatSupportThreshold).toBe(BigInt(3));
39
48
  expect(result.quorum).toBe(BigInt(2));
40
49
  expect(result.duration).toBe(daysToSeconds(7));
50
+ expect(result.disableFastPathAccessForNewMembers).toBe(true);
51
+ expect(result.executionGracePeriod).toBe(daysToSeconds(14));
41
52
  });
42
53
  });
43
54
  describe('validateIpfsUri', () => {
@@ -62,42 +73,64 @@ describe('validateIpfsUri', () => {
62
73
  });
63
74
  describe('validateVotingSettingsInput', () => {
64
75
  const validSettings = {
65
- slowPathPercentageThreshold: 50,
66
- fastPathFlatThreshold: 3,
76
+ partialPercentageSupportThreshold: 50,
77
+ universalPercentageSupportThreshold: 90,
78
+ flatSupportThreshold: 3,
67
79
  quorum: 2,
68
80
  durationInDays: 7,
81
+ disableFastPathAccessForNewMembers: true,
82
+ executionGracePeriodInDays: 14,
69
83
  };
70
84
  it('should return null for valid settings', () => {
71
85
  expect(validateVotingSettingsInput(validSettings, 5)).toBeNull();
72
86
  });
73
- it('should reject slowPathPercentageThreshold below 0', () => {
74
- const settings = { ...validSettings, slowPathPercentageThreshold: -1 };
75
- expect(validateVotingSettingsInput(settings, 5)).toBe('slowPathPercentageThreshold must be between 0 and 100');
87
+ it('should reject partialPercentageSupportThreshold below 0', () => {
88
+ const settings = { ...validSettings, partialPercentageSupportThreshold: -1 };
89
+ expect(validateVotingSettingsInput(settings, 5)).toBe('partialPercentageSupportThreshold must be between 0 and 100');
90
+ });
91
+ it('should reject partialPercentageSupportThreshold above 100', () => {
92
+ const settings = { ...validSettings, partialPercentageSupportThreshold: 101 };
93
+ expect(validateVotingSettingsInput(settings, 5)).toBe('partialPercentageSupportThreshold must be between 0 and 100');
76
94
  });
77
- it('should reject slowPathPercentageThreshold above 100', () => {
78
- const settings = { ...validSettings, slowPathPercentageThreshold: 101 };
79
- expect(validateVotingSettingsInput(settings, 5)).toBe('slowPathPercentageThreshold must be between 0 and 100');
95
+ it('should reject universalPercentageSupportThreshold above 100', () => {
96
+ const settings = { ...validSettings, universalPercentageSupportThreshold: 101 };
97
+ expect(validateVotingSettingsInput(settings, 5)).toBe('universalPercentageSupportThreshold must be between 0 and 100');
80
98
  });
81
- it('should reject fastPathFlatThreshold above total editors', () => {
82
- const settings = { ...validSettings, fastPathFlatThreshold: 10 };
83
- expect(validateVotingSettingsInput(settings, 5)).toBe('fastPathFlatThreshold must be between 0 and 5 (number of initial editors)');
99
+ it('should reject flatSupportThreshold above total editors', () => {
100
+ const settings = { ...validSettings, flatSupportThreshold: 10 };
101
+ expect(validateVotingSettingsInput(settings, 5)).toBe('flatSupportThreshold must be between 0 and 5 (number of initial editors)');
84
102
  });
85
103
  it('should reject quorum above total editors', () => {
86
104
  const settings = { ...validSettings, quorum: 10 };
87
105
  expect(validateVotingSettingsInput(settings, 5)).toBe('quorum must be between 0 and 5 (number of initial editors)');
88
106
  });
107
+ it('should allow omitted total editors for existing DAO settings validation', () => {
108
+ const settings = { ...validSettings, flatSupportThreshold: 10, quorum: 10 };
109
+ expect(validateVotingSettingsInput(settings)).toBeNull();
110
+ });
111
+ it('should reject non-integer flatSupportThreshold and quorum', () => {
112
+ expect(validateVotingSettingsInput({ ...validSettings, flatSupportThreshold: 1.5 })).toBe('flatSupportThreshold must be a non-negative integer');
113
+ expect(validateVotingSettingsInput({ ...validSettings, quorum: -1 })).toBe('quorum must be a non-negative integer');
114
+ });
89
115
  it('should reject durationInDays below minimum', () => {
90
- const settings = { ...validSettings, durationInDays: 1 };
116
+ const settings = { ...validSettings, durationInDays: MINIMUM_VOTING_DURATION_DAYS / 2 };
91
117
  expect(validateVotingSettingsInput(settings, 5)).toBe(`durationInDays must be at least ${MINIMUM_VOTING_DURATION_DAYS} days`);
92
118
  });
119
+ it('should reject executionGracePeriodInDays below minimum', () => {
120
+ const settings = { ...validSettings, executionGracePeriodInDays: MINIMUM_EXECUTION_GRACE_PERIOD_DAYS / 2 };
121
+ expect(validateVotingSettingsInput(settings, 5)).toBe(`executionGracePeriodInDays must be at least ${MINIMUM_EXECUTION_GRACE_PERIOD_DAYS} days`);
122
+ });
93
123
  });
94
124
  describe('getCreateDaoSpaceCalldata', () => {
95
125
  const validArgs = {
96
126
  votingSettings: {
97
- slowPathPercentageThreshold: 50,
98
- fastPathFlatThreshold: 2,
127
+ partialPercentageSupportThreshold: 50,
128
+ universalPercentageSupportThreshold: 90,
129
+ flatSupportThreshold: 2,
99
130
  quorum: 1,
100
131
  durationInDays: 7,
132
+ disableFastPathAccessForNewMembers: true,
133
+ executionGracePeriodInDays: 14,
101
134
  },
102
135
  initialEditorSpaceIds: [
103
136
  '0x12345678901234567890123456789012',
@@ -111,6 +144,24 @@ describe('getCreateDaoSpaceCalldata', () => {
111
144
  expect(calldata).toBeTypeOf('string');
112
145
  expect(calldata.startsWith('0x')).toBe(true);
113
146
  });
147
+ it('should encode the v2 six-argument factory call', () => {
148
+ const calldata = getCreateDaoSpaceCalldata(validArgs);
149
+ const decoded = decodeFunctionData({
150
+ abi: DaoSpaceFactoryAbi,
151
+ data: calldata,
152
+ });
153
+ expect(decoded.functionName).toBe('createDAOSpaceProxy');
154
+ expect(decoded.args).toHaveLength(6);
155
+ expect(decoded.args[0]).toMatchObject({
156
+ partialPercentageSupportThreshold: percentageToRatio(50),
157
+ universalPercentageSupportThreshold: percentageToRatio(90),
158
+ flatSupportThreshold: 2n,
159
+ quorum: 1n,
160
+ duration: daysToSeconds(7),
161
+ disableFastPathAccessForNewMembers: true,
162
+ executionGracePeriod: daysToSeconds(14),
163
+ });
164
+ });
114
165
  it('should throw if no initial editors provided', () => {
115
166
  const args = { ...validArgs, initialEditorSpaceIds: [] };
116
167
  expect(() => getCreateDaoSpaceCalldata(args)).toThrow('At least one initial editor space ID is required');
@@ -118,14 +169,14 @@ describe('getCreateDaoSpaceCalldata', () => {
118
169
  it('should throw if voting settings are invalid', () => {
119
170
  const args = {
120
171
  ...validArgs,
121
- votingSettings: { ...validArgs.votingSettings, slowPathPercentageThreshold: 150 },
172
+ votingSettings: { ...validArgs.votingSettings, partialPercentageSupportThreshold: 150 },
122
173
  };
123
- expect(() => getCreateDaoSpaceCalldata(args)).toThrow('slowPathPercentageThreshold must be between 0 and 100');
174
+ expect(() => getCreateDaoSpaceCalldata(args)).toThrow('partialPercentageSupportThreshold must be between 0 and 100');
124
175
  });
125
176
  it('should throw if duration is below minimum', () => {
126
177
  const args = {
127
178
  ...validArgs,
128
- votingSettings: { ...validArgs.votingSettings, durationInDays: 1 },
179
+ votingSettings: { ...validArgs.votingSettings, durationInDays: MINIMUM_VOTING_DURATION_DAYS / 2 },
129
180
  };
130
181
  expect(() => getCreateDaoSpaceCalldata(args)).toThrow(`durationInDays must be at least ${MINIMUM_VOTING_DURATION_DAYS} days`);
131
182
  });
@@ -155,6 +206,12 @@ describe('getCreateDaoSpaceCalldata', () => {
155
206
  // Calldata with URI should be longer than without
156
207
  const calldataWithoutUri = getCreateDaoSpaceCalldata(validArgs);
157
208
  expect(calldata.length).toBeGreaterThan(calldataWithoutUri.length);
209
+ const decoded = decodeFunctionData({
210
+ abi: DaoSpaceFactoryAbi,
211
+ data: calldata,
212
+ });
213
+ expect(hexToString(decoded.args[3])).toBe(args.initialEditsContentUri);
214
+ expect(decoded.args[4]).toBe('0x');
158
215
  });
159
216
  it('should generate different calldata for different URIs', () => {
160
217
  const calldata1 = getCreateDaoSpaceCalldata({
@@ -167,6 +224,16 @@ describe('getCreateDaoSpaceCalldata', () => {
167
224
  });
168
225
  expect(calldata1).not.toBe(calldata2);
169
226
  });
227
+ it('should provide conservative v2 default voting settings', () => {
228
+ const result = toContractVotingSettings(DEFAULT_VOTING_SETTINGS);
229
+ expect(result.partialPercentageSupportThreshold).toBe(percentageToRatio(50));
230
+ expect(result.universalPercentageSupportThreshold).toBe(percentageToRatio(90));
231
+ expect(result.flatSupportThreshold).toBe(1n);
232
+ expect(result.quorum).toBe(1n);
233
+ expect(result.duration).toBe(daysToSeconds(2));
234
+ expect(result.disableFastPathAccessForNewMembers).toBe(true);
235
+ expect(result.executionGracePeriod).toBeGreaterThan(MINIMUM_EXECUTION_GRACE_PERIOD);
236
+ });
170
237
  it('should throw for invalid IPFS URI', () => {
171
238
  const args = {
172
239
  ...validArgs,