mirror of
https://github.com/Instadapp/Gelato-automations.git
synced 2024-07-29 22:28:07 +00:00
wip:feat: GelatoTaskResolver and TaskGenerators
This commit is contained in:
parent
9fb2c4aaac
commit
1b8ad50845
300
contracts/connectors/ConnectGelatoFullDebtBridgeFromMaker.sol
Normal file
300
contracts/connectors/ConnectGelatoFullDebtBridgeFromMaker.sol
Normal file
|
@ -0,0 +1,300 @@
|
||||||
|
// SPDX-License-Identifier: UNLICENSED
|
||||||
|
pragma solidity 0.7.4;
|
||||||
|
pragma experimental ABIEncoderV2;
|
||||||
|
|
||||||
|
/* solhint-disable */
|
||||||
|
|
||||||
|
interface ConnectorInterface {
|
||||||
|
function connectorID() external view returns (uint256 _type, uint256 _id);
|
||||||
|
|
||||||
|
function name() external view returns (string memory);
|
||||||
|
}
|
||||||
|
|
||||||
|
interface MemoryInterface {
|
||||||
|
function setUint(uint256 _id, uint256 _val) external;
|
||||||
|
|
||||||
|
function getUint(uint256 _id) external returns (uint256);
|
||||||
|
}
|
||||||
|
|
||||||
|
interface GelatoGasPriceOracle {
|
||||||
|
function latestAnswer() external view returns (int256);
|
||||||
|
}
|
||||||
|
|
||||||
|
interface ManagerLike {
|
||||||
|
function ilks(uint256) external view returns (bytes32);
|
||||||
|
|
||||||
|
function urns(uint256) external view returns (address);
|
||||||
|
|
||||||
|
function vat() external view returns (address);
|
||||||
|
}
|
||||||
|
|
||||||
|
interface VatLike {
|
||||||
|
function ilks(bytes32)
|
||||||
|
external
|
||||||
|
view
|
||||||
|
returns (
|
||||||
|
uint256,
|
||||||
|
uint256,
|
||||||
|
uint256,
|
||||||
|
uint256,
|
||||||
|
uint256
|
||||||
|
);
|
||||||
|
|
||||||
|
function dai(address) external view returns (uint256);
|
||||||
|
|
||||||
|
function urns(bytes32, address) external view returns (uint256, uint256);
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract contract DSMath {
|
||||||
|
// _add, _sub, _mul to avoid clash with Inline Assembly op naming
|
||||||
|
function _add(uint256 x, uint256 y) internal pure returns (uint256 z) {
|
||||||
|
require((z = x + y) >= x, "ds-math-add-overflow");
|
||||||
|
}
|
||||||
|
|
||||||
|
function _sub(uint256 x, uint256 y) internal pure returns (uint256 z) {
|
||||||
|
require((z = x - y) <= x, "ds-math-sub-underflow");
|
||||||
|
}
|
||||||
|
|
||||||
|
function _mul(uint256 x, uint256 y) internal pure returns (uint256 z) {
|
||||||
|
require(y == 0 || (z = x * y) / y == x, "ds-math-_mul-overflow");
|
||||||
|
}
|
||||||
|
|
||||||
|
function min(uint256 x, uint256 y) internal pure returns (uint256 z) {
|
||||||
|
return x <= y ? x : y;
|
||||||
|
}
|
||||||
|
|
||||||
|
function max(uint256 x, uint256 y) internal pure returns (uint256 z) {
|
||||||
|
return x >= y ? x : y;
|
||||||
|
}
|
||||||
|
|
||||||
|
function imin(int256 x, int256 y) internal pure returns (int256 z) {
|
||||||
|
return x <= y ? x : y;
|
||||||
|
}
|
||||||
|
|
||||||
|
function imax(int256 x, int256 y) internal pure returns (int256 z) {
|
||||||
|
return x >= y ? x : y;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint256 constant WAD = 10**18;
|
||||||
|
uint256 constant RAY = 10**27;
|
||||||
|
|
||||||
|
//rounds to zero if x*y < WAD / 2
|
||||||
|
function wmul(uint256 x, uint256 y) internal pure returns (uint256 z) {
|
||||||
|
z = _add(_mul(x, y), WAD / 2) / WAD;
|
||||||
|
}
|
||||||
|
|
||||||
|
//rounds to zero if x*y < WAD / 2
|
||||||
|
function rmul(uint256 x, uint256 y) internal pure returns (uint256 z) {
|
||||||
|
z = _add(_mul(x, y), RAY / 2) / RAY;
|
||||||
|
}
|
||||||
|
|
||||||
|
//rounds to zero if x*y < WAD / 2
|
||||||
|
function wdiv(uint256 x, uint256 y) internal pure returns (uint256 z) {
|
||||||
|
z = _add(_mul(x, WAD), y / 2) / y;
|
||||||
|
}
|
||||||
|
|
||||||
|
//rounds to zero if x*y < RAY / 2
|
||||||
|
function rdiv(uint256 x, uint256 y) internal pure returns (uint256 z) {
|
||||||
|
z = _add(_mul(x, RAY), y / 2) / y;
|
||||||
|
}
|
||||||
|
|
||||||
|
// This famous algorithm is called "exponentiation by squaring"
|
||||||
|
// and calculates x^n with x as fixed-point and n as regular unsigned.
|
||||||
|
//
|
||||||
|
// It's O(log n), instead of O(n) for naive repeated multiplication.
|
||||||
|
//
|
||||||
|
// These facts are why it works:
|
||||||
|
//
|
||||||
|
// If n is even, then x^n = (x^2)^(n/2).
|
||||||
|
// If n is odd, then x^n = x * x^(n-1),
|
||||||
|
// and applying the equation for even x gives
|
||||||
|
// x^n = x * (x^2)^((n-1) / 2).
|
||||||
|
//
|
||||||
|
// Also, EVM division is flooring and
|
||||||
|
// floor[(n-1) / 2] = floor[n / 2].
|
||||||
|
//
|
||||||
|
function rpow(uint256 x, uint256 n) internal pure returns (uint256 z) {
|
||||||
|
z = n % 2 != 0 ? x : RAY;
|
||||||
|
|
||||||
|
for (n /= 2; n != 0; n /= 2) {
|
||||||
|
x = rmul(x, x);
|
||||||
|
|
||||||
|
if (n % 2 != 0) {
|
||||||
|
z = rmul(z, x);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract contract Helpers is ConnectorInterface, DSMath {
|
||||||
|
uint256 internal __id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dev Return Maker MCD Manager Address.
|
||||||
|
*/
|
||||||
|
function getMcdManager() internal pure returns (address) {
|
||||||
|
return 0x5ef30b9986345249bc32d8928B7ee64DE9435E39;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dev Return ethereum address
|
||||||
|
*/
|
||||||
|
function getAddressETH() internal pure returns (address) {
|
||||||
|
return 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; // ETH Address
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dev Return Memory Variable Address
|
||||||
|
*/
|
||||||
|
function getMemoryAddr() internal pure returns (address) {
|
||||||
|
return 0x8a5419CfC711B2343c17a6ABf4B2bAFaBb06957F; // InstaMemory Address
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dev Set Uint value in InstaMemory Contract.
|
||||||
|
*/
|
||||||
|
function setUint(uint256 setId, uint256 val) internal {
|
||||||
|
if (setId != 0) MemoryInterface(getMemoryAddr()).setUint(setId, val);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dev Get Uint value from InstaMemory Contract.
|
||||||
|
*/
|
||||||
|
function getUint(uint256 getId, uint256 val)
|
||||||
|
internal
|
||||||
|
returns (uint256 returnVal)
|
||||||
|
{
|
||||||
|
returnVal = getId == 0
|
||||||
|
? val
|
||||||
|
: MemoryInterface(getMemoryAddr()).getUint(getId);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dev Connector Details
|
||||||
|
*/
|
||||||
|
function connectorID()
|
||||||
|
public
|
||||||
|
view
|
||||||
|
override
|
||||||
|
returns (uint256 _type, uint256 id)
|
||||||
|
{
|
||||||
|
(_type, id) = (1, __id); // Should put specific value.
|
||||||
|
}
|
||||||
|
|
||||||
|
function stringToBytes32(string memory str)
|
||||||
|
internal
|
||||||
|
pure
|
||||||
|
returns (bytes32 result)
|
||||||
|
{
|
||||||
|
require(bytes(str).length != 0, "String-Empty");
|
||||||
|
// solium-disable-next-line security/no-inline-assembly
|
||||||
|
assembly {
|
||||||
|
result := mload(add(str, 32))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* solhint-enable */
|
||||||
|
|
||||||
|
abstract contract GelatoHelpers is Helpers {
|
||||||
|
function _getGelatoGasPriceOracle() internal pure returns (address) {
|
||||||
|
return 0x169E633A2D1E6c10dD91238Ba11c4A708dfEF37C;
|
||||||
|
}
|
||||||
|
|
||||||
|
function _getGelatoGasPrice() internal view returns (uint256) {
|
||||||
|
return
|
||||||
|
uint256(
|
||||||
|
GelatoGasPriceOracle(_getGelatoGasPriceOracle()).latestAnswer()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract contract MakerResolver is GelatoHelpers {
|
||||||
|
function getMakerVaultDebt(uint256 _vaultId)
|
||||||
|
public
|
||||||
|
view
|
||||||
|
returns (uint256 wad)
|
||||||
|
{
|
||||||
|
ManagerLike cdpManager = _getManager();
|
||||||
|
|
||||||
|
(bytes32 ilk, address urn) = _getVaultData(cdpManager, _vaultId);
|
||||||
|
VatLike vat = VatLike(cdpManager.vat());
|
||||||
|
(, uint256 rate, , , ) = VatLike(vat).ilks(ilk);
|
||||||
|
(, uint256 art) = VatLike(vat).urns(ilk, urn);
|
||||||
|
uint256 dai = VatLike(vat).dai(urn);
|
||||||
|
|
||||||
|
uint256 rad = _sub(_mul(art, rate), dai);
|
||||||
|
wad = rad / RAY;
|
||||||
|
|
||||||
|
wad = _mul(wad, RAY) < rad ? wad + 1 : wad;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getMakerVaultCollateralBalance(uint256 _vaultId)
|
||||||
|
public
|
||||||
|
view
|
||||||
|
returns (uint256)
|
||||||
|
{
|
||||||
|
ManagerLike cdpManager = _getManager();
|
||||||
|
|
||||||
|
VatLike vat = VatLike(cdpManager.vat());
|
||||||
|
(bytes32 ilk, address urn) = _getVaultData(cdpManager, _vaultId);
|
||||||
|
(uint256 ink, ) = vat.urns(ilk, urn);
|
||||||
|
|
||||||
|
return ink;
|
||||||
|
}
|
||||||
|
|
||||||
|
function _getVaultData(ManagerLike cdpManager, uint256 vault)
|
||||||
|
internal
|
||||||
|
view
|
||||||
|
returns (bytes32 ilk, address urn)
|
||||||
|
{
|
||||||
|
ilk = cdpManager.ilks(vault);
|
||||||
|
urn = cdpManager.urns(vault);
|
||||||
|
}
|
||||||
|
|
||||||
|
function _getManager() internal pure returns (ManagerLike) {
|
||||||
|
return ManagerLike(getMcdManager());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @title ConnectGelatoFullDebtBridgeFromMaker
|
||||||
|
/// @notice InstaDapp connector for full refinancing of Maker debt positions.
|
||||||
|
/// @author Gelato Team
|
||||||
|
contract ConnectGelatoFullDebtBridgeFromMaker is MakerResolver {
|
||||||
|
// solhint-disable-next-line const-name-snakecase
|
||||||
|
string public constant override name = "GelatoDebtBridge-v1.0";
|
||||||
|
uint256 public constant GAS_COST = 1933090 + (19331 * 2); // 1933080 + ~2% (Estimated Value)
|
||||||
|
|
||||||
|
constructor(uint256 _id) {
|
||||||
|
__id = _id;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @notice Stores payload for full refinancing from a Maker position in InstaMemory.
|
||||||
|
/// @param _vaultID The ID of the makerDAO vault.
|
||||||
|
// @param _getID Id for writting in instaMemory.
|
||||||
|
// @param _setID Id for loading from instaMemory.
|
||||||
|
function saveFullRefinanceDataToMemory(
|
||||||
|
uint256 _vaultID,
|
||||||
|
uint256, /*_getId,*/
|
||||||
|
uint256 /*_setId*/
|
||||||
|
) public payable virtual {
|
||||||
|
uint256 wDaiDebtToMove = getMakerVaultDebt(_vaultID);
|
||||||
|
uint256 wColToWithdrawFromMaker = getMakerVaultCollateralBalance(
|
||||||
|
_vaultID
|
||||||
|
);
|
||||||
|
uint256 gasFeesPaidFromCol = _getGelatoProviderFees();
|
||||||
|
setUint(600, wDaiDebtToMove); // borrow flashloan
|
||||||
|
setUint(601, _sub(wColToWithdrawFromMaker, gasFeesPaidFromCol)); // deposit B
|
||||||
|
setUint(602, wDaiDebtToMove); // borrow B
|
||||||
|
setUint(603, gasFeesPaidFromCol); // pay the provider
|
||||||
|
}
|
||||||
|
|
||||||
|
function _getGelatoProviderFees()
|
||||||
|
internal
|
||||||
|
view
|
||||||
|
virtual
|
||||||
|
returns (uint256 gasCost)
|
||||||
|
{
|
||||||
|
gasCost = _mul(GAS_COST, _getGelatoGasPrice());
|
||||||
|
}
|
||||||
|
}
|
|
@ -240,19 +240,6 @@ abstract contract GelatoHelpers is Helpers {
|
||||||
}
|
}
|
||||||
|
|
||||||
abstract contract MakerResolver is GelatoHelpers {
|
abstract contract MakerResolver is GelatoHelpers {
|
||||||
function _getVaultData(ManagerLike cdpManager, uint256 vault)
|
|
||||||
internal
|
|
||||||
view
|
|
||||||
returns (bytes32 ilk, address urn)
|
|
||||||
{
|
|
||||||
ilk = cdpManager.ilks(vault);
|
|
||||||
urn = cdpManager.urns(vault);
|
|
||||||
}
|
|
||||||
|
|
||||||
function _getManager() internal pure returns (ManagerLike) {
|
|
||||||
return ManagerLike(getMcdManager());
|
|
||||||
}
|
|
||||||
|
|
||||||
function getMakerVaultDebt(uint256 _vaultId)
|
function getMakerVaultDebt(uint256 _vaultId)
|
||||||
public
|
public
|
||||||
view
|
view
|
||||||
|
@ -285,16 +272,30 @@ abstract contract MakerResolver is GelatoHelpers {
|
||||||
|
|
||||||
return ink;
|
return ink;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function _getVaultData(ManagerLike cdpManager, uint256 vault)
|
||||||
|
internal
|
||||||
|
view
|
||||||
|
returns (bytes32 ilk, address urn)
|
||||||
|
{
|
||||||
|
ilk = cdpManager.ilks(vault);
|
||||||
|
urn = cdpManager.urns(vault);
|
||||||
|
}
|
||||||
|
|
||||||
|
function _getManager() internal pure returns (ManagerLike) {
|
||||||
|
return ManagerLike(getMcdManager());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @title ConnectGelatoDebtBridgeFromMaker
|
/// @title ConnectGelatoPartialDebtBridgeFromMaker
|
||||||
/// @notice InstaDapp connector for full or partial refinancing of Maker debt positions.
|
/// @notice InstaDapp connector for partial refinancing of Maker debt positions.
|
||||||
/// @author Gelato Team
|
/// @author Gelato Team
|
||||||
contract ConnectGelatoDebtBridgeFromMaker is MakerResolver {
|
contract ConnectGelatoPartialDebtBridgeFromMaker is MakerResolver {
|
||||||
using GelatoBytes for bytes;
|
using GelatoBytes for bytes;
|
||||||
|
|
||||||
// solhint-disable-next-line const-name-snakecase
|
string
|
||||||
string public constant override name = "GelatoDebtBridge-v1.0";
|
public constant
|
||||||
|
override name = "ConnectGelatoPartialDebtBridgeFromMaker-v1.0"; // solhint-disable-line const-name-snakecase
|
||||||
uint256 public constant GAS_COST = 1933090 + (19331 * 2); // 1933080 + ~2% (Estimated Value)
|
uint256 public constant GAS_COST = 1933090 + (19331 * 2); // 1933080 + ~2% (Estimated Value)
|
||||||
|
|
||||||
constructor(uint256 _id) {
|
constructor(uint256 _id) {
|
||||||
|
@ -333,39 +334,13 @@ contract ConnectGelatoDebtBridgeFromMaker is MakerResolver {
|
||||||
_oraclePayload
|
_oraclePayload
|
||||||
);
|
);
|
||||||
|
|
||||||
_setInstaMemoryUints(
|
|
||||||
wDaiDebtToMove,
|
|
||||||
_sub(wColToWithdrawFromMaker, gasFeesPaidFromCol), // _wColToDepositInB
|
|
||||||
wDaiDebtToMove,
|
|
||||||
gasFeesPaidFromCol
|
|
||||||
);
|
|
||||||
|
|
||||||
// For partial refinance we need to store exact values (no uint(-1) functionality)
|
// For partial refinance we need to store exact values (no uint(-1) functionality)
|
||||||
|
setUint(600, wDaiDebtToMove); // borrow flashloan
|
||||||
setUint(601, wDaiDebtToMove); // payback maker
|
setUint(601, wDaiDebtToMove); // payback maker
|
||||||
setUint(602, wColToWithdrawFromMaker); // withdraw maker
|
setUint(602, wColToWithdrawFromMaker); // withdraw maker
|
||||||
}
|
setUint(603, _sub(wColToWithdrawFromMaker, gasFeesPaidFromCol)); // deposit B
|
||||||
|
setUint(604, wDaiDebtToMove); // borrow B
|
||||||
/// @notice Stores payload for full refinancing from a Maker position in InstaMemory.
|
setUint(605, gasFeesPaidFromCol); // pay the provider
|
||||||
/// @param _vaultID The ID of the makerDAO vault.
|
|
||||||
// @param _getID Id for writting in instaMemory.
|
|
||||||
// @param _setID Id for loading from instaMemory.
|
|
||||||
function saveFullRefinanceDataToMemory(
|
|
||||||
uint256 _vaultID,
|
|
||||||
uint256, /*_getId,*/
|
|
||||||
uint256 /*_setId*/
|
|
||||||
) public payable virtual {
|
|
||||||
uint256 wDaiDebtToMove = getMakerVaultDebt(_vaultID);
|
|
||||||
uint256 wColToWithdrawFromMaker = getMakerVaultCollateralBalance(
|
|
||||||
_vaultID
|
|
||||||
);
|
|
||||||
uint256 gasFeesPaidFromCol = _getGelatoProviderFees();
|
|
||||||
|
|
||||||
_setInstaMemoryUints(
|
|
||||||
_add(wDaiDebtToMove, 1), // 1 wei DAI buffer: MakerResolver debt inaccuracy
|
|
||||||
_sub(wColToWithdrawFromMaker, gasFeesPaidFromCol), // _wColToDepositInB
|
|
||||||
wDaiDebtToMove,
|
|
||||||
gasFeesPaidFromCol
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @notice Computes values needed for DebtBridge Maker->ProtocolB
|
/// @notice Computes values needed for DebtBridge Maker->ProtocolB
|
||||||
|
@ -407,7 +382,7 @@ contract ConnectGelatoDebtBridgeFromMaker is MakerResolver {
|
||||||
|
|
||||||
if (!success) {
|
if (!success) {
|
||||||
returndata.revertWithErrorString(
|
returndata.revertWithErrorString(
|
||||||
"ConnectGelatoDebtBridgeFromMaker.computeDebtBridge:oracle:"
|
"ConnectGelatoPartialDebtBridgeFromMaker.computeDebtBridge:oracle:"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -507,22 +482,6 @@ contract ConnectGelatoDebtBridgeFromMaker is MakerResolver {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
// _gasFeesPaidFromCol == _wColToWithdrawFromMaker - _wColToDepositInB
|
|
||||||
function _setInstaMemoryUints(
|
|
||||||
uint256 _wDaiToBorrowFromInstaPool,
|
|
||||||
uint256 _wColToDepositInB,
|
|
||||||
uint256 _wDaiDebtToMove,
|
|
||||||
uint256 _gasFeesPaidFromCol
|
|
||||||
) internal virtual {
|
|
||||||
setUint(600, _wDaiToBorrowFromInstaPool); // borrow flashloan
|
|
||||||
// For full refinance we do NOT need to store exact values: uint(-1) functionality
|
|
||||||
// setUint(601, wDaiDebtToMove); // for partialRefinancing: payback maker
|
|
||||||
// setUint(602, wColToWithdrawFromMaker); // for partialRefinancing: withdraw maker
|
|
||||||
setUint(603, _wColToDepositInB); // deposit B
|
|
||||||
setUint(604, _wDaiDebtToMove); // borrow B
|
|
||||||
setUint(605, _gasFeesPaidFromCol); // pay the provider
|
|
||||||
}
|
|
||||||
|
|
||||||
function _getGelatoProviderFees()
|
function _getGelatoProviderFees()
|
||||||
internal
|
internal
|
||||||
view
|
view
|
7
contracts/interfaces/IGelatoTaskGenerator.sol
Normal file
7
contracts/interfaces/IGelatoTaskGenerator.sol
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
// "SPDX-License-Identifier: UNLICENSED"
|
||||||
|
pragma solidity 0.7.4;
|
||||||
|
|
||||||
|
interface IGelatoTaskGenerator {
|
||||||
|
// solhint-disable-next-line func-name-mixedcase
|
||||||
|
function SELECTOR() external pure returns (bytes4);
|
||||||
|
}
|
62
contracts/resolvers/GelatoTaskResolver.sol
Normal file
62
contracts/resolvers/GelatoTaskResolver.sol
Normal file
|
@ -0,0 +1,62 @@
|
||||||
|
// "SPDX-License-Identifier: UNLICENSED"
|
||||||
|
pragma solidity 0.7.4;
|
||||||
|
pragma experimental ABIEncoderV2;
|
||||||
|
|
||||||
|
import {Ownable} from "../vendor/Ownable.sol";
|
||||||
|
import {GelatoBytes} from "../lib/GelatoBytes.sol";
|
||||||
|
import {IGelatoTaskGenerator} from "../interfaces/IGelatoTaskGenerator.sol";
|
||||||
|
import {
|
||||||
|
Task
|
||||||
|
} from "@gelatonetwork/core/contracts/gelato_core/interfaces/IGelatoCore.sol";
|
||||||
|
|
||||||
|
/// @title GelatoTaskResolver
|
||||||
|
/// @notice Convenience contract with methods to retrieve Task objects from Task Generators.
|
||||||
|
/// @dev Can be used by Frontends and Maintainers to:
|
||||||
|
/// - Frontends: Retrieve Task structs from Task Generators for submission to GelatoCore
|
||||||
|
/// - Maintainer: Add new version of Task Generators
|
||||||
|
contract GelatoTaskResolver is Ownable {
|
||||||
|
using GelatoBytes for bytes;
|
||||||
|
|
||||||
|
/// @notice The contract that has the function returning a Task object
|
||||||
|
mapping(string => IGelatoTaskGenerator) public taskGenerator;
|
||||||
|
|
||||||
|
/// @notice Adds a new TaskGenerator address
|
||||||
|
/// @dev Only owner can call this, but existing taskGenerator entries are immutable
|
||||||
|
/// @param _taskGenerator The descriptor of the taskGenerator e.g. GelatoDebtBridgeFromMaker
|
||||||
|
/// @param _taskGeneratorAddr The address of the taskGenerator contract
|
||||||
|
function addTaskGenerator(
|
||||||
|
string memory _taskGenerator,
|
||||||
|
IGelatoTaskGenerator _taskGeneratorAddr
|
||||||
|
) external onlyOwner {
|
||||||
|
require(
|
||||||
|
taskGenerator[_taskGenerator] == IGelatoTaskGenerator(0),
|
||||||
|
"GelatoTaskResolver.addTaskGenerator: set"
|
||||||
|
);
|
||||||
|
taskGenerator[_taskGenerator] = _taskGeneratorAddr;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @notice A generelized getter for a price supplied by an taskGenerator contract.
|
||||||
|
/// @dev The taskGenerator returndata must be formatted as a single uint256.
|
||||||
|
/// @param _taskGenerator The descriptor of our taskGenerator e.g. ETH/USD-Maker-v1
|
||||||
|
/// @return The uint256 taskGenerator price
|
||||||
|
function getTask(
|
||||||
|
string calldata _taskGenerator,
|
||||||
|
bytes calldata _abiEncodedParams
|
||||||
|
) external view returns (Task memory) {
|
||||||
|
address taskGeneratorAddr = address(taskGenerator[_taskGenerator]);
|
||||||
|
|
||||||
|
if (taskGeneratorAddr == address(0))
|
||||||
|
revert("GelatoTaskResolver.getTask: !taskGenerator");
|
||||||
|
|
||||||
|
(bool success, bytes memory returndata) = taskGeneratorAddr.staticcall(
|
||||||
|
abi.encodePacked(
|
||||||
|
taskGenerator[_taskGenerator].SELECTOR(),
|
||||||
|
_abiEncodedParams
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
if (!success)
|
||||||
|
returndata.revertWithErrorString("GelatoTaskResolver.getTask:");
|
||||||
|
return abi.decode(returndata, (Task));
|
||||||
|
}
|
||||||
|
}
|
|
@ -20,7 +20,7 @@ describe("Full Debt Bridge refinancing loan from Maker to Compound", function ()
|
||||||
let constants;
|
let constants;
|
||||||
let ABI;
|
let ABI;
|
||||||
|
|
||||||
// Payload Params for ConnectGelatoDebtBridgeFromMaker and ConditionMakerVaultUnsafe
|
// Payload Params for ConnectGelatoFullDebtBridgeFromMaker and ConditionMakerVaultUnsafe
|
||||||
let vaultId;
|
let vaultId;
|
||||||
|
|
||||||
// For TaskSpec and for Task
|
// For TaskSpec and for Task
|
||||||
|
@ -186,11 +186,11 @@ describe("Full Debt Bridge refinancing loan from Maker to Compound", function ()
|
||||||
const gasFeesPaidFromCol = ethers.utils
|
const gasFeesPaidFromCol = ethers.utils
|
||||||
.parseUnits(String(1933090 + 19331 * 2), 0)
|
.parseUnits(String(1933090 + 19331 * 2), 0)
|
||||||
.mul(gelatoGasPrice);
|
.mul(gelatoGasPrice);
|
||||||
const debtOnMakerBefore = await contracts.connectGelatoDebtBridgeFromMaker.getMakerVaultDebt(
|
const debtOnMakerBefore = await contracts.connectGelatoFullDebtBridgeFromMaker.getMakerVaultDebt(
|
||||||
vaultId
|
vaultId
|
||||||
);
|
);
|
||||||
const pricedCollateral = (
|
const pricedCollateral = (
|
||||||
await contracts.connectGelatoDebtBridgeFromMaker.getMakerVaultCollateralBalance(
|
await contracts.connectGelatoFullDebtBridgeFromMaker.getMakerVaultCollateralBalance(
|
||||||
vaultId
|
vaultId
|
||||||
)
|
)
|
||||||
).sub(gasFeesPaidFromCol);
|
).sub(gasFeesPaidFromCol);
|
||||||
|
@ -250,10 +250,10 @@ describe("Full Debt Bridge refinancing loan from Maker to Compound", function ()
|
||||||
)
|
)
|
||||||
).to.be.lt(ethers.utils.parseUnits("1", 12));
|
).to.be.lt(ethers.utils.parseUnits("1", 12));
|
||||||
|
|
||||||
const debtOnMakerAfter = await contracts.connectGelatoDebtBridgeFromMaker.getMakerVaultDebt(
|
const debtOnMakerAfter = await contracts.connectGelatoFullDebtBridgeFromMaker.getMakerVaultDebt(
|
||||||
vaultId
|
vaultId
|
||||||
);
|
);
|
||||||
const collateralOnMakerAfter = await contracts.connectGelatoDebtBridgeFromMaker.getMakerVaultCollateralBalance(
|
const collateralOnMakerAfter = await contracts.connectGelatoFullDebtBridgeFromMaker.getMakerVaultCollateralBalance(
|
||||||
vaultId
|
vaultId
|
||||||
); // in Ether.
|
); // in Ether.
|
||||||
|
|
||||||
|
|
|
@ -20,7 +20,7 @@ describe("Full Debt Bridge refinancing loan from ETH-A to ETH-B", function () {
|
||||||
let constants;
|
let constants;
|
||||||
let ABI;
|
let ABI;
|
||||||
|
|
||||||
// Payload Params for ConnectGelatoDebtBridgeFromMaker and ConditionMakerVaultUnsafe
|
// Payload Params for ConnectGelatoFullDebtBridgeFromMaker and ConditionMakerVaultUnsafe
|
||||||
let vaultAId;
|
let vaultAId;
|
||||||
|
|
||||||
// For TaskSpec and for Task
|
// For TaskSpec and for Task
|
||||||
|
@ -188,11 +188,11 @@ describe("Full Debt Bridge refinancing loan from ETH-A to ETH-B", function () {
|
||||||
const gasFeesPaidFromCol = ethers.utils
|
const gasFeesPaidFromCol = ethers.utils
|
||||||
.parseUnits(String(1933090 + 19331 * 2), 0)
|
.parseUnits(String(1933090 + 19331 * 2), 0)
|
||||||
.mul(gelatoGasPrice);
|
.mul(gelatoGasPrice);
|
||||||
const debtOnMakerBefore = await contracts.connectGelatoDebtBridgeFromMaker.getMakerVaultDebt(
|
const debtOnMakerBefore = await contracts.connectGelatoFullDebtBridgeFromMaker.getMakerVaultDebt(
|
||||||
vaultAId
|
vaultAId
|
||||||
);
|
);
|
||||||
const pricedCollateral = (
|
const pricedCollateral = (
|
||||||
await contracts.connectGelatoDebtBridgeFromMaker.getMakerVaultCollateralBalance(
|
await contracts.connectGelatoFullDebtBridgeFromMaker.getMakerVaultCollateralBalance(
|
||||||
vaultAId
|
vaultAId
|
||||||
)
|
)
|
||||||
).sub(gasFeesPaidFromCol);
|
).sub(gasFeesPaidFromCol);
|
||||||
|
@ -229,10 +229,10 @@ describe("Full Debt Bridge refinancing loan from ETH-A to ETH-B", function () {
|
||||||
let vaultBId = String(cdps.ids[1]);
|
let vaultBId = String(cdps.ids[1]);
|
||||||
expect(cdps.ids[1].isZero()).to.be.false;
|
expect(cdps.ids[1].isZero()).to.be.false;
|
||||||
|
|
||||||
const debtOnMakerVaultB = await contracts.connectGelatoDebtBridgeFromMaker.getMakerVaultDebt(
|
const debtOnMakerVaultB = await contracts.connectGelatoFullDebtBridgeFromMaker.getMakerVaultDebt(
|
||||||
vaultBId
|
vaultBId
|
||||||
);
|
);
|
||||||
const pricedCollateralOnVaultB = await contracts.connectGelatoDebtBridgeFromMaker.getMakerVaultCollateralBalance(
|
const pricedCollateralOnVaultB = await contracts.connectGelatoFullDebtBridgeFromMaker.getMakerVaultCollateralBalance(
|
||||||
vaultBId
|
vaultBId
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -246,10 +246,10 @@ describe("Full Debt Bridge refinancing loan from ETH-A to ETH-B", function () {
|
||||||
// Estimated amount of collateral should be equal to the actual one read on compound contracts
|
// Estimated amount of collateral should be equal to the actual one read on compound contracts
|
||||||
expect(pricedCollateral).to.be.equal(pricedCollateralOnVaultB);
|
expect(pricedCollateral).to.be.equal(pricedCollateralOnVaultB);
|
||||||
|
|
||||||
const debtOnMakerOnVaultAAfter = await contracts.connectGelatoDebtBridgeFromMaker.getMakerVaultDebt(
|
const debtOnMakerOnVaultAAfter = await contracts.connectGelatoFullDebtBridgeFromMaker.getMakerVaultDebt(
|
||||||
vaultAId
|
vaultAId
|
||||||
);
|
);
|
||||||
const collateralOnMakerOnVaultAAfter = await contracts.connectGelatoDebtBridgeFromMaker.getMakerVaultCollateralBalance(
|
const collateralOnMakerOnVaultAAfter = await contracts.connectGelatoFullDebtBridgeFromMaker.getMakerVaultCollateralBalance(
|
||||||
vaultAId
|
vaultAId
|
||||||
); // in Ether.
|
); // in Ether.
|
||||||
|
|
||||||
|
|
|
@ -23,7 +23,7 @@ const PriceOracleResolverABI = require("../../artifacts/contracts/resolvers/Pric
|
||||||
.abi;
|
.abi;
|
||||||
const ConnectGelatoProviderPaymentABI = require("../../artifacts/contracts/connectors/ConnectGelatoProviderPayment.sol/ConnectGelatoProviderPayment.json")
|
const ConnectGelatoProviderPaymentABI = require("../../artifacts/contracts/connectors/ConnectGelatoProviderPayment.sol/ConnectGelatoProviderPayment.json")
|
||||||
.abi;
|
.abi;
|
||||||
const ConnectGelatoDebtBridgeFromMakerABI = require("../../artifacts/contracts/connectors/ConnectGelatoDebtBridgeFromMaker.sol/ConnectGelatoDebtBridgeFromMaker.json")
|
const ConnectGelatoFullDebtBridgeFromMakerABI = require("../../artifacts/contracts/connectors/ConnectGelatoFullDebtBridgeFromMaker.sol/ConnectGelatoFullDebtBridgeFromMaker.json")
|
||||||
.abi;
|
.abi;
|
||||||
|
|
||||||
const ETH = "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE";
|
const ETH = "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE";
|
||||||
|
@ -87,7 +87,7 @@ class Helper {
|
||||||
let compoundResolver;
|
let compoundResolver;
|
||||||
// Contracts to deploy and use for local testing
|
// Contracts to deploy and use for local testing
|
||||||
let conditionMakerVaultUnsafe;
|
let conditionMakerVaultUnsafe;
|
||||||
let connectGelatoDebtBridgeFromMaker;
|
let connectGelatoFullDebtBridgeFromMaker;
|
||||||
let connectGelatoProviderPayment;
|
let connectGelatoProviderPayment;
|
||||||
let priceOracleResolver;
|
let priceOracleResolver;
|
||||||
let dsaProviderModule;
|
let dsaProviderModule;
|
||||||
|
@ -169,13 +169,13 @@ class Helper {
|
||||||
conditionMakerVaultUnsafe = await ConditionMakerVaultUnsafe.deploy();
|
conditionMakerVaultUnsafe = await ConditionMakerVaultUnsafe.deploy();
|
||||||
await conditionMakerVaultUnsafe.deployed();
|
await conditionMakerVaultUnsafe.deployed();
|
||||||
|
|
||||||
const ConnectGelatoDebtBridgeFromMaker = await ethers.getContractFactory(
|
const ConnectGelatoFullDebtBridgeFromMaker = await ethers.getContractFactory(
|
||||||
"ConnectGelatoDebtBridgeFromMaker"
|
"ConnectGelatoFullDebtBridgeFromMaker"
|
||||||
);
|
);
|
||||||
connectGelatoDebtBridgeFromMaker = await ConnectGelatoDebtBridgeFromMaker.deploy(
|
connectGelatoFullDebtBridgeFromMaker = await ConnectGelatoFullDebtBridgeFromMaker.deploy(
|
||||||
(await instaConnectors.connectorLength()).add(1)
|
(await instaConnectors.connectorLength()).add(1)
|
||||||
);
|
);
|
||||||
await connectGelatoDebtBridgeFromMaker.deployed();
|
await connectGelatoFullDebtBridgeFromMaker.deployed();
|
||||||
|
|
||||||
const ConnectGelatoProviderPayment = await ethers.getContractFactory(
|
const ConnectGelatoProviderPayment = await ethers.getContractFactory(
|
||||||
"ConnectGelatoProviderPayment"
|
"ConnectGelatoProviderPayment"
|
||||||
|
@ -212,7 +212,7 @@ class Helper {
|
||||||
instaConnectors: instaConnectors,
|
instaConnectors: instaConnectors,
|
||||||
compoundResolver: compoundResolver,
|
compoundResolver: compoundResolver,
|
||||||
conditionMakerVaultUnsafe: conditionMakerVaultUnsafe,
|
conditionMakerVaultUnsafe: conditionMakerVaultUnsafe,
|
||||||
connectGelatoDebtBridgeFromMaker: connectGelatoDebtBridgeFromMaker,
|
connectGelatoFullDebtBridgeFromMaker: connectGelatoFullDebtBridgeFromMaker,
|
||||||
connectGelatoProviderPayment: connectGelatoProviderPayment,
|
connectGelatoProviderPayment: connectGelatoProviderPayment,
|
||||||
priceOracleResolver: priceOracleResolver,
|
priceOracleResolver: priceOracleResolver,
|
||||||
dsaProviderModule: dsaProviderModule,
|
dsaProviderModule: dsaProviderModule,
|
||||||
|
@ -299,7 +299,7 @@ class Helper {
|
||||||
|
|
||||||
await contracts.instaConnectors
|
await contracts.instaConnectors
|
||||||
.connect(contracts.instaMaster)
|
.connect(contracts.instaMaster)
|
||||||
.enable(contracts.connectGelatoDebtBridgeFromMaker.address);
|
.enable(contracts.connectGelatoFullDebtBridgeFromMaker.address);
|
||||||
|
|
||||||
await contracts.instaConnectors
|
await contracts.instaConnectors
|
||||||
.connect(contracts.instaMaster)
|
.connect(contracts.instaMaster)
|
||||||
|
@ -312,7 +312,7 @@ class Helper {
|
||||||
|
|
||||||
expect(
|
expect(
|
||||||
await contracts.instaConnectors.isConnector([
|
await contracts.instaConnectors.isConnector([
|
||||||
contracts.connectGelatoDebtBridgeFromMaker.address,
|
contracts.connectGelatoFullDebtBridgeFromMaker.address,
|
||||||
])
|
])
|
||||||
).to.be.true;
|
).to.be.true;
|
||||||
expect(
|
expect(
|
||||||
|
@ -537,9 +537,9 @@ class Helper {
|
||||||
let spells = [];
|
let spells = [];
|
||||||
|
|
||||||
const debtBridgeCalculationForFullRefinance = new GelatoCoreLib.Action({
|
const debtBridgeCalculationForFullRefinance = new GelatoCoreLib.Action({
|
||||||
addr: contracts.connectGelatoDebtBridgeFromMaker.address,
|
addr: contracts.connectGelatoFullDebtBridgeFromMaker.address,
|
||||||
data: await hre.run("abi-encode-withselector", {
|
data: await hre.run("abi-encode-withselector", {
|
||||||
abi: ConnectGelatoDebtBridgeFromMakerABI,
|
abi: ConnectGelatoFullDebtBridgeFromMakerABI,
|
||||||
functionname: "saveFullRefinanceDataToMemory",
|
functionname: "saveFullRefinanceDataToMemory",
|
||||||
inputs: [vaultId, 0, 0],
|
inputs: [vaultId, 0, 0],
|
||||||
}),
|
}),
|
||||||
|
@ -589,7 +589,7 @@ class Helper {
|
||||||
data: await hre.run("abi-encode-withselector", {
|
data: await hre.run("abi-encode-withselector", {
|
||||||
abi: ConnectCompound.abi,
|
abi: ConnectCompound.abi,
|
||||||
functionname: "deposit",
|
functionname: "deposit",
|
||||||
inputs: [ETH, 0, "603", 0],
|
inputs: [ETH, 0, "601", 0],
|
||||||
}),
|
}),
|
||||||
operation: GelatoCoreLib.Operation.Delegatecall,
|
operation: GelatoCoreLib.Operation.Delegatecall,
|
||||||
});
|
});
|
||||||
|
@ -601,7 +601,7 @@ class Helper {
|
||||||
data: await hre.run("abi-encode-withselector", {
|
data: await hre.run("abi-encode-withselector", {
|
||||||
abi: ConnectCompound.abi,
|
abi: ConnectCompound.abi,
|
||||||
functionname: "borrow",
|
functionname: "borrow",
|
||||||
inputs: [hre.network.config.DAI, 0, "604", 0],
|
inputs: [hre.network.config.DAI, 0, "602", 0],
|
||||||
}),
|
}),
|
||||||
operation: GelatoCoreLib.Operation.Delegatecall,
|
operation: GelatoCoreLib.Operation.Delegatecall,
|
||||||
});
|
});
|
||||||
|
@ -625,7 +625,7 @@ class Helper {
|
||||||
data: await hre.run("abi-encode-withselector", {
|
data: await hre.run("abi-encode-withselector", {
|
||||||
abi: ConnectGelatoProviderPaymentABI,
|
abi: ConnectGelatoProviderPaymentABI,
|
||||||
functionname: "payProvider",
|
functionname: "payProvider",
|
||||||
inputs: [wallets.providerAddress, ETH, 0, "605", 0],
|
inputs: [wallets.providerAddress, ETH, 0, "603", 0],
|
||||||
}),
|
}),
|
||||||
operation: GelatoCoreLib.Operation.Delegatecall,
|
operation: GelatoCoreLib.Operation.Delegatecall,
|
||||||
});
|
});
|
||||||
|
@ -634,7 +634,7 @@ class Helper {
|
||||||
|
|
||||||
const gasPriceCeil = ethers.constants.MaxUint256;
|
const gasPriceCeil = ethers.constants.MaxUint256;
|
||||||
|
|
||||||
const connectGelatoDebtBridgeFromMakerTaskSpec = new GelatoCoreLib.TaskSpec(
|
const connectGelatoFullDebtBridgeFromMakerTaskSpec = new GelatoCoreLib.TaskSpec(
|
||||||
{
|
{
|
||||||
conditions: [contracts.conditionMakerVaultUnsafe.address],
|
conditions: [contracts.conditionMakerVaultUnsafe.address],
|
||||||
actions: spells,
|
actions: spells,
|
||||||
|
@ -645,7 +645,7 @@ class Helper {
|
||||||
await expect(
|
await expect(
|
||||||
contracts.gelatoCore
|
contracts.gelatoCore
|
||||||
.connect(wallets.providerWallet)
|
.connect(wallets.providerWallet)
|
||||||
.provideTaskSpecs([connectGelatoDebtBridgeFromMakerTaskSpec])
|
.provideTaskSpecs([connectGelatoFullDebtBridgeFromMakerTaskSpec])
|
||||||
).to.emit(contracts.gelatoCore, "LogTaskSpecProvided");
|
).to.emit(contracts.gelatoCore, "LogTaskSpecProvided");
|
||||||
|
|
||||||
expect(
|
expect(
|
||||||
|
@ -653,7 +653,7 @@ class Helper {
|
||||||
.connect(wallets.providerWallet)
|
.connect(wallets.providerWallet)
|
||||||
.isTaskSpecProvided(
|
.isTaskSpecProvided(
|
||||||
wallets.providerAddress,
|
wallets.providerAddress,
|
||||||
connectGelatoDebtBridgeFromMakerTaskSpec
|
connectGelatoFullDebtBridgeFromMakerTaskSpec
|
||||||
)
|
)
|
||||||
).to.be.equal("OK");
|
).to.be.equal("OK");
|
||||||
|
|
||||||
|
@ -664,7 +664,7 @@ class Helper {
|
||||||
wallets.providerAddress,
|
wallets.providerAddress,
|
||||||
await contracts.gelatoCore
|
await contracts.gelatoCore
|
||||||
.connect(wallets.providerWallet)
|
.connect(wallets.providerWallet)
|
||||||
.hashTaskSpec(connectGelatoDebtBridgeFromMakerTaskSpec)
|
.hashTaskSpec(connectGelatoFullDebtBridgeFromMakerTaskSpec)
|
||||||
)
|
)
|
||||||
).to.be.equal(gasPriceCeil);
|
).to.be.equal(gasPriceCeil);
|
||||||
|
|
||||||
|
@ -689,9 +689,9 @@ class Helper {
|
||||||
const spells = [];
|
const spells = [];
|
||||||
|
|
||||||
const debtBridgeCalculationForFullRefinance = new GelatoCoreLib.Action({
|
const debtBridgeCalculationForFullRefinance = new GelatoCoreLib.Action({
|
||||||
addr: contracts.connectGelatoDebtBridgeFromMaker.address,
|
addr: contracts.connectGelatoFullDebtBridgeFromMaker.address,
|
||||||
data: await hre.run("abi-encode-withselector", {
|
data: await hre.run("abi-encode-withselector", {
|
||||||
abi: ConnectGelatoDebtBridgeFromMakerABI,
|
abi: ConnectGelatoFullDebtBridgeFromMakerABI,
|
||||||
functionname: "saveFullRefinanceDataToMemory",
|
functionname: "saveFullRefinanceDataToMemory",
|
||||||
inputs: [vaultId, 0, 0],
|
inputs: [vaultId, 0, 0],
|
||||||
}),
|
}),
|
||||||
|
@ -753,7 +753,7 @@ class Helper {
|
||||||
data: await hre.run("abi-encode-withselector", {
|
data: await hre.run("abi-encode-withselector", {
|
||||||
abi: ConnectMaker.abi,
|
abi: ConnectMaker.abi,
|
||||||
functionname: "deposit",
|
functionname: "deposit",
|
||||||
inputs: [0, 0, "603", 0],
|
inputs: [0, 0, "601", 0],
|
||||||
}),
|
}),
|
||||||
operation: GelatoCoreLib.Operation.Delegatecall,
|
operation: GelatoCoreLib.Operation.Delegatecall,
|
||||||
});
|
});
|
||||||
|
@ -765,7 +765,7 @@ class Helper {
|
||||||
data: await hre.run("abi-encode-withselector", {
|
data: await hre.run("abi-encode-withselector", {
|
||||||
abi: ConnectMaker.abi,
|
abi: ConnectMaker.abi,
|
||||||
functionname: "borrow",
|
functionname: "borrow",
|
||||||
inputs: [0, 0, "604", 0],
|
inputs: [0, 0, "602", 0],
|
||||||
}),
|
}),
|
||||||
operation: GelatoCoreLib.Operation.Delegatecall,
|
operation: GelatoCoreLib.Operation.Delegatecall,
|
||||||
});
|
});
|
||||||
|
@ -789,7 +789,7 @@ class Helper {
|
||||||
data: await hre.run("abi-encode-withselector", {
|
data: await hre.run("abi-encode-withselector", {
|
||||||
abi: ConnectGelatoProviderPaymentABI,
|
abi: ConnectGelatoProviderPaymentABI,
|
||||||
functionname: "payProvider",
|
functionname: "payProvider",
|
||||||
inputs: [wallets.providerAddress, ETH, 0, "605", 0],
|
inputs: [wallets.providerAddress, ETH, 0, "603", 0],
|
||||||
}),
|
}),
|
||||||
operation: GelatoCoreLib.Operation.Delegatecall,
|
operation: GelatoCoreLib.Operation.Delegatecall,
|
||||||
});
|
});
|
||||||
|
@ -798,7 +798,7 @@ class Helper {
|
||||||
|
|
||||||
const gasPriceCeil = ethers.constants.MaxUint256;
|
const gasPriceCeil = ethers.constants.MaxUint256;
|
||||||
|
|
||||||
const connectGelatoDebtBridgeFromMakerTaskSpec = new GelatoCoreLib.TaskSpec(
|
const connectGelatoFullDebtBridgeFromMakerTaskSpec = new GelatoCoreLib.TaskSpec(
|
||||||
{
|
{
|
||||||
conditions: [contracts.conditionMakerVaultUnsafe.address],
|
conditions: [contracts.conditionMakerVaultUnsafe.address],
|
||||||
actions: spells,
|
actions: spells,
|
||||||
|
@ -809,7 +809,7 @@ class Helper {
|
||||||
await expect(
|
await expect(
|
||||||
contracts.gelatoCore
|
contracts.gelatoCore
|
||||||
.connect(wallets.providerWallet)
|
.connect(wallets.providerWallet)
|
||||||
.provideTaskSpecs([connectGelatoDebtBridgeFromMakerTaskSpec])
|
.provideTaskSpecs([connectGelatoFullDebtBridgeFromMakerTaskSpec])
|
||||||
).to.emit(contracts.gelatoCore, "LogTaskSpecProvided");
|
).to.emit(contracts.gelatoCore, "LogTaskSpecProvided");
|
||||||
|
|
||||||
expect(
|
expect(
|
||||||
|
@ -817,7 +817,7 @@ class Helper {
|
||||||
.connect(wallets.providerWallet)
|
.connect(wallets.providerWallet)
|
||||||
.isTaskSpecProvided(
|
.isTaskSpecProvided(
|
||||||
wallets.providerAddress,
|
wallets.providerAddress,
|
||||||
connectGelatoDebtBridgeFromMakerTaskSpec
|
connectGelatoFullDebtBridgeFromMakerTaskSpec
|
||||||
)
|
)
|
||||||
).to.be.equal("OK");
|
).to.be.equal("OK");
|
||||||
|
|
||||||
|
@ -828,7 +828,7 @@ class Helper {
|
||||||
wallets.providerAddress,
|
wallets.providerAddress,
|
||||||
await contracts.gelatoCore
|
await contracts.gelatoCore
|
||||||
.connect(wallets.providerWallet)
|
.connect(wallets.providerWallet)
|
||||||
.hashTaskSpec(connectGelatoDebtBridgeFromMakerTaskSpec)
|
.hashTaskSpec(connectGelatoFullDebtBridgeFromMakerTaskSpec)
|
||||||
)
|
)
|
||||||
).to.be.equal(gasPriceCeil);
|
).to.be.equal(gasPriceCeil);
|
||||||
|
|
||||||
|
|
|
@ -23,15 +23,15 @@ describe("Gelato Debt Bridge Connector Unit Test", function () {
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
let connectGelatoDebtBridgeFromMaker;
|
let connectGelatoPartialDebtBridgeFromMaker;
|
||||||
before(async function () {
|
before(async function () {
|
||||||
const ConnectGelatoDebtBridgeFromMaker = await ethers.getContractFactory(
|
const ConnectGelatoPartialDebtBridgeFromMaker = await ethers.getContractFactory(
|
||||||
"ConnectGelatoDebtBridgeFromMaker"
|
"ConnectGelatoPartialDebtBridgeFromMaker"
|
||||||
);
|
);
|
||||||
connectGelatoDebtBridgeFromMaker = await ConnectGelatoDebtBridgeFromMaker.deploy(
|
connectGelatoPartialDebtBridgeFromMaker = await ConnectGelatoPartialDebtBridgeFromMaker.deploy(
|
||||||
0
|
0
|
||||||
);
|
);
|
||||||
connectGelatoDebtBridgeFromMaker.deployed();
|
connectGelatoPartialDebtBridgeFromMaker.deployed();
|
||||||
});
|
});
|
||||||
|
|
||||||
it("#1: wCalcCollateralToWithdraw should return the amount of collateral to withdraw on protocol 1 and to put on protocol 2", async function () {
|
it("#1: wCalcCollateralToWithdraw should return the amount of collateral to withdraw on protocol 1 and to put on protocol 2", async function () {
|
||||||
|
@ -73,7 +73,7 @@ describe("Gelato Debt Bridge Connector Unit Test", function () {
|
||||||
//#endregion
|
//#endregion
|
||||||
|
|
||||||
expect(
|
expect(
|
||||||
await connectGelatoDebtBridgeFromMaker.wCalcCollateralToWithdraw(
|
await connectGelatoPartialDebtBridgeFromMaker.wCalcCollateralToWithdraw(
|
||||||
minColRatioOnMaker,
|
minColRatioOnMaker,
|
||||||
minColRatioOnPositionB,
|
minColRatioOnPositionB,
|
||||||
collateralPrice,
|
collateralPrice,
|
||||||
|
@ -123,7 +123,7 @@ describe("Gelato Debt Bridge Connector Unit Test", function () {
|
||||||
//#endregion
|
//#endregion
|
||||||
|
|
||||||
expect(
|
expect(
|
||||||
await connectGelatoDebtBridgeFromMaker.wCalcDebtToRepay(
|
await connectGelatoPartialDebtBridgeFromMaker.wCalcDebtToRepay(
|
||||||
minColRatioOnMaker,
|
minColRatioOnMaker,
|
||||||
minColRatioOnPositionB,
|
minColRatioOnPositionB,
|
||||||
collateral,
|
collateral,
|
||||||
|
|
|
@ -13,7 +13,7 @@ const ConnectMaker = require("../pre-compiles/ConnectMaker.json");
|
||||||
const ConnectCompound = require("../pre-compiles/ConnectCompound.json");
|
const ConnectCompound = require("../pre-compiles/ConnectCompound.json");
|
||||||
const ConnectInstaPool = require("../pre-compiles/ConnectInstaPool.json");
|
const ConnectInstaPool = require("../pre-compiles/ConnectInstaPool.json");
|
||||||
const ConnectAuth = require("../pre-compiles/ConnectAuth.json");
|
const ConnectAuth = require("../pre-compiles/ConnectAuth.json");
|
||||||
const ConnectGelatoDebtBridgeFromMakerABI = require("../artifacts/contracts/connectors/ConnectGelatoDebtBridgeFromMaker.sol/ConnectGelatoDebtBridgeFromMaker.json")
|
const ConnectGelatoFullDebtBridgeFromMakerABI = require("../artifacts/contracts/connectors/ConnectGelatoPartialDebtBridgeFromMaker.sol/ConnectGelatoPartialDebtBridgeFromMaker.json")
|
||||||
.abi;
|
.abi;
|
||||||
const ConnectGelatoProviderPaymentABI = require("../artifacts/contracts/connectors/ConnectGelatoProviderPayment.sol/ConnectGelatoProviderPayment.json")
|
const ConnectGelatoProviderPaymentABI = require("../artifacts/contracts/connectors/ConnectGelatoProviderPayment.sol/ConnectGelatoProviderPayment.json")
|
||||||
.abi;
|
.abi;
|
||||||
|
@ -148,7 +148,7 @@ describe("Debt Bridge with External Provider", function () {
|
||||||
|
|
||||||
// Contracts to deploy and use for local testing
|
// Contracts to deploy and use for local testing
|
||||||
let conditionMakerVaultUnsafe;
|
let conditionMakerVaultUnsafe;
|
||||||
let connectGelatoDebtBridgeFromMaker;
|
let connectGelatoPartialDebtBridgeFromMaker;
|
||||||
let connectGelatoProviderPayment;
|
let connectGelatoProviderPayment;
|
||||||
let priceOracleResolver;
|
let priceOracleResolver;
|
||||||
let dsaProviderModule;
|
let dsaProviderModule;
|
||||||
|
@ -156,7 +156,7 @@ describe("Debt Bridge with External Provider", function () {
|
||||||
// Creation during test
|
// Creation during test
|
||||||
let dsa;
|
let dsa;
|
||||||
|
|
||||||
// Payload Params for ConnectGelatoDebtBridgeFromMaker and ConditionMakerVaultUnsafe
|
// Payload Params for ConnectGelatoPartialDebtBridgeFromMaker and ConditionMakerVaultUnsafe
|
||||||
let vaultId;
|
let vaultId;
|
||||||
|
|
||||||
// For TaskSpec and for Task
|
// For TaskSpec and for Task
|
||||||
|
@ -251,13 +251,13 @@ describe("Debt Bridge with External Provider", function () {
|
||||||
conditionMakerVaultUnsafe = await ConditionMakerVaultUnsafe.deploy();
|
conditionMakerVaultUnsafe = await ConditionMakerVaultUnsafe.deploy();
|
||||||
await conditionMakerVaultUnsafe.deployed();
|
await conditionMakerVaultUnsafe.deployed();
|
||||||
|
|
||||||
const ConnectGelatoDebtBridgeFromMaker = await ethers.getContractFactory(
|
const ConnectGelatoPartialDebtBridgeFromMaker = await ethers.getContractFactory(
|
||||||
"ConnectGelatoDebtBridgeFromMaker"
|
"ConnectGelatoPartialDebtBridgeFromMaker"
|
||||||
);
|
);
|
||||||
connectGelatoDebtBridgeFromMaker = await ConnectGelatoDebtBridgeFromMaker.deploy(
|
connectGelatoPartialDebtBridgeFromMaker = await ConnectGelatoPartialDebtBridgeFromMaker.deploy(
|
||||||
(await instaConnectors.connectorLength()).add(1)
|
(await instaConnectors.connectorLength()).add(1)
|
||||||
);
|
);
|
||||||
await connectGelatoDebtBridgeFromMaker.deployed();
|
await connectGelatoPartialDebtBridgeFromMaker.deployed();
|
||||||
|
|
||||||
const ConnectGelatoProviderPayment = await ethers.getContractFactory(
|
const ConnectGelatoProviderPayment = await ethers.getContractFactory(
|
||||||
"ConnectGelatoProviderPayment"
|
"ConnectGelatoProviderPayment"
|
||||||
|
@ -332,7 +332,7 @@ describe("Debt Bridge with External Provider", function () {
|
||||||
|
|
||||||
await instaConnectors
|
await instaConnectors
|
||||||
.connect(instaMaster)
|
.connect(instaMaster)
|
||||||
.enable(connectGelatoDebtBridgeFromMaker.address);
|
.enable(connectGelatoPartialDebtBridgeFromMaker.address);
|
||||||
|
|
||||||
await instaConnectors
|
await instaConnectors
|
||||||
.connect(instaMaster)
|
.connect(instaMaster)
|
||||||
|
@ -345,7 +345,7 @@ describe("Debt Bridge with External Provider", function () {
|
||||||
|
|
||||||
expect(
|
expect(
|
||||||
await instaConnectors.isConnector([
|
await instaConnectors.isConnector([
|
||||||
connectGelatoDebtBridgeFromMaker.address,
|
connectGelatoPartialDebtBridgeFromMaker.address,
|
||||||
])
|
])
|
||||||
).to.be.true;
|
).to.be.true;
|
||||||
expect(
|
expect(
|
||||||
|
@ -538,9 +538,9 @@ describe("Debt Bridge with External Provider", function () {
|
||||||
//#region Actions
|
//#region Actions
|
||||||
|
|
||||||
const debtBridgeCalculation = new GelatoCoreLib.Action({
|
const debtBridgeCalculation = new GelatoCoreLib.Action({
|
||||||
addr: connectGelatoDebtBridgeFromMaker.address,
|
addr: connectGelatoPartialDebtBridgeFromMaker.address,
|
||||||
data: await hre.run("abi-encode-withselector", {
|
data: await hre.run("abi-encode-withselector", {
|
||||||
abi: ConnectGelatoDebtBridgeFromMakerABI,
|
abi: ConnectGelatoFullDebtBridgeFromMakerABI,
|
||||||
functionname: "savePartialRefinanceDataToMemory",
|
functionname: "savePartialRefinanceDataToMemory",
|
||||||
inputs: [
|
inputs: [
|
||||||
vaultId,
|
vaultId,
|
||||||
|
@ -647,7 +647,7 @@ describe("Debt Bridge with External Provider", function () {
|
||||||
|
|
||||||
const gasPriceCeil = ethers.constants.MaxUint256;
|
const gasPriceCeil = ethers.constants.MaxUint256;
|
||||||
|
|
||||||
const connectGelatoDebtBridgeFromMakerTaskSpec = new GelatoCoreLib.TaskSpec(
|
const connectGelatoFullDebtBridgeFromMakerTaskSpec = new GelatoCoreLib.TaskSpec(
|
||||||
{
|
{
|
||||||
conditions: [conditionMakerVaultUnsafe.address],
|
conditions: [conditionMakerVaultUnsafe.address],
|
||||||
actions: spells,
|
actions: spells,
|
||||||
|
@ -658,7 +658,7 @@ describe("Debt Bridge with External Provider", function () {
|
||||||
await expect(
|
await expect(
|
||||||
gelatoCore
|
gelatoCore
|
||||||
.connect(providerWallet)
|
.connect(providerWallet)
|
||||||
.provideTaskSpecs([connectGelatoDebtBridgeFromMakerTaskSpec])
|
.provideTaskSpecs([connectGelatoFullDebtBridgeFromMakerTaskSpec])
|
||||||
).to.emit(gelatoCore, "LogTaskSpecProvided");
|
).to.emit(gelatoCore, "LogTaskSpecProvided");
|
||||||
|
|
||||||
expect(
|
expect(
|
||||||
|
@ -666,7 +666,7 @@ describe("Debt Bridge with External Provider", function () {
|
||||||
.connect(providerWallet)
|
.connect(providerWallet)
|
||||||
.isTaskSpecProvided(
|
.isTaskSpecProvided(
|
||||||
providerAddress,
|
providerAddress,
|
||||||
connectGelatoDebtBridgeFromMakerTaskSpec
|
connectGelatoFullDebtBridgeFromMakerTaskSpec
|
||||||
)
|
)
|
||||||
).to.be.equal("OK");
|
).to.be.equal("OK");
|
||||||
|
|
||||||
|
@ -677,7 +677,7 @@ describe("Debt Bridge with External Provider", function () {
|
||||||
providerAddress,
|
providerAddress,
|
||||||
await gelatoCore
|
await gelatoCore
|
||||||
.connect(providerWallet)
|
.connect(providerWallet)
|
||||||
.hashTaskSpec(connectGelatoDebtBridgeFromMakerTaskSpec)
|
.hashTaskSpec(connectGelatoFullDebtBridgeFromMakerTaskSpec)
|
||||||
)
|
)
|
||||||
).to.be.equal(gasPriceCeil);
|
).to.be.equal(gasPriceCeil);
|
||||||
|
|
||||||
|
@ -798,12 +798,12 @@ describe("Debt Bridge with External Provider", function () {
|
||||||
const gasFeesPaidFromCol = ethers.utils
|
const gasFeesPaidFromCol = ethers.utils
|
||||||
.parseUnits(String(1933090 + 19331 * 2), 0)
|
.parseUnits(String(1933090 + 19331 * 2), 0)
|
||||||
.mul(gelatoGasPrice);
|
.mul(gelatoGasPrice);
|
||||||
const debtOnMakerBefore = await connectGelatoDebtBridgeFromMaker.getMakerVaultDebt(
|
const debtOnMakerBefore = await connectGelatoPartialDebtBridgeFromMaker.getMakerVaultDebt(
|
||||||
vaultId
|
vaultId
|
||||||
);
|
);
|
||||||
const pricedCollateral = wmul(
|
const pricedCollateral = wmul(
|
||||||
(
|
(
|
||||||
await connectGelatoDebtBridgeFromMaker.getMakerVaultCollateralBalance(
|
await connectGelatoPartialDebtBridgeFromMaker.getMakerVaultCollateralBalance(
|
||||||
vaultId
|
vaultId
|
||||||
)
|
)
|
||||||
).sub(gasFeesPaidFromCol),
|
).sub(gasFeesPaidFromCol),
|
||||||
|
@ -882,10 +882,10 @@ describe("Debt Bridge with External Provider", function () {
|
||||||
)
|
)
|
||||||
).to.be.lt(ethers.utils.parseUnits("1", 12));
|
).to.be.lt(ethers.utils.parseUnits("1", 12));
|
||||||
|
|
||||||
const debtOnMakerAfter = await connectGelatoDebtBridgeFromMaker.getMakerVaultDebt(
|
const debtOnMakerAfter = await connectGelatoPartialDebtBridgeFromMaker.getMakerVaultDebt(
|
||||||
vaultId
|
vaultId
|
||||||
);
|
);
|
||||||
const collateralOnMakerAfter = await connectGelatoDebtBridgeFromMaker.getMakerVaultCollateralBalance(
|
const collateralOnMakerAfter = await connectGelatoPartialDebtBridgeFromMaker.getMakerVaultCollateralBalance(
|
||||||
vaultId
|
vaultId
|
||||||
); // in Ether.
|
); // in Ether.
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user