@boostxyz/sdk 0.0.0-alpha.2 → 0.0.0-alpha.21

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 (271) hide show
  1. package/dist/Actions/Action.cjs +2 -1
  2. package/dist/Actions/Action.cjs.map +1 -0
  3. package/dist/Actions/Action.d.ts +1 -1
  4. package/dist/Actions/Action.d.ts.map +1 -1
  5. package/dist/Actions/Action.js +14 -12
  6. package/dist/Actions/Action.js.map +1 -0
  7. package/dist/Actions/ContractAction.d.ts +57 -14
  8. package/dist/Actions/ContractAction.d.ts.map +1 -1
  9. package/dist/Actions/ERC721MintAction.d.ts +50 -23
  10. package/dist/Actions/ERC721MintAction.d.ts.map +1 -1
  11. package/dist/Actions/EventAction.cjs +2 -1
  12. package/dist/Actions/EventAction.cjs.map +1 -0
  13. package/dist/Actions/EventAction.d.ts +405 -36
  14. package/dist/Actions/EventAction.d.ts.map +1 -1
  15. package/dist/Actions/EventAction.js +15 -209
  16. package/dist/Actions/EventAction.js.map +1 -0
  17. package/dist/AllowLists/AllowList.cjs +2 -1
  18. package/dist/AllowLists/AllowList.cjs.map +1 -0
  19. package/dist/AllowLists/AllowList.d.ts +6 -5
  20. package/dist/AllowLists/AllowList.d.ts.map +1 -1
  21. package/dist/AllowLists/AllowList.js +46 -22
  22. package/dist/AllowLists/AllowList.js.map +1 -0
  23. package/dist/AllowLists/OpenAllowList.d.ts +423 -0
  24. package/dist/AllowLists/OpenAllowList.d.ts.map +1 -0
  25. package/dist/AllowLists/SimpleAllowList.cjs +2 -1
  26. package/dist/AllowLists/SimpleAllowList.cjs.map +1 -0
  27. package/dist/AllowLists/SimpleAllowList.d.ts +124 -40
  28. package/dist/AllowLists/SimpleAllowList.d.ts.map +1 -1
  29. package/dist/AllowLists/SimpleAllowList.js +76 -76
  30. package/dist/AllowLists/SimpleAllowList.js.map +1 -0
  31. package/dist/AllowLists/SimpleDenyList.cjs +2 -1
  32. package/dist/AllowLists/SimpleDenyList.cjs.map +1 -0
  33. package/dist/AllowLists/SimpleDenyList.d.ts +234 -13
  34. package/dist/AllowLists/SimpleDenyList.d.ts.map +1 -1
  35. package/dist/AllowLists/SimpleDenyList.js +12 -200
  36. package/dist/AllowLists/SimpleDenyList.js.map +1 -0
  37. package/dist/Auth/Auth.cjs +1 -0
  38. package/dist/Auth/Auth.cjs.map +1 -0
  39. package/dist/Auth/Auth.js +1 -0
  40. package/dist/Auth/Auth.js.map +1 -0
  41. package/dist/Auth/PassthroughAuth.cjs +2 -1
  42. package/dist/Auth/PassthroughAuth.cjs.map +1 -0
  43. package/dist/Auth/PassthroughAuth.js +5 -4
  44. package/dist/Auth/PassthroughAuth.js.map +1 -0
  45. package/dist/Boost.cjs +2 -1
  46. package/dist/Boost.cjs.map +1 -0
  47. package/dist/Boost.d.ts +105 -14
  48. package/dist/Boost.d.ts.map +1 -1
  49. package/dist/Boost.js +138 -5
  50. package/dist/Boost.js.map +1 -0
  51. package/dist/BoostCore-DolmDuXW.cjs +3 -0
  52. package/dist/BoostCore-DolmDuXW.cjs.map +1 -0
  53. package/dist/BoostCore-Z97KVu4V.js +1448 -0
  54. package/dist/BoostCore-Z97KVu4V.js.map +1 -0
  55. package/dist/BoostCore.cjs +2 -2
  56. package/dist/BoostCore.cjs.map +1 -0
  57. package/dist/BoostCore.d.ts +788 -79
  58. package/dist/BoostCore.d.ts.map +1 -1
  59. package/dist/BoostCore.js +30 -1103
  60. package/dist/BoostCore.js.map +1 -0
  61. package/dist/BoostRegistry.cjs +2 -1
  62. package/dist/BoostRegistry.cjs.map +1 -0
  63. package/dist/BoostRegistry.d.ts +95 -26
  64. package/dist/BoostRegistry.d.ts.map +1 -1
  65. package/dist/BoostRegistry.js +183 -89
  66. package/dist/BoostRegistry.js.map +1 -0
  67. package/dist/Budgets/Budget.cjs +2 -1
  68. package/dist/Budgets/Budget.cjs.map +1 -0
  69. package/dist/Budgets/Budget.d.ts +1 -1
  70. package/dist/Budgets/Budget.d.ts.map +1 -1
  71. package/dist/Budgets/Budget.js +15 -13
  72. package/dist/Budgets/Budget.js.map +1 -0
  73. package/dist/Budgets/ManagedBudget.cjs +2 -1
  74. package/dist/Budgets/ManagedBudget.cjs.map +1 -0
  75. package/dist/Budgets/ManagedBudget.d.ts +112 -192
  76. package/dist/Budgets/ManagedBudget.d.ts.map +1 -1
  77. package/dist/Budgets/ManagedBudget.js +91 -291
  78. package/dist/Budgets/ManagedBudget.js.map +1 -0
  79. package/dist/Budgets/VestingBudget.d.ts +277 -91
  80. package/dist/Budgets/VestingBudget.d.ts.map +1 -1
  81. package/dist/Deployable/Contract.cjs +2 -1
  82. package/dist/Deployable/Contract.cjs.map +1 -0
  83. package/dist/Deployable/Contract.d.ts +4 -5
  84. package/dist/Deployable/Contract.d.ts.map +1 -1
  85. package/dist/Deployable/Contract.js +7 -8
  86. package/dist/Deployable/Contract.js.map +1 -0
  87. package/dist/Deployable/Deployable.cjs +1 -0
  88. package/dist/Deployable/Deployable.cjs.map +1 -0
  89. package/dist/Deployable/Deployable.d.ts +9 -3
  90. package/dist/Deployable/Deployable.d.ts.map +1 -1
  91. package/dist/Deployable/Deployable.js +10 -5
  92. package/dist/Deployable/Deployable.js.map +1 -0
  93. package/dist/Deployable/DeployableTarget.cjs +2 -1
  94. package/dist/Deployable/DeployableTarget.cjs.map +1 -0
  95. package/dist/Deployable/DeployableTarget.d.ts +16 -15
  96. package/dist/Deployable/DeployableTarget.d.ts.map +1 -1
  97. package/dist/Deployable/DeployableTarget.js +49 -42
  98. package/dist/Deployable/DeployableTarget.js.map +1 -0
  99. package/dist/Deployable/DeployableTargetWithRBAC.cjs +2 -0
  100. package/dist/Deployable/DeployableTargetWithRBAC.cjs.map +1 -0
  101. package/dist/Deployable/DeployableTargetWithRBAC.d.ts +179 -0
  102. package/dist/Deployable/DeployableTargetWithRBAC.d.ts.map +1 -0
  103. package/dist/Deployable/DeployableTargetWithRBAC.js +222 -0
  104. package/dist/Deployable/DeployableTargetWithRBAC.js.map +1 -0
  105. package/dist/EventAction-CBKzuNoN.cjs +2 -0
  106. package/dist/EventAction-CBKzuNoN.cjs.map +1 -0
  107. package/dist/EventAction-DWuuc_Qy.js +1528 -0
  108. package/dist/EventAction-DWuuc_Qy.js.map +1 -0
  109. package/dist/Incentive-BxzEtN26.js +298 -0
  110. package/dist/Incentive-BxzEtN26.js.map +1 -0
  111. package/dist/Incentive-CrF3-ayL.cjs +2 -0
  112. package/dist/Incentive-CrF3-ayL.cjs.map +1 -0
  113. package/dist/Incentives/AllowListIncentive.cjs +2 -1
  114. package/dist/Incentives/AllowListIncentive.cjs.map +1 -0
  115. package/dist/Incentives/AllowListIncentive.d.ts +65 -21
  116. package/dist/Incentives/AllowListIncentive.d.ts.map +1 -1
  117. package/dist/Incentives/AllowListIncentive.js +52 -36
  118. package/dist/Incentives/AllowListIncentive.js.map +1 -0
  119. package/dist/Incentives/CGDAIncentive.cjs +2 -1
  120. package/dist/Incentives/CGDAIncentive.cjs.map +1 -0
  121. package/dist/Incentives/CGDAIncentive.d.ts +315 -26
  122. package/dist/Incentives/CGDAIncentive.d.ts.map +1 -1
  123. package/dist/Incentives/CGDAIncentive.js +64 -39
  124. package/dist/Incentives/CGDAIncentive.js.map +1 -0
  125. package/dist/Incentives/ERC1155Incentive.d.ts +291 -43
  126. package/dist/Incentives/ERC1155Incentive.d.ts.map +1 -1
  127. package/dist/Incentives/ERC20Incentive.cjs +2 -1
  128. package/dist/Incentives/ERC20Incentive.cjs.map +1 -0
  129. package/dist/Incentives/ERC20Incentive.d.ts +270 -33
  130. package/dist/Incentives/ERC20Incentive.d.ts.map +1 -1
  131. package/dist/Incentives/ERC20Incentive.js +69 -46
  132. package/dist/Incentives/ERC20Incentive.js.map +1 -0
  133. package/dist/{Budgets/SimpleBudget.d.ts → Incentives/ERC20VariableCriteriaIncentive.d.ts} +338 -421
  134. package/dist/Incentives/ERC20VariableCriteriaIncentive.d.ts.map +1 -0
  135. package/dist/Incentives/ERC20VariableIncentive.d.ts +262 -32
  136. package/dist/Incentives/ERC20VariableIncentive.d.ts.map +1 -1
  137. package/dist/Incentives/Incentive.cjs +2 -1
  138. package/dist/Incentives/Incentive.cjs.map +1 -0
  139. package/dist/Incentives/Incentive.d.ts +5 -8
  140. package/dist/Incentives/Incentive.d.ts.map +1 -1
  141. package/dist/Incentives/Incentive.js +17 -278
  142. package/dist/Incentives/Incentive.js.map +1 -0
  143. package/dist/Incentives/PointsIncentive.cjs +2 -1
  144. package/dist/Incentives/PointsIncentive.cjs.map +1 -0
  145. package/dist/Incentives/PointsIncentive.d.ts +81 -23
  146. package/dist/Incentives/PointsIncentive.d.ts.map +1 -1
  147. package/dist/Incentives/PointsIncentive.js +57 -36
  148. package/dist/Incentives/PointsIncentive.js.map +1 -0
  149. package/dist/SimpleDenyList-BUR17Tt1.cjs +2 -0
  150. package/dist/SimpleDenyList-BUR17Tt1.cjs.map +1 -0
  151. package/dist/SimpleDenyList-CGaWjuld.js +132 -0
  152. package/dist/SimpleDenyList-CGaWjuld.js.map +1 -0
  153. package/dist/Validators/SignerValidator.cjs +2 -1
  154. package/dist/Validators/SignerValidator.cjs.map +1 -0
  155. package/dist/Validators/SignerValidator.d.ts +310 -17
  156. package/dist/Validators/SignerValidator.d.ts.map +1 -1
  157. package/dist/Validators/SignerValidator.js +165 -36
  158. package/dist/Validators/SignerValidator.js.map +1 -0
  159. package/dist/Validators/Validator.cjs +2 -1
  160. package/dist/Validators/Validator.cjs.map +1 -0
  161. package/dist/Validators/Validator.d.ts +2 -2
  162. package/dist/Validators/Validator.d.ts.map +1 -1
  163. package/dist/Validators/Validator.js +10 -8
  164. package/dist/Validators/Validator.js.map +1 -0
  165. package/dist/claiming.cjs +2 -0
  166. package/dist/claiming.cjs.map +1 -0
  167. package/dist/claiming.d.ts +43 -0
  168. package/dist/claiming.d.ts.map +1 -0
  169. package/dist/claiming.js +17 -0
  170. package/dist/claiming.js.map +1 -0
  171. package/dist/componentInterfaces-BBCFkrZv.js +14 -0
  172. package/dist/componentInterfaces-BBCFkrZv.js.map +1 -0
  173. package/dist/componentInterfaces-DRI_dQ-P.cjs +2 -0
  174. package/dist/componentInterfaces-DRI_dQ-P.cjs.map +1 -0
  175. package/dist/deployments-DVXioW2i.cjs +2 -0
  176. package/dist/deployments-DVXioW2i.cjs.map +1 -0
  177. package/dist/deployments-oykLv3_Z.js +43 -0
  178. package/dist/deployments-oykLv3_Z.js.map +1 -0
  179. package/dist/deployments.json +44 -0
  180. package/dist/errors.cjs +2 -1
  181. package/dist/errors.cjs.map +1 -0
  182. package/dist/errors.d.ts +421 -1
  183. package/dist/errors.d.ts.map +1 -1
  184. package/dist/errors.js +297 -39
  185. package/dist/errors.js.map +1 -0
  186. package/dist/{generated-x_abr3Yv.js → generated-CKt2yCQd.js} +3143 -3002
  187. package/dist/generated-CKt2yCQd.js.map +1 -0
  188. package/dist/generated-CyTNlOwM.cjs +3 -0
  189. package/dist/generated-CyTNlOwM.cjs.map +1 -0
  190. package/dist/index.cjs +2 -1
  191. package/dist/index.cjs.map +1 -0
  192. package/dist/index.d.ts +10 -9
  193. package/dist/index.d.ts.map +1 -1
  194. package/dist/index.js +144 -1353
  195. package/dist/index.js.map +1 -0
  196. package/dist/transfers.cjs +2 -0
  197. package/dist/transfers.cjs.map +1 -0
  198. package/dist/transfers.d.ts +198 -0
  199. package/dist/transfers.d.ts.map +1 -0
  200. package/dist/transfers.js +84 -0
  201. package/dist/transfers.js.map +1 -0
  202. package/dist/utils.cjs +2 -1
  203. package/dist/utils.cjs.map +1 -0
  204. package/dist/utils.d.ts +26 -1350
  205. package/dist/utils.d.ts.map +1 -1
  206. package/dist/utils.js +38 -636
  207. package/dist/utils.js.map +1 -0
  208. package/package.json +37 -11
  209. package/src/Actions/Action.test.ts +79 -0
  210. package/src/Actions/Action.ts +61 -0
  211. package/src/Actions/ContractAction.test.ts +197 -0
  212. package/src/Actions/ContractAction.ts +300 -0
  213. package/src/Actions/ERC721MintAction.test.ts +112 -0
  214. package/src/Actions/ERC721MintAction.ts +291 -0
  215. package/src/Actions/EventAction.test.ts +787 -0
  216. package/src/Actions/EventAction.ts +1218 -0
  217. package/src/AllowLists/AllowList.test.ts +64 -0
  218. package/src/AllowLists/AllowList.ts +62 -0
  219. package/src/AllowLists/OpenAllowList.test.ts +40 -0
  220. package/src/AllowLists/OpenAllowList.ts +45 -0
  221. package/src/AllowLists/SimpleAllowList.test.ts +52 -0
  222. package/src/AllowLists/SimpleAllowList.ts +262 -0
  223. package/src/AllowLists/SimpleDenyList.test.ts +52 -0
  224. package/src/AllowLists/SimpleDenyList.ts +250 -0
  225. package/src/Auth/Auth.ts +11 -0
  226. package/src/Auth/PassthroughAuth.test.ts +12 -0
  227. package/src/Auth/PassthroughAuth.ts +80 -0
  228. package/src/Boost.ts +287 -0
  229. package/src/BoostCore.test.ts +894 -0
  230. package/src/BoostCore.ts +1438 -0
  231. package/src/BoostRegistry.test.ts +53 -0
  232. package/src/BoostRegistry.ts +588 -0
  233. package/src/Budgets/Budget.test.ts +27 -0
  234. package/src/Budgets/Budget.ts +60 -0
  235. package/src/Budgets/ManagedBudget.test.ts +217 -0
  236. package/src/Budgets/ManagedBudget.ts +534 -0
  237. package/src/Budgets/VestingBudget.test.ts +123 -0
  238. package/src/Budgets/VestingBudget.ts +530 -0
  239. package/src/Deployable/Contract.ts +228 -0
  240. package/src/Deployable/Deployable.ts +250 -0
  241. package/src/Deployable/DeployableTarget.ts +234 -0
  242. package/src/Deployable/DeployableTargetWithRBAC.ts +323 -0
  243. package/src/Incentives/AllowListIncentive.test.ts +143 -0
  244. package/src/Incentives/AllowListIncentive.ts +336 -0
  245. package/src/Incentives/CGDAIncentive.test.ts +135 -0
  246. package/src/Incentives/CGDAIncentive.ts +476 -0
  247. package/src/Incentives/ERC1155Incentive.test.ts +87 -0
  248. package/src/Incentives/ERC1155Incentive.ts +465 -0
  249. package/src/Incentives/ERC20Incentive.test.ts +133 -0
  250. package/src/Incentives/ERC20Incentive.ts +490 -0
  251. package/src/Incentives/ERC20VariableCriteriaIncentive.test.ts +184 -0
  252. package/src/Incentives/ERC20VariableCriteriaIncentive.ts +309 -0
  253. package/src/Incentives/ERC20VariableIncentive.test.ts +139 -0
  254. package/src/Incentives/ERC20VariableIncentive.ts +428 -0
  255. package/src/Incentives/Incentive.test.ts +95 -0
  256. package/src/Incentives/Incentive.ts +86 -0
  257. package/src/Incentives/PointsIncentive.test.ts +138 -0
  258. package/src/Incentives/PointsIncentive.ts +367 -0
  259. package/src/Validators/SignerValidator.test.ts +159 -0
  260. package/src/Validators/SignerValidator.ts +683 -0
  261. package/src/Validators/Validator.test.ts +21 -0
  262. package/src/Validators/Validator.ts +55 -0
  263. package/src/claiming.ts +56 -0
  264. package/src/errors.ts +866 -0
  265. package/src/index.test.ts +122 -0
  266. package/src/index.ts +58 -0
  267. package/src/transfers.ts +284 -0
  268. package/src/utils.test.ts +44 -0
  269. package/src/utils.ts +247 -0
  270. package/dist/Budgets/SimpleBudget.d.ts.map +0 -1
  271. package/dist/generated-BaaleHW-.cjs +0 -2
