@@ -5,6 +5,7 @@ pragma abicoder v2;
5
5
import { Address } from "@openzeppelin/contracts/utils/Address.sol " ;
6
6
import { SafeMath } from "@openzeppelin/contracts/math/SafeMath.sol " ;
7
7
import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol " ;
8
+ import { IERC20Permit } from "@openzeppelin/contracts/drafts/IERC20Permit.sol " ;
8
9
import { ReentrancyGuardUpgradeable } from "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol " ;
9
10
import { EnumerableSetUpgradeable } from "@openzeppelin/contracts-upgradeable/utils/EnumerableSetUpgradeable.sol " ;
10
11
@@ -541,8 +542,8 @@ contract BancorNetwork is IBancorNetwork, Upgradeable, OwnedUpgradeable, Reentra
541
542
external
542
543
payable
543
544
override
544
- validAddress (address (pool))
545
545
validAddress (provider)
546
+ validAddress (address (pool))
546
547
greaterThanZero (tokenAmount)
547
548
nonReentrant
548
549
{
@@ -563,15 +564,42 @@ contract BancorNetwork is IBancorNetwork, Upgradeable, OwnedUpgradeable, Reentra
563
564
_depositFor (msg .sender , pool, tokenAmount, msg .sender );
564
565
}
565
566
567
+ /**
568
+ * @inheritdoc IBancorNetwork
569
+ */
570
+ function depositForPermitted (
571
+ address provider ,
572
+ IReserveToken pool ,
573
+ uint256 tokenAmount ,
574
+ uint256 deadline ,
575
+ uint8 v ,
576
+ bytes32 r ,
577
+ bytes32 s
578
+ ) external override validAddress (provider) validAddress (address (pool)) greaterThanZero (tokenAmount) nonReentrant {
579
+ _depositBaseTokenForPermitted (provider, pool, tokenAmount, msg .sender , deadline, v, r, s);
580
+ }
581
+
582
+ /**
583
+ * @inheritdoc IBancorNetwork
584
+ */
585
+ function depositPermitted (
586
+ IReserveToken pool ,
587
+ uint256 tokenAmount ,
588
+ uint256 deadline ,
589
+ uint8 v ,
590
+ bytes32 r ,
591
+ bytes32 s
592
+ ) external override validAddress (address (pool)) greaterThanZero (tokenAmount) nonReentrant {
593
+ _depositBaseTokenForPermitted (msg .sender , pool, tokenAmount, msg .sender , deadline, v, r, s);
594
+ }
595
+
566
596
/**
567
597
* @inheritdoc IBancorNetwork
568
598
*/
569
599
function withdraw (uint256 id ) external override nonReentrant {
600
+ bytes32 contextId = _withdrawContextId (id);
570
601
address provider = msg .sender ;
571
602
572
- // generate context ID for monitoring
573
- bytes32 contextId = keccak256 (abi.encodePacked (provider, _time (), id));
574
-
575
603
// complete the withdrawal and claim the locked pool tokens
576
604
CompletedWithdrawal memory completedRequest = _pendingWithdrawals.completeWithdrawal (contextId, provider, id);
577
605
@@ -614,6 +642,25 @@ contract BancorNetwork is IBancorNetwork, Upgradeable, OwnedUpgradeable, Reentra
614
642
);
615
643
}
616
644
645
+ /**
646
+ * @dev generates context ID for a deposit requesst
647
+ */
648
+ function _depositContextId (
649
+ address provider ,
650
+ IReserveToken pool ,
651
+ uint256 tokenAmount ,
652
+ address sender
653
+ ) private view returns (bytes32 ) {
654
+ return keccak256 (abi.encodePacked (provider, _time (), pool, tokenAmount, sender));
655
+ }
656
+
657
+ /**
658
+ * @dev generates context ID for a withdraw request
659
+ */
660
+ function _withdrawContextId (uint256 id ) private view returns (bytes32 ) {
661
+ return keccak256 (abi.encodePacked (msg .sender , _time (), id));
662
+ }
663
+
617
664
/**
618
665
* @dev deposits liquidity for the specified provider from sender
619
666
*
@@ -627,8 +674,7 @@ contract BancorNetwork is IBancorNetwork, Upgradeable, OwnedUpgradeable, Reentra
627
674
uint256 tokenAmount ,
628
675
address sender
629
676
) private {
630
- // generate context ID for monitoring
631
- bytes32 contextId = keccak256 (abi.encodePacked (provider, _time (), pool, tokenAmount, sender));
677
+ bytes32 contextId = _depositContextId (provider, pool, tokenAmount, sender);
632
678
633
679
if (pool == IReserveToken (address (_networkToken))) {
634
680
_depositNetworkTokenFor (contextId, provider, tokenAmount, sender);
@@ -785,6 +831,28 @@ contract BancorNetwork is IBancorNetwork, Upgradeable, OwnedUpgradeable, Reentra
785
831
});
786
832
}
787
833
834
+ function _depositBaseTokenForPermitted (
835
+ address provider ,
836
+ IReserveToken pool ,
837
+ uint256 tokenAmount ,
838
+ address sender ,
839
+ uint256 deadline ,
840
+ uint8 v ,
841
+ bytes32 r ,
842
+ bytes32 s
843
+ ) private {
844
+ // neither the network token nor ETH support EIP2612 permit requests
845
+ require (pool != IReserveToken (address (_networkToken)) && ! pool.isNativeToken (), "ERR_PERMIT_UNSUPPORTED " );
846
+
847
+ // permit the amount the caller is trying to deposit. Please note, that if the base token doesn't support
848
+ // EIP2612 permit - either this call of the inner safeTransferFrom will revert
849
+ IERC20Permit (address (pool)).permit (sender, address (this ), tokenAmount, deadline, v, r, s);
850
+
851
+ bytes32 contextId = _depositContextId (provider, pool, tokenAmount, sender);
852
+
853
+ _depositBaseTokenFor (contextId, provider, pool, tokenAmount, sender);
854
+ }
855
+
788
856
/**
789
857
* @dev handles network token withdrawal
790
858
*/
0 commit comments