Skip to content
This repository was archived by the owner on Aug 21, 2023. It is now read-only.

Commit ac431c9

Browse files
authored
Merge pull request #56 from bugout-dev/approve-for-pool-minting
Approve for pool minting
2 parents c2f6779 + 565544c commit ac431c9

3 files changed

Lines changed: 130 additions & 5 deletions

File tree

contracts/terminus/TerminusFacet.sol

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,12 +49,15 @@ contract TerminusFacet is ERC1155WithTerminusStorage {
4949
address[] memory toAddresses,
5050
uint256[] memory amounts
5151
) public {
52-
address operator = _msgSender();
53-
LibTerminus.enforcePoolIsController(id, operator);
5452
require(
5553
toAddresses.length == amounts.length,
5654
"TerminusFacet: _poolMintBatch -- toAddresses and amounts length mismatch"
5755
);
56+
address operator = _msgSender();
57+
require(
58+
isApprovedForPool(id, operator),
59+
"TerminusFacet: poolMintBatch -- caller is neither owner nor approved"
60+
);
5861

5962
LibTerminus.TerminusStorage storage ts = LibTerminus.terminusStorage();
6063

@@ -250,7 +253,10 @@ contract TerminusFacet is ERC1155WithTerminusStorage {
250253
uint256 amount,
251254
bytes memory data
252255
) external {
253-
LibTerminus.enforcePoolIsController(poolID, msg.sender);
256+
require(
257+
isApprovedForPool(poolID, msg.sender),
258+
"TerminusFacet: mint -- caller is neither owner nor approved"
259+
);
254260
_mint(to, poolID, amount, data);
255261
}
256262

@@ -261,7 +267,10 @@ contract TerminusFacet is ERC1155WithTerminusStorage {
261267
bytes memory data
262268
) external {
263269
for (uint256 i = 0; i < poolIDs.length; i++) {
264-
LibTerminus.enforcePoolIsController(poolIDs[i], _msgSender());
270+
require(
271+
isApprovedForPool(poolIDs[i], msg.sender),
272+
"TerminusFacet: mintBatch -- caller is neither owner nor approved"
273+
);
265274
}
266275
_mintBatch(to, poolIDs, amounts, data);
267276
}

dao/test_terminus.py

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -273,6 +273,64 @@ def test_mint_batch(self):
273273
supply = self.diamond_terminus.terminus_pool_supply(pool_id)
274274
self.assertEqual(supply, 1)
275275

276+
def test_mint_batch_with_approval(self):
277+
pool_id = self.diamond_terminus.total_pools()
278+
279+
self.assertFalse(
280+
self.diamond_terminus.is_approved_for_pool(pool_id, accounts[3])
281+
)
282+
self.assertFalse(
283+
self.diamond_terminus.is_approved_for_pool(pool_id - 1, accounts[3])
284+
)
285+
balances_before = [
286+
self.diamond_terminus.balance_of(accounts[2].address, pool_id),
287+
self.diamond_terminus.balance_of(accounts[2].address, pool_id - 1),
288+
]
289+
supply_before = [
290+
self.diamond_terminus.terminus_pool_supply(pool_id),
291+
self.diamond_terminus.terminus_pool_supply(pool_id - 1),
292+
]
293+
self.diamond_terminus.approve_for_pool(
294+
pool_id, accounts[3], {"from": accounts[1]}
295+
)
296+
with self.assertRaises(Exception):
297+
self.diamond_terminus.mint_batch(
298+
accounts[2].address,
299+
pool_i_ds=[pool_id, pool_id - 1],
300+
amounts=[1, 1],
301+
data=b"",
302+
transaction_config={"from": accounts[3]},
303+
)
304+
305+
self.diamond_terminus.approve_for_pool(
306+
pool_id - 1, accounts[3], {"from": accounts[1]}
307+
)
308+
309+
self.diamond_terminus.mint_batch(
310+
accounts[2].address,
311+
pool_i_ds=[pool_id, pool_id - 1],
312+
amounts=[1, 1],
313+
data=b"",
314+
transaction_config={"from": accounts[3]},
315+
)
316+
317+
self.assertEqual(
318+
self.diamond_terminus.balance_of(accounts[2].address, pool_id),
319+
balances_before[0] + 1,
320+
)
321+
self.assertEqual(
322+
self.diamond_terminus.balance_of(accounts[2].address, pool_id - 1),
323+
balances_before[1] + 1,
324+
)
325+
326+
self.assertEqual(
327+
self.diamond_terminus.terminus_pool_supply(pool_id), supply_before[0] + 1
328+
)
329+
self.assertEqual(
330+
self.diamond_terminus.terminus_pool_supply(pool_id - 1),
331+
supply_before[1] + 1,
332+
)
333+
276334
def test_mint_batch_fails_if_it_exceeds_capacity(self):
277335
pool_id = self.diamond_terminus.total_pools()
278336
with self.assertRaises(Exception):
@@ -350,6 +408,64 @@ def test_pool_mint_batch_as_unauthorized_third_party(self):
350408
final_balance = self.diamond_terminus.balance_of(account.address, pool_id)
351409
self.assertEqual(final_balance, initial_balances[i])
352410

411+
def test_pool_mint_with_pool_approval(self):
412+
self.diamond_terminus.create_pool_v1(10, False, False, {"from": accounts[1]})
413+
pool_id = self.diamond_terminus.total_pools()
414+
415+
self.assertFalse(
416+
self.diamond_terminus.is_approved_for_pool(pool_id, accounts[2].address)
417+
)
418+
with self.assertRaises(Exception):
419+
self.diamond_terminus.mint(
420+
accounts[2].address, pool_id, 1, b"", {"from": accounts[2]}
421+
)
422+
423+
self.diamond_terminus.approve_for_pool(
424+
pool_id, accounts[2].address, {"from": accounts[1]}
425+
)
426+
supply_0 = self.diamond_terminus.terminus_pool_supply(pool_id)
427+
balance_0 = self.diamond_terminus.balance_of(accounts[2].address, pool_id)
428+
self.diamond_terminus.mint(
429+
accounts[2].address, pool_id, 1, b"", {"from": accounts[1]}
430+
)
431+
balance_1 = self.diamond_terminus.balance_of(accounts[2].address, pool_id)
432+
supply_1 = self.diamond_terminus.terminus_pool_supply(pool_id)
433+
434+
self.assertEqual(balance_1, balance_0 + 1)
435+
self.assertEqual(supply_0 + 1, supply_1)
436+
437+
def test_pool_mint_batch_with_approval(self):
438+
pool_id = self.diamond_terminus.total_pools()
439+
target_accounts = [account.address for account in accounts[:5]]
440+
target_amounts = [1 for _ in accounts[:5]]
441+
num_accounts = len(accounts[:5])
442+
initial_pool_supply = self.diamond_terminus.terminus_pool_supply(pool_id)
443+
initial_balances: List[int] = []
444+
for account in accounts[:5]:
445+
initial_balances.append(
446+
self.diamond_terminus.balance_of(account.address, pool_id)
447+
)
448+
449+
self.assertFalse(
450+
self.diamond_terminus.is_approved_for_pool(pool_id, accounts[2].address)
451+
)
452+
with self.assertRaises(Exception):
453+
self.diamond_terminus.pool_mint_batch(
454+
pool_id, target_accounts, target_amounts, {"from": accounts[2]}
455+
)
456+
self.diamond_terminus.approve_for_pool(
457+
pool_id, accounts[2].address, {"from": accounts[1]}
458+
)
459+
self.diamond_terminus.pool_mint_batch(
460+
pool_id, target_accounts, target_amounts, {"from": accounts[2]}
461+
)
462+
463+
final_pool_supply = self.diamond_terminus.terminus_pool_supply(pool_id)
464+
self.assertEqual(final_pool_supply, initial_pool_supply + num_accounts)
465+
for i, account in enumerate(accounts[:5]):
466+
final_balance = self.diamond_terminus.balance_of(account.address, pool_id)
467+
self.assertEqual(final_balance, initial_balances[i] + 1)
468+
353469
def test_transfer(self):
354470
pool_id = self.diamond_terminus.total_pools()
355471
self.diamond_terminus.mint(accounts[2], pool_id, 1, b"", {"from": accounts[1]})

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
setup(
88
name="moonstream-dao",
9-
version="0.0.6",
9+
version="0.0.7",
1010
packages=find_packages(),
1111
install_requires=["eth-brownie", "tqdm"],
1212
extras_require={

0 commit comments

Comments
 (0)