Cryo Explorer Ethereum Mainnet

Address Contract Partially Verified

Address 0x71956340a586db3afD10C2645Dbe8d065dD79AC8
Balance 0 ETH
Nonce 191
Code Size 10438 bytes
Indexed Transactions 0
External Etherscan · Sourcify

Contract Bytecode

10438 bytes
0x5f3560e01c60026015820660011b61285c01601e395f51565b6384d38f2c8118610036573461285857602061288660403960206040f35b6308a92ad781186122e85761010436103417612858576004356004016080813511612858576020813501808260403750506024356004016040813511612858576020813501808260e0375050604435600401602081351161285857602081350180826101403750506064358060081c61285857610180526084358060a01c612858576101a052303318156101295760076101c0527f496e76616c6964000000000000000000000000000000000000000000000000006101e0526101c0506101c051806101e001601f825f031636823750506308c379a06101805260206101a052601f19601f6101c051011660440161019cfd5b6101a0516080306101e0526101e0516102205280610240528061022001602060e0510180828260e060045afa50508051806020830101601f825f03163682375050601f19601f82516020010116905081019050806102605280610220016101405181526101605160208201528051806020830101601f825f03163682375050601f19601f82516020010116905081019050610180516102005261020051610280526003823b0359600182126128585781600382863c81810183818561022060045afa5050828201815ff080156128585790509050905090506101c0526001600354016101e0526101e0516003557f82fe3a4fa49c6382d0c085746698ddbbafe6c2bf61285b19410644b5b26287c760c080610200528061020001602060405101808282604060045afa50508051806020830101601f825f03163682375050601f19601f825160200101169050810190506101c0516102205280610240528061020001602060e0510180828260e060045afa50508051806020830101601f825f03163682375050601f19601f82516020010116905081019050806102605280610200016101405181526101605160208201528051806020830101601f825f03163682375050601f19601f8251602001011690508101905061018051610280526101e0516102a052610200a1006122e8565b63a9a4a98381186122e857346128585760015460405260206040f36122e8565b634da6ecc981186122e857346128585760025460405260206040f36122e8565b6319429b8d81186122e857346128585760035460405260206040f36122e8565b630cb39e9681186122e857346128585760045460405260206040f36122e8565b63fa82256781186122e857602436103417612858576004358060a01c6128585760405260056040516020525f5260405f205460605260206060f36122e8565b6338d6172d8118610405576024361034176128585760066004356020525f5260405f205460405260206040f35b63a0dd2e4981186122e8576102643610341761285857600435600401803581018035810160c88135116128585780355f8160c8811161285857801561046c57905b8060051b6020850101358060a01c612858578160051b6180600152600101818118610446575b5050806180405250506020810135810160c881351161285857803560208160051b01808361996037505050604081013561b28052506020810135810160c881351161285857803560206060820201808361b2a037505050506084358060a01c6128585761fdc05260e4358060a01c6128585761fde05261010435600401610404813511612858576020813501808261fe003750505f546002146128585760025f5561fdc05160c05260a43560e052610522612730565b6044356040526105306126c8565b60066024356020525f5260405f2054156105b257600f62010240527f55736564204d6573736167655f49440000000000000000000000000000000000620102605262010240506201024051806201026001601f825f031636823750506308c379a0620102005260206201022052601f19601f620102405101166044016201021cfd5b600160066024356020525f5260405f2055613260604061326061804060045afa506105df6201024061255e565b6201024051620102605262010260516040526105f9612781565b636c5023876201026452600461012060606024620102843761fdc051620102e452604060a4620103043761fde0516201034452806201036452806201028401602061fe00510180828261fe0060045afa50508051806020830101601f825f03163682375050601f19601f82516020010116905081019050610124356201038452016201026052620102608051602082012090506201024052617d806101a0617d8061804060045afa506201024051617f20526106b3612401565b604036620102603760206128a65f395f516306c9624d620102a052608060c435620102c05261fde051620102e05280620103005280620102c001602061fe00510180828261fe0060045afa50508051806020830101601f825f03163682375050601f19601f82516020010116905081019050610124356201032052506040620102a06104c4620102bc5f855af161074c573d5f5f3e3d5ffd5b60403d1061285857620102a0518060a01c612858576201078052620102c051620107a052620107809050805162010260526020810151620102805250620102605160405260643560605262010280516080526107a66127eb565b60035f55006122e8565b63844105e181186107cc57346128585760075460405260206040f35b63ea26266c81186122e857346128585760206128a660403960206040f36122e8565b63f064acb281186122e8576102243610341761285857600435600401803581018035810160c88135116128585780355f8160c8811161285857801561085557905b8060051b6020850101358060a01c612858578160051b618060015260010181811861082f575b5050806180405250506020810135810160c881351161285857803560208160051b01808361996037505050604081013561b28052506020810135810160c881351161285857803560206060820201808361b2a037505050506024356004018035810160c88135116128585780355f8160c881116128585780156108fa57905b8060051b6020850101358060a01c612858578160051b61fde001526001018181186108d4575b50508061fdc05250506020810135810160c881351161285857803560208160051b018083620116e03750505060408101356201300052506044358060a01c612858576201302052620130205160c05260643560e052610957612730565b61b280516201300051116109d357601162013040527f496e76616c69642056616c736574204944000000000000000000000000000000620130605262013040506201304051806201306001601f825f031636823750506308c379a0620130005260206201302052601f19601f620130405101166044016201301cfd5b60403662013040375f61fdc05160c88111612858578015610a5c57905b8060051b61fde00151620130805262013040516201306051620116e0518110156128585760051b6201170001518082018281106128585790509050620130405263aaaaaaaa620130405110610a4457610a5c565b600162013060510162013060526001018181186109f0575b50506201304051604052610a6e6122ec565b613260604061326061804060045afa50610a8a6201308061255e565b6201308051620130a052620130a051604052610aa4612781565b613260604061326061fdc060045afa50610ac0620130a061255e565b620130a0516201308052639af2b8d2620130c45260046201308051620130e452620130205162013104526064356201312452606001620130c052620130c0805160208201209050620130a052617d806101a0617d8061804060045afa50620130a051617f2052610b2e612401565b62013080516001556201300051600255600160035401620130c052620130c0516003557fb7ca5e46e360950244488bf096bf742a1f63183cf1ee5b3b0c53045b6247bf5b6201308051620130e05262013000516201310052620130c05162013120526060620130e0a1006122e8565b63a930e8dc8118610f5c576102843610341761285857600435600401803581018035810160c88135116128585780355f8160c88111612858578015610c0457905b8060051b6020850101358060a01c612858578160051b6180600152600101818118610bde575b5050806180405250506020810135810160c881351161285857803560208160051b01808361996037505050604081013561b28052506020810135810160c881351161285857803560206060820201808361b2a0375050505060243560040180358060a01c6128585761fdc05260208101358101612800813511612858576020813501808261fde037505050610104358060a01c61285857620126005260206128a65f395f5163ffd8d4aa62012620526080604462012640376201260051620126c052803b15612858575f6201262060a46201263c5f855af1610ce8573d5f5f3e3d5ffd5b5060e435604052610cf76126c8565b600660c4356020525f5260405f205415610d7957600f62012620527f55736564204d6573736167655f49440000000000000000000000000000000000620126405262012620506201262051806201264001601f825f031636823750506308c379a0620125e05260206201260052601f19601f62012620510116604401620125fcfd5b6001600660c4356020525f5260405f2055613260604061326061804060045afa50610da66201262061255e565b620126205162012640526201264051604052610dc0612781565b638046d1e762012644526004610120806201266452806201266401604061fdc0518252806020830152808201602061fde0510180828261fde060045afa50508051806020830101601f825f03163682375050601f19601f8251602001011690508101905090508101905060806044620126843760c43562012704526020612886620127243960e435620127445262012600516201276452016201264052620126408051602082012090506201262052617d806101a0617d8061804060045afa506201262051617f2052610e91612401565b600160075561fdc0515a61fde05f5f8251602084015f8787f1905090509050610ebc573d5f5f3e3d5ffd5b5f600755600160035401620126405262012640516003557f0594b174e11e17c2cb4d0d303c2125060bea4f4da113a4e79edce87465592d00608061fdc0516201266052806201268052806201266001602061fde0510180828261fde060045afa50508051806020830101601f825f03163682375050601f19601f8251602001011690508101905060c435620126a0526201264051620126c05262012660a1005b6308d2b3e381186122e8576101c43610341761285857600435600401803581018035810160c88135116128585780355f8160c88111612858578015610fc357905b8060051b6020850101358060a01c612858578160051b6180600152600101818118610f9d575b5050806180405250506020810135810160c881351161285857803560208160051b01808361996037505050604081013561b28052506020810135810160c881351161285857803560206060820201808361b2a0375050505060243560040160408135116128585780355f816040811161285857801561109057905b612840810261fde0018160051b602086010135602086010180358060a01c612858578252602081013581016128008135116128585760208135016020840181838237505050505060010181811861103e575b50508061fdc05250506084358060a01c61285857620b0de052620b0de05160c05260643560e0526110bf612730565b6044356040526110cd6126c8565b613260604061326061804060045afa506110e9620b0e0061255e565b620b0e0051620b0e2052620b0e2051604052611103612781565b630baeca88620b0e24526004608080620b0e445280620b0e44015f61fdc0518083528060051b5f82604081116128585780156111b157905b828160051b602088010152612840810261fde0018360208801016040825182528060208301526020830181830160208251018082828560045afa50508051806020830101601f825f03163682375050601f19601f825160200101169050905081019050905090508301925060010181811861113b575b50508201602001915050905081019050604435620b0e6452620b0de051620b0e8452606435620b0ea45201620b0e2052620b0e20805160208201209050620b0e0052617d806101a0617d8061804060045afa50620b0e0051617f2052611215612401565b600160035401620b0e20525f6040905b80620b0e405261fdc051620b0e40511061123e57611350565b612840620b0e405161fdc051811015612858570261fde001515a612840620b0e405161fdc051811015612858570261fde0016020810190505f5f8251602084015f8787f1905090509050611294573d5f5f3e3d5ffd5b6001620b0e205101620b0e20527fdf4a952cd86acf74a1c5b1d3ff176de7e23a76082d0169d1925e1b32f3cf36e0606061284061fdc05115612858575f0261fde00151620b0e605280620b0e805261284061fdc05115612858575f0261fde00160208101905081620b0e600160208251018082828560045afa50508051806020830101601f825f03163682375050601f19601f825160200101169050905081019050620b0e2051620b0ea052620b0e60a1600101818118611225575b5050620b0e2051600355006122e8565b63f650f6e9811861150557606436103417612858576004358060a01c612858576101a0526101a0516370a082316101e052306102005260206101e060246101fc845afa6113af573d5f5f3e3d5ffd5b60203d10612858576101e09050516101c0526101a0516323b872dd6101e052336102005230610220526044356102405260206101e060646101fc5f855af16113f9573d5f5f3e3d5ffd5b3d61141057803b1561285857600161026052611429565b60203d10612858576101e0518060011c61285857610260525b610260905051611498576013610280527f6661696c6564205472616e7366657246726f6d000000000000000000000000006102a0526102805061028051806102a001601f825f031636823750506308c379a061024052602061026052601f19601f61028051011660440161025cfd5b6101a0516370a082316101e052306102005260206101e060246101fc845afa6114c3573d5f5f3e3d5ffd5b60203d10612858576101e09050516101c05180820382811161285857905090506101c0526101a0516040526024356060526101c0516080526115036127eb565b005b63048a245d81186122e85760a436103417612858576024358060a01c612858576040526044356004016104048135116128585760208135018082606037505060206128a65f395f5163d07e9fa06104a05260a0336104c0526004356104e052604051610500528061052052806104c001602060605101808282606060045afa50508051806020830101601f825f03163682375050601f19601f825160200101169050810190506064356105405250803b15612858575f6104a06104e46104bc5f855af16115d4573d5f5f3e3d5ffd5b507fbcd7c5f94d828115734ea3d51400c2e1ad93894d1a5099a1808794a924f71f24336104a0526004356104c05260406104a0a1006122e8565b6314fe978f8118611bcd576102643610341761285857600435600401803581018035810160c88135116128585780355f8160c8811161285857801561167557905b8060051b6020850101358060a01c612858578160051b618060015260010181811861164f575b5050806180405250506020810135810160c881351161285857803560208160051b01808361996037505050604081013561b28052506020810135810160c881351161285857803560206060820201808361b2a037505050506024358060a01c6128585761fdc0526044356004018035810160408135116128585780355f816040811161285857801561172957905b8060051b6020850101358060a01c612858578160051b61fe000152600101818118611703575b50508061fde052505060208101358101604081351161285857803560208160051b01808362010600375050505060a4358060a01c6128585762010e205262010e205160c05260c43560e05261177c612730565b60843560405261178a6126c8565b606435600561fdc0516020525f5260405f20541061181057600e62010e40527f57726f6e6720626174636820696400000000000000000000000000000000000062010e605262010e405062010e40518062010e6001601f825f031636823750506308c379a062010e0052602062010e2052601f19601f62010e4051011660440162010e1cfd5b61fde05162010e4052620106005162010e4051181561189757601062010e60527f556e6d61746368656420506172616d730000000000000000000000000000000062010e805262010e605062010e60518062010e8001601f825f031636823750506308c379a062010e2052602062010e4052601f19601f62010e6051011660440162010e3cfd5b613260604061326061804060045afa506118b362010e6061255e565b62010e605162010e805262010e80516040526118cd612781565b636f7be45762010e8452600460e061fdc05162010ea4528062010ec4528062010ea40160408082528082015f61fde0518083528060051b5f826040811161285857801561193457905b8060051b61fe0001518160051b602088010152600101818118611916575b505082016020019150509050810190508060208301528082015f62010600518083528060051b5f826040811161285857801561198b57905b8060051b6201062001518160051b60208801015260010181811861196c575b5050820160200191505090508101905090508101905060643562010ee452602061288662010f043960843562010f245262010e205162010f445260c43562010f64520162010e805262010e8080516020820120905062010e6052617d806101a0617d8061804060045afa5062010e6051617f2052611a07612401565b5f6040905b8062010e805262010e405162010e805110611a2657611b43565b61fdc05163a9059cbb62010ea05262010e805161fde0518110156128585760051b61fe00015162010ec05262010e805162010600518110156128585760051b62010620015162010ee052602062010ea0604462010ebc5f855af1611a8c573d5f5f3e3d5ffd5b3d611aa457803b1561285857600162010f0052611abf565b60203d106128585762010ea0518060011c6128585762010f00525b62010f00905051611b3857600f62010f20527f6661696c6564207472616e73666572000000000000000000000000000000000062010f405262010f205062010f20518062010f4001601f825f031636823750506308c379a062010ee052602062010f0052601f19601f62010f2051011660440162010efcfd5b600101818118611a0c575b505060016004540162010e805262010e805160045560016003540162010ea05262010ea051600355606435600561fdc0516020525f5260405f20557f0ba40544a53f11e70bd7e03a4cfeec841fc3566e81dfbef26f669358a705ad2c61fdc05162010ec05260643562010ee05262010e805162010f005262010ea05162010f2052608062010ec0a1005b63da29a8c681186122e8576023361115612858575f546002146128585760025f556004353411611c6057346004351815611c725760146040527f496e73756666696369656e74206465706f73697400000000000000000000000060605260405060405180606001601f825f031636823750506308c379a05f526020602052601f19601f6040510116604401601cfd611c72565b5f5f5f5f6004353403335ff115612858575b60206128a65f395f51631d046325604052803b15612858575f60406004605c600435855af1611ca3573d5f5f3e3d5ffd5b5060035f55006122e8565b63a329977181186122e857608436103417612858576004358060a01c612858576040526001600354016060526060516003556001600454016080526080516004557fc72b917679ae2dea3062a0a355d542c92296f3e5c39cfcb0db7c30e28c8163493360a05260405160c0526060602460e037608051610140526060516101605260e060a0a1006122e8565b630b14c5458118611df957606436103417612858576004358060a01c61285857604052602435600401610400813511612858576020813501808260603750506020806108a0526040515a6060506104006104a060605160808585fa90509050611da5573d5f5f3e3d5ffd5b3d61040081183d61040010021861048052610480816108a00160208251018082828560045afa50508051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506108a0f35b631de26e1681186122e8576043361115612858575f546002146128585760025f556024353411611e8c57346024351815611e9e5760146040527f496e73756666696369656e74206465706f73697400000000000000000000000060605260405060405180606001601f825f031636823750506308c379a05f526020602052601f19601f6040510116604401601cfd611e9e565b5f5f5f5f6024353403335ff115612858575b60206128a65f395f5163b214faa5604052600435606052803b15612858575f60406024605c602435855af1611ed5573d5f5f3e3d5ffd5b507f4f78bbd9a86543dc57c484da46f56d43190ac1148b43565fa8d522b1d4fe52986004356040523360605260243560805260606040a160035f55006122e8565b6361baeb6381186122e8576102643610341761285857600435600401803581018035810160c88135116128585780355f8160c88111612858578015611f7d57905b8060051b6020850101358060a01c612858578160051b6180600152600101818118611f57575b5050806180405250506020810135810160c881351161285857803560208160051b01808361996037505050604081013561b28052506020810135810160c881351161285857803560206060820201808361b2a037505050506024358060a01c6128585761fdc052604435600401616000813511612858576020813501808261fde0375050610124358060a01c6128585762015e005260206128a65f395f5163ffd8d4aa62015e20526080606462015e403762015e005162015ec052803b15612858575f62015e2060a462015e3c5f855af161205a573d5f5f3e3d5ffd5b506101043560405261206a6126c8565b600660e4356020525f5260405f2054156120ec57600f62015e20527f55736564204d6573736167655f4944000000000000000000000000000000000062015e405262015e205062015e20518062015e4001601f825f031636823750506308c379a062015de052602062015e0052601f19601f62015e2051011660440162015dfcfd5b6001600660e4356020525f5260405f2055613260604061326061804060045afa5061211962015e2061255e565b62015e205162015e405262015e4051604052612133612781565b636529d22b62015e4452600461014061fdc05162015e64528062015e84528062015e6401602061fde0510180828261fde060045afa50508051806020830101601f825f03163682375050601f19601f825160200101169050810190506080606462015ea43760e43562015f2452602061288662015f44396101043562015f645262015e005162015f84520162015e405262015e4080516020820120905062015e2052617d806101a0617d8061804060045afa5062015e2051617f20526121f7612401565b60016003540162015e405261fdc0516331502b5662015e805260208062015ea0528062015ea001602061fde0510180828261fde060045afa50508051806020830101601f825f03163682375050601f19601f82516020010116905081015050602062015e8061604462015e9c5f855af1612273573d5f5f3e3d5ffd5b60203d106128585762015e80518060a01c612858576201bee0526201bee090505162015e605262015e40516003557fac4ce915ef22753b636e57aac5ae5fdd9d13d782ae5bf6dbcda15e29f95386c162015e605162015e805261fdc05162015ea05262015e405162015ec052606062015e80a1005b5f5ffd5b63aaaaaaaa60405110156123565760126060527f496e73756666696369656e7420506f776572000000000000000000000000000060805260605060605180608001601f825f031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b565b5f601c610100527f19457468657265756d205369676e6564204d6573736167653a0a333200000000610120526101008051602082018361016001815181525050808301925050506060518161016001526020810190508061014052610140905080516020820120905060e0525f6101805260e051610100526080516101205260a0516101405260c051610160526020610180608061010060015afa506101805160405114815250565b604036617f40375f6134005160c8811161285857801561254b57905b60608102613420018051617f80526020810151617fa0526040810151617fc05250617f80511561253557617f40516101a0518110156128585760051b6101c00151604052617f2051606052617f8051608052617fa05160a052617fc05160c052612488617fe0612358565b617fe0516124f5576011618000527f496e76616c6964205369676e61747572650000000000000000000000000000006180205261800050618000518061802001601f825f031636823750506308c379a0617fc0526020617fe052601f19601f618000510116604401617fdcfd5b617f6051617f4051611ac0518110156128585760051b611ae001518082018281106128585790509050617f605263aaaaaaaa617f6051106125355761254b565b6001617f405101617f405260010181811861241d575b5050617f605160405261255c6122ec565b565b63299018c26132a45260046080806132c452806132c4015f6040518083528060051b5f8260c881116128585780156125af57905b8060051b606001518160051b602088010152600101818118612592575b50508201602001915050905081019050806132e452806132c4015f611960518083528060051b5f8260c8811161285857801561260557905b8060051b61198001518160051b6020880101526001018181186125e7575b505082016020019150509050810190506132805161330452602061288661332439016132a0526132a0805160208201209050815250565b6040515a10156126c65760286060527f496e73756666696369656e742066756e647320746f20636f76657220676173206080527f657374696d61746500000000000000000000000000000000000000000000000060a05260605060605180608001601f825f031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b565b60405142111561272e5760076060527f54696d656f75740000000000000000000000000000000000000000000000000060805260605060605180608001601f825f031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b565b60e05160405261273e61263c565b60206128a65f395f5163d4bbab4f6101005260c0516101205260e05161014052803b15612858575f610100604461011c5f855af161277e573d5f5f3e3d5ffd5b50565b60405160015418156127e95760146060527f496e636f727265637420436865636b706f696e7400000000000000000000000060805260605060605180608001601f825f031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b565b60016004540160a05260a05160045560016003540160c05260c0516003557fc5bdbcfcfae5c5b84c56bbf0860c4286d627aefaf28ce4011ba4fcb9b5aadf0860405160e0523361010052606051610120526080516101405260a0516101605260c0516101805260c060e0a1565b5f80fd22e8160e22e81cae037903d80b9d22e80018031907b022e81d3a13600339035922e81f1607ee039922e833323831383032350000000000000000000000000000000000000000000000000000000000000000000000001067082fd0b74bfddfd5794e5ac0f24ed941dcc9

