文件 1 的 36:CallbackParam.sol
文件 4 的 36:IMulticall.sol
pragma solidity =0.8.8;
interface IMulticall {
function multicall(bytes[] calldata data) external payable returns (bytes[] memory results);
error MulticallFailed(string revertString);
}
文件 5 的 36:INativeImmutableState.sol
pragma solidity =0.8.8;
interface INativeImmutableState {
function wrappedNativeToken() external view returns (address);
}
文件 6 的 36:INativePayments.sol
pragma solidity =0.8.8;
interface INativePayments {
function refundNatives() external payable;
}
文件 7 的 36:INativeWithdraws.sol
pragma solidity =0.8.8;
interface INativeWithdraws {
function unwrapWrappedNatives(uint256 amountMinimum, address recipient) external payable;
}
文件 8 的 36:IOwnableTwoSteps.sol
文件 9 的 36:ITimeswapV2Option.sol
文件 10 的 36:ITimeswapV2OptionFactory.sol
文件 11 的 36:ITimeswapV2OptionMintCallback.sol
文件 12 的 36:ITimeswapV2OptionSwapCallback.sol
文件 13 的 36:ITimeswapV2PeripheryBorrowGivenPosition.sol
文件 14 的 36:ITimeswapV2PeripheryNoDexBorrowGivenPosition.sol
pragma solidity =0.8.8;
import {ITimeswapV2PeripheryBorrowGivenPosition} from "@timeswap-labs/v2-periphery/contracts/interfaces/ITimeswapV2PeripheryBorrowGivenPosition.sol";
import {TimeswapV2PeripheryNoDexBorrowGivenPositionParam} from "../structs/Param.sol";
import {INativeWithdraws} from "./INativeWithdraws.sol";
import {INativePayments} from "./INativePayments.sol";
import {IMulticall} from "./IMulticall.sol";
interface ITimeswapV2PeripheryNoDexBorrowGivenPosition is
ITimeswapV2PeripheryBorrowGivenPosition,
INativeWithdraws,
INativePayments,
IMulticall
{
event BorrowGivenPosition(
address indexed token0,
address indexed token1,
uint256 strike,
uint256 indexed maturity,
address from,
address tokenTo,
address longTo,
bool isToken0,
bool isLong0,
uint256 tokenAmount,
uint256 positionAmount
);
error MinTokenReached(uint256 tokenAmount, uint256 minTokenAmount);
function borrowGivenPosition(
TimeswapV2PeripheryNoDexBorrowGivenPositionParam calldata param
) external payable returns (uint256 tokenAmount);
}
文件 15 的 36:ITimeswapV2Pool.sol
文件 16 的 36:ITimeswapV2PoolFactory.sol
文件 17 的 36:ITimeswapV2PoolLeverageCallback.sol
文件 18 的 36:ITimeswapV2Token.sol
文件 19 的 36:ITimeswapV2TokenMintCallback.sol
文件 20 的 36:IWrappedNative.sol
pragma solidity =0.8.8;
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
interface IWrappedNative is IERC20 {
function deposit() external payable;
function withdraw(uint256) external;
}
文件 21 的 36:InternalParam.sol
文件 23 的 36:Multicall.sol
pragma solidity =0.8.8;
import "../interfaces/IMulticall.sol";
abstract contract Multicall is IMulticall {
function multicall(bytes[] calldata data) public payable override returns (bytes[] memory results) {
results = new bytes[](data.length);
for (uint256 i = 0; i < data.length; i++) {
(bool success, bytes memory result) = address(this).delegatecall(data[i]);
if (!success) {
if (result.length < 68) revert MulticallFailed("Invalid Result");
assembly {
result := add(result, 0x04)
}
revert MulticallFailed(abi.decode(result, (string)));
}
results[i] = result;
}
}
}
文件 24 的 36:Native.sol
pragma solidity =0.8.8;
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import {IWrappedNative} from "../interfaces/external/IWrappedNative.sol";
import {INativeImmutableState} from "../interfaces/INativeImmutableState.sol";
import {INativeWithdraws} from "../interfaces/INativeWithdraws.sol";
import {INativePayments} from "../interfaces/INativePayments.sol";
import {NativeTransfer} from "../libraries/NativeTransfer.sol";
abstract contract NativeImmutableState is INativeImmutableState {
address public immutable override wrappedNativeToken;
constructor(address chosenWrappedNativeToken) {
wrappedNativeToken = chosenWrappedNativeToken;
}
}
abstract contract NativeWithdraws is INativeWithdraws, NativeImmutableState {
error CallerNotWrappedNative(address from);
error InsufficientWrappedNative(uint256 value);
receive() external payable {
if (msg.sender != wrappedNativeToken) revert CallerNotWrappedNative(msg.sender);
}
function unwrapWrappedNatives(uint256 amountMinimum, address recipient) external payable override {
uint256 balanceWrappedNative = IWrappedNative(wrappedNativeToken).balanceOf(address(this));
if (balanceWrappedNative < amountMinimum) revert InsufficientWrappedNative(balanceWrappedNative);
if (balanceWrappedNative != 0) {
IWrappedNative(wrappedNativeToken).withdraw(balanceWrappedNative);
NativeTransfer.safeTransferNatives(recipient, balanceWrappedNative);
}
}
}
abstract contract NativePayments is INativePayments, NativeImmutableState {
using SafeERC20 for IERC20;
function refundNatives() external payable override {
if (address(this).balance > 0) NativeTransfer.safeTransferNatives(msg.sender, address(this).balance);
}
function pay(address token, address payer, address recipient, uint256 value) internal {
if (token == wrappedNativeToken && address(this).balance >= value) {
IWrappedNative(wrappedNativeToken).deposit{value: value}();
IERC20(token).safeTransfer(recipient, value);
} else {
IERC20(token).safeTransferFrom(payer, recipient, value);
}
}
}
文件 25 的 36:NativeTransfer.sol
pragma solidity =0.8.8;
library NativeTransfer {
error NativeTransferFailed(address to, uint256 value);
function safeTransferNatives(address to, uint256 value) internal {
(bool success, ) = to.call{value: value}(new bytes(0));
if (!success) {
revert NativeTransferFailed(to, value);
}
}
}
文件 26 的 36:OptionFactory.sol
文件 27 的 36:OptionPair.sol
文件 29 的 36:PoolFactory.sol
文件 31 的 36:StrikeAndMaturity.sol
文件 32 的 36:StrikeConversion.sol
文件 33 的 36:TimeswapV2PeripheryBorrowGivenPosition.sol
文件 34 的 36:TimeswapV2PeripheryNoDexBorrowGivenPosition.sol
pragma solidity =0.8.8;
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import {Error} from "@timeswap-labs/v2-library/contracts/Error.sol";
import {StrikeConversion} from "@timeswap-labs/v2-library/contracts/StrikeConversion.sol";
import {TimeswapV2OptionPosition} from "@timeswap-labs/v2-option/contracts/enums/Position.sol";
import {ITimeswapV2Pool} from "@timeswap-labs/v2-pool/contracts/interfaces/ITimeswapV2Pool.sol";
import {ITimeswapV2Token} from "@timeswap-labs/v2-token/contracts/interfaces/ITimeswapV2Token.sol";
import {TimeswapV2PeripheryBorrowGivenPosition} from "@timeswap-labs/v2-periphery/contracts/TimeswapV2PeripheryBorrowGivenPosition.sol";
import {TimeswapV2PeripheryBorrowGivenPositionParam} from "@timeswap-labs/v2-periphery/contracts/structs/Param.sol";
import {TimeswapV2PeripheryBorrowGivenPositionChoiceInternalParam, TimeswapV2PeripheryBorrowGivenPositionInternalParam} from "@timeswap-labs/v2-periphery/contracts/structs/InternalParam.sol";
import {ITimeswapV2PeripheryNoDexBorrowGivenPosition} from "./interfaces/ITimeswapV2PeripheryNoDexBorrowGivenPosition.sol";
import {TimeswapV2PeripheryNoDexBorrowGivenPositionParam} from "./structs/Param.sol";
import {NativeImmutableState, NativeWithdraws, NativePayments} from "./base/Native.sol";
import {Multicall} from "./base/Multicall.sol";
import {Math} from "@timeswap-labs/v2-library/contracts/Math.sol";
contract TimeswapV2PeripheryNoDexBorrowGivenPosition is
ITimeswapV2PeripheryNoDexBorrowGivenPosition,
TimeswapV2PeripheryBorrowGivenPosition,
NativeImmutableState,
NativeWithdraws,
NativePayments,
Multicall
{
using Math for uint256;
using SafeERC20 for IERC20;
constructor(
address chosenOptionFactory,
address chosenPoolFactory,
address chosenTokens,
address chosenNative
)
TimeswapV2PeripheryBorrowGivenPosition(chosenOptionFactory, chosenPoolFactory, chosenTokens)
NativeImmutableState(chosenNative)
{}
function borrowGivenPosition(
TimeswapV2PeripheryNoDexBorrowGivenPositionParam calldata param
) external payable returns (uint256 tokenAmount) {
if (param.deadline < block.timestamp) Error.deadlineReached(param.deadline);
bytes memory data = abi.encode(msg.sender, param.isToken0);
(, , data) = borrowGivenPosition(
TimeswapV2PeripheryBorrowGivenPositionParam({
token0: param.token0,
token1: param.token1,
strike: param.strike,
maturity: param.maturity,
tokenTo: param.isToken0 == param.isLong0 ? address(this) : param.tokenTo,
longTo: param.longTo,
isLong0: param.isLong0,
positionAmount: param.positionAmount,
data: data
})
);
tokenAmount = abi.decode(data, (uint256));
if (tokenAmount < param.minTokenAmount) revert MinTokenReached(tokenAmount, param.minTokenAmount);
emit BorrowGivenPosition(
param.token0,
param.token1,
param.strike,
param.maturity,
msg.sender,
param.tokenTo,
param.longTo,
param.isToken0,
param.isLong0,
tokenAmount,
param.positionAmount
);
}
function timeswapV2PeripheryBorrowGivenPositionChoiceInternal(
TimeswapV2PeripheryBorrowGivenPositionChoiceInternalParam memory param
) internal pure override returns (uint256 tokenAmountToNotSwap, uint256 tokenAmountSwapped, bytes memory data) {
(, bool isToken0) = abi.decode(param.data, (address, bool));
tokenAmountToNotSwap = param.isLong0 == isToken0 ? param.tokenAmount : 0;
tokenAmountSwapped = param.isLong0 == isToken0 ? 0 : param.tokenAmount;
data = param.data;
}
function timeswapV2PeripheryBorrowGivenPositionInternal(
TimeswapV2PeripheryBorrowGivenPositionInternalParam memory param
) internal override returns (bytes memory data) {
(address msgSender, bool isToken0) = abi.decode(param.data, (address, bool));
pay(
param.isLong0 ? param.token0 : param.token1,
msgSender,
param.optionPair,
param.isLong0 ? param.token0Amount : param.token1Amount
);
data = abi.encode(isToken0 ? param.token0Amount : param.token1Amount);
}
}
文件 35 的 36:Transaction.sol
{
"compilationTarget": {
"contracts/TimeswapV2PeripheryNoDexBorrowGivenPosition.sol": "TimeswapV2PeripheryNoDexBorrowGivenPosition"
},
"evmVersion": "london",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": [
":@ensdomains/=../../node_modules/@ensdomains/",
":@openzeppelin/=../../node_modules/@openzeppelin/",
":@timeswap-labs/=../",
":@uniswap/=../../node_modules/@uniswap/",
":base64-sol/=../../node_modules/base64-sol/",
":eth-gas-reporter/=../../node_modules/eth-gas-reporter/",
":forge-std/=/Users/dexterhv/Work/TS/Timeswap-V2-Monorepo/lib/forge-std/src/",
":hardhat-deploy/=../../node_modules/hardhat-deploy/",
":hardhat/=../../node_modules/hardhat/"
]
}
[{"inputs":[{"internalType":"address","name":"chosenOptionFactory","type":"address"},{"internalType":"address","name":"chosenPoolFactory","type":"address"},{"internalType":"address","name":"chosenTokens","type":"address"},{"internalType":"address","name":"chosenNative","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"from","type":"address"}],"name":"CallerNotWrappedNative","type":"error"},{"inputs":[],"name":"CanOnlyBeCalledByOptionContract","type":"error"},{"inputs":[],"name":"CanOnlyBeCalledByPoolContract","type":"error"},{"inputs":[],"name":"CanOnlyBeCalledByTokensContract","type":"error"},{"inputs":[{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"DeadlineReached","type":"error"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"InsufficientWrappedNative","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"internalType":"uint256","name":"minTokenAmount","type":"uint256"}],"name":"MinTokenReached","type":"error"},{"inputs":[{"internalType":"uint256","name":"multiplicand","type":"uint256"},{"internalType":"uint256","name":"multiplier","type":"uint256"},{"internalType":"uint256","name":"divisor","type":"uint256"}],"name":"MulDivOverflow","type":"error"},{"inputs":[{"internalType":"string","name":"revertString","type":"string"}],"name":"MulticallFailed","type":"error"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"NativeTransferFailed","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token0","type":"address"},{"indexed":true,"internalType":"address","name":"token1","type":"address"},{"indexed":false,"internalType":"uint256","name":"strike","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"maturity","type":"uint256"},{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"address","name":"tokenTo","type":"address"},{"indexed":false,"internalType":"address","name":"longTo","type":"address"},{"indexed":false,"internalType":"bool","name":"isToken0","type":"bool"},{"indexed":false,"internalType":"bool","name":"isLong0","type":"bool"},{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"positionAmount","type":"uint256"}],"name":"BorrowGivenPosition","type":"event"},{"inputs":[{"components":[{"internalType":"address","name":"token0","type":"address"},{"internalType":"address","name":"token1","type":"address"},{"internalType":"uint256","name":"strike","type":"uint256"},{"internalType":"uint256","name":"maturity","type":"uint256"},{"internalType":"address","name":"tokenTo","type":"address"},{"internalType":"address","name":"longTo","type":"address"},{"internalType":"bool","name":"isToken0","type":"bool"},{"internalType":"bool","name":"isLong0","type":"bool"},{"internalType":"uint256","name":"positionAmount","type":"uint256"},{"internalType":"uint256","name":"minTokenAmount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"internalType":"struct TimeswapV2PeripheryNoDexBorrowGivenPositionParam","name":"param","type":"tuple"}],"name":"borrowGivenPosition","outputs":[{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"data","type":"bytes[]"}],"name":"multicall","outputs":[{"internalType":"bytes[]","name":"results","type":"bytes[]"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"optionFactory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolFactory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"refundNatives","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"strike","type":"uint256"},{"internalType":"uint256","name":"maturity","type":"uint256"},{"internalType":"uint256","name":"token0AndLong0Amount","type":"uint256"},{"internalType":"uint256","name":"token1AndLong1Amount","type":"uint256"},{"internalType":"uint256","name":"shortAmount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct TimeswapV2OptionMintCallbackParam","name":"param","type":"tuple"}],"name":"timeswapV2OptionMintCallback","outputs":[{"internalType":"bytes","name":"data","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"strike","type":"uint256"},{"internalType":"uint256","name":"maturity","type":"uint256"},{"internalType":"bool","name":"isLong0ToLong1","type":"bool"},{"internalType":"uint256","name":"token0AndLong0Amount","type":"uint256"},{"internalType":"uint256","name":"token1AndLong1Amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct TimeswapV2OptionSwapCallbackParam","name":"param","type":"tuple"}],"name":"timeswapV2OptionSwapCallback","outputs":[{"internalType":"bytes","name":"data","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"strike","type":"uint256"},{"internalType":"uint256","name":"maturity","type":"uint256"},{"internalType":"uint256","name":"long0Amount","type":"uint256"},{"internalType":"uint256","name":"long1Amount","type":"uint256"},{"internalType":"uint256","name":"shortAmount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct TimeswapV2PoolLeverageCallbackParam","name":"param","type":"tuple"}],"name":"timeswapV2PoolLeverageCallback","outputs":[{"internalType":"bytes","name":"data","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"strike","type":"uint256"},{"internalType":"uint256","name":"maturity","type":"uint256"},{"internalType":"uint256","name":"long0Balance","type":"uint256"},{"internalType":"uint256","name":"long1Balance","type":"uint256"},{"internalType":"uint256","name":"longAmount","type":"uint256"},{"internalType":"uint256","name":"shortAmount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct TimeswapV2PoolLeverageChoiceCallbackParam","name":"param","type":"tuple"}],"name":"timeswapV2PoolLeverageChoiceCallback","outputs":[{"internalType":"uint256","name":"long0Amount","type":"uint256"},{"internalType":"uint256","name":"long1Amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"token0","type":"address"},{"internalType":"address","name":"token1","type":"address"},{"internalType":"uint256","name":"strike","type":"uint256"},{"internalType":"uint256","name":"maturity","type":"uint256"},{"internalType":"uint256","name":"long0Amount","type":"uint256"},{"internalType":"uint256","name":"long1Amount","type":"uint256"},{"internalType":"uint256","name":"shortAmount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct TimeswapV2TokenMintCallbackParam","name":"param","type":"tuple"}],"name":"timeswapV2TokenMintCallback","outputs":[{"internalType":"bytes","name":"data","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tokens","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountMinimum","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"unwrapWrappedNatives","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"wrappedNativeToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]