Contract Overview
Balance:
0 ETH
EtherValue:
$0.00
My Name Tag:
Not Available, login to update
Txn Hash | Method |
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
0x26a7956510bc9917b0b6e1bb68b72878413a886f66c4ee561fe06464e0369390 | 0x60a06040 | 107960610 | 50 days 20 hrs ago | 0xb7cefe980d41f2f83d4272526b0a0f04617da96b | IN | Contract Creation | 0 ETH | 0.003600564482 |
[ Download CSV Export ]
Similar Match Source Code This contract matches the deployed ByteCode of the Source Code for Contract 0x878b75007c76312a263a3dbe8b07a60aa8ebff54 The constructor portion of the code might be different and could alter the actual behaviour of the contract
Contract Name:
Events
Compiler Version
v0.8.18+commit.87f61d96
Optimization Enabled:
Yes with 1000000 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity 0.8.18; import {IAccount, IEvents} from "src/interfaces/IEvents.sol"; import {IFactory} from "./interfaces/IFactory.sol"; /// @title Consolidates all events emitted by the Smart Margin Accounts /// @dev restricted to only Smart Margin Accounts /// @author JaredBorders ([email protected]) contract Events is IEvents { /*////////////////////////////////////////////////////////////// IMMUTABLES //////////////////////////////////////////////////////////////*/ /// @inheritdoc IEvents address public immutable factory; /*////////////////////////////////////////////////////////////// MODIFIERS //////////////////////////////////////////////////////////////*/ /// @dev modifier that restricts access to only accounts modifier onlyAccounts() { if (!IFactory(factory).accounts(msg.sender)) { revert OnlyAccounts(); } _; } /*////////////////////////////////////////////////////////////// CONSTRUCTOR //////////////////////////////////////////////////////////////*/ /// @notice constructs the Events contract /// @param _factory: address of the factory contract constructor(address _factory) { factory = _factory; } /*////////////////////////////////////////////////////////////// EVENTS //////////////////////////////////////////////////////////////*/ /// @inheritdoc IEvents function emitDeposit(address user, uint256 amount) external override onlyAccounts { emit Deposit({user: user, account: msg.sender, amount: amount}); } /// @inheritdoc IEvents function emitWithdraw(address user, uint256 amount) external override onlyAccounts { emit Withdraw({user: user, account: msg.sender, amount: amount}); } /// @inheritdoc IEvents function emitEthWithdraw(address user, uint256 amount) external override onlyAccounts { emit EthWithdraw({user: user, account: msg.sender, amount: amount}); } /// @inheritdoc IEvents function emitUniswapV3Swap( address tokenIn, address tokenOut, address recipient, uint256 amountIn, uint256 amountOutMinimum ) external override onlyAccounts { emit UniswapV3Swap({ tokenIn: tokenIn, tokenOut: tokenOut, recipient: recipient, amountIn: amountIn, amountOutMinimum: amountOutMinimum }); } /// @inheritdoc IEvents function emitConditionalOrderPlaced( uint256 conditionalOrderId, bytes32 gelatoTaskId, bytes32 marketKey, int256 marginDelta, int256 sizeDelta, uint256 targetPrice, IAccount.ConditionalOrderTypes conditionalOrderType, uint256 desiredFillPrice, bool reduceOnly ) external override onlyAccounts { emit ConditionalOrderPlaced({ account: msg.sender, conditionalOrderId: conditionalOrderId, gelatoTaskId: gelatoTaskId, marketKey: marketKey, marginDelta: marginDelta, sizeDelta: sizeDelta, targetPrice: targetPrice, conditionalOrderType: conditionalOrderType, desiredFillPrice: desiredFillPrice, reduceOnly: reduceOnly }); } /// @inheritdoc IEvents function emitConditionalOrderCancelled( uint256 conditionalOrderId, bytes32 gelatoTaskId, IAccount.ConditionalOrderCancelledReason reason ) external override onlyAccounts { emit ConditionalOrderCancelled({ account: msg.sender, conditionalOrderId: conditionalOrderId, gelatoTaskId: gelatoTaskId, reason: reason }); } /// @inheritdoc IEvents function emitConditionalOrderFilled( uint256 conditionalOrderId, bytes32 gelatoTaskId, uint256 fillPrice, uint256 keeperFee, IAccount.PriceOracleUsed priceOracle ) external override onlyAccounts { emit ConditionalOrderFilled({ account: msg.sender, conditionalOrderId: conditionalOrderId, gelatoTaskId: gelatoTaskId, fillPrice: fillPrice, keeperFee: keeperFee, priceOracle: priceOracle }); } }
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity 0.8.18; import {IAccount} from "./IAccount.sol"; /// @title Interface for contract that emits all events emitted by the Smart Margin Accounts /// @author JaredBorders ([email protected]) interface IEvents { /*////////////////////////////////////////////////////////////// ERRORS //////////////////////////////////////////////////////////////*/ /// @notice emitted when a non-account contract attempts to call a restricted function error OnlyAccounts(); /*////////////////////////////////////////////////////////////// VIEWS //////////////////////////////////////////////////////////////*/ /// @notice returns the address of the factory contract function factory() external view returns (address); /*////////////////////////////////////////////////////////////// EVENTS //////////////////////////////////////////////////////////////*/ /// @notice emitted after a successful withdrawal /// @param user: the address that withdrew from account /// @param amount: amount of marginAsset to withdraw from account function emitDeposit(address user, uint256 amount) external; event Deposit( address indexed user, address indexed account, uint256 amount ); /// @notice emitted after a successful withdrawal /// @param user: the address that withdrew from account /// @param amount: amount of marginAsset to withdraw from account function emitWithdraw(address user, uint256 amount) external; event Withdraw( address indexed user, address indexed account, uint256 amount ); /// @notice emitted after a successful ETH withdrawal /// @param user: the address that withdrew from account /// @param amount: amount of ETH to withdraw from account function emitEthWithdraw(address user, uint256 amount) external; event EthWithdraw( address indexed user, address indexed account, uint256 amount ); /// @notice emitted after a successful token swap /// @param tokenIn: contract address of the inbound token /// @param tokenOut: contract address of the outbound token /// @param recipient: address to receive the outbound token /// @param amountIn: amount of inbound token to swap /// @param amountOutMinimum: minimum amount of outbound token to receive function emitUniswapV3Swap( address tokenIn, address tokenOut, address recipient, uint256 amountIn, uint256 amountOutMinimum ) external; event UniswapV3Swap( address tokenIn, address tokenOut, address recipient, uint256 amountIn, uint256 amountOutMinimum ); /// @notice emitted when a conditional order is placed /// @param conditionalOrderId: id of conditional order /// @param gelatoTaskId: id of gelato task /// @param marketKey: Synthetix PerpsV2 market key /// @param marginDelta: margin change /// @param sizeDelta: size change /// @param targetPrice: targeted fill price /// @param conditionalOrderType: expected conditional order type enum where 0 = LIMIT, 1 = STOP, etc.. /// @param desiredFillPrice: desired price to fill Synthetix PerpsV2 order at execution time /// @param reduceOnly: if true, only allows position's absolute size to decrease function emitConditionalOrderPlaced( uint256 conditionalOrderId, bytes32 gelatoTaskId, bytes32 marketKey, int256 marginDelta, int256 sizeDelta, uint256 targetPrice, IAccount.ConditionalOrderTypes conditionalOrderType, uint256 desiredFillPrice, bool reduceOnly ) external; event ConditionalOrderPlaced( address indexed account, uint256 indexed conditionalOrderId, bytes32 indexed gelatoTaskId, bytes32 marketKey, int256 marginDelta, int256 sizeDelta, uint256 targetPrice, IAccount.ConditionalOrderTypes conditionalOrderType, uint256 desiredFillPrice, bool reduceOnly ); /// @notice emitted when a conditional order is cancelled /// @param conditionalOrderId: id of conditional order /// @param gelatoTaskId: id of gelato task /// @param reason: reason for cancellation function emitConditionalOrderCancelled( uint256 conditionalOrderId, bytes32 gelatoTaskId, IAccount.ConditionalOrderCancelledReason reason ) external; event ConditionalOrderCancelled( address indexed account, uint256 indexed conditionalOrderId, bytes32 indexed gelatoTaskId, IAccount.ConditionalOrderCancelledReason reason ); /// @notice emitted when a conditional order is filled /// @param conditionalOrderId: id of conditional order /// @param gelatoTaskId: id of gelato task /// @param fillPrice: price the conditional order was executed at /// @param keeperFee: fees paid to the executor /// @param priceOracle: price oracle used to execute conditional order function emitConditionalOrderFilled( uint256 conditionalOrderId, bytes32 gelatoTaskId, uint256 fillPrice, uint256 keeperFee, IAccount.PriceOracleUsed priceOracle ) external; event ConditionalOrderFilled( address indexed account, uint256 indexed conditionalOrderId, bytes32 indexed gelatoTaskId, uint256 fillPrice, uint256 keeperFee, IAccount.PriceOracleUsed priceOracle ); }
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity 0.8.18; /// @title Kwenta Factory Interface /// @author JaredBorders ([email protected]) interface IFactory { /*////////////////////////////////////////////////////////////// EVENTS //////////////////////////////////////////////////////////////*/ /// @notice emitted when new account is created /// @param creator: account creator (address that called newAccount()) /// @param account: address of account that was created (will be address of proxy) /// @param version: version of account created event NewAccount( address indexed creator, address indexed account, bytes32 version ); /// @notice emitted when implementation is upgraded /// @param implementation: address of new implementation event AccountImplementationUpgraded(address implementation); /*////////////////////////////////////////////////////////////// ERRORS //////////////////////////////////////////////////////////////*/ /// @notice thrown when factory cannot set account owner to the msg.sender /// @param data: data returned from failed low-level call error FailedToSetAcountOwner(bytes data); /// @notice thrown when Account creation fails due to no version being set /// @param data: data returned from failed low-level call error AccountFailedToFetchVersion(bytes data); /// @notice thrown when factory is not upgradable error CannotUpgrade(); /// @notice thrown when account is unrecognized by factory error AccountDoesNotExist(); /*////////////////////////////////////////////////////////////// VIEWS //////////////////////////////////////////////////////////////*/ /// @return canUpgrade: bool to determine if system can be upgraded function canUpgrade() external view returns (bool); /// @return logic: account logic address function implementation() external view returns (address); /// @param _account: address of account /// @return whether or not account exists function accounts(address _account) external view returns (bool); /// @param _account: address of account /// @return owner of account function getAccountOwner(address _account) external view returns (address); /// @param _owner: address of owner /// @return array of accounts owned by _owner function getAccountsOwnedBy(address _owner) external view returns (address[] memory); /*////////////////////////////////////////////////////////////// OWNERSHIP //////////////////////////////////////////////////////////////*/ /// @notice update owner to account(s) mapping /// @dev does *NOT* check new owner != old owner /// @param _newOwner: new owner of account /// @param _oldOwner: old owner of account function updateAccountOwnership(address _newOwner, address _oldOwner) external; /*////////////////////////////////////////////////////////////// ACCOUNT DEPLOYMENT //////////////////////////////////////////////////////////////*/ /// @notice create unique account proxy for function caller /// @return accountAddress address of account created function newAccount() external returns (address payable accountAddress); /*////////////////////////////////////////////////////////////// UPGRADABILITY //////////////////////////////////////////////////////////////*/ /// @notice upgrade implementation of account which all account proxies currently point to /// @dev this *will* impact all existing accounts /// @dev future accounts will also point to this new implementation (until /// upgradeAccountImplementation() is called again with a newer implementation) /// @dev *DANGER* this function does not check the new implementation for validity, /// thus, a bad upgrade could result in severe consequences. /// @param _implementation: address of new implementation function upgradeAccountImplementation(address _implementation) external; /// @notice remove upgradability from factory /// @dev cannot be undone function removeUpgradability() external; }
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity 0.8.18; import {IPerpsV2MarketConsolidated} from "src/interfaces/synthetix/IPerpsV2MarketConsolidated.sol"; /// @title Kwenta Smart Margin Account v2.1.0 Implementation Interface /// @author JaredBorders ([email protected]), JChiaramonte7 ([email protected]) interface IAccount { /*/////////////////////////////////////////////////////////////// Types ///////////////////////////////////////////////////////////////*/ /// @notice Command Flags used to decode commands to execute /// @dev under the hood ACCOUNT_MODIFY_MARGIN = 0, ACCOUNT_WITHDRAW_ETH = 1 enum Command { ACCOUNT_MODIFY_MARGIN, // 0 ACCOUNT_WITHDRAW_ETH, PERPS_V2_MODIFY_MARGIN, PERPS_V2_WITHDRAW_ALL_MARGIN, PERPS_V2_SUBMIT_ATOMIC_ORDER, PERPS_V2_SUBMIT_DELAYED_ORDER, // 5 PERPS_V2_SUBMIT_OFFCHAIN_DELAYED_ORDER, PERPS_V2_CLOSE_POSITION, PERPS_V2_SUBMIT_CLOSE_DELAYED_ORDER, PERPS_V2_SUBMIT_CLOSE_OFFCHAIN_DELAYED_ORDER, PERPS_V2_CANCEL_DELAYED_ORDER, // 10 PERPS_V2_CANCEL_OFFCHAIN_DELAYED_ORDER, GELATO_PLACE_CONDITIONAL_ORDER, GELATO_CANCEL_CONDITIONAL_ORDER, UNISWAP_V3_SWAP, PERMIT2_PERMIT // 15 } /// @notice denotes conditional order types for code clarity /// @dev under the hood LIMIT = 0, STOP = 1 enum ConditionalOrderTypes { LIMIT, STOP } /// @notice denotes conditional order cancelled reasons for code clarity /// @dev under the hood CONDITIONAL_ORDER_CANCELLED_BY_USER = 0, CONDITIONAL_ORDER_CANCELLED_NOT_REDUCE_ONLY = 1 enum ConditionalOrderCancelledReason { CONDITIONAL_ORDER_CANCELLED_BY_USER, CONDITIONAL_ORDER_CANCELLED_NOT_REDUCE_ONLY } /// @notice denotes what oracle is used for price when executing conditional orders /// @dev under the hood PYTH = 0, CHAINLINK = 1 enum PriceOracleUsed { PYTH, CHAINLINK } /// @param factory: address of the Smart Margin Account Factory /// @param events: address of the contract used by all accounts for emitting events /// @param marginAsset: address of the Synthetix ProxyERC20sUSD contract used as the margin asset /// @param perpsV2ExchangeRate: address of the Synthetix PerpsV2ExchangeRate /// @param futuresMarketManager: address of the Synthetix FuturesMarketManager /// @param systemStatus: address of the Synthetix SystemStatus /// @param gelato: address of Gelato /// @param ops: address of Ops /// @param settings: address of contract used to store global settings /// @param universalRouter: address of Uniswap's Universal Router /// @param permit2: address of Uniswap's Permit2 struct AccountConstructorParams { address factory; address events; address marginAsset; address perpsV2ExchangeRate; address futuresMarketManager; address systemStatus; address gelato; address ops; address settings; address universalRouter; address permit2; } /// marketKey: Synthetix PerpsV2 Market id/key /// marginDelta: amount of margin to deposit or withdraw; positive indicates deposit, negative withdraw /// sizeDelta: denoted in market currency (i.e. ETH, BTC, etc), size of Synthetix PerpsV2 position /// targetPrice: limit or stop price target needing to be met to submit Synthetix PerpsV2 order /// gelatoTaskId: unqiue taskId from gelato necessary for cancelling conditional orders /// conditionalOrderType: conditional order type to determine conditional order fill logic /// desiredFillPrice: desired price to fill Synthetix PerpsV2 order at execution time /// reduceOnly: if true, only allows position's absolute size to decrease struct ConditionalOrder { bytes32 marketKey; int256 marginDelta; int256 sizeDelta; uint256 targetPrice; bytes32 gelatoTaskId; ConditionalOrderTypes conditionalOrderType; uint256 desiredFillPrice; bool reduceOnly; } /// @dev see example below elucidating targtPrice vs desiredFillPrice: /// 1. targetPrice met (ex: targetPrice = X) /// 2. account submits delayed order to Synthetix PerpsV2 with desiredFillPrice = Y /// 3. keeper executes Synthetix PerpsV2 order after delay period /// 4. if current market price defined by Synthetix PerpsV2 /// after delay period satisfies desiredFillPrice order is filled /*////////////////////////////////////////////////////////////// ERRORS //////////////////////////////////////////////////////////////*/ /// @notice thrown when commands length does not equal inputs length error LengthMismatch(); /// @notice thrown when Command given is not valid error InvalidCommandType(uint256 commandType); /// @notice thrown when conditional order type given is not valid due to zero sizeDelta error ZeroSizeDelta(); /// @notice exceeds useable margin /// @param available: amount of useable margin asset /// @param required: amount of margin asset required error InsufficientFreeMargin(uint256 available, uint256 required); /// @notice call to transfer ETH on withdrawal fails error EthWithdrawalFailed(); /// @notice base price from the oracle was invalid /// @dev Rate can be invalid either due to: /// 1. Returned as invalid from ExchangeRates - due to being stale or flagged by oracle /// 2. Out of deviation bounds w.r.t. to previously stored rate /// 3. if there is no valid stored rate, w.r.t. to previous 3 oracle rates /// 4. Price is zero error InvalidPrice(); /// @notice thrown when account execution has been disabled in the settings contract error AccountExecutionDisabled(); /// @notice thrown when a call attempts to reenter the protected function error Reentrancy(); /// @notice thrown when token swap attempted with invalid token (i.e. token that is not whitelisted) /// @param tokenIn: token attempting to swap from /// @param tokenOut: token attempting to swap to error TokenSwapNotAllowed(address tokenIn, address tokenOut); /// @notice thrown when a conditional order is attempted to be executed during invalid market conditions /// @param conditionalOrderId: conditional order id /// @param executor: address of executor error CannotExecuteConditionalOrder( uint256 conditionalOrderId, address executor ); /// @notice thrown when a conditional order is attempted to be executed but SM account cannot pay fee /// @param executorFee: fee required to execute conditional order error CannotPayExecutorFee(uint256 executorFee, address executor); /*////////////////////////////////////////////////////////////// VIEWS //////////////////////////////////////////////////////////////*/ /// @notice returns the version of the Account function VERSION() external view returns (bytes32); /// @return returns the amount of margin locked for future events (i.e. conditional orders) function committedMargin() external view returns (uint256); /// @return returns current conditional order id function conditionalOrderId() external view returns (uint256); /// @notice get delayed order data from Synthetix PerpsV2 /// @dev call reverts if _marketKey is invalid /// @param _marketKey: key for Synthetix PerpsV2 Market /// @return delayed order struct defining delayed order (will return empty struct if no delayed order exists) function getDelayedOrder(bytes32 _marketKey) external returns (IPerpsV2MarketConsolidated.DelayedOrder memory); /// @notice checker() is the Resolver for Gelato /// (see https://docs.gelato.network/developer-services/automate/guides/custom-logic-triggers/smart-contract-resolvers) /// @notice signal to a keeper that a conditional order is valid/invalid for execution /// @dev call reverts if conditional order Id does not map to a valid conditional order; /// ConditionalOrder.marketKey would be invalid /// @param _conditionalOrderId: key for an active conditional order /// @return canExec boolean that signals to keeper a conditional order can be executed by Gelato /// @return execPayload calldata for executing a conditional order function checker(uint256 _conditionalOrderId) external view returns (bool canExec, bytes memory execPayload); /// @notice the current withdrawable or usable balance /// @return free margin amount function freeMargin() external view returns (uint256); /// @notice get up-to-date position data from Synthetix PerpsV2 /// @param _marketKey: key for Synthetix PerpsV2 Market /// @return position struct defining current position function getPosition(bytes32 _marketKey) external returns (IPerpsV2MarketConsolidated.Position memory); /// @notice conditional order id mapped to conditional order /// @param _conditionalOrderId: id of conditional order /// @return conditional order function getConditionalOrder(uint256 _conditionalOrderId) external view returns (ConditionalOrder memory); /*////////////////////////////////////////////////////////////// MUTATIVE //////////////////////////////////////////////////////////////*/ /// @notice sets the initial owner of the account /// @dev only called once by the factory on account creation /// @param _owner: address of the owner function setInitialOwnership(address _owner) external; /// @notice executes commands along with provided inputs /// @param _commands: array of commands, each represented as an enum /// @param _inputs: array of byte strings containing abi encoded inputs for each command function execute(Command[] calldata _commands, bytes[] calldata _inputs) external payable; /// @notice execute queued conditional order /// @dev currently only supports conditional order submission via PERPS_V2_SUBMIT_OFFCHAIN_DELAYED_ORDER COMMAND /// @param _conditionalOrderId: key for an active conditional order function executeConditionalOrder(uint256 _conditionalOrderId) external; }
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity 0.8.18; interface IPerpsV2MarketConsolidated { struct Position { uint64 id; uint64 lastFundingIndex; uint128 margin; uint128 lastPrice; int128 size; } struct DelayedOrder { bool isOffchain; int128 sizeDelta; uint128 desiredFillPrice; uint128 targetRoundId; uint128 commitDeposit; uint128 keeperDeposit; uint256 executableAtTime; uint256 intentionTime; bytes32 trackingCode; } function marketKey() external view returns (bytes32 key); function positions(address account) external view returns (Position memory); function delayedOrders(address account) external view returns (DelayedOrder memory); function baseAsset() external view returns (bytes32 key); function assetPrice() external view returns (uint256 price, bool invalid); function transferMargin(int256 marginDelta) external; function withdrawAllMargin() external; function modifyPositionWithTracking( int256 sizeDelta, uint256 desiredFillPrice, bytes32 trackingCode ) external; function closePositionWithTracking( uint256 desiredFillPrice, bytes32 trackingCode ) external; function submitCloseOffchainDelayedOrderWithTracking( uint256 desiredFillPrice, bytes32 trackingCode ) external; function submitCloseDelayedOrderWithTracking( uint256 desiredTimeDelta, uint256 desiredFillPrice, bytes32 trackingCode ) external; function submitDelayedOrderWithTracking( int256 sizeDelta, uint256 desiredTimeDelta, uint256 desiredFillPrice, bytes32 trackingCode ) external; function submitOffchainDelayedOrderWithTracking( int256 sizeDelta, uint256 desiredFillPrice, bytes32 trackingCode ) external; function cancelDelayedOrder(address account) external; function cancelOffchainDelayedOrder(address account) external; }
{ "remappings": [ "ds-test/=lib/forge-std/lib/ds-test/src/", "forge-std/=lib/forge-std/src/" ], "optimizer": { "enabled": true, "runs": 1000000 }, "metadata": { "bytecodeHash": "ipfs", "appendCBOR": true }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "evmVersion": "paris", "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_factory","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"OnlyAccounts","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"uint256","name":"conditionalOrderId","type":"uint256"},{"indexed":true,"internalType":"bytes32","name":"gelatoTaskId","type":"bytes32"},{"indexed":false,"internalType":"enum IAccount.ConditionalOrderCancelledReason","name":"reason","type":"uint8"}],"name":"ConditionalOrderCancelled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"uint256","name":"conditionalOrderId","type":"uint256"},{"indexed":true,"internalType":"bytes32","name":"gelatoTaskId","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"fillPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"keeperFee","type":"uint256"},{"indexed":false,"internalType":"enum IAccount.PriceOracleUsed","name":"priceOracle","type":"uint8"}],"name":"ConditionalOrderFilled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"uint256","name":"conditionalOrderId","type":"uint256"},{"indexed":true,"internalType":"bytes32","name":"gelatoTaskId","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"marketKey","type":"bytes32"},{"indexed":false,"internalType":"int256","name":"marginDelta","type":"int256"},{"indexed":false,"internalType":"int256","name":"sizeDelta","type":"int256"},{"indexed":false,"internalType":"uint256","name":"targetPrice","type":"uint256"},{"indexed":false,"internalType":"enum IAccount.ConditionalOrderTypes","name":"conditionalOrderType","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"desiredFillPrice","type":"uint256"},{"indexed":false,"internalType":"bool","name":"reduceOnly","type":"bool"}],"name":"ConditionalOrderPlaced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EthWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"tokenIn","type":"address"},{"indexed":false,"internalType":"address","name":"tokenOut","type":"address"},{"indexed":false,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountOutMinimum","type":"uint256"}],"name":"UniswapV3Swap","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[{"internalType":"uint256","name":"conditionalOrderId","type":"uint256"},{"internalType":"bytes32","name":"gelatoTaskId","type":"bytes32"},{"internalType":"enum IAccount.ConditionalOrderCancelledReason","name":"reason","type":"uint8"}],"name":"emitConditionalOrderCancelled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"conditionalOrderId","type":"uint256"},{"internalType":"bytes32","name":"gelatoTaskId","type":"bytes32"},{"internalType":"uint256","name":"fillPrice","type":"uint256"},{"internalType":"uint256","name":"keeperFee","type":"uint256"},{"internalType":"enum IAccount.PriceOracleUsed","name":"priceOracle","type":"uint8"}],"name":"emitConditionalOrderFilled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"conditionalOrderId","type":"uint256"},{"internalType":"bytes32","name":"gelatoTaskId","type":"bytes32"},{"internalType":"bytes32","name":"marketKey","type":"bytes32"},{"internalType":"int256","name":"marginDelta","type":"int256"},{"internalType":"int256","name":"sizeDelta","type":"int256"},{"internalType":"uint256","name":"targetPrice","type":"uint256"},{"internalType":"enum IAccount.ConditionalOrderTypes","name":"conditionalOrderType","type":"uint8"},{"internalType":"uint256","name":"desiredFillPrice","type":"uint256"},{"internalType":"bool","name":"reduceOnly","type":"bool"}],"name":"emitConditionalOrderPlaced","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"emitDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"emitEthWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMinimum","type":"uint256"}],"name":"emitUniswapV3Swap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"emitWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60a060405234801561001057600080fd5b50604051610d9e380380610d9e83398101604081905261002f91610040565b6001600160a01b0316608052610070565b60006020828403121561005257600080fd5b81516001600160a01b038116811461006957600080fd5b9392505050565b608051610ce26100bc6000396000818161010601528181610192015281816102dd0152818161041301528181610564015281816106a3015281816107d101526108ff0152610ce26000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c806379a495271161005b57806379a49527146100db578063b014da21146100ee578063c45a015514610101578063d63f1ca61461015157600080fd5b8063146c64fc1461008d57806328ba84ca146100a25780633b9d50e7146100b5578063568824dc146100c8575b600080fd5b6100a061009b366004610a28565b610164565b005b6100a06100b0366004610ace565b6102af565b6100a06100c3366004610af8565b6103e5565b6100a06100d6366004610b4d565b610536565b6100a06100e9366004610ace565b610675565b6100a06100fc366004610ace565b6107a3565b6101287f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b6100a061015f366004610b9a565b6108d1565b6040517f5e5c06e20000000000000000000000000000000000000000000000000000000081523360048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690635e5c06e290602401602060405180830381865afa1580156101ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102129190610bd3565b610248576040517f3963460400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b87893373ffffffffffffffffffffffffffffffffffffffff167fba811735fedb82e0b67094c3a35da6b732eddc026ac4c96ffe39530d5ad706f58a8a8a8a8a8a8a60405161029c9796959493929190610c2e565b60405180910390a4505050505050505050565b6040517f5e5c06e20000000000000000000000000000000000000000000000000000000081523360048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690635e5c06e290602401602060405180830381865afa158015610339573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061035d9190610bd3565b610393576040517f3963460400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604051818152339073ffffffffffffffffffffffffffffffffffffffff8416907f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f62906020015b60405180910390a35050565b6040517f5e5c06e20000000000000000000000000000000000000000000000000000000081523360048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690635e5c06e290602401602060405180830381865afa15801561046f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104939190610bd3565b6104c9576040517f3963460400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff87811682528681166020830152851681830152606081018490526080810183905290517ff91fb43a848c5a47fa97f843dad71ad1264fae4f40ca09f5b63804f53285fe2d9181900360a00190a15050505050565b6040517f5e5c06e20000000000000000000000000000000000000000000000000000000081523360048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690635e5c06e290602401602060405180830381865afa1580156105c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105e49190610bd3565b61061a576040517f3963460400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83853373ffffffffffffffffffffffffffffffffffffffff167f23644a348af99f6c71d7ec999ded77ff899c87403fdc65eafed1bd0f336b21dd86868660405161066693929190610c74565b60405180910390a45050505050565b6040517f5e5c06e20000000000000000000000000000000000000000000000000000000081523360048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690635e5c06e290602401602060405180830381865afa1580156106ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107239190610bd3565b610759576040517f3963460400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604051818152339073ffffffffffffffffffffffffffffffffffffffff8416907f4ffc5e5909c5e9b0ea91efeaddb04bf70a58475f0c5f62d0314e6636ddb9ae96906020016103d9565b6040517f5e5c06e20000000000000000000000000000000000000000000000000000000081523360048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690635e5c06e290602401602060405180830381865afa15801561082d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108519190610bd3565b610887576040517f3963460400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604051818152339073ffffffffffffffffffffffffffffffffffffffff8416907f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb906020016103d9565b6040517f5e5c06e20000000000000000000000000000000000000000000000000000000081523360048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690635e5c06e290602401602060405180830381865afa15801561095b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097f9190610bd3565b6109b5576040517f3963460400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81833373ffffffffffffffffffffffffffffffffffffffff167fc5a43b936a8a2cbc928f034c4caa61dfa41b4cf0ec2782f472f9d16433199dc6846040516109fd9190610c99565b60405180910390a4505050565b60028110610a1757600080fd5b50565b8015158114610a1757600080fd5b60008060008060008060008060006101208a8c031215610a4757600080fd5b8935985060208a0135975060408a0135965060608a0135955060808a0135945060a08a0135935060c08a0135610a7c81610a0a565b925060e08a013591506101008a0135610a9481610a1a565b809150509295985092959850929598565b803573ffffffffffffffffffffffffffffffffffffffff81168114610ac957600080fd5b919050565b60008060408385031215610ae157600080fd5b610aea83610aa5565b946020939093013593505050565b600080600080600060a08688031215610b1057600080fd5b610b1986610aa5565b9450610b2760208701610aa5565b9350610b3560408701610aa5565b94979396509394606081013594506080013592915050565b600080600080600060a08688031215610b6557600080fd5b853594506020860135935060408601359250606086013591506080860135610b8c81610a0a565b809150509295509295909350565b600080600060608486031215610baf57600080fd5b83359250602084013591506040840135610bc881610a0a565b809150509250925092565b600060208284031215610be557600080fd5b8151610bf081610a1a565b9392505050565b60028110610a17577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600060e082019050888252876020830152866040830152856060830152610c5485610bf7565b8460808301528360a083015282151560c083015298975050505050505050565b8381526020810183905260608101610c8b83610bf7565b826040830152949350505050565b60208101610ca683610bf7565b9190529056fea2646970667358221220d9a218e60ea3295c5de8e218767a94582d4fc0e840a01931afb120d96956dfd664736f6c63430008120033000000000000000000000000bc98cf958ea2625384a05f473f1a65e5e5ad21ef
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.