Verified Source Code Partial Match

Compiler: v0.3.10+commit.91361694
Compass.vy 452 lines
#pragma version 0.3.10
#pragma optimize gas
#pragma evm-version shanghai

"""
@title Compass
@license Apache 2.0
@author Volume.Finance
@notice v2.0.1
"""

MAX_VALIDATORS: constant(uint256) = 200
MAX_PAYLOAD: constant(uint256) = 10240
MAX_EVENT: constant(uint256) = 1024
MAX_BATCH: constant(uint256) = 64

POWER_THRESHOLD: constant(uint256) = 2_863_311_530 # 2/3 of 2^32, Validator powers will be normalized to sum to 2 ^ 32 in every valset update.
compass_id: public(immutable(bytes32))

interface ERC20:
    def balanceOf(_owner: address) -> uint256: view
    def transfer(_to: address, _value: uint256) -> bool: nonpayable
    def transferFrom(_from: address, _to: address, _value: uint256) -> bool: nonpayable

interface FeeManager:
    def deposit(depositor_paloma_address: bytes32): payable
    def withdraw(receiver: address, amount:uint256, dex: address, payload: Bytes[1028], min_grain: uint256): nonpayable
    def transfer_fees(fee_args: FeeArgs, relayer: address): nonpayable
    def security_fee_topup(): payable
    def reserve_security_fee(sender: address, gas_fee_amount: uint256): nonpayable
    def bridge_community_fee_to_paloma(amount: uint256, dex: address, payload: Bytes[1028], min_grain: uint256) -> (address, uint256): nonpayable
    def update_compass(_new_compass: address): nonpayable

