@pollum-io/pegasys-protocol
Version:
Contracts for the Pegasys Dex.
263 lines • 581 kB
JSON
{
"id": "c86262261ad0bd910cc455bb84947df3",
"_format": "hh-sol-build-info-1",
"solcVersion": "0.7.6",
"solcLongVersion": "0.7.6+commit.7338295f",
"input": {
"language": "Solidity",
"sources": {
"contracts/pegasys-lib/libraries/AddressStringUtil.sol": {
"content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\npragma solidity >=0.5.0 <0.8.0;\n\nlibrary AddressStringUtil {\n // converts an address to the uppercase hex string, extracting only len bytes (up to 20, multiple of 2)\n function toAsciiString(address addr, uint256 len)\n internal\n pure\n returns (string memory)\n {\n require(\n len % 2 == 0 && len > 0 && len <= 40,\n \"AddressStringUtil: INVALID_LEN\"\n );\n\n bytes memory s = new bytes(len);\n uint256 addrNum = uint256(addr);\n for (uint256 i = 0; i < len / 2; i++) {\n // shift right and truncate all but the least significant byte to extract the byte at position 19-i\n uint8 b = uint8(addrNum >> (8 * (19 - i)));\n // first hex character is the most significant 4 bits\n uint8 hi = b >> 4;\n // second hex character is the least significant 4 bits\n uint8 lo = b - (hi << 4);\n s[2 * i] = char(hi);\n s[2 * i + 1] = char(lo);\n }\n return string(s);\n }\n\n // hi and lo are only 4 bits and between 0 and 16\n // this method converts those values to the unicode/ascii code point for the hex representation\n // uses upper case for the characters\n function char(uint8 b) private pure returns (bytes1 c) {\n if (b < 10) {\n return bytes1(b + 0x30);\n } else {\n return bytes1(b + 0x37);\n }\n }\n}\n"
},
"contracts/pegasys-lib/test/AddressStringUtilTest.sol": {
"content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\npragma solidity >=0.5.0;\n\nimport \"../libraries/AddressStringUtil.sol\";\n\ncontract AddressStringUtilTest {\n function toAsciiString(address addr, uint256 len)\n external\n pure\n returns (string memory)\n {\n return AddressStringUtil.toAsciiString(addr, len);\n }\n}\n"
},
"contracts/pegasys-lib/libraries/SafeERC20Namer.sol": {
"content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\npragma solidity >=0.5.0;\n\nimport \"./AddressStringUtil.sol\";\n\n// produces token descriptors from inconsistent or absent ERC20 symbol implementations that can return string or bytes32\n// this library will always produce a string symbol to represent the token\nlibrary SafeERC20Namer {\n function bytes32ToString(bytes32 x) private pure returns (string memory) {\n bytes memory bytesString = new bytes(32);\n uint256 charCount = 0;\n for (uint256 j = 0; j < 32; j++) {\n bytes1 char = x[j];\n if (char != 0) {\n bytesString[charCount] = char;\n charCount++;\n }\n }\n bytes memory bytesStringTrimmed = new bytes(charCount);\n for (uint256 j = 0; j < charCount; j++) {\n bytesStringTrimmed[j] = bytesString[j];\n }\n return string(bytesStringTrimmed);\n }\n\n // assumes the data is in position 2\n function parseStringData(bytes memory b)\n private\n pure\n returns (string memory)\n {\n uint256 charCount = 0;\n // first parse the charCount out of the data\n for (uint256 i = 32; i < 64; i++) {\n charCount <<= 8;\n charCount += uint8(b[i]);\n }\n\n bytes memory bytesStringTrimmed = new bytes(charCount);\n for (uint256 i = 0; i < charCount; i++) {\n bytesStringTrimmed[i] = b[i + 64];\n }\n\n return string(bytesStringTrimmed);\n }\n\n // uses a heuristic to produce a token name from the address\n // the heuristic returns the full hex of the address string in upper case\n function addressToName(address token) private pure returns (string memory) {\n return AddressStringUtil.toAsciiString(token, 40);\n }\n\n // uses a heuristic to produce a token symbol from the address\n // the heuristic returns the first 6 hex of the address string in upper case\n function addressToSymbol(address token)\n private\n pure\n returns (string memory)\n {\n return AddressStringUtil.toAsciiString(token, 6);\n }\n\n // calls an external view token contract method that returns a symbol or name, and parses the output into a string\n function callAndParseStringReturn(address token, bytes4 selector)\n private\n view\n returns (string memory)\n {\n (bool success, bytes memory data) = token.staticcall(\n abi.encodeWithSelector(selector)\n );\n // if not implemented, or returns empty data, return empty string\n if (!success || data.length == 0) {\n return \"\";\n }\n // bytes32 data always has length 32\n if (data.length == 32) {\n bytes32 decoded = abi.decode(data, (bytes32));\n return bytes32ToString(decoded);\n } else if (data.length > 64) {\n return abi.decode(data, (string));\n }\n return \"\";\n }\n\n // attempts to extract the token symbol. if it does not implement symbol, returns a symbol derived from the address\n function tokenSymbol(address token) internal view returns (string memory) {\n // 0x95d89b41 = bytes4(keccak256(\"symbol()\"))\n string memory symbol = callAndParseStringReturn(token, 0x95d89b41);\n if (bytes(symbol).length == 0) {\n // fallback to 6 uppercase hex of address\n return addressToSymbol(token);\n }\n return symbol;\n }\n\n // attempts to extract the token name. if it does not implement name, returns a name derived from the address\n function tokenName(address token) internal view returns (string memory) {\n // 0x06fdde03 = bytes4(keccak256(\"name()\"))\n string memory name = callAndParseStringReturn(token, 0x06fdde03);\n if (bytes(name).length == 0) {\n // fallback to full hex of address\n return addressToName(token);\n }\n return name;\n }\n}\n"
},
"contracts/pegasys-lib/test/SafeERC20NamerTest.sol": {
"content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\npragma solidity >=0.5.0;\n\nimport \"../libraries/SafeERC20Namer.sol\";\n\n// used for testing the logic of token naming\ncontract SafeERC20NamerTest {\n function tokenSymbol(address token) external view returns (string memory) {\n return SafeERC20Namer.tokenSymbol(token);\n }\n\n function tokenName(address token) external view returns (string memory) {\n return SafeERC20Namer.tokenName(token);\n }\n}\n\n// does not implement name or symbol\ncontract NamerTestFakeOptionalERC20 {\n\n}\n\n// complies with ERC20 and returns strings\ncontract NamerTestFakeCompliantERC20 {\n string public name;\n string public symbol;\n\n constructor(string memory name_, string memory symbol_) {\n name = name_;\n symbol = symbol_;\n }\n}\n\n// implements name and symbol but returns bytes32\ncontract NamerTestFakeNoncompliantERC20 {\n bytes32 public name;\n bytes32 public symbol;\n\n constructor(bytes32 name_, bytes32 symbol_) {\n name = name_;\n symbol = symbol_;\n }\n}\n"
},
"contracts/pegasys-lib/libraries/PairNamer.sol": {
"content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\npragma solidity >=0.5.0;\n\nimport \"./SafeERC20Namer.sol\";\n\n// produces names for pairs of tokens using Pegasys's naming scheme\nlibrary PairNamer {\n string private constant TOKEN_SYMBOL_PREFIX = \"PSYS:\";\n string private constant TOKEN_SEPARATOR = \":\";\n\n // produces a pair descriptor in the format of `${prefix}${name0}:${name1}${suffix}`\n function pairName(\n address token0,\n address token1,\n string memory prefix,\n string memory suffix\n ) internal view returns (string memory) {\n return\n string(\n abi.encodePacked(\n prefix,\n SafeERC20Namer.tokenName(token0),\n TOKEN_SEPARATOR,\n SafeERC20Namer.tokenName(token1),\n suffix\n )\n );\n }\n\n // produces a pair symbol in the format of `PSYS:${symbol0}:${symbol1}${suffix}`\n function pairSymbol(\n address token0,\n address token1,\n string memory suffix\n ) internal view returns (string memory) {\n return\n string(\n abi.encodePacked(\n TOKEN_SYMBOL_PREFIX,\n SafeERC20Namer.tokenSymbol(token0),\n TOKEN_SEPARATOR,\n SafeERC20Namer.tokenSymbol(token1),\n suffix\n )\n );\n }\n}\n"
},
"contracts/pegasys-lib/test/PairNamerTest.sol": {
"content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\npragma solidity >=0.5.0;\n\nimport \"../libraries/PairNamer.sol\";\n\ncontract PairNamerTest {\n function pairName(\n address token0,\n address token1,\n string calldata prefix,\n string calldata suffix\n ) external view returns (string memory) {\n return PairNamer.pairName(token0, token1, prefix, suffix);\n }\n\n function pairSymbol(\n address token0,\n address token1,\n string calldata suffix\n ) external view returns (string memory) {\n return PairNamer.pairSymbol(token0, token1, suffix);\n }\n}\n\n// we do not test with non compliant ERC20 implementations because that's handled by token namer\ncontract PairNamerTestFakeToken {\n string public name;\n string public symbol;\n\n constructor(string memory name_, string memory symbol_) {\n name = name_;\n symbol = symbol_;\n }\n}\n"
}
},
"settings": {
"optimizer": {
"enabled": true,
"runs": 1000
},
"outputSelection": {
"*": {
"*": [
"storageLayout",
"abi",
"evm.bytecode",
"evm.deployedBytecode",
"evm.methodIdentifiers",
"metadata"
],
"": [
"ast"
]
}
}
}
},
"output": {
"contracts": {
"contracts/pegasys-lib/libraries/AddressStringUtil.sol": {
"AddressStringUtil": {
"abi": [],
"evm": {
"bytecode": {
"generatedSources": [],
"linkReferences": {},
"object": "60566023600b82828239805160001a607314601657fe5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220ccadfe8844a50266c98e80354f4ce764a25663e2ea780eb68954853347426bdd64736f6c63430007060033",
"opcodes": "PUSH1 0x56 PUSH1 0x23 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x16 JUMPI INVALID JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xCC 0xAD INVALID DUP9 DIFFICULTY 0xA5 MUL PUSH7 0xC98E80354F4CE7 PUSH5 0xA25663E2EA PUSH25 0xEB68954853347426BDD64736F6C6343000706003300000000 ",
"sourceMap": "79:1383:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;"
},
"deployedBytecode": {
"generatedSources": [],
"immutableReferences": {},
"linkReferences": {},
"object": "73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220ccadfe8844a50266c98e80354f4ce764a25663e2ea780eb68954853347426bdd64736f6c63430007060033",
"opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xCC 0xAD INVALID DUP9 DIFFICULTY 0xA5 MUL PUSH7 0xC98E80354F4CE7 PUSH5 0xA25663E2EA PUSH25 0xEB68954853347426BDD64736F6C6343000706003300000000 ",
"sourceMap": "79:1383:0:-:0;;;;;;;;"
},
"methodIdentifiers": {}
},
"metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/pegasys-lib/libraries/AddressStringUtil.sol\":\"AddressStringUtil\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":1000},\"remappings\":[]},\"sources\":{\"contracts/pegasys-lib/libraries/AddressStringUtil.sol\":{\"keccak256\":\"0xf752c0a7bc7b660a70ef5d6a070b8b87483d93d7bddc1377f405ee3d9dcc3eb2\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://63af317e687290f701c1a2f95024afce77c652b44a260bb559514707d8264ff5\",\"dweb:/ipfs/Qmck4UQtZBJ9ScU3mnH3bNJdziZjxmNiGRJXtbCPky5hn9\"]}},\"version\":1}",
"storageLayout": {
"storage": [],
"types": null
}
}
},
"contracts/pegasys-lib/libraries/PairNamer.sol": {
"PairNamer": {
"abi": [],
"evm": {
"bytecode": {
"generatedSources": [],
"linkReferences": {},
"object": "60566023600b82828239805160001a607314601657fe5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220adc89b82cf1af5f4931400170dc71b364f38ca03ae9e5e41367034fa207aea7264736f6c63430007060033",
"opcodes": "PUSH1 0x56 PUSH1 0x23 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x16 JUMPI INVALID JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xAD 0xC8 SWAP12 DUP3 0xCF BYTE CREATE2 DELEGATECALL SWAP4 EQ STOP OR 0xD 0xC7 SHL CALLDATASIZE 0x4F CODESIZE 0xCA SUB 0xAE SWAP15 0x5E COINBASE CALLDATASIZE PUSH17 0x34FA207AEA7264736F6C63430007060033 ",
"sourceMap": "172:1264:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;"
},
"deployedBytecode": {
"generatedSources": [],
"immutableReferences": {},
"linkReferences": {},
"object": "73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220adc89b82cf1af5f4931400170dc71b364f38ca03ae9e5e41367034fa207aea7264736f6c63430007060033",
"opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xAD 0xC8 SWAP12 DUP3 0xCF BYTE CREATE2 DELEGATECALL SWAP4 EQ STOP OR 0xD 0xC7 SHL CALLDATASIZE 0x4F CODESIZE 0xCA SUB 0xAE SWAP15 0x5E COINBASE CALLDATASIZE PUSH17 0x34FA207AEA7264736F6C63430007060033 ",
"sourceMap": "172:1264:1:-:0;;;;;;;;"
},
"methodIdentifiers": {}
},
"metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/pegasys-lib/libraries/PairNamer.sol\":\"PairNamer\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":1000},\"remappings\":[]},\"sources\":{\"contracts/pegasys-lib/libraries/AddressStringUtil.sol\":{\"keccak256\":\"0xf752c0a7bc7b660a70ef5d6a070b8b87483d93d7bddc1377f405ee3d9dcc3eb2\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://63af317e687290f701c1a2f95024afce77c652b44a260bb559514707d8264ff5\",\"dweb:/ipfs/Qmck4UQtZBJ9ScU3mnH3bNJdziZjxmNiGRJXtbCPky5hn9\"]},\"contracts/pegasys-lib/libraries/PairNamer.sol\":{\"keccak256\":\"0xc86272d854bba66f2361c78941bf865291afd9186cd3accf2378be34152b6463\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://0eccc565d9a80b88dc01b7f39aac88eabc4d2f7f763ca5b45b2a48c6f43d319e\",\"dweb:/ipfs/QmUWxpCWpYVLDTfQk21ofmhewNM87X1qF6dvjUcgW23JC8\"]},\"contracts/pegasys-lib/libraries/SafeERC20Namer.sol\":{\"keccak256\":\"0xf73b9adb6f763bb74b675555086367d6160e415f97f125994d795c48824d3324\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://d8bdeea3380811b4a273e143e2c7791c1df63e95ff53dc072fc62c0893112763\",\"dweb:/ipfs/QmRmms7yFdzgaV3RRe1fxyDB2E4ho5vAveQiAW2QmVE7Kp\"]}},\"version\":1}",
"storageLayout": {
"storage": [],
"types": null
}
}
},
"contracts/pegasys-lib/libraries/SafeERC20Namer.sol": {
"SafeERC20Namer": {
"abi": [],
"evm": {
"bytecode": {
"generatedSources": [],
"linkReferences": {},
"object": "60566023600b82828239805160001a607314601657fe5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220851241a6aa54acba321434a9548c9dcd32f9496e3a93d50b85d7b7a9eb442bf964736f6c63430007060033",
"opcodes": "PUSH1 0x56 PUSH1 0x23 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x16 JUMPI INVALID JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 DUP6 SLT COINBASE 0xA6 0xAA SLOAD 0xAC 0xBA ORIGIN EQ CALLVALUE 0xA9 SLOAD DUP13 SWAP14 0xCD ORIGIN 0xF9 0x49 PUSH15 0x3A93D50B85D7B7A9EB442BF964736F PUSH13 0x63430007060033000000000000 ",
"sourceMap": "303:3630:2:-:0;;;;;;;;;;;;;;;;;;;;;;;;;"
},
"deployedBytecode": {
"generatedSources": [],
"immutableReferences": {},
"linkReferences": {},
"object": "73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220851241a6aa54acba321434a9548c9dcd32f9496e3a93d50b85d7b7a9eb442bf964736f6c63430007060033",
"opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 DUP6 SLT COINBASE 0xA6 0xAA SLOAD 0xAC 0xBA ORIGIN EQ CALLVALUE 0xA9 SLOAD DUP13 SWAP14 0xCD ORIGIN 0xF9 0x49 PUSH15 0x3A93D50B85D7B7A9EB442BF964736F PUSH13 0x63430007060033000000000000 ",
"sourceMap": "303:3630:2:-:0;;;;;;;;"
},
"methodIdentifiers": {}
},
"metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/pegasys-lib/libraries/SafeERC20Namer.sol\":\"SafeERC20Namer\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":1000},\"remappings\":[]},\"sources\":{\"contracts/pegasys-lib/libraries/AddressStringUtil.sol\":{\"keccak256\":\"0xf752c0a7bc7b660a70ef5d6a070b8b87483d93d7bddc1377f405ee3d9dcc3eb2\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://63af317e687290f701c1a2f95024afce77c652b44a260bb559514707d8264ff5\",\"dweb:/ipfs/Qmck4UQtZBJ9ScU3mnH3bNJdziZjxmNiGRJXtbCPky5hn9\"]},\"contracts/pegasys-lib/libraries/SafeERC20Namer.sol\":{\"keccak256\":\"0xf73b9adb6f763bb74b675555086367d6160e415f97f125994d795c48824d3324\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://d8bdeea3380811b4a273e143e2c7791c1df63e95ff53dc072fc62c0893112763\",\"dweb:/ipfs/QmRmms7yFdzgaV3RRe1fxyDB2E4ho5vAveQiAW2QmVE7Kp\"]}},\"version\":1}",
"storageLayout": {
"storage": [],
"types": null
}
}
},
"contracts/pegasys-lib/test/AddressStringUtilTest.sol": {
"AddressStringUtilTest": {
"abi": [
{
"inputs": [
{
"internalType": "address",
"name": "addr",
"type": "address"
},
{
"internalType": "uint256",
"name": "len",
"type": "uint256"
}
],
"name": "toAsciiString",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "pure",
"type": "function"
}
],
"evm": {
"bytecode": {
"generatedSources": [],
"linkReferences": {},
"object": "608060405234801561001057600080fd5b5061030a806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c80635768786e14610030575b600080fd5b6100696004803603604081101561004657600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001356100de565b6040805160208082528351818301528351919283929083019185019080838360005b838110156100a357818101518382015260200161008b565b50505050905090810190601f1680156100d05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b60606100ea83836100f1565b9392505050565b6060600282061580156101045750600082115b8015610111575060288211155b61017c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f41646472657373537472696e675574696c3a20494e56414c49445f4c454e0000604482015290519081900360640190fd5b60008267ffffffffffffffff8111801561019557600080fd5b506040519080825280601f01601f1916602001820160405280156101c0576020820181803683370190505b50905073ffffffffffffffffffffffffffffffffffffffff841660005b600285048110156102a157600860138290030282901c600f600482901c1660f08216820361020a826102ab565b86856002028151811061021957fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350610251816102ab565b86856002026001018151811061026357fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535050600190920191506101dd9050565b5090949350505050565b6000600a8260ff1610156102c657506030810160f81b6102cf565b506037810160f81b5b91905056fea264697066735822122008fa2265ed7f92809afaa728ddf84f95ecf16f048e0cea898e95b51ddd3f462d64736f6c63430007060033",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x30A DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x2B JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x5768786E EQ PUSH2 0x30 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x69 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x46 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0xDE JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xA3 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x8B JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xD0 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x60 PUSH2 0xEA DUP4 DUP4 PUSH2 0xF1 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x2 DUP3 MOD ISZERO DUP1 ISZERO PUSH2 0x104 JUMPI POP PUSH1 0x0 DUP3 GT JUMPDEST DUP1 ISZERO PUSH2 0x111 JUMPI POP PUSH1 0x28 DUP3 GT ISZERO JUMPDEST PUSH2 0x17C JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x41646472657373537472696E675574696C3A20494E56414C49445F4C454E0000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP1 ISZERO PUSH2 0x195 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x1F ADD PUSH1 0x1F NOT AND PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x1C0 JUMPI PUSH1 0x20 DUP3 ADD DUP2 DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP SWAP1 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 JUMPDEST PUSH1 0x2 DUP6 DIV DUP2 LT ISZERO PUSH2 0x2A1 JUMPI PUSH1 0x8 PUSH1 0x13 DUP3 SWAP1 SUB MUL DUP3 SWAP1 SHR PUSH1 0xF PUSH1 0x4 DUP3 SWAP1 SHR AND PUSH1 0xF0 DUP3 AND DUP3 SUB PUSH2 0x20A DUP3 PUSH2 0x2AB JUMP JUMPDEST DUP7 DUP6 PUSH1 0x2 MUL DUP2 MLOAD DUP2 LT PUSH2 0x219 JUMPI INVALID JUMPDEST PUSH1 0x20 ADD ADD SWAP1 PUSH31 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND SWAP1 DUP2 PUSH1 0x0 BYTE SWAP1 MSTORE8 POP PUSH2 0x251 DUP2 PUSH2 0x2AB JUMP JUMPDEST DUP7 DUP6 PUSH1 0x2 MUL PUSH1 0x1 ADD DUP2 MLOAD DUP2 LT PUSH2 0x263 JUMPI INVALID JUMPDEST PUSH1 0x20 ADD ADD SWAP1 PUSH31 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND SWAP1 DUP2 PUSH1 0x0 BYTE SWAP1 MSTORE8 POP POP PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 POP PUSH2 0x1DD SWAP1 POP JUMP JUMPDEST POP SWAP1 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0xA DUP3 PUSH1 0xFF AND LT ISZERO PUSH2 0x2C6 JUMPI POP PUSH1 0x30 DUP2 ADD PUSH1 0xF8 SHL PUSH2 0x2CF JUMP JUMPDEST POP PUSH1 0x37 DUP2 ADD PUSH1 0xF8 SHL JUMPDEST SWAP2 SWAP1 POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 ADDMOD STATICCALL 0x22 PUSH6 0xED7F92809AFA 0xA7 0x28 0xDD 0xF8 0x4F SWAP6 0xEC CALL PUSH16 0x48E0CEA898E95B51DDD3F462D64736F PUSH13 0x63430007060033000000000000 ",
"sourceMap": "118:221:3:-:0;;;;;;;;;;;;;;;;;;;"
},
"deployedBytecode": {
"generatedSources": [],
"immutableReferences": {},
"linkReferences": {},
"object": "608060405234801561001057600080fd5b506004361061002b5760003560e01c80635768786e14610030575b600080fd5b6100696004803603604081101561004657600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001356100de565b6040805160208082528351818301528351919283929083019185019080838360005b838110156100a357818101518382015260200161008b565b50505050905090810190601f1680156100d05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b60606100ea83836100f1565b9392505050565b6060600282061580156101045750600082115b8015610111575060288211155b61017c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f41646472657373537472696e675574696c3a20494e56414c49445f4c454e0000604482015290519081900360640190fd5b60008267ffffffffffffffff8111801561019557600080fd5b506040519080825280601f01601f1916602001820160405280156101c0576020820181803683370190505b50905073ffffffffffffffffffffffffffffffffffffffff841660005b600285048110156102a157600860138290030282901c600f600482901c1660f08216820361020a826102ab565b86856002028151811061021957fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350610251816102ab565b86856002026001018151811061026357fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535050600190920191506101dd9050565b5090949350505050565b6000600a8260ff1610156102c657506030810160f81b6102cf565b506037810160f81b5b91905056fea264697066735822122008fa2265ed7f92809afaa728ddf84f95ecf16f048e0cea898e95b51ddd3f462d64736f6c63430007060033",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x2B JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x5768786E EQ PUSH2 0x30 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x69 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x46 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0xDE JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xA3 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x8B JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xD0 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x60 PUSH2 0xEA DUP4 DUP4 PUSH2 0xF1 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x2 DUP3 MOD ISZERO DUP1 ISZERO PUSH2 0x104 JUMPI POP PUSH1 0x0 DUP3 GT JUMPDEST DUP1 ISZERO PUSH2 0x111 JUMPI POP PUSH1 0x28 DUP3 GT ISZERO JUMPDEST PUSH2 0x17C JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x41646472657373537472696E675574696C3A20494E56414C49445F4C454E0000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP1 ISZERO PUSH2 0x195 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x1F ADD PUSH1 0x1F NOT AND PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x1C0 JUMPI PUSH1 0x20 DUP3 ADD DUP2 DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP SWAP1 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 JUMPDEST PUSH1 0x2 DUP6 DIV DUP2 LT ISZERO PUSH2 0x2A1 JUMPI PUSH1 0x8 PUSH1 0x13 DUP3 SWAP1 SUB MUL DUP3 SWAP1 SHR PUSH1 0xF PUSH1 0x4 DUP3 SWAP1 SHR AND PUSH1 0xF0 DUP3 AND DUP3 SUB PUSH2 0x20A DUP3 PUSH2 0x2AB JUMP JUMPDEST DUP7 DUP6 PUSH1 0x2 MUL DUP2 MLOAD DUP2 LT PUSH2 0x219 JUMPI INVALID JUMPDEST PUSH1 0x20 ADD ADD SWAP1 PUSH31 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND SWAP1 DUP2 PUSH1 0x0 BYTE SWAP1 MSTORE8 POP PUSH2 0x251 DUP2 PUSH2 0x2AB JUMP JUMPDEST DUP7 DUP6 PUSH1 0x2 MUL PUSH1 0x1 ADD DUP2 MLOAD DUP2 LT PUSH2 0x263 JUMPI INVALID JUMPDEST PUSH1 0x20 ADD ADD SWAP1 PUSH31 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND SWAP1 DUP2 PUSH1 0x0 BYTE SWAP1 MSTORE8 POP POP PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 POP PUSH2 0x1DD SWAP1 POP JUMP JUMPDEST POP SWAP1 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0xA DUP3 PUSH1 0xFF AND LT ISZERO PUSH2 0x2C6 JUMPI POP PUSH1 0x30 DUP2 ADD PUSH1 0xF8 SHL PUSH2 0x2CF JUMP JUMPDEST POP PUSH1 0x37 DUP2 ADD PUSH1 0xF8 SHL JUMPDEST SWAP2 SWAP1 POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 ADDMOD STATICCALL 0x22 PUSH6 0xED7F92809AFA 0xA7 0x28 0xDD 0xF8 0x4F SWAP6 0xEC CALL PUSH16 0x48E0CEA898E95B51DDD3F462D64736F PUSH13 0x63430007060033000000000000 ",
"sourceMap": "118:221:3:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;155:182;;;;;;;;;;;;;;;;-1:-1:-1;155:182:3;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;252:13;288:42;320:4;326:3;288:31;:42::i;:::-;281:49;155:182;-1:-1:-1;;;155:182:3:o;219:854:0:-;316:13;372:1;366:3;:7;:12;:23;;;;;388:1;382:3;:7;366:23;:36;;;;;400:2;393:3;:9;;366:36;345:113;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;469:14;496:3;486:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;486:14:0;-1:-1:-1;469:31:0;-1:-1:-1;528:13:0;;;510:15;551:490;581:1;575:3;:7;571:1;:11;551:490;;;743:1;748:2;:6;;;743:12;731:25;;;848:6;853:1;848:6;;;;952:7;;;947:13;;985:8;848:6;985:4;:8::i;:::-;974:1;980;976;:5;974:8;;;;;;;;;;;:19;;;;;;;;;;;1022:8;1027:2;1022:4;:8::i;:::-;1007:1;1013;1009;:5;1017:1;1009:9;1007:12;;;;;;;;;;;:23;;;;;;;;;;-1:-1:-1;;584:3:0;;;;;-1:-1:-1;551:490:0;;-1:-1:-1;551:490:0;;-1:-1:-1;1064:1:0;;219:854;-1:-1:-1;;;;219:854:0:o;1275:185::-;1320:8;1348:2;1344:1;:6;;;1340:114;;;-1:-1:-1;1384:4:0;1380:8;;1373:16;;1366:23;;1340:114;-1:-1:-1;1438:4:0;1434:8;;1427:16;;1340:114;1275:185;;;:::o"
},
"methodIdentifiers": {
"toAsciiString(address,uint256)": "5768786e"
}
},
"metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"len\",\"type\":\"uint256\"}],\"name\":\"toAsciiString\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/pegasys-lib/test/AddressStringUtilTest.sol\":\"AddressStringUtilTest\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":1000},\"remappings\":[]},\"sources\":{\"contracts/pegasys-lib/libraries/AddressStringUtil.sol\":{\"keccak256\":\"0xf752c0a7bc7b660a70ef5d6a070b8b87483d93d7bddc1377f405ee3d9dcc3eb2\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://63af317e687290f701c1a2f95024afce77c652b44a260bb559514707d8264ff5\",\"dweb:/ipfs/Qmck4UQtZBJ9ScU3mnH3bNJdziZjxmNiGRJXtbCPky5hn9\"]},\"contracts/pegasys-lib/test/AddressStringUtilTest.sol\":{\"keccak256\":\"0xaa0b1eab9aa8009bf5f732a8846b3343cfe5b3cf771a1d2998f5119547a967d4\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://25e9b75f926720d1a27c0f5721ad59efc96aec4322722525fe9ee7de1f2b8ae6\",\"dweb:/ipfs/QmQva583htye6RekoFdyynG21upZpn4oa4SRuG9XgyY4nb\"]}},\"version\":1}",
"storageLayout": {
"storage": [],
"types": null
}
}
},
"contracts/pegasys-lib/test/PairNamerTest.sol": {
"PairNamerTest": {
"abi": [
{
"inputs": [
{
"internalType": "address",
"name": "token0",
"type": "address"
},
{
"internalType": "address",
"name": "token1",
"type": "address"
},
{
"internalType": "string",
"name": "prefix",
"type": "string"
},
{
"internalType": "string",
"name": "suffix",
"type": "string"
}
],
"name": "pairName",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "token0",
"type": "address"
},
{
"internalType": "address",
"name": "token1",
"type": "address"
},
{
"internalType": "string",
"name": "suffix",
"type": "string"
}
],
"name": "pairSymbol",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
}
],
"evm": {
"bytecode": {
"generatedSources": [],
"linkReferences": {},
"object": "608060405234801561001057600080fd5b50610cf5806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80634c75e9181461003b578063e9f52d2314610146575b600080fd5b6100d16004803603606081101561005157600080fd5b73ffffffffffffffffffffffffffffffffffffffff823581169260208101359091169181019060608101604082013564010000000081111561009257600080fd5b8201836020820111156100a457600080fd5b803590602001918460018302840111640100000000831117156100c657600080fd5b50909250905061022e565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561010b5781810151838201526020016100f3565b50505050905090810190601f1680156101385780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6100d16004803603608081101561015c57600080fd5b73ffffffffffffffffffffffffffffffffffffffff823581169260208101359091169181019060608101604082013564010000000081111561019d57600080fd5b8201836020820111156101af57600080fd5b803590602001918460018302840111640100000000831117156101d157600080fd5b9193909290916020810190356401000000008111156101ef57600080fd5b82018360208201111561020157600080fd5b8035906020019184600183028401116401000000008311171561022357600080fd5b50909250905061027a565b6060610271858585858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506102fc92505050565b95945050505050565b60606102f1878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8b0181900481028201810190925289815292508991508890819084018382808284376000920191909152506104f492505050565b979650505050505050565b60606040518060400160405280600581526020017f505359533a00000000000000000000000000000000000000000000000000000081525061033d856106b8565b604051806040016040528060018152602001601d60f91b815250610360866106b8565b856040516020018086805190602001908083835b602083106103935780518252601f199092019160209182019101610374565b51815160209384036101000a600019018019909216911617905288519190930192880191508083835b602083106103db5780518252601f1990920191602091820191016103bc565b51815160209384036101000a600019018019909216911617905287519190930192870191508083835b602083106104235780518252601f199092019160209182019101610404565b51815160209384036101000a600019018019909216911617905286519190930192860191508083835b6020831061046b5780518252601f19909201916020918201910161044c565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b602083106104b35780518252601f199092019160209182019101610494565b6001836020036101000a0380198251168184511680821785525050505050509050019550505050505060405160208183030381529060405290509392505050565b6060826105008661070b565b604051806040016040528060018152602001601d60f91b8152506105238761070b565b856040516020018086805190602001908083835b602083106105565780518252601f199092019160209182019101610537565b51815160209384036101000a600019018019909216911617905288519190930192880191508083835b6020831061059e5780518252601f19909201916020918201910161057f565b51815160209384036101000a600019018019909216911617905287519190930192870191508083835b602083106105e65780518252601f1990920191602091820191016105c7565b51815160209384036101000a600019018019909216911617905286519190930192860191508083835b6020831061062e5780518252601f19909201916020918201910161060f565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b602083106106765780518252601f199092019160209182019101610657565b6001836020036101000a038019825116818451168082178552505050505050905001955050505050506040516020818303038152906040529050949350505050565b606060006106e6837f95d89b410000000000000000000000000000000000000000000000000000000061074e565b9050805160001415610703576106fb836109b3565b915050610706565b90505b919050565b60606000610739837f06fdde030000000000000000000000000000000000000000000000000000000061074e565b9050805160001415610703576106fb836109c0565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000851617815291518151606093600093849373ffffffffffffffffffffffffffffffffffffffff891693919290918291908083835b602083106107f45780518252601f1990920191602091820191016107d5565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855afa9150503d8060008114610854576040519150601f19603f3d011682016040523d82523d6000602084013e610859565b606091505b509150915081158061086a57508051155b156108885760405180602001604052806000815250925050506109ad565b8051602014156108c05760008180602001905160208110156108a957600080fd5b505190506108b6816109cd565b93505050506109ad565b604081511115610998578080602001905160208110156108df57600080fd5b81019080805160405193929190846401000000008211156108ff57600080fd5b90830190602082018581111561091457600080fd5b825164010000000081118282018810171561092e57600080fd5b82525081516020918201929091019080838360005b8381101561095b578181015183820152602001610943565b50505050905090810190601f1680156109885780820380516001836020036101000a031916815260200191505b50604052505050925050506109ad565b60405180602001604052806000815250925050505b92915050565b6060610703826006610b0d565b6060610703826028610b0d565b604080516020808252818301909252606091600091906020820181803683370190505090506000805b6020811015610a6f576000858260208110610a0d57fe5b1a60f81b90507fff00000000000000000000000000000000000000000000000000000000000000811615610a665780848481518110610a4857fe5b60200101906001600160f81b031916908160001a9053506001909201915b506001016109f6565b5060008167ffffffffffffffff81118015610a8957600080fd5b506040519080825280601f01601f191660200182016040528015610ab4576020820181803683370190505b50905060005b82811015610b0457838181518110610ace57fe5b602001015160f81c60f81b828281518110610ae557fe5b60200101906001600160f81b031916908160001a905350600101610aba565b50949350505050565b606060028206158015610b205750600082115b8015610b2d575060288211155b610b9857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f41646472657373537472696e675574696c3a20494e56414c49445f4c454e0000604482015290519081900360640190fd5b60008267ffffffffffffffff81118015610bb157600080fd5b506040519080825280601f01601f191660200182016040528015610bdc576020820181803683370190505b50905073ffffffffffffffffffffffffffffffffffffffff841660005b60028504811015610c8d57600860138290030282901c600f600482901c1660f082168203610c2682610c97565b868560020281518110610c3557fe5b60200101906001600160f81b031916908160001a905350610c5581610c97565b868560020260010181518110610c6757fe5b60200101906001600160f81b031916908160001a9053505060019092019150610bf99050565b5090949350505050565b6000600a8260ff161015610cb257506030810160f81b610706565b506037810160f81b61070656fea26469706673582212204335c44629d7a09f2a4ad29cea2299a5531eb9bfb19c32013cf33495d38d68cc64736f6c63430007060033",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xCF5 DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x36 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x4C75E918 EQ PUSH2 0x3B JUMPI DUP1 PUSH4 0xE9F52D23 EQ PUSH2 0x146 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xD1 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x51 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 CALLDATALOAD DUP2 AND SWAP3 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP2 DUP2 ADD SWAP1 PUSH1 0x60 DUP2 ADD PUSH1 0x40 DUP3 ADD CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x92 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0xA4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0xC6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP SWAP1 SWAP3 POP SWAP1 POP PUSH2 0x22E JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x10B JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xF3 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x138 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0xD1 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x15C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 CALLDATALOAD DUP2 AND SWAP3 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP2 DUP2 ADD SWAP1 PUSH1 0x60 DUP2 ADD PUSH1 0x40 DUP3 ADD CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x19D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x1AF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x1D1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 PUSH1 0x20 DUP2 ADD SWAP1 CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x1EF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x201 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x223 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP SWAP1 SWAP3 POP SWAP1 POP PUSH2 0x27A JUMP JUMPDEST PUSH1 0x60 PUSH2 0x271 DUP6 DUP6 DUP6 DUP6 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP PUSH2 0x2FC SWAP3 POP POP POP JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x2F1 DUP8 DUP8 DUP8 DUP8 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F DUP12 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP10 DUP2 MSTORE SWAP3 POP DUP10 SWAP2 POP DUP9 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP PUSH2 0x4F4 SWAP3 POP POP POP JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x5 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x505359533A000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH2 0x33D DUP6 PUSH2 0x6B8 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x1D PUSH1 0xF9 SHL DUP2 MSTORE POP PUSH2 0x360 DUP7 PUSH2 0x6B8 JUMP JUMPDEST DUP6 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP7 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x393 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x374 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE DUP9 MLOAD SWAP2 SWAP1 SWAP4 ADD SWAP3 DUP9 ADD SWAP2 POP DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x3DB JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x3BC JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE DUP8 MLOAD SWAP2 SWAP1 SWAP4 ADD SWAP3 DUP8 ADD SWAP2 POP DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x423 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x404 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE DUP7 MLOAD SWAP2 SWAP1 SWAP4 ADD SWAP3 DUP7 ADD SWAP2 POP DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x46B JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x44C JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE DUP6 MLOAD SWAP2 SWAP1 SWAP4 ADD SWAP3 DUP6 ADD SWAP2 POP DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x4B3 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x494 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP6 POP POP POP POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB D