@@ -235,6 +235,106 @@ contract AjnaTokenTest is Test {
235235 assertEq (_token.getPastVotes (delegate2, 11112 ), 1_000 * 1e18 );
236236 }
237237
238+ function testMultipleSelfDelegation () external {
239+ address delegator = address (2222 );
240+ address delegate1 = address (3333 );
241+
242+ // set delegator balance to 1_000 AJNA tokens
243+ deal (address (_token), delegator, 1_000 * 1e18 );
244+
245+ // check voting power
246+ assertEq (_token.getVotes (delegator), 0 );
247+ assertEq (_token.getVotes (delegate1), 0 );
248+
249+ vm.roll (11111 );
250+ changePrank (delegator);
251+ vm.expectEmit (true , true , false , true );
252+ emit DelegateChanged (delegator, address (0 ), delegator);
253+ vm.expectEmit (true , true , false , true );
254+ emit DelegateVotesChanged (delegator, 0 , 1_000 * 1e18 );
255+ _token.delegate (delegator);
256+
257+ // check accounts balances
258+ assertEq (_token.balanceOf (delegator), 1_000 * 1e18 );
259+ assertEq (_token.balanceOf (delegate1), 0 );
260+ // check voting power
261+ assertEq (_token.getVotes (delegator), 1_000 * 1e18 );
262+ assertEq (_token.getVotes (delegate1), 0 );
263+
264+ assertEq (_token.delegates (delegator), delegator);
265+
266+ // additional tokens are transferred to delegator
267+ vm.roll (11121 );
268+ changePrank (_tokenHolder);
269+ uint256 addAmount = 1 * 1e18 ;
270+ _token.approve (_tokenHolder, addAmount);
271+ vm.expectEmit (true , true , false , true );
272+ emit Transfer (_tokenHolder, delegator, addAmount);
273+ vm.expectEmit (true , true , false , true );
274+ emit DelegateVotesChanged (delegator, 1_000 * 1e18 , 1_001 * 1e18 );
275+ _token.transferFrom (_tokenHolder, delegator, addAmount);
276+
277+ // check accounts balances
278+ assertEq (_token.balanceOf (delegator), 1_001 * 1e18 );
279+ assertEq (_token.balanceOf (delegate1), 0 );
280+ // check voting power
281+ assertEq (_token.getVotes (delegator), 1_001 * 1e18 );
282+ assertEq (_token.getVotes (delegate1), 0 );
283+ }
284+
285+ function testMultipleDelegationDifferentDelegatee () external {
286+ address delegator = address (2222 );
287+ address delegate1 = address (3333 );
288+ address delegate2 = address (4444 );
289+
290+ // set delegator balance to 1_000 AJNA tokens
291+ deal (address (_token), delegator, 1_000 * 1e18 );
292+
293+ // check voting power
294+ assertEq (_token.getVotes (delegator), 0 );
295+ assertEq (_token.getVotes (delegate1), 0 );
296+ assertEq (_token.getVotes (delegate2), 0 );
297+
298+ vm.roll (11111 );
299+ changePrank (delegator);
300+ vm.expectEmit (true , true , false , true );
301+ emit DelegateChanged (delegator, address (0 ), delegate1);
302+ vm.expectEmit (true , true , false , true );
303+ emit DelegateVotesChanged (delegate1, 0 , 1_000 * 1e18 );
304+ _token.delegate (delegate1);
305+
306+ // check accounts balances
307+ assertEq (_token.balanceOf (delegator), 1_000 * 1e18 );
308+ assertEq (_token.balanceOf (delegate1), 0 );
309+ assertEq (_token.balanceOf (delegate2), 0 );
310+ // check voting power
311+ assertEq (_token.getVotes (delegator), 0 );
312+ assertEq (_token.getVotes (delegate1), 1_000 * 1e18 );
313+ assertEq (_token.getVotes (delegate2), 0 );
314+
315+ assertEq (_token.delegates (delegator), delegate1);
316+
317+ // additional tokens are transferred to delegator
318+ vm.roll (11121 );
319+ changePrank (_tokenHolder);
320+ uint256 addAmount = 2_000 * 1e18 ;
321+ _token.approve (_tokenHolder, addAmount);
322+ vm.expectEmit (true , true , false , true );
323+ emit Transfer (_tokenHolder, delegator, addAmount);
324+ vm.expectEmit (true , true , false , true );
325+ emit DelegateVotesChanged (delegate1, 1_000 * 1e18 , 3_000 * 1e18 );
326+ _token.transferFrom (_tokenHolder, delegator, addAmount);
327+
328+ // check accounts balances
329+ assertEq (_token.balanceOf (delegator), 3_000 * 1e18 );
330+ assertEq (_token.balanceOf (delegate1), 0 );
331+ assertEq (_token.balanceOf (delegate2), 0 );
332+ // check voting power
333+ assertEq (_token.getVotes (delegator), 0 );
334+ assertEq (_token.getVotes (delegate1), 3_000 * 1e18 );
335+ assertEq (_token.getVotes (delegate2), 0 );
336+ }
337+
238338 function testCalculateVotingPower () external {
239339 address delegator1 = address (1111 );
240340 address delegator2 = address (2222 );
0 commit comments