interface Compass:
    def FEE_MANAGER() -> address: view

interface Deployer:
    def deployFromBytecode(_bytecode: Bytes[24576]) -> address: nonpayable

struct Valset:
    validators: DynArray[address, MAX_VALIDATORS] # Validator addresses
    powers: DynArray[uint256, MAX_VALIDATORS] # Powers of given validators, in the same order as validators array
    valset_id: uint256 # nonce of this validator set

struct Signature:
    v: uint256
    r: uint256
    s: uint256

struct Consensus:
    valset: Valset # Valset data
    signatures: DynArray[Signature, MAX_VALIDATORS] # signatures in the same order as validator array in valset

struct LogicCallArgs:
    logic_contract_address: address # the arbitrary contract address to external call
    payload: Bytes[MAX_PAYLOAD] # payloads

struct TokenSendArgs:
    receiver: DynArray[address, MAX_BATCH]
    amount: DynArray[uint256, MAX_BATCH]

struct FeeArgs:
    relayer_fee: uint256 # Total amount to alot for relayer
    community_fee: uint256 # Total amount to alot for community wallet
    security_fee: uint256 # Total amount to alot for security wallet
    fee_payer_paloma_address: bytes32 # Paloma address covering the fees

event ValsetUpdated:
    checkpoint: bytes32
    valset_id: uint256
    event_id: uint256

