429 lines
406 KiB
JSON
429 lines
406 KiB
JSON
{
|
|
"schemaVersion": "2.0.0",
|
|
"contractName": "BridgeAdapter",
|
|
"compilerOutput": {
|
|
"abi": [
|
|
{
|
|
"inputs": [
|
|
{
|
|
"internalType": "contract IEtherTokenV06",
|
|
"name": "weth",
|
|
"type": "address"
|
|
}
|
|
],
|
|
"stateMutability": "nonpayable",
|
|
"type": "constructor"
|
|
},
|
|
{
|
|
"anonymous": false,
|
|
"inputs": [
|
|
{
|
|
"indexed": false,
|
|
"internalType": "uint256",
|
|
"name": "source",
|
|
"type": "uint256"
|
|
},
|
|
{
|
|
"indexed": false,
|
|
"internalType": "contract IERC20TokenV06",
|
|
"name": "inputToken",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"indexed": false,
|
|
"internalType": "contract IERC20TokenV06",
|
|
"name": "outputToken",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"indexed": false,
|
|
"internalType": "uint256",
|
|
"name": "inputTokenAmount",
|
|
"type": "uint256"
|
|
},
|
|
{
|
|
"indexed": false,
|
|
"internalType": "uint256",
|
|
"name": "outputTokenAmount",
|
|
"type": "uint256"
|
|
}
|
|
],
|
|
"name": "BridgeFill",
|
|
"type": "event"
|
|
},
|
|
{
|
|
"inputs": [],
|
|
"name": "BANCOR_ETH_ADDRESS",
|
|
"outputs": [
|
|
{
|
|
"internalType": "contract IERC20TokenV06",
|
|
"name": "",
|
|
"type": "address"
|
|
}
|
|
],
|
|
"stateMutability": "view",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [
|
|
{
|
|
"components": [
|
|
{
|
|
"internalType": "uint256",
|
|
"name": "source",
|
|
"type": "uint256"
|
|
},
|
|
{
|
|
"internalType": "uint256",
|
|
"name": "takerTokenAmount",
|
|
"type": "uint256"
|
|
},
|
|
{
|
|
"internalType": "uint256",
|
|
"name": "makerTokenAmount",
|
|
"type": "uint256"
|
|
},
|
|
{
|
|
"internalType": "bytes",
|
|
"name": "bridgeData",
|
|
"type": "bytes"
|
|
}
|
|
],
|
|
"internalType": "struct IBridgeAdapter.BridgeOrder",
|
|
"name": "order",
|
|
"type": "tuple"
|
|
},
|
|
{
|
|
"internalType": "contract IERC20TokenV06",
|
|
"name": "sellToken",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "contract IERC20TokenV06",
|
|
"name": "buyToken",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "uint256",
|
|
"name": "sellAmount",
|
|
"type": "uint256"
|
|
}
|
|
],
|
|
"name": "trade",
|
|
"outputs": [
|
|
{
|
|
"internalType": "uint256",
|
|
"name": "boughtAmount",
|
|
"type": "uint256"
|
|
}
|
|
],
|
|
"stateMutability": "nonpayable",
|
|
"type": "function"
|
|
}
|
|
],
|
|
"devdoc": {
|
|
"kind": "dev",
|
|
"methods": {},
|
|
"version": 1
|
|
},
|
|
"evm": {
|
|
"bytecode": {
|
|
"linkReferences": {},
|
|
"object": "0x6101206040527feeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee00000000000000000000000060a0523480156200003657600080fd5b50604051620037143803806200371483398101604081905262000059916200007f565b60601b6001600160601b031916608081905260c081905260e081905261010052620000af565b60006020828403121562000091578081fd5b81516001600160a01b0381168114620000a8578182fd5b9392505050565b60805160601c60a05160601c60c05160601c60e05160601c6101005160601c6135c162000153600039806108e252806109715280610a8c5280610bac52806122d652508061120c528061129b528061134a52806113a6528061147b52806114cf525080610e3d5280610ef45280610f7b5280610ff752806111105280611164525080610fd45280611050525080611d015280611e205280611fc352506135c16000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80638dc669fa1461003b578063df2b273714610059575b600080fd5b610043610079565b6040516100509190612d48565b60405180910390f35b61006c610067366004612a32565b610091565b6040516100509190613391565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee81565b8351600090600314806100a557508451600f145b806100b157508451600d145b156100cd576100c684848488606001516102a4565b905061025c565b8451600e14156100e6576100c683838760600151610552565b8451601114806100f7575084516013145b1561010b576100c68383876060015161076f565b845160101415610125576100c684848488606001516108b8565b84511580610134575084516004145b15610149576100c68484848860600151610d0b565b845160071415610163576100c68484848860600151610e1c565b84516009141561017d576100c684848488606001516111ef565b8451600a1415610197576100c68484848860600151611558565b8451600b14156101b1576100c68484848860600151611646565b8451600c14156101cb576100c684848488606001516116d9565b8451600614156101e4576100c684838760600151611770565b8451601214156101fd576100c6848387606001516119dd565b845160051415610216576100c683838760600151611b1c565b84516001141561022f576100c683838760600151611bf5565b845160021415610249576100c6848484886060015161204c565b610259848484886060015161212b565b90505b84516040517fff3bc5e46464411f331d1b093e1587d2d1aa667f5618f98a95afc4132709d3a99161029491879087908790879061339a565b60405180910390a1949350505050565b60006102ae61275d565b828060200190518101906102c29190612b23565b80519091506102e99073ffffffffffffffffffffffffffffffffffffffff881690866121c5565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff8716906370a082319061033e903090600401612d48565b60206040518083038186803b15801561035657600080fd5b505afa15801561036a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061038e9190612baf565b905060006060836000015173ffffffffffffffffffffffffffffffffffffffff168460200151856040015186606001518a60016040516024016103d49493929190613021565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161045d9190612d2c565b6000604051808303816000865af19150503d806000811461049a576040519150601f19603f3d011682016040523d82523d6000602084013e61049f565b606091505b5091509150816104b2576104b2816122a1565b610545838973ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016104ef9190612d48565b60206040518083038186803b15801561050757600080fd5b505afa15801561051b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061053f9190612baf565b906122a9565b9998505050505050505050565b60006060600060608480602001905181019061056e9190612a20565b80519094509092506002111590506105bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105b290613163565b60405180910390fd5b8573ffffffffffffffffffffffffffffffffffffffff16826001845103815181106105e257fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614610637576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105b29061321d565b61067681868460008151811061064957fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff166121c59092919063ffffffff16565b6040517f38ed173900000000000000000000000000000000000000000000000000000000815260609073ffffffffffffffffffffffffffffffffffffffff8316906338ed1739906106d49089906001908890309042906004016133d6565b600060405180830381600087803b1580156106ee57600080fd5b505af1158015610702573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526107489190810190612853565b90508060018251038151811061075a57fe5b602002602001015193505050505b9392505050565b600080606080848060200190518101906107899190612a20565b805191945092506002111590506107cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105b290613334565b8573ffffffffffffffffffffffffffffffffffffffff16816001835103815181106107f357fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614610848576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105b29061327a565b61085a82868360008151811061064957fe5b6040517f38ed173900000000000000000000000000000000000000000000000000000000815260609073ffffffffffffffffffffffffffffffffffffffff8416906338ed1739906106d49089906001908790309042906004016133d6565b600080828060200190518101906108cf91906128e3565b905060006108de8288886122d2565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161415610a8a576040517f2e1a7d4d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690632e1a7d4d906109a6908890600401613391565b600060405180830381600087803b1580156109c057600080fd5b505af11580156109d4573d6000803e3d6000fd5b50506040517fad65d76d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416925063ad65d76d91508790610a319060019042903090600401613046565b6020604051808303818588803b158015610a4a57600080fd5b505af1158015610a5e573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610a839190612baf565b9250610d01565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415610c3057610aff73ffffffffffffffffffffffffffffffffffffffff881682876121c5565b6040517f95e3c50b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8216906395e3c50b90610b569088906001904290600401613480565b602060405180830381600087803b158015610b7057600080fd5b505af1158015610b84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ba89190612baf565b92507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0846040518263ffffffff1660e01b81526004016000604051808303818588803b158015610c1257600080fd5b505af1158015610c26573d6000803e3d6000fd5b5050505050610d01565b610c5173ffffffffffffffffffffffffffffffffffffffff881682876121c5565b6040517fddf7e1a700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82169063ddf7e1a790610cac908890600190819042908d90600401613447565b602060405180830381600087803b158015610cc657600080fd5b505af1158015610cda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cfe9190612baf565b92505b5050949350505050565b60008082806020019051810190610d2291906128e3565b9050610d4573ffffffffffffffffffffffffffffffffffffffff871682866121c5565b6040517f8201aa3f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821690638201aa3f90610dc090899088908a906001907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90600401612fb0565b6040805180830381600087803b158015610dd957600080fd5b505af1158015610ded573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e119190612beb565b509695505050505050565b600080606083806020019051810190610e3591906129db565b9150915060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1614610eb457610eaf73ffffffffffffffffffffffffffffffffffffffff891684886121c5565b610f5c565b506040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152859073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690632e1a7d4d90610f29908490600401613391565b600060405180830381600087803b158015610f4357600080fd5b505af1158015610f57573d6000803e3d6000fd5b505050505b8273ffffffffffffffffffffffffffffffffffffffff166329589f61827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff1614610fd2578a610ff4565b7f00000000000000000000000000000000000000000000000000000000000000005b897f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168c73ffffffffffffffffffffffffffffffffffffffff161461104e578b611070565b7f00000000000000000000000000000000000000000000000000000000000000005b307fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600160008b6040518a63ffffffff1660e01b81526004016110ba989796959493929190612f0e565b6020604051808303818588803b1580156110d357600080fd5b505af11580156110e7573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061110c9190612baf565b93507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614156111e4577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b1580156111ca57600080fd5b505af11580156111de573d6000803e3d6000fd5b50505050505b505050949350505050565b6000808280602001905181019061120691906128e3565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16141561130a576040517f2e1a7d4d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690632e1a7d4d906112d0908890600401613391565b600060405180830381600087803b1580156112ea57600080fd5b505af11580156112fe573d6000803e3d6000fd5b5050505084905061132b565b61132b73ffffffffffffffffffffffffffffffffffffffff881683876121c5565b8173ffffffffffffffffffffffffffffffffffffffff1663d5bcb9b5827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff16146113a157896113a4565b60005b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff16146113fd5789611400565b60005b89600160006040518763ffffffff1660e01b8152600401611425959493929190612e93565b6020604051808303818588803b15801561143e57600080fd5b505af1158015611452573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906114779190612baf565b92507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415610d01577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0846040518263ffffffff1660e01b81526004016000604051808303818588803b15801561153557600080fd5b505af1158015611549573d6000803e3d6000fd5b50505050505050949350505050565b6000808280602001905181019061156f91906128e3565b905061159273ffffffffffffffffffffffffffffffffffffffff871682866121c5565b6040517f6e81221c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821690636e81221c906115ea908990899089903090600401612e5b565b602060405180830381600087803b15801561160457600080fd5b505af1158015611618573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061163c9190612baf565b9695505050505050565b6000808280602001905181019061165d91906128e3565b905061168073ffffffffffffffffffffffffffffffffffffffff871682866121c5565b6040517f0621b4f600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821690630621b4f6906115ea90899088908a90600190600401612f79565b600080828060200190518101906116f091906128e3565b905061171373ffffffffffffffffffffffffffffffffffffffff871682866121c5565b6040517f0b2583c800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821690630b2583c8906115ea9089908990899060019042820190600401612ed0565b6000806000808480602001905181019061178a919061294e565b919450925090506117b273ffffffffffffffffffffffffffffffffffffffff881683886121c5565b801561187557604080516000815260208101918290527f8dae73330000000000000000000000000000000000000000000000000000000090915273ffffffffffffffffffffffffffffffffffffffff831690638dae73339061181c9089906001906024810161341f565b602060405180830381600087803b15801561183657600080fd5b505af115801561184a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061186e9190612baf565b93506119d3565b6040517fca19ebd900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84169063ca19ebd9906118c99085908a90600401612d90565b60206040518083038186803b1580156118e157600080fd5b505afa1580156118f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119199190612baf565b604080516000815260208101918290527fe67ce7060000000000000000000000000000000000000000000000000000000090915290945073ffffffffffffffffffffffffffffffffffffffff83169063e67ce7069061197f9087908a906024810161341f565b602060405180830381600087803b15801561199957600080fd5b505af11580156119ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119d19190612baf565b505b5050509392505050565b6000806000838060200190518101906119f6919061299e565b9092509050611a1c73ffffffffffffffffffffffffffffffffffffffff871683876124bf565b80611aca576040517fdd93f59a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83169063dd93f59a90611a73903090600401612d48565b602060405180830381600087803b158015611a8d57600080fd5b505af1158015611aa1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ac59190612baf565b61163c565b6040517fbd6015b400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83169063bd6015b4906115ea903090600401612d48565b60008060608084806020019051810190611b369190612a20565b80519194509250600211159050611b79576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105b290613106565b8573ffffffffffffffffffffffffffffffffffffffff1681600183510381518110611ba057fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614610848576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105b2906132d7565b60008060608084806020019051810190611c0f91906128ff565b80519194509250600211159050611c52576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105b2906130a9565b8573ffffffffffffffffffffffffffffffffffffffff1681600183510381518110611c7957fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff161480611d4f575073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff1681600183510381518110611cd957fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16148015611d4f57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16145b611d85576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105b2906131c0565b600073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff1682600081518110611dbf57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff161415611e8f576040517f2e1a7d4d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690632e1a7d4d90611e55908990600401613391565b600060405180830381600087803b158015611e6f57600080fd5b505af1158015611e83573d6000803e3d6000fd5b50505050859050611eae565b611eae82600081518110611e9f57fe5b602002602001015184886121c5565b6040517fb77d239b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84169063b77d239b908390611f0e9086908b9060019030906000908190600401612db6565b6020604051808303818588803b158015611f2757600080fd5b505af1158015611f3b573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611f609190612baf565b935073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff1682600184510381518110611f9d57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614156119d3577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b15801561202957600080fd5b505af115801561203d573d6000803e3d6000fd5b50505050505050509392505050565b6000806000838060200190518101906120659190612bc7565b915091506120748782876124bf565b6040517f9f44296a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821690639f44296a9084906120ca908a903090600401612d69565b60e0604051808303818588803b1580156120e357600080fd5b505af11580156120f7573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061211c9190612c0e565b50909998505050505050505050565b60008060608380602001905181019061214491906129db565b909250905061216a73ffffffffffffffffffffffffffffffffffffffff881683876124bf565b6040517f65d02b0400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8316906365d02b0490610cac908a908a9030906001908890600401612e09565b6040517fdd62ed3e000000000000000000000000000000000000000000000000000000008152819073ffffffffffffffffffffffffffffffffffffffff85169063dd62ed3e9061221b9030908790600401612d69565b60206040518083038186803b15801561223357600080fd5b505afa158015612247573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061226b9190612baf565b101561229c5761229c83837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61256b565b505050565b805160208201fd5b6000828211156122c7576122c76122c260028585612588565b6122a1565b508082035b92915050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146123ce576040517f06f2bf6200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8516906306f2bf6290612379908690600401612d48565b60206040518083038186803b15801561239157600080fd5b505afa1580156123a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123c991906128e3565b612470565b6040517f06f2bf6200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8516906306f2bf6290612420908590600401612d48565b60206040518083038186803b15801561243857600080fd5b505afa15801561244c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061247091906128e3565b905073ffffffffffffffffffffffffffffffffffffffff8116610768576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105b290613072565b606063a9059cbb60e01b83836040516024016124dc929190612d90565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050612565848261262d565b50505050565b606063095ea7b360e01b83836040516024016124dc929190612d90565b606063e946c1bb60e01b8484846040516024016125a793929190612ff1565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290509392505050565b600060608373ffffffffffffffffffffffffffffffffffffffff16836040516126569190612d2c565b6000604051808303816000865af19150503d8060008114612693576040519150601f19603f3d011682016040523d82523d6000602084013e612698565b606091505b50915091508180156126ae57506126ae816126c7565b156126ba5750506126c3565b612565816122a1565b5050565b60008151600014156126db57506001612708565b60208251106127085760006126f183600061270d565b90508060011415612706576001915050612708565b505b919050565b6000610768838360008160200183511015612735576127356122c2600585518560200161273e565b50016020015190565b6060632800659560e01b8484846040516024016125a793929190613013565b60408051608081018252600080825260208201819052918101829052606081019190915290565b600082601f830112612794578081fd5b81516127a76127a2826134bd565b613496565b8181529150602080830190848101818402860182018710156127c857600080fd5b60005b848110156127f05781516127de81613557565b845292820192908201906001016127cb565b505050505092915050565b600082601f83011261280b578081fd5b81516128196127a2826134dd565b915080825283602082850101111561283057600080fd5b61284181602084016020860161352b565b5092915050565b80356122cc81613557565b60006020808385031215612865578182fd5b825167ffffffffffffffff81111561287b578283fd5b8301601f8101851361288b578283fd5b80516128996127a2826134bd565b81815283810190838501858402850186018910156128b5578687fd5b8694505b838510156128d75780518352600194909401939185019185016128b9565b50979650505050505050565b6000602082840312156128f4578081fd5b815161076881613557565b60008060408385031215612911578081fd5b825161291c81613557565b602084015190925067ffffffffffffffff811115612938578182fd5b61294485828601612784565b9150509250929050565b600080600060608486031215612962578081fd5b835161296d81613557565b602085015190935061297e81613557565b60408501519092508015158114612993578182fd5b809150509250925092565b600080604083850312156129b0578182fd5b82516129bb81613557565b602084015190925080151581146129d0578182fd5b809150509250929050565b600080604083850312156129ed578182fd5b82516129f881613557565b602084015190925067ffffffffffffffff811115612a14578182fd5b612944858286016127fb565b60008060408385031215612911578182fd5b60008060008060808587031215612a47578182fd5b843567ffffffffffffffff80821115612a5e578384fd5b9086019060808289031215612a71578384fd5b612a7b6080613496565b823581526020808401358183015260408401356040830152606084013583811115612aa4578687fd5b80850194505089601f850112612ab8578586fd5b83359250612ac86127a2846134dd565b8381528a82858701011115612adb578687fd5b612aea8483830184880161351f565b80606084015250819750612b008a828b01612848565b965050505050612b138660408701612848565b9396929550929360600135925050565b600060808284031215612b34578081fd5b612b3e6080613496565b8251612b4981613557565b815260208301517fffffffff0000000000000000000000000000000000000000000000000000000081168114612b7d578283fd5b60208201526040830151612b908161357c565b60408201526060830151612ba38161357c565b60608201529392505050565b600060208284031215612bc0578081fd5b5051919050565b60008060408385031215612bd9578182fd5b8251915060208301516129d081613557565b60008060408385031215612bfd578182fd5b505080516020909101519092909150565b60008060008060e08587031215612c23578182fd5b8451935060208086015193506040860151925086607f870112612c44578182fd5b612c4e6080613496565b80606088018960e08a011115612c62578485fd5b845b6004811015612c8157815184529284019290840190600101612c64565b505080935050505092959194509250565b6000815180845260208085019450808401835b83811015612cd757815173ffffffffffffffffffffffffffffffffffffffff1687529582019590820190600101612ca5565b509495945050505050565b60008151808452612cfa81602086016020860161352b565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60008251612d3e81846020870161352b565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b600060c08252612dc960c0830189612c92565b602083019790975250604081019490945273ffffffffffffffffffffffffffffffffffffffff92831660608501529116608083015260a090910152919050565b600073ffffffffffffffffffffffffffffffffffffffff8088168352808716602084015280861660408401525083606083015260a06080830152612e5060a0830184612ce2565b979650505050505050565b73ffffffffffffffffffffffffffffffffffffffff948516815292841660208401526040830191909152909116606082015260800190565b73ffffffffffffffffffffffffffffffffffffffff9586168152938516602085015260408401929092526060830152909116608082015260a00190565b73ffffffffffffffffffffffffffffffffffffffff958616815293909416602084015260408301919091526060820152608081019190915260a00190565b600061010073ffffffffffffffffffffffffffffffffffffffff808c1684528a6020850152808a16604085015280891660608501528760808501528660a085015280861660c0850152508060e0840152612f6a81840185612ce2565b9b9a5050505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff9485168152602081019390935292166040820152606081019190915260800190565b73ffffffffffffffffffffffffffffffffffffffff958616815260208101949094529190931660408301526060820192909252608081019190915260a00190565b6060810160048510612fff57fe5b938152602081019290925260409091015290565b6060810160088510612fff57fe5b600f94850b81529290930b6020830152604082015260ff909116606082015260800190565b928352602083019190915273ffffffffffffffffffffffffffffffffffffffff16604082015260600190565b60208082526018908201527f4d6978696e556e69737761702f4e4f5f45584348414e47450000000000000000604082015260600190565b6020808252602c908201527f4d6978696e42616e636f722f504154485f4c454e4754485f4d5553545f42455f60408201527f41545f4c454153545f54574f0000000000000000000000000000000000000000606082015260800190565b6020808252602f908201527f4d6978696e43727970746f436f6d2f504154485f4c454e4754485f4d5553545f60408201527f42455f41545f4c454153545f54574f0000000000000000000000000000000000606082015260800190565b6020808252602f908201527f4d6978696e5375736869737761702f504154485f4c454e4754485f4d5553545f60408201527f42455f41545f4c454153545f54574f0000000000000000000000000000000000606082015260800190565b60208082526038908201527f4d6978696e42616e636f722f4c4153545f454c454d454e545f4f465f5041544860408201527f5f4d5553545f4d415443485f4f55545055545f544f4b454e0000000000000000606082015260800190565b6020808252603b908201527f4d6978696e5375736869737761702f4c4153545f454c454d454e545f4f465f5060408201527f4154485f4d5553545f4d415443485f4f55545055545f544f4b454e0000000000606082015260800190565b6020808252603b908201527f4d6978696e556e697377617056322f4c4153545f454c454d454e545f4f465f5060408201527f4154485f4d5553545f4d415443485f4f55545055545f544f4b454e0000000000606082015260800190565b6020808252603b908201527f4d6978696e43727970746f436f6d2f4c4153545f454c454d454e545f4f465f5060408201527f4154485f4d5553545f4d415443485f4f55545055545f544f4b454e0000000000606082015260800190565b6020808252602f908201527f4d6978696e556e697377617056332f504154485f4c454e4754485f4d5553545f60408201527f42455f41545f4c454153545f54574f0000000000000000000000000000000000606082015260800190565b90815260200190565b94855273ffffffffffffffffffffffffffffffffffffffff93841660208601529190921660408401526060830191909152608082015260a00190565b600086825285602083015260a060408301526133f560a0830186612c92565b73ffffffffffffffffffffffffffffffffffffffff94909416606083015250608001529392505050565b60008482528360208301526060604083015261343e6060830184612ce2565b95945050505050565b94855260208501939093526040840191909152606083015273ffffffffffffffffffffffffffffffffffffffff16608082015260a00190565b9283526020830191909152604082015260600190565b60405181810167ffffffffffffffff811182821017156134b557600080fd5b604052919050565b600067ffffffffffffffff8211156134d3578081fd5b5060209081020190565b600067ffffffffffffffff8211156134f3578081fd5b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b82818337506000910152565b60005b8381101561354657818101518382015260200161352e565b838111156125655750506000910152565b73ffffffffffffffffffffffffffffffffffffffff8116811461357957600080fd5b50565b80600f0b811461357957600080fdfea264697066735822122071dc735350cfa03acdcd4814215a1296a2a2b80d236c98208c6cb24d71b9a3b664736f6c634300060c0033",
|
|
"opcodes": "PUSH2 0x120 PUSH1 0x40 MSTORE PUSH32 0xEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE000000000000000000000000 PUSH1 0xA0 MSTORE CALLVALUE DUP1 ISZERO PUSH3 0x36 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH3 0x3714 CODESIZE SUB DUP1 PUSH3 0x3714 DUP4 CODECOPY DUP2 ADD PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH3 0x59 SWAP2 PUSH3 0x7F JUMP JUMPDEST PUSH1 0x60 SHL PUSH1 0x1 PUSH1 0x1 PUSH1 0x60 SHL SUB NOT AND PUSH1 0x80 DUP2 SWAP1 MSTORE PUSH1 0xC0 DUP2 SWAP1 MSTORE PUSH1 0xE0 DUP2 SWAP1 MSTORE PUSH2 0x100 MSTORE PUSH3 0xAF JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH3 0x91 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH3 0xA8 JUMPI DUP2 DUP3 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x80 MLOAD PUSH1 0x60 SHR PUSH1 0xA0 MLOAD PUSH1 0x60 SHR PUSH1 0xC0 MLOAD PUSH1 0x60 SHR PUSH1 0xE0 MLOAD PUSH1 0x60 SHR PUSH2 0x100 MLOAD PUSH1 0x60 SHR PUSH2 0x35C1 PUSH3 0x153 PUSH1 0x0 CODECOPY DUP1 PUSH2 0x8E2 MSTORE DUP1 PUSH2 0x971 MSTORE DUP1 PUSH2 0xA8C MSTORE DUP1 PUSH2 0xBAC MSTORE DUP1 PUSH2 0x22D6 MSTORE POP DUP1 PUSH2 0x120C MSTORE DUP1 PUSH2 0x129B MSTORE DUP1 PUSH2 0x134A MSTORE DUP1 PUSH2 0x13A6 MSTORE DUP1 PUSH2 0x147B MSTORE DUP1 PUSH2 0x14CF MSTORE POP DUP1 PUSH2 0xE3D MSTORE DUP1 PUSH2 0xEF4 MSTORE DUP1 PUSH2 0xF7B MSTORE DUP1 PUSH2 0xFF7 MSTORE DUP1 PUSH2 0x1110 MSTORE DUP1 PUSH2 0x1164 MSTORE POP DUP1 PUSH2 0xFD4 MSTORE DUP1 PUSH2 0x1050 MSTORE POP DUP1 PUSH2 0x1D01 MSTORE DUP1 PUSH2 0x1E20 MSTORE DUP1 PUSH2 0x1FC3 MSTORE POP PUSH2 0x35C1 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 0x8DC669FA EQ PUSH2 0x3B JUMPI DUP1 PUSH4 0xDF2B2737 EQ PUSH2 0x59 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x43 PUSH2 0x79 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x50 SWAP2 SWAP1 PUSH2 0x2D48 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x6C PUSH2 0x67 CALLDATASIZE PUSH1 0x4 PUSH2 0x2A32 JUMP JUMPDEST PUSH2 0x91 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x50 SWAP2 SWAP1 PUSH2 0x3391 JUMP JUMPDEST PUSH20 0xEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE DUP2 JUMP JUMPDEST DUP4 MLOAD PUSH1 0x0 SWAP1 PUSH1 0x3 EQ DUP1 PUSH2 0xA5 JUMPI POP DUP5 MLOAD PUSH1 0xF EQ JUMPDEST DUP1 PUSH2 0xB1 JUMPI POP DUP5 MLOAD PUSH1 0xD EQ JUMPDEST ISZERO PUSH2 0xCD JUMPI PUSH2 0xC6 DUP5 DUP5 DUP5 DUP9 PUSH1 0x60 ADD MLOAD PUSH2 0x2A4 JUMP JUMPDEST SWAP1 POP PUSH2 0x25C JUMP JUMPDEST DUP5 MLOAD PUSH1 0xE EQ ISZERO PUSH2 0xE6 JUMPI PUSH2 0xC6 DUP4 DUP4 DUP8 PUSH1 0x60 ADD MLOAD PUSH2 0x552 JUMP JUMPDEST DUP5 MLOAD PUSH1 0x11 EQ DUP1 PUSH2 0xF7 JUMPI POP DUP5 MLOAD PUSH1 0x13 EQ JUMPDEST ISZERO PUSH2 0x10B JUMPI PUSH2 0xC6 DUP4 DUP4 DUP8 PUSH1 0x60 ADD MLOAD PUSH2 0x76F JUMP JUMPDEST DUP5 MLOAD PUSH1 0x10 EQ ISZERO PUSH2 0x125 JUMPI PUSH2 0xC6 DUP5 DUP5 DUP5 DUP9 PUSH1 0x60 ADD MLOAD PUSH2 0x8B8 JUMP JUMPDEST DUP5 MLOAD ISZERO DUP1 PUSH2 0x134 JUMPI POP DUP5 MLOAD PUSH1 0x4 EQ JUMPDEST ISZERO PUSH2 0x149 JUMPI PUSH2 0xC6 DUP5 DUP5 DUP5 DUP9 PUSH1 0x60 ADD MLOAD PUSH2 0xD0B JUMP JUMPDEST DUP5 MLOAD PUSH1 0x7 EQ ISZERO PUSH2 0x163 JUMPI PUSH2 0xC6 DUP5 DUP5 DUP5 DUP9 PUSH1 0x60 ADD MLOAD PUSH2 0xE1C JUMP JUMPDEST DUP5 MLOAD PUSH1 0x9 EQ ISZERO PUSH2 0x17D JUMPI PUSH2 0xC6 DUP5 DUP5 DUP5 DUP9 PUSH1 0x60 ADD MLOAD PUSH2 0x11EF JUMP JUMPDEST DUP5 MLOAD PUSH1 0xA EQ ISZERO PUSH2 0x197 JUMPI PUSH2 0xC6 DUP5 DUP5 DUP5 DUP9 PUSH1 0x60 ADD MLOAD PUSH2 0x1558 JUMP JUMPDEST DUP5 MLOAD PUSH1 0xB EQ ISZERO PUSH2 0x1B1 JUMPI PUSH2 0xC6 DUP5 DUP5 DUP5 DUP9 PUSH1 0x60 ADD MLOAD PUSH2 0x1646 JUMP JUMPDEST DUP5 MLOAD PUSH1 0xC EQ ISZERO PUSH2 0x1CB JUMPI PUSH2 0xC6 DUP5 DUP5 DUP5 DUP9 PUSH1 0x60 ADD MLOAD PUSH2 0x16D9 JUMP JUMPDEST DUP5 MLOAD PUSH1 0x6 EQ ISZERO PUSH2 0x1E4 JUMPI PUSH2 0xC6 DUP5 DUP4 DUP8 PUSH1 0x60 ADD MLOAD PUSH2 0x1770 JUMP JUMPDEST DUP5 MLOAD PUSH1 0x12 EQ ISZERO PUSH2 0x1FD JUMPI PUSH2 0xC6 DUP5 DUP4 DUP8 PUSH1 0x60 ADD MLOAD PUSH2 0x19DD JUMP JUMPDEST DUP5 MLOAD PUSH1 0x5 EQ ISZERO PUSH2 0x216 JUMPI PUSH2 0xC6 DUP4 DUP4 DUP8 PUSH1 0x60 ADD MLOAD PUSH2 0x1B1C JUMP JUMPDEST DUP5 MLOAD PUSH1 0x1 EQ ISZERO PUSH2 0x22F JUMPI PUSH2 0xC6 DUP4 DUP4 DUP8 PUSH1 0x60 ADD MLOAD PUSH2 0x1BF5 JUMP JUMPDEST DUP5 MLOAD PUSH1 0x2 EQ ISZERO PUSH2 0x249 JUMPI PUSH2 0xC6 DUP5 DUP5 DUP5 DUP9 PUSH1 0x60 ADD MLOAD PUSH2 0x204C JUMP JUMPDEST PUSH2 0x259 DUP5 DUP5 DUP5 DUP9 PUSH1 0x60 ADD MLOAD PUSH2 0x212B JUMP JUMPDEST SWAP1 POP JUMPDEST DUP5 MLOAD PUSH1 0x40 MLOAD PUSH32 0xFF3BC5E46464411F331D1B093E1587D2D1AA667F5618F98A95AFC4132709D3A9 SWAP2 PUSH2 0x294 SWAP2 DUP8 SWAP1 DUP8 SWAP1 DUP8 SWAP1 DUP8 SWAP1 PUSH2 0x339A JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2AE PUSH2 0x275D JUMP JUMPDEST DUP3 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x2C2 SWAP2 SWAP1 PUSH2 0x2B23 JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP2 POP PUSH2 0x2E9 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND SWAP1 DUP7 PUSH2 0x21C5 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x0 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND SWAP1 PUSH4 0x70A08231 SWAP1 PUSH2 0x33E SWAP1 ADDRESS SWAP1 PUSH1 0x4 ADD PUSH2 0x2D48 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x356 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x36A JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x38E SWAP2 SWAP1 PUSH2 0x2BAF JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH1 0x60 DUP4 PUSH1 0x0 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 PUSH1 0x20 ADD MLOAD DUP6 PUSH1 0x40 ADD MLOAD DUP7 PUSH1 0x60 ADD MLOAD DUP11 PUSH1 0x1 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x3D4 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x3021 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 MSTORE SWAP1 MLOAD PUSH2 0x45D SWAP2 SWAP1 PUSH2 0x2D2C JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x49A JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x49F JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 PUSH2 0x4B2 JUMPI PUSH2 0x4B2 DUP2 PUSH2 0x22A1 JUMP JUMPDEST PUSH2 0x545 DUP4 DUP10 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x70A08231 ADDRESS PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x4EF SWAP2 SWAP1 PUSH2 0x2D48 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x507 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x51B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x53F SWAP2 SWAP1 PUSH2 0x2BAF JUMP JUMPDEST SWAP1 PUSH2 0x22A9 JUMP JUMPDEST SWAP10 SWAP9 POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 PUSH1 0x0 PUSH1 0x60 DUP5 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x56E SWAP2 SWAP1 PUSH2 0x2A20 JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP5 POP SWAP1 SWAP3 POP PUSH1 0x2 GT ISZERO SWAP1 POP PUSH2 0x5BB JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x5B2 SWAP1 PUSH2 0x3163 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP3 PUSH1 0x1 DUP5 MLOAD SUB DUP2 MLOAD DUP2 LT PUSH2 0x5E2 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x637 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x5B2 SWAP1 PUSH2 0x321D JUMP JUMPDEST PUSH2 0x676 DUP2 DUP7 DUP5 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x649 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x21C5 SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x38ED173900000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x60 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP1 PUSH4 0x38ED1739 SWAP1 PUSH2 0x6D4 SWAP1 DUP10 SWAP1 PUSH1 0x1 SWAP1 DUP9 SWAP1 ADDRESS SWAP1 TIMESTAMP SWAP1 PUSH1 0x4 ADD PUSH2 0x33D6 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x6EE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x702 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY PUSH1 0x1F RETURNDATASIZE SWAP1 DUP2 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND DUP3 ADD PUSH1 0x40 MSTORE PUSH2 0x748 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x2853 JUMP JUMPDEST SWAP1 POP DUP1 PUSH1 0x1 DUP3 MLOAD SUB DUP2 MLOAD DUP2 LT PUSH2 0x75A JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD SWAP4 POP POP POP POP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x60 DUP1 DUP5 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x789 SWAP2 SWAP1 PUSH2 0x2A20 JUMP JUMPDEST DUP1 MLOAD SWAP2 SWAP5 POP SWAP3 POP PUSH1 0x2 GT ISZERO SWAP1 POP PUSH2 0x7CC JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x5B2 SWAP1 PUSH2 0x3334 JUMP JUMPDEST DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 PUSH1 0x1 DUP4 MLOAD SUB DUP2 MLOAD DUP2 LT PUSH2 0x7F3 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x848 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x5B2 SWAP1 PUSH2 0x327A JUMP JUMPDEST PUSH2 0x85A DUP3 DUP7 DUP4 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x649 JUMPI INVALID JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x38ED173900000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x60 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 PUSH4 0x38ED1739 SWAP1 PUSH2 0x6D4 SWAP1 DUP10 SWAP1 PUSH1 0x1 SWAP1 DUP8 SWAP1 ADDRESS SWAP1 TIMESTAMP SWAP1 PUSH1 0x4 ADD PUSH2 0x33D6 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x8CF SWAP2 SWAP1 PUSH2 0x28E3 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x8DE DUP3 DUP9 DUP9 PUSH2 0x22D2 JUMP JUMPDEST SWAP1 POP PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0xA8A JUMPI PUSH1 0x40 MLOAD PUSH32 0x2E1A7D4D00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 PUSH4 0x2E1A7D4D SWAP1 PUSH2 0x9A6 SWAP1 DUP9 SWAP1 PUSH1 0x4 ADD PUSH2 0x3391 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x9C0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x9D4 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH32 0xAD65D76D00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP3 POP PUSH4 0xAD65D76D SWAP2 POP DUP8 SWAP1 PUSH2 0xA31 SWAP1 PUSH1 0x1 SWAP1 TIMESTAMP SWAP1 ADDRESS SWAP1 PUSH1 0x4 ADD PUSH2 0x3046 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xA4A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xA5E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0xA83 SWAP2 SWAP1 PUSH2 0x2BAF JUMP JUMPDEST SWAP3 POP PUSH2 0xD01 JUMP JUMPDEST PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0xC30 JUMPI PUSH2 0xAFF PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND DUP3 DUP8 PUSH2 0x21C5 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x95E3C50B00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP1 PUSH4 0x95E3C50B SWAP1 PUSH2 0xB56 SWAP1 DUP9 SWAP1 PUSH1 0x1 SWAP1 TIMESTAMP SWAP1 PUSH1 0x4 ADD PUSH2 0x3480 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xB70 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xB84 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0xBA8 SWAP2 SWAP1 PUSH2 0x2BAF JUMP JUMPDEST SWAP3 POP PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xD0E30DB0 DUP5 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xC12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xC26 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP PUSH2 0xD01 JUMP JUMPDEST PUSH2 0xC51 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND DUP3 DUP8 PUSH2 0x21C5 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xDDF7E1A700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP1 PUSH4 0xDDF7E1A7 SWAP1 PUSH2 0xCAC SWAP1 DUP9 SWAP1 PUSH1 0x1 SWAP1 DUP2 SWAP1 TIMESTAMP SWAP1 DUP14 SWAP1 PUSH1 0x4 ADD PUSH2 0x3447 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xCC6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xCDA JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0xCFE SWAP2 SWAP1 PUSH2 0x2BAF JUMP JUMPDEST SWAP3 POP JUMPDEST POP POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0xD22 SWAP2 SWAP1 PUSH2 0x28E3 JUMP JUMPDEST SWAP1 POP PUSH2 0xD45 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND DUP3 DUP7 PUSH2 0x21C5 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x8201AA3F00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP1 PUSH4 0x8201AA3F SWAP1 PUSH2 0xDC0 SWAP1 DUP10 SWAP1 DUP9 SWAP1 DUP11 SWAP1 PUSH1 0x1 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH1 0x4 ADD PUSH2 0x2FB0 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xDD9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xDED JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0xE11 SWAP2 SWAP1 PUSH2 0x2BEB JUMP JUMPDEST POP SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x60 DUP4 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0xE35 SWAP2 SWAP1 PUSH2 0x29DB JUMP JUMPDEST SWAP2 POP SWAP2 POP PUSH1 0x0 PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP9 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xEB4 JUMPI PUSH2 0xEAF PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 AND DUP5 DUP9 PUSH2 0x21C5 JUMP JUMPDEST PUSH2 0xF5C JUMP JUMPDEST POP PUSH1 0x40 MLOAD PUSH32 0x2E1A7D4D00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE DUP6 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 PUSH4 0x2E1A7D4D SWAP1 PUSH2 0xF29 SWAP1 DUP5 SWAP1 PUSH1 0x4 ADD PUSH2 0x3391 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xF43 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xF57 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x29589F61 DUP3 PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP12 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xFD2 JUMPI DUP11 PUSH2 0xFF4 JUMP JUMPDEST PUSH32 0x0 JUMPDEST DUP10 PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP13 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x104E JUMPI DUP12 PUSH2 0x1070 JUMP JUMPDEST PUSH32 0x0 JUMPDEST ADDRESS PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x1 PUSH1 0x0 DUP12 PUSH1 0x40 MLOAD DUP11 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x10BA SWAP9 SWAP8 SWAP7 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x2F0E JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x10D3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x10E7 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x110C SWAP2 SWAP1 PUSH2 0x2BAF JUMP JUMPDEST SWAP4 POP PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x11E4 JUMPI PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xD0E30DB0 DUP6 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x11CA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x11DE JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP JUMPDEST POP POP POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x1206 SWAP2 SWAP1 PUSH2 0x28E3 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x130A JUMPI PUSH1 0x40 MLOAD PUSH32 0x2E1A7D4D00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 PUSH4 0x2E1A7D4D SWAP1 PUSH2 0x12D0 SWAP1 DUP9 SWAP1 PUSH1 0x4 ADD PUSH2 0x3391 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x12EA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x12FE JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP DUP5 SWAP1 POP PUSH2 0x132B JUMP JUMPDEST PUSH2 0x132B PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND DUP4 DUP8 PUSH2 0x21C5 JUMP JUMPDEST DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xD5BCB9B5 DUP3 PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP11 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x13A1 JUMPI DUP10 PUSH2 0x13A4 JUMP JUMPDEST PUSH1 0x0 JUMPDEST PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP11 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x13FD JUMPI DUP10 PUSH2 0x1400 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP10 PUSH1 0x1 PUSH1 0x0 PUSH1 0x40 MLOAD DUP8 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1425 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x2E93 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x143E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1452 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x1477 SWAP2 SWAP1 PUSH2 0x2BAF JUMP JUMPDEST SWAP3 POP PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0xD01 JUMPI PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xD0E30DB0 DUP5 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1535 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1549 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x156F SWAP2 SWAP1 PUSH2 0x28E3 JUMP JUMPDEST SWAP1 POP PUSH2 0x1592 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND DUP3 DUP7 PUSH2 0x21C5 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x6E81221C00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP1 PUSH4 0x6E81221C SWAP1 PUSH2 0x15EA SWAP1 DUP10 SWAP1 DUP10 SWAP1 DUP10 SWAP1 ADDRESS SWAP1 PUSH1 0x4 ADD PUSH2 0x2E5B JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1604 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1618 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x163C SWAP2 SWAP1 PUSH2 0x2BAF JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x165D SWAP2 SWAP1 PUSH2 0x28E3 JUMP JUMPDEST SWAP1 POP PUSH2 0x1680 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND DUP3 DUP7 PUSH2 0x21C5 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x621B4F600000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP1 PUSH4 0x621B4F6 SWAP1 PUSH2 0x15EA SWAP1 DUP10 SWAP1 DUP9 SWAP1 DUP11 SWAP1 PUSH1 0x1 SWAP1 PUSH1 0x4 ADD PUSH2 0x2F79 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x16F0 SWAP2 SWAP1 PUSH2 0x28E3 JUMP JUMPDEST SWAP1 POP PUSH2 0x1713 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND DUP3 DUP7 PUSH2 0x21C5 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xB2583C800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP1 PUSH4 0xB2583C8 SWAP1 PUSH2 0x15EA SWAP1 DUP10 SWAP1 DUP10 SWAP1 DUP10 SWAP1 PUSH1 0x1 SWAP1 TIMESTAMP DUP3 ADD SWAP1 PUSH1 0x4 ADD PUSH2 0x2ED0 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 DUP5 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x178A SWAP2 SWAP1 PUSH2 0x294E JUMP JUMPDEST SWAP2 SWAP5 POP SWAP3 POP SWAP1 POP PUSH2 0x17B2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND DUP4 DUP9 PUSH2 0x21C5 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x1875 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP2 DUP3 SWAP1 MSTORE PUSH32 0x8DAE733300000000000000000000000000000000000000000000000000000000 SWAP1 SWAP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP1 PUSH4 0x8DAE7333 SWAP1 PUSH2 0x181C SWAP1 DUP10 SWAP1 PUSH1 0x1 SWAP1 PUSH1 0x24 DUP2 ADD PUSH2 0x341F JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1836 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x184A JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x186E SWAP2 SWAP1 PUSH2 0x2BAF JUMP JUMPDEST SWAP4 POP PUSH2 0x19D3 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xCA19EBD900000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 PUSH4 0xCA19EBD9 SWAP1 PUSH2 0x18C9 SWAP1 DUP6 SWAP1 DUP11 SWAP1 PUSH1 0x4 ADD PUSH2 0x2D90 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x18E1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x18F5 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x1919 SWAP2 SWAP1 PUSH2 0x2BAF JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP2 DUP3 SWAP1 MSTORE PUSH32 0xE67CE70600000000000000000000000000000000000000000000000000000000 SWAP1 SWAP2 MSTORE SWAP1 SWAP5 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP1 PUSH4 0xE67CE706 SWAP1 PUSH2 0x197F SWAP1 DUP8 SWAP1 DUP11 SWAP1 PUSH1 0x24 DUP2 ADD PUSH2 0x341F JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1999 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x19AD JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x19D1 SWAP2 SWAP1 PUSH2 0x2BAF JUMP JUMPDEST POP JUMPDEST POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP4 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x19F6 SWAP2 SWAP1 PUSH2 0x299E JUMP JUMPDEST SWAP1 SWAP3 POP SWAP1 POP PUSH2 0x1A1C PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND DUP4 DUP8 PUSH2 0x24BF JUMP JUMPDEST DUP1 PUSH2 0x1ACA JUMPI PUSH1 0x40 MLOAD PUSH32 0xDD93F59A00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP1 PUSH4 0xDD93F59A SWAP1 PUSH2 0x1A73 SWAP1 ADDRESS SWAP1 PUSH1 0x4 ADD PUSH2 0x2D48 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1A8D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1AA1 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x1AC5 SWAP2 SWAP1 PUSH2 0x2BAF JUMP JUMPDEST PUSH2 0x163C JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xBD6015B400000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP1 PUSH4 0xBD6015B4 SWAP1 PUSH2 0x15EA SWAP1 ADDRESS SWAP1 PUSH1 0x4 ADD PUSH2 0x2D48 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x60 DUP1 DUP5 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x1B36 SWAP2 SWAP1 PUSH2 0x2A20 JUMP JUMPDEST DUP1 MLOAD SWAP2 SWAP5 POP SWAP3 POP PUSH1 0x2 GT ISZERO SWAP1 POP PUSH2 0x1B79 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x5B2 SWAP1 PUSH2 0x3106 JUMP JUMPDEST DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 PUSH1 0x1 DUP4 MLOAD SUB DUP2 MLOAD DUP2 LT PUSH2 0x1BA0 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x848 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x5B2 SWAP1 PUSH2 0x32D7 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x60 DUP1 DUP5 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x1C0F SWAP2 SWAP1 PUSH2 0x28FF JUMP JUMPDEST DUP1 MLOAD SWAP2 SWAP5 POP SWAP3 POP PUSH1 0x2 GT ISZERO SWAP1 POP PUSH2 0x1C52 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x5B2 SWAP1 PUSH2 0x30A9 JUMP JUMPDEST DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 PUSH1 0x1 DUP4 MLOAD SUB DUP2 MLOAD DUP2 LT PUSH2 0x1C79 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ DUP1 PUSH2 0x1D4F JUMPI POP PUSH20 0xEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 PUSH1 0x1 DUP4 MLOAD SUB DUP2 MLOAD DUP2 LT PUSH2 0x1CD9 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ DUP1 ISZERO PUSH2 0x1D4F JUMPI POP PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ JUMPDEST PUSH2 0x1D85 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x5B2 SWAP1 PUSH2 0x31C0 JUMP JUMPDEST PUSH1 0x0 PUSH20 0xEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP3 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x1DBF JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x1E8F JUMPI PUSH1 0x40 MLOAD PUSH32 0x2E1A7D4D00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 PUSH4 0x2E1A7D4D SWAP1 PUSH2 0x1E55 SWAP1 DUP10 SWAP1 PUSH1 0x4 ADD PUSH2 0x3391 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1E6F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1E83 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP DUP6 SWAP1 POP PUSH2 0x1EAE JUMP JUMPDEST PUSH2 0x1EAE DUP3 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x1E9F JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD DUP5 DUP9 PUSH2 0x21C5 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xB77D239B00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 PUSH4 0xB77D239B SWAP1 DUP4 SWAP1 PUSH2 0x1F0E SWAP1 DUP7 SWAP1 DUP12 SWAP1 PUSH1 0x1 SWAP1 ADDRESS SWAP1 PUSH1 0x0 SWAP1 DUP2 SWAP1 PUSH1 0x4 ADD PUSH2 0x2DB6 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1F27 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1F3B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x1F60 SWAP2 SWAP1 PUSH2 0x2BAF JUMP JUMPDEST SWAP4 POP PUSH20 0xEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP3 PUSH1 0x1 DUP5 MLOAD SUB DUP2 MLOAD DUP2 LT PUSH2 0x1F9D JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x19D3 JUMPI PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xD0E30DB0 DUP6 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2029 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x203D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP4 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x2065 SWAP2 SWAP1 PUSH2 0x2BC7 JUMP JUMPDEST SWAP2 POP SWAP2 POP PUSH2 0x2074 DUP8 DUP3 DUP8 PUSH2 0x24BF JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x9F44296A00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP1 PUSH4 0x9F44296A SWAP1 DUP5 SWAP1 PUSH2 0x20CA SWAP1 DUP11 SWAP1 ADDRESS SWAP1 PUSH1 0x4 ADD PUSH2 0x2D69 JUMP JUMPDEST PUSH1 0xE0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x20E3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x20F7 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x211C SWAP2 SWAP1 PUSH2 0x2C0E JUMP JUMPDEST POP SWAP1 SWAP10 SWAP9 POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x60 DUP4 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x2144 SWAP2 SWAP1 PUSH2 0x29DB JUMP JUMPDEST SWAP1 SWAP3 POP SWAP1 POP PUSH2 0x216A PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND DUP4 DUP8 PUSH2 0x24BF JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x65D02B0400000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP1 PUSH4 0x65D02B04 SWAP1 PUSH2 0xCAC SWAP1 DUP11 SWAP1 DUP11 SWAP1 ADDRESS SWAP1 PUSH1 0x1 SWAP1 DUP9 SWAP1 PUSH1 0x4 ADD PUSH2 0x2E09 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xDD62ED3E00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE DUP2 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND SWAP1 PUSH4 0xDD62ED3E SWAP1 PUSH2 0x221B SWAP1 ADDRESS SWAP1 DUP8 SWAP1 PUSH1 0x4 ADD PUSH2 0x2D69 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2233 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2247 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x226B SWAP2 SWAP1 PUSH2 0x2BAF JUMP JUMPDEST LT ISZERO PUSH2 0x229C JUMPI PUSH2 0x229C DUP4 DUP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x256B JUMP JUMPDEST POP POP POP JUMP JUMPDEST DUP1 MLOAD PUSH1 0x20 DUP3 ADD REVERT JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x22C7 JUMPI PUSH2 0x22C7 PUSH2 0x22C2 PUSH1 0x2 DUP6 DUP6 PUSH2 0x2588 JUMP JUMPDEST PUSH2 0x22A1 JUMP JUMPDEST POP DUP1 DUP3 SUB JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x23CE JUMPI PUSH1 0x40 MLOAD PUSH32 0x6F2BF6200000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND SWAP1 PUSH4 0x6F2BF62 SWAP1 PUSH2 0x2379 SWAP1 DUP7 SWAP1 PUSH1 0x4 ADD PUSH2 0x2D48 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2391 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x23A5 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x23C9 SWAP2 SWAP1 PUSH2 0x28E3 JUMP JUMPDEST PUSH2 0x2470 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x6F2BF6200000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND SWAP1 PUSH4 0x6F2BF62 SWAP1 PUSH2 0x2420 SWAP1 DUP6 SWAP1 PUSH1 0x4 ADD PUSH2 0x2D48 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2438 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x244C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x2470 SWAP2 SWAP1 PUSH2 0x28E3 JUMP JUMPDEST SWAP1 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x768 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x5B2 SWAP1 PUSH2 0x3072 JUMP JUMPDEST PUSH1 0x60 PUSH4 0xA9059CBB PUSH1 0xE0 SHL DUP4 DUP4 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x24DC SWAP3 SWAP2 SWAP1 PUSH2 0x2D90 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE SWAP1 POP PUSH2 0x2565 DUP5 DUP3 PUSH2 0x262D JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH4 0x95EA7B3 PUSH1 0xE0 SHL DUP4 DUP4 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x24DC SWAP3 SWAP2 SWAP1 PUSH2 0x2D90 JUMP JUMPDEST PUSH1 0x60 PUSH4 0xE946C1BB PUSH1 0xE0 SHL DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x25A7 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x2FF1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE SWAP1 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH1 0x40 MLOAD PUSH2 0x2656 SWAP2 SWAP1 PUSH2 0x2D2C JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x2693 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x2698 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 DUP1 ISZERO PUSH2 0x26AE JUMPI POP PUSH2 0x26AE DUP2 PUSH2 0x26C7 JUMP JUMPDEST ISZERO PUSH2 0x26BA JUMPI POP POP PUSH2 0x26C3 JUMP JUMPDEST PUSH2 0x2565 DUP2 PUSH2 0x22A1 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD PUSH1 0x0 EQ ISZERO PUSH2 0x26DB JUMPI POP PUSH1 0x1 PUSH2 0x2708 JUMP JUMPDEST PUSH1 0x20 DUP3 MLOAD LT PUSH2 0x2708 JUMPI PUSH1 0x0 PUSH2 0x26F1 DUP4 PUSH1 0x0 PUSH2 0x270D JUMP JUMPDEST SWAP1 POP DUP1 PUSH1 0x1 EQ ISZERO PUSH2 0x2706 JUMPI PUSH1 0x1 SWAP2 POP POP PUSH2 0x2708 JUMP JUMPDEST POP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x768 DUP4 DUP4 PUSH1 0x0 DUP2 PUSH1 0x20 ADD DUP4 MLOAD LT ISZERO PUSH2 0x2735 JUMPI PUSH2 0x2735 PUSH2 0x22C2 PUSH1 0x5 DUP6 MLOAD DUP6 PUSH1 0x20 ADD PUSH2 0x273E JUMP JUMPDEST POP ADD PUSH1 0x20 ADD MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x60 PUSH4 0x28006595 PUSH1 0xE0 SHL DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x25A7 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x3013 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x80 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x60 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x2794 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x27A7 PUSH2 0x27A2 DUP3 PUSH2 0x34BD JUMP JUMPDEST PUSH2 0x3496 JUMP JUMPDEST DUP2 DUP2 MSTORE SWAP2 POP PUSH1 0x20 DUP1 DUP4 ADD SWAP1 DUP5 DUP2 ADD DUP2 DUP5 MUL DUP7 ADD DUP3 ADD DUP8 LT ISZERO PUSH2 0x27C8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x27F0 JUMPI DUP2 MLOAD PUSH2 0x27DE DUP2 PUSH2 0x3557 JUMP JUMPDEST DUP5 MSTORE SWAP3 DUP3 ADD SWAP3 SWAP1 DUP3 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x27CB JUMP JUMPDEST POP POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x280B JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x2819 PUSH2 0x27A2 DUP3 PUSH2 0x34DD JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x2830 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2841 DUP2 PUSH1 0x20 DUP5 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x352B JUMP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP1 CALLDATALOAD PUSH2 0x22CC DUP2 PUSH2 0x3557 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP1 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x2865 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x287B JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 ADD PUSH1 0x1F DUP2 ADD DUP6 SGT PUSH2 0x288B JUMPI DUP3 DUP4 REVERT JUMPDEST DUP1 MLOAD PUSH2 0x2899 PUSH2 0x27A2 DUP3 PUSH2 0x34BD JUMP JUMPDEST DUP2 DUP2 MSTORE DUP4 DUP2 ADD SWAP1 DUP4 DUP6 ADD DUP6 DUP5 MUL DUP6 ADD DUP7 ADD DUP10 LT ISZERO PUSH2 0x28B5 JUMPI DUP7 DUP8 REVERT JUMPDEST DUP7 SWAP5 POP JUMPDEST DUP4 DUP6 LT ISZERO PUSH2 0x28D7 JUMPI DUP1 MLOAD DUP4 MSTORE PUSH1 0x1 SWAP5 SWAP1 SWAP5 ADD SWAP4 SWAP2 DUP6 ADD SWAP2 DUP6 ADD PUSH2 0x28B9 JUMP JUMPDEST POP SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x28F4 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x768 DUP2 PUSH2 0x3557 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x2911 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP3 MLOAD PUSH2 0x291C DUP2 PUSH2 0x3557 JUMP JUMPDEST PUSH1 0x20 DUP5 ADD MLOAD SWAP1 SWAP3 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2938 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x2944 DUP6 DUP3 DUP7 ADD PUSH2 0x2784 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x2962 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP4 MLOAD PUSH2 0x296D DUP2 PUSH2 0x3557 JUMP JUMPDEST PUSH1 0x20 DUP6 ADD MLOAD SWAP1 SWAP4 POP PUSH2 0x297E DUP2 PUSH2 0x3557 JUMP JUMPDEST PUSH1 0x40 DUP6 ADD MLOAD SWAP1 SWAP3 POP DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x2993 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x29B0 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 MLOAD PUSH2 0x29BB DUP2 PUSH2 0x3557 JUMP JUMPDEST PUSH1 0x20 DUP5 ADD MLOAD SWAP1 SWAP3 POP DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x29D0 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x29ED JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 MLOAD PUSH2 0x29F8 DUP2 PUSH2 0x3557 JUMP JUMPDEST PUSH1 0x20 DUP5 ADD MLOAD SWAP1 SWAP3 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2A14 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x2944 DUP6 DUP3 DUP7 ADD PUSH2 0x27FB JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x2911 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x2A47 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x2A5E JUMPI DUP4 DUP5 REVERT JUMPDEST SWAP1 DUP7 ADD SWAP1 PUSH1 0x80 DUP3 DUP10 SUB SLT ISZERO PUSH2 0x2A71 JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x2A7B PUSH1 0x80 PUSH2 0x3496 JUMP JUMPDEST DUP3 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 DUP1 DUP5 ADD CALLDATALOAD DUP2 DUP4 ADD MSTORE PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP5 ADD CALLDATALOAD DUP4 DUP2 GT ISZERO PUSH2 0x2AA4 JUMPI DUP7 DUP8 REVERT JUMPDEST DUP1 DUP6 ADD SWAP5 POP POP DUP10 PUSH1 0x1F DUP6 ADD SLT PUSH2 0x2AB8 JUMPI DUP6 DUP7 REVERT JUMPDEST DUP4 CALLDATALOAD SWAP3 POP PUSH2 0x2AC8 PUSH2 0x27A2 DUP5 PUSH2 0x34DD JUMP JUMPDEST DUP4 DUP2 MSTORE DUP11 DUP3 DUP6 DUP8 ADD ADD GT ISZERO PUSH2 0x2ADB JUMPI DUP7 DUP8 REVERT JUMPDEST PUSH2 0x2AEA DUP5 DUP4 DUP4 ADD DUP5 DUP9 ADD PUSH2 0x351F JUMP JUMPDEST DUP1 PUSH1 0x60 DUP5 ADD MSTORE POP DUP2 SWAP8 POP PUSH2 0x2B00 DUP11 DUP3 DUP12 ADD PUSH2 0x2848 JUMP JUMPDEST SWAP7 POP POP POP POP POP PUSH2 0x2B13 DUP7 PUSH1 0x40 DUP8 ADD PUSH2 0x2848 JUMP JUMPDEST SWAP4 SWAP7 SWAP3 SWAP6 POP SWAP3 SWAP4 PUSH1 0x60 ADD CALLDATALOAD SWAP3 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2B34 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x2B3E PUSH1 0x80 PUSH2 0x3496 JUMP JUMPDEST DUP3 MLOAD PUSH2 0x2B49 DUP2 PUSH2 0x3557 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 DUP4 ADD MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 EQ PUSH2 0x2B7D JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 DUP4 ADD MLOAD PUSH2 0x2B90 DUP2 PUSH2 0x357C JUMP JUMPDEST PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 DUP4 ADD MLOAD PUSH2 0x2BA3 DUP2 PUSH2 0x357C JUMP JUMPDEST PUSH1 0x60 DUP3 ADD MSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2BC0 JUMPI DUP1 DUP2 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x2BD9 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 MLOAD SWAP2 POP PUSH1 0x20 DUP4 ADD MLOAD PUSH2 0x29D0 DUP2 PUSH2 0x3557 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x2BFD JUMPI DUP2 DUP3 REVERT JUMPDEST POP POP DUP1 MLOAD PUSH1 0x20 SWAP1 SWAP2 ADD MLOAD SWAP1 SWAP3 SWAP1 SWAP2 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xE0 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x2C23 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP5 MLOAD SWAP4 POP PUSH1 0x20 DUP1 DUP7 ADD MLOAD SWAP4 POP PUSH1 0x40 DUP7 ADD MLOAD SWAP3 POP DUP7 PUSH1 0x7F DUP8 ADD SLT PUSH2 0x2C44 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x2C4E PUSH1 0x80 PUSH2 0x3496 JUMP JUMPDEST DUP1 PUSH1 0x60 DUP9 ADD DUP10 PUSH1 0xE0 DUP11 ADD GT ISZERO PUSH2 0x2C62 JUMPI DUP5 DUP6 REVERT JUMPDEST DUP5 JUMPDEST PUSH1 0x4 DUP2 LT ISZERO PUSH2 0x2C81 JUMPI DUP2 MLOAD DUP5 MSTORE SWAP3 DUP5 ADD SWAP3 SWAP1 DUP5 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x2C64 JUMP JUMPDEST POP POP DUP1 SWAP4 POP POP POP POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH1 0x20 DUP1 DUP6 ADD SWAP5 POP DUP1 DUP5 ADD DUP4 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x2CD7 JUMPI DUP2 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP8 MSTORE SWAP6 DUP3 ADD SWAP6 SWAP1 DUP3 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x2CA5 JUMP JUMPDEST POP SWAP5 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH2 0x2CFA DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x352B JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD PUSH2 0x2D3E DUP2 DUP5 PUSH1 0x20 DUP8 ADD PUSH2 0x352B JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP4 AND DUP2 MSTORE SWAP2 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0xC0 DUP3 MSTORE PUSH2 0x2DC9 PUSH1 0xC0 DUP4 ADD DUP10 PUSH2 0x2C92 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD SWAP8 SWAP1 SWAP8 MSTORE POP PUSH1 0x40 DUP2 ADD SWAP5 SWAP1 SWAP5 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP4 AND PUSH1 0x60 DUP6 ADD MSTORE SWAP2 AND PUSH1 0x80 DUP4 ADD MSTORE PUSH1 0xA0 SWAP1 SWAP2 ADD MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP9 AND DUP4 MSTORE DUP1 DUP8 AND PUSH1 0x20 DUP5 ADD MSTORE DUP1 DUP7 AND PUSH1 0x40 DUP5 ADD MSTORE POP DUP4 PUSH1 0x60 DUP4 ADD MSTORE PUSH1 0xA0 PUSH1 0x80 DUP4 ADD MSTORE PUSH2 0x2E50 PUSH1 0xA0 DUP4 ADD DUP5 PUSH2 0x2CE2 JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 DUP6 AND DUP2 MSTORE SWAP3 DUP5 AND PUSH1 0x20 DUP5 ADD MSTORE PUSH1 0x40 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 SWAP2 AND PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP2 MSTORE SWAP4 DUP6 AND PUSH1 0x20 DUP6 ADD MSTORE PUSH1 0x40 DUP5 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x60 DUP4 ADD MSTORE SWAP1 SWAP2 AND PUSH1 0x80 DUP3 ADD MSTORE PUSH1 0xA0 ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP2 MSTORE SWAP4 SWAP1 SWAP5 AND PUSH1 0x20 DUP5 ADD MSTORE PUSH1 0x40 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xA0 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x100 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP13 AND DUP5 MSTORE DUP11 PUSH1 0x20 DUP6 ADD MSTORE DUP1 DUP11 AND PUSH1 0x40 DUP6 ADD MSTORE DUP1 DUP10 AND PUSH1 0x60 DUP6 ADD MSTORE DUP8 PUSH1 0x80 DUP6 ADD MSTORE DUP7 PUSH1 0xA0 DUP6 ADD MSTORE DUP1 DUP7 AND PUSH1 0xC0 DUP6 ADD MSTORE POP DUP1 PUSH1 0xE0 DUP5 ADD MSTORE PUSH2 0x2F6A DUP2 DUP5 ADD DUP6 PUSH2 0x2CE2 JUMP JUMPDEST SWAP12 SWAP11 POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 DUP6 AND DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP4 SWAP1 SWAP4 MSTORE SWAP3 AND PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP5 SWAP1 SWAP5 MSTORE SWAP2 SWAP1 SWAP4 AND PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x80 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xA0 ADD SWAP1 JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH1 0x4 DUP6 LT PUSH2 0x2FFF JUMPI INVALID JUMPDEST SWAP4 DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x40 SWAP1 SWAP2 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH1 0x8 DUP6 LT PUSH2 0x2FFF JUMPI INVALID JUMPDEST PUSH1 0xF SWAP5 DUP6 SIGNEXTEND DUP2 MSTORE SWAP3 SWAP1 SWAP4 SIGNEXTEND PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0xFF SWAP1 SWAP2 AND PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST SWAP3 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x18 SWAP1 DUP3 ADD MSTORE PUSH32 0x4D6978696E556E69737761702F4E4F5F45584348414E47450000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x2C SWAP1 DUP3 ADD MSTORE PUSH32 0x4D6978696E42616E636F722F504154485F4C454E4754485F4D5553545F42455F PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x41545F4C454153545F54574F0000000000000000000000000000000000000000 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x2F SWAP1 DUP3 ADD MSTORE PUSH32 0x4D6978696E43727970746F436F6D2F504154485F4C454E4754485F4D5553545F PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x42455F41545F4C454153545F54574F0000000000000000000000000000000000 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x2F SWAP1 DUP3 ADD MSTORE PUSH32 0x4D6978696E5375736869737761702F504154485F4C454E4754485F4D5553545F PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x42455F41545F4C454153545F54574F0000000000000000000000000000000000 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x38 SWAP1 DUP3 ADD MSTORE PUSH32 0x4D6978696E42616E636F722F4C4153545F454C454D454E545F4F465F50415448 PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x5F4D5553545F4D415443485F4F55545055545F544F4B454E0000000000000000 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x3B SWAP1 DUP3 ADD MSTORE PUSH32 0x4D6978696E5375736869737761702F4C4153545F454C454D454E545F4F465F50 PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x4154485F4D5553545F4D415443485F4F55545055545F544F4B454E0000000000 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x3B SWAP1 DUP3 ADD MSTORE PUSH32 0x4D6978696E556E697377617056322F4C4153545F454C454D454E545F4F465F50 PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x4154485F4D5553545F4D415443485F4F55545055545F544F4B454E0000000000 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x3B SWAP1 DUP3 ADD MSTORE PUSH32 0x4D6978696E43727970746F436F6D2F4C4153545F454C454D454E545F4F465F50 PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x4154485F4D5553545F4D415443485F4F55545055545F544F4B454E0000000000 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x2F SWAP1 DUP3 ADD MSTORE PUSH32 0x4D6978696E556E697377617056332F504154485F4C454E4754485F4D5553545F PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x42455F41545F4C454153545F54574F0000000000000000000000000000000000 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP5 DUP6 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP4 DUP5 AND PUSH1 0x20 DUP7 ADD MSTORE SWAP2 SWAP1 SWAP3 AND PUSH1 0x40 DUP5 ADD MSTORE PUSH1 0x60 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x80 DUP3 ADD MSTORE PUSH1 0xA0 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP7 DUP3 MSTORE DUP6 PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0xA0 PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x33F5 PUSH1 0xA0 DUP4 ADD DUP7 PUSH2 0x2C92 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND PUSH1 0x60 DUP4 ADD MSTORE POP PUSH1 0x80 ADD MSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP5 DUP3 MSTORE DUP4 PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x60 PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x343E PUSH1 0x60 DUP4 ADD DUP5 PUSH2 0x2CE2 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST SWAP5 DUP6 MSTORE PUSH1 0x20 DUP6 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x40 DUP5 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 DUP4 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x80 DUP3 ADD MSTORE PUSH1 0xA0 ADD SWAP1 JUMP JUMPDEST SWAP3 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x34B5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x34D3 JUMPI DUP1 DUP2 REVERT JUMPDEST POP PUSH1 0x20 SWAP1 DUP2 MUL ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x34F3 JUMPI DUP1 DUP2 REVERT JUMPDEST POP PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3546 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x352E JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x2565 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x3579 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST DUP1 PUSH1 0xF SIGNEXTEND DUP2 EQ PUSH2 0x3579 JUMPI PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH18 0xDC735350CFA03ACDCD4814215A1296A2A2B8 0xD 0x23 PUSH13 0x98208C6CB24D71B9A3B664736F PUSH13 0x634300060C0033000000000000 ",
|
|
"sourceMap": "1314:4867:0:-:0;;;2158:119:10;;;1652:437:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1528:11:4;;-1:-1:-1;;;;;;1528:11:4;;;;;2440::10;;;;1535::12;;;;3912::16;;1314:4867:0;;192:309:-1;;330:2;318:9;309:7;305:23;301:32;298:2;;;-1:-1;;336:12;298:2;106:13;;-1:-1;;;;;789:54;;937:58;;927:2;;-1:-1;;999:12;927:2;388:97;292:209;-1:-1;;;292:209::o;:::-;1314:4867:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"
|
|
},
|
|
"deployedBytecode": {
|
|
"immutableReferences": {
|
|
"621": [
|
|
{
|
|
"length": 32,
|
|
"start": 7425
|
|
},
|
|
{
|
|
"length": 32,
|
|
"start": 7712
|
|
},
|
|
{
|
|
"length": 32,
|
|
"start": 8131
|
|
}
|
|
],
|
|
"1357": [
|
|
{
|
|
"length": 32,
|
|
"start": 4052
|
|
},
|
|
{
|
|
"length": 32,
|
|
"start": 4176
|
|
}
|
|
],
|
|
"1360": [
|
|
{
|
|
"length": 32,
|
|
"start": 3645
|
|
},
|
|
{
|
|
"length": 32,
|
|
"start": 3828
|
|
},
|
|
{
|
|
"length": 32,
|
|
"start": 3963
|
|
},
|
|
{
|
|
"length": 32,
|
|
"start": 4087
|
|
},
|
|
{
|
|
"length": 32,
|
|
"start": 4368
|
|
},
|
|
{
|
|
"length": 32,
|
|
"start": 4452
|
|
}
|
|
],
|
|
"1588": [
|
|
{
|
|
"length": 32,
|
|
"start": 4620
|
|
},
|
|
{
|
|
"length": 32,
|
|
"start": 4763
|
|
},
|
|
{
|
|
"length": 32,
|
|
"start": 4938
|
|
},
|
|
{
|
|
"length": 32,
|
|
"start": 5030
|
|
},
|
|
{
|
|
"length": 32,
|
|
"start": 5243
|
|
},
|
|
{
|
|
"length": 32,
|
|
"start": 5327
|
|
}
|
|
],
|
|
"2028": [
|
|
{
|
|
"length": 32,
|
|
"start": 2274
|
|
},
|
|
{
|
|
"length": 32,
|
|
"start": 2417
|
|
},
|
|
{
|
|
"length": 32,
|
|
"start": 2700
|
|
},
|
|
{
|
|
"length": 32,
|
|
"start": 2988
|
|
},
|
|
{
|
|
"length": 32,
|
|
"start": 8918
|
|
}
|
|
]
|
|
},
|
|
"linkReferences": {},
|
|
"object": "0x608060405234801561001057600080fd5b50600436106100365760003560e01c80638dc669fa1461003b578063df2b273714610059575b600080fd5b610043610079565b6040516100509190612d48565b60405180910390f35b61006c610067366004612a32565b610091565b6040516100509190613391565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee81565b8351600090600314806100a557508451600f145b806100b157508451600d145b156100cd576100c684848488606001516102a4565b905061025c565b8451600e14156100e6576100c683838760600151610552565b8451601114806100f7575084516013145b1561010b576100c68383876060015161076f565b845160101415610125576100c684848488606001516108b8565b84511580610134575084516004145b15610149576100c68484848860600151610d0b565b845160071415610163576100c68484848860600151610e1c565b84516009141561017d576100c684848488606001516111ef565b8451600a1415610197576100c68484848860600151611558565b8451600b14156101b1576100c68484848860600151611646565b8451600c14156101cb576100c684848488606001516116d9565b8451600614156101e4576100c684838760600151611770565b8451601214156101fd576100c6848387606001516119dd565b845160051415610216576100c683838760600151611b1c565b84516001141561022f576100c683838760600151611bf5565b845160021415610249576100c6848484886060015161204c565b610259848484886060015161212b565b90505b84516040517fff3bc5e46464411f331d1b093e1587d2d1aa667f5618f98a95afc4132709d3a99161029491879087908790879061339a565b60405180910390a1949350505050565b60006102ae61275d565b828060200190518101906102c29190612b23565b80519091506102e99073ffffffffffffffffffffffffffffffffffffffff881690866121c5565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff8716906370a082319061033e903090600401612d48565b60206040518083038186803b15801561035657600080fd5b505afa15801561036a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061038e9190612baf565b905060006060836000015173ffffffffffffffffffffffffffffffffffffffff168460200151856040015186606001518a60016040516024016103d49493929190613021565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161045d9190612d2c565b6000604051808303816000865af19150503d806000811461049a576040519150601f19603f3d011682016040523d82523d6000602084013e61049f565b606091505b5091509150816104b2576104b2816122a1565b610545838973ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016104ef9190612d48565b60206040518083038186803b15801561050757600080fd5b505afa15801561051b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061053f9190612baf565b906122a9565b9998505050505050505050565b60006060600060608480602001905181019061056e9190612a20565b80519094509092506002111590506105bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105b290613163565b60405180910390fd5b8573ffffffffffffffffffffffffffffffffffffffff16826001845103815181106105e257fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614610637576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105b29061321d565b61067681868460008151811061064957fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff166121c59092919063ffffffff16565b6040517f38ed173900000000000000000000000000000000000000000000000000000000815260609073ffffffffffffffffffffffffffffffffffffffff8316906338ed1739906106d49089906001908890309042906004016133d6565b600060405180830381600087803b1580156106ee57600080fd5b505af1158015610702573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526107489190810190612853565b90508060018251038151811061075a57fe5b602002602001015193505050505b9392505050565b600080606080848060200190518101906107899190612a20565b805191945092506002111590506107cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105b290613334565b8573ffffffffffffffffffffffffffffffffffffffff16816001835103815181106107f357fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614610848576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105b29061327a565b61085a82868360008151811061064957fe5b6040517f38ed173900000000000000000000000000000000000000000000000000000000815260609073ffffffffffffffffffffffffffffffffffffffff8416906338ed1739906106d49089906001908790309042906004016133d6565b600080828060200190518101906108cf91906128e3565b905060006108de8288886122d2565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161415610a8a576040517f2e1a7d4d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690632e1a7d4d906109a6908890600401613391565b600060405180830381600087803b1580156109c057600080fd5b505af11580156109d4573d6000803e3d6000fd5b50506040517fad65d76d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416925063ad65d76d91508790610a319060019042903090600401613046565b6020604051808303818588803b158015610a4a57600080fd5b505af1158015610a5e573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610a839190612baf565b9250610d01565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415610c3057610aff73ffffffffffffffffffffffffffffffffffffffff881682876121c5565b6040517f95e3c50b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8216906395e3c50b90610b569088906001904290600401613480565b602060405180830381600087803b158015610b7057600080fd5b505af1158015610b84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ba89190612baf565b92507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0846040518263ffffffff1660e01b81526004016000604051808303818588803b158015610c1257600080fd5b505af1158015610c26573d6000803e3d6000fd5b5050505050610d01565b610c5173ffffffffffffffffffffffffffffffffffffffff881682876121c5565b6040517fddf7e1a700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82169063ddf7e1a790610cac908890600190819042908d90600401613447565b602060405180830381600087803b158015610cc657600080fd5b505af1158015610cda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cfe9190612baf565b92505b5050949350505050565b60008082806020019051810190610d2291906128e3565b9050610d4573ffffffffffffffffffffffffffffffffffffffff871682866121c5565b6040517f8201aa3f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821690638201aa3f90610dc090899088908a906001907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90600401612fb0565b6040805180830381600087803b158015610dd957600080fd5b505af1158015610ded573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e119190612beb565b509695505050505050565b600080606083806020019051810190610e3591906129db565b9150915060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1614610eb457610eaf73ffffffffffffffffffffffffffffffffffffffff891684886121c5565b610f5c565b506040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152859073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690632e1a7d4d90610f29908490600401613391565b600060405180830381600087803b158015610f4357600080fd5b505af1158015610f57573d6000803e3d6000fd5b505050505b8273ffffffffffffffffffffffffffffffffffffffff166329589f61827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff1614610fd2578a610ff4565b7f00000000000000000000000000000000000000000000000000000000000000005b897f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168c73ffffffffffffffffffffffffffffffffffffffff161461104e578b611070565b7f00000000000000000000000000000000000000000000000000000000000000005b307fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600160008b6040518a63ffffffff1660e01b81526004016110ba989796959493929190612f0e565b6020604051808303818588803b1580156110d357600080fd5b505af11580156110e7573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061110c9190612baf565b93507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614156111e4577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b1580156111ca57600080fd5b505af11580156111de573d6000803e3d6000fd5b50505050505b505050949350505050565b6000808280602001905181019061120691906128e3565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16141561130a576040517f2e1a7d4d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690632e1a7d4d906112d0908890600401613391565b600060405180830381600087803b1580156112ea57600080fd5b505af11580156112fe573d6000803e3d6000fd5b5050505084905061132b565b61132b73ffffffffffffffffffffffffffffffffffffffff881683876121c5565b8173ffffffffffffffffffffffffffffffffffffffff1663d5bcb9b5827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff16146113a157896113a4565b60005b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff16146113fd5789611400565b60005b89600160006040518763ffffffff1660e01b8152600401611425959493929190612e93565b6020604051808303818588803b15801561143e57600080fd5b505af1158015611452573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906114779190612baf565b92507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415610d01577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0846040518263ffffffff1660e01b81526004016000604051808303818588803b15801561153557600080fd5b505af1158015611549573d6000803e3d6000fd5b50505050505050949350505050565b6000808280602001905181019061156f91906128e3565b905061159273ffffffffffffffffffffffffffffffffffffffff871682866121c5565b6040517f6e81221c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821690636e81221c906115ea908990899089903090600401612e5b565b602060405180830381600087803b15801561160457600080fd5b505af1158015611618573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061163c9190612baf565b9695505050505050565b6000808280602001905181019061165d91906128e3565b905061168073ffffffffffffffffffffffffffffffffffffffff871682866121c5565b6040517f0621b4f600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821690630621b4f6906115ea90899088908a90600190600401612f79565b600080828060200190518101906116f091906128e3565b905061171373ffffffffffffffffffffffffffffffffffffffff871682866121c5565b6040517f0b2583c800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821690630b2583c8906115ea9089908990899060019042820190600401612ed0565b6000806000808480602001905181019061178a919061294e565b919450925090506117b273ffffffffffffffffffffffffffffffffffffffff881683886121c5565b801561187557604080516000815260208101918290527f8dae73330000000000000000000000000000000000000000000000000000000090915273ffffffffffffffffffffffffffffffffffffffff831690638dae73339061181c9089906001906024810161341f565b602060405180830381600087803b15801561183657600080fd5b505af115801561184a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061186e9190612baf565b93506119d3565b6040517fca19ebd900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84169063ca19ebd9906118c99085908a90600401612d90565b60206040518083038186803b1580156118e157600080fd5b505afa1580156118f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119199190612baf565b604080516000815260208101918290527fe67ce7060000000000000000000000000000000000000000000000000000000090915290945073ffffffffffffffffffffffffffffffffffffffff83169063e67ce7069061197f9087908a906024810161341f565b602060405180830381600087803b15801561199957600080fd5b505af11580156119ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119d19190612baf565b505b5050509392505050565b6000806000838060200190518101906119f6919061299e565b9092509050611a1c73ffffffffffffffffffffffffffffffffffffffff871683876124bf565b80611aca576040517fdd93f59a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83169063dd93f59a90611a73903090600401612d48565b602060405180830381600087803b158015611a8d57600080fd5b505af1158015611aa1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ac59190612baf565b61163c565b6040517fbd6015b400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83169063bd6015b4906115ea903090600401612d48565b60008060608084806020019051810190611b369190612a20565b80519194509250600211159050611b79576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105b290613106565b8573ffffffffffffffffffffffffffffffffffffffff1681600183510381518110611ba057fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614610848576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105b2906132d7565b60008060608084806020019051810190611c0f91906128ff565b80519194509250600211159050611c52576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105b2906130a9565b8573ffffffffffffffffffffffffffffffffffffffff1681600183510381518110611c7957fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff161480611d4f575073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff1681600183510381518110611cd957fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16148015611d4f57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16145b611d85576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105b2906131c0565b600073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff1682600081518110611dbf57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff161415611e8f576040517f2e1a7d4d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690632e1a7d4d90611e55908990600401613391565b600060405180830381600087803b158015611e6f57600080fd5b505af1158015611e83573d6000803e3d6000fd5b50505050859050611eae565b611eae82600081518110611e9f57fe5b602002602001015184886121c5565b6040517fb77d239b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84169063b77d239b908390611f0e9086908b9060019030906000908190600401612db6565b6020604051808303818588803b158015611f2757600080fd5b505af1158015611f3b573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611f609190612baf565b935073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff1682600184510381518110611f9d57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614156119d3577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b15801561202957600080fd5b505af115801561203d573d6000803e3d6000fd5b50505050505050509392505050565b6000806000838060200190518101906120659190612bc7565b915091506120748782876124bf565b6040517f9f44296a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821690639f44296a9084906120ca908a903090600401612d69565b60e0604051808303818588803b1580156120e357600080fd5b505af11580156120f7573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061211c9190612c0e565b50909998505050505050505050565b60008060608380602001905181019061214491906129db565b909250905061216a73ffffffffffffffffffffffffffffffffffffffff881683876124bf565b6040517f65d02b0400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8316906365d02b0490610cac908a908a9030906001908890600401612e09565b6040517fdd62ed3e000000000000000000000000000000000000000000000000000000008152819073ffffffffffffffffffffffffffffffffffffffff85169063dd62ed3e9061221b9030908790600401612d69565b60206040518083038186803b15801561223357600080fd5b505afa158015612247573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061226b9190612baf565b101561229c5761229c83837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61256b565b505050565b805160208201fd5b6000828211156122c7576122c76122c260028585612588565b6122a1565b508082035b92915050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146123ce576040517f06f2bf6200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8516906306f2bf6290612379908690600401612d48565b60206040518083038186803b15801561239157600080fd5b505afa1580156123a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123c991906128e3565b612470565b6040517f06f2bf6200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8516906306f2bf6290612420908590600401612d48565b60206040518083038186803b15801561243857600080fd5b505afa15801561244c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061247091906128e3565b905073ffffffffffffffffffffffffffffffffffffffff8116610768576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105b290613072565b606063a9059cbb60e01b83836040516024016124dc929190612d90565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050612565848261262d565b50505050565b606063095ea7b360e01b83836040516024016124dc929190612d90565b606063e946c1bb60e01b8484846040516024016125a793929190612ff1565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290509392505050565b600060608373ffffffffffffffffffffffffffffffffffffffff16836040516126569190612d2c565b6000604051808303816000865af19150503d8060008114612693576040519150601f19603f3d011682016040523d82523d6000602084013e612698565b606091505b50915091508180156126ae57506126ae816126c7565b156126ba5750506126c3565b612565816122a1565b5050565b60008151600014156126db57506001612708565b60208251106127085760006126f183600061270d565b90508060011415612706576001915050612708565b505b919050565b6000610768838360008160200183511015612735576127356122c2600585518560200161273e565b50016020015190565b6060632800659560e01b8484846040516024016125a793929190613013565b60408051608081018252600080825260208201819052918101829052606081019190915290565b600082601f830112612794578081fd5b81516127a76127a2826134bd565b613496565b8181529150602080830190848101818402860182018710156127c857600080fd5b60005b848110156127f05781516127de81613557565b845292820192908201906001016127cb565b505050505092915050565b600082601f83011261280b578081fd5b81516128196127a2826134dd565b915080825283602082850101111561283057600080fd5b61284181602084016020860161352b565b5092915050565b80356122cc81613557565b60006020808385031215612865578182fd5b825167ffffffffffffffff81111561287b578283fd5b8301601f8101851361288b578283fd5b80516128996127a2826134bd565b81815283810190838501858402850186018910156128b5578687fd5b8694505b838510156128d75780518352600194909401939185019185016128b9565b50979650505050505050565b6000602082840312156128f4578081fd5b815161076881613557565b60008060408385031215612911578081fd5b825161291c81613557565b602084015190925067ffffffffffffffff811115612938578182fd5b61294485828601612784565b9150509250929050565b600080600060608486031215612962578081fd5b835161296d81613557565b602085015190935061297e81613557565b60408501519092508015158114612993578182fd5b809150509250925092565b600080604083850312156129b0578182fd5b82516129bb81613557565b602084015190925080151581146129d0578182fd5b809150509250929050565b600080604083850312156129ed578182fd5b82516129f881613557565b602084015190925067ffffffffffffffff811115612a14578182fd5b612944858286016127fb565b60008060408385031215612911578182fd5b60008060008060808587031215612a47578182fd5b843567ffffffffffffffff80821115612a5e578384fd5b9086019060808289031215612a71578384fd5b612a7b6080613496565b823581526020808401358183015260408401356040830152606084013583811115612aa4578687fd5b80850194505089601f850112612ab8578586fd5b83359250612ac86127a2846134dd565b8381528a82858701011115612adb578687fd5b612aea8483830184880161351f565b80606084015250819750612b008a828b01612848565b965050505050612b138660408701612848565b9396929550929360600135925050565b600060808284031215612b34578081fd5b612b3e6080613496565b8251612b4981613557565b815260208301517fffffffff0000000000000000000000000000000000000000000000000000000081168114612b7d578283fd5b60208201526040830151612b908161357c565b60408201526060830151612ba38161357c565b60608201529392505050565b600060208284031215612bc0578081fd5b5051919050565b60008060408385031215612bd9578182fd5b8251915060208301516129d081613557565b60008060408385031215612bfd578182fd5b505080516020909101519092909150565b60008060008060e08587031215612c23578182fd5b8451935060208086015193506040860151925086607f870112612c44578182fd5b612c4e6080613496565b80606088018960e08a011115612c62578485fd5b845b6004811015612c8157815184529284019290840190600101612c64565b505080935050505092959194509250565b6000815180845260208085019450808401835b83811015612cd757815173ffffffffffffffffffffffffffffffffffffffff1687529582019590820190600101612ca5565b509495945050505050565b60008151808452612cfa81602086016020860161352b565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60008251612d3e81846020870161352b565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b600060c08252612dc960c0830189612c92565b602083019790975250604081019490945273ffffffffffffffffffffffffffffffffffffffff92831660608501529116608083015260a090910152919050565b600073ffffffffffffffffffffffffffffffffffffffff8088168352808716602084015280861660408401525083606083015260a06080830152612e5060a0830184612ce2565b979650505050505050565b73ffffffffffffffffffffffffffffffffffffffff948516815292841660208401526040830191909152909116606082015260800190565b73ffffffffffffffffffffffffffffffffffffffff9586168152938516602085015260408401929092526060830152909116608082015260a00190565b73ffffffffffffffffffffffffffffffffffffffff958616815293909416602084015260408301919091526060820152608081019190915260a00190565b600061010073ffffffffffffffffffffffffffffffffffffffff808c1684528a6020850152808a16604085015280891660608501528760808501528660a085015280861660c0850152508060e0840152612f6a81840185612ce2565b9b9a5050505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff9485168152602081019390935292166040820152606081019190915260800190565b73ffffffffffffffffffffffffffffffffffffffff958616815260208101949094529190931660408301526060820192909252608081019190915260a00190565b6060810160048510612fff57fe5b938152602081019290925260409091015290565b6060810160088510612fff57fe5b600f94850b81529290930b6020830152604082015260ff909116606082015260800190565b928352602083019190915273ffffffffffffffffffffffffffffffffffffffff16604082015260600190565b60208082526018908201527f4d6978696e556e69737761702f4e4f5f45584348414e47450000000000000000604082015260600190565b6020808252602c908201527f4d6978696e42616e636f722f504154485f4c454e4754485f4d5553545f42455f60408201527f41545f4c454153545f54574f0000000000000000000000000000000000000000606082015260800190565b6020808252602f908201527f4d6978696e43727970746f436f6d2f504154485f4c454e4754485f4d5553545f60408201527f42455f41545f4c454153545f54574f0000000000000000000000000000000000606082015260800190565b6020808252602f908201527f4d6978696e5375736869737761702f504154485f4c454e4754485f4d5553545f60408201527f42455f41545f4c454153545f54574f0000000000000000000000000000000000606082015260800190565b60208082526038908201527f4d6978696e42616e636f722f4c4153545f454c454d454e545f4f465f5041544860408201527f5f4d5553545f4d415443485f4f55545055545f544f4b454e0000000000000000606082015260800190565b6020808252603b908201527f4d6978696e5375736869737761702f4c4153545f454c454d454e545f4f465f5060408201527f4154485f4d5553545f4d415443485f4f55545055545f544f4b454e0000000000606082015260800190565b6020808252603b908201527f4d6978696e556e697377617056322f4c4153545f454c454d454e545f4f465f5060408201527f4154485f4d5553545f4d415443485f4f55545055545f544f4b454e0000000000606082015260800190565b6020808252603b908201527f4d6978696e43727970746f436f6d2f4c4153545f454c454d454e545f4f465f5060408201527f4154485f4d5553545f4d415443485f4f55545055545f544f4b454e0000000000606082015260800190565b6020808252602f908201527f4d6978696e556e697377617056332f504154485f4c454e4754485f4d5553545f60408201527f42455f41545f4c454153545f54574f0000000000000000000000000000000000606082015260800190565b90815260200190565b94855273ffffffffffffffffffffffffffffffffffffffff93841660208601529190921660408401526060830191909152608082015260a00190565b600086825285602083015260a060408301526133f560a0830186612c92565b73ffffffffffffffffffffffffffffffffffffffff94909416606083015250608001529392505050565b60008482528360208301526060604083015261343e6060830184612ce2565b95945050505050565b94855260208501939093526040840191909152606083015273ffffffffffffffffffffffffffffffffffffffff16608082015260a00190565b9283526020830191909152604082015260600190565b60405181810167ffffffffffffffff811182821017156134b557600080fd5b604052919050565b600067ffffffffffffffff8211156134d3578081fd5b5060209081020190565b600067ffffffffffffffff8211156134f3578081fd5b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b82818337506000910152565b60005b8381101561354657818101518382015260200161352e565b838111156125655750506000910152565b73ffffffffffffffffffffffffffffffffffffffff8116811461357957600080fd5b50565b80600f0b811461357957600080fdfea264697066735822122071dc735350cfa03acdcd4814215a1296a2a2b80d236c98208c6cb24d71b9a3b664736f6c634300060c0033",
|
|
"opcodes": "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 0x8DC669FA EQ PUSH2 0x3B JUMPI DUP1 PUSH4 0xDF2B2737 EQ PUSH2 0x59 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x43 PUSH2 0x79 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x50 SWAP2 SWAP1 PUSH2 0x2D48 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x6C PUSH2 0x67 CALLDATASIZE PUSH1 0x4 PUSH2 0x2A32 JUMP JUMPDEST PUSH2 0x91 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x50 SWAP2 SWAP1 PUSH2 0x3391 JUMP JUMPDEST PUSH20 0xEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE DUP2 JUMP JUMPDEST DUP4 MLOAD PUSH1 0x0 SWAP1 PUSH1 0x3 EQ DUP1 PUSH2 0xA5 JUMPI POP DUP5 MLOAD PUSH1 0xF EQ JUMPDEST DUP1 PUSH2 0xB1 JUMPI POP DUP5 MLOAD PUSH1 0xD EQ JUMPDEST ISZERO PUSH2 0xCD JUMPI PUSH2 0xC6 DUP5 DUP5 DUP5 DUP9 PUSH1 0x60 ADD MLOAD PUSH2 0x2A4 JUMP JUMPDEST SWAP1 POP PUSH2 0x25C JUMP JUMPDEST DUP5 MLOAD PUSH1 0xE EQ ISZERO PUSH2 0xE6 JUMPI PUSH2 0xC6 DUP4 DUP4 DUP8 PUSH1 0x60 ADD MLOAD PUSH2 0x552 JUMP JUMPDEST DUP5 MLOAD PUSH1 0x11 EQ DUP1 PUSH2 0xF7 JUMPI POP DUP5 MLOAD PUSH1 0x13 EQ JUMPDEST ISZERO PUSH2 0x10B JUMPI PUSH2 0xC6 DUP4 DUP4 DUP8 PUSH1 0x60 ADD MLOAD PUSH2 0x76F JUMP JUMPDEST DUP5 MLOAD PUSH1 0x10 EQ ISZERO PUSH2 0x125 JUMPI PUSH2 0xC6 DUP5 DUP5 DUP5 DUP9 PUSH1 0x60 ADD MLOAD PUSH2 0x8B8 JUMP JUMPDEST DUP5 MLOAD ISZERO DUP1 PUSH2 0x134 JUMPI POP DUP5 MLOAD PUSH1 0x4 EQ JUMPDEST ISZERO PUSH2 0x149 JUMPI PUSH2 0xC6 DUP5 DUP5 DUP5 DUP9 PUSH1 0x60 ADD MLOAD PUSH2 0xD0B JUMP JUMPDEST DUP5 MLOAD PUSH1 0x7 EQ ISZERO PUSH2 0x163 JUMPI PUSH2 0xC6 DUP5 DUP5 DUP5 DUP9 PUSH1 0x60 ADD MLOAD PUSH2 0xE1C JUMP JUMPDEST DUP5 MLOAD PUSH1 0x9 EQ ISZERO PUSH2 0x17D JUMPI PUSH2 0xC6 DUP5 DUP5 DUP5 DUP9 PUSH1 0x60 ADD MLOAD PUSH2 0x11EF JUMP JUMPDEST DUP5 MLOAD PUSH1 0xA EQ ISZERO PUSH2 0x197 JUMPI PUSH2 0xC6 DUP5 DUP5 DUP5 DUP9 PUSH1 0x60 ADD MLOAD PUSH2 0x1558 JUMP JUMPDEST DUP5 MLOAD PUSH1 0xB EQ ISZERO PUSH2 0x1B1 JUMPI PUSH2 0xC6 DUP5 DUP5 DUP5 DUP9 PUSH1 0x60 ADD MLOAD PUSH2 0x1646 JUMP JUMPDEST DUP5 MLOAD PUSH1 0xC EQ ISZERO PUSH2 0x1CB JUMPI PUSH2 0xC6 DUP5 DUP5 DUP5 DUP9 PUSH1 0x60 ADD MLOAD PUSH2 0x16D9 JUMP JUMPDEST DUP5 MLOAD PUSH1 0x6 EQ ISZERO PUSH2 0x1E4 JUMPI PUSH2 0xC6 DUP5 DUP4 DUP8 PUSH1 0x60 ADD MLOAD PUSH2 0x1770 JUMP JUMPDEST DUP5 MLOAD PUSH1 0x12 EQ ISZERO PUSH2 0x1FD JUMPI PUSH2 0xC6 DUP5 DUP4 DUP8 PUSH1 0x60 ADD MLOAD PUSH2 0x19DD JUMP JUMPDEST DUP5 MLOAD PUSH1 0x5 EQ ISZERO PUSH2 0x216 JUMPI PUSH2 0xC6 DUP4 DUP4 DUP8 PUSH1 0x60 ADD MLOAD PUSH2 0x1B1C JUMP JUMPDEST DUP5 MLOAD PUSH1 0x1 EQ ISZERO PUSH2 0x22F JUMPI PUSH2 0xC6 DUP4 DUP4 DUP8 PUSH1 0x60 ADD MLOAD PUSH2 0x1BF5 JUMP JUMPDEST DUP5 MLOAD PUSH1 0x2 EQ ISZERO PUSH2 0x249 JUMPI PUSH2 0xC6 DUP5 DUP5 DUP5 DUP9 PUSH1 0x60 ADD MLOAD PUSH2 0x204C JUMP JUMPDEST PUSH2 0x259 DUP5 DUP5 DUP5 DUP9 PUSH1 0x60 ADD MLOAD PUSH2 0x212B JUMP JUMPDEST SWAP1 POP JUMPDEST DUP5 MLOAD PUSH1 0x40 MLOAD PUSH32 0xFF3BC5E46464411F331D1B093E1587D2D1AA667F5618F98A95AFC4132709D3A9 SWAP2 PUSH2 0x294 SWAP2 DUP8 SWAP1 DUP8 SWAP1 DUP8 SWAP1 DUP8 SWAP1 PUSH2 0x339A JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2AE PUSH2 0x275D JUMP JUMPDEST DUP3 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x2C2 SWAP2 SWAP1 PUSH2 0x2B23 JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP2 POP PUSH2 0x2E9 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND SWAP1 DUP7 PUSH2 0x21C5 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x0 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND SWAP1 PUSH4 0x70A08231 SWAP1 PUSH2 0x33E SWAP1 ADDRESS SWAP1 PUSH1 0x4 ADD PUSH2 0x2D48 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x356 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x36A JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x38E SWAP2 SWAP1 PUSH2 0x2BAF JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH1 0x60 DUP4 PUSH1 0x0 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 PUSH1 0x20 ADD MLOAD DUP6 PUSH1 0x40 ADD MLOAD DUP7 PUSH1 0x60 ADD MLOAD DUP11 PUSH1 0x1 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x3D4 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x3021 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 MSTORE SWAP1 MLOAD PUSH2 0x45D SWAP2 SWAP1 PUSH2 0x2D2C JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x49A JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x49F JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 PUSH2 0x4B2 JUMPI PUSH2 0x4B2 DUP2 PUSH2 0x22A1 JUMP JUMPDEST PUSH2 0x545 DUP4 DUP10 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x70A08231 ADDRESS PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x4EF SWAP2 SWAP1 PUSH2 0x2D48 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x507 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x51B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x53F SWAP2 SWAP1 PUSH2 0x2BAF JUMP JUMPDEST SWAP1 PUSH2 0x22A9 JUMP JUMPDEST SWAP10 SWAP9 POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 PUSH1 0x0 PUSH1 0x60 DUP5 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x56E SWAP2 SWAP1 PUSH2 0x2A20 JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP5 POP SWAP1 SWAP3 POP PUSH1 0x2 GT ISZERO SWAP1 POP PUSH2 0x5BB JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x5B2 SWAP1 PUSH2 0x3163 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP3 PUSH1 0x1 DUP5 MLOAD SUB DUP2 MLOAD DUP2 LT PUSH2 0x5E2 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x637 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x5B2 SWAP1 PUSH2 0x321D JUMP JUMPDEST PUSH2 0x676 DUP2 DUP7 DUP5 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x649 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x21C5 SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x38ED173900000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x60 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP1 PUSH4 0x38ED1739 SWAP1 PUSH2 0x6D4 SWAP1 DUP10 SWAP1 PUSH1 0x1 SWAP1 DUP9 SWAP1 ADDRESS SWAP1 TIMESTAMP SWAP1 PUSH1 0x4 ADD PUSH2 0x33D6 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x6EE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x702 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY PUSH1 0x1F RETURNDATASIZE SWAP1 DUP2 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND DUP3 ADD PUSH1 0x40 MSTORE PUSH2 0x748 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x2853 JUMP JUMPDEST SWAP1 POP DUP1 PUSH1 0x1 DUP3 MLOAD SUB DUP2 MLOAD DUP2 LT PUSH2 0x75A JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD SWAP4 POP POP POP POP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x60 DUP1 DUP5 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x789 SWAP2 SWAP1 PUSH2 0x2A20 JUMP JUMPDEST DUP1 MLOAD SWAP2 SWAP5 POP SWAP3 POP PUSH1 0x2 GT ISZERO SWAP1 POP PUSH2 0x7CC JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x5B2 SWAP1 PUSH2 0x3334 JUMP JUMPDEST DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 PUSH1 0x1 DUP4 MLOAD SUB DUP2 MLOAD DUP2 LT PUSH2 0x7F3 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x848 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x5B2 SWAP1 PUSH2 0x327A JUMP JUMPDEST PUSH2 0x85A DUP3 DUP7 DUP4 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x649 JUMPI INVALID JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x38ED173900000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x60 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 PUSH4 0x38ED1739 SWAP1 PUSH2 0x6D4 SWAP1 DUP10 SWAP1 PUSH1 0x1 SWAP1 DUP8 SWAP1 ADDRESS SWAP1 TIMESTAMP SWAP1 PUSH1 0x4 ADD PUSH2 0x33D6 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x8CF SWAP2 SWAP1 PUSH2 0x28E3 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x8DE DUP3 DUP9 DUP9 PUSH2 0x22D2 JUMP JUMPDEST SWAP1 POP PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0xA8A JUMPI PUSH1 0x40 MLOAD PUSH32 0x2E1A7D4D00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 PUSH4 0x2E1A7D4D SWAP1 PUSH2 0x9A6 SWAP1 DUP9 SWAP1 PUSH1 0x4 ADD PUSH2 0x3391 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x9C0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x9D4 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH32 0xAD65D76D00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP3 POP PUSH4 0xAD65D76D SWAP2 POP DUP8 SWAP1 PUSH2 0xA31 SWAP1 PUSH1 0x1 SWAP1 TIMESTAMP SWAP1 ADDRESS SWAP1 PUSH1 0x4 ADD PUSH2 0x3046 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xA4A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xA5E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0xA83 SWAP2 SWAP1 PUSH2 0x2BAF JUMP JUMPDEST SWAP3 POP PUSH2 0xD01 JUMP JUMPDEST PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0xC30 JUMPI PUSH2 0xAFF PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND DUP3 DUP8 PUSH2 0x21C5 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x95E3C50B00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP1 PUSH4 0x95E3C50B SWAP1 PUSH2 0xB56 SWAP1 DUP9 SWAP1 PUSH1 0x1 SWAP1 TIMESTAMP SWAP1 PUSH1 0x4 ADD PUSH2 0x3480 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xB70 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xB84 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0xBA8 SWAP2 SWAP1 PUSH2 0x2BAF JUMP JUMPDEST SWAP3 POP PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xD0E30DB0 DUP5 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xC12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xC26 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP PUSH2 0xD01 JUMP JUMPDEST PUSH2 0xC51 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND DUP3 DUP8 PUSH2 0x21C5 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xDDF7E1A700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP1 PUSH4 0xDDF7E1A7 SWAP1 PUSH2 0xCAC SWAP1 DUP9 SWAP1 PUSH1 0x1 SWAP1 DUP2 SWAP1 TIMESTAMP SWAP1 DUP14 SWAP1 PUSH1 0x4 ADD PUSH2 0x3447 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xCC6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xCDA JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0xCFE SWAP2 SWAP1 PUSH2 0x2BAF JUMP JUMPDEST SWAP3 POP JUMPDEST POP POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0xD22 SWAP2 SWAP1 PUSH2 0x28E3 JUMP JUMPDEST SWAP1 POP PUSH2 0xD45 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND DUP3 DUP7 PUSH2 0x21C5 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x8201AA3F00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP1 PUSH4 0x8201AA3F SWAP1 PUSH2 0xDC0 SWAP1 DUP10 SWAP1 DUP9 SWAP1 DUP11 SWAP1 PUSH1 0x1 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH1 0x4 ADD PUSH2 0x2FB0 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xDD9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xDED JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0xE11 SWAP2 SWAP1 PUSH2 0x2BEB JUMP JUMPDEST POP SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x60 DUP4 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0xE35 SWAP2 SWAP1 PUSH2 0x29DB JUMP JUMPDEST SWAP2 POP SWAP2 POP PUSH1 0x0 PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP9 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xEB4 JUMPI PUSH2 0xEAF PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 AND DUP5 DUP9 PUSH2 0x21C5 JUMP JUMPDEST PUSH2 0xF5C JUMP JUMPDEST POP PUSH1 0x40 MLOAD PUSH32 0x2E1A7D4D00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE DUP6 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 PUSH4 0x2E1A7D4D SWAP1 PUSH2 0xF29 SWAP1 DUP5 SWAP1 PUSH1 0x4 ADD PUSH2 0x3391 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xF43 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xF57 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x29589F61 DUP3 PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP12 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xFD2 JUMPI DUP11 PUSH2 0xFF4 JUMP JUMPDEST PUSH32 0x0 JUMPDEST DUP10 PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP13 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x104E JUMPI DUP12 PUSH2 0x1070 JUMP JUMPDEST PUSH32 0x0 JUMPDEST ADDRESS PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x1 PUSH1 0x0 DUP12 PUSH1 0x40 MLOAD DUP11 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x10BA SWAP9 SWAP8 SWAP7 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x2F0E JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x10D3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x10E7 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x110C SWAP2 SWAP1 PUSH2 0x2BAF JUMP JUMPDEST SWAP4 POP PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x11E4 JUMPI PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xD0E30DB0 DUP6 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x11CA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x11DE JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP JUMPDEST POP POP POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x1206 SWAP2 SWAP1 PUSH2 0x28E3 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x130A JUMPI PUSH1 0x40 MLOAD PUSH32 0x2E1A7D4D00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 PUSH4 0x2E1A7D4D SWAP1 PUSH2 0x12D0 SWAP1 DUP9 SWAP1 PUSH1 0x4 ADD PUSH2 0x3391 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x12EA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x12FE JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP DUP5 SWAP1 POP PUSH2 0x132B JUMP JUMPDEST PUSH2 0x132B PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND DUP4 DUP8 PUSH2 0x21C5 JUMP JUMPDEST DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xD5BCB9B5 DUP3 PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP11 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x13A1 JUMPI DUP10 PUSH2 0x13A4 JUMP JUMPDEST PUSH1 0x0 JUMPDEST PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP11 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x13FD JUMPI DUP10 PUSH2 0x1400 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP10 PUSH1 0x1 PUSH1 0x0 PUSH1 0x40 MLOAD DUP8 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1425 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x2E93 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x143E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1452 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x1477 SWAP2 SWAP1 PUSH2 0x2BAF JUMP JUMPDEST SWAP3 POP PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0xD01 JUMPI PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xD0E30DB0 DUP5 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1535 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1549 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x156F SWAP2 SWAP1 PUSH2 0x28E3 JUMP JUMPDEST SWAP1 POP PUSH2 0x1592 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND DUP3 DUP7 PUSH2 0x21C5 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x6E81221C00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP1 PUSH4 0x6E81221C SWAP1 PUSH2 0x15EA SWAP1 DUP10 SWAP1 DUP10 SWAP1 DUP10 SWAP1 ADDRESS SWAP1 PUSH1 0x4 ADD PUSH2 0x2E5B JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1604 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1618 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x163C SWAP2 SWAP1 PUSH2 0x2BAF JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x165D SWAP2 SWAP1 PUSH2 0x28E3 JUMP JUMPDEST SWAP1 POP PUSH2 0x1680 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND DUP3 DUP7 PUSH2 0x21C5 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x621B4F600000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP1 PUSH4 0x621B4F6 SWAP1 PUSH2 0x15EA SWAP1 DUP10 SWAP1 DUP9 SWAP1 DUP11 SWAP1 PUSH1 0x1 SWAP1 PUSH1 0x4 ADD PUSH2 0x2F79 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x16F0 SWAP2 SWAP1 PUSH2 0x28E3 JUMP JUMPDEST SWAP1 POP PUSH2 0x1713 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND DUP3 DUP7 PUSH2 0x21C5 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xB2583C800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP1 PUSH4 0xB2583C8 SWAP1 PUSH2 0x15EA SWAP1 DUP10 SWAP1 DUP10 SWAP1 DUP10 SWAP1 PUSH1 0x1 SWAP1 TIMESTAMP DUP3 ADD SWAP1 PUSH1 0x4 ADD PUSH2 0x2ED0 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 DUP5 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x178A SWAP2 SWAP1 PUSH2 0x294E JUMP JUMPDEST SWAP2 SWAP5 POP SWAP3 POP SWAP1 POP PUSH2 0x17B2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND DUP4 DUP9 PUSH2 0x21C5 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x1875 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP2 DUP3 SWAP1 MSTORE PUSH32 0x8DAE733300000000000000000000000000000000000000000000000000000000 SWAP1 SWAP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP1 PUSH4 0x8DAE7333 SWAP1 PUSH2 0x181C SWAP1 DUP10 SWAP1 PUSH1 0x1 SWAP1 PUSH1 0x24 DUP2 ADD PUSH2 0x341F JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1836 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x184A JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x186E SWAP2 SWAP1 PUSH2 0x2BAF JUMP JUMPDEST SWAP4 POP PUSH2 0x19D3 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xCA19EBD900000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 PUSH4 0xCA19EBD9 SWAP1 PUSH2 0x18C9 SWAP1 DUP6 SWAP1 DUP11 SWAP1 PUSH1 0x4 ADD PUSH2 0x2D90 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x18E1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x18F5 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x1919 SWAP2 SWAP1 PUSH2 0x2BAF JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP2 DUP3 SWAP1 MSTORE PUSH32 0xE67CE70600000000000000000000000000000000000000000000000000000000 SWAP1 SWAP2 MSTORE SWAP1 SWAP5 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP1 PUSH4 0xE67CE706 SWAP1 PUSH2 0x197F SWAP1 DUP8 SWAP1 DUP11 SWAP1 PUSH1 0x24 DUP2 ADD PUSH2 0x341F JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1999 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x19AD JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x19D1 SWAP2 SWAP1 PUSH2 0x2BAF JUMP JUMPDEST POP JUMPDEST POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP4 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x19F6 SWAP2 SWAP1 PUSH2 0x299E JUMP JUMPDEST SWAP1 SWAP3 POP SWAP1 POP PUSH2 0x1A1C PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND DUP4 DUP8 PUSH2 0x24BF JUMP JUMPDEST DUP1 PUSH2 0x1ACA JUMPI PUSH1 0x40 MLOAD PUSH32 0xDD93F59A00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP1 PUSH4 0xDD93F59A SWAP1 PUSH2 0x1A73 SWAP1 ADDRESS SWAP1 PUSH1 0x4 ADD PUSH2 0x2D48 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1A8D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1AA1 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x1AC5 SWAP2 SWAP1 PUSH2 0x2BAF JUMP JUMPDEST PUSH2 0x163C JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xBD6015B400000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP1 PUSH4 0xBD6015B4 SWAP1 PUSH2 0x15EA SWAP1 ADDRESS SWAP1 PUSH1 0x4 ADD PUSH2 0x2D48 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x60 DUP1 DUP5 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x1B36 SWAP2 SWAP1 PUSH2 0x2A20 JUMP JUMPDEST DUP1 MLOAD SWAP2 SWAP5 POP SWAP3 POP PUSH1 0x2 GT ISZERO SWAP1 POP PUSH2 0x1B79 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x5B2 SWAP1 PUSH2 0x3106 JUMP JUMPDEST DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 PUSH1 0x1 DUP4 MLOAD SUB DUP2 MLOAD DUP2 LT PUSH2 0x1BA0 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x848 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x5B2 SWAP1 PUSH2 0x32D7 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x60 DUP1 DUP5 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x1C0F SWAP2 SWAP1 PUSH2 0x28FF JUMP JUMPDEST DUP1 MLOAD SWAP2 SWAP5 POP SWAP3 POP PUSH1 0x2 GT ISZERO SWAP1 POP PUSH2 0x1C52 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x5B2 SWAP1 PUSH2 0x30A9 JUMP JUMPDEST DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 PUSH1 0x1 DUP4 MLOAD SUB DUP2 MLOAD DUP2 LT PUSH2 0x1C79 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ DUP1 PUSH2 0x1D4F JUMPI POP PUSH20 0xEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 PUSH1 0x1 DUP4 MLOAD SUB DUP2 MLOAD DUP2 LT PUSH2 0x1CD9 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ DUP1 ISZERO PUSH2 0x1D4F JUMPI POP PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ JUMPDEST PUSH2 0x1D85 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x5B2 SWAP1 PUSH2 0x31C0 JUMP JUMPDEST PUSH1 0x0 PUSH20 0xEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP3 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x1DBF JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x1E8F JUMPI PUSH1 0x40 MLOAD PUSH32 0x2E1A7D4D00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 PUSH4 0x2E1A7D4D SWAP1 PUSH2 0x1E55 SWAP1 DUP10 SWAP1 PUSH1 0x4 ADD PUSH2 0x3391 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1E6F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1E83 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP DUP6 SWAP1 POP PUSH2 0x1EAE JUMP JUMPDEST PUSH2 0x1EAE DUP3 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x1E9F JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD DUP5 DUP9 PUSH2 0x21C5 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xB77D239B00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 PUSH4 0xB77D239B SWAP1 DUP4 SWAP1 PUSH2 0x1F0E SWAP1 DUP7 SWAP1 DUP12 SWAP1 PUSH1 0x1 SWAP1 ADDRESS SWAP1 PUSH1 0x0 SWAP1 DUP2 SWAP1 PUSH1 0x4 ADD PUSH2 0x2DB6 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1F27 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1F3B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x1F60 SWAP2 SWAP1 PUSH2 0x2BAF JUMP JUMPDEST SWAP4 POP PUSH20 0xEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP3 PUSH1 0x1 DUP5 MLOAD SUB DUP2 MLOAD DUP2 LT PUSH2 0x1F9D JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x19D3 JUMPI PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xD0E30DB0 DUP6 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2029 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x203D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP4 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x2065 SWAP2 SWAP1 PUSH2 0x2BC7 JUMP JUMPDEST SWAP2 POP SWAP2 POP PUSH2 0x2074 DUP8 DUP3 DUP8 PUSH2 0x24BF JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x9F44296A00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP1 PUSH4 0x9F44296A SWAP1 DUP5 SWAP1 PUSH2 0x20CA SWAP1 DUP11 SWAP1 ADDRESS SWAP1 PUSH1 0x4 ADD PUSH2 0x2D69 JUMP JUMPDEST PUSH1 0xE0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x20E3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x20F7 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x211C SWAP2 SWAP1 PUSH2 0x2C0E JUMP JUMPDEST POP SWAP1 SWAP10 SWAP9 POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x60 DUP4 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x2144 SWAP2 SWAP1 PUSH2 0x29DB JUMP JUMPDEST SWAP1 SWAP3 POP SWAP1 POP PUSH2 0x216A PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND DUP4 DUP8 PUSH2 0x24BF JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x65D02B0400000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP1 PUSH4 0x65D02B04 SWAP1 PUSH2 0xCAC SWAP1 DUP11 SWAP1 DUP11 SWAP1 ADDRESS SWAP1 PUSH1 0x1 SWAP1 DUP9 SWAP1 PUSH1 0x4 ADD PUSH2 0x2E09 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xDD62ED3E00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE DUP2 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND SWAP1 PUSH4 0xDD62ED3E SWAP1 PUSH2 0x221B SWAP1 ADDRESS SWAP1 DUP8 SWAP1 PUSH1 0x4 ADD PUSH2 0x2D69 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2233 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2247 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x226B SWAP2 SWAP1 PUSH2 0x2BAF JUMP JUMPDEST LT ISZERO PUSH2 0x229C JUMPI PUSH2 0x229C DUP4 DUP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x256B JUMP JUMPDEST POP POP POP JUMP JUMPDEST DUP1 MLOAD PUSH1 0x20 DUP3 ADD REVERT JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x22C7 JUMPI PUSH2 0x22C7 PUSH2 0x22C2 PUSH1 0x2 DUP6 DUP6 PUSH2 0x2588 JUMP JUMPDEST PUSH2 0x22A1 JUMP JUMPDEST POP DUP1 DUP3 SUB JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x23CE JUMPI PUSH1 0x40 MLOAD PUSH32 0x6F2BF6200000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND SWAP1 PUSH4 0x6F2BF62 SWAP1 PUSH2 0x2379 SWAP1 DUP7 SWAP1 PUSH1 0x4 ADD PUSH2 0x2D48 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2391 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x23A5 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x23C9 SWAP2 SWAP1 PUSH2 0x28E3 JUMP JUMPDEST PUSH2 0x2470 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x6F2BF6200000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND SWAP1 PUSH4 0x6F2BF62 SWAP1 PUSH2 0x2420 SWAP1 DUP6 SWAP1 PUSH1 0x4 ADD PUSH2 0x2D48 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2438 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x244C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x2470 SWAP2 SWAP1 PUSH2 0x28E3 JUMP JUMPDEST SWAP1 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x768 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x5B2 SWAP1 PUSH2 0x3072 JUMP JUMPDEST PUSH1 0x60 PUSH4 0xA9059CBB PUSH1 0xE0 SHL DUP4 DUP4 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x24DC SWAP3 SWAP2 SWAP1 PUSH2 0x2D90 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE SWAP1 POP PUSH2 0x2565 DUP5 DUP3 PUSH2 0x262D JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH4 0x95EA7B3 PUSH1 0xE0 SHL DUP4 DUP4 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x24DC SWAP3 SWAP2 SWAP1 PUSH2 0x2D90 JUMP JUMPDEST PUSH1 0x60 PUSH4 0xE946C1BB PUSH1 0xE0 SHL DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x25A7 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x2FF1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE SWAP1 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH1 0x40 MLOAD PUSH2 0x2656 SWAP2 SWAP1 PUSH2 0x2D2C JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x2693 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x2698 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 DUP1 ISZERO PUSH2 0x26AE JUMPI POP PUSH2 0x26AE DUP2 PUSH2 0x26C7 JUMP JUMPDEST ISZERO PUSH2 0x26BA JUMPI POP POP PUSH2 0x26C3 JUMP JUMPDEST PUSH2 0x2565 DUP2 PUSH2 0x22A1 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD PUSH1 0x0 EQ ISZERO PUSH2 0x26DB JUMPI POP PUSH1 0x1 PUSH2 0x2708 JUMP JUMPDEST PUSH1 0x20 DUP3 MLOAD LT PUSH2 0x2708 JUMPI PUSH1 0x0 PUSH2 0x26F1 DUP4 PUSH1 0x0 PUSH2 0x270D JUMP JUMPDEST SWAP1 POP DUP1 PUSH1 0x1 EQ ISZERO PUSH2 0x2706 JUMPI PUSH1 0x1 SWAP2 POP POP PUSH2 0x2708 JUMP JUMPDEST POP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x768 DUP4 DUP4 PUSH1 0x0 DUP2 PUSH1 0x20 ADD DUP4 MLOAD LT ISZERO PUSH2 0x2735 JUMPI PUSH2 0x2735 PUSH2 0x22C2 PUSH1 0x5 DUP6 MLOAD DUP6 PUSH1 0x20 ADD PUSH2 0x273E JUMP JUMPDEST POP ADD PUSH1 0x20 ADD MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x60 PUSH4 0x28006595 PUSH1 0xE0 SHL DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x25A7 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x3013 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x80 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x60 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x2794 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x27A7 PUSH2 0x27A2 DUP3 PUSH2 0x34BD JUMP JUMPDEST PUSH2 0x3496 JUMP JUMPDEST DUP2 DUP2 MSTORE SWAP2 POP PUSH1 0x20 DUP1 DUP4 ADD SWAP1 DUP5 DUP2 ADD DUP2 DUP5 MUL DUP7 ADD DUP3 ADD DUP8 LT ISZERO PUSH2 0x27C8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x27F0 JUMPI DUP2 MLOAD PUSH2 0x27DE DUP2 PUSH2 0x3557 JUMP JUMPDEST DUP5 MSTORE SWAP3 DUP3 ADD SWAP3 SWAP1 DUP3 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x27CB JUMP JUMPDEST POP POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x280B JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x2819 PUSH2 0x27A2 DUP3 PUSH2 0x34DD JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x2830 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2841 DUP2 PUSH1 0x20 DUP5 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x352B JUMP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP1 CALLDATALOAD PUSH2 0x22CC DUP2 PUSH2 0x3557 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP1 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x2865 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x287B JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 ADD PUSH1 0x1F DUP2 ADD DUP6 SGT PUSH2 0x288B JUMPI DUP3 DUP4 REVERT JUMPDEST DUP1 MLOAD PUSH2 0x2899 PUSH2 0x27A2 DUP3 PUSH2 0x34BD JUMP JUMPDEST DUP2 DUP2 MSTORE DUP4 DUP2 ADD SWAP1 DUP4 DUP6 ADD DUP6 DUP5 MUL DUP6 ADD DUP7 ADD DUP10 LT ISZERO PUSH2 0x28B5 JUMPI DUP7 DUP8 REVERT JUMPDEST DUP7 SWAP5 POP JUMPDEST DUP4 DUP6 LT ISZERO PUSH2 0x28D7 JUMPI DUP1 MLOAD DUP4 MSTORE PUSH1 0x1 SWAP5 SWAP1 SWAP5 ADD SWAP4 SWAP2 DUP6 ADD SWAP2 DUP6 ADD PUSH2 0x28B9 JUMP JUMPDEST POP SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x28F4 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x768 DUP2 PUSH2 0x3557 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x2911 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP3 MLOAD PUSH2 0x291C DUP2 PUSH2 0x3557 JUMP JUMPDEST PUSH1 0x20 DUP5 ADD MLOAD SWAP1 SWAP3 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2938 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x2944 DUP6 DUP3 DUP7 ADD PUSH2 0x2784 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x2962 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP4 MLOAD PUSH2 0x296D DUP2 PUSH2 0x3557 JUMP JUMPDEST PUSH1 0x20 DUP6 ADD MLOAD SWAP1 SWAP4 POP PUSH2 0x297E DUP2 PUSH2 0x3557 JUMP JUMPDEST PUSH1 0x40 DUP6 ADD MLOAD SWAP1 SWAP3 POP DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x2993 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x29B0 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 MLOAD PUSH2 0x29BB DUP2 PUSH2 0x3557 JUMP JUMPDEST PUSH1 0x20 DUP5 ADD MLOAD SWAP1 SWAP3 POP DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x29D0 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x29ED JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 MLOAD PUSH2 0x29F8 DUP2 PUSH2 0x3557 JUMP JUMPDEST PUSH1 0x20 DUP5 ADD MLOAD SWAP1 SWAP3 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2A14 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x2944 DUP6 DUP3 DUP7 ADD PUSH2 0x27FB JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x2911 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x2A47 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x2A5E JUMPI DUP4 DUP5 REVERT JUMPDEST SWAP1 DUP7 ADD SWAP1 PUSH1 0x80 DUP3 DUP10 SUB SLT ISZERO PUSH2 0x2A71 JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x2A7B PUSH1 0x80 PUSH2 0x3496 JUMP JUMPDEST DUP3 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 DUP1 DUP5 ADD CALLDATALOAD DUP2 DUP4 ADD MSTORE PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP5 ADD CALLDATALOAD DUP4 DUP2 GT ISZERO PUSH2 0x2AA4 JUMPI DUP7 DUP8 REVERT JUMPDEST DUP1 DUP6 ADD SWAP5 POP POP DUP10 PUSH1 0x1F DUP6 ADD SLT PUSH2 0x2AB8 JUMPI DUP6 DUP7 REVERT JUMPDEST DUP4 CALLDATALOAD SWAP3 POP PUSH2 0x2AC8 PUSH2 0x27A2 DUP5 PUSH2 0x34DD JUMP JUMPDEST DUP4 DUP2 MSTORE DUP11 DUP3 DUP6 DUP8 ADD ADD GT ISZERO PUSH2 0x2ADB JUMPI DUP7 DUP8 REVERT JUMPDEST PUSH2 0x2AEA DUP5 DUP4 DUP4 ADD DUP5 DUP9 ADD PUSH2 0x351F JUMP JUMPDEST DUP1 PUSH1 0x60 DUP5 ADD MSTORE POP DUP2 SWAP8 POP PUSH2 0x2B00 DUP11 DUP3 DUP12 ADD PUSH2 0x2848 JUMP JUMPDEST SWAP7 POP POP POP POP POP PUSH2 0x2B13 DUP7 PUSH1 0x40 DUP8 ADD PUSH2 0x2848 JUMP JUMPDEST SWAP4 SWAP7 SWAP3 SWAP6 POP SWAP3 SWAP4 PUSH1 0x60 ADD CALLDATALOAD SWAP3 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2B34 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x2B3E PUSH1 0x80 PUSH2 0x3496 JUMP JUMPDEST DUP3 MLOAD PUSH2 0x2B49 DUP2 PUSH2 0x3557 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 DUP4 ADD MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 EQ PUSH2 0x2B7D JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 DUP4 ADD MLOAD PUSH2 0x2B90 DUP2 PUSH2 0x357C JUMP JUMPDEST PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 DUP4 ADD MLOAD PUSH2 0x2BA3 DUP2 PUSH2 0x357C JUMP JUMPDEST PUSH1 0x60 DUP3 ADD MSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2BC0 JUMPI DUP1 DUP2 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x2BD9 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 MLOAD SWAP2 POP PUSH1 0x20 DUP4 ADD MLOAD PUSH2 0x29D0 DUP2 PUSH2 0x3557 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x2BFD JUMPI DUP2 DUP3 REVERT JUMPDEST POP POP DUP1 MLOAD PUSH1 0x20 SWAP1 SWAP2 ADD MLOAD SWAP1 SWAP3 SWAP1 SWAP2 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xE0 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x2C23 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP5 MLOAD SWAP4 POP PUSH1 0x20 DUP1 DUP7 ADD MLOAD SWAP4 POP PUSH1 0x40 DUP7 ADD MLOAD SWAP3 POP DUP7 PUSH1 0x7F DUP8 ADD SLT PUSH2 0x2C44 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x2C4E PUSH1 0x80 PUSH2 0x3496 JUMP JUMPDEST DUP1 PUSH1 0x60 DUP9 ADD DUP10 PUSH1 0xE0 DUP11 ADD GT ISZERO PUSH2 0x2C62 JUMPI DUP5 DUP6 REVERT JUMPDEST DUP5 JUMPDEST PUSH1 0x4 DUP2 LT ISZERO PUSH2 0x2C81 JUMPI DUP2 MLOAD DUP5 MSTORE SWAP3 DUP5 ADD SWAP3 SWAP1 DUP5 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x2C64 JUMP JUMPDEST POP POP DUP1 SWAP4 POP POP POP POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH1 0x20 DUP1 DUP6 ADD SWAP5 POP DUP1 DUP5 ADD DUP4 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x2CD7 JUMPI DUP2 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP8 MSTORE SWAP6 DUP3 ADD SWAP6 SWAP1 DUP3 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x2CA5 JUMP JUMPDEST POP SWAP5 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH2 0x2CFA DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x352B JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD PUSH2 0x2D3E DUP2 DUP5 PUSH1 0x20 DUP8 ADD PUSH2 0x352B JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP4 AND DUP2 MSTORE SWAP2 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0xC0 DUP3 MSTORE PUSH2 0x2DC9 PUSH1 0xC0 DUP4 ADD DUP10 PUSH2 0x2C92 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD SWAP8 SWAP1 SWAP8 MSTORE POP PUSH1 0x40 DUP2 ADD SWAP5 SWAP1 SWAP5 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP4 AND PUSH1 0x60 DUP6 ADD MSTORE SWAP2 AND PUSH1 0x80 DUP4 ADD MSTORE PUSH1 0xA0 SWAP1 SWAP2 ADD MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP9 AND DUP4 MSTORE DUP1 DUP8 AND PUSH1 0x20 DUP5 ADD MSTORE DUP1 DUP7 AND PUSH1 0x40 DUP5 ADD MSTORE POP DUP4 PUSH1 0x60 DUP4 ADD MSTORE PUSH1 0xA0 PUSH1 0x80 DUP4 ADD MSTORE PUSH2 0x2E50 PUSH1 0xA0 DUP4 ADD DUP5 PUSH2 0x2CE2 JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 DUP6 AND DUP2 MSTORE SWAP3 DUP5 AND PUSH1 0x20 DUP5 ADD MSTORE PUSH1 0x40 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 SWAP2 AND PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP2 MSTORE SWAP4 DUP6 AND PUSH1 0x20 DUP6 ADD MSTORE PUSH1 0x40 DUP5 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x60 DUP4 ADD MSTORE SWAP1 SWAP2 AND PUSH1 0x80 DUP3 ADD MSTORE PUSH1 0xA0 ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP2 MSTORE SWAP4 SWAP1 SWAP5 AND PUSH1 0x20 DUP5 ADD MSTORE PUSH1 0x40 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xA0 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x100 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP13 AND DUP5 MSTORE DUP11 PUSH1 0x20 DUP6 ADD MSTORE DUP1 DUP11 AND PUSH1 0x40 DUP6 ADD MSTORE DUP1 DUP10 AND PUSH1 0x60 DUP6 ADD MSTORE DUP8 PUSH1 0x80 DUP6 ADD MSTORE DUP7 PUSH1 0xA0 DUP6 ADD MSTORE DUP1 DUP7 AND PUSH1 0xC0 DUP6 ADD MSTORE POP DUP1 PUSH1 0xE0 DUP5 ADD MSTORE PUSH2 0x2F6A DUP2 DUP5 ADD DUP6 PUSH2 0x2CE2 JUMP JUMPDEST SWAP12 SWAP11 POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 DUP6 AND DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP4 SWAP1 SWAP4 MSTORE SWAP3 AND PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP5 SWAP1 SWAP5 MSTORE SWAP2 SWAP1 SWAP4 AND PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x80 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xA0 ADD SWAP1 JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH1 0x4 DUP6 LT PUSH2 0x2FFF JUMPI INVALID JUMPDEST SWAP4 DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x40 SWAP1 SWAP2 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH1 0x8 DUP6 LT PUSH2 0x2FFF JUMPI INVALID JUMPDEST PUSH1 0xF SWAP5 DUP6 SIGNEXTEND DUP2 MSTORE SWAP3 SWAP1 SWAP4 SIGNEXTEND PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0xFF SWAP1 SWAP2 AND PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST SWAP3 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x18 SWAP1 DUP3 ADD MSTORE PUSH32 0x4D6978696E556E69737761702F4E4F5F45584348414E47450000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x2C SWAP1 DUP3 ADD MSTORE PUSH32 0x4D6978696E42616E636F722F504154485F4C454E4754485F4D5553545F42455F PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x41545F4C454153545F54574F0000000000000000000000000000000000000000 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x2F SWAP1 DUP3 ADD MSTORE PUSH32 0x4D6978696E43727970746F436F6D2F504154485F4C454E4754485F4D5553545F PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x42455F41545F4C454153545F54574F0000000000000000000000000000000000 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x2F SWAP1 DUP3 ADD MSTORE PUSH32 0x4D6978696E5375736869737761702F504154485F4C454E4754485F4D5553545F PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x42455F41545F4C454153545F54574F0000000000000000000000000000000000 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x38 SWAP1 DUP3 ADD MSTORE PUSH32 0x4D6978696E42616E636F722F4C4153545F454C454D454E545F4F465F50415448 PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x5F4D5553545F4D415443485F4F55545055545F544F4B454E0000000000000000 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x3B SWAP1 DUP3 ADD MSTORE PUSH32 0x4D6978696E5375736869737761702F4C4153545F454C454D454E545F4F465F50 PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x4154485F4D5553545F4D415443485F4F55545055545F544F4B454E0000000000 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x3B SWAP1 DUP3 ADD MSTORE PUSH32 0x4D6978696E556E697377617056322F4C4153545F454C454D454E545F4F465F50 PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x4154485F4D5553545F4D415443485F4F55545055545F544F4B454E0000000000 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x3B SWAP1 DUP3 ADD MSTORE PUSH32 0x4D6978696E43727970746F436F6D2F4C4153545F454C454D454E545F4F465F50 PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x4154485F4D5553545F4D415443485F4F55545055545F544F4B454E0000000000 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x2F SWAP1 DUP3 ADD MSTORE PUSH32 0x4D6978696E556E697377617056332F504154485F4C454E4754485F4D5553545F PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x42455F41545F4C454153545F54574F0000000000000000000000000000000000 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP5 DUP6 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP4 DUP5 AND PUSH1 0x20 DUP7 ADD MSTORE SWAP2 SWAP1 SWAP3 AND PUSH1 0x40 DUP5 ADD MSTORE PUSH1 0x60 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x80 DUP3 ADD MSTORE PUSH1 0xA0 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP7 DUP3 MSTORE DUP6 PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0xA0 PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x33F5 PUSH1 0xA0 DUP4 ADD DUP7 PUSH2 0x2C92 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND PUSH1 0x60 DUP4 ADD MSTORE POP PUSH1 0x80 ADD MSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP5 DUP3 MSTORE DUP4 PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x60 PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x343E PUSH1 0x60 DUP4 ADD DUP5 PUSH2 0x2CE2 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST SWAP5 DUP6 MSTORE PUSH1 0x20 DUP6 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x40 DUP5 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 DUP4 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x80 DUP3 ADD MSTORE PUSH1 0xA0 ADD SWAP1 JUMP JUMPDEST SWAP3 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x34B5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x34D3 JUMPI DUP1 DUP2 REVERT JUMPDEST POP PUSH1 0x20 SWAP1 DUP2 MUL ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x34F3 JUMPI DUP1 DUP2 REVERT JUMPDEST POP PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3546 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x352E JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x2565 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x3579 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST DUP1 PUSH1 0xF SIGNEXTEND DUP2 EQ PUSH2 0x3579 JUMPI PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH18 0xDC735350CFA03ACDCD4814215A1296A2A2B8 0xD 0x23 PUSH13 0x98208C6CB24D71B9A3B664736F PUSH13 0x634300060C0033000000000000 ",
|
|
"sourceMap": "1314:4867:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1298:118:4;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2095:4084:0;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1298:118:4:-;1373:42;1298:118;:::o;2095:4084:0:-;2334:12;;2294:20;;867:1:1;2334:34:0;;:85;;-1:-1:-1;2384:12:0;;1393:2:1;2384:35:0;2334:85;:138;;;-1:-1:-1;2435:12:0;;1304:2:1;2435:37:0;2334:138;2330:3686;;;2503:140;2532:9;2559:8;2585:10;2613:5;:16;;;2503:11;:140::i;:::-;2488:155;;2330:3686;;;2664:12;;1350:2:1;2664:38:0;2660:3356;;;2733:117;2766:8;2792:10;2820:5;:16;;;2733:15;:117::i;2660:3356::-;2871:12;;1483:2:1;2871:38:0;;:98;;-1:-1:-1;2932:12:0;;1571:2:1;2932:37:0;2871:98;2867:3149;;;3000:117;3033:8;3059:10;3087:5;:16;;;3000:15;:117::i;2867:3149::-;3138:12;;1437:2:1;3138:36:0;3134:2882;;;3205:142;3236:9;3263:8;3289:10;3317:5;:16;;;3205:13;:142::i;3134:2882::-;3368:12;;:37;;:94;;-1:-1:-1;3428:12:0;;908:1:1;3428:34:0;3368:94;3364:2652;;;3493:143;3525:9;3552:8;3578:10;3606:5;:16;;;3493:14;:143::i;3364:2652::-;3657:12;;1034:1:1;3657:34:0;3653:2363;;;3722:140;3751:9;3778:8;3804:10;3832:5;:16;;;3722:11;:140::i;3653:2363::-;3883:12;;1132:1:1;3883:38:0;3879:2137;;;3952:144;3985:9;4012:8;4038:10;4066:5;:16;;;3952:15;:144::i;3879:2137::-;4117:12;;1175:2:1;4117:36:0;4113:1903;;;4184:142;4215:9;4242:8;4268:10;4296:5;:16;;;4184:13;:142::i;4113:1903::-;4347:12;;1217:2:1;4347:34:0;4343:1673;;;4412:140;4441:9;4468:8;4494:10;4522:5;:16;;;4412:11;:140::i;4343:1673::-;4573:12;;1259:2:1;4573:34:0;4569:1447;;;4638:140;4667:9;4694:8;4720:10;4748:5;:16;;;4638:11;:140::i;4569:1447::-;4799:12;;993:1:1;4799:33:0;4795:1221;;;4863:113;4891:9;4918:10;4946:5;:16;;;4863:10;:113::i;4795:1221::-;4997:12;;1526:2:1;4997:35:0;4993:1023;;;5063:115;5093:9;5120:10;5148:5;:16;;;5063:12;:115::i;4993:1023::-;5199:12;;953:1:1;5199:38:0;5195:821;;;5268:117;5301:8;5327:10;5355:5;:16;;;5268:15;:117::i;5195:821::-;5406:12;;785:1:1;5406:35:0;5402:614;;;5472:114;5502:8;5528:10;5556:5;:16;;;5472:12;:114::i;5402:614::-;5607:12;;826:1:1;5607:34:0;5603:413;;;5672:140;5701:9;5728:8;5754:10;5782:5;:16;;;5672:11;:140::i;5603:413::-;5858:147;5894:9;5921:8;5947:10;5975:5;:16;;;5858:18;:147::i;:::-;5843:162;;5603:413;6055:12;;6031:141;;;;;;6081:9;;6104:8;;6126:10;;6150:12;;6031:141;:::i;:::-;;;;;;;;2095:4084;;;;;;:::o;1271:969:7:-;1460:20;1557:27;;:::i;:::-;1598:10;1587:41;;;;;;;;;;;;:::i;:::-;1663:17;;1557:71;;-1:-1:-1;1638:55:7;;:24;;;;1682:10;1638:24;:55::i;:::-;1727:33;;;;;1703:21;;1727:18;;;;;;:33;;1754:4;;1727:33;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1703:57;;1771:12;1785:23;1824:4;:17;;;:22;;1887:4;:29;;;1934:4;:16;;;1968:4;:14;;;2022:10;2076:1;1847:244;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1824:268;;;;1847:244;1824:268;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1770:322;;;;2107:7;2102:59;;2130:20;:10;:18;:20::i;:::-;2177:56;2219:13;2177:8;:18;;;2204:4;2177:33;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:41;;:56::i;:::-;2170:63;1271:969;-1:-1:-1;;;;;;;;;1271:969:7:o;926:1389:15:-;1085:20;1121:28;1159:25;1208:22;1289:10;1278:55;;;;;;;;;;;;:::i;:::-;1483:11;;1244:89;;-1:-1:-1;1244:89:15;;-1:-1:-1;1498:1:15;-1:-1:-1;1483:16:15;;-1:-1:-1;1475:76:15;;;;;;;;;;;;:::i;:::-;;;;;;;;;1607:8;1582:33;;:4;1601:1;1587:4;:11;:15;1582:21;;;;;;;;;;;;;;:33;;;1561:139;;;;;;;;;;;;:::i;:::-;1784:85;1828:6;1849:10;1784:4;1789:1;1784:7;;;;;;;;;;;;;;:22;;;;:85;;;;;:::i;:::-;1904:362;;;;;1880:21;;1904:31;;;;;;:362;;1990:10;;2050:1;;2119:4;;2181;;2241:15;;1904:362;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1880:386;;2283:7;2306:1;2291:7;:14;:16;2283:25;;;;;;;;;;;;;;2276:32;;;;;926:1389;;;;;;:::o;2108:1339:17:-;2267:20;2303:25;2338:28;2390:22;2455:10;2444:55;;;;;;;;;;;;:::i;:::-;2649:11;;2426:73;;-1:-1:-1;2426:73:17;-1:-1:-1;2664:1:17;-1:-1:-1;2649:16:17;;-1:-1:-1;2641:76:17;;;;;;;;;;;;:::i;:::-;2773:8;2748:33;;:4;2767:1;2753:4;:11;:15;2748:21;;;;;;;;;;;;;;:33;;;2727:139;;;;;;;;;;;;:::i;:::-;2950:51;2981:6;2990:10;2950:4;2955:1;2950:7;;;;;;;:51;3036:362;;;;;3012:21;;3036:31;;;;;;:362;;3122:10;;3182:1;;3251:4;;3313;;3373:15;;3036:362;;;:::i;3936:2491:16:-;4127:20;4163:39;4228:10;4217:49;;;;;;;;;;;;:::i;:::-;4163:103;;4325:25;4353:115;4398:15;4427:9;4450:8;4353:31;:115::i;:::-;4325:143;;4537:4;4524:17;;:9;:17;;;4520:1871;;;4589:25;;;;;:13;:4;:13;;;;:25;;4603:10;;4589:25;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4711:274:16;;;;;:32;;;;-1:-1:-1;4711:32:16;;-1:-1:-1;4752:10:16;;4711:274;;4821:1;;4885:15;;4966:4;;4711:274;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4696:289;;4520:1871;;;5060:4;5048:16;;:8;:16;;;5044:1347;;;5128:101;:24;;;5178:8;5205:10;5128:24;:101::i;:::-;5325:250;;;;;:28;;;;;;:250;;5415:10;;5482:1;;5546:15;;5325:250;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5310:265;;5618:4;:12;;;5639;5618:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5044:1347;;;5780:101;:24;;;5830:8;5857:10;5780:24;:101::i;:::-;5977:403;;;;;:30;;;;;;:403;;6069:10;;6136:1;;;;6283:15;;6358:8;;5977:403;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5962:418;;5044:1347;6401:19;;3936:2491;;;;;;:::o;1665:805:3:-;1857:20;1929:18;1975:10;1951:73;;;;;;;;;;;;:::i;:::-;1928:96;-1:-1:-1;2034:85:3;:24;;;1928:96;2099:10;2034:24;:85::i;:::-;2213:221;;;;;:22;;;;;;:221;;2249:9;;2284:10;;2325:8;;2361:1;;2409:2;;2213:221;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;2195:239:3;1665:805;-1:-1:-1;;;;;;1665:805:3:o;2464:1709:10:-;2653:20;2690:24;2716:17;2760:10;2749:51;;;;;;;;;;;;:::i;:::-;2689:111;;;;2811:21;2863:4;2850:17;;:9;:17;;;2846:437;;2995:98;:24;;;3045:5;3069:10;2995:24;:98::i;:::-;2846:437;;;-1:-1:-1;3244:28:10;;;;;3220:10;;3244:13;:4;:13;;;;:28;;3220:10;;3244:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2846:437;3422:5;:19;;;3450:13;3520:4;3507:17;;:9;:17;;;:49;;3547:9;3507:49;;;3527:17;3507:49;3598:10;3663:4;3651:16;;:8;:16;;;:47;;3690:8;3651:47;;;3670:17;3651:47;3777:4;3846:2;3909:1;3969;3985:4;3422:577;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3407:592;;4070:4;4058:16;;:8;:16;;;4054:84;;;4090:4;:12;;;4111;4090:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4054:84;4147:19;;;2464:1709;;;;;;:::o;1559:1021:12:-;1752:20;1789:19;1823:10;1812:40;;;;;;;;;;;;:::i;:::-;1788:64;;1895:16;1942:4;1929:17;;:9;:17;;;1925:280;;;1962:25;;;;;:13;:4;:13;;;;:25;;1976:10;;1962:25;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2012:10;2001:21;;1925:280;;;2097:97;:24;;;2147:4;2170:10;2097:24;:97::i;:::-;2230:4;:9;;;2247:8;2283:4;2270:17;;:9;:17;;;:49;;2310:9;2270:49;;;2305:1;2270:49;2345:4;2333:16;;:8;:16;;;:47;;2372:8;2333:47;;;2367:1;2333:47;2394:10;2418:1;2441;2230:223;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2215:238;;2509:4;2497:16;;:8;:16;;;2493:81;;;2529:4;:12;;;2548;2529:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1559:1021;;;;;;;;:::o;1153:572:11:-;1344:20;1381:16;1412:10;1401:34;;;;;;;;;;;;:::i;:::-;1380:55;-1:-1:-1;1520:54:11;:24;;;1380:55;1563:10;1520:24;:54::i;:::-;1600:118;;;;;:12;;;;;;:118;;1626:9;;1649:8;;1671:10;;1703:4;;1600:118;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1585:133;1153:572;-1:-1:-1;;;;;;1153:572:11:o;1542:724:13:-;1731:20;1769:12;1796:10;1785:32;;;;;;;;;;;;:::i;:::-;1768:49;-1:-1:-1;1902:86:13;:24;;;1768:49;1968:10;1902:24;:86::i;:::-;2086:144;;;;;:19;;;;;;:144;;2119:9;;2142:10;;2166:8;;2219:1;;2086:144;;;:::i;1140:762:14:-;1329:20;1365:11;1390:10;1379:32;;;;;;;;;;;;:::i;:::-;1365:46;-1:-1:-1;1496:101:14;:40;;;1365:46;1577:10;1496:40;:101::i;:::-;1623:243;;;;;:15;;;;;;:243;;1652:9;;1675:8;;1738:10;;1798:1;;1837:15;:19;;;1623:243;;;:::i;1435:1201:8:-;1590:20;1627:18;1647:10;1659:15;1701:10;1690:50;;;;;;;;;;;;:::i;:::-;1626:114;;-1:-1:-1;1626:114:8;-1:-1:-1;1626:114:8;-1:-1:-1;1829:51:8;:24;;;1626:114;1869:10;1829:24;:51::i;:::-;1895:10;1891:709;;;2156:12;;;2166:1;2156:12;;;;;;;;;2001:181;;;;:18;;;;;;:181;;2071:10;;2137:1;;2001:181;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1986:196;;1891:709;;;2299:90;;;;;:26;;;;;;:90;;2343:4;;2365:10;;2299:90;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2563:12;;;2573:1;2563:12;;;;;;;;;2403:186;;;;2284:105;;-1:-1:-1;2403:17:8;;;;;;:186;;2284:105;;2535:10;;2403:186;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;1891:709;2610:19;;;1435:1201;;;;;:::o;1121:515:9:-;1278:20;1315:12;1329:15;1371:10;1360:39;;;;;;;;;;;;:::i;:::-;1314:85;;-1:-1:-1;1314:85:9;-1:-1:-1;1455:51:9;:24;;;1314:85;1495:10;1455:24;:51::i;:::-;1532:10;:97;;1600:29;;;;;:14;;;;;;:29;;1623:4;;1600:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1532:97;;;1557:28;;;;;:13;;;;;;:28;;1579:4;;1557:28;;;:::i;925:1341:6:-;1084:20;1120:25;1155:28;1207:22;1272:10;1261:55;;;;;;;;;;;;:::i;:::-;1466:11;;1243:73;;-1:-1:-1;1243:73:6;-1:-1:-1;1481:1:6;-1:-1:-1;1466:16:6;;-1:-1:-1;1458:76:6;;;;;;;;;;;;:::i;:::-;1590:8;1565:33;;:4;1584:1;1570:4;:11;:15;1565:21;;;;;;;;;;;;;;:33;;;1544:139;;;;;;;;;;;;:::i;1552:2154:4:-;1708:20;1779:35;1824:28;1876:22;2001:10;1990:51;;;;;;;;;;;;:::i;:::-;2191:11;;1912:129;;-1:-1:-1;1912:129:4;-1:-1:-1;2206:1:4;-1:-1:-1;2191:16:4;;-1:-1:-1;2183:73:4;;;;;;;;;;;;:::i;:::-;2312:8;2287:33;;:4;2306:1;2292:4;:11;:15;2287:21;;;;;;;;;;;;;;:33;;;:114;;;;1373:42;2337:43;;:4;2356:1;2342:4;:11;:15;2337:21;;;;;;;;;;;;;;:43;;;:63;;;;;2396:4;2384:16;;:8;:16;;;2337:63;2266:217;;;;;;;;;;;;:::i;:::-;2494:21;1373:42;2707:29;;:4;2712:1;2707:7;;;;;;;;;;;;;;:29;;;2703:358;;;2752:25;;;;;:13;:4;:13;;;;:25;;2766:10;;2752:25;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2807:10;2791:26;;2703:358;;;2905:145;2954:4;2959:1;2954:7;;;;;;;;;;;;;;2987:20;3026:10;2905:31;:145::i;:::-;3116:435;;;;;:34;;;;;;3158:13;;3116:435;;3186:4;;3279:10;;3338:1;;3420:4;;3462:1;;;;3116:435;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3101:450;;1373:42;3565:43;;:4;3584:1;3570:4;:11;:15;3565:21;;;;;;;;;;;;;;:43;;;3561:109;;;3624:4;:12;;;3644;3624:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3680:19;;;1552:2154;;;;;:::o;1805:752:5:-;1994:20;2031:11;2044:15;2074:10;2063:45;;;;;;;;;;;;:::i;:::-;2030:78;;;;2159:115;2204:9;2235:4;2254:10;2159:31;:115::i;:::-;2422:98;;;;;:18;;;;;;2448:3;;2422:98;;2474:8;;2505:4;;2422:98;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;2391:129:5;;1805:752;-1:-1:-1;;;;;;;;;1805:752:5:o;1018:695:18:-;1214:20;1251:27;1280:19;1326:10;1315:51;;;;;;;;;;;;:::i;:::-;1250:116;;-1:-1:-1;1250:116:18;-1:-1:-1;1420:89:18;:24;;;1250:116;1489:10;1420:24;:89::i;:::-;1534:172;;;;;:26;;;;;;:172;;1574:9;;1597:8;;1627:4;;1659:1;;1690:6;;1534:172;;;:::i;1987:267:22:-;2131:39;;;;;2173:6;;2131:15;;;;;;:39;;2155:4;;2162:7;;2131:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:48;2127:121;;;2195:42;2209:5;2216:7;2233:2;2195:13;:42::i;:::-;1987:267;;;:::o;1531:170:26:-;1674:9;1668:16;1661:4;1650:9;1646:20;1639:46;1625:373:24;1711:7;1742:1;1738;:5;1734:236;;;1759:200;1784:174;1844:62;1924:1;1943;1784:42;:174::i;:::-;1759:24;:200::i;:::-;-1:-1:-1;1986:5:24;;;1625:373;;;;;:::o;6912:523:16:-;7121:25;7241:4;7228:17;;:9;:17;;;:122;;7312:38;;;;;:27;;;;;;:38;;7340:9;;7312:38;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7228:122;;;7260:37;;;;;:27;;;;;;:37;;7288:8;;7260:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7217:133;-1:-1:-1;7368:31:16;;;7360:68;;;;;;;;;;;;:::i;2563:337:22:-;2698:21;2758:23;;;2795:2;2811:6;2722:105;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2837:56:22;2876:5;2722:105;2837:30;:56::i;:::-;2563:337;;;;:::o;1217:351::-;1359:21;1419:22;;;1455:7;1476:9;1383:112;;;;;;;;;:::i;1401:322:27:-;1554:12;818:10;1625:28;;1667:9;1690:1;1705;1589:127;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1401:322:27;;;;;:::o;6923:340:22:-;7055:15;7072:23;7099:6;:11;;7111:8;7099:21;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7054:66;;;;7134:10;:44;;;;;7148:30;7167:10;7148:18;:30::i;:::-;7130:81;;;7194:7;;;;7130:81;7220:36;7245:10;7220:24;:36::i;6923:340::-;;;:::o;6237:395::-;6337:17;6374:10;:17;6395:1;6374:22;6370:64;;;-1:-1:-1;6419:4:22;6412:11;;6370:64;6468:2;6447:10;:17;:23;6443:183;;6486:14;6503:38;6527:10;6539:1;6503:23;:38::i;:::-;6486:55;;6559:6;6569:1;6559:11;6555:61;;;6597:4;6590:11;;;;;6555:61;6443:183;;6237:395;;;:::o;16122:220:23:-;16243:14;16290:21;16302:1;16305:5;14422:14;14467:5;14475:2;14467:10;14456:1;:8;:21;14452:306;;;14493:254;14518:228;14583:95;14696:1;:8;14722:5;14730:2;14722:10;14518:47;:228::i;14493:254::-;-1:-1:-1;14936:13:23;14838:2;14936:13;14930:20;;14301:688::o;1334:378:25:-;1522:12;1274:10;1593:37;;1644:9;1667:6;1687:8;1557:148;;;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;164:722::-;;292:3;285:4;277:6;273:17;269:27;259:2;;-1:-1;;300:12;259:2;340:6;334:13;362:80;377:64;434:6;377:64;:::i;:::-;362:80;:::i;:::-;470:21;;;353:89;-1:-1;514:4;527:14;;;;502:17;;;616;;;607:27;;;;604:36;-1:-1;601:2;;;653:1;;643:12;601:2;678:1;663:217;688:6;685:1;682:13;663:217;;;89:6;83:13;101:33;128:5;101:33;:::i;:::-;756:61;;831:14;;;;859;;;;710:1;703:9;663:217;;;667:14;;;;;252:634;;;;:::o;3031:442::-;;3143:3;3136:4;3128:6;3124:17;3120:27;3110:2;;-1:-1;;3151:12;3110:2;3191:6;3185:13;3213:64;3228:48;3269:6;3228:48;:::i;3213:64::-;3204:73;;3297:6;3290:5;3283:21;3401:3;3333:4;3392:6;3325;3383:16;;3380:25;3377:2;;;3418:1;;3408:12;3377:2;3428:39;3460:6;3333:4;3359:5;3355:16;3333:4;3325:6;3321:17;3428:39;:::i;:::-;;3103:370;;;;:::o;4549:176::-;4639:20;;4664:56;4639:20;4664:56;:::i;8668:392::-;;8808:2;;8796:9;8787:7;8783:23;8779:32;8776:2;;;-1:-1;;8814:12;8776:2;8865:17;8859:24;8903:18;8895:6;8892:30;8889:2;;;-1:-1;;8925:12;8889:2;9012:22;;1698:4;1686:17;;1682:27;-1:-1;1672:2;;-1:-1;;1713:12;1672:2;1753:6;1747:13;1775:80;1790:64;1847:6;1790:64;:::i;1775:80::-;1883:21;;;1940:14;;;;1915:17;;;2029;;;2020:27;;;;2017:36;-1:-1;2014:2;;;-1:-1;;2056:12;2014:2;-1:-1;2082:10;;2076:217;2101:6;2098:1;2095:13;2076:217;;;8605:13;;2169:61;;2123:1;2116:9;;;;;2244:14;;;;2272;;2076:217;;;-1:-1;8945:99;8770:290;-1:-1;;;;;;;8770:290::o;9067:305::-;;9203:2;9191:9;9182:7;9178:23;9174:32;9171:2;;;-1:-1;;9209:12;9171:2;3586:6;3580:13;3598:54;3646:5;3598:54;:::i;9379:572::-;;;9558:2;9546:9;9537:7;9533:23;9529:32;9526:2;;;-1:-1;;9564:12;9526:2;3770:6;3764:13;3782:55;3831:5;3782:55;:::i;:::-;9770:2;9755:18;;9749:25;9616:96;;-1:-1;9794:18;9783:30;;9780:2;;;-1:-1;;9816:12;9780:2;9846:89;9927:7;9918:6;9907:9;9903:22;9846:89;:::i;:::-;9836:99;;;9520:431;;;;;:::o;9958:597::-;;;;10138:2;10126:9;10117:7;10113:23;10109:32;10106:2;;;-1:-1;;10144:12;10106:2;4130:6;4124:13;4142:53;4189:5;4142:53;:::i;:::-;10327:2;10391:22;;4472:13;10196:94;;-1:-1;4490:47;4472:13;4490:47;:::i;:::-;10460:2;10507:22;;2382:13;10335:88;;-1:-1;46646:13;;46639:21;52102:32;;52092:2;;-1:-1;;52138:12;52092:2;10468:71;;;;10100:455;;;;;:::o;10562:425::-;;;10707:2;10695:9;10686:7;10682:23;10678:32;10675:2;;;-1:-1;;10713:12;10675:2;4307:6;4301:13;4319:49;4362:5;4319:49;:::i;:::-;10892:2;10939:22;;2382:13;10765:90;;-1:-1;46646:13;;46639:21;52102:32;;52092:2;;-1:-1;;52138:12;52092:2;10900:71;;;;10669:318;;;;;:::o;10994:550::-;;;11162:2;11150:9;11141:7;11137:23;11133:32;11130:2;;;-1:-1;;11168:12;11130:2;4843:6;4837:13;4855:60;4909:5;4855:60;:::i;:::-;11379:2;11364:18;;11358:25;11220:101;;-1:-1;11403:18;11392:30;;11389:2;;;-1:-1;;11425:12;11389:2;11455:73;11520:7;11511:6;11500:9;11496:22;11455:73;:::i;13982:582::-;;;14166:2;14154:9;14145:7;14141:23;14137:32;14134:2;;;-1:-1;;14172:12;14571:851;;;;;14800:3;14788:9;14779:7;14775:23;14771:33;14768:2;;;-1:-1;;14807:12;14768:2;14865:17;14852:31;14903:18;;14895:6;14892:30;14889:2;;;-1:-1;;14925:12;14889:2;15004:22;;;;14800:3;6692:19;;;6688:30;6685:2;;;-1:-1;;6721:12;6685:2;6749:20;14800:3;6749:20;:::i;:::-;8470:6;8457:20;6835:16;6828:75;6976:2;;7034:9;7030:22;8457:20;6976:2;6995:5;6991:16;6984:75;7132:2;7190:9;7186:22;8457:20;7132:2;7151:5;7147:16;7140:75;7310:2;7299:9;7295:18;7282:32;14903:18;7326:6;7323:30;7320:2;;;-1:-1;;7356:12;7320:2;7446:6;7435:9;7431:22;;;;2683:3;2676:4;2668:6;2664:17;2660:27;2650:2;;-1:-1;;2691:12;2650:2;2738:6;2725:20;2711:34;;2760:64;2775:48;2816:6;2775:48;:::i;2760:64::-;2844:6;2837:5;2830:21;2948:3;6976:2;2939:6;2872;2930:16;;2927:25;2924:2;;;-1:-1;;2955:12;2924:2;2975:41;3009:6;6976:2;2906:5;2902:16;6976:2;2872:6;2868:17;2975:41;:::i;:::-;7401:58;7310:2;7387:5;7383:16;7376:84;;14945:91;;;15091:76;15159:7;6976:2;15139:9;15135:22;15091:76;:::i;:::-;15081:86;;;;;;15222:76;15290:7;7132:2;15270:9;15266:22;15222:76;:::i;:::-;14762:660;;;;-1:-1;15212:86;;7310:2;15374:22;8457:20;;-1:-1;;14762:660::o;15429:330::-;;15577:3;15565:9;15556:7;15552:23;15548:33;15545:2;;;-1:-1;;15584:12;15545:2;7697:20;15577:3;7697:20;:::i;:::-;89:6;83:13;101:33;128:5;101:33;:::i;:::-;7782:86;;7949:2;8013:22;;2519:13;46744:66;46733:78;;52222:34;;52212:2;;-1:-1;;52260:12;52212:2;7949;7964:16;;7957:85;8110:2;8174:22;;6494:13;6512:32;6494:13;6512:32;:::i;:::-;8110:2;8125:16;;8118:85;8269:2;8333:22;;6494:13;6512:32;6494:13;6512:32;:::i;:::-;8269:2;8284:16;;8277:85;8288:5;15539:220;-1:-1;;;15539:220::o;15766:263::-;;15881:2;15869:9;15860:7;15856:23;15852:32;15849:2;;;-1:-1;;15887:12;15849:2;-1:-1;8605:13;;15843:186;-1:-1;15843:186::o;16036:435::-;;;16186:2;16174:9;16165:7;16161:23;16157:32;16154:2;;;-1:-1;;16192:12;16154:2;8611:6;8605:13;16244:74;;16355:2;16427:9;16423:22;3945:13;3963:51;4008:5;3963:51;:::i;16478:399::-;;;16610:2;16598:9;16589:7;16585:23;16581:32;16578:2;;;-1:-1;;16616:12;16578:2;-1:-1;;8605:13;;16779:2;16829:22;;;8605:13;;;;;-1:-1;16572:305::o;16884:718::-;;;;;17073:3;17061:9;17052:7;17048:23;17044:33;17041:2;;;-1:-1;;17080:12;17041:2;8611:6;8605:13;17132:74;;17243:2;;17297:9;17293:22;8605:13;17251:74;;17362:2;17416:9;17412:22;8605:13;17370:74;;1039:3;1020:17;17558:9;1020:17;1016:27;1006:2;;-1:-1;;1047:12;1006:2;1100:78;44401:17;1100:78;:::i;:::-;1184:16;17481:2;17558:9;17554:22;1301:3;17073;17558:9;1272:27;1269:36;1266:2;;;-1:-1;;1308:12;1266:2;-1:-1;1328:217;1081:4;1350:1;1347:13;1328:217;;;8605:13;;1421:61;;1496:14;;;;1524;;;;1375:1;1368:9;1328:217;;;1332:14;;17489:97;;;;;;17035:567;;;;;;;:::o;18297:805::-;;18536:5;45386:12;45824:6;45819:3;45812:19;45861:4;;45856:3;45852:14;18548:93;;45861:4;18735:5;45217:14;-1:-1;18774:306;18799:6;18796:1;18793:13;18774:306;;;18860:13;;49236:42;49225:54;19908:64;;17809:14;;;;45667;;;;18821:1;18814:9;18774:306;;;-1:-1;19086:10;;18444:658;-1:-1;;;;;18444:658::o;19110:343::-;;19252:5;45386:12;45824:6;45819:3;45812:19;19345:52;19390:6;45861:4;45856:3;45852:14;45861:4;19371:5;19367:16;19345:52;:::i;:::-;51654:2;51634:14;51650:7;51630:28;19409:39;;;;45861:4;19409:39;;19200:253;-1:-1;;19200:253::o;24899:271::-;;19620:5;45386:12;19731:52;19776:6;19771:3;19764:4;19757:5;19753:16;19731:52;:::i;:::-;19795:16;;;;;25033:137;-1:-1;;25033:137::o;25177:222::-;49236:42;49225:54;;;;18073:45;;25304:2;25289:18;;25275:124::o;25406:333::-;49236:42;49225:54;;;18073:45;;49225:54;;25725:2;25710:18;;18073:45;25561:2;25546:18;;25532:207::o;25746:333::-;49236:42;49225:54;;;;18073:45;;26065:2;26050:18;;24850:37;25901:2;25886:18;;25872:207::o;26086:1022::-;;26450:3;26472:17;26465:47;26526:131;26450:3;26439:9;26435:19;26643:6;26526:131;:::i;:::-;26736:2;26721:18;;24850:37;;;;-1:-1;26827:2;26812:18;;20896:58;;;;49236:42;49225:54;;;26910:2;26895:18;;18073:45;49225:54;;27001:3;26986:19;;17916:58;27093:3;27078:19;;;20896:58;26518:139;26421:687;-1:-1;26421:687::o;27758:860::-;;49236:42;;46456:5;49225:54;19915:3;19908:64;49236:42;46456:5;49225:54;28280:2;28269:9;28265:18;19908:64;49236:42;18111:5;49225:54;28363:2;28352:9;28348:18;18073:45;;50614:24;28454:2;28443:9;28439:18;20896:58;28069:3;28491;28480:9;28476:19;28469:49;28532:76;28069:3;28058:9;28054:19;28594:6;28532:76;:::i;:::-;28524:84;28040:578;-1:-1;;;;;;;28040:578::o;28625:648::-;49236:42;49225:54;;;19908:64;;49225:54;;;29093:2;29078:18;;19908:64;29176:2;29161:18;;24850:37;;;;49225:54;;;29259:2;29244:18;;18073:45;28882:3;28867:19;;28853:420::o;29280:792::-;49236:42;49225:54;;;19908:64;;49225:54;;;29792:2;29777:18;;19908:64;29875:2;29860:18;;24850:37;;;;29966:2;29951:18;;20896:58;49225:54;;;30057:3;30042:19;;17916:58;29581:3;29566:19;;29552:520::o;30079:776::-;49236:42;49225:54;;;19908:64;;49225:54;;;;30583:2;30568:18;;19908:64;30666:2;30651:18;;24850:37;;;;30757:2;30742:18;;20896:58;30840:3;30825:19;;24850:37;;;;30372:3;30357:19;;30343:512::o;30862:1260::-;;31289:3;49236:42;;19965:5;49225:54;19915:3;19908:64;24880:5;31477:2;31466:9;31462:18;24850:37;49236:42;19965:5;49225:54;31583:2;31572:9;31568:18;19908:64;49236:42;18111:5;49225:54;31682:2;31671:9;31667:18;18073:45;24880:5;31765:3;31754:9;31750:19;24850:37;20947:5;31857:3;31846:9;31842:19;20896:58;49236:42;18111:5;49225:54;31957:3;31946:9;31942:19;18073:45;;31289:3;31995;31984:9;31980:19;31973:49;32036:76;31289:3;31278:9;31274:19;32098:6;32036:76;:::i;:::-;32028:84;31260:862;-1:-1;;;;;;;;;;;31260:862::o;32129:664::-;49236:42;49225:54;;;19908:64;;32582:2;32567:18;;24850:37;;;;49225:54;;32688:2;32673:18;;19908:64;32779:2;32764:18;;20896:58;;;;32394:3;32379:19;;32365:428::o;32800:776::-;49236:42;49225:54;;;19908:64;;33281:2;33266:18;;24850:37;;;;49225:54;;;;33387:2;33372:18;;19908:64;33478:2;33463:18;;20896:58;;;;33561:3;33546:19;;24850:37;;;;33093:3;33078:19;;33064:512::o;33583:480::-;33784:2;33769:18;;51760:1;51750:12;;51740:2;;51766:9;51740:2;20421:68;;;33966:2;33951:18;;24850:37;;;;34049:2;34034:18;;;24850:37;33755:308;:::o;34070:510::-;34286:2;34271:18;;51893:1;51883:12;;51873:2;;51899:9;34587:560;49141:2;49130:21;;;20769:36;;49130:21;;;;34961:2;34946:18;;20769:36;35044:2;35029:18;;24850:37;49441:4;49430:16;;;35133:2;35118:18;;21192:56;34800:3;34785:19;;34771:376::o;35154:460::-;20896:58;;;35517:2;35502:18;;24850:37;;;;49236:42;49225:54;35600:2;35585:18;;18073:45;35345:2;35330:18;;35316:298::o;35621:416::-;35821:2;35835:47;;;21485:2;35806:18;;;45812:19;21521:26;45852:14;;;21501:47;21567:12;;;35792:245::o;36044:416::-;36244:2;36258:47;;;21818:2;36229:18;;;45812:19;21854:34;45852:14;;;21834:55;21923:14;21909:12;;;21902:36;21957:12;;;36215:245::o;36467:416::-;36667:2;36681:47;;;22208:2;36652:18;;;45812:19;22244:34;45852:14;;;22224:55;22313:17;22299:12;;;22292:39;22350:12;;;36638:245::o;36890:416::-;37090:2;37104:47;;;22601:2;37075:18;;;45812:19;22637:34;45852:14;;;22617:55;22706:17;22692:12;;;22685:39;22743:12;;;37061:245::o;37313:416::-;37513:2;37527:47;;;22994:2;37498:18;;;45812:19;23030:34;45852:14;;;23010:55;23099:26;23085:12;;;23078:48;23145:12;;;37484:245::o;37736:416::-;37936:2;37950:47;;;23396:2;37921:18;;;45812:19;23432:34;45852:14;;;23412:55;23501:29;23487:12;;;23480:51;23550:12;;;37907:245::o;38159:416::-;38359:2;38373:47;;;23801:2;38344:18;;;45812:19;23837:34;45852:14;;;23817:55;23906:29;23892:12;;;23885:51;23955:12;;;38330:245::o;38582:416::-;38782:2;38796:47;;;24206:2;38767:18;;;45812:19;24242:34;45852:14;;;24222:55;24311:29;24297:12;;;24290:51;24360:12;;;38753:245::o;39005:416::-;39205:2;39219:47;;;24611:2;39190:18;;;45812:19;24647:34;45852:14;;;24627:55;24716:17;24702:12;;;24695:39;24753:12;;;39176:245::o;39428:222::-;24850:37;;;39555:2;39540:18;;39526:124::o;39657:760::-;24850:37;;;49236:42;49225:54;;;40130:2;40115:18;;19908:64;49225:54;;;;40236:2;40221:18;;19908:64;40319:2;40304:18;;24850:37;;;;40402:3;40387:19;;24850:37;39942:3;39927:19;;39913:504::o;40424:878::-;;24880:5;24857:3;24850:37;50614:24;40917:2;40906:9;40902:18;20896:58;40744:3;40954:2;40943:9;40939:18;40932:48;40994:131;40744:3;40733:9;40729:19;41111:6;40994:131;:::i;:::-;49236:42;49225:54;;;;41204:2;41189:18;;18073:45;-1:-1;41287:3;41272:19;24850:37;40986:139;40715:587;-1:-1;;;40715:587::o;41309:544::-;;24880:5;24857:3;24850:37;50614:24;41690:2;41679:9;41675:18;20896:58;41518:2;41727;41716:9;41712:18;41705:48;41767:76;41518:2;41507:9;41503:18;41829:6;41767:76;:::i;:::-;41759:84;41489:364;-1:-1;;;;;41489:364::o;41860:746::-;24850:37;;;42311:2;42296:18;;20896:58;;;;42402:2;42387:18;;20896:58;;;;42485:2;42470:18;;24850:37;49236:42;49225:54;42591:3;42576:19;;19908:64;42138:3;42123:19;;42109:497::o;42613:460::-;24850:37;;;42976:2;42961:18;;20896:58;;;;43059:2;43044:18;;24850:37;42804:2;42789:18;;42775:298::o;43615:256::-;43677:2;43671:9;43703:17;;;43778:18;43763:34;;43799:22;;;43760:62;43757:2;;;43835:1;;43825:12;43757:2;43677;43844:22;43655:216;;-1:-1;43655:216::o;43878:304::-;;44037:18;44029:6;44026:30;44023:2;;;-1:-1;;44059:12;44023:2;-1:-1;44104:4;44092:17;;;44157:15;;43960:222::o;44751:321::-;;44894:18;44886:6;44883:30;44880:2;;;-1:-1;;44916:12;44880:2;-1:-1;44993:4;44970:17;44989:9;44966:33;45057:4;45047:15;;44817:255::o;51136:145::-;51217:6;51212:3;51207;51194:30;-1:-1;51273:1;51255:16;;51248:27;51187:94::o;51290:268::-;51355:1;51362:101;51376:6;51373:1;51370:13;51362:101;;;51443:11;;;51437:18;51424:11;;;51417:39;51398:2;51391:10;51362:101;;;51478:6;51475:1;51472:13;51469:2;;;-1:-1;;51355:1;51525:16;;51518:27;51339:219::o;51922:117::-;49236:42;52009:5;49225:54;51984:5;51981:35;51971:2;;52030:1;;52020:12;51971:2;51965:74;:::o;54954:115::-;55039:5;49141:2;49130:21;55015:5;55012:34;55002:2;;55060:1;;55050:12"
|
|
},
|
|
"methodIdentifiers": {
|
|
"BANCOR_ETH_ADDRESS()": "8dc669fa",
|
|
"trade((uint256,uint256,uint256,bytes),address,address,uint256)": "df2b2737"
|
|
}
|
|
}
|
|
},
|
|
"sourceTreeHashHex": "0xe8fcb60d69d06b4b0c28fd5a7ce02b45c5205f120986095104d5a5f681c10c72",
|
|
"sources": {
|
|
"./BridgeAdapter.sol": {
|
|
"id": 0,
|
|
"content": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\npragma experimental ABIEncoderV2;\n\nimport \"./IBridgeAdapter.sol\";\nimport \"./BridgeSource.sol\";\nimport \"./mixins/MixinBalancer.sol\";\nimport \"./mixins/MixinBancor.sol\";\nimport \"./mixins/MixinCoFiX.sol\";\nimport \"./mixins/MixinCurve.sol\";\nimport \"./mixins/MixinCryptoCom.sol\";\nimport \"./mixins/MixinDodo.sol\";\nimport \"./mixins/MixinDodoV2.sol\";\nimport \"./mixins/MixinKyber.sol\";\nimport \"./mixins/MixinMooniswap.sol\";\nimport \"./mixins/MixinMStable.sol\";\nimport \"./mixins/MixinOasis.sol\";\nimport \"./mixins/MixinShell.sol\";\nimport \"./mixins/MixinSushiswap.sol\";\nimport \"./mixins/MixinUniswap.sol\";\nimport \"./mixins/MixinUniswapV2.sol\";\nimport \"./mixins/MixinZeroExBridge.sol\";\n\ncontract BridgeAdapter is\n IBridgeAdapter,\n MixinBalancer,\n MixinBancor,\n MixinCoFiX,\n MixinCurve,\n MixinCryptoCom,\n MixinDodo,\n MixinDodoV2,\n MixinKyber,\n MixinMooniswap,\n MixinMStable,\n MixinOasis,\n MixinShell,\n MixinSushiswap,\n MixinUniswap,\n MixinUniswapV2,\n MixinZeroExBridge\n{\n constructor(IEtherTokenV06 weth)\n public\n MixinBalancer()\n MixinBancor(weth)\n MixinCoFiX()\n MixinCurve()\n MixinCryptoCom()\n MixinDodo()\n MixinDodoV2()\n MixinKyber(weth)\n MixinMooniswap(weth)\n MixinMStable()\n MixinOasis()\n MixinShell()\n MixinSushiswap()\n MixinUniswap(weth)\n MixinUniswapV2()\n MixinZeroExBridge()\n {}\n\n function trade(\n BridgeOrder memory order,\n IERC20TokenV06 sellToken,\n IERC20TokenV06 buyToken,\n uint256 sellAmount\n )\n public\n override\n returns (uint256 boughtAmount)\n {\n if (order.source == BridgeSource.CURVE ||\n order.source == BridgeSource.SWERVE ||\n order.source == BridgeSource.SNOWSWAP) {\n boughtAmount = _tradeCurve(\n sellToken,\n buyToken,\n sellAmount,\n order.bridgeData\n );\n } else if (order.source == BridgeSource.SUSHISWAP) {\n boughtAmount = _tradeSushiswap(\n buyToken,\n sellAmount,\n order.bridgeData\n );\n } else if (order.source == BridgeSource.UNISWAPV2 ||\n order.source == BridgeSource.LINKSWAP) {\n boughtAmount = _tradeUniswapV2(\n buyToken,\n sellAmount,\n order.bridgeData\n );\n } else if (order.source == BridgeSource.UNISWAP) {\n boughtAmount = _tradeUniswap(\n sellToken,\n buyToken,\n sellAmount,\n order.bridgeData\n );\n } else if (order.source == BridgeSource.BALANCER ||\n order.source == BridgeSource.CREAM) {\n boughtAmount = _tradeBalancer(\n sellToken,\n buyToken,\n sellAmount,\n order.bridgeData\n );\n } else if (order.source == BridgeSource.KYBER) {\n boughtAmount = _tradeKyber(\n sellToken,\n buyToken,\n sellAmount,\n order.bridgeData\n );\n } else if (order.source == BridgeSource.MOONISWAP) {\n boughtAmount = _tradeMooniswap(\n sellToken,\n buyToken,\n sellAmount,\n order.bridgeData\n );\n } else if (order.source == BridgeSource.MSTABLE) {\n boughtAmount = _tradeMStable(\n sellToken,\n buyToken,\n sellAmount,\n order.bridgeData\n );\n } else if (order.source == BridgeSource.OASIS) {\n boughtAmount = _tradeOasis(\n sellToken,\n buyToken,\n sellAmount,\n order.bridgeData\n );\n } else if (order.source == BridgeSource.SHELL) {\n boughtAmount = _tradeShell(\n sellToken,\n buyToken,\n sellAmount,\n order.bridgeData\n );\n } else if (order.source == BridgeSource.DODO) {\n boughtAmount = _tradeDodo(\n sellToken,\n sellAmount,\n order.bridgeData\n );\n } else if (order.source == BridgeSource.DODOV2) {\n boughtAmount = _tradeDodoV2(\n sellToken,\n sellAmount,\n order.bridgeData\n );\n } else if (order.source == BridgeSource.CRYPTOCOM) {\n boughtAmount = _tradeCryptoCom(\n buyToken,\n sellAmount,\n order.bridgeData\n );\n } else if (order.source == BridgeSource.BANCOR) {\n boughtAmount = _tradeBancor(\n buyToken,\n sellAmount,\n order.bridgeData\n );\n } else if (order.source == BridgeSource.COFIX) {\n boughtAmount = _tradeCoFiX(\n sellToken,\n buyToken,\n sellAmount,\n order.bridgeData\n );\n } else {\n boughtAmount = _tradeZeroExBridge(\n sellToken,\n buyToken,\n sellAmount,\n order.bridgeData\n );\n }\n\n emit BridgeFill(\n order.source,\n sellToken,\n buyToken,\n sellAmount,\n boughtAmount\n );\n }\n}\n"
|
|
},
|
|
"./IBridgeAdapter.sol": {
|
|
"id": 2,
|
|
"content": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol\";\n\n\ninterface IBridgeAdapter {\n\n struct BridgeOrder {\n uint256 source;\n uint256 takerTokenAmount;\n uint256 makerTokenAmount;\n bytes bridgeData;\n }\n\n /// @dev Emitted when tokens are swapped with an external source.\n /// @param source The unique ID for the source. See `BridgeSource.sol`\n /// @param inputToken The token the bridge is converting from.\n /// @param outputToken The token the bridge is converting to.\n /// @param inputTokenAmount Amount of input token sold.\n /// @param outputTokenAmount Amount of output token bought.\n event BridgeFill(\n uint256 source,\n IERC20TokenV06 inputToken,\n IERC20TokenV06 outputToken,\n uint256 inputTokenAmount,\n uint256 outputTokenAmount\n );\n\n function trade(\n BridgeOrder calldata order,\n IERC20TokenV06 sellToken,\n IERC20TokenV06 buyToken,\n uint256 sellAmount\n )\n external\n returns (uint256 boughtAmount);\n}\n"
|
|
},
|
|
"@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol": {
|
|
"id": 20,
|
|
"content": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\n\n\ninterface IERC20TokenV06 {\n\n // solhint-disable no-simple-event-func-name\n event Transfer(\n address indexed from,\n address indexed to,\n uint256 value\n );\n\n event Approval(\n address indexed owner,\n address indexed spender,\n uint256 value\n );\n\n /// @dev send `value` token to `to` from `msg.sender`\n /// @param to The address of the recipient\n /// @param value The amount of token to be transferred\n /// @return True if transfer was successful\n function transfer(address to, uint256 value)\n external\n returns (bool);\n\n /// @dev send `value` token to `to` from `from` on the condition it is approved by `from`\n /// @param from The address of the sender\n /// @param to The address of the recipient\n /// @param value The amount of token to be transferred\n /// @return True if transfer was successful\n function transferFrom(\n address from,\n address to,\n uint256 value\n )\n external\n returns (bool);\n\n /// @dev `msg.sender` approves `spender` to spend `value` tokens\n /// @param spender The address of the account able to transfer the tokens\n /// @param value The amount of wei to be approved for transfer\n /// @return Always true if the call has enough gas to complete execution\n function approve(address spender, uint256 value)\n external\n returns (bool);\n\n /// @dev Query total supply of token\n /// @return Total supply of token\n function totalSupply()\n external\n view\n returns (uint256);\n\n /// @dev Get the balance of `owner`.\n /// @param owner The address from which the balance will be retrieved\n /// @return Balance of owner\n function balanceOf(address owner)\n external\n view\n returns (uint256);\n\n /// @dev Get the allowance for `spender` to spend from `owner`.\n /// @param owner The address of the account owning tokens\n /// @param spender The address of the account able to transfer the tokens\n /// @return Amount of remaining tokens allowed to spent\n function allowance(address owner, address spender)\n external\n view\n returns (uint256);\n\n /// @dev Get the number of decimals this token has.\n function decimals()\n external\n view\n returns (uint8);\n}\n"
|
|
},
|
|
"./BridgeSource.sol": {
|
|
"id": 1,
|
|
"content": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\npragma experimental ABIEncoderV2;\n\n\nlibrary BridgeSource {\n uint256 constant internal BALANCER = 0;\n uint256 constant internal BANCOR = 1;\n uint256 constant internal COFIX = 2;\n uint256 constant internal CURVE = 3;\n uint256 constant internal CREAM = 4;\n uint256 constant internal CRYPTOCOM = 5;\n uint256 constant internal DODO = 6;\n uint256 constant internal KYBER = 7;\n uint256 constant internal LIQUIDITYPROVIDER = 8;\n uint256 constant internal MOONISWAP = 9;\n uint256 constant internal MSTABLE = 10;\n uint256 constant internal OASIS = 11;\n uint256 constant internal SHELL = 12;\n uint256 constant internal SNOWSWAP = 13;\n uint256 constant internal SUSHISWAP = 14;\n uint256 constant internal SWERVE = 15;\n uint256 constant internal UNISWAP = 16;\n uint256 constant internal UNISWAPV2 = 17;\n uint256 constant internal DODOV2 = 18;\n uint256 constant internal LINKSWAP = 19;\n // New sources should be APPENDED to this list, taking the next highest\n // integer value.\n}\n"
|
|
},
|
|
"./mixins/MixinBalancer.sol": {
|
|
"id": 3,
|
|
"content": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\n\nimport \"@0x/contracts-erc20/contracts/src/v06/LibERC20TokenV06.sol\";\nimport \"@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol\";\n\ninterface IBalancerPool {\n /// @dev Sell `tokenAmountIn` of `tokenIn` and receive `tokenOut`.\n /// @param tokenIn The token being sold\n /// @param tokenAmountIn The amount of `tokenIn` to sell.\n /// @param tokenOut The token being bought.\n /// @param minAmountOut The minimum amount of `tokenOut` to buy.\n /// @param maxPrice The maximum value for `spotPriceAfter`.\n /// @return tokenAmountOut The amount of `tokenOut` bought.\n /// @return spotPriceAfter The new marginal spot price of the given\n /// token pair for this pool.\n function swapExactAmountIn(\n IERC20TokenV06 tokenIn,\n uint tokenAmountIn,\n IERC20TokenV06 tokenOut,\n uint minAmountOut,\n uint maxPrice\n ) external returns (uint tokenAmountOut, uint spotPriceAfter);\n}\n\ncontract MixinBalancer {\n\n using LibERC20TokenV06 for IERC20TokenV06;\n\n function _tradeBalancer(\n IERC20TokenV06 sellToken,\n IERC20TokenV06 buyToken,\n uint256 sellAmount,\n bytes memory bridgeData\n )\n internal\n returns (uint256 boughtAmount)\n {\n // Decode the bridge data.\n (IBalancerPool pool) = abi.decode(\n bridgeData,\n (IBalancerPool)\n );\n sellToken.approveIfBelow(\n address(pool),\n sellAmount\n );\n // Sell all of this contract's `sellToken` token balance.\n (boughtAmount,) = pool.swapExactAmountIn(\n sellToken, // tokenIn\n sellAmount, // tokenAmountIn\n buyToken, // tokenOut\n 1, // minAmountOut\n uint256(-1) // maxPrice\n );\n return boughtAmount;\n }\n}\n"
|
|
},
|
|
"@0x/contracts-erc20/contracts/src/v06/LibERC20TokenV06.sol": {
|
|
"id": 22,
|
|
"content": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\n\nimport \"@0x/contracts-utils/contracts/src/v06/errors/LibRichErrorsV06.sol\";\nimport \"@0x/contracts-utils/contracts/src/v06/LibBytesV06.sol\";\nimport \"./IERC20TokenV06.sol\";\n\n\nlibrary LibERC20TokenV06 {\n bytes constant private DECIMALS_CALL_DATA = hex\"313ce567\";\n\n /// @dev Calls `IERC20TokenV06(token).approve()`.\n /// Reverts if the result fails `isSuccessfulResult()` or the call reverts.\n /// @param token The address of the token contract.\n /// @param spender The address that receives an allowance.\n /// @param allowance The allowance to set.\n function compatApprove(\n IERC20TokenV06 token,\n address spender,\n uint256 allowance\n )\n internal\n {\n bytes memory callData = abi.encodeWithSelector(\n token.approve.selector,\n spender,\n allowance\n );\n _callWithOptionalBooleanResult(address(token), callData);\n }\n\n /// @dev Calls `IERC20TokenV06(token).approve()` and sets the allowance to the\n /// maximum if the current approval is not already >= an amount.\n /// Reverts if the result fails `isSuccessfulResult()` or the call reverts.\n /// @param token The address of the token contract.\n /// @param spender The address that receives an allowance.\n /// @param amount The minimum allowance needed.\n function approveIfBelow(\n IERC20TokenV06 token,\n address spender,\n uint256 amount\n )\n internal\n {\n if (token.allowance(address(this), spender) < amount) {\n compatApprove(token, spender, uint256(-1));\n }\n }\n\n /// @dev Calls `IERC20TokenV06(token).transfer()`.\n /// Reverts if the result fails `isSuccessfulResult()` or the call reverts.\n /// @param token The address of the token contract.\n /// @param to The address that receives the tokens\n /// @param amount Number of tokens to transfer.\n function compatTransfer(\n IERC20TokenV06 token,\n address to,\n uint256 amount\n )\n internal\n {\n bytes memory callData = abi.encodeWithSelector(\n token.transfer.selector,\n to,\n amount\n );\n _callWithOptionalBooleanResult(address(token), callData);\n }\n\n /// @dev Calls `IERC20TokenV06(token).transferFrom()`.\n /// Reverts if the result fails `isSuccessfulResult()` or the call reverts.\n /// @param token The address of the token contract.\n /// @param from The owner of the tokens.\n /// @param to The address that receives the tokens\n /// @param amount Number of tokens to transfer.\n function compatTransferFrom(\n IERC20TokenV06 token,\n address from,\n address to,\n uint256 amount\n )\n internal\n {\n bytes memory callData = abi.encodeWithSelector(\n token.transferFrom.selector,\n from,\n to,\n amount\n );\n _callWithOptionalBooleanResult(address(token), callData);\n }\n\n /// @dev Retrieves the number of decimals for a token.\n /// Returns `18` if the call reverts.\n /// @param token The address of the token contract.\n /// @return tokenDecimals The number of decimals places for the token.\n function compatDecimals(IERC20TokenV06 token)\n internal\n view\n returns (uint8 tokenDecimals)\n {\n tokenDecimals = 18;\n (bool didSucceed, bytes memory resultData) = address(token).staticcall(DECIMALS_CALL_DATA);\n if (didSucceed && resultData.length >= 32) {\n tokenDecimals = uint8(LibBytesV06.readUint256(resultData, 0));\n }\n }\n\n /// @dev Retrieves the allowance for a token, owner, and spender.\n /// Returns `0` if the call reverts.\n /// @param token The address of the token contract.\n /// @param owner The owner of the tokens.\n /// @param spender The address the spender.\n /// @return allowance_ The allowance for a token, owner, and spender.\n function compatAllowance(IERC20TokenV06 token, address owner, address spender)\n internal\n view\n returns (uint256 allowance_)\n {\n (bool didSucceed, bytes memory resultData) = address(token).staticcall(\n abi.encodeWithSelector(\n token.allowance.selector,\n owner,\n spender\n )\n );\n if (didSucceed && resultData.length >= 32) {\n allowance_ = LibBytesV06.readUint256(resultData, 0);\n }\n }\n\n /// @dev Retrieves the balance for a token owner.\n /// Returns `0` if the call reverts.\n /// @param token The address of the token contract.\n /// @param owner The owner of the tokens.\n /// @return balance The token balance of an owner.\n function compatBalanceOf(IERC20TokenV06 token, address owner)\n internal\n view\n returns (uint256 balance)\n {\n (bool didSucceed, bytes memory resultData) = address(token).staticcall(\n abi.encodeWithSelector(\n token.balanceOf.selector,\n owner\n )\n );\n if (didSucceed && resultData.length >= 32) {\n balance = LibBytesV06.readUint256(resultData, 0);\n }\n }\n\n /// @dev Check if the data returned by a non-static call to an ERC20 token\n /// is a successful result. Supported functions are `transfer()`,\n /// `transferFrom()`, and `approve()`.\n /// @param resultData The raw data returned by a non-static call to the ERC20 token.\n /// @return isSuccessful Whether the result data indicates success.\n function isSuccessfulResult(bytes memory resultData)\n internal\n pure\n returns (bool isSuccessful)\n {\n if (resultData.length == 0) {\n return true;\n }\n if (resultData.length >= 32) {\n uint256 result = LibBytesV06.readUint256(resultData, 0);\n if (result == 1) {\n return true;\n }\n }\n }\n\n /// @dev Executes a call on address `target` with calldata `callData`\n /// and asserts that either nothing was returned or a single boolean\n /// was returned equal to `true`.\n /// @param target The call target.\n /// @param callData The abi-encoded call data.\n function _callWithOptionalBooleanResult(\n address target,\n bytes memory callData\n )\n private\n {\n (bool didSucceed, bytes memory resultData) = target.call(callData);\n if (didSucceed && isSuccessfulResult(resultData)) {\n return;\n }\n LibRichErrorsV06.rrevert(resultData);\n }\n}\n"
|
|
},
|
|
"@0x/contracts-utils/contracts/src/v06/errors/LibRichErrorsV06.sol": {
|
|
"id": 26,
|
|
"content": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\n\n\nlibrary LibRichErrorsV06 {\n\n // bytes4(keccak256(\"Error(string)\"))\n bytes4 internal constant STANDARD_ERROR_SELECTOR = 0x08c379a0;\n\n // solhint-disable func-name-mixedcase\n /// @dev ABI encode a standard, string revert error payload.\n /// This is the same payload that would be included by a `revert(string)`\n /// solidity statement. It has the function signature `Error(string)`.\n /// @param message The error string.\n /// @return The ABI encoded error.\n function StandardError(string memory message)\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n STANDARD_ERROR_SELECTOR,\n bytes(message)\n );\n }\n // solhint-enable func-name-mixedcase\n\n /// @dev Reverts an encoded rich revert reason `errorData`.\n /// @param errorData ABI encoded error data.\n function rrevert(bytes memory errorData)\n internal\n pure\n {\n assembly {\n revert(add(errorData, 0x20), mload(errorData))\n }\n }\n}\n"
|
|
},
|
|
"@0x/contracts-utils/contracts/src/v06/LibBytesV06.sol": {
|
|
"id": 23,
|
|
"content": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\n\nimport \"./errors/LibBytesRichErrorsV06.sol\";\nimport \"./errors/LibRichErrorsV06.sol\";\n\n\nlibrary LibBytesV06 {\n\n using LibBytesV06 for bytes;\n\n /// @dev Gets the memory address for a byte array.\n /// @param input Byte array to lookup.\n /// @return memoryAddress Memory address of byte array. This\n /// points to the header of the byte array which contains\n /// the length.\n function rawAddress(bytes memory input)\n internal\n pure\n returns (uint256 memoryAddress)\n {\n assembly {\n memoryAddress := input\n }\n return memoryAddress;\n }\n\n /// @dev Gets the memory address for the contents of a byte array.\n /// @param input Byte array to lookup.\n /// @return memoryAddress Memory address of the contents of the byte array.\n function contentAddress(bytes memory input)\n internal\n pure\n returns (uint256 memoryAddress)\n {\n assembly {\n memoryAddress := add(input, 32)\n }\n return memoryAddress;\n }\n\n /// @dev Copies `length` bytes from memory location `source` to `dest`.\n /// @param dest memory address to copy bytes to.\n /// @param source memory address to copy bytes from.\n /// @param length number of bytes to copy.\n function memCopy(\n uint256 dest,\n uint256 source,\n uint256 length\n )\n internal\n pure\n {\n if (length < 32) {\n // Handle a partial word by reading destination and masking\n // off the bits we are interested in.\n // This correctly handles overlap, zero lengths and source == dest\n assembly {\n let mask := sub(exp(256, sub(32, length)), 1)\n let s := and(mload(source), not(mask))\n let d := and(mload(dest), mask)\n mstore(dest, or(s, d))\n }\n } else {\n // Skip the O(length) loop when source == dest.\n if (source == dest) {\n return;\n }\n\n // For large copies we copy whole words at a time. The final\n // word is aligned to the end of the range (instead of after the\n // previous) to handle partial words. So a copy will look like this:\n //\n // ####\n // ####\n // ####\n // ####\n //\n // We handle overlap in the source and destination range by\n // changing the copying direction. This prevents us from\n // overwriting parts of source that we still need to copy.\n //\n // This correctly handles source == dest\n //\n if (source > dest) {\n assembly {\n // We subtract 32 from `sEnd` and `dEnd` because it\n // is easier to compare with in the loop, and these\n // are also the addresses we need for copying the\n // last bytes.\n length := sub(length, 32)\n let sEnd := add(source, length)\n let dEnd := add(dest, length)\n\n // Remember the last 32 bytes of source\n // This needs to be done here and not after the loop\n // because we may have overwritten the last bytes in\n // source already due to overlap.\n let last := mload(sEnd)\n\n // Copy whole words front to back\n // Note: the first check is always true,\n // this could have been a do-while loop.\n // solhint-disable-next-line no-empty-blocks\n for {} lt(source, sEnd) {} {\n mstore(dest, mload(source))\n source := add(source, 32)\n dest := add(dest, 32)\n }\n\n // Write the last 32 bytes\n mstore(dEnd, last)\n }\n } else {\n assembly {\n // We subtract 32 from `sEnd` and `dEnd` because those\n // are the starting points when copying a word at the end.\n length := sub(length, 32)\n let sEnd := add(source, length)\n let dEnd := add(dest, length)\n\n // Remember the first 32 bytes of source\n // This needs to be done here and not after the loop\n // because we may have overwritten the first bytes in\n // source already due to overlap.\n let first := mload(source)\n\n // Copy whole words back to front\n // We use a signed comparisson here to allow dEnd to become\n // negative (happens when source and dest < 32). Valid\n // addresses in local memory will never be larger than\n // 2**255, so they can be safely re-interpreted as signed.\n // Note: the first check is always true,\n // this could have been a do-while loop.\n // solhint-disable-next-line no-empty-blocks\n for {} slt(dest, dEnd) {} {\n mstore(dEnd, mload(sEnd))\n sEnd := sub(sEnd, 32)\n dEnd := sub(dEnd, 32)\n }\n\n // Write the first 32 bytes\n mstore(dest, first)\n }\n }\n }\n }\n\n /// @dev Returns a slices from a byte array.\n /// @param b The byte array to take a slice from.\n /// @param from The starting index for the slice (inclusive).\n /// @param to The final index for the slice (exclusive).\n /// @return result The slice containing bytes at indices [from, to)\n function slice(\n bytes memory b,\n uint256 from,\n uint256 to\n )\n internal\n pure\n returns (bytes memory result)\n {\n // Ensure that the from and to positions are valid positions for a slice within\n // the byte array that is being used.\n if (from > to) {\n LibRichErrorsV06.rrevert(LibBytesRichErrorsV06.InvalidByteOperationError(\n LibBytesRichErrorsV06.InvalidByteOperationErrorCodes.FromLessThanOrEqualsToRequired,\n from,\n to\n ));\n }\n if (to > b.length) {\n LibRichErrorsV06.rrevert(LibBytesRichErrorsV06.InvalidByteOperationError(\n LibBytesRichErrorsV06.InvalidByteOperationErrorCodes.ToLessThanOrEqualsLengthRequired,\n to,\n b.length\n ));\n }\n\n // Create a new bytes structure and copy contents\n result = new bytes(to - from);\n memCopy(\n result.contentAddress(),\n b.contentAddress() + from,\n result.length\n );\n return result;\n }\n\n /// @dev Returns a slice from a byte array without preserving the input.\n /// When `from == 0`, the original array will match the slice.\n /// In other cases its state will be corrupted.\n /// @param b The byte array to take a slice from. Will be destroyed in the process.\n /// @param from The starting index for the slice (inclusive).\n /// @param to The final index for the slice (exclusive).\n /// @return result The slice containing bytes at indices [from, to)\n function sliceDestructive(\n bytes memory b,\n uint256 from,\n uint256 to\n )\n internal\n pure\n returns (bytes memory result)\n {\n // Ensure that the from and to positions are valid positions for a slice within\n // the byte array that is being used.\n if (from > to) {\n LibRichErrorsV06.rrevert(LibBytesRichErrorsV06.InvalidByteOperationError(\n LibBytesRichErrorsV06.InvalidByteOperationErrorCodes.FromLessThanOrEqualsToRequired,\n from,\n to\n ));\n }\n if (to > b.length) {\n LibRichErrorsV06.rrevert(LibBytesRichErrorsV06.InvalidByteOperationError(\n LibBytesRichErrorsV06.InvalidByteOperationErrorCodes.ToLessThanOrEqualsLengthRequired,\n to,\n b.length\n ));\n }\n\n // Create a new bytes structure around [from, to) in-place.\n assembly {\n result := add(b, from)\n mstore(result, sub(to, from))\n }\n return result;\n }\n\n /// @dev Pops the last byte off of a byte array by modifying its length.\n /// @param b Byte array that will be modified.\n /// @return result The byte that was popped off.\n function popLastByte(bytes memory b)\n internal\n pure\n returns (bytes1 result)\n {\n if (b.length == 0) {\n LibRichErrorsV06.rrevert(LibBytesRichErrorsV06.InvalidByteOperationError(\n LibBytesRichErrorsV06.InvalidByteOperationErrorCodes.LengthGreaterThanZeroRequired,\n b.length,\n 0\n ));\n }\n\n // Store last byte.\n result = b[b.length - 1];\n\n assembly {\n // Decrement length of byte array.\n let newLen := sub(mload(b), 1)\n mstore(b, newLen)\n }\n return result;\n }\n\n /// @dev Tests equality of two byte arrays.\n /// @param lhs First byte array to compare.\n /// @param rhs Second byte array to compare.\n /// @return equal True if arrays are the same. False otherwise.\n function equals(\n bytes memory lhs,\n bytes memory rhs\n )\n internal\n pure\n returns (bool equal)\n {\n // Keccak gas cost is 30 + numWords * 6. This is a cheap way to compare.\n // We early exit on unequal lengths, but keccak would also correctly\n // handle this.\n return lhs.length == rhs.length && keccak256(lhs) == keccak256(rhs);\n }\n\n /// @dev Reads an address from a position in a byte array.\n /// @param b Byte array containing an address.\n /// @param index Index in byte array of address.\n /// @return result address from byte array.\n function readAddress(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (address result)\n {\n if (b.length < index + 20) {\n LibRichErrorsV06.rrevert(LibBytesRichErrorsV06.InvalidByteOperationError(\n LibBytesRichErrorsV06.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsTwentyRequired,\n b.length,\n index + 20 // 20 is length of address\n ));\n }\n\n // Add offset to index:\n // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)\n // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)\n index += 20;\n\n // Read address from array memory\n assembly {\n // 1. Add index to address of bytes array\n // 2. Load 32-byte word from memory\n // 3. Apply 20-byte mask to obtain address\n result := and(mload(add(b, index)), 0xffffffffffffffffffffffffffffffffffffffff)\n }\n return result;\n }\n\n /// @dev Writes an address into a specific position in a byte array.\n /// @param b Byte array to insert address into.\n /// @param index Index in byte array of address.\n /// @param input Address to put into byte array.\n function writeAddress(\n bytes memory b,\n uint256 index,\n address input\n )\n internal\n pure\n {\n if (b.length < index + 20) {\n LibRichErrorsV06.rrevert(LibBytesRichErrorsV06.InvalidByteOperationError(\n LibBytesRichErrorsV06.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsTwentyRequired,\n b.length,\n index + 20 // 20 is length of address\n ));\n }\n\n // Add offset to index:\n // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)\n // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)\n index += 20;\n\n // Store address into array memory\n assembly {\n // The address occupies 20 bytes and mstore stores 32 bytes.\n // First fetch the 32-byte word where we'll be storing the address, then\n // apply a mask so we have only the bytes in the word that the address will not occupy.\n // Then combine these bytes with the address and store the 32 bytes back to memory with mstore.\n\n // 1. Add index to address of bytes array\n // 2. Load 32-byte word from memory\n // 3. Apply 12-byte mask to obtain extra bytes occupying word of memory where we'll store the address\n let neighbors := and(\n mload(add(b, index)),\n 0xffffffffffffffffffffffff0000000000000000000000000000000000000000\n )\n\n // Make sure input address is clean.\n // (Solidity does not guarantee this)\n input := and(input, 0xffffffffffffffffffffffffffffffffffffffff)\n\n // Store the neighbors and address into memory\n mstore(add(b, index), xor(input, neighbors))\n }\n }\n\n /// @dev Reads a bytes32 value from a position in a byte array.\n /// @param b Byte array containing a bytes32 value.\n /// @param index Index in byte array of bytes32 value.\n /// @return result bytes32 value from byte array.\n function readBytes32(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (bytes32 result)\n {\n if (b.length < index + 32) {\n LibRichErrorsV06.rrevert(LibBytesRichErrorsV06.InvalidByteOperationError(\n LibBytesRichErrorsV06.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsThirtyTwoRequired,\n b.length,\n index + 32\n ));\n }\n\n // Arrays are prefixed by a 256 bit length parameter\n index += 32;\n\n // Read the bytes32 from array memory\n assembly {\n result := mload(add(b, index))\n }\n return result;\n }\n\n /// @dev Writes a bytes32 into a specific position in a byte array.\n /// @param b Byte array to insert <input> into.\n /// @param index Index in byte array of <input>.\n /// @param input bytes32 to put into byte array.\n function writeBytes32(\n bytes memory b,\n uint256 index,\n bytes32 input\n )\n internal\n pure\n {\n if (b.length < index + 32) {\n LibRichErrorsV06.rrevert(LibBytesRichErrorsV06.InvalidByteOperationError(\n LibBytesRichErrorsV06.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsThirtyTwoRequired,\n b.length,\n index + 32\n ));\n }\n\n // Arrays are prefixed by a 256 bit length parameter\n index += 32;\n\n // Read the bytes32 from array memory\n assembly {\n mstore(add(b, index), input)\n }\n }\n\n /// @dev Reads a uint256 value from a position in a byte array.\n /// @param b Byte array containing a uint256 value.\n /// @param index Index in byte array of uint256 value.\n /// @return result uint256 value from byte array.\n function readUint256(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (uint256 result)\n {\n result = uint256(readBytes32(b, index));\n return result;\n }\n\n /// @dev Writes a uint256 into a specific position in a byte array.\n /// @param b Byte array to insert <input> into.\n /// @param index Index in byte array of <input>.\n /// @param input uint256 to put into byte array.\n function writeUint256(\n bytes memory b,\n uint256 index,\n uint256 input\n )\n internal\n pure\n {\n writeBytes32(b, index, bytes32(input));\n }\n\n /// @dev Reads an unpadded bytes4 value from a position in a byte array.\n /// @param b Byte array containing a bytes4 value.\n /// @param index Index in byte array of bytes4 value.\n /// @return result bytes4 value from byte array.\n function readBytes4(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (bytes4 result)\n {\n if (b.length < index + 4) {\n LibRichErrorsV06.rrevert(LibBytesRichErrorsV06.InvalidByteOperationError(\n LibBytesRichErrorsV06.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsFourRequired,\n b.length,\n index + 4\n ));\n }\n\n // Arrays are prefixed by a 32 byte length field\n index += 32;\n\n // Read the bytes4 from array memory\n assembly {\n result := mload(add(b, index))\n // Solidity does not require us to clean the trailing bytes.\n // We do it anyway\n result := and(result, 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000)\n }\n return result;\n }\n\n /// @dev Writes a new length to a byte array.\n /// Decreasing length will lead to removing the corresponding lower order bytes from the byte array.\n /// Increasing length may lead to appending adjacent in-memory bytes to the end of the byte array.\n /// @param b Bytes array to write new length to.\n /// @param length New length of byte array.\n function writeLength(bytes memory b, uint256 length)\n internal\n pure\n {\n assembly {\n mstore(b, length)\n }\n }\n}\n"
|
|
},
|
|
"@0x/contracts-utils/contracts/src/v06/errors/LibBytesRichErrorsV06.sol": {
|
|
"id": 25,
|
|
"content": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\n\n\nlibrary LibBytesRichErrorsV06 {\n\n enum InvalidByteOperationErrorCodes {\n FromLessThanOrEqualsToRequired,\n ToLessThanOrEqualsLengthRequired,\n LengthGreaterThanZeroRequired,\n LengthGreaterThanOrEqualsFourRequired,\n LengthGreaterThanOrEqualsTwentyRequired,\n LengthGreaterThanOrEqualsThirtyTwoRequired,\n LengthGreaterThanOrEqualsNestedBytesLengthRequired,\n DestinationLengthGreaterThanOrEqualSourceLengthRequired\n }\n\n // bytes4(keccak256(\"InvalidByteOperationError(uint8,uint256,uint256)\"))\n bytes4 internal constant INVALID_BYTE_OPERATION_ERROR_SELECTOR =\n 0x28006595;\n\n // solhint-disable func-name-mixedcase\n function InvalidByteOperationError(\n InvalidByteOperationErrorCodes errorCode,\n uint256 offset,\n uint256 required\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n INVALID_BYTE_OPERATION_ERROR_SELECTOR,\n errorCode,\n offset,\n required\n );\n }\n}\n"
|
|
},
|
|
"./mixins/MixinBancor.sol": {
|
|
"id": 4,
|
|
"content": "// SPDX-License-Identifier: Apache-2.0\n\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-erc20/contracts/src/v06/LibERC20TokenV06.sol\";\nimport \"@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol\";\nimport \"@0x/contracts-erc20/contracts/src/v06/IEtherTokenV06.sol\";\nimport \"../IBridgeAdapter.sol\";\n\n\ninterface IBancorNetwork {\n function convertByPath(\n IERC20TokenV06[] calldata _path,\n uint256 _amount,\n uint256 _minReturn,\n address _beneficiary,\n address _affiliateAccount,\n uint256 _affiliateFee\n )\n external\n payable\n returns (uint256);\n}\n\n\ncontract MixinBancor {\n\n /// @dev Bancor ETH pseudo-address.\n IERC20TokenV06 constant public BANCOR_ETH_ADDRESS =\n IERC20TokenV06(0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE);\n IEtherTokenV06 private immutable WETH;\n\n constructor(IEtherTokenV06 weth)\n public\n {\n WETH = weth;\n }\n\n function _tradeBancor(\n IERC20TokenV06 buyToken,\n uint256 sellAmount,\n bytes memory bridgeData\n )\n internal\n returns (uint256 boughtAmount)\n {\n // Decode the bridge data.\n IBancorNetwork bancorNetworkAddress;\n IERC20TokenV06[] memory path;\n {\n address[] memory _path;\n (\n bancorNetworkAddress,\n _path\n ) = abi.decode(bridgeData, (IBancorNetwork, address[]));\n // To get around `abi.decode()` not supporting interface array types.\n assembly { path := _path }\n }\n\n require(path.length >= 2, \"MixinBancor/PATH_LENGTH_MUST_BE_AT_LEAST_TWO\");\n require(\n path[path.length - 1] == buyToken ||\n (path[path.length - 1] == BANCOR_ETH_ADDRESS && buyToken == WETH),\n \"MixinBancor/LAST_ELEMENT_OF_PATH_MUST_MATCH_OUTPUT_TOKEN\"\n );\n\n uint256 payableAmount = 0;\n // If it's ETH in the path then withdraw from WETH\n // The Bancor path will have ETH as the 0xeee address\n // Bancor expects to be paid in ETH not WETH\n if (path[0] == BANCOR_ETH_ADDRESS) {\n WETH.withdraw(sellAmount);\n payableAmount = sellAmount;\n } else {\n // Grant an allowance to the Bancor Network.\n LibERC20TokenV06.approveIfBelow(\n path[0],\n address(bancorNetworkAddress),\n sellAmount\n );\n }\n\n // Convert the tokens\n boughtAmount = bancorNetworkAddress.convertByPath{value: payableAmount}(\n path, // path originating with source token and terminating in destination token\n sellAmount, // amount of source token to trade\n 1, // minimum amount of destination token expected to receive\n address(this), // beneficiary\n address(0), // affiliateAccount; no fee paid\n 0 // affiliateFee; no fee paid\n );\n if (path[path.length - 1] == BANCOR_ETH_ADDRESS) {\n WETH.deposit{value: boughtAmount}();\n }\n\n return boughtAmount;\n }\n}\n"
|
|
},
|
|
"@0x/contracts-erc20/contracts/src/v06/IEtherTokenV06.sol": {
|
|
"id": 21,
|
|
"content": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\n\nimport \"./IERC20TokenV06.sol\";\n\n\ninterface IEtherTokenV06 is\n IERC20TokenV06\n{\n /// @dev Wrap ether.\n function deposit() external payable;\n\n /// @dev Unwrap ether.\n function withdraw(uint256 amount) external;\n}\n"
|
|
},
|
|
"./mixins/MixinCoFiX.sol": {
|
|
"id": 5,
|
|
"content": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-erc20/contracts/src/v06/LibERC20TokenV06.sol\";\nimport \"@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol\";\nimport \"@0x/contracts-erc20/contracts/src/v06/IEtherTokenV06.sol\";\n\n\ninterface ICoFiXRouter {\n // msg.value = fee\n function swapExactTokensForETH(\n address token,\n uint amountIn,\n uint amountOutMin,\n address to,\n address rewardTo,\n uint deadline\n ) external payable returns (uint _amountIn, uint _amountOut);\n\n // msg.value = amountIn + fee\n function swapExactETHForTokens(\n address token,\n uint amountIn,\n uint amountOutMin,\n address to,\n address rewardTo,\n uint deadline\n ) external payable returns (uint _amountIn, uint _amountOut);\n}\n\ninterface ICoFiXPair {\n\n function swapWithExact(address outToken, address to)\n external\n payable\n returns (\n uint amountIn,\n uint amountOut,\n uint oracleFeeChange,\n uint256[4] memory tradeInfo\n );\n}\n\ncontract MixinCoFiX {\n\n using LibERC20TokenV06 for IERC20TokenV06;\n\n function _tradeCoFiX(\n IERC20TokenV06 sellToken,\n IERC20TokenV06 buyToken,\n uint256 sellAmount,\n bytes memory bridgeData\n )\n internal\n returns (uint256 boughtAmount)\n {\n (uint256 fee, ICoFiXPair pool) = abi.decode(bridgeData, (uint256, ICoFiXPair));\n // Transfer tokens into the pool\n LibERC20TokenV06.compatTransfer(\n sellToken,\n address(pool),\n sellAmount\n );\n // Call the swap exact with the tokens now in the pool\n // pay the NEST Oracle fee with ETH\n (/* In */, boughtAmount, , ) = pool.swapWithExact{value: fee}(\n address(buyToken),\n address(this)\n );\n\n return boughtAmount;\n }\n}\n"
|
|
},
|
|
"./mixins/MixinCurve.sol": {
|
|
"id": 7,
|
|
"content": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-utils/contracts/src/v06/errors/LibRichErrorsV06.sol\";\nimport \"@0x/contracts-erc20/contracts/src/v06/LibERC20TokenV06.sol\";\nimport \"@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol\";\nimport \"@0x/contracts-utils/contracts/src/v06/LibSafeMathV06.sol\";\n\ncontract MixinCurve {\n\n using LibERC20TokenV06 for IERC20TokenV06;\n using LibSafeMathV06 for uint256;\n using LibRichErrorsV06 for bytes;\n\n\n struct CurveBridgeData {\n address curveAddress;\n bytes4 exchangeFunctionSelector;\n int128 fromCoinIdx;\n int128 toCoinIdx;\n }\n\n function _tradeCurve(\n IERC20TokenV06 sellToken,\n IERC20TokenV06 buyToken,\n uint256 sellAmount,\n bytes memory bridgeData\n )\n internal\n returns (uint256 boughtAmount)\n {\n // Decode the bridge data to get the Curve metadata.\n CurveBridgeData memory data = abi.decode(bridgeData, (CurveBridgeData));\n sellToken.approveIfBelow(data.curveAddress, sellAmount);\n uint256 beforeBalance = buyToken.balanceOf(address(this));\n (bool success, bytes memory resultData) =\n data.curveAddress.call(abi.encodeWithSelector(\n data.exchangeFunctionSelector,\n data.fromCoinIdx,\n data.toCoinIdx,\n // dx\n sellAmount,\n // min dy\n 1\n ));\n if (!success) {\n resultData.rrevert();\n }\n return buyToken.balanceOf(address(this)).safeSub(beforeBalance);\n }\n}\n"
|
|
},
|
|
"@0x/contracts-utils/contracts/src/v06/LibSafeMathV06.sol": {
|
|
"id": 24,
|
|
"content": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\n\nimport \"./errors/LibRichErrorsV06.sol\";\nimport \"./errors/LibSafeMathRichErrorsV06.sol\";\n\n\nlibrary LibSafeMathV06 {\n\n function safeMul(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n if (a == 0) {\n return 0;\n }\n uint256 c = a * b;\n if (c / a != b) {\n LibRichErrorsV06.rrevert(LibSafeMathRichErrorsV06.Uint256BinOpError(\n LibSafeMathRichErrorsV06.BinOpErrorCodes.MULTIPLICATION_OVERFLOW,\n a,\n b\n ));\n }\n return c;\n }\n\n function safeDiv(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n if (b == 0) {\n LibRichErrorsV06.rrevert(LibSafeMathRichErrorsV06.Uint256BinOpError(\n LibSafeMathRichErrorsV06.BinOpErrorCodes.DIVISION_BY_ZERO,\n a,\n b\n ));\n }\n uint256 c = a / b;\n return c;\n }\n\n function safeSub(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n if (b > a) {\n LibRichErrorsV06.rrevert(LibSafeMathRichErrorsV06.Uint256BinOpError(\n LibSafeMathRichErrorsV06.BinOpErrorCodes.SUBTRACTION_UNDERFLOW,\n a,\n b\n ));\n }\n return a - b;\n }\n\n function safeAdd(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n uint256 c = a + b;\n if (c < a) {\n LibRichErrorsV06.rrevert(LibSafeMathRichErrorsV06.Uint256BinOpError(\n LibSafeMathRichErrorsV06.BinOpErrorCodes.ADDITION_OVERFLOW,\n a,\n b\n ));\n }\n return c;\n }\n\n function max256(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n return a >= b ? a : b;\n }\n\n function min256(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n return a < b ? a : b;\n }\n\n function safeMul128(uint128 a, uint128 b)\n internal\n pure\n returns (uint128)\n {\n if (a == 0) {\n return 0;\n }\n uint128 c = a * b;\n if (c / a != b) {\n LibRichErrorsV06.rrevert(LibSafeMathRichErrorsV06.Uint256BinOpError(\n LibSafeMathRichErrorsV06.BinOpErrorCodes.MULTIPLICATION_OVERFLOW,\n a,\n b\n ));\n }\n return c;\n }\n\n function safeDiv128(uint128 a, uint128 b)\n internal\n pure\n returns (uint128)\n {\n if (b == 0) {\n LibRichErrorsV06.rrevert(LibSafeMathRichErrorsV06.Uint256BinOpError(\n LibSafeMathRichErrorsV06.BinOpErrorCodes.DIVISION_BY_ZERO,\n a,\n b\n ));\n }\n uint128 c = a / b;\n return c;\n }\n\n function safeSub128(uint128 a, uint128 b)\n internal\n pure\n returns (uint128)\n {\n if (b > a) {\n LibRichErrorsV06.rrevert(LibSafeMathRichErrorsV06.Uint256BinOpError(\n LibSafeMathRichErrorsV06.BinOpErrorCodes.SUBTRACTION_UNDERFLOW,\n a,\n b\n ));\n }\n return a - b;\n }\n\n function safeAdd128(uint128 a, uint128 b)\n internal\n pure\n returns (uint128)\n {\n uint128 c = a + b;\n if (c < a) {\n LibRichErrorsV06.rrevert(LibSafeMathRichErrorsV06.Uint256BinOpError(\n LibSafeMathRichErrorsV06.BinOpErrorCodes.ADDITION_OVERFLOW,\n a,\n b\n ));\n }\n return c;\n }\n\n function max128(uint128 a, uint128 b)\n internal\n pure\n returns (uint128)\n {\n return a >= b ? a : b;\n }\n\n function min128(uint128 a, uint128 b)\n internal\n pure\n returns (uint128)\n {\n return a < b ? a : b;\n }\n\n function safeDowncastToUint128(uint256 a)\n internal\n pure\n returns (uint128)\n {\n if (a > type(uint128).max) {\n LibRichErrorsV06.rrevert(LibSafeMathRichErrorsV06.Uint256DowncastError(\n LibSafeMathRichErrorsV06.DowncastErrorCodes.VALUE_TOO_LARGE_TO_DOWNCAST_TO_UINT128,\n a\n ));\n }\n return uint128(a);\n }\n}\n"
|
|
},
|
|
"@0x/contracts-utils/contracts/src/v06/errors/LibSafeMathRichErrorsV06.sol": {
|
|
"id": 27,
|
|
"content": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\n\n\nlibrary LibSafeMathRichErrorsV06 {\n\n // bytes4(keccak256(\"Uint256BinOpError(uint8,uint256,uint256)\"))\n bytes4 internal constant UINT256_BINOP_ERROR_SELECTOR =\n 0xe946c1bb;\n\n // bytes4(keccak256(\"Uint256DowncastError(uint8,uint256)\"))\n bytes4 internal constant UINT256_DOWNCAST_ERROR_SELECTOR =\n 0xc996af7b;\n\n enum BinOpErrorCodes {\n ADDITION_OVERFLOW,\n MULTIPLICATION_OVERFLOW,\n SUBTRACTION_UNDERFLOW,\n DIVISION_BY_ZERO\n }\n\n enum DowncastErrorCodes {\n VALUE_TOO_LARGE_TO_DOWNCAST_TO_UINT32,\n VALUE_TOO_LARGE_TO_DOWNCAST_TO_UINT64,\n VALUE_TOO_LARGE_TO_DOWNCAST_TO_UINT96,\n VALUE_TOO_LARGE_TO_DOWNCAST_TO_UINT128\n }\n\n // solhint-disable func-name-mixedcase\n function Uint256BinOpError(\n BinOpErrorCodes errorCode,\n uint256 a,\n uint256 b\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n UINT256_BINOP_ERROR_SELECTOR,\n errorCode,\n a,\n b\n );\n }\n\n function Uint256DowncastError(\n DowncastErrorCodes errorCode,\n uint256 a\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n UINT256_DOWNCAST_ERROR_SELECTOR,\n errorCode,\n a\n );\n }\n}\n"
|
|
},
|
|
"./mixins/MixinCryptoCom.sol": {
|
|
"id": 6,
|
|
"content": "// SPDX-License-Identifier: Apache-2.0\n\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-erc20/contracts/src/v06/LibERC20TokenV06.sol\";\nimport \"@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol\";\nimport \"./MixinUniswapV2.sol\";\n\ncontract MixinCryptoCom\n{\n using LibERC20TokenV06 for IERC20TokenV06;\n\n function _tradeCryptoCom(\n IERC20TokenV06 buyToken,\n uint256 sellAmount,\n bytes memory bridgeData\n )\n internal\n returns (uint256 boughtAmount)\n {\n IUniswapV2Router02 router;\n IERC20TokenV06[] memory path;\n {\n address[] memory _path;\n (router, _path) = abi.decode(bridgeData, (IUniswapV2Router02, address[]));\n // To get around `abi.decode()` not supporting interface array types.\n assembly { path := _path }\n }\n\n require(path.length >= 2, \"MixinCryptoCom/PATH_LENGTH_MUST_BE_AT_LEAST_TWO\");\n require(\n path[path.length - 1] == buyToken,\n \"MixinCryptoCom/LAST_ELEMENT_OF_PATH_MUST_MATCH_OUTPUT_TOKEN\"\n );\n // Grant the CryptoCom router an allowance to sell the first token.\n path[0].approveIfBelow(address(router), sellAmount);\n\n uint[] memory amounts = router.swapExactTokensForTokens(\n // Sell all tokens we hold.\n sellAmount,\n // Minimum buy amount.\n 1,\n // Convert to `buyToken` along this path.\n path,\n // Recipient is `this`.\n address(this),\n // Expires after this block.\n block.timestamp\n );\n return amounts[amounts.length-1];\n }\n}\n"
|
|
},
|
|
"./mixins/MixinUniswapV2.sol": {
|
|
"id": 17,
|
|
"content": "// SPDX-License-Identifier: Apache-2.0\n\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-erc20/contracts/src/v06/LibERC20TokenV06.sol\";\nimport \"@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol\";\nimport \"../IBridgeAdapter.sol\";\n\n/*\n UniswapV2\n*/\ninterface IUniswapV2Router02 {\n\n /// @dev Swaps an exact amount of input tokens for as many output tokens as possible, along the route determined by the path.\n /// The first element of path is the input token, the last is the output token, and any intermediate elements represent\n /// intermediate pairs to trade through (if, for example, a direct pair does not exist).\n /// @param amountIn The amount of input tokens to send.\n /// @param amountOutMin The minimum amount of output tokens that must be received for the transaction not to revert.\n /// @param path An array of token addresses. path.length must be >= 2. Pools for each consecutive pair of addresses must exist and have liquidity.\n /// @param to Recipient of the output tokens.\n /// @param deadline Unix timestamp after which the transaction will revert.\n /// @return amounts The input token amount and all subsequent output token amounts.\n function swapExactTokensForTokens(\n uint amountIn,\n uint amountOutMin,\n IERC20TokenV06[] calldata path,\n address to,\n uint deadline\n ) external returns (uint[] memory amounts);\n}\n\ncontract MixinUniswapV2 {\n\n using LibERC20TokenV06 for IERC20TokenV06;\n\n function _tradeUniswapV2(\n IERC20TokenV06 buyToken,\n uint256 sellAmount,\n bytes memory bridgeData\n )\n internal\n returns (uint256 boughtAmount)\n {\n IUniswapV2Router02 router;\n IERC20TokenV06[] memory path;\n {\n address[] memory _path;\n (router, _path) = abi.decode(bridgeData, (IUniswapV2Router02, address[]));\n // To get around `abi.decode()` not supporting interface array types.\n assembly { path := _path }\n }\n\n require(path.length >= 2, \"MixinUniswapV3/PATH_LENGTH_MUST_BE_AT_LEAST_TWO\");\n require(\n path[path.length - 1] == buyToken,\n \"MixinUniswapV2/LAST_ELEMENT_OF_PATH_MUST_MATCH_OUTPUT_TOKEN\"\n );\n // Grant the Uniswap router an allowance to sell the first token.\n path[0].approveIfBelow(address(router), sellAmount);\n\n uint[] memory amounts = router.swapExactTokensForTokens(\n // Sell all tokens we hold.\n sellAmount,\n // Minimum buy amount.\n 1,\n // Convert to `buyToken` along this path.\n path,\n // Recipient is `this`.\n address(this),\n // Expires after this block.\n block.timestamp\n );\n return amounts[amounts.length-1];\n }\n}\n"
|
|
},
|
|
"./mixins/MixinDodo.sol": {
|
|
"id": 8,
|
|
"content": "// SPDX-License-Identifier: Apache-2.0\n\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-erc20/contracts/src/v06/LibERC20TokenV06.sol\";\nimport \"@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol\";\nimport \"../IBridgeAdapter.sol\";\n\n\ninterface IDODO {\n function sellBaseToken(\n uint256 amount,\n uint256 minReceiveQuote,\n bytes calldata data\n )\n external\n returns (uint256);\n\n function buyBaseToken(\n uint256 amount,\n uint256 maxPayQuote,\n bytes calldata data\n )\n external\n returns (uint256);\n}\n\n\ninterface IDODOHelper {\n function querySellQuoteToken(\n IDODO dodo,\n uint256 amount\n )\n external\n view\n returns (uint256);\n}\n\n\ncontract MixinDodo {\n\n using LibERC20TokenV06 for IERC20TokenV06;\n\n function _tradeDodo(\n IERC20TokenV06 sellToken,\n uint256 sellAmount,\n bytes memory bridgeData\n )\n internal\n returns (uint256 boughtAmount)\n {\n (IDODOHelper helper, IDODO pool, bool isSellBase) =\n abi.decode(bridgeData, (IDODOHelper, IDODO, bool));\n\n // Grant the Dodo pool contract an allowance to sell the first token.\n sellToken.approveIfBelow(address(pool), sellAmount);\n\n if (isSellBase) {\n // Sell the Base token directly against the contract\n boughtAmount = pool.sellBaseToken(\n // amount to sell\n sellAmount,\n // min receive amount\n 1,\n new bytes(0)\n );\n } else {\n // Need to re-calculate the sell quote amount into buyBase\n boughtAmount = helper.querySellQuoteToken(\n pool,\n sellAmount\n );\n pool.buyBaseToken(\n // amount to buy\n boughtAmount,\n // max pay amount\n sellAmount,\n new bytes(0)\n );\n }\n\n return boughtAmount;\n }\n}\n"
|
|
},
|
|
"./mixins/MixinDodoV2.sol": {
|
|
"id": 9,
|
|
"content": "// SPDX-License-Identifier: Apache-2.0\n\n/*\n\n Copyright 2021 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-erc20/contracts/src/v06/LibERC20TokenV06.sol\";\nimport \"@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol\";\nimport \"../IBridgeAdapter.sol\";\n\n\ninterface IDODOV2 {\n function sellBase(address recipient)\n external\n returns (uint256);\n\n function sellQuote(address recipient)\n external\n returns (uint256);\n}\n\n\ncontract MixinDodoV2 {\n\n using LibERC20TokenV06 for IERC20TokenV06;\n\n function _tradeDodoV2(\n IERC20TokenV06 sellToken,\n uint256 sellAmount,\n bytes memory bridgeData\n )\n internal\n returns (uint256 boughtAmount)\n {\n (IDODOV2 pool, bool isSellBase) =\n abi.decode(bridgeData, (IDODOV2, bool));\n\n // Transfer the tokens into the pool\n sellToken.compatTransfer(address(pool), sellAmount);\n\n boughtAmount = isSellBase ?\n pool.sellBase(address(this))\n : pool.sellQuote(address(this));\n }\n}\n"
|
|
},
|
|
"./mixins/MixinKyber.sol": {
|
|
"id": 10,
|
|
"content": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-erc20/contracts/src/v06/LibERC20TokenV06.sol\";\nimport \"@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol\";\nimport \"@0x/contracts-erc20/contracts/src/v06/IEtherTokenV06.sol\";\nimport \"../IBridgeAdapter.sol\";\n\ninterface IKyberNetworkProxy {\n\n /// @dev Sells `sellTokenAddress` tokens for `buyTokenAddress` tokens\n /// using a hint for the reserve.\n /// @param sellToken Token to sell.\n /// @param sellAmount Amount of tokens to sell.\n /// @param buyToken Token to buy.\n /// @param recipientAddress Address to send bought tokens to.\n /// @param maxBuyTokenAmount A limit on the amount of tokens to buy.\n /// @param minConversionRate The minimal conversion rate. If actual rate\n /// is lower, trade is canceled.\n /// @param walletId The wallet ID to send part of the fees\n /// @param hint The hint for the selective inclusion (or exclusion) of reserves\n /// @return boughtAmount Amount of tokens bought.\n function tradeWithHint(\n IERC20TokenV06 sellToken,\n uint256 sellAmount,\n IERC20TokenV06 buyToken,\n address payable recipientAddress,\n uint256 maxBuyTokenAmount,\n uint256 minConversionRate,\n address payable walletId,\n bytes calldata hint\n )\n external\n payable\n returns (uint256 boughtAmount);\n}\n\ncontract MixinKyber {\n\n using LibERC20TokenV06 for IERC20TokenV06;\n\n /// @dev Address indicating the trade is using ETH\n IERC20TokenV06 private immutable KYBER_ETH_ADDRESS =\n IERC20TokenV06(0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE);\n /// @dev Mainnet address of the WETH contract.\n IEtherTokenV06 private immutable WETH;\n\n constructor(IEtherTokenV06 weth)\n public\n {\n WETH = weth;\n }\n\n function _tradeKyber(\n IERC20TokenV06 sellToken,\n IERC20TokenV06 buyToken,\n uint256 sellAmount,\n bytes memory bridgeData\n )\n internal\n returns (uint256 boughtAmount)\n {\n (IKyberNetworkProxy kyber, bytes memory hint) =\n abi.decode(bridgeData, (IKyberNetworkProxy, bytes));\n\n uint256 payableAmount = 0;\n if (sellToken != WETH) {\n // If the input token is not WETH, grant an allowance to the exchange\n // to spend them.\n sellToken.approveIfBelow(\n address(kyber),\n sellAmount\n );\n } else {\n // If the input token is WETH, unwrap it and attach it to the call.\n payableAmount = sellAmount;\n WETH.withdraw(payableAmount);\n }\n\n // Try to sell all of this contract's input token balance through\n // `KyberNetworkProxy.trade()`.\n boughtAmount = kyber.tradeWithHint{ value: payableAmount }(\n // Input token.\n sellToken == WETH ? KYBER_ETH_ADDRESS : sellToken,\n // Sell amount.\n sellAmount,\n // Output token.\n buyToken == WETH ? KYBER_ETH_ADDRESS : buyToken,\n // Transfer to this contract\n address(uint160(address(this))),\n // Buy as much as possible.\n uint256(-1),\n // Lowest minimum conversion rate\n 1,\n // No affiliate address.\n address(0),\n hint\n );\n // If receving ETH, wrap it to WETH.\n if (buyToken == WETH) {\n WETH.deposit{ value: boughtAmount }();\n }\n return boughtAmount;\n }\n}\n"
|
|
},
|
|
"./mixins/MixinMooniswap.sol": {
|
|
"id": 12,
|
|
"content": "// SPDX-License-Identifier: Apache-2.0\n\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-erc20/contracts/src/v06/LibERC20TokenV06.sol\";\nimport \"@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol\";\nimport \"@0x/contracts-erc20/contracts/src/v06/IEtherTokenV06.sol\";\nimport \"../IBridgeAdapter.sol\";\n\n\n/// @dev Moooniswap pool interface.\ninterface IMooniswapPool {\n\n function swap(\n IERC20TokenV06 sellToken,\n IERC20TokenV06 buyToken,\n uint256 sellAmount,\n uint256 minBoughtAmount,\n address referrer\n )\n external\n payable\n returns (uint256 boughtAmount);\n}\n\n/// @dev BridgeAdapter mixin for mooniswap.\ncontract MixinMooniswap {\n\n using LibERC20TokenV06 for IERC20TokenV06;\n using LibERC20TokenV06 for IEtherTokenV06;\n\n /// @dev WETH token.\n IEtherTokenV06 private immutable WETH;\n\n constructor(IEtherTokenV06 weth)\n public\n {\n WETH = weth;\n }\n\n function _tradeMooniswap(\n IERC20TokenV06 sellToken,\n IERC20TokenV06 buyToken,\n uint256 sellAmount,\n bytes memory bridgeData\n )\n internal\n returns (uint256 boughtAmount)\n {\n (IMooniswapPool pool) = abi.decode(bridgeData, (IMooniswapPool));\n\n // Convert WETH to ETH.\n uint256 ethValue = 0;\n if (sellToken == WETH) {\n WETH.withdraw(sellAmount);\n ethValue = sellAmount;\n } else {\n // Grant the pool an allowance.\n sellToken.approveIfBelow(\n address(pool),\n sellAmount\n );\n }\n\n boughtAmount = pool.swap{value: ethValue}(\n sellToken == WETH ? IERC20TokenV06(0) : sellToken,\n buyToken == WETH ? IERC20TokenV06(0) : buyToken,\n sellAmount,\n 1,\n address(0)\n );\n\n // Wrap ETH to WETH.\n if (buyToken == WETH) {\n WETH.deposit{value:boughtAmount}();\n }\n }\n}\n"
|
|
},
|
|
"./mixins/MixinMStable.sol": {
|
|
"id": 11,
|
|
"content": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-erc20/contracts/src/v06/LibERC20TokenV06.sol\";\nimport \"@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol\";\nimport \"../IBridgeAdapter.sol\";\n\n\ninterface IMStable {\n\n function swap(\n IERC20TokenV06 sellToken,\n IERC20TokenV06 buyToken,\n uint256 sellAmount,\n address recipient\n )\n external\n returns (uint256 boughtAmount);\n}\n\ncontract MixinMStable {\n\n using LibERC20TokenV06 for IERC20TokenV06;\n\n function _tradeMStable(\n IERC20TokenV06 sellToken,\n IERC20TokenV06 buyToken,\n uint256 sellAmount,\n bytes memory bridgeData\n )\n internal\n returns (uint256 boughtAmount)\n {\n (IMStable mstable) = abi.decode(bridgeData, (IMStable));\n\n // Grant an allowance to the exchange to spend `sellToken` token.\n sellToken.approveIfBelow(address(mstable), sellAmount);\n\n boughtAmount = mstable.swap(\n sellToken,\n buyToken,\n sellAmount,\n address(this)\n );\n }\n}\n"
|
|
},
|
|
"./mixins/MixinOasis.sol": {
|
|
"id": 13,
|
|
"content": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-erc20/contracts/src/v06/LibERC20TokenV06.sol\";\nimport \"@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol\";\nimport \"../IBridgeAdapter.sol\";\n\ninterface IOasis {\n\n /// @dev Sell `sellAmount` of `sellToken` token and receive `buyToken` token.\n /// @param sellToken The token being sold.\n /// @param sellAmount The amount of `sellToken` token being sold.\n /// @param buyToken The token being bought.\n /// @param minBoughtAmount Minimum amount of `buyToken` token to buy.\n /// @return boughtAmount Amount of `buyToken` bought.\n function sellAllAmount(\n IERC20TokenV06 sellToken,\n uint256 sellAmount,\n IERC20TokenV06 buyToken,\n uint256 minBoughtAmount\n )\n external\n returns (uint256 boughtAmount);\n}\n\ncontract MixinOasis {\n\n using LibERC20TokenV06 for IERC20TokenV06;\n\n function _tradeOasis(\n IERC20TokenV06 sellToken,\n IERC20TokenV06 buyToken,\n uint256 sellAmount,\n bytes memory bridgeData\n )\n internal\n returns (uint256 boughtAmount)\n {\n\n (IOasis oasis) = abi.decode(bridgeData, (IOasis));\n\n // Grant an allowance to the exchange to spend `sellToken` token.\n sellToken.approveIfBelow(\n address(oasis),\n sellAmount\n );\n // Try to sell all of this contract's `sellToken` token balance.\n boughtAmount = oasis.sellAllAmount(\n sellToken,\n sellAmount,\n buyToken,\n // min fill amount\n 1\n );\n return boughtAmount;\n }\n}\n"
|
|
},
|
|
"./mixins/MixinShell.sol": {
|
|
"id": 14,
|
|
"content": "// SPDX-License-Identifier: Apache-2.0\n\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-erc20/contracts/src/v06/LibERC20TokenV06.sol\";\nimport \"@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol\";\n\ninterface IShell {\n\n function originSwap(\n IERC20TokenV06 from,\n IERC20TokenV06 to,\n uint256 fromAmount,\n uint256 minTargetAmount,\n uint256 deadline\n )\n external\n returns (uint256 toAmount);\n}\n\ncontract MixinShell {\n\n using LibERC20TokenV06 for IERC20TokenV06;\n\n function _tradeShell(\n IERC20TokenV06 sellToken,\n IERC20TokenV06 buyToken,\n uint256 sellAmount,\n bytes memory bridgeData\n )\n internal\n returns (uint256 boughtAmount)\n {\n IShell pool = abi.decode(bridgeData, (IShell));\n\n // Grant the Shell contract an allowance to sell the first token.\n IERC20TokenV06(sellToken).approveIfBelow(\n address(pool),\n sellAmount\n );\n\n boughtAmount = pool.originSwap(\n sellToken,\n buyToken,\n // Sell all tokens we hold.\n sellAmount,\n // Minimum buy amount.\n 1,\n // deadline\n block.timestamp + 1\n );\n return boughtAmount;\n }\n}\n"
|
|
},
|
|
"./mixins/MixinSushiswap.sol": {
|
|
"id": 15,
|
|
"content": "// SPDX-License-Identifier: Apache-2.0\n\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-erc20/contracts/src/v06/LibERC20TokenV06.sol\";\nimport \"@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol\";\nimport \"./MixinUniswapV2.sol\";\n\ncontract MixinSushiswap {\n\n using LibERC20TokenV06 for IERC20TokenV06;\n\n function _tradeSushiswap(\n IERC20TokenV06 buyToken,\n uint256 sellAmount,\n bytes memory bridgeData\n )\n internal\n returns (uint256 boughtAmount)\n {\n IERC20TokenV06[] memory path;\n IUniswapV2Router02 router;\n {\n address[] memory _path;\n (router, _path) =\n abi.decode(bridgeData, (IUniswapV2Router02, address[]));\n // To get around `abi.decode()` not supporting interface array types.\n assembly { path := _path }\n }\n\n require(path.length >= 2, \"MixinSushiswap/PATH_LENGTH_MUST_BE_AT_LEAST_TWO\");\n require(\n path[path.length - 1] == buyToken,\n \"MixinSushiswap/LAST_ELEMENT_OF_PATH_MUST_MATCH_OUTPUT_TOKEN\"\n );\n // Grant the Uniswap router an allowance to sell the first token.\n path[0].approveIfBelow(\n address(router),\n sellAmount\n );\n\n uint[] memory amounts = router.swapExactTokensForTokens(\n // Sell all tokens we hold.\n sellAmount,\n // Minimum buy amount.\n 1,\n // Convert to `buyToken` along this path.\n path,\n // Recipient is `this`.\n address(this),\n // Expires after this block.\n block.timestamp\n );\n return amounts[amounts.length-1];\n }\n}\n"
|
|
},
|
|
"./mixins/MixinUniswap.sol": {
|
|
"id": 16,
|
|
"content": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-erc20/contracts/src/v06/LibERC20TokenV06.sol\";\nimport \"@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol\";\nimport \"@0x/contracts-erc20/contracts/src/v06/IEtherTokenV06.sol\";\nimport \"../IBridgeAdapter.sol\";\n\ninterface IUniswapExchangeFactory {\n\n /// @dev Get the exchange for a token.\n /// @param token The token contract.\n function getExchange(IERC20TokenV06 token)\n external\n view\n returns (IUniswapExchange exchange);\n}\n\ninterface IUniswapExchange {\n\n /// @dev Buys at least `minTokensBought` tokens with ETH and transfer them\n /// to `recipient`.\n /// @param minTokensBought The minimum number of tokens to buy.\n /// @param deadline Time when this order expires.\n /// @param recipient Who to transfer the tokens to.\n /// @return tokensBought Amount of tokens bought.\n function ethToTokenTransferInput(\n uint256 minTokensBought,\n uint256 deadline,\n address recipient\n )\n external\n payable\n returns (uint256 tokensBought);\n\n /// @dev Buys at least `minEthBought` ETH with tokens.\n /// @param tokensSold Amount of tokens to sell.\n /// @param minEthBought The minimum amount of ETH to buy.\n /// @param deadline Time when this order expires.\n /// @return ethBought Amount of tokens bought.\n function tokenToEthSwapInput(\n uint256 tokensSold,\n uint256 minEthBought,\n uint256 deadline\n )\n external\n returns (uint256 ethBought);\n\n /// @dev Buys at least `minTokensBought` tokens with the exchange token\n /// and transfer them to `recipient`.\n /// @param tokensSold Amount of tokens to sell.\n /// @param minTokensBought The minimum number of tokens to buy.\n /// @param minEthBought The minimum amount of intermediate ETH to buy.\n /// @param deadline Time when this order expires.\n /// @param recipient Who to transfer the tokens to.\n /// @param buyToken The token being bought.\n /// @return tokensBought Amount of tokens bought.\n function tokenToTokenTransferInput(\n uint256 tokensSold,\n uint256 minTokensBought,\n uint256 minEthBought,\n uint256 deadline,\n address recipient,\n IERC20TokenV06 buyToken\n )\n external\n returns (uint256 tokensBought);\n\n /// @dev Buys at least `minTokensBought` tokens with the exchange token.\n /// @param tokensSold Amount of tokens to sell.\n /// @param minTokensBought The minimum number of tokens to buy.\n /// @param minEthBought The minimum amount of intermediate ETH to buy.\n /// @param deadline Time when this order expires.\n /// @param buyToken The token being bought.\n /// @return tokensBought Amount of tokens bought.\n function tokenToTokenSwapInput(\n uint256 tokensSold,\n uint256 minTokensBought,\n uint256 minEthBought,\n uint256 deadline,\n IERC20TokenV06 buyToken\n )\n external\n returns (uint256 tokensBought);\n}\n\ncontract MixinUniswap {\n\n using LibERC20TokenV06 for IERC20TokenV06;\n\n /// @dev Mainnet address of the WETH contract.\n IEtherTokenV06 private immutable WETH;\n\n constructor(IEtherTokenV06 weth)\n public\n {\n WETH = weth;\n }\n\n function _tradeUniswap(\n IERC20TokenV06 sellToken,\n IERC20TokenV06 buyToken,\n uint256 sellAmount,\n bytes memory bridgeData\n )\n internal\n returns (uint256 boughtAmount)\n {\n IUniswapExchangeFactory exchangeFactory =\n abi.decode(bridgeData, (IUniswapExchangeFactory));\n\n // Get the exchange for the token pair.\n IUniswapExchange exchange = _getUniswapExchangeForTokenPair(\n exchangeFactory,\n sellToken,\n buyToken\n );\n\n // Convert from WETH to a token.\n if (sellToken == WETH) {\n // Unwrap the WETH.\n WETH.withdraw(sellAmount);\n // Buy as much of `buyToken` token with ETH as possible\n boughtAmount = exchange.ethToTokenTransferInput{ value: sellAmount }(\n // Minimum buy amount.\n 1,\n // Expires after this block.\n block.timestamp,\n // Recipient is `this`.\n address(this)\n );\n\n // Convert from a token to WETH.\n } else if (buyToken == WETH) {\n // Grant the exchange an allowance.\n sellToken.approveIfBelow(\n address(exchange),\n sellAmount\n );\n // Buy as much ETH with `sellToken` token as possible.\n boughtAmount = exchange.tokenToEthSwapInput(\n // Sell all tokens we hold.\n sellAmount,\n // Minimum buy amount.\n 1,\n // Expires after this block.\n block.timestamp\n );\n // Wrap the ETH.\n WETH.deposit{ value: boughtAmount }();\n // Convert from one token to another.\n } else {\n // Grant the exchange an allowance.\n sellToken.approveIfBelow(\n address(exchange),\n sellAmount\n );\n // Buy as much `buyToken` token with `sellToken` token\n boughtAmount = exchange.tokenToTokenSwapInput(\n // Sell all tokens we hold.\n sellAmount,\n // Minimum buy amount.\n 1,\n // Must buy at least 1 intermediate wei of ETH.\n 1,\n // Expires after this block.\n block.timestamp,\n // Convert to `buyToken`.\n buyToken\n );\n }\n\n return boughtAmount;\n }\n\n /// @dev Retrieves the uniswap exchange for a given token pair.\n /// In the case of a WETH-token exchange, this will be the non-WETH token.\n /// In th ecase of a token-token exchange, this will be the first token.\n /// @param exchangeFactory The exchange factory.\n /// @param sellToken The address of the token we are converting from.\n /// @param buyToken The address of the token we are converting to.\n /// @return exchange The uniswap exchange.\n function _getUniswapExchangeForTokenPair(\n IUniswapExchangeFactory exchangeFactory,\n IERC20TokenV06 sellToken,\n IERC20TokenV06 buyToken\n )\n private\n view\n returns (IUniswapExchange exchange)\n {\n // Whichever isn't WETH is the exchange token.\n exchange = sellToken == WETH\n ? exchangeFactory.getExchange(buyToken)\n : exchangeFactory.getExchange(sellToken);\n require(address(exchange) != address(0), \"MixinUniswap/NO_EXCHANGE\");\n }\n}\n"
|
|
},
|
|
"./mixins/MixinZeroExBridge.sol": {
|
|
"id": 18,
|
|
"content": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\n\nimport \"@0x/contracts-erc20/contracts/src/v06/LibERC20TokenV06.sol\";\nimport \"@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol\";\nimport \"@0x/contracts-utils/contracts/src/v06/LibSafeMathV06.sol\";\nimport \"../../../vendor/ILiquidityProvider.sol\";\n\n\ncontract MixinZeroExBridge {\n\n using LibERC20TokenV06 for IERC20TokenV06;\n using LibSafeMathV06 for uint256;\n\n function _tradeZeroExBridge(\n IERC20TokenV06 sellToken,\n IERC20TokenV06 buyToken,\n uint256 sellAmount,\n bytes memory bridgeData\n )\n internal\n returns (uint256 boughtAmount)\n {\n (ILiquidityProvider provider, bytes memory lpData) =\n abi.decode(bridgeData, (ILiquidityProvider, bytes));\n // Trade the good old fashioned way\n sellToken.compatTransfer(\n address(provider),\n sellAmount\n );\n boughtAmount = provider.sellTokenForToken(\n sellToken,\n buyToken,\n address(this), // recipient\n 1, // minBuyAmount\n lpData\n );\n }\n}\n"
|
|
},
|
|
"../../vendor/ILiquidityProvider.sol": {
|
|
"id": 19,
|
|
"content": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\n\nimport \"@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol\";\n\n\ninterface ILiquidityProvider {\n\n /// @dev An optional event an LP can emit for each fill against a source.\n /// @param inputToken The input token.\n /// @param outputToken The output token.\n /// @param inputTokenAmount How much input token was sold.\n /// @param outputTokenAmount How much output token was bought.\n /// @param sourceId A bytes32 encoded ascii source ID. E.g., `bytes32('Curve')`/\n /// @param sourceAddress An optional address associated with the source (e.g, a curve pool).\n /// @param sourceId A bytes32 encoded ascii source ID. E.g., `bytes32('Curve')`/\n /// @param sourceAddress An optional address associated with the source (e.g, a curve pool).\n /// @param sender The caller of the LP.\n /// @param recipient The recipient of the output tokens.\n event LiquidityProviderFill(\n IERC20TokenV06 inputToken,\n IERC20TokenV06 outputToken,\n uint256 inputTokenAmount,\n uint256 outputTokenAmount,\n bytes32 sourceId,\n address sourceAddress,\n address sender,\n address recipient\n );\n\n /// @dev Trades `inputToken` for `outputToken`. The amount of `inputToken`\n /// to sell must be transferred to the contract prior to calling this\n /// function to trigger the trade.\n /// @param inputToken The token being sold.\n /// @param outputToken The token being bought.\n /// @param recipient The recipient of the bought tokens.\n /// @param minBuyAmount The minimum acceptable amount of `outputToken` to buy.\n /// @param auxiliaryData Arbitrary auxiliary data supplied to the contract.\n /// @return boughtAmount The amount of `outputToken` bought.\n function sellTokenForToken(\n IERC20TokenV06 inputToken,\n IERC20TokenV06 outputToken,\n address recipient,\n uint256 minBuyAmount,\n bytes calldata auxiliaryData\n )\n external\n returns (uint256 boughtAmount);\n\n /// @dev Trades ETH for token. ETH must either be attached to this function\n /// call or sent to the contract prior to calling this function to\n /// trigger the trade.\n /// @param outputToken The token being bought.\n /// @param recipient The recipient of the bought tokens.\n /// @param minBuyAmount The minimum acceptable amount of `outputToken` to buy.\n /// @param auxiliaryData Arbitrary auxiliary data supplied to the contract.\n /// @return boughtAmount The amount of `outputToken` bought.\n function sellEthForToken(\n IERC20TokenV06 outputToken,\n address recipient,\n uint256 minBuyAmount,\n bytes calldata auxiliaryData\n )\n external\n payable\n returns (uint256 boughtAmount);\n\n /// @dev Trades token for ETH. The token must be sent to the contract prior\n /// to calling this function to trigger the trade.\n /// @param inputToken The token being sold.\n /// @param recipient The recipient of the bought tokens.\n /// @param minBuyAmount The minimum acceptable amount of ETH to buy.\n /// @param auxiliaryData Arbitrary auxiliary data supplied to the contract.\n /// @return boughtAmount The amount of ETH bought.\n function sellTokenForEth(\n IERC20TokenV06 inputToken,\n address payable recipient,\n uint256 minBuyAmount,\n bytes calldata auxiliaryData\n )\n external\n returns (uint256 boughtAmount);\n\n /// @dev Quotes the amount of `outputToken` that would be obtained by\n /// selling `sellAmount` of `inputToken`.\n /// @param inputToken Address of the taker token (what to sell). Use\n /// the wETH address if selling ETH.\n /// @param outputToken Address of the maker token (what to buy). Use\n /// the wETH address if buying ETH.\n /// @param sellAmount Amount of `inputToken` to sell.\n /// @return outputTokenAmount Amount of `outputToken` that would be obtained.\n function getSellQuote(\n IERC20TokenV06 inputToken,\n IERC20TokenV06 outputToken,\n uint256 sellAmount\n )\n external\n view\n returns (uint256 outputTokenAmount);\n}\n"
|
|
}
|
|
},
|
|
"sourceCodes": {
|
|
"./BridgeAdapter.sol": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\npragma experimental ABIEncoderV2;\n\nimport \"./IBridgeAdapter.sol\";\nimport \"./BridgeSource.sol\";\nimport \"./mixins/MixinBalancer.sol\";\nimport \"./mixins/MixinBancor.sol\";\nimport \"./mixins/MixinCoFiX.sol\";\nimport \"./mixins/MixinCurve.sol\";\nimport \"./mixins/MixinCryptoCom.sol\";\nimport \"./mixins/MixinDodo.sol\";\nimport \"./mixins/MixinDodoV2.sol\";\nimport \"./mixins/MixinKyber.sol\";\nimport \"./mixins/MixinMooniswap.sol\";\nimport \"./mixins/MixinMStable.sol\";\nimport \"./mixins/MixinOasis.sol\";\nimport \"./mixins/MixinShell.sol\";\nimport \"./mixins/MixinSushiswap.sol\";\nimport \"./mixins/MixinUniswap.sol\";\nimport \"./mixins/MixinUniswapV2.sol\";\nimport \"./mixins/MixinZeroExBridge.sol\";\n\ncontract BridgeAdapter is\n IBridgeAdapter,\n MixinBalancer,\n MixinBancor,\n MixinCoFiX,\n MixinCurve,\n MixinCryptoCom,\n MixinDodo,\n MixinDodoV2,\n MixinKyber,\n MixinMooniswap,\n MixinMStable,\n MixinOasis,\n MixinShell,\n MixinSushiswap,\n MixinUniswap,\n MixinUniswapV2,\n MixinZeroExBridge\n{\n constructor(IEtherTokenV06 weth)\n public\n MixinBalancer()\n MixinBancor(weth)\n MixinCoFiX()\n MixinCurve()\n MixinCryptoCom()\n MixinDodo()\n MixinDodoV2()\n MixinKyber(weth)\n MixinMooniswap(weth)\n MixinMStable()\n MixinOasis()\n MixinShell()\n MixinSushiswap()\n MixinUniswap(weth)\n MixinUniswapV2()\n MixinZeroExBridge()\n {}\n\n function trade(\n BridgeOrder memory order,\n IERC20TokenV06 sellToken,\n IERC20TokenV06 buyToken,\n uint256 sellAmount\n )\n public\n override\n returns (uint256 boughtAmount)\n {\n if (order.source == BridgeSource.CURVE ||\n order.source == BridgeSource.SWERVE ||\n order.source == BridgeSource.SNOWSWAP) {\n boughtAmount = _tradeCurve(\n sellToken,\n buyToken,\n sellAmount,\n order.bridgeData\n );\n } else if (order.source == BridgeSource.SUSHISWAP) {\n boughtAmount = _tradeSushiswap(\n buyToken,\n sellAmount,\n order.bridgeData\n );\n } else if (order.source == BridgeSource.UNISWAPV2 ||\n order.source == BridgeSource.LINKSWAP) {\n boughtAmount = _tradeUniswapV2(\n buyToken,\n sellAmount,\n order.bridgeData\n );\n } else if (order.source == BridgeSource.UNISWAP) {\n boughtAmount = _tradeUniswap(\n sellToken,\n buyToken,\n sellAmount,\n order.bridgeData\n );\n } else if (order.source == BridgeSource.BALANCER ||\n order.source == BridgeSource.CREAM) {\n boughtAmount = _tradeBalancer(\n sellToken,\n buyToken,\n sellAmount,\n order.bridgeData\n );\n } else if (order.source == BridgeSource.KYBER) {\n boughtAmount = _tradeKyber(\n sellToken,\n buyToken,\n sellAmount,\n order.bridgeData\n );\n } else if (order.source == BridgeSource.MOONISWAP) {\n boughtAmount = _tradeMooniswap(\n sellToken,\n buyToken,\n sellAmount,\n order.bridgeData\n );\n } else if (order.source == BridgeSource.MSTABLE) {\n boughtAmount = _tradeMStable(\n sellToken,\n buyToken,\n sellAmount,\n order.bridgeData\n );\n } else if (order.source == BridgeSource.OASIS) {\n boughtAmount = _tradeOasis(\n sellToken,\n buyToken,\n sellAmount,\n order.bridgeData\n );\n } else if (order.source == BridgeSource.SHELL) {\n boughtAmount = _tradeShell(\n sellToken,\n buyToken,\n sellAmount,\n order.bridgeData\n );\n } else if (order.source == BridgeSource.DODO) {\n boughtAmount = _tradeDodo(\n sellToken,\n sellAmount,\n order.bridgeData\n );\n } else if (order.source == BridgeSource.DODOV2) {\n boughtAmount = _tradeDodoV2(\n sellToken,\n sellAmount,\n order.bridgeData\n );\n } else if (order.source == BridgeSource.CRYPTOCOM) {\n boughtAmount = _tradeCryptoCom(\n buyToken,\n sellAmount,\n order.bridgeData\n );\n } else if (order.source == BridgeSource.BANCOR) {\n boughtAmount = _tradeBancor(\n buyToken,\n sellAmount,\n order.bridgeData\n );\n } else if (order.source == BridgeSource.COFIX) {\n boughtAmount = _tradeCoFiX(\n sellToken,\n buyToken,\n sellAmount,\n order.bridgeData\n );\n } else {\n boughtAmount = _tradeZeroExBridge(\n sellToken,\n buyToken,\n sellAmount,\n order.bridgeData\n );\n }\n\n emit BridgeFill(\n order.source,\n sellToken,\n buyToken,\n sellAmount,\n boughtAmount\n );\n }\n}\n",
|
|
"./IBridgeAdapter.sol": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol\";\n\n\ninterface IBridgeAdapter {\n\n struct BridgeOrder {\n uint256 source;\n uint256 takerTokenAmount;\n uint256 makerTokenAmount;\n bytes bridgeData;\n }\n\n /// @dev Emitted when tokens are swapped with an external source.\n /// @param source The unique ID for the source. See `BridgeSource.sol`\n /// @param inputToken The token the bridge is converting from.\n /// @param outputToken The token the bridge is converting to.\n /// @param inputTokenAmount Amount of input token sold.\n /// @param outputTokenAmount Amount of output token bought.\n event BridgeFill(\n uint256 source,\n IERC20TokenV06 inputToken,\n IERC20TokenV06 outputToken,\n uint256 inputTokenAmount,\n uint256 outputTokenAmount\n );\n\n function trade(\n BridgeOrder calldata order,\n IERC20TokenV06 sellToken,\n IERC20TokenV06 buyToken,\n uint256 sellAmount\n )\n external\n returns (uint256 boughtAmount);\n}\n",
|
|
"@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\n\n\ninterface IERC20TokenV06 {\n\n // solhint-disable no-simple-event-func-name\n event Transfer(\n address indexed from,\n address indexed to,\n uint256 value\n );\n\n event Approval(\n address indexed owner,\n address indexed spender,\n uint256 value\n );\n\n /// @dev send `value` token to `to` from `msg.sender`\n /// @param to The address of the recipient\n /// @param value The amount of token to be transferred\n /// @return True if transfer was successful\n function transfer(address to, uint256 value)\n external\n returns (bool);\n\n /// @dev send `value` token to `to` from `from` on the condition it is approved by `from`\n /// @param from The address of the sender\n /// @param to The address of the recipient\n /// @param value The amount of token to be transferred\n /// @return True if transfer was successful\n function transferFrom(\n address from,\n address to,\n uint256 value\n )\n external\n returns (bool);\n\n /// @dev `msg.sender` approves `spender` to spend `value` tokens\n /// @param spender The address of the account able to transfer the tokens\n /// @param value The amount of wei to be approved for transfer\n /// @return Always true if the call has enough gas to complete execution\n function approve(address spender, uint256 value)\n external\n returns (bool);\n\n /// @dev Query total supply of token\n /// @return Total supply of token\n function totalSupply()\n external\n view\n returns (uint256);\n\n /// @dev Get the balance of `owner`.\n /// @param owner The address from which the balance will be retrieved\n /// @return Balance of owner\n function balanceOf(address owner)\n external\n view\n returns (uint256);\n\n /// @dev Get the allowance for `spender` to spend from `owner`.\n /// @param owner The address of the account owning tokens\n /// @param spender The address of the account able to transfer the tokens\n /// @return Amount of remaining tokens allowed to spent\n function allowance(address owner, address spender)\n external\n view\n returns (uint256);\n\n /// @dev Get the number of decimals this token has.\n function decimals()\n external\n view\n returns (uint8);\n}\n",
|
|
"./BridgeSource.sol": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\npragma experimental ABIEncoderV2;\n\n\nlibrary BridgeSource {\n uint256 constant internal BALANCER = 0;\n uint256 constant internal BANCOR = 1;\n uint256 constant internal COFIX = 2;\n uint256 constant internal CURVE = 3;\n uint256 constant internal CREAM = 4;\n uint256 constant internal CRYPTOCOM = 5;\n uint256 constant internal DODO = 6;\n uint256 constant internal KYBER = 7;\n uint256 constant internal LIQUIDITYPROVIDER = 8;\n uint256 constant internal MOONISWAP = 9;\n uint256 constant internal MSTABLE = 10;\n uint256 constant internal OASIS = 11;\n uint256 constant internal SHELL = 12;\n uint256 constant internal SNOWSWAP = 13;\n uint256 constant internal SUSHISWAP = 14;\n uint256 constant internal SWERVE = 15;\n uint256 constant internal UNISWAP = 16;\n uint256 constant internal UNISWAPV2 = 17;\n uint256 constant internal DODOV2 = 18;\n uint256 constant internal LINKSWAP = 19;\n // New sources should be APPENDED to this list, taking the next highest\n // integer value.\n}\n",
|
|
"./mixins/MixinBalancer.sol": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\n\nimport \"@0x/contracts-erc20/contracts/src/v06/LibERC20TokenV06.sol\";\nimport \"@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol\";\n\ninterface IBalancerPool {\n /// @dev Sell `tokenAmountIn` of `tokenIn` and receive `tokenOut`.\n /// @param tokenIn The token being sold\n /// @param tokenAmountIn The amount of `tokenIn` to sell.\n /// @param tokenOut The token being bought.\n /// @param minAmountOut The minimum amount of `tokenOut` to buy.\n /// @param maxPrice The maximum value for `spotPriceAfter`.\n /// @return tokenAmountOut The amount of `tokenOut` bought.\n /// @return spotPriceAfter The new marginal spot price of the given\n /// token pair for this pool.\n function swapExactAmountIn(\n IERC20TokenV06 tokenIn,\n uint tokenAmountIn,\n IERC20TokenV06 tokenOut,\n uint minAmountOut,\n uint maxPrice\n ) external returns (uint tokenAmountOut, uint spotPriceAfter);\n}\n\ncontract MixinBalancer {\n\n using LibERC20TokenV06 for IERC20TokenV06;\n\n function _tradeBalancer(\n IERC20TokenV06 sellToken,\n IERC20TokenV06 buyToken,\n uint256 sellAmount,\n bytes memory bridgeData\n )\n internal\n returns (uint256 boughtAmount)\n {\n // Decode the bridge data.\n (IBalancerPool pool) = abi.decode(\n bridgeData,\n (IBalancerPool)\n );\n sellToken.approveIfBelow(\n address(pool),\n sellAmount\n );\n // Sell all of this contract's `sellToken` token balance.\n (boughtAmount,) = pool.swapExactAmountIn(\n sellToken, // tokenIn\n sellAmount, // tokenAmountIn\n buyToken, // tokenOut\n 1, // minAmountOut\n uint256(-1) // maxPrice\n );\n return boughtAmount;\n }\n}\n",
|
|
"@0x/contracts-erc20/contracts/src/v06/LibERC20TokenV06.sol": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\n\nimport \"@0x/contracts-utils/contracts/src/v06/errors/LibRichErrorsV06.sol\";\nimport \"@0x/contracts-utils/contracts/src/v06/LibBytesV06.sol\";\nimport \"./IERC20TokenV06.sol\";\n\n\nlibrary LibERC20TokenV06 {\n bytes constant private DECIMALS_CALL_DATA = hex\"313ce567\";\n\n /// @dev Calls `IERC20TokenV06(token).approve()`.\n /// Reverts if the result fails `isSuccessfulResult()` or the call reverts.\n /// @param token The address of the token contract.\n /// @param spender The address that receives an allowance.\n /// @param allowance The allowance to set.\n function compatApprove(\n IERC20TokenV06 token,\n address spender,\n uint256 allowance\n )\n internal\n {\n bytes memory callData = abi.encodeWithSelector(\n token.approve.selector,\n spender,\n allowance\n );\n _callWithOptionalBooleanResult(address(token), callData);\n }\n\n /// @dev Calls `IERC20TokenV06(token).approve()` and sets the allowance to the\n /// maximum if the current approval is not already >= an amount.\n /// Reverts if the result fails `isSuccessfulResult()` or the call reverts.\n /// @param token The address of the token contract.\n /// @param spender The address that receives an allowance.\n /// @param amount The minimum allowance needed.\n function approveIfBelow(\n IERC20TokenV06 token,\n address spender,\n uint256 amount\n )\n internal\n {\n if (token.allowance(address(this), spender) < amount) {\n compatApprove(token, spender, uint256(-1));\n }\n }\n\n /// @dev Calls `IERC20TokenV06(token).transfer()`.\n /// Reverts if the result fails `isSuccessfulResult()` or the call reverts.\n /// @param token The address of the token contract.\n /// @param to The address that receives the tokens\n /// @param amount Number of tokens to transfer.\n function compatTransfer(\n IERC20TokenV06 token,\n address to,\n uint256 amount\n )\n internal\n {\n bytes memory callData = abi.encodeWithSelector(\n token.transfer.selector,\n to,\n amount\n );\n _callWithOptionalBooleanResult(address(token), callData);\n }\n\n /// @dev Calls `IERC20TokenV06(token).transferFrom()`.\n /// Reverts if the result fails `isSuccessfulResult()` or the call reverts.\n /// @param token The address of the token contract.\n /// @param from The owner of the tokens.\n /// @param to The address that receives the tokens\n /// @param amount Number of tokens to transfer.\n function compatTransferFrom(\n IERC20TokenV06 token,\n address from,\n address to,\n uint256 amount\n )\n internal\n {\n bytes memory callData = abi.encodeWithSelector(\n token.transferFrom.selector,\n from,\n to,\n amount\n );\n _callWithOptionalBooleanResult(address(token), callData);\n }\n\n /// @dev Retrieves the number of decimals for a token.\n /// Returns `18` if the call reverts.\n /// @param token The address of the token contract.\n /// @return tokenDecimals The number of decimals places for the token.\n function compatDecimals(IERC20TokenV06 token)\n internal\n view\n returns (uint8 tokenDecimals)\n {\n tokenDecimals = 18;\n (bool didSucceed, bytes memory resultData) = address(token).staticcall(DECIMALS_CALL_DATA);\n if (didSucceed && resultData.length >= 32) {\n tokenDecimals = uint8(LibBytesV06.readUint256(resultData, 0));\n }\n }\n\n /// @dev Retrieves the allowance for a token, owner, and spender.\n /// Returns `0` if the call reverts.\n /// @param token The address of the token contract.\n /// @param owner The owner of the tokens.\n /// @param spender The address the spender.\n /// @return allowance_ The allowance for a token, owner, and spender.\n function compatAllowance(IERC20TokenV06 token, address owner, address spender)\n internal\n view\n returns (uint256 allowance_)\n {\n (bool didSucceed, bytes memory resultData) = address(token).staticcall(\n abi.encodeWithSelector(\n token.allowance.selector,\n owner,\n spender\n )\n );\n if (didSucceed && resultData.length >= 32) {\n allowance_ = LibBytesV06.readUint256(resultData, 0);\n }\n }\n\n /// @dev Retrieves the balance for a token owner.\n /// Returns `0` if the call reverts.\n /// @param token The address of the token contract.\n /// @param owner The owner of the tokens.\n /// @return balance The token balance of an owner.\n function compatBalanceOf(IERC20TokenV06 token, address owner)\n internal\n view\n returns (uint256 balance)\n {\n (bool didSucceed, bytes memory resultData) = address(token).staticcall(\n abi.encodeWithSelector(\n token.balanceOf.selector,\n owner\n )\n );\n if (didSucceed && resultData.length >= 32) {\n balance = LibBytesV06.readUint256(resultData, 0);\n }\n }\n\n /// @dev Check if the data returned by a non-static call to an ERC20 token\n /// is a successful result. Supported functions are `transfer()`,\n /// `transferFrom()`, and `approve()`.\n /// @param resultData The raw data returned by a non-static call to the ERC20 token.\n /// @return isSuccessful Whether the result data indicates success.\n function isSuccessfulResult(bytes memory resultData)\n internal\n pure\n returns (bool isSuccessful)\n {\n if (resultData.length == 0) {\n return true;\n }\n if (resultData.length >= 32) {\n uint256 result = LibBytesV06.readUint256(resultData, 0);\n if (result == 1) {\n return true;\n }\n }\n }\n\n /// @dev Executes a call on address `target` with calldata `callData`\n /// and asserts that either nothing was returned or a single boolean\n /// was returned equal to `true`.\n /// @param target The call target.\n /// @param callData The abi-encoded call data.\n function _callWithOptionalBooleanResult(\n address target,\n bytes memory callData\n )\n private\n {\n (bool didSucceed, bytes memory resultData) = target.call(callData);\n if (didSucceed && isSuccessfulResult(resultData)) {\n return;\n }\n LibRichErrorsV06.rrevert(resultData);\n }\n}\n",
|
|
"@0x/contracts-utils/contracts/src/v06/errors/LibRichErrorsV06.sol": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\n\n\nlibrary LibRichErrorsV06 {\n\n // bytes4(keccak256(\"Error(string)\"))\n bytes4 internal constant STANDARD_ERROR_SELECTOR = 0x08c379a0;\n\n // solhint-disable func-name-mixedcase\n /// @dev ABI encode a standard, string revert error payload.\n /// This is the same payload that would be included by a `revert(string)`\n /// solidity statement. It has the function signature `Error(string)`.\n /// @param message The error string.\n /// @return The ABI encoded error.\n function StandardError(string memory message)\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n STANDARD_ERROR_SELECTOR,\n bytes(message)\n );\n }\n // solhint-enable func-name-mixedcase\n\n /// @dev Reverts an encoded rich revert reason `errorData`.\n /// @param errorData ABI encoded error data.\n function rrevert(bytes memory errorData)\n internal\n pure\n {\n assembly {\n revert(add(errorData, 0x20), mload(errorData))\n }\n }\n}\n",
|
|
"@0x/contracts-utils/contracts/src/v06/LibBytesV06.sol": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\n\nimport \"./errors/LibBytesRichErrorsV06.sol\";\nimport \"./errors/LibRichErrorsV06.sol\";\n\n\nlibrary LibBytesV06 {\n\n using LibBytesV06 for bytes;\n\n /// @dev Gets the memory address for a byte array.\n /// @param input Byte array to lookup.\n /// @return memoryAddress Memory address of byte array. This\n /// points to the header of the byte array which contains\n /// the length.\n function rawAddress(bytes memory input)\n internal\n pure\n returns (uint256 memoryAddress)\n {\n assembly {\n memoryAddress := input\n }\n return memoryAddress;\n }\n\n /// @dev Gets the memory address for the contents of a byte array.\n /// @param input Byte array to lookup.\n /// @return memoryAddress Memory address of the contents of the byte array.\n function contentAddress(bytes memory input)\n internal\n pure\n returns (uint256 memoryAddress)\n {\n assembly {\n memoryAddress := add(input, 32)\n }\n return memoryAddress;\n }\n\n /// @dev Copies `length` bytes from memory location `source` to `dest`.\n /// @param dest memory address to copy bytes to.\n /// @param source memory address to copy bytes from.\n /// @param length number of bytes to copy.\n function memCopy(\n uint256 dest,\n uint256 source,\n uint256 length\n )\n internal\n pure\n {\n if (length < 32) {\n // Handle a partial word by reading destination and masking\n // off the bits we are interested in.\n // This correctly handles overlap, zero lengths and source == dest\n assembly {\n let mask := sub(exp(256, sub(32, length)), 1)\n let s := and(mload(source), not(mask))\n let d := and(mload(dest), mask)\n mstore(dest, or(s, d))\n }\n } else {\n // Skip the O(length) loop when source == dest.\n if (source == dest) {\n return;\n }\n\n // For large copies we copy whole words at a time. The final\n // word is aligned to the end of the range (instead of after the\n // previous) to handle partial words. So a copy will look like this:\n //\n // ####\n // ####\n // ####\n // ####\n //\n // We handle overlap in the source and destination range by\n // changing the copying direction. This prevents us from\n // overwriting parts of source that we still need to copy.\n //\n // This correctly handles source == dest\n //\n if (source > dest) {\n assembly {\n // We subtract 32 from `sEnd` and `dEnd` because it\n // is easier to compare with in the loop, and these\n // are also the addresses we need for copying the\n // last bytes.\n length := sub(length, 32)\n let sEnd := add(source, length)\n let dEnd := add(dest, length)\n\n // Remember the last 32 bytes of source\n // This needs to be done here and not after the loop\n // because we may have overwritten the last bytes in\n // source already due to overlap.\n let last := mload(sEnd)\n\n // Copy whole words front to back\n // Note: the first check is always true,\n // this could have been a do-while loop.\n // solhint-disable-next-line no-empty-blocks\n for {} lt(source, sEnd) {} {\n mstore(dest, mload(source))\n source := add(source, 32)\n dest := add(dest, 32)\n }\n\n // Write the last 32 bytes\n mstore(dEnd, last)\n }\n } else {\n assembly {\n // We subtract 32 from `sEnd` and `dEnd` because those\n // are the starting points when copying a word at the end.\n length := sub(length, 32)\n let sEnd := add(source, length)\n let dEnd := add(dest, length)\n\n // Remember the first 32 bytes of source\n // This needs to be done here and not after the loop\n // because we may have overwritten the first bytes in\n // source already due to overlap.\n let first := mload(source)\n\n // Copy whole words back to front\n // We use a signed comparisson here to allow dEnd to become\n // negative (happens when source and dest < 32). Valid\n // addresses in local memory will never be larger than\n // 2**255, so they can be safely re-interpreted as signed.\n // Note: the first check is always true,\n // this could have been a do-while loop.\n // solhint-disable-next-line no-empty-blocks\n for {} slt(dest, dEnd) {} {\n mstore(dEnd, mload(sEnd))\n sEnd := sub(sEnd, 32)\n dEnd := sub(dEnd, 32)\n }\n\n // Write the first 32 bytes\n mstore(dest, first)\n }\n }\n }\n }\n\n /// @dev Returns a slices from a byte array.\n /// @param b The byte array to take a slice from.\n /// @param from The starting index for the slice (inclusive).\n /// @param to The final index for the slice (exclusive).\n /// @return result The slice containing bytes at indices [from, to)\n function slice(\n bytes memory b,\n uint256 from,\n uint256 to\n )\n internal\n pure\n returns (bytes memory result)\n {\n // Ensure that the from and to positions are valid positions for a slice within\n // the byte array that is being used.\n if (from > to) {\n LibRichErrorsV06.rrevert(LibBytesRichErrorsV06.InvalidByteOperationError(\n LibBytesRichErrorsV06.InvalidByteOperationErrorCodes.FromLessThanOrEqualsToRequired,\n from,\n to\n ));\n }\n if (to > b.length) {\n LibRichErrorsV06.rrevert(LibBytesRichErrorsV06.InvalidByteOperationError(\n LibBytesRichErrorsV06.InvalidByteOperationErrorCodes.ToLessThanOrEqualsLengthRequired,\n to,\n b.length\n ));\n }\n\n // Create a new bytes structure and copy contents\n result = new bytes(to - from);\n memCopy(\n result.contentAddress(),\n b.contentAddress() + from,\n result.length\n );\n return result;\n }\n\n /// @dev Returns a slice from a byte array without preserving the input.\n /// When `from == 0`, the original array will match the slice.\n /// In other cases its state will be corrupted.\n /// @param b The byte array to take a slice from. Will be destroyed in the process.\n /// @param from The starting index for the slice (inclusive).\n /// @param to The final index for the slice (exclusive).\n /// @return result The slice containing bytes at indices [from, to)\n function sliceDestructive(\n bytes memory b,\n uint256 from,\n uint256 to\n )\n internal\n pure\n returns (bytes memory result)\n {\n // Ensure that the from and to positions are valid positions for a slice within\n // the byte array that is being used.\n if (from > to) {\n LibRichErrorsV06.rrevert(LibBytesRichErrorsV06.InvalidByteOperationError(\n LibBytesRichErrorsV06.InvalidByteOperationErrorCodes.FromLessThanOrEqualsToRequired,\n from,\n to\n ));\n }\n if (to > b.length) {\n LibRichErrorsV06.rrevert(LibBytesRichErrorsV06.InvalidByteOperationError(\n LibBytesRichErrorsV06.InvalidByteOperationErrorCodes.ToLessThanOrEqualsLengthRequired,\n to,\n b.length\n ));\n }\n\n // Create a new bytes structure around [from, to) in-place.\n assembly {\n result := add(b, from)\n mstore(result, sub(to, from))\n }\n return result;\n }\n\n /// @dev Pops the last byte off of a byte array by modifying its length.\n /// @param b Byte array that will be modified.\n /// @return result The byte that was popped off.\n function popLastByte(bytes memory b)\n internal\n pure\n returns (bytes1 result)\n {\n if (b.length == 0) {\n LibRichErrorsV06.rrevert(LibBytesRichErrorsV06.InvalidByteOperationError(\n LibBytesRichErrorsV06.InvalidByteOperationErrorCodes.LengthGreaterThanZeroRequired,\n b.length,\n 0\n ));\n }\n\n // Store last byte.\n result = b[b.length - 1];\n\n assembly {\n // Decrement length of byte array.\n let newLen := sub(mload(b), 1)\n mstore(b, newLen)\n }\n return result;\n }\n\n /// @dev Tests equality of two byte arrays.\n /// @param lhs First byte array to compare.\n /// @param rhs Second byte array to compare.\n /// @return equal True if arrays are the same. False otherwise.\n function equals(\n bytes memory lhs,\n bytes memory rhs\n )\n internal\n pure\n returns (bool equal)\n {\n // Keccak gas cost is 30 + numWords * 6. This is a cheap way to compare.\n // We early exit on unequal lengths, but keccak would also correctly\n // handle this.\n return lhs.length == rhs.length && keccak256(lhs) == keccak256(rhs);\n }\n\n /// @dev Reads an address from a position in a byte array.\n /// @param b Byte array containing an address.\n /// @param index Index in byte array of address.\n /// @return result address from byte array.\n function readAddress(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (address result)\n {\n if (b.length < index + 20) {\n LibRichErrorsV06.rrevert(LibBytesRichErrorsV06.InvalidByteOperationError(\n LibBytesRichErrorsV06.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsTwentyRequired,\n b.length,\n index + 20 // 20 is length of address\n ));\n }\n\n // Add offset to index:\n // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)\n // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)\n index += 20;\n\n // Read address from array memory\n assembly {\n // 1. Add index to address of bytes array\n // 2. Load 32-byte word from memory\n // 3. Apply 20-byte mask to obtain address\n result := and(mload(add(b, index)), 0xffffffffffffffffffffffffffffffffffffffff)\n }\n return result;\n }\n\n /// @dev Writes an address into a specific position in a byte array.\n /// @param b Byte array to insert address into.\n /// @param index Index in byte array of address.\n /// @param input Address to put into byte array.\n function writeAddress(\n bytes memory b,\n uint256 index,\n address input\n )\n internal\n pure\n {\n if (b.length < index + 20) {\n LibRichErrorsV06.rrevert(LibBytesRichErrorsV06.InvalidByteOperationError(\n LibBytesRichErrorsV06.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsTwentyRequired,\n b.length,\n index + 20 // 20 is length of address\n ));\n }\n\n // Add offset to index:\n // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)\n // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)\n index += 20;\n\n // Store address into array memory\n assembly {\n // The address occupies 20 bytes and mstore stores 32 bytes.\n // First fetch the 32-byte word where we'll be storing the address, then\n // apply a mask so we have only the bytes in the word that the address will not occupy.\n // Then combine these bytes with the address and store the 32 bytes back to memory with mstore.\n\n // 1. Add index to address of bytes array\n // 2. Load 32-byte word from memory\n // 3. Apply 12-byte mask to obtain extra bytes occupying word of memory where we'll store the address\n let neighbors := and(\n mload(add(b, index)),\n 0xffffffffffffffffffffffff0000000000000000000000000000000000000000\n )\n\n // Make sure input address is clean.\n // (Solidity does not guarantee this)\n input := and(input, 0xffffffffffffffffffffffffffffffffffffffff)\n\n // Store the neighbors and address into memory\n mstore(add(b, index), xor(input, neighbors))\n }\n }\n\n /// @dev Reads a bytes32 value from a position in a byte array.\n /// @param b Byte array containing a bytes32 value.\n /// @param index Index in byte array of bytes32 value.\n /// @return result bytes32 value from byte array.\n function readBytes32(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (bytes32 result)\n {\n if (b.length < index + 32) {\n LibRichErrorsV06.rrevert(LibBytesRichErrorsV06.InvalidByteOperationError(\n LibBytesRichErrorsV06.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsThirtyTwoRequired,\n b.length,\n index + 32\n ));\n }\n\n // Arrays are prefixed by a 256 bit length parameter\n index += 32;\n\n // Read the bytes32 from array memory\n assembly {\n result := mload(add(b, index))\n }\n return result;\n }\n\n /// @dev Writes a bytes32 into a specific position in a byte array.\n /// @param b Byte array to insert <input> into.\n /// @param index Index in byte array of <input>.\n /// @param input bytes32 to put into byte array.\n function writeBytes32(\n bytes memory b,\n uint256 index,\n bytes32 input\n )\n internal\n pure\n {\n if (b.length < index + 32) {\n LibRichErrorsV06.rrevert(LibBytesRichErrorsV06.InvalidByteOperationError(\n LibBytesRichErrorsV06.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsThirtyTwoRequired,\n b.length,\n index + 32\n ));\n }\n\n // Arrays are prefixed by a 256 bit length parameter\n index += 32;\n\n // Read the bytes32 from array memory\n assembly {\n mstore(add(b, index), input)\n }\n }\n\n /// @dev Reads a uint256 value from a position in a byte array.\n /// @param b Byte array containing a uint256 value.\n /// @param index Index in byte array of uint256 value.\n /// @return result uint256 value from byte array.\n function readUint256(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (uint256 result)\n {\n result = uint256(readBytes32(b, index));\n return result;\n }\n\n /// @dev Writes a uint256 into a specific position in a byte array.\n /// @param b Byte array to insert <input> into.\n /// @param index Index in byte array of <input>.\n /// @param input uint256 to put into byte array.\n function writeUint256(\n bytes memory b,\n uint256 index,\n uint256 input\n )\n internal\n pure\n {\n writeBytes32(b, index, bytes32(input));\n }\n\n /// @dev Reads an unpadded bytes4 value from a position in a byte array.\n /// @param b Byte array containing a bytes4 value.\n /// @param index Index in byte array of bytes4 value.\n /// @return result bytes4 value from byte array.\n function readBytes4(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (bytes4 result)\n {\n if (b.length < index + 4) {\n LibRichErrorsV06.rrevert(LibBytesRichErrorsV06.InvalidByteOperationError(\n LibBytesRichErrorsV06.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsFourRequired,\n b.length,\n index + 4\n ));\n }\n\n // Arrays are prefixed by a 32 byte length field\n index += 32;\n\n // Read the bytes4 from array memory\n assembly {\n result := mload(add(b, index))\n // Solidity does not require us to clean the trailing bytes.\n // We do it anyway\n result := and(result, 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000)\n }\n return result;\n }\n\n /// @dev Writes a new length to a byte array.\n /// Decreasing length will lead to removing the corresponding lower order bytes from the byte array.\n /// Increasing length may lead to appending adjacent in-memory bytes to the end of the byte array.\n /// @param b Bytes array to write new length to.\n /// @param length New length of byte array.\n function writeLength(bytes memory b, uint256 length)\n internal\n pure\n {\n assembly {\n mstore(b, length)\n }\n }\n}\n",
|
|
"@0x/contracts-utils/contracts/src/v06/errors/LibBytesRichErrorsV06.sol": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\n\n\nlibrary LibBytesRichErrorsV06 {\n\n enum InvalidByteOperationErrorCodes {\n FromLessThanOrEqualsToRequired,\n ToLessThanOrEqualsLengthRequired,\n LengthGreaterThanZeroRequired,\n LengthGreaterThanOrEqualsFourRequired,\n LengthGreaterThanOrEqualsTwentyRequired,\n LengthGreaterThanOrEqualsThirtyTwoRequired,\n LengthGreaterThanOrEqualsNestedBytesLengthRequired,\n DestinationLengthGreaterThanOrEqualSourceLengthRequired\n }\n\n // bytes4(keccak256(\"InvalidByteOperationError(uint8,uint256,uint256)\"))\n bytes4 internal constant INVALID_BYTE_OPERATION_ERROR_SELECTOR =\n 0x28006595;\n\n // solhint-disable func-name-mixedcase\n function InvalidByteOperationError(\n InvalidByteOperationErrorCodes errorCode,\n uint256 offset,\n uint256 required\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n INVALID_BYTE_OPERATION_ERROR_SELECTOR,\n errorCode,\n offset,\n required\n );\n }\n}\n",
|
|
"./mixins/MixinBancor.sol": "// SPDX-License-Identifier: Apache-2.0\n\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-erc20/contracts/src/v06/LibERC20TokenV06.sol\";\nimport \"@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol\";\nimport \"@0x/contracts-erc20/contracts/src/v06/IEtherTokenV06.sol\";\nimport \"../IBridgeAdapter.sol\";\n\n\ninterface IBancorNetwork {\n function convertByPath(\n IERC20TokenV06[] calldata _path,\n uint256 _amount,\n uint256 _minReturn,\n address _beneficiary,\n address _affiliateAccount,\n uint256 _affiliateFee\n )\n external\n payable\n returns (uint256);\n}\n\n\ncontract MixinBancor {\n\n /// @dev Bancor ETH pseudo-address.\n IERC20TokenV06 constant public BANCOR_ETH_ADDRESS =\n IERC20TokenV06(0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE);\n IEtherTokenV06 private immutable WETH;\n\n constructor(IEtherTokenV06 weth)\n public\n {\n WETH = weth;\n }\n\n function _tradeBancor(\n IERC20TokenV06 buyToken,\n uint256 sellAmount,\n bytes memory bridgeData\n )\n internal\n returns (uint256 boughtAmount)\n {\n // Decode the bridge data.\n IBancorNetwork bancorNetworkAddress;\n IERC20TokenV06[] memory path;\n {\n address[] memory _path;\n (\n bancorNetworkAddress,\n _path\n ) = abi.decode(bridgeData, (IBancorNetwork, address[]));\n // To get around `abi.decode()` not supporting interface array types.\n assembly { path := _path }\n }\n\n require(path.length >= 2, \"MixinBancor/PATH_LENGTH_MUST_BE_AT_LEAST_TWO\");\n require(\n path[path.length - 1] == buyToken ||\n (path[path.length - 1] == BANCOR_ETH_ADDRESS && buyToken == WETH),\n \"MixinBancor/LAST_ELEMENT_OF_PATH_MUST_MATCH_OUTPUT_TOKEN\"\n );\n\n uint256 payableAmount = 0;\n // If it's ETH in the path then withdraw from WETH\n // The Bancor path will have ETH as the 0xeee address\n // Bancor expects to be paid in ETH not WETH\n if (path[0] == BANCOR_ETH_ADDRESS) {\n WETH.withdraw(sellAmount);\n payableAmount = sellAmount;\n } else {\n // Grant an allowance to the Bancor Network.\n LibERC20TokenV06.approveIfBelow(\n path[0],\n address(bancorNetworkAddress),\n sellAmount\n );\n }\n\n // Convert the tokens\n boughtAmount = bancorNetworkAddress.convertByPath{value: payableAmount}(\n path, // path originating with source token and terminating in destination token\n sellAmount, // amount of source token to trade\n 1, // minimum amount of destination token expected to receive\n address(this), // beneficiary\n address(0), // affiliateAccount; no fee paid\n 0 // affiliateFee; no fee paid\n );\n if (path[path.length - 1] == BANCOR_ETH_ADDRESS) {\n WETH.deposit{value: boughtAmount}();\n }\n\n return boughtAmount;\n }\n}\n",
|
|
"@0x/contracts-erc20/contracts/src/v06/IEtherTokenV06.sol": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\n\nimport \"./IERC20TokenV06.sol\";\n\n\ninterface IEtherTokenV06 is\n IERC20TokenV06\n{\n /// @dev Wrap ether.\n function deposit() external payable;\n\n /// @dev Unwrap ether.\n function withdraw(uint256 amount) external;\n}\n",
|
|
"./mixins/MixinCoFiX.sol": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-erc20/contracts/src/v06/LibERC20TokenV06.sol\";\nimport \"@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol\";\nimport \"@0x/contracts-erc20/contracts/src/v06/IEtherTokenV06.sol\";\n\n\ninterface ICoFiXRouter {\n // msg.value = fee\n function swapExactTokensForETH(\n address token,\n uint amountIn,\n uint amountOutMin,\n address to,\n address rewardTo,\n uint deadline\n ) external payable returns (uint _amountIn, uint _amountOut);\n\n // msg.value = amountIn + fee\n function swapExactETHForTokens(\n address token,\n uint amountIn,\n uint amountOutMin,\n address to,\n address rewardTo,\n uint deadline\n ) external payable returns (uint _amountIn, uint _amountOut);\n}\n\ninterface ICoFiXPair {\n\n function swapWithExact(address outToken, address to)\n external\n payable\n returns (\n uint amountIn,\n uint amountOut,\n uint oracleFeeChange,\n uint256[4] memory tradeInfo\n );\n}\n\ncontract MixinCoFiX {\n\n using LibERC20TokenV06 for IERC20TokenV06;\n\n function _tradeCoFiX(\n IERC20TokenV06 sellToken,\n IERC20TokenV06 buyToken,\n uint256 sellAmount,\n bytes memory bridgeData\n )\n internal\n returns (uint256 boughtAmount)\n {\n (uint256 fee, ICoFiXPair pool) = abi.decode(bridgeData, (uint256, ICoFiXPair));\n // Transfer tokens into the pool\n LibERC20TokenV06.compatTransfer(\n sellToken,\n address(pool),\n sellAmount\n );\n // Call the swap exact with the tokens now in the pool\n // pay the NEST Oracle fee with ETH\n (/* In */, boughtAmount, , ) = pool.swapWithExact{value: fee}(\n address(buyToken),\n address(this)\n );\n\n return boughtAmount;\n }\n}\n",
|
|
"./mixins/MixinCurve.sol": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-utils/contracts/src/v06/errors/LibRichErrorsV06.sol\";\nimport \"@0x/contracts-erc20/contracts/src/v06/LibERC20TokenV06.sol\";\nimport \"@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol\";\nimport \"@0x/contracts-utils/contracts/src/v06/LibSafeMathV06.sol\";\n\ncontract MixinCurve {\n\n using LibERC20TokenV06 for IERC20TokenV06;\n using LibSafeMathV06 for uint256;\n using LibRichErrorsV06 for bytes;\n\n\n struct CurveBridgeData {\n address curveAddress;\n bytes4 exchangeFunctionSelector;\n int128 fromCoinIdx;\n int128 toCoinIdx;\n }\n\n function _tradeCurve(\n IERC20TokenV06 sellToken,\n IERC20TokenV06 buyToken,\n uint256 sellAmount,\n bytes memory bridgeData\n )\n internal\n returns (uint256 boughtAmount)\n {\n // Decode the bridge data to get the Curve metadata.\n CurveBridgeData memory data = abi.decode(bridgeData, (CurveBridgeData));\n sellToken.approveIfBelow(data.curveAddress, sellAmount);\n uint256 beforeBalance = buyToken.balanceOf(address(this));\n (bool success, bytes memory resultData) =\n data.curveAddress.call(abi.encodeWithSelector(\n data.exchangeFunctionSelector,\n data.fromCoinIdx,\n data.toCoinIdx,\n // dx\n sellAmount,\n // min dy\n 1\n ));\n if (!success) {\n resultData.rrevert();\n }\n return buyToken.balanceOf(address(this)).safeSub(beforeBalance);\n }\n}\n",
|
|
"@0x/contracts-utils/contracts/src/v06/LibSafeMathV06.sol": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\n\nimport \"./errors/LibRichErrorsV06.sol\";\nimport \"./errors/LibSafeMathRichErrorsV06.sol\";\n\n\nlibrary LibSafeMathV06 {\n\n function safeMul(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n if (a == 0) {\n return 0;\n }\n uint256 c = a * b;\n if (c / a != b) {\n LibRichErrorsV06.rrevert(LibSafeMathRichErrorsV06.Uint256BinOpError(\n LibSafeMathRichErrorsV06.BinOpErrorCodes.MULTIPLICATION_OVERFLOW,\n a,\n b\n ));\n }\n return c;\n }\n\n function safeDiv(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n if (b == 0) {\n LibRichErrorsV06.rrevert(LibSafeMathRichErrorsV06.Uint256BinOpError(\n LibSafeMathRichErrorsV06.BinOpErrorCodes.DIVISION_BY_ZERO,\n a,\n b\n ));\n }\n uint256 c = a / b;\n return c;\n }\n\n function safeSub(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n if (b > a) {\n LibRichErrorsV06.rrevert(LibSafeMathRichErrorsV06.Uint256BinOpError(\n LibSafeMathRichErrorsV06.BinOpErrorCodes.SUBTRACTION_UNDERFLOW,\n a,\n b\n ));\n }\n return a - b;\n }\n\n function safeAdd(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n uint256 c = a + b;\n if (c < a) {\n LibRichErrorsV06.rrevert(LibSafeMathRichErrorsV06.Uint256BinOpError(\n LibSafeMathRichErrorsV06.BinOpErrorCodes.ADDITION_OVERFLOW,\n a,\n b\n ));\n }\n return c;\n }\n\n function max256(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n return a >= b ? a : b;\n }\n\n function min256(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n return a < b ? a : b;\n }\n\n function safeMul128(uint128 a, uint128 b)\n internal\n pure\n returns (uint128)\n {\n if (a == 0) {\n return 0;\n }\n uint128 c = a * b;\n if (c / a != b) {\n LibRichErrorsV06.rrevert(LibSafeMathRichErrorsV06.Uint256BinOpError(\n LibSafeMathRichErrorsV06.BinOpErrorCodes.MULTIPLICATION_OVERFLOW,\n a,\n b\n ));\n }\n return c;\n }\n\n function safeDiv128(uint128 a, uint128 b)\n internal\n pure\n returns (uint128)\n {\n if (b == 0) {\n LibRichErrorsV06.rrevert(LibSafeMathRichErrorsV06.Uint256BinOpError(\n LibSafeMathRichErrorsV06.BinOpErrorCodes.DIVISION_BY_ZERO,\n a,\n b\n ));\n }\n uint128 c = a / b;\n return c;\n }\n\n function safeSub128(uint128 a, uint128 b)\n internal\n pure\n returns (uint128)\n {\n if (b > a) {\n LibRichErrorsV06.rrevert(LibSafeMathRichErrorsV06.Uint256BinOpError(\n LibSafeMathRichErrorsV06.BinOpErrorCodes.SUBTRACTION_UNDERFLOW,\n a,\n b\n ));\n }\n return a - b;\n }\n\n function safeAdd128(uint128 a, uint128 b)\n internal\n pure\n returns (uint128)\n {\n uint128 c = a + b;\n if (c < a) {\n LibRichErrorsV06.rrevert(LibSafeMathRichErrorsV06.Uint256BinOpError(\n LibSafeMathRichErrorsV06.BinOpErrorCodes.ADDITION_OVERFLOW,\n a,\n b\n ));\n }\n return c;\n }\n\n function max128(uint128 a, uint128 b)\n internal\n pure\n returns (uint128)\n {\n return a >= b ? a : b;\n }\n\n function min128(uint128 a, uint128 b)\n internal\n pure\n returns (uint128)\n {\n return a < b ? a : b;\n }\n\n function safeDowncastToUint128(uint256 a)\n internal\n pure\n returns (uint128)\n {\n if (a > type(uint128).max) {\n LibRichErrorsV06.rrevert(LibSafeMathRichErrorsV06.Uint256DowncastError(\n LibSafeMathRichErrorsV06.DowncastErrorCodes.VALUE_TOO_LARGE_TO_DOWNCAST_TO_UINT128,\n a\n ));\n }\n return uint128(a);\n }\n}\n",
|
|
"@0x/contracts-utils/contracts/src/v06/errors/LibSafeMathRichErrorsV06.sol": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\n\n\nlibrary LibSafeMathRichErrorsV06 {\n\n // bytes4(keccak256(\"Uint256BinOpError(uint8,uint256,uint256)\"))\n bytes4 internal constant UINT256_BINOP_ERROR_SELECTOR =\n 0xe946c1bb;\n\n // bytes4(keccak256(\"Uint256DowncastError(uint8,uint256)\"))\n bytes4 internal constant UINT256_DOWNCAST_ERROR_SELECTOR =\n 0xc996af7b;\n\n enum BinOpErrorCodes {\n ADDITION_OVERFLOW,\n MULTIPLICATION_OVERFLOW,\n SUBTRACTION_UNDERFLOW,\n DIVISION_BY_ZERO\n }\n\n enum DowncastErrorCodes {\n VALUE_TOO_LARGE_TO_DOWNCAST_TO_UINT32,\n VALUE_TOO_LARGE_TO_DOWNCAST_TO_UINT64,\n VALUE_TOO_LARGE_TO_DOWNCAST_TO_UINT96,\n VALUE_TOO_LARGE_TO_DOWNCAST_TO_UINT128\n }\n\n // solhint-disable func-name-mixedcase\n function Uint256BinOpError(\n BinOpErrorCodes errorCode,\n uint256 a,\n uint256 b\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n UINT256_BINOP_ERROR_SELECTOR,\n errorCode,\n a,\n b\n );\n }\n\n function Uint256DowncastError(\n DowncastErrorCodes errorCode,\n uint256 a\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n UINT256_DOWNCAST_ERROR_SELECTOR,\n errorCode,\n a\n );\n }\n}\n",
|
|
"./mixins/MixinCryptoCom.sol": "// SPDX-License-Identifier: Apache-2.0\n\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-erc20/contracts/src/v06/LibERC20TokenV06.sol\";\nimport \"@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol\";\nimport \"./MixinUniswapV2.sol\";\n\ncontract MixinCryptoCom\n{\n using LibERC20TokenV06 for IERC20TokenV06;\n\n function _tradeCryptoCom(\n IERC20TokenV06 buyToken,\n uint256 sellAmount,\n bytes memory bridgeData\n )\n internal\n returns (uint256 boughtAmount)\n {\n IUniswapV2Router02 router;\n IERC20TokenV06[] memory path;\n {\n address[] memory _path;\n (router, _path) = abi.decode(bridgeData, (IUniswapV2Router02, address[]));\n // To get around `abi.decode()` not supporting interface array types.\n assembly { path := _path }\n }\n\n require(path.length >= 2, \"MixinCryptoCom/PATH_LENGTH_MUST_BE_AT_LEAST_TWO\");\n require(\n path[path.length - 1] == buyToken,\n \"MixinCryptoCom/LAST_ELEMENT_OF_PATH_MUST_MATCH_OUTPUT_TOKEN\"\n );\n // Grant the CryptoCom router an allowance to sell the first token.\n path[0].approveIfBelow(address(router), sellAmount);\n\n uint[] memory amounts = router.swapExactTokensForTokens(\n // Sell all tokens we hold.\n sellAmount,\n // Minimum buy amount.\n 1,\n // Convert to `buyToken` along this path.\n path,\n // Recipient is `this`.\n address(this),\n // Expires after this block.\n block.timestamp\n );\n return amounts[amounts.length-1];\n }\n}\n",
|
|
"./mixins/MixinUniswapV2.sol": "// SPDX-License-Identifier: Apache-2.0\n\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-erc20/contracts/src/v06/LibERC20TokenV06.sol\";\nimport \"@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol\";\nimport \"../IBridgeAdapter.sol\";\n\n/*\n UniswapV2\n*/\ninterface IUniswapV2Router02 {\n\n /// @dev Swaps an exact amount of input tokens for as many output tokens as possible, along the route determined by the path.\n /// The first element of path is the input token, the last is the output token, and any intermediate elements represent\n /// intermediate pairs to trade through (if, for example, a direct pair does not exist).\n /// @param amountIn The amount of input tokens to send.\n /// @param amountOutMin The minimum amount of output tokens that must be received for the transaction not to revert.\n /// @param path An array of token addresses. path.length must be >= 2. Pools for each consecutive pair of addresses must exist and have liquidity.\n /// @param to Recipient of the output tokens.\n /// @param deadline Unix timestamp after which the transaction will revert.\n /// @return amounts The input token amount and all subsequent output token amounts.\n function swapExactTokensForTokens(\n uint amountIn,\n uint amountOutMin,\n IERC20TokenV06[] calldata path,\n address to,\n uint deadline\n ) external returns (uint[] memory amounts);\n}\n\ncontract MixinUniswapV2 {\n\n using LibERC20TokenV06 for IERC20TokenV06;\n\n function _tradeUniswapV2(\n IERC20TokenV06 buyToken,\n uint256 sellAmount,\n bytes memory bridgeData\n )\n internal\n returns (uint256 boughtAmount)\n {\n IUniswapV2Router02 router;\n IERC20TokenV06[] memory path;\n {\n address[] memory _path;\n (router, _path) = abi.decode(bridgeData, (IUniswapV2Router02, address[]));\n // To get around `abi.decode()` not supporting interface array types.\n assembly { path := _path }\n }\n\n require(path.length >= 2, \"MixinUniswapV3/PATH_LENGTH_MUST_BE_AT_LEAST_TWO\");\n require(\n path[path.length - 1] == buyToken,\n \"MixinUniswapV2/LAST_ELEMENT_OF_PATH_MUST_MATCH_OUTPUT_TOKEN\"\n );\n // Grant the Uniswap router an allowance to sell the first token.\n path[0].approveIfBelow(address(router), sellAmount);\n\n uint[] memory amounts = router.swapExactTokensForTokens(\n // Sell all tokens we hold.\n sellAmount,\n // Minimum buy amount.\n 1,\n // Convert to `buyToken` along this path.\n path,\n // Recipient is `this`.\n address(this),\n // Expires after this block.\n block.timestamp\n );\n return amounts[amounts.length-1];\n }\n}\n",
|
|
"./mixins/MixinDodo.sol": "// SPDX-License-Identifier: Apache-2.0\n\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-erc20/contracts/src/v06/LibERC20TokenV06.sol\";\nimport \"@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol\";\nimport \"../IBridgeAdapter.sol\";\n\n\ninterface IDODO {\n function sellBaseToken(\n uint256 amount,\n uint256 minReceiveQuote,\n bytes calldata data\n )\n external\n returns (uint256);\n\n function buyBaseToken(\n uint256 amount,\n uint256 maxPayQuote,\n bytes calldata data\n )\n external\n returns (uint256);\n}\n\n\ninterface IDODOHelper {\n function querySellQuoteToken(\n IDODO dodo,\n uint256 amount\n )\n external\n view\n returns (uint256);\n}\n\n\ncontract MixinDodo {\n\n using LibERC20TokenV06 for IERC20TokenV06;\n\n function _tradeDodo(\n IERC20TokenV06 sellToken,\n uint256 sellAmount,\n bytes memory bridgeData\n )\n internal\n returns (uint256 boughtAmount)\n {\n (IDODOHelper helper, IDODO pool, bool isSellBase) =\n abi.decode(bridgeData, (IDODOHelper, IDODO, bool));\n\n // Grant the Dodo pool contract an allowance to sell the first token.\n sellToken.approveIfBelow(address(pool), sellAmount);\n\n if (isSellBase) {\n // Sell the Base token directly against the contract\n boughtAmount = pool.sellBaseToken(\n // amount to sell\n sellAmount,\n // min receive amount\n 1,\n new bytes(0)\n );\n } else {\n // Need to re-calculate the sell quote amount into buyBase\n boughtAmount = helper.querySellQuoteToken(\n pool,\n sellAmount\n );\n pool.buyBaseToken(\n // amount to buy\n boughtAmount,\n // max pay amount\n sellAmount,\n new bytes(0)\n );\n }\n\n return boughtAmount;\n }\n}\n",
|
|
"./mixins/MixinDodoV2.sol": "// SPDX-License-Identifier: Apache-2.0\n\n/*\n\n Copyright 2021 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-erc20/contracts/src/v06/LibERC20TokenV06.sol\";\nimport \"@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol\";\nimport \"../IBridgeAdapter.sol\";\n\n\ninterface IDODOV2 {\n function sellBase(address recipient)\n external\n returns (uint256);\n\n function sellQuote(address recipient)\n external\n returns (uint256);\n}\n\n\ncontract MixinDodoV2 {\n\n using LibERC20TokenV06 for IERC20TokenV06;\n\n function _tradeDodoV2(\n IERC20TokenV06 sellToken,\n uint256 sellAmount,\n bytes memory bridgeData\n )\n internal\n returns (uint256 boughtAmount)\n {\n (IDODOV2 pool, bool isSellBase) =\n abi.decode(bridgeData, (IDODOV2, bool));\n\n // Transfer the tokens into the pool\n sellToken.compatTransfer(address(pool), sellAmount);\n\n boughtAmount = isSellBase ?\n pool.sellBase(address(this))\n : pool.sellQuote(address(this));\n }\n}\n",
|
|
"./mixins/MixinKyber.sol": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-erc20/contracts/src/v06/LibERC20TokenV06.sol\";\nimport \"@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol\";\nimport \"@0x/contracts-erc20/contracts/src/v06/IEtherTokenV06.sol\";\nimport \"../IBridgeAdapter.sol\";\n\ninterface IKyberNetworkProxy {\n\n /// @dev Sells `sellTokenAddress` tokens for `buyTokenAddress` tokens\n /// using a hint for the reserve.\n /// @param sellToken Token to sell.\n /// @param sellAmount Amount of tokens to sell.\n /// @param buyToken Token to buy.\n /// @param recipientAddress Address to send bought tokens to.\n /// @param maxBuyTokenAmount A limit on the amount of tokens to buy.\n /// @param minConversionRate The minimal conversion rate. If actual rate\n /// is lower, trade is canceled.\n /// @param walletId The wallet ID to send part of the fees\n /// @param hint The hint for the selective inclusion (or exclusion) of reserves\n /// @return boughtAmount Amount of tokens bought.\n function tradeWithHint(\n IERC20TokenV06 sellToken,\n uint256 sellAmount,\n IERC20TokenV06 buyToken,\n address payable recipientAddress,\n uint256 maxBuyTokenAmount,\n uint256 minConversionRate,\n address payable walletId,\n bytes calldata hint\n )\n external\n payable\n returns (uint256 boughtAmount);\n}\n\ncontract MixinKyber {\n\n using LibERC20TokenV06 for IERC20TokenV06;\n\n /// @dev Address indicating the trade is using ETH\n IERC20TokenV06 private immutable KYBER_ETH_ADDRESS =\n IERC20TokenV06(0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE);\n /// @dev Mainnet address of the WETH contract.\n IEtherTokenV06 private immutable WETH;\n\n constructor(IEtherTokenV06 weth)\n public\n {\n WETH = weth;\n }\n\n function _tradeKyber(\n IERC20TokenV06 sellToken,\n IERC20TokenV06 buyToken,\n uint256 sellAmount,\n bytes memory bridgeData\n )\n internal\n returns (uint256 boughtAmount)\n {\n (IKyberNetworkProxy kyber, bytes memory hint) =\n abi.decode(bridgeData, (IKyberNetworkProxy, bytes));\n\n uint256 payableAmount = 0;\n if (sellToken != WETH) {\n // If the input token is not WETH, grant an allowance to the exchange\n // to spend them.\n sellToken.approveIfBelow(\n address(kyber),\n sellAmount\n );\n } else {\n // If the input token is WETH, unwrap it and attach it to the call.\n payableAmount = sellAmount;\n WETH.withdraw(payableAmount);\n }\n\n // Try to sell all of this contract's input token balance through\n // `KyberNetworkProxy.trade()`.\n boughtAmount = kyber.tradeWithHint{ value: payableAmount }(\n // Input token.\n sellToken == WETH ? KYBER_ETH_ADDRESS : sellToken,\n // Sell amount.\n sellAmount,\n // Output token.\n buyToken == WETH ? KYBER_ETH_ADDRESS : buyToken,\n // Transfer to this contract\n address(uint160(address(this))),\n // Buy as much as possible.\n uint256(-1),\n // Lowest minimum conversion rate\n 1,\n // No affiliate address.\n address(0),\n hint\n );\n // If receving ETH, wrap it to WETH.\n if (buyToken == WETH) {\n WETH.deposit{ value: boughtAmount }();\n }\n return boughtAmount;\n }\n}\n",
|
|
"./mixins/MixinMooniswap.sol": "// SPDX-License-Identifier: Apache-2.0\n\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-erc20/contracts/src/v06/LibERC20TokenV06.sol\";\nimport \"@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol\";\nimport \"@0x/contracts-erc20/contracts/src/v06/IEtherTokenV06.sol\";\nimport \"../IBridgeAdapter.sol\";\n\n\n/// @dev Moooniswap pool interface.\ninterface IMooniswapPool {\n\n function swap(\n IERC20TokenV06 sellToken,\n IERC20TokenV06 buyToken,\n uint256 sellAmount,\n uint256 minBoughtAmount,\n address referrer\n )\n external\n payable\n returns (uint256 boughtAmount);\n}\n\n/// @dev BridgeAdapter mixin for mooniswap.\ncontract MixinMooniswap {\n\n using LibERC20TokenV06 for IERC20TokenV06;\n using LibERC20TokenV06 for IEtherTokenV06;\n\n /// @dev WETH token.\n IEtherTokenV06 private immutable WETH;\n\n constructor(IEtherTokenV06 weth)\n public\n {\n WETH = weth;\n }\n\n function _tradeMooniswap(\n IERC20TokenV06 sellToken,\n IERC20TokenV06 buyToken,\n uint256 sellAmount,\n bytes memory bridgeData\n )\n internal\n returns (uint256 boughtAmount)\n {\n (IMooniswapPool pool) = abi.decode(bridgeData, (IMooniswapPool));\n\n // Convert WETH to ETH.\n uint256 ethValue = 0;\n if (sellToken == WETH) {\n WETH.withdraw(sellAmount);\n ethValue = sellAmount;\n } else {\n // Grant the pool an allowance.\n sellToken.approveIfBelow(\n address(pool),\n sellAmount\n );\n }\n\n boughtAmount = pool.swap{value: ethValue}(\n sellToken == WETH ? IERC20TokenV06(0) : sellToken,\n buyToken == WETH ? IERC20TokenV06(0) : buyToken,\n sellAmount,\n 1,\n address(0)\n );\n\n // Wrap ETH to WETH.\n if (buyToken == WETH) {\n WETH.deposit{value:boughtAmount}();\n }\n }\n}\n",
|
|
"./mixins/MixinMStable.sol": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-erc20/contracts/src/v06/LibERC20TokenV06.sol\";\nimport \"@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol\";\nimport \"../IBridgeAdapter.sol\";\n\n\ninterface IMStable {\n\n function swap(\n IERC20TokenV06 sellToken,\n IERC20TokenV06 buyToken,\n uint256 sellAmount,\n address recipient\n )\n external\n returns (uint256 boughtAmount);\n}\n\ncontract MixinMStable {\n\n using LibERC20TokenV06 for IERC20TokenV06;\n\n function _tradeMStable(\n IERC20TokenV06 sellToken,\n IERC20TokenV06 buyToken,\n uint256 sellAmount,\n bytes memory bridgeData\n )\n internal\n returns (uint256 boughtAmount)\n {\n (IMStable mstable) = abi.decode(bridgeData, (IMStable));\n\n // Grant an allowance to the exchange to spend `sellToken` token.\n sellToken.approveIfBelow(address(mstable), sellAmount);\n\n boughtAmount = mstable.swap(\n sellToken,\n buyToken,\n sellAmount,\n address(this)\n );\n }\n}\n",
|
|
"./mixins/MixinOasis.sol": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-erc20/contracts/src/v06/LibERC20TokenV06.sol\";\nimport \"@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol\";\nimport \"../IBridgeAdapter.sol\";\n\ninterface IOasis {\n\n /// @dev Sell `sellAmount` of `sellToken` token and receive `buyToken` token.\n /// @param sellToken The token being sold.\n /// @param sellAmount The amount of `sellToken` token being sold.\n /// @param buyToken The token being bought.\n /// @param minBoughtAmount Minimum amount of `buyToken` token to buy.\n /// @return boughtAmount Amount of `buyToken` bought.\n function sellAllAmount(\n IERC20TokenV06 sellToken,\n uint256 sellAmount,\n IERC20TokenV06 buyToken,\n uint256 minBoughtAmount\n )\n external\n returns (uint256 boughtAmount);\n}\n\ncontract MixinOasis {\n\n using LibERC20TokenV06 for IERC20TokenV06;\n\n function _tradeOasis(\n IERC20TokenV06 sellToken,\n IERC20TokenV06 buyToken,\n uint256 sellAmount,\n bytes memory bridgeData\n )\n internal\n returns (uint256 boughtAmount)\n {\n\n (IOasis oasis) = abi.decode(bridgeData, (IOasis));\n\n // Grant an allowance to the exchange to spend `sellToken` token.\n sellToken.approveIfBelow(\n address(oasis),\n sellAmount\n );\n // Try to sell all of this contract's `sellToken` token balance.\n boughtAmount = oasis.sellAllAmount(\n sellToken,\n sellAmount,\n buyToken,\n // min fill amount\n 1\n );\n return boughtAmount;\n }\n}\n",
|
|
"./mixins/MixinShell.sol": "// SPDX-License-Identifier: Apache-2.0\n\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-erc20/contracts/src/v06/LibERC20TokenV06.sol\";\nimport \"@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol\";\n\ninterface IShell {\n\n function originSwap(\n IERC20TokenV06 from,\n IERC20TokenV06 to,\n uint256 fromAmount,\n uint256 minTargetAmount,\n uint256 deadline\n )\n external\n returns (uint256 toAmount);\n}\n\ncontract MixinShell {\n\n using LibERC20TokenV06 for IERC20TokenV06;\n\n function _tradeShell(\n IERC20TokenV06 sellToken,\n IERC20TokenV06 buyToken,\n uint256 sellAmount,\n bytes memory bridgeData\n )\n internal\n returns (uint256 boughtAmount)\n {\n IShell pool = abi.decode(bridgeData, (IShell));\n\n // Grant the Shell contract an allowance to sell the first token.\n IERC20TokenV06(sellToken).approveIfBelow(\n address(pool),\n sellAmount\n );\n\n boughtAmount = pool.originSwap(\n sellToken,\n buyToken,\n // Sell all tokens we hold.\n sellAmount,\n // Minimum buy amount.\n 1,\n // deadline\n block.timestamp + 1\n );\n return boughtAmount;\n }\n}\n",
|
|
"./mixins/MixinSushiswap.sol": "// SPDX-License-Identifier: Apache-2.0\n\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-erc20/contracts/src/v06/LibERC20TokenV06.sol\";\nimport \"@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol\";\nimport \"./MixinUniswapV2.sol\";\n\ncontract MixinSushiswap {\n\n using LibERC20TokenV06 for IERC20TokenV06;\n\n function _tradeSushiswap(\n IERC20TokenV06 buyToken,\n uint256 sellAmount,\n bytes memory bridgeData\n )\n internal\n returns (uint256 boughtAmount)\n {\n IERC20TokenV06[] memory path;\n IUniswapV2Router02 router;\n {\n address[] memory _path;\n (router, _path) =\n abi.decode(bridgeData, (IUniswapV2Router02, address[]));\n // To get around `abi.decode()` not supporting interface array types.\n assembly { path := _path }\n }\n\n require(path.length >= 2, \"MixinSushiswap/PATH_LENGTH_MUST_BE_AT_LEAST_TWO\");\n require(\n path[path.length - 1] == buyToken,\n \"MixinSushiswap/LAST_ELEMENT_OF_PATH_MUST_MATCH_OUTPUT_TOKEN\"\n );\n // Grant the Uniswap router an allowance to sell the first token.\n path[0].approveIfBelow(\n address(router),\n sellAmount\n );\n\n uint[] memory amounts = router.swapExactTokensForTokens(\n // Sell all tokens we hold.\n sellAmount,\n // Minimum buy amount.\n 1,\n // Convert to `buyToken` along this path.\n path,\n // Recipient is `this`.\n address(this),\n // Expires after this block.\n block.timestamp\n );\n return amounts[amounts.length-1];\n }\n}\n",
|
|
"./mixins/MixinUniswap.sol": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-erc20/contracts/src/v06/LibERC20TokenV06.sol\";\nimport \"@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol\";\nimport \"@0x/contracts-erc20/contracts/src/v06/IEtherTokenV06.sol\";\nimport \"../IBridgeAdapter.sol\";\n\ninterface IUniswapExchangeFactory {\n\n /// @dev Get the exchange for a token.\n /// @param token The token contract.\n function getExchange(IERC20TokenV06 token)\n external\n view\n returns (IUniswapExchange exchange);\n}\n\ninterface IUniswapExchange {\n\n /// @dev Buys at least `minTokensBought` tokens with ETH and transfer them\n /// to `recipient`.\n /// @param minTokensBought The minimum number of tokens to buy.\n /// @param deadline Time when this order expires.\n /// @param recipient Who to transfer the tokens to.\n /// @return tokensBought Amount of tokens bought.\n function ethToTokenTransferInput(\n uint256 minTokensBought,\n uint256 deadline,\n address recipient\n )\n external\n payable\n returns (uint256 tokensBought);\n\n /// @dev Buys at least `minEthBought` ETH with tokens.\n /// @param tokensSold Amount of tokens to sell.\n /// @param minEthBought The minimum amount of ETH to buy.\n /// @param deadline Time when this order expires.\n /// @return ethBought Amount of tokens bought.\n function tokenToEthSwapInput(\n uint256 tokensSold,\n uint256 minEthBought,\n uint256 deadline\n )\n external\n returns (uint256 ethBought);\n\n /// @dev Buys at least `minTokensBought` tokens with the exchange token\n /// and transfer them to `recipient`.\n /// @param tokensSold Amount of tokens to sell.\n /// @param minTokensBought The minimum number of tokens to buy.\n /// @param minEthBought The minimum amount of intermediate ETH to buy.\n /// @param deadline Time when this order expires.\n /// @param recipient Who to transfer the tokens to.\n /// @param buyToken The token being bought.\n /// @return tokensBought Amount of tokens bought.\n function tokenToTokenTransferInput(\n uint256 tokensSold,\n uint256 minTokensBought,\n uint256 minEthBought,\n uint256 deadline,\n address recipient,\n IERC20TokenV06 buyToken\n )\n external\n returns (uint256 tokensBought);\n\n /// @dev Buys at least `minTokensBought` tokens with the exchange token.\n /// @param tokensSold Amount of tokens to sell.\n /// @param minTokensBought The minimum number of tokens to buy.\n /// @param minEthBought The minimum amount of intermediate ETH to buy.\n /// @param deadline Time when this order expires.\n /// @param buyToken The token being bought.\n /// @return tokensBought Amount of tokens bought.\n function tokenToTokenSwapInput(\n uint256 tokensSold,\n uint256 minTokensBought,\n uint256 minEthBought,\n uint256 deadline,\n IERC20TokenV06 buyToken\n )\n external\n returns (uint256 tokensBought);\n}\n\ncontract MixinUniswap {\n\n using LibERC20TokenV06 for IERC20TokenV06;\n\n /// @dev Mainnet address of the WETH contract.\n IEtherTokenV06 private immutable WETH;\n\n constructor(IEtherTokenV06 weth)\n public\n {\n WETH = weth;\n }\n\n function _tradeUniswap(\n IERC20TokenV06 sellToken,\n IERC20TokenV06 buyToken,\n uint256 sellAmount,\n bytes memory bridgeData\n )\n internal\n returns (uint256 boughtAmount)\n {\n IUniswapExchangeFactory exchangeFactory =\n abi.decode(bridgeData, (IUniswapExchangeFactory));\n\n // Get the exchange for the token pair.\n IUniswapExchange exchange = _getUniswapExchangeForTokenPair(\n exchangeFactory,\n sellToken,\n buyToken\n );\n\n // Convert from WETH to a token.\n if (sellToken == WETH) {\n // Unwrap the WETH.\n WETH.withdraw(sellAmount);\n // Buy as much of `buyToken` token with ETH as possible\n boughtAmount = exchange.ethToTokenTransferInput{ value: sellAmount }(\n // Minimum buy amount.\n 1,\n // Expires after this block.\n block.timestamp,\n // Recipient is `this`.\n address(this)\n );\n\n // Convert from a token to WETH.\n } else if (buyToken == WETH) {\n // Grant the exchange an allowance.\n sellToken.approveIfBelow(\n address(exchange),\n sellAmount\n );\n // Buy as much ETH with `sellToken` token as possible.\n boughtAmount = exchange.tokenToEthSwapInput(\n // Sell all tokens we hold.\n sellAmount,\n // Minimum buy amount.\n 1,\n // Expires after this block.\n block.timestamp\n );\n // Wrap the ETH.\n WETH.deposit{ value: boughtAmount }();\n // Convert from one token to another.\n } else {\n // Grant the exchange an allowance.\n sellToken.approveIfBelow(\n address(exchange),\n sellAmount\n );\n // Buy as much `buyToken` token with `sellToken` token\n boughtAmount = exchange.tokenToTokenSwapInput(\n // Sell all tokens we hold.\n sellAmount,\n // Minimum buy amount.\n 1,\n // Must buy at least 1 intermediate wei of ETH.\n 1,\n // Expires after this block.\n block.timestamp,\n // Convert to `buyToken`.\n buyToken\n );\n }\n\n return boughtAmount;\n }\n\n /// @dev Retrieves the uniswap exchange for a given token pair.\n /// In the case of a WETH-token exchange, this will be the non-WETH token.\n /// In th ecase of a token-token exchange, this will be the first token.\n /// @param exchangeFactory The exchange factory.\n /// @param sellToken The address of the token we are converting from.\n /// @param buyToken The address of the token we are converting to.\n /// @return exchange The uniswap exchange.\n function _getUniswapExchangeForTokenPair(\n IUniswapExchangeFactory exchangeFactory,\n IERC20TokenV06 sellToken,\n IERC20TokenV06 buyToken\n )\n private\n view\n returns (IUniswapExchange exchange)\n {\n // Whichever isn't WETH is the exchange token.\n exchange = sellToken == WETH\n ? exchangeFactory.getExchange(buyToken)\n : exchangeFactory.getExchange(sellToken);\n require(address(exchange) != address(0), \"MixinUniswap/NO_EXCHANGE\");\n }\n}\n",
|
|
"./mixins/MixinZeroExBridge.sol": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\n\nimport \"@0x/contracts-erc20/contracts/src/v06/LibERC20TokenV06.sol\";\nimport \"@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol\";\nimport \"@0x/contracts-utils/contracts/src/v06/LibSafeMathV06.sol\";\nimport \"../../../vendor/ILiquidityProvider.sol\";\n\n\ncontract MixinZeroExBridge {\n\n using LibERC20TokenV06 for IERC20TokenV06;\n using LibSafeMathV06 for uint256;\n\n function _tradeZeroExBridge(\n IERC20TokenV06 sellToken,\n IERC20TokenV06 buyToken,\n uint256 sellAmount,\n bytes memory bridgeData\n )\n internal\n returns (uint256 boughtAmount)\n {\n (ILiquidityProvider provider, bytes memory lpData) =\n abi.decode(bridgeData, (ILiquidityProvider, bytes));\n // Trade the good old fashioned way\n sellToken.compatTransfer(\n address(provider),\n sellAmount\n );\n boughtAmount = provider.sellTokenForToken(\n sellToken,\n buyToken,\n address(this), // recipient\n 1, // minBuyAmount\n lpData\n );\n }\n}\n",
|
|
"../../vendor/ILiquidityProvider.sol": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\n\nimport \"@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol\";\n\n\ninterface ILiquidityProvider {\n\n /// @dev An optional event an LP can emit for each fill against a source.\n /// @param inputToken The input token.\n /// @param outputToken The output token.\n /// @param inputTokenAmount How much input token was sold.\n /// @param outputTokenAmount How much output token was bought.\n /// @param sourceId A bytes32 encoded ascii source ID. E.g., `bytes32('Curve')`/\n /// @param sourceAddress An optional address associated with the source (e.g, a curve pool).\n /// @param sourceId A bytes32 encoded ascii source ID. E.g., `bytes32('Curve')`/\n /// @param sourceAddress An optional address associated with the source (e.g, a curve pool).\n /// @param sender The caller of the LP.\n /// @param recipient The recipient of the output tokens.\n event LiquidityProviderFill(\n IERC20TokenV06 inputToken,\n IERC20TokenV06 outputToken,\n uint256 inputTokenAmount,\n uint256 outputTokenAmount,\n bytes32 sourceId,\n address sourceAddress,\n address sender,\n address recipient\n );\n\n /// @dev Trades `inputToken` for `outputToken`. The amount of `inputToken`\n /// to sell must be transferred to the contract prior to calling this\n /// function to trigger the trade.\n /// @param inputToken The token being sold.\n /// @param outputToken The token being bought.\n /// @param recipient The recipient of the bought tokens.\n /// @param minBuyAmount The minimum acceptable amount of `outputToken` to buy.\n /// @param auxiliaryData Arbitrary auxiliary data supplied to the contract.\n /// @return boughtAmount The amount of `outputToken` bought.\n function sellTokenForToken(\n IERC20TokenV06 inputToken,\n IERC20TokenV06 outputToken,\n address recipient,\n uint256 minBuyAmount,\n bytes calldata auxiliaryData\n )\n external\n returns (uint256 boughtAmount);\n\n /// @dev Trades ETH for token. ETH must either be attached to this function\n /// call or sent to the contract prior to calling this function to\n /// trigger the trade.\n /// @param outputToken The token being bought.\n /// @param recipient The recipient of the bought tokens.\n /// @param minBuyAmount The minimum acceptable amount of `outputToken` to buy.\n /// @param auxiliaryData Arbitrary auxiliary data supplied to the contract.\n /// @return boughtAmount The amount of `outputToken` bought.\n function sellEthForToken(\n IERC20TokenV06 outputToken,\n address recipient,\n uint256 minBuyAmount,\n bytes calldata auxiliaryData\n )\n external\n payable\n returns (uint256 boughtAmount);\n\n /// @dev Trades token for ETH. The token must be sent to the contract prior\n /// to calling this function to trigger the trade.\n /// @param inputToken The token being sold.\n /// @param recipient The recipient of the bought tokens.\n /// @param minBuyAmount The minimum acceptable amount of ETH to buy.\n /// @param auxiliaryData Arbitrary auxiliary data supplied to the contract.\n /// @return boughtAmount The amount of ETH bought.\n function sellTokenForEth(\n IERC20TokenV06 inputToken,\n address payable recipient,\n uint256 minBuyAmount,\n bytes calldata auxiliaryData\n )\n external\n returns (uint256 boughtAmount);\n\n /// @dev Quotes the amount of `outputToken` that would be obtained by\n /// selling `sellAmount` of `inputToken`.\n /// @param inputToken Address of the taker token (what to sell). Use\n /// the wETH address if selling ETH.\n /// @param outputToken Address of the maker token (what to buy). Use\n /// the wETH address if buying ETH.\n /// @param sellAmount Amount of `inputToken` to sell.\n /// @return outputTokenAmount Amount of `outputToken` that would be obtained.\n function getSellQuote(\n IERC20TokenV06 inputToken,\n IERC20TokenV06 outputToken,\n uint256 sellAmount\n )\n external\n view\n returns (uint256 outputTokenAmount);\n}\n"
|
|
},
|
|
"compiler": {
|
|
"name": "solc",
|
|
"version": "0.6.12+commit.27d51765",
|
|
"settings": {
|
|
"remappings": [
|
|
"@0x/contracts-utils=/Users/michaelzhu/protocol/node_modules/@0x/contracts-utils",
|
|
"@0x/contracts-erc20=/Users/michaelzhu/protocol/contracts/zero-ex/node_modules/@0x/contracts-erc20"
|
|
],
|
|
"optimizer": {
|
|
"enabled": true,
|
|
"runs": 1000000,
|
|
"details": {
|
|
"yul": true,
|
|
"deduplicate": true,
|
|
"cse": true,
|
|
"constantOptimizer": true
|
|
}
|
|
},
|
|
"outputSelection": {
|
|
"*": {
|
|
"*": [
|
|
"abi",
|
|
"devdoc",
|
|
"evm.bytecode.object",
|
|
"evm.bytecode.sourceMap",
|
|
"evm.deployedBytecode.object",
|
|
"evm.deployedBytecode.sourceMap",
|
|
"evm.methodIdentifiers"
|
|
]
|
|
}
|
|
},
|
|
"evmVersion": "istanbul"
|
|
}
|
|
},
|
|
"chains": {}
|
|
}
|