mirror of
https://github.com/Instadapp/Gelato-automations.git
synced 2024-07-29 22:28:07 +00:00
Define provider in the payment connector
This commit is contained in:
parent
4f6b16b7da
commit
c76f495c9c
|
@ -68,8 +68,7 @@ contract ConnectGelatoDataForFullRefinance is ConnectorInterface {
|
||||||
function getDataAndCastForFromMakerToMaker(
|
function getDataAndCastForFromMakerToMaker(
|
||||||
uint256 _vaultId,
|
uint256 _vaultId,
|
||||||
address _token,
|
address _token,
|
||||||
string calldata _colType,
|
string calldata _colType
|
||||||
address _provider
|
|
||||||
) public payable {
|
) public payable {
|
||||||
(
|
(
|
||||||
address[] memory targets,
|
address[] memory targets,
|
||||||
|
@ -77,8 +76,7 @@ contract ConnectGelatoDataForFullRefinance is ConnectorInterface {
|
||||||
) = _execPayloadForFullRefinanceFromMakerToMaker(
|
) = _execPayloadForFullRefinanceFromMakerToMaker(
|
||||||
_vaultId,
|
_vaultId,
|
||||||
_token,
|
_token,
|
||||||
_colType,
|
_colType
|
||||||
_provider
|
|
||||||
);
|
);
|
||||||
|
|
||||||
_cast(targets, datas);
|
_cast(targets, datas);
|
||||||
|
@ -86,17 +84,12 @@ contract ConnectGelatoDataForFullRefinance is ConnectorInterface {
|
||||||
|
|
||||||
function getDataAndCastForFromMakerToCompound(
|
function getDataAndCastForFromMakerToCompound(
|
||||||
uint256 _vaultId,
|
uint256 _vaultId,
|
||||||
address _token,
|
address _token
|
||||||
address _provider
|
|
||||||
) public payable {
|
) public payable {
|
||||||
(
|
(
|
||||||
address[] memory targets,
|
address[] memory targets,
|
||||||
bytes[] memory datas
|
bytes[] memory datas
|
||||||
) = _execPayloadForFullRefinanceFromMakerToCompound(
|
) = _execPayloadForFullRefinanceFromMakerToCompound(_vaultId, _token);
|
||||||
_vaultId,
|
|
||||||
_token,
|
|
||||||
_provider
|
|
||||||
);
|
|
||||||
|
|
||||||
_cast(targets, datas);
|
_cast(targets, datas);
|
||||||
}
|
}
|
||||||
|
@ -124,13 +117,11 @@ contract ConnectGelatoDataForFullRefinance is ConnectorInterface {
|
||||||
/// @notice Generate Task for a full refinancing between Maker to Compound.
|
/// @notice Generate Task for a full refinancing between Maker to Compound.
|
||||||
/// @param _vaultId Id of the unsafe vault of the client.
|
/// @param _vaultId Id of the unsafe vault of the client.
|
||||||
/// @param _token vault's col token address .
|
/// @param _token vault's col token address .
|
||||||
/// @param _provider address of the paying provider.
|
|
||||||
/// @return targets : flashloan contract address
|
/// @return targets : flashloan contract address
|
||||||
/// @return datas : calldata for flashloan
|
/// @return datas : calldata for flashloan
|
||||||
function _execPayloadForFullRefinanceFromMakerToCompound(
|
function _execPayloadForFullRefinanceFromMakerToCompound(
|
||||||
uint256 _vaultId,
|
uint256 _vaultId,
|
||||||
address _token,
|
address _token
|
||||||
address _provider
|
|
||||||
) internal view returns (address[] memory targets, bytes[] memory datas) {
|
) internal view returns (address[] memory targets, bytes[] memory datas) {
|
||||||
targets = new address[](1);
|
targets = new address[](1);
|
||||||
targets[0] = INSTA_POOL_V2;
|
targets[0] = INSTA_POOL_V2;
|
||||||
|
@ -159,13 +150,7 @@ contract ConnectGelatoDataForFullRefinance is ConnectorInterface {
|
||||||
0
|
0
|
||||||
);
|
);
|
||||||
_datas[3] = _encodeBorrowCompound(DAI, wDaiDebtToMove, 0, 0);
|
_datas[3] = _encodeBorrowCompound(DAI, wDaiDebtToMove, 0, 0);
|
||||||
_datas[4] = _encodePayGelatoProvider(
|
_datas[4] = _encodePayGelatoProvider(_token, gasFeesPaidFromCol, 0, 0);
|
||||||
_provider,
|
|
||||||
_token,
|
|
||||||
gasFeesPaidFromCol,
|
|
||||||
0,
|
|
||||||
0
|
|
||||||
);
|
|
||||||
_datas[5] = _encodeFlashPayback(DAI, wDaiDebtToMove, 0, 0);
|
_datas[5] = _encodeFlashPayback(DAI, wDaiDebtToMove, 0, 0);
|
||||||
|
|
||||||
datas = new bytes[](1);
|
datas = new bytes[](1);
|
||||||
|
@ -182,14 +167,12 @@ contract ConnectGelatoDataForFullRefinance is ConnectorInterface {
|
||||||
/// @param _vaultId Id of the unsafe vault of the client.
|
/// @param _vaultId Id of the unsafe vault of the client.
|
||||||
/// @param _token vault's col token address .
|
/// @param _token vault's col token address .
|
||||||
/// @param _colType colType of the new vault, exemple : ETH-B, ETH-A.
|
/// @param _colType colType of the new vault, exemple : ETH-B, ETH-A.
|
||||||
/// @param _provider address of the paying provider.
|
|
||||||
/// @return targets : flashloan contract address
|
/// @return targets : flashloan contract address
|
||||||
/// @return datas : calldata for flashloan
|
/// @return datas : calldata for flashloan
|
||||||
function _execPayloadForFullRefinanceFromMakerToMaker(
|
function _execPayloadForFullRefinanceFromMakerToMaker(
|
||||||
uint256 _vaultId,
|
uint256 _vaultId,
|
||||||
address _token,
|
address _token,
|
||||||
string calldata _colType,
|
string calldata _colType
|
||||||
address _provider
|
|
||||||
) internal view returns (address[] memory targets, bytes[] memory datas) {
|
) internal view returns (address[] memory targets, bytes[] memory datas) {
|
||||||
targets = new address[](1);
|
targets = new address[](1);
|
||||||
targets[0] = INSTA_POOL_V2;
|
targets[0] = INSTA_POOL_V2;
|
||||||
|
@ -220,13 +203,7 @@ contract ConnectGelatoDataForFullRefinance is ConnectorInterface {
|
||||||
0
|
0
|
||||||
);
|
);
|
||||||
_datas[4] = _encodeBorrowDaiMakerVault(0, wDaiDebtToMove, 0, 0);
|
_datas[4] = _encodeBorrowDaiMakerVault(0, wDaiDebtToMove, 0, 0);
|
||||||
_datas[5] = _encodePayGelatoProvider(
|
_datas[5] = _encodePayGelatoProvider(_token, gasFeesPaidFromCol, 0, 0);
|
||||||
_provider,
|
|
||||||
_token,
|
|
||||||
gasFeesPaidFromCol,
|
|
||||||
0,
|
|
||||||
0
|
|
||||||
);
|
|
||||||
_datas[6] = _encodeFlashPayback(DAI, wDaiDebtToMove, 0, 0);
|
_datas[6] = _encodeFlashPayback(DAI, wDaiDebtToMove, 0, 0);
|
||||||
|
|
||||||
datas = new bytes[](1);
|
datas = new bytes[](1);
|
||||||
|
|
|
@ -52,7 +52,6 @@ contract ConnectGelatoDataForPartialRefinance is ConnectorInterface {
|
||||||
uint256 wMinColRatioB;
|
uint256 wMinColRatioB;
|
||||||
address priceOracle;
|
address priceOracle;
|
||||||
bytes oraclePayload;
|
bytes oraclePayload;
|
||||||
address provider;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
using GelatoBytes for bytes;
|
using GelatoBytes for bytes;
|
||||||
|
@ -182,7 +181,6 @@ contract ConnectGelatoDataForPartialRefinance is ConnectorInterface {
|
||||||
);
|
);
|
||||||
_datas[3] = _encodeBorrowCompound(DAI, wDaiDebtToMove, 0, 0);
|
_datas[3] = _encodeBorrowCompound(DAI, wDaiDebtToMove, 0, 0);
|
||||||
_datas[4] = _encodePayGelatoProvider(
|
_datas[4] = _encodePayGelatoProvider(
|
||||||
_payload.provider,
|
|
||||||
_payload.token,
|
_payload.token,
|
||||||
gasFeesPaidFromCol,
|
gasFeesPaidFromCol,
|
||||||
0,
|
0,
|
||||||
|
@ -264,7 +262,6 @@ contract ConnectGelatoDataForPartialRefinance is ConnectorInterface {
|
||||||
);
|
);
|
||||||
_datas[4] = _encodeBorrowDaiMakerVault(0, wDaiDebtToMove, 0, 0);
|
_datas[4] = _encodeBorrowDaiMakerVault(0, wDaiDebtToMove, 0, 0);
|
||||||
_datas[5] = _encodePayGelatoProvider(
|
_datas[5] = _encodePayGelatoProvider(
|
||||||
_payload.provider,
|
|
||||||
_payload.token,
|
_payload.token,
|
||||||
gasFeesPaidFromCol,
|
gasFeesPaidFromCol,
|
||||||
0,
|
0,
|
||||||
|
|
|
@ -1,17 +1,23 @@
|
||||||
// SPDX-License-Identifier: UNLICENSED
|
// SPDX-License-Identifier: UNLICENSED
|
||||||
pragma solidity 0.7.4;
|
pragma solidity 0.7.4;
|
||||||
|
|
||||||
import {ConnectorInterface} from "../../interfaces/InstaDapp/IInstaDapp.sol";
|
import {
|
||||||
|
IConnectGelatoProviderPayment
|
||||||
|
} from "../../interfaces/InstaDapp/connectors/IConnectGelatoProviderPayment.sol";
|
||||||
import {Address} from "../../vendor/Address.sol";
|
import {Address} from "../../vendor/Address.sol";
|
||||||
import {IERC20} from "../../interfaces/tokens/IERC20.sol";
|
import {IERC20} from "../../interfaces/tokens/IERC20.sol";
|
||||||
import {SafeERC20} from "../../vendor/SafeERC20.sol";
|
import {SafeERC20} from "../../vendor/SafeERC20.sol";
|
||||||
import {getUint, setUint} from "../../functions/InstaDapp/FInstaDapp.sol";
|
import {getUint, setUint} from "../../functions/InstaDapp/FInstaDapp.sol";
|
||||||
import {ETH} from "../../constants/CInstaDapp.sol";
|
import {ETH} from "../../constants/CInstaDapp.sol";
|
||||||
|
import {Ownable} from "../../lib/Ownable.sol";
|
||||||
|
|
||||||
/// @title ConnectGelatoProviderPayment
|
/// @title ConnectGelatoProviderPayment
|
||||||
/// @notice InstaDapp Connector to compensate Gelato automation-gas Providers.
|
/// @notice InstaDapp Connector to compensate Gelato automation-gas Providers.
|
||||||
/// @author Gelato Team
|
/// @author Gelato Team
|
||||||
contract ConnectGelatoProviderPayment is ConnectorInterface {
|
contract ConnectGelatoProviderPayment is
|
||||||
|
IConnectGelatoProviderPayment,
|
||||||
|
Ownable
|
||||||
|
{
|
||||||
using Address for address payable;
|
using Address for address payable;
|
||||||
using SafeERC20 for IERC20;
|
using SafeERC20 for IERC20;
|
||||||
|
|
||||||
|
@ -19,9 +25,13 @@ contract ConnectGelatoProviderPayment is ConnectorInterface {
|
||||||
string public constant override name = "ConnectGelatoProviderPayment-v1.0";
|
string public constant override name = "ConnectGelatoProviderPayment-v1.0";
|
||||||
|
|
||||||
uint256 internal immutable _id;
|
uint256 internal immutable _id;
|
||||||
|
address internal _providerAddress;
|
||||||
|
address internal immutable _paymentConnectorAddr;
|
||||||
|
|
||||||
constructor(uint256 id) {
|
constructor(uint256 id, address providerAddress) {
|
||||||
_id = id;
|
_id = id;
|
||||||
|
_providerAddress = providerAddress;
|
||||||
|
_paymentConnectorAddr = address(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @dev Connector Details
|
/// @dev Connector Details
|
||||||
|
@ -34,6 +44,17 @@ contract ConnectGelatoProviderPayment is ConnectorInterface {
|
||||||
(_type, id) = (1, _id); // Should put specific value.
|
(_type, id) = (1, _id); // Should put specific value.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// @notice Retrieve provider address that will be paid for executing the task
|
||||||
|
/// @return provider's address
|
||||||
|
function getProvider() external view override returns (address) {
|
||||||
|
return _providerAddress;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @notice Set the provider address that will be paid for executing a task
|
||||||
|
function setProvider(address providerAddress) external onlyOwner {
|
||||||
|
_providerAddress = providerAddress;
|
||||||
|
}
|
||||||
|
|
||||||
/// @notice Transfers automation gas fees to Gelato Provider
|
/// @notice Transfers automation gas fees to Gelato Provider
|
||||||
/// @dev Gelato Provider risks:
|
/// @dev Gelato Provider risks:
|
||||||
/// - _getId does not match actual InstaMemory provider payment slot
|
/// - _getId does not match actual InstaMemory provider payment slot
|
||||||
|
@ -47,20 +68,21 @@ contract ConnectGelatoProviderPayment is ConnectorInterface {
|
||||||
/// @param _getId The InstaMemory slot at which the payment amount was stored.
|
/// @param _getId The InstaMemory slot at which the payment amount was stored.
|
||||||
/// @param _setId The InstaMemory slot to save the provider payout amound in.
|
/// @param _setId The InstaMemory slot to save the provider payout amound in.
|
||||||
function payProvider(
|
function payProvider(
|
||||||
address _provider,
|
|
||||||
address _token,
|
address _token,
|
||||||
uint256 _amt,
|
uint256 _amt,
|
||||||
uint256 _getId,
|
uint256 _getId,
|
||||||
uint256 _setId
|
uint256 _setId
|
||||||
) public payable virtual {
|
) public payable override {
|
||||||
|
address provider = IConnectGelatoProviderPayment(_paymentConnectorAddr)
|
||||||
|
.getProvider();
|
||||||
require(
|
require(
|
||||||
_provider != address(0x0),
|
provider != address(0x0),
|
||||||
"ConnectGelatoProviderPayment.payProvider:!_provider"
|
"ConnectGelatoProviderPayment.payProvider:!_provider"
|
||||||
);
|
);
|
||||||
uint256 amt = getUint(_getId, _amt);
|
uint256 amt = getUint(_getId, _amt);
|
||||||
setUint(_setId, amt);
|
setUint(_setId, amt);
|
||||||
_token == ETH
|
_token == ETH
|
||||||
? payable(_provider).sendValue(amt)
|
? payable(provider).sendValue(amt)
|
||||||
: IERC20(_token).safeTransfer(_provider, amt);
|
: IERC20(_token).safeTransfer(provider, amt);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,126 +0,0 @@
|
||||||
// "SPDX-License-Identifier: UNLICENSED"
|
|
||||||
pragma solidity 0.7.4;
|
|
||||||
pragma experimental ABIEncoderV2;
|
|
||||||
|
|
||||||
import {
|
|
||||||
GelatoProviderModuleStandard
|
|
||||||
} from "@gelatonetwork/core/contracts/provider_modules/GelatoProviderModuleStandard.sol";
|
|
||||||
import {
|
|
||||||
Task
|
|
||||||
} from "@gelatonetwork/core/contracts/gelato_core/interfaces/IGelatoCore.sol";
|
|
||||||
import {AccountInterface} from "../../../interfaces/InstaDapp/IInstaDapp.sol";
|
|
||||||
import {
|
|
||||||
ConnectGelatoDataForFullRefinance
|
|
||||||
} from "../../connectors/ConnectGelatoDataForFullRefinance.sol";
|
|
||||||
|
|
||||||
/// @notice Gelato Provider Module for the InstaDapp DSA
|
|
||||||
/// @dev Used by Provider to sanity check any third-party Tasks they pay for
|
|
||||||
/// @author Gelato Network Team
|
|
||||||
contract ProviderModuleDsaFromMakerToCompound is GelatoProviderModuleStandard {
|
|
||||||
/// @dev DSA must have gelatoCore as auth and gelatoCore is emitted as origin of cast
|
|
||||||
address public immutable gelatoCore;
|
|
||||||
|
|
||||||
/// @notice A trusted Connector to pay Provider for e.g. User's Gelato gas usage.
|
|
||||||
/// @dev Automated InstaDapp Use Cases that rely on a third-party Gelato Provider
|
|
||||||
/// to pay for automation will likely have this Connector in their spells.
|
|
||||||
address public immutable connectGelatoProviderPayment;
|
|
||||||
|
|
||||||
// TO DO: remove `public` after hardhat file import bugfix
|
|
||||||
// https://github.com/nomiclabs/hardhat/issues/916
|
|
||||||
constructor(address _gelatoCore, address _connectGelatoProviderPayment) {
|
|
||||||
gelatoCore = _gelatoCore;
|
|
||||||
connectGelatoProviderPayment = _connectGelatoProviderPayment;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ================= GELATO PROVIDER MODULE STANDARD ================
|
|
||||||
/// @notice Standard Gelato function for Provider's Task sanity checks
|
|
||||||
/// @dev For more Provider security we should also check:
|
|
||||||
/// - ListInterface(index.list()).accountID(_userProxy)
|
|
||||||
/// - if (shield) connectors.isStaticConnector(targets)
|
|
||||||
/// - connectors.isConnector(targets)
|
|
||||||
/// But we skip those here to save gas
|
|
||||||
/// @param _userProxy The DSA which submitted the Task
|
|
||||||
/// @return whether the Provider is pays for the Task.
|
|
||||||
function isProvided(
|
|
||||||
address _userProxy,
|
|
||||||
address,
|
|
||||||
Task calldata
|
|
||||||
) public view virtual override returns (string memory) {
|
|
||||||
try AccountInterface(_userProxy).isAuth(gelatoCore) returns (
|
|
||||||
bool gelatoCoreIsAuth
|
|
||||||
) {
|
|
||||||
if (!gelatoCoreIsAuth)
|
|
||||||
return
|
|
||||||
"ProviderModuleDsaFromMakerToCompound.isProvided:GelatoCoreNotAuth";
|
|
||||||
} catch Error(string memory err) {
|
|
||||||
return
|
|
||||||
string(
|
|
||||||
abi.encodePacked(
|
|
||||||
"ProviderModuleDsaFromMakerToCompound.isProvided:",
|
|
||||||
err
|
|
||||||
)
|
|
||||||
);
|
|
||||||
} catch {
|
|
||||||
return "ProviderModuleDsaFromMakerToCompound.isProvided:undefined";
|
|
||||||
}
|
|
||||||
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// @notice Gelato Standard Provider function to retrieve payload for the DSA
|
|
||||||
/// @dev This formats the Gelato Task into a DSA compatible payload and
|
|
||||||
/// it also inserts the _provider into the ConnectGelatoProviderPayment payload,
|
|
||||||
/// to make sure that it cannot be spoofed thus e.g. securing Provider payments.
|
|
||||||
/// @param _provider the actual Provider address verified by GelatoCore system.
|
|
||||||
/// @param _task The Task in Gelato format.
|
|
||||||
/// @return The execution payload in DSA format
|
|
||||||
/// @return bool=false because no execRevert checks must be handled on GelatoCore
|
|
||||||
/// because the DSA reverts, if a spell revert is caught during delegatecall.
|
|
||||||
function execPayload(
|
|
||||||
uint256,
|
|
||||||
address,
|
|
||||||
address _provider,
|
|
||||||
Task calldata _task,
|
|
||||||
uint256
|
|
||||||
) public view virtual override returns (bytes memory, bool) {
|
|
||||||
require(
|
|
||||||
_task.actions.length == 1,
|
|
||||||
"ProviderModuleDsaFromMakerToCompound.execPayload: Task should 1 action."
|
|
||||||
);
|
|
||||||
address[] memory targets = new address[](_task.actions.length);
|
|
||||||
targets[0] = _task.actions[0].addr;
|
|
||||||
|
|
||||||
bytes[] memory datas = new bytes[](_task.actions.length);
|
|
||||||
datas[0] = _replaceProvider(_provider, _task.actions[0].data);
|
|
||||||
|
|
||||||
return (
|
|
||||||
abi.encodeWithSelector(
|
|
||||||
AccountInterface.cast.selector,
|
|
||||||
targets,
|
|
||||||
datas,
|
|
||||||
gelatoCore
|
|
||||||
),
|
|
||||||
false
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
function _replaceProvider(address _provider, bytes calldata _data)
|
|
||||||
internal
|
|
||||||
pure
|
|
||||||
returns (bytes memory)
|
|
||||||
{
|
|
||||||
(uint256 vaultId, address token, ) = abi.decode(
|
|
||||||
_data[4:],
|
|
||||||
(uint256, address, address)
|
|
||||||
);
|
|
||||||
return
|
|
||||||
abi.encodeWithSelector(
|
|
||||||
ConnectGelatoDataForFullRefinance
|
|
||||||
.getDataAndCastForFromMakerToCompound
|
|
||||||
.selector,
|
|
||||||
vaultId,
|
|
||||||
token,
|
|
||||||
_provider
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,127 +0,0 @@
|
||||||
// "SPDX-License-Identifier: UNLICENSED"
|
|
||||||
pragma solidity 0.7.4;
|
|
||||||
pragma experimental ABIEncoderV2;
|
|
||||||
|
|
||||||
import {
|
|
||||||
GelatoProviderModuleStandard
|
|
||||||
} from "@gelatonetwork/core/contracts/provider_modules/GelatoProviderModuleStandard.sol";
|
|
||||||
import {
|
|
||||||
Task
|
|
||||||
} from "@gelatonetwork/core/contracts/gelato_core/interfaces/IGelatoCore.sol";
|
|
||||||
import {AccountInterface} from "../../../interfaces/InstaDapp/IInstaDapp.sol";
|
|
||||||
import {
|
|
||||||
ConnectGelatoDataForFullRefinance
|
|
||||||
} from "../../connectors/ConnectGelatoDataForFullRefinance.sol";
|
|
||||||
|
|
||||||
/// @notice Gelato Provider Module for the InstaDapp DSA
|
|
||||||
/// @dev Used by Provider to sanity check any third-party Tasks they pay for
|
|
||||||
/// @author Gelato Network Team
|
|
||||||
contract ProviderModuleDsaFromMakerToMaker is GelatoProviderModuleStandard {
|
|
||||||
/// @dev DSA must have gelatoCore as auth and gelatoCore is emitted as origin of cast
|
|
||||||
address public immutable gelatoCore;
|
|
||||||
|
|
||||||
/// @notice A trusted Connector to pay Provider for e.g. User's Gelato gas usage.
|
|
||||||
/// @dev Automated InstaDapp Use Cases that rely on a third-party Gelato Provider
|
|
||||||
/// to pay for automation will likely have this Connector in their spells.
|
|
||||||
address public immutable connectGelatoProviderPayment;
|
|
||||||
|
|
||||||
// TO DO: remove `public` after hardhat file import bugfix
|
|
||||||
// https://github.com/nomiclabs/hardhat/issues/916
|
|
||||||
constructor(address _gelatoCore, address _connectGelatoProviderPayment) {
|
|
||||||
gelatoCore = _gelatoCore;
|
|
||||||
connectGelatoProviderPayment = _connectGelatoProviderPayment;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ================= GELATO PROVIDER MODULE STANDARD ================
|
|
||||||
/// @notice Standard Gelato function for Provider's Task sanity checks
|
|
||||||
/// @dev For more Provider security we should also check:
|
|
||||||
/// - ListInterface(index.list()).accountID(_userProxy)
|
|
||||||
/// - if (shield) connectors.isStaticConnector(targets)
|
|
||||||
/// - connectors.isConnector(targets)
|
|
||||||
/// But we skip those here to save gas
|
|
||||||
/// @param _userProxy The DSA which submitted the Task
|
|
||||||
/// @return whether the Provider is pays for the Task.
|
|
||||||
function isProvided(
|
|
||||||
address _userProxy,
|
|
||||||
address,
|
|
||||||
Task calldata
|
|
||||||
) public view virtual override returns (string memory) {
|
|
||||||
try AccountInterface(_userProxy).isAuth(gelatoCore) returns (
|
|
||||||
bool gelatoCoreIsAuth
|
|
||||||
) {
|
|
||||||
if (!gelatoCoreIsAuth)
|
|
||||||
return
|
|
||||||
"ProviderModuleDsaFromMakerToMaker.isProvided:GelatoCoreNotAuth";
|
|
||||||
} catch Error(string memory err) {
|
|
||||||
return
|
|
||||||
string(
|
|
||||||
abi.encodePacked(
|
|
||||||
"ProviderModuleDsaFromMakerToMaker.isProvided:",
|
|
||||||
err
|
|
||||||
)
|
|
||||||
);
|
|
||||||
} catch {
|
|
||||||
return "ProviderModuleDsaFromMakerToMaker.isProvided:undefined";
|
|
||||||
}
|
|
||||||
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// @notice Gelato Standard Provider function to retrieve payload for the DSA
|
|
||||||
/// @dev This formats the Gelato Task into a DSA compatible payload and
|
|
||||||
/// it also inserts the _provider into the ConnectGelatoProviderPayment payload,
|
|
||||||
/// to make sure that it cannot be spoofed thus e.g. securing Provider payments.
|
|
||||||
/// @param _provider the actual Provider address verified by GelatoCore system.
|
|
||||||
/// @param _task The Task in Gelato format.
|
|
||||||
/// @return The execution payload in DSA format
|
|
||||||
/// @return bool=false because no execRevert checks must be handled on GelatoCore
|
|
||||||
/// because the DSA reverts, if a spell revert is caught during delegatecall.
|
|
||||||
function execPayload(
|
|
||||||
uint256,
|
|
||||||
address,
|
|
||||||
address _provider,
|
|
||||||
Task calldata _task,
|
|
||||||
uint256
|
|
||||||
) public view virtual override returns (bytes memory, bool) {
|
|
||||||
require(
|
|
||||||
_task.actions.length == 1,
|
|
||||||
"ProviderModuleDsaFromMakerToMaker.execPayload: Task should 1 action."
|
|
||||||
);
|
|
||||||
address[] memory targets = new address[](_task.actions.length);
|
|
||||||
targets[0] = _task.actions[0].addr;
|
|
||||||
|
|
||||||
bytes[] memory datas = new bytes[](_task.actions.length);
|
|
||||||
datas[0] = _replaceProvider(_provider, _task.actions[0].data);
|
|
||||||
|
|
||||||
return (
|
|
||||||
abi.encodeWithSelector(
|
|
||||||
AccountInterface.cast.selector,
|
|
||||||
targets,
|
|
||||||
datas,
|
|
||||||
gelatoCore
|
|
||||||
),
|
|
||||||
false
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
function _replaceProvider(address _provider, bytes calldata _data)
|
|
||||||
internal
|
|
||||||
pure
|
|
||||||
returns (bytes memory)
|
|
||||||
{
|
|
||||||
(uint256 vaultId, address token, string memory colType, ) = abi.decode(
|
|
||||||
_data[4:],
|
|
||||||
(uint256, address, string, address)
|
|
||||||
);
|
|
||||||
return
|
|
||||||
abi.encodeWithSelector(
|
|
||||||
ConnectGelatoDataForFullRefinance
|
|
||||||
.getDataAndCastForFromMakerToMaker
|
|
||||||
.selector,
|
|
||||||
vaultId,
|
|
||||||
token,
|
|
||||||
colType,
|
|
||||||
_provider
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -5,8 +5,8 @@ import {
|
||||||
IConnectGelatoProviderPayment
|
IConnectGelatoProviderPayment
|
||||||
} from "../../../interfaces/InstaDapp/connectors/IConnectGelatoProviderPayment.sol";
|
} from "../../../interfaces/InstaDapp/connectors/IConnectGelatoProviderPayment.sol";
|
||||||
|
|
||||||
|
// solhint-disable-next-line
|
||||||
function _encodePayGelatoProvider(
|
function _encodePayGelatoProvider(
|
||||||
address _provider,
|
|
||||||
address _token,
|
address _token,
|
||||||
uint256 _amt,
|
uint256 _amt,
|
||||||
uint256 _getId,
|
uint256 _getId,
|
||||||
|
@ -15,7 +15,6 @@ function _encodePayGelatoProvider(
|
||||||
return
|
return
|
||||||
abi.encodeWithSelector(
|
abi.encodeWithSelector(
|
||||||
IConnectGelatoProviderPayment.payProvider.selector,
|
IConnectGelatoProviderPayment.payProvider.selector,
|
||||||
_provider,
|
|
||||||
_token,
|
_token,
|
||||||
_amt,
|
_amt,
|
||||||
_getId,
|
_getId,
|
||||||
|
|
|
@ -1,9 +1,12 @@
|
||||||
// SPDX-License-Identifier: UNLICENSED
|
// SPDX-License-Identifier: UNLICENSED
|
||||||
pragma solidity 0.7.4;
|
pragma solidity 0.7.4;
|
||||||
|
|
||||||
interface IConnectGelatoProviderPayment {
|
import {ConnectorInterface} from "../IInstaDapp.sol";
|
||||||
|
|
||||||
|
interface IConnectGelatoProviderPayment is ConnectorInterface {
|
||||||
|
function getProvider() external returns (address);
|
||||||
|
|
||||||
function payProvider(
|
function payProvider(
|
||||||
address _provider,
|
|
||||||
address _token,
|
address _token,
|
||||||
uint256 _amt,
|
uint256 _amt,
|
||||||
uint256 _getId,
|
uint256 _getId,
|
||||||
|
|
82
contracts/lib/Ownable.sol
Normal file
82
contracts/lib/Ownable.sol
Normal file
|
@ -0,0 +1,82 @@
|
||||||
|
// "SPDX-License-Identifier: UNLICENSED"
|
||||||
|
pragma solidity 0.7.4;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dev Contract module which provides a basic access control mechanism, where
|
||||||
|
* there is an account (an owner) that can be granted exclusive access to
|
||||||
|
* specific functions.
|
||||||
|
*
|
||||||
|
* This module is used through inheritance. It will make available the modifier
|
||||||
|
* `onlyOwner`, which can be applied to your functions to restrict their use to
|
||||||
|
* the owner.
|
||||||
|
*/
|
||||||
|
contract Ownable {
|
||||||
|
address private _owner;
|
||||||
|
|
||||||
|
event OwnershipTransferred(
|
||||||
|
address indexed previousOwner,
|
||||||
|
address indexed newOwner
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dev Initializes the contract setting the deployer as the initial owner.
|
||||||
|
*/
|
||||||
|
constructor() {
|
||||||
|
_owner = msg.sender;
|
||||||
|
emit OwnershipTransferred(address(0), _owner);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dev Returns the address of the current owner.
|
||||||
|
*/
|
||||||
|
function owner() public view returns (address) {
|
||||||
|
return _owner;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dev Throws if called by any account other than the owner.
|
||||||
|
*/
|
||||||
|
modifier onlyOwner() {
|
||||||
|
require(isOwner(), "Ownable: caller is not the owner");
|
||||||
|
_;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dev Returns true if the caller is the current owner.
|
||||||
|
*/
|
||||||
|
function isOwner() public view returns (bool) {
|
||||||
|
return msg.sender == _owner;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dev Leaves the contract without owner. It will not be possible to call
|
||||||
|
* `onlyOwner` functions anymore. Can only be called by the current owner.
|
||||||
|
*
|
||||||
|
* NOTE: Renouncing ownership will leave the contract without an owner,
|
||||||
|
* thereby removing any functionality that is only available to the owner.
|
||||||
|
*/
|
||||||
|
function renounceOwnership() public virtual onlyOwner {
|
||||||
|
emit OwnershipTransferred(_owner, address(0));
|
||||||
|
_owner = address(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dev Transfers ownership of the contract to a new account (`newOwner`).
|
||||||
|
* Can only be called by the current owner.
|
||||||
|
*/
|
||||||
|
function transferOwnership(address newOwner) public virtual onlyOwner {
|
||||||
|
_transferOwnership(newOwner);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dev Transfers ownership of the contract to a new account (`newOwner`).
|
||||||
|
*/
|
||||||
|
function _transferOwnership(address newOwner) internal virtual {
|
||||||
|
require(
|
||||||
|
newOwner != address(0),
|
||||||
|
"Ownable: new owner is the zero address"
|
||||||
|
);
|
||||||
|
emit OwnershipTransferred(_owner, newOwner);
|
||||||
|
_owner = newOwner;
|
||||||
|
}
|
||||||
|
}
|
|
@ -12,7 +12,7 @@ const userOpenDepositBorrowOnMakerVault = require("./setups/Open-Deposit-Borrow-
|
||||||
const getWallets = require("./setups/Wallets.helper");
|
const getWallets = require("./setups/Wallets.helper");
|
||||||
const getConstants = require("./setups/Constants.helper");
|
const getConstants = require("./setups/Constants.helper");
|
||||||
const getABI = require("./setups/ABI.helper");
|
const getABI = require("./setups/ABI.helper");
|
||||||
const getAllContracts = require("./setups/Contracts-For-Full-Refinancing-Maker-To-Compound.helper");
|
const getAllContracts = require("./setups/Contracts-For-Full-Refinancing.helper");
|
||||||
const enableGelatoConnectorsForFromMaker = require("./setups/Enabling-New-Connectors-For-Full-Refinance.helper");
|
const enableGelatoConnectorsForFromMaker = require("./setups/Enabling-New-Connectors-For-Full-Refinance.helper");
|
||||||
|
|
||||||
const ConnectGelatoDataForFullRefinanceABI = require("../../artifacts/contracts/contracts/connectors/ConnectGelatoDataForFullRefinance.sol/ConnectGelatoDataForFullRefinance.json")
|
const ConnectGelatoDataForFullRefinanceABI = require("../../artifacts/contracts/contracts/connectors/ConnectGelatoDataForFullRefinance.sol/ConnectGelatoDataForFullRefinance.json")
|
||||||
|
@ -20,7 +20,7 @@ const ConnectGelatoDataForFullRefinanceABI = require("../../artifacts/contracts/
|
||||||
|
|
||||||
async function makerToCompoundSetup() {
|
async function makerToCompoundSetup() {
|
||||||
const wallets = await getWallets();
|
const wallets = await getWallets();
|
||||||
const contracts = await getAllContracts();
|
const contracts = await getAllContracts(wallets.providerAddress);
|
||||||
const constants = await getConstants();
|
const constants = await getConstants();
|
||||||
let vaultId;
|
let vaultId;
|
||||||
// Gelato Testing environment setup.
|
// Gelato Testing environment setup.
|
||||||
|
@ -103,7 +103,7 @@ async function providerWhiteListTaskForMakerToCompound(
|
||||||
data: await hre.run("abi-encode-withselector", {
|
data: await hre.run("abi-encode-withselector", {
|
||||||
abi: ConnectGelatoDataForFullRefinanceABI,
|
abi: ConnectGelatoDataForFullRefinanceABI,
|
||||||
functionname: "getDataAndCastForFromMakerToCompound",
|
functionname: "getDataAndCastForFromMakerToCompound",
|
||||||
inputs: [vaultId, constants.ETH, wallets.providerAddress],
|
inputs: [vaultId, constants.ETH],
|
||||||
}),
|
}),
|
||||||
operation: GelatoCoreLib.Operation.Delegatecall,
|
operation: GelatoCoreLib.Operation.Delegatecall,
|
||||||
});
|
});
|
||||||
|
|
|
@ -13,7 +13,7 @@ const userOpenDepositBorrowOnMakerVault = require("./setups/Open-Deposit-Borrow-
|
||||||
const getWallets = require("./setups/Wallets.helper");
|
const getWallets = require("./setups/Wallets.helper");
|
||||||
const getConstants = require("./setups/Constants.helper");
|
const getConstants = require("./setups/Constants.helper");
|
||||||
const getABI = require("./setups/ABI.helper");
|
const getABI = require("./setups/ABI.helper");
|
||||||
const getAllContracts = require("./setups/Contracts-For-Full-Refinancing-Maker-To-Maker.helper");
|
const getAllContracts = require("./setups/Contracts-For-Full-Refinancing.helper");
|
||||||
const enableGelatoConnectorsForFromMaker = require("./setups/Enabling-New-Connectors-For-Full-Refinance.helper");
|
const enableGelatoConnectorsForFromMaker = require("./setups/Enabling-New-Connectors-For-Full-Refinance.helper");
|
||||||
|
|
||||||
const ConnectGelatoDataForFullRefinanceABI = require("../../artifacts/contracts/contracts/connectors/ConnectGelatoDataForFullRefinance.sol/ConnectGelatoDataForFullRefinance.json")
|
const ConnectGelatoDataForFullRefinanceABI = require("../../artifacts/contracts/contracts/connectors/ConnectGelatoDataForFullRefinance.sol/ConnectGelatoDataForFullRefinance.json")
|
||||||
|
@ -21,7 +21,7 @@ const ConnectGelatoDataForFullRefinanceABI = require("../../artifacts/contracts/
|
||||||
|
|
||||||
async function makerETHAToMakerETHBSetup() {
|
async function makerETHAToMakerETHBSetup() {
|
||||||
const wallets = await getWallets();
|
const wallets = await getWallets();
|
||||||
const contracts = await getAllContracts();
|
const contracts = await getAllContracts(wallets.providerAddress);
|
||||||
const constants = await getConstants();
|
const constants = await getConstants();
|
||||||
let vaultAId;
|
let vaultAId;
|
||||||
// Gelato Testing environment setup.
|
// Gelato Testing environment setup.
|
||||||
|
@ -109,7 +109,7 @@ async function providerWhiteListTaskForMakerETHAToMakerETHB(
|
||||||
data: await hre.run("abi-encode-withselector", {
|
data: await hre.run("abi-encode-withselector", {
|
||||||
abi: ConnectGelatoDataForFullRefinanceABI,
|
abi: ConnectGelatoDataForFullRefinanceABI,
|
||||||
functionname: "getDataAndCastForFromMakerToMaker",
|
functionname: "getDataAndCastForFromMakerToMaker",
|
||||||
inputs: [vaultId, constants.ETH, "ETH-B", wallets.providerAddress],
|
inputs: [vaultId, constants.ETH, "ETH-B"],
|
||||||
}),
|
}),
|
||||||
operation: GelatoCoreLib.Operation.Delegatecall,
|
operation: GelatoCoreLib.Operation.Delegatecall,
|
||||||
});
|
});
|
||||||
|
|
|
@ -16,8 +16,9 @@ const GetCdps = require("../../../pre-compiles/GetCdps.json");
|
||||||
const IERC20 = require("../../../pre-compiles/IERC20.json");
|
const IERC20 = require("../../../pre-compiles/IERC20.json");
|
||||||
const CTokenInterface = require("../../../pre-compiles/CTokenInterface.json");
|
const CTokenInterface = require("../../../pre-compiles/CTokenInterface.json");
|
||||||
const CompoundResolver = require("../../../pre-compiles/InstaCompoundResolver.json");
|
const CompoundResolver = require("../../../pre-compiles/InstaCompoundResolver.json");
|
||||||
|
const DsaProviderModuleABI = require("../../../pre-compiles/ProviderModuleDsa_ABI.json");
|
||||||
|
|
||||||
async function getContracts() {
|
async function getContracts(providerAddress) {
|
||||||
// Deployed instances
|
// Deployed instances
|
||||||
let connectGelato;
|
let connectGelato;
|
||||||
let connectMaker;
|
let connectMaker;
|
||||||
|
@ -35,6 +36,7 @@ async function getContracts() {
|
||||||
let instaMapping;
|
let instaMapping;
|
||||||
let instaConnectors;
|
let instaConnectors;
|
||||||
let compoundResolver;
|
let compoundResolver;
|
||||||
|
let dsaProviderModule;
|
||||||
// Contracts to deploy and use for local testing
|
// Contracts to deploy and use for local testing
|
||||||
let conditionMakerVaultUnsafe;
|
let conditionMakerVaultUnsafe;
|
||||||
let connectGelatoProviderPayment;
|
let connectGelatoProviderPayment;
|
||||||
|
@ -99,6 +101,10 @@ async function getContracts() {
|
||||||
CompoundResolver.abi,
|
CompoundResolver.abi,
|
||||||
hre.network.config.CompoundResolver
|
hre.network.config.CompoundResolver
|
||||||
);
|
);
|
||||||
|
dsaProviderModule = await ethers.getContractAt(
|
||||||
|
DsaProviderModuleABI,
|
||||||
|
hre.network.config.ProviderModuleDsa
|
||||||
|
);
|
||||||
|
|
||||||
// ===== Deploy Needed Contract ==================
|
// ===== Deploy Needed Contract ==================
|
||||||
|
|
||||||
|
@ -118,7 +124,8 @@ async function getContracts() {
|
||||||
"ConnectGelatoProviderPayment"
|
"ConnectGelatoProviderPayment"
|
||||||
);
|
);
|
||||||
connectGelatoProviderPayment = await ConnectGelatoProviderPayment.deploy(
|
connectGelatoProviderPayment = await ConnectGelatoProviderPayment.deploy(
|
||||||
(await instaConnectors.connectorLength()).add(2)
|
(await instaConnectors.connectorLength()).add(2),
|
||||||
|
providerAddress
|
||||||
);
|
);
|
||||||
await connectGelatoProviderPayment.deployed();
|
await connectGelatoProviderPayment.deployed();
|
||||||
|
|
||||||
|
@ -150,6 +157,7 @@ async function getContracts() {
|
||||||
connectGelatoData,
|
connectGelatoData,
|
||||||
debtBridgeFromMakerForFullRefinance,
|
debtBridgeFromMakerForFullRefinance,
|
||||||
makerResolver,
|
makerResolver,
|
||||||
|
dsaProviderModule,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,35 +0,0 @@
|
||||||
const hre = require("hardhat");
|
|
||||||
const {ethers} = hre;
|
|
||||||
|
|
||||||
const getContracts = require("./Common-Contracts.helper");
|
|
||||||
|
|
||||||
async function getAllContracts() {
|
|
||||||
let dsaProviderModule;
|
|
||||||
let connectGelatoData;
|
|
||||||
let contracts = await getContracts();
|
|
||||||
|
|
||||||
const ConnectGelatoData = await ethers.getContractFactory(
|
|
||||||
"ConnectGelatoDataForFullRefinance"
|
|
||||||
);
|
|
||||||
connectGelatoData = await ConnectGelatoData.deploy(
|
|
||||||
(await contracts.instaConnectors.connectorLength()).add(1),
|
|
||||||
contracts.connectGelatoProviderPayment.address
|
|
||||||
);
|
|
||||||
await connectGelatoData.deployed();
|
|
||||||
|
|
||||||
const ProviderModuleDsa = await ethers.getContractFactory(
|
|
||||||
"ProviderModuleDsaFromMakerToCompound"
|
|
||||||
);
|
|
||||||
dsaProviderModule = await ProviderModuleDsa.deploy(
|
|
||||||
hre.network.config.GelatoCore,
|
|
||||||
contracts.connectGelatoProviderPayment.address
|
|
||||||
);
|
|
||||||
await dsaProviderModule.deployed();
|
|
||||||
|
|
||||||
contracts.dsaProviderModule = dsaProviderModule;
|
|
||||||
contracts.connectGelatoData = connectGelatoData;
|
|
||||||
|
|
||||||
return contracts;
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = getAllContracts;
|
|
|
@ -3,10 +3,9 @@ const {ethers} = hre;
|
||||||
|
|
||||||
const getContracts = require("./Common-Contracts.helper");
|
const getContracts = require("./Common-Contracts.helper");
|
||||||
|
|
||||||
async function getAllContracts() {
|
async function getAllContracts(providerAddress) {
|
||||||
let dsaProviderModule;
|
|
||||||
let connectGelatoData;
|
let connectGelatoData;
|
||||||
let contracts = await getContracts();
|
let contracts = await getContracts(providerAddress);
|
||||||
|
|
||||||
const ConnectGelatoData = await ethers.getContractFactory(
|
const ConnectGelatoData = await ethers.getContractFactory(
|
||||||
"ConnectGelatoDataForFullRefinance"
|
"ConnectGelatoDataForFullRefinance"
|
||||||
|
@ -17,16 +16,6 @@ async function getAllContracts() {
|
||||||
);
|
);
|
||||||
await connectGelatoData.deployed();
|
await connectGelatoData.deployed();
|
||||||
|
|
||||||
const ProviderModuleDsa = await ethers.getContractFactory(
|
|
||||||
"ProviderModuleDsaFromMakerToMaker"
|
|
||||||
);
|
|
||||||
dsaProviderModule = await ProviderModuleDsa.deploy(
|
|
||||||
hre.network.config.GelatoCore,
|
|
||||||
contracts.connectGelatoProviderPayment.address
|
|
||||||
);
|
|
||||||
await dsaProviderModule.deployed();
|
|
||||||
|
|
||||||
contracts.dsaProviderModule = dsaProviderModule;
|
|
||||||
contracts.connectGelatoData = connectGelatoData;
|
contracts.connectGelatoData = connectGelatoData;
|
||||||
|
|
||||||
return contracts;
|
return contracts;
|
|
@ -94,7 +94,8 @@ describe("ConnectGelatoProviderPayment Unit Test", function () {
|
||||||
"ConnectGelatoProviderPayment"
|
"ConnectGelatoProviderPayment"
|
||||||
);
|
);
|
||||||
connectGelatoProviderPayment = await ConnectGelatoProviderPayment.deploy(
|
connectGelatoProviderPayment = await ConnectGelatoProviderPayment.deploy(
|
||||||
connectorId
|
connectorId,
|
||||||
|
ethers.constants.AddressZero
|
||||||
);
|
);
|
||||||
connectGelatoProviderPayment.deployed();
|
connectGelatoProviderPayment.deployed();
|
||||||
|
|
||||||
|
@ -139,7 +140,50 @@ describe("ConnectGelatoProviderPayment Unit Test", function () {
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
it("#1: payProvider should pay to Provider 300 Dai", async function () {
|
it("#1: payProvider should return error message ConnectGelatoProviderPayment.payProvider:INVALIDADDESS when provider is Zero Address", async function () {
|
||||||
|
await expect(
|
||||||
|
dsa.cast(
|
||||||
|
[connectBasic.address, connectGelatoProviderPayment.address],
|
||||||
|
[
|
||||||
|
await hre.run("abi-encode-withselector", {
|
||||||
|
abi: ConnectBasic.abi,
|
||||||
|
functionname: "deposit",
|
||||||
|
inputs: [
|
||||||
|
"0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",
|
||||||
|
ethers.utils.parseEther("1"),
|
||||||
|
0,
|
||||||
|
"105",
|
||||||
|
],
|
||||||
|
}),
|
||||||
|
await hre.run("abi-encode-withselector", {
|
||||||
|
abi: (
|
||||||
|
await hre.artifacts.readArtifact("ConnectGelatoProviderPayment")
|
||||||
|
).abi,
|
||||||
|
functionname: "payProvider",
|
||||||
|
inputs: ["0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE", 0, "105", 0],
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
userAddress,
|
||||||
|
{
|
||||||
|
value: ethers.utils.parseEther("1"),
|
||||||
|
}
|
||||||
|
)
|
||||||
|
).to.be.revertedWith("ConnectGelatoProviderPayment.payProvider:!_provider");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("#2: setProvider should change the provider address", async function () {
|
||||||
|
expect(await connectGelatoProviderPayment.getProvider()).to.be.equal(
|
||||||
|
ethers.constants.AddressZero
|
||||||
|
);
|
||||||
|
|
||||||
|
await connectGelatoProviderPayment.setProvider(providerAddress);
|
||||||
|
|
||||||
|
expect(await connectGelatoProviderPayment.getProvider()).to.be.equal(
|
||||||
|
providerAddress
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("#3: payProvider should pay to Provider 300 Dai", async function () {
|
||||||
const providerDAIBalanceBefore = await DAI.balanceOf(providerAddress);
|
const providerDAIBalanceBefore = await DAI.balanceOf(providerAddress);
|
||||||
|
|
||||||
await dsa.cast(
|
await dsa.cast(
|
||||||
|
@ -197,13 +241,7 @@ describe("ConnectGelatoProviderPayment Unit Test", function () {
|
||||||
await hre.artifacts.readArtifact("ConnectGelatoProviderPayment")
|
await hre.artifacts.readArtifact("ConnectGelatoProviderPayment")
|
||||||
).abi,
|
).abi,
|
||||||
functionname: "payProvider",
|
functionname: "payProvider",
|
||||||
inputs: [
|
inputs: [DAI.address, ethers.utils.parseUnits("300", 18), 0, 0],
|
||||||
providerAddress,
|
|
||||||
DAI.address,
|
|
||||||
ethers.utils.parseUnits("300", 18),
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
],
|
|
||||||
}),
|
}),
|
||||||
],
|
],
|
||||||
userAddress
|
userAddress
|
||||||
|
@ -214,7 +252,7 @@ describe("ConnectGelatoProviderPayment Unit Test", function () {
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
it("#2: payProvider should pay to Provider 1 ether", async function () {
|
it("#4: payProvider should pay to Provider 1 ether", async function () {
|
||||||
const providerBalanceBefore = await providerWallet.getBalance();
|
const providerBalanceBefore = await providerWallet.getBalance();
|
||||||
|
|
||||||
await dsa.cast(
|
await dsa.cast(
|
||||||
|
@ -235,13 +273,7 @@ describe("ConnectGelatoProviderPayment Unit Test", function () {
|
||||||
await hre.artifacts.readArtifact("ConnectGelatoProviderPayment")
|
await hre.artifacts.readArtifact("ConnectGelatoProviderPayment")
|
||||||
).abi,
|
).abi,
|
||||||
functionname: "payProvider",
|
functionname: "payProvider",
|
||||||
inputs: [
|
inputs: ["0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE", 0, "105", 0],
|
||||||
providerAddress,
|
|
||||||
"0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",
|
|
||||||
0,
|
|
||||||
"105",
|
|
||||||
0,
|
|
||||||
],
|
|
||||||
}),
|
}),
|
||||||
],
|
],
|
||||||
userAddress,
|
userAddress,
|
||||||
|
@ -254,41 +286,4 @@ describe("ConnectGelatoProviderPayment Unit Test", function () {
|
||||||
providerBalanceBefore.add(ethers.utils.parseEther("1"))
|
providerBalanceBefore.add(ethers.utils.parseEther("1"))
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
it("#3: payProvider should return error message ConnectGelatoProviderPayment.payProvider:INVALIDADDESS when provider is Zero Address", async function () {
|
|
||||||
await expect(
|
|
||||||
dsa.cast(
|
|
||||||
[connectBasic.address, connectGelatoProviderPayment.address],
|
|
||||||
[
|
|
||||||
await hre.run("abi-encode-withselector", {
|
|
||||||
abi: ConnectBasic.abi,
|
|
||||||
functionname: "deposit",
|
|
||||||
inputs: [
|
|
||||||
"0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",
|
|
||||||
ethers.utils.parseEther("1"),
|
|
||||||
0,
|
|
||||||
"105",
|
|
||||||
],
|
|
||||||
}),
|
|
||||||
await hre.run("abi-encode-withselector", {
|
|
||||||
abi: (
|
|
||||||
await hre.artifacts.readArtifact("ConnectGelatoProviderPayment")
|
|
||||||
).abi,
|
|
||||||
functionname: "payProvider",
|
|
||||||
inputs: [
|
|
||||||
ethers.constants.AddressZero,
|
|
||||||
"0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",
|
|
||||||
0,
|
|
||||||
"105",
|
|
||||||
0,
|
|
||||||
],
|
|
||||||
}),
|
|
||||||
],
|
|
||||||
userAddress,
|
|
||||||
{
|
|
||||||
value: ethers.utils.parseEther("1"),
|
|
||||||
}
|
|
||||||
)
|
|
||||||
).to.be.revertedWith("ConnectGelatoProviderPayment.payProvider:!_provider");
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in New Issue
Block a user