event LogicCallEvent:
    logic_contract_address: address
    payload: Bytes[MAX_PAYLOAD]
    message_id: uint256
    event_id: uint256

event SendToPalomaEvent:
    token: address
    sender: address
    receiver: bytes32
    amount: uint256
    nonce: uint256
    event_id: uint256

event BatchSendEvent:
    token: address
    batch_id: uint256
    nonce: uint256
    event_id: uint256

event ERC20DeployedEvent:
    paloma_denom: String[128]
    token_contract: address
    name: String[64]
    symbol: String[32]
    decimals: uint8
    event_id: uint256

event FundsDepositedEvent:
    depositor_paloma_address: bytes32
    sender: address
    amount: uint256

event FundsWithdrawnEvent:
    receiver: address
    amount: uint256

event UpdateCompass:
    contract_address: address
    payload: Bytes[MAX_PAYLOAD]
    event_id: uint256

event NodeSaleEvent:
    contract_address: address
    buyer: address
    paloma: bytes32
    node_count: uint256
    grain_amount: uint256
    nonce: uint256
    event_id: uint256

event ContractDeployed:
    child: address
    deployer: address
    event_id: uint256

last_checkpoint: public(bytes32)
last_valset_id: public(uint256)
last_event_id: public(uint256)
last_gravity_nonce: public(uint256)
last_batch_id: public(HashMap[address, uint256])
message_id_used: public(HashMap[uint256, bool])
slc_switch: public(bool)
FEE_MANAGER: public(immutable(address))

