{"file_path":"test/trial/TrialVenue.sol","creation_status":"success","source_code":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\ninterface IERC20Min {\n    function transfer(address to, uint256 amount) external returns (bool);\n    function transferFrom(address from, address to, uint256 amount) external returns (bool);\n    function approve(address spender, uint256 amount) external returns (bool);\n}\n\ninterface IStackerMin {\n    function credit(address trader, uint256 imdAmount) external returns (uint256 shares);\n    function SIMD() external view returns (address);\n}\n\n/// @title TrialVenue\n/// @notice The positive case for the imd/acc ProjectRegistry trial on Sepolia: a small trading venue\n/// that follows every listing rule. It is a constant-product pool between IMD and its own token,\n/// TRIAL (this contract), and its liquidity can never be withdrawn by anyone. Every trade pays a 1%\n/// fee on its IMD side: 0.5% is the trader's cashback, credited as staked IMD through the imd/acc\n/// Stacker, and 0.5% is burned (sent to 0x...dEaD). Nothing goes to the owner, who can only seed the\n/// pool once.\n///\n/// The trader is the caller when it is a plain wallet, else the active caller its router reports\n/// through `msgSender()`; a caller that resolves to no valid trader gets no cashback, and that\n/// cashback is burned instead (never paid to a router). If `credit` fails, the trader is paid the\n/// cashback in plain IMD. The gas for `credit` is checked before the call.\ncontract TrialVenue {\n    string public constant name = \"imd/acc trial token\";\n    string public constant symbol = \"TRIAL\";\n    uint8 public constant decimals = 18;\n\n    uint256 public constant BPS = 10_000;\n    uint256 public constant FEE_BPS = 100; // 1% of each trade's IMD side\n    uint256 public constant CASHBACK_BPS = 50; // to the trader, as staked IMD\n    uint256 public constant BURN_BPS = 50; // burned\n    address public constant BURN = 0x000000000000000000000000000000000000dEaD;\n    uint256 public constant TRIAL_SUPPLY = 1_000_000e18;\n\n    IERC20Min public immutable IMD;\n    IStackerMin public immutable stacker;\n    address public immutable SIMD;\n    /// @notice The only power the owner has: seeding the pool once.\n    address public immutable owner;\n    /// @notice Gas forwarded to `credit`, and the gas kept for the rest of the trade.\n    uint256 public immutable creditGas;\n    uint256 public immutable gasReserve;\n\n    uint256 public totalSupply;\n    mapping(address => uint256) public balanceOf;\n    mapping(address => mapping(address => uint256)) public allowance;\n\n    uint256 public reserveImd;\n    uint256 public reserveTrial;\n    bool public seeded;\n    uint256 private _lock = 1;\n\n    event Transfer(address indexed from, address indexed to, uint256 amount);\n    event Approval(address indexed owner, address indexed spender, uint256 amount);\n    event Seeded(uint256 imd, uint256 trial);\n    event Trade(\n        address indexed caller,\n        address indexed trader,\n        bool buy,\n        uint256 imd,\n        uint256 trial,\n        uint256 cashback,\n        uint256 burned\n    );\n\n    error NotOwner();\n    error AlreadySeeded();\n    error NotSeeded();\n    error Slippage();\n    error ZeroAmount();\n    error Reentrant();\n\n    modifier nonReentrant() {\n        if (_lock != 1) revert Reentrant();\n        _lock = 2;\n        _;\n        _lock = 1;\n    }\n\n    constructor(IERC20Min imd, IStackerMin stacker_, uint256 creditGas_, uint256 gasReserve_) {\n        IMD = imd;\n        stacker = stacker_;\n        SIMD = stacker_.SIMD();\n        owner = msg.sender;\n        creditGas = creditGas_;\n        gasReserve = gasReserve_;\n        imd.approve(address(stacker_), type(uint256).max);\n        totalSupply = TRIAL_SUPPLY;\n        balanceOf[address(this)] = TRIAL_SUPPLY;\n        emit Transfer(address(0), address(this), TRIAL_SUPPLY);\n    }\n\n    // ------------------------------------------------------------------ pool\n\n    /// @notice Locks `imdAmount` IMD and the whole TRIAL supply into the pool, once. There is no way\n    /// to take liquidity out.\n    function seed(uint256 imdAmount) external {\n        if (msg.sender != owner) revert NotOwner();\n        if (seeded) revert AlreadySeeded();\n        if (imdAmount == 0) revert ZeroAmount();\n        seeded = true;\n        require(IMD.transferFrom(msg.sender, address(this), imdAmount));\n        reserveImd = imdAmount;\n        reserveTrial = TRIAL_SUPPLY;\n        emit Seeded(imdAmount, TRIAL_SUPPLY);\n    }\n\n    /// @notice Pay `imdIn` IMD for TRIAL. 1% of `imdIn` is the fee: half cashback, half burned.\n    function buy(uint256 imdIn, uint256 minTrialOut)\n        external\n        nonReentrant\n        returns (uint256 trialOut)\n    {\n        if (!seeded) revert NotSeeded();\n        if (imdIn == 0) revert ZeroAmount();\n        require(IMD.transferFrom(msg.sender, address(this), imdIn));\n        uint256 fee = imdIn * FEE_BPS / BPS;\n        uint256 net = imdIn - fee;\n        trialOut = reserveTrial * net / (reserveImd + net);\n        if (trialOut == 0 || trialOut < minTrialOut) revert Slippage();\n        reserveImd += net;\n        reserveTrial -= trialOut;\n        _move(address(this), msg.sender, trialOut);\n        _settleFee(imdIn, fee, true, trialOut);\n    }\n\n    /// @notice Sell `trialIn` TRIAL for IMD. 1% of the IMD paid out is the fee: half cashback, half\n    /// burned.\n    function sell(uint256 trialIn, uint256 minImdOut)\n        external\n        nonReentrant\n        returns (uint256 imdOut)\n    {\n        if (!seeded) revert NotSeeded();\n        if (trialIn == 0) revert ZeroAmount();\n        _move(msg.sender, address(this), trialIn);\n        uint256 gross = reserveImd * trialIn / (reserveTrial + trialIn);\n        uint256 fee = gross * FEE_BPS / BPS;\n        imdOut = gross - fee;\n        if (imdOut == 0 || imdOut < minImdOut) revert Slippage();\n        reserveImd -= gross;\n        reserveTrial += trialIn;\n        require(IMD.transfer(msg.sender, imdOut));\n        _settleFee(gross, fee, false, trialIn);\n    }\n\n    /// @dev Splits a trade's fee: the cashback to the resolved trader, the rest burned.\n    function _settleFee(uint256 imd, uint256 fee, bool isBuy, uint256 trial) internal {\n        uint256 cashback = fee * CASHBACK_BPS / FEE_BPS;\n        uint256 burned = fee - cashback;\n        address trader = resolveTrader(msg.sender);\n        if (trader == address(0)) {\n            burned += cashback; // no valid trader: the cashback is burned, never paid to a router\n            cashback = 0;\n        }\n        if (burned > 0) require(IMD.transfer(BURN, burned));\n        if (cashback > 0) {\n            require(gasleft() >= creditGas + gasReserve, \"imd/acc: insufficient gas\");\n            try stacker.credit{gas: creditGas}(trader, cashback) {}\n            catch {\n                require(IMD.transfer(trader, cashback)); // plain IMD: the trade never reverts\n            }\n        }\n        emit Trade(msg.sender, trader, isBuy, imd, trial, cashback, burned);\n    }\n\n    /// @notice The trader of a trade made by `who`: `who` itself when it has no code, else\n    /// the active caller its router reports through `msgSender()` (bounded gas, at most 32 bytes\n    /// read). Zero when no valid trader can be resolved.\n    function resolveTrader(address who) public view returns (address trader) {\n        if (who.code.length == 0) {\n            trader = who;\n        } else {\n            bool ok;\n            uint256 size;\n            uint256 value;\n            assembly (\"memory-safe\") {\n                mstore(0, 0xd737d0c700000000000000000000000000000000000000000000000000000000) // msgSender()\n                ok := staticcall(30000, who, 0, 4, 0, 32)\n                size := returndatasize()\n                value := mload(0)\n            }\n            if (!ok || size != 32 || value > type(uint160).max) return address(0);\n            trader = address(uint160(value));\n        }\n        if (\n            trader == address(0) || trader == address(stacker) || trader == address(IMD)\n                || trader == SIMD || trader == address(this)\n                || (trader == who && who.code.length != 0)\n        ) return address(0);\n    }\n\n    // ------------------------------------------------------------------ TRIAL token\n\n    function transfer(address to, uint256 amount) external returns (bool) {\n        _move(msg.sender, to, amount);\n        return true;\n    }\n\n    function approve(address spender, uint256 amount) external returns (bool) {\n        allowance[msg.sender][spender] = amount;\n        emit Approval(msg.sender, spender, amount);\n        return true;\n    }\n\n    function transferFrom(address from, address to, uint256 amount) external returns (bool) {\n        uint256 a = allowance[from][msg.sender];\n        if (a != type(uint256).max) allowance[from][msg.sender] = a - amount;\n        _move(from, to, amount);\n        return true;\n    }\n\n    function _move(address from, address to, uint256 amount) internal {\n        balanceOf[from] -= amount;\n        balanceOf[to] += amount;\n        emit Transfer(from, to, amount);\n    }\n}\n","deployed_bytecode":"0x608060405234801561000f575f80fd5b50600436106101bb575f3560e01c8063931b95bb116100f3578063d0abb69311610093578063dd62ed3e1161006e578063dd62ed3e14610439578063e2417e1a14610463578063e6fd6bd51461046c578063eea7570e14610493575f80fd5b8063d0abb693146103ec578063d6febde814610413578063d79875eb14610426575f80fd5b8063a37a9fc0116100ce578063a37a9fc0146102ca578063a9059cbb146103c8578063bf333f2c146103db578063c0a2526c146103e3575f80fd5b8063931b95bb14610366578063955648371461037757806395d89b411461038c575f80fd5b8063313ce5671161015e57806370a082311161013957806370a08231146102d257806386cb90be146102f15780638da5cb5b146103185780638fb56bef1461033f575f80fd5b8063313ce567146102a3578063334041a6146102bd57806359cf0f00146102ca575f80fd5b8063095ea7b311610199578063095ea7b31461025c57806318160ddd1461027f57806323b872dd14610287578063249d39e91461029a575f80fd5b806304ccc04d146101bf57806306fdde03146101fc578063090b76c314610245575b5f80fd5b6101d26101cd366004611411565b6104ba565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6102386040518060400160405280601381526020017f696d642f61636320747269616c20746f6b656e0000000000000000000000000081525081565b6040516101f39190611431565b61024e60045481565b6040519081526020016101f3565b61026f61026a366004611484565b6106fc565b60405190151581526020016101f3565b61024e5f5481565b61026f6102953660046114ac565b610775565b61024e61271081565b6102ab601281565b60405160ff90911681526020016101f3565b60055461026f9060ff1681565b61024e603281565b61024e6102e0366004611411565b60016020525f908152604090205481565b61024e7f000000000000000000000000000000000000000000000000000000000013d62081565b6101d27f0000000000000000000000004b91078b2374c956a65f7af0999cae0a935e682181565b6101d27f000000000000000000000000f9e2eec3b610ec6781f7438ac5fb4bc049d81cc181565b61024e69d3c21bcecceda100000081565b61038a6103853660046114e6565b61081d565b005b6102386040518060400160405280600581526020017f545249414c00000000000000000000000000000000000000000000000000000081525081565b61026f6103d6366004611484565b610a41565b61024e606481565b6101d261dead81565b6101d27f0000000000000000000000002b69099e59b05901faa1dd164fabf098bf831e8281565b61024e6104213660046114fd565b610a56565b61024e6104343660046114fd565b610cb6565b61024e61044736600461151d565b600260209081525f928352604080842090915290825290205481565b61024e60035481565b6101d27f0000000000000000000000000457276d7b036818b3eddc1a4a3fceda61e9314d81565b61024e7f00000000000000000000000000000000000000000000000000000000000186a081565b5f8173ffffffffffffffffffffffffffffffffffffffff163b5f036104e057508061055a565b5f805f7fd737d0c7000000000000000000000000000000000000000000000000000000005f5260205f60045f88617530fa92503d91505f519050821580610528575081602014155b80610546575073ffffffffffffffffffffffffffffffffffffffff81115b1561055557505f949350505050565b925050505b73ffffffffffffffffffffffffffffffffffffffff811615806105c857507f0000000000000000000000000457276d7b036818b3eddc1a4a3fceda61e9314d73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b8061061e57507f0000000000000000000000002b69099e59b05901faa1dd164fabf098bf831e8273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b8061067457507f000000000000000000000000f9e2eec3b610ec6781f7438ac5fb4bc049d81cc173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b80610694575073ffffffffffffffffffffffffffffffffffffffff811630145b806106eb57508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480156106eb575073ffffffffffffffffffffffffffffffffffffffff82163b15155b156106f757505f919050565b919050565b335f81815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906107639086815260200190565b60405180910390a35060015b92915050565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526002602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610807576107d6838261157b565b73ffffffffffffffffffffffffffffffffffffffff86165f9081526002602090815260408083203384529091529020555b610812858585610f01565b506001949350505050565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000004b91078b2374c956a65f7af0999cae0a935e6821161461088c576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60055460ff16156108c9576040517f4313f1c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f03610902576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201526044810182905273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000002b69099e59b05901faa1dd164fabf098bf831e8216906323b872dd906064016020604051808303815f875af11580156109c3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109e7919061158e565b6109ef575f80fd5b600381905569d3c21bcecceda100000060048190556040805183815260208101929092527f67f9b61bf7b39fd24dd60467083f89ea77979db358db2804069474590a36c035910160405180910390a150565b5f610a4d338484610f01565b50600192915050565b5f600654600114610a93576040517fed3ba6a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600260065560055460ff16610ad4576040517f0f473f7500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825f03610b0d576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018490527f0000000000000000000000002b69099e59b05901faa1dd164fabf098bf831e8273ffffffffffffffffffffffffffffffffffffffff16906323b872dd906064016020604051808303815f875af1158015610ba3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bc7919061158e565b610bcf575f80fd5b5f612710610bde6064866115ad565b610be891906115c4565b90505f610bf5828661157b565b905080600354610c0591906115fc565b81600454610c1391906115ad565b610c1d91906115c4565b9250821580610c2b57508383105b15610c62576040517f7dd37f7000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060035f828254610c7391906115fc565b925050819055508260045f828254610c8b919061157b565b90915550610c9c9050303385610f01565b610ca98583600186610fe1565b5050600160065592915050565b5f600654600114610cf3576040517fed3ba6a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600260065560055460ff16610d34576040517f0f473f7500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825f03610d6d576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d78333085610f01565b5f83600454610d8791906115fc565b84600354610d9591906115ad565b610d9f91906115c4565b90505f612710610db06064846115ad565b610dba91906115c4565b9050610dc6818361157b565b9250821580610dd457508383105b15610e0b576040517f7dd37f7000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160035f828254610e1c919061157b565b925050819055508460045f828254610e3491906115fc565b90915550506040517fa9059cbb000000000000000000000000000000000000000000000000000000008152336004820152602481018490527f0000000000000000000000002b69099e59b05901faa1dd164fabf098bf831e8273ffffffffffffffffffffffffffffffffffffffff169063a9059cbb906044016020604051808303815f875af1158015610ec9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610eed919061158e565b610ef5575f80fd5b610ca982825f88610fe1565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526001602052604081208054839290610f3590849061157b565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f9081526001602052604081208054839290610f6e9084906115fc565b925050819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610fd491815260200190565b60405180910390a3505050565b5f6064610fef6032866115ad565b610ff991906115c4565b90505f611006828661157b565b90505f611012336104ba565b905073ffffffffffffffffffffffffffffffffffffffff811661103f5761103983836115fc565b91505f92505b8115611103576040517fa9059cbb00000000000000000000000000000000000000000000000000000000815261dead6004820152602481018390527f0000000000000000000000002b69099e59b05901faa1dd164fabf098bf831e8273ffffffffffffffffffffffffffffffffffffffff169063a9059cbb906044016020604051808303815f875af11580156110d7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110fb919061158e565b611103575f80fd5b821561137a576111537f00000000000000000000000000000000000000000000000000000000000186a07f000000000000000000000000000000000000000000000000000000000013d6206115fc565b5a10156111c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f696d642f6163633a20696e73756666696369656e742067617300000000000000604482015260640160405180910390fd5b6040517fef6506db00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8281166004830152602482018590527f0000000000000000000000000457276d7b036818b3eddc1a4a3fceda61e9314d169063ef6506db907f000000000000000000000000000000000000000000000000000000000013d620906044016020604051808303815f8887f1935050505080156112b1575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526112ae9181019061160f565b60015b611378576040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8281166004830152602482018590527f0000000000000000000000002b69099e59b05901faa1dd164fabf098bf831e82169063a9059cbb906044016020604051808303815f875af1158015611347573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061136b919061158e565b611373575f80fd5b61137a565b505b60408051861515815260208101899052908101859052606081018490526080810183905273ffffffffffffffffffffffffffffffffffffffff82169033907f9adcf0ad0cda63c4d50f26a48925cf6405df27d422a39c456b5f03f661c829829060a00160405180910390a350505050505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106f7575f80fd5b5f60208284031215611421575f80fd5b61142a826113ee565b9392505050565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b5f8060408385031215611495575f80fd5b61149e836113ee565b946020939093013593505050565b5f805f606084860312156114be575f80fd5b6114c7846113ee565b92506114d5602085016113ee565b929592945050506040919091013590565b5f602082840312156114f6575f80fd5b5035919050565b5f806040838503121561150e575f80fd5b50508035926020909101359150565b5f806040838503121561152e575f80fd5b611537836113ee565b9150611545602084016113ee565b90509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8181038181111561076f5761076f61154e565b5f6020828403121561159e575f80fd5b8151801515811461142a575f80fd5b808202811582820484141761076f5761076f61154e565b5f826115f7577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b8082018082111561076f5761076f61154e565b5f6020828403121561161f575f80fd5b505191905056fea164736f6c634300081a000a","optimization_enabled":true,"verified_twin_address_hash":null,"is_verified":true,"compiler_settings":{"evmVersion":"cancun","libraries":{},"metadata":{"appendCBOR":true,"bytecodeHash":"none","useLiteralContent":false},"optimizer":{"enabled":true,"runs":10000},"outputSelection":{"*":{"":["*"],"*":["*"]}},"remappings":["forge-std/=lib/forge-std/src/","solady/=lib/solady/src/","@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/","openzeppelin-contracts/=lib/openzeppelin-contracts/contracts/"],"viaIR":false},"optimization_runs":10000,"sourcify_repo_url":null,"decoded_constructor_args":[["0x2B69099E59b05901faA1DD164fabf098bf831E82",{"internalType":"contract IERC20Min","name":"imd","type":"address"}],["0x0457276D7b036818B3EddC1A4A3FCeda61e9314d",{"internalType":"contract IStackerMin","name":"stacker_","type":"address"}],["1300000",{"internalType":"uint256","name":"creditGas_","type":"uint256"}],["100000",{"internalType":"uint256","name":"gasReserve_","type":"uint256"}]],"compiler_version":"v0.8.26+commit.8a97fa7a","is_verified_via_verifier_alliance":false,"verified_at":"2026-10-12T17:07:19.822236Z","implementations":[],"proxy_type":null,"external_libraries":[],"creation_bytecode":"0x6101406040526001600655348015610015575f80fd5b50604051611902380380611902833981016040819052610034916101a7565b6001600160a01b03808516608052831660a081905260408051638fb56bef60e01b81529051638fb56bef916004808201926020929091908290030181865afa158015610082573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100a691906101ec565b6001600160a01b0390811660c0523360e05261010083905261012082905260405163095ea7b360e01b815284821660048201525f1960248201529085169063095ea7b3906044016020604051808303815f875af1158015610109573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061012d919061020e565b5069d3c21bcecceda10000005f81815530808252600160205260408083208490555190927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9161017f91815260200190565b60405180910390a35050505061022d565b6001600160a01b03811681146101a4575f80fd5b50565b5f805f80608085870312156101ba575f80fd5b84516101c581610190565b60208601519094506101d681610190565b6040860151606090960151949790965092505050565b5f602082840312156101fc575f80fd5b815161020781610190565b9392505050565b5f6020828403121561021e575f80fd5b81518015158114610207575f80fd5b60805160a05160c05160e05161010051610120516116336102cf5f395f8181610498015261110e01525f81816102f60152818161112f015261123501525f818161031d015261083501525f8181610344015261062601525f81816104710152818161057a015261120c01525f81816103f1015281816105d00152818161097d01528181610b4801528181610e6e0152818161107c015261130101526116335ff3fe608060405234801561000f575f80fd5b50600436106101bb575f3560e01c8063931b95bb116100f3578063d0abb69311610093578063dd62ed3e1161006e578063dd62ed3e14610439578063e2417e1a14610463578063e6fd6bd51461046c578063eea7570e14610493575f80fd5b8063d0abb693146103ec578063d6febde814610413578063d79875eb14610426575f80fd5b8063a37a9fc0116100ce578063a37a9fc0146102ca578063a9059cbb146103c8578063bf333f2c146103db578063c0a2526c146103e3575f80fd5b8063931b95bb14610366578063955648371461037757806395d89b411461038c575f80fd5b8063313ce5671161015e57806370a082311161013957806370a08231146102d257806386cb90be146102f15780638da5cb5b146103185780638fb56bef1461033f575f80fd5b8063313ce567146102a3578063334041a6146102bd57806359cf0f00146102ca575f80fd5b8063095ea7b311610199578063095ea7b31461025c57806318160ddd1461027f57806323b872dd14610287578063249d39e91461029a575f80fd5b806304ccc04d146101bf57806306fdde03146101fc578063090b76c314610245575b5f80fd5b6101d26101cd366004611411565b6104ba565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6102386040518060400160405280601381526020017f696d642f61636320747269616c20746f6b656e0000000000000000000000000081525081565b6040516101f39190611431565b61024e60045481565b6040519081526020016101f3565b61026f61026a366004611484565b6106fc565b60405190151581526020016101f3565b61024e5f5481565b61026f6102953660046114ac565b610775565b61024e61271081565b6102ab601281565b60405160ff90911681526020016101f3565b60055461026f9060ff1681565b61024e603281565b61024e6102e0366004611411565b60016020525f908152604090205481565b61024e7f000000000000000000000000000000000000000000000000000000000000000081565b6101d27f000000000000000000000000000000000000000000000000000000000000000081565b6101d27f000000000000000000000000000000000000000000000000000000000000000081565b61024e69d3c21bcecceda100000081565b61038a6103853660046114e6565b61081d565b005b6102386040518060400160405280600581526020017f545249414c00000000000000000000000000000000000000000000000000000081525081565b61026f6103d6366004611484565b610a41565b61024e606481565b6101d261dead81565b6101d27f000000000000000000000000000000000000000000000000000000000000000081565b61024e6104213660046114fd565b610a56565b61024e6104343660046114fd565b610cb6565b61024e61044736600461151d565b600260209081525f928352604080842090915290825290205481565b61024e60035481565b6101d27f000000000000000000000000000000000000000000000000000000000000000081565b61024e7f000000000000000000000000000000000000000000000000000000000000000081565b5f8173ffffffffffffffffffffffffffffffffffffffff163b5f036104e057508061055a565b5f805f7fd737d0c7000000000000000000000000000000000000000000000000000000005f5260205f60045f88617530fa92503d91505f519050821580610528575081602014155b80610546575073ffffffffffffffffffffffffffffffffffffffff81115b1561055557505f949350505050565b925050505b73ffffffffffffffffffffffffffffffffffffffff811615806105c857507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b8061061e57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b8061067457507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b80610694575073ffffffffffffffffffffffffffffffffffffffff811630145b806106eb57508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480156106eb575073ffffffffffffffffffffffffffffffffffffffff82163b15155b156106f757505f919050565b919050565b335f81815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906107639086815260200190565b60405180910390a35060015b92915050565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526002602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610807576107d6838261157b565b73ffffffffffffffffffffffffffffffffffffffff86165f9081526002602090815260408083203384529091529020555b610812858585610f01565b506001949350505050565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461088c576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60055460ff16156108c9576040517f4313f1c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f03610902576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201526044810182905273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906323b872dd906064016020604051808303815f875af11580156109c3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109e7919061158e565b6109ef575f80fd5b600381905569d3c21bcecceda100000060048190556040805183815260208101929092527f67f9b61bf7b39fd24dd60467083f89ea77979db358db2804069474590a36c035910160405180910390a150565b5f610a4d338484610f01565b50600192915050565b5f600654600114610a93576040517fed3ba6a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600260065560055460ff16610ad4576040517f0f473f7500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825f03610b0d576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906323b872dd906064016020604051808303815f875af1158015610ba3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bc7919061158e565b610bcf575f80fd5b5f612710610bde6064866115ad565b610be891906115c4565b90505f610bf5828661157b565b905080600354610c0591906115fc565b81600454610c1391906115ad565b610c1d91906115c4565b9250821580610c2b57508383105b15610c62576040517f7dd37f7000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060035f828254610c7391906115fc565b925050819055508260045f828254610c8b919061157b565b90915550610c9c9050303385610f01565b610ca98583600186610fe1565b5050600160065592915050565b5f600654600114610cf3576040517fed3ba6a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600260065560055460ff16610d34576040517f0f473f7500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825f03610d6d576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d78333085610f01565b5f83600454610d8791906115fc565b84600354610d9591906115ad565b610d9f91906115c4565b90505f612710610db06064846115ad565b610dba91906115c4565b9050610dc6818361157b565b9250821580610dd457508383105b15610e0b576040517f7dd37f7000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160035f828254610e1c919061157b565b925050819055508460045f828254610e3491906115fc565b90915550506040517fa9059cbb000000000000000000000000000000000000000000000000000000008152336004820152602481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063a9059cbb906044016020604051808303815f875af1158015610ec9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610eed919061158e565b610ef5575f80fd5b610ca982825f88610fe1565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526001602052604081208054839290610f3590849061157b565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f9081526001602052604081208054839290610f6e9084906115fc565b925050819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610fd491815260200190565b60405180910390a3505050565b5f6064610fef6032866115ad565b610ff991906115c4565b90505f611006828661157b565b90505f611012336104ba565b905073ffffffffffffffffffffffffffffffffffffffff811661103f5761103983836115fc565b91505f92505b8115611103576040517fa9059cbb00000000000000000000000000000000000000000000000000000000815261dead6004820152602481018390527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063a9059cbb906044016020604051808303815f875af11580156110d7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110fb919061158e565b611103575f80fd5b821561137a576111537f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006115fc565b5a10156111c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f696d642f6163633a20696e73756666696369656e742067617300000000000000604482015260640160405180910390fd5b6040517fef6506db00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8281166004830152602482018590527f0000000000000000000000000000000000000000000000000000000000000000169063ef6506db907f0000000000000000000000000000000000000000000000000000000000000000906044016020604051808303815f8887f1935050505080156112b1575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526112ae9181019061160f565b60015b611378576040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8281166004830152602482018590527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303815f875af1158015611347573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061136b919061158e565b611373575f80fd5b61137a565b505b60408051861515815260208101899052908101859052606081018490526080810183905273ffffffffffffffffffffffffffffffffffffffff82169033907f9adcf0ad0cda63c4d50f26a48925cf6405df27d422a39c456b5f03f661c829829060a00160405180910390a350505050505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106f7575f80fd5b5f60208284031215611421575f80fd5b61142a826113ee565b9392505050565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b5f8060408385031215611495575f80fd5b61149e836113ee565b946020939093013593505050565b5f805f606084860312156114be575f80fd5b6114c7846113ee565b92506114d5602085016113ee565b929592945050506040919091013590565b5f602082840312156114f6575f80fd5b5035919050565b5f806040838503121561150e575f80fd5b50508035926020909101359150565b5f806040838503121561152e575f80fd5b611537836113ee565b9150611545602084016113ee565b90509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8181038181111561076f5761076f61154e565b5f6020828403121561159e575f80fd5b8151801515811461142a575f80fd5b808202811582820484141761076f5761076f61154e565b5f826115f7577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b8082018082111561076f5761076f61154e565b5f6020828403121561161f575f80fd5b505191905056fea164736f6c634300081a000a0000000000000000000000002b69099e59b05901faa1dd164fabf098bf831e820000000000000000000000000457276d7b036818b3eddc1a4a3fceda61e9314d000000000000000000000000000000000000000000000000000000000013d62000000000000000000000000000000000000000000000000000000000000186a0","name":"TrialVenue","is_blueprint":false,"license_type":"none","is_fully_verified":false,"is_verified_via_eth_bytecode_db":false,"language":"solidity","evm_version":"cancun","can_be_visualized_via_sol2uml":true,"is_verified_via_sourcify":false,"additional_sources":[],"certified":false,"conflicting_implementations":null,"abi":[{"inputs":[{"internalType":"contract IERC20Min","name":"imd","type":"address"},{"internalType":"contract IStackerMin","name":"stacker_","type":"address"},{"internalType":"uint256","name":"creditGas_","type":"uint256"},{"internalType":"uint256","name":"gasReserve_","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadySeeded","type":"error"},{"inputs":[],"name":"NotOwner","type":"error"},{"inputs":[],"name":"NotSeeded","type":"error"},{"inputs":[],"name":"Reentrant","type":"error"},{"inputs":[],"name":"Slippage","type":"error"},{"inputs":[],"name":"ZeroAmount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"imd","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"trial","type":"uint256"}],"name":"Seeded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"trader","type":"address"},{"indexed":false,"internalType":"bool","name":"buy","type":"bool"},{"indexed":false,"internalType":"uint256","name":"imd","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"trial","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"cashback","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"burned","type":"uint256"}],"name":"Trade","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"BPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BURN","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BURN_BPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CASHBACK_BPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FEE_BPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"IMD","outputs":[{"internalType":"contract IERC20Min","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SIMD","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TRIAL_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"imdIn","type":"uint256"},{"internalType":"uint256","name":"minTrialOut","type":"uint256"}],"name":"buy","outputs":[{"internalType":"uint256","name":"trialOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"creditGas","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gasReserve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reserveImd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reserveTrial","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"resolveTrader","outputs":[{"internalType":"address","name":"trader","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"imdAmount","type":"uint256"}],"name":"seed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"seeded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"trialIn","type":"uint256"},{"internalType":"uint256","name":"minImdOut","type":"uint256"}],"name":"sell","outputs":[{"internalType":"uint256","name":"imdOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stacker","outputs":[{"internalType":"contract IStackerMin","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}],"is_changed_bytecode":false,"is_partially_verified":true,"constructor_args":"0x0000000000000000000000002b69099e59b05901faa1dd164fabf098bf831e820000000000000000000000000457276d7b036818b3eddc1a4a3fceda61e9314d000000000000000000000000000000000000000000000000000000000013d62000000000000000000000000000000000000000000000000000000000000186a0"}