@boostxyz/sdk 6.0.0 → 6.0.1
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/dist/Actions/Action.cjs +1 -1
- package/dist/Actions/Action.js +2 -2
- package/dist/Actions/EventAction.cjs +1 -1
- package/dist/Actions/EventAction.cjs.map +1 -1
- package/dist/Actions/EventAction.js +40 -40
- package/dist/Actions/EventAction.js.map +1 -1
- package/dist/AllowLists/AllowList.cjs +1 -1
- package/dist/AllowLists/AllowList.js +3 -3
- package/dist/AllowLists/SimpleAllowList.cjs +1 -1
- package/dist/AllowLists/SimpleAllowList.cjs.map +1 -1
- package/dist/AllowLists/SimpleAllowList.d.ts +2 -2
- package/dist/AllowLists/SimpleAllowList.d.ts.map +1 -1
- package/dist/AllowLists/SimpleAllowList.js +3 -3
- package/dist/AllowLists/SimpleAllowList.js.map +1 -1
- package/dist/AllowLists/SimpleDenyList.cjs +1 -1
- package/dist/AllowLists/SimpleDenyList.js +3 -3
- package/dist/Auth/PassthroughAuth.cjs +1 -1
- package/dist/Auth/PassthroughAuth.js +1 -1
- package/dist/BoostCore.cjs +2 -2
- package/dist/BoostCore.cjs.map +1 -1
- package/dist/BoostCore.d.ts +14 -0
- package/dist/BoostCore.d.ts.map +1 -1
- package/dist/BoostCore.js +119 -101
- package/dist/BoostCore.js.map +1 -1
- package/dist/BoostRegistry.cjs +1 -1
- package/dist/BoostRegistry.js +2 -2
- package/dist/Budget-CsqSI4NH.cjs +2 -0
- package/dist/Budget-CsqSI4NH.cjs.map +1 -0
- package/dist/Budget-bMiAGF8s.js +922 -0
- package/dist/Budget-bMiAGF8s.js.map +1 -0
- package/dist/Budgets/Budget.cjs +1 -1
- package/dist/Budgets/Budget.d.ts +5 -4
- package/dist/Budgets/Budget.d.ts.map +1 -1
- package/dist/Budgets/Budget.js +3 -3
- package/dist/Budgets/ManagedBudget.cjs +1 -1
- package/dist/Budgets/ManagedBudget.js +2 -2
- package/dist/Budgets/ManagedBudgetWithFeesV2.d.ts +1331 -0
- package/dist/Budgets/ManagedBudgetWithFeesV2.d.ts.map +1 -0
- package/dist/Deployable/DeployableTarget.cjs +1 -1
- package/dist/Deployable/DeployableTarget.js +1 -1
- package/dist/Deployable/DeployableTargetWithRBAC.cjs +1 -1
- package/dist/Deployable/DeployableTargetWithRBAC.js +2 -2
- package/dist/{Incentive-Boviez4z.js → Incentive-DZLG6T1-.js} +27 -27
- package/dist/{Incentive-Boviez4z.js.map → Incentive-DZLG6T1-.js.map} +1 -1
- package/dist/{Incentive-wM4zizTH.cjs → Incentive-DvNdIJ_x.cjs} +2 -2
- package/dist/{Incentive-wM4zizTH.cjs.map → Incentive-DvNdIJ_x.cjs.map} +1 -1
- package/dist/Incentives/AllowListIncentive.cjs +1 -1
- package/dist/Incentives/AllowListIncentive.js +3 -3
- package/dist/Incentives/CGDAIncentive.cjs +1 -1
- package/dist/Incentives/CGDAIncentive.js +2 -2
- package/dist/Incentives/ERC20Incentive.cjs +1 -1
- package/dist/Incentives/ERC20Incentive.js +2 -2
- package/dist/Incentives/ERC20VariableCriteriaIncentive.cjs +1 -1
- package/dist/Incentives/ERC20VariableCriteriaIncentive.js +2 -2
- package/dist/Incentives/ERC20VariableIncentive.cjs +1 -1
- package/dist/Incentives/ERC20VariableIncentive.js +2 -2
- package/dist/Incentives/Incentive.cjs +1 -1
- package/dist/Incentives/Incentive.js +3 -3
- package/dist/Incentives/PointsIncentive.cjs +1 -1
- package/dist/Incentives/PointsIncentive.js +2 -2
- package/dist/{SimpleDenyList-Cybtz7AK.cjs → SimpleDenyList-BAIrFBAW.cjs} +2 -2
- package/dist/{SimpleDenyList-Cybtz7AK.cjs.map → SimpleDenyList-BAIrFBAW.cjs.map} +1 -1
- package/dist/{SimpleDenyList-CW4RwwRw.js → SimpleDenyList-C734XLxt.js} +11 -11
- package/dist/{SimpleDenyList-CW4RwwRw.js.map → SimpleDenyList-C734XLxt.js.map} +1 -1
- package/dist/Validators/LimitedSignerValidator.cjs +1 -1
- package/dist/Validators/LimitedSignerValidator.cjs.map +1 -1
- package/dist/Validators/LimitedSignerValidator.d.ts +1 -1
- package/dist/Validators/LimitedSignerValidator.d.ts.map +1 -1
- package/dist/Validators/LimitedSignerValidator.js +2 -2
- package/dist/Validators/LimitedSignerValidator.js.map +1 -1
- package/dist/Validators/SignerValidator.cjs +1 -1
- package/dist/Validators/SignerValidator.cjs.map +1 -1
- package/dist/Validators/SignerValidator.d.ts +1 -1
- package/dist/Validators/SignerValidator.d.ts.map +1 -1
- package/dist/Validators/SignerValidator.js +2 -2
- package/dist/Validators/SignerValidator.js.map +1 -1
- package/dist/Validators/Validator.cjs +1 -1
- package/dist/Validators/Validator.js +2 -2
- package/dist/componentInterfaces-5Ezh3Pvx.js +19 -0
- package/dist/componentInterfaces-5Ezh3Pvx.js.map +1 -0
- package/dist/componentInterfaces-Cm4Zfn1v.cjs +2 -0
- package/dist/componentInterfaces-Cm4Zfn1v.cjs.map +1 -0
- package/dist/{deployments-DqjtOTUr.js → deployments-3RHH-eW7.js} +3 -3
- package/dist/{deployments-DqjtOTUr.js.map → deployments-3RHH-eW7.js.map} +1 -1
- package/dist/errors.cjs +1 -1
- package/dist/errors.cjs.map +1 -1
- package/dist/errors.js +1 -1
- package/dist/errors.js.map +1 -1
- package/dist/generated-BPiHi7W2.cjs +3 -0
- package/dist/{generated-DgXPUgXl.cjs.map → generated-BPiHi7W2.cjs.map} +1 -1
- package/dist/{generated-pJZHmRCK.js → generated-CElkFqkY.js} +1315 -682
- package/dist/{generated-pJZHmRCK.js.map → generated-CElkFqkY.js.map} +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +155 -152
- package/package.json +2 -2
- package/src/AllowLists/SimpleAllowList.ts +2 -2
- package/src/BoostCore.ts +36 -4
- package/src/Budgets/Budget.ts +8 -2
- package/src/Budgets/ManagedBudgetWithFees.test.ts +0 -1
- package/src/Budgets/ManagedBudgetWithFeesV2.test.ts +327 -0
- package/src/Budgets/ManagedBudgetWithFeesV2.ts +713 -0
- package/src/Validators/LimitedSignerValidator.ts +1 -1
- package/src/Validators/SignerValidator.ts +1 -1
- package/src/errors.ts +1 -1
- package/src/index.ts +1 -0
- package/dist/Budget-DMbfdTom.cjs +0 -2
- package/dist/Budget-DMbfdTom.cjs.map +0 -1
- package/dist/Budget-DO6sGTIR.js +0 -463
- package/dist/Budget-DO6sGTIR.js.map +0 -1
- package/dist/componentInterfaces-D7r9xJmt.cjs +0 -2
- package/dist/componentInterfaces-D7r9xJmt.cjs.map +0 -1
- package/dist/componentInterfaces-PR3ijhgZ.js +0 -18
- package/dist/componentInterfaces-PR3ijhgZ.js.map +0 -1
- package/dist/generated-DgXPUgXl.cjs +0 -3
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
import { writeMockErc1155SetApprovalForAll } from "@boostxyz/evm";
|
|
2
|
+
import { loadFixture } from "@nomicfoundation/hardhat-network-helpers";
|
|
3
|
+
import { isAddress, parseEther, zeroAddress } from "viem";
|
|
4
|
+
import { beforeAll, beforeEach, describe, expect, test } from "vitest";
|
|
5
|
+
import type { MockERC20 } from "@boostxyz/test/MockERC20";
|
|
6
|
+
import type { MockERC1155 } from "@boostxyz/test/MockERC1155";
|
|
7
|
+
import { accounts } from "@boostxyz/test/accounts";
|
|
8
|
+
import {
|
|
9
|
+
type Fixtures,
|
|
10
|
+
defaultOptions,
|
|
11
|
+
deployFixtures,
|
|
12
|
+
freshManagedBudgetWithFeesV2,
|
|
13
|
+
fundErc20,
|
|
14
|
+
fundErc1155,
|
|
15
|
+
freshBoost,
|
|
16
|
+
fundManagedBudgetWithFeesV2,
|
|
17
|
+
} from "@boostxyz/test/helpers";
|
|
18
|
+
import { testAccount } from "@boostxyz/test/viem";
|
|
19
|
+
import { ManagedBudgetWithFeesV2 } from "./ManagedBudgetWithFeesV2";
|
|
20
|
+
import { Roles } from "../Deployable/DeployableTargetWithRBAC";
|
|
21
|
+
import { StrategyType } from "../claiming";
|
|
22
|
+
|
|
23
|
+
let fixtures: Fixtures,
|
|
24
|
+
budget: ManagedBudgetWithFeesV2,
|
|
25
|
+
erc20: MockERC20,
|
|
26
|
+
erc1155: MockERC1155;
|
|
27
|
+
|
|
28
|
+
beforeAll(async () => {
|
|
29
|
+
fixtures = await loadFixture(deployFixtures(defaultOptions));
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
describe("ManagedBudgetWithFeesV2", () => {
|
|
33
|
+
test("can successfully be deployed", async () => {
|
|
34
|
+
const action = new ManagedBudgetWithFeesV2(defaultOptions, {
|
|
35
|
+
owner: testAccount.address,
|
|
36
|
+
authorized: [],
|
|
37
|
+
roles: [],
|
|
38
|
+
managementFee: 100n,
|
|
39
|
+
});
|
|
40
|
+
await action.deploy();
|
|
41
|
+
expect(isAddress(action.assertValidAddress())).toBe(true);
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
test("can set ManagementFee", async () => {
|
|
45
|
+
const budget = await loadFixture(
|
|
46
|
+
freshManagedBudgetWithFeesV2(defaultOptions, fixtures),
|
|
47
|
+
);
|
|
48
|
+
await budget.setManagementFee(5000n);
|
|
49
|
+
const fee = await budget.managementFee();
|
|
50
|
+
expect(fee).toBe(5000n);
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
test("can grant manager role to many users", async () => {
|
|
55
|
+
const budget = await loadFixture(
|
|
56
|
+
freshManagedBudgetWithFeesV2(defaultOptions, fixtures),
|
|
57
|
+
);
|
|
58
|
+
const one = accounts[1].account;
|
|
59
|
+
const two = accounts[2].account;
|
|
60
|
+
await budget.setAuthorized([one, two], [true, true]);
|
|
61
|
+
expect(await budget.hasAllRoles(one, Roles.ADMIN)).toBe(false);
|
|
62
|
+
expect(await budget.hasAllRoles(one, Roles.MANAGER)).toBe(true);
|
|
63
|
+
expect(await budget.hasAllRoles(two, Roles.MANAGER)).toBe(true);
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
test("can grant role", async () => {
|
|
67
|
+
const budget = await loadFixture(
|
|
68
|
+
freshManagedBudgetWithFeesV2(defaultOptions, fixtures),
|
|
69
|
+
);
|
|
70
|
+
const manager = accounts[1].account;
|
|
71
|
+
await budget.grantRoles(manager, Roles.MANAGER);
|
|
72
|
+
expect(await budget.hasAllRoles(manager, Roles.ADMIN)).toBe(false);
|
|
73
|
+
expect(await budget.hasAllRoles(manager, Roles.MANAGER)).toBe(true);
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
test("can revoke role", async () => {
|
|
77
|
+
const budget = await loadFixture(
|
|
78
|
+
freshManagedBudgetWithFeesV2(defaultOptions, fixtures),
|
|
79
|
+
);
|
|
80
|
+
const manager = accounts[1].account;
|
|
81
|
+
await budget.grantRoles(manager, Roles.MANAGER);
|
|
82
|
+
await budget.grantRoles(manager, Roles.ADMIN);
|
|
83
|
+
await budget.revokeRoles(manager, Roles.MANAGER);
|
|
84
|
+
expect(await budget.hasAllRoles(manager, Roles.MANAGER)).toBe(false);
|
|
85
|
+
expect(await budget.hasAllRoles(manager, Roles.ADMIN)).toBe(true);
|
|
86
|
+
await budget.revokeRoles(manager, Roles.ADMIN);
|
|
87
|
+
expect(await budget.hasAllRoles(manager, Roles.ADMIN)).toBe(false);
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
test("can grant many roles", async () => {
|
|
91
|
+
const budget = await loadFixture(
|
|
92
|
+
freshManagedBudgetWithFeesV2(defaultOptions, fixtures),
|
|
93
|
+
);
|
|
94
|
+
const admin = accounts[1].account;
|
|
95
|
+
const manager = accounts[2].account;
|
|
96
|
+
await budget.grantManyRoles([admin, manager], [Roles.ADMIN, Roles.MANAGER]);
|
|
97
|
+
expect(await budget.hasAllRoles(admin, Roles.ADMIN)).toBe(true);
|
|
98
|
+
expect(await budget.hasAllRoles(manager, Roles.MANAGER)).toBe(true);
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
test("can revoke many roles", async () => {
|
|
102
|
+
const budget = await loadFixture(
|
|
103
|
+
freshManagedBudgetWithFeesV2(defaultOptions, fixtures),
|
|
104
|
+
);
|
|
105
|
+
const admin = accounts[1].account;
|
|
106
|
+
const manager = accounts[2].account;
|
|
107
|
+
await budget.grantManyRoles([admin, manager], [Roles.ADMIN, Roles.MANAGER]);
|
|
108
|
+
await budget.revokeManyRoles(
|
|
109
|
+
[admin, manager],
|
|
110
|
+
[Roles.ADMIN, Roles.MANAGER],
|
|
111
|
+
);
|
|
112
|
+
expect(await budget.hasAllRoles(admin, Roles.ADMIN)).toBe(false);
|
|
113
|
+
expect(await budget.hasAllRoles(manager, Roles.MANAGER)).toBe(false);
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
test("can be owned", async () => {
|
|
117
|
+
const budget = await loadFixture(
|
|
118
|
+
freshManagedBudgetWithFeesV2(defaultOptions, fixtures),
|
|
119
|
+
);
|
|
120
|
+
expect(await budget.owner()).toBe(defaultOptions.account.address);
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
test("can have authorized users", async () => {
|
|
124
|
+
const budget = await loadFixture(
|
|
125
|
+
freshManagedBudgetWithFeesV2(defaultOptions, fixtures),
|
|
126
|
+
);
|
|
127
|
+
expect(await budget.isAuthorized(defaultOptions.account.address)).toBe(
|
|
128
|
+
true,
|
|
129
|
+
);
|
|
130
|
+
expect(await budget.isAuthorized(zeroAddress)).toBe(false);
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
test("can have no initial balance", async () => {
|
|
134
|
+
const budget = await loadFixture(
|
|
135
|
+
freshManagedBudgetWithFeesV2(defaultOptions, fixtures),
|
|
136
|
+
);
|
|
137
|
+
expect(await budget.available()).toBe(0n);
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
describe("can allocate", () => {
|
|
141
|
+
beforeEach(async () => {
|
|
142
|
+
budget = await loadFixture(freshManagedBudgetWithFeesV2(defaultOptions, fixtures));
|
|
143
|
+
erc20 = await loadFixture(fundErc20(defaultOptions));
|
|
144
|
+
erc1155 = await loadFixture(fundErc1155(defaultOptions));
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
test("native assets", async () => {
|
|
148
|
+
await budget.allocate(
|
|
149
|
+
{
|
|
150
|
+
amount: parseEther("1.0"),
|
|
151
|
+
asset: zeroAddress,
|
|
152
|
+
target: defaultOptions.account.address,
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
value: parseEther("1.0"),
|
|
156
|
+
},
|
|
157
|
+
);
|
|
158
|
+
expect(await budget.available()).toBe(parseEther("1.0"));
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
test("erc20", async () => {
|
|
162
|
+
await erc20.approve(budget.assertValidAddress(), parseEther("110"));
|
|
163
|
+
await budget.allocate({
|
|
164
|
+
amount: parseEther("110"),
|
|
165
|
+
asset: erc20.assertValidAddress(),
|
|
166
|
+
target: defaultOptions.account.address,
|
|
167
|
+
});
|
|
168
|
+
expect(await budget.available(erc20.assertValidAddress())).toBe(
|
|
169
|
+
parseEther("110"),
|
|
170
|
+
);
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
test("erc1155", async () => {
|
|
174
|
+
await writeMockErc1155SetApprovalForAll(defaultOptions.config, {
|
|
175
|
+
args: [budget.assertValidAddress(), true],
|
|
176
|
+
address: erc1155.assertValidAddress(),
|
|
177
|
+
account: defaultOptions.account,
|
|
178
|
+
});
|
|
179
|
+
await budget.allocate({
|
|
180
|
+
tokenId: 1n,
|
|
181
|
+
amount: 110n,
|
|
182
|
+
asset: erc1155.assertValidAddress(),
|
|
183
|
+
target: defaultOptions.account.address,
|
|
184
|
+
});
|
|
185
|
+
expect(await budget.available(erc1155.assertValidAddress(), 1n)).toBe(
|
|
186
|
+
110n,
|
|
187
|
+
);
|
|
188
|
+
});
|
|
189
|
+
});
|
|
190
|
+
|
|
191
|
+
describe("can disburse", () => {
|
|
192
|
+
beforeEach(async () => {
|
|
193
|
+
const budgetFixtures = await loadFixture(
|
|
194
|
+
fundManagedBudgetWithFeesV2(defaultOptions, fixtures),
|
|
195
|
+
);
|
|
196
|
+
budget = budgetFixtures.budget as ManagedBudgetWithFeesV2;
|
|
197
|
+
erc20 = budgetFixtures.erc20;
|
|
198
|
+
erc1155 = budgetFixtures.erc1155;
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
test("to a fee-compatible incentive", async () => {
|
|
202
|
+
|
|
203
|
+
const reward = 1_000_000_000n;
|
|
204
|
+
const fee = await budget.managementFee();
|
|
205
|
+
const erc20Incentive = fixtures.core.ERC20Incentive({
|
|
206
|
+
asset: erc20.assertValidAddress(),
|
|
207
|
+
strategy: StrategyType.POOL,
|
|
208
|
+
reward: 1_000_000_000n,
|
|
209
|
+
limit: 1n,
|
|
210
|
+
manager: budget.assertValidAddress(),
|
|
211
|
+
});
|
|
212
|
+
await budget.grantRoles(fixtures.core.assertValidAddress(), Roles.MANAGER);
|
|
213
|
+
const boost = await freshBoost(fixtures, {
|
|
214
|
+
budget: budget,
|
|
215
|
+
incentives: [erc20Incentive],
|
|
216
|
+
});
|
|
217
|
+
|
|
218
|
+
const trustedSigner = accounts.at(0)!;
|
|
219
|
+
const claimant = trustedSigner.account;
|
|
220
|
+
const incentiveData = erc20Incentive.buildClaimData();
|
|
221
|
+
const claimDataPayload = await boost.validator.encodeClaimData({
|
|
222
|
+
signer: trustedSigner,
|
|
223
|
+
incentiveData,
|
|
224
|
+
chainId: defaultOptions.config.chains[0].id,
|
|
225
|
+
incentiveQuantity: boost.incentives.length,
|
|
226
|
+
claimant,
|
|
227
|
+
boostId: boost.id,
|
|
228
|
+
});
|
|
229
|
+
await fixtures.core.claimIncentive(
|
|
230
|
+
boost.id,
|
|
231
|
+
0n,
|
|
232
|
+
trustedSigner.account,
|
|
233
|
+
claimDataPayload,
|
|
234
|
+
);
|
|
235
|
+
let originalBalance = await erc20.balanceOf(accounts[0].account);
|
|
236
|
+
|
|
237
|
+
await budget.payManagementFee(boost.id, 0n);
|
|
238
|
+
let balance = await erc20.balanceOf(accounts[0].account);
|
|
239
|
+
|
|
240
|
+
expect(balance - originalBalance).toBe(reward*fee/10_000n);
|
|
241
|
+
})
|
|
242
|
+
|
|
243
|
+
test("to a fee-compatible incentive overloaded", async () => {
|
|
244
|
+
|
|
245
|
+
const reward = 1_000_000_000n;
|
|
246
|
+
const fee = await budget.managementFee();
|
|
247
|
+
const erc20Incentive = fixtures.core.ERC20Incentive({
|
|
248
|
+
asset: erc20.assertValidAddress(),
|
|
249
|
+
strategy: StrategyType.POOL,
|
|
250
|
+
reward: 1_000_000_000n,
|
|
251
|
+
limit: 1n,
|
|
252
|
+
manager: budget.assertValidAddress(),
|
|
253
|
+
});
|
|
254
|
+
await budget.grantRoles(fixtures.core.assertValidAddress(), Roles.MANAGER);
|
|
255
|
+
const boost = await freshBoost(fixtures, {
|
|
256
|
+
budget: budget,
|
|
257
|
+
incentives: [erc20Incentive],
|
|
258
|
+
});
|
|
259
|
+
|
|
260
|
+
const trustedSigner = accounts.at(0)!;
|
|
261
|
+
const claimant = trustedSigner.account;
|
|
262
|
+
const incentiveData = erc20Incentive.buildClaimData();
|
|
263
|
+
const claimDataPayload = await boost.validator.encodeClaimData({
|
|
264
|
+
signer: trustedSigner,
|
|
265
|
+
incentiveData,
|
|
266
|
+
chainId: defaultOptions.config.chains[0].id,
|
|
267
|
+
incentiveQuantity: boost.incentives.length,
|
|
268
|
+
claimant,
|
|
269
|
+
boostId: boost.id,
|
|
270
|
+
});
|
|
271
|
+
await fixtures.core.claimIncentive(
|
|
272
|
+
boost.id,
|
|
273
|
+
0n,
|
|
274
|
+
trustedSigner.account,
|
|
275
|
+
claimDataPayload,
|
|
276
|
+
);
|
|
277
|
+
let originalBalance = await erc20.balanceOf(accounts[0].account);
|
|
278
|
+
|
|
279
|
+
await budget.payManagementFee(boost.id, 0n, fixtures.core.assertValidAddress());
|
|
280
|
+
let balance = await erc20.balanceOf(accounts[0].account);
|
|
281
|
+
|
|
282
|
+
expect(balance - originalBalance).toBe(reward*fee/10_000n);
|
|
283
|
+
})
|
|
284
|
+
|
|
285
|
+
test("native assets", async () => {
|
|
286
|
+
const originalAmount = await budget.available();
|
|
287
|
+
const disbursalAmount = parseEther("0.5");
|
|
288
|
+
const fee = await budget.managementFee();
|
|
289
|
+
await budget.disburse({
|
|
290
|
+
amount: disbursalAmount,
|
|
291
|
+
asset: zeroAddress,
|
|
292
|
+
target: defaultOptions.account.address,
|
|
293
|
+
});
|
|
294
|
+
|
|
295
|
+
|
|
296
|
+
expect(await budget.available()).toBe(originalAmount - disbursalAmount - disbursalAmount*fee / 10_000n);
|
|
297
|
+
});
|
|
298
|
+
|
|
299
|
+
test("erc20 assets", async () => {
|
|
300
|
+
const originalAmount = await budget.available(erc20.assertValidAddress());
|
|
301
|
+
const disbursalAmount = parseEther("10");
|
|
302
|
+
const fee = await budget.managementFee();
|
|
303
|
+
await budget.disburse({
|
|
304
|
+
amount: disbursalAmount,
|
|
305
|
+
asset: erc20.assertValidAddress(),
|
|
306
|
+
target: defaultOptions.account.address,
|
|
307
|
+
});
|
|
308
|
+
|
|
309
|
+
expect(await budget.available(erc20.assertValidAddress())).toBe(
|
|
310
|
+
originalAmount - disbursalAmount - disbursalAmount*fee / 10_000n
|
|
311
|
+
);
|
|
312
|
+
});
|
|
313
|
+
|
|
314
|
+
test("erc1155 assets", async () => {
|
|
315
|
+
await budget.disburse({
|
|
316
|
+
tokenId: 1n,
|
|
317
|
+
amount: 5n,
|
|
318
|
+
asset: erc1155.assertValidAddress(),
|
|
319
|
+
target: defaultOptions.account.address,
|
|
320
|
+
});
|
|
321
|
+
|
|
322
|
+
expect(await budget.available(erc1155.assertValidAddress(), 1n)).to.equal(
|
|
323
|
+
105n,
|
|
324
|
+
);
|
|
325
|
+
});
|
|
326
|
+
});
|
|
327
|
+
});
|