# compass_id: unique identifier for compass instance
# valset: initial validator set
@external
def __init__(_compass_id: bytes32, _event_id: uint256, _gravity_nonce:uint256, valset: Valset, fee_manager: address):
    compass_id = _compass_id
    cumulative_power: uint256 = 0
    i: uint256 = 0
    # check cumulative power is enough
    for validator in valset.validators:
        cumulative_power += valset.powers[i]
        if cumulative_power >= POWER_THRESHOLD:
            break
        i = unsafe_add(i, 1)
    self.power_check(cumulative_power)
    new_checkpoint: bytes32 = keccak256(_abi_encode(valset.validators, valset.powers, valset.valset_id, compass_id, method_id=method_id("checkpoint(address[],uint256[],uint256,bytes32)")))
    self.last_checkpoint = new_checkpoint
    self.last_valset_id = valset.valset_id
    self.last_event_id = _event_id
    self.last_gravity_nonce = _gravity_nonce
    FEE_MANAGER = fee_manager
    log ValsetUpdated(new_checkpoint, valset.valset_id, _event_id)

# check if cumulated power is enough
@internal
def power_check(cumulative_power: uint256):
    assert cumulative_power >= POWER_THRESHOLD, "Insufficient Power"


# utility function to verify EIP712 signature
@internal
@pure
def verify_signature(signer: address, hash: bytes32, sig: Signature) -> bool:
    message_digest: bytes32 = keccak256(concat(convert("\x19Ethereum Signed Message:\n32", Bytes[28]), hash))
    return signer == ecrecover(message_digest, sig.v, sig.r, sig.s)

# consensus: validator set and signatures
# hash: what we are checking they have signed
@internal
def check_validator_signatures(consensus: Consensus, hash: bytes32):
    i: uint256 = 0
    cumulative_power: uint256 = 0
    for sig in consensus.signatures:
        if sig.v != 0:
            assert self.verify_signature(consensus.valset.validators[i], hash, sig), "Invalid Signature"
            cumulative_power += consensus.valset.powers[i]
            if cumulative_power >= POWER_THRESHOLD:
                break
        i = unsafe_add(i, 1)
    self.power_check(cumulative_power)

