编译器
0.8.18+commit.87f61d96
文件 1 的 19:AdapterDataProvider.sol
pragma solidity ^0.8.18;
import {IAdapterDataProvider} from "./interfaces/IAdapterDataProvider.sol";
contract AdapterDataProvider is IAdapterDataProvider {
address private _owner;
mapping(address => bool) private _headRegistry;
mapping(address => bool) private _tailRegistry;
mapping(address => bool) private _inboundAssetRegistry;
mapping(address => bool) private _outboundAssetRegistry;
constructor(address __owner) {
_owner = __owner;
}
function owner() external view returns (address) {
return _owner;
}
function setOwner(address __owner) external onlyOwner {
_owner = __owner;
}
function isAuthorizedPrecedingContract(
address precedingContract
) external view returns (bool) {
if (precedingContract == address(0)) return true;
return _headRegistry[precedingContract];
}
function isAuthorizedSucceedingContract(
address succeedingContract
) external view returns (bool) {
if (succeedingContract == address(0)) return true;
return _tailRegistry[succeedingContract];
}
function isValidInboundAsset(address asset) external view returns (bool) {
return _inboundAssetRegistry[asset];
}
function isValidOutboundAsset(address asset) external view returns (bool) {
return _outboundAssetRegistry[asset];
}
function setPrecedingContract(
address precedingContract,
bool isValid
) external onlyOwner {
_headRegistry[precedingContract] = isValid;
}
function setSucceedingContract(
address succeedingContract,
bool isValid
) external onlyOwner {
_tailRegistry[succeedingContract] = isValid;
}
function setInboundAsset(address asset, bool isValid) external onlyOwner {
_inboundAssetRegistry[asset] = isValid;
}
function setOutboundAsset(address asset, bool isValid) external onlyOwner {
_outboundAssetRegistry[asset] = isValid;
}
modifier onlyOwner() {
_onlyOwner();
_;
}
function _onlyOwner() private view {
require(msg.sender == _owner, "Only owner");
}
}
文件 2 的 19:Address.sol
pragma solidity ^0.8.18;
library Address {
error InsufficientBalance(uint256 available, uint256 required);
error SendingValueFail();
error InsufficientBalanceForCall(uint256 available, uint256 required);
error NonContractCall();
function isContract(address account) internal view returns (bool) {
bytes32 codehash;
bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
assembly {
codehash := extcodehash(account)
}
return (codehash != accountHash && codehash != 0x0);
}
function sendValue(address payable recipient, uint256 amount) internal {
uint256 balance = address(this).balance;
if (balance < amount) {
revert InsufficientBalance(balance, amount);
}
(bool success, ) = recipient.call{value: amount}("");
if (!(success)) {
revert SendingValueFail();
}
}
function functionCall(
address target,
bytes memory data
) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return _functionCallWithValue(target, data, 0, errorMessage);
}
function functionCallWithValue(
address target,
bytes memory data,
uint256 value
) internal returns (bytes memory) {
return
functionCallWithValue(
target,
data,
value,
"Address: low-level call with value failed"
);
}
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
uint256 balance = address(this).balance;
if (balance < value) {
revert InsufficientBalanceForCall(balance, value);
}
return _functionCallWithValue(target, data, value, errorMessage);
}
function _functionCallWithValue(
address target,
bytes memory data,
uint256 weiValue,
string memory errorMessage
) private returns (bytes memory) {
if (!(isContract(target))) {
revert NonContractCall();
}
(bool success, bytes memory returndata) = target.call{value: weiValue}(
data
);
if (success) {
return returndata;
} else {
if (returndata.length > 0) {
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
文件 3 的 19:BaseAdapter.sol
pragma solidity ^0.8.18;
import {Basic} from "./common/Basic.sol";
import {Errors} from "./utils/Errors.sol";
import {ReentrancyGuard} from "./utils/ReentrancyGuard.sol";
import {AdapterDataProvider} from "./AdapterDataProvider.sol";
abstract contract BaseAdapter is Basic, ReentrancyGuard {
address private immutable _self;
address private immutable _native;
address private immutable _wnative;
AdapterDataProvider private immutable _adapterDataProvider;
event ExecutionEvent(string indexed adapterName, bytes data);
event OperationFailedRefundEvent(
address token,
address recipient,
uint256 amount
);
event UnsupportedOperation(
address token,
address refundAddress,
uint256 amount
);
constructor(
address __native,
address __wnative,
bool __deployDataProvider,
address __owner
) {
_self = address(this);
_native = __native;
_wnative = __wnative;
AdapterDataProvider dataProvider;
if (__deployDataProvider)
dataProvider = new AdapterDataProvider(__owner);
else dataProvider = AdapterDataProvider(address(0));
_adapterDataProvider = dataProvider;
}
function wnative() public view override returns (address) {
return _wnative;
}
function native() public view override returns (address) {
return _native;
}
function adapterDataProvider() public view returns (AdapterDataProvider) {
return _adapterDataProvider;
}
function isAuthorizedPrecedingContract(
address precedingContract
) public view returns (bool) {
return
_adapterDataProvider.isAuthorizedPrecedingContract(
precedingContract
);
}
function isAuthorizedSucceedingContract(
address succeedingContract
) public view returns (bool) {
return
_adapterDataProvider.isAuthorizedSucceedingContract(
succeedingContract
);
}
function isValidInboundAsset(address asset) public view returns (bool) {
return _adapterDataProvider.isValidInboundAsset(asset);
}
function isValidOutboundAsset(address asset) public view returns (bool) {
return _adapterDataProvider.isValidOutboundAsset(asset);
}
function name() public view virtual returns (string memory);
function self() public view returns (address) {
return _self;
}
}
文件 4 的 19:Basic.sol
pragma solidity ^0.8.18;
import {TokenInterface} from "./Interfaces.sol";
import {TokenUtilsBase} from "./TokenUtilsBase.sol";
abstract contract Basic is TokenUtilsBase {
function getTokenBal(address token) internal view returns (uint _amt) {
_amt = address(token) == native()
? address(this).balance
: TokenInterface(token).balanceOf(address(this));
}
function approve(address token, address spender, uint256 amount) internal {
try TokenInterface(token).approve(spender, amount) {} catch {
TokenInterface(token).approve(spender, 0);
TokenInterface(token).approve(spender, amount);
}
}
function convertNativeToWnative(uint amount) internal {
TokenInterface(wnative()).deposit{value: amount}();
}
function convertWnativeToNative(uint amount) internal {
TokenInterface(wnative()).withdraw(amount);
}
}
文件 5 的 19:Context.sol
pragma solidity ^0.8.0;
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
文件 6 的 19:DexSpanAdapter.sol
pragma solidity ^0.8.18;
import {IDexSpan} from "../../interfaces/IDexSpan.sol";
import {RouterIntentEoaAdapterWithoutDataProvider, EoaExecutorWithoutDataProvider} from "@routerprotocol/intents-core/contracts/RouterIntentEoaAdapter.sol";
import {Errors} from "@routerprotocol/intents-core/contracts/utils/Errors.sol";
import {IERC20, SafeERC20} from "../../utils/SafeERC20.sol";
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
contract DexSpanDataStore is Ownable {
address public dexspan;
constructor(address _owner, address _dexspan) {
_transferOwnership(_owner);
dexspan = _dexspan;
}
function setDexSpan(address _dexspan) external onlyOwner {
dexspan = _dexspan;
}
}
contract DexSpanAdapter is RouterIntentEoaAdapterWithoutDataProvider {
using SafeERC20 for IERC20;
DexSpanDataStore public immutable dexSpanDataStore;
constructor(
address __native,
address __wnative,
address __dexspan
) RouterIntentEoaAdapterWithoutDataProvider(__native, __wnative) {
dexSpanDataStore = new DexSpanDataStore(msg.sender, __dexspan);
}
function name() public pure override returns (string memory) {
return "DexSpanAdapter";
}
function execute(
bytes calldata data
) external payable override returns (address[] memory tokens) {
IDexSpan.SameChainSwapParams memory swapData = parseInputs(data);
if (address(this) == self()) {
if (address(swapData.tokens[0]) != native())
swapData.tokens[0].safeTransferFrom(
msg.sender,
self(),
swapData.amount
);
else
require(
msg.value == swapData.amount,
Errors.INSUFFICIENT_NATIVE_FUNDS_PASSED
);
} else if (swapData.amount == type(uint256).max) {
if (address(swapData.tokens[0]) != native())
swapData.amount = swapData.tokens[0].balanceOf(address(this));
else swapData.amount = address(this).balance;
}
bytes memory logData;
(tokens, logData) = _swap(swapData);
emit ExecutionEvent(name(), logData);
return tokens;
}
function _swap(
IDexSpan.SameChainSwapParams memory _swapData
) internal returns (address[] memory tokens, bytes memory logData) {
address dexspan = dexSpanDataStore.dexspan();
withdrawTokens(address(_swapData.tokens[0]), dexspan, _swapData.amount);
IDexSpan(dexspan).swapInSameChain(
_swapData.tokens,
_swapData.amount,
_swapData.minReturn,
_swapData.flags,
_swapData.dataTx,
true,
_swapData.recipient,
_swapData.widgetId
);
tokens = new address[](2);
tokens[0] = address(_swapData.tokens[0]);
tokens[1] = address(_swapData.tokens[_swapData.tokens.length - 1]);
logData = abi.encode(_swapData.tokens, _swapData.amount);
}
function parseInputs(
bytes memory data
) public pure returns (IDexSpan.SameChainSwapParams memory) {
IDexSpan.SameChainSwapParams memory swapData = abi.decode(
data,
(IDexSpan.SameChainSwapParams)
);
return swapData;
}
}
文件 7 的 19:EoaExecutor.sol
pragma solidity ^0.8.18;
abstract contract EoaExecutorWithDataProvider {
function execute(
address precedingAdapter,
address succeedingAdapter,
bytes calldata data
) external payable virtual returns (address[] memory tokens);
}
abstract contract EoaExecutorWithoutDataProvider {
function execute(
bytes calldata data
) external payable virtual returns (address[] memory tokens);
}
文件 8 的 19:Errors.sol
pragma solidity ^0.8.18;
library Errors {
string public constant ARRAY_LENGTH_MISMATCH = "1";
string public constant INSUFFICIENT_NATIVE_FUNDS_PASSED = "2";
string public constant WRONG_BATCH_PROVIDED = "3";
string public constant INVALID_CALL_TYPE = "4";
string public constant ONLY_NITRO = "5";
string public constant ONLY_SELF = "6";
string public constant ADAPTER_NOT_WHITELISTED = "7";
}
文件 9 的 19:IAdapterDataProvider.sol
pragma solidity ^0.8.18;
interface IAdapterDataProvider {
function owner() external view returns (address);
function setOwner(address __owner) external;
function isAuthorizedPrecedingContract(
address precedingContract
) external view returns (bool);
function isAuthorizedSucceedingContract(
address succeedingContract
) external view returns (bool);
function isValidInboundAsset(address asset) external view returns (bool);
function isValidOutboundAsset(address asset) external view returns (bool);
function setPrecedingContract(
address precedingContract,
bool isValid
) external;
function setSucceedingContract(
address succeedingContract,
bool isValid
) external;
function setInboundAsset(address asset, bool isValid) external;
function setOutboundAsset(address asset, bool isValid) external;
}
文件 10 的 19:IDexSpan.sol
pragma solidity ^0.8.18;
import {IERC20} from "../utils/SafeERC20.sol";
interface IDexSpan {
struct SameChainSwapParams {
IERC20[] tokens;
uint256 widgetId;
uint256 amount;
uint256 minReturn;
uint256[] flags;
bytes[] dataTx;
address recipient;
}
struct SwapParams {
IERC20[] tokens;
uint256 amount;
uint256 minReturn;
uint256[] flags;
bytes[] dataTx;
bool isWrapper;
address recipient;
bytes destToken;
}
function swapInSameChain(
IERC20[] memory tokens,
uint256 amount,
uint256 minReturn,
uint256[] memory flags,
bytes[] memory dataTx,
bool isWrapper,
address recipient,
uint256 widgetID
) external payable returns (uint256 returnAmount);
function swapAndDeposit(
uint256 partnerId,
bytes32 destChainIdBytes,
bytes calldata recipient,
uint8 depositType,
uint256 feeAmount,
bytes memory message,
SwapParams memory swapData,
address refundRecipient
) external payable;
}
文件 11 的 19:IERC20.sol
pragma solidity ^0.8.18;
interface IERC20 {
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function decimals() external view returns (uint8);
function totalSupply() external view returns (uint256 supply);
function balanceOf(address _owner) external view returns (uint256 balance);
function transfer(
address _to,
uint256 _value
) external returns (bool success);
function transferFrom(
address _from,
address _to,
uint256 _value
) external returns (bool success);
function approve(
address _spender,
uint256 _value
) external returns (bool success);
function allowance(
address _owner,
address _spender
) external view returns (uint256 remaining);
event Approval(
address indexed _owner,
address indexed _spender,
uint256 _value
);
}
文件 12 的 19:IWETH.sol
pragma solidity ^0.8.18;
import {IERC20} from "../utils/SafeERC20.sol";
abstract contract IWETH {
function allowance(address, address) public view virtual returns (uint256);
function balanceOf(address) public view virtual returns (uint256);
function approve(address, uint256) public virtual;
function transfer(address, uint256) public virtual returns (bool);
function transferFrom(
address,
address,
uint256
) public virtual returns (bool);
function deposit() public payable virtual;
function withdraw(uint256) public virtual;
}
文件 13 的 19:Interfaces.sol
pragma solidity ^0.8.18;
interface TokenInterface {
function approve(address, uint256) external;
function transfer(address, uint) external;
function transferFrom(address, address, uint) external;
function deposit() external payable;
function withdraw(uint) external;
function balanceOf(address) external view returns (uint);
function decimals() external view returns (uint);
}
文件 14 的 19:Ownable.sol
pragma solidity ^0.8.0;
import "../utils/Context.sol";
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
constructor() {
_transferOwnership(_msgSender());
}
modifier onlyOwner() {
_checkOwner();
_;
}
function owner() public view virtual returns (address) {
return _owner;
}
function _checkOwner() internal view virtual {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
}
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
文件 15 的 19:ReentrancyGuard.sol
pragma solidity ^0.8.18;
abstract contract ReentrancyGuard {
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
error ReentrantCall();
constructor() {
_status = _NOT_ENTERED;
}
modifier nonReentrant() {
if (_status == _ENTERED) {
revert ReentrantCall();
}
_status = _ENTERED;
_;
_status = _NOT_ENTERED;
}
}
文件 16 的 19:RouterIntentEoaAdapter.sol
pragma solidity ^0.8.18;
import {BaseAdapter} from "./BaseAdapter.sol";
import {EoaExecutorWithDataProvider, EoaExecutorWithoutDataProvider} from "./utils/EoaExecutor.sol";
abstract contract RouterIntentEoaAdapterWithDataProvider is
BaseAdapter,
EoaExecutorWithDataProvider
{
constructor(
address __native,
address __wnative,
address __owner
)
BaseAdapter(__native, __wnative, true, __owner)
{
}
}
abstract contract RouterIntentEoaAdapterWithoutDataProvider is
BaseAdapter,
EoaExecutorWithoutDataProvider
{
constructor(
address __native,
address __wnative
)
BaseAdapter(__native, __wnative, false, address(0))
{
}
}
文件 17 的 19:SafeERC20.sol
pragma solidity ^0.8.18;
import {IERC20} from "../interfaces/IERC20.sol";
import {Address} from "./Address.sol";
import {SafeMath} from "./SafeMath.sol";
library SafeERC20 {
using SafeMath for uint256;
using Address for address;
function safeTransfer(IERC20 token, address to, uint256 value) internal {
_callOptionalReturn(
token,
abi.encodeWithSelector(token.transfer.selector, to, value)
);
}
function safeTransferFrom(
IERC20 token,
address from,
address to,
uint256 value
) internal {
_callOptionalReturn(
token,
abi.encodeWithSelector(token.transferFrom.selector, from, to, value)
);
}
function safeApprove(
IERC20 token,
address spender,
uint256 value
) internal {
_callOptionalReturn(
token,
abi.encodeWithSelector(token.approve.selector, spender, 0)
);
_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
)
);
}
function _callOptionalReturn(IERC20 token, bytes memory data) private {
bytes memory returndata = address(token).functionCall(
data,
"SafeERC20: low-level call failed"
);
if (returndata.length > 0) {
require(
abi.decode(returndata, (bool)),
"SafeERC20: operation failed"
);
}
}
}
文件 18 的 19:SafeMath.sol
pragma solidity ^0.8.18;
library SafeMath {
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return sub(a, b, "SafeMath: subtraction overflow");
}
function sub(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
require(b <= a, errorMessage);
uint256 c = a - b;
return c;
}
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b, "SafeMath: mul overflow");
return c;
}
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return div(a, b, "SafeMath: division by zero");
}
function div(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
require(b > 0, errorMessage);
uint256 c = a / b;
return c;
}
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return mod(a, b, "SafeMath: modulo by zero");
}
function mod(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
require(b != 0, errorMessage);
return a % b;
}
}
文件 19 的 19:TokenUtilsBase.sol
pragma solidity ^0.8.18;
import {IWETH} from "../interfaces/IWETH.sol";
import {SafeERC20, IERC20} from "../utils/SafeERC20.sol";
abstract contract TokenUtilsBase {
using SafeERC20 for IERC20;
function wnative() public view virtual returns (address);
function native() public view virtual returns (address);
function approveToken(
address _tokenAddr,
address _to,
uint256 _amount
) internal {
if (_tokenAddr == native()) return;
if (IERC20(_tokenAddr).allowance(address(this), _to) < _amount) {
IERC20(_tokenAddr).safeApprove(_to, _amount);
}
}
function pullTokensIfNeeded(
address _token,
address _from,
uint256 _amount
) internal returns (uint256) {
if (_amount == type(uint256).max) {
_amount = getBalance(_token, _from);
}
if (
_from != address(0) &&
_from != address(this) &&
_token != native() &&
_amount != 0
) {
IERC20(_token).safeTransferFrom(_from, address(this), _amount);
}
return _amount;
}
function withdrawTokens(
address _token,
address _to,
uint256 _amount
) internal returns (uint256) {
if (_amount == type(uint256).max) {
_amount = getBalance(_token, address(this));
}
if (_to != address(0) && _to != address(this) && _amount != 0) {
if (_token != native()) {
IERC20(_token).safeTransfer(_to, _amount);
} else {
(bool success, ) = _to.call{value: _amount}("");
require(success, "native send fail");
}
}
return _amount;
}
function depositWnative(uint256 _amount) internal {
IWETH(wnative()).deposit{value: _amount}();
}
function withdrawWnative(uint256 _amount) internal {
IWETH(wnative()).withdraw(_amount);
}
function getBalance(
address _tokenAddr,
address _acc
) internal view returns (uint256) {
if (_tokenAddr == native()) {
return _acc.balance;
} else {
return IERC20(_tokenAddr).balanceOf(_acc);
}
}
function getTokenDecimals(address _token) internal view returns (uint256) {
if (_token == native()) return 18;
return IERC20(_token).decimals();
}
}
{
"compilationTarget": {
"contracts/intent-adapters/swap/DexSpanAdapter.sol": "DexSpanDataStore"
},
"evmVersion": "paris",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs",
"useLiteralContent": true
},
"optimizer": {
"enabled": true,
"runs": 1000000
},
"remappings": [],
"viaIR": true
}
[{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_dexspan","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"dexspan","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_dexspan","type":"address"}],"name":"setDexSpan","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]