@@ -0,0 +1,323 @@
1
+ import {
2
+ rbacAbi,
3
+ readRbacHasAllRoles,
4
+ readRbacHasAnyRole,
5
+ readRbacIsAuthorized,
6
+ readRbacRolesOf,
7
+ simulateRbacGrantRoles,
8
+ simulateRbacRevokeRoles,
9
+ simulateRbacSetAuthorized,
10
+ writeRbacGrantRoles,
11
+ writeRbacRevokeRoles,
12
+ writeRbacSetAuthorized,
13
+ } from '@boostxyz/evm';
14
+ import type { Abi, Address, ContractEventName } from 'viem';
15
+ import { DeployableTarget } from '../Deployable/DeployableTarget';
16
+ import type { GenericLog, ReadParams, WriteParams } from '../utils';
17
+ export { rbacAbi };
18
+
19
+ /**
20
+ * Enum representing available roles for use with the `RBAC` authorization scheme.
21
+ * `MANAGER` has lowest level of write permissions, for specific implementations, see Budgets and ALlowLists
22
+ * `ADMIN` can additionally manage authorized users on the contract.
23
+ *
24
+ * @export
25
+ * @type {{ readonly MANAGER: 1n; readonly ADMIN_ROLE: 2n; }}
26
+ * @enum {bigint}
27
+ */
28
+ export enum Roles {
29
+ //@ts-expect-error ts doesn't like bigint enum values
30
+ MANAGER = 1n,
31
+ //@ts-expect-error ts doesn't like bigint enum values
32
+ ADMIN = 2n,
33
+ }
34
+
35
+ /**
36
+ * A generic `viem.Log` event with support for `Rbac` event types.
37
+ *
38
+ * @export
39
+ * @typedef {RBACLog}
40
+ * @template {ContractEventName<typeof rbacAbi>} [event=ContractEventName<
41
+ * typeof rbacAbi
42
+ * >]
43
+ */
44
+ export type RBACLog<
45
+ event extends ContractEventName<typeof rbacAbi> = ContractEventName<
46
+ typeof rbacAbi
47
+ >,
48
+ > = GenericLog<typeof rbacAbi, event>;
49
+
50
+ /**
51
+ * A minimal RBAC implementation that offers MANAGER and ADMIN roles, and
52
+ * Budgets and allowlists support this auth scheme
53
+ *
54
+ * @export
55
+ * @class DeployableTargetWithRBAC
56
+ * @typedef {DeployableTargetWithRBAC}
57
+ * @extends {DeployableTarget<RbacPayload>}
58
+ */
59
+ export class DeployableTargetWithRBAC<
60
+ Payload,
61
+ ABI extends Abi,
62
+ > extends DeployableTarget<Payload, ABI> {
63
+ /**
64
+ * Set the authorized status of the given accounts
65
+ * The mechanism for managing authorization is left to the implementing contract
66
+ *
67
+ * @public
68
+ * @async
69
+ * @param {Address[]} addresses - The accounts to authorize or deauthorize
70
+ * @param {boolean[]} allowed - The authorization status for the given accounts
71
+ * @param {?WriteParams} [params]
72
+ * @returns {Promise<void>}
73
+ */
74
+ public async setAuthorized(
75
+ addresses: Address[],
76
+ allowed: boolean[],
77
+ params?: WriteParams<typeof rbacAbi, 'setAuthorized'>,
78
+ ) {
79
+ return await this.awaitResult(
80
+ this.setAuthorizedRaw(addresses, allowed, params),
81
+ );
82
+ }
83
+
84
+ /**
85
+ * Set the authorized status of the given accounts
86
+ * The mechanism for managing authorization is left to the implementing contract
87
+ *
88
+ * @public
89
+ * @async
90
+ * @param {Address[]} addresses - The accounts to authorize or deauthorize
91
+ * @param {boolean[]} allowed - The authorization status for the given accounts
92
+ * @param {?WriteParams} [params]
93
+ * @returns {Promise<void>}
94
+ */
95
+ public async setAuthorizedRaw(
96
+ addresses: Address[],
97
+ allowed: boolean[],
98
+ params?: WriteParams<typeof rbacAbi, 'setAuthorized'>,
99
+ ) {
100
+ const { request, result } = await simulateRbacSetAuthorized(this._config, {
101
+ address: this.assertValidAddress(),
102
+ args: [addresses, allowed],
103
+ ...this.optionallyAttachAccount(),
104
+ // biome-ignore lint/suspicious/noExplicitAny: Accept any shape of valid wagmi/viem parameters, wagmi does the same thing internally
105
+ ...(params as any),
106
+ });
107
+ const hash = await writeRbacSetAuthorized(this._config, request);
108
+ return { hash, result };
109
+ }
110
+
111
+ /**
112
+ * Grant many accounts permissions on the rbac.
113
+ *
114
+ * @example
115
+ * ```ts
116
+ * await rbac.grantRoles(['0xfoo', '0xbar], [RbacRoles.MANAGER, RbacRoles.ADMIN])
117
+ * ```
118
+ * @public
119
+ * @async
120
+ * @param {Address[]} addresses
121
+ * @param {RbacRoles[]} roles
122
+ * @param {?WriteParams} [params]
123
+ * @returns {Promise<void>}
124
+ */
125
+ public async grantRoles(
126
+ addresses: Address[],
127
+ roles: Roles[],
128
+ params?: WriteParams<typeof rbacAbi, 'grantRoles'>,
129
+ ) {
130
+ return await this.awaitResult(this.grantRolesRaw(addresses, roles, params));
131
+ }
132
+
133
+ /**
134
+ * Grant many accounts permissions on the rbac.
135
+ *
136
+ * @example
137
+ * ```ts
138
+ * await rbac.grantRoles(['0xfoo', '0xbar], [Roles.MANAGER, Roles.ADMIN])
139
+ *
140
+ * @public
141
+ * @async
142
+ * @param {Address[]} addresses
143
+ * @param {RbacRoles[]} roles
144
+ * @param {?WriteParams} [params]
145
+ * @returns {Promise<{ hash: `0x${string}`; result: void; }>}
146
+ */
147
+ public async grantRolesRaw(
148
+ addresses: Address[],
149
+ roles: Roles[],
150
+ params?: WriteParams<typeof rbacAbi, 'grantRoles'>,
151
+ ) {
152
+ const { request, result } = await simulateRbacGrantRoles(this._config, {
153
+ address: this.assertValidAddress(),
154
+ args: [addresses, roles],
155
+ ...this.optionallyAttachAccount(),
156
+ // biome-ignore lint/suspicious/noExplicitAny: Accept any shape of valid wagmi/viem parameters, wagmi does the same thing internally
157
+ ...(params as any),
158
+ });
159
+ const hash = await writeRbacGrantRoles(
160
+ this._config,
161
+ // biome-ignore lint/suspicious/noExplicitAny: negligible low level lack of type intersection
162
+ request as any,
163
+ );
164
+ return { hash, result };
165
+ }
166
+
167
+ /**
168
+ * Revoke many accounts' permissions on the rbac.
169
+ *
170
+ * @example
171
+ * ```ts
172
+ * await rbac.revokeRoles(['0xfoo', '0xbar], [RbacRoles.MANAGER, RbacRoles.ADMIN])
173
+ *
174
+ * @public
175
+ * @async
176
+ * @param {Address[]} addresses
177
+ * @param {RbacRoles[]} roles
178
+ * @param {?WriteParams} [params]
179
+ * @returns {Promise<void>}
180
+ */
181
+ public async revokeRoles(
182
+ addresses: Address[],
183
+ roles: Roles[],
184
+ params?: WriteParams<typeof rbacAbi, 'revokeRoles'>,
185
+ ) {
186
+ return await this.awaitResult(
187
+ this.revokeRolesRaw(addresses, roles, params),
188
+ );
189
+ }
190
+
191
+ /**
192
+ * Revoke many accounts' permissions on the rbac.
193
+ *
194
+ * @example
195
+ * ```ts
196
+ * await rbac.revokeRoles(['0xfoo', '0xbar], [RbacRoles.MANAGER, RbacRoles.ADMIN])
197
+ * @public
198
+ * @async
199
+ * @param {Address[]} addresses
200
+ * @param {RbacRoles[]} roles
201
+ * @param {?WriteParams} [params]
202
+ * @returns {Promise<{ hash: `0x${string}`; result: void; }>}
203
+ */
204
+ public async revokeRolesRaw(
205
+ addresses: Address[],
206
+ roles: Roles[],
207
+ params?: WriteParams<typeof rbacAbi, 'revokeRoles'>,
208
+ ) {
209
+ const { request, result } = await simulateRbacRevokeRoles(this._config, {
210
+ address: this.assertValidAddress(),
211
+ args: [addresses, roles],
212
+ ...this.optionallyAttachAccount(),
213
+ // biome-ignore lint/suspicious/noExplicitAny: Accept any shape of valid wagmi/viem parameters, wagmi does the same thing internally
214
+ ...(params as any),
215
+ });
216
+ const hash = await writeRbacRevokeRoles(
217
+ this._config,
218
+ // biome-ignore lint/suspicious/noExplicitAny: negligible low level lack of type intersection
219
+ request as any,
220
+ );
221
+ return { hash, result };
222
+ }
223
+
224
+ /**
225
+ * Return an array of the roles assigned to the given account.
226
+ * @example
227
+ * ```ts
228
+ * (await rbac.rolesOf(0xfoo)).includes(RbacRoles.ADMIN)
229
+ * @public
230
+ * @param {Address} account
231
+ * @param {?ReadParams} [params]
232
+ * @returns {Promise<Array<RbacRoles>>}
233
+ */
234
+ public async rolesOf(
235
+ account: Address,
236
+ params?: ReadParams<typeof rbacAbi, 'rolesOf'>,
237
+ ) {
238
+ const roles = await readRbacRolesOf(this._config, {
239
+ address: this.assertValidAddress(),
240
+ args: [account],
241
+ ...this.optionallyAttachAccount(),
242
+ // biome-ignore lint/suspicious/noExplicitAny: Accept any shape of valid wagmi/viem parameters, wagmi does the same thing internally
243
+ ...(params as any),
244
+ });
245
+ return ([Roles.MANAGER, Roles.ADMIN] as unknown as Array<bigint>).filter(
246
+ (role) => (roles & role) === role,
247
+ ) as unknown as Roles[];
248
+ }
249
+
250
+ /**
251
+ * Returns whether given account has any of the provided roles bitmap.
252
+ *
253
+ * @example
254
+ * ```ts
255
+ * await rbac.hasAnyRole(0xfoo, RbacRoles.ADMIN | RbacRoles.MANAGER)
256
+ * @public
257
+ * @param {Address} account
258
+ * @param {RbacRoles} roles
259
+ * @param {?ReadParams} [params]
260
+ * @returns {Promise<boolean>}
261
+ */
262
+ public hasAnyRole(
263
+ account: Address,
264
+ roles: Roles,
265
+ params?: ReadParams<typeof rbacAbi, 'hasAnyRole'>,
266
+ ) {
267
+ return readRbacHasAnyRole(this._config, {
268
+ address: this.assertValidAddress(),
269
+ args: [account, roles],
270
+ ...this.optionallyAttachAccount(),
271
+ // biome-ignore lint/suspicious/noExplicitAny: Accept any shape of valid wagmi/viem parameters, wagmi does the same thing internally
272
+ ...(params as any),
273
+ });
274
+ }
275
+
276
+ /**
277
+ * Returns whether given account has all of the provided roles bitmap.
278
+ *
279
+ * @example
280
+ * ```ts
281
+ * await rbac.hasAllRoles(0xfoo, RbacRoles.ADMIN & RbacRoles.MANAGER)
282
+ *
283
+ * @public
284
+ * @param {Address} account
285
+ * @param {RbacRoles} roles
286
+ * @param {?ReadParams} [params]
287
+ * @returns {Promise<boolean>}
288
+ */
289
+ public hasAllRoles(
290
+ account: Address,
291
+ roles: Roles,
292
+ params?: ReadParams<typeof rbacAbi, 'hasAllRoles'>,
293
+ ) {
294
+ return readRbacHasAllRoles(this._config, {
295
+ address: this.assertValidAddress(),
296
+ args: [account, roles],
297
+ ...this.optionallyAttachAccount(),
298
+ // biome-ignore lint/suspicious/noExplicitAny: Accept any shape of valid wagmi/viem parameters, wagmi does the same thing internally
299
+ ...(params as any),
300
+ });
301
+ }
302
+
303
+ /**
304
+ * Check if the given account is authorized to use the rbac
305
+ *
306
+ * @public
307
+ * @param {Address} account
308
+ * @param {?ReadParams} [params]
309
+ * @returns {Promise<boolean>} - True if the account is authorized
310
+ */
311
+ public isAuthorized(
312
+ account: Address,
313
+ params?: ReadParams<typeof rbacAbi, 'isAuthorized'>,
314
+ ) {
315
+ return readRbacIsAuthorized(this._config, {
316
+ address: this.assertValidAddress(),
317
+ args: [account],
318
+ ...this.optionallyAttachAccount(),
319
+ // biome-ignore lint/suspicious/noExplicitAny: Accept any shape of valid wagmi/viem parameters, wagmi does the same thing internally
320
+ ...(params as any),
321
+ });
322
+ }
323
+ }
@@ -0,0 +1,143 @@
1
+ import { loadFixture } from '@nomicfoundation/hardhat-network-helpers';
2
+ import { isAddress, pad, parseEther, zeroAddress } from 'viem';
3
+ import { beforeAll, describe, expect, test } from 'vitest';
4
+ import { accounts } from '@boostxyz/test/accounts';
5
+ import {
6
+ type Fixtures,
7
+ defaultOptions,
8
+ deployFixtures,
9
+ freshBoost,
10
+ } from '@boostxyz/test/helpers';
11
+ import { LIST_MANAGER_ROLE } from '../AllowLists/SimpleAllowList';
12
+ import { PointsIncentive } from './PointsIncentive';
13
+
14
+ let fixtures: Fixtures;
15
+
16
+ function freshAllowList(fixtures: Fixtures) {
17
+ return function freshAllowList() {
18
+ return fixtures.registry.initialize(
19
+ crypto.randomUUID(),
20
+ fixtures.core.SimpleAllowList({
21
+ owner: defaultOptions.account.address,
22
+ allowed: [],
23
+ }),
24
+ );
25
+ };
26
+ }
27
+
28
+ describe('AllowListIncentive', () => {
29
+ beforeAll(async () => {
30
+ fixtures = await loadFixture(deployFixtures(defaultOptions));
31
+ });
32
+
33
+ test('can successfully be deployed', async () => {
34
+ const action = new PointsIncentive(defaultOptions, {
35
+ venue: zeroAddress,
36
+ selector: '0xdeadb33f',
37
+ reward: 1n,
38
+ limit: 1n,
39
+ });
40
+ await action.deploy();
41
+ expect(isAddress(action.assertValidAddress())).toBe(true);
42
+ });
43
+
44
+ test('can claim', async () => {
45
+ // biome-ignore lint/style/noNonNullAssertion: we know this is defined
46
+ const referrer = accounts.at(1)?.account!;
47
+ // biome-ignore lint/style/noNonNullAssertion: we know this is defined
48
+ const trustedSigner = accounts.at(0)!;
49
+ const allowList = await loadFixture(freshAllowList(fixtures));
50
+ const allowListIncentive = new fixtures.bases.AllowListIncentive(
51
+ defaultOptions,
52
+ {
53
+ allowList: allowList.assertValidAddress(),
54
+ limit: 3n,
55
+ },
56
+ );
57
+ const boost = await freshBoost(fixtures, {
58
+ incentives: [allowListIncentive],
59
+ });
60
+ await allowList.grantRoles(
61
+ allowListIncentive.assertValidAddress(),
62
+ LIST_MANAGER_ROLE,
63
+ );
64
+
65
+ const claimant = trustedSigner.account;
66
+ const incentiveData = pad('0xdef456232173821931823712381232131391321934');
67
+ console.log(claimant);
68
+
69
+ const incentiveQuantity = 1;
70
+ const claimDataPayload = await boost.validator.encodeClaimData({
71
+ signer: trustedSigner,
72
+ incentiveData,
73
+ chainId: defaultOptions.config.chains[0].id,
74
+ incentiveQuantity,
75
+ claimant,
76
+ boostId: boost.id,
77
+ });
78
+
79
+ //await boost.validator.setValidatorCaller(boost.assertValidAddress());
80
+ await fixtures.core.claimIncentive(
81
+ boost.id,
82
+ 0n,
83
+ referrer,
84
+ claimDataPayload,
85
+ { value: parseEther('0.000075'), account: trustedSigner.privateKey },
86
+ );
87
+ expect(await allowList.isAllowed(trustedSigner.account)).toBe(true);
88
+ });
89
+
90
+ test('cannot claim twice', async () => {
91
+ // biome-ignore lint/style/noNonNullAssertion: we know this is defined
92
+ const referrer = accounts.at(1)?.account!;
93
+ // biome-ignore lint/style/noNonNullAssertion: we know this is defined
94
+ const trustedSigner = accounts.at(0)!;
95
+ const allowList = await loadFixture(freshAllowList(fixtures));
96
+ const allowListIncentive = new fixtures.bases.AllowListIncentive(
97
+ defaultOptions,
98
+ {
99
+ allowList: allowList.assertValidAddress(),
100
+ limit: 3n,
101
+ },
102
+ );
103
+ const boost = await freshBoost(fixtures, {
104
+ incentives: [allowListIncentive],
105
+ });
106
+ await allowList.grantRoles(
107
+ allowListIncentive.assertValidAddress(),
108
+ LIST_MANAGER_ROLE,
109
+ );
110
+ const incentiveQuantity = 1;
111
+ const claimant = trustedSigner.account;
112
+ const incentiveData = pad('0xdef456232173821931823712381232131391321934');
113
+ console.log(claimant);
114
+
115
+ const claimDataPayload = await boost.validator.encodeClaimData({
116
+ signer: trustedSigner,
117
+ incentiveData,
118
+ chainId: defaultOptions.config.chains[0].id,
119
+ incentiveQuantity,
120
+ claimant,
121
+ boostId: boost.id,
122
+ });
123
+
124
+ await fixtures.core.claimIncentive(
125
+ boost.id,
126
+ 0n,
127
+ referrer,
128
+ claimDataPayload,
129
+ { value: parseEther('0.000075'), account: trustedSigner.privateKey },
130
+ );
131
+ try {
132
+ await fixtures.core.claimIncentive(
133
+ boost.id,
134
+ 0n,
135
+ referrer,
136
+ claimDataPayload,
137
+ { value: parseEther('0.000075'), account: trustedSigner.privateKey },
138
+ );
139
+ } catch (e) {
140
+ expect(e).toBeInstanceOf(Error);
141
+ }
142
+ });
143
+ });