# Make a new checkpoint from the supplied validator set
# A checkpoint is a hash of all relevant information about the valset. This is stored by the contract,
# instead of storing the information directly. This saves on storage and gas.
# The format of the checkpoint is:
# keccak256 hash of abi_encoded checkpoint(validators[], powers[], valset_id, compass_id)
# The validator powers must be decreasing or equal. This is important for checking the signatures on the
# next valset, since it allows the caller to stop verifying signatures once a quorum of signatures have been verified.
@internal
@view
def make_checkpoint(valset: Valset) -> bytes32:
    return keccak256(_abi_encode(valset.validators, valset.powers, valset.valset_id, compass_id, method_id=method_id("checkpoint(address[],uint256[],uint256,bytes32)")))

# check if the gas estimate is too big
@internal
def gas_check(gas_estimate: uint256):
    assert msg.gas >= gas_estimate, "Insufficient funds to cover gas estimate"

@internal
def deadline_check(deadline: uint256):
    assert block.timestamp <= deadline, "Timeout"

@internal
def reserve_security_fee(relayer: address, gas_estimate: uint256):
    self.gas_check(gas_estimate)
    FeeManager(FEE_MANAGER).reserve_security_fee(relayer, gas_estimate)

@internal
def check_checkpoint(checkpoint: bytes32):
    assert self.last_checkpoint == checkpoint, "Incorrect Checkpoint"

# This updates the valset by checking that the validators in the current valset have signed off on the
# new valset. The signatures supplied are the signatures of the current valset over the checkpoint hash
# generated from the new valset.
# Anyone can call this function, but they must supply valid signatures of constant_powerThreshold of the current valset over
# the new valset.
# valset: new validator set to update with
# consensus: current validator set and signatures
@external
def update_valset(consensus: Consensus, new_valset: Valset, relayer: address, gas_estimate: uint256):
    self.reserve_security_fee(relayer, gas_estimate)
    # check if new valset_id is greater than current valset_id
    assert new_valset.valset_id > consensus.valset.valset_id, "Invalid Valset ID"
    cumulative_power: uint256 = 0
    i: uint256 = 0
    # check cumulative power is enough
    for validator in new_valset.validators:
        cumulative_power += new_valset.powers[i]
        if cumulative_power >= POWER_THRESHOLD:
            break
        i = unsafe_add(i, 1)
    self.power_check(cumulative_power)
    # check if the supplied current validator set matches the saved checkpoint
    self.check_checkpoint(self.make_checkpoint(consensus.valset))
    # calculate the new checkpoint
    new_checkpoint: bytes32 = self.make_checkpoint(new_valset)
    args_hash: bytes32 = keccak256(_abi_encode(new_checkpoint, relayer, gas_estimate, method_id=method_id("update_valset(bytes32,address,uint256)")))
    # check if enough validators signed new validator set (new checkpoint)
    self.check_validator_signatures(consensus, args_hash)
    self.last_checkpoint = new_checkpoint
    self.last_valset_id = new_valset.valset_id
    event_id: uint256 = unsafe_add(self.last_event_id, 1)
    self.last_event_id = event_id
    log ValsetUpdated(new_checkpoint, new_valset.valset_id, event_id)

# This makes calls to contracts that execute arbitrary logic
# message_id is to prevent replay attack and every message_id can be used only once
@external
def submit_logic_call(consensus: Consensus, args: LogicCallArgs, fee_args: FeeArgs, message_id: uint256, deadline: uint256, relayer: address):
    FeeManager(FEE_MANAGER).transfer_fees(fee_args, relayer)
    self.deadline_check(deadline)
    assert not self.message_id_used[message_id], "Used Message_ID"
    self.message_id_used[message_id] = True
    # check if the supplied current validator set matches the saved checkpoint
    self.check_checkpoint(self.make_checkpoint(consensus.valset))
    # signing data is keccak256 hash of abi_encoded logic_call(args, fee_args, message_id, compass_id, deadline, relayer)
    args_hash: bytes32 = keccak256(_abi_encode(args, fee_args, message_id, compass_id, deadline, relayer, method_id=method_id("logic_call((address,bytes),(uint256,uint256,uint256,bytes32),uint256,bytes32,uint256,address)")))
    # check if enough validators signed args_hash
    self.check_validator_signatures(consensus, args_hash)
    # make call to logic contract
    self.slc_switch = True
    raw_call(args.logic_contract_address, args.payload)
    self.slc_switch = False
    event_id: uint256 = unsafe_add(self.last_event_id, 1)
    self.last_event_id = event_id
    log LogicCallEvent(args.logic_contract_address, args.payload, message_id, event_id)

@internal
def _send_token_to_paloma(token: address, receiver: bytes32, amount: uint256):
    _nonce: uint256 = unsafe_add(self.last_gravity_nonce, 1)
    self.last_gravity_nonce = _nonce
    _event_id: uint256 = unsafe_add(self.last_event_id, 1)
    self.last_event_id = _event_id
    log SendToPalomaEvent(token, msg.sender, receiver, amount, _nonce, _event_id)

@external
def send_token_to_paloma(token: address, receiver: bytes32, amount: uint256):
    _balance: uint256 = ERC20(token).balanceOf(self)
    assert ERC20(token).transferFrom(msg.sender, self, amount, default_return_value=True), "failed TransferFrom"
    _balance = ERC20(token).balanceOf(self) - _balance
    self._send_token_to_paloma(token, receiver, _balance)

