@zebec-fintech/silver-card-sdk
Version:
An sdk for purchasing silver card in zebec
1,056 lines • 78.2 kB
JSON
{
"_format": "hh-sol-artifact-1",
"contractName": "ZebecCard",
"sourceName": "contracts/ZebecCard.sol",
"abi": [
{
"inputs": [
{
"internalType": "address",
"name": "target",
"type": "address"
}
],
"name": "AddressEmptyCode",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "AddressInsufficientBalance",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "implementation",
"type": "address"
}
],
"name": "ERC1967InvalidImplementation",
"type": "error"
},
{
"inputs": [],
"name": "ERC1967NonPayable",
"type": "error"
},
{
"inputs": [],
"name": "FailedInnerCall",
"type": "error"
},
{
"inputs": [],
"name": "InvalidInitialization",
"type": "error"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "requiredBalance",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "currentBalance",
"type": "uint256"
}
],
"name": "NotEnoughBalance",
"type": "error"
},
{
"inputs": [],
"name": "NotInitializing",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "owner",
"type": "address"
}
],
"name": "OwnableInvalidOwner",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "OwnableUnauthorizedAccount",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "token",
"type": "address"
}
],
"name": "SafeERC20FailedOperation",
"type": "error"
},
{
"inputs": [],
"name": "UUPSUnauthorizedCallContext",
"type": "error"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "slot",
"type": "bytes32"
}
],
"name": "UUPSUnsupportedProxiableUUID",
"type": "error"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "from",
"type": "address"
},
{
"indexed": true,
"internalType": "uint256",
"name": "id",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "amount",
"type": "uint256"
},
{
"indexed": false,
"internalType": "string",
"name": "cardType",
"type": "string"
},
{
"indexed": false,
"internalType": "string",
"name": "userEmail",
"type": "string"
},
{
"indexed": false,
"internalType": "uint256",
"name": "purchasedAt",
"type": "uint256"
}
],
"name": "CardPurchased",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "from",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "Deposited",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "uint64",
"name": "version",
"type": "uint64"
}
],
"name": "Initialized",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "previousOwner",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "newOwner",
"type": "address"
}
],
"name": "OwnershipTransferred",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "from",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "srcToken",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "amount",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "spentAmount",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "returnAmount",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "feeAmount",
"type": "uint256"
}
],
"name": "Swapped",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "implementation",
"type": "address"
}
],
"name": "Upgraded",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "from",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "withdrawnAmount",
"type": "uint256"
}
],
"name": "WithdrawYield",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "from",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "withdrawnAmount",
"type": "uint256"
}
],
"name": "Withdrawn",
"type": "event"
},
{
"inputs": [],
"name": "UPGRADE_INTERFACE_VERSION",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "aavePool",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
},
{
"internalType": "string",
"name": "cardType",
"type": "string"
},
{
"internalType": "string",
"name": "userEmail",
"type": "string"
}
],
"name": "buyCard",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "cardBalances",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "cardConfig",
"outputs": [
{
"internalType": "uint256",
"name": "nativeFee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "nonNativeFee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "revenueFee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "counter",
"type": "uint256"
},
{
"internalType": "address",
"name": "cardVault",
"type": "address"
},
{
"internalType": "address",
"name": "revenueVault",
"type": "address"
},
{
"internalType": "address",
"name": "commissionVault",
"type": "address"
},
{
"internalType": "address",
"name": "usdcAddress",
"type": "address"
},
{
"internalType": "uint256",
"name": "minCardAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "maxCardAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "dailyCardBuyLimit",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "cardPurchases",
"outputs": [
{
"internalType": "uint256",
"name": "unixInRecord",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "totalCardBoughtPerDay",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "depositUsdc",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"name": "feeTiers",
"outputs": [
{
"internalType": "uint256",
"name": "minAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "maxAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "fee",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "generateYield",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "getFee",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "getFeeTiers",
"outputs": [
{
"components": [
{
"internalType": "uint256",
"name": "minAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "maxAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "fee",
"type": "uint256"
}
],
"internalType": "struct ZebecCard.FeeTier[]",
"name": "",
"type": "tuple[]"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"components": [
{
"internalType": "uint256",
"name": "nativeFee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "nonNativeFee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "revenueFee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "counter",
"type": "uint256"
},
{
"internalType": "address",
"name": "cardVault",
"type": "address"
},
{
"internalType": "address",
"name": "revenueVault",
"type": "address"
},
{
"internalType": "address",
"name": "commissionVault",
"type": "address"
},
{
"internalType": "address",
"name": "usdcAddress",
"type": "address"
},
{
"internalType": "uint256",
"name": "minCardAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "maxCardAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "dailyCardBuyLimit",
"type": "uint256"
}
],
"internalType": "struct ZebecCard.CardConfig",
"name": "card_config",
"type": "tuple"
},
{
"components": [
{
"internalType": "uint256",
"name": "minAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "maxAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "fee",
"type": "uint256"
}
],
"internalType": "struct ZebecCard.FeeTier[]",
"name": "fee_tiers",
"type": "tuple[]"
},
{
"internalType": "address",
"name": "inch_router",
"type": "address"
},
{
"internalType": "address",
"name": "weth",
"type": "address"
},
{
"internalType": "address",
"name": "zbc_token",
"type": "address"
},
{
"internalType": "address",
"name": "aave_pool",
"type": "address"
}
],
"name": "initialize",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "oneInchRouter",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "owner",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "proxiableUUID",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "renounceOwnership",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "cardVault",
"type": "address"
}
],
"name": "setCardVault",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "commissionVault",
"type": "address"
}
],
"name": "setComissionVault",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "dailyCardBuyLimit",
"type": "uint256"
}
],
"name": "setDailyCardBuyLimit",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "minAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "maxAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "fee",
"type": "uint256"
}
],
"name": "setFee",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"components": [
{
"internalType": "uint256",
"name": "minAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "maxAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "fee",
"type": "uint256"
}
],
"internalType": "struct ZebecCard.FeeTier[]",
"name": "newTiers",
"type": "tuple[]"
}
],
"name": "setFeeArray",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "maxAmount",
"type": "uint256"
}
],
"name": "setMaxCardAmount",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "minAmount",
"type": "uint256"
}
],
"name": "setMinCardAmount",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "nativeFee",
"type": "uint256"
}
],
"name": "setNativeFee",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "nonNativeFee",
"type": "uint256"
}
],
"name": "setNonNativeFee",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "revenueFee",
"type": "uint256"
}
],
"name": "setRevenueFee",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "revenueVault",
"type": "address"
}
],
"name": "setRevenueVault",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "usdcAddress",
"type": "address"
}
],
"name": "setUsdcAddress",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "contract IAggregationExecutor",
"name": "executor",
"type": "address"
},
{
"components": [
{
"internalType": "contract IERC20",
"name": "srcToken",
"type": "address"
},
{
"internalType": "contract IERC20",
"name": "dstToken",
"type": "address"
},
{
"internalType": "address payable",
"name": "srcReceiver",
"type": "address"
},
{
"internalType": "address payable",
"name": "dstReceiver",
"type": "address"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "minReturnAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "flags",
"type": "uint256"
}
],
"internalType": "struct IAggregationRouterV6.SwapDescription",
"name": "desc",
"type": "tuple"
},
{
"internalType": "bytes",
"name": "routeData",
"type": "bytes"
}
],
"name": "swapAndDeposit",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "newOwner",
"type": "address"
}
],
"name": "transferOwnership",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "newImplementation",
"type": "address"
},
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
}
],
"name": "upgradeToAndCall",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [],
"name": "wEth",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "withdraw",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "withdrawYield",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "zebecToken",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
}
],
"bytecode": "0x60a0806040523461002a5730608052612d0c90816100308239608051818181611480015261153a0152f35b600080fdfe6080604052600436101561001257600080fd5b600060e08135811c90816314435445146121f1578163145096d514611da1578163166dbb7314611c6d5781631d4247ab14611c2e578163230ed44a14611be25781632357928e14611a905781632e1a7d4d146119d257816337cf533114611948578163458e551e146117a457816348455ff0146117815781634d68e925146117425781634f1ef286146114fa57816352d1902d146114655781635b65b9ab1461134f5781636ca75e9514610dd1578163715018a614610d555781638da5cb5b14610d0f578163a03e4bc314610ce8578163a53ebd8a146109da578163a5b7ac7e14610998578163ab31978f1461052d57508063ac3af20814610506578063ad3cb1cc1461047b578063b0d097de14610458578063b573dca714610431578063b91a1e8f1461040f578063bea9c43e146103ec578063d38bcdee146103ad578063d895a46b1461036e578063df6d921214610347578063e591f2ff14610324578063e9a4d24f1461022f578063f076a846146101f7578063f2fde38b146101ca5763fcee45f4146101a157600080fd5b346101c75760203660031901126101c75760206101bf6004356126e6565b604051908152f35b80fd5b50346101c75760203660031901126101c7576101f46101e7612268565b6101ef612783565b612648565b80f35b50346101c75760203660031901126101c75760406020916001600160a01b0361021e612268565b168152601083522054604051908152f35b50346101c757806003193601126101c75760115461024c8161227e565b9061025a6040519283612230565b8082526011835260209182810191847f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c68845b8383106102e457505050506040519280840191818552518092526040840192945b8281106102ba5784840385f35b855180518552808301518584015260409081015190850152948101946060909301926001016102ad565b60038760019260409a9997989a516102fb81612214565b85548152848601548382015260028601546040820152815201920192019190969493959661028c565b50346101c75760203660031901126101c75761033e612783565b60043560015580f35b50346101c757806003193601126101c75760206001600160a01b03600c5416604051908152f35b50346101c75760203660031901126101c7576001600160a01b03610390612268565b610398612783565b166001600160a01b0319600454161760045580f35b50346101c75760203660031901126101c7576001600160a01b036103cf612268565b6103d7612783565b166001600160a01b0319600754161760075580f35b50346101c75760203660031901126101c757610406612783565b600435600a5580f35b50346101c75760203660031901126101c757610429612783565b600435815580f35b50346101c757806003193601126101c75760206001600160a01b03600d5416604051908152f35b50346101c75760203660031901126101c757610472612783565b60043560095580f35b50346101c757806003193601126101c757604051604081019080821067ffffffffffffffff8311176104f0576104ec91604052600581527f352e302e3000000000000000000000000000000000000000000000000000000060208201526040519182916020835260208301906123d6565b0390f35b634e487b7160e01b600052604160045260246000fd5b50346101c757806003193601126101c75760206001600160a01b03600b5416604051908152f35b905034610994576020806003193601126109905760043561054f331515612569565b61055a8115156124d3565b6001600160a01b039283600e54169084600754166040519283917f35ea6a7500000000000000000000000000000000000000000000000000000000835260048301528160246101e09586935afa918215610985578693889361080b575b505050610100015116338552601083526105df6105d8836040882054612839565b919061251e565b338087526010855260408088209290925590516323b872dd60e01b8152600481019190915230602482015260448101839052838160648189865af19081156108005786916107e3575b501561079f57600e5460405163095ea7b360e01b81529085166001600160a01b03166004820152602481018390529190839083908188816044810103925af1918215610794578392610681918791610767575b506125cc565b606484600e541694600754168660405196879485937f69328dec000000000000000000000000000000000000000000000000000000008552600485015260248401523060448401525af191821561075c578392610708575b507ff09b3678dd1b265d3e2d9f681481c92d1cdd81b6e19fa43651707dedf99263a8906040519283523392a280f35b9080925081813d8311610755575b6107208183612230565b810103126107505751907ff09b3678dd1b265d3e2d9f681481c92d1cdd81b6e19fa43651707dedf99263a86106d9565b600080fd5b503d610716565b6040513d85823e3d90fd5b6107879150843d861161078d575b61077f8183612230565b8101906125b4565b3861067b565b503d610775565b6040513d87823e3d90fd5b6064836040519062461bcd60e51b82526004820152601660248201527f61546f6b656e207472616e73666572206661696c6564000000000000000000006044820152fd5b6107fa9150843d861161078d5761077f8183612230565b38610628565b6040513d88823e3d90fd5b919350915082813d811161097e575b6108248183612230565b810103818112610976576040519182019067ffffffffffffffff90838310828411176104f0578790836040521261097a576102008301908111828210176104f057604052835181528152610879858401612617565b8582015261088960408401612617565b604082015261089a60608401612617565b60608201526108ab60808401612617565b60808201526108bc60a08401612617565b60a082015260c083015164ffffffffff811681036109765760c0820152818301519261ffff8416840361097657869361010093830152826108fe818301612634565b90830152610120610910818301612634565b90830152610140610922818301612634565b90830152610160610934818301612634565b90830152610180610946818301612617565b908301526101a0610958818301612617565b9083015261096a6101c0809201612617565b908201529038806105b7565b8780fd5b8880fd5b503d61081a565b6040513d89823e3d90fd5b8280fd5b5080fd5b82346101c75760203660031901126101c757604080916001600160a01b036109be612268565b168152600f602052206001815491015482519182526020820152f35b82346101c75760603660031901126101c75767ffffffffffffffff600435602435828111610ce457610a1090369060040161238f565b91604435908111610ce457610a2990369060040161238f565b6001600160a01b03928360075416610a42331515612569565b60085484101580610cd8575b15610c9457338652602094601086526040872054858110610c765790610a9e9291610aa36105d888612710610a8b610a85836126e6565b83612416565b0493610a978583612852565b989061251e565b612852565b338a526010895260408a20556003546000198114610c6257600101600355868989610acd426128ed565b919091338552600f8452610ae460408620546128ed565b93919091149384610c58575b505082610c4e575b505015610bf857505050338952600f8852610b1d6105d888600160408d200154612839565b338a52600f895280600160408c200155600a5410610bb4577f7747419eb85d2a64ce5c3fd1bf01b54b47cdcfb621ac43741f8460d4f3ed40cb9593610b969383610b73610b7d94610ba49996600554168461286b565b600454169061286b565b60806003549760405197885287015260808601906123d6565b9084820360408601526123d6565b914260608201528033930390a380f35b6064886040519062461bcd60e51b82526004820152601e60248201527f4461696c79204361726420427579204c696d69742045786365656465642100006044820152fd5b93610b73610c49947f7747419eb85d2a64ce5c3fd1bf01b54b47cdcfb621ac43741f8460d4f3ed40cb9a989460016040610b969a96600f610ba49e9b3383525220428155015582600554168461286b565b610b7d565b1490508d80610af8565b1492508f80610af0565b60248a634e487b7160e01b81526011600452fd5b8560449160405191634787a10360e11b835260048301526024820152fd5b606460405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206e6f742077697468696e20627579696e672072616e676521006044820152fd5b50600954841115610a4e565b8380fd5b82346101c757806003193601126101c75760206001600160a01b03600e5416604051908152f35b82346101c757806003193601126101c75760206001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005416604051908152f35b82346101c757806003193601126101c757610d6e612783565b60006001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993008054906001600160a01b031982169055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b9050610120366003190112610994576004356001600160a01b038116810361099057816023193601126109905760405191820182811067ffffffffffffffff8211176104f0576040526024356001600160a01b03811681036107505782526044356001600160a01b03811681036107505760208301526064356001600160a01b0381168103610750576040830152610e67612252565b606083015260a435608083015260c43560a083015260e43560c083015267ffffffffffffffff610104351161099057610ea6366101043560040161238f565b916001600160a01b036020820151166001600160a01b03600754160361130b576001600160a01b0360608201511630036112c7576001600160a01b03815116926001600160a01b03600c5416841492831561120d575b610fbd916040916001600160a01b0380600b5416918451958694859384937f07ed23790000000000000000000000000000000000000000000000000000000085521660048401526001600160a01b0389511660248401526001600160a01b0360208a01511660448401526001600160a01b03878a01511660648401526001600160a01b0360608a0151166084840152608089015160a484015260a089015160c484015260c089015160e48401526101206101048401526101248301906123d6565b039134905af192831561079457859186946111ce575b50811561118a57610feb6105d8856080860151612852565b806110ca575b5080156110b6575b156110a657608061271061100f87545b84612416565b04926110586105d86110246105d88787612852565b611046876001600160a01b03600754166001600160a01b03600554169061286b565b338a52601060205260408a2054612839565b338852601060205260408820550151926040519384526020840152604083015260608201527fd8066379a11f110d1eb579110571ce47b1557c623d7ae29f423d92cd6dd953be60803392a380f35b608061271061100f600154611009565b506001600160a01b03600d54168414610ff9565b816110e0576110da90338761286b565b38610ff1565b6040519081602081011067ffffffffffffffff6020840111176104f05787809291602083818495016040528381520190335af161111b6128bd565b506110da57608460405162461bcd60e51b815260206004820152602660248201527f5472616e7366657248656c7065723a204e41544956455f5452414e534645525f60448201527f4641494c454400000000000000000000000000000000000000000000000000006064820152fd5b606460405162461bcd60e51b815260206004820152601260248201527f537761704f6e31696e6368206661696c656400000000000000000000000000006044820152fd5b915092506040813d604011611205575b816111eb60409383612230565b8101031261120157602081519101519238610fd3565b8480fd5b3d91506111de565b61121d60808401513033886127e6565b600b54608084015160405163095ea7b360e01b81526001600160a01b03909216600483015260248201526020816044818a8a5af19081156109855787916112a8575b50610efc57606460405162461bcd60e51b815260206004820152600f60248201527f417070726f76616c206661696c656400000000000000000000000000000000006044820152fd5b6112c1915060203d60201161078d5761077f8183612230565b3861125f565b606460405162461bcd60e51b815260206004820152601c60248201527f496e76616c69642064657374696e6174696f6e207265636569766572000000006044820152fd5b606460405162461bcd60e51b815260206004820152601960248201527f496e76616c69642064657374696e6174696f6e20746f6b656e000000000000006044820152fd5b82346101c75760603660031901126101c75760443560043561136f612783565b8291835b60115481101561145d5761138681612322565b505483101580611446575b61139d57600101611373565b819293506113ac600291612322565b50015560015b156113bb578280f35b604051916113c883612214565b82526024356020830152604082015260115468010000000000000000811015611432578060016113fb9201601155612322565b61141f57815181556020820151600182015560409091015160029091015581808280f35b602483634e487b7160e01b815280600452fd5b602483634e487b7160e01b81526041600452fd5b50600161145282612322565b500154831115611391565b5090916113b2565b82346101c757806003193601126101c7576001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036114d05760206040517f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8152f35b60046040517fe07c8dba000000000000000000000000000000000000000000000000000000008152fd5b8260403660031901126101c75761150f612268565b60243567ffffffffffffffff81116109905761152f90369060040161238f565b6001600160a01b03807f000000000000000000000000000000000000000000000000000000000000000016803014908115611714575b506114d057611572612783565b8216916040517f52d1902d000000000000000000000000000000000000000000000000000000008152602081600481875afa8591816116dc575b506115c95760248460405190634c9c8ce360e01b82526004820152fd5b9284937f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc908181036116ab5750823b156116935780546001600160a01b0319168217905560405184917fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b8380a283511561165e57508083602061165a95519101845af46116546128bd565b91612c43565b5080f35b925050503461166b575080f35b807fb398979f0000000000000000000000000000000000000000000000000000000060049252fd5b60248260405190634c9c8ce360e01b82526004820152fd5b602490604051907faa1d49a40000000000000000000000000000000000000000000000000000000082526004820152fd5b9091506020813d60201161170c575b816116f860209383612230565b81010312611708575190866115ac565b8580fd5b3d91506116eb565b9050817f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5416141585611565565b82346101c75760203660031901126101c7576001600160a01b03611764612268565b61176c612783565b166001600160a01b0319600554161760055580f35b82346101c75760203660031901126101c75761179b612783565b60043560085580f35b82346101c757602080600319360112610994576004356001600160a01b039182600754166117d3331515612569565b6117de8315156124d3565b33855260108252604085205483811061192a5782848094936118076105d88a9861184b96612852565b33885260108452604088205587600e54168760405180968195829463095ea7b360e01b845260048401602090939291936001600160a01b0360408201951681520152565b03925af190811561191f57611868928592611902575b50506125cc565b82600e54169260075416833b15610990576084908360405195869485937f617ba037000000000000000000000000000000000000000000000000000000008552600485015260248401523360448401528160648401525af180156118f7576118ce575080f35b67ffffffffffffffff81116118e35760405280f35b602482634e487b7160e01b81526041600452fd5b6040513d84823e3d90fd5b6119189250803d1061078d5761077f8183612230565b8680611861565b6040513d86823e3d90fd5b8360449160405191634787a10360e11b835260048301526024820152fd5b9050346109945781600319360112610994576101609154906001549060025490600354906001600160a01b0390816004541691806005541681600654169160075416936008549560095497600a54996040519b8c5260208c015260408b015260608a0152608089015260a088015260c0870152850152610100840152610120830152610140820152f35b82346101c75760203660031901126101c7576004356001600160a01b03600754166119fe8215156124d3565b611a09331515612569565b33835260106020526040832054828110611a7257611a4391611a2f6105d8858094612852565b33865260106020526040862055339061286b565b6040519081527f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d560203392a280f35b8260449160405191634787a10360e11b835260048301526024820152fd5b82346101c75760208060031936011261099457600435906001600160a01b03600754166040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081523360048201523060248201528281604481855afa80156107945784918691611bb1575b5010611b6d5790611b3d837f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c493611b348215156124d3565b309033906127e6565b33845260108152611b556105d8846040872054612839565b3385526010825260408520556040519283523392a280f35b6064826040519062461bcd60e51b82526004820152601660248201527f496e73756666696369656e7420616c6c6f77616e6365000000000000000000006044820152fd5b809250848092503d8311611bdb575b611bca8183612230565b810103126112015783905186611afc565b503d611bc0565b82346101c75760203660031901126101c757600435906011548210156101c7576060611c0d83612322565b50805490600260018201549101549060405192835260208301526040820152f35b82346101c75760203660031901126101c7576001600160a01b03611c50612268565b611c58612783565b166001600160a01b0319600654161760065580f35b82346101c7576020806003193601126109945760043567ffffffffffffffff811161099057611ca0903690600401612296565b90611ca9612783565b6011548360115580611d2d575b506020825192611cc58461243f565b0190601184527f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c6884925b848410611cfa578580f35b60038382611d21600194518690604060029180518455602081015160018501550151910155565b01920193019290611cef565b60039080600302906003820403611d8d57601185527f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c68908101905b818110611d76575050611cb6565b808684925586600182015586600282015501611d68565b602485634e487b7160e01b81526011600452fd5b905034610994573660031901906102008212610990576101608092126109905760405191820182811067ffffffffffffffff8211176121dd576040526004358252602435602083015260443560408301526064356060830152611e02612252565b608083015260a4356001600160a01b0381168103610ce45760a083015260c4356001600160a01b0381168103610ce45760c083015260e4356001600160a01b0381168103610ce457818301526101043561010083015261012435610120830152610144356101408301526101643567ffffffffffffffff8111610ce457611e8d903690600401612296565b9061018435926001600160a01b0384168403611201576101a435906001600160a01b0382168203611708576101c435906001600160a01b03821682036121d9576101e435916001600160a01b0383168303610976577ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00549667ffffffffffffffff881615806121cb575b600167ffffffffffffffff8a161490816121c1575b1590816121b8575b5061218e576001600160a01b039485809492610140829460018d67ffffffffffffffff1916177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005560ff8d60401c161561214f575b8d8151905560208101516001556040810151600255606081015160035583806080830151169b6001600160a01b03199c8d60045416176004558160a0840151168d60055416176005558160c0840151168d6006541617600655820151168b60075416176007556101008101516008556101208101516009550151600a5561200e612b29565b612016612b29565b61201e612b29565b61202733612648565b1687600b541617600b551685600c541617600c551683600d541617600d551690600e541617600e55602081519161205d8361243f565b01601184527f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c6884915b83831061211b578560ff8660401c161561209d5780f35b68ff0000000000000000197ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054167ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00557fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2602060405160018152a180f35b6003602082612143600194518690604060029180518455602081015160018501550151910155565b01920192019190612086565b68ffffffffffffffffff198d1668010000000000000001177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0055611f89565b60046040517ff92ee8a9000000000000000000000000000000000000000000000000000000008152fd5b90501538611f34565b303b159150611f2c565b5060ff8860401c1615611f17565b8680fd5b602484634e487b7160e01b81526041600452fd5b82346101c75760203660031901126101c75761220b612783565b60043560025580f35b6060810190811067ffffffffffffffff8211176104f057604052565b90601f8019910116810190811067ffffffffffffffff8211176104f057604052565b608435906001600160a01b038216820361075057565b600435906001600160a01b038216820361075057565b67ffffffffffffffff81116104f05760051b60200190565b81601f820112156107505780359060206122af8361227e565b9360406122bf6040519687612230565b8486528286019183606080970286010194818611610750578401925b8584106122ec575050505050505090565b868483031261075057848791845161230381612214565b86358152828701358382015285870135868201528152019301926122db565b6011548