Bridge.json 184 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859
  1. {
  2. "address": "0xf13ad808a6D9ce7984B04838068Aef066a0D7B13",
  3. "abi": [
  4. {
  5. "inputs": [
  6. {
  7. "internalType": "address",
  8. "name": "_layerZeroEndpoint",
  9. "type": "address"
  10. },
  11. {
  12. "internalType": "address",
  13. "name": "_router",
  14. "type": "address"
  15. }
  16. ],
  17. "stateMutability": "nonpayable",
  18. "type": "constructor"
  19. },
  20. {
  21. "anonymous": false,
  22. "inputs": [
  23. {
  24. "indexed": true,
  25. "internalType": "address",
  26. "name": "previousOwner",
  27. "type": "address"
  28. },
  29. {
  30. "indexed": true,
  31. "internalType": "address",
  32. "name": "newOwner",
  33. "type": "address"
  34. }
  35. ],
  36. "name": "OwnershipTransferred",
  37. "type": "event"
  38. },
  39. {
  40. "anonymous": false,
  41. "inputs": [
  42. {
  43. "indexed": false,
  44. "internalType": "uint8",
  45. "name": "msgType",
  46. "type": "uint8"
  47. },
  48. {
  49. "indexed": false,
  50. "internalType": "uint64",
  51. "name": "nonce",
  52. "type": "uint64"
  53. }
  54. ],
  55. "name": "SendMsg",
  56. "type": "event"
  57. },
  58. {
  59. "inputs": [
  60. {
  61. "internalType": "address",
  62. "name": "token",
  63. "type": "address"
  64. },
  65. {
  66. "internalType": "address",
  67. "name": "spender",
  68. "type": "address"
  69. },
  70. {
  71. "internalType": "uint256",
  72. "name": "amount",
  73. "type": "uint256"
  74. }
  75. ],
  76. "name": "approveTokenSpender",
  77. "outputs": [],
  78. "stateMutability": "nonpayable",
  79. "type": "function"
  80. },
  81. {
  82. "inputs": [
  83. {
  84. "internalType": "uint16",
  85. "name": "",
  86. "type": "uint16"
  87. }
  88. ],
  89. "name": "bridgeLookup",
  90. "outputs": [
  91. {
  92. "internalType": "bytes",
  93. "name": "",
  94. "type": "bytes"
  95. }
  96. ],
  97. "stateMutability": "view",
  98. "type": "function"
  99. },
  100. {
  101. "inputs": [
  102. {
  103. "internalType": "uint16",
  104. "name": "_srcChainId",
  105. "type": "uint16"
  106. },
  107. {
  108. "internalType": "bytes",
  109. "name": "_srcAddress",
  110. "type": "bytes"
  111. }
  112. ],
  113. "name": "forceResumeReceive",
  114. "outputs": [],
  115. "stateMutability": "nonpayable",
  116. "type": "function"
  117. },
  118. {
  119. "inputs": [
  120. {
  121. "internalType": "uint16",
  122. "name": "",
  123. "type": "uint16"
  124. },
  125. {
  126. "internalType": "uint8",
  127. "name": "",
  128. "type": "uint8"
  129. }
  130. ],
  131. "name": "gasLookup",
  132. "outputs": [
  133. {
  134. "internalType": "uint256",
  135. "name": "",
  136. "type": "uint256"
  137. }
  138. ],
  139. "stateMutability": "view",
  140. "type": "function"
  141. },
  142. {
  143. "inputs": [],
  144. "name": "layerZeroEndpoint",
  145. "outputs": [
  146. {
  147. "internalType": "contract ILayerZeroEndpoint",
  148. "name": "",
  149. "type": "address"
  150. }
  151. ],
  152. "stateMutability": "view",
  153. "type": "function"
  154. },
  155. {
  156. "inputs": [
  157. {
  158. "internalType": "uint16",
  159. "name": "_srcChainId",
  160. "type": "uint16"
  161. },
  162. {
  163. "internalType": "bytes",
  164. "name": "_srcAddress",
  165. "type": "bytes"
  166. },
  167. {
  168. "internalType": "uint64",
  169. "name": "_nonce",
  170. "type": "uint64"
  171. },
  172. {
  173. "internalType": "bytes",
  174. "name": "_payload",
  175. "type": "bytes"
  176. }
  177. ],
  178. "name": "lzReceive",
  179. "outputs": [],
  180. "stateMutability": "nonpayable",
  181. "type": "function"
  182. },
  183. {
  184. "inputs": [],
  185. "name": "owner",
  186. "outputs": [
  187. {
  188. "internalType": "address",
  189. "name": "",
  190. "type": "address"
  191. }
  192. ],
  193. "stateMutability": "view",
  194. "type": "function"
  195. },
  196. {
  197. "inputs": [
  198. {
  199. "internalType": "uint16",
  200. "name": "_chainId",
  201. "type": "uint16"
  202. },
  203. {
  204. "internalType": "uint8",
  205. "name": "_functionType",
  206. "type": "uint8"
  207. },
  208. {
  209. "internalType": "bytes",
  210. "name": "_toAddress",
  211. "type": "bytes"
  212. },
  213. {
  214. "internalType": "bytes",
  215. "name": "_transferAndCallPayload",
  216. "type": "bytes"
  217. },
  218. {
  219. "components": [
  220. {
  221. "internalType": "uint256",
  222. "name": "dstGasForCall",
  223. "type": "uint256"
  224. },
  225. {
  226. "internalType": "uint256",
  227. "name": "dstNativeAmount",
  228. "type": "uint256"
  229. },
  230. {
  231. "internalType": "bytes",
  232. "name": "dstNativeAddr",
  233. "type": "bytes"
  234. }
  235. ],
  236. "internalType": "struct IMirrorgateRouter.lzTxObj",
  237. "name": "_lzTxParams",
  238. "type": "tuple"
  239. }
  240. ],
  241. "name": "quoteLayerZeroFee",
  242. "outputs": [
  243. {
  244. "internalType": "uint256",
  245. "name": "",
  246. "type": "uint256"
  247. },
  248. {
  249. "internalType": "uint256",
  250. "name": "",
  251. "type": "uint256"
  252. }
  253. ],
  254. "stateMutability": "view",
  255. "type": "function"
  256. },
  257. {
  258. "inputs": [
  259. {
  260. "internalType": "uint16",
  261. "name": "_chainId",
  262. "type": "uint16"
  263. },
  264. {
  265. "internalType": "uint256",
  266. "name": "_srcPoolId",
  267. "type": "uint256"
  268. },
  269. {
  270. "internalType": "uint256",
  271. "name": "_dstPoolId",
  272. "type": "uint256"
  273. },
  274. {
  275. "internalType": "address payable",
  276. "name": "_refundAddress",
  277. "type": "address"
  278. },
  279. {
  280. "components": [
  281. {
  282. "internalType": "uint256",
  283. "name": "credits",
  284. "type": "uint256"
  285. },
  286. {
  287. "internalType": "uint256",
  288. "name": "idealBalance",
  289. "type": "uint256"
  290. }
  291. ],
  292. "internalType": "struct Pool.CreditObj",
  293. "name": "_c",
  294. "type": "tuple"
  295. },
  296. {
  297. "internalType": "uint256",
  298. "name": "_amountSD",
  299. "type": "uint256"
  300. },
  301. {
  302. "internalType": "bytes",
  303. "name": "_to",
  304. "type": "bytes"
  305. },
  306. {
  307. "components": [
  308. {
  309. "internalType": "uint256",
  310. "name": "dstGasForCall",
  311. "type": "uint256"
  312. },
  313. {
  314. "internalType": "uint256",
  315. "name": "dstNativeAmount",
  316. "type": "uint256"
  317. },
  318. {
  319. "internalType": "bytes",
  320. "name": "dstNativeAddr",
  321. "type": "bytes"
  322. }
  323. ],
  324. "internalType": "struct IMirrorgateRouter.lzTxObj",
  325. "name": "_lzTxParams",
  326. "type": "tuple"
  327. }
  328. ],
  329. "name": "redeemLocal",
  330. "outputs": [],
  331. "stateMutability": "payable",
  332. "type": "function"
  333. },
  334. {
  335. "inputs": [
  336. {
  337. "internalType": "uint16",
  338. "name": "_chainId",
  339. "type": "uint16"
  340. },
  341. {
  342. "internalType": "address payable",
  343. "name": "_refundAddress",
  344. "type": "address"
  345. },
  346. {
  347. "components": [
  348. {
  349. "internalType": "uint256",
  350. "name": "credits",
  351. "type": "uint256"
  352. },
  353. {
  354. "internalType": "uint256",
  355. "name": "idealBalance",
  356. "type": "uint256"
  357. }
  358. ],
  359. "internalType": "struct Pool.CreditObj",
  360. "name": "_c",
  361. "type": "tuple"
  362. },
  363. {
  364. "components": [
  365. {
  366. "internalType": "uint256",
  367. "name": "dstGasForCall",
  368. "type": "uint256"
  369. },
  370. {
  371. "internalType": "uint256",
  372. "name": "dstNativeAmount",
  373. "type": "uint256"
  374. },
  375. {
  376. "internalType": "bytes",
  377. "name": "dstNativeAddr",
  378. "type": "bytes"
  379. }
  380. ],
  381. "internalType": "struct IMirrorgateRouter.lzTxObj",
  382. "name": "_lzTxParams",
  383. "type": "tuple"
  384. },
  385. {
  386. "internalType": "bytes",
  387. "name": "_payload",
  388. "type": "bytes"
  389. }
  390. ],
  391. "name": "redeemLocalCallback",
  392. "outputs": [],
  393. "stateMutability": "payable",
  394. "type": "function"
  395. },
  396. {
  397. "inputs": [],
  398. "name": "renounceOwnership",
  399. "outputs": [],
  400. "stateMutability": "nonpayable",
  401. "type": "function"
  402. },
  403. {
  404. "inputs": [],
  405. "name": "router",
  406. "outputs": [
  407. {
  408. "internalType": "contract Router",
  409. "name": "",
  410. "type": "address"
  411. }
  412. ],
  413. "stateMutability": "view",
  414. "type": "function"
  415. },
  416. {
  417. "inputs": [
  418. {
  419. "internalType": "uint16",
  420. "name": "_chainId",
  421. "type": "uint16"
  422. },
  423. {
  424. "internalType": "uint256",
  425. "name": "_srcPoolId",
  426. "type": "uint256"
  427. },
  428. {
  429. "internalType": "uint256",
  430. "name": "_dstPoolId",
  431. "type": "uint256"
  432. },
  433. {
  434. "internalType": "address payable",
  435. "name": "_refundAddress",
  436. "type": "address"
  437. },
  438. {
  439. "components": [
  440. {
  441. "internalType": "uint256",
  442. "name": "credits",
  443. "type": "uint256"
  444. },
  445. {
  446. "internalType": "uint256",
  447. "name": "idealBalance",
  448. "type": "uint256"
  449. }
  450. ],
  451. "internalType": "struct Pool.CreditObj",
  452. "name": "_c",
  453. "type": "tuple"
  454. }
  455. ],
  456. "name": "sendCredits",
  457. "outputs": [],
  458. "stateMutability": "payable",
  459. "type": "function"
  460. },
  461. {
  462. "inputs": [
  463. {
  464. "internalType": "uint16",
  465. "name": "_chainId",
  466. "type": "uint16"
  467. },
  468. {
  469. "internalType": "bytes",
  470. "name": "_bridgeAddress",
  471. "type": "bytes"
  472. }
  473. ],
  474. "name": "setBridge",
  475. "outputs": [],
  476. "stateMutability": "nonpayable",
  477. "type": "function"
  478. },
  479. {
  480. "inputs": [
  481. {
  482. "internalType": "uint16",
  483. "name": "_version",
  484. "type": "uint16"
  485. },
  486. {
  487. "internalType": "uint16",
  488. "name": "_chainId",
  489. "type": "uint16"
  490. },
  491. {
  492. "internalType": "uint256",
  493. "name": "_configType",
  494. "type": "uint256"
  495. },
  496. {
  497. "internalType": "bytes",
  498. "name": "_config",
  499. "type": "bytes"
  500. }
  501. ],
  502. "name": "setConfig",
  503. "outputs": [],
  504. "stateMutability": "nonpayable",
  505. "type": "function"
  506. },
  507. {
  508. "inputs": [
  509. {
  510. "internalType": "uint16",
  511. "name": "_chainId",
  512. "type": "uint16"
  513. },
  514. {
  515. "internalType": "uint8",
  516. "name": "_functionType",
  517. "type": "uint8"
  518. },
  519. {
  520. "internalType": "uint256",
  521. "name": "_gasAmount",
  522. "type": "uint256"
  523. }
  524. ],
  525. "name": "setGasAmount",
  526. "outputs": [],
  527. "stateMutability": "nonpayable",
  528. "type": "function"
  529. },
  530. {
  531. "inputs": [
  532. {
  533. "internalType": "uint16",
  534. "name": "version",
  535. "type": "uint16"
  536. }
  537. ],
  538. "name": "setReceiveVersion",
  539. "outputs": [],
  540. "stateMutability": "nonpayable",
  541. "type": "function"
  542. },
  543. {
  544. "inputs": [
  545. {
  546. "internalType": "uint16",
  547. "name": "version",
  548. "type": "uint16"
  549. }
  550. ],
  551. "name": "setSendVersion",
  552. "outputs": [],
  553. "stateMutability": "nonpayable",
  554. "type": "function"
  555. },
  556. {
  557. "inputs": [
  558. {
  559. "internalType": "bool",
  560. "name": "enable",
  561. "type": "bool"
  562. }
  563. ],
  564. "name": "setUseLayerZeroToken",
  565. "outputs": [],
  566. "stateMutability": "nonpayable",
  567. "type": "function"
  568. },
  569. {
  570. "inputs": [
  571. {
  572. "internalType": "uint16",
  573. "name": "_chainId",
  574. "type": "uint16"
  575. },
  576. {
  577. "internalType": "uint256",
  578. "name": "_srcPoolId",
  579. "type": "uint256"
  580. },
  581. {
  582. "internalType": "uint256",
  583. "name": "_dstPoolId",
  584. "type": "uint256"
  585. },
  586. {
  587. "internalType": "address payable",
  588. "name": "_refundAddress",
  589. "type": "address"
  590. },
  591. {
  592. "components": [
  593. {
  594. "internalType": "uint256",
  595. "name": "credits",
  596. "type": "uint256"
  597. },
  598. {
  599. "internalType": "uint256",
  600. "name": "idealBalance",
  601. "type": "uint256"
  602. }
  603. ],
  604. "internalType": "struct Pool.CreditObj",
  605. "name": "_c",
  606. "type": "tuple"
  607. },
  608. {
  609. "components": [
  610. {
  611. "internalType": "uint256",
  612. "name": "amount",
  613. "type": "uint256"
  614. },
  615. {
  616. "internalType": "uint256",
  617. "name": "eqFee",
  618. "type": "uint256"
  619. },
  620. {
  621. "internalType": "uint256",
  622. "name": "eqReward",
  623. "type": "uint256"
  624. },
  625. {
  626. "internalType": "uint256",
  627. "name": "lpFee",
  628. "type": "uint256"
  629. },
  630. {
  631. "internalType": "uint256",
  632. "name": "protocolFee",
  633. "type": "uint256"
  634. },
  635. {
  636. "internalType": "uint256",
  637. "name": "lkbRemove",
  638. "type": "uint256"
  639. }
  640. ],
  641. "internalType": "struct Pool.SwapObj",
  642. "name": "_s",
  643. "type": "tuple"
  644. },
  645. {
  646. "components": [
  647. {
  648. "internalType": "uint256",
  649. "name": "dstGasForCall",
  650. "type": "uint256"
  651. },
  652. {
  653. "internalType": "uint256",
  654. "name": "dstNativeAmount",
  655. "type": "uint256"
  656. },
  657. {
  658. "internalType": "bytes",
  659. "name": "dstNativeAddr",
  660. "type": "bytes"
  661. }
  662. ],
  663. "internalType": "struct IMirrorgateRouter.lzTxObj",
  664. "name": "_lzTxParams",
  665. "type": "tuple"
  666. },
  667. {
  668. "internalType": "bytes",
  669. "name": "_to",
  670. "type": "bytes"
  671. },
  672. {
  673. "internalType": "bytes",
  674. "name": "_payload",
  675. "type": "bytes"
  676. }
  677. ],
  678. "name": "swap",
  679. "outputs": [],
  680. "stateMutability": "payable",
  681. "type": "function"
  682. },
  683. {
  684. "inputs": [
  685. {
  686. "internalType": "address",
  687. "name": "newOwner",
  688. "type": "address"
  689. }
  690. ],
  691. "name": "transferOwnership",
  692. "outputs": [],
  693. "stateMutability": "nonpayable",
  694. "type": "function"
  695. },
  696. {
  697. "inputs": [],
  698. "name": "useLayerZeroToken",
  699. "outputs": [
  700. {
  701. "internalType": "bool",
  702. "name": "",
  703. "type": "bool"
  704. }
  705. ],
  706. "stateMutability": "view",
  707. "type": "function"
  708. }
  709. ],
  710. "transactionHash": "0x00851cd9e7dcca916f2e6f518cf2c0ed982cc50f25c52fca1be81780d3614f07",
  711. "receipt": {
  712. "to": null,
  713. "from": "0x368715F09C1AB5E0B55bF5bA19cD887189A28DBE",
  714. "contractAddress": "0xf13ad808a6D9ce7984B04838068Aef066a0D7B13",
  715. "transactionIndex": 1,
  716. "gasUsed": "42739703",
  717. "logsBloom": "0x00000000000000000000000000010000000000000000000010800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000001000000000000000000000000000000000000020000000000000000000800000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000020000000000000000000010000000000000000000000000000000000000000000000",
  718. "blockHash": "0x9c7e3c4801417e4a05ec6ecd8bd1eb7a808a90c8bcebbed07aa7c6aa9fdd7a53",
  719. "transactionHash": "0x00851cd9e7dcca916f2e6f518cf2c0ed982cc50f25c52fca1be81780d3614f07",
  720. "logs": [
  721. {
  722. "transactionIndex": 1,
  723. "blockNumber": 14284147,
  724. "transactionHash": "0x00851cd9e7dcca916f2e6f518cf2c0ed982cc50f25c52fca1be81780d3614f07",
  725. "address": "0xf13ad808a6D9ce7984B04838068Aef066a0D7B13",
  726. "topics": [
  727. "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0",
  728. "0x0000000000000000000000000000000000000000000000000000000000000000",
  729. "0x000000000000000000000000368715f09c1ab5e0b55bf5ba19cd887189a28dbe"
  730. ],
  731. "data": "0x",
  732. "logIndex": 0,
  733. "blockHash": "0x9c7e3c4801417e4a05ec6ecd8bd1eb7a808a90c8bcebbed07aa7c6aa9fdd7a53"
  734. }
  735. ],
  736. "blockNumber": 14284147,
  737. "cumulativeGasUsed": "42739703",
  738. "status": 1,
  739. "byzantium": true
  740. },
  741. "args": [
  742. "0x6aB5Ae6822647046626e83ee6dB8187151E1d5ab",
  743. "0x47590c3D11e9366215416f2a3A03Cf21AdB716AE"
  744. ],
  745. "numDeployments": 1,
  746. "solcInputHash": "c474952dec744e7c88dc7c3d2b8d163f",
  747. "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_layerZeroEndpoint\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_router\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"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\":\"uint8\",\"name\":\"msgType\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"name\":\"SendMsg\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approveTokenSpender\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"name\":\"bridgeLookup\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"_srcChainId\",\"type\":\"uint16\"},{\"internalType\":\"bytes\",\"name\":\"_srcAddress\",\"type\":\"bytes\"}],\"name\":\"forceResumeReceive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"},{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"name\":\"gasLookup\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"layerZeroEndpoint\",\"outputs\":[{\"internalType\":\"contract ILayerZeroEndpoint\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"_srcChainId\",\"type\":\"uint16\"},{\"internalType\":\"bytes\",\"name\":\"_srcAddress\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"_nonce\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"_payload\",\"type\":\"bytes\"}],\"name\":\"lzReceive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"_chainId\",\"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\":\"_chainId\",\"type\":\"uint16\"},{\"internalType\":\"uint256\",\"name\":\"_srcPoolId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_dstPoolId\",\"type\":\"uint256\"},{\"internalType\":\"address payable\",\"name\":\"_refundAddress\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"credits\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"idealBalance\",\"type\":\"uint256\"}],\"internalType\":\"struct Pool.CreditObj\",\"name\":\"_c\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"_amountSD\",\"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\":\"_chainId\",\"type\":\"uint16\"},{\"internalType\":\"address payable\",\"name\":\"_refundAddress\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"credits\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"idealBalance\",\"type\":\"uint256\"}],\"internalType\":\"struct Pool.CreditObj\",\"name\":\"_c\",\"type\":\"tuple\"},{\"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\":\"_payload\",\"type\":\"bytes\"}],\"name\":\"redeemLocalCallback\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"router\",\"outputs\":[{\"internalType\":\"contract Router\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"_chainId\",\"type\":\"uint16\"},{\"internalType\":\"uint256\",\"name\":\"_srcPoolId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_dstPoolId\",\"type\":\"uint256\"},{\"internalType\":\"address payable\",\"name\":\"_refundAddress\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"credits\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"idealBalance\",\"type\":\"uint256\"}],\"internalType\":\"struct Pool.CreditObj\",\"name\":\"_c\",\"type\":\"tuple\"}],\"name\":\"sendCredits\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"_chainId\",\"type\":\"uint16\"},{\"internalType\":\"bytes\",\"name\":\"_bridgeAddress\",\"type\":\"bytes\"}],\"name\":\"setBridge\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"_version\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"_chainId\",\"type\":\"uint16\"},{\"internalType\":\"uint256\",\"name\":\"_configType\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_config\",\"type\":\"bytes\"}],\"name\":\"setConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"_chainId\",\"type\":\"uint16\"},{\"internalType\":\"uint8\",\"name\":\"_functionType\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"_gasAmount\",\"type\":\"uint256\"}],\"name\":\"setGasAmount\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"version\",\"type\":\"uint16\"}],\"name\":\"setReceiveVersion\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"version\",\"type\":\"uint16\"}],\"name\":\"setSendVersion\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"enable\",\"type\":\"bool\"}],\"name\":\"setUseLayerZeroToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"_chainId\",\"type\":\"uint16\"},{\"internalType\":\"uint256\",\"name\":\"_srcPoolId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_dstPoolId\",\"type\":\"uint256\"},{\"internalType\":\"address payable\",\"name\":\"_refundAddress\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"credits\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"idealBalance\",\"type\":\"uint256\"}],\"internalType\":\"struct Pool.CreditObj\",\"name\":\"_c\",\"type\":\"tuple\"},{\"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\"},{\"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\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"useLayerZeroToken\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"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/Bridge.sol\":\"Bridge\"},\"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}",
  748. "bytecode": "0x60c06040523480156200001157600080fd5b506040516200320438038062003204833981016040819052620000349162000125565b60006200004062000104565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506001600160a01b038216620000bc5760405162461bcd60e51b8152600401620000b3906200015c565b60405180910390fd5b6001600160a01b038116620000e55760405162461bcd60e51b8152600401620000b390620001a8565b6001600160601b0319606092831b8116608052911b1660a052620001e9565b3390565b80516001600160a01b03811681146200012057600080fd5b919050565b6000806040838503121562000138578182fd5b620001438362000108565b9150620001536020840162000108565b90509250929050565b6020808252602c908201527f4d6972726f72676174653a205f6c617965725a65726f456e64706f696e74206360408201526b0616e6e6f74206265203078360a41b606082015260800190565b60208082526021908201527f4d6972726f72676174653a205f726f757465722063616e6e6f742062652030786040820152600360fc1b606082015260800190565b60805160601c60a05160601c612f9262000272600039806104ff5280610583528061064a528061071552806107ac528061086452806108fb5280610d795280610fbf5280611172528061122d52806116285250806103e6528061099c5280610a375280610bfd5280610d395280610e7a52806113cc52806117ad52806118795250612f926000f3fe6080604052600436106101345760003560e01c80638c7ae0fc116100ab578063c213dc2b1161006f578063c213dc2b14610326578063cbed8b9c14610346578063d7d3c3b914610366578063f2fde38b14610386578063f887ea40146103a6578063fc869108146103bb57610134565b80638c7ae0fc1461029c5780638da5cb5b146102be5780638e3b5d6a146102d357806396aae4af14610300578063be9d40ac1461031357610134565b806310ddb137116100fd57806310ddb137146102015780633cef94b91461022157806342d65a8d1461023457806343b180091461025457806351156e7314610274578063715018a61461028757610134565b80621d356714610139578063024220541461015b57806307968db11461019157806307e0db17146101b35780630a512369146101d3575b600080fd5b34801561014557600080fd5b50610159610154366004611e98565b6103db565b005b34801561016757600080fd5b5061017b61017636600461218e565b61097d565b6040516101889190612c0b565b60405180910390f35b34801561019d57600080fd5b506101a661099a565b6040516101889190612705565b3480156101bf57600080fd5b506101596101ce366004611d99565b6109be565b3480156101df57600080fd5b506101f36101ee3660046121c4565b610a9a565b604051610188929190612c14565b34801561020d57600080fd5b5061015961021c366004611d99565b610cc0565b61015961022f3660046120d6565b610d6e565b34801561024057600080fd5b5061015961024f366004611e48565b610e01565b34801561026057600080fd5b5061015961026f366004611e48565b610eea565b610159610282366004611fe2565b610fb4565b34801561029357600080fd5b50610159611051565b3480156102a857600080fd5b506102b16110b5565b6040516101889190612732565b3480156102ca57600080fd5b506101a66110be565b3480156102df57600080fd5b506102f36102ee366004611d99565b6110cd565b604051610188919061273d565b61015961030e366004611db3565b611167565b610159610321366004611f89565b611222565b34801561033257600080fd5b50610159610341366004611d61565b6112de565b34801561035257600080fd5b50610159610361366004611f1d565b611353565b34801561037257600080fd5b50610159610381366004611d21565b611442565b34801561039257600080fd5b506101596103a1366004611d05565b611524565b3480156103b257600080fd5b506101a6611626565b3480156103c757600080fd5b506101596103d6366004612276565b61164a565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461042c5760405162461bcd60e51b815260040161042390612791565b60405180910390fd5b600160008561ffff1661ffff1681526020019081526020016000208054600181600116156101000203166002900490508351148015610499575061ffff8416600090815260016020526040908190209051610487919061263a565b60405180910390208380519060200120145b6104b55760405162461bcd60e51b81526004016104239061286e565b602081015160ff81166001141561061c576000806000806000806000888060200190518101906104e5919061241e565b9750975097509750975097509750506000601483015190507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a18fa8048e8a8a896040518563ffffffff1660e01b815260040161054f9493929190612be5565b600060405180830381600087803b15801561056957600080fd5b505af115801561057d573d6000803e3d6000fd5b505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632f9255558e8e8e8c8c8c888c8b6040518a63ffffffff1660e01b81526004016105dd999897969594939291906129f0565b600060405180830381600087803b1580156105f757600080fd5b505af115801561060b573d6000803e3d6000fd5b505050505050505050505050610976565b60ff8116600214156106d45760008060008480602001905181019061064191906122e2565b935093509350507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a18fa804898585856040518563ffffffff1660e01b815260040161069a9493929190612be5565b600060405180830381600087803b1580156106b457600080fd5b505af11580156106c8573d6000803e3d6000fd5b50505050505050610976565b60ff81166003141561082f57600080600080600080878060200190518101906106fd91906123a6565b965096509650965096509650506000601482015190507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a18fa8048d8989896040518563ffffffff1660e01b81526004016107659493929190612be5565b600060405180830381600087803b15801561077f57600080fd5b505af1158015610793573d6000803e3d6000fd5b5050604051630fee425360e31b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169250637f72129891506107f1908f908f908f908d908d9089908d908d9060040161298d565b600060405180830381600087803b15801561080b57600080fd5b505af115801561081f573d6000803e3d6000fd5b5050505050505050505050610976565b60ff81166004141561097657600080600080600086806020019051810190610857919061232b565b95509550955095509550507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a18fa8048b8787876040518563ffffffff1660e01b81526004016108b49493929190612be5565b600060405180830381600087803b1580156108ce57600080fd5b505af11580156108e2573d6000803e3d6000fd5b5050604051630403bce560e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169250630403bce5915061093e908d908d908d908b908b908a908a90600401612a73565b600060405180830381600087803b15801561095857600080fd5b505af115801561096c573d6000803e3d6000fd5b5050505050505050505b5050505050565b600260209081526000928352604080842090915290825290205481565b7f000000000000000000000000000000000000000000000000000000000000000081565b6109c6611705565b6001600160a01b03166109d76110be565b6001600160a01b031614610a20576040805162461bcd60e51b81526020600482018190526024820152600080516020612f3d833981519152604482015290519081900360640190fd5b6040516307e0db1760e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906307e0db1790610a6c9084906004016128e6565b600060405180830381600087803b158015610a8657600080fd5b505af1158015610976573d6000803e3d6000fd5b60408051602080820183526000808352835180850190945260018085529184018290529283929160ff8b161415610b3f5760006040518060c001604052806001815260200160018152602001600181526020016001815260200160018152602001600181525090506001600080600085858f8f8f8f604051602001610b289a99989796959493929190612c22565b604051602081830303815290604052925050610bec565b60ff8a1660021415610b7a57600260008083604051602001610b649493929190612c9d565b6040516020818303038152906040529150610bec565b60ff8a1660031415610ba8576003600080836000808e8e604051602001610b64989796959493929190612d09565b60ff8a1660041415610bd45760046000808360008d8d604051602001610b649796959493929190612cc4565b60405162461bcd60e51b8152600401610423906127e7565b6000610bf98c8c88611709565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166340a7bb108d3086600360009054906101000a900460ff16866040518663ffffffff1660e01b8152600401610c5e959493929190612912565b604080518083038186803b158015610c7557600080fd5b505afa158015610c89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cad91906122a3565b9450945050505097509795505050505050565b610cc8611705565b6001600160a01b0316610cd96110be565b6001600160a01b031614610d22576040805162461bcd60e51b81526020600482018190526024820152600080516020612f3d833981519152604482015290519081900360640190fd5b6040516310ddb13760e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906310ddb13790610a6c9084906004016128e6565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610db65760405162461bcd60e51b81526004016104239061282c565b60006004898988888888604051602001610dd69796959493929190612d8c565b6040516020818303038152906040529050610df58a600489858561179a565b50505050505050505050565b610e09611705565b6001600160a01b0316610e1a6110be565b6001600160a01b031614610e63576040805162461bcd60e51b81526020600482018190526024820152600080516020612f3d833981519152604482015290519081900360640190fd5b6040516342d65a8d60e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906342d65a8d90610eb390869086908690600401612966565b600060405180830381600087803b158015610ecd57600080fd5b505af1158015610ee1573d6000803e3d6000fd5b50505050505050565b610ef2611705565b6001600160a01b0316610f036110be565b6001600160a01b031614610f4c576040805162461bcd60e51b81526020600482018190526024820152600080516020612f3d833981519152604482015290519081900360640190fd5b61ffff83166000908152600160208190526040909120546002918116156101000260001901160415610f905760405162461bcd60e51b8152600401610423906128af565b61ffff83166000908152600160205260409020610fae9083836119f4565b50505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610ffc5760405162461bcd60e51b81526004016104239061282c565b8451604051600091611024916001918e918e91908d908d908c908c908c908c90602001612e0a565b60405160208183030381529060405290506110438c60018b898561179a565b505050505050505050505050565b611059611705565b6001600160a01b031661106a6110be565b6001600160a01b0316146110b3576040805162461bcd60e51b81526020600482018190526024820152600080516020612f3d833981519152604482015290519081900360640190fd5b565b60035460ff1681565b6000546001600160a01b031690565b60016020818152600092835260409283902080548451600294821615610100026000190190911693909304601f810183900483028401830190945283835291929083018282801561115f5780601f106111345761010080835404028352916020019161115f565b820191906000526020600020905b81548152906001019060200180831161114257829003601f168201915b505050505081565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146111af5760405162461bcd60e51b81526004016104239061282c565b60606000806000806000868060200190518101906111cd9190612533565b9550955095509550955050600384868b8686866040516020016111f69796959493929190612dc8565b6040516020818303038152906040529550505050505061121a86600387868561179a565b505050505050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461126a5760405162461bcd60e51b81526004016104239061282c565b600060028585846040516020016112849493929190612d67565b604051602081830303815290604052905060006040518060600160405280600081526020016000815260200160405180604001604052806002815260200161060f60f31b8152508152509050610ee187600286848661179a565b6112e6611705565b6001600160a01b03166112f76110be565b6001600160a01b031614611340576040805162461bcd60e51b81526020600482018190526024820152600080516020612f3d833981519152604482015290519081900360640190fd5b6003805460ff1916911515919091179055565b61135b611705565b6001600160a01b031661136c6110be565b6001600160a01b0316146113b5576040805162461bcd60e51b81526020600482018190526024820152600080516020612f3d833981519152604482015290519081900360640190fd5b6040516332fb62e760e21b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063cbed8b9c906114099088908890889088908890600401612bac565b600060405180830381600087803b15801561142357600080fd5b505af1158015611437573d6000803e3d6000fd5b505050505050505050565b61144a611705565b6001600160a01b031661145b6110be565b6001600160a01b0316146114a4576040805162461bcd60e51b81526020600482018190526024820152600080516020612f3d833981519152604482015290519081900360640190fd5b60405163095ea7b360e01b81526001600160a01b0384169063095ea7b3906114d29085908590600401612719565b602060405180830381600087803b1580156114ec57600080fd5b505af1158015611500573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fae9190611d7d565b61152c611705565b6001600160a01b031661153d6110be565b6001600160a01b031614611586576040805162461bcd60e51b81526020600482018190526024820152600080516020612f3d833981519152604482015290519081900360640190fd5b6001600160a01b0381166115cb5760405162461bcd60e51b8152600401808060200182810382526026815260200180612f176026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b7f000000000000000000000000000000000000000000000000000000000000000081565b611652611705565b6001600160a01b03166116636110be565b6001600160a01b0316146116ac576040805162461bcd60e51b81526020600482018190526024820152600080516020612f3d833981519152604482015290519081900360640190fd5b60018260ff16101580156116c4575060048260ff1611155b6116e05760405162461bcd60e51b815260040161042390612750565b61ffff909216600090815260026020908152604080832060ff90941683529290522055565b3390565b60408082015160140151825161ffff861660009081526002602090815284822060ff8816835290529283205460609384939290916117469161192c565b90506000856020015111801561176457506001600160a01b03821615155b156117835761177c818660200151876040015161198d565b925061178f565b61178c816119c3565b92505b509095945050505050565b60006117a7868685611709565b905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316637a14574888306040518363ffffffff1660e01b81526004016117f99291906128f5565b60206040518083038186803b15801561181157600080fd5b505afa158015611825573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061184991906122c6565b61ffff8816600090815260016020819052604091829020915162c5803160e81b8152920192506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163c58031009134916118b8918c9189908c9030908b90600401612ad1565b6000604051808303818588803b1580156118d157600080fd5b505af11580156118e5573d6000803e3d6000fd5b50505050507f8d3ee0df6a4b7e82a7f20a763f1c6826e6176323e655af64f32318827d2112d4868260405161191b929190612e34565b60405180910390a150505050505050565b600082820183811015611986576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6040516060906002906119aa9082908790879087906020016126c7565b6040516020818303038152906040529150509392505050565b6040516060906001906119dc90829085906020016126aa565b6040516020818303038152906040529150505b919050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282611a2a5760008555611a70565b82601f10611a435782800160ff19823516178555611a70565b82800160010185558215611a70579182015b82811115611a70578235825591602001919060010190611a55565b50611a7c929150611a80565b5090565b5b80821115611a7c5760008155600101611a81565b80356119ef81612ecc565b60008083601f840112611ab1578182fd5b5081356001600160401b03811115611ac7578182fd5b602083019150836020828501011115611adf57600080fd5b9250929050565b600082601f830112611af6578081fd5b8135611b09611b0482612e73565b612e50565b818152846020838601011115611b1d578283fd5b816020850160208301379081016020019190915292915050565b600082601f830112611b47578081fd5b8151611b55611b0482612e73565b818152846020838601011115611b69578283fd5b611b7a826020830160208701612ea0565b949350505050565b600060408284031215611b93578081fd5b604051604081018181106001600160401b0382111715611baf57fe5b604052823581526020928301359281019290925250919050565b600060408284031215611bda578081fd5b604051604081018181106001600160401b0382111715611bf657fe5b604052825181526020928301519281019290925250919050565b600060c08284031215611c21578081fd5b60405160c081018181106001600160401b0382111715611c3d57fe5b8060405250809150823581526020830135602082015260408301356040820152606083013560608201526080830135608082015260a083013560a08201525092915050565b600060608284031215611c93578081fd5b604051606081016001600160401b038282108183111715611cb057fe5b8160405282935084358352602085013560208401526040850135915080821115611cd957600080fd5b50611ce685828601611ae6565b6040830152505092915050565b803561ffff811681146119ef57600080fd5b600060208284031215611d16578081fd5b813561198681612ecc565b600080600060608486031215611d35578182fd5b8335611d4081612ecc565b92506020840135611d5081612ecc565b929592945050506040919091013590565b600060208284031215611d72578081fd5b813561198681612ee4565b600060208284031215611d8e578081fd5b815161198681612ee4565b600060208284031215611daa578081fd5b61198682611cf3565b600080600080600060c08688031215611dca578283fd5b611dd386611cf3565b94506020860135611de381612ecc565b9350611df28760408801611b82565b925060808601356001600160401b0380821115611e0d578283fd5b611e1989838a01611c82565b935060a0880135915080821115611e2e578283fd5b50611e3b88828901611ae6565b9150509295509295909350565b600080600060408486031215611e5c578081fd5b611e6584611cf3565b925060208401356001600160401b03811115611e7f578182fd5b611e8b86828701611aa0565b9497909650939450505050565b60008060008060808587031215611ead578182fd5b611eb685611cf3565b935060208501356001600160401b0380821115611ed1578384fd5b611edd88838901611ae6565b945060408701359150611eef82612ef2565b90925060608601359080821115611f04578283fd5b50611f1187828801611ae6565b91505092959194509250565b600080600080600060808688031215611f34578283fd5b611f3d86611cf3565b9450611f4b60208701611cf3565b93506040860135925060608601356001600160401b03811115611f6c578182fd5b611f7888828901611aa0565b969995985093965092949392505050565b600080600080600060c08688031215611fa0578283fd5b611fa986611cf3565b945060208601359350604086013592506060860135611fc781612ecc565b9150611fd68760808801611b82565b90509295509295909350565b60008060008060008060008060008060006101e08c8e031215612003578889fd5b61200c8c611cf3565b9a5060208c0135995060408c0135985061202860608d01611a95565b97506120378d60808e01611b82565b96506120468d60c08e01611c10565b95506001600160401b03806101808e01351115612061578586fd5b6120728e6101808f01358f01611c82565b9550806101a08e01351115612085578485fd5b6120968e6101a08f01358f01611aa0565b90955093506101c08d01358110156120ac578283fd5b506120be8d6101c08e01358e01611aa0565b81935080925050509295989b509295989b9093969950565b60008060008060008060008060006101208a8c0312156120f4578283fd5b6120fd8a611cf3565b985060208a0135975060408a0135965060608a013561211b81612ecc565b955061212a8b60808c01611b82565b945060c08a0135935060e08a01356001600160401b038082111561214c578485fd5b6121588d838e01611aa0565b90955093506101008c0135915080821115612171578283fd5b5061217e8c828d01611c82565b9150509295985092959850929598565b600080604083850312156121a0578182fd5b6121a983611cf3565b915060208301356121b981612f07565b809150509250929050565b600080600080600080600060a0888a0312156121de578081fd5b6121e788611cf3565b965060208801356121f781612f07565b955060408801356001600160401b0380821115612212578283fd5b61221e8b838c01611aa0565b909750955060608a0135915080821115612236578283fd5b6122428b838c01611aa0565b909550935060808a013591508082111561225a578283fd5b506122678a828b01611c82565b91505092959891949750929550565b60008060006060848603121561228a578081fd5b61229384611cf3565b92506020840135611d5081612f07565b600080604083850312156122b5578182fd5b505080516020909101519092909150565b6000602082840312156122d7578081fd5b815161198681612ef2565b60008060008060a085870312156122f7578182fd5b845161230281612f07565b60208601516040870151919550935091506123208660608701611bc9565b905092959194509250565b60008060008060008060e08789031215612343578384fd5b865161234e81612f07565b602088015160408901519197509550935061236c8860608901611bc9565b925060a0870151915060c08701516001600160401b0381111561238d578182fd5b61239989828a01611b37565b9150509295509295509295565b6000806000806000806000610100888a0312156123c1578081fd5b87516123cc81612f07565b602089015160408a0151919850965094506123ea8960608a01611bc9565b935060a0880151925060c0880151915060e08801516001600160401b03811115612412578182fd5b6122678a828b01611b37565b600080600080600080600080888a036101c081121561243b578283fd5b895161244681612f07565b8099505060208a0151975060408a0151965060608a0151955061246c8b60808c01611bc9565b945060c060bf198201121561247f578283fd5b5060405160c081016001600160401b03828210818311171561249d57fe5b604082815260c08d0151845260e08d015160208501526101008d0151908401526101208c015160608401526101408c015160808401526101608c015160a08401526101808c0151929550808311156124f3578485fd5b6124ff8d848e01611b37565b94506101a08c0151925080831115612515578384fd5b50506125238b828c01611b37565b9150509295985092959890939650565b60008060008060008060c0878903121561254b578384fd5b865161255681612f07565b809650506020870151945060408701519350606087015192506080870151915060a08701516001600160401b0381111561238d578182fd5b6001600160a01b03169052565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b600081518084526125dd816020860160208601612ea0565b601f01601f19169290920160200192915050565b80518252602090810151910152565b805182526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a08301525050565b600080835460018082166000811461265957600181146126705761269f565b60ff198316865260028304607f168601935061269f565b600283048786526020808720875b838110156126975781548a82015290850190820161267e565b505050860193505b509195945050505050565b60f09290921b6001600160f01b0319168252600282015260220190565b600061ffff60f01b8660f01b16825284600283015283602283015282516126f5816042850160208701612ea0565b9190910160420195945050505050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b60006020825261198660208301846125c5565b60208082526021908201527f4d6972726f72676174653a20696e76616c6964205f66756e6374696f6e5479706040820152606560f81b606082015260800190565b60208082526036908201527f4d6972726f72676174653a206f6e6c79204c617965725a65726f20656e64706f604082015275696e742063616e2063616c6c206c7a5265636569766560501b606082015260800190565b60208082526025908201527f4d6972726f72676174653a20756e737570706f727465642066756e6374696f6e604082015264207479706560d81b606082015260800190565b60208082526022908201527f4d6972726f72676174653a2063616c6c6572206d75737420626520526f757465604082015261391760f11b606082015260800190565b60208082526021908201527f4d6972726f72676174653a2062726964676520646f6573206e6f74206d6174636040820152600d60fb1b606082015260800190565b6020808252601f908201527f4d6972726f72676174653a2042726964676520616c7265616479207365742100604082015260600190565b61ffff91909116815260200190565b61ffff9290921682526001600160a01b0316602082015260400190565b61ffff861681526001600160a01b038516602082015260a060408201819052600090612940908301866125c5565b8415156060840152828103608084015261295a81856125c5565b98975050505050505050565b600061ffff851682526040602083015261298460408301848661259b565b95945050505050565b600061010061ffff8b1683528060208401526129ab8184018b6125c5565b6001600160401b039990991660408401525050606081019590955260808501939093526001600160a01b039190911660a084015260c083015260e09091015292915050565b60006101c061ffff8c168352806020840152612a0e8184018c6125c5565b6001600160401b038b166040850152606084018a90526080840189905260a084018890526001600160a01b03871660c08501529050612a5060e0840186612600565b8281036101a0840152612a6381856125c5565b9c9b505050505050505050505050565b600061ffff8916825260e06020830152612a9060e08301896125c5565b6001600160401b03881660408401528660608401528560808401528460a084015282810360c0840152612ac381856125c5565b9a9950505050505050505050565b600060c0820161ffff89168352602060c081850152828954600180821660008114612b035760018114612b2257612b5a565b60028304607f16865260ff19831660e089015261010088019350612b5a565b60028304808752612b328e612e94565b885b82811015612b505781548b820160e00152908401908701612b34565b8a0160e001955050505b5050508481036040860152612b6f818a6125c5565b92505050612b80606084018761258e565b612b8d608084018661258e565b82810360a0840152612b9f81856125c5565b9998505050505050505050565b600061ffff808816835280871660208401525084604083015260806060830152612bda60808301848661259b565b979650505050505050565b61ffff85168152602081018490526040810183905260a0810161298460608301846125f1565b90815260200190565b918252602082015260400190565b60006101c060ff8d16835260ff8c16602084015260ff8b16604084015260ff8a166060840152612c55608084018a6125f1565b612c6260c0840189612600565b80610180840152612c76818401878961259b565b90508281036101a0840152612c8c81858761259b565b9d9c50505050505050505050505050565b60ff858116825284811660208301528316604082015260a0810161298460608301846125f1565b600060ff8916825260ff8816602083015260ff87166040830152612ceb60608301876125f1565b60ff851660a083015260e060c0830152612b9f60e08301848661259b565b600061010060ff8b16835260ff8a16602084015260ff89166040840152612d3360608401896125f1565b60ff871660a084015260ff861660c08401528060e0840152612d58818401858761259b565b9b9a5050505050505050505050565b60ff85168152602081018490526040810183905260a0810161298460608301846125f1565b600060ff89168252876020830152866040830152612dad60608301876125f1565b8460a083015260e060c0830152612b9f60e08301848661259b565b600061010060ff8a168352886020840152876040840152612dec60608401886125f1565b8560a08401528460c08401528060e0840152612ac3818401856125c5565b60006101c060ff8d1683528b60208401528a6040840152896060840152612c55608084018a6125f1565b60ff9290921682526001600160401b0316602082015260400190565b6040518181016001600160401b0381118282101715612e6b57fe5b604052919050565b60006001600160401b03821115612e8657fe5b50601f01601f191660200190565b60009081526020902090565b60005b83811015612ebb578181015183820152602001612ea3565b83811115610fae5750506000910152565b6001600160a01b0381168114612ee157600080fd5b50565b8015158114612ee157600080fd5b6001600160401b0381168114612ee157600080fd5b60ff81168114612ee157600080fdfe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a2646970667358221220f5b8bb5ace48f6f35a36dee44f31a5bbcba9578fea9b566ec79e760a0889e6b264736f6c63430007060033",
  749. "deployedBytecode": "0x6080604052600436106101345760003560e01c80638c7ae0fc116100ab578063c213dc2b1161006f578063c213dc2b14610326578063cbed8b9c14610346578063d7d3c3b914610366578063f2fde38b14610386578063f887ea40146103a6578063fc869108146103bb57610134565b80638c7ae0fc1461029c5780638da5cb5b146102be5780638e3b5d6a146102d357806396aae4af14610300578063be9d40ac1461031357610134565b806310ddb137116100fd57806310ddb137146102015780633cef94b91461022157806342d65a8d1461023457806343b180091461025457806351156e7314610274578063715018a61461028757610134565b80621d356714610139578063024220541461015b57806307968db11461019157806307e0db17146101b35780630a512369146101d3575b600080fd5b34801561014557600080fd5b50610159610154366004611e98565b6103db565b005b34801561016757600080fd5b5061017b61017636600461218e565b61097d565b6040516101889190612c0b565b60405180910390f35b34801561019d57600080fd5b506101a661099a565b6040516101889190612705565b3480156101bf57600080fd5b506101596101ce366004611d99565b6109be565b3480156101df57600080fd5b506101f36101ee3660046121c4565b610a9a565b604051610188929190612c14565b34801561020d57600080fd5b5061015961021c366004611d99565b610cc0565b61015961022f3660046120d6565b610d6e565b34801561024057600080fd5b5061015961024f366004611e48565b610e01565b34801561026057600080fd5b5061015961026f366004611e48565b610eea565b610159610282366004611fe2565b610fb4565b34801561029357600080fd5b50610159611051565b3480156102a857600080fd5b506102b16110b5565b6040516101889190612732565b3480156102ca57600080fd5b506101a66110be565b3480156102df57600080fd5b506102f36102ee366004611d99565b6110cd565b604051610188919061273d565b61015961030e366004611db3565b611167565b610159610321366004611f89565b611222565b34801561033257600080fd5b50610159610341366004611d61565b6112de565b34801561035257600080fd5b50610159610361366004611f1d565b611353565b34801561037257600080fd5b50610159610381366004611d21565b611442565b34801561039257600080fd5b506101596103a1366004611d05565b611524565b3480156103b257600080fd5b506101a6611626565b3480156103c757600080fd5b506101596103d6366004612276565b61164a565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461042c5760405162461bcd60e51b815260040161042390612791565b60405180910390fd5b600160008561ffff1661ffff1681526020019081526020016000208054600181600116156101000203166002900490508351148015610499575061ffff8416600090815260016020526040908190209051610487919061263a565b60405180910390208380519060200120145b6104b55760405162461bcd60e51b81526004016104239061286e565b602081015160ff81166001141561061c576000806000806000806000888060200190518101906104e5919061241e565b9750975097509750975097509750506000601483015190507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a18fa8048e8a8a896040518563ffffffff1660e01b815260040161054f9493929190612be5565b600060405180830381600087803b15801561056957600080fd5b505af115801561057d573d6000803e3d6000fd5b505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632f9255558e8e8e8c8c8c888c8b6040518a63ffffffff1660e01b81526004016105dd999897969594939291906129f0565b600060405180830381600087803b1580156105f757600080fd5b505af115801561060b573d6000803e3d6000fd5b505050505050505050505050610976565b60ff8116600214156106d45760008060008480602001905181019061064191906122e2565b935093509350507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a18fa804898585856040518563ffffffff1660e01b815260040161069a9493929190612be5565b600060405180830381600087803b1580156106b457600080fd5b505af11580156106c8573d6000803e3d6000fd5b50505050505050610976565b60ff81166003141561082f57600080600080600080878060200190518101906106fd91906123a6565b965096509650965096509650506000601482015190507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a18fa8048d8989896040518563ffffffff1660e01b81526004016107659493929190612be5565b600060405180830381600087803b15801561077f57600080fd5b505af1158015610793573d6000803e3d6000fd5b5050604051630fee425360e31b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169250637f72129891506107f1908f908f908f908d908d9089908d908d9060040161298d565b600060405180830381600087803b15801561080b57600080fd5b505af115801561081f573d6000803e3d6000fd5b5050505050505050505050610976565b60ff81166004141561097657600080600080600086806020019051810190610857919061232b565b95509550955095509550507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a18fa8048b8787876040518563ffffffff1660e01b81526004016108b49493929190612be5565b600060405180830381600087803b1580156108ce57600080fd5b505af11580156108e2573d6000803e3d6000fd5b5050604051630403bce560e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169250630403bce5915061093e908d908d908d908b908b908a908a90600401612a73565b600060405180830381600087803b15801561095857600080fd5b505af115801561096c573d6000803e3d6000fd5b5050505050505050505b5050505050565b600260209081526000928352604080842090915290825290205481565b7f000000000000000000000000000000000000000000000000000000000000000081565b6109c6611705565b6001600160a01b03166109d76110be565b6001600160a01b031614610a20576040805162461bcd60e51b81526020600482018190526024820152600080516020612f3d833981519152604482015290519081900360640190fd5b6040516307e0db1760e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906307e0db1790610a6c9084906004016128e6565b600060405180830381600087803b158015610a8657600080fd5b505af1158015610976573d6000803e3d6000fd5b60408051602080820183526000808352835180850190945260018085529184018290529283929160ff8b161415610b3f5760006040518060c001604052806001815260200160018152602001600181526020016001815260200160018152602001600181525090506001600080600085858f8f8f8f604051602001610b289a99989796959493929190612c22565b604051602081830303815290604052925050610bec565b60ff8a1660021415610b7a57600260008083604051602001610b649493929190612c9d565b6040516020818303038152906040529150610bec565b60ff8a1660031415610ba8576003600080836000808e8e604051602001610b64989796959493929190612d09565b60ff8a1660041415610bd45760046000808360008d8d604051602001610b649796959493929190612cc4565b60405162461bcd60e51b8152600401610423906127e7565b6000610bf98c8c88611709565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166340a7bb108d3086600360009054906101000a900460ff16866040518663ffffffff1660e01b8152600401610c5e959493929190612912565b604080518083038186803b158015610c7557600080fd5b505afa158015610c89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cad91906122a3565b9450945050505097509795505050505050565b610cc8611705565b6001600160a01b0316610cd96110be565b6001600160a01b031614610d22576040805162461bcd60e51b81526020600482018190526024820152600080516020612f3d833981519152604482015290519081900360640190fd5b6040516310ddb13760e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906310ddb13790610a6c9084906004016128e6565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610db65760405162461bcd60e51b81526004016104239061282c565b60006004898988888888604051602001610dd69796959493929190612d8c565b6040516020818303038152906040529050610df58a600489858561179a565b50505050505050505050565b610e09611705565b6001600160a01b0316610e1a6110be565b6001600160a01b031614610e63576040805162461bcd60e51b81526020600482018190526024820152600080516020612f3d833981519152604482015290519081900360640190fd5b6040516342d65a8d60e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906342d65a8d90610eb390869086908690600401612966565b600060405180830381600087803b158015610ecd57600080fd5b505af1158015610ee1573d6000803e3d6000fd5b50505050505050565b610ef2611705565b6001600160a01b0316610f036110be565b6001600160a01b031614610f4c576040805162461bcd60e51b81526020600482018190526024820152600080516020612f3d833981519152604482015290519081900360640190fd5b61ffff83166000908152600160208190526040909120546002918116156101000260001901160415610f905760405162461bcd60e51b8152600401610423906128af565b61ffff83166000908152600160205260409020610fae9083836119f4565b50505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610ffc5760405162461bcd60e51b81526004016104239061282c565b8451604051600091611024916001918e918e91908d908d908c908c908c908c90602001612e0a565b60405160208183030381529060405290506110438c60018b898561179a565b505050505050505050505050565b611059611705565b6001600160a01b031661106a6110be565b6001600160a01b0316146110b3576040805162461bcd60e51b81526020600482018190526024820152600080516020612f3d833981519152604482015290519081900360640190fd5b565b60035460ff1681565b6000546001600160a01b031690565b60016020818152600092835260409283902080548451600294821615610100026000190190911693909304601f810183900483028401830190945283835291929083018282801561115f5780601f106111345761010080835404028352916020019161115f565b820191906000526020600020905b81548152906001019060200180831161114257829003601f168201915b505050505081565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146111af5760405162461bcd60e51b81526004016104239061282c565b60606000806000806000868060200190518101906111cd9190612533565b9550955095509550955050600384868b8686866040516020016111f69796959493929190612dc8565b6040516020818303038152906040529550505050505061121a86600387868561179a565b505050505050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461126a5760405162461bcd60e51b81526004016104239061282c565b600060028585846040516020016112849493929190612d67565b604051602081830303815290604052905060006040518060600160405280600081526020016000815260200160405180604001604052806002815260200161060f60f31b8152508152509050610ee187600286848661179a565b6112e6611705565b6001600160a01b03166112f76110be565b6001600160a01b031614611340576040805162461bcd60e51b81526020600482018190526024820152600080516020612f3d833981519152604482015290519081900360640190fd5b6003805460ff1916911515919091179055565b61135b611705565b6001600160a01b031661136c6110be565b6001600160a01b0316146113b5576040805162461bcd60e51b81526020600482018190526024820152600080516020612f3d833981519152604482015290519081900360640190fd5b6040516332fb62e760e21b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063cbed8b9c906114099088908890889088908890600401612bac565b600060405180830381600087803b15801561142357600080fd5b505af1158015611437573d6000803e3d6000fd5b505050505050505050565b61144a611705565b6001600160a01b031661145b6110be565b6001600160a01b0316146114a4576040805162461bcd60e51b81526020600482018190526024820152600080516020612f3d833981519152604482015290519081900360640190fd5b60405163095ea7b360e01b81526001600160a01b0384169063095ea7b3906114d29085908590600401612719565b602060405180830381600087803b1580156114ec57600080fd5b505af1158015611500573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fae9190611d7d565b61152c611705565b6001600160a01b031661153d6110be565b6001600160a01b031614611586576040805162461bcd60e51b81526020600482018190526024820152600080516020612f3d833981519152604482015290519081900360640190fd5b6001600160a01b0381166115cb5760405162461bcd60e51b8152600401808060200182810382526026815260200180612f176026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b7f000000000000000000000000000000000000000000000000000000000000000081565b611652611705565b6001600160a01b03166116636110be565b6001600160a01b0316146116ac576040805162461bcd60e51b81526020600482018190526024820152600080516020612f3d833981519152604482015290519081900360640190fd5b60018260ff16101580156116c4575060048260ff1611155b6116e05760405162461bcd60e51b815260040161042390612750565b61ffff909216600090815260026020908152604080832060ff90941683529290522055565b3390565b60408082015160140151825161ffff861660009081526002602090815284822060ff8816835290529283205460609384939290916117469161192c565b90506000856020015111801561176457506001600160a01b03821615155b156117835761177c818660200151876040015161198d565b925061178f565b61178c816119c3565b92505b509095945050505050565b60006117a7868685611709565b905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316637a14574888306040518363ffffffff1660e01b81526004016117f99291906128f5565b60206040518083038186803b15801561181157600080fd5b505afa158015611825573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061184991906122c6565b61ffff8816600090815260016020819052604091829020915162c5803160e81b8152920192506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163c58031009134916118b8918c9189908c9030908b90600401612ad1565b6000604051808303818588803b1580156118d157600080fd5b505af11580156118e5573d6000803e3d6000fd5b50505050507f8d3ee0df6a4b7e82a7f20a763f1c6826e6176323e655af64f32318827d2112d4868260405161191b929190612e34565b60405180910390a150505050505050565b600082820183811015611986576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6040516060906002906119aa9082908790879087906020016126c7565b6040516020818303038152906040529150509392505050565b6040516060906001906119dc90829085906020016126aa565b6040516020818303038152906040529150505b919050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282611a2a5760008555611a70565b82601f10611a435782800160ff19823516178555611a70565b82800160010185558215611a70579182015b82811115611a70578235825591602001919060010190611a55565b50611a7c929150611a80565b5090565b5b80821115611a7c5760008155600101611a81565b80356119ef81612ecc565b60008083601f840112611ab1578182fd5b5081356001600160401b03811115611ac7578182fd5b602083019150836020828501011115611adf57600080fd5b9250929050565b600082601f830112611af6578081fd5b8135611b09611b0482612e73565b612e50565b818152846020838601011115611b1d578283fd5b816020850160208301379081016020019190915292915050565b600082601f830112611b47578081fd5b8151611b55611b0482612e73565b818152846020838601011115611b69578283fd5b611b7a826020830160208701612ea0565b949350505050565b600060408284031215611b93578081fd5b604051604081018181106001600160401b0382111715611baf57fe5b604052823581526020928301359281019290925250919050565b600060408284031215611bda578081fd5b604051604081018181106001600160401b0382111715611bf657fe5b604052825181526020928301519281019290925250919050565b600060c08284031215611c21578081fd5b60405160c081018181106001600160401b0382111715611c3d57fe5b8060405250809150823581526020830135602082015260408301356040820152606083013560608201526080830135608082015260a083013560a08201525092915050565b600060608284031215611c93578081fd5b604051606081016001600160401b038282108183111715611cb057fe5b8160405282935084358352602085013560208401526040850135915080821115611cd957600080fd5b50611ce685828601611ae6565b6040830152505092915050565b803561ffff811681146119ef57600080fd5b600060208284031215611d16578081fd5b813561198681612ecc565b600080600060608486031215611d35578182fd5b8335611d4081612ecc565b92506020840135611d5081612ecc565b929592945050506040919091013590565b600060208284031215611d72578081fd5b813561198681612ee4565b600060208284031215611d8e578081fd5b815161198681612ee4565b600060208284031215611daa578081fd5b61198682611cf3565b600080600080600060c08688031215611dca578283fd5b611dd386611cf3565b94506020860135611de381612ecc565b9350611df28760408801611b82565b925060808601356001600160401b0380821115611e0d578283fd5b611e1989838a01611c82565b935060a0880135915080821115611e2e578283fd5b50611e3b88828901611ae6565b9150509295509295909350565b600080600060408486031215611e5c578081fd5b611e6584611cf3565b925060208401356001600160401b03811115611e7f578182fd5b611e8b86828701611aa0565b9497909650939450505050565b60008060008060808587031215611ead578182fd5b611eb685611cf3565b935060208501356001600160401b0380821115611ed1578384fd5b611edd88838901611ae6565b945060408701359150611eef82612ef2565b90925060608601359080821115611f04578283fd5b50611f1187828801611ae6565b91505092959194509250565b600080600080600060808688031215611f34578283fd5b611f3d86611cf3565b9450611f4b60208701611cf3565b93506040860135925060608601356001600160401b03811115611f6c578182fd5b611f7888828901611aa0565b969995985093965092949392505050565b600080600080600060c08688031215611fa0578283fd5b611fa986611cf3565b945060208601359350604086013592506060860135611fc781612ecc565b9150611fd68760808801611b82565b90509295509295909350565b60008060008060008060008060008060006101e08c8e031215612003578889fd5b61200c8c611cf3565b9a5060208c0135995060408c0135985061202860608d01611a95565b97506120378d60808e01611b82565b96506120468d60c08e01611c10565b95506001600160401b03806101808e01351115612061578586fd5b6120728e6101808f01358f01611c82565b9550806101a08e01351115612085578485fd5b6120968e6101a08f01358f01611aa0565b90955093506101c08d01358110156120ac578283fd5b506120be8d6101c08e01358e01611aa0565b81935080925050509295989b509295989b9093969950565b60008060008060008060008060006101208a8c0312156120f4578283fd5b6120fd8a611cf3565b985060208a0135975060408a0135965060608a013561211b81612ecc565b955061212a8b60808c01611b82565b945060c08a0135935060e08a01356001600160401b038082111561214c578485fd5b6121588d838e01611aa0565b90955093506101008c0135915080821115612171578283fd5b5061217e8c828d01611c82565b9150509295985092959850929598565b600080604083850312156121a0578182fd5b6121a983611cf3565b915060208301356121b981612f07565b809150509250929050565b600080600080600080600060a0888a0312156121de578081fd5b6121e788611cf3565b965060208801356121f781612f07565b955060408801356001600160401b0380821115612212578283fd5b61221e8b838c01611aa0565b909750955060608a0135915080821115612236578283fd5b6122428b838c01611aa0565b909550935060808a013591508082111561225a578283fd5b506122678a828b01611c82565b91505092959891949750929550565b60008060006060848603121561228a578081fd5b61229384611cf3565b92506020840135611d5081612f07565b600080604083850312156122b5578182fd5b505080516020909101519092909150565b6000602082840312156122d7578081fd5b815161198681612ef2565b60008060008060a085870312156122f7578182fd5b845161230281612f07565b60208601516040870151919550935091506123208660608701611bc9565b905092959194509250565b60008060008060008060e08789031215612343578384fd5b865161234e81612f07565b602088015160408901519197509550935061236c8860608901611bc9565b925060a0870151915060c08701516001600160401b0381111561238d578182fd5b61239989828a01611b37565b9150509295509295509295565b6000806000806000806000610100888a0312156123c1578081fd5b87516123cc81612f07565b602089015160408a0151919850965094506123ea8960608a01611bc9565b935060a0880151925060c0880151915060e08801516001600160401b03811115612412578182fd5b6122678a828b01611b37565b600080600080600080600080888a036101c081121561243b578283fd5b895161244681612f07565b8099505060208a0151975060408a0151965060608a0151955061246c8b60808c01611bc9565b945060c060bf198201121561247f578283fd5b5060405160c081016001600160401b03828210818311171561249d57fe5b604082815260c08d0151845260e08d015160208501526101008d0151908401526101208c015160608401526101408c015160808401526101608c015160a08401526101808c0151929550808311156124f3578485fd5b6124ff8d848e01611b37565b94506101a08c0151925080831115612515578384fd5b50506125238b828c01611b37565b9150509295985092959890939650565b60008060008060008060c0878903121561254b578384fd5b865161255681612f07565b809650506020870151945060408701519350606087015192506080870151915060a08701516001600160401b0381111561238d578182fd5b6001600160a01b03169052565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b600081518084526125dd816020860160208601612ea0565b601f01601f19169290920160200192915050565b80518252602090810151910152565b805182526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a08301525050565b600080835460018082166000811461265957600181146126705761269f565b60ff198316865260028304607f168601935061269f565b600283048786526020808720875b838110156126975781548a82015290850190820161267e565b505050860193505b509195945050505050565b60f09290921b6001600160f01b0319168252600282015260220190565b600061ffff60f01b8660f01b16825284600283015283602283015282516126f5816042850160208701612ea0565b9190910160420195945050505050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b60006020825261198660208301846125c5565b60208082526021908201527f4d6972726f72676174653a20696e76616c6964205f66756e6374696f6e5479706040820152606560f81b606082015260800190565b60208082526036908201527f4d6972726f72676174653a206f6e6c79204c617965725a65726f20656e64706f604082015275696e742063616e2063616c6c206c7a5265636569766560501b606082015260800190565b60208082526025908201527f4d6972726f72676174653a20756e737570706f727465642066756e6374696f6e604082015264207479706560d81b606082015260800190565b60208082526022908201527f4d6972726f72676174653a2063616c6c6572206d75737420626520526f757465604082015261391760f11b606082015260800190565b60208082526021908201527f4d6972726f72676174653a2062726964676520646f6573206e6f74206d6174636040820152600d60fb1b606082015260800190565b6020808252601f908201527f4d6972726f72676174653a2042726964676520616c7265616479207365742100604082015260600190565b61ffff91909116815260200190565b61ffff9290921682526001600160a01b0316602082015260400190565b61ffff861681526001600160a01b038516602082015260a060408201819052600090612940908301866125c5565b8415156060840152828103608084015261295a81856125c5565b98975050505050505050565b600061ffff851682526040602083015261298460408301848661259b565b95945050505050565b600061010061ffff8b1683528060208401526129ab8184018b6125c5565b6001600160401b039990991660408401525050606081019590955260808501939093526001600160a01b039190911660a084015260c083015260e09091015292915050565b60006101c061ffff8c168352806020840152612a0e8184018c6125c5565b6001600160401b038b166040850152606084018a90526080840189905260a084018890526001600160a01b03871660c08501529050612a5060e0840186612600565b8281036101a0840152612a6381856125c5565b9c9b505050505050505050505050565b600061ffff8916825260e06020830152612a9060e08301896125c5565b6001600160401b03881660408401528660608401528560808401528460a084015282810360c0840152612ac381856125c5565b9a9950505050505050505050565b600060c0820161ffff89168352602060c081850152828954600180821660008114612b035760018114612b2257612b5a565b60028304607f16865260ff19831660e089015261010088019350612b5a565b60028304808752612b328e612e94565b885b82811015612b505781548b820160e00152908401908701612b34565b8a0160e001955050505b5050508481036040860152612b6f818a6125c5565b92505050612b80606084018761258e565b612b8d608084018661258e565b82810360a0840152612b9f81856125c5565b9998505050505050505050565b600061ffff808816835280871660208401525084604083015260806060830152612bda60808301848661259b565b979650505050505050565b61ffff85168152602081018490526040810183905260a0810161298460608301846125f1565b90815260200190565b918252602082015260400190565b60006101c060ff8d16835260ff8c16602084015260ff8b16604084015260ff8a166060840152612c55608084018a6125f1565b612c6260c0840189612600565b80610180840152612c76818401878961259b565b90508281036101a0840152612c8c81858761259b565b9d9c50505050505050505050505050565b60ff858116825284811660208301528316604082015260a0810161298460608301846125f1565b600060ff8916825260ff8816602083015260ff87166040830152612ceb60608301876125f1565b60ff851660a083015260e060c0830152612b9f60e08301848661259b565b600061010060ff8b16835260ff8a16602084015260ff89166040840152612d3360608401896125f1565b60ff871660a084015260ff861660c08401528060e0840152612d58818401858761259b565b9b9a5050505050505050505050565b60ff85168152602081018490526040810183905260a0810161298460608301846125f1565b600060ff89168252876020830152866040830152612dad60608301876125f1565b8460a083015260e060c0830152612b9f60e08301848661259b565b600061010060ff8a168352886020840152876040840152612dec60608401886125f1565b8560a08401528460c08401528060e0840152612ac3818401856125c5565b60006101c060ff8d1683528b60208401528a6040840152896060840152612c55608084018a6125f1565b60ff9290921682526001600160401b0316602082015260400190565b6040518181016001600160401b0381118282101715612e6b57fe5b604052919050565b60006001600160401b03821115612e8657fe5b50601f01601f191660200190565b60009081526020902090565b60005b83811015612ebb578181015183820152602001612ea3565b83811115610fae5750506000910152565b6001600160a01b0381168114612ee157600080fd5b50565b8015158114612ee157600080fd5b6001600160401b0381168114612ee157600080fd5b60ff81168114612ee157600080fdfe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a2646970667358221220f5b8bb5ace48f6f35a36dee44f31a5bbcba9578fea9b566ec79e760a0889e6b264736f6c63430007060033",
  750. "devdoc": {
  751. "kind": "dev",
  752. "methods": {
  753. "owner()": {
  754. "details": "Returns the address of the current owner."
  755. },
  756. "renounceOwnership()": {
  757. "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."
  758. },
  759. "transferOwnership(address)": {
  760. "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."
  761. }
  762. },
  763. "version": 1
  764. },
  765. "userdoc": {
  766. "kind": "user",
  767. "methods": {},
  768. "version": 1
  769. },
  770. "storageLayout": {
  771. "storage": [
  772. {
  773. "astId": 7,
  774. "contract": "contracts/Bridge.sol:Bridge",
  775. "label": "_owner",
  776. "offset": 0,
  777. "slot": "0",
  778. "type": "t_address"
  779. },
  780. {
  781. "astId": 2146,
  782. "contract": "contracts/Bridge.sol:Bridge",
  783. "label": "bridgeLookup",
  784. "offset": 0,
  785. "slot": "1",
  786. "type": "t_mapping(t_uint16,t_bytes_storage)"
  787. },
  788. {
  789. "astId": 2152,
  790. "contract": "contracts/Bridge.sol:Bridge",
  791. "label": "gasLookup",
  792. "offset": 0,
  793. "slot": "2",
  794. "type": "t_mapping(t_uint16,t_mapping(t_uint8,t_uint256))"
  795. },
  796. {
  797. "astId": 2156,
  798. "contract": "contracts/Bridge.sol:Bridge",
  799. "label": "useLayerZeroToken",
  800. "offset": 0,
  801. "slot": "3",
  802. "type": "t_bool"
  803. }
  804. ],
  805. "types": {
  806. "t_address": {
  807. "encoding": "inplace",
  808. "label": "address",
  809. "numberOfBytes": "20"
  810. },
  811. "t_bool": {
  812. "encoding": "inplace",
  813. "label": "bool",
  814. "numberOfBytes": "1"
  815. },
  816. "t_bytes_storage": {
  817. "encoding": "bytes",
  818. "label": "bytes",
  819. "numberOfBytes": "32"
  820. },
  821. "t_mapping(t_uint16,t_bytes_storage)": {
  822. "encoding": "mapping",
  823. "key": "t_uint16",
  824. "label": "mapping(uint16 => bytes)",
  825. "numberOfBytes": "32",
  826. "value": "t_bytes_storage"
  827. },
  828. "t_mapping(t_uint16,t_mapping(t_uint8,t_uint256))": {
  829. "encoding": "mapping",
  830. "key": "t_uint16",
  831. "label": "mapping(uint16 => mapping(uint8 => uint256))",
  832. "numberOfBytes": "32",
  833. "value": "t_mapping(t_uint8,t_uint256)"
  834. },
  835. "t_mapping(t_uint8,t_uint256)": {
  836. "encoding": "mapping",
  837. "key": "t_uint8",
  838. "label": "mapping(uint8 => uint256)",
  839. "numberOfBytes": "32",
  840. "value": "t_uint256"
  841. },
  842. "t_uint16": {
  843. "encoding": "inplace",
  844. "label": "uint16",
  845. "numberOfBytes": "2"
  846. },
  847. "t_uint256": {
  848. "encoding": "inplace",
  849. "label": "uint256",
  850. "numberOfBytes": "32"
  851. },
  852. "t_uint8": {
  853. "encoding": "inplace",
  854. "label": "uint8",
  855. "numberOfBytes": "1"
  856. }
  857. }
  858. }
  859. }