123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587 |
- {
- "address": "0x47590c3D11e9366215416f2a3A03Cf21AdB716AE",
- "abi": [
- {
- "inputs": [],
- "stateMutability": "nonpayable",
- "type": "constructor"
- },
- {
- "anonymous": false,
- "inputs": [
- {
- "indexed": false,
- "internalType": "uint16",
- "name": "chainId",
- "type": "uint16"
- },
- {
- "indexed": false,
- "internalType": "bytes",
- "name": "srcAddress",
- "type": "bytes"
- },
- {
- "indexed": false,
- "internalType": "uint256",
- "name": "nonce",
- "type": "uint256"
- },
- {
- "indexed": false,
- "internalType": "address",
- "name": "token",
- "type": "address"
- },
- {
- "indexed": false,
- "internalType": "uint256",
- "name": "amountLD",
- "type": "uint256"
- },
- {
- "indexed": false,
- "internalType": "address",
- "name": "to",
- "type": "address"
- },
- {
- "indexed": false,
- "internalType": "bytes",
- "name": "payload",
- "type": "bytes"
- },
- {
- "indexed": false,
- "internalType": "bytes",
- "name": "reason",
- "type": "bytes"
- }
- ],
- "name": "CachedSwapSaved",
- "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": false,
- "internalType": "uint16",
- "name": "srcChainId",
- "type": "uint16"
- },
- {
- "indexed": true,
- "internalType": "bytes",
- "name": "srcAddress",
- "type": "bytes"
- },
- {
- "indexed": true,
- "internalType": "uint256",
- "name": "nonce",
- "type": "uint256"
- },
- {
- "indexed": false,
- "internalType": "uint256",
- "name": "srcPoolId",
- "type": "uint256"
- },
- {
- "indexed": false,
- "internalType": "uint256",
- "name": "dstPoolId",
- "type": "uint256"
- },
- {
- "indexed": false,
- "internalType": "address",
- "name": "to",
- "type": "address"
- },
- {
- "indexed": false,
- "internalType": "uint256",
- "name": "amountSD",
- "type": "uint256"
- },
- {
- "indexed": false,
- "internalType": "uint256",
- "name": "mintAmountSD",
- "type": "uint256"
- }
- ],
- "name": "RedeemLocalCallback",
- "type": "event"
- },
- {
- "anonymous": false,
- "inputs": [
- {
- "indexed": false,
- "internalType": "uint8",
- "name": "bridgeFunctionType",
- "type": "uint8"
- },
- {
- "indexed": false,
- "internalType": "uint16",
- "name": "chainId",
- "type": "uint16"
- },
- {
- "indexed": false,
- "internalType": "bytes",
- "name": "srcAddress",
- "type": "bytes"
- },
- {
- "indexed": false,
- "internalType": "uint256",
- "name": "nonce",
- "type": "uint256"
- }
- ],
- "name": "Revert",
- "type": "event"
- },
- {
- "anonymous": false,
- "inputs": [
- {
- "indexed": false,
- "internalType": "uint16",
- "name": "srcChainId",
- "type": "uint16"
- },
- {
- "indexed": false,
- "internalType": "uint256",
- "name": "_srcPoolId",
- "type": "uint256"
- },
- {
- "indexed": false,
- "internalType": "uint256",
- "name": "_dstPoolId",
- "type": "uint256"
- },
- {
- "indexed": false,
- "internalType": "bytes",
- "name": "to",
- "type": "bytes"
- },
- {
- "indexed": false,
- "internalType": "uint256",
- "name": "redeemAmountSD",
- "type": "uint256"
- },
- {
- "indexed": false,
- "internalType": "uint256",
- "name": "mintAmountSD",
- "type": "uint256"
- },
- {
- "indexed": true,
- "internalType": "uint256",
- "name": "nonce",
- "type": "uint256"
- },
- {
- "indexed": true,
- "internalType": "bytes",
- "name": "srcAddress",
- "type": "bytes"
- }
- ],
- "name": "RevertRedeemLocal",
- "type": "event"
- },
- {
- "inputs": [
- {
- "internalType": "uint256",
- "name": "_poolId",
- "type": "uint256"
- },
- {
- "internalType": "uint16",
- "name": "_dstChainId",
- "type": "uint16"
- },
- {
- "internalType": "uint256",
- "name": "_dstPoolId",
- "type": "uint256"
- }
- ],
- "name": "activateChainPath",
- "outputs": [],
- "stateMutability": "nonpayable",
- "type": "function"
- },
- {
- "inputs": [
- {
- "internalType": "uint256",
- "name": "_poolId",
- "type": "uint256"
- },
- {
- "internalType": "uint256",
- "name": "_amountLD",
- "type": "uint256"
- },
- {
- "internalType": "address",
- "name": "_to",
- "type": "address"
- }
- ],
- "name": "addLiquidity",
- "outputs": [],
- "stateMutability": "nonpayable",
- "type": "function"
- },
- {
- "inputs": [],
- "name": "bridge",
- "outputs": [
- {
- "internalType": "contract Bridge",
- "name": "",
- "type": "address"
- }
- ],
- "stateMutability": "view",
- "type": "function"
- },
- {
- "inputs": [
- {
- "internalType": "uint16",
- "name": "",
- "type": "uint16"
- },
- {
- "internalType": "bytes",
- "name": "",
- "type": "bytes"
- },
- {
- "internalType": "uint256",
- "name": "",
- "type": "uint256"
- }
- ],
- "name": "cachedSwapLookup",
- "outputs": [
- {
- "internalType": "address",
- "name": "token",
- "type": "address"
- },
- {
- "internalType": "uint256",
- "name": "amountLD",
- "type": "uint256"
- },
- {
- "internalType": "address",
- "name": "to",
- "type": "address"
- },
- {
- "internalType": "bytes",
- "name": "payload",
- "type": "bytes"
- }
- ],
- "stateMutability": "view",
- "type": "function"
- },
- {
- "inputs": [
- {
- "internalType": "uint256",
- "name": "_poolId",
- "type": "uint256"
- },
- {
- "internalType": "bool",
- "name": "_fullMode",
- "type": "bool"
- }
- ],
- "name": "callDelta",
- "outputs": [],
- "stateMutability": "nonpayable",
- "type": "function"
- },
- {
- "inputs": [
- {
- "internalType": "uint16",
- "name": "_srcChainId",
- "type": "uint16"
- },
- {
- "internalType": "bytes",
- "name": "_srcAddress",
- "type": "bytes"
- },
- {
- "internalType": "uint256",
- "name": "_nonce",
- "type": "uint256"
- }
- ],
- "name": "clearCachedSwap",
- "outputs": [],
- "stateMutability": "nonpayable",
- "type": "function"
- },
- {
- "inputs": [
- {
- "internalType": "uint256",
- "name": "_poolId",
- "type": "uint256"
- },
- {
- "internalType": "uint16",
- "name": "_dstChainId",
- "type": "uint16"
- },
- {
- "internalType": "uint256",
- "name": "_dstPoolId",
- "type": "uint256"
- },
- {
- "internalType": "uint256",
- "name": "_weight",
- "type": "uint256"
- }
- ],
- "name": "createChainPath",
- "outputs": [],
- "stateMutability": "nonpayable",
- "type": "function"
- },
- {
- "inputs": [
- {
- "internalType": "uint256",
- "name": "_poolId",
- "type": "uint256"
- },
- {
- "internalType": "address",
- "name": "_token",
- "type": "address"
- },
- {
- "internalType": "uint8",
- "name": "_sharedDecimals",
- "type": "uint8"
- },
- {
- "internalType": "uint8",
- "name": "_localDecimals",
- "type": "uint8"
- },
- {
- "internalType": "string",
- "name": "_name",
- "type": "string"
- },
- {
- "internalType": "string",
- "name": "_symbol",
- "type": "string"
- }
- ],
- "name": "createPool",
- "outputs": [
- {
- "internalType": "address",
- "name": "",
- "type": "address"
- }
- ],
- "stateMutability": "nonpayable",
- "type": "function"
- },
- {
- "inputs": [
- {
- "internalType": "uint16",
- "name": "_dstChainId",
- "type": "uint16"
- },
- {
- "internalType": "uint256",
- "name": "_dstPoolId",
- "type": "uint256"
- },
- {
- "internalType": "uint256",
- "name": "_srcPoolId",
- "type": "uint256"
- },
- {
- "components": [
- {
- "internalType": "uint256",
- "name": "credits",
- "type": "uint256"
- },
- {
- "internalType": "uint256",
- "name": "idealBalance",
- "type": "uint256"
- }
- ],
- "internalType": "struct Pool.CreditObj",
- "name": "_c",
- "type": "tuple"
- }
- ],
- "name": "creditChainPath",
- "outputs": [],
- "stateMutability": "nonpayable",
- "type": "function"
- },
- {
- "inputs": [],
- "name": "factory",
- "outputs": [
- {
- "internalType": "contract Factory",
- "name": "",
- "type": "address"
- }
- ],
- "stateMutability": "view",
- "type": "function"
- },
- {
- "inputs": [
- {
- "internalType": "uint16",
- "name": "_srcPoolId",
- "type": "uint16"
- },
- {
- "internalType": "uint256",
- "name": "_amountLP",
- "type": "uint256"
- },
- {
- "internalType": "address",
- "name": "_to",
- "type": "address"
- }
- ],
- "name": "instantRedeemLocal",
- "outputs": [
- {
- "internalType": "uint256",
- "name": "amountSD",
- "type": "uint256"
- }
- ],
- "stateMutability": "nonpayable",
- "type": "function"
- },
- {
- "inputs": [],
- "name": "mintFeeOwner",
- "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": "protocolFeeOwner",
- "outputs": [
- {
- "internalType": "address",
- "name": "",
- "type": "address"
- }
- ],
- "stateMutability": "view",
- "type": "function"
- },
- {
- "inputs": [
- {
- "internalType": "uint16",
- "name": "_dstChainId",
- "type": "uint16"
- },
- {
- "internalType": "uint8",
- "name": "_functionType",
- "type": "uint8"
- },
- {
- "internalType": "bytes",
- "name": "_toAddress",
- "type": "bytes"
- },
- {
- "internalType": "bytes",
- "name": "_transferAndCallPayload",
- "type": "bytes"
- },
- {
- "components": [
- {
- "internalType": "uint256",
- "name": "dstGasForCall",
- "type": "uint256"
- },
- {
- "internalType": "uint256",
- "name": "dstNativeAmount",
- "type": "uint256"
- },
- {
- "internalType": "bytes",
- "name": "dstNativeAddr",
- "type": "bytes"
- }
- ],
- "internalType": "struct IMirrorgateRouter.lzTxObj",
- "name": "_lzTxParams",
- "type": "tuple"
- }
- ],
- "name": "quoteLayerZeroFee",
- "outputs": [
- {
- "internalType": "uint256",
- "name": "",
- "type": "uint256"
- },
- {
- "internalType": "uint256",
- "name": "",
- "type": "uint256"
- }
- ],
- "stateMutability": "view",
- "type": "function"
- },
- {
- "inputs": [
- {
- "internalType": "uint16",
- "name": "_dstChainId",
- "type": "uint16"
- },
- {
- "internalType": "uint256",
- "name": "_srcPoolId",
- "type": "uint256"
- },
- {
- "internalType": "uint256",
- "name": "_dstPoolId",
- "type": "uint256"
- },
- {
- "internalType": "address payable",
- "name": "_refundAddress",
- "type": "address"
- },
- {
- "internalType": "uint256",
- "name": "_amountLP",
- "type": "uint256"
- },
- {
- "internalType": "bytes",
- "name": "_to",
- "type": "bytes"
- },
- {
- "components": [
- {
- "internalType": "uint256",
- "name": "dstGasForCall",
- "type": "uint256"
- },
- {
- "internalType": "uint256",
- "name": "dstNativeAmount",
- "type": "uint256"
- },
- {
- "internalType": "bytes",
- "name": "dstNativeAddr",
- "type": "bytes"
- }
- ],
- "internalType": "struct IMirrorgateRouter.lzTxObj",
- "name": "_lzTxParams",
- "type": "tuple"
- }
- ],
- "name": "redeemLocal",
- "outputs": [],
- "stateMutability": "payable",
- "type": "function"
- },
- {
- "inputs": [
- {
- "internalType": "uint16",
- "name": "_srcChainId",
- "type": "uint16"
- },
- {
- "internalType": "bytes",
- "name": "_srcAddress",
- "type": "bytes"
- },
- {
- "internalType": "uint256",
- "name": "_nonce",
- "type": "uint256"
- },
- {
- "internalType": "uint256",
- "name": "_srcPoolId",
- "type": "uint256"
- },
- {
- "internalType": "uint256",
- "name": "_dstPoolId",
- "type": "uint256"
- },
- {
- "internalType": "address",
- "name": "_to",
- "type": "address"
- },
- {
- "internalType": "uint256",
- "name": "_amountSD",
- "type": "uint256"
- },
- {
- "internalType": "uint256",
- "name": "_mintAmountSD",
- "type": "uint256"
- }
- ],
- "name": "redeemLocalCallback",
- "outputs": [],
- "stateMutability": "nonpayable",
- "type": "function"
- },
- {
- "inputs": [
- {
- "internalType": "uint16",
- "name": "_srcChainId",
- "type": "uint16"
- },
- {
- "internalType": "bytes",
- "name": "_srcAddress",
- "type": "bytes"
- },
- {
- "internalType": "uint256",
- "name": "_nonce",
- "type": "uint256"
- },
- {
- "internalType": "uint256",
- "name": "_srcPoolId",
- "type": "uint256"
- },
- {
- "internalType": "uint256",
- "name": "_dstPoolId",
- "type": "uint256"
- },
- {
- "internalType": "uint256",
- "name": "_amountSD",
- "type": "uint256"
- },
- {
- "internalType": "bytes",
- "name": "_to",
- "type": "bytes"
- }
- ],
- "name": "redeemLocalCheckOnRemote",
- "outputs": [],
- "stateMutability": "nonpayable",
- "type": "function"
- },
- {
- "inputs": [
- {
- "internalType": "uint16",
- "name": "_dstChainId",
- "type": "uint16"
- },
- {
- "internalType": "uint256",
- "name": "_srcPoolId",
- "type": "uint256"
- },
- {
- "internalType": "uint256",
- "name": "_dstPoolId",
- "type": "uint256"
- },
- {
- "internalType": "address payable",
- "name": "_refundAddress",
- "type": "address"
- },
- {
- "internalType": "uint256",
- "name": "_amountLP",
- "type": "uint256"
- },
- {
- "internalType": "uint256",
- "name": "_minAmountLD",
- "type": "uint256"
- },
- {
- "internalType": "bytes",
- "name": "_to",
- "type": "bytes"
- },
- {
- "components": [
- {
- "internalType": "uint256",
- "name": "dstGasForCall",
- "type": "uint256"
- },
- {
- "internalType": "uint256",
- "name": "dstNativeAmount",
- "type": "uint256"
- },
- {
- "internalType": "bytes",
- "name": "dstNativeAddr",
- "type": "bytes"
- }
- ],
- "internalType": "struct IMirrorgateRouter.lzTxObj",
- "name": "_lzTxParams",
- "type": "tuple"
- }
- ],
- "name": "redeemRemote",
- "outputs": [],
- "stateMutability": "payable",
- "type": "function"
- },
- {
- "inputs": [],
- "name": "renounceOwnership",
- "outputs": [],
- "stateMutability": "nonpayable",
- "type": "function"
- },
- {
- "inputs": [
- {
- "internalType": "uint16",
- "name": "_srcChainId",
- "type": "uint16"
- },
- {
- "internalType": "bytes",
- "name": "_srcAddress",
- "type": "bytes"
- },
- {
- "internalType": "uint256",
- "name": "_nonce",
- "type": "uint256"
- }
- ],
- "name": "retryRevert",
- "outputs": [],
- "stateMutability": "payable",
- "type": "function"
- },
- {
- "inputs": [
- {
- "internalType": "uint16",
- "name": "",
- "type": "uint16"
- },
- {
- "internalType": "bytes",
- "name": "",
- "type": "bytes"
- },
- {
- "internalType": "uint256",
- "name": "",
- "type": "uint256"
- }
- ],
- "name": "revertLookup",
- "outputs": [
- {
- "internalType": "bytes",
- "name": "",
- "type": "bytes"
- }
- ],
- "stateMutability": "view",
- "type": "function"
- },
- {
- "inputs": [
- {
- "internalType": "uint16",
- "name": "_dstChainId",
- "type": "uint16"
- },
- {
- "internalType": "bytes",
- "name": "_srcAddress",
- "type": "bytes"
- },
- {
- "internalType": "uint256",
- "name": "_nonce",
- "type": "uint256"
- },
- {
- "internalType": "address payable",
- "name": "_refundAddress",
- "type": "address"
- },
- {
- "components": [
- {
- "internalType": "uint256",
- "name": "dstGasForCall",
- "type": "uint256"
- },
- {
- "internalType": "uint256",
- "name": "dstNativeAmount",
- "type": "uint256"
- },
- {
- "internalType": "bytes",
- "name": "dstNativeAddr",
- "type": "bytes"
- }
- ],
- "internalType": "struct IMirrorgateRouter.lzTxObj",
- "name": "_lzTxParams",
- "type": "tuple"
- }
- ],
- "name": "revertRedeemLocal",
- "outputs": [],
- "stateMutability": "payable",
- "type": "function"
- },
- {
- "inputs": [
- {
- "internalType": "uint16",
- "name": "_dstChainId",
- "type": "uint16"
- },
- {
- "internalType": "uint256",
- "name": "_srcPoolId",
- "type": "uint256"
- },
- {
- "internalType": "uint256",
- "name": "_dstPoolId",
- "type": "uint256"
- },
- {
- "internalType": "address payable",
- "name": "_refundAddress",
- "type": "address"
- }
- ],
- "name": "sendCredits",
- "outputs": [],
- "stateMutability": "payable",
- "type": "function"
- },
- {
- "inputs": [
- {
- "internalType": "contract Bridge",
- "name": "_bridge",
- "type": "address"
- },
- {
- "internalType": "contract Factory",
- "name": "_factory",
- "type": "address"
- }
- ],
- "name": "setBridgeAndFactory",
- "outputs": [],
- "stateMutability": "nonpayable",
- "type": "function"
- },
- {
- "inputs": [
- {
- "internalType": "uint256",
- "name": "_poolId",
- "type": "uint256"
- },
- {
- "internalType": "bool",
- "name": "_batched",
- "type": "bool"
- },
- {
- "internalType": "uint256",
- "name": "_swapDeltaBP",
- "type": "uint256"
- },
- {
- "internalType": "uint256",
- "name": "_lpDeltaBP",
- "type": "uint256"
- },
- {
- "internalType": "bool",
- "name": "_defaultSwapMode",
- "type": "bool"
- },
- {
- "internalType": "bool",
- "name": "_defaultLPMode",
- "type": "bool"
- }
- ],
- "name": "setDeltaParam",
- "outputs": [],
- "stateMutability": "nonpayable",
- "type": "function"
- },
- {
- "inputs": [
- {
- "internalType": "uint256",
- "name": "_poolId",
- "type": "uint256"
- },
- {
- "internalType": "address",
- "name": "_feeLibraryAddr",
- "type": "address"
- }
- ],
- "name": "setFeeLibrary",
- "outputs": [],
- "stateMutability": "nonpayable",
- "type": "function"
- },
- {
- "inputs": [
- {
- "internalType": "uint256",
- "name": "_poolId",
- "type": "uint256"
- },
- {
- "internalType": "uint256",
- "name": "_mintFeeBP",
- "type": "uint256"
- }
- ],
- "name": "setFees",
- "outputs": [],
- "stateMutability": "nonpayable",
- "type": "function"
- },
- {
- "inputs": [
- {
- "internalType": "address",
- "name": "_owner",
- "type": "address"
- }
- ],
- "name": "setMintFeeOwner",
- "outputs": [],
- "stateMutability": "nonpayable",
- "type": "function"
- },
- {
- "inputs": [
- {
- "internalType": "address",
- "name": "_owner",
- "type": "address"
- }
- ],
- "name": "setProtocolFeeOwner",
- "outputs": [],
- "stateMutability": "nonpayable",
- "type": "function"
- },
- {
- "inputs": [
- {
- "internalType": "uint256",
- "name": "_poolId",
- "type": "uint256"
- },
- {
- "internalType": "bool",
- "name": "_swapStop",
- "type": "bool"
- }
- ],
- "name": "setSwapStop",
- "outputs": [],
- "stateMutability": "nonpayable",
- "type": "function"
- },
- {
- "inputs": [
- {
- "internalType": "uint256",
- "name": "_poolId",
- "type": "uint256"
- },
- {
- "internalType": "uint16",
- "name": "_dstChainId",
- "type": "uint16"
- },
- {
- "internalType": "uint256",
- "name": "_dstPoolId",
- "type": "uint256"
- },
- {
- "internalType": "uint16",
- "name": "_weight",
- "type": "uint16"
- }
- ],
- "name": "setWeightForChainPath",
- "outputs": [],
- "stateMutability": "nonpayable",
- "type": "function"
- },
- {
- "inputs": [
- {
- "internalType": "uint16",
- "name": "_dstChainId",
- "type": "uint16"
- },
- {
- "internalType": "uint256",
- "name": "_srcPoolId",
- "type": "uint256"
- },
- {
- "internalType": "uint256",
- "name": "_dstPoolId",
- "type": "uint256"
- },
- {
- "internalType": "address payable",
- "name": "_refundAddress",
- "type": "address"
- },
- {
- "internalType": "uint256",
- "name": "_amountLD",
- "type": "uint256"
- },
- {
- "internalType": "uint256",
- "name": "_minAmountLD",
- "type": "uint256"
- },
- {
- "components": [
- {
- "internalType": "uint256",
- "name": "dstGasForCall",
- "type": "uint256"
- },
- {
- "internalType": "uint256",
- "name": "dstNativeAmount",
- "type": "uint256"
- },
- {
- "internalType": "bytes",
- "name": "dstNativeAddr",
- "type": "bytes"
- }
- ],
- "internalType": "struct IMirrorgateRouter.lzTxObj",
- "name": "_lzTxParams",
- "type": "tuple"
- },
- {
- "internalType": "bytes",
- "name": "_to",
- "type": "bytes"
- },
- {
- "internalType": "bytes",
- "name": "_payload",
- "type": "bytes"
- }
- ],
- "name": "swap",
- "outputs": [],
- "stateMutability": "payable",
- "type": "function"
- },
- {
- "inputs": [
- {
- "internalType": "uint16",
- "name": "_srcChainId",
- "type": "uint16"
- },
- {
- "internalType": "bytes",
- "name": "_srcAddress",
- "type": "bytes"
- },
- {
- "internalType": "uint256",
- "name": "_nonce",
- "type": "uint256"
- },
- {
- "internalType": "uint256",
- "name": "_srcPoolId",
- "type": "uint256"
- },
- {
- "internalType": "uint256",
- "name": "_dstPoolId",
- "type": "uint256"
- },
- {
- "internalType": "uint256",
- "name": "_dstGasForCall",
- "type": "uint256"
- },
- {
- "internalType": "address",
- "name": "_to",
- "type": "address"
- },
- {
- "components": [
- {
- "internalType": "uint256",
- "name": "amount",
- "type": "uint256"
- },
- {
- "internalType": "uint256",
- "name": "eqFee",
- "type": "uint256"
- },
- {
- "internalType": "uint256",
- "name": "eqReward",
- "type": "uint256"
- },
- {
- "internalType": "uint256",
- "name": "lpFee",
- "type": "uint256"
- },
- {
- "internalType": "uint256",
- "name": "protocolFee",
- "type": "uint256"
- },
- {
- "internalType": "uint256",
- "name": "lkbRemove",
- "type": "uint256"
- }
- ],
- "internalType": "struct Pool.SwapObj",
- "name": "_s",
- "type": "tuple"
- },
- {
- "internalType": "bytes",
- "name": "_payload",
- "type": "bytes"
- }
- ],
- "name": "swapRemote",
- "outputs": [],
- "stateMutability": "nonpayable",
- "type": "function"
- },
- {
- "inputs": [
- {
- "internalType": "address",
- "name": "newOwner",
- "type": "address"
- }
- ],
- "name": "transferOwnership",
- "outputs": [],
- "stateMutability": "nonpayable",
- "type": "function"
- },
- {
- "inputs": [
- {
- "internalType": "uint256",
- "name": "_poolId",
- "type": "uint256"
- },
- {
- "internalType": "address",
- "name": "_to",
- "type": "address"
- }
- ],
- "name": "withdrawMintFee",
- "outputs": [],
- "stateMutability": "nonpayable",
- "type": "function"
- },
- {
- "inputs": [
- {
- "internalType": "uint256",
- "name": "_poolId",
- "type": "uint256"
- },
- {
- "internalType": "address",
- "name": "_to",
- "type": "address"
- }
- ],
- "name": "withdrawProtocolFee",
- "outputs": [],
- "stateMutability": "nonpayable",
- "type": "function"
- }
- ],
- "transactionHash": "0xec73e3d0c6cc1c49984f5e5b2aedddb94e1e450b55a1023770e612c8846199ae",
- "receipt": {
- "to": null,
- "from": "0x368715F09C1AB5E0B55bF5bA19cD887189A28DBE",
- "contractAddress": "0x47590c3D11e9366215416f2a3A03Cf21AdB716AE",
- "transactionIndex": 1,
- "gasUsed": "62002145",
- "logsBloom": "0x00000000000000000000000000000000000000000000000200800000000008000000000000000000000000000000000000000000000000000000000000000020000000000000000004000000000000000001000000000000000000000000000000000000020000000000000000000800000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000",
- "blockHash": "0xe118fa196c6b515d257d809944d094b6ca7248bf4101428312eabb5facf71014",
- "transactionHash": "0xec73e3d0c6cc1c49984f5e5b2aedddb94e1e450b55a1023770e612c8846199ae",
- "logs": [
- {
- "transactionIndex": 1,
- "blockNumber": 14284124,
- "transactionHash": "0xec73e3d0c6cc1c49984f5e5b2aedddb94e1e450b55a1023770e612c8846199ae",
- "address": "0x47590c3D11e9366215416f2a3A03Cf21AdB716AE",
- "topics": [
- "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0",
- "0x0000000000000000000000000000000000000000000000000000000000000000",
- "0x000000000000000000000000368715f09c1ab5e0b55bf5ba19cd887189a28dbe"
- ],
- "data": "0x",
- "logIndex": 0,
- "blockHash": "0xe118fa196c6b515d257d809944d094b6ca7248bf4101428312eabb5facf71014"
- }
- ],
- "blockNumber": 14284124,
- "cumulativeGasUsed": "62002145",
- "status": 1,
- "byzantium": true
- },
- "args": [],
- "numDeployments": 1,
- "solcInputHash": "c474952dec744e7c88dc7c3d2b8d163f",
- "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"chainId\",\"type\":\"uint16\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"srcAddress\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amountLD\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"payload\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"reason\",\"type\":\"bytes\"}],\"name\":\"CachedSwapSaved\",\"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\":false,\"internalType\":\"uint16\",\"name\":\"srcChainId\",\"type\":\"uint16\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"srcAddress\",\"type\":\"bytes\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"srcPoolId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"dstPoolId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amountSD\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"mintAmountSD\",\"type\":\"uint256\"}],\"name\":\"RedeemLocalCallback\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"bridgeFunctionType\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"chainId\",\"type\":\"uint16\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"srcAddress\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"}],\"name\":\"Revert\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"srcChainId\",\"type\":\"uint16\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_srcPoolId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_dstPoolId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"to\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"redeemAmountSD\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"mintAmountSD\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"srcAddress\",\"type\":\"bytes\"}],\"name\":\"RevertRedeemLocal\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_poolId\",\"type\":\"uint256\"},{\"internalType\":\"uint16\",\"name\":\"_dstChainId\",\"type\":\"uint16\"},{\"internalType\":\"uint256\",\"name\":\"_dstPoolId\",\"type\":\"uint256\"}],\"name\":\"activateChainPath\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_poolId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_amountLD\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"}],\"name\":\"addLiquidity\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"bridge\",\"outputs\":[{\"internalType\":\"contract Bridge\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"cachedSwapLookup\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amountLD\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"payload\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_poolId\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"_fullMode\",\"type\":\"bool\"}],\"name\":\"callDelta\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"_srcChainId\",\"type\":\"uint16\"},{\"internalType\":\"bytes\",\"name\":\"_srcAddress\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_nonce\",\"type\":\"uint256\"}],\"name\":\"clearCachedSwap\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_poolId\",\"type\":\"uint256\"},{\"internalType\":\"uint16\",\"name\":\"_dstChainId\",\"type\":\"uint16\"},{\"internalType\":\"uint256\",\"name\":\"_dstPoolId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_weight\",\"type\":\"uint256\"}],\"name\":\"createChainPath\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_poolId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"_sharedDecimals\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"_localDecimals\",\"type\":\"uint8\"},{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_symbol\",\"type\":\"string\"}],\"name\":\"createPool\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"_dstChainId\",\"type\":\"uint16\"},{\"internalType\":\"uint256\",\"name\":\"_dstPoolId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_srcPoolId\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"credits\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"idealBalance\",\"type\":\"uint256\"}],\"internalType\":\"struct Pool.CreditObj\",\"name\":\"_c\",\"type\":\"tuple\"}],\"name\":\"creditChainPath\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"factory\",\"outputs\":[{\"internalType\":\"contract Factory\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"_srcPoolId\",\"type\":\"uint16\"},{\"internalType\":\"uint256\",\"name\":\"_amountLP\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"}],\"name\":\"instantRedeemLocal\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"amountSD\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"mintFeeOwner\",\"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\":\"protocolFeeOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"_dstChainId\",\"type\":\"uint16\"},{\"internalType\":\"uint8\",\"name\":\"_functionType\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"_toAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_transferAndCallPayload\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"dstGasForCall\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"dstNativeAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"dstNativeAddr\",\"type\":\"bytes\"}],\"internalType\":\"struct IMirrorgateRouter.lzTxObj\",\"name\":\"_lzTxParams\",\"type\":\"tuple\"}],\"name\":\"quoteLayerZeroFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"_dstChainId\",\"type\":\"uint16\"},{\"internalType\":\"uint256\",\"name\":\"_srcPoolId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_dstPoolId\",\"type\":\"uint256\"},{\"internalType\":\"address payable\",\"name\":\"_refundAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amountLP\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_to\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"dstGasForCall\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"dstNativeAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"dstNativeAddr\",\"type\":\"bytes\"}],\"internalType\":\"struct IMirrorgateRouter.lzTxObj\",\"name\":\"_lzTxParams\",\"type\":\"tuple\"}],\"name\":\"redeemLocal\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"_srcChainId\",\"type\":\"uint16\"},{\"internalType\":\"bytes\",\"name\":\"_srcAddress\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_nonce\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_srcPoolId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_dstPoolId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amountSD\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_mintAmountSD\",\"type\":\"uint256\"}],\"name\":\"redeemLocalCallback\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"_srcChainId\",\"type\":\"uint16\"},{\"internalType\":\"bytes\",\"name\":\"_srcAddress\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_nonce\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_srcPoolId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_dstPoolId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_amountSD\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_to\",\"type\":\"bytes\"}],\"name\":\"redeemLocalCheckOnRemote\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"_dstChainId\",\"type\":\"uint16\"},{\"internalType\":\"uint256\",\"name\":\"_srcPoolId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_dstPoolId\",\"type\":\"uint256\"},{\"internalType\":\"address payable\",\"name\":\"_refundAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amountLP\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_minAmountLD\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_to\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"dstGasForCall\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"dstNativeAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"dstNativeAddr\",\"type\":\"bytes\"}],\"internalType\":\"struct IMirrorgateRouter.lzTxObj\",\"name\":\"_lzTxParams\",\"type\":\"tuple\"}],\"name\":\"redeemRemote\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"_srcChainId\",\"type\":\"uint16\"},{\"internalType\":\"bytes\",\"name\":\"_srcAddress\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_nonce\",\"type\":\"uint256\"}],\"name\":\"retryRevert\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"revertLookup\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"_dstChainId\",\"type\":\"uint16\"},{\"internalType\":\"bytes\",\"name\":\"_srcAddress\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_nonce\",\"type\":\"uint256\"},{\"internalType\":\"address payable\",\"name\":\"_refundAddress\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"dstGasForCall\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"dstNativeAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"dstNativeAddr\",\"type\":\"bytes\"}],\"internalType\":\"struct IMirrorgateRouter.lzTxObj\",\"name\":\"_lzTxParams\",\"type\":\"tuple\"}],\"name\":\"revertRedeemLocal\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"_dstChainId\",\"type\":\"uint16\"},{\"internalType\":\"uint256\",\"name\":\"_srcPoolId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_dstPoolId\",\"type\":\"uint256\"},{\"internalType\":\"address payable\",\"name\":\"_refundAddress\",\"type\":\"address\"}],\"name\":\"sendCredits\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract Bridge\",\"name\":\"_bridge\",\"type\":\"address\"},{\"internalType\":\"contract Factory\",\"name\":\"_factory\",\"type\":\"address\"}],\"name\":\"setBridgeAndFactory\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_poolId\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"_batched\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"_swapDeltaBP\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_lpDeltaBP\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"_defaultSwapMode\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"_defaultLPMode\",\"type\":\"bool\"}],\"name\":\"setDeltaParam\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_poolId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_feeLibraryAddr\",\"type\":\"address\"}],\"name\":\"setFeeLibrary\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_poolId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_mintFeeBP\",\"type\":\"uint256\"}],\"name\":\"setFees\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"setMintFeeOwner\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"setProtocolFeeOwner\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_poolId\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"_swapStop\",\"type\":\"bool\"}],\"name\":\"setSwapStop\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_poolId\",\"type\":\"uint256\"},{\"internalType\":\"uint16\",\"name\":\"_dstChainId\",\"type\":\"uint16\"},{\"internalType\":\"uint256\",\"name\":\"_dstPoolId\",\"type\":\"uint256\"},{\"internalType\":\"uint16\",\"name\":\"_weight\",\"type\":\"uint16\"}],\"name\":\"setWeightForChainPath\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"_dstChainId\",\"type\":\"uint16\"},{\"internalType\":\"uint256\",\"name\":\"_srcPoolId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_dstPoolId\",\"type\":\"uint256\"},{\"internalType\":\"address payable\",\"name\":\"_refundAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amountLD\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_minAmountLD\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"dstGasForCall\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"dstNativeAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"dstNativeAddr\",\"type\":\"bytes\"}],\"internalType\":\"struct IMirrorgateRouter.lzTxObj\",\"name\":\"_lzTxParams\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"_to\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_payload\",\"type\":\"bytes\"}],\"name\":\"swap\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"_srcChainId\",\"type\":\"uint16\"},{\"internalType\":\"bytes\",\"name\":\"_srcAddress\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_nonce\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_srcPoolId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_dstPoolId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_dstGasForCall\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"eqFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"eqReward\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"lpFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"protocolFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"lkbRemove\",\"type\":\"uint256\"}],\"internalType\":\"struct Pool.SwapObj\",\"name\":\"_s\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"_payload\",\"type\":\"bytes\"}],\"name\":\"swapRemote\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_poolId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"}],\"name\":\"withdrawMintFee\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_poolId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"}],\"name\":\"withdrawProtocolFee\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/Router.sol\":\"Router\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.7.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor () {\\n address msgSender = _msgSender();\\n _owner = msgSender;\\n emit OwnershipTransferred(address(0), msgSender);\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n emit OwnershipTransferred(_owner, address(0));\\n _owner = address(0);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n emit OwnershipTransferred(_owner, newOwner);\\n _owner = newOwner;\\n }\\n}\\n\",\"keccak256\":\"0x549c5343ad9f7e3f38aa4c4761854403502574bbc15b822db2ce892ff9b79da7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/math/SafeMath.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.7.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary SafeMath {\\n /**\\n * @dev Returns the addition of two unsigned integers, with an overflow flag.\\n *\\n * _Available since v3.4._\\n */\\n function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n uint256 c = a + b;\\n if (c < a) return (false, 0);\\n return (true, c);\\n }\\n\\n /**\\n * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\n *\\n * _Available since v3.4._\\n */\\n function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n if (b > a) return (false, 0);\\n return (true, a - b);\\n }\\n\\n /**\\n * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\n *\\n * _Available since v3.4._\\n */\\n function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n // benefit is lost if 'b' is also tested.\\n // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n if (a == 0) return (true, 0);\\n uint256 c = a * b;\\n if (c / a != b) return (false, 0);\\n return (true, c);\\n }\\n\\n /**\\n * @dev Returns the division of two unsigned integers, with a division by zero flag.\\n *\\n * _Available since v3.4._\\n */\\n function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n if (b == 0) return (false, 0);\\n return (true, a / b);\\n }\\n\\n /**\\n * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\n *\\n * _Available since v3.4._\\n */\\n function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n if (b == 0) return (false, 0);\\n return (true, a % b);\\n }\\n\\n /**\\n * @dev Returns the addition of two unsigned integers, reverting on\\n * overflow.\\n *\\n * Counterpart to Solidity's `+` operator.\\n *\\n * Requirements:\\n *\\n * - Addition cannot overflow.\\n */\\n function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n uint256 c = a + b;\\n require(c >= a, \\\"SafeMath: addition overflow\\\");\\n return c;\\n }\\n\\n /**\\n * @dev Returns the subtraction of two unsigned integers, reverting on\\n * overflow (when the result is negative).\\n *\\n * Counterpart to Solidity's `-` operator.\\n *\\n * Requirements:\\n *\\n * - Subtraction cannot overflow.\\n */\\n function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\n return a - b;\\n }\\n\\n /**\\n * @dev Returns the multiplication of two unsigned integers, reverting on\\n * overflow.\\n *\\n * Counterpart to Solidity's `*` operator.\\n *\\n * Requirements:\\n *\\n * - Multiplication cannot overflow.\\n */\\n function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n if (a == 0) return 0;\\n uint256 c = a * b;\\n require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n return c;\\n }\\n\\n /**\\n * @dev Returns the integer division of two unsigned integers, reverting on\\n * division by zero. The result is rounded towards zero.\\n *\\n * Counterpart to Solidity's `/` operator. Note: this function uses a\\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n * uses an invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n require(b > 0, \\\"SafeMath: division by zero\\\");\\n return a / b;\\n }\\n\\n /**\\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n * reverting when dividing by zero.\\n *\\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n * opcode (which leaves remaining gas untouched) while Solidity uses an\\n * invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n require(b > 0, \\\"SafeMath: modulo by zero\\\");\\n return a % b;\\n }\\n\\n /**\\n * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n * overflow (when the result is negative).\\n *\\n * CAUTION: This function is deprecated because it requires allocating memory for the error\\n * message unnecessarily. For custom revert reasons use {trySub}.\\n *\\n * Counterpart to Solidity's `-` operator.\\n *\\n * Requirements:\\n *\\n * - Subtraction cannot overflow.\\n */\\n function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n require(b <= a, errorMessage);\\n return a - b;\\n }\\n\\n /**\\n * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\n * division by zero. The result is rounded towards zero.\\n *\\n * CAUTION: This function is deprecated because it requires allocating memory for the error\\n * message unnecessarily. For custom revert reasons use {tryDiv}.\\n *\\n * Counterpart to Solidity's `/` operator. Note: this function uses a\\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n * uses an invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n require(b > 0, errorMessage);\\n return a / b;\\n }\\n\\n /**\\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n * reverting with custom message when dividing by zero.\\n *\\n * CAUTION: This function is deprecated because it requires allocating memory for the error\\n * message unnecessarily. For custom revert reasons use {tryMod}.\\n *\\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n * opcode (which leaves remaining gas untouched) while Solidity uses an\\n * invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n require(b > 0, errorMessage);\\n return a % b;\\n }\\n}\\n\",\"keccak256\":\"0xe22a1fc7400ae196eba2ad1562d0386462b00a6363b742d55a2fd2021a58586f\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.7.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20 {\\n /**\\n * @dev Returns the amount of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves `amount` tokens from the caller's account to `recipient`.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transfer(address recipient, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Returns the remaining number of tokens that `spender` will be\\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n * zero by default.\\n *\\n * This value changes when {approve} or {transferFrom} are called.\\n */\\n function allowance(address owner, address spender) external view returns (uint256);\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n * that someone may use both the old and the new allowance by unfortunate\\n * transaction ordering. One possible solution to mitigate this race\\n * condition is to first reduce the spender's allowance to 0 and set the\\n * desired value afterwards:\\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address spender, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Moves `amount` tokens from `sender` to `recipient` using the\\n * allowance mechanism. `amount` is then deducted from the caller's\\n * allowance.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n * another (`to`).\\n *\\n * Note that `value` may be zero.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n /**\\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n * a call to {approve}. `value` is the new allowance.\\n */\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\n}\\n\",\"keccak256\":\"0xbd74f587ab9b9711801baf667db1426e4a03fd2d7f15af33e0e0d0394e7cef76\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address payable) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes memory) {\\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x8d3cb350f04ff49cfb10aef08d87f19dcbaecc8027b0bed12f3275cd12f38cf0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/ReentrancyGuard.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.7.0;\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuard {\\n // Booleans are more expensive than uint256 or any type that takes up a full\\n // word because each write operation emits an extra SLOAD to first read the\\n // slot's contents, replace the bits taken up by the boolean, and then write\\n // back. This is the compiler's defense against contract upgrades and\\n // pointer aliasing, and it cannot be disabled.\\n\\n // The values being non-zero value makes deployment a bit more expensive,\\n // but in exchange the refund on every call to nonReentrant will be lower in\\n // amount. Since refunds are capped to a percentage of the total\\n // transaction's gas, it is best to keep them low in cases like this one, to\\n // increase the likelihood of the full refund coming into effect.\\n uint256 private constant _NOT_ENTERED = 1;\\n uint256 private constant _ENTERED = 2;\\n\\n uint256 private _status;\\n\\n constructor () {\\n _status = _NOT_ENTERED;\\n }\\n\\n /**\\n * @dev Prevents a contract from calling itself, directly or indirectly.\\n * Calling a `nonReentrant` function from another `nonReentrant`\\n * function is not supported. It is possible to prevent this from happening\\n * by making the `nonReentrant` function external, and make it call a\\n * `private` function that does the actual work.\\n */\\n modifier nonReentrant() {\\n // On the first call to nonReentrant, _notEntered will be true\\n require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\n\\n // Any calls to nonReentrant after this point will fail\\n _status = _ENTERED;\\n\\n _;\\n\\n // By storing the original value once again, a refund is triggered (see\\n // https://eips.ethereum.org/EIPS/eip-2200)\\n _status = _NOT_ENTERED;\\n }\\n}\\n\",\"keccak256\":\"0x1153f6dd334c01566417b8c551122450542a2b75a2bbb379d59a8c320ed6da28\",\"license\":\"MIT\"},\"contracts/Bridge.sol\":{\"content\":\"// SPDX-License-Identifier: BUSL-1.1\\r\\n\\r\\npragma solidity 0.7.6;\\r\\npragma abicoder v2;\\r\\n\\r\\n// imports\\r\\nimport \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\r\\n\\r\\nimport \\\"./Pool.sol\\\";\\r\\nimport \\\"./Router.sol\\\";\\r\\n\\r\\n// libraries\\r\\nimport \\\"@openzeppelin/contracts/math/SafeMath.sol\\\";\\r\\nimport \\\"./interfaces/ILayerZeroReceiver.sol\\\";\\r\\nimport \\\"./interfaces/ILayerZeroEndpoint.sol\\\";\\r\\nimport \\\"./interfaces/ILayerZeroUserApplicationConfig.sol\\\";\\r\\n\\r\\ncontract Bridge is Ownable, ILayerZeroReceiver, ILayerZeroUserApplicationConfig {\\r\\n using SafeMath for uint256;\\r\\n\\r\\n //---------------------------------------------------------------------------\\r\\n // CONSTANTS\\r\\n uint8 internal constant TYPE_SWAP_REMOTE = 1;\\r\\n uint8 internal constant TYPE_ADD_LIQUIDITY = 2;\\r\\n uint8 internal constant TYPE_REDEEM_LOCAL_CALL_BACK = 3;\\r\\n uint8 internal constant TYPE_WITHDRAW_REMOTE = 4;\\r\\n\\r\\n //---------------------------------------------------------------------------\\r\\n // VARIABLES\\r\\n ILayerZeroEndpoint public immutable layerZeroEndpoint;\\r\\n mapping(uint16 => bytes) public bridgeLookup;\\r\\n mapping(uint16 => mapping(uint8 => uint256)) public gasLookup;\\r\\n Router public immutable router;\\r\\n bool public useLayerZeroToken;\\r\\n\\r\\n //---------------------------------------------------------------------------\\r\\n // EVENTS\\r\\n event SendMsg(uint8 msgType, uint64 nonce);\\r\\n\\r\\n //---------------------------------------------------------------------------\\r\\n // MODIFIERS\\r\\n modifier onlyRouter() {\\r\\n require(msg.sender == address(router), \\\"Mirrorgate: caller must be Router.\\\");\\r\\n _;\\r\\n }\\r\\n\\r\\n constructor(address _layerZeroEndpoint, address _router) {\\r\\n require(_layerZeroEndpoint != address(0x0), \\\"Mirrorgate: _layerZeroEndpoint cannot be 0x0\\\");\\r\\n require(_router != address(0x0), \\\"Mirrorgate: _router cannot be 0x0\\\");\\r\\n layerZeroEndpoint = ILayerZeroEndpoint(_layerZeroEndpoint);\\r\\n router = Router(_router);\\r\\n }\\r\\n\\r\\n //---------------------------------------------------------------------------\\r\\n // EXTERNAL functions\\r\\n\\r\\n function lzReceive(\\r\\n uint16 _srcChainId,\\r\\n bytes memory _srcAddress,\\r\\n uint64 _nonce,\\r\\n bytes memory _payload\\r\\n ) external override {\\r\\n require(msg.sender == address(layerZeroEndpoint), \\\"Mirrorgate: only LayerZero endpoint can call lzReceive\\\");\\r\\n require(\\r\\n _srcAddress.length == bridgeLookup[_srcChainId].length && keccak256(_srcAddress) == keccak256(bridgeLookup[_srcChainId]),\\r\\n \\\"Mirrorgate: bridge does not match\\\"\\r\\n );\\r\\n\\r\\n uint8 functionType;\\r\\n assembly {\\r\\n functionType := mload(add(_payload, 32))\\r\\n }\\r\\n\\r\\n if (functionType == TYPE_SWAP_REMOTE) {\\r\\n (\\r\\n ,\\r\\n uint256 srcPoolId,\\r\\n uint256 dstPoolId,\\r\\n uint256 dstGasForCall,\\r\\n Pool.CreditObj memory c,\\r\\n Pool.SwapObj memory s,\\r\\n bytes memory to,\\r\\n bytes memory payload\\r\\n ) = abi.decode(_payload, (uint8, uint256, uint256, uint256, Pool.CreditObj, Pool.SwapObj, bytes, bytes));\\r\\n address toAddress;\\r\\n assembly {\\r\\n toAddress := mload(add(to, 20))\\r\\n }\\r\\n router.creditChainPath(_srcChainId, srcPoolId, dstPoolId, c);\\r\\n router.swapRemote(_srcChainId, _srcAddress, _nonce, srcPoolId, dstPoolId, dstGasForCall, toAddress, s, payload);\\r\\n } else if (functionType == TYPE_ADD_LIQUIDITY) {\\r\\n (, uint256 srcPoolId, uint256 dstPoolId, Pool.CreditObj memory c) = abi.decode(_payload, (uint8, uint256, uint256, Pool.CreditObj));\\r\\n router.creditChainPath(_srcChainId, srcPoolId, dstPoolId, c);\\r\\n } else if (functionType == TYPE_REDEEM_LOCAL_CALL_BACK) {\\r\\n (, uint256 srcPoolId, uint256 dstPoolId, Pool.CreditObj memory c, uint256 amountSD, uint256 mintAmountSD, bytes memory to) = abi\\r\\n .decode(_payload, (uint8, uint256, uint256, Pool.CreditObj, uint256, uint256, bytes));\\r\\n address toAddress;\\r\\n assembly {\\r\\n toAddress := mload(add(to, 20))\\r\\n }\\r\\n router.creditChainPath(_srcChainId, srcPoolId, dstPoolId, c);\\r\\n router.redeemLocalCallback(_srcChainId, _srcAddress, _nonce, srcPoolId, dstPoolId, toAddress, amountSD, mintAmountSD);\\r\\n } else if (functionType == TYPE_WITHDRAW_REMOTE) {\\r\\n (, uint256 srcPoolId, uint256 dstPoolId, Pool.CreditObj memory c, uint256 amountSD, bytes memory to) = abi.decode(\\r\\n _payload,\\r\\n (uint8, uint256, uint256, Pool.CreditObj, uint256, bytes)\\r\\n );\\r\\n router.creditChainPath(_srcChainId, srcPoolId, dstPoolId, c);\\r\\n router.redeemLocalCheckOnRemote(_srcChainId, _srcAddress, _nonce, srcPoolId, dstPoolId, amountSD, to);\\r\\n }\\r\\n }\\r\\n\\r\\n //---------------------------------------------------------------------------\\r\\n // LOCAL CHAIN FUNCTIONS\\r\\n function swap(\\r\\n uint16 _chainId,\\r\\n uint256 _srcPoolId,\\r\\n uint256 _dstPoolId,\\r\\n address payable _refundAddress,\\r\\n Pool.CreditObj memory _c,\\r\\n Pool.SwapObj memory _s,\\r\\n IMirrorgateRouter.lzTxObj memory _lzTxParams,\\r\\n bytes calldata _to,\\r\\n bytes calldata _payload\\r\\n ) external payable onlyRouter {\\r\\n bytes memory payload = abi.encode(TYPE_SWAP_REMOTE, _srcPoolId, _dstPoolId, _lzTxParams.dstGasForCall, _c, _s, _to, _payload);\\r\\n _call(_chainId, TYPE_SWAP_REMOTE, _refundAddress, _lzTxParams, payload);\\r\\n }\\r\\n\\r\\n function redeemLocalCallback(\\r\\n uint16 _chainId,\\r\\n address payable _refundAddress,\\r\\n Pool.CreditObj memory _c,\\r\\n IMirrorgateRouter.lzTxObj memory _lzTxParams,\\r\\n bytes memory _payload\\r\\n ) external payable onlyRouter {\\r\\n bytes memory payload;\\r\\n\\r\\n {\\r\\n (, uint256 srcPoolId, uint256 dstPoolId, uint256 amountSD, uint256 mintAmountSD, bytes memory to) = abi.decode(\\r\\n _payload,\\r\\n (uint8, uint256, uint256, uint256, uint256, bytes)\\r\\n );\\r\\n\\r\\n // swap dst and src because we are headed back\\r\\n payload = abi.encode(TYPE_REDEEM_LOCAL_CALL_BACK, dstPoolId, srcPoolId, _c, amountSD, mintAmountSD, to);\\r\\n }\\r\\n\\r\\n _call(_chainId, TYPE_REDEEM_LOCAL_CALL_BACK, _refundAddress, _lzTxParams, payload);\\r\\n }\\r\\n\\r\\n function redeemLocal(\\r\\n uint16 _chainId,\\r\\n uint256 _srcPoolId,\\r\\n uint256 _dstPoolId,\\r\\n address payable _refundAddress,\\r\\n Pool.CreditObj memory _c,\\r\\n uint256 _amountSD,\\r\\n bytes calldata _to,\\r\\n IMirrorgateRouter.lzTxObj memory _lzTxParams\\r\\n ) external payable onlyRouter {\\r\\n bytes memory payload = abi.encode(TYPE_WITHDRAW_REMOTE, _srcPoolId, _dstPoolId, _c, _amountSD, _to);\\r\\n _call(_chainId, TYPE_WITHDRAW_REMOTE, _refundAddress, _lzTxParams, payload);\\r\\n }\\r\\n\\r\\n function sendCredits(\\r\\n uint16 _chainId,\\r\\n uint256 _srcPoolId,\\r\\n uint256 _dstPoolId,\\r\\n address payable _refundAddress,\\r\\n Pool.CreditObj memory _c\\r\\n ) external payable onlyRouter {\\r\\n bytes memory payload = abi.encode(TYPE_ADD_LIQUIDITY, _srcPoolId, _dstPoolId, _c);\\r\\n IMirrorgateRouter.lzTxObj memory lzTxObj = IMirrorgateRouter.lzTxObj(0, 0, \\\"0x\\\");\\r\\n _call(_chainId, TYPE_ADD_LIQUIDITY, _refundAddress, lzTxObj, payload);\\r\\n }\\r\\n\\r\\n function quoteLayerZeroFee(\\r\\n uint16 _chainId,\\r\\n uint8 _functionType,\\r\\n bytes calldata _toAddress,\\r\\n bytes calldata _transferAndCallPayload,\\r\\n IMirrorgateRouter.lzTxObj memory _lzTxParams\\r\\n ) external view returns (uint256, uint256) {\\r\\n bytes memory payload = \\\"\\\";\\r\\n Pool.CreditObj memory c = Pool.CreditObj(1, 1);\\r\\n if (_functionType == TYPE_SWAP_REMOTE) {\\r\\n Pool.SwapObj memory s = Pool.SwapObj(1, 1, 1, 1, 1, 1);\\r\\n payload = abi.encode(TYPE_SWAP_REMOTE, 0, 0, 0, c, s, _toAddress, _transferAndCallPayload);\\r\\n } else if (_functionType == TYPE_ADD_LIQUIDITY) {\\r\\n payload = abi.encode(TYPE_ADD_LIQUIDITY, 0, 0, c);\\r\\n } else if (_functionType == TYPE_REDEEM_LOCAL_CALL_BACK) {\\r\\n payload = abi.encode(TYPE_REDEEM_LOCAL_CALL_BACK, 0, 0, c, 0, 0, _toAddress);\\r\\n } else if (_functionType == TYPE_WITHDRAW_REMOTE) {\\r\\n payload = abi.encode(TYPE_WITHDRAW_REMOTE, 0, 0, c, 0, _toAddress);\\r\\n } else {\\r\\n revert(\\\"Mirrorgate: unsupported function type\\\");\\r\\n }\\r\\n\\r\\n bytes memory lzTxParamBuilt = _txParamBuilder(_chainId, _functionType, _lzTxParams);\\r\\n return layerZeroEndpoint.estimateFees(_chainId, address(this), payload, useLayerZeroToken, lzTxParamBuilt);\\r\\n }\\r\\n\\r\\n //---------------------------------------------------------------------------\\r\\n // dao functions\\r\\n function setBridge(uint16 _chainId, bytes calldata _bridgeAddress) external onlyOwner {\\r\\n require(bridgeLookup[_chainId].length == 0, \\\"Mirrorgate: Bridge already set!\\\");\\r\\n bridgeLookup[_chainId] = _bridgeAddress;\\r\\n }\\r\\n\\r\\n function setGasAmount(\\r\\n uint16 _chainId,\\r\\n uint8 _functionType,\\r\\n uint256 _gasAmount\\r\\n ) external onlyOwner {\\r\\n require(_functionType >= 1 && _functionType <= 4, \\\"Mirrorgate: invalid _functionType\\\");\\r\\n gasLookup[_chainId][_functionType] = _gasAmount;\\r\\n }\\r\\n\\r\\n function approveTokenSpender(\\r\\n address token,\\r\\n address spender,\\r\\n uint256 amount\\r\\n ) external onlyOwner {\\r\\n IERC20(token).approve(spender, amount);\\r\\n }\\r\\n\\r\\n function setUseLayerZeroToken(bool enable) external onlyOwner {\\r\\n useLayerZeroToken = enable;\\r\\n }\\r\\n\\r\\n function forceResumeReceive(uint16 _srcChainId, bytes calldata _srcAddress) external override onlyOwner {\\r\\n layerZeroEndpoint.forceResumeReceive(_srcChainId, _srcAddress);\\r\\n }\\r\\n\\r\\n //---------------------------------------------------------------------------\\r\\n // generic config for user Application\\r\\n function setConfig(\\r\\n uint16 _version,\\r\\n uint16 _chainId,\\r\\n uint256 _configType,\\r\\n bytes calldata _config\\r\\n ) external override onlyOwner {\\r\\n layerZeroEndpoint.setConfig(_version, _chainId, _configType, _config);\\r\\n }\\r\\n\\r\\n function setSendVersion(uint16 version) external override onlyOwner {\\r\\n layerZeroEndpoint.setSendVersion(version);\\r\\n }\\r\\n\\r\\n function setReceiveVersion(uint16 version) external override onlyOwner {\\r\\n layerZeroEndpoint.setReceiveVersion(version);\\r\\n }\\r\\n\\r\\n //---------------------------------------------------------------------------\\r\\n // INTERNAL functions\\r\\n function txParamBuilderType1(uint256 _gasAmount) internal pure returns (bytes memory) {\\r\\n uint16 txType = 1;\\r\\n return abi.encodePacked(txType, _gasAmount);\\r\\n }\\r\\n\\r\\n function txParamBuilderType2(\\r\\n uint256 _gasAmount,\\r\\n uint256 _dstNativeAmount,\\r\\n bytes memory _dstNativeAddr\\r\\n ) internal pure returns (bytes memory) {\\r\\n uint16 txType = 2;\\r\\n return abi.encodePacked(txType, _gasAmount, _dstNativeAmount, _dstNativeAddr);\\r\\n }\\r\\n\\r\\n function _txParamBuilder(\\r\\n uint16 _chainId,\\r\\n uint8 _type,\\r\\n IMirrorgateRouter.lzTxObj memory _lzTxParams\\r\\n ) internal view returns (bytes memory) {\\r\\n bytes memory lzTxParam;\\r\\n address dstNativeAddr;\\r\\n {\\r\\n bytes memory dstNativeAddrBytes = _lzTxParams.dstNativeAddr;\\r\\n assembly {\\r\\n dstNativeAddr := mload(add(dstNativeAddrBytes, 20))\\r\\n }\\r\\n }\\r\\n\\r\\n uint256 totalGas = gasLookup[_chainId][_type].add(_lzTxParams.dstGasForCall);\\r\\n if (_lzTxParams.dstNativeAmount > 0 && dstNativeAddr != address(0x0)) {\\r\\n lzTxParam = txParamBuilderType2(totalGas, _lzTxParams.dstNativeAmount, _lzTxParams.dstNativeAddr);\\r\\n } else {\\r\\n lzTxParam = txParamBuilderType1(totalGas);\\r\\n }\\r\\n\\r\\n return lzTxParam;\\r\\n }\\r\\n\\r\\n function _call(\\r\\n uint16 _chainId,\\r\\n uint8 _type,\\r\\n address payable _refundAddress,\\r\\n IMirrorgateRouter.lzTxObj memory _lzTxParams,\\r\\n bytes memory _payload\\r\\n ) internal {\\r\\n bytes memory lzTxParamBuilt = _txParamBuilder(_chainId, _type, _lzTxParams);\\r\\n uint64 nextNonce = layerZeroEndpoint.getOutboundNonce(_chainId, address(this)) + 1;\\r\\n layerZeroEndpoint.send{value: msg.value}(_chainId, bridgeLookup[_chainId], _payload, _refundAddress, address(this), lzTxParamBuilt);\\r\\n emit SendMsg(_type, nextNonce);\\r\\n }\\r\\n\\r\\n function renounceOwnership() public override onlyOwner {}\\r\\n}\\r\\n\",\"keccak256\":\"0x7a2ba079607ca4f0c2270267cf0cdccd149c02502589c9177f1108b20e29d9d1\",\"license\":\"BUSL-1.1\"},\"contracts/Factory.sol\":{\"content\":\"// SPDX-License-Identifier: BUSL-1.1\\r\\n\\r\\npragma solidity 0.7.6;\\r\\npragma abicoder v2;\\r\\n\\r\\nimport \\\"@openzeppelin/contracts/math/SafeMath.sol\\\";\\r\\nimport \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\r\\nimport \\\"./Pool.sol\\\";\\r\\n\\r\\ncontract Factory is Ownable {\\r\\n using SafeMath for uint256;\\r\\n\\r\\n //---------------------------------------------------------------------------\\r\\n // VARIABLES\\r\\n mapping(uint256 => Pool) public getPool; // poolId -> PoolInfo\\r\\n address[] public allPools;\\r\\n address public immutable router;\\r\\n address public defaultFeeLibrary; // address for retrieving fee params for swaps\\r\\n\\r\\n //---------------------------------------------------------------------------\\r\\n // MODIFIERS\\r\\n modifier onlyRouter() {\\r\\n require(msg.sender == router, \\\"Mirrorgate: caller must be Router.\\\");\\r\\n _;\\r\\n }\\r\\n\\r\\n constructor(address _router) {\\r\\n require(_router != address(0x0), \\\"Mirrorgate: _router cant be 0x0\\\"); // 1 time only\\r\\n router = _router;\\r\\n }\\r\\n\\r\\n function setDefaultFeeLibrary(address _defaultFeeLibrary) external onlyOwner {\\r\\n require(_defaultFeeLibrary != address(0x0), \\\"Mirrorgate: fee library cant be 0x0\\\");\\r\\n defaultFeeLibrary = _defaultFeeLibrary;\\r\\n }\\r\\n\\r\\n function allPoolsLength() external view returns (uint256) {\\r\\n return allPools.length;\\r\\n }\\r\\n\\r\\n function createPool(\\r\\n uint256 _poolId,\\r\\n address _token,\\r\\n uint8 _sharedDecimals,\\r\\n uint8 _localDecimals,\\r\\n string memory _name,\\r\\n string memory _symbol\\r\\n ) public onlyRouter returns (address poolAddress) {\\r\\n require(address(getPool[_poolId]) == address(0x0), \\\"Mirrorgate: Pool already created\\\");\\r\\n\\r\\n Pool pool = new Pool(_poolId, router, _token, _sharedDecimals, _localDecimals, defaultFeeLibrary, _name, _symbol);\\r\\n getPool[_poolId] = pool;\\r\\n poolAddress = address(pool);\\r\\n allPools.push(poolAddress);\\r\\n }\\r\\n\\r\\n function renounceOwnership() public override onlyOwner {}\\r\\n}\\r\\n\",\"keccak256\":\"0x5513cf7154b898cedf2def7e0c0f5c664e7b2ea1a24eea2e132199336a79d956\",\"license\":\"BUSL-1.1\"},\"contracts/LPTokenERC20.sol\":{\"content\":\"// SPDX-License-Identifier: BUSL-1.1\\r\\n\\r\\npragma solidity 0.7.6;\\r\\n\\r\\n// libraries\\r\\nimport \\\"@openzeppelin/contracts/math/SafeMath.sol\\\";\\r\\n\\r\\ncontract LPTokenERC20 {\\r\\n using SafeMath for uint256;\\r\\n\\r\\n //---------------------------------------------------------------------------\\r\\n // CONSTANTS\\r\\n string public name;\\r\\n string public symbol;\\r\\n bytes32 public constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;\\r\\n // set in constructor\\r\\n bytes32 public DOMAIN_SEPARATOR;\\r\\n\\r\\n //---------------------------------------------------------------------------\\r\\n // VARIABLES\\r\\n uint256 public decimals;\\r\\n uint256 public totalSupply;\\r\\n mapping(address => uint256) public balanceOf;\\r\\n mapping(address => mapping(address => uint256)) public allowance;\\r\\n mapping(address => uint256) public nonces;\\r\\n\\r\\n //---------------------------------------------------------------------------\\r\\n // EVENTS\\r\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\r\\n event Transfer(address indexed from, address indexed to, uint256 value);\\r\\n\\r\\n constructor(string memory _name, string memory _symbol) {\\r\\n name = _name;\\r\\n symbol = _symbol;\\r\\n uint256 chainId;\\r\\n assembly {\\r\\n chainId := chainid()\\r\\n }\\r\\n DOMAIN_SEPARATOR = keccak256(\\r\\n abi.encode(\\r\\n keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"),\\r\\n keccak256(bytes(name)),\\r\\n keccak256(bytes(\\\"1\\\")),\\r\\n chainId,\\r\\n address(this)\\r\\n )\\r\\n );\\r\\n }\\r\\n\\r\\n function _mint(address to, uint256 value) internal {\\r\\n totalSupply = totalSupply.add(value);\\r\\n balanceOf[to] = balanceOf[to].add(value);\\r\\n emit Transfer(address(0), to, value);\\r\\n }\\r\\n\\r\\n function _burn(address from, uint256 value) internal {\\r\\n balanceOf[from] = balanceOf[from].sub(value);\\r\\n totalSupply = totalSupply.sub(value);\\r\\n emit Transfer(from, address(0), value);\\r\\n }\\r\\n\\r\\n function _approve(\\r\\n address owner,\\r\\n address spender,\\r\\n uint256 value\\r\\n ) private {\\r\\n allowance[owner][spender] = value;\\r\\n emit Approval(owner, spender, value);\\r\\n }\\r\\n\\r\\n function _transfer(\\r\\n address from,\\r\\n address to,\\r\\n uint256 value\\r\\n ) private {\\r\\n balanceOf[from] = balanceOf[from].sub(value);\\r\\n balanceOf[to] = balanceOf[to].add(value);\\r\\n emit Transfer(from, to, value);\\r\\n }\\r\\n\\r\\n function approve(address spender, uint256 value) external returns (bool) {\\r\\n _approve(msg.sender, spender, value);\\r\\n return true;\\r\\n }\\r\\n\\r\\n function transfer(address to, uint256 value) external returns (bool) {\\r\\n _transfer(msg.sender, to, value);\\r\\n return true;\\r\\n }\\r\\n\\r\\n function transferFrom(\\r\\n address from,\\r\\n address to,\\r\\n uint256 value\\r\\n ) external returns (bool) {\\r\\n if (allowance[from][msg.sender] != uint256(-1)) {\\r\\n allowance[from][msg.sender] = allowance[from][msg.sender].sub(value);\\r\\n }\\r\\n _transfer(from, to, value);\\r\\n return true;\\r\\n }\\r\\n\\r\\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\\r\\n _approve(msg.sender, spender, allowance[msg.sender][spender].add(addedValue));\\r\\n return true;\\r\\n }\\r\\n\\r\\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\\r\\n _approve(msg.sender, spender, allowance[msg.sender][spender].sub(subtractedValue, \\\"ERC20: decreased allowance below zero\\\"));\\r\\n return true;\\r\\n }\\r\\n\\r\\n function permit(\\r\\n address owner,\\r\\n address spender,\\r\\n uint256 value,\\r\\n uint256 deadline,\\r\\n uint8 v,\\r\\n bytes32 r,\\r\\n bytes32 s\\r\\n ) external {\\r\\n require(deadline >= block.timestamp, \\\"Bridge: EXPIRED\\\");\\r\\n bytes32 digest = keccak256(\\r\\n abi.encodePacked(\\r\\n \\\"\\\\x19\\\\x01\\\",\\r\\n DOMAIN_SEPARATOR,\\r\\n keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, nonces[owner]++, deadline))\\r\\n )\\r\\n );\\r\\n address recoveredAddress = ecrecover(digest, v, r, s);\\r\\n require(recoveredAddress != address(0) && recoveredAddress == owner, \\\"Bridge: INVALID_SIGNATURE\\\");\\r\\n _approve(owner, spender, value);\\r\\n }\\r\\n}\\r\\n\",\"keccak256\":\"0xfad1da8f35c7d9dd3ff2a96f8133ec736a4098633c184fc746d67113591f94bc\",\"license\":\"BUSL-1.1\"},\"contracts/Pool.sol\":{\"content\":\"// SPDX-License-Identifier: BUSL-1.1\\r\\n\\r\\npragma solidity 0.7.6;\\r\\npragma abicoder v2;\\r\\n\\r\\n// imports\\r\\nimport \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\r\\nimport \\\"@openzeppelin/contracts/utils/ReentrancyGuard.sol\\\";\\r\\nimport \\\"./LPTokenERC20.sol\\\";\\r\\nimport \\\"./interfaces/IMirrorgateFeeLibrary.sol\\\";\\r\\n\\r\\n// libraries\\r\\nimport \\\"@openzeppelin/contracts/math/SafeMath.sol\\\";\\r\\n\\r\\n/// Pool contracts on other chains and managed by the Stargate protocol.\\r\\ncontract Pool is LPTokenERC20, ReentrancyGuard {\\r\\n using SafeMath for uint256;\\r\\n\\r\\n //---------------------------------------------------------------------------\\r\\n // CONSTANTS\\r\\n bytes4 private constant SELECTOR = bytes4(keccak256(bytes(\\\"transfer(address,uint256)\\\")));\\r\\n uint256 public constant BP_DENOMINATOR = 10000;\\r\\n\\r\\n //---------------------------------------------------------------------------\\r\\n // STRUCTS\\r\\n struct ChainPath {\\r\\n bool ready; // indicate if the counter chainPath has been created.\\r\\n uint16 dstChainId;\\r\\n uint256 dstPoolId;\\r\\n uint256 weight;\\r\\n uint256 balance;\\r\\n uint256 lkb;\\r\\n uint256 credits;\\r\\n uint256 idealBalance;\\r\\n }\\r\\n\\r\\n struct SwapObj {\\r\\n uint256 amount;\\r\\n uint256 eqFee;\\r\\n uint256 eqReward;\\r\\n uint256 lpFee;\\r\\n uint256 protocolFee;\\r\\n uint256 lkbRemove;\\r\\n }\\r\\n\\r\\n struct CreditObj {\\r\\n uint256 credits;\\r\\n uint256 idealBalance;\\r\\n }\\r\\n\\r\\n //---------------------------------------------------------------------------\\r\\n // VARIABLES\\r\\n\\r\\n // chainPath\\r\\n ChainPath[] public chainPaths; // list of connected chains with shared pools\\r\\n mapping(uint16 => mapping(uint256 => uint256)) public chainPathIndexLookup; // lookup for chainPath by chainId => poolId =>index\\r\\n\\r\\n // metadata\\r\\n uint256 public immutable poolId; // shared id between chains to represent same pool\\r\\n uint256 public sharedDecimals; // the shared decimals (lowest common decimals between chains)\\r\\n uint256 public localDecimals; // the decimals for the token\\r\\n uint256 public immutable convertRate; // the decimals for the token\\r\\n address public immutable token; // the token for the pool\\r\\n address public immutable router; // the token for the pool\\r\\n\\r\\n bool public stopSwap; // flag to stop swapping in extreme cases\\r\\n\\r\\n // Fee and Liquidity\\r\\n uint256 public totalLiquidity; // the total amount of tokens added on this side of the chain (fees + deposits - withdrawals)\\r\\n uint256 public totalWeight; // total weight for pool percentages\\r\\n uint256 public mintFeeBP; // fee basis points for the mint/deposit\\r\\n uint256 public protocolFeeBalance; // fee balance created from dao fee\\r\\n uint256 public mintFeeBalance; // fee balance created from mint fee\\r\\n uint256 public eqFeePool; // pool rewards in Shared Decimal format. indicate the total budget for reverse swap incentive\\r\\n address public feeLibrary; // address for retrieving fee params for swaps\\r\\n\\r\\n // Delta related\\r\\n uint256 public deltaCredit; // credits accumulated from txn\\r\\n bool public batched; // flag to indicate if we want batch processing.\\r\\n bool public defaultSwapMode; // flag for the default mode for swap\\r\\n bool public defaultLPMode; // flag for the default mode for lp\\r\\n uint256 public swapDeltaBP; // basis points of poolCredits to activate Delta in swap\\r\\n uint256 public lpDeltaBP; // basis points of poolCredits to activate Delta in liquidity events\\r\\n\\r\\n //---------------------------------------------------------------------------\\r\\n // EVENTS\\r\\n event Mint(address to, uint256 amountLP, uint256 amountSD, uint256 mintFeeAmountSD);\\r\\n event Burn(address from, uint256 amountLP, uint256 amountSD);\\r\\n event RedeemLocalCallback(address _to, uint256 _amountSD, uint256 _amountToMintSD);\\r\\n event Swap(\\r\\n uint16 chainId,\\r\\n uint256 dstPoolId,\\r\\n address from,\\r\\n uint256 amountSD,\\r\\n uint256 eqReward,\\r\\n uint256 eqFee,\\r\\n uint256 protocolFee,\\r\\n uint256 lpFee\\r\\n );\\r\\n event SendCredits(uint16 dstChainId, uint256 dstPoolId, uint256 credits, uint256 idealBalance);\\r\\n event RedeemRemote(uint16 chainId, uint256 dstPoolId, address from, uint256 amountLP, uint256 amountSD);\\r\\n event RedeemLocal(address from, uint256 amountLP, uint256 amountSD, uint16 chainId, uint256 dstPoolId, bytes to);\\r\\n event InstantRedeemLocal(address from, uint256 amountLP, uint256 amountSD, address to);\\r\\n event CreditChainPath(uint16 chainId, uint256 srcPoolId, uint256 amountSD, uint256 idealBalance);\\r\\n event SwapRemote(address to, uint256 amountSD, uint256 protocolFee, uint256 dstFee);\\r\\n event WithdrawRemote(uint16 srcChainId, uint256 srcPoolId, uint256 swapAmount, uint256 mintAmount);\\r\\n event ChainPathUpdate(uint16 dstChainId, uint256 dstPoolId, uint256 weight);\\r\\n event FeesUpdated(uint256 mintFeeBP);\\r\\n event FeeLibraryUpdated(address feeLibraryAddr);\\r\\n event StopSwapUpdated(bool swapStop);\\r\\n event WithdrawProtocolFeeBalance(address to, uint256 amountSD);\\r\\n event WithdrawMintFeeBalance(address to, uint256 amountSD);\\r\\n event DeltaParamUpdated(bool batched, uint256 swapDeltaBP, uint256 lpDeltaBP, bool defaultSwapMode, bool defaultLPMode);\\r\\n\\r\\n //---------------------------------------------------------------------------\\r\\n // MODIFIERS\\r\\n modifier onlyRouter() {\\r\\n require(msg.sender == router, \\\"Mirrorgate: only the router can call this method\\\");\\r\\n _;\\r\\n }\\r\\n\\r\\n constructor(\\r\\n uint256 _poolId,\\r\\n address _router,\\r\\n address _token,\\r\\n uint256 _sharedDecimals,\\r\\n uint256 _localDecimals,\\r\\n address _feeLibrary,\\r\\n string memory _name,\\r\\n string memory _symbol\\r\\n ) LPTokenERC20(_name, _symbol) {\\r\\n require(_token != address(0x0), \\\"Mirrorgate: _token cannot be 0x0\\\");\\r\\n require(_router != address(0x0), \\\"Mirrorgate: _router cannot be 0x0\\\");\\r\\n poolId = _poolId;\\r\\n router = _router;\\r\\n token = _token;\\r\\n sharedDecimals = _sharedDecimals;\\r\\n decimals = uint8(_sharedDecimals);\\r\\n localDecimals = _localDecimals;\\r\\n convertRate = 10**(uint256(localDecimals).sub(sharedDecimals));\\r\\n totalWeight = 0;\\r\\n feeLibrary = _feeLibrary;\\r\\n\\r\\n //delta algo related\\r\\n batched = false;\\r\\n defaultSwapMode = true;\\r\\n defaultLPMode = true;\\r\\n }\\r\\n\\r\\n function getChainPathsLength() public view returns (uint256) {\\r\\n return chainPaths.length;\\r\\n }\\r\\n\\r\\n //---------------------------------------------------------------------------\\r\\n // LOCAL CHAIN FUNCTIONS\\r\\n\\r\\n function mint(address _to, uint256 _amountLD) external nonReentrant onlyRouter returns (uint256) {\\r\\n return _mintLocal(_to, _amountLD, true, true);\\r\\n }\\r\\n\\r\\n // Local Remote\\r\\n // ------- ---------\\r\\n // swap -> swapRemote\\r\\n function swap(\\r\\n uint16 _dstChainId,\\r\\n uint256 _dstPoolId,\\r\\n address _from,\\r\\n uint256 _amountLD,\\r\\n uint256 _minAmountLD,\\r\\n bool newLiquidity\\r\\n ) external nonReentrant onlyRouter returns (SwapObj memory) {\\r\\n require(!stopSwap, \\\"Mirrorgate: swap func stopped\\\");\\r\\n ChainPath storage cp = getAndCheckCP(_dstChainId, _dstPoolId);\\r\\n require(cp.ready == true, \\\"Mirrorgate: counter chainPath is not ready\\\");\\r\\n\\r\\n uint256 amountSD = amountLDtoSD(_amountLD);\\r\\n uint256 minAmountSD = amountLDtoSD(_minAmountLD);\\r\\n\\r\\n // request fee params from library\\r\\n SwapObj memory s = IMirrorgateFeeLibrary(feeLibrary).getFees(poolId, _dstPoolId, _dstChainId, _from, amountSD);\\r\\n\\r\\n // equilibrium fee and reward. note eqFee/eqReward are separated from swap liquidity\\r\\n eqFeePool = eqFeePool.sub(s.eqReward);\\r\\n // update the new amount the user gets minus the fees\\r\\n s.amount = amountSD.sub(s.eqFee).sub(s.protocolFee).sub(s.lpFee);\\r\\n // users will also get the eqReward\\r\\n require(s.amount.add(s.eqReward) >= minAmountSD, \\\"Mirrorgate: slippage too high\\\");\\r\\n\\r\\n // behaviours\\r\\n // - protocolFee: booked, stayed and withdrawn at remote.\\r\\n // - eqFee: booked, stayed and withdrawn at remote.\\r\\n // - lpFee: booked and stayed at remote, can be withdrawn anywhere\\r\\n\\r\\n s.lkbRemove = amountSD.sub(s.lpFee).add(s.eqReward);\\r\\n // check for transfer solvency.\\r\\n require(cp.balance >= s.lkbRemove, \\\"Mirrorgate: dst balance too low\\\");\\r\\n cp.balance = cp.balance.sub(s.lkbRemove);\\r\\n\\r\\n if (newLiquidity) {\\r\\n deltaCredit = deltaCredit.add(amountSD).add(s.eqReward);\\r\\n } else if (s.eqReward > 0) {\\r\\n deltaCredit = deltaCredit.add(s.eqReward);\\r\\n }\\r\\n\\r\\n // distribute credits on condition.\\r\\n if (!batched || deltaCredit >= totalLiquidity.mul(swapDeltaBP).div(BP_DENOMINATOR)) {\\r\\n _delta(defaultSwapMode);\\r\\n }\\r\\n\\r\\n emit Swap(_dstChainId, _dstPoolId, _from, s.amount, s.eqReward, s.eqFee, s.protocolFee, s.lpFee);\\r\\n return s;\\r\\n }\\r\\n\\r\\n // Local Remote\\r\\n // ------- ---------\\r\\n // sendCredits -> creditChainPath\\r\\n function sendCredits(uint16 _dstChainId, uint256 _dstPoolId) external nonReentrant onlyRouter returns (CreditObj memory c) {\\r\\n ChainPath storage cp = getAndCheckCP(_dstChainId, _dstPoolId);\\r\\n require(cp.ready == true, \\\"Mirrorgate: counter chainPath is not ready\\\");\\r\\n cp.lkb = cp.lkb.add(cp.credits);\\r\\n c.idealBalance = totalLiquidity.mul(cp.weight).div(totalWeight);\\r\\n c.credits = cp.credits;\\r\\n cp.credits = 0;\\r\\n emit SendCredits(_dstChainId, _dstPoolId, c.credits, c.idealBalance);\\r\\n }\\r\\n\\r\\n // Local Remote\\r\\n // ------- ---------\\r\\n // redeemRemote -> swapRemote\\r\\n function redeemRemote(\\r\\n uint16 _dstChainId,\\r\\n uint256 _dstPoolId,\\r\\n address _from,\\r\\n uint256 _amountLP\\r\\n ) external nonReentrant onlyRouter {\\r\\n require(_from != address(0x0), \\\"Mirrorgate: _from cannot be 0x0\\\");\\r\\n uint256 amountSD = _burnLocal(_from, _amountLP);\\r\\n //run Delta\\r\\n if (!batched || deltaCredit > totalLiquidity.mul(lpDeltaBP).div(BP_DENOMINATOR)) {\\r\\n _delta(defaultLPMode);\\r\\n }\\r\\n uint256 amountLD = amountSDtoLD(amountSD);\\r\\n emit RedeemRemote(_dstChainId, _dstPoolId, _from, _amountLP, amountLD);\\r\\n }\\r\\n\\r\\n function instantRedeemLocal(\\r\\n address _from,\\r\\n uint256 _amountLP,\\r\\n address _to\\r\\n ) external nonReentrant onlyRouter returns (uint256 amountSD) {\\r\\n require(_from != address(0x0), \\\"Mirrorgate: _from cannot be 0x0\\\");\\r\\n uint256 _deltaCredit = deltaCredit; // sload optimization.\\r\\n uint256 _capAmountLP = _amountSDtoLP(_deltaCredit);\\r\\n\\r\\n if (_amountLP > _capAmountLP) _amountLP = _capAmountLP;\\r\\n\\r\\n amountSD = _burnLocal(_from, _amountLP);\\r\\n deltaCredit = _deltaCredit.sub(amountSD);\\r\\n uint256 amountLD = amountSDtoLD(amountSD);\\r\\n _safeTransfer(token, _to, amountLD);\\r\\n emit InstantRedeemLocal(_from, _amountLP, amountSD, _to);\\r\\n }\\r\\n\\r\\n // Local Remote\\r\\n // ------- ---------\\r\\n // redeemLocal -> redeemLocalCheckOnRemote\\r\\n // redeemLocalCallback <-\\r\\n function redeemLocal(\\r\\n address _from,\\r\\n uint256 _amountLP,\\r\\n uint16 _dstChainId,\\r\\n uint256 _dstPoolId,\\r\\n bytes calldata _to\\r\\n ) external nonReentrant onlyRouter returns (uint256 amountSD) {\\r\\n require(_from != address(0x0), \\\"Mirrorgate: _from cannot be 0x0\\\");\\r\\n\\r\\n // safeguard.\\r\\n require(chainPaths[chainPathIndexLookup[_dstChainId][_dstPoolId]].ready == true, \\\"Mirrorgate: counter chainPath is not ready\\\");\\r\\n amountSD = _burnLocal(_from, _amountLP);\\r\\n\\r\\n // run Delta\\r\\n if (!batched || deltaCredit > totalLiquidity.mul(lpDeltaBP).div(BP_DENOMINATOR)) {\\r\\n _delta(false);\\r\\n }\\r\\n emit RedeemLocal(_from, _amountLP, amountSD, _dstChainId, _dstPoolId, _to);\\r\\n }\\r\\n\\r\\n //---------------------------------------------------------------------------\\r\\n // REMOTE CHAIN FUNCTIONS\\r\\n\\r\\n // Local Remote\\r\\n // ------- ---------\\r\\n // sendCredits -> creditChainPath\\r\\n function creditChainPath(\\r\\n uint16 _dstChainId,\\r\\n uint256 _dstPoolId,\\r\\n CreditObj memory _c\\r\\n ) external nonReentrant onlyRouter {\\r\\n ChainPath storage cp = chainPaths[chainPathIndexLookup[_dstChainId][_dstPoolId]];\\r\\n cp.balance = cp.balance.add(_c.credits);\\r\\n if (cp.idealBalance != _c.idealBalance) {\\r\\n cp.idealBalance = _c.idealBalance;\\r\\n }\\r\\n emit CreditChainPath(_dstChainId, _dstPoolId, _c.credits, _c.idealBalance);\\r\\n }\\r\\n\\r\\n // Local Remote\\r\\n // ------- ---------\\r\\n // swap -> swapRemote\\r\\n function swapRemote(\\r\\n uint16 _srcChainId,\\r\\n uint256 _srcPoolId,\\r\\n address _to,\\r\\n SwapObj memory _s\\r\\n ) external nonReentrant onlyRouter returns (uint256 amountLD) {\\r\\n // booking lpFee\\r\\n totalLiquidity = totalLiquidity.add(_s.lpFee);\\r\\n // booking eqFee\\r\\n eqFeePool = eqFeePool.add(_s.eqFee);\\r\\n // booking stargateFee\\r\\n protocolFeeBalance = protocolFeeBalance.add(_s.protocolFee);\\r\\n\\r\\n // update LKB\\r\\n uint256 chainPathIndex = chainPathIndexLookup[_srcChainId][_srcPoolId];\\r\\n chainPaths[chainPathIndex].lkb = chainPaths[chainPathIndex].lkb.sub(_s.lkbRemove);\\r\\n\\r\\n // user receives the amount + the srcReward\\r\\n amountLD = amountSDtoLD(_s.amount.add(_s.eqReward));\\r\\n _safeTransfer(token, _to, amountLD);\\r\\n emit SwapRemote(_to, _s.amount.add(_s.eqReward), _s.protocolFee, _s.eqFee);\\r\\n }\\r\\n\\r\\n // Local Remote\\r\\n // ------- ---------\\r\\n // redeemLocal -> redeemLocalCheckOnRemote\\r\\n // redeemLocalCallback <-\\r\\n function redeemLocalCallback(\\r\\n uint16 _srcChainId,\\r\\n uint256 _srcPoolId,\\r\\n address _to,\\r\\n uint256 _amountSD,\\r\\n uint256 _amountToMintSD\\r\\n ) external nonReentrant onlyRouter {\\r\\n if (_amountToMintSD > 0) {\\r\\n _mintLocal(_to, amountSDtoLD(_amountToMintSD), false, false);\\r\\n }\\r\\n\\r\\n ChainPath storage cp = getAndCheckCP(_srcChainId, _srcPoolId);\\r\\n cp.lkb = cp.lkb.sub(_amountSD);\\r\\n\\r\\n uint256 amountLD = amountSDtoLD(_amountSD);\\r\\n _safeTransfer(token, _to, amountLD);\\r\\n emit RedeemLocalCallback(_to, _amountSD, _amountToMintSD);\\r\\n }\\r\\n\\r\\n // Local Remote\\r\\n // ------- ---------\\r\\n // redeemLocal(amount) -> redeemLocalCheckOnRemote\\r\\n // redeemLocalCallback <-\\r\\n function redeemLocalCheckOnRemote(\\r\\n uint16 _srcChainId,\\r\\n uint256 _srcPoolId,\\r\\n uint256 _amountSD\\r\\n ) external nonReentrant onlyRouter returns (uint256 swapAmount, uint256 mintAmount) {\\r\\n ChainPath storage cp = getAndCheckCP(_srcChainId, _srcPoolId);\\r\\n if (_amountSD > cp.balance) {\\r\\n mintAmount = _amountSD - cp.balance;\\r\\n swapAmount = cp.balance;\\r\\n cp.balance = 0;\\r\\n } else {\\r\\n cp.balance = cp.balance.sub(_amountSD);\\r\\n swapAmount = _amountSD;\\r\\n mintAmount = 0;\\r\\n }\\r\\n emit WithdrawRemote(_srcChainId, _srcPoolId, swapAmount, mintAmount);\\r\\n }\\r\\n\\r\\n //---------------------------------------------------------------------------\\r\\n // DAO Calls\\r\\n function createChainPath(\\r\\n uint16 _dstChainId,\\r\\n uint256 _dstPoolId,\\r\\n uint256 _weight\\r\\n ) external onlyRouter {\\r\\n for (uint256 i = 0; i < chainPaths.length; ++i) {\\r\\n ChainPath memory cp = chainPaths[i];\\r\\n bool exists = cp.dstChainId == _dstChainId && cp.dstPoolId == _dstPoolId;\\r\\n require(!exists, \\\"Mirrorgate: cant createChainPath of existing dstChainId and _dstPoolId\\\");\\r\\n }\\r\\n totalWeight = totalWeight.add(_weight);\\r\\n chainPathIndexLookup[_dstChainId][_dstPoolId] = chainPaths.length;\\r\\n chainPaths.push(ChainPath(false, _dstChainId, _dstPoolId, _weight, 0, 0, 0, 0));\\r\\n emit ChainPathUpdate(_dstChainId, _dstPoolId, _weight);\\r\\n }\\r\\n\\r\\n function setWeightForChainPath(\\r\\n uint16 _dstChainId,\\r\\n uint256 _dstPoolId,\\r\\n uint16 _weight\\r\\n ) external onlyRouter {\\r\\n ChainPath storage cp = getAndCheckCP(_dstChainId, _dstPoolId);\\r\\n totalWeight = totalWeight.sub(cp.weight).add(_weight);\\r\\n cp.weight = _weight;\\r\\n emit ChainPathUpdate(_dstChainId, _dstPoolId, _weight);\\r\\n }\\r\\n\\r\\n function setFee(uint256 _mintFeeBP) external onlyRouter {\\r\\n require(_mintFeeBP <= BP_DENOMINATOR, \\\"Bridge: cum fees > 100%\\\");\\r\\n mintFeeBP = _mintFeeBP;\\r\\n emit FeesUpdated(mintFeeBP);\\r\\n }\\r\\n\\r\\n function setFeeLibrary(address _feeLibraryAddr) external onlyRouter {\\r\\n require(_feeLibraryAddr != address(0x0), \\\"Mirrorgate: fee library cant be 0x0\\\");\\r\\n feeLibrary = _feeLibraryAddr;\\r\\n emit FeeLibraryUpdated(_feeLibraryAddr);\\r\\n }\\r\\n\\r\\n function setSwapStop(bool _swapStop) external onlyRouter {\\r\\n stopSwap = _swapStop;\\r\\n emit StopSwapUpdated(_swapStop);\\r\\n }\\r\\n\\r\\n function setDeltaParam(\\r\\n bool _batched,\\r\\n uint256 _swapDeltaBP,\\r\\n uint256 _lpDeltaBP,\\r\\n bool _defaultSwapMode,\\r\\n bool _defaultLPMode\\r\\n ) external onlyRouter {\\r\\n require(_swapDeltaBP <= BP_DENOMINATOR && _lpDeltaBP <= BP_DENOMINATOR, \\\"Mirrorgate: wrong Delta param\\\");\\r\\n batched = _batched;\\r\\n swapDeltaBP = _swapDeltaBP;\\r\\n lpDeltaBP = _lpDeltaBP;\\r\\n defaultSwapMode = _defaultSwapMode;\\r\\n defaultLPMode = _defaultLPMode;\\r\\n emit DeltaParamUpdated(_batched, _swapDeltaBP, _lpDeltaBP, _defaultSwapMode, _defaultLPMode);\\r\\n }\\r\\n\\r\\n function callDelta(bool _fullMode) external onlyRouter {\\r\\n _delta(_fullMode);\\r\\n }\\r\\n\\r\\n function activateChainPath(uint16 _dstChainId, uint256 _dstPoolId) external onlyRouter {\\r\\n ChainPath storage cp = getAndCheckCP(_dstChainId, _dstPoolId);\\r\\n require(cp.ready == false, \\\"Mirrorgate: chainPath is already active\\\");\\r\\n // this func will only be called once\\r\\n cp.ready = true;\\r\\n }\\r\\n\\r\\n function withdrawProtocolFeeBalance(address _to) external onlyRouter {\\r\\n if (protocolFeeBalance > 0) {\\r\\n uint256 amountOfLD = amountSDtoLD(protocolFeeBalance);\\r\\n protocolFeeBalance = 0;\\r\\n _safeTransfer(token, _to, amountOfLD);\\r\\n emit WithdrawProtocolFeeBalance(_to, amountOfLD);\\r\\n }\\r\\n }\\r\\n\\r\\n function withdrawMintFeeBalance(address _to) external onlyRouter {\\r\\n if (mintFeeBalance > 0) {\\r\\n uint256 amountOfLD = amountSDtoLD(mintFeeBalance);\\r\\n mintFeeBalance = 0;\\r\\n _safeTransfer(token, _to, amountOfLD);\\r\\n emit WithdrawMintFeeBalance(_to, amountOfLD);\\r\\n }\\r\\n }\\r\\n\\r\\n //---------------------------------------------------------------------------\\r\\n // INTERNAL\\r\\n // Conversion Helpers\\r\\n //---------------------------------------------------------------------------\\r\\n function amountLPtoLD(uint256 _amountLP) external view returns (uint256) {\\r\\n return amountSDtoLD(_amountLPtoSD(_amountLP));\\r\\n }\\r\\n\\r\\n function _amountLPtoSD(uint256 _amountLP) internal view returns (uint256) {\\r\\n require(totalSupply > 0, \\\"Mirrorgate: cant convert LPtoSD when totalSupply == 0\\\");\\r\\n return _amountLP.mul(totalLiquidity).div(totalSupply);\\r\\n }\\r\\n\\r\\n function _amountSDtoLP(uint256 _amountSD) internal view returns (uint256) {\\r\\n require(totalLiquidity > 0, \\\"Mirrorgate: cant convert SDtoLP when totalLiq == 0\\\");\\r\\n return _amountSD.mul(totalSupply).div(totalLiquidity);\\r\\n }\\r\\n\\r\\n function amountSDtoLD(uint256 _amount) internal view returns (uint256) {\\r\\n return _amount.mul(convertRate);\\r\\n }\\r\\n\\r\\n function amountLDtoSD(uint256 _amount) internal view returns (uint256) {\\r\\n return _amount.div(convertRate);\\r\\n }\\r\\n\\r\\n function getAndCheckCP(uint16 _dstChainId, uint256 _dstPoolId) internal view returns (ChainPath storage) {\\r\\n require(chainPaths.length > 0, \\\"Mirrorgate: no chainpaths exist\\\");\\r\\n ChainPath storage cp = chainPaths[chainPathIndexLookup[_dstChainId][_dstPoolId]];\\r\\n require(cp.dstChainId == _dstChainId && cp.dstPoolId == _dstPoolId, \\\"Mirrorgate: local chainPath does not exist\\\");\\r\\n return cp;\\r\\n }\\r\\n\\r\\n function getChainPath(uint16 _dstChainId, uint256 _dstPoolId) external view returns (ChainPath memory) {\\r\\n ChainPath memory cp = chainPaths[chainPathIndexLookup[_dstChainId][_dstPoolId]];\\r\\n require(cp.dstChainId == _dstChainId && cp.dstPoolId == _dstPoolId, \\\"Mirrorgate: local chainPath does not exist\\\");\\r\\n return cp;\\r\\n }\\r\\n\\r\\n function _burnLocal(address _from, uint256 _amountLP) internal returns (uint256) {\\r\\n require(totalSupply > 0, \\\"Mirrorgate: cant burn when totalSupply == 0\\\");\\r\\n uint256 amountOfLPTokens = balanceOf[_from];\\r\\n require(amountOfLPTokens >= _amountLP, \\\"Mirrorgate: not enough LP tokens to burn\\\");\\r\\n\\r\\n uint256 amountSD = _amountLP.mul(totalLiquidity).div(totalSupply);\\r\\n //subtract totalLiquidity accordingly\\r\\n totalLiquidity = totalLiquidity.sub(amountSD);\\r\\n\\r\\n _burn(_from, _amountLP);\\r\\n emit Burn(_from, _amountLP, amountSD);\\r\\n return amountSD;\\r\\n }\\r\\n\\r\\n function _delta(bool fullMode) internal {\\r\\n if (deltaCredit > 0 && totalWeight > 0) {\\r\\n uint256 cpLength = chainPaths.length;\\r\\n uint256[] memory deficit = new uint256[](cpLength);\\r\\n uint256 totalDeficit = 0;\\r\\n\\r\\n // algorithm steps 6-9: calculate the total and the amounts required to get to balance state\\r\\n for (uint256 i = 0; i < cpLength; ++i) {\\r\\n ChainPath storage cp = chainPaths[i];\\r\\n // (liquidity * (weight/totalWeight)) - (lkb+credits)\\r\\n uint256 balLiq = totalLiquidity.mul(cp.weight).div(totalWeight);\\r\\n uint256 currLiq = cp.lkb.add(cp.credits);\\r\\n if (balLiq > currLiq) {\\r\\n // save gas since we know balLiq > currLiq and we know deficit[i] > 0\\r\\n deficit[i] = balLiq - currLiq;\\r\\n totalDeficit = totalDeficit.add(deficit[i]);\\r\\n }\\r\\n }\\r\\n\\r\\n // indicates how much delta credit is distributed\\r\\n uint256 spent;\\r\\n\\r\\n // handle credits with 2 tranches. the [ < totalDeficit] [excessCredit]\\r\\n // run full Delta, allocate all credits\\r\\n if (totalDeficit == 0) {\\r\\n // only fullMode delta will allocate excess credits\\r\\n if (fullMode && deltaCredit > 0) {\\r\\n // credit ChainPath by weights\\r\\n for (uint256 i = 0; i < cpLength; ++i) {\\r\\n ChainPath storage cp = chainPaths[i];\\r\\n // credits = credits + toBalanceChange + remaining allocation based on weight\\r\\n uint256 amtToCredit = deltaCredit.mul(cp.weight).div(totalWeight);\\r\\n spent = spent.add(amtToCredit);\\r\\n cp.credits = cp.credits.add(amtToCredit);\\r\\n }\\r\\n } // else do nth\\r\\n } else if (totalDeficit <= deltaCredit) {\\r\\n if (fullMode) {\\r\\n // algorithm step 13: calculate amount to disperse to bring to balance state or as close as possible\\r\\n uint256 excessCredit = deltaCredit - totalDeficit;\\r\\n // algorithm steps 14-16: calculate credits\\r\\n for (uint256 i = 0; i < cpLength; ++i) {\\r\\n if (deficit[i] > 0) {\\r\\n ChainPath storage cp = chainPaths[i];\\r\\n // credits = credits + deficit + remaining allocation based on weight\\r\\n uint256 amtToCredit = deficit[i].add(excessCredit.mul(cp.weight).div(totalWeight));\\r\\n spent = spent.add(amtToCredit);\\r\\n cp.credits = cp.credits.add(amtToCredit);\\r\\n }\\r\\n }\\r\\n } else {\\r\\n // totalDeficit <= deltaCredit but not running fullMode\\r\\n // credit chainPaths as is if any deficit, not using all deltaCredit\\r\\n for (uint256 i = 0; i < cpLength; ++i) {\\r\\n if (deficit[i] > 0) {\\r\\n ChainPath storage cp = chainPaths[i];\\r\\n uint256 amtToCredit = deficit[i];\\r\\n spent = spent.add(amtToCredit);\\r\\n cp.credits = cp.credits.add(amtToCredit);\\r\\n }\\r\\n }\\r\\n }\\r\\n } else {\\r\\n // totalDeficit > deltaCredit, fullMode or not, normalize the deficit by deltaCredit\\r\\n for (uint256 i = 0; i < cpLength; ++i) {\\r\\n if (deficit[i] > 0) {\\r\\n ChainPath storage cp = chainPaths[i];\\r\\n uint256 proportionalDeficit = deficit[i].mul(deltaCredit).div(totalDeficit);\\r\\n spent = spent.add(proportionalDeficit);\\r\\n cp.credits = cp.credits.add(proportionalDeficit);\\r\\n }\\r\\n }\\r\\n }\\r\\n\\r\\n // deduct the amount of credit sent\\r\\n deltaCredit = deltaCredit.sub(spent);\\r\\n }\\r\\n }\\r\\n\\r\\n function _mintLocal(\\r\\n address _to,\\r\\n uint256 _amountLD,\\r\\n bool _feesEnabled,\\r\\n bool _creditDelta\\r\\n ) internal returns (uint256 amountSD) {\\r\\n require(totalWeight > 0, \\\"Mirrorgate: No ChainPaths exist\\\");\\r\\n amountSD = amountLDtoSD(_amountLD);\\r\\n\\r\\n uint256 mintFeeSD = 0;\\r\\n if (_feesEnabled) {\\r\\n mintFeeSD = amountSD.mul(mintFeeBP).div(BP_DENOMINATOR);\\r\\n amountSD = amountSD.sub(mintFeeSD);\\r\\n mintFeeBalance = mintFeeBalance.add(mintFeeSD);\\r\\n }\\r\\n\\r\\n if (_creditDelta) {\\r\\n deltaCredit = deltaCredit.add(amountSD);\\r\\n }\\r\\n\\r\\n uint256 amountLPTokens = amountSD;\\r\\n if (totalSupply != 0) {\\r\\n amountLPTokens = amountSD.mul(totalSupply).div(totalLiquidity);\\r\\n }\\r\\n totalLiquidity = totalLiquidity.add(amountSD);\\r\\n\\r\\n _mint(_to, amountLPTokens);\\r\\n emit Mint(_to, amountLPTokens, amountSD, mintFeeSD);\\r\\n\\r\\n // add to credits and call delta. short circuit to save gas\\r\\n if (!batched || deltaCredit > totalLiquidity.mul(lpDeltaBP).div(BP_DENOMINATOR)) {\\r\\n _delta(defaultLPMode);\\r\\n }\\r\\n }\\r\\n\\r\\n function _safeTransfer(\\r\\n address _token,\\r\\n address _to,\\r\\n uint256 _value\\r\\n ) private {\\r\\n (bool success, bytes memory data) = _token.call(abi.encodeWithSelector(SELECTOR, _to, _value));\\r\\n require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"Mirrorgate: TRANSFER_FAILED\\\");\\r\\n }\\r\\n}\\r\\n\",\"keccak256\":\"0x553659592a7dcfe5a199ce693bd765d5eea4bbda29b115d064718c5886360649\",\"license\":\"BUSL-1.1\"},\"contracts/Router.sol\":{\"content\":\"// SPDX-License-Identifier: BUSL-1.1\\r\\n\\r\\npragma solidity 0.7.6;\\r\\npragma abicoder v2;\\r\\n\\r\\n// imports\\r\\nimport \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\r\\nimport \\\"@openzeppelin/contracts/utils/ReentrancyGuard.sol\\\";\\r\\nimport \\\"./Factory.sol\\\";\\r\\nimport \\\"./Pool.sol\\\";\\r\\nimport \\\"./Bridge.sol\\\";\\r\\n\\r\\n// interfaces\\r\\nimport \\\"@openzeppelin/contracts/token/ERC20/IERC20.sol\\\";\\r\\nimport \\\"./interfaces/IMirrorgateRouter.sol\\\";\\r\\nimport \\\"./interfaces/IMirrorgateReceiver.sol\\\";\\r\\n\\r\\n// libraries\\r\\nimport \\\"@openzeppelin/contracts/math/SafeMath.sol\\\";\\r\\n\\r\\ncontract Router is IMirrorgateRouter, Ownable, ReentrancyGuard {\\r\\n using SafeMath for uint256;\\r\\n\\r\\n //---------------------------------------------------------------------------\\r\\n // CONSTANTS\\r\\n uint8 internal constant TYPE_REDEEM_LOCAL_RESPONSE = 1;\\r\\n uint8 internal constant TYPE_REDEEM_LOCAL_CALLBACK_RETRY = 2;\\r\\n uint8 internal constant TYPE_SWAP_REMOTE_RETRY = 3;\\r\\n\\r\\n //---------------------------------------------------------------------------\\r\\n // STRUCTS\\r\\n struct CachedSwap {\\r\\n address token;\\r\\n uint256 amountLD;\\r\\n address to;\\r\\n bytes payload;\\r\\n }\\r\\n\\r\\n //---------------------------------------------------------------------------\\r\\n // VARIABLES\\r\\n Factory public factory; // used for creating pools\\r\\n address public protocolFeeOwner; // can call methods to pull Stargate fees collected in pools\\r\\n address public mintFeeOwner; // can call methods to pull mint fees collected in pools\\r\\n Bridge public bridge;\\r\\n mapping(uint16 => mapping(bytes => mapping(uint256 => bytes))) public revertLookup; //[chainId][srcAddress][nonce]\\r\\n mapping(uint16 => mapping(bytes => mapping(uint256 => CachedSwap))) public cachedSwapLookup; //[chainId][srcAddress][nonce]\\r\\n\\r\\n //---------------------------------------------------------------------------\\r\\n // EVENTS\\r\\n event Revert(uint8 bridgeFunctionType, uint16 chainId, bytes srcAddress, uint256 nonce);\\r\\n event CachedSwapSaved(uint16 chainId, bytes srcAddress, uint256 nonce, address token, uint256 amountLD, address to, bytes payload, bytes reason);\\r\\n event RevertRedeemLocal(uint16 srcChainId, uint256 _srcPoolId, uint256 _dstPoolId, bytes to, uint256 redeemAmountSD, uint256 mintAmountSD, uint256 indexed nonce, bytes indexed srcAddress);\\r\\n event RedeemLocalCallback(uint16 srcChainId, bytes indexed srcAddress, uint256 indexed nonce, uint256 srcPoolId, uint256 dstPoolId, address to, uint256 amountSD, uint256 mintAmountSD);\\r\\n\\r\\n //---------------------------------------------------------------------------\\r\\n // MODIFIERS\\r\\n modifier onlyBridge() {\\r\\n require(msg.sender == address(bridge), \\\"Bridge: caller must be Bridge.\\\");\\r\\n _;\\r\\n }\\r\\n\\r\\n constructor() {}\\r\\n\\r\\n function setBridgeAndFactory(Bridge _bridge, Factory _factory) external onlyOwner {\\r\\n require(address(bridge) == address(0x0) && address(factory) == address(0x0), \\\"Mirrorgate: bridge and factory already initialized\\\"); // 1 time only\\r\\n require(address(_bridge) != address(0x0), \\\"Mirrorgate: bridge cant be 0x0\\\");\\r\\n require(address(_factory) != address(0x0), \\\"Mirrorgate: factory cant be 0x0\\\");\\r\\n\\r\\n bridge = _bridge;\\r\\n factory = _factory;\\r\\n }\\r\\n\\r\\n //---------------------------------------------------------------------------\\r\\n // VIEWS\\r\\n function _getPool(uint256 _poolId) internal view returns (Pool pool) {\\r\\n pool = factory.getPool(_poolId);\\r\\n require(address(pool) != address(0x0), \\\"Mirrorgate: Pool does not exist\\\");\\r\\n }\\r\\n\\r\\n //---------------------------------------------------------------------------\\r\\n // INTERNAL\\r\\n function _safeTransferFrom(\\r\\n address token,\\r\\n address from,\\r\\n address to,\\r\\n uint256 value\\r\\n ) private {\\r\\n // bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));\\r\\n (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));\\r\\n require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"Mirrorgate: TRANSFER_FROM_FAILED\\\");\\r\\n }\\r\\n\\r\\n //---------------------------------------------------------------------------\\r\\n // LOCAL CHAIN FUNCTIONS\\r\\n function addLiquidity(\\r\\n uint256 _poolId,\\r\\n uint256 _amountLD,\\r\\n address _to\\r\\n ) external override nonReentrant {\\r\\n Pool pool = _getPool(_poolId);\\r\\n uint256 convertRate = pool.convertRate();\\r\\n _amountLD = _amountLD.div(convertRate).mul(convertRate);\\r\\n _safeTransferFrom(pool.token(), msg.sender, address(pool), _amountLD);\\r\\n pool.mint(_to, _amountLD);\\r\\n }\\r\\n\\r\\n function swap(\\r\\n uint16 _dstChainId,\\r\\n uint256 _srcPoolId,\\r\\n uint256 _dstPoolId,\\r\\n address payable _refundAddress,\\r\\n uint256 _amountLD,\\r\\n uint256 _minAmountLD,\\r\\n lzTxObj memory _lzTxParams,\\r\\n bytes calldata _to,\\r\\n bytes calldata _payload\\r\\n ) external payable override nonReentrant {\\r\\n require(_amountLD > 0, \\\"Mirrorgate: cannot swap 0\\\");\\r\\n require(_refundAddress != address(0x0), \\\"Mirrorgate: _refundAddress cannot be 0x0\\\");\\r\\n Pool.SwapObj memory s;\\r\\n Pool.CreditObj memory c;\\r\\n {\\r\\n Pool pool = _getPool(_srcPoolId);\\r\\n {\\r\\n uint256 convertRate = pool.convertRate();\\r\\n _amountLD = _amountLD.div(convertRate).mul(convertRate);\\r\\n }\\r\\n\\r\\n s = pool.swap(_dstChainId, _dstPoolId, msg.sender, _amountLD, _minAmountLD, true);\\r\\n _safeTransferFrom(pool.token(), msg.sender, address(pool), _amountLD);\\r\\n c = pool.sendCredits(_dstChainId, _dstPoolId);\\r\\n }\\r\\n bridge.swap{value: msg.value}(_dstChainId, _srcPoolId, _dstPoolId, _refundAddress, c, s, _lzTxParams, _to, _payload);\\r\\n }\\r\\n\\r\\n function redeemRemote(\\r\\n uint16 _dstChainId,\\r\\n uint256 _srcPoolId,\\r\\n uint256 _dstPoolId,\\r\\n address payable _refundAddress,\\r\\n uint256 _amountLP,\\r\\n uint256 _minAmountLD,\\r\\n bytes calldata _to,\\r\\n lzTxObj memory _lzTxParams\\r\\n ) external payable override nonReentrant {\\r\\n require(_refundAddress != address(0x0), \\\"Mirrorgate: _refundAddress cannot be 0x0\\\");\\r\\n require(_amountLP > 0, \\\"Mirrorgate: not enough lp to redeemRemote\\\");\\r\\n Pool.SwapObj memory s;\\r\\n Pool.CreditObj memory c;\\r\\n {\\r\\n Pool pool = _getPool(_srcPoolId);\\r\\n uint256 amountLD = pool.amountLPtoLD(_amountLP);\\r\\n // perform a swap with no liquidity\\r\\n s = pool.swap(_dstChainId, _dstPoolId, msg.sender, amountLD, _minAmountLD, false);\\r\\n pool.redeemRemote(_dstChainId, _dstPoolId, msg.sender, _amountLP);\\r\\n c = pool.sendCredits(_dstChainId, _dstPoolId);\\r\\n }\\r\\n // equal to a swap, with no payload (\\\"0x\\\") no dstGasForCall 0\\r\\n bridge.swap{value: msg.value}(_dstChainId, _srcPoolId, _dstPoolId, _refundAddress, c, s, _lzTxParams, _to, \\\"\\\");\\r\\n }\\r\\n\\r\\n function instantRedeemLocal(\\r\\n uint16 _srcPoolId,\\r\\n uint256 _amountLP,\\r\\n address _to\\r\\n ) external override nonReentrant returns (uint256 amountSD) {\\r\\n require(_amountLP > 0, \\\"Mirrorgate: not enough lp to redeem\\\");\\r\\n Pool pool = _getPool(_srcPoolId);\\r\\n amountSD = pool.instantRedeemLocal(msg.sender, _amountLP, _to);\\r\\n }\\r\\n\\r\\n function redeemLocal(\\r\\n uint16 _dstChainId,\\r\\n uint256 _srcPoolId,\\r\\n uint256 _dstPoolId,\\r\\n address payable _refundAddress,\\r\\n uint256 _amountLP,\\r\\n bytes calldata _to,\\r\\n lzTxObj memory _lzTxParams\\r\\n ) external payable override nonReentrant {\\r\\n require(_refundAddress != address(0x0), \\\"Mirrorgate: _refundAddress cannot be 0x0\\\");\\r\\n Pool pool = _getPool(_srcPoolId);\\r\\n require(_amountLP > 0, \\\"Mirrorgate: not enough lp to redeem\\\");\\r\\n uint256 amountSD = pool.redeemLocal(msg.sender, _amountLP, _dstChainId, _dstPoolId, _to);\\r\\n require(amountSD > 0, \\\"Mirrorgate: not enough lp to redeem with amountSD\\\");\\r\\n\\r\\n Pool.CreditObj memory c = pool.sendCredits(_dstChainId, _dstPoolId);\\r\\n bridge.redeemLocal{value: msg.value}(_dstChainId, _srcPoolId, _dstPoolId, _refundAddress, c, amountSD, _to, _lzTxParams);\\r\\n }\\r\\n\\r\\n function sendCredits(\\r\\n uint16 _dstChainId,\\r\\n uint256 _srcPoolId,\\r\\n uint256 _dstPoolId,\\r\\n address payable _refundAddress\\r\\n ) external payable override nonReentrant {\\r\\n require(_refundAddress != address(0x0), \\\"Mirrorgate: _refundAddress cannot be 0x0\\\");\\r\\n Pool pool = _getPool(_srcPoolId);\\r\\n Pool.CreditObj memory c = pool.sendCredits(_dstChainId, _dstPoolId);\\r\\n bridge.sendCredits{value: msg.value}(_dstChainId, _srcPoolId, _dstPoolId, _refundAddress, c);\\r\\n }\\r\\n\\r\\n function quoteLayerZeroFee(\\r\\n uint16 _dstChainId,\\r\\n uint8 _functionType,\\r\\n bytes calldata _toAddress,\\r\\n bytes calldata _transferAndCallPayload,\\r\\n Router.lzTxObj memory _lzTxParams\\r\\n ) external view override returns (uint256, uint256) {\\r\\n return bridge.quoteLayerZeroFee(_dstChainId, _functionType, _toAddress, _transferAndCallPayload, _lzTxParams);\\r\\n }\\r\\n\\r\\n function revertRedeemLocal(\\r\\n uint16 _dstChainId,\\r\\n bytes calldata _srcAddress,\\r\\n uint256 _nonce,\\r\\n address payable _refundAddress,\\r\\n lzTxObj memory _lzTxParams\\r\\n ) external payable {\\r\\n require(_refundAddress != address(0x0), \\\"Mirrorgate: _refundAddress cannot be 0x0\\\");\\r\\n bytes memory payload = revertLookup[_dstChainId][_srcAddress][_nonce];\\r\\n require(payload.length > 0, \\\"Mirrorgate: no retry revert\\\");\\r\\n {\\r\\n uint8 functionType;\\r\\n assembly {\\r\\n functionType := mload(add(payload, 32))\\r\\n }\\r\\n require(functionType == TYPE_REDEEM_LOCAL_RESPONSE, \\\"Mirrorgate: invalid function type\\\");\\r\\n }\\r\\n\\r\\n // empty it\\r\\n revertLookup[_dstChainId][_srcAddress][_nonce] = \\\"\\\";\\r\\n\\r\\n uint256 srcPoolId;\\r\\n uint256 dstPoolId;\\r\\n assembly {\\r\\n srcPoolId := mload(add(payload, 64))\\r\\n dstPoolId := mload(add(payload, 96))\\r\\n }\\r\\n\\r\\n Pool.CreditObj memory c;\\r\\n {\\r\\n Pool pool = _getPool(dstPoolId);\\r\\n c = pool.sendCredits(_dstChainId, srcPoolId);\\r\\n }\\r\\n\\r\\n bridge.redeemLocalCallback{value: msg.value}(_dstChainId, _refundAddress, c, _lzTxParams, payload);\\r\\n }\\r\\n\\r\\n function retryRevert(\\r\\n uint16 _srcChainId,\\r\\n bytes calldata _srcAddress,\\r\\n uint256 _nonce\\r\\n ) external payable {\\r\\n bytes memory payload = revertLookup[_srcChainId][_srcAddress][_nonce];\\r\\n require(payload.length > 0, \\\"Mirrorgate: no retry revert\\\");\\r\\n\\r\\n // empty it\\r\\n revertLookup[_srcChainId][_srcAddress][_nonce] = \\\"\\\";\\r\\n\\r\\n uint8 functionType;\\r\\n assembly {\\r\\n functionType := mload(add(payload, 32))\\r\\n }\\r\\n\\r\\n if (functionType == TYPE_REDEEM_LOCAL_CALLBACK_RETRY) {\\r\\n (, uint256 srcPoolId, uint256 dstPoolId, address to, uint256 amountSD, uint256 mintAmountSD) = abi.decode(\\r\\n payload,\\r\\n (uint8, uint256, uint256, address, uint256, uint256)\\r\\n );\\r\\n _redeemLocalCallback(_srcChainId, _srcAddress, _nonce, srcPoolId, dstPoolId, to, amountSD, mintAmountSD);\\r\\n }\\r\\n // for retrying the swapRemote. if it fails again, retry\\r\\n else if (functionType == TYPE_SWAP_REMOTE_RETRY) {\\r\\n (, uint256 srcPoolId, uint256 dstPoolId, uint256 dstGasForCall, address to, Pool.SwapObj memory s, bytes memory p) = abi.decode(\\r\\n payload,\\r\\n (uint8, uint256, uint256, uint256, address, Pool.SwapObj, bytes)\\r\\n );\\r\\n _swapRemote(_srcChainId, _srcAddress, _nonce, srcPoolId, dstPoolId, dstGasForCall, to, s, p);\\r\\n } else {\\r\\n revert(\\\"Mirrorgate: invalid function type\\\");\\r\\n }\\r\\n }\\r\\n\\r\\n function clearCachedSwap(\\r\\n uint16 _srcChainId,\\r\\n bytes calldata _srcAddress,\\r\\n uint256 _nonce\\r\\n ) external {\\r\\n CachedSwap memory cs = cachedSwapLookup[_srcChainId][_srcAddress][_nonce];\\r\\n require(cs.to != address(0x0), \\\"Mirrorgate: cache already cleared\\\");\\r\\n // clear the data\\r\\n cachedSwapLookup[_srcChainId][_srcAddress][_nonce] = CachedSwap(address(0x0), 0, address(0x0), \\\"\\\");\\r\\n IMirrorgateReceiver(cs.to).mgReceive(_srcChainId, _srcAddress, _nonce, cs.token, cs.amountLD, cs.payload);\\r\\n }\\r\\n\\r\\n function creditChainPath(\\r\\n uint16 _dstChainId,\\r\\n uint256 _dstPoolId,\\r\\n uint256 _srcPoolId,\\r\\n Pool.CreditObj memory _c\\r\\n ) external onlyBridge {\\r\\n Pool pool = _getPool(_srcPoolId);\\r\\n pool.creditChainPath(_dstChainId, _dstPoolId, _c);\\r\\n }\\r\\n\\r\\n //---------------------------------------------------------------------------\\r\\n // REMOTE CHAIN FUNCTIONS\\r\\n function redeemLocalCheckOnRemote(\\r\\n uint16 _srcChainId,\\r\\n bytes memory _srcAddress,\\r\\n uint256 _nonce,\\r\\n uint256 _srcPoolId,\\r\\n uint256 _dstPoolId,\\r\\n uint256 _amountSD,\\r\\n bytes calldata _to\\r\\n ) external onlyBridge {\\r\\n Pool pool = _getPool(_dstPoolId);\\r\\n try pool.redeemLocalCheckOnRemote(_srcChainId, _srcPoolId, _amountSD) returns (uint256 redeemAmountSD, uint256 mintAmountSD) {\\r\\n revertLookup[_srcChainId][_srcAddress][_nonce] = abi.encode(\\r\\n TYPE_REDEEM_LOCAL_RESPONSE,\\r\\n _srcPoolId,\\r\\n _dstPoolId,\\r\\n redeemAmountSD,\\r\\n mintAmountSD,\\r\\n _to\\r\\n );\\r\\n emit RevertRedeemLocal(_srcChainId, _srcPoolId, _dstPoolId, _to, redeemAmountSD, mintAmountSD, _nonce, _srcAddress);\\r\\n } catch {\\r\\n // if the func fail, return [swapAmount: 0, mintAMount: _amountSD]\\r\\n // swapAmount represents the amount of chainPath balance deducted on the remote side, which because the above tx failed, should be 0\\r\\n // mintAmount is the full amount of tokens the user attempted to redeem on the src side, which gets converted back into the lp amount\\r\\n revertLookup[_srcChainId][_srcAddress][_nonce] = abi.encode(TYPE_REDEEM_LOCAL_RESPONSE, _srcPoolId, _dstPoolId, 0, _amountSD, _to);\\r\\n emit Revert(TYPE_REDEEM_LOCAL_RESPONSE, _srcChainId, _srcAddress, _nonce);\\r\\n }\\r\\n }\\r\\n\\r\\n function redeemLocalCallback(\\r\\n uint16 _srcChainId,\\r\\n bytes memory _srcAddress,\\r\\n uint256 _nonce,\\r\\n uint256 _srcPoolId,\\r\\n uint256 _dstPoolId,\\r\\n address _to,\\r\\n uint256 _amountSD,\\r\\n uint256 _mintAmountSD\\r\\n ) external onlyBridge {\\r\\n _redeemLocalCallback(_srcChainId, _srcAddress, _nonce, _srcPoolId, _dstPoolId, _to, _amountSD, _mintAmountSD);\\r\\n }\\r\\n\\r\\n function _redeemLocalCallback(\\r\\n uint16 _srcChainId,\\r\\n bytes memory _srcAddress,\\r\\n uint256 _nonce,\\r\\n uint256 _srcPoolId,\\r\\n uint256 _dstPoolId,\\r\\n address _to,\\r\\n uint256 _amountSD,\\r\\n uint256 _mintAmountSD\\r\\n ) internal {\\r\\n Pool pool = _getPool(_dstPoolId);\\r\\n try pool.redeemLocalCallback(_srcChainId, _srcPoolId, _to, _amountSD, _mintAmountSD) {} catch {\\r\\n revertLookup[_srcChainId][_srcAddress][_nonce] = abi.encode(\\r\\n TYPE_REDEEM_LOCAL_CALLBACK_RETRY,\\r\\n _srcPoolId,\\r\\n _dstPoolId,\\r\\n _to,\\r\\n _amountSD,\\r\\n _mintAmountSD\\r\\n );\\r\\n emit Revert(TYPE_REDEEM_LOCAL_CALLBACK_RETRY, _srcChainId, _srcAddress, _nonce);\\r\\n }\\r\\n emit RedeemLocalCallback(_srcChainId, _srcAddress, _nonce, _srcPoolId, _dstPoolId, _to, _amountSD, _mintAmountSD);\\r\\n }\\r\\n\\r\\n function swapRemote(\\r\\n uint16 _srcChainId,\\r\\n bytes memory _srcAddress,\\r\\n uint256 _nonce,\\r\\n uint256 _srcPoolId,\\r\\n uint256 _dstPoolId,\\r\\n uint256 _dstGasForCall,\\r\\n address _to,\\r\\n Pool.SwapObj memory _s,\\r\\n bytes memory _payload\\r\\n ) external onlyBridge {\\r\\n _swapRemote(_srcChainId, _srcAddress, _nonce, _srcPoolId, _dstPoolId, _dstGasForCall, _to, _s, _payload);\\r\\n }\\r\\n\\r\\n function _swapRemote(\\r\\n uint16 _srcChainId,\\r\\n bytes memory _srcAddress,\\r\\n uint256 _nonce,\\r\\n uint256 _srcPoolId,\\r\\n uint256 _dstPoolId,\\r\\n uint256 _dstGasForCall,\\r\\n address _to,\\r\\n Pool.SwapObj memory _s,\\r\\n bytes memory _payload\\r\\n ) internal {\\r\\n Pool pool = _getPool(_dstPoolId);\\r\\n // first try catch the swap remote\\r\\n try pool.swapRemote(_srcChainId, _srcPoolId, _to, _s) returns (uint256 amountLD) {\\r\\n if (_payload.length > 0) {\\r\\n // then try catch the external contract call\\r\\n try IMirrorgateReceiver(_to).mgReceive{gas: _dstGasForCall}(_srcChainId, _srcAddress, _nonce, pool.token(), amountLD, _payload) {\\r\\n // do nothing\\r\\n } catch (bytes memory reason) {\\r\\n cachedSwapLookup[_srcChainId][_srcAddress][_nonce] = CachedSwap(pool.token(), amountLD, _to, _payload);\\r\\n emit CachedSwapSaved(_srcChainId, _srcAddress, _nonce, pool.token(), amountLD, _to, _payload, reason);\\r\\n }\\r\\n }\\r\\n } catch {\\r\\n revertLookup[_srcChainId][_srcAddress][_nonce] = abi.encode(\\r\\n TYPE_SWAP_REMOTE_RETRY,\\r\\n _srcPoolId,\\r\\n _dstPoolId,\\r\\n _dstGasForCall,\\r\\n _to,\\r\\n _s,\\r\\n _payload\\r\\n );\\r\\n emit Revert(TYPE_SWAP_REMOTE_RETRY, _srcChainId, _srcAddress, _nonce);\\r\\n }\\r\\n }\\r\\n\\r\\n //---------------------------------------------------------------------------\\r\\n // DAO Calls\\r\\n function createPool(\\r\\n uint256 _poolId,\\r\\n address _token,\\r\\n uint8 _sharedDecimals,\\r\\n uint8 _localDecimals,\\r\\n string memory _name,\\r\\n string memory _symbol\\r\\n ) external onlyOwner returns (address) {\\r\\n require(_token != address(0x0), \\\"Mirrorgate: _token cannot be 0x0\\\");\\r\\n return factory.createPool(_poolId, _token, _sharedDecimals, _localDecimals, _name, _symbol);\\r\\n }\\r\\n\\r\\n function createChainPath(\\r\\n uint256 _poolId,\\r\\n uint16 _dstChainId,\\r\\n uint256 _dstPoolId,\\r\\n uint256 _weight\\r\\n ) external onlyOwner {\\r\\n Pool pool = _getPool(_poolId);\\r\\n pool.createChainPath(_dstChainId, _dstPoolId, _weight);\\r\\n }\\r\\n\\r\\n function activateChainPath(\\r\\n uint256 _poolId,\\r\\n uint16 _dstChainId,\\r\\n uint256 _dstPoolId\\r\\n ) external onlyOwner {\\r\\n Pool pool = _getPool(_poolId);\\r\\n pool.activateChainPath(_dstChainId, _dstPoolId);\\r\\n }\\r\\n\\r\\n function setWeightForChainPath(\\r\\n uint256 _poolId,\\r\\n uint16 _dstChainId,\\r\\n uint256 _dstPoolId,\\r\\n uint16 _weight\\r\\n ) external onlyOwner {\\r\\n Pool pool = _getPool(_poolId);\\r\\n pool.setWeightForChainPath(_dstChainId, _dstPoolId, _weight);\\r\\n }\\r\\n\\r\\n function setProtocolFeeOwner(address _owner) external onlyOwner {\\r\\n require(_owner != address(0x0), \\\"Mirrorgate: _owner cannot be 0x0\\\");\\r\\n protocolFeeOwner = _owner;\\r\\n }\\r\\n\\r\\n function setMintFeeOwner(address _owner) external onlyOwner {\\r\\n require(_owner != address(0x0), \\\"Mirrorgate: _owner cannot be 0x0\\\");\\r\\n mintFeeOwner = _owner;\\r\\n }\\r\\n\\r\\n function setFees(uint256 _poolId, uint256 _mintFeeBP) external onlyOwner {\\r\\n Pool pool = _getPool(_poolId);\\r\\n pool.setFee(_mintFeeBP);\\r\\n }\\r\\n\\r\\n function setFeeLibrary(uint256 _poolId, address _feeLibraryAddr) external onlyOwner {\\r\\n Pool pool = _getPool(_poolId);\\r\\n pool.setFeeLibrary(_feeLibraryAddr);\\r\\n }\\r\\n\\r\\n function setSwapStop(uint256 _poolId, bool _swapStop) external onlyOwner {\\r\\n Pool pool = _getPool(_poolId);\\r\\n pool.setSwapStop(_swapStop);\\r\\n }\\r\\n\\r\\n function setDeltaParam(\\r\\n uint256 _poolId,\\r\\n bool _batched,\\r\\n uint256 _swapDeltaBP,\\r\\n uint256 _lpDeltaBP,\\r\\n bool _defaultSwapMode,\\r\\n bool _defaultLPMode\\r\\n ) external onlyOwner {\\r\\n Pool pool = _getPool(_poolId);\\r\\n pool.setDeltaParam(_batched, _swapDeltaBP, _lpDeltaBP, _defaultSwapMode, _defaultLPMode);\\r\\n }\\r\\n\\r\\n function callDelta(uint256 _poolId, bool _fullMode) external {\\r\\n Pool pool = _getPool(_poolId);\\r\\n pool.callDelta(_fullMode);\\r\\n }\\r\\n\\r\\n function withdrawMintFee(uint256 _poolId, address _to) external {\\r\\n require(mintFeeOwner == msg.sender, \\\"Mirrorgate: only mintFeeOwner\\\");\\r\\n Pool pool = _getPool(_poolId);\\r\\n pool.withdrawMintFeeBalance(_to);\\r\\n }\\r\\n\\r\\n function withdrawProtocolFee(uint256 _poolId, address _to) external {\\r\\n require(protocolFeeOwner == msg.sender, \\\"Mirrorgate: only protocolFeeOwner\\\");\\r\\n Pool pool = _getPool(_poolId);\\r\\n pool.withdrawProtocolFeeBalance(_to);\\r\\n }\\r\\n}\\r\\n\",\"keccak256\":\"0x9ce97ff3499e7fd80c85925ff9c9bba2c0c9925ed680abfd3dd884117c2eeeda\",\"license\":\"BUSL-1.1\"},\"contracts/interfaces/ILayerZeroEndpoint.sol\":{\"content\":\"// SPDX-License-Identifier: BUSL-1.1\\r\\n\\r\\npragma solidity >=0.5.0;\\r\\n\\r\\nimport \\\"./ILayerZeroUserApplicationConfig.sol\\\";\\r\\n\\r\\ninterface ILayerZeroEndpoint is ILayerZeroUserApplicationConfig {\\r\\n // @notice send a LayerZero message to the specified address at a LayerZero endpoint.\\r\\n // @param _dstChainId - the destination chain identifier\\r\\n // @param _destination - the address on destination chain (in bytes). address length/format may vary by chains\\r\\n // @param _payload - a custom bytes payload to send to the destination contract\\r\\n // @param _refundAddress - if the source transaction is cheaper than the amount of value passed, refund the additional amount to this address\\r\\n // @param _zroPaymentAddress - the address of the ZRO token holder who would pay for the transaction\\r\\n // @param _adapterParams - parameters for custom functionality. e.g. receive airdropped native gas from the relayer on destination\\r\\n function send(uint16 _dstChainId, bytes calldata _destination, bytes calldata _payload, address payable _refundAddress, address _zroPaymentAddress, bytes calldata _adapterParams) external payable;\\r\\n\\r\\n // @notice used by the messaging library to publish verified payload\\r\\n // @param _srcChainId - the source chain identifier\\r\\n // @param _srcAddress - the source contract (as bytes) at the source chain\\r\\n // @param _dstAddress - the address on destination chain\\r\\n // @param _nonce - the unbound message ordering nonce\\r\\n // @param _gasLimit - the gas limit for external contract execution\\r\\n // @param _payload - verified payload to send to the destination contract\\r\\n function receivePayload(uint16 _srcChainId, bytes calldata _srcAddress, address _dstAddress, uint64 _nonce, uint _gasLimit, bytes calldata _payload) external;\\r\\n\\r\\n // @notice get the inboundNonce of a receiver from a source chain which could be EVM or non-EVM chain\\r\\n // @param _srcChainId - the source chain identifier\\r\\n // @param _srcAddress - the source chain contract address\\r\\n function getInboundNonce(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (uint64);\\r\\n\\r\\n // @notice get the outboundNonce from this source chain which, consequently, is always an EVM\\r\\n // @param _srcAddress - the source chain contract address\\r\\n function getOutboundNonce(uint16 _dstChainId, address _srcAddress) external view returns (uint64);\\r\\n\\r\\n // @notice gets a quote in source native gas, for the amount that send() requires to pay for message delivery\\r\\n // @param _dstChainId - the destination chain identifier\\r\\n // @param _userApplication - the user app address on this EVM chain\\r\\n // @param _payload - the custom message to send over LayerZero\\r\\n // @param _payInZRO - if false, user app pays the protocol fee in native token\\r\\n // @param _adapterParam - parameters for the adapter service, e.g. send some dust native token to dstChain\\r\\n function estimateFees(uint16 _dstChainId, address _userApplication, bytes calldata _payload, bool _payInZRO, bytes calldata _adapterParam) external view returns (uint nativeFee, uint zroFee);\\r\\n\\r\\n // @notice get this Endpoint's immutable source identifier\\r\\n function getChainId() external view returns (uint16);\\r\\n\\r\\n // @notice the interface to retry failed message on this Endpoint destination\\r\\n // @param _srcChainId - the source chain identifier\\r\\n // @param _srcAddress - the source chain contract address\\r\\n // @param _payload - the payload to be retried\\r\\n function retryPayload(uint16 _srcChainId, bytes calldata _srcAddress, bytes calldata _payload) external;\\r\\n\\r\\n // @notice query if any STORED payload (message blocking) at the endpoint.\\r\\n // @param _srcChainId - the source chain identifier\\r\\n // @param _srcAddress - the source chain contract address\\r\\n function hasStoredPayload(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (bool);\\r\\n\\r\\n // @notice query if the _libraryAddress is valid for sending msgs.\\r\\n // @param _userApplication - the user app address on this EVM chain\\r\\n function getSendLibraryAddress(address _userApplication) external view returns (address);\\r\\n\\r\\n // @notice query if the _libraryAddress is valid for receiving msgs.\\r\\n // @param _userApplication - the user app address on this EVM chain\\r\\n function getReceiveLibraryAddress(address _userApplication) external view returns (address);\\r\\n\\r\\n // @notice query if the non-reentrancy guard for send() is on\\r\\n // @return true if the guard is on. false otherwise\\r\\n function isSendingPayload() external view returns (bool);\\r\\n\\r\\n // @notice query if the non-reentrancy guard for receive() is on\\r\\n // @return true if the guard is on. false otherwise\\r\\n function isReceivingPayload() external view returns (bool);\\r\\n\\r\\n // @notice get the configuration of the LayerZero messaging library of the specified version\\r\\n // @param _version - messaging library version\\r\\n // @param _chainId - the chainId for the pending config change\\r\\n // @param _userApplication - the contract address of the user application\\r\\n // @param _configType - type of configuration. every messaging library has its own convention.\\r\\n function getConfig(uint16 _version, uint16 _chainId, address _userApplication, uint _configType) external view returns (bytes memory);\\r\\n\\r\\n // @notice get the send() LayerZero messaging library version\\r\\n // @param _userApplication - the contract address of the user application\\r\\n function getSendVersion(address _userApplication) external view returns (uint16);\\r\\n\\r\\n // @notice get the lzReceive() LayerZero messaging library version\\r\\n // @param _userApplication - the contract address of the user application\\r\\n function getReceiveVersion(address _userApplication) external view returns (uint16);\\r\\n}\\r\\n\",\"keccak256\":\"0x5304d445f73fc334336fb88caa0eec207e238df582485799828fe2b100bd8343\",\"license\":\"BUSL-1.1\"},\"contracts/interfaces/ILayerZeroReceiver.sol\":{\"content\":\"// SPDX-License-Identifier: BUSL-1.1\\r\\n\\r\\npragma solidity >=0.5.0;\\r\\n\\r\\ninterface ILayerZeroReceiver {\\r\\n // @notice LayerZero endpoint will invoke this function to deliver the message on the destination\\r\\n // @param _srcChainId - the source endpoint identifier\\r\\n // @param _srcAddress - the source sending contract address from the source chain\\r\\n // @param _nonce - the ordered message nonce\\r\\n // @param _payload - the signed payload is the UA bytes has encoded to be sent\\r\\n function lzReceive(uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes calldata _payload) external;\\r\\n}\\r\\n\",\"keccak256\":\"0xada017f02be5d557d1c8a1c89c972bf59799f82c418fe5e9a4de370f2fc9c1c1\",\"license\":\"BUSL-1.1\"},\"contracts/interfaces/ILayerZeroUserApplicationConfig.sol\":{\"content\":\"// SPDX-License-Identifier: BUSL-1.1\\r\\n\\r\\npragma solidity >=0.5.0;\\r\\n\\r\\ninterface ILayerZeroUserApplicationConfig {\\r\\n // @notice set the configuration of the LayerZero messaging library of the specified version\\r\\n // @param _version - messaging library version\\r\\n // @param _chainId - the chainId for the pending config change\\r\\n // @param _configType - type of configuration. every messaging library has its own convention.\\r\\n // @param _config - configuration in the bytes. can encode arbitrary content.\\r\\n function setConfig(uint16 _version, uint16 _chainId, uint _configType, bytes calldata _config) external;\\r\\n\\r\\n // @notice set the send() LayerZero messaging library version to _version\\r\\n // @param _version - new messaging library version\\r\\n function setSendVersion(uint16 _version) external;\\r\\n\\r\\n // @notice set the lzReceive() LayerZero messaging library version to _version\\r\\n // @param _version - new messaging library version\\r\\n function setReceiveVersion(uint16 _version) external;\\r\\n\\r\\n // @notice Only when the UA needs to resume the message flow in blocking mode and clear the stored payload\\r\\n // @param _srcChainId - the chainId of the source chain\\r\\n // @param _srcAddress - the contract address of the source contract at the source chain\\r\\n function forceResumeReceive(uint16 _srcChainId, bytes calldata _srcAddress) external;\\r\\n}\\r\\n\",\"keccak256\":\"0x3f6707ec8829588ae4eb629ca952b9b019532ce47aa01aad48bcdf9d03c72bac\",\"license\":\"BUSL-1.1\"},\"contracts/interfaces/IMirrorgateFeeLibrary.sol\":{\"content\":\"// SPDX-License-Identifier: BUSL-1.1\\r\\n\\r\\npragma solidity ^0.7.6;\\r\\npragma abicoder v2;\\r\\nimport \\\"../Pool.sol\\\";\\r\\n\\r\\ninterface IMirrorgateFeeLibrary {\\r\\n function getFees(\\r\\n uint256 _srcPoolId,\\r\\n uint256 _dstPoolId,\\r\\n uint16 _dstChainId,\\r\\n address _from,\\r\\n uint256 _amountSD\\r\\n ) external returns (Pool.SwapObj memory s);\\r\\n\\r\\n function getVersion() external view returns (string memory);\\r\\n}\\r\\n\",\"keccak256\":\"0x1d89dcbe8d20534fac363a1c8542ca4a5223afc0efb8fbfa56fba9acbdd1cbd8\",\"license\":\"BUSL-1.1\"},\"contracts/interfaces/IMirrorgateReceiver.sol\":{\"content\":\"// SPDX-License-Identifier: BUSL-1.1\\r\\n\\r\\npragma solidity 0.7.6;\\r\\n\\r\\ninterface IMirrorgateReceiver {\\r\\n function mgReceive(\\r\\n uint16 _chainId,\\r\\n bytes memory _srcAddress,\\r\\n uint256 _nonce,\\r\\n address _token,\\r\\n uint256 amountLD,\\r\\n bytes memory payload\\r\\n ) external;\\r\\n}\\r\\n\",\"keccak256\":\"0x57542973bc0d314aea655a36d63ca9533f4bc55fcde6cf4a1f1b681db27cda0e\",\"license\":\"BUSL-1.1\"},\"contracts/interfaces/IMirrorgateRouter.sol\":{\"content\":\"// SPDX-License-Identifier: BUSL-1.1\\r\\n\\r\\npragma solidity 0.7.6;\\r\\npragma abicoder v2;\\r\\n\\r\\ninterface IMirrorgateRouter {\\r\\n struct lzTxObj {\\r\\n uint256 dstGasForCall;\\r\\n uint256 dstNativeAmount;\\r\\n bytes dstNativeAddr;\\r\\n }\\r\\n\\r\\n function addLiquidity(\\r\\n uint256 _poolId,\\r\\n uint256 _amountLD,\\r\\n address _to\\r\\n ) external;\\r\\n\\r\\n function swap(\\r\\n uint16 _dstChainId,\\r\\n uint256 _srcPoolId,\\r\\n uint256 _dstPoolId,\\r\\n address payable _refundAddress,\\r\\n uint256 _amountLD,\\r\\n uint256 _minAmountLD,\\r\\n lzTxObj memory _lzTxParams,\\r\\n bytes calldata _to,\\r\\n bytes calldata _payload\\r\\n ) external payable;\\r\\n\\r\\n function redeemRemote(\\r\\n uint16 _dstChainId,\\r\\n uint256 _srcPoolId,\\r\\n uint256 _dstPoolId,\\r\\n address payable _refundAddress,\\r\\n uint256 _amountLP,\\r\\n uint256 _minAmountLD,\\r\\n bytes calldata _to,\\r\\n lzTxObj memory _lzTxParams\\r\\n ) external payable;\\r\\n\\r\\n function instantRedeemLocal(\\r\\n uint16 _srcPoolId,\\r\\n uint256 _amountLP,\\r\\n address _to\\r\\n ) external returns (uint256);\\r\\n\\r\\n function redeemLocal(\\r\\n uint16 _dstChainId,\\r\\n uint256 _srcPoolId,\\r\\n uint256 _dstPoolId,\\r\\n address payable _refundAddress,\\r\\n uint256 _amountLP,\\r\\n bytes calldata _to,\\r\\n lzTxObj memory _lzTxParams\\r\\n ) external payable;\\r\\n\\r\\n function sendCredits(\\r\\n uint16 _dstChainId,\\r\\n uint256 _srcPoolId,\\r\\n uint256 _dstPoolId,\\r\\n address payable _refundAddress\\r\\n ) external payable;\\r\\n\\r\\n function quoteLayerZeroFee(\\r\\n uint16 _dstChainId,\\r\\n uint8 _functionType,\\r\\n bytes calldata _toAddress,\\r\\n bytes calldata _transferAndCallPayload,\\r\\n lzTxObj memory _lzTxParams\\r\\n ) external view returns (uint256, uint256);\\r\\n}\\r\\n\",\"keccak256\":\"0x46cf8167a09621589cb2c56caeacf0bf31473dfa4acde15d73fb71a9cdf13f4e\",\"license\":\"BUSL-1.1\"}},\"version\":1}",
- "bytecode": "0x60806040523480156200001157600080fd5b5060006200001e62000072565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506001805562000076565b3390565b6151d180620000866000396000f3fe60806040526004361061021a5760003560e01c806387b21efc11610123578063c45a0155116100ab578063cefbdde21161006f578063cefbdde2146105dd578063da133a06146105fd578063e78cea921461062a578063f2fde38b1461063f578063fba6e2801461065f5761021a565b8063c45a01551461053b578063c4de93a514610550578063c6a276241461057d578063c7d968e31461059d578063c8adf12d146105bd5761021a565b80639ba3aa74116100f25780639ba3aa74146104cb5780639fbf10fc146104de578063a18fa804146104f1578063a96fbed414610511578063af640d82146105265761021a565b806387b21efc146104635780638da5cb5b146104835780638f2e1d181461049857806398e391a1146104ab5761021a565b806343a30630116101a6578063715018a611610175578063715018a6146103ce5780637af935a1146103e35780637b84d287146104105780637f7212981461043057806384d0dba3146104505761021a565b806343a30630146103685780635500585c1461038857806360a3b95c146103a85780636a7982da146103bb5761021a565b806323fd4647116101ed57806323fd4647146102b85780632f925555146102e857806334aba41014610308578063403a9f7a14610328578063424c9119146103485761021a565b80630403bce51461021f5780630a512369146102415780630b78f9c01461027857806316fb60f514610298575b600080fd5b34801561022b57600080fd5b5061023f61023a366004613af8565b61067f565b005b34801561024d57600080fd5b5061026161025c366004613ebb565b6108eb565b60405161026f929190614f34565b60405180910390f35b34801561028457600080fd5b5061023f610293366004614179565b61098b565b3480156102a457600080fd5b5061023f6102b336600461413f565b610a5e565b3480156102c457600080fd5b506102d86102d33660046138f5565b610b2c565b60405161026f94939291906144c9565b3480156102f457600080fd5b5061023f6103033660046139d7565b610c0b565b34801561031457600080fd5b5061023f61032336600461371d565b610c46565b34801561033457600080fd5b5061023f61034336600461380b565b610cf0565b34801561035457600080fd5b5061023f610363366004613771565b610f23565b34801561037457600080fd5b5061023f610383366004614060565b61103d565b34801561039457600080fd5b5061023f6103a3366004613f85565b61111c565b61023f6103b636600461380b565b611180565b61023f6103c9366004613862565b6113fd565b3480156103da57600080fd5b5061023f6116ae565b3480156103ef57600080fd5b506104036103fe366004613fa9565b61175a565b60405161026f9190614411565b34801561041c57600080fd5b5061023f61042b3660046140fa565b61187d565b34801561043c57600080fd5b5061023f61044b366004613949565b61191d565b61023f61045e366004613cc0565b611961565b34801561046f57600080fd5b5061023f61047e3660046141bd565b611c96565b34801561048f57600080fd5b50610403611e81565b61023f6104a6366004613c1b565b611e90565b3480156104b757600080fd5b5061023f6104c636600461403c565b6120b1565b61023f6104d9366004613bd4565b61214d565b61023f6104ec366004613d5f565b6122c5565b3480156104fd57600080fd5b5061023f61050c366004613e3f565b61261a565b34801561051d57600080fd5b50610403612682565b34801561053257600080fd5b50610403612691565b34801561054757600080fd5b506104036126a0565b34801561055c57600080fd5b5061057061056b366004613b95565b6126af565b60405161026f9190614ede565b34801561058957600080fd5b5061023f610598366004613f85565b6127ba565b3480156105a957600080fd5b5061023f6105b83660046140c6565b612856565b3480156105c957600080fd5b5061023f6105d8366004613f85565b612922565b3480156105e957600080fd5b5061023f6105f836600461371d565b612986565b34801561060957600080fd5b5061061d6106183660046138f5565b612a30565b60405161026f9190614530565b34801561063657600080fd5b50610403612aed565b34801561064b57600080fd5b5061023f61065a36600461371d565b612afc565b34801561066b57600080fd5b5061023f61067a36600461403c565b612bfe565b6005546001600160a01b031633146106b25760405162461bcd60e51b81526004016106a990614584565b60405180910390fd5b60006106bd85612c38565b604051637544f15560e11b81529091506001600160a01b0382169063ea89e2aa906106f0908c908a908990600401614c34565b6040805180830381600087803b15801561070957600080fd5b505af1925050508015610739575060408051601f3d908101601f191682019092526107369181019061419a565b60015b6108025760018686600087878760405160200161075c9796959493929190614faf565b60408051601f1981840301815282825261ffff8c166000908152600660205291909120909161078c908b906143f5565b9081526020016040518091039020600089815260200190815260200160002090805190602001906107be929190613495565b507fa5d2ba6de30cc2f2e91c5a29ba66b148c27826954217e2f67cb8983541da21cf60018a8a8a6040516107f59493929190614f42565b60405180910390a16108e0565b60018888848489896040516020016108209796959493929190615036565b60408051601f1981840301815282825261ffff8e1660009081526006602052919091209091610850908d906143f5565b908152602001604051809103902060008b81526020019081526020016000209080519060200190610882929190613495565b508960405161089191906143f5565b6040518091039020897f6ace246fa15cf1d5decabf654b1e8581a4422e0fcf4c1ed4bf83f41687caec198d8b8b8a8a89896040516108d59796959493929190614e50565b60405180910390a350505b505050505050505050565b600554604051630a51236960e01b815260009182916001600160a01b0390911690630a5123699061092c908c908c908c908c908c908c908c90600401614e90565b604080518083038186803b15801561094357600080fd5b505afa158015610957573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097b919061419a565b9150915097509795505050505050565b610993612ce6565b6001600160a01b03166109a4611e81565b6001600160a01b0316146109ed576040805162461bcd60e51b8152602060048201819052602482015260008051602061517c833981519152604482015290519081900360640190fd5b60006109f883612c38565b6040516369fe0e2d60e01b81529091506001600160a01b038216906369fe0e2d90610a27908590600401614ede565b600060405180830381600087803b158015610a4157600080fd5b505af1158015610a55573d6000803e3d6000fd5b50505050505050565b610a66612ce6565b6001600160a01b0316610a77611e81565b6001600160a01b031614610ac0576040805162461bcd60e51b8152602060048201819052602482015260008051602061517c833981519152604482015290519081900360640190fd5b6000610acb85612c38565b6040516320d6bc7560e01b81529091506001600160a01b038216906320d6bc7590610afe90879087908790600401614c34565b600060405180830381600087803b158015610b1857600080fd5b505af11580156108e0573d6000803e3d6000fd5b600760209081526000938452604080852084518086018401805192815290840195840195909520945292815290835291819020805460018083015460028085015460038601805488516101009682161596909602600019011692909204601f81018990048902850189019097528684526001600160a01b03948516979296941694939091830182828015610c015780601f10610bd657610100808354040283529160200191610c01565b820191906000526020600020905b815481529060010190602001808311610be457829003601f168201915b5050505050905084565b6005546001600160a01b03163314610c355760405162461bcd60e51b81526004016106a990614584565b6108e0898989898989898989612cea565b610c4e612ce6565b6001600160a01b0316610c5f611e81565b6001600160a01b031614610ca8576040805162461bcd60e51b8152602060048201819052602482015260008051602061517c833981519152604482015290519081900360640190fd5b6001600160a01b038116610cce5760405162461bcd60e51b81526004016106a9906146a7565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b61ffff84166000908152600760205260408082209051610d1390869086906143e5565b9081526040805160209281900383018120600086815290845282902060808201835280546001600160a01b039081168352600180830154868501526002808401549092168486015260038301805486516101009382161593909302600019011692909204601f810187900487028201870190955284815292949193606086019392830182828015610de55780601f10610dba57610100808354040283529160200191610de5565b820191906000526020600020905b815481529060010190602001808311610dc857829003601f168201915b5050509190925250505060408101519091506001600160a01b0316610e1c5760405162461bcd60e51b81526004016106a99061471d565b604080516080810182526000808252602080830182905282840182905283518082018552828152606084015261ffff89168252600790528290209151909190610e6890879087906143e5565b90815260408051602092819003830190206000868152908352819020835181546001600160a01b03199081166001600160a01b0392831617835585850151600184015592850151600283018054909416911617909155606083015180519192610ed992600385019290910190613495565b5050506040808201518251602084015160608501519351630f3e496f60e01b81526001600160a01b0390931693630f3e496f93610afe938b938b938b938b939291906004016149e8565b610f2b612ce6565b6001600160a01b0316610f3c611e81565b6001600160a01b031614610f85576040805162461bcd60e51b8152602060048201819052602482015260008051602061517c833981519152604482015290519081900360640190fd5b6005546001600160a01b0316158015610fa757506002546001600160a01b0316155b610fc35760405162461bcd60e51b81526004016106a9906148df565b6001600160a01b038216610fe95760405162461bcd60e51b81526004016106a9906145bb565b6001600160a01b03811661100f5760405162461bcd60e51b81526004016106a99061475e565b600580546001600160a01b039384166001600160a01b03199182161790915560028054929093169116179055565b611045612ce6565b6001600160a01b0316611056611e81565b6001600160a01b03161461109f576040805162461bcd60e51b8152602060048201819052602482015260008051602061517c833981519152604482015290519081900360640190fd5b60006110aa87612c38565b60405163e065608b60e01b81529091506001600160a01b0382169063e065608b906110e19089908990899089908990600401614507565b600060405180830381600087803b1580156110fb57600080fd5b505af115801561110f573d6000803e3d6000fd5b5050505050505050505050565b6004546001600160a01b031633146111465760405162461bcd60e51b81526004016106a9906148a8565b600061115183612c38565b60405163011dbbf960e61b81529091506001600160a01b0382169063476efe4090610a27908590600401614411565b61ffff841660009081526006602052604080822090516111a390869086906143e5565b90815260408051602092819003830181206000868152908452829020805460026001821615610100026000190190911604601f8101859004850283018501909352828252909290919083018282801561123d5780601f106112125761010080835404028352916020019161123d565b820191906000526020600020905b81548152906001019060200180831161122057829003601f168201915b5050505050905060008151116112655760405162461bcd60e51b81526004016106a990614966565b6040805160208082018352600080835261ffff891681526006909152829020915190919061129690879087906143e5565b9081526020016040518091039020600084815260200190815260200160002090805190602001906112c8929190613495565b50602081015160ff811660021415611353576000806000806000868060200190518101906112f691906141ea565b95509550955095509550506113498b8b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508d92508a9150899050888888613152565b50505050506113f5565b60ff8116600314156113dd576000806000806000808780602001905181019061137c9190614249565b965096509650965096509650506113d28c8c8c8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508e92508b91508a905089898989612cea565b5050505050506113f5565b60405162461bcd60e51b81526004016106a990614543565b505050505050565b6001600160a01b0382166114235760405162461bcd60e51b81526004016106a99061481d565b61ffff8616600090815260066020526040808220905161144690889088906143e5565b90815260408051602092819003830181206000888152908452829020805460026001821615610100026000190190911604601f810185900485028301850190935282825290929091908301828280156114e05780601f106114b5576101008083540402835291602001916114e0565b820191906000526020600020905b8154815290600101906020018083116114c357829003601f168201915b5050505050905060008151116115085760405162461bcd60e51b81526004016106a990614966565b602081015160ff81166001146115305760405162461bcd60e51b81526004016106a990614543565b506040805160208082018352600080835261ffff8b1681526006909152829020915190919061156290899089906143e5565b908152602001604051809103902060008681526020019081526020016000209080519060200190611594929190613495565b50604081015160608201516115a7613521565b60006115b283612c38565b604051630474ec6160e11b81529091506001600160a01b038216906308e9d8c2906115e3908e908890600401614b16565b6040805180830381600087803b1580156115fc57600080fd5b505af1158015611610573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061163491906137a9565b6005546040516396aae4af60e01b81529193506001600160a01b031691506396aae4af903490611670908e908b9087908c908c9060040161499d565b6000604051808303818588803b15801561168957600080fd5b505af115801561169d573d6000803e3d6000fd5b505050505050505050505050505050565b6116b6612ce6565b6001600160a01b03166116c7611e81565b6001600160a01b031614611710576040805162461bcd60e51b8152602060048201819052602482015260008051602061517c833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000611764612ce6565b6001600160a01b0316611775611e81565b6001600160a01b0316146117be576040805162461bcd60e51b8152602060048201819052602482015260008051602061517c833981519152604482015290519081900360640190fd5b6001600160a01b0386166117e45760405162461bcd60e51b81526004016106a990614931565b600254604051637af935a160e01b81526001600160a01b0390911690637af935a19061181e908a908a908a908a908a908a90600401614ee7565b602060405180830381600087803b15801561183857600080fd5b505af115801561184c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118709190613739565b90505b9695505050505050565b611885612ce6565b6001600160a01b0316611896611e81565b6001600160a01b0316146118df576040805162461bcd60e51b8152602060048201819052602482015260008051602061517c833981519152604482015290519081900360640190fd5b60006118ea85612c38565b60405163a985565f60e01b81529091506001600160a01b0382169063a985565f90610afe90879087908790600401614c16565b6005546001600160a01b031633146119475760405162461bcd60e51b81526004016106a990614584565b6119578888888888888888613152565b5050505050505050565b600260015414156119a7576040805162461bcd60e51b815260206004820152601f6024820152600080516020615115833981519152604482015290519081900360640190fd5b60026001556001600160a01b0386166119d25760405162461bcd60e51b81526004016106a99061481d565b600085116119f25760405162461bcd60e51b81526004016106a99061465e565b6119fa61353b565b611a02613521565b6000611a0d8b612c38565b90506000816001600160a01b031663f6cd35ee8a6040518263ffffffff1660e01b8152600401611a3d9190614ede565b60206040518083038186803b158015611a5557600080fd5b505afa158015611a69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a8d9190613f6d565b9050816001600160a01b0316631b7319b68e8d33858d60006040518763ffffffff1660e01b8152600401611ac696959493929190614b54565b60c060405180830381600087803b158015611ae057600080fd5b505af1158015611af4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b1891906137f0565b9350816001600160a01b0316637298a5dc8e8d338d6040518563ffffffff1660e01b8152600401611b4c9493929190614b2a565b600060405180830381600087803b158015611b6657600080fd5b505af1158015611b7a573d6000803e3d6000fd5b50505050816001600160a01b03166308e9d8c28e8d6040518363ffffffff1660e01b8152600401611bac929190614b16565b6040805180830381600087803b158015611bc557600080fd5b505af1158015611bd9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bfd91906137a9565b92505050600560009054906101000a90046001600160a01b03166001600160a01b03166351156e73348d8d8d8d87898b8e8e6040518b63ffffffff1660e01b8152600401611c5399989796959493929190614d19565b6000604051808303818588803b158015611c6c57600080fd5b505af1158015611c80573d6000803e3d6000fd5b5050600180555050505050505050505050505050565b60026001541415611cdc576040805162461bcd60e51b815260206004820152601f6024820152600080516020615115833981519152604482015290519081900360640190fd5b60026001556000611cec84612c38565b90506000816001600160a01b031663feb56b156040518163ffffffff1660e01b815260040160206040518083038186803b158015611d2957600080fd5b505afa158015611d3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d619190613f6d565b9050611d7781611d7186826132e4565b9061334d565b9350611df5826001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b158015611db557600080fd5b505afa158015611dc9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ded9190613739565b3384876133ad565b6040516340c10f1960e01b81526001600160a01b038316906340c10f1990611e2390869088906004016144b0565b602060405180830381600087803b158015611e3d57600080fd5b505af1158015611e51573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e759190613f6d565b50506001805550505050565b6000546001600160a01b031690565b60026001541415611ed6576040805162461bcd60e51b815260206004820152601f6024820152600080516020615115833981519152604482015290519081900360640190fd5b60026001556001600160a01b038516611f015760405162461bcd60e51b81526004016106a99061481d565b6000611f0c88612c38565b905060008511611f2e5760405162461bcd60e51b81526004016106a990614865565b604051632c3eac2f60e21b81526000906001600160a01b0383169063b0fab0bc90611f679033908a908f908e908c908c90600401614448565b602060405180830381600087803b158015611f8157600080fd5b505af1158015611f95573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fb99190613f6d565b905060008111611fdb5760405162461bcd60e51b81526004016106a9906147cc565b604051630474ec6160e11b81526000906001600160a01b038416906308e9d8c29061200c908e908d90600401614b16565b6040805180830381600087803b15801561202557600080fd5b505af1158015612039573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061205d91906137a9565b9050600560009054906101000a90046001600160a01b03166001600160a01b0316633cef94b9348d8d8d8d87898e8e8e6040518b63ffffffff1660e01b8152600401611c5399989796959493929190614da5565b6120b9612ce6565b6001600160a01b03166120ca611e81565b6001600160a01b031614612113576040805162461bcd60e51b8152602060048201819052602482015260008051602061517c833981519152604482015290519081900360640190fd5b600061211e83612c38565b60405163ac2cc36b60e01b81529091506001600160a01b0382169063ac2cc36b90610a279085906004016144fc565b60026001541415612193576040805162461bcd60e51b815260206004820152601f6024820152600080516020615115833981519152604482015290519081900360640190fd5b60026001556001600160a01b0381166121be5760405162461bcd60e51b81526004016106a99061481d565b60006121c984612c38565b90506000816001600160a01b03166308e9d8c287866040518363ffffffff1660e01b81526004016121fb929190614b16565b6040805180830381600087803b15801561221457600080fd5b505af1158015612228573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061224c91906137a9565b600554604051632fa7502b60e21b81529192506001600160a01b03169063be9d40ac903490612287908a908a908a908a908990600401614c50565b6000604051808303818588803b1580156122a057600080fd5b505af11580156122b4573d6000803e3d6000fd5b505060018055505050505050505050565b6002600154141561230b576040805162461bcd60e51b815260206004820152601f6024820152600080516020615115833981519152604482015290519081900360640190fd5b60026001558661232d5760405162461bcd60e51b81526004016106a9906145f2565b6001600160a01b0388166123535760405162461bcd60e51b81526004016106a99061481d565b61235b61353b565b612363613521565b600061236e8d612c38565b90506000816001600160a01b031663feb56b156040518163ffffffff1660e01b815260040160206040518083038186803b1580156123ab57600080fd5b505afa1580156123bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123e39190613f6d565b90506123f381611d718d826132e4565b9a5050806001600160a01b0316631b7319b68f8e338e8e60016040518763ffffffff1660e01b815260040161242d96959493929190614b54565b60c060405180830381600087803b15801561244757600080fd5b505af115801561245b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061247f91906137f0565b92506124fd816001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156124bd57600080fd5b505afa1580156124d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124f59190613739565b33838d6133ad565b806001600160a01b03166308e9d8c28f8e6040518363ffffffff1660e01b815260040161252b929190614b16565b6040805180830381600087803b15801561254457600080fd5b505af1158015612558573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061257c91906137a9565b915050600560009054906101000a90046001600160a01b03166001600160a01b03166351156e73348f8f8f8f87898f8f8f8f8f6040518d63ffffffff1660e01b81526004016125d59b9a99989796959493929190614c85565b6000604051808303818588803b1580156125ee57600080fd5b505af1158015612602573d6000803e3d6000fd5b50506001805550505050505050505050505050505050565b6005546001600160a01b031633146126445760405162461bcd60e51b81526004016106a990614584565b600061264f83612c38565b60405163b6addec760e01b81529091506001600160a01b0382169063b6addec790610afe90889088908790600401614bf7565b6003546001600160a01b031681565b6004546001600160a01b031681565b6002546001600160a01b031681565b6000600260015414156126f7576040805162461bcd60e51b815260206004820152601f6024820152600080516020615115833981519152604482015290519081900360640190fd5b6002600155826127195760405162461bcd60e51b81526004016106a990614865565b60006127288561ffff16612c38565b6040516304c35b0d60e11b81529091506001600160a01b03821690630986b61a9061275b90339088908890600401614425565b602060405180830381600087803b15801561277557600080fd5b505af1158015612789573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127ad9190613f6d565b6001805595945050505050565b6127c2612ce6565b6001600160a01b03166127d3611e81565b6001600160a01b03161461281c576040805162461bcd60e51b8152602060048201819052602482015260008051602061517c833981519152604482015290519081900360640190fd5b600061282783612c38565b6040516312d72b2f60e21b81529091506001600160a01b03821690634b5cacbc90610a27908590600401614411565b61285e612ce6565b6001600160a01b031661286f611e81565b6001600160a01b0316146128b8576040805162461bcd60e51b8152602060048201819052602482015260008051602061517c833981519152604482015290519081900360640190fd5b60006128c384612c38565b6040516345ec368560e11b81529091506001600160a01b03821690638bd86d0a906128f49086908690600401614b16565b600060405180830381600087803b15801561290e57600080fd5b505af1158015611957573d6000803e3d6000fd5b6003546001600160a01b0316331461294c5760405162461bcd60e51b81526004016106a9906146dc565b600061295783612c38565b604051632f8c40a560e21b81529091506001600160a01b0382169063be31029490610a27908590600401614411565b61298e612ce6565b6001600160a01b031661299f611e81565b6001600160a01b0316146129e8576040805162461bcd60e51b8152602060048201819052602482015260008051602061517c833981519152604482015290519081900360640190fd5b6001600160a01b038116612a0e5760405162461bcd60e51b81526004016106a9906146a7565b600480546001600160a01b0319166001600160a01b0392909216919091179055565b6006602090815260009384526040808520845180860184018051928152908401958401959095209452928152908352918190208054825160026001831615610100026000190190921691909104601f810185900485028201850190935282815292909190830182828015612ae55780601f10612aba57610100808354040283529160200191612ae5565b820191906000526020600020905b815481529060010190602001808311612ac857829003601f168201915b505050505081565b6005546001600160a01b031681565b612b04612ce6565b6001600160a01b0316612b15611e81565b6001600160a01b031614612b5e576040805162461bcd60e51b8152602060048201819052602482015260008051602061517c833981519152604482015290519081900360640190fd5b6001600160a01b038116612ba35760405162461bcd60e51b81526004018080602001828103825260268152602001806151356026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000612c0983612c38565b604051637fb6526560e01b81529091506001600160a01b03821690637fb6526590610a279085906004016144fc565b60025460405163068bcd8d60e01b81526000916001600160a01b03169063068bcd8d90612c69908590600401614ede565b60206040518083038186803b158015612c8157600080fd5b505afa158015612c95573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cb99190613739565b90506001600160a01b038116612ce15760405162461bcd60e51b81526004016106a990614795565b919050565b3390565b6000612cf586612c38565b60405163902b8ab760e01b81529091506001600160a01b0382169063902b8ab790612d2a908d908b9089908990600401614b8d565b602060405180830381600087803b158015612d4457600080fd5b505af1925050508015612d74575060408051601f3d908101601f19168201909252612d7191810190613f6d565b60015b612e3c576003878787878787604051602001612d969796959493929190614fe7565b60408051601f1981840301815282825261ffff8d1660009081526006602052919091209091612dc6908c906143f5565b908152602001604051809103902060008a81526020019081526020016000209080519060200190612df8929190613495565b507fa5d2ba6de30cc2f2e91c5a29ba66b148c27826954217e2f67cb8983541da21cf60038b8b8b604051612e2f9493929190614f42565b60405180910390a1613146565b82511561110f57846001600160a01b0316630f3e496f878d8d8d876001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b158015612e8f57600080fd5b505afa158015612ea3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ec79190613739565b878a6040518863ffffffff1660e01b8152600401612eea96959493929190614abd565b600060405180830381600088803b158015612f0457600080fd5b5087f193505050508015612f16575060015b61110f573d808015612f44576040519150601f19603f3d011682016040523d82523d6000602084013e612f49565b606091505b506040518060800160405280846001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b158015612f8e57600080fd5b505afa158015612fa2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fc69190613739565b6001600160a01b03168152602001838152602001876001600160a01b0316815260200185815250600760008e61ffff1661ffff1681526020019081526020016000208c60405161301691906143f5565b908152604080516020928190038301902060008e8152908352819020835181546001600160a01b03199081166001600160a01b039283161783558585015160018401559285015160028301805490941691161790915560608301518051919261308792600385019290910190613495565b509050507f8186389e97ff190cd5e17304ed8188a4a98a6c8add46e6df94462ac7f7e8dd348c8c8c866001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156130e857600080fd5b505afa1580156130fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131209190613739565b868b8a88604051613138989796959493929190614a43565b60405180910390a15061110f565b50505050505050505050565b600061315d85612c38565b604051632cc36bab60e21b81529091506001600160a01b0382169063b30daeac90613194908c908a90899089908990600401614bc5565b600060405180830381600087803b1580156131ae57600080fd5b505af19250505080156131bf575060015b61328157600286868686866040516020016131df96959493929190614f79565b60408051601f1981840301815282825261ffff8c166000908152600660205291909120909161320f908b906143f5565b908152602001604051809103902060008981526020019081526020016000209080519060200190613241929190613495565b507fa5d2ba6de30cc2f2e91c5a29ba66b148c27826954217e2f67cb8983541da21cf60028a8a8a6040516132789493929190614f42565b60405180910390a15b868860405161329091906143f5565b60405180910390207fc7379a02e530fbd0a46ea1ce6fd91987e96535798231a796bdc0e1a688a508738b89898989896040516132d196959493929190614e19565b60405180910390a3505050505050505050565b600080821161333a576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b81838161334357fe5b0490505b92915050565b60008261335c57506000613347565b8282028284828161336957fe5b04146133a65760405162461bcd60e51b815260040180806020018281038252602181526020018061515b6021913960400191505060405180910390fd5b9392505050565b600080856001600160a01b03166323b872dd8686866040516024016133d49392919061448c565b6040516020818303038152906040529060e01b6020820180516001600160e01b03838183161783525050505060405161340d91906143f5565b6000604051808303816000865af19150503d806000811461344a576040519150601f19603f3d011682016040523d82523d6000602084013e61344f565b606091505b50915091508180156134795750805115806134795750808060200190518101906134799190613755565b6113f55760405162461bcd60e51b81526004016106a990614629565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826134cb5760008555613511565b82601f106134e457805160ff1916838001178555613511565b82800160010185558215613511579182015b828111156135115782518255916020019190600101906134f6565b5061351d929150613571565b5090565b604051806040016040528060008152602001600081525090565b6040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b5b8082111561351d5760008155600101613572565b8035612ce1816150df565b60008083601f8401126135a2578182fd5b5081356001600160401b038111156135b8578182fd5b6020830191508360208285010111156135d057600080fd5b9250929050565b600082601f8301126135e7578081fd5b81356135fa6135f58261508e565b61506b565b81815284602083860101111561360e578283fd5b816020850160208301379081016020019190915292915050565b600060c08284031215613639578081fd5b60405160c081018181106001600160401b038211171561365557fe5b8060405250809150825181526020830151602082015260408301516040820152606083015160608201526080830151608082015260a083015160a08201525092915050565b6000606082840312156136ab578081fd5b604051606081016001600160401b0382821081831117156136c857fe5b81604052829350843583526020850135602084015260408501359150808211156136f157600080fd5b506136fe858286016135d7565b6040830152505092915050565b803561ffff81168114612ce157600080fd5b60006020828403121561372e578081fd5b81356133a6816150df565b60006020828403121561374a578081fd5b81516133a6816150df565b600060208284031215613766578081fd5b81516133a6816150f7565b60008060408385031215613783578081fd5b823561378e816150df565b9150602083013561379e816150df565b809150509250929050565b6000604082840312156137ba578081fd5b604051604081018181106001600160401b03821117156137d657fe5b604052825181526020928301519281019290925250919050565b600060c08284031215613801578081fd5b6133a68383613628565b60008060008060608587031215613820578182fd5b6138298561370b565b935060208501356001600160401b03811115613843578283fd5b61384f87828801613591565b9598909750949560400135949350505050565b60008060008060008060a0878903121561387a578384fd5b6138838761370b565b955060208701356001600160401b038082111561389e578586fd5b6138aa8a838b01613591565b909750955060408901359450606089013591506138c6826150df565b909250608088013590808211156138db578283fd5b506138e889828a0161369a565b9150509295509295509295565b600080600060608486031215613909578081fd5b6139128461370b565b925060208401356001600160401b0381111561392c578182fd5b613938868287016135d7565b925050604084013590509250925092565b600080600080600080600080610100898b031215613965578586fd5b61396e8961370b565b975060208901356001600160401b03811115613988578687fd5b6139948b828c016135d7565b97505060408901359550606089013594506080890135935060a08901356139ba816150df565b979a969950949793969295929450505060c08201359160e0013590565b6000806000806000806000806000898b036101c08112156139f6578384fd5b6139ff8b61370b565b995060208b01356001600160401b0380821115613a1a578586fd5b613a268e838f016135d7565b9a5060408d0135995060608d0135985060808d0135975060a08d0135965060c08d01359150613a54826150df565b81955060c060df1984011215613a68578384fd5b604051925060c0830191508282108183111715613a8157fe5b8160405260e08d013583526101008d013560208401526101208d013560408401526101408d013560608401526101608d013560808401526101808d013560a08401528294506101a08d0135925080831115613ada578384fd5b5050613ae88c828d016135d7565b9150509295985092959850929598565b60008060008060008060008060e0898b031215613b13578182fd5b613b1c8961370b565b975060208901356001600160401b0380821115613b37578384fd5b613b438c838d016135d7565b985060408b0135975060608b0135965060808b0135955060a08b0135945060c08b0135915080821115613b74578384fd5b50613b818b828c01613591565b999c989b5096995094979396929594505050565b600080600060608486031215613ba9578081fd5b613bb28461370b565b9250602084013591506040840135613bc9816150df565b809150509250925092565b60008060008060808587031215613be9578182fd5b613bf28561370b565b935060208501359250604085013591506060850135613c10816150df565b939692955090935050565b60008060008060008060008060e0898b031215613c36578182fd5b613c3f8961370b565b975060208901359650604089013595506060890135613c5d816150df565b94506080890135935060a08901356001600160401b0380821115613c7f578384fd5b613c8b8c838d01613591565b909550935060c08b0135915080821115613ca3578283fd5b50613cb08b828c0161369a565b9150509295985092959890939650565b60008060008060008060008060006101008a8c031215613cde578283fd5b613ce78a61370b565b985060208a0135975060408a0135965060608a0135613d05816150df565b955060808a0135945060a08a0135935060c08a01356001600160401b0380821115613d2e578485fd5b613d3a8d838e01613591565b909550935060e08c0135915080821115613d52578283fd5b50613ae88c828d0161369a565b60008060008060008060008060008060006101208c8e031215613d80578485fd5b613d898c61370b565b9a5060208c0135995060408c01359850613da560608d01613586565b975060808c0135965060a08c013595506001600160401b038060c08e01351115613dcd578586fd5b613ddd8e60c08f01358f0161369a565b95508060e08e01351115613def578283fd5b613dff8e60e08f01358f01613591565b90955093506101008d0135811015613e15578283fd5b50613e278d6101008e01358e01613591565b81935080925050509295989b509295989b9093969950565b60008060008084860360a0811215613e55578283fd5b613e5e8661370b565b9450602086013593506040808701359350605f1982011215613e7e578182fd5b50604051604081018181106001600160401b0382111715613e9b57fe5b604052606086013581526080909501356020860152509194909350909190565b600080600080600080600060a0888a031215613ed5578081fd5b613ede8861370b565b96506020880135613eee81615105565b955060408801356001600160401b0380821115613f09578283fd5b613f158b838c01613591565b909750955060608a0135915080821115613f2d578283fd5b613f398b838c01613591565b909550935060808a0135915080821115613f51578283fd5b50613f5e8a828b0161369a565b91505092959891949750929550565b600060208284031215613f7e578081fd5b5051919050565b60008060408385031215613f97578182fd5b82359150602083013561379e816150df565b60008060008060008060c08789031215613fc1578384fd5b863595506020870135613fd3816150df565b94506040870135613fe381615105565b93506060870135613ff381615105565b925060808701356001600160401b038082111561400e578384fd5b61401a8a838b016135d7565b935060a089013591508082111561402f578283fd5b506138e889828a016135d7565b6000806040838503121561404e578182fd5b82359150602083013561379e816150f7565b60008060008060008060c08789031215614078578384fd5b86359550602087013561408a816150f7565b9450604087013593506060870135925060808701356140a8816150f7565b915060a08701356140b8816150f7565b809150509295509295509295565b6000806000606084860312156140da578081fd5b833592506140ea6020850161370b565b9150604084013590509250925092565b6000806000806080858703121561410f578182fd5b8435935061411f6020860161370b565b9250604085013591506141346060860161370b565b905092959194509250565b60008060008060808587031215614154578182fd5b843593506141646020860161370b565b93969395505050506040820135916060013590565b6000806040838503121561418b578182fd5b50508035926020909101359150565b600080604083850312156141ac578182fd5b505080516020909101519092909150565b6000806000606084860312156141d1578081fd5b83359250602084013591506040840135613bc9816150df565b60008060008060008060c08789031215614202578384fd5b865161420d81615105565b809650506020870151945060408701519350606087015161422d816150df565b809350506080870151915060a087015190509295509295509295565b6000806000806000806000610180888a031215614264578081fd5b875161426f81615105565b809750506020880151955060408801519450606088015193506080880151614296816150df565b92506142a58960a08a01613628565b91506101608801516001600160401b038111156142c0578182fd5b8801601f81018a136142d0578182fd5b80516142de6135f58261508e565b8181528b60208385010111156142f2578384fd5b6143038260208301602086016150af565b80935050505092959891949750929550565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b600081518084526143578160208601602086016150af565b601f01601f19169290920160200192915050565b80518252602090810151910152565b805182526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a08301525050565b600081518352602082015160208401526040820151606060408501526143dd606085018261433f565b949350505050565b6000828483379101908152919050565b600082516144078184602087016150af565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0393841681526020810192909252909116604082015260600190565b600060018060a01b038816825286602083015261ffff8616604083015284606083015260a0608083015261448060a083018486614315565b98975050505050505050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b03858116825260208201859052831660408201526080606082018190526000906118739083018461433f565b901515815260200190565b941515855260208501939093526040840191909152151560608301521515608082015260a00190565b6000602082526133a6602083018461433f565b60208082526021908201527f4d6972726f72676174653a20696e76616c69642066756e6374696f6e207479706040820152606560f81b606082015260800190565b6020808252601e908201527f4272696467653a2063616c6c6572206d757374206265204272696467652e0000604082015260600190565b6020808252601e908201527f4d6972726f72676174653a206272696467652063616e74206265203078300000604082015260600190565b60208082526019908201527f4d6972726f72676174653a2063616e6e6f742073776170203000000000000000604082015260600190565b6020808252818101527f4d6972726f72676174653a205452414e534645525f46524f4d5f4641494c4544604082015260600190565b60208082526029908201527f4d6972726f72676174653a206e6f7420656e6f756768206c7020746f2072656460408201526865656d52656d6f746560b81b606082015260800190565b6020808252818101527f4d6972726f72676174653a205f6f776e65722063616e6e6f7420626520307830604082015260600190565b60208082526021908201527f4d6972726f72676174653a206f6e6c792070726f746f636f6c4665654f776e656040820152603960f91b606082015260800190565b60208082526021908201527f4d6972726f72676174653a20636163686520616c726561647920636c656172656040820152601960fa1b606082015260800190565b6020808252601f908201527f4d6972726f72676174653a20666163746f72792063616e742062652030783000604082015260600190565b6020808252601f908201527f4d6972726f72676174653a20506f6f6c20646f6573206e6f7420657869737400604082015260600190565b60208082526031908201527f4d6972726f72676174653a206e6f7420656e6f756768206c7020746f2072656460408201527019595b481dda5d1a08185b5bdd5b9d14d1607a1b606082015260800190565b60208082526028908201527f4d6972726f72676174653a205f726566756e64416464726573732063616e6e6f604082015267074206265203078360c41b606082015260800190565b60208082526023908201527f4d6972726f72676174653a206e6f7420656e6f756768206c7020746f2072656460408201526265656d60e81b606082015260800190565b6020808252601d908201527f4d6972726f72676174653a206f6e6c79206d696e744665654f776e6572000000604082015260600190565b60208082526032908201527f4d6972726f72676174653a2062726964676520616e6420666163746f727920616040820152711b1c9958591e481a5b9a5d1a585b1a5e995960721b606082015260800190565b6020808252818101527f4d6972726f72676174653a205f746f6b656e2063616e6e6f7420626520307830604082015260600190565b6020808252601b908201527f4d6972726f72676174653a206e6f207265747279207265766572740000000000604082015260600190565b61ffff861681526001600160a01b038516602082015260006149c2604083018661436b565b60c060808301526149d660c08301856143b4565b82810360a0840152614480818561433f565b600061ffff8916825260c06020830152614a0660c08301888a614315565b604083018790526001600160a01b03861660608401526080830185905282810360a0840152614a35818561433f565b9a9950505050505050505050565b600061010061ffff8b168352806020840152614a618184018b61433f565b604084018a90526001600160a01b03898116606086015260808501899052871660a085015283810360c08501529050614a9a818661433f565b905082810360e0840152614aae818561433f565b9b9a5050505050505050505050565b600061ffff8816825260c06020830152614ada60c083018861433f565b604083018790526001600160a01b03861660608401526080830185905282810360a0840152614b09818561433f565b9998505050505050505050565b61ffff929092168252602082015260400190565b61ffff94909416845260208401929092526001600160a01b03166040830152606082015260800190565b61ffff96909616865260208601949094526001600160a01b0392909216604085015260608401526080830152151560a082015260c00190565b61ffff85168152602081018490526001600160a01b03831660408201526101208101614bbc606083018461437a565b95945050505050565b61ffff95909516855260208501939093526001600160a01b039190911660408401526060830152608082015260a00190565b61ffff8416815260208101839052608081016143dd604083018461436b565b61ffff93841681526020810192909252909116604082015260600190565b61ffff9390931683526020830191909152604082015260600190565b61ffff8616815260208101859052604081018490526001600160a01b038316606082015260c08101611873608083018461436b565b61ffff8c168152602081018b9052604081018a90526001600160a01b038916606082015260006101e0614cbb608084018b61436b565b614cc860c084018a61437a565b80610180840152614cdb818401896143b4565b90508281036101a0840152614cf1818789614315565b90508281036101c0840152614d07818587614315565b9e9d5050505050505050505050505050565b61ffff8a16815260208101899052604081018890526001600160a01b038716606082015260006101e0614d4f608084018961436b565b614d5c60c084018861437a565b80610180840152614d6f818401876143b4565b90508281036101a0840152614d85818587614315565b8381036101c0909401939093525081526020019998505050505050505050565b61ffff8a16815260208101899052604081018890526001600160a01b03871660608201526000610120614ddb608084018961436b565b8660c08401528060e0840152614df48184018688614315565b9050828103610100840152614e0981856143b4565b9c9b505050505050505050505050565b61ffff969096168652602086019490945260408501929092526001600160a01b03166060840152608083015260a082015260c00190565b600061ffff8916825287602083015286604083015260c06060830152614e7a60c083018688614315565b60808301949094525060a0015295945050505050565b600061ffff8916825260ff8816602083015260a06040830152614eb760a083018789614315565b8281036060840152614eca818688614315565b90508281036080840152614a3581856143b4565b90815260200190565b8681526001600160a01b038616602082015260ff85811660408301528416606082015260c060808201819052600090614f229083018561433f565b82810360a0840152614b09818561433f565b918252602082015260400190565b600060ff8616825261ffff8516602083015260806040830152614f68608083018561433f565b905082606083015295945050505050565b60ff969096168652602086019490945260408501929092526001600160a01b03166060840152608083015260a082015260c00190565b600060ff8916825287602083015286604083015260ff8616606083015284608083015260c060a0830152614b0960c083018486614315565b60ff881681526020810187905260408101869052606081018590526001600160a01b0384166080820152600061018061502360a084018661437a565b80610160840152614a358184018561433f565b600060ff8916825287602083015286604083015285606083015284608083015260c060a0830152614b0960c083018486614315565b6040518181016001600160401b038111828210171561508657fe5b604052919050565b60006001600160401b038211156150a157fe5b50601f01601f191660200190565b60005b838110156150ca5781810151838201526020016150b2565b838111156150d9576000848401525b50505050565b6001600160a01b03811681146150f457600080fd5b50565b80151581146150f457600080fd5b60ff811681146150f457600080fdfe5265656e7472616e637947756172643a207265656e7472616e742063616c6c004f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a264697066735822122070229434c94745ad0d023bc840a0c4d8870c13a339bacbaaa7ae85e87e6efbec64736f6c63430007060033",
- "deployedBytecode": "0x60806040526004361061021a5760003560e01c806387b21efc11610123578063c45a0155116100ab578063cefbdde21161006f578063cefbdde2146105dd578063da133a06146105fd578063e78cea921461062a578063f2fde38b1461063f578063fba6e2801461065f5761021a565b8063c45a01551461053b578063c4de93a514610550578063c6a276241461057d578063c7d968e31461059d578063c8adf12d146105bd5761021a565b80639ba3aa74116100f25780639ba3aa74146104cb5780639fbf10fc146104de578063a18fa804146104f1578063a96fbed414610511578063af640d82146105265761021a565b806387b21efc146104635780638da5cb5b146104835780638f2e1d181461049857806398e391a1146104ab5761021a565b806343a30630116101a6578063715018a611610175578063715018a6146103ce5780637af935a1146103e35780637b84d287146104105780637f7212981461043057806384d0dba3146104505761021a565b806343a30630146103685780635500585c1461038857806360a3b95c146103a85780636a7982da146103bb5761021a565b806323fd4647116101ed57806323fd4647146102b85780632f925555146102e857806334aba41014610308578063403a9f7a14610328578063424c9119146103485761021a565b80630403bce51461021f5780630a512369146102415780630b78f9c01461027857806316fb60f514610298575b600080fd5b34801561022b57600080fd5b5061023f61023a366004613af8565b61067f565b005b34801561024d57600080fd5b5061026161025c366004613ebb565b6108eb565b60405161026f929190614f34565b60405180910390f35b34801561028457600080fd5b5061023f610293366004614179565b61098b565b3480156102a457600080fd5b5061023f6102b336600461413f565b610a5e565b3480156102c457600080fd5b506102d86102d33660046138f5565b610b2c565b60405161026f94939291906144c9565b3480156102f457600080fd5b5061023f6103033660046139d7565b610c0b565b34801561031457600080fd5b5061023f61032336600461371d565b610c46565b34801561033457600080fd5b5061023f61034336600461380b565b610cf0565b34801561035457600080fd5b5061023f610363366004613771565b610f23565b34801561037457600080fd5b5061023f610383366004614060565b61103d565b34801561039457600080fd5b5061023f6103a3366004613f85565b61111c565b61023f6103b636600461380b565b611180565b61023f6103c9366004613862565b6113fd565b3480156103da57600080fd5b5061023f6116ae565b3480156103ef57600080fd5b506104036103fe366004613fa9565b61175a565b60405161026f9190614411565b34801561041c57600080fd5b5061023f61042b3660046140fa565b61187d565b34801561043c57600080fd5b5061023f61044b366004613949565b61191d565b61023f61045e366004613cc0565b611961565b34801561046f57600080fd5b5061023f61047e3660046141bd565b611c96565b34801561048f57600080fd5b50610403611e81565b61023f6104a6366004613c1b565b611e90565b3480156104b757600080fd5b5061023f6104c636600461403c565b6120b1565b61023f6104d9366004613bd4565b61214d565b61023f6104ec366004613d5f565b6122c5565b3480156104fd57600080fd5b5061023f61050c366004613e3f565b61261a565b34801561051d57600080fd5b50610403612682565b34801561053257600080fd5b50610403612691565b34801561054757600080fd5b506104036126a0565b34801561055c57600080fd5b5061057061056b366004613b95565b6126af565b60405161026f9190614ede565b34801561058957600080fd5b5061023f610598366004613f85565b6127ba565b3480156105a957600080fd5b5061023f6105b83660046140c6565b612856565b3480156105c957600080fd5b5061023f6105d8366004613f85565b612922565b3480156105e957600080fd5b5061023f6105f836600461371d565b612986565b34801561060957600080fd5b5061061d6106183660046138f5565b612a30565b60405161026f9190614530565b34801561063657600080fd5b50610403612aed565b34801561064b57600080fd5b5061023f61065a36600461371d565b612afc565b34801561066b57600080fd5b5061023f61067a36600461403c565b612bfe565b6005546001600160a01b031633146106b25760405162461bcd60e51b81526004016106a990614584565b60405180910390fd5b60006106bd85612c38565b604051637544f15560e11b81529091506001600160a01b0382169063ea89e2aa906106f0908c908a908990600401614c34565b6040805180830381600087803b15801561070957600080fd5b505af1925050508015610739575060408051601f3d908101601f191682019092526107369181019061419a565b60015b6108025760018686600087878760405160200161075c9796959493929190614faf565b60408051601f1981840301815282825261ffff8c166000908152600660205291909120909161078c908b906143f5565b9081526020016040518091039020600089815260200190815260200160002090805190602001906107be929190613495565b507fa5d2ba6de30cc2f2e91c5a29ba66b148c27826954217e2f67cb8983541da21cf60018a8a8a6040516107f59493929190614f42565b60405180910390a16108e0565b60018888848489896040516020016108209796959493929190615036565b60408051601f1981840301815282825261ffff8e1660009081526006602052919091209091610850908d906143f5565b908152602001604051809103902060008b81526020019081526020016000209080519060200190610882929190613495565b508960405161089191906143f5565b6040518091039020897f6ace246fa15cf1d5decabf654b1e8581a4422e0fcf4c1ed4bf83f41687caec198d8b8b8a8a89896040516108d59796959493929190614e50565b60405180910390a350505b505050505050505050565b600554604051630a51236960e01b815260009182916001600160a01b0390911690630a5123699061092c908c908c908c908c908c908c908c90600401614e90565b604080518083038186803b15801561094357600080fd5b505afa158015610957573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097b919061419a565b9150915097509795505050505050565b610993612ce6565b6001600160a01b03166109a4611e81565b6001600160a01b0316146109ed576040805162461bcd60e51b8152602060048201819052602482015260008051602061517c833981519152604482015290519081900360640190fd5b60006109f883612c38565b6040516369fe0e2d60e01b81529091506001600160a01b038216906369fe0e2d90610a27908590600401614ede565b600060405180830381600087803b158015610a4157600080fd5b505af1158015610a55573d6000803e3d6000fd5b50505050505050565b610a66612ce6565b6001600160a01b0316610a77611e81565b6001600160a01b031614610ac0576040805162461bcd60e51b8152602060048201819052602482015260008051602061517c833981519152604482015290519081900360640190fd5b6000610acb85612c38565b6040516320d6bc7560e01b81529091506001600160a01b038216906320d6bc7590610afe90879087908790600401614c34565b600060405180830381600087803b158015610b1857600080fd5b505af11580156108e0573d6000803e3d6000fd5b600760209081526000938452604080852084518086018401805192815290840195840195909520945292815290835291819020805460018083015460028085015460038601805488516101009682161596909602600019011692909204601f81018990048902850189019097528684526001600160a01b03948516979296941694939091830182828015610c015780601f10610bd657610100808354040283529160200191610c01565b820191906000526020600020905b815481529060010190602001808311610be457829003601f168201915b5050505050905084565b6005546001600160a01b03163314610c355760405162461bcd60e51b81526004016106a990614584565b6108e0898989898989898989612cea565b610c4e612ce6565b6001600160a01b0316610c5f611e81565b6001600160a01b031614610ca8576040805162461bcd60e51b8152602060048201819052602482015260008051602061517c833981519152604482015290519081900360640190fd5b6001600160a01b038116610cce5760405162461bcd60e51b81526004016106a9906146a7565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b61ffff84166000908152600760205260408082209051610d1390869086906143e5565b9081526040805160209281900383018120600086815290845282902060808201835280546001600160a01b039081168352600180830154868501526002808401549092168486015260038301805486516101009382161593909302600019011692909204601f810187900487028201870190955284815292949193606086019392830182828015610de55780601f10610dba57610100808354040283529160200191610de5565b820191906000526020600020905b815481529060010190602001808311610dc857829003601f168201915b5050509190925250505060408101519091506001600160a01b0316610e1c5760405162461bcd60e51b81526004016106a99061471d565b604080516080810182526000808252602080830182905282840182905283518082018552828152606084015261ffff89168252600790528290209151909190610e6890879087906143e5565b90815260408051602092819003830190206000868152908352819020835181546001600160a01b03199081166001600160a01b0392831617835585850151600184015592850151600283018054909416911617909155606083015180519192610ed992600385019290910190613495565b5050506040808201518251602084015160608501519351630f3e496f60e01b81526001600160a01b0390931693630f3e496f93610afe938b938b938b938b939291906004016149e8565b610f2b612ce6565b6001600160a01b0316610f3c611e81565b6001600160a01b031614610f85576040805162461bcd60e51b8152602060048201819052602482015260008051602061517c833981519152604482015290519081900360640190fd5b6005546001600160a01b0316158015610fa757506002546001600160a01b0316155b610fc35760405162461bcd60e51b81526004016106a9906148df565b6001600160a01b038216610fe95760405162461bcd60e51b81526004016106a9906145bb565b6001600160a01b03811661100f5760405162461bcd60e51b81526004016106a99061475e565b600580546001600160a01b039384166001600160a01b03199182161790915560028054929093169116179055565b611045612ce6565b6001600160a01b0316611056611e81565b6001600160a01b03161461109f576040805162461bcd60e51b8152602060048201819052602482015260008051602061517c833981519152604482015290519081900360640190fd5b60006110aa87612c38565b60405163e065608b60e01b81529091506001600160a01b0382169063e065608b906110e19089908990899089908990600401614507565b600060405180830381600087803b1580156110fb57600080fd5b505af115801561110f573d6000803e3d6000fd5b5050505050505050505050565b6004546001600160a01b031633146111465760405162461bcd60e51b81526004016106a9906148a8565b600061115183612c38565b60405163011dbbf960e61b81529091506001600160a01b0382169063476efe4090610a27908590600401614411565b61ffff841660009081526006602052604080822090516111a390869086906143e5565b90815260408051602092819003830181206000868152908452829020805460026001821615610100026000190190911604601f8101859004850283018501909352828252909290919083018282801561123d5780601f106112125761010080835404028352916020019161123d565b820191906000526020600020905b81548152906001019060200180831161122057829003601f168201915b5050505050905060008151116112655760405162461bcd60e51b81526004016106a990614966565b6040805160208082018352600080835261ffff891681526006909152829020915190919061129690879087906143e5565b9081526020016040518091039020600084815260200190815260200160002090805190602001906112c8929190613495565b50602081015160ff811660021415611353576000806000806000868060200190518101906112f691906141ea565b95509550955095509550506113498b8b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508d92508a9150899050888888613152565b50505050506113f5565b60ff8116600314156113dd576000806000806000808780602001905181019061137c9190614249565b965096509650965096509650506113d28c8c8c8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508e92508b91508a905089898989612cea565b5050505050506113f5565b60405162461bcd60e51b81526004016106a990614543565b505050505050565b6001600160a01b0382166114235760405162461bcd60e51b81526004016106a99061481d565b61ffff8616600090815260066020526040808220905161144690889088906143e5565b90815260408051602092819003830181206000888152908452829020805460026001821615610100026000190190911604601f810185900485028301850190935282825290929091908301828280156114e05780601f106114b5576101008083540402835291602001916114e0565b820191906000526020600020905b8154815290600101906020018083116114c357829003601f168201915b5050505050905060008151116115085760405162461bcd60e51b81526004016106a990614966565b602081015160ff81166001146115305760405162461bcd60e51b81526004016106a990614543565b506040805160208082018352600080835261ffff8b1681526006909152829020915190919061156290899089906143e5565b908152602001604051809103902060008681526020019081526020016000209080519060200190611594929190613495565b50604081015160608201516115a7613521565b60006115b283612c38565b604051630474ec6160e11b81529091506001600160a01b038216906308e9d8c2906115e3908e908890600401614b16565b6040805180830381600087803b1580156115fc57600080fd5b505af1158015611610573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061163491906137a9565b6005546040516396aae4af60e01b81529193506001600160a01b031691506396aae4af903490611670908e908b9087908c908c9060040161499d565b6000604051808303818588803b15801561168957600080fd5b505af115801561169d573d6000803e3d6000fd5b505050505050505050505050505050565b6116b6612ce6565b6001600160a01b03166116c7611e81565b6001600160a01b031614611710576040805162461bcd60e51b8152602060048201819052602482015260008051602061517c833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000611764612ce6565b6001600160a01b0316611775611e81565b6001600160a01b0316146117be576040805162461bcd60e51b8152602060048201819052602482015260008051602061517c833981519152604482015290519081900360640190fd5b6001600160a01b0386166117e45760405162461bcd60e51b81526004016106a990614931565b600254604051637af935a160e01b81526001600160a01b0390911690637af935a19061181e908a908a908a908a908a908a90600401614ee7565b602060405180830381600087803b15801561183857600080fd5b505af115801561184c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118709190613739565b90505b9695505050505050565b611885612ce6565b6001600160a01b0316611896611e81565b6001600160a01b0316146118df576040805162461bcd60e51b8152602060048201819052602482015260008051602061517c833981519152604482015290519081900360640190fd5b60006118ea85612c38565b60405163a985565f60e01b81529091506001600160a01b0382169063a985565f90610afe90879087908790600401614c16565b6005546001600160a01b031633146119475760405162461bcd60e51b81526004016106a990614584565b6119578888888888888888613152565b5050505050505050565b600260015414156119a7576040805162461bcd60e51b815260206004820152601f6024820152600080516020615115833981519152604482015290519081900360640190fd5b60026001556001600160a01b0386166119d25760405162461bcd60e51b81526004016106a99061481d565b600085116119f25760405162461bcd60e51b81526004016106a99061465e565b6119fa61353b565b611a02613521565b6000611a0d8b612c38565b90506000816001600160a01b031663f6cd35ee8a6040518263ffffffff1660e01b8152600401611a3d9190614ede565b60206040518083038186803b158015611a5557600080fd5b505afa158015611a69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a8d9190613f6d565b9050816001600160a01b0316631b7319b68e8d33858d60006040518763ffffffff1660e01b8152600401611ac696959493929190614b54565b60c060405180830381600087803b158015611ae057600080fd5b505af1158015611af4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b1891906137f0565b9350816001600160a01b0316637298a5dc8e8d338d6040518563ffffffff1660e01b8152600401611b4c9493929190614b2a565b600060405180830381600087803b158015611b6657600080fd5b505af1158015611b7a573d6000803e3d6000fd5b50505050816001600160a01b03166308e9d8c28e8d6040518363ffffffff1660e01b8152600401611bac929190614b16565b6040805180830381600087803b158015611bc557600080fd5b505af1158015611bd9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bfd91906137a9565b92505050600560009054906101000a90046001600160a01b03166001600160a01b03166351156e73348d8d8d8d87898b8e8e6040518b63ffffffff1660e01b8152600401611c5399989796959493929190614d19565b6000604051808303818588803b158015611c6c57600080fd5b505af1158015611c80573d6000803e3d6000fd5b5050600180555050505050505050505050505050565b60026001541415611cdc576040805162461bcd60e51b815260206004820152601f6024820152600080516020615115833981519152604482015290519081900360640190fd5b60026001556000611cec84612c38565b90506000816001600160a01b031663feb56b156040518163ffffffff1660e01b815260040160206040518083038186803b158015611d2957600080fd5b505afa158015611d3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d619190613f6d565b9050611d7781611d7186826132e4565b9061334d565b9350611df5826001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b158015611db557600080fd5b505afa158015611dc9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ded9190613739565b3384876133ad565b6040516340c10f1960e01b81526001600160a01b038316906340c10f1990611e2390869088906004016144b0565b602060405180830381600087803b158015611e3d57600080fd5b505af1158015611e51573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e759190613f6d565b50506001805550505050565b6000546001600160a01b031690565b60026001541415611ed6576040805162461bcd60e51b815260206004820152601f6024820152600080516020615115833981519152604482015290519081900360640190fd5b60026001556001600160a01b038516611f015760405162461bcd60e51b81526004016106a99061481d565b6000611f0c88612c38565b905060008511611f2e5760405162461bcd60e51b81526004016106a990614865565b604051632c3eac2f60e21b81526000906001600160a01b0383169063b0fab0bc90611f679033908a908f908e908c908c90600401614448565b602060405180830381600087803b158015611f8157600080fd5b505af1158015611f95573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fb99190613f6d565b905060008111611fdb5760405162461bcd60e51b81526004016106a9906147cc565b604051630474ec6160e11b81526000906001600160a01b038416906308e9d8c29061200c908e908d90600401614b16565b6040805180830381600087803b15801561202557600080fd5b505af1158015612039573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061205d91906137a9565b9050600560009054906101000a90046001600160a01b03166001600160a01b0316633cef94b9348d8d8d8d87898e8e8e6040518b63ffffffff1660e01b8152600401611c5399989796959493929190614da5565b6120b9612ce6565b6001600160a01b03166120ca611e81565b6001600160a01b031614612113576040805162461bcd60e51b8152602060048201819052602482015260008051602061517c833981519152604482015290519081900360640190fd5b600061211e83612c38565b60405163ac2cc36b60e01b81529091506001600160a01b0382169063ac2cc36b90610a279085906004016144fc565b60026001541415612193576040805162461bcd60e51b815260206004820152601f6024820152600080516020615115833981519152604482015290519081900360640190fd5b60026001556001600160a01b0381166121be5760405162461bcd60e51b81526004016106a99061481d565b60006121c984612c38565b90506000816001600160a01b03166308e9d8c287866040518363ffffffff1660e01b81526004016121fb929190614b16565b6040805180830381600087803b15801561221457600080fd5b505af1158015612228573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061224c91906137a9565b600554604051632fa7502b60e21b81529192506001600160a01b03169063be9d40ac903490612287908a908a908a908a908990600401614c50565b6000604051808303818588803b1580156122a057600080fd5b505af11580156122b4573d6000803e3d6000fd5b505060018055505050505050505050565b6002600154141561230b576040805162461bcd60e51b815260206004820152601f6024820152600080516020615115833981519152604482015290519081900360640190fd5b60026001558661232d5760405162461bcd60e51b81526004016106a9906145f2565b6001600160a01b0388166123535760405162461bcd60e51b81526004016106a99061481d565b61235b61353b565b612363613521565b600061236e8d612c38565b90506000816001600160a01b031663feb56b156040518163ffffffff1660e01b815260040160206040518083038186803b1580156123ab57600080fd5b505afa1580156123bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123e39190613f6d565b90506123f381611d718d826132e4565b9a5050806001600160a01b0316631b7319b68f8e338e8e60016040518763ffffffff1660e01b815260040161242d96959493929190614b54565b60c060405180830381600087803b15801561244757600080fd5b505af115801561245b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061247f91906137f0565b92506124fd816001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156124bd57600080fd5b505afa1580156124d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124f59190613739565b33838d6133ad565b806001600160a01b03166308e9d8c28f8e6040518363ffffffff1660e01b815260040161252b929190614b16565b6040805180830381600087803b15801561254457600080fd5b505af1158015612558573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061257c91906137a9565b915050600560009054906101000a90046001600160a01b03166001600160a01b03166351156e73348f8f8f8f87898f8f8f8f8f6040518d63ffffffff1660e01b81526004016125d59b9a99989796959493929190614c85565b6000604051808303818588803b1580156125ee57600080fd5b505af1158015612602573d6000803e3d6000fd5b50506001805550505050505050505050505050505050565b6005546001600160a01b031633146126445760405162461bcd60e51b81526004016106a990614584565b600061264f83612c38565b60405163b6addec760e01b81529091506001600160a01b0382169063b6addec790610afe90889088908790600401614bf7565b6003546001600160a01b031681565b6004546001600160a01b031681565b6002546001600160a01b031681565b6000600260015414156126f7576040805162461bcd60e51b815260206004820152601f6024820152600080516020615115833981519152604482015290519081900360640190fd5b6002600155826127195760405162461bcd60e51b81526004016106a990614865565b60006127288561ffff16612c38565b6040516304c35b0d60e11b81529091506001600160a01b03821690630986b61a9061275b90339088908890600401614425565b602060405180830381600087803b15801561277557600080fd5b505af1158015612789573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127ad9190613f6d565b6001805595945050505050565b6127c2612ce6565b6001600160a01b03166127d3611e81565b6001600160a01b03161461281c576040805162461bcd60e51b8152602060048201819052602482015260008051602061517c833981519152604482015290519081900360640190fd5b600061282783612c38565b6040516312d72b2f60e21b81529091506001600160a01b03821690634b5cacbc90610a27908590600401614411565b61285e612ce6565b6001600160a01b031661286f611e81565b6001600160a01b0316146128b8576040805162461bcd60e51b8152602060048201819052602482015260008051602061517c833981519152604482015290519081900360640190fd5b60006128c384612c38565b6040516345ec368560e11b81529091506001600160a01b03821690638bd86d0a906128f49086908690600401614b16565b600060405180830381600087803b15801561290e57600080fd5b505af1158015611957573d6000803e3d6000fd5b6003546001600160a01b0316331461294c5760405162461bcd60e51b81526004016106a9906146dc565b600061295783612c38565b604051632f8c40a560e21b81529091506001600160a01b0382169063be31029490610a27908590600401614411565b61298e612ce6565b6001600160a01b031661299f611e81565b6001600160a01b0316146129e8576040805162461bcd60e51b8152602060048201819052602482015260008051602061517c833981519152604482015290519081900360640190fd5b6001600160a01b038116612a0e5760405162461bcd60e51b81526004016106a9906146a7565b600480546001600160a01b0319166001600160a01b0392909216919091179055565b6006602090815260009384526040808520845180860184018051928152908401958401959095209452928152908352918190208054825160026001831615610100026000190190921691909104601f810185900485028201850190935282815292909190830182828015612ae55780601f10612aba57610100808354040283529160200191612ae5565b820191906000526020600020905b815481529060010190602001808311612ac857829003601f168201915b505050505081565b6005546001600160a01b031681565b612b04612ce6565b6001600160a01b0316612b15611e81565b6001600160a01b031614612b5e576040805162461bcd60e51b8152602060048201819052602482015260008051602061517c833981519152604482015290519081900360640190fd5b6001600160a01b038116612ba35760405162461bcd60e51b81526004018080602001828103825260268152602001806151356026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000612c0983612c38565b604051637fb6526560e01b81529091506001600160a01b03821690637fb6526590610a279085906004016144fc565b60025460405163068bcd8d60e01b81526000916001600160a01b03169063068bcd8d90612c69908590600401614ede565b60206040518083038186803b158015612c8157600080fd5b505afa158015612c95573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cb99190613739565b90506001600160a01b038116612ce15760405162461bcd60e51b81526004016106a990614795565b919050565b3390565b6000612cf586612c38565b60405163902b8ab760e01b81529091506001600160a01b0382169063902b8ab790612d2a908d908b9089908990600401614b8d565b602060405180830381600087803b158015612d4457600080fd5b505af1925050508015612d74575060408051601f3d908101601f19168201909252612d7191810190613f6d565b60015b612e3c576003878787878787604051602001612d969796959493929190614fe7565b60408051601f1981840301815282825261ffff8d1660009081526006602052919091209091612dc6908c906143f5565b908152602001604051809103902060008a81526020019081526020016000209080519060200190612df8929190613495565b507fa5d2ba6de30cc2f2e91c5a29ba66b148c27826954217e2f67cb8983541da21cf60038b8b8b604051612e2f9493929190614f42565b60405180910390a1613146565b82511561110f57846001600160a01b0316630f3e496f878d8d8d876001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b158015612e8f57600080fd5b505afa158015612ea3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ec79190613739565b878a6040518863ffffffff1660e01b8152600401612eea96959493929190614abd565b600060405180830381600088803b158015612f0457600080fd5b5087f193505050508015612f16575060015b61110f573d808015612f44576040519150601f19603f3d011682016040523d82523d6000602084013e612f49565b606091505b506040518060800160405280846001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b158015612f8e57600080fd5b505afa158015612fa2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fc69190613739565b6001600160a01b03168152602001838152602001876001600160a01b0316815260200185815250600760008e61ffff1661ffff1681526020019081526020016000208c60405161301691906143f5565b908152604080516020928190038301902060008e8152908352819020835181546001600160a01b03199081166001600160a01b039283161783558585015160018401559285015160028301805490941691161790915560608301518051919261308792600385019290910190613495565b509050507f8186389e97ff190cd5e17304ed8188a4a98a6c8add46e6df94462ac7f7e8dd348c8c8c866001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156130e857600080fd5b505afa1580156130fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131209190613739565b868b8a88604051613138989796959493929190614a43565b60405180910390a15061110f565b50505050505050505050565b600061315d85612c38565b604051632cc36bab60e21b81529091506001600160a01b0382169063b30daeac90613194908c908a90899089908990600401614bc5565b600060405180830381600087803b1580156131ae57600080fd5b505af19250505080156131bf575060015b61328157600286868686866040516020016131df96959493929190614f79565b60408051601f1981840301815282825261ffff8c166000908152600660205291909120909161320f908b906143f5565b908152602001604051809103902060008981526020019081526020016000209080519060200190613241929190613495565b507fa5d2ba6de30cc2f2e91c5a29ba66b148c27826954217e2f67cb8983541da21cf60028a8a8a6040516132789493929190614f42565b60405180910390a15b868860405161329091906143f5565b60405180910390207fc7379a02e530fbd0a46ea1ce6fd91987e96535798231a796bdc0e1a688a508738b89898989896040516132d196959493929190614e19565b60405180910390a3505050505050505050565b600080821161333a576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b81838161334357fe5b0490505b92915050565b60008261335c57506000613347565b8282028284828161336957fe5b04146133a65760405162461bcd60e51b815260040180806020018281038252602181526020018061515b6021913960400191505060405180910390fd5b9392505050565b600080856001600160a01b03166323b872dd8686866040516024016133d49392919061448c565b6040516020818303038152906040529060e01b6020820180516001600160e01b03838183161783525050505060405161340d91906143f5565b6000604051808303816000865af19150503d806000811461344a576040519150601f19603f3d011682016040523d82523d6000602084013e61344f565b606091505b50915091508180156134795750805115806134795750808060200190518101906134799190613755565b6113f55760405162461bcd60e51b81526004016106a990614629565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826134cb5760008555613511565b82601f106134e457805160ff1916838001178555613511565b82800160010185558215613511579182015b828111156135115782518255916020019190600101906134f6565b5061351d929150613571565b5090565b604051806040016040528060008152602001600081525090565b6040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b5b8082111561351d5760008155600101613572565b8035612ce1816150df565b60008083601f8401126135a2578182fd5b5081356001600160401b038111156135b8578182fd5b6020830191508360208285010111156135d057600080fd5b9250929050565b600082601f8301126135e7578081fd5b81356135fa6135f58261508e565b61506b565b81815284602083860101111561360e578283fd5b816020850160208301379081016020019190915292915050565b600060c08284031215613639578081fd5b60405160c081018181106001600160401b038211171561365557fe5b8060405250809150825181526020830151602082015260408301516040820152606083015160608201526080830151608082015260a083015160a08201525092915050565b6000606082840312156136ab578081fd5b604051606081016001600160401b0382821081831117156136c857fe5b81604052829350843583526020850135602084015260408501359150808211156136f157600080fd5b506136fe858286016135d7565b6040830152505092915050565b803561ffff81168114612ce157600080fd5b60006020828403121561372e578081fd5b81356133a6816150df565b60006020828403121561374a578081fd5b81516133a6816150df565b600060208284031215613766578081fd5b81516133a6816150f7565b60008060408385031215613783578081fd5b823561378e816150df565b9150602083013561379e816150df565b809150509250929050565b6000604082840312156137ba578081fd5b604051604081018181106001600160401b03821117156137d657fe5b604052825181526020928301519281019290925250919050565b600060c08284031215613801578081fd5b6133a68383613628565b60008060008060608587031215613820578182fd5b6138298561370b565b935060208501356001600160401b03811115613843578283fd5b61384f87828801613591565b9598909750949560400135949350505050565b60008060008060008060a0878903121561387a578384fd5b6138838761370b565b955060208701356001600160401b038082111561389e578586fd5b6138aa8a838b01613591565b909750955060408901359450606089013591506138c6826150df565b909250608088013590808211156138db578283fd5b506138e889828a0161369a565b9150509295509295509295565b600080600060608486031215613909578081fd5b6139128461370b565b925060208401356001600160401b0381111561392c578182fd5b613938868287016135d7565b925050604084013590509250925092565b600080600080600080600080610100898b031215613965578586fd5b61396e8961370b565b975060208901356001600160401b03811115613988578687fd5b6139948b828c016135d7565b97505060408901359550606089013594506080890135935060a08901356139ba816150df565b979a969950949793969295929450505060c08201359160e0013590565b6000806000806000806000806000898b036101c08112156139f6578384fd5b6139ff8b61370b565b995060208b01356001600160401b0380821115613a1a578586fd5b613a268e838f016135d7565b9a5060408d0135995060608d0135985060808d0135975060a08d0135965060c08d01359150613a54826150df565b81955060c060df1984011215613a68578384fd5b604051925060c0830191508282108183111715613a8157fe5b8160405260e08d013583526101008d013560208401526101208d013560408401526101408d013560608401526101608d013560808401526101808d013560a08401528294506101a08d0135925080831115613ada578384fd5b5050613ae88c828d016135d7565b9150509295985092959850929598565b60008060008060008060008060e0898b031215613b13578182fd5b613b1c8961370b565b975060208901356001600160401b0380821115613b37578384fd5b613b438c838d016135d7565b985060408b0135975060608b0135965060808b0135955060a08b0135945060c08b0135915080821115613b74578384fd5b50613b818b828c01613591565b999c989b5096995094979396929594505050565b600080600060608486031215613ba9578081fd5b613bb28461370b565b9250602084013591506040840135613bc9816150df565b809150509250925092565b60008060008060808587031215613be9578182fd5b613bf28561370b565b935060208501359250604085013591506060850135613c10816150df565b939692955090935050565b60008060008060008060008060e0898b031215613c36578182fd5b613c3f8961370b565b975060208901359650604089013595506060890135613c5d816150df565b94506080890135935060a08901356001600160401b0380821115613c7f578384fd5b613c8b8c838d01613591565b909550935060c08b0135915080821115613ca3578283fd5b50613cb08b828c0161369a565b9150509295985092959890939650565b60008060008060008060008060006101008a8c031215613cde578283fd5b613ce78a61370b565b985060208a0135975060408a0135965060608a0135613d05816150df565b955060808a0135945060a08a0135935060c08a01356001600160401b0380821115613d2e578485fd5b613d3a8d838e01613591565b909550935060e08c0135915080821115613d52578283fd5b50613ae88c828d0161369a565b60008060008060008060008060008060006101208c8e031215613d80578485fd5b613d898c61370b565b9a5060208c0135995060408c01359850613da560608d01613586565b975060808c0135965060a08c013595506001600160401b038060c08e01351115613dcd578586fd5b613ddd8e60c08f01358f0161369a565b95508060e08e01351115613def578283fd5b613dff8e60e08f01358f01613591565b90955093506101008d0135811015613e15578283fd5b50613e278d6101008e01358e01613591565b81935080925050509295989b509295989b9093969950565b60008060008084860360a0811215613e55578283fd5b613e5e8661370b565b9450602086013593506040808701359350605f1982011215613e7e578182fd5b50604051604081018181106001600160401b0382111715613e9b57fe5b604052606086013581526080909501356020860152509194909350909190565b600080600080600080600060a0888a031215613ed5578081fd5b613ede8861370b565b96506020880135613eee81615105565b955060408801356001600160401b0380821115613f09578283fd5b613f158b838c01613591565b909750955060608a0135915080821115613f2d578283fd5b613f398b838c01613591565b909550935060808a0135915080821115613f51578283fd5b50613f5e8a828b0161369a565b91505092959891949750929550565b600060208284031215613f7e578081fd5b5051919050565b60008060408385031215613f97578182fd5b82359150602083013561379e816150df565b60008060008060008060c08789031215613fc1578384fd5b863595506020870135613fd3816150df565b94506040870135613fe381615105565b93506060870135613ff381615105565b925060808701356001600160401b038082111561400e578384fd5b61401a8a838b016135d7565b935060a089013591508082111561402f578283fd5b506138e889828a016135d7565b6000806040838503121561404e578182fd5b82359150602083013561379e816150f7565b60008060008060008060c08789031215614078578384fd5b86359550602087013561408a816150f7565b9450604087013593506060870135925060808701356140a8816150f7565b915060a08701356140b8816150f7565b809150509295509295509295565b6000806000606084860312156140da578081fd5b833592506140ea6020850161370b565b9150604084013590509250925092565b6000806000806080858703121561410f578182fd5b8435935061411f6020860161370b565b9250604085013591506141346060860161370b565b905092959194509250565b60008060008060808587031215614154578182fd5b843593506141646020860161370b565b93969395505050506040820135916060013590565b6000806040838503121561418b578182fd5b50508035926020909101359150565b600080604083850312156141ac578182fd5b505080516020909101519092909150565b6000806000606084860312156141d1578081fd5b83359250602084013591506040840135613bc9816150df565b60008060008060008060c08789031215614202578384fd5b865161420d81615105565b809650506020870151945060408701519350606087015161422d816150df565b809350506080870151915060a087015190509295509295509295565b6000806000806000806000610180888a031215614264578081fd5b875161426f81615105565b809750506020880151955060408801519450606088015193506080880151614296816150df565b92506142a58960a08a01613628565b91506101608801516001600160401b038111156142c0578182fd5b8801601f81018a136142d0578182fd5b80516142de6135f58261508e565b8181528b60208385010111156142f2578384fd5b6143038260208301602086016150af565b80935050505092959891949750929550565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b600081518084526143578160208601602086016150af565b601f01601f19169290920160200192915050565b80518252602090810151910152565b805182526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a08301525050565b600081518352602082015160208401526040820151606060408501526143dd606085018261433f565b949350505050565b6000828483379101908152919050565b600082516144078184602087016150af565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0393841681526020810192909252909116604082015260600190565b600060018060a01b038816825286602083015261ffff8616604083015284606083015260a0608083015261448060a083018486614315565b98975050505050505050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b03858116825260208201859052831660408201526080606082018190526000906118739083018461433f565b901515815260200190565b941515855260208501939093526040840191909152151560608301521515608082015260a00190565b6000602082526133a6602083018461433f565b60208082526021908201527f4d6972726f72676174653a20696e76616c69642066756e6374696f6e207479706040820152606560f81b606082015260800190565b6020808252601e908201527f4272696467653a2063616c6c6572206d757374206265204272696467652e0000604082015260600190565b6020808252601e908201527f4d6972726f72676174653a206272696467652063616e74206265203078300000604082015260600190565b60208082526019908201527f4d6972726f72676174653a2063616e6e6f742073776170203000000000000000604082015260600190565b6020808252818101527f4d6972726f72676174653a205452414e534645525f46524f4d5f4641494c4544604082015260600190565b60208082526029908201527f4d6972726f72676174653a206e6f7420656e6f756768206c7020746f2072656460408201526865656d52656d6f746560b81b606082015260800190565b6020808252818101527f4d6972726f72676174653a205f6f776e65722063616e6e6f7420626520307830604082015260600190565b60208082526021908201527f4d6972726f72676174653a206f6e6c792070726f746f636f6c4665654f776e656040820152603960f91b606082015260800190565b60208082526021908201527f4d6972726f72676174653a20636163686520616c726561647920636c656172656040820152601960fa1b606082015260800190565b6020808252601f908201527f4d6972726f72676174653a20666163746f72792063616e742062652030783000604082015260600190565b6020808252601f908201527f4d6972726f72676174653a20506f6f6c20646f6573206e6f7420657869737400604082015260600190565b60208082526031908201527f4d6972726f72676174653a206e6f7420656e6f756768206c7020746f2072656460408201527019595b481dda5d1a08185b5bdd5b9d14d1607a1b606082015260800190565b60208082526028908201527f4d6972726f72676174653a205f726566756e64416464726573732063616e6e6f604082015267074206265203078360c41b606082015260800190565b60208082526023908201527f4d6972726f72676174653a206e6f7420656e6f756768206c7020746f2072656460408201526265656d60e81b606082015260800190565b6020808252601d908201527f4d6972726f72676174653a206f6e6c79206d696e744665654f776e6572000000604082015260600190565b60208082526032908201527f4d6972726f72676174653a2062726964676520616e6420666163746f727920616040820152711b1c9958591e481a5b9a5d1a585b1a5e995960721b606082015260800190565b6020808252818101527f4d6972726f72676174653a205f746f6b656e2063616e6e6f7420626520307830604082015260600190565b6020808252601b908201527f4d6972726f72676174653a206e6f207265747279207265766572740000000000604082015260600190565b61ffff861681526001600160a01b038516602082015260006149c2604083018661436b565b60c060808301526149d660c08301856143b4565b82810360a0840152614480818561433f565b600061ffff8916825260c06020830152614a0660c08301888a614315565b604083018790526001600160a01b03861660608401526080830185905282810360a0840152614a35818561433f565b9a9950505050505050505050565b600061010061ffff8b168352806020840152614a618184018b61433f565b604084018a90526001600160a01b03898116606086015260808501899052871660a085015283810360c08501529050614a9a818661433f565b905082810360e0840152614aae818561433f565b9b9a5050505050505050505050565b600061ffff8816825260c06020830152614ada60c083018861433f565b604083018790526001600160a01b03861660608401526080830185905282810360a0840152614b09818561433f565b9998505050505050505050565b61ffff929092168252602082015260400190565b61ffff94909416845260208401929092526001600160a01b03166040830152606082015260800190565b61ffff96909616865260208601949094526001600160a01b0392909216604085015260608401526080830152151560a082015260c00190565b61ffff85168152602081018490526001600160a01b03831660408201526101208101614bbc606083018461437a565b95945050505050565b61ffff95909516855260208501939093526001600160a01b039190911660408401526060830152608082015260a00190565b61ffff8416815260208101839052608081016143dd604083018461436b565b61ffff93841681526020810192909252909116604082015260600190565b61ffff9390931683526020830191909152604082015260600190565b61ffff8616815260208101859052604081018490526001600160a01b038316606082015260c08101611873608083018461436b565b61ffff8c168152602081018b9052604081018a90526001600160a01b038916606082015260006101e0614cbb608084018b61436b565b614cc860c084018a61437a565b80610180840152614cdb818401896143b4565b90508281036101a0840152614cf1818789614315565b90508281036101c0840152614d07818587614315565b9e9d5050505050505050505050505050565b61ffff8a16815260208101899052604081018890526001600160a01b038716606082015260006101e0614d4f608084018961436b565b614d5c60c084018861437a565b80610180840152614d6f818401876143b4565b90508281036101a0840152614d85818587614315565b8381036101c0909401939093525081526020019998505050505050505050565b61ffff8a16815260208101899052604081018890526001600160a01b03871660608201526000610120614ddb608084018961436b565b8660c08401528060e0840152614df48184018688614315565b9050828103610100840152614e0981856143b4565b9c9b505050505050505050505050565b61ffff969096168652602086019490945260408501929092526001600160a01b03166060840152608083015260a082015260c00190565b600061ffff8916825287602083015286604083015260c06060830152614e7a60c083018688614315565b60808301949094525060a0015295945050505050565b600061ffff8916825260ff8816602083015260a06040830152614eb760a083018789614315565b8281036060840152614eca818688614315565b90508281036080840152614a3581856143b4565b90815260200190565b8681526001600160a01b038616602082015260ff85811660408301528416606082015260c060808201819052600090614f229083018561433f565b82810360a0840152614b09818561433f565b918252602082015260400190565b600060ff8616825261ffff8516602083015260806040830152614f68608083018561433f565b905082606083015295945050505050565b60ff969096168652602086019490945260408501929092526001600160a01b03166060840152608083015260a082015260c00190565b600060ff8916825287602083015286604083015260ff8616606083015284608083015260c060a0830152614b0960c083018486614315565b60ff881681526020810187905260408101869052606081018590526001600160a01b0384166080820152600061018061502360a084018661437a565b80610160840152614a358184018561433f565b600060ff8916825287602083015286604083015285606083015284608083015260c060a0830152614b0960c083018486614315565b6040518181016001600160401b038111828210171561508657fe5b604052919050565b60006001600160401b038211156150a157fe5b50601f01601f191660200190565b60005b838110156150ca5781810151838201526020016150b2565b838111156150d9576000848401525b50505050565b6001600160a01b03811681146150f457600080fd5b50565b80151581146150f457600080fd5b60ff811681146150f457600080fdfe5265656e7472616e637947756172643a207265656e7472616e742063616c6c004f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a264697066735822122070229434c94745ad0d023bc840a0c4d8870c13a339bacbaaa7ae85e87e6efbec64736f6c63430007060033",
- "devdoc": {
- "kind": "dev",
- "methods": {
- "owner()": {
- "details": "Returns the address of the current owner."
- },
- "renounceOwnership()": {
- "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner."
- },
- "transferOwnership(address)": {
- "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."
- }
- },
- "version": 1
- },
- "userdoc": {
- "kind": "user",
- "methods": {},
- "version": 1
- },
- "storageLayout": {
- "storage": [
- {
- "astId": 7,
- "contract": "contracts/Router.sol:Router",
- "label": "_owner",
- "offset": 0,
- "slot": "0",
- "type": "t_address"
- },
- {
- "astId": 2080,
- "contract": "contracts/Router.sol:Router",
- "label": "_status",
- "offset": 0,
- "slot": "1",
- "type": "t_uint256"
- },
- {
- "astId": 7800,
- "contract": "contracts/Router.sol:Router",
- "label": "factory",
- "offset": 0,
- "slot": "2",
- "type": "t_contract(Factory)3328"
- },
- {
- "astId": 7802,
- "contract": "contracts/Router.sol:Router",
- "label": "protocolFeeOwner",
- "offset": 0,
- "slot": "3",
- "type": "t_address"
- },
- {
- "astId": 7804,
- "contract": "contracts/Router.sol:Router",
- "label": "mintFeeOwner",
- "offset": 0,
- "slot": "4",
- "type": "t_address"
- },
- {
- "astId": 7806,
- "contract": "contracts/Router.sol:Router",
- "label": "bridge",
- "offset": 0,
- "slot": "5",
- "type": "t_contract(Bridge)3167"
- },
- {
- "astId": 7814,
- "contract": "contracts/Router.sol:Router",
- "label": "revertLookup",
- "offset": 0,
- "slot": "6",
- "type": "t_mapping(t_uint16,t_mapping(t_bytes_memory_ptr,t_mapping(t_uint256,t_bytes_storage)))"
- },
- {
- "astId": 7822,
- "contract": "contracts/Router.sol:Router",
- "label": "cachedSwapLookup",
- "offset": 0,
- "slot": "7",
- "type": "t_mapping(t_uint16,t_mapping(t_bytes_memory_ptr,t_mapping(t_uint256,t_struct(CachedSwap)7798_storage)))"
- }
- ],
- "types": {
- "t_address": {
- "encoding": "inplace",
- "label": "address",
- "numberOfBytes": "20"
- },
- "t_bytes_memory_ptr": {
- "encoding": "bytes",
- "label": "bytes",
- "numberOfBytes": "32"
- },
- "t_bytes_storage": {
- "encoding": "bytes",
- "label": "bytes",
- "numberOfBytes": "32"
- },
- "t_contract(Bridge)3167": {
- "encoding": "inplace",
- "label": "contract Bridge",
- "numberOfBytes": "20"
- },
- "t_contract(Factory)3328": {
- "encoding": "inplace",
- "label": "contract Factory",
- "numberOfBytes": "20"
- },
- "t_mapping(t_bytes_memory_ptr,t_mapping(t_uint256,t_bytes_storage))": {
- "encoding": "mapping",
- "key": "t_bytes_memory_ptr",
- "label": "mapping(bytes => mapping(uint256 => bytes))",
- "numberOfBytes": "32",
- "value": "t_mapping(t_uint256,t_bytes_storage)"
- },
- "t_mapping(t_bytes_memory_ptr,t_mapping(t_uint256,t_struct(CachedSwap)7798_storage))": {
- "encoding": "mapping",
- "key": "t_bytes_memory_ptr",
- "label": "mapping(bytes => mapping(uint256 => struct Router.CachedSwap))",
- "numberOfBytes": "32",
- "value": "t_mapping(t_uint256,t_struct(CachedSwap)7798_storage)"
- },
- "t_mapping(t_uint16,t_mapping(t_bytes_memory_ptr,t_mapping(t_uint256,t_bytes_storage)))": {
- "encoding": "mapping",
- "key": "t_uint16",
- "label": "mapping(uint16 => mapping(bytes => mapping(uint256 => bytes)))",
- "numberOfBytes": "32",
- "value": "t_mapping(t_bytes_memory_ptr,t_mapping(t_uint256,t_bytes_storage))"
- },
- "t_mapping(t_uint16,t_mapping(t_bytes_memory_ptr,t_mapping(t_uint256,t_struct(CachedSwap)7798_storage)))": {
- "encoding": "mapping",
- "key": "t_uint16",
- "label": "mapping(uint16 => mapping(bytes => mapping(uint256 => struct Router.CachedSwap)))",
- "numberOfBytes": "32",
- "value": "t_mapping(t_bytes_memory_ptr,t_mapping(t_uint256,t_struct(CachedSwap)7798_storage))"
- },
- "t_mapping(t_uint256,t_bytes_storage)": {
- "encoding": "mapping",
- "key": "t_uint256",
- "label": "mapping(uint256 => bytes)",
- "numberOfBytes": "32",
- "value": "t_bytes_storage"
- },
- "t_mapping(t_uint256,t_struct(CachedSwap)7798_storage)": {
- "encoding": "mapping",
- "key": "t_uint256",
- "label": "mapping(uint256 => struct Router.CachedSwap)",
- "numberOfBytes": "32",
- "value": "t_struct(CachedSwap)7798_storage"
- },
- "t_struct(CachedSwap)7798_storage": {
- "encoding": "inplace",
- "label": "struct Router.CachedSwap",
- "members": [
- {
- "astId": 7791,
- "contract": "contracts/Router.sol:Router",
- "label": "token",
- "offset": 0,
- "slot": "0",
- "type": "t_address"
- },
- {
- "astId": 7793,
- "contract": "contracts/Router.sol:Router",
- "label": "amountLD",
- "offset": 0,
- "slot": "1",
- "type": "t_uint256"
- },
- {
- "astId": 7795,
- "contract": "contracts/Router.sol:Router",
- "label": "to",
- "offset": 0,
- "slot": "2",
- "type": "t_address"
- },
- {
- "astId": 7797,
- "contract": "contracts/Router.sol:Router",
- "label": "payload",
- "offset": 0,
- "slot": "3",
- "type": "t_bytes_storage"
- }
- ],
- "numberOfBytes": "128"
- },
- "t_uint16": {
- "encoding": "inplace",
- "label": "uint16",
- "numberOfBytes": "2"
- },
- "t_uint256": {
- "encoding": "inplace",
- "label": "uint256",
- "numberOfBytes": "32"
- }
- }
- }
- }
|