mirror of
https://github.com/Instadapp/Gelato-automations.git
synced 2024-07-29 22:28:07 +00:00
feat: ConnectGelatoProviderPayment auto-top to GelatoCore
This commit is contained in:
parent
63cd6daa42
commit
10f62bbc9a
|
@ -48,7 +48,7 @@ contract ConnectGelatoDataForFullRefinance is ConnectorInterface {
|
||||||
uint256 internal immutable _id;
|
uint256 internal immutable _id;
|
||||||
address internal immutable _connectGelatoProviderPayment;
|
address internal immutable _connectGelatoProviderPayment;
|
||||||
|
|
||||||
uint256 public constant GAS_COST = 1490779 + (14908 * 12); // 1490779 + ~12% (Estimated Value)
|
uint256 public constant GAS_COST = 1800000 + (18000 * 12); // 1800000 + ~12% (Estimated Value)
|
||||||
|
|
||||||
constructor(uint256 id, address connectGelatoProviderPayment) {
|
constructor(uint256 id, address connectGelatoProviderPayment) {
|
||||||
_id = id;
|
_id = id;
|
||||||
|
|
|
@ -4,12 +4,16 @@ pragma solidity 0.7.4;
|
||||||
import {
|
import {
|
||||||
IConnectGelatoProviderPayment
|
IConnectGelatoProviderPayment
|
||||||
} from "../../interfaces/InstaDapp/connectors/IConnectGelatoProviderPayment.sol";
|
} from "../../interfaces/InstaDapp/connectors/IConnectGelatoProviderPayment.sol";
|
||||||
|
import {Ownable} from "../../vendor/Ownable.sol";
|
||||||
import {Address} from "../../vendor/Address.sol";
|
import {Address} from "../../vendor/Address.sol";
|
||||||
import {IERC20} from "../../interfaces/tokens/IERC20.sol";
|
import {GelatoString} from "../../lib/GelatoString.sol";
|
||||||
|
import {IERC20} from "../../vendor/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 "../../vendor/Ownable.sol";
|
import {
|
||||||
|
IGelatoProviders
|
||||||
|
} from "@gelatonetwork/core/contracts/gelato_core/interfaces/IGelatoProviders.sol";
|
||||||
|
|
||||||
/// @title ConnectGelatoProviderPayment
|
/// @title ConnectGelatoProviderPayment
|
||||||
/// @notice InstaDapp Connector to compensate Gelato automation-gas Providers.
|
/// @notice InstaDapp Connector to compensate Gelato automation-gas Providers.
|
||||||
|
@ -19,11 +23,16 @@ contract ConnectGelatoProviderPayment is
|
||||||
Ownable
|
Ownable
|
||||||
{
|
{
|
||||||
using Address for address payable;
|
using Address for address payable;
|
||||||
|
using GelatoString for string;
|
||||||
using SafeERC20 for IERC20;
|
using SafeERC20 for IERC20;
|
||||||
|
|
||||||
// solhint-disable-next-line const-name-snakecase
|
// solhint-disable-next-line const-name-snakecase
|
||||||
string public constant override name = "ConnectGelatoProviderPayment-v1.0";
|
string public constant override name = "ConnectGelatoProviderPayment-v1.0";
|
||||||
|
|
||||||
|
address
|
||||||
|
public constant
|
||||||
|
override GELATO_CORE = 0x1d681d76ce96E4d70a88A00EBbcfc1E47808d0b8;
|
||||||
|
|
||||||
address public override gelatoProvider;
|
address public override gelatoProvider;
|
||||||
|
|
||||||
uint256 internal immutable _id;
|
uint256 internal immutable _id;
|
||||||
|
@ -55,6 +64,7 @@ contract ConnectGelatoProviderPayment is
|
||||||
/// - _getId does not match actual InstaMemory gelatoProvider payment slot
|
/// - _getId does not match actual InstaMemory gelatoProvider payment slot
|
||||||
/// - _token balance not in DSA
|
/// - _token balance not in DSA
|
||||||
/// - worthless _token risk
|
/// - worthless _token risk
|
||||||
|
/// payable to be compatible in conjunction with DSA.cast payable target
|
||||||
/// @param _token The token used to pay the Provider.
|
/// @param _token The token used to pay the Provider.
|
||||||
/// @param _amt The amount of _token to pay the Gelato Provider.
|
/// @param _amt The amount of _token to pay the Gelato Provider.
|
||||||
/// @param _getId The InstaMemory slot at which the payment amount was stored.
|
/// @param _getId The InstaMemory slot at which the payment amount was stored.
|
||||||
|
@ -71,10 +81,25 @@ contract ConnectGelatoProviderPayment is
|
||||||
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
|
|
||||||
? payable(provider).sendValue(amt)
|
if (_token == ETH) {
|
||||||
: IERC20(_token).safeTransfer(provider, amt);
|
// solhint-disable no-empty-blocks
|
||||||
|
try
|
||||||
|
IGelatoProviders(GELATO_CORE).provideFunds{value: amt}(provider)
|
||||||
|
{} catch Error(string memory error) {
|
||||||
|
error.revertWithInfo(
|
||||||
|
"ConnectGelatoProviderPayment.payProvider.provideFunds:"
|
||||||
|
);
|
||||||
|
} catch {
|
||||||
|
revert(
|
||||||
|
"ConnectGelatoProviderPayment.payProvider.provideFunds:undefined"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
IERC20(_token).safeTransfer(provider, amt);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,11 +4,11 @@ pragma solidity 0.7.4;
|
||||||
import {sub, wmul, wdiv} from "../../vendor/DSMath.sol";
|
import {sub, wmul, wdiv} from "../../vendor/DSMath.sol";
|
||||||
|
|
||||||
function _wCalcCollateralToWithdraw(
|
function _wCalcCollateralToWithdraw(
|
||||||
uint256 _wMinColRatioMaker,
|
uint256 _wMinColRatioA,
|
||||||
uint256 _wMinColRatioB,
|
uint256 _wMinColRatioB,
|
||||||
uint256 _wColPrice,
|
uint256 _wColPrice,
|
||||||
uint256 _wPricedCol,
|
uint256 _wPricedCol,
|
||||||
uint256 _wDaiDebtOnMaker
|
uint256 _wDebtOnA
|
||||||
) pure returns (uint256) {
|
) pure returns (uint256) {
|
||||||
return
|
return
|
||||||
wdiv(
|
wdiv(
|
||||||
|
@ -16,13 +16,10 @@ function _wCalcCollateralToWithdraw(
|
||||||
_wPricedCol,
|
_wPricedCol,
|
||||||
wdiv(
|
wdiv(
|
||||||
sub(
|
sub(
|
||||||
wmul(_wMinColRatioMaker, _wPricedCol),
|
wmul(_wMinColRatioA, _wPricedCol),
|
||||||
wmul(
|
wmul(_wMinColRatioA, wmul(_wMinColRatioB, _wDebtOnA))
|
||||||
_wMinColRatioMaker,
|
|
||||||
wmul(_wMinColRatioB, _wDaiDebtOnMaker)
|
|
||||||
)
|
|
||||||
),
|
),
|
||||||
sub(_wMinColRatioMaker, _wMinColRatioB)
|
sub(_wMinColRatioA, _wMinColRatioB)
|
||||||
)
|
)
|
||||||
),
|
),
|
||||||
_wColPrice
|
_wColPrice
|
||||||
|
@ -30,25 +27,22 @@ function _wCalcCollateralToWithdraw(
|
||||||
}
|
}
|
||||||
|
|
||||||
function _wCalcDebtToRepay(
|
function _wCalcDebtToRepay(
|
||||||
uint256 _wMinColRatioMaker,
|
uint256 _wMinColRatioA,
|
||||||
uint256 _wMinColRatioB,
|
uint256 _wMinColRatioB,
|
||||||
uint256 _wPricedCol,
|
uint256 _wPricedCol,
|
||||||
uint256 _wDaiDebtOnMaker
|
uint256 _wDebtOnA
|
||||||
) pure returns (uint256) {
|
) pure returns (uint256) {
|
||||||
return
|
return
|
||||||
sub(
|
sub(
|
||||||
_wDaiDebtOnMaker,
|
_wDebtOnA,
|
||||||
wmul(
|
wmul(
|
||||||
wdiv(1e18, _wMinColRatioMaker),
|
wdiv(1e18, _wMinColRatioA),
|
||||||
wdiv(
|
wdiv(
|
||||||
sub(
|
sub(
|
||||||
wmul(_wMinColRatioMaker, _wPricedCol),
|
wmul(_wMinColRatioA, _wPricedCol),
|
||||||
wmul(
|
wmul(_wMinColRatioA, wmul(_wMinColRatioB, _wDebtOnA))
|
||||||
_wMinColRatioMaker,
|
|
||||||
wmul(_wMinColRatioB, _wDaiDebtOnMaker)
|
|
||||||
)
|
|
||||||
),
|
),
|
||||||
sub(_wMinColRatioMaker, _wMinColRatioB)
|
sub(_wMinColRatioA, _wMinColRatioB)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
|
@ -14,4 +14,7 @@ interface IConnectGelatoProviderPayment is ConnectorInterface {
|
||||||
) external payable;
|
) external payable;
|
||||||
|
|
||||||
function gelatoProvider() external view returns (address);
|
function gelatoProvider() external view returns (address);
|
||||||
|
|
||||||
|
// solhint-disable-next-line func-name-mixedcase
|
||||||
|
function GELATO_CORE() external pure returns (address);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,8 +0,0 @@
|
||||||
// SPDX-License-Identifier: MIT
|
|
||||||
pragma solidity 0.7.4;
|
|
||||||
|
|
||||||
interface IERC20 {
|
|
||||||
function transfer(address recipient, uint256 amount)
|
|
||||||
external
|
|
||||||
returns (bool);
|
|
||||||
}
|
|
76
contracts/vendor/IERC20.sol
vendored
Normal file
76
contracts/vendor/IERC20.sol
vendored
Normal file
|
@ -0,0 +1,76 @@
|
||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
pragma solidity 0.7.4;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dev Interface of the ERC20 standard as defined in the EIP.
|
||||||
|
*/
|
||||||
|
interface IERC20 {
|
||||||
|
/**
|
||||||
|
* @dev Returns the amount of tokens in existence.
|
||||||
|
*/
|
||||||
|
function totalSupply() external view returns (uint256);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dev Returns the amount of tokens owned by `account`.
|
||||||
|
*/
|
||||||
|
function balanceOf(address account) external view returns (uint256);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dev Moves `amount` tokens from the caller's account to `recipient`.
|
||||||
|
*
|
||||||
|
* Returns a boolean value indicating whether the operation succeeded.
|
||||||
|
*
|
||||||
|
* Emits a {Transfer} event.
|
||||||
|
*/
|
||||||
|
function transfer(address recipient, uint256 amount) external returns (bool);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dev Returns the remaining number of tokens that `spender` will be
|
||||||
|
* allowed to spend on behalf of `owner` through {transferFrom}. This is
|
||||||
|
* zero by default.
|
||||||
|
*
|
||||||
|
* This value changes when {approve} or {transferFrom} are called.
|
||||||
|
*/
|
||||||
|
function allowance(address owner, address spender) external view returns (uint256);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
|
||||||
|
*
|
||||||
|
* Returns a boolean value indicating whether the operation succeeded.
|
||||||
|
*
|
||||||
|
* IMPORTANT: Beware that changing an allowance with this method brings the risk
|
||||||
|
* that someone may use both the old and the new allowance by unfortunate
|
||||||
|
* transaction ordering. One possible solution to mitigate this race
|
||||||
|
* condition is to first reduce the spender's allowance to 0 and set the
|
||||||
|
* desired value afterwards:
|
||||||
|
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
|
||||||
|
*
|
||||||
|
* Emits an {Approval} event.
|
||||||
|
*/
|
||||||
|
function approve(address spender, uint256 amount) external returns (bool);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dev Moves `amount` tokens from `sender` to `recipient` using the
|
||||||
|
* allowance mechanism. `amount` is then deducted from the caller's
|
||||||
|
* allowance.
|
||||||
|
*
|
||||||
|
* Returns a boolean value indicating whether the operation succeeded.
|
||||||
|
*
|
||||||
|
* Emits a {Transfer} event.
|
||||||
|
*/
|
||||||
|
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dev Emitted when `value` tokens are moved from one account (`from`) to
|
||||||
|
* another (`to`).
|
||||||
|
*
|
||||||
|
* Note that `value` may be zero.
|
||||||
|
*/
|
||||||
|
event Transfer(address indexed from, address indexed to, uint256 value);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
|
||||||
|
* a call to {approve}. `value` is the new allowance.
|
||||||
|
*/
|
||||||
|
event Approval(address indexed owner, address indexed spender, uint256 value);
|
||||||
|
}
|
67
contracts/vendor/SafeERC20.sol
vendored
67
contracts/vendor/SafeERC20.sol
vendored
|
@ -1,21 +1,57 @@
|
||||||
// SPDX-License-Identifier: MIT
|
// SPDX-License-Identifier: MIT
|
||||||
pragma solidity 0.7.4;
|
pragma solidity 0.7.4;
|
||||||
|
|
||||||
|
import {IERC20} from "./IERC20.sol";
|
||||||
|
import {SafeMath} from "./SafeMath.sol";
|
||||||
import {Address} from "./Address.sol";
|
import {Address} from "./Address.sol";
|
||||||
import {IERC20} from "../interfaces/tokens/IERC20.sol";
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @title SafeERC20
|
||||||
|
* @dev Wrappers around ERC20 operations that throw on failure (when the token
|
||||||
|
* contract returns false). Tokens that return no value (and instead revert or
|
||||||
|
* throw on failure) are also supported, non-reverting calls are assumed to be
|
||||||
|
* successful.
|
||||||
|
* To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
|
||||||
|
* which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
|
||||||
|
*/
|
||||||
library SafeERC20 {
|
library SafeERC20 {
|
||||||
|
using SafeMath for uint256;
|
||||||
using Address for address;
|
using Address for address;
|
||||||
|
|
||||||
function safeTransfer(
|
function safeTransfer(IERC20 token, address to, uint256 value) internal {
|
||||||
IERC20 token,
|
_callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
|
||||||
address to,
|
}
|
||||||
uint256 value
|
|
||||||
) internal {
|
function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
|
||||||
_callOptionalReturn(
|
_callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
|
||||||
token,
|
}
|
||||||
abi.encodeWithSelector(token.transfer.selector, to, value)
|
|
||||||
|
/**
|
||||||
|
* @dev Deprecated. This function has issues similar to the ones found in
|
||||||
|
* {IERC20-approve}, and its usage is discouraged.
|
||||||
|
*
|
||||||
|
* Whenever possible, use {safeIncreaseAllowance} and
|
||||||
|
* {safeDecreaseAllowance} instead.
|
||||||
|
*/
|
||||||
|
function safeApprove(IERC20 token, address spender, uint256 value) internal {
|
||||||
|
// safeApprove should only be called when setting an initial allowance,
|
||||||
|
// or when resetting it to zero. To increase and decrease it, use
|
||||||
|
// 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
|
||||||
|
// solhint-disable-next-line max-line-length
|
||||||
|
require((value == 0) || (token.allowance(address(this), spender) == 0),
|
||||||
|
"SafeERC20: approve from non-zero to non-zero allowance"
|
||||||
);
|
);
|
||||||
|
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
|
||||||
|
}
|
||||||
|
|
||||||
|
function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
|
||||||
|
uint256 newAllowance = token.allowance(address(this), spender).add(value);
|
||||||
|
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
|
||||||
|
}
|
||||||
|
|
||||||
|
function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
|
||||||
|
uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero");
|
||||||
|
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -29,17 +65,10 @@ library SafeERC20 {
|
||||||
// we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
|
// we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
|
||||||
// the target address contains contract code and also asserts for success in the low-level call.
|
// the target address contains contract code and also asserts for success in the low-level call.
|
||||||
|
|
||||||
bytes memory returndata = address(token).functionCall(
|
bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
|
||||||
data,
|
if (returndata.length > 0) { // Return data is optional
|
||||||
"SafeERC20: low-level call failed"
|
|
||||||
);
|
|
||||||
if (returndata.length > 0) {
|
|
||||||
// Return data is optional
|
|
||||||
// solhint-disable-next-line max-line-length
|
// solhint-disable-next-line max-line-length
|
||||||
require(
|
require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
|
||||||
abi.decode(returndata, (bool)),
|
|
||||||
"SafeERC20: ERC20 operation did not succeed"
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
158
contracts/vendor/SafeMath.sol
vendored
Normal file
158
contracts/vendor/SafeMath.sol
vendored
Normal file
|
@ -0,0 +1,158 @@
|
||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
pragma solidity 0.7.4;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dev Wrappers over Solidity's arithmetic operations with added overflow
|
||||||
|
* checks.
|
||||||
|
*
|
||||||
|
* Arithmetic operations in Solidity wrap on overflow. This can easily result
|
||||||
|
* in bugs, because programmers usually assume that an overflow raises an
|
||||||
|
* error, which is the standard behavior in high level programming languages.
|
||||||
|
* `SafeMath` restores this intuition by reverting the transaction when an
|
||||||
|
* operation overflows.
|
||||||
|
*
|
||||||
|
* Using this library instead of the unchecked operations eliminates an entire
|
||||||
|
* class of bugs, so it's recommended to use it always.
|
||||||
|
*/
|
||||||
|
library SafeMath {
|
||||||
|
/**
|
||||||
|
* @dev Returns the addition of two unsigned integers, reverting on
|
||||||
|
* overflow.
|
||||||
|
*
|
||||||
|
* Counterpart to Solidity's `+` operator.
|
||||||
|
*
|
||||||
|
* Requirements:
|
||||||
|
*
|
||||||
|
* - Addition cannot overflow.
|
||||||
|
*/
|
||||||
|
function add(uint256 a, uint256 b) internal pure returns (uint256) {
|
||||||
|
uint256 c = a + b;
|
||||||
|
require(c >= a, "SafeMath: addition overflow");
|
||||||
|
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dev Returns the subtraction of two unsigned integers, reverting on
|
||||||
|
* overflow (when the result is negative).
|
||||||
|
*
|
||||||
|
* Counterpart to Solidity's `-` operator.
|
||||||
|
*
|
||||||
|
* Requirements:
|
||||||
|
*
|
||||||
|
* - Subtraction cannot overflow.
|
||||||
|
*/
|
||||||
|
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
|
||||||
|
return sub(a, b, "SafeMath: subtraction overflow");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
|
||||||
|
* overflow (when the result is negative).
|
||||||
|
*
|
||||||
|
* Counterpart to Solidity's `-` operator.
|
||||||
|
*
|
||||||
|
* Requirements:
|
||||||
|
*
|
||||||
|
* - Subtraction cannot overflow.
|
||||||
|
*/
|
||||||
|
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
|
||||||
|
require(b <= a, errorMessage);
|
||||||
|
uint256 c = a - b;
|
||||||
|
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dev Returns the multiplication of two unsigned integers, reverting on
|
||||||
|
* overflow.
|
||||||
|
*
|
||||||
|
* Counterpart to Solidity's `*` operator.
|
||||||
|
*
|
||||||
|
* Requirements:
|
||||||
|
*
|
||||||
|
* - Multiplication cannot overflow.
|
||||||
|
*/
|
||||||
|
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
|
||||||
|
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
|
||||||
|
// benefit is lost if 'b' is also tested.
|
||||||
|
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
|
||||||
|
if (a == 0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint256 c = a * b;
|
||||||
|
require(c / a == b, "SafeMath: multiplication overflow");
|
||||||
|
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dev Returns the integer division of two unsigned integers. Reverts on
|
||||||
|
* division by zero. The result is rounded towards zero.
|
||||||
|
*
|
||||||
|
* Counterpart to Solidity's `/` operator. Note: this function uses a
|
||||||
|
* `revert` opcode (which leaves remaining gas untouched) while Solidity
|
||||||
|
* uses an invalid opcode to revert (consuming all remaining gas).
|
||||||
|
*
|
||||||
|
* Requirements:
|
||||||
|
*
|
||||||
|
* - The divisor cannot be zero.
|
||||||
|
*/
|
||||||
|
function div(uint256 a, uint256 b) internal pure returns (uint256) {
|
||||||
|
return div(a, b, "SafeMath: division by zero");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dev Returns the integer division of two unsigned integers. Reverts with custom message on
|
||||||
|
* division by zero. The result is rounded towards zero.
|
||||||
|
*
|
||||||
|
* Counterpart to Solidity's `/` operator. Note: this function uses a
|
||||||
|
* `revert` opcode (which leaves remaining gas untouched) while Solidity
|
||||||
|
* uses an invalid opcode to revert (consuming all remaining gas).
|
||||||
|
*
|
||||||
|
* Requirements:
|
||||||
|
*
|
||||||
|
* - The divisor cannot be zero.
|
||||||
|
*/
|
||||||
|
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
|
||||||
|
require(b > 0, errorMessage);
|
||||||
|
uint256 c = a / b;
|
||||||
|
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
|
||||||
|
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
|
||||||
|
* Reverts when dividing by zero.
|
||||||
|
*
|
||||||
|
* Counterpart to Solidity's `%` operator. This function uses a `revert`
|
||||||
|
* opcode (which leaves remaining gas untouched) while Solidity uses an
|
||||||
|
* invalid opcode to revert (consuming all remaining gas).
|
||||||
|
*
|
||||||
|
* Requirements:
|
||||||
|
*
|
||||||
|
* - The divisor cannot be zero.
|
||||||
|
*/
|
||||||
|
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
|
||||||
|
return mod(a, b, "SafeMath: modulo by zero");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
|
||||||
|
* Reverts with custom message when dividing by zero.
|
||||||
|
*
|
||||||
|
* Counterpart to Solidity's `%` operator. This function uses a `revert`
|
||||||
|
* opcode (which leaves remaining gas untouched) while Solidity uses an
|
||||||
|
* invalid opcode to revert (consuming all remaining gas).
|
||||||
|
*
|
||||||
|
* Requirements:
|
||||||
|
*
|
||||||
|
* - The divisor cannot be zero.
|
||||||
|
*/
|
||||||
|
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
|
||||||
|
require(b != 0, errorMessage);
|
||||||
|
return a % b;
|
||||||
|
}
|
||||||
|
}
|
|
@ -179,18 +179,22 @@ describe("Full Debt Bridge refinancing loan from Maker to Compound", function ()
|
||||||
|
|
||||||
//#region EXPECTED OUTCOME
|
//#region EXPECTED OUTCOME
|
||||||
|
|
||||||
const gasFeesPaidFromCol = ethers.utils
|
|
||||||
.parseUnits(String(1490779 + 14908 * 12), 0)
|
|
||||||
.mul(gelatoGasPrice);
|
|
||||||
const debtOnMakerBefore = await contracts.makerResolver.getMakerVaultDebt(
|
const debtOnMakerBefore = await contracts.makerResolver.getMakerVaultDebt(
|
||||||
vaultId
|
vaultId
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const gasFeesPaidFromCol = ethers.utils
|
||||||
|
.parseUnits(String(1800000 + 18000 * 12), 0)
|
||||||
|
.mul(gelatoGasPrice);
|
||||||
|
|
||||||
const pricedCollateral = (
|
const pricedCollateral = (
|
||||||
await contracts.makerResolver.getMakerVaultCollateralBalance(vaultId)
|
await contracts.makerResolver.getMakerVaultCollateralBalance(vaultId)
|
||||||
).sub(gasFeesPaidFromCol);
|
).sub(gasFeesPaidFromCol);
|
||||||
|
|
||||||
//#endregion
|
//#endregion
|
||||||
const providerBalanceBeforeExecution = await wallets.providerWallet.getBalance();
|
const providerBalanceBeforeExecution = await contracts.gelatoCore.providerFunds(
|
||||||
|
wallets.providerAddress
|
||||||
|
);
|
||||||
|
|
||||||
await expect(
|
await expect(
|
||||||
contracts.gelatoCore.connect(wallets.executorWallet).exec(taskReceipt, {
|
contracts.gelatoCore.connect(wallets.executorWallet).exec(taskReceipt, {
|
||||||
|
@ -214,9 +218,9 @@ describe("Full Debt Bridge refinancing loan from Maker to Compound", function ()
|
||||||
// }
|
// }
|
||||||
// await GelatoCoreLib.sleep(10000);
|
// await GelatoCoreLib.sleep(10000);
|
||||||
|
|
||||||
expect(await wallets.providerWallet.getBalance()).to.be.gt(
|
expect(
|
||||||
providerBalanceBeforeExecution
|
await contracts.gelatoCore.providerFunds(wallets.providerAddress)
|
||||||
);
|
).to.be.gt(providerBalanceBeforeExecution);
|
||||||
|
|
||||||
// compound position of DSA on cDai and cEth
|
// compound position of DSA on cDai and cEth
|
||||||
const compoundPosition = await contracts.compoundResolver.getCompoundData(
|
const compoundPosition = await contracts.compoundResolver.getCompoundData(
|
||||||
|
|
|
@ -183,19 +183,22 @@ describe("Full Debt Bridge refinancing loan from ETH-A to ETH-B", function () {
|
||||||
// by a debt refinancing in compound.
|
// by a debt refinancing in compound.
|
||||||
|
|
||||||
//#region EXPECTED OUTCOME
|
//#region EXPECTED OUTCOME
|
||||||
|
|
||||||
const gasFeesPaidFromCol = ethers.utils
|
|
||||||
.parseUnits(String(1490779 + 14908 * 12), 0)
|
|
||||||
.mul(gelatoGasPrice);
|
|
||||||
const debtOnMakerBefore = await contracts.makerResolver.getMakerVaultDebt(
|
const debtOnMakerBefore = await contracts.makerResolver.getMakerVaultDebt(
|
||||||
vaultAId
|
vaultAId
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const gasFeesPaidFromCol = ethers.utils
|
||||||
|
.parseUnits(String(1800000 + 18000 * 12), 0)
|
||||||
|
.mul(gelatoGasPrice);
|
||||||
|
|
||||||
const pricedCollateral = (
|
const pricedCollateral = (
|
||||||
await contracts.makerResolver.getMakerVaultCollateralBalance(vaultAId)
|
await contracts.makerResolver.getMakerVaultCollateralBalance(vaultAId)
|
||||||
).sub(gasFeesPaidFromCol);
|
).sub(gasFeesPaidFromCol);
|
||||||
|
|
||||||
//#endregion
|
//#endregion
|
||||||
const providerBalanceBeforeExecution = await wallets.providerWallet.getBalance();
|
const providerBalanceBeforeExecution = await contracts.gelatoCore.providerFunds(
|
||||||
|
wallets.providerAddress
|
||||||
|
);
|
||||||
|
|
||||||
await expect(
|
await expect(
|
||||||
contracts.gelatoCore.connect(wallets.executorWallet).exec(taskReceipt, {
|
contracts.gelatoCore.connect(wallets.executorWallet).exec(taskReceipt, {
|
||||||
|
@ -233,9 +236,9 @@ describe("Full Debt Bridge refinancing loan from ETH-A to ETH-B", function () {
|
||||||
vaultBId
|
vaultBId
|
||||||
);
|
);
|
||||||
|
|
||||||
expect(await wallets.providerWallet.getBalance()).to.be.gt(
|
expect(
|
||||||
providerBalanceBeforeExecution
|
await contracts.gelatoCore.providerFunds(wallets.providerAddress)
|
||||||
);
|
).to.be.gt(providerBalanceBeforeExecution);
|
||||||
|
|
||||||
// Estimated amount to borrowed token should be equal to the actual one read on compound contracts
|
// Estimated amount to borrowed token should be equal to the actual one read on compound contracts
|
||||||
expect(debtOnMakerBefore).to.be.equal(debtOnMakerVaultB);
|
expect(debtOnMakerBefore).to.be.equal(debtOnMakerVaultB);
|
||||||
|
|
|
@ -2,6 +2,8 @@ const {expect} = require("chai");
|
||||||
const hre = require("hardhat");
|
const hre = require("hardhat");
|
||||||
const {ethers} = hre;
|
const {ethers} = hre;
|
||||||
|
|
||||||
|
const GelatoCoreLib = require("@gelatonetwork/core");
|
||||||
|
|
||||||
// #region Contracts ABI
|
// #region Contracts ABI
|
||||||
|
|
||||||
const ConnectMaker = require("../../pre-compiles/ConnectMaker.json");
|
const ConnectMaker = require("../../pre-compiles/ConnectMaker.json");
|
||||||
|
@ -28,6 +30,8 @@ describe("ConnectGelatoProviderPayment Unit Test", function () {
|
||||||
let providerWallet;
|
let providerWallet;
|
||||||
let providerAddress;
|
let providerAddress;
|
||||||
|
|
||||||
|
let gelatoCore;
|
||||||
|
|
||||||
let instaList;
|
let instaList;
|
||||||
let instaIndex;
|
let instaIndex;
|
||||||
let DAI;
|
let DAI;
|
||||||
|
@ -54,6 +58,11 @@ describe("ConnectGelatoProviderPayment Unit Test", function () {
|
||||||
hre.network.config.InstaMaster
|
hre.network.config.InstaMaster
|
||||||
);
|
);
|
||||||
|
|
||||||
|
gelatoCore = await ethers.getContractAt(
|
||||||
|
GelatoCoreLib.GelatoCore.abi,
|
||||||
|
hre.network.config.GelatoCore
|
||||||
|
);
|
||||||
|
|
||||||
// Hardhat default accounts prefilled with 100 ETH
|
// Hardhat default accounts prefilled with 100 ETH
|
||||||
expect(await userWallet.getBalance()).to.be.gt(
|
expect(await userWallet.getBalance()).to.be.gt(
|
||||||
ethers.utils.parseEther("10")
|
ethers.utils.parseEther("10")
|
||||||
|
@ -253,7 +262,9 @@ describe("ConnectGelatoProviderPayment Unit Test", function () {
|
||||||
});
|
});
|
||||||
|
|
||||||
it("#4: 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 providerBalanceOnGelatoCoreBefore = await gelatoCore.providerFunds(
|
||||||
|
providerAddress
|
||||||
|
);
|
||||||
|
|
||||||
await dsa.cast(
|
await dsa.cast(
|
||||||
[connectBasic.address, connectGelatoProviderPayment.address],
|
[connectBasic.address, connectGelatoProviderPayment.address],
|
||||||
|
@ -282,8 +293,8 @@ describe("ConnectGelatoProviderPayment Unit Test", function () {
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
expect(await providerWallet.getBalance()).to.be.equal(
|
expect(await gelatoCore.providerFunds(providerAddress)).to.be.equal(
|
||||||
providerBalanceBefore.add(ethers.utils.parseEther("1"))
|
providerBalanceOnGelatoCoreBefore.add(ethers.utils.parseEther("1"))
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in New Issue
Block a user