@soma-finance/core-contracts
Version:
SOMA Finance core contracts
991 lines • 91.1 kB
JSON
{
"_format": "hh-sol-artifact-1",
"contractName": "SomaSwapRouter",
"sourceName": "contracts/soma/SomaSwap/periphery/SomaSwapRouter.sol",
"abi": [
{
"inputs": [
{
"internalType": "address",
"name": "_factory",
"type": "address"
},
{
"internalType": "address",
"name": "_WETH",
"type": "address"
}
],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"inputs": [],
"name": "WETH",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "tokenA",
"type": "address"
},
{
"internalType": "address",
"name": "tokenB",
"type": "address"
},
{
"internalType": "uint256",
"name": "amountADesired",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "amountBDesired",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "amountAMin",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "amountBMin",
"type": "uint256"
},
{
"internalType": "address",
"name": "to",
"type": "address"
},
{
"internalType": "uint256",
"name": "deadline",
"type": "uint256"
}
],
"name": "addLiquidity",
"outputs": [
{
"internalType": "uint256",
"name": "amountA",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "amountB",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "liquidity",
"type": "uint256"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "token",
"type": "address"
},
{
"internalType": "uint256",
"name": "amountTokenDesired",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "amountTokenMin",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "amountETHMin",
"type": "uint256"
},
{
"internalType": "address",
"name": "to",
"type": "address"
},
{
"internalType": "uint256",
"name": "deadline",
"type": "uint256"
}
],
"name": "addLiquidityETH",
"outputs": [
{
"internalType": "uint256",
"name": "amountToken",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "amountETH",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "liquidity",
"type": "uint256"
}
],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [],
"name": "factory",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "amountOut",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "reserveIn",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "reserveOut",
"type": "uint256"
}
],
"name": "getAmountIn",
"outputs": [
{
"internalType": "uint256",
"name": "amountIn",
"type": "uint256"
}
],
"stateMutability": "pure",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "amountIn",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "reserveIn",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "reserveOut",
"type": "uint256"
}
],
"name": "getAmountOut",
"outputs": [
{
"internalType": "uint256",
"name": "amountOut",
"type": "uint256"
}
],
"stateMutability": "pure",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "amountOut",
"type": "uint256"
},
{
"internalType": "address[]",
"name": "path",
"type": "address[]"
}
],
"name": "getAmountsIn",
"outputs": [
{
"internalType": "uint256[]",
"name": "amounts",
"type": "uint256[]"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "amountIn",
"type": "uint256"
},
{
"internalType": "address[]",
"name": "path",
"type": "address[]"
}
],
"name": "getAmountsOut",
"outputs": [
{
"internalType": "uint256[]",
"name": "amounts",
"type": "uint256[]"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "name",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "amountA",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "reserveA",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "reserveB",
"type": "uint256"
}
],
"name": "quote",
"outputs": [
{
"internalType": "uint256",
"name": "amountB",
"type": "uint256"
}
],
"stateMutability": "pure",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "tokenA",
"type": "address"
},
{
"internalType": "address",
"name": "tokenB",
"type": "address"
},
{
"internalType": "uint256",
"name": "liquidity",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "amountAMin",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "amountBMin",
"type": "uint256"
},
{
"internalType": "address",
"name": "to",
"type": "address"
},
{
"internalType": "uint256",
"name": "deadline",
"type": "uint256"
}
],
"name": "removeLiquidity",
"outputs": [
{
"internalType": "uint256",
"name": "amountA",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "amountB",
"type": "uint256"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "token",
"type": "address"
},
{
"internalType": "uint256",
"name": "liquidity",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "amountTokenMin",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "amountETHMin",
"type": "uint256"
},
{
"internalType": "address",
"name": "to",
"type": "address"
},
{
"internalType": "uint256",
"name": "deadline",
"type": "uint256"
}
],
"name": "removeLiquidityETH",
"outputs": [
{
"internalType": "uint256",
"name": "amountToken",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "amountETH",
"type": "uint256"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "token",
"type": "address"
},
{
"internalType": "uint256",
"name": "liquidity",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "amountTokenMin",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "amountETHMin",
"type": "uint256"
},
{
"internalType": "address",
"name": "to",
"type": "address"
},
{
"internalType": "uint256",
"name": "deadline",
"type": "uint256"
}
],
"name": "removeLiquidityETHSupportingFeeOnTransferTokens",
"outputs": [
{
"internalType": "uint256",
"name": "amountETH",
"type": "uint256"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "token",
"type": "address"
},
{
"internalType": "uint256",
"name": "liquidity",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "amountTokenMin",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "amountETHMin",
"type": "uint256"
},
{
"internalType": "address",
"name": "to",
"type": "address"
},
{
"internalType": "uint256",
"name": "deadline",
"type": "uint256"
},
{
"internalType": "bool",
"name": "approveMax",
"type": "bool"
},
{
"internalType": "uint8",
"name": "v",
"type": "uint8"
},
{
"internalType": "bytes32",
"name": "r",
"type": "bytes32"
},
{
"internalType": "bytes32",
"name": "s",
"type": "bytes32"
}
],
"name": "removeLiquidityETHWithPermit",
"outputs": [
{
"internalType": "uint256",
"name": "amountToken",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "amountETH",
"type": "uint256"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "token",
"type": "address"
},
{
"internalType": "uint256",
"name": "liquidity",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "amountTokenMin",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "amountETHMin",
"type": "uint256"
},
{
"internalType": "address",
"name": "to",
"type": "address"
},
{
"internalType": "uint256",
"name": "deadline",
"type": "uint256"
},
{
"internalType": "bool",
"name": "approveMax",
"type": "bool"
},
{
"internalType": "uint8",
"name": "v",
"type": "uint8"
},
{
"internalType": "bytes32",
"name": "r",
"type": "bytes32"
},
{
"internalType": "bytes32",
"name": "s",
"type": "bytes32"
}
],
"name": "removeLiquidityETHWithPermitSupportingFeeOnTransferTokens",
"outputs": [
{
"internalType": "uint256",
"name": "amountETH",
"type": "uint256"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "tokenA",
"type": "address"
},
{
"internalType": "address",
"name": "tokenB",
"type": "address"
},
{
"internalType": "uint256",
"name": "liquidity",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "amountAMin",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "amountBMin",
"type": "uint256"
},
{
"internalType": "address",
"name": "to",
"type": "address"
},
{
"internalType": "uint256",
"name": "deadline",
"type": "uint256"
},
{
"internalType": "bool",
"name": "approveMax",
"type": "bool"
},
{
"internalType": "uint8",
"name": "v",
"type": "uint8"
},
{
"internalType": "bytes32",
"name": "r",
"type": "bytes32"
},
{
"internalType": "bytes32",
"name": "s",
"type": "bytes32"
}
],
"name": "removeLiquidityWithPermit",
"outputs": [
{
"internalType": "uint256",
"name": "amountA",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "amountB",
"type": "uint256"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "amountOut",
"type": "uint256"
},
{
"internalType": "address[]",
"name": "path",
"type": "address[]"
},
{
"internalType": "address",
"name": "to",
"type": "address"
},
{
"internalType": "uint256",
"name": "deadline",
"type": "uint256"
}
],
"name": "swapETHForExactTokens",
"outputs": [
{
"internalType": "uint256[]",
"name": "amounts",
"type": "uint256[]"
}
],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "amountOutMin",
"type": "uint256"
},
{
"internalType": "address[]",
"name": "path",
"type": "address[]"
},
{
"internalType": "address",
"name": "to",
"type": "address"
},
{
"internalType": "uint256",
"name": "deadline",
"type": "uint256"
}
],
"name": "swapExactETHForTokens",
"outputs": [
{
"internalType": "uint256[]",
"name": "amounts",
"type": "uint256[]"
}
],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "amountOutMin",
"type": "uint256"
},
{
"internalType": "address[]",
"name": "path",
"type": "address[]"
},
{
"internalType": "address",
"name": "to",
"type": "address"
},
{
"internalType": "uint256",
"name": "deadline",
"type": "uint256"
}
],
"name": "swapExactETHForTokensSupportingFeeOnTransferTokens",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "amountIn",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "amountOutMin",
"type": "uint256"
},
{
"internalType": "address[]",
"name": "path",
"type": "address[]"
},
{
"internalType": "address",
"name": "to",
"type": "address"
},
{
"internalType": "uint256",
"name": "deadline",
"type": "uint256"
}
],
"name": "swapExactTokensForETH",
"outputs": [
{
"internalType": "uint256[]",
"name": "amounts",
"type": "uint256[]"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "amountIn",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "amountOutMin",
"type": "uint256"
},
{
"internalType": "address[]",
"name": "path",
"type": "address[]"
},
{
"internalType": "address",
"name": "to",
"type": "address"
},
{
"internalType": "uint256",
"name": "deadline",
"type": "uint256"
}
],
"name": "swapExactTokensForETHSupportingFeeOnTransferTokens",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "amountIn",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "amountOutMin",
"type": "uint256"
},
{
"internalType": "address[]",
"name": "path",
"type": "address[]"
},
{
"internalType": "address",
"name": "to",
"type": "address"
},
{
"internalType": "uint256",
"name": "deadline",
"type": "uint256"
}
],
"name": "swapExactTokensForTokens",
"outputs": [
{
"internalType": "uint256[]",
"name": "amounts",
"type": "uint256[]"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "amountIn",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "amountOutMin",
"type": "uint256"
},
{
"internalType": "address[]",
"name": "path",
"type": "address[]"
},
{
"internalType": "address",
"name": "to",
"type": "address"
},
{
"internalType": "uint256",
"name": "deadline",
"type": "uint256"
}
],
"name": "swapExactTokensForTokensSupportingFeeOnTransferTokens",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "amountOut",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "amountInMax",
"type": "uint256"
},
{
"internalType": "address[]",
"name": "path",
"type": "address[]"
},
{
"internalType": "address",
"name": "to",
"type": "address"
},
{
"internalType": "uint256",
"name": "deadline",
"type": "uint256"
}
],
"name": "swapTokensForExactETH",
"outputs": [
{
"internalType": "uint256[]",
"name": "amounts",
"type": "uint256[]"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "amountOut",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "amountInMax",
"type": "uint256"
},
{
"internalType": "address[]",
"name": "path",
"type": "address[]"
},
{
"internalType": "address",
"name": "to",
"type": "address"
},
{
"internalType": "uint256",
"name": "deadline",
"type": "uint256"
}
],
"name": "swapTokensForExactTokens",
"outputs": [
{
"internalType": "uint256[]",
"name": "amounts",
"type": "uint256[]"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"stateMutability": "payable",
"type": "receive"
}
],
"bytecode": "0x60c06040523480156200001157600080fd5b506040516200447e3803806200447e833981016040819052620000349162000069565b6001600160a01b039182166080521660a052620000a1565b80516001600160a01b03811681146200006457600080fd5b919050565b600080604083850312156200007d57600080fd5b62000088836200004c565b915062000098602084016200004c565b90509250929050565b60805160a0516142526200022c6000396000818161017a015281816103cf01528181610584015281816105d301528181610691015281816108b401528181610bed01528181610d28015281816110780152818161115b0152818161120601528181611299015281816113b7015281816114450152818161168d01528181611745015281816117d601528181611853015281816118c701528181611c9f01528181611e9001528181611ee601528181611f1a01528181611faf015281816120e8015281816121fa015261228801526000818161048e0152818161070d015281816107df0152818161099a015281816109d301528181610aca01528181610c6901528181610d0601528181610e3d0152818161131401528181611477015281816115c2015281816118f901528181611b1801528181611c4d01528181611c7d01528181611da601528181611ec401528181612163015281816122ba01528181612c1001528181612c6301528181612ed30152818161303b0152818161338f015261345a01526142526000f3fe60806040526004361061016a5760003560e01c806385f8c259116100d1578063baa2abde1161008a578063ded9382a11610064578063ded9382a146104d0578063e8e33700146104f0578063f305d7191461052b578063fb3bdb411461053e57600080fd5b8063baa2abde1461045c578063c45a01551461047c578063d06ca61f146104b057600080fd5b806385f8c2591461037d5780638803dbee1461039d578063ad5c4648146103bd578063ad615dec14610409578063af2979eb14610429578063b6f9de951461044957600080fd5b806338ed17391161012357806338ed1739146102ca5780634a25d94a146102ea5780635b0d59841461030a5780635c11d7951461032a578063791ac9471461034a5780637ff36ab51461036a57600080fd5b806302751cec146101ae578063054d50d4146101e857806306fdde031461021657806318cbafe51461025d5780631f00ca741461028a5780632195995c146102aa57600080fd5b366101a957336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a7576101a76137dd565b005b600080fd5b3480156101ba57600080fd5b506101ce6101c936600461381b565b610551565b604080519283526020830191909152015b60405180910390f35b3480156101f457600080fd5b50610208610203366004613879565b61064d565b6040519081526020016101df565b34801561022257600080fd5b506102506040518060400160405280600e81526020016d29b7b6b0a9bbb0b82937baba32b960911b81525081565b6040516101df91906138f5565b34801561026957600080fd5b5061027d61027836600461394d565b610664565b6040516101df91906139c0565b34801561029657600080fd5b5061027d6102a5366004613a1a565b610993565b3480156102b657600080fd5b506101ce6102c5366004613b0a565b6109c9565b3480156102d657600080fd5b5061027d6102e536600461394d565b610aa2565b3480156102f657600080fd5b5061027d61030536600461394d565b610bc0565b34801561031657600080fd5b50610208610325366004613bb4565b610cfe565b34801561033657600080fd5b506101a761034536600461394d565b610deb565b34801561035657600080fd5b506101a761036536600461394d565b61104d565b61027d610378366004613c4a565b611274565b34801561038957600080fd5b50610208610398366004613879565b61158d565b3480156103a957600080fd5b5061027d6103b836600461394d565b61159a565b3480156103c957600080fd5b506103f17f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016101df565b34801561041557600080fd5b50610208610424366004613879565b611657565b34801561043557600080fd5b5061020861044436600461381b565b611664565b6101a7610457366004613c4a565b6117b3565b34801561046857600080fd5b506101ce610477366004613cb1565b611aed565b34801561048857600080fd5b506103f17f000000000000000000000000000000000000000000000000000000000000000081565b3480156104bc57600080fd5b5061027d6104cb366004613a1a565b611c46565b3480156104dc57600080fd5b506101ce6104eb366004613bb4565b611c73565b3480156104fc57600080fd5b5061051061050b366004613d23565b611d66565b604080519384526020840192909252908201526060016101df565b61051061053936600461381b565b611e64565b61027d61054c366004613c4a565b6120c3565b600080824281101561057e5760405162461bcd60e51b815260040161057590613d9f565b60405180910390fd5b6105ad897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a611aed565b90935091506105bd898685612412565b604051632e1a7d4d60e01b8152600481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b15801561061f57600080fd5b505af1158015610633573d6000803e3d6000fd5b505050506106418583612543565b50965096945050505050565b600061065a848484612622565b90505b9392505050565b606081428110156106875760405162461bcd60e51b815260040161057590613d9f565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001686866106be600182613dec565b8181106106cd576106cd613dff565b90506020020160208101906106e29190613e15565b6001600160a01b0316146107085760405162461bcd60e51b815260040161057590613e32565b6107667f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506126ff92505050565b91508682600184516107789190613dec565b8151811061078857610788613dff565b602002602001015110156107ae5760405162461bcd60e51b815260040161057590613e69565b610873868660008181106107c4576107c4613dff565b90506020020160208101906107d99190613e15565b336108537f00000000000000000000000000000000000000000000000000000000000000008a8a600081811061081157610811613dff565b90506020020160208101906108269190613e15565b8b8b600181811061083957610839613dff565b905060200201602081019061084e9190613e15565b612888565b8560008151811061086657610866613dff565b60200260200101516129ef565b6108b282878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250612b2d915050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d83600185516108f09190613dec565b8151811061090057610900613dff565b60200260200101516040518263ffffffff1660e01b815260040161092691815260200190565b600060405180830381600087803b15801561094057600080fd5b505af1158015610954573d6000803e3d6000fd5b5050505061098884836001855161096b9190613dec565b8151811061097b5761097b613dff565b6020026020010151612543565b509695505050505050565b60606109c07f00000000000000000000000000000000000000000000000000000000000000008484612cdd565b90505b92915050565b60008060006109f97f00000000000000000000000000000000000000000000000000000000000000008f8f612888565b9050600087610a08578c610a0c565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf90610a47903390309086908f908e908e908e90600401613eb3565b600060405180830381600087803b158015610a6157600080fd5b505af1158015610a75573d6000803e3d6000fd5b50505050610a888f8f8f8f8f8f8f611aed565b809450819550505050509b509b9950505050505050505050565b60608142811015610ac55760405162461bcd60e51b815260040161057590613d9f565b610b237f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506126ff92505050565b9150868260018451610b359190613dec565b81518110610b4557610b45613dff565b60200260200101511015610b6b5760405162461bcd60e51b815260040161057590613e69565b610b81868660008181106107c4576107c4613dff565b61098882878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250612b2d915050565b60608142811015610be35760405162461bcd60e51b815260040161057590613d9f565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168686610c1a600182613dec565b818110610c2957610c29613dff565b9050602002016020810190610c3e9190613e15565b6001600160a01b031614610c645760405162461bcd60e51b815260040161057590613e32565b610cc27f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612cdd92505050565b91508682600081518110610cd857610cd8613dff565b602002602001015111156107ae5760405162461bcd60e51b815260040161057590613ef4565b600080610d4c7f00000000000000000000000000000000000000000000000000000000000000008d7f0000000000000000000000000000000000000000000000000000000000000000612888565b9050600086610d5b578b610d5f565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf90610d9a903390309086908e908d908d908d90600401613eb3565b600060405180830381600087803b158015610db457600080fd5b505af1158015610dc8573d6000803e3d6000fd5b50505050610dda8d8d8d8d8d8d611664565b9d9c50505050505050505050505050565b8042811015610e0c5760405162461bcd60e51b815260040161057590613d9f565b610e9d85856000818110610e2257610e22613dff565b9050602002016020810190610e379190613e15565b33610e977f000000000000000000000000000000000000000000000000000000000000000089896000818110610e6f57610e6f613dff565b9050602002016020810190610e849190613e15565b8a8a600181811061083957610839613dff565b8a6129ef565b60008585610eac600182613dec565b818110610ebb57610ebb613dff565b9050602002016020810190610ed09190613e15565b6040516370a0823160e01b81526001600160a01b03868116600483015291909116906370a0823190602401602060405180830381865afa158015610f18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f3c9190613f3a565b9050610f7c868680806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250889250612e5e915050565b86611025828888610f8e600182613dec565b818110610f9d57610f9d613dff565b9050602002016020810190610fb29190613e15565b6040516370a0823160e01b81526001600160a01b03898116600483015291909116906370a08231906024015b602060405180830381865afa158015610ffb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061101f9190613f3a565b90613091565b10156110435760405162461bcd60e51b815260040161057590613e69565b5050505050505050565b804281101561106e5760405162461bcd60e51b815260040161057590613d9f565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001685856110a5600182613dec565b8181106110b4576110b4613dff565b90506020020160208101906110c99190613e15565b6001600160a01b0316146110ef5760405162461bcd60e51b815260040161057590613e32565b61110585856000818110610e2257610e22613dff565b611143858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250612e5e915050565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa1580156111aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ce9190613f3a565b9050868110156111f05760405162461bcd60e51b815260040161057590613e69565b604051632e1a7d4d60e01b8152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b15801561125257600080fd5b505af1158015611266573d6000803e3d6000fd5b505050506110438482612543565b606081428110156112975760405162461bcd60e51b815260040161057590613d9f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316868660008181106112d4576112d4613dff565b90506020020160208101906112e99190613e15565b6001600160a01b03161461130f5760405162461bcd60e51b815260040161057590613e32565b61136d7f0000000000000000000000000000000000000000000000000000000000000000348888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506126ff92505050565b915086826001845161137f9190613dec565b8151811061138f5761138f613dff565b602002602001015110156113b55760405162461bcd60e51b815260040161057590613e69565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0836000815181106113f7576113f7613dff565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561142a57600080fd5b505af115801561143e573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6114a97f000000000000000000000000000000000000000000000000000000000000000089896000818110610e6f57610e6f613dff565b846000815181106114bc576114bc613dff565b60200260200101516040518363ffffffff1660e01b81526004016114f59291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af1158015611514573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115389190613f53565b611544576115446137dd565b61158382878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250612b2d915050565b5095945050505050565b600061065a84848461309d565b606081428110156115bd5760405162461bcd60e51b815260040161057590613d9f565b61161b7f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612cdd92505050565b9150868260008151811061163157611631613dff565b60200260200101511115610b6b5760405162461bcd60e51b815260040161057590613ef4565b600061065a84848461316b565b600081428110156116875760405162461bcd60e51b815260040161057590613d9f565b6116b6887f00000000000000000000000000000000000000000000000000000000000000008989893089611aed565b6040516370a0823160e01b815230600482015290935061172f9150899086906001600160a01b038316906370a0823190602401602060405180830381865afa158015611706573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061172a9190613f3a565b612412565b604051632e1a7d4d60e01b8152600481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b15801561179157600080fd5b505af11580156117a5573d6000803e3d6000fd5b505050506109888483612543565b80428110156117d45760405162461bcd60e51b815260040161057590613d9f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168585600081811061181157611811613dff565b90506020020160208101906118269190613e15565b6001600160a01b03161461184c5760405162461bcd60e51b815260040161057590613e32565b60003490507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b1580156118ac57600080fd5b505af11580156118c0573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb61192b7f000000000000000000000000000000000000000000000000000000000000000089896000818110610e6f57610e6f613dff565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303816000875af1158015611978573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061199c9190613f53565b6119a8576119a86137dd565b600086866119b7600182613dec565b8181106119c6576119c6613dff565b90506020020160208101906119db9190613e15565b6040516370a0823160e01b81526001600160a01b03878116600483015291909116906370a0823190602401602060405180830381865afa158015611a23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a479190613f3a565b9050611a87878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250612e5e915050565b87611025828989611a99600182613dec565b818110611aa857611aa8613dff565b9050602002016020810190611abd9190613e15565b6040516370a0823160e01b81526001600160a01b038a8116600483015291909116906370a0823190602401610fde565b6000808242811015611b115760405162461bcd60e51b815260040161057590613d9f565b6000611b3e7f00000000000000000000000000000000000000000000000000000000000000008c8c612888565b9050611b4a818a613209565b60405163226bf2d160e21b81526001600160a01b03878116600483015260009182918416906389afcb449060240160408051808303816000875af1158015611b96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bba9190613f70565b915091506000611bca8e8e61326c565b509050806001600160a01b03168e6001600160a01b031614611bed578183611bf0565b82825b90975095508a871015611c155760405162461bcd60e51b815260040161057590613f94565b89861015611c355760405162461bcd60e51b815260040161057590613fd9565b505050505097509795505050505050565b60606109c07f000000000000000000000000000000000000000000000000000000000000000084846126ff565b6000806000611cc37f00000000000000000000000000000000000000000000000000000000000000008e7f0000000000000000000000000000000000000000000000000000000000000000612888565b9050600087611cd2578c611cd6565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf90611d11903390309086908f908e908e908e90600401613eb3565b600060405180830381600087803b158015611d2b57600080fd5b505af1158015611d3f573d6000803e3d6000fd5b50505050611d518e8e8e8e8e8e610551565b909f909e509c50505050505050505050505050565b60008060008342811015611d8c5760405162461bcd60e51b815260040161057590613d9f565b611d9a8c8c8c8c8c8c613361565b90945092506000611dcc7f00000000000000000000000000000000000000000000000000000000000000008e8e612888565b9050611dda8d3383886129ef565b611de68c3383876129ef565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a627842906024016020604051808303816000875af1158015611e2e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e529190613f3a565b92505050985098509895505050505050565b60008060008342811015611e8a5760405162461bcd60e51b815260040161057590613d9f565b611eb88a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c613361565b90945092506000611f0a7f00000000000000000000000000000000000000000000000000000000000000008c7f0000000000000000000000000000000000000000000000000000000000000000612888565b9050611f188b3383886129ef565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015611f7357600080fd5b505af1158015611f87573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b038581166004830152602482018990527f000000000000000000000000000000000000000000000000000000000000000016935063a9059cbb925060440190506020604051808303816000875af1158015611ffc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120209190613f53565b61202c5761202c6137dd565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a627842906024016020604051808303816000875af1158015612074573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120989190613f3a565b9250833411156120b5576120b5336120b08634613dec565b612543565b505096509650969350505050565b606081428110156120e65760405162461bcd60e51b815260040161057590613d9f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168686600081811061212357612123613dff565b90506020020160208101906121389190613e15565b6001600160a01b03161461215e5760405162461bcd60e51b815260040161057590613e32565b6121bc7f000000000000000000000000000000000000000000000000000000000000000088888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612cdd92505050565b915034826000815181106121d2576121d2613dff565b602002602001015111156121f85760405162461bcd60e51b815260040161057590613ef4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db08360008151811061223a5761223a613dff565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561226d57600080fd5b505af1158015612281573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6122ec7f000000000000000000000000000000000000000000000000000000000000000089896000818110610e6f57610e6f613dff565b846000815181106122ff576122ff613dff565b60200260200101516040518363ffffffff1660e01b81526004016123389291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af1158015612357573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061237b9190613f53565b612387576123876137dd565b6123c682878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250612b2d915050565b816000815181106123d9576123d9613dff565b60200260200101513411156115835761158333836000815181106123ff576123ff613dff565b6020026020010151346120b09190613dec565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b179052915160009283929087169161246e919061401e565b6000604051808303816000865af19150503d80600081146124ab576040519150601f19603f3d011682016040523d82523d6000602084013e6124b0565b606091505b50915091508180156124da5750805115806124da5750808060200190518101906124da9190613f53565b61253c5760405162461bcd60e51b815260206004820152602d60248201527f5472616e7366657248656c7065723a3a736166655472616e736665723a20747260448201526c185b9cd9995c8819985a5b1959609a1b6064820152608401610575565b5050505050565b604080516000808252602082019092526001600160a01b03841690839060405161256d919061401e565b60006040518083038185875af1925050503d80600081146125aa576040519150601f19603f3d011682016040523d82523d6000602084013e6125af565b606091505b505090508061261d5760405162461bcd60e51b815260206004820152603460248201527f5472616e7366657248656c7065723a3a736166655472616e736665724554483a60448201527308115512081d1c985b9cd9995c8819985a5b195960621b6064820152608401610575565b505050565b60008084116126865760405162461bcd60e51b815260206004820152602a60248201527f536f6d61537761704c6962726172793a20494e53554646494349454e545f494e60448201526914155517d05353d5539560b21b6064820152608401610575565b6000831180156126965750600082115b6126b25760405162461bcd60e51b81526004016105759061403a565b60006126c0856103e5613537565b905060006126ce8285613537565b905060006126e8836126e2886103e8613537565b90613543565b90506126f48183614081565b979650505050505050565b60606002825110156127535760405162461bcd60e51b815260206004820152601d60248201527f536f6d61537761704c6962726172793a20494e56414c49445f504154480000006044820152606401610575565b815167ffffffffffffffff81111561276d5761276d613a04565b604051908082528060200260200182016040528015612796578160200160208202803683370190505b50905082816000815181106127ad576127ad613dff565b60200260200101818152505060005b600183516127ca9190613dec565b8110156128805760008061281d878685815181106127ea576127ea613dff565b60200260200101518786600161280091906140a3565b8151811061281057612810613dff565b602002602001015161354f565b9150915061284584848151811061283657612836613dff565b60200260200101518383612622565b846128518560016140a3565b8151811061286157612861613dff565b602002602001018181525050505080612879906140b6565b90506127bc565b509392505050565b6000806000612897858561326c565b915091506129e5866001600160a01b0316632dd310006040518163ffffffff1660e01b8152600401602060405180830381865afa1580156128dc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061290091906140cf565b876001600160a01b031663257671f56040518163ffffffff1660e01b8152600401602060405180830381865afa15801561293e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129629190613f3a565b60408051606087811b6bffffffffffffffffffffffff1990811660208085019190915288831b82166034850152845160288186030181526048850186528051908201206001600160f81b031960688601529690921b166069830152607d820194909452609d808201939093528151808203909301835260bd019052805191012090565b9695505050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b1790529151600092839290881691612a53919061401e565b6000604051808303816000865af19150503d8060008114612a90576040519150601f19603f3d011682016040523d82523d6000602084013e612a95565b606091505b5091509150818015612abf575080511580612abf575080806020019051810190612abf9190613f53565b612b255760405162461bcd60e51b815260206004820152603160248201527f5472616e7366657248656c7065723a3a7472616e7366657246726f6d3a207472604482015270185b9cd9995c919c9bdb4819985a5b1959607a1b6064820152608401610575565b505050505050565b60005b60018351612b3e9190613dec565b811015612cd757600080848381518110612b5a57612b5a613dff565b602002602001015185846001612b7091906140a3565b81518110612b8057612b80613dff565b6020026020010151915091506000612b98838361326c565b509050600087612ba98660016140a3565b81518110612bb957612bb9613dff565b60200260200101519050600080836001600160a01b0316866001600160a01b031614612be757826000612beb565b6000835b91509150600060028a51612bff9190613dec565b8810612c0b5788612c59565b612c597f0000000000000000000000000000000000000000000000000000000000000000878c612c3c8c60026140a3565b81518110612c4c57612c4c613dff565b6020026020010151612888565b9050612cbf612c897f00000000000000000000000000000000000000000000000000000000000000008989612888565b84848460005b6040519080825280601f01601f191660200182016040528015612cb9576020820181803683370190505b50613619565b5050505050505080612cd0906140b6565b9050612b30565b50505050565b6060600282511015612d315760405162461bcd60e51b815260206004820152601d60248201527f536f6d61537761704c6962726172793a20494e56414c49445f504154480000006044820152606401610575565b815167ffffffffffffffff811115612d4b57612d4b613a04565b604051908082528060200260200182016040528015612d74578160200160208202803683370190505b509050828160018351612d879190613dec565b81518110612d9757612d97613dff565b602002602001018181525050600060018351612db39190613dec565b90505b801561288057600080612df98786612dcf600187613dec565b81518110612ddf57612ddf613dff565b602002602001015187868151811061281057612810613dff565b91509150612e21848481518110612e1257612e12613dff565b6020026020010151838361309d565b84612e2d600186613dec565b81518110612e3d57612e3d613dff565b60200260200101818152505050508080612e56906140ec565b915050612db6565b60005b60018351612e6f9190613dec565b81101561261d57600080848381518110612e8b57612e8b613dff565b602002602001015185846001612ea191906140a3565b81518110612eb157612eb1613dff565b6020026020010151915091506000612ec9838361326c565b5090506000612ef97f00000000000000000000000000000000000000000000000000000000000000008585612888565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015612f3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f63919061411a565b506001600160701b031691506001600160701b03169150600080876001600160a01b03168a6001600160a01b031614612f9d578284612fa0565b83835b6040516370a0823160e01b81526001600160a01b038a81166004830152929450909250612fdb918491908d16906370a0823190602401610fde565b9550612fe8868383612622565b945050505050600080856001600160a01b0316886001600160a01b03161461301257826000613016565b6000835b91509150600060028c5161302a9190613dec565b8a10613036578a613067565b6130677f0000000000000000000000000000000000000000000000000000000000000000898e612c3c8e60026140a3565b9050613077868484846000612c8f565b5050505050505050508061308a906140b6565b9050612e61565b60006109c08284613dec565b60008084116131025760405162461bcd60e51b815260206004820152602b60248201527f536f6d61537761704c6962726172793a20494e53554646494349454e545f4f5560448201526a1514155517d05353d5539560aa1b6064820152608401610575565b6000831180156131125750600082115b61312e5760405162461bcd60e51b81526004016105759061403a565b60006131466103e86131408688613537565b90613537565b9050600061315a6103e56131408689613091565b90506129e560016126e28385614081565b60008084116131c85760405162461bcd60e51b8152602060048201526024808201527f536f6d61537761704c6962726172793a20494e53554646494349454e545f414d60448201526313d5539560e21b6064820152608401610575565b6000831180156131d85750600082115b6131f45760405162461bcd60e51b81526004016105759061403a565b826131ff8584613537565b61065a9190614081565b61261d60405180606001604052806025815260200161422160259139604080513360208201526001600160a01b038616918101919091526060810184905260800160408051601f198184030181529190526001600160a01b03851691903061366a565b600080826001600160a01b0316846001600160a01b0316036132dc5760405162461bcd60e51b8152602060048201526024808201527f536f6d61537761704c6962726172793a204944454e544943414c5f41444452456044820152635353455360e01b6064820152608401610575565b826001600160a01b0316846001600160a01b0316106132fc5782846132ff565b83835b90925090506001600160a01b03821661335a5760405162461bcd60e51b815260206004820152601d60248201527f536f6d61537761704c6962726172793a205a45524f5f414444524553530000006044820152606401610575565b9250929050565b60405163e6a4390560e01b81526001600160a01b0387811660048301528681166024830152600091829182917f00000000000000000000000000000000000000000000000000000000000000009091169063e6a4390590604401602060405180830381865afa1580156133d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133fc91906140cf565b6001600160a01b0316036134525760405162461bcd60e51b815260206004820152601a60248201527f536f6d6153776170506169723a20494e56414c49445f504149520000000000006044820152606401610575565b6000806134807f00000000000000000000000000000000000000000000000000000000000000008b8b61354f565b91509150816000148015613492575080155b156134