UNPKG

@firepotfinance/core-firepot

Version:

🎛 Core contracts for the Firepot protocol

399 lines • 544 kB
{ "id": "ce43a0afedb37cfd5c4649a353337cfb", "_format": "hh-sol-build-info-1", "solcVersion": "0.5.16", "solcLongVersion": "0.5.16+commit.9c3226ce", "input": { "language": "Solidity", "sources": { "contracts/FirepotERC20.sol": { "content": "pragma solidity =0.5.16;\n\nimport './interfaces/IFirepotERC20.sol';\nimport './libraries/SafeMath.sol';\n\ncontract FirepotERC20 is IFirepotERC20 {\n using SafeMath for uint;\n\n string public constant name = 'Firepot-LP-Token';\n string public constant symbol = 'FLP';\n uint8 public constant decimals = 18;\n uint public totalSupply;\n mapping(address => uint) public balanceOf;\n mapping(address => mapping(address => uint)) public allowance;\n\n bytes32 public DOMAIN_SEPARATOR;\n // keccak256(\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\");\n bytes32 public constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;\n mapping(address => uint) public nonces;\n\n event Approval(address indexed owner, address indexed spender, uint value);\n event Transfer(address indexed from, address indexed to, uint value);\n\n constructor() public {\n uint chainId;\n assembly {\n chainId := chainid\n }\n DOMAIN_SEPARATOR = keccak256(\n abi.encode(\n keccak256('EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)'),\n keccak256(bytes(name)),\n keccak256(bytes('1')),\n chainId,\n address(this)\n )\n );\n }\n\n function _mint(address to, uint value) internal {\n totalSupply = totalSupply.add(value);\n balanceOf[to] = balanceOf[to].add(value);\n emit Transfer(address(0), to, value);\n }\n\n function _burn(address from, uint value) internal {\n balanceOf[from] = balanceOf[from].sub(value);\n totalSupply = totalSupply.sub(value);\n emit Transfer(from, address(0), value);\n }\n\n function _approve(address owner, address spender, uint value) private {\n allowance[owner][spender] = value;\n emit Approval(owner, spender, value);\n }\n\n function _transfer(address from, address to, uint value) private {\n balanceOf[from] = balanceOf[from].sub(value);\n balanceOf[to] = balanceOf[to].add(value);\n emit Transfer(from, to, value);\n }\n\n function approve(address spender, uint value) external returns (bool) {\n _approve(msg.sender, spender, value);\n return true;\n }\n\n function transfer(address to, uint value) external returns (bool) {\n _transfer(msg.sender, to, value);\n return true;\n }\n\n function transferFrom(address from, address to, uint value) external returns (bool) {\n if (allowance[from][msg.sender] != uint(-1)) {\n allowance[from][msg.sender] = allowance[from][msg.sender].sub(value);\n }\n _transfer(from, to, value);\n return true;\n }\n\n function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external {\n require(deadline >= block.timestamp, 'Firepot: EXPIRED');\n bytes32 digest = keccak256(\n abi.encodePacked(\n '\\x19\\x01',\n DOMAIN_SEPARATOR,\n keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, nonces[owner]++, deadline))\n )\n );\n address recoveredAddress = ecrecover(digest, v, r, s);\n require(recoveredAddress != address(0) && recoveredAddress == owner, 'Firepot: INVALID_SIGNATURE');\n _approve(owner, spender, value);\n }\n}\n" }, "contracts/libraries/SafeMath.sol": { "content": "pragma solidity =0.5.16;\n\n// a library for performing overflow-safe math, courtesy of DappHub (https://github.com/dapphub/ds-math)\n\nlibrary SafeMath {\n function add(uint x, uint y) internal pure returns (uint z) {\n require((z = x + y) >= x, 'ds-math-add-overflow');\n }\n\n function sub(uint x, uint y) internal pure returns (uint z) {\n require((z = x - y) <= x, 'ds-math-sub-underflow');\n }\n\n function mul(uint x, uint y) internal pure returns (uint z) {\n require(y == 0 || (z = x * y) / y == x, 'ds-math-mul-overflow');\n }\n}\n" }, "contracts/interfaces/IFirepotERC20.sol": { "content": "pragma solidity >=0.5.0;\n\ninterface IFirepotERC20 {\n event Approval(address indexed owner, address indexed spender, uint value);\n event Transfer(address indexed from, address indexed to, uint value);\n\n function name() external pure returns (string memory);\n function symbol() external pure returns (string memory);\n function decimals() external pure returns (uint8);\n function totalSupply() external view returns (uint);\n function balanceOf(address owner) external view returns (uint);\n function allowance(address owner, address spender) external view returns (uint);\n\n function approve(address spender, uint value) external returns (bool);\n function transfer(address to, uint value) external returns (bool);\n function transferFrom(address from, address to, uint value) external returns (bool);\n\n function DOMAIN_SEPARATOR() external view returns (bytes32);\n function PERMIT_TYPEHASH() external pure returns (bytes32);\n function nonces(address owner) external view returns (uint);\n\n function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;\n}\n" } }, "settings": { "optimizer": { "enabled": true, "runs": 999999 }, "outputSelection": { "*": { "": [ "ast" ], "*": [ "abi", "metadata", "devdoc", "userdoc", "storageLayout", "evm.legacyAssembly", "evm.bytecode", "evm.deployedBytecode", "evm.methodIdentifiers", "evm.gasEstimates", "evm.assembly" ] } }, "evmVersion": "istanbul" } }, "output": { "contracts": { "contracts/FirepotERC20.sol": { "FirepotERC20": { "abi": [ { "inputs": [], "payable": false, "stateMutability": "nonpayable", "type": "constructor" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "owner", "type": "address" }, { "indexed": true, "internalType": "address", "name": "spender", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" } ], "name": "Approval", "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": "value", "type": "uint256" } ], "name": "Transfer", "type": "event" }, { "constant": true, "inputs": [], "name": "DOMAIN_SEPARATOR", "outputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [], "name": "PERMIT_TYPEHASH", "outputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [ { "internalType": "address", "name": "", "type": "address" }, { "internalType": "address", "name": "", "type": "address" } ], "name": "allowance", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": false, "inputs": [ { "internalType": "address", "name": "spender", "type": "address" }, { "internalType": "uint256", "name": "value", "type": "uint256" } ], "name": "approve", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": true, "inputs": [ { "internalType": "address", "name": "", "type": "address" } ], "name": "balanceOf", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [], "name": "decimals", "outputs": [ { "internalType": "uint8", "name": "", "type": "uint8" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [], "name": "name", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [ { "internalType": "address", "name": "", "type": "address" } ], "name": "nonces", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": false, "inputs": [ { "internalType": "address", "name": "owner", "type": "address" }, { "internalType": "address", "name": "spender", "type": "address" }, { "internalType": "uint256", "name": "value", "type": "uint256" }, { "internalType": "uint256", "name": "deadline", "type": "uint256" }, { "internalType": "uint8", "name": "v", "type": "uint8" }, { "internalType": "bytes32", "name": "r", "type": "bytes32" }, { "internalType": "bytes32", "name": "s", "type": "bytes32" } ], "name": "permit", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": true, "inputs": [], "name": "symbol", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [], "name": "totalSupply", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": false, "inputs": [ { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "value", "type": "uint256" } ], "name": "transfer", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": false, "inputs": [ { "internalType": "address", "name": "from", "type": "address" }, { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "value", "type": "uint256" } ], "name": "transferFrom", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "payable": false, "stateMutability": "nonpayable", "type": "function" } ], "devdoc": { "methods": {} }, "evm": { "assembly": " /* \"contracts/FirepotERC20.sol\":103:3427 contract FirepotERC20 is IFirepotERC20 {... */\n mstore(0x40, 0x80)\n /* \"contracts/FirepotERC20.sol\":916:1360 constructor() public {... */\n callvalue\n /* \"--CODEGEN--\":8:17 */\n dup1\n /* \"--CODEGEN--\":5:7 */\n iszero\n tag_1\n jumpi\n /* \"--CODEGEN--\":30:31 */\n 0x00\n /* \"--CODEGEN--\":27:28 */\n dup1\n /* \"--CODEGEN--\":20:32 */\n revert\n /* \"--CODEGEN--\":5:7 */\ntag_1:\n pop\n /* \"contracts/FirepotERC20.sol\":1099:1194 keccak256('EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)') */\n mload(0x40)\n /* \"contracts/FirepotERC20.sol\":1003:1010 chainid */\n chainid\n swap1\n /* \"contracts/FirepotERC20.sol\":1099:1194 keccak256('EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)') */\n dup1\n 0x52\n data_8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f\n dup3\n codecopy\n 0x40\n dup1\n mload\n swap2\n dup3\n swap1\n sub\n 0x52\n add\n dup3\n keccak256\n /* \"contracts/FirepotERC20.sol\":1228:1232 name */\n dup3\n dup3\n add\n dup3\n mstore\n 0x10\n dup4\n mstore\n shl(0x81, 0x2334b932b837ba16a62816aa37b5b2b7)\n 0x20\n swap4\n dup5\n add\n mstore\n /* \"contracts/FirepotERC20.sol\":1262:1272 bytes('1') */\n dup2\n mload\n dup1\n dup4\n add\n dup4\n mstore\n 0x01\n dup2\n mstore\n shl(0xf8, 0x31)\n swap1\n dup5\n add\n mstore\n /* \"contracts/FirepotERC20.sol\":1071:1343 abi.encode(... */\n dup2\n mload\n dup1\n dup5\n add\n swap2\n swap1\n swap2\n mstore\n /* \"contracts/FirepotERC20.sol\":1212:1234 keccak256(bytes(name)) */\n 0x3385a9db56213d5d224192fa2a4ce7b4c32b3c201da41f3238a75728962c8bd6\n /* \"contracts/FirepotERC20.sol\":1071:1343 abi.encode(... */\n dup2\n dup4\n add\n mstore\n /* \"contracts/FirepotERC20.sol\":1252:1273 keccak256(bytes('1')) */\n 0xc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6\n /* \"contracts/FirepotERC20.sol\":1071:1343 abi.encode(... */\n 0x60\n dup3\n add\n mstore\n 0x80\n dup2\n add\n swap5\n swap1\n swap5\n mstore\n /* \"contracts/FirepotERC20.sol\":1324:1328 this */\n address\n /* \"contracts/FirepotERC20.sol\":1071:1343 abi.encode(... */\n 0xa0\n dup1\n dup7\n add\n swap2\n swap1\n swap2\n mstore\n dup2\n mload\n /* \"--CODEGEN--\":26:47 */\n dup1\n dup7\n sub\n /* \"--CODEGEN--\":22:54 */\n swap1\n swap2\n add\n /* \"--CODEGEN--\":6:55 */\n dup2\n mstore\n /* \"contracts/FirepotERC20.sol\":1071:1343 abi.encode(... */\n 0xc0\n swap1\n swap5\n add\n swap1\n mstore\n /* \"contracts/FirepotERC20.sol\":1048:1353 keccak256(... */\n dup3\n mload\n swap3\n add\n swap2\n swap1\n swap2\n keccak256\n /* \"contracts/FirepotERC20.sol\":1029:1045 DOMAIN_SEPARATOR */\n 0x03\n /* \"contracts/FirepotERC20.sol\":1029:1353 DOMAIN_SEPARATOR = keccak256(... */\n sstore\n pop\n /* \"contracts/FirepotERC20.sol\":103:3427 contract FirepotERC20 is IFirepotERC20 {... */\n dataSize(sub_0)\n dup1\n dataOffset(sub_0)\n 0x00\n codecopy\n 0x00\n return\nstop\ndata_8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f 454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e747261637429\n\nsub_0: assembly {\n /* \"contracts/FirepotERC20.sol\":103:3427 contract FirepotERC20 is IFirepotERC20 {... */\n mstore(0x40, 0x80)\n callvalue\n /* \"--CODEGEN--\":8:17 */\n dup1\n /* \"--CODEGEN--\":5:7 */\n iszero\n tag_1\n jumpi\n /* \"--CODEGEN--\":30:31 */\n 0x00\n /* \"--CODEGEN--\":27:28 */\n dup1\n /* \"--CODEGEN--\":20:32 */\n revert\n /* \"--CODEGEN--\":5:7 */\n tag_1:\n /* \"contracts/FirepotERC20.sol\":103:3427 contract FirepotERC20 is IFirepotERC20 {... */\n pop\n jumpi(tag_2, lt(calldatasize, 0x04))\n shr(0xe0, calldataload(0x00))\n dup1\n 0x3644e515\n gt\n tag_16\n jumpi\n dup1\n 0x95d89b41\n gt\n tag_17\n jumpi\n dup1\n 0x95d89b41\n eq\n tag_12\n jumpi\n dup1\n 0xa9059cbb\n eq\n tag_13\n jumpi\n dup1\n 0xd505accf\n eq\n tag_14\n jumpi\n dup1\n 0xdd62ed3e\n eq\n tag_15\n jumpi\n jump(tag_2)\n tag_17:\n dup1\n 0x3644e515\n eq\n tag_9\n jumpi\n dup1\n 0x70a08231\n eq\n tag_10\n jumpi\n dup1\n 0x7ecebe00\n eq\n tag_11\n jumpi\n jump(tag_2)\n tag_16:\n dup1\n 0x23b872dd\n gt\n tag_18\n jumpi\n dup1\n 0x23b872dd\n eq\n tag_6\n jumpi\n dup1\n 0x30adf81f\n eq\n tag_7\n jumpi\n dup1\n 0x313ce567\n eq\n tag_8\n jumpi\n jump(tag_2)\n tag_18:\n dup1\n 0x06fdde03\n eq\n tag_3\n jumpi\n dup1\n 0x095ea7b3\n eq\n tag_4\n jumpi\n dup1\n 0x18160ddd\n eq\n tag_5\n jumpi\n tag_2:\n 0x00\n dup1\n revert\n /* \"contracts/FirepotERC20.sol\":178:226 string public constant name = 'Firepot-LP-Token' */\n tag_3:\n tag_19\n tag_20\n jump\t// in\n tag_19:\n 0x40\n dup1\n mload\n 0x20\n dup1\n dup3\n mstore\n dup4\n mload\n dup2\n dup4\n add\n mstore\n dup4\n mload\n swap2\n swap3\n dup4\n swap3\n swap1\n dup4\n add\n swap2\n dup6\n add\n swap1\n dup1\n dup4\n dup4\n 0x00\n /* \"--CODEGEN--\":8:108 */\n tag_21:\n /* \"--CODEGEN--\":33:36 */\n dup4\n /* \"--CODEGEN--\":30:31 */\n dup2\n /* \"--CODEGEN--\":27:37 */\n lt\n /* \"--CODEGEN--\":8:108 */\n iszero\n tag_23\n jumpi\n /* \"--CODEGEN--\":90:101 */\n dup2\n dup2\n add\n /* \"--CODEGEN--\":84:102 */\n mload\n /* \"--CODEGEN--\":71:82 */\n dup4\n dup3\n add\n /* \"--CODEGEN--\":64:103 */\n mstore\n /* \"--CODEGEN--\":52:54 */\n 0x20\n /* \"--CODEGEN--\":45:55 */\n add\n /* \"--CODEGEN--\":8:108 */\n jump(tag_21)\n tag_23:\n /* \"--CODEGEN--\":12:26 */\n pop\n /* \"contracts/FirepotERC20.sol\":178:226 string public constant name = 'Firepot-LP-Token' */\n pop\n pop\n pop\n swap1\n pop\n swap1\n dup2\n add\n swap1\n 0x1f\n and\n dup1\n iszero\n tag_24\n jumpi\n dup1\n dup3\n sub\n dup1\n mload\n 0x01\n dup4\n 0x20\n sub\n 0x0100\n exp\n sub\n not\n and\n dup2\n mstore\n 0x20\n add\n swap2\n pop\n tag_24:\n pop\n swap3\n pop\n pop\n pop\n mload(0x40)\n dup1\n swap2\n sub\n swap1\n return\n /* \"contracts/FirepotERC20.sol\":2174:2318 function approve(address spender, uint value) external returns (bool) {... */\n tag_4:\n tag_25\n 0x04\n dup1\n calldatasize\n sub\n /* \"--CODEGEN--\":13:15 */\n 0x40\n /* \"--CODEGEN--\":8:11 */\n dup2\n /* \"--CODEGEN--\":5:16 */\n lt\n /* \"--CODEGEN--\":2:4 */\n iszero\n tag_26\n jumpi\n /* \"--CODEGEN--\":29:30 */\n 0x00\n /* \"--CODEGEN--\":26:27 */\n dup1\n /* \"--CODEGEN--\":19:31 */\n revert\n /* \"--CODEGEN--\":2:4 */\n tag_26:\n pop\n /* \"contracts/FirepotERC20.sol\":2174:2318 function approve(address spender, uint value) external returns (bool) {... */\n 0xffffffffffffffffffffffffffffffffffffffff\n dup2\n calldataload\n and\n swap1\n 0x20\n add\n calldataload\n tag_27\n jump\t// in\n tag_25:\n 0x40\n dup1\n mload\n swap2\n iszero\n iszero\n dup3\n mstore\n mload\n swap1\n dup2\n swap1\n sub\n 0x20\n add\n swap1\n return\n /* \"contracts/FirepotERC20.sol\":316:340 uint public totalSupply */\n tag_5:\n tag_28\n tag_29\n jump\t// in\n tag_28:\n 0x40\n dup1\n mload\n swap2\n dup3\n mstore\n mload\n swap1\n dup2\n swap1\n sub\n 0x20\n add\n swap1\n return\n /* \"contracts/FirepotERC20.sol\":2466:2761 function transferFrom(address from, address to, uint value) external returns (bool) {... */\n tag_6:\n tag_25\n 0x04\n dup1\n calldatasize\n sub\n /* \"--CODEGEN--\":13:15 */\n 0x60\n /* \"--CODEGEN--\":8:11 */\n dup2\n /* \"--CODEGEN--\":5:16 */\n lt\n /* \"--CODEGEN--\":2:4 */\n iszero\n tag_31\n jumpi\n /* \"--CODEGEN--\":29:30 */\n 0x00\n /* \"--CODEGEN--\":26:27 */\n dup1\n /* \"--CODEGEN--\":19:31 */\n revert\n /* \"--CODEGEN--\":2:4 */\n tag_31:\n pop\n /* \"contracts/FirepotERC20.sol\":2466:2761 function transferFrom(address from, address to, uint value) external returns (bool) {... */\n 0xffffffffffffffffffffffffffffffffffffffff\n dup2\n calldataload\n dup2\n and\n swap2\n 0x20\n dup2\n add\n calldataload\n swap1\n swap2\n and\n swap1\n 0x40\n add\n calldataload\n tag_32\n jump\t// in\n /* \"contracts/FirepotERC20.sol\":602:710 bytes32 public constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9 */\n tag_7:\n tag_28\n tag_34\n jump\t// in\n /* \"contracts/FirepotERC20.sol\":275:310 uint8 public constant decimals = 18 */\n tag_8:\n tag_35\n tag_36\n jump\t// in\n tag_35:\n 0x40\n dup1\n mload\n 0xff\n swap1\n swap3\n and\n dup3\n mstore\n mload\n swap1\n dup2\n swap1\n sub\n 0x20\n add\n swap1\n return\n /* \"contracts/FirepotERC20.sol\":461:492 bytes32 public DOMAIN_SEPARATOR */\n tag_9:\n tag_28\n tag_38\n jump\t// in\n /* \"contracts/FirepotERC20.sol\":346:387 mapping(address => uint) public balanceOf */\n tag_10:\n tag_28\n 0x04\n dup1\n calldatasize\n sub\n /* \"--CODEGEN--\":13:15 */\n 0x20\n /* \"--CODEGEN--\":8:11 */\n dup2\n /* \"--CODEGEN--\":5:16 */\n lt\n /* \"--CODEGEN--\":2:4 */\n iszero\n tag_40\n jumpi\n /* \"--CODEGEN--\":29:30 */\n 0x00\n /* \"--CODEGEN--\":26:27 */\n dup1\n /* \"--CODEGEN--\":19:31 */\n revert\n /* \"--CODEGEN--\":2:4 */\n tag_40:\n pop\n /* \"contracts/FirepotERC20.sol\":346:387 mapping(address => uint) public balanceOf */\n calldataload\n 0xffffffffffffffffffffffffffffffffffffffff\n and\n tag_41\n jump\t// in\n /* \"contracts/FirepotERC20.sol\":716:754 mapping(address => uint) public nonces */\n tag_11:\n tag_28\n 0x04\n dup1\n calldatasize\n sub\n /* \"--CODEGEN--\":13:15 */\n 0x20\n /* \"--CODEGEN--\":8:11 */\n dup2\n /* \"--CODEGEN--\":5:16 */\n lt\n /* \"--CODEGEN--\":2:4 */\n iszero\n tag_43\n jumpi\n /* \"--CODEGEN--\":29:30 */\n 0x00\n /* \"--CODEGEN--\":26:27 */\n dup1\n /* \"--CODEGEN--\":19:31 */\n revert\n /* \"--CODEGEN--\":2:4 */\n tag_43:\n pop\n /* \"contracts/FirepotERC20.sol\":716:754 mapping(address => uint) public nonces */\n calldataload\n 0xffffffffffffffffffffffffffffffffffffffff\n and\n tag_44\n jump\t// in\n /* \"contracts/FirepotERC20.sol\":232:269 string public constant symbol = 'FLP' */\n tag_12:\n tag_19\n tag_46\n jump\t// in\n /* \"contracts/FirepotERC20.sol\":2324:2460 function transfer(address to, uint value) external returns (bool) {... */\n tag_13:\n tag_25\n 0x04\n dup1\n calldatasize\n sub\n /* \"--CODEGEN--\":13:15 */\n 0x40\n /* \"--CODEGEN--\":8:11 */\n dup2\n /* \"--CODEGEN--\":5:16 */\n lt\n /* \"--CODEGEN--\":2:4 */\n iszero\n tag_52\n jumpi\n /* \"--CODEGEN--\":29:30 */\n 0x00\n /* \"--CODEGEN--\":26:27 */\n dup1\n /* \"--CODEGEN--\":19:31 */\n revert\n /* \"--CODEGEN--\":2:4 */\n tag_52:\n pop\n /* \"contracts/FirepotERC20.sol\":2324:2460 function transfer(address to, uint value) external returns (bool) {... */\n 0xffffffffffffffffffffffffffffffffffffffff\n dup2\n calldataload\n and\n swap1\n 0x20\n add\n calldataload\n tag_53\n jump\t// in\n /* \"contracts/FirepotERC20.sol\":2767:3425 function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external {... */\n tag_14:\n tag_54\n 0x04\n dup1\n calldatasize\n sub\n /* \"--CODEGEN--\":13:16 */\n 0xe0\n /* \"--CODEGEN--\":8:11 */\n dup2\n /* \"--CODEGEN--\":5:17 */\n lt\n /* \"--CODEGEN--\":2:4 */\n iszero\n tag_55\n jumpi\n /* \"--CODEGEN--\":30:31 */\n 0x00\n /* \"--CODEGEN--\":27:28 */\n dup1\n /* \"--CODEGEN--\":20:32 */\n revert\n /* \"--CODEGEN--\":2:4 */\n tag_55:\n pop\n /* \"contracts/FirepotERC20.sol\":2767:3425 function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external {... */\n 0xffffffffffffffffffffffffffffffffffffffff\n dup2\n calldataload\n dup2\n and\n swap2\n 0x20\n dup2\n add\n calldataload\n swap1\n swap2\n and\n swap1\n 0x40\n dup2\n add\n calldataload\n swap1\n 0x60\n dup2\n add\n calldataload\n swap1\n 0xff\n 0x80\n dup3\n add\n calldataload\n and\n swap1\n 0xa0\n dup2\n add\n calldataload\n swap1\n 0xc0\n add\n calldataload\n tag_56\n jump\t// in\n tag_54:\n stop\n /* \"contracts/FirepotERC20.sol\":393:454 mapping(address => mapping(address => uint)) public allowance */\n tag_15:\n tag_28\n 0x04\n dup1\n calldatasize\n sub\n /* \"--CODEGEN--\":13:15 */\n 0x40\n /* \"--CODEGEN--\":8:11 */\n dup2\n /* \"--CODEGEN--\":5:16 */\n lt\n /* \"--CODEGEN--\":2:4 */\n iszero\n tag_58\n jumpi\n /* \"--CODEGEN--\":29:30 */\n 0x00\n /* \"--CODEGEN--\":26:27 */\n dup1\n /* \"--CODEGEN--\":19:31 */\n revert\n /* \"--CODEGEN--\":2:4 */\n tag_58:\n pop\n /* \"contracts/FirepotERC20.sol\":393:454 mapping(address => mapping(address => uint)) public allowance */\n 0xffffffffffffffffffffffffffffffffffffffff\n dup2\n calldataload\n dup2\n and\n swap2\n 0x20\n add\n calldataload\n and\n tag_59\n jump\t// in\n /* \"contracts/FirepotERC20.sol\":178:226 string public constant name = 'Firepot-LP-Token' */\n tag_20:\n mload(0x40)\n dup1\n 0x40\n add\n 0x40\n mstore\n dup1\n 0x10\n dup2\n mstore\n 0x20\n add\n 0x46697265706f742d4c502d546f6b656e00000000000000000000000000000000\n dup2\n mstore\n pop\n dup2\n jump\t// out\n /* \"contracts/FirepotERC20.sol\":2174:2318 function approve(address spender, uint value) external returns (bool) {... */\n tag_27:\n /* \"contracts/FirepotERC20.sol\":2238:2242 bool */\n 0x00\n /* \"contracts/FirepotERC20.sol\":2254:2290 _approve(msg.sender, spender, value) */\n tag_61\n /* \"contracts/FirepotERC20.sol\":2263:2273 msg.sender */\n caller\n /* \"contracts/FirepotERC20.sol\":2275:2282 spender */\n dup5\n /* \"contracts/FirepotERC20.sol\":2284:2289 value */\n dup5\n /* \"contracts/FirepotERC20.sol\":2254:2262 _approve */\n tag_62\n /* \"contracts/FirepotERC20.sol\":2254:2290 _approve(msg.sender, spender, value) */\n jump\t// in\n tag_61:\n pop\n /* \"contracts/FirepotERC20.sol\":2307:2311 true */\n 0x01\n /* \"contracts/FirepotERC20.sol\":2174:2318 function approve(address spender, uint value) external returns (bool) {... */\n tag_60:\n swap3\n swap2\n pop\n pop\n jump\t// out\n /* \"contracts/FirepotERC20.sol\":316:340 uint public totalSupply */\n tag_29:\n sload(0x00)\n dup2\n jump\t// out\n /* \"contracts/FirepotERC20.sol\":2466:2761 function transferFrom(address from, address to, uint value) external returns (bool) {... */\n tag_32:\n /* \"contracts/FirepotERC20.sol\":2564:2579 allowance[from] */\n 0xffffffffffffffffffffffffffffffffffffffff\n dup4\n and\n /* \"contracts/FirepotERC20.sol\":2544:2548 bool */\n 0x00\n /* \"contracts/FirepotERC20.sol\":2564:2579 allowance[from] */\n swap1\n dup2\n mstore\n /* \"contracts/FirepotERC20.sol\":2564:2573 allowance */\n 0x02\n /* \"contracts/FirepotERC20.sol\":2564:2579 allowance[from] */\n 0x20\n swap1\n dup2\n mstore\n 0x40\n dup1\n dup4\n keccak256\n /* \"contracts/FirepotERC20.sol\":2580:2590 msg.sender */\n caller\n /* \"contracts/FirepotERC20.sol\":2564:2591 allowance[from][msg.sender] */\n dup5\n mstore\n swap1\n swap2\n mstore\n dup2\n keccak256\n sload\n /* \"contracts/FirepotERC20.sol\":2600:2602 -1 */\n 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\n /* \"contracts/FirepotERC20.sol\":2564:2603 allowance[from][msg.sender] != uint(-1) */\n eq\n /* \"contracts/FirepotERC20.sol\":2560:2698 if (allowance[from][msg.sender] != uint(-1)) {... */\n tag_64\n jumpi\n /* \"contracts/FirepotERC20.sol\":2649:2664 allowance[from] */\n 0xffffffffffffffffffffffffffffffffffffffff\n dup5\n and\n 0x00\n swap1\n dup2\n mstore\n /* \"contracts/FirepotERC20.sol\":2649:2658 allowance */\n 0x02\n /* \"contracts/FirepotERC20.sol\":2649:2664 allowance[from] */\n 0x20\n swap1\n dup2\n mstore\n 0x40\n dup1\n dup4\n keccak256\n /* \"contracts/FirepotERC20.sol\":2665:2675 msg.sender */\n caller\n /* \"contracts/FirepotERC20.sol\":2649:2676 allowance[from][msg.sender] */\n dup5\n mstore\n swap1\n swap2\n mstore\n swap1\n keccak256\n sload\n /* \"contracts/FirepotERC20.sol\":2649:2687 allowance[from][msg.sender].sub(value) */\n tag_65\n swap1\n /* \"contracts/FirepotERC20.sol\":2681:2686 value */\n dup4\n /* \"contracts/FirepotERC20.sol\":2649:2687 allowance[from][msg.sender].sub(value) */\n 0xffffffff\n /* \"contracts/FirepotERC20.sol\":2649:2680 allowance[from][msg.sender].sub */\n tag_66\n /* \"contracts/FirepotERC20.sol\":2649:2687 allowance[from][msg.sender].sub(value) */\n and\n jump\t// in\n tag_65:\n /* \"contracts/FirepotERC20.sol\":2619:2634 allowance[from] */\n 0xffffffffffffffffffffffffffffffffffffffff\n dup6\n and\n 0x00\n swap1\n dup2\n mstore\n /* \"contracts/FirepotERC20.sol\":2619:2628 allowance */\n 0x02\n /* \"contracts/FirepotERC20.sol\":2619:2634 allowance[from] */\n 0x20\n swap1\n dup2\n mstore\n 0x40\n dup1\n dup4\n keccak256\n /* \"contracts/FirepotERC20.sol\":2635:2645 msg.sender */\n caller\n /* \"contracts/FirepotERC20.sol\":2619:2646 allowance[from][msg.sender] */\n dup5\n mstore\n swap1\n swap2\n mstore\n swap1\n keccak256\n /* \"contracts/FirepotERC20.sol\":2619:2687 allowance[from][msg.sender] = allowance[from][msg.sender].sub(value) */\n sstore\n /* \"contracts/FirepotERC20.sol\":2560:2698 if (allowance[from][msg.sender] != uint(-1)) {... */\n tag_64:\n /* \"contracts/FirepotERC20.sol\":2707:2733 _transfer(from, to, value) */\n tag_67\n /* \"contracts/FirepotERC20.sol\":2717:2721 from */\n dup5\n /* \"contracts/FirepotERC20.sol\":2723:2725 to */\n dup5\n /* \"contracts/FirepotERC20.sol\":2727:2732 value */\n dup5\n /* \"contracts/FirepotERC20.sol\":2707:2716 _transfer */\n tag_68\n /* \"contracts/FirepotERC20.sol\":2707:2733 _transfer(from, to, value) */\n jump\t// in\n tag_67:\n pop\n /* \"contracts/FirepotERC20.sol\":2750:2754 true */\n 0x01\n /* \"contracts/FirepotERC20.sol\":2466:2761 function transferFrom(address from, address to, uint value) external returns (bool) {... */\n swap4\n swap3\n pop\n pop\n pop\n jump\t// out\n /* \"contracts/FirepotERC20.sol\":602:710 bytes32 public constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9 */\n tag_34:\n /* \"contracts/FirepotERC20.sol\":644:710 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9 */\n 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9\n /* \"contracts/FirepotERC20.sol\":602:710 bytes32 public constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9 */\n dup2\n jump\t// out\n /* \"contracts/FirepotERC20.sol\":275:310 uint8 public constant decimals = 18 */\n tag_36:\n /* \"contracts/FirepotERC20.sol\":308:310 18 */\n 0x12\n /* \"contracts/FirepotERC20.sol\":275:310 uint8 public constant decimals = 18 */\n dup2\n jump\t// out\n /* \"contracts/FirepotERC20.sol\":461:492 bytes32 public DOMAIN_SEPARATOR */\n tag_38:\n sload(0x03)\n dup2\n jump\t// out\n /* \"contracts/FirepotERC20.sol\":346:387 mapping(address => uint) public balanceOf */\n tag_41:\n mstore(0x20, 0x01)\n 0x00\n swap1\n dup2\n mstore\n 0x40\n swap1\n keccak256\n sload\n dup2\n jump\t// out\n /* \"contracts/FirepotERC20.sol\":716:754 mapping(address => uint) public nonces */\n tag_44:\n mstore(0x20, 0x04)\n 0x00\n swap1\n dup2\n mstore\n 0x40\n swap1\n keccak256\n sload\n dup2\n jump\t// out\n /* \"contracts/FirepotERC20.sol\":232:269 string public constant symbol = 'FLP' */\n tag_46:\n mload(0x40)\n dup1\n 0x40\n add\n 0x40\n mstore\n dup1\n 0x03\n dup2\n mstore\n 0x20\n add\n 0x464c500000000000000000000000000000000000000000000000000000000000\n dup2\n mstore\n pop\n dup2\n jump\t// out\n /* \"contracts/FirepotERC20.sol\":2324:2460 function transfer(address to, uint value) external returns (bool) {... */\n tag_53:\n /* \"contracts/FirepotERC20.sol\":2384:2388 bool */\n 0x00\n /* \"contracts/FirepotERC20.sol\":2400:2432 _transfer(msg.sender, to, value) */\n tag_61\n /* \"contracts/FirepotERC20.sol\":2410:2420 msg.sender */\n caller\n /* \"contracts/FirepotERC20.sol\":2422:2424 to */\n dup5\n /* \"contracts/FirepotERC20.sol\":2426:2431 value */\n dup5\n /* \"contracts/FirepotERC20.sol\":2400:2409 _transfer */\n tag_68\n /* \"contracts/FirepotERC20.sol\":2400:2432 _transfer(msg.sender, to, value) */\n jump\t// in\n /* \"contracts/FirepotERC20.sol\":2767:3425 function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external {... */\n tag_56:\n /* \"contracts/FirepotERC20.sol\":2912:2927 block.timestamp */\n timestamp\n /* \"contracts/FirepotERC20.sol\":2900:2908 deadline */\n dup5\n /* \"contracts/FirepotERC20.sol\":2900:2927 deadline >= block.timestamp */\n lt\n iszero\n /* \"contracts/FirepotERC20.sol\":2892:2948 require(deadline >= block.timestamp, 'Firepot: EXPIRED') */\n tag_72\n jumpi\n 0x40\n dup1\n mload\n 0x08c379a000000000000000000000000000000000000000000000000000000000\n dup2\n mstore\n 0x20\n 0x04\n dup3\n add\n mstore\n 0x10\n 0x24\n dup3\n add\n mstore\n 0x46697265706f743a204558504952454400000000000000000000000000000000\n 0x44\n dup3\n add\n mstore\n swap1\n mload\n swap1\n dup2\n swap1\n sub\n 0x64\n add\n swap1\n revert\n tag_72:\n /* \"contracts/FirepotERC20.sol\":3060:3076 DOMAIN_SEPARATOR */\n sload(0x03)\n /* \"contracts/FirepotERC20.sol\":3155:3168 nonces[owner] */\n 0xffffffffffffffffffffffffffffffffffffffff\n dup1\n dup10\n and\n /* \"contracts/FirepotERC20.sol\":2958:2972 bytes32 digest */\n 0x00\n /* \"contracts/FirepotERC20.sol\":3155:3168 nonces[owner] */\n dup2\n dup2\n mstore\n /* \"contracts/FirepotERC20.sol\":3155:3161 nonces */\n 0x04\n /* \"contracts/FirepotERC20.sol\":3155:3168 nonces[owner] */\n 0x20\n swap1\n dup2\n mstore\n 0x40\n dup1\n dup4\n keccak256\n /* \"contracts/FirepotERC20.sol\":3155:3170 nonces[owner]++ */\n dup1\n sload\n 0x01\n dup1\n dup3\n add\n swap1\n swap3\n sstore\n /* \"contracts/FirepotERC20.sol\":3104:3181 abi.encode(PERMIT_TYPEHASH, owner, spender, value, nonces[owner]++, deadline) */\n dup3\n mload\n /* \"contracts/FirepotERC20.sol\":644:710 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9 */\n 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9\n /* \"contracts/FirepotERC20.sol\":3104:3181 abi.encode(PERMIT_TYPEHASH, owner, spender, value, nonces[owner]++, deadline) */\n dup2\n dup7\n add\n mstore\n dup1\n dup5\n add\n swap7\n swap1\n swap7\n mstore\n swap6\n dup14\n and\n 0x60\n dup7\n add\n mstore\n 0x80\n dup6\n add\n dup13\n swap1\n mstore\n 0xa0\n dup6\n add\n swap6\n swap1\n swap6\n mstore\n 0xc0\n dup1\n dup6\n add\n dup12\n swap1\n mstore\n dup2\n mload\n /* \"--CODEGEN--\":26:47 */\n dup1\n dup7\n sub\n /* \"--CODEGEN--\":22:54 */\n swap1\n swap2\n add\n /* \"--CODEGEN--\":6:55 */\n dup2\n mstore\n /* \"contracts/FirepotERC20.sol\":3104:3181 abi.encode(PERMIT_TYPEHASH, owner, spender, value, nonces[owner]++, deadline) */\n 0xe0\n dup6\n add\n dup3\n mstore\n /* \"contracts/FirepotERC20.sol\":3094:3182 keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, nonces[owner]++, deadline)) */\n dup1\n mload\n swap1\n dup4\n add\n keccak256\n /* \"contracts/FirepotERC20.sol\":2998:3196 abi.encodePacked(... */\n 0x1901000000000000000000000000000000000000000000000000000000000000\n 0x0100\n dup7\n add\n mstore\n 0x0102\n dup6\n add\n swap7\n swap1\n swap7\n mstore\n 0x0122\n dup1\n dup6\n add\n swap7\n swap1\n swap7\n mstore\n dup1\n mload\n /* \"--CODEGEN--\":26:47 */\n dup1\n dup6\n sub\n /* \"--CODEGEN--\":22:54 */\n swap1\n swap7\n add\n /* \"--CODEGEN--\":6:55 */\n dup7\n mstore\n /* \"contracts/FirepotERC20.sol\":2998:3196 abi.encodePacked(... */\n 0x0142\n dup5\n add\n dup1\n dup3\n mstore\n /* \"contracts/FirepotERC20.sol\":2975:3206 keccak256(... */\n dup7\n mload\n swap7\n dup4\n add\n swap7\n swap1\n swap7\n keccak256\n /* \"contracts/FirepotERC20.sol\":3243:3269 ecrecover(digest, v, r, s) */\n swap6\n dup4\n swap1\n mstore\n 0x0162\n dup5\n add\n dup1\n dup3\n mstore\n dup7\n swap1\n mstore\n 0xff\n dup10\n and\n 0x0182\n dup6\n add\n mstore\n 0x01a2\n dup5\n add\n dup9\n swap1\n mstore\n 0x01c2\n dup5\n add\n dup8\n swap1\n mstore\n mload\n /* \"contracts/FirepotERC20.sol\":2958:2972 bytes32 digest */\n swap2\n swap4\n /* \"contracts/FirepotERC20.sol\":3155:3170 nonces[owner]++ */\n swap3\n /* \"contracts/FirepotERC20.sol\":3243:3269 ecrecover(digest, v, r, s) */\n 0x01e2\n dup1\n dup3\n add\n swap4\n 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0\n dup2\n add\n swap3\n dup2\n swap1\n sub\n swap1\n swap2\n add\n swap1\n /* \"contracts/FirepotERC20.sol\":3155:3170 nonces[owner]++ */\n dup6\n /* \"contracts/FirepotERC20.sol\":3243:3269 ecrecover(digest, v, r, s) */\n gas\n staticcall\n iszero\n /* \"--CODEGEN--\":8:17 */\n dup1\n /* \"--CODEGEN--\":5:7 */\n iszero\n tag_73\n jumpi\n /* \"--CODEGEN--\":45:61 */\n returndatasize\n /* \"--CODEGEN--\":42:43 */\n 0x00\n /* \"--CODEGEN--\":39:40 */\n dup1\n /* \"--CODEGEN--\":24:62 */\n returndatacopy\n /* \"--CODEGEN--\":77:93 */\n returndatasize\n /* \"--CODEGEN--\":74:75 */\n 0x00\n /* \"--CODEGEN--\":67:94 */\n revert\n /* \"--CODEGEN--\":5:7 */\n tag_73:\n pop\n pop\n /* \"contracts/FirepotERC20.sol\":3243:3269 ecrecover(digest, v, r, s) */\n mload(add(0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0, mload(0x40)))\n swap2\n pop\n pop\n /* \"contracts/FirepotERC20.sol\":3287:3317 recoveredAddress != address(0) */\n 0xffffffffffffffffffffffffffffffffffffffff\n dup2\n and\n iszero\n dup1\n iszero\n swap1\n /* \"contracts/FirepotERC20.sol\":3287:3346 recoveredAddress != address(0) && recoveredAddress == owner */\n tag_74\n jumpi\n pop\n /* \"contracts/FirepotERC20.sol\":3341:3346 owner */\n dup9\n /* \"contracts/FirepotERC20.sol\":3321:3346 recoveredAddress == owner */\n 0xffffffffffffffffffffffffffffffffffffffff\n and\n /* \"contracts/FirepotERC20.sol\":3321:3337 recoveredAddress */\n dup2\n /* \"contracts/FirepotERC20.sol\":3321:3346 recoveredAddress == owner */\n 0xffffffffffffffffffffffffffffffffffffffff\n and\n eq\n /* \"contracts/FirepotERC20.sol\":3287:3346 recoveredAddress != address(0) && recoveredAddress == owner */\n tag_74:\n /* \"contracts/FirepotERC20.sol\":3279:3377 require(recoveredAddress != address(0) && recoveredAddress == owner, 'Firepot: INVALID_SIGNATURE') */\n tag_75\n jumpi\n 0x40\n dup1\n mload\n 0x08c379a000000000000000000000000000000000000000000000000000000000\n dup2\n mstore\n 0x20\n 0x04\n dup3\n add\n mstore\n 0x1a\n 0x24\n dup3\n add\n mstore\n 0x46697265706f743a20494e56414c49445f5349474e4154555245000000000000\n 0x44\n dup3\n add\n mstore\n swap1\n mload\n swap1\n dup2\n swap1\n sub\n 0x64\n add\n swap1\n revert\n tag_75:\n /* \"contracts/FirepotERC20.sol\":3387:3418 _approve(owner, spender, value) */\n tag_76\n /* \"contracts/FirepotERC20.sol\":3396:3401 owner */\n dup10\n /* \"contracts/FirepotERC20.sol\":3403:3410 spender */\n dup10\n /* \"contracts/FirepotERC20.sol\":3412:3417 value */\n dup10\n /* \"contracts/FirepotERC20.sol\":3387:3395 _approve */\n tag_62\n /* \"contracts/FirepotERC20.sol\":3387:3418 _approve(owner, spender, value) */\n jump\t// in\n tag_76:\n /* \"contracts/FirepotERC20.sol\":2767:3425 function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external {... */\n pop\n pop\n pop\n pop\n pop\n pop\n pop\n pop\n pop\n jump\t// out\n /* \"contracts/FirepotERC20.sol\":393:454 mapping(address => mapping(address => uint)) public allowance */\n tag_59:\n 0x02\n 0x20\n swap1\n dup2\n mstore\n 0x00\n swap3\n dup4\n mstore\n 0x40\n dup1\n dup5\n keccak256\n swap1\n swap2\n mstore\n swap1\n dup3\n mstore\n swap1\n keccak256\n sload\n dup2\n jump\t// out\n /* \"contracts/FirepotERC20.sol\":1780:1946 function _approve(address owner, address spender, uint value) private {... */\n tag_62:\n /* \"contracts/FirepotERC20.sol\":1860:1876 allowance[owner] */\n 0xffffffffffffffffffffffffffffffffffffffff\n dup1\n dup5\n and\n 0x00\n dup2\n dup2\n mstore\n /* \"contracts/FirepotERC20.sol\":1860:1869 allowance */\n 0x02\n /* \"contracts/FirepotERC20.sol\":1860:1876 allowance[owner] */\n 0x20\n swap1\n dup2\n mstore\n 0x40\n dup1\n dup4\n keccak256\n /* \"contracts/FirepotERC20.sol\":1860:1885 allowance[owner][spender] */\n swap5\n dup8\n and\n dup1\n dup5\n mstore\n swap5\n dup3\n mstore\n swap2\n dup3\n swap1\n keccak256\n /* \"contracts/FirepotERC20.sol\":1860:1893 allowance[owner][spender] = value */\n dup6\n swap1\n sstore\n /* \"contracts/FirepotERC20.sol\":1908:1939 Approval(owner, spender, value) */\n dup2\n mload\n dup6\n dup2\n mstore\n swap2\n mload\n 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925\n swap3\n dup2\n swap1\n sub\n swap1\n swap2\n add\n swap1\n log3\n /* \"contracts/FirepotERC20.sol\":1780:1946 function _approve(address owner, address spender, uint value) private {... */\n pop\n pop\n pop\n jump\t// out\n /* \"contracts/libraries/SafeMath.sol\":287:414 function sub(uint x, uint y) internal pure returns (uint z) {... */\n tag_66:\n /* \"contracts/libraries/SafeMath.sol\":370:375 x - y */\n dup1\n dup3\n sub\n /* \"contracts/libraries/SafeMath.sol\":365:381 (z = x - y) <= x */\n dup3\n dup2\n gt\n iszero\n /* \"contracts/libraries/SafeMath.sol\":357:407 require((z = x - y) <= x, 'ds-math-sub-underflow') */\n tag_60\n jumpi\n 0x40\n dup1\n mload\n 0x08c379a000000000000000000000000000000000000000000000000000000000\n dup2\n mstore\