@external
def submit_batch(consensus: Consensus, token: address, args: TokenSendArgs, batch_id: uint256, deadline: uint256, relayer: address, gas_estimate: uint256):
    self.reserve_security_fee(relayer, gas_estimate)
    self.deadline_check(deadline)
    assert self.last_batch_id[token] < batch_id, "Wrong batch id"
    length: uint256 = len(args.receiver)
    assert length == len(args.amount), "Unmatched Params"
    # check if the supplied current validator set matches the saved checkpoint
    self.check_checkpoint(self.make_checkpoint(consensus.valset))
    # signing data is keccak256 hash of abi_encoded batch_call(args, batch_id, compass_id, deadline, relayer, gas_estimate)
    args_hash: bytes32 = keccak256(_abi_encode(token, args, batch_id, compass_id, deadline, relayer, gas_estimate, method_id=method_id("batch_call(address,(address[],uint256[]),uint256,bytes32,uint256,address,uint256)")))
    # check if enough validators signed args_hash
    self.check_validator_signatures(consensus, args_hash)
    # make call to logic contract
    for i in range(MAX_BATCH):
        if  i >= length:
            break
        assert ERC20(token).transfer(args.receiver[i], args.amount[i], default_return_value=True), "failed transfer"
    _nonce: uint256 = unsafe_add(self.last_gravity_nonce, 1)
    self.last_gravity_nonce = _nonce
    _event_id: uint256 = unsafe_add(self.last_event_id, 1)
    self.last_event_id = _event_id
    self.last_batch_id[token] = batch_id
    log BatchSendEvent(token, batch_id, _nonce, _event_id)

@external
def emit_nodesale_event(buyer: address, paloma: bytes32, node_count: uint256, grain_amount: uint256):
    event_id: uint256 = unsafe_add(self.last_event_id, 1)
    self.last_event_id = event_id
    _nonce: uint256 = unsafe_add(self.last_gravity_nonce, 1)
    self.last_gravity_nonce = _nonce
    log NodeSaleEvent(msg.sender, buyer, paloma, node_count, grain_amount, _nonce, event_id)

@external
def deploy_erc20(_paloma_denom: String[128], _name: String[64], _symbol: String[32], _decimals: uint8, _blueprint: address):
    assert msg.sender == self, "Invalid"
    erc20: address = create_from_blueprint(_blueprint, self, _name, _symbol, _decimals, code_offset=3)
    event_id: uint256 = unsafe_add(self.last_event_id, 1)
    self.last_event_id = event_id
    log ERC20DeployedEvent(_paloma_denom, erc20, _name, _symbol, _decimals, event_id)

@external
@view
def arbitrary_view(contract_address: address, payload: Bytes[1024]) -> Bytes[1024]:
    return raw_call(contract_address, payload, is_static_call=True, max_outsize=1024)


# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # 
# F E E S
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # 

# Deposit some balance on the contract to be used when sending messages from Paloma.
# depositor_paloma_address: paloma address to which to attribute the sent amount
# amount: amount of COIN to register with compass. Overpaid balance will be sent back.
@external
@payable
@nonreentrant('lock')
def deposit(depositor_paloma_address: bytes32, amount: uint256):
    if msg.value > amount:
        send(msg.sender, unsafe_sub(msg.value, amount))
    else:
        assert amount == msg.value, "Insufficient deposit"
    FeeManager(FEE_MANAGER).deposit(depositor_paloma_address, value=amount)
    log FundsDepositedEvent(depositor_paloma_address, msg.sender, amount)

# Withdraw ramped up claimable rewards from compass. Withdrawals will be swapped and
# reimbursed in GRAIN.
# amount: the amount of COIN to withdraw.
# dex: address of the DEX to use for exchanging the token
# payload: the function payload to exchange ETH to grain for the dex
# min_grain: expected grain amount getting from dex to prevent front-running(high slippage / sandwich attack)
@external
def withdraw(amount:uint256, dex: address, payload: Bytes[1028], min_grain: uint256):
    FeeManager(FEE_MANAGER).withdraw(msg.sender, amount, dex, payload, min_grain)
    log FundsWithdrawnEvent(msg.sender, amount)

# Top up the security funds on the contract used to reimburse all infrastructure
# related messages. All sent value will be consumed.
@external
@payable
@nonreentrant('lock')
def security_fee_topup(amount: uint256):
    if msg.value > amount:
        send(msg.sender, unsafe_sub(msg.value, amount))
    else:
        assert amount == msg.value, "Insufficient deposit"
    # Make sure we check against overflow here
    FeeManager(FEE_MANAGER).security_fee_topup(value=amount)

# Bridge the current balance of the community funds back to Paloma
# consensus: current validator set and signatures
# message_id: incremental unused message ID
# deadline: message deadline
# receiver: Paloma address to receive the funds
# relayer: relayer address
# gas_estimate: gas amount estimation
# amount: Ete amount to swap and bridge
# dex: address of the DEX to use for exchanging the Eth
# payload: the function payload to exchange ETH to grain for the dex
# min_grain: expected grain amount getting from dex to prevent front-running(high slippage / sandwich attack)
@external
@nonreentrant('lock')
def bridge_community_tax_to_paloma(consensus: Consensus, message_id: uint256, deadline: uint256, receiver: bytes32, relayer: address, gas_estimate: uint256, amount:uint256, dex: address, payload: Bytes[1028], min_grain: uint256):
    self.reserve_security_fee(relayer, gas_estimate)
    self.deadline_check(deadline)
    assert not self.message_id_used[message_id], "Used Message_ID"
    self.message_id_used[message_id] = True

    # check if the supplied current validator set matches the saved checkpoint
    self.check_checkpoint(self.make_checkpoint(consensus.valset))

    # signing data is keccak256 hash of abi_encoded logic_call(args, message_id, compass_id, deadline)
    args_hash: bytes32 = keccak256(_abi_encode(message_id, deadline, receiver, relayer, gas_estimate, amount, dex, payload,  min_grain, method_id=method_id("bridge_community_tax_to_paloma(uint256,uint256,byte32,address,uint256,uint256,address,bytes,uint256)")))
    # check if enough validators signed args_hash
    self.check_validator_signatures(consensus, args_hash)

    grain: address = empty(address)
    grain_balance: uint256 = 0
    grain, grain_balance = FeeManager(FEE_MANAGER).bridge_community_fee_to_paloma(amount, dex, payload, min_grain)
    self._send_token_to_paloma(grain, receiver, grain_balance)

# This function is to update compass address in contracts. After running this function, This Compass-evm can't be used anymore.
# consensus: current validator set and signatures
# update_compass_args: array of LogicCallArgs to update compass address in contracts
# deadline: message deadline
# gas_estimate: gas amount estimation
# relayer: relayer address

@external
def compass_update_batch(consensus: Consensus, update_compass_args: DynArray[LogicCallArgs, MAX_BATCH], deadline: uint256, gas_estimate: uint256, relayer: address):
    self.reserve_security_fee(relayer, gas_estimate)
    self.deadline_check(deadline)
    # check if the supplied current validator set matches the saved checkpoint
    self.check_checkpoint(self.make_checkpoint(consensus.valset))
    # signing data is keccak256 hash of abi_encoded logic_call(args, message_id, compass_id, deadline)
    args_hash: bytes32 = keccak256(_abi_encode(update_compass_args, deadline, relayer, gas_estimate, method_id=method_id("compass_update_batch((address,bytes)[],uint256,address,uint256)")))
    # check if enough validators signed args_hash
    self.check_validator_signatures(consensus, args_hash)
    event_id: uint256 = unsafe_add(self.last_event_id, 1)
    for i in range(MAX_BATCH):
        if i >= len(update_compass_args):
            break
        raw_call(update_compass_args[i].logic_contract_address, update_compass_args[i].payload)
        event_id = unsafe_add(event_id, 1)
        log UpdateCompass(update_compass_args[0].logic_contract_address, update_compass_args[0].payload, event_id)
    self.last_event_id = event_id

@external
def deploy_contract(consensus: Consensus, _deployer: address, _bytecode: Bytes[24576], fee_args: FeeArgs, message_id: uint256, deadline: uint256, relayer: address):
    FeeManager(FEE_MANAGER).transfer_fees(fee_args, relayer)
    self.deadline_check(deadline)
    assert not self.message_id_used[message_id], "Used Message_ID"
    self.message_id_used[message_id] = True
    # check if the supplied current validator set matches the saved checkpoint
    self.check_checkpoint(self.make_checkpoint(consensus.valset))
    # signing data is keccak256 hash of abi_encoded deploy_contract(bytecode, fee_args, message_id, compass_id, deadline, relayer)
    args_hash: bytes32 = keccak256(_abi_encode(_deployer, _bytecode, fee_args, message_id, compass_id, deadline, relayer, method_id=method_id("deploy_contract(address,bytes,(uint256,uint256,uint256,bytes32),uint256,bytes32,uint256,address)")))
    # check if enough validators signed args_hash
    self.check_validator_signatures(consensus, args_hash)
    # make call to logic contract
    event_id: uint256 = unsafe_add(self.last_event_id, 1)
    child: address = Deployer(_deployer).deployFromBytecode(_bytecode)
    self.last_event_id = event_id
    log ContractDeployed(child, _deployer, event_id)

Read Contract

FEE_MANAGER 0xea26266c → address
arbitrary_view 0x0b14c545 → bytes
compass_id 0x84d38f2c → bytes32
last_batch_id 0xfa822567 → uint256
last_checkpoint 0xa9a4a983 → bytes32
last_event_id 0x19429b8d → uint256
last_gravity_nonce 0x0cb39e96 → uint256
last_valset_id 0x4da6ecc9 → uint256
message_id_used 0x38d6172d → bool
slc_switch 0x844105e1 → bool

Write Contract 12 functions

These functions modify contract state and require a wallet transaction to execute.

bridge_community_tax_to_paloma 0x72e2159b
tuple consensus
uint256 message_id
uint256 deadline
bytes32 receiver
address relayer
uint256 gas_estimate
uint256 amount
address dex
bytes payload
uint256 min_grain
compass_update_batch 0x6d41a641
tuple consensus
tuple[] update_compass_args
uint256 deadline
uint256 gas_estimate
address relayer
deploy_contract 0xbae7880b
tuple consensus
address _deployer
bytes _bytecode
tuple fee_args
uint256 message_id
uint256 deadline
address relayer
deploy_erc20 0x08a92ad7
string _paloma_denom
string _name
string _symbol
uint8 _decimals
address _blueprint
deposit 0x1de26e16
bytes32 depositor_paloma_address
uint256 amount
emit_nodesale_event 0xa3299771
address buyer
bytes32 paloma
uint256 node_count
uint256 grain_amount
security_fee_topup 0xda29a8c6
uint256 amount
send_token_to_paloma 0xf650f6e9
address token
bytes32 receiver
uint256 amount
submit_batch 0x5200b4c5
tuple consensus
address token
tuple args
uint256 batch_id
uint256 deadline
address relayer
uint256 gas_estimate
submit_logic_call 0x54ad74df
tuple consensus
tuple args
tuple fee_args
uint256 message_id
uint256 deadline
address relayer
update_valset 0x21620d08
tuple consensus
tuple new_valset
address relayer
uint256 gas_estimate
withdraw 0x048a245d
uint256 amount
address dex
bytes payload
uint256 min_grain

Recent Transactions

No transactions found for this address