logo DERO HE BlockChain Explorer(v1) Mainnet

Tx hash: bb8714fefca6187c914872ff138fcf4bf883d2ba81dfa73ea19265a2012f3cd0 Type SC

Block: 5beab74e92b56929c17983f59db206f0090c22daa50cc959cea96a5f35523e49 (VALID)
SCID current reserves
SCID Amount(in atomic units)
0000000000000000000000000000000000000000000000000000000000000000 9812698
ad2e7b37c380cc1aed3a6b27224ddfc92a2d15962ca1f4d35e530dba0f9575a9 171082051
ee300fe87cf9fb3bd600b25d6af4cd54569022a3fa264a1cb20174bb9ef7afa2 11226802889
f22bbe5f6527338ace6eb019ebf971721b9cde81b571b45f94f5a0877d0257f6 239146974
SCID string variables
key value
C 46756e6374696f6e20496e697469616c697a6528292055696e7436340d0a310949462045584953545328226f776e657222293d3d30205448454e20474f544f2031300d0a3209474f544f203636360d0a31300953544f524528226f776e6572222c5349474e45522829290d0a32300953544f52452822666565546f222c5349474e45522829290d0a33300953544f524528226e616d65486472222c2247686f73742045786368616e676522290d0a34300953544f524528226465736372486472222c225068616e746f6d2d706f77657265642066696e616e636522290d0a35300952455455524e20300d0a3636360952455455524e20310d0a456e642046756e6374696f6e0d0a46756e6374696f6e204164644c6971756964697479287420537472696e672c752055696e743634292055696e7436340d0a310944494d2077322c72312c73312c74312c75312c76312c77312c78312041532055696e7436340d0a32094c4554207831203d2031383434363734343037333730393535310d0a33094c4554207631203d204445524f56414c554528290d0a34094c4554207731203d20415353455456414c5545284845584445434f4445287429290d0a3130094946202877313e302926262876313e3029205448454e20474f544f2033300d0a323009474f544f203636360d0a3330094c4554207732203d20692874290d0a34300949462077323e30205448454e20474f544f20343120454c534520474f544f2036300d0a343109494620753e30205448454e20474f544f2034330d0a343209474f544f203636360d0a3433094c4554207231203d206b2874290d0a3434094c4554207331203d206d2874290d0a343509494620712873312c7731293d3d31205448454e20474f544f203636360d0a343609672872312c73312c74290d0a3437094c4554207732203d20692874290d0a3438094c4554207431203d20722876312c73312c72312b31290d0a3439094c4554207531203d20722876312c77322c7231290d0a353009494620282877313e3d74312926262875313e3d7529292626282873312b7731293c3d783129205448454e20474f544f2035320d0a353109474f544f203636360d0a3532096e285349474e455228292c75312c74290d0a353309682877322b75312c74290d0a35340949462077313d3d7431205448454e20474f544f2035360d0a35350953454e445f41535345545f544f5f41444452455353285349474e455228292c77312d74312c4845584445434f4445287429290d0a3536096a2872312b76312c74290d0a3537096c2873312b74312c74290d0a35380953544f524528742b223a726f6f744b4c617374222c732872312b7631292a732873312b743129290d0a353909474f544f2037300d0a3630094946202876313e3d313030302926262877313c3d783129205448454e20474f544f2036320d0a363109474f544f203636360d0a3632096c2877312c74290d0a36330944494d2079312041532055696e7436340d0a3634094c4554207931203d2076310d0a363509682879312c74290d0a3636096a2876312c74290d0a36370953544f524528742b223a726f6f744b4c617374222c73287731292a7328763129290d0a3638096e285349474e455228292c79312c74290d0a37300952455455524e20300d0a3636360952455455524e20310d0a456e642046756e6374696f6e0d0a46756e6374696f6e2052656d6f76654c697175696469747928762055696e7436342c772055696e7436342c79322055696e7436342c7420537472696e67292055696e7436340d0a310944494d2077322c72312c73312c7a312c74312041532055696e7436340d0a3130094946202828763e302926262828773e302926262879323e3029292926262870285349474e455228292c74293e3d7629205448454e20474f544f2033300d0a323009474f544f203636360d0a3330094c4554207732203d20692874290d0a34300949462077323e30205448454e20474f544f2036300d0a353009474f544f203636360d0a3630094c4554207331203d206d2874290d0a3730094c4554207231203d206b2874290d0a383009672872312c73312c74290d0a3930094c4554207732203d20692874290d0a313030094c4554207a31203d207228762c72312c7732290d0a313130094c4554207431203d207228762c73312c7732290d0a31323009494620287a313e3d772926262874313e3d793229205448454e20474f544f203134300d0a31333009474f544f203636360d0a313430096f285349474e455228292c762c74290d0a31353009682877322d762c74290d0a313630096a2872312d7a312c74290d0a313730096c2873312d74312c74290d0a3138300953544f524528742b223a726f6f744b4c617374222c732872312d7a31292a732873312d743129290d0a3139300953454e445f4445524f5f544f5f41444452455353285349474e455228292c7a31290d0a3230300953454e445f41535345545f544f5f41444452455353285349474e455228292c74312c4845584445434f4445287429290d0a3231300952455455524e20300d0a3636360952455455524e20310d0a456e642046756e6374696f6e0d0a46756e6374696f6e206c31286f312055696e7436342c7a322055696e7436342c61312055696e743634292055696e7436340d0a33300944494d2062322041532055696e7436340d0a3430094c4554206232203d206f312a3939370d0a35300949462071287a322a313030302c6f312a31303030293d3d30205448454e20474f544f2037300d0a36300950414e49430d0a37300952455455524e20722862322c61312c287a322a31303030292b6232290d0a456e642046756e6374696f6e0d0a46756e6374696f6e206d312862312055696e7436342c7a322055696e7436342c61312055696e743634292055696e7436340d0a33300952455455524e2072287a322a313030302c62312c282861312d6231292a393937292b31290d0a456e642046756e6374696f6e0d0a46756e6374696f6e206e312863312055696e7436342c79322055696e7436342c7420537472696e67292055696e7436340d0a3130094946202863313e302926262879323e3029205448454e20474f544f2033300d0a32300952455455524e20310d0a33300944494d2064312c73312c72312c78312041532055696e7436340d0a3430094c4554207331203d206d2874290d0a3530094c4554207231203d206b2874290d0a3531094c4554207831203d2031383434363734343037333730393535310d0a353209494620282872313e302926262873313e30292926262863313c3d783129205448454e20474f544f2036300d0a35330952455455524e20310d0a3630094c4554206431203d206c312863312c72312c7331290d0a37300949462064313e3d7932205448454e20474f544f2039300d0a38300952455455524e20310d0a39300953454e445f41535345545f544f5f41444452455353285349474e455228292c64312c4845584445434f4445287429290d0a313030096c2873312d64312c74290d0a313130096a2872312b63312c74290d0a3132300952455455524e20300d0a456e642046756e6374696f6e0d0a46756e6374696f6e204465726f546f417373657453776170496e7075742861737365745f6164647265737320537472696e67292055696e7436340d0a31300952455455524e206e31284445524f56414c554528292c312c61737365745f61646472657373290d0a456e642046756e6374696f6e0d0a46756e6374696f6e204465726f546f417373657453776170496e7075744d696e286d696e5f6173736574732055696e7436342c61737365745f6164647265737320537472696e67292055696e7436340d0a31300952455455524e206e31284445524f56414c554528292c6d696e5f6173736574732c61737365745f61646472657373290d0a456e642046756e6374696f6e0d0a46756e6374696f6e20642864312055696e7436342c65312055696e7436342c7420537472696e67292055696e7436340d0a3130094946202864313e302926262865313e3029205448454e20474f544f2033300d0a32300952455455524e20310d0a33300944494d2073312c72312c63312c63322041532055696e7436340d0a3430094c4554207331203d206d2874290d0a3431094c4554207231203d206b2874290d0a343209494620282872313e302926262873313e30292926262873313e643129205448454e20474f544f2035300d0a34330952455455524e20310d0a3530094c4554206331203d206d312864312c72312c7331290d0a36300949462063313e6531205448454e20474f544f20363120454c534520474f544f2037300d0a36310952455455524e20310d0a3730094c4554206332203d2065312d63310d0a38300949462063323d3d30205448454e20474f544f203130300d0a39300953454e445f4445524f5f544f5f41444452455353285349474e455228292c6332290d0a3130300953454e445f41535345545f544f5f41444452455353285349474e455228292c64312c4845584445434f4445287429290d0a313130096c2873312d64312c74290d0a313230096a2872312b63312c74290d0a3133300952455455524e20300d0a456e642046756e6374696f6e0d0a46756e6374696f6e204465726f546f4173736574537761704f7574707574286173736574735f626f756768742055696e7436342c61737365745f6164647265737320537472696e67292055696e7436340d0a31300952455455524e2064286173736574735f626f756768742c4445524f56414c554528292c61737365745f61646472657373290d0a456e642046756e6374696f6e0d0a46756e6374696f6e20652866312055696e7436342c772055696e7436342c7420537472696e67292055696e7436340d0a3130094946202866313e3029262628773e3029205448454e20474f544f2033300d0a32300952455455524e20310d0a33300944494d2073312c72312c67312c78312041532055696e7436340d0a3430094c4554207331203d206d2874290d0a3431094c4554207231203d206b2874290d0a3432094c4554207831203d2031383434363734343037333730393535310d0a343309494620282873313e302926262872313e30292926262866313c3d783129205448454e20474f544f2035300d0a34340952455455524e20310d0a3530094c4554206731203d206c312866312c73312c7231290d0a36300949462067313e3d77205448454e20474f544f2038300d0a37300952455455524e20310d0a38300953454e445f4445524f5f544f5f41444452455353285349474e455228292c6731290d0a3930096a2872312d67312c74290d0a313030096c2873312b66312c74290d0a3131300952455455524e20300d0a456e642046756e6374696f6e0d0a46756e6374696f6e204173736574546f4465726f53776170496e707574286d696e5f6465726f2055696e7436342c61737365745f6164647265737320537472696e67292055696e7436340d0a31300952455455524e206528415353455456414c5545284845584445434f44452861737365745f6164647265737329292c6d696e5f6465726f2c61737365745f61646472657373290d0a456e642046756e6374696f6e0d0a46756e6374696f6e20662867312055696e7436342c68312055696e7436342c7420537472696e67292055696e7436340d0a31300949462067313e30205448454e20474f544f2033300d0a32300952455455524e20310d0a33300944494d2073312c72312c66312c64322041532055696e7436340d0a3430094c4554207331203d206d2874290d0a3431094c4554207231203d206b2874290d0a343209494620282873313e302926262872313e30292926262872313e673129205448454e20474f544f2035300d0a34330952455455524e20310d0a3530094c4554206631203d206d312867312c73312c7231292f2f206173736574735f736f6c6420697320616c77617973203e207a65726f0d0a36300949462068313e3d6631205448454e20474f544f2038300d0a37300952455455524e20310d0a38300953454e445f4445524f5f544f5f41444452455353285349474e455228292c6731290d0a3930094c4554206432203d2068312d66310d0a3130300949462064323d3d30205448454e20474f544f203132300d0a3131300953454e445f41535345545f544f5f41444452455353285349474e455228292c64322c4845584445434f4445287429290d0a313230096a2872312d67312c74290d0a313330096c2873312b66312c74290d0a3134300952455455524e20300d0a456e642046756e6374696f6e0d0a46756e6374696f6e204173736574546f4465726f537761704f7574707574286465726f5f626f756768742055696e7436342c61737365745f6164647265737320537472696e67292055696e7436340d0a31300952455455524e2066286465726f5f626f756768742c415353455456414c5545284845584445434f44452861737365745f6164647265737329292c61737365745f61646472657373290d0a456e642046756e6374696f6e0d0a46756e6374696f6e20672869312055696e7436342c6a312055696e7436342c7420537472696e67292055696e7436340d0a31300944494d20653220415320537472696e670d0a31310944494d2066322041532055696e7436340d0a3230094c4554206532203d204c4f41442822666565546f22290d0a3330094c4554206632203d204c4f414428742b223a726f6f744b4c61737422290d0a3430094946206632213d30205448454e20474f544f2035300d0a34310952455455524e20300d0a35300944494d2067322041532055696e7436340d0a3630094c4554206732203d2073286931292a73286a31290d0a37300949462067323e6632205448454e20474f544f2038300d0a37310952455455524e20300d0a38300944494d2068322c75312041532055696e7436340d0a3930094c4554206832203d20692874290d0a313030094c4554207531203d20722868322c67322d66322c2867322a35292b6632290d0a3131300949462075313e30205448454e20474f544f2031313120454c534520474f544f203132300d0a313131096e2865322c75312c74290d0a31313209682868322b75312c74290d0a3132300952455455524e20300d0a456e642046756e6374696f6e0d0a46756e6374696f6e206828762055696e7436342c7420537472696e67292055696e7436340d0a313020202020202053544f524528742b223a424f4f222c76290d0a323020202020202052455455524e20300d0a456e642046756e6374696f6e0d0a46756e6374696f6e2069287420537472696e67292055696e7436340d0a31300949462045584953545328742b223a424f4f2229205448454e20474f544f2033300d0a32300952455455524e20300d0a33300952455455524e204c4f414428742b223a424f4f22290d0a456e642046756e6374696f6e0d0a46756e6374696f6e206a28762055696e7436342c7420537472696e67292055696e7436340d0a31300953544f524528742b223a4445524f222c76290d0a32300952455455524e20300d0a456e642046756e6374696f6e0d0a46756e6374696f6e206b287420537472696e67292055696e7436340d0a31300952455455524e204c4f414428742b223a4445524f22290d0a456e642046756e6374696f6e0d0a46756e6374696f6e206c28762055696e7436342c7420537472696e67292055696e7436340d0a31300953544f524528742c76290d0a32300952455455524e20300d0a456e642046756e6374696f6e0d0a46756e6374696f6e206d287420537472696e67292055696e7436340d0a32300952455455524e204c4f41442874290d0a456e642046756e6374696f6e0d0a46756e6374696f6e206e286b3120537472696e672c762055696e7436342c7420537472696e67292055696e7436340d0a3130094946204558495354532828414444524553535f535452494e47286b31292b223a424f4f3a22292b7429205448454e20474f544f2034300d0a32300953544f52452828414444524553535f535452494e47286b31292b223a424f4f3a22292b742c76290d0a33300952455455524e20300d0a34300953544f52452828414444524553535f535452494e47286b31292b223a424f4f3a22292b742c70286b312c74292b76290d0a35300952455455524e20300d0a456e642046756e6374696f6e0d0a46756e6374696f6e206f286b3120537472696e672c762055696e7436342c7420537472696e67292055696e7436340d0a31300953544f52452828414444524553535f535452494e47286b31292b223a424f4f3a22292b742c70286b312c74292d76290d0a32300952455455524e20300d0a456e642046756e6374696f6e0d0a46756e6374696f6e2070286b3120537472696e672c7420537472696e67292055696e7436340d0a31300952455455524e204c4f41442828414444524553535f535452494e47286b31292b223a424f4f3a22292b74290d0a456e642046756e6374696f6e0d0a46756e6374696f6e2071286c312055696e7436342c6d312055696e743634292055696e7436340d0a3130094946206c313e2831383434363734343037333730393535313631352d6d3129205448454e20474f544f203130300d0a32300952455455524e20300d0a3130300952455455524e20310d0a456e642046756e6374696f6e0d0a46756e6374696f6e2072286c312055696e7436342c6d312055696e7436342c6e312055696e743634292055696e7436340d0a3130200944494d2069322c6a322041532055696e7436340d0a323020094c4554206932203d20343239343936373239360d0a333020094c4554206a32203d20282869322d31292a6932292b2869322d31290d0a3530200944494d206b322041532055696e7436340d0a363020094c4554206b32203d2028286c312f6e31292a6d31292b28286c31256e31292a286d312f6e3129290d0a373020094c4554206c31203d206c31256e310d0a383020094c4554206d31203d206d31256e310d0a39302009494620286c313d3d30297c7c286d313d3d3029205448454e20474f544f20313030300d0a313030094946206e313e3d6932205448454e20474f544f203230300d0a313130094c4554206b32203d206b322b28286c312a6d31292f6e31290d0a31323009474f544f20313030300d0a3230300944494d206c322041532055696e7436340d0a323130094c4554206c32203d206a322f6e310d0a323230094c4554206e31203d206e312a6c320d0a323330094c4554206c31203d206c312a6c320d0a3330300944494d206d322c6e322c6f322c75332c71322c72322041532055696e7436340d0a333130094c4554206d32203d206c312f69320d0a333230094c4554206e32203d206c312569320d0a333330094c4554206f32203d206d312f69320d0a333430094c4554207533203d206d312569320d0a333530094c4554207132203d206e312f69320d0a333630094c4554207232203d206e312569320d0a3430300944494d2073322c74322c75322041532055696e7436340d0a343130094c4554207332203d206e322a75330d0a343230094c4554207432203d202873322f6932292b286e322a6f32290d0a343330094c4554207332203d2073322569320d0a343430094c4554207532203d202874322f6932292b286d322a6f32290d0a343530094c4554207432203d20287432256932292b286d322a7533290d0a343630094c4554207532203d2075322b2874322f6932290d0a343730094c4554207432203d2074322569320d0a3530300944494d2076322c77322c78322041532055696e7436340d0a353130094c4554207532203d207532256e310d0a353230094c4554207732203d2075322f71320d0a353330094c4554207832203d2075322571320d0a363030094946202877323c6932292626282878323e3d6932297c7c282877322a7232293c3d282878322a6932292b7432292929205448454e20474f544f203730300d0a363130094c4554207732203d2077322d310d0a363230094c4554207832203d2078322b71320d0a36333009474f544f203630300d0a373030094c4554207432203d202828287532256932292a6932292b7432292d2877322a7232290d0a373130094c4554207532203d2028282875322f6932292a6932292b2874322f693229292d2877322a7132290d0a373230094c4554207432203d20287432256932292b28287532256932292a6932290d0a373330094c4554207632203d2074322f71320d0a373430094c4554207832203d2074322571320d0a383030094946202876323c6932292626282878323e3d6932297c7c282876322a7232293c3d282878322a6932292b7332292929205448454e20474f544f203930300d0a383130094c4554207632203d2076322d310d0a383230094c4554207832203d2078322b71320d0a38333009474f544f203830300d0a393030094c4554206b32203d20286b322b7632292b2877322a6932290d0a313030300952455455524e206b320d0a456e642046756e6374696f6e0d0a46756e6374696f6e2073286f312055696e743634292055696e7436340d0a313020094946206f313e33205448454e20474f544f20323020454c534520474f544f2039300d0a3230200944494d2079322c7a322041532055696e7436340d0a333020094c4554207a32203d206f310d0a343020094c4554207932203d20286f312f32292b310d0a3530200949462079323c7a32205448454e20474f544f20363020454c534520474f544f203133300d0a363020094c4554207a32203d2079320d0a373020094c4554207932203d2028286f312f7932292b7932292f320d0a38302009474f544f2035300d0a393020094946206f31213d30205448454e20474f544f2031313020454c534520474f544f203132300d0a3131300952455455524e20310d0a3132300952455455524e20300d0a3133300952455455524e207a320d0a456e642046756e6374696f6e0d0a46756e6374696f6e20557064617465436f646528743220537472696e67292055696e7436340d0a3130094946204c4f414428226f776e657222293d3d5349474e45522829205448454e20474f544f2033300d0a32300952455455524e20310d0a3330095550444154455f53435f434f4445287432290d0a34300952455455524e20300d0a456e642046756e6374696f6e
ad2e7b37c380cc1aed3a6b27224ddfc92a2d15962ca1f4d35e530dba0f9575a9 1.71082051e+08
ad2e7b37c380cc1aed3a6b27224ddfc92a2d15962ca1f4d35e530dba0f9575a9:BOO 299999
ad2e7b37c380cc1aed3a6b27224ddfc92a2d15962ca1f4d35e530dba0f9575a9:DERO 175508
ad2e7b37c380cc1aed3a6b27224ddfc92a2d15962ca1f4d35e530dba0f9575a9:rootKLast 5.466718e+06
dero1qy2gyktqak3vqxl6k80g5at50z92ltj0xyyj4j8j22c5s2zjjpncsqq9wwyly:BOO:ee300fe87cf9fb3bd600b25d6af4cd54569022a3fa264a1cb20174bb9ef7afa2 0
dero1qy5cc8g0fql7yaeqy5ydwy0wgzxh44q9nvsfzgw4wul4q7xdhapm2qgsr3pkc:BOO:ee300fe87cf9fb3bd600b25d6af4cd54569022a3fa264a1cb20174bb9ef7afa2 508371
dero1qydfpxpajj5dzr38uz8t4tpxnxntdcel5ml96384gkj9g8uza8tz7qggjfm79:BOO:ee300fe87cf9fb3bd600b25d6af4cd54569022a3fa264a1cb20174bb9ef7afa2 343221
dero1qyfk5w2rvqpl9kzfd7fpteyp2k362y6audydcu2qrgcmj6vtasfkgqq9704gn:BOO:ad2e7b37c380cc1aed3a6b27224ddfc92a2d15962ca1f4d35e530dba0f9575a9 0
dero1qyfk5w2rvqpl9kzfd7fpteyp2k362y6audydcu2qrgcmj6vtasfkgqq9704gn:BOO:ee300fe87cf9fb3bd600b25d6af4cd54569022a3fa264a1cb20174bb9ef7afa2 115499
dero1qyfk5w2rvqpl9kzfd7fpteyp2k362y6audydcu2qrgcmj6vtasfkgqq9704gn:BOO:f22bbe5f6527338ace6eb019ebf971721b9cde81b571b45f94f5a0877d0257f6 0
dero1qyfn6esxwqk6mzx3whqtdfrz5aytu4nsfwk9hw02dp9p2nvf360r5qgzp2qre:BOO:ee300fe87cf9fb3bd600b25d6af4cd54569022a3fa264a1cb20174bb9ef7afa2 0
dero1qyfsqtjeprmvx5yj39n992g35ex8w9tayf9xk4fwdyaj6t2mxc7c2qgh7ax7w:BOO:ee300fe87cf9fb3bd600b25d6af4cd54569022a3fa264a1cb20174bb9ef7afa2 1.099723e+06
dero1qygawu5gv5e2yqghexfmkfwen5slsqkpn8c2y096s4y0qtqj7ag95qq2slucv:BOO:ee300fe87cf9fb3bd600b25d6af4cd54569022a3fa264a1cb20174bb9ef7afa2 1.554932e+06
dero1qyj4unrgwn0n88jzs6cyv77tdqs5tcfug0d0gdyaljxwfdcqu5mmzqqyytl80:BOO:ee300fe87cf9fb3bd600b25d6af4cd54569022a3fa264a1cb20174bb9ef7afa2 331
dero1qykc3nazlzs7mwgxv0u70u57l74q7upv7t84k8424g89sjtazzkdjqq7dpfdg:BOO:ee300fe87cf9fb3bd600b25d6af4cd54569022a3fa264a1cb20174bb9ef7afa2 4640
dero1qynwmrhcpd8l3hhpjgzhvgpgae73cp7xzdxst3c5lra7zuvrydu25qqm4x95p:BOO:ad2e7b37c380cc1aed3a6b27224ddfc92a2d15962ca1f4d35e530dba0f9575a9 299999
dero1qypallrztyfhep2cer55fjtud7k6m6t5kznn5vrp3yykpugjxdvf7qg8tr6cf:BOO:ee300fe87cf9fb3bd600b25d6af4cd54569022a3fa264a1cb20174bb9ef7afa2 61698
dero1qypsxfl6627n7rm6va3au3k5eawragr7svty5c2qmkfdf5p5x789jqg8s4trf:BOO:ee300fe87cf9fb3bd600b25d6af4cd54569022a3fa264a1cb20174bb9ef7afa2 31573
dero1qypsxfl6627n7rm6va3au3k5eawragr7svty5c2qmkfdf5p5x789jqg8s4trf:BOO:f22bbe5f6527338ace6eb019ebf971721b9cde81b571b45f94f5a0877d0257f6 417
dero1qys5ksz2wx5el68prask0z7ldyj3gnaqphuprg3gchll55qppmvqgqgecjfs4:BOO:ee300fe87cf9fb3bd600b25d6af4cd54569022a3fa264a1cb20174bb9ef7afa2 58747
dero1qyswl09ngr4xgwrclc4h4974ws793f60pyf75mnemam6dazhdey2yqq203lw0:BOO:ee300fe87cf9fb3bd600b25d6af4cd54569022a3fa264a1cb20174bb9ef7afa2 0
dero1qytfy375j89quhqsa90xmz6sgf0rg3t8shns6re2zqdqm7yygkqjyqgrv0dgr:BOO:f22bbe5f6527338ace6eb019ebf971721b9cde81b571b45f94f5a0877d0257f6 52345
dero1qyvqpdftj8r6005xs20rnflakmwa5pdxg9vcjzdcuywq2t8skqhvwqglt6x0g:BOO:ee300fe87cf9fb3bd600b25d6af4cd54569022a3fa264a1cb20174bb9ef7afa2 27842
dero1qyvt6hs0vcra572t7ke0fdh3ghn4s4mdqc0ayma8332tv4gyr9cwcqq4qyxfu:BOO:ee300fe87cf9fb3bd600b25d6af4cd54569022a3fa264a1cb20174bb9ef7afa2 1.277126e+06
dero1qyy60z2p4cfw7g2myg38u7hsgkc0t263cg37uxuvjv7xcaun65jpsqq6m3ts0:BOO:ee300fe87cf9fb3bd600b25d6af4cd54569022a3fa264a1cb20174bb9ef7afa2 5009
descrHdr 5068616e746f6d2d706f77657265642066696e616e6365
ee300fe87cf9fb3bd600b25d6af4cd54569022a3fa264a1cb20174bb9ef7afa2 1.1226802889e+10
ee300fe87cf9fb3bd600b25d6af4cd54569022a3fa264a1cb20174bb9ef7afa2:BOO 5.088712e+06
ee300fe87cf9fb3bd600b25d6af4cd54569022a3fa264a1cb20174bb9ef7afa2:DERO 9.62534e+06
ee300fe87cf9fb3bd600b25d6af4cd54569022a3fa264a1cb20174bb9ef7afa2:rootKLast 3.2835051e+08
f22bbe5f6527338ace6eb019ebf971721b9cde81b571b45f94f5a0877d0257f6 2.39146974e+08
f22bbe5f6527338ace6eb019ebf971721b9cde81b571b45f94f5a0877d0257f6:BOO 52762
f22bbe5f6527338ace6eb019ebf971721b9cde81b571b45f94f5a0877d0257f6:DERO 11850
f22bbe5f6527338ace6eb019ebf971721b9cde81b571b45f94f5a0877d0257f6:rootKLast 1.675032e+06
feeTo 030327fad2bd3f0f7a6763de46d4cf5c3ea07e83164a6140dd92d4d034378e5901
nameHdr 47686f73742045786368616e6765
owner 030327fad2bd3f0f7a6763de46d4cf5c3ea07e83164a6140dd92d4d034378e5901
SCID uint64 variables
key value
built BLID : 3c261616362cf7fc2e676774ec3891492b1ef1513a0c868c1ebda7fbeeffac70
Tx RootHash: a613f92cae3598a7141b2fc21fe36502b312d59a5507e5dac3091e6490067fea built height : 3418419
Timestamp: 1710204943292 Timestamp [UTC]: 2024-03-12 00:55:43 Age [y:d:h:m:s]: 12657:38:3.705
Block: 3418423 Fee: 0.29929 Tx size: 21.076 kB
Tx version: 1 No of confirmations: 2406738 Signature type: DERO_HOMOMORPHIC
Extra:
DERO : 2 inputs/outputs (RING size) Fees 0.29929 Deposited to SC 0.00000
Sender : dero1qypsxfl6627n7rm6va3au3k5eawragr7svty5c2qmkfdf5p5x789jqg8s4trf
address
dero1qywve38m0kk5hnctclhxf855efc573hmz036vvrnx4t6rf7x6a4l6qqgcg68e
dero1qypsxfl6627n7rm6va3au3k5eawragr7svty5c2qmkfdf5p5x789jqg8s4trf
SC Balance: 0.00000 DERO
SC CODE:
  
//          .-.
//         (o o) 
//         | O \  boo!
//         |    \
//         '~~~~'
//    ?
//   /\                ___
//  (oo)              |RIP|
//  /||\              |___|
//////////////////////////////////////
// Ghost Exchange v1.1
// Use at your own risk
// For more info visit: ghost.trading
//////////////////////////////////////

Function Initialize() Uint64
    10 STORE("owner", SIGNER())
    20 STORE("feeTo", SIGNER())
    30 STORE("nameHdr", "Ghost Exchange")
    40 STORE("descrHdr", "Phantom-powered finance") 
    50  RETURN 0
End Function 

// Provided liquidity will be tracked using BOO tokens. 
// BOO TOKENS ARE NOT ASSETS. Each account's BOO balance per token pair is stored 
// inside the Smart Contract as a variable with the following schema:
// <provider_address>:BOO:<asset_address>
// The total liquidity provided by all LPs of a pair at a given moment is denominated supply.
// supply is tracked inside the Smart Contract as a variable with the following schema:
// <asset_address>:BOO
// Deposit assets and DERO at current ratio to get BOO tokens. 
// {asset_address} The deposited asset's SCID
// {min_liquidity} Minimum number of BOO sender will get if total BOO supply is greater than 0.
// {min_liquidity} does nothing when total BOO supply is 0.
Function AddLiquidity(asset_address String, min_liquidity Uint64) Uint64
    01 DIM total_liquidity, dero_reserve, asset_reserve, asset_amount, liquidity_minted, dero_deposited, asset_deposited, SYS_MAX_VALUE as Uint64
    02 LET SYS_MAX_VALUE = 18446744073709551 // Uint64.Max/1000 to protect from infinite supply tokens
    03 LET dero_deposited = DEROVALUE()
    04 LET asset_deposited = ASSETVALUE(HEXDECODE(asset_address))
    10 IF (asset_deposited > 0 & dero_deposited > 0 ) THEN GOTO 30
    20 GOTO 666
    30 LET total_liquidity =  get_supply_per_asset(asset_address) 
    // Pair already exists
    40 IF total_liquidity > 0 THEN GOTO 41 ELSE GOTO 60
        41 IF min_liquidity > 0 THEN GOTO 43
        42 GOTO 666  
        43 LET dero_reserve = get_dero_reserve_per_asset(asset_address) 
        44 LET asset_reserve = get_asset_reserve(asset_address)
        45 IF will_addition_overflow(asset_reserve, asset_deposited) == 1 THEN GOTO 666
        46 mintFee(dero_reserve, asset_reserve, asset_address)
        47 LET total_liquidity = get_supply_per_asset(asset_address) // Must be defined again since totalSupply can update in mintFee
        48 LET asset_amount =   mult_div(dero_deposited, asset_reserve , dero_reserve + 1)
        49 LET liquidity_minted = mult_div(dero_deposited, total_liquidity, dero_reserve)
        50 IF asset_deposited >= asset_amount & liquidity_minted >= min_liquidity & (asset_reserve + asset_deposited <= SYS_MAX_VALUE) THEN GOTO 52
        51 GOTO 666
        52 increase_provider_liquidity_by(SIGNER(), liquidity_minted, asset_address) 
        53 set_supply_per_asset(total_liquidity + liquidity_minted, asset_address)
        54 IF asset_deposited == asset_amount THEN GOTO 56
        // Return any reminding assets
        55 SEND_ASSET_TO_ADDRESS(SIGNER(), asset_deposited - asset_amount, HEXDECODE(asset_address))
        // Increase the dero reserve record for this asset
        56 set_dero_reserve_per_asset(dero_reserve + dero_deposited, asset_address)
        // Increase the asset reserve record
        57 set_asset_reserve(asset_reserve + asset_amount, asset_address)
        58 STORE(asset_address+":rootKLast",  sqrt(dero_reserve + dero_deposited) * sqrt(asset_reserve + asset_amount))
        // Return gracefully
        59 GOTO 70
    // else
    // Creating pair  
    60 IF dero_deposited >= 1000 & asset_deposited <= SYS_MAX_VALUE THEN GOTO 62
        61 GOTO 666
        // Initialize the asset reserve record for this asset
        62 set_asset_reserve(asset_deposited, asset_address)
        63 DIM initial_liquidity as Uint64
        64 LET initial_liquidity = dero_deposited
        65 set_supply_per_asset(initial_liquidity, asset_address)
        // Initialize the dero reserve record for this asset
        66 set_dero_reserve_per_asset(dero_deposited, asset_address)
        67 STORE(asset_address+":rootKLast", sqrt(asset_deposited) * sqrt(dero_deposited))
        68 increase_provider_liquidity_by(SIGNER(), initial_liquidity, asset_address)
    70 RETURN 0

    666 RETURN 1
End Function

// Burn BOO tokens to withdraw Dero & assets at current ratio.
// {amount} Amount of BOO burned.
// {min_dero} Minimum DERO withdrawn.
// {min_assets} Minimum assets withdrawn.
// {asset_address} The deposited asset's SCID
Function RemoveLiquidity(amount Uint64, min_dero Uint64, min_assets Uint64, asset_address String) Uint64
    01  DIM total_liquidity, dero_reserve, asset_reserve, dero_amount, asset_amount as Uint64
    10  IF amount > 0  & (min_dero > 0 & min_assets > 0) & ( get_provider_liquidity(SIGNER(), asset_address) >= amount ) THEN GOTO 30
    20  GOTO 666
    30  LET total_liquidity = get_supply_per_asset(asset_address)
    40  IF total_liquidity > 0 THEN GOTO 60
    50  GOTO 666
    60  LET asset_reserve = get_asset_reserve(asset_address)
    70  LET dero_reserve = get_dero_reserve_per_asset(asset_address)
    80  mintFee(dero_reserve, asset_reserve, asset_address)
    90  LET total_liquidity = get_supply_per_asset(asset_address) // Must be defined again since totalSupply can update in mintFee
   100  LET dero_amount  = mult_div(amount, dero_reserve, total_liquidity)
   110  LET asset_amount = mult_div(amount, asset_reserve, total_liquidity)
   120  IF dero_amount >= min_dero & asset_amount >= min_assets THEN GOTO 140
   130  GOTO 666
   140  decrease_provider_liquidity_by(SIGNER(), amount, asset_address)
   150  set_supply_per_asset(total_liquidity - amount, asset_address)
   160  set_dero_reserve_per_asset(dero_reserve - dero_amount, asset_address)
   170  set_asset_reserve(asset_reserve - asset_amount, asset_address)
   180  STORE(asset_address+":rootKLast", sqrt(dero_reserve - dero_amount) * sqrt(asset_reserve - asset_amount) )
   190  SEND_DERO_TO_ADDRESS(SIGNER(), dero_amount)
   200  SEND_ASSET_TO_ADDRESS(SIGNER(),asset_amount, HEXDECODE(asset_address))
   210  RETURN 0

   666  RETURN 1
End Function

// Pricing function for converting between DERO & Assets.
// {input_amount} Amount of DERO or Assets being sold.
// {input_reserve} Amount of DERO or Assets (input type) in exchange reserves.
// {output_reserve} Amount of DERO or Assets (output type) in exchange reserves.
Function getInputPrice(input_amount Uint64, input_reserve Uint64, output_reserve Uint64) Uint64
    01 DIM SYS_MAX_VALUE as Uint64
    02 LET SYS_MAX_VALUE = 18446744073709551
    10 IF input_reserve > 0 & output_reserve > 0 & input_amount <= SYS_MAX_VALUE THEN GOTO 30
    20 PANIC
    30 DIM input_amount_with_fee as Uint64
    40 LET input_amount_with_fee = input_amount * 997
    50 IF will_addition_overflow(input_reserve * 1000, input_amount * 1000) == 0 THEN GOTO 70
    60 PANIC // Infinite supply token attack
    70 RETURN mult_div(input_amount_with_fee, output_reserve, (input_reserve * 1000) + input_amount_with_fee)
End Function

// Pricing function for converting between DERO & Assets.
// {output_amount} Amount of DERO or Assets being bought.
// {input_reserve} Amount of DERO or Assets (input type) in exchange reserves.
// {output_reserve} Amount of DERO or Assets (output type) in exchange reserves.
Function getOutputPrice(output_amount Uint64, input_reserve Uint64, output_reserve Uint64) Uint64
    10 IF input_reserve > 0 && output_reserve > 0 && output_reserve > output_amount THEN GOTO 30
    20 PANIC
    30 RETURN mult_div(input_reserve * 1000, output_amount, (output_reserve - output_amount) * 997 + 1)
End Function

Function deroToAssetInput(dero_sold Uint64, min_assets Uint64, asset_address String) Uint64
    10 IF  (dero_sold > 0 & min_assets > 0) THEN GOTO 30
    20 PANIC
    30 DIM assets_bought, asset_reserve, dero_reserve as Uint64
    40 LET asset_reserve = get_asset_reserve(asset_address)
    50 LET dero_reserve = get_dero_reserve_per_asset(asset_address)
    60 LET assets_bought = getInputPrice(dero_sold, dero_reserve, asset_reserve)
    70 IF assets_bought >= min_assets THEN GOTO 90
    80 PANIC
    90 SEND_ASSET_TO_ADDRESS(SIGNER(), assets_bought, HEXDECODE(asset_address))
   100 set_asset_reserve(asset_reserve - assets_bought, asset_address)
   110 set_dero_reserve_per_asset(dero_reserve + dero_sold, asset_address)
   120 RETURN 0
End Function

// Convert DERO to Assets.
// User specifies exact input (DEROVALUE()).
// User cannot specify minimum output.
// {asset_address} Address of the asset to trade.
Function DeroToAssetSwapInput(asset_address String) Uint64
    10 RETURN deroToAssetInput(DEROVALUE(), 1, asset_address)
End Function

// Convert DERO to Assets.
// User specifies exact input (DEROVALUE()) & minimum output.
// {min_assets} Minimum Assets bought.
// {asset_address} Address of the asset to trade.
Function DeroToAssetSwapInputMin(min_assets Uint64, asset_address String) Uint64
    10 RETURN deroToAssetInput(DEROVALUE(), min_assets, asset_address)
End Function

Function deroToAssetOutput(assets_bought Uint64, max_dero Uint64, asset_address String) Uint64
    10 IF (assets_bought > 0 & max_dero > 0) THEN GOTO 30
    20 PANIC
    30 DIM asset_reserve, dero_reserve, dero_sold, dero_refund as Uint64
    40 LET asset_reserve = get_asset_reserve(asset_address)
    41 LET dero_reserve = get_dero_reserve_per_asset(asset_address)
    50 LET dero_sold = getOutputPrice(assets_bought, dero_reserve, asset_reserve)
    60 IF dero_sold > max_dero THEN GOTO 61 ELSE GOTO 70
    61 PANIC
    70 LET dero_refund = max_dero - dero_sold
    80 IF dero_refund == 0 THEN GOTO 100
    90 SEND_DERO_TO_ADDRESS(SIGNER(), dero_refund)
   100 SEND_ASSET_TO_ADDRESS(SIGNER(), assets_bought, HEXDECODE(asset_address))
   110 set_asset_reserve(asset_reserve - assets_bought, asset_address)
   120 set_dero_reserve_per_asset(dero_reserve + dero_sold, asset_address)
   130 RETURN 0
End Function

// Convert DERO to Assets.
// User specifies maximum input (DEROVALUE()) & exact output.
// {assets_bought} Amount of Assets bought.
// {asset_address} Address of the asset to trade.
Function DeroToAssetSwapOutput(assets_bought Uint64, asset_address String) Uint64
    10 RETURN deroToAssetOutput(assets_bought, DEROVALUE(), asset_address)
End Function

Function assetToDeroInput(assets_sold Uint64, min_dero Uint64, asset_address String) Uint64
    10 IF (assets_sold > 0 & min_dero > 0) THEN GOTO 30
    20 PANIC
    30 DIM asset_reserve, dero_bought as Uint64
    40 LET asset_reserve = get_asset_reserve(asset_address)
    50 LET dero_bought = getInputPrice(assets_sold, asset_reserve, get_dero_reserve_per_asset(asset_address))
    60 IF dero_bought >= min_dero THEN GOTO 80
    70 PANIC
    80 SEND_DERO_TO_ADDRESS(SIGNER(),dero_bought)
    90 set_dero_reserve_per_asset(get_dero_reserve_per_asset(asset_address) - dero_bought, asset_address)
   100 set_asset_reserve(asset_reserve + assets_sold, asset_address)
   110 RETURN 0
End Function

// Convert Assets to DERO.
// User specifies exact input (ASSETVALUE(asset_address)) & minimum output.
// {min_dero} Minimum DERO purchased.
// {asset_address} Address of the asset to trade.
Function AssetToDeroSwapInput(min_dero Uint64, asset_address String) Uint64
    10 RETURN assetToDeroInput(ASSETVALUE(HEXDECODE(asset_address)), min_dero, asset_address)
End Function


Function assetToDeroOutput(dero_bought Uint64, max_assets Uint64 , asset_address String) Uint64
    10 IF  dero_bought > 0 THEN GOTO 30
    20 PANIC
    30 DIM asset_reserve, assets_sold, asset_refund as Uint64
    40 LET asset_reserve = get_asset_reserve(asset_address)
    50 LET assets_sold = getOutputPrice(dero_bought, asset_reserve, get_dero_reserve_per_asset(asset_address))
    // assets_sold is always > zero
    60 IF max_assets >= assets_sold THEN GOTO 80
    70 PANIC
    80 SEND_DERO_TO_ADDRESS(SIGNER(), dero_bought)
    90 LET asset_refund = max_assets - assets_sold
   100 IF asset_refund == 0 THEN GOTO 120
   110 SEND_ASSET_TO_ADDRESS(SIGNER(), asset_refund, HEXDECODE(asset_address))
   120 set_dero_reserve_per_asset(get_dero_reserve_per_asset(asset_address) - dero_bought, asset_address)
   130 set_asset_reserve(asset_reserve + assets_sold, asset_address)
   140 RETURN 0
End Function

// Convert Assets to DERO.
// User specifies maximum input (ASSETVALUE(asset_address)) & exact output.
// {dero_bought} Amount of DERO purchased.
// {asset_address} Address of the asset to trade.
Function AssetToDeroSwapOutput(dero_bought Uint64, asset_address String) Uint64
    10 RETURN assetToDeroOutput(dero_bought, ASSETVALUE(HEXDECODE(asset_address)), asset_address)
End Function

// Public price function for DERO to Asset trades with an exact input.
// {dero_sold} Amount of DERO sold.
// {asset_address} Address of the asset to trade.
// @returns Amount of Assets that can be bought with input DERO.
Function GetDeroToAssetInputPrice(dero_sold Uint64, asset_address String) Uint64
    10 IF dero_sold > 0 THEN GOTO 30
    20 RETURN 0
    30 RETURN getInputPrice(dero_sold, get_dero_reserve_per_asset(asset_address), get_asset_reserve(asset_address))
End Function

// Public price function for DERO to Asset trades with an exact output.
// {assets_bought} Amount of Assets bought.
// {asset_address} Address of the asset to trade.
// @returns Amount of DERO needed to buy output Assets.
Function GetDeroToAssetOutputPrice(assets_bought Uint64, asset_address String) Uint64
    10 IF assets_bought > 0 THEN GOTO 30
    20 RETURN 0
    30 RETURN getOutputPrice(assets_bought, get_dero_reserve_per_asset(asset_address), get_asset_reserve(asset_address))
End Function

// Public price function for Asset to DERO trades with an exact input.
// {assets_sold} Amount of Assets sold.
// {asset_address} Address of the asset to trade.
// @returns Amount of DERO that can be bought with input Assets.
Function GetAssetToDeroInputPrice(assets_sold Uint64, asset_address String) Uint64
    10 IF assets_sold > 0 THEN GOTO 30
    20 RETURN 0
    30 RETURN getInputPrice(assets_sold, get_asset_reserve(asset_address), get_dero_reserve_per_asset(asset_address))
End Function

// Public price function for Asset to DERO trades with an exact output.
// {dero_bought} Amount of output DERO.
// {asset_address} Address of the asset to trade.
// @returns Amount of Assets needed to buy output DERO.
Function GetAssetToDeroOutputPrice(dero_bought Uint64, asset_address String) Uint64
    10 IF dero_bought > 0 THEN GOTO 30
    20 RETURN 0
    30 RETURN getOutputPrice(dero_bought, get_asset_reserve(asset_address), get_dero_reserve_per_asset(asset_address))
End Function

Function mintFee(reserve0 Uint64, reserve1 Uint64, asset_address String) 
    10 DIM feeTo as String
    11 DIM rootKLast as Uint64
    20 LET feeTo = LOAD("feeTo") 
    // Get the last root k for the asset
    30 LET rootKLast = LOAD(asset_address+":rootKLast")
    40 IF rootKLast != 0 THEN GOTO 50
        41 RETURN 
    50 DIM rootK as Uint64
    60 LET rootK = sqrt(reserve0) * sqrt(reserve1)
    70 IF rootK > rootKLast THEN GOTO 80
        71 RETURN 
    80 DIM supply, liquidity_minted as Uint64
    90 LET supply = get_supply_per_asset(asset_address)
   100 LET liquidity_minted = mult_div(supply, rootK - rootKLast, rootK * 5 + rootKLast)
   110 IF liquidity_minted > 0 THEN GOTO 111 ELSE GOTO 120
       111 increase_provider_liquidity_by(feeTo, liquidity_minted, asset_address)
       112 set_supply_per_asset(supply + liquidity_minted, asset_address)
   120 RETURN 
End Function

// Helper functions 
// Encapsulated to better understand what's happening and absctract BOO storage schema
// from main code.

Function set_supply_per_asset(amount Uint64, asset_address String) 
    10 STORE(asset_address+":BOO", amount)
    20 RETURN
End Function

Function get_supply_per_asset(asset_address String) Uint64
    10 IF EXISTS(asset_address+":BOO") THEN GOTO 30
    20 RETURN 0
    30 RETURN LOAD(asset_address+":BOO")
End Function

Function set_dero_reserve_per_asset(amount Uint64, asset_address String)
    10 STORE(asset_address+":DERO", amount)
    20 RETURN 
End Function

Function get_dero_reserve_per_asset(asset_address String) Uint64
    10 RETURN LOAD(asset_address+":DERO")
End Function

Function set_asset_reserve(amount Uint64, asset_address String) 
    10 STORE(asset_address, amount)
    20 RETURN 
End Function

Function get_asset_reserve(asset_address String) Uint64
    20 RETURN LOAD(asset_address)
End Function

Function increase_provider_liquidity_by(provider_address String, amount Uint64, asset_address String)
    10 IF EXISTS(ADDRESS_STRING(provider_address)+":BOO:"+asset_address) THEN GOTO 40
    20 STORE(ADDRESS_STRING(provider_address)+":BOO:"+asset_address, amount)
    30 RETURN
    40 STORE(ADDRESS_STRING(provider_address)+":BOO:"+asset_address, get_provider_liquidity(provider_address, asset_address) + amount)
    50 RETURN
End Function

Function decrease_provider_liquidity_by(provider_address String, amount Uint64, asset_address String)
    10 STORE(ADDRESS_STRING(provider_address)+":BOO:"+asset_address, get_provider_liquidity(provider_address, asset_address) - amount)
    20 RETURN
End Function

Function get_provider_liquidity(provider_address String, asset_address String) Uint64
    10 RETURN LOAD(ADDRESS_STRING(provider_address)+":BOO:"+asset_address)
End Function

Function will_addition_overflow(a Uint64, b Uint64) Uint64
    10 IF (a > 18446744073709551615 - b) THEN GOTO 100
    20 RETURN 0 // No overflow
    100 RETURN 1 // Overflow
End Function

// From Pieswap
// lossless (a * b ) / c
Function mult_div(a Uint64, b Uint64, c Uint64) Uint64
	10 DIM base, maxdiv AS Uint64
	20 LET base = 4294967296	// (1<<32)
	30 LET maxdiv = (base-1)*base + (base-1)

	50 DIM res AS Uint64
	60 LET res = (a/c) * b + (a%c) * (b/c)
	70 LET a = a % c
	80 LET b = b % c
	90 IF (a == 0 || b == 0) THEN GOTO 1000

	100 IF (c >= base) THEN GOTO 200
	110 LET res = res + (a*b/c)
	120 GOTO 1000

	200 DIM norm AS Uint64
	210 LET norm = maxdiv/c
	220 LET c = c * norm
	230 LET a = a * norm

	300 DIM ah, al, bh, bl, ch, cl AS Uint64
	310 LET ah = a / base
	320 LET al = a % base
	330 LET bh = b / base
	340 LET bl = b % base
	350 LET ch = c / base
	360 LET cl = c % base

	400 DIM p0, p1, p2 AS Uint64
	410 LET p0 = al*bl
	420 LET p1 = p0 / base + al*bh
	430 LET p0 = p0 % base
	440 LET p2 = p1 / base + ah*bh
	450 LET p1 = (p1 % base) + ah*bl
	460 LET p2 = p2 + p1 / base
	470 LET p1 = p1 % base

	500 DIM q0, q1, rhat AS Uint64
	510 LET p2 = p2 % c
	520 LET q1 = p2 / ch
	530 LET rhat = p2 % ch

	600 IF (q1 < base && (rhat >= base || q1*cl <= rhat*base+p1)) THEN GOTO 700
	610 LET q1 = q1 - 1
	620 LET rhat = rhat + ch
	630 GOTO 600

	700 LET p1 = ((p2 % base) * base + p1) - q1 * cl
	710 LET p2 = (p2 / base * base + p1 / base) - q1 * ch
	720 LET p1 = (p1 % base) + (p2 % base) * base
	730 LET q0 = p1 / ch
	740 LET rhat = p1 % ch

	800 IF (q0 < base && (rhat >= base || q0*cl <= rhat*base+p0)) THEN GOTO 900
	810 LET q0 = q0 - 1
	820 LET rhat = rhat + ch
	830 GOTO 800

	900 LET res = res + q0 + q1 * base

	1000 RETURN res
End Function
    
// babylonian method (https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method)
Function sqrt(y Uint64) Uint64
    10 IF y > 3 THEN GOTO 20 ELSE GOTO 90
    20 DIM x,z as Uint64
    30 LET z = y 
    40 LET x = y / 2 + 1
    50 IF x < z THEN GOTO 60 ELSE GOTO 130
    60 LET z = x
    70 LET x = (y / x + x) / 2
    80 GOTO 50
    90 IF y != 0 THEN GOTO 110 ELSE GOTO 120
   110 RETURN 1
   120 RETURN 0
   130 RETURN z
End Function

Function UpdateCode(code String) Uint64 
    10  IF LOAD("owner") == SIGNER() THEN GOTO 30 
    20  RETURN 1
    30  UPDATE_SC_CODE(code)
    40  RETURN 0
End Function

SC Arguments: [Name:SC_ACTION Type:uint64 Value:'1' Name:SC_CODE Type:string Value:' // .-. // (o o) // | O \ boo! // | \ // '~~~~' // ? // /\ ___ // (oo) |RIP| // /||\ |___| ////////////////////////////////////// // Ghost Exchange v1.1 // Use at your own risk // For more info visit: ghost.trading ////////////////////////////////////// Function Initialize() Uint64 10 STORE("owner", SIGNER()) 20 STORE("feeTo", SIGNER()) 30 STORE("nameHdr", "Ghost Exchange") 40 STORE("descrHdr", "Phantom-powered finance") 50 RETURN 0 End Function // Provided liquidity will be tracked using BOO tokens. // BOO TOKENS ARE NOT ASSETS. Each account's BOO balance per token pair is stored // inside the Smart Contract as a variable with the following schema: // <provider_address>:BOO:<asset_address> // The total liquidity provided by all LPs of a pair at a given moment is denominated supply. // supply is tracked inside the Smart Contract as a variable with the following schema: // <asset_address>:BOO // Deposit assets and DERO at current ratio to get BOO tokens. // {asset_address} The deposited asset's SCID // {min_liquidity} Minimum number of BOO sender will get if total BOO supply is greater than 0. // {min_liquidity} does nothing when total BOO supply is 0. Function AddLiquidity(asset_address String, min_liquidity Uint64) Uint64 01 DIM total_liquidity, dero_reserve, asset_reserve, asset_amount, liquidity_minted, dero_deposited, asset_deposited, SYS_MAX_VALUE as Uint64 02 LET SYS_MAX_VALUE = 18446744073709551 // Uint64.Max/1000 to protect from infinite supply tokens 03 LET dero_deposited = DEROVALUE() 04 LET asset_deposited = ASSETVALUE(HEXDECODE(asset_address)) 10 IF (asset_deposited > 0 & dero_deposited > 0 ) THEN GOTO 30 20 GOTO 666 30 LET total_liquidity = get_supply_per_asset(asset_address) // Pair already exists 40 IF total_liquidity > 0 THEN GOTO 41 ELSE GOTO 60 41 IF min_liquidity > 0 THEN GOTO 43 42 GOTO 666 43 LET dero_reserve = get_dero_reserve_per_asset(asset_address) 44 LET asset_reserve = get_asset_reserve(asset_address) 45 IF will_addition_overflow(asset_reserve, asset_deposited) == 1 THEN GOTO 666 46 mintFee(dero_reserve, asset_reserve, asset_address) 47 LET total_liquidity = get_supply_per_asset(asset_address) // Must be defined again since totalSupply can update in mintFee 48 LET asset_amount = mult_div(dero_deposited, asset_reserve , dero_reserve + 1) 49 LET liquidity_minted = mult_div(dero_deposited, total_liquidity, dero_reserve) 50 IF asset_deposited >= asset_amount & liquidity_minted >= min_liquidity & (asset_reserve + asset_deposited <= SYS_MAX_VALUE) THEN GOTO 52 51 GOTO 666 52 increase_provider_liquidity_by(SIGNER(), liquidity_minted, asset_address) 53 set_supply_per_asset(total_liquidity + liquidity_minted, asset_address) 54 IF asset_deposited == asset_amount THEN GOTO 56 // Return any reminding assets 55 SEND_ASSET_TO_ADDRESS(SIGNER(), asset_deposited - asset_amount, HEXDECODE(asset_address)) // Increase the dero reserve record for this asset 56 set_dero_reserve_per_asset(dero_reserve + dero_deposited, asset_address) // Increase the asset reserve record 57 set_asset_reserve(asset_reserve + asset_amount, asset_address) 58 STORE(asset_address+":rootKLast", sqrt(dero_reserve + dero_deposited) * sqrt(asset_reserve + asset_amount)) // Return gracefully 59 GOTO 70 // else // Creating pair 60 IF dero_deposited >= 1000 & asset_deposited <= SYS_MAX_VALUE THEN GOTO 62 61 GOTO 666 // Initialize the asset reserve record for this asset 62 set_asset_reserve(asset_deposited, asset_address) 63 DIM initial_liquidity as Uint64 64 LET initial_liquidity = dero_deposited 65 set_supply_per_asset(initial_liquidity, asset_address) // Initialize the dero reserve record for this asset 66 set_dero_reserve_per_asset(dero_deposited, asset_address) 67 STORE(asset_address+":rootKLast", sqrt(asset_deposited) * sqrt(dero_deposited)) 68 increase_provider_liquidity_by(SIGNER(), initial_liquidity, asset_address) 70 RETURN 0 666 RETURN 1 End Function // Burn BOO tokens to withdraw Dero & assets at current ratio. // {amount} Amount of BOO burned. // {min_dero} Minimum DERO withdrawn. // {min_assets} Minimum assets withdrawn. // {asset_address} The deposited asset's SCID Function RemoveLiquidity(amount Uint64, min_dero Uint64, min_assets Uint64, asset_address String) Uint64 01 DIM total_liquidity, dero_reserve, asset_reserve, dero_amount, asset_amount as Uint64 10 IF amount > 0 & (min_dero > 0 & min_assets > 0) & ( get_provider_liquidity(SIGNER(), asset_address) >= amount ) THEN GOTO 30 20 GOTO 666 30 LET total_liquidity = get_supply_per_asset(asset_address) 40 IF total_liquidity > 0 THEN GOTO 60 50 GOTO 666 60 LET asset_reserve = get_asset_reserve(asset_address) 70 LET dero_reserve = get_dero_reserve_per_asset(asset_address) 80 mintFee(dero_reserve, asset_reserve, asset_address) 90 LET total_liquidity = get_supply_per_asset(asset_address) // Must be defined again since totalSupply can update in mintFee 100 LET dero_amount = mult_div(amount, dero_reserve, total_liquidity) 110 LET asset_amount = mult_div(amount, asset_reserve, total_liquidity) 120 IF dero_amount >= min_dero & asset_amount >= min_assets THEN GOTO 140 130 GOTO 666 140 decrease_provider_liquidity_by(SIGNER(), amount, asset_address) 150 set_supply_per_asset(total_liquidity - amount, asset_address) 160 set_dero_reserve_per_asset(dero_reserve - dero_amount, asset_address) 170 set_asset_reserve(asset_reserve - asset_amount, asset_address) 180 STORE(asset_address+":rootKLast", sqrt(dero_reserve - dero_amount) * sqrt(asset_reserve - asset_amount) ) 190 SEND_DERO_TO_ADDRESS(SIGNER(), dero_amount) 200 SEND_ASSET_TO_ADDRESS(SIGNER(),asset_amount, HEXDECODE(asset_address)) 210 RETURN 0 666 RETURN 1 End Function // Pricing function for converting between DERO & Assets. // {input_amount} Amount of DERO or Assets being sold. // {input_reserve} Amount of DERO or Assets (input type) in exchange reserves. // {output_reserve} Amount of DERO or Assets (output type) in exchange reserves. Function getInputPrice(input_amount Uint64, input_reserve Uint64, output_reserve Uint64) Uint64 01 DIM SYS_MAX_VALUE as Uint64 02 LET SYS_MAX_VALUE = 18446744073709551 10 IF input_reserve > 0 & output_reserve > 0 & input_amount <= SYS_MAX_VALUE THEN GOTO 30 20 PANIC 30 DIM input_amount_with_fee as Uint64 40 LET input_amount_with_fee = input_amount * 997 50 IF will_addition_overflow(input_reserve * 1000, input_amount * 1000) == 0 THEN GOTO 70 60 PANIC // Infinite supply token attack 70 RETURN mult_div(input_amount_with_fee, output_reserve, (input_reserve * 1000) + input_amount_with_fee) End Function // Pricing function for converting between DERO & Assets. // {output_amount} Amount of DERO or Assets being bought. // {input_reserve} Amount of DERO or Assets (input type) in exchange reserves. // {output_reserve} Amount of DERO or Assets (output type) in exchange reserves. Function getOutputPrice(output_amount Uint64, input_reserve Uint64, output_reserve Uint64) Uint64 10 IF input_reserve > 0 && output_reserve > 0 && output_reserve > output_amount THEN GOTO 30 20 PANIC 30 RETURN mult_div(input_reserve * 1000, output_amount, (output_reserve - output_amount) * 997 + 1) End Function Function deroToAssetInput(dero_sold Uint64, min_assets Uint64, asset_address String) Uint64 10 IF (dero_sold > 0 & min_assets > 0) THEN GOTO 30 20 PANIC 30 DIM assets_bought, asset_reserve, dero_reserve as Uint64 40 LET asset_reserve = get_asset_reserve(asset_address) 50 LET dero_reserve = get_dero_reserve_per_asset(asset_address) 60 LET assets_bought = getInputPrice(dero_sold, dero_reserve, asset_reserve) 70 IF assets_bought >= min_assets THEN GOTO 90 80 PANIC 90 SEND_ASSET_TO_ADDRESS(SIGNER(), assets_bought, HEXDECODE(asset_address)) 100 set_asset_reserve(asset_reserve - assets_bought, asset_address) 110 set_dero_reserve_per_asset(dero_reserve + dero_sold, asset_address) 120 RETURN 0 End Function // Convert DERO to Assets. // User specifies exact input (DEROVALUE()). // User cannot specify minimum output. // {asset_address} Address of the asset to trade. Function DeroToAssetSwapInput(asset_address String) Uint64 10 RETURN deroToAssetInput(DEROVALUE(), 1, asset_address) End Function // Convert DERO to Assets. // User specifies exact input (DEROVALUE()) & minimum output. // {min_assets} Minimum Assets bought. // {asset_address} Address of the asset to trade. Function DeroToAssetSwapInputMin(min_assets Uint64, asset_address String) Uint64 10 RETURN deroToAssetInput(DEROVALUE(), min_assets, asset_address) End Function Function deroToAssetOutput(assets_bought Uint64, max_dero Uint64, asset_address String) Uint64 10 IF (assets_bought > 0 & max_dero > 0) THEN GOTO 30 20 PANIC 30 DIM asset_reserve, dero_reserve, dero_sold, dero_refund as Uint64 40 LET asset_reserve = get_asset_reserve(asset_address) 41 LET dero_reserve = get_dero_reserve_per_asset(asset_address) 50 LET dero_sold = getOutputPrice(assets_bought, dero_reserve, asset_reserve) 60 IF dero_sold > max_dero THEN GOTO 61 ELSE GOTO 70 61 PANIC 70 LET dero_refund = max_dero - dero_sold 80 IF dero_refund == 0 THEN GOTO 100 90 SEND_DERO_TO_ADDRESS(SIGNER(), dero_refund) 100 SEND_ASSET_TO_ADDRESS(SIGNER(), assets_bought, HEXDECODE(asset_address)) 110 set_asset_reserve(asset_reserve - assets_bought, asset_address) 120 set_dero_reserve_per_asset(dero_reserve + dero_sold, asset_address) 130 RETURN 0 End Function // Convert DERO to Assets. // User specifies maximum input (DEROVALUE()) & exact output. // {assets_bought} Amount of Assets bought. // {asset_address} Address of the asset to trade. Function DeroToAssetSwapOutput(assets_bought Uint64, asset_address String) Uint64 10 RETURN deroToAssetOutput(assets_bought, DEROVALUE(), asset_address) End Function Function assetToDeroInput(assets_sold Uint64, min_dero Uint64, asset_address String) Uint64 10 IF (assets_sold > 0 & min_dero > 0) THEN GOTO 30 20 PANIC 30 DIM asset_reserve, dero_bought as Uint64 40 LET asset_reserve = get_asset_reserve(asset_address) 50 LET dero_bought = getInputPrice(assets_sold, asset_reserve, get_dero_reserve_per_asset(asset_address)) 60 IF dero_bought >= min_dero THEN GOTO 80 70 PANIC 80 SEND_DERO_TO_ADDRESS(SIGNER(),dero_bought) 90 set_dero_reserve_per_asset(get_dero_reserve_per_asset(asset_address) - dero_bought, asset_address) 100 set_asset_reserve(asset_reserve + assets_sold, asset_address) 110 RETURN 0 End Function // Convert Assets to DERO. // User specifies exact input (ASSETVALUE(asset_address)) & minimum output. // {min_dero} Minimum DERO purchased. // {asset_address} Address of the asset to trade. Function AssetToDeroSwapInput(min_dero Uint64, asset_address String) Uint64 10 RETURN assetToDeroInput(ASSETVALUE(HEXDECODE(asset_address)), min_dero, asset_address) End Function Function assetToDeroOutput(dero_bought Uint64, max_assets Uint64 , asset_address String) Uint64 10 IF dero_bought > 0 THEN GOTO 30 20 PANIC 30 DIM asset_reserve, assets_sold, asset_refund as Uint64 40 LET asset_reserve = get_asset_reserve(asset_address) 50 LET assets_sold = getOutputPrice(dero_bought, asset_reserve, get_dero_reserve_per_asset(asset_address)) // assets_sold is always > zero 60 IF max_assets >= assets_sold THEN GOTO 80 70 PANIC 80 SEND_DERO_TO_ADDRESS(SIGNER(), dero_bought) 90 LET asset_refund = max_assets - assets_sold 100 IF asset_refund == 0 THEN GOTO 120 110 SEND_ASSET_TO_ADDRESS(SIGNER(), asset_refund, HEXDECODE(asset_address)) 120 set_dero_reserve_per_asset(get_dero_reserve_per_asset(asset_address) - dero_bought, asset_address) 130 set_asset_reserve(asset_reserve + assets_sold, asset_address) 140 RETURN 0 End Function // Convert Assets to DERO. // User specifies maximum input (ASSETVALUE(asset_address)) & exact output. // {dero_bought} Amount of DERO purchased. // {asset_address} Address of the asset to trade. Function AssetToDeroSwapOutput(dero_bought Uint64, asset_address String) Uint64 10 RETURN assetToDeroOutput(dero_bought, ASSETVALUE(HEXDECODE(asset_address)), asset_address) End Function // Public price function for DERO to Asset trades with an exact input. // {dero_sold} Amount of DERO sold. // {asset_address} Address of the asset to trade. // @returns Amount of Assets that can be bought with input DERO. Function GetDeroToAssetInputPrice(dero_sold Uint64, asset_address String) Uint64 10 IF dero_sold > 0 THEN GOTO 30 20 RETURN 0 30 RETURN getInputPrice(dero_sold, get_dero_reserve_per_asset(asset_address), get_asset_reserve(asset_address)) End Function // Public price function for DERO to Asset trades with an exact output. // {assets_bought} Amount of Assets bought. // {asset_address} Address of the asset to trade. // @returns Amount of DERO needed to buy output Assets. Function GetDeroToAssetOutputPrice(assets_bought Uint64, asset_address String) Uint64 10 IF assets_bought > 0 THEN GOTO 30 20 RETURN 0 30 RETURN getOutputPrice(assets_bought, get_dero_reserve_per_asset(asset_address), get_asset_reserve(asset_address)) End Function // Public price function for Asset to DERO trades with an exact input. // {assets_sold} Amount of Assets sold. // {asset_address} Address of the asset to trade. // @returns Amount of DERO that can be bought with input Assets. Function GetAssetToDeroInputPrice(assets_sold Uint64, asset_address String) Uint64 10 IF assets_sold > 0 THEN GOTO 30 20 RETURN 0 30 RETURN getInputPrice(assets_sold, get_asset_reserve(asset_address), get_dero_reserve_per_asset(asset_address)) End Function // Public price function for Asset to DERO trades with an exact output. // {dero_bought} Amount of output DERO. // {asset_address} Address of the asset to trade. // @returns Amount of Assets needed to buy output DERO. Function GetAssetToDeroOutputPrice(dero_bought Uint64, asset_address String) Uint64 10 IF dero_bought > 0 THEN GOTO 30 20 RETURN 0 30 RETURN getOutputPrice(dero_bought, get_asset_reserve(asset_address), get_dero_reserve_per_asset(asset_address)) End Function Function mintFee(reserve0 Uint64, reserve1 Uint64, asset_address String) 10 DIM feeTo as String 11 DIM rootKLast as Uint64 20 LET feeTo = LOAD("feeTo") // Get the last root k for the asset 30 LET rootKLast = LOAD(asset_address+":rootKLast") 40 IF rootKLast != 0 THEN GOTO 50 41 RETURN 50 DIM rootK as Uint64 60 LET rootK = sqrt(reserve0) * sqrt(reserve1) 70 IF rootK > rootKLast THEN GOTO 80 71 RETURN 80 DIM supply, liquidity_minted as Uint64 90 LET supply = get_supply_per_asset(asset_address) 100 LET liquidity_minted = mult_div(supply, rootK - rootKLast, rootK * 5 + rootKLast) 110 IF liquidity_minted > 0 THEN GOTO 111 ELSE GOTO 120 111 increase_provider_liquidity_by(feeTo, liquidity_minted, asset_address) 112 set_supply_per_asset(supply + liquidity_minted, asset_address) 120 RETURN End Function // Helper functions // Encapsulated to better understand what's happening and absctract BOO storage schema // from main code. Function set_supply_per_asset(amount Uint64, asset_address String) 10 STORE(asset_address+":BOO", amount) 20 RETURN End Function Function get_supply_per_asset(asset_address String) Uint64 10 IF EXISTS(asset_address+":BOO") THEN GOTO 30 20 RETURN 0 30 RETURN LOAD(asset_address+":BOO") End Function Function set_dero_reserve_per_asset(amount Uint64, asset_address String) 10 STORE(asset_address+":DERO", amount) 20 RETURN End Function Function get_dero_reserve_per_asset(asset_address String) Uint64 10 RETURN LOAD(asset_address+":DERO") End Function Function set_asset_reserve(amount Uint64, asset_address String) 10 STORE(asset_address, amount) 20 RETURN End Function Function get_asset_reserve(asset_address String) Uint64 20 RETURN LOAD(asset_address) End Function Function increase_provider_liquidity_by(provider_address String, amount Uint64, asset_address String) 10 IF EXISTS(ADDRESS_STRING(provider_address)+":BOO:"+asset_address) THEN GOTO 40 20 STORE(ADDRESS_STRING(provider_address)+":BOO:"+asset_address, amount) 30 RETURN 40 STORE(ADDRESS_STRING(provider_address)+":BOO:"+asset_address, get_provider_liquidity(provider_address, asset_address) + amount) 50 RETURN End Function Function decrease_provider_liquidity_by(provider_address String, amount Uint64, asset_address String) 10 STORE(ADDRESS_STRING(provider_address)+":BOO:"+asset_address, get_provider_liquidity(provider_address, asset_address) - amount) 20 RETURN End Function Function get_provider_liquidity(provider_address String, asset_address String) Uint64 10 RETURN LOAD(ADDRESS_STRING(provider_address)+":BOO:"+asset_address) End Function Function will_addition_overflow(a Uint64, b Uint64) Uint64 10 IF (a > 18446744073709551615 - b) THEN GOTO 100 20 RETURN 0 // No overflow 100 RETURN 1 // Overflow End Function // From Pieswap // lossless (a * b ) / c Function mult_div(a Uint64, b Uint64, c Uint64) Uint64 10 DIM base, maxdiv AS Uint64 20 LET base = 4294967296 // (1<<32) 30 LET maxdiv = (base-1)*base + (base-1) 50 DIM res AS Uint64 60 LET res = (a/c) * b + (a%c) * (b/c) 70 LET a = a % c 80 LET b = b % c 90 IF (a == 0 || b == 0) THEN GOTO 1000 100 IF (c >= base) THEN GOTO 200 110 LET res = res + (a*b/c) 120 GOTO 1000 200 DIM norm AS Uint64 210 LET norm = maxdiv/c 220 LET c = c * norm 230 LET a = a * norm 300 DIM ah, al, bh, bl, ch, cl AS Uint64 310 LET ah = a / base 320 LET al = a % base 330 LET bh = b / base 340 LET bl = b % base 350 LET ch = c / base 360 LET cl = c % base 400 DIM p0, p1, p2 AS Uint64 410 LET p0 = al*bl 420 LET p1 = p0 / base + al*bh 430 LET p0 = p0 % base 440 LET p2 = p1 / base + ah*bh 450 LET p1 = (p1 % base) + ah*bl 460 LET p2 = p2 + p1 / base 470 LET p1 = p1 % base 500 DIM q0, q1, rhat AS Uint64 510 LET p2 = p2 % c 520 LET q1 = p2 / ch 530 LET rhat = p2 % ch 600 IF (q1 < base && (rhat >= base || q1*cl <= rhat*base+p1)) THEN GOTO 700 610 LET q1 = q1 - 1 620 LET rhat = rhat + ch 630 GOTO 600 700 LET p1 = ((p2 % base) * base + p1) - q1 * cl 710 LET p2 = (p2 / base * base + p1 / base) - q1 * ch 720 LET p1 = (p1 % base) + (p2 % base) * base 730 LET q0 = p1 / ch 740 LET rhat = p1 % ch 800 IF (q0 < base && (rhat >= base || q0*cl <= rhat*base+p0)) THEN GOTO 900 810 LET q0 = q0 - 1 820 LET rhat = rhat + ch 830 GOTO 800 900 LET res = res + q0 + q1 * base 1000 RETURN res End Function // babylonian method (https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method) Function sqrt(y Uint64) Uint64 10 IF y > 3 THEN GOTO 20 ELSE GOTO 90 20 DIM x,z as Uint64 30 LET z = y 40 LET x = y / 2 + 1 50 IF x < z THEN GOTO 60 ELSE GOTO 130 60 LET z = x 70 LET x = (y / x + x) / 2 80 GOTO 50 90 IF y != 0 THEN GOTO 110 ELSE GOTO 120 110 RETURN 1 120 RETURN 0 130 RETURN z End Function Function UpdateCode(code String) Uint64 10 IF LOAD("owner") == SIGNER() THEN GOTO 30 20 RETURN 1 30 UPDATE_SC_CODE(code) 40 RETURN 0 End Function ']


Prove to someone that you have sent them DERO in this transaction

proof can be obtained using wallet command in dero-wallet-cli or from the statement
Note: proof is sent to the server, as the calculations are done on the server side


TX hex bytes
0100000500b3d2d0013c261616362cf7fc2e676774ec3891492b1ef1513a0c868c1ebda7fbeeffac70010000000000000000000000000000000000000000000000000000000000000000000032308de5f693664407fffb17bf0c62bd43daaf98f030b8c4440289039c7664676c0d9377a72eb75015611ed2d5a2d0c4819b0abf4b035d4b175fd5247b86b65cf726aa928a12de74c3af29d581ac107bfe95b5258369d52b203b2e6e645707b09badddb923151f0d9f6b4b081ca276516fb31eae864d0f1047b010777d95c325476f788e2cbcfbd1a7f455f0ff1209a11d0104e9e9012f2667dd930ea303ccc1f8af0e5f0eef1f26d3b8f3645138db3d7d16074ace9501634c82346972cdd2090433e0b17b4a670bb1bdf8efced7cc2a9c2b85aefa689afc48b2338437b1b301043c285feaa7e168720ce532d538177c1de21e8cad5cefead4be5a1fdcc7a91801a613f92cae3598a7141b2fc21fe36502b312d59a5507e5dac3091e6490067feaa19b01a26853435f434f444553794d880a2f2f202020202020202020202e2d2e0a2f2f202020202020202020286f206f29200a2f2f2020202020202020207c204f205c2020626f6f210a2f2f2020202020202020207c202020205c0a2f2f202020202020202020277e7e7e7e270a2f2f202020203f0a2f2f2020202f5c202020202020202020202020202020205f5f5f0a2f2f2020286f6f2920202020202020202020202020207c5249507c0a2f2f20202f7c7c5c20202020202020202020202020207c5f5f5f7c0a2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f0a2f2f2047686f73742045786368616e67652076312e310a2f2f2055736520617420796f7572206f776e207269736b0a2f2f20466f72206d6f726520696e666f2076697369743a2067686f73742e74726164696e670a2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f0a0a46756e6374696f6e20496e697469616c697a6528292055696e7436340a2020202031302053544f524528226f776e6572222c205349474e45522829290a2020202032302053544f52452822666565546f222c205349474e45522829290a2020202033302053544f524528226e616d65486472222c202247686f73742045786368616e676522290a2020202034302053544f524528226465736372486472222c20225068616e746f6d2d706f77657265642066696e616e63652229200a202020203530202052455455524e20300a456e642046756e6374696f6e200a0a2f2f2050726f7669646564206c69717569646974792077696c6c20626520747261636b6564207573696e6720424f4f20746f6b656e732e200a2f2f20424f4f20544f4b454e5320415245204e4f54204153534554532e2045616368206163636f756e74277320424f4f2062616c616e63652070657220746f6b656e20706169722069732073746f726564200a2f2f20696e736964652074686520536d61727420436f6e74726163742061732061207661726961626c6520776974682074686520666f6c6c6f77696e6720736368656d613a0a2f2f203c70726f76696465725f616464726573733e3a424f4f3a3c61737365745f616464726573733e0a2f2f2054686520746f74616c206c69717569646974792070726f766964656420627920616c6c204c5073206f6620612070616972206174206120676976656e206d6f6d656e742069732064656e6f6d696e6174656420737570706c792e0a2f2f20737570706c7920697320747261636b656420696e736964652074686520536d61727420436f6e74726163742061732061207661726961626c6520776974682074686520666f6c6c6f77696e6720736368656d613a0a2f2f203c61737365745f616464726573733e3a424f4f0a2f2f204465706f7369742061737365747320616e64204445524f2061742063757272656e7420726174696f20746f2067657420424f4f20746f6b656e732e200a2f2f207b61737365745f616464726573737d20546865206465706f7369746564206173736574277320534349440a2f2f207b6d696e5f6c69717569646974797d204d696e696d756d206e756d626572206f6620424f4f2073656e6465722077696c6c2067657420696620746f74616c20424f4f20737570706c792069732067726561746572207468616e20302e0a2f2f207b6d696e5f6c69717569646974797d20646f6573206e6f7468696e67207768656e20746f74616c20424f4f20737570706c7920697320302e0a46756e6374696f6e204164644c69717569646974792861737365745f6164647265737320537472696e672c206d696e5f6c69717569646974792055696e743634292055696e7436340a2020202030312044494d20746f74616c5f6c69717569646974792c206465726f5f726573657276652c2061737365745f726573657276652c2061737365745f616d6f756e742c206c69717569646974795f6d696e7465642c206465726f5f6465706f73697465642c2061737365745f6465706f73697465642c205359535f4d41585f56414c55452061732055696e7436340a202020203032204c4554205359535f4d41585f56414c5545203d203138343436373434303733373039353531202f2f2055696e7436342e4d61782f3130303020746f2070726f746563742066726f6d20696e66696e69746520737570706c7920746f6b656e730a202020203033204c4554206465726f5f6465706f7369746564203d204445524f56414c554528290a202020203034204c45542061737365745f6465706f7369746564203d20415353455456414c5545284845584445434f44452861737365745f6164647265737329290a202020203130204946202861737365745f6465706f7369746564203e20302026206465726f5f6465706f7369746564203e20302029205448454e20474f544f2033300a20202020323020474f544f203636360a202020203330204c455420746f74616c5f6c6971756964697479203d20206765745f737570706c795f7065725f61737365742861737365745f6164647265737329200a202020202f2f205061697220616c7265616479206578697374730a20202020343020494620746f74616c5f6c6971756964697479203e2030205448454e20474f544f20343120454c534520474f544f2036300a20202020202020203431204946206d696e5f6c6971756964697479203e2030205448454e20474f544f2034330a2020202020202020343220474f544f2036363620200a20202020202020203433204c4554206465726f5f72657365727665203d206765745f6465726f5f726573657276655f7065725f61737365742861737365745f6164647265737329200a20202020202020203434204c45542061737365745f72657365727665203d206765745f61737365745f726573657276652861737365745f61646472657373290a202020202020202034352049462077696c6c5f6164646974696f6e5f6f766572666c6f772861737365745f726573657276652c2061737365745f6465706f736974656429203d3d2031205448454e20474f544f203636360a20202020202020203436206d696e74466565286465726f5f726573657276652c2061737365745f726573657276652c2061737365745f61646472657373290a20202020202020203437204c455420746f74616c5f6c6971756964697479203d206765745f737570706c795f7065725f61737365742861737365745f6164647265737329202f2f204d75737420626520646566696e656420616761696e2073696e636520746f74616c537570706c792063616e2075706461746520696e206d696e744665650a20202020202020203438204c45542061737365745f616d6f756e74203d2020206d756c745f646976286465726f5f6465706f73697465642c2061737365745f72657365727665202c206465726f5f72657365727665202b2031290a20202020202020203439204c4554206c69717569646974795f6d696e746564203d206d756c745f646976286465726f5f6465706f73697465642c20746f74616c5f6c69717569646974792c206465726f5f72657365727665290a202020202020202035302049462061737365745f6465706f7369746564203e3d2061737365745f616d6f756e742026206c69717569646974795f6d696e746564203e3d206d696e5f6c69717569646974792026202861737365745f72657365727665202b2061737365745f6465706f7369746564203c3d205359535f4d41585f56414c554529205448454e20474f544f2035320a2020202020202020353120474f544f203636360a2020202020202020353220696e6372656173655f70726f76696465725f6c69717569646974795f6279285349474e455228292c206c69717569646974795f6d696e7465642c2061737365745f6164647265737329200a20202020202020203533207365745f737570706c795f7065725f617373657428746f74616c5f6c6971756964697479202b206c69717569646974795f6d696e7465642c2061737365745f61646472657373290a202020202020202035342049462061737365745f6465706f7369746564203d3d2061737365745f616d6f756e74205448454e20474f544f2035360a20202020202020202f2f2052657475726e20616e792072656d696e64696e67206173736574730a202020202020202035352053454e445f41535345545f544f5f41444452455353285349474e455228292c2061737365745f6465706f7369746564202d2061737365745f616d6f756e742c204845584445434f44452861737365745f6164647265737329290a20202020202020202f2f20496e63726561736520746865206465726f2072657365727665207265636f726420666f7220746869732061737365740a20202020202020203536207365745f6465726f5f726573657276655f7065725f6173736574286465726f5f72657365727665202b206465726f5f6465706f73697465642c2061737365745f61646472657373290a20202020202020202f2f20496e637265617365207468652061737365742072657365727665207265636f72640a20202020202020203537207365745f61737365745f726573657276652861737365745f72657365727665202b2061737365745f616d6f756e742c2061737365745f61646472657373290a202020202020202035382053544f52452861737365745f616464726573732b223a726f6f744b4c617374222c202073717274286465726f5f72657365727665202b206465726f5f6465706f736974656429202a20737172742861737365745f72657365727665202b2061737365745f616d6f756e7429290a20202020202020202f2f2052657475726e20677261636566756c6c790a2020202020202020353920474f544f2037300a202020202f2f20656c73650a202020202f2f204372656174696e67207061697220200a202020203630204946206465726f5f6465706f7369746564203e3d203130303020262061737365745f6465706f7369746564203c3d205359535f4d41585f56414c5545205448454e20474f544f2036320a2020202020202020363120474f544f203636360a20202020202020202f2f20496e697469616c697a65207468652061737365742072657365727665207265636f726420666f7220746869732061737365740a20202020202020203632207365745f61737365745f726573657276652861737365745f6465706f73697465642c2061737365745f61646472657373290a202020202020202036332044494d20696e697469616c5f6c69717569646974792061732055696e7436340a20202020202020203634204c455420696e697469616c5f6c6971756964697479203d206465726f5f6465706f73697465640a20202020202020203635207365745f737570706c795f7065725f617373657428696e697469616c5f6c69717569646974792c2061737365745f61646472657373290a20202020202020202f2f20496e697469616c697a6520746865206465726f2072657365727665207265636f726420666f7220746869732061737365740a20202020202020203636207365745f6465726f5f726573657276655f7065725f6173736574286465726f5f6465706f73697465642c2061737365745f61646472657373290a202020202020202036372053544f52452861737365745f616464726573732b223a726f6f744b4c617374222c20737172742861737365745f6465706f736974656429202a2073717274286465726f5f6465706f736974656429290a2020202020202020363820696e6372656173655f70726f76696465725f6c69717569646974795f6279285349474e455228292c20696e697469616c5f6c69717569646974792c2061737365745f61646472657373290a2020202037302052455455524e20300a0a202020203636362052455455524e20310a456e642046756e6374696f6e0a0a2f2f204275726e20424f4f20746f6b656e7320746f207769746864726177204465726f2026206173736574732061742063757272656e7420726174696f2e0a2f2f207b616d6f756e747d20416d6f756e74206f6620424f4f206275726e65642e0a2f2f207b6d696e5f6465726f7d204d696e696d756d204445524f2077697468647261776e2e0a2f2f207b6d696e5f6173736574737d204d696e696d756d206173736574732077697468647261776e2e0a2f2f207b61737365745f616464726573737d20546865206465706f7369746564206173736574277320534349440a46756e6374696f6e2052656d6f76654c697175696469747928616d6f756e742055696e7436342c206d696e5f6465726f2055696e7436342c206d696e5f6173736574732055696e7436342c2061737365745f6164647265737320537472696e67292055696e7436340a202020203031202044494d20746f74616c5f6c69717569646974792c206465726f5f726573657276652c2061737365745f726573657276652c206465726f5f616d6f756e742c2061737365745f616d6f756e742061732055696e7436340a2020202031302020494620616d6f756e74203e203020202620286d696e5f6465726f203e20302026206d696e5f617373657473203e20302920262028206765745f70726f76696465725f6c6971756964697479285349474e455228292c2061737365745f6164647265737329203e3d20616d6f756e742029205448454e20474f544f2033300a2020202032302020474f544f203636360a20202020333020204c455420746f74616c5f6c6971756964697479203d206765745f737570706c795f7065725f61737365742861737365745f61646472657373290a2020202034302020494620746f74616c5f6c6971756964697479203e2030205448454e20474f544f2036300a2020202035302020474f544f203636360a20202020363020204c45542061737365745f72657365727665203d206765745f61737365745f726573657276652861737365745f61646472657373290a20202020373020204c4554206465726f5f72657365727665203d206765745f6465726f5f726573657276655f7065725f61737365742861737365745f61646472657373290a20202020383020206d696e74466565286465726f5f726573657276652c2061737365745f726573657276652c2061737365745f61646472657373290a20202020393020204c455420746f74616c5f6c6971756964697479203d206765745f737570706c795f7065725f61737365742861737365745f6164647265737329202f2f204d75737420626520646566696e656420616761696e2073696e636520746f74616c537570706c792063616e2075706461746520696e206d696e744665650a20202031303020204c4554206465726f5f616d6f756e7420203d206d756c745f64697628616d6f756e742c206465726f5f726573657276652c20746f74616c5f6c6971756964697479290a20202031313020204c45542061737365745f616d6f756e74203d206d756c745f64697628616d6f756e742c2061737365745f726573657276652c20746f74616c5f6c6971756964697479290a20202031323020204946206465726f5f616d6f756e74203e3d206d696e5f6465726f20262061737365745f616d6f756e74203e3d206d696e5f617373657473205448454e20474f544f203134300a2020203133302020474f544f203636360a202020313430202064656372656173655f70726f76696465725f6c69717569646974795f6279285349474e455228292c20616d6f756e742c2061737365745f61646472657373290a20202031353020207365745f737570706c795f7065725f617373657428746f74616c5f6c6971756964697479202d20616d6f756e742c2061737365745f61646472657373290a20202031363020207365745f6465726f5f726573657276655f7065725f6173736574286465726f5f72657365727665202d206465726f5f616d6f756e742c2061737365745f61646472657373290a20202031373020207365745f61737365745f726573657276652861737365745f72657365727665202d2061737365745f616d6f756e742c2061737365745f61646472657373290a202020313830202053544f52452861737365745f616464726573732b223a726f6f744b4c617374222c2073717274286465726f5f72657365727665202d206465726f5f616d6f756e7429202a20737172742861737365745f72657365727665202d2061737365745f616d6f756e742920290a202020313930202053454e445f4445524f5f544f5f41444452455353285349474e455228292c206465726f5f616d6f756e74290a202020323030202053454e445f41535345545f544f5f41444452455353285349474e455228292c61737365745f616d6f756e742c204845584445434f44452861737365745f6164647265737329290a202020323130202052455455524e20300a0a202020363636202052455455524e20310a456e642046756e6374696f6e0a0a2f2f2050726963696e672066756e6374696f6e20666f7220636f6e76657274696e67206265747765656e204445524f2026204173736574732e0a2f2f207b696e7075745f616d6f756e747d20416d6f756e74206f66204445524f206f7220417373657473206265696e6720736f6c642e0a2f2f207b696e7075745f726573657276657d20416d6f756e74206f66204445524f206f72204173736574732028696e70757420747970652920696e2065786368616e67652072657365727665732e0a2f2f207b6f75747075745f726573657276657d20416d6f756e74206f66204445524f206f722041737365747320286f757470757420747970652920696e2065786368616e67652072657365727665732e0a46756e6374696f6e20676574496e707574507269636528696e7075745f616d6f756e742055696e7436342c20696e7075745f726573657276652055696e7436342c206f75747075745f726573657276652055696e743634292055696e7436340a2020202030312044494d205359535f4d41585f56414c55452061732055696e7436340a202020203032204c4554205359535f4d41585f56414c5545203d2031383434363734343037333730393535310a20202020313020494620696e7075745f72657365727665203e20302026206f75747075745f72657365727665203e2030202620696e7075745f616d6f756e74203c3d205359535f4d41585f56414c5545205448454e20474f544f2033300a2020202032302050414e49430a2020202033302044494d20696e7075745f616d6f756e745f776974685f6665652061732055696e7436340a202020203430204c455420696e7075745f616d6f756e745f776974685f666565203d20696e7075745f616d6f756e74202a203939370a2020202035302049462077696c6c5f6164646974696f6e5f6f766572666c6f7728696e7075745f72657365727665202a20313030302c20696e7075745f616d6f756e74202a203130303029203d3d2030205448454e20474f544f2037300a2020202036302050414e4943202f2f20496e66696e69746520737570706c7920746f6b656e2061747461636b0a2020202037302052455455524e206d756c745f64697628696e7075745f616d6f756e745f776974685f6665652c206f75747075745f726573657276652c2028696e7075745f72657365727665202a203130303029202b20696e7075745f616d6f756e745f776974685f666565290a456e642046756e6374696f6e0a0a2f2f2050726963696e672066756e6374696f6e20666f7220636f6e76657274696e67206265747765656e204445524f2026204173736574732e0a2f2f207b6f75747075745f616d6f756e747d20416d6f756e74206f66204445524f206f7220417373657473206265696e6720626f756768742e0a2f2f207b696e7075745f726573657276657d20416d6f756e74206f66204445524f206f72204173736574732028696e70757420747970652920696e2065786368616e67652072657365727665732e0a2f2f207b6f75747075745f726573657276657d20416d6f756e74206f66204445524f206f722041737365747320286f757470757420747970652920696e2065786368616e67652072657365727665732e0a46756e6374696f6e206765744f75747075745072696365286f75747075745f616d6f756e742055696e7436342c20696e7075745f726573657276652055696e7436342c206f75747075745f726573657276652055696e743634292055696e7436340a20202020313020494620696e7075745f72657365727665203e2030202626206f75747075745f72657365727665203e2030202626206f75747075745f72657365727665203e206f75747075745f616d6f756e74205448454e20474f544f2033300a2020202032302050414e49430a2020202033302052455455524e206d756c745f64697628696e7075745f72657365727665202a20313030302c206f75747075745f616d6f756e742c20286f75747075745f72657365727665202d206f75747075745f616d6f756e7429202a20393937202b2031290a456e642046756e6374696f6e0a0a46756e6374696f6e206465726f546f4173736574496e707574286465726f5f736f6c642055696e7436342c206d696e5f6173736574732055696e7436342c2061737365745f6164647265737320537472696e67292055696e7436340a2020202031302049462020286465726f5f736f6c64203e20302026206d696e5f617373657473203e203029205448454e20474f544f2033300a2020202032302050414e49430a2020202033302044494d206173736574735f626f756768742c2061737365745f726573657276652c206465726f5f726573657276652061732055696e7436340a202020203430204c45542061737365745f72657365727665203d206765745f61737365745f726573657276652861737365745f61646472657373290a202020203530204c4554206465726f5f72657365727665203d206765745f6465726f5f726573657276655f7065725f61737365742861737365745f61646472657373290a202020203630204c4554206173736574735f626f75676874203d20676574496e7075745072696365286465726f5f736f6c642c206465726f5f726573657276652c2061737365745f72657365727665290a202020203730204946206173736574735f626f75676874203e3d206d696e5f617373657473205448454e20474f544f2039300a2020202038302050414e49430a2020202039302053454e445f41535345545f544f5f41444452455353285349474e455228292c206173736574735f626f756768742c204845584445434f44452861737365745f6164647265737329290a202020313030207365745f61737365745f726573657276652861737365745f72657365727665202d206173736574735f626f756768742c2061737365745f61646472657373290a202020313130207365745f6465726f5f726573657276655f7065725f6173736574286465726f5f72657365727665202b206465726f5f736f6c642c2061737365745f61646472657373290a2020203132302052455455524e20300a456e642046756e6374696f6e0a0a2f2f20436f6e76657274204445524f20746f204173736574732e0a2f2f20557365722073706563696669657320657861637420696e70757420284445524f56414c55452829292e0a2f2f20557365722063616e6e6f742073706563696679206d696e696d756d206f75747075742e0a2f2f207b61737365745f616464726573737d2041646472657373206f662074686520617373657420746f2074726164652e0a46756e6374696f6e204465726f546f417373657453776170496e7075742861737365745f6164647265737320537472696e67292055696e7436340a2020202031302052455455524e206465726f546f4173736574496e707574284445524f56414c554528292c20312c2061737365745f61646472657373290a456e642046756e6374696f6e0a0a2f2f20436f6e76657274204445524f20746f204173736574732e0a2f2f20557365722073706563696669657320657861637420696e70757420284445524f56414c55452829292026206d696e696d756d206f75747075742e0a2f2f207b6d696e5f6173736574737d204d696e696d756d2041737365747320626f756768742e0a2f2f207b61737365745f616464726573737d2041646472657373206f662074686520617373657420746f2074726164652e0a46756e6374696f6e204465726f546f417373657453776170496e7075744d696e286d696e5f6173736574732055696e7436342c2061737365745f6164647265737320537472696e67292055696e7436340a2020202031302052455455524e206465726f546f4173736574496e707574284445524f56414c554528292c206d696e5f6173736574732c2061737365745f61646472657373290a456e642046756e6374696f6e0a0a46756e6374696f6e206465726f546f41737365744f7574707574286173736574735f626f756768742055696e7436342c206d61785f6465726f2055696e7436342c2061737365745f6164647265737320537472696e67292055696e7436340a20202020313020494620286173736574735f626f75676874203e20302026206d61785f6465726f203e203029205448454e20474f544f2033300a2020202032302050414e49430a2020202033302044494d2061737365745f726573657276652c206465726f5f726573657276652c206465726f5f736f6c642c206465726f5f726566756e642061732055696e7436340a202020203430204c45542061737365745f72657365727665203d206765745f61737365745f726573657276652861737365745f61646472657373290a202020203431204c4554206465726f5f72657365727665203d206765745f6465726f5f726573657276655f7065725f61737365742861737365745f61646472657373290a202020203530204c4554206465726f5f736f6c64203d206765744f75747075745072696365286173736574735f626f756768742c206465726f5f726573657276652c2061737365745f72657365727665290a202020203630204946206465726f5f736f6c64203e206d61785f6465726f205448454e20474f544f20363120454c534520474f544f2037300a2020202036312050414e49430a202020203730204c4554206465726f5f726566756e64203d206d61785f6465726f202d206465726f5f736f6c640a202020203830204946206465726f5f726566756e64203d3d2030205448454e20474f544f203130300a2020202039302053454e445f4445524f5f544f5f41444452455353285349474e455228292c206465726f5f726566756e64290a2020203130302053454e445f41535345545f544f5f41444452455353285349474e455228292c206173736574735f626f756768742c204845584445434f44452861737365745f6164647265737329290a202020313130207365745f61737365745f726573657276652861737365745f72657365727665202d206173736574735f626f756768742c2061737365745f61646472657373290a202020313230207365745f6465726f5f726573657276655f7065725f6173736574286465726f5f72657365727665202b206465726f5f736f6c642c2061737365745f61646472657373290a2020203133302052455455524e20300a456e642046756e6374696f6e0a0a2f2f20436f6e76657274204445524f20746f204173736574732e0a2f2f205573657220737065636966696573206d6178696d756d20696e70757420284445524f56414c55452829292026206578616374206f75747075742e0a2f2f207b6173736574735f626f756768747d20416d6f756e74206f662041737365747320626f756768742e0a2f2f207b61737365745f616464726573737d2041646472657373206f662074686520617373657420746f2074726164652e0a46756e6374696f6e204465726f546f4173736574537761704f7574707574286173736574735f626f756768742055696e7436342c2061737365745f6164647265737320537472696e67292055696e7436340a2020202031302052455455524e206465726f546f41737365744f7574707574286173736574735f626f756768742c204445524f56414c554528292c2061737365745f61646472657373290a456e642046756e6374696f6e0a0a46756e6374696f6e206173736574546f4465726f496e707574286173736574735f736f6c642055696e7436342c206d696e5f6465726f2055696e7436342c2061737365745f6164647265737320537472696e67292055696e7436340a20202020313020494620286173736574735f736f6c64203e20302026206d696e5f6465726f203e203029205448454e20474f544f2033300a2020202032302050414e49430a2020202033302044494d2061737365745f726573657276652c206465726f5f626f756768742061732055696e7436340a202020203430204c45542061737365745f72657365727665203d206765745f61737365745f726573657276652861737365745f61646472657373290a202020203530204c4554206465726f5f626f75676874203d20676574496e7075745072696365286173736574735f736f6c642c2061737365745f726573657276652c206765745f6465726f5f726573657276655f7065725f61737365742861737365745f6164647265737329290a202020203630204946206465726f5f626f75676874203e3d206d696e5f6465726f205448454e20474f544f2038300a2020202037302050414e49430a2020202038302053454e445f4445524f5f544f5f41444452455353285349474e455228292c6465726f5f626f75676874290a202020203930207365745f6465726f5f726573657276655f7065725f6173736574286765745f6465726f5f726573657276655f7065725f61737365742861737365745f6164647265737329202d206465726f5f626f756768742c2061737365745f61646472657373290a202020313030207365745f61737365745f726573657276652861737365745f72657365727665202b206173736574735f736f6c642c2061737365745f61646472657373290a2020203131302052455455524e20300a456e642046756e6374696f6e0a0a2f2f20436f6e766572742041737365747320746f204445524f2e0a2f2f20557365722073706563696669657320657861637420696e7075742028415353455456414c55452861737365745f6164647265737329292026206d696e696d756d206f75747075742e0a2f2f207b6d696e5f6465726f7d204d696e696d756d204445524f207075726368617365642e0a2f2f207b61737365745f616464726573737d2041646472657373206f662074686520617373657420746f2074726164652e0a46756e6374696f6e204173736574546f4465726f53776170496e707574286d696e5f6465726f2055696e7436342c2061737365745f6164647265737320537472696e67292055696e7436340a2020202031302052455455524e206173736574546f4465726f496e70757428415353455456414c5545284845584445434f44452861737365745f6164647265737329292c206d696e5f6465726f2c2061737365745f61646472657373290a456e642046756e6374696f6e0a0a0a46756e6374696f6e206173736574546f4465726f4f7574707574286465726f5f626f756768742055696e7436342c206d61785f6173736574732055696e743634202c2061737365745f6164647265737320537472696e67292055696e7436340a20202020313020494620206465726f5f626f75676874203e2030205448454e20474f544f2033300a2020202032302050414e49430a2020202033302044494d2061737365745f726573657276652c206173736574735f736f6c642c2061737365745f726566756e642061732055696e7436340a202020203430204c45542061737365745f72657365727665203d206765745f61737365745f726573657276652861737365745f61646472657373290a202020203530204c4554206173736574735f736f6c64203d206765744f75747075745072696365286465726f5f626f756768742c2061737365745f726573657276652c206765745f6465726f5f726573657276655f7065725f61737365742861737365745f6164647265737329290a202020202f2f206173736574735f736f6c6420697320616c77617973203e207a65726f0a202020203630204946206d61785f617373657473203e3d206173736574735f736f6c64205448454e20474f544f2038300a2020202037302050414e49430a2020202038302053454e445f4445524f5f544f5f41444452455353285349474e455228292c206465726f5f626f75676874290a202020203930204c45542061737365745f726566756e64203d206d61785f617373657473202d206173736574735f736f6c640a2020203130302049462061737365745f726566756e64203d3d2030205448454e20474f544f203132300a2020203131302053454e445f41535345545f544f5f41444452455353285349474e455228292c2061737365745f726566756e642c204845584445434f44452861737365745f6164647265737329290a202020313230207365745f6465726f5f726573657276655f7065725f6173736574286765745f6465726f5f726573657276655f7065725f61737365742861737365745f6164647265737329202d206465726f5f626f756768742c2061737365745f61646472657373290a202020313330207365745f61737365745f726573657276652861737365745f72657365727665202b206173736574735f736f6c642c2061737365745f61646472657373290a2020203134302052455455524e20300a456e642046756e6374696f6e0a0a2f2f20436f6e766572742041737365747320746f204445524f2e0a2f2f205573657220737065636966696573206d6178696d756d20696e7075742028415353455456414c55452861737365745f6164647265737329292026206578616374206f75747075742e0a2f2f207b6465726f5f626f756768747d20416d6f756e74206f66204445524f207075726368617365642e0a2f2f207b61737365745f616464726573737d2041646472657373206f662074686520617373657420746f2074726164652e0a46756e6374696f6e204173736574546f4465726f537761704f7574707574286465726f5f626f756768742055696e7436342c2061737365745f6164647265737320537472696e67292055696e7436340a2020202031302052455455524e206173736574546f4465726f4f7574707574286465726f5f626f756768742c20415353455456414c5545284845584445434f44452861737365745f6164647265737329292c2061737365745f61646472657373290a456e642046756e6374696f6e0a0a2f2f205075626c69632070726963652066756e6374696f6e20666f72204445524f20746f20417373657420747261646573207769746820616e20657861637420696e7075742e0a2f2f207b6465726f5f736f6c647d20416d6f756e74206f66204445524f20736f6c642e0a2f2f207b61737365745f616464726573737d2041646472657373206f662074686520617373657420746f2074726164652e0a2f2f204072657475726e7320416d6f756e74206f662041737365747320746861742063616e20626520626f75676874207769746820696e707574204445524f2e0a46756e6374696f6e204765744465726f546f4173736574496e7075745072696365286465726f5f736f6c642055696e7436342c2061737365745f6164647265737320537472696e67292055696e7436340a202020203130204946206465726f5f736f6c64203e2030205448454e20474f544f2033300a2020202032302052455455524e20300a2020202033302052455455524e20676574496e7075745072696365286465726f5f736f6c642c206765745f6465726f5f726573657276655f7065725f61737365742861737365745f61646472657373292c206765745f61737365745f726573657276652861737365745f6164647265737329290a456e642046756e6374696f6e0a0a2f2f205075626c69632070726963652066756e6374696f6e20666f72204445524f20746f20417373657420747261646573207769746820616e206578616374206f75747075742e0a2f2f207b6173736574735f626f756768747d20416d6f756e74206f662041737365747320626f756768742e0a2f2f207b61737365745f616464726573737d2041646472657373206f662074686520617373657420746f2074726164652e0a2f2f204072657475726e7320416d6f756e74206f66204445524f206e656564656420746f20627579206f7574707574204173736574732e0a46756e6374696f6e204765744465726f546f41737365744f75747075745072696365286173736574735f626f756768742055696e7436342c2061737365745f6164647265737320537472696e67292055696e7436340a202020203130204946206173736574735f626f75676874203e2030205448454e20474f544f2033300a2020202032302052455455524e20300a2020202033302052455455524e206765744f75747075745072696365286173736574735f626f756768742c206765745f6465726f5f726573657276655f7065725f61737365742861737365745f61646472657373292c206765745f61737365745f726573657276652861737365745f6164647265737329290a456e642046756e6374696f6e0a0a2f2f205075626c69632070726963652066756e6374696f6e20666f7220417373657420746f204445524f20747261646573207769746820616e20657861637420696e7075742e0a2f2f207b6173736574735f736f6c647d20416d6f756e74206f662041737365747320736f6c642e0a2f2f207b61737365745f616464726573737d2041646472657373206f662074686520617373657420746f2074726164652e0a2f2f204072657475726e7320416d6f756e74206f66204445524f20746861742063616e20626520626f75676874207769746820696e707574204173736574732e0a46756e6374696f6e204765744173736574546f4465726f496e7075745072696365286173736574735f736f6c642055696e7436342c2061737365745f6164647265737320537472696e67292055696e7436340a202020203130204946206173736574735f736f6c64203e2030205448454e20474f544f2033300a2020202032302052455455524e20300a2020202033302052455455524e20676574496e7075745072696365286173736574735f736f6c642c206765745f61737365745f726573657276652861737365745f61646472657373292c206765745f6465726f5f726573657276655f7065725f61737365742861737365745f6164647265737329290a456e642046756e6374696f6e0a0a2f2f205075626c69632070726963652066756e6374696f6e20666f7220417373657420746f204445524f20747261646573207769746820616e206578616374206f75747075742e0a2f2f207b6465726f5f626f756768747d20416d6f756e74206f66206f7574707574204445524f2e0a2f2f207b61737365745f616464726573737d2041646472657373206f662074686520617373657420746f2074726164652e0a2f2f204072657475726e7320416d6f756e74206f6620417373657473206e656564656420746f20627579206f7574707574204445524f2e0a46756e6374696f6e204765744173736574546f4465726f4f75747075745072696365286465726f5f626f756768742055696e7436342c2061737365745f6164647265737320537472696e67292055696e7436340a202020203130204946206465726f5f626f75676874203e2030205448454e20474f544f2033300a2020202032302052455455524e20300a2020202033302052455455524e206765744f75747075745072696365286465726f5f626f756768742c206765745f61737365745f726573657276652861737365745f61646472657373292c206765745f6465726f5f726573657276655f7065725f61737365742861737365745f6164647265737329290a456e642046756e6374696f6e0a0a46756e6374696f6e206d696e744665652872657365727665302055696e7436342c2072657365727665312055696e7436342c2061737365745f6164647265737320537472696e6729200a2020202031302044494d20666565546f20617320537472696e670a2020202031312044494d20726f6f744b4c6173742061732055696e7436340a202020203230204c455420666565546f203d204c4f41442822666565546f2229200a202020202f2f2047657420746865206c61737420726f6f74206b20666f72207468652061737365740a202020203330204c455420726f6f744b4c617374203d204c4f41442861737365745f616464726573732b223a726f6f744b4c61737422290a20202020343020494620726f6f744b4c61737420213d2030205448454e20474f544f2035300a202020202020202034312052455455524e200a2020202035302044494d20726f6f744b2061732055696e7436340a202020203630204c455420726f6f744b203d207371727428726573657276653029202a2073717274287265736572766531290a20202020373020494620726f6f744b203e20726f6f744b4c617374205448454e20474f544f2038300a202020202020202037312052455455524e200a2020202038302044494d20737570706c792c206c69717569646974795f6d696e7465642061732055696e7436340a202020203930204c455420737570706c79203d206765745f737570706c795f7065725f61737365742861737365745f61646472657373290a202020313030204c4554206c69717569646974795f6d696e746564203d206d756c745f64697628737570706c792c20726f6f744b202d20726f6f744b4c6173742c20726f6f744b202a2035202b20726f6f744b4c617374290a202020313130204946206c69717569646974795f6d696e746564203e2030205448454e20474f544f2031313120454c534520474f544f203132300a2020202020202031313120696e6372656173655f70726f76696465725f6c69717569646974795f627928666565546f2c206c69717569646974795f6d696e7465642c2061737365745f61646472657373290a20202020202020313132207365745f737570706c795f7065725f617373657428737570706c79202b206c69717569646974795f6d696e7465642c2061737365745f61646472657373290a2020203132302052455455524e200a456e642046756e6374696f6e0a0a2f2f2048656c7065722066756e6374696f6e73200a2f2f20456e63617073756c6174656420746f2062657474657220756e6465727374616e64207768617427732068617070656e696e6720616e642061627363747261637420424f4f2073746f7261676520736368656d610a2f2f2066726f6d206d61696e20636f64652e0a0a46756e6374696f6e207365745f737570706c795f7065725f617373657428616d6f756e742055696e7436342c2061737365745f6164647265737320537472696e6729200a2020202031302053544f52452861737365745f616464726573732b223a424f4f222c20616d6f756e74290a2020202032302052455455524e0a456e642046756e6374696f6e0a0a46756e6374696f6e206765745f737570706c795f7065725f61737365742861737365745f6164647265737320537472696e67292055696e7436340a202020203130204946204558495354532861737365745f616464726573732b223a424f4f2229205448454e20474f544f2033300a2020202032302052455455524e20300a2020202033302052455455524e204c4f41442861737365745f616464726573732b223a424f4f22290a456e642046756e6374696f6e0a0a46756e6374696f6e207365745f6465726f5f726573657276655f7065725f617373657428616d6f756e742055696e7436342c2061737365745f6164647265737320537472696e67290a2020202031302053544f52452861737365745f616464726573732b223a4445524f222c20616d6f756e74290a2020202032302052455455524e200a456e642046756e6374696f6e0a0a46756e6374696f6e206765745f6465726f5f726573657276655f7065725f61737365742861737365745f6164647265737320537472696e67292055696e7436340a2020202031302052455455524e204c4f41442861737365745f616464726573732b223a4445524f22290a456e642046756e6374696f6e0a0a46756e6374696f6e207365745f61737365745f7265736572766528616d6f756e742055696e7436342c2061737365745f6164647265737320537472696e6729200a2020202031302053544f52452861737365745f616464726573732c20616d6f756e74290a2020202032302052455455524e200a456e642046756e6374696f6e0a0a46756e6374696f6e206765745f61737365745f726573657276652861737365745f6164647265737320537472696e67292055696e7436340a2020202032302052455455524e204c4f41442861737365745f61646472657373290a456e642046756e6374696f6e0a0a46756e6374696f6e20696e6372656173655f70726f76696465725f6c69717569646974795f62792870726f76696465725f6164647265737320537472696e672c20616d6f756e742055696e7436342c2061737365745f6164647265737320537472696e67290a2020202031302049462045584953545328414444524553535f535452494e472870726f76696465725f61646472657373292b223a424f4f3a222b61737365745f6164647265737329205448454e20474f544f2034300a2020202032302053544f524528414444524553535f535452494e472870726f76696465725f61646472657373292b223a424f4f3a222b61737365745f616464726573732c20616d6f756e74290a2020202033302052455455524e0a2020202034302053544f524528414444524553535f535452494e472870726f76696465725f61646472657373292b223a424f4f3a222b61737365745f616464726573732c206765745f70726f76696465725f6c69717569646974792870726f76696465725f616464726573732c2061737365745f6164647265737329202b20616d6f756e74290a2020202035302052455455524e0a456e642046756e6374696f6e0a0a46756e6374696f6e2064656372656173655f70726f76696465725f6c69717569646974795f62792870726f76696465725f6164647265737320537472696e672c20616d6f756e742055696e7436342c2061737365745f6164647265737320537472696e67290a2020202031302053544f524528414444524553535f535452494e472870726f76696465725f61646472657373292b223a424f4f3a222b61737365745f616464726573732c206765745f70726f76696465725f6c69717569646974792870726f76696465725f616464726573732c2061737365745f6164647265737329202d20616d6f756e74290a2020202032302052455455524e0a456e642046756e6374696f6e0a0a46756e6374696f6e206765745f70726f76696465725f6c69717569646974792870726f76696465725f6164647265737320537472696e672c2061737365745f6164647265737320537472696e67292055696e7436340a2020202031302052455455524e204c4f414428414444524553535f535452494e472870726f76696465725f61646472657373292b223a424f4f3a222b61737365745f61646472657373290a456e642046756e6374696f6e0a0a46756e6374696f6e2077696c6c5f6164646974696f6e5f6f766572666c6f7728612055696e7436342c20622055696e743634292055696e7436340a202020203130204946202861203e203138343436373434303733373039353531363135202d206229205448454e20474f544f203130300a2020202032302052455455524e2030202f2f204e6f206f766572666c6f770a202020203130302052455455524e2031202f2f204f766572666c6f770a456e642046756e6374696f6e0a0a2f2f2046726f6d20506965737761700a2f2f206c6f73736c657373202861202a20622029202f20630a46756e6374696f6e206d756c745f64697628612055696e7436342c20622055696e7436342c20632055696e743634292055696e7436340a0931302044494d20626173652c206d61786469762041532055696e7436340a093230204c45542062617365203d2034323934393637323936092f2f2028313c3c3332290a093330204c4554206d6178646976203d2028626173652d31292a62617365202b2028626173652d31290a0a0935302044494d207265732041532055696e7436340a093630204c455420726573203d2028612f6329202a2062202b202861256329202a2028622f63290a093730204c45542061203d2061202520630a093830204c45542062203d2062202520630a093930204946202861203d3d2030207c7c2062203d3d203029205448454e20474f544f20313030300a0a09313030204946202863203e3d206261736529205448454e20474f544f203230300a09313130204c455420726573203d20726573202b2028612a622f63290a0931323020474f544f20313030300a0a093230302044494d206e6f726d2041532055696e7436340a09323130204c4554206e6f726d203d206d61786469762f630a09323230204c45542063203d2063202a206e6f726d0a09323330204c45542061203d2061202a206e6f726d0a0a093330302044494d2061682c20616c2c2062682c20626c2c2063682c20636c2041532055696e7436340a09333130204c4554206168203d2061202f20626173650a09333230204c455420616c203d2061202520626173650a09333330204c4554206268203d2062202f20626173650a09333430204c455420626c203d2062202520626173650a09333530204c4554206368203d2063202f20626173650a09333630204c455420636c203d2063202520626173650a0a093430302044494d2070302c2070312c2070322041532055696e7436340a09343130204c4554207030203d20616c2a626c0a09343230204c4554207031203d207030202f2062617365202b20616c2a62680a09343330204c4554207030203d207030202520626173650a09343430204c4554207032203d207031202f2062617365202b2061682a62680a09343530204c4554207031203d202870312025206261736529202b2061682a626c0a09343630204c4554207032203d207032202b207031202f20626173650a09343730204c4554207031203d207031202520626173650a0a093530302044494d2071302c2071312c20726861742041532055696e7436340a09353130204c4554207032203d207032202520630a09353230204c4554207131203d207032202f2063680a09353330204c45542072686174203d20703220252063680a0a0936303020494620287131203c2062617365202626202872686174203e3d2062617365207c7c2071312a636c203c3d20726861742a626173652b70312929205448454e20474f544f203730300a09363130204c4554207131203d207131202d20310a09363230204c45542072686174203d2072686174202b2063680a0936333020474f544f203630300a0a09373030204c4554207031203d20282870322025206261736529202a2062617365202b20703129202d207131202a20636c0a09373130204c4554207032203d20287032202f2062617365202a2062617365202b207031202f206261736529202d207131202a2063680a09373230204c4554207031203d202870312025206261736529202b202870322025206261736529202a20626173650a09373330204c4554207130203d207031202f2063680a09373430204c45542072686174203d20703120252063680a0a0938303020494620287130203c2062617365202626202872686174203e3d2062617365207c7c2071302a636c203c3d20726861742a626173652b70302929205448454e20474f544f203930300a09383130204c4554207130203d207130202d20310a09383230204c45542072686174203d2072686174202b2063680a0938333020474f544f203830300a0a09393030204c455420726573203d20726573202b207130202b207131202a20626173650a0a09313030302052455455524e207265730a456e642046756e6374696f6e0a202020200a2f2f20626162796c6f6e69616e206d6574686f64202868747470733a2f2f656e2e77696b6970656469612e6f72672f77696b692f4d6574686f64735f6f665f636f6d707574696e675f7371756172655f726f6f747323426162796c6f6e69616e5f6d6574686f64290a46756e6374696f6e207371727428792055696e743634292055696e7436340a2020202031302049462079203e2033205448454e20474f544f20323020454c534520474f544f2039300a2020202032302044494d20782c7a2061732055696e7436340a202020203330204c4554207a203d2079200a202020203430204c45542078203d2079202f2032202b20310a2020202035302049462078203c207a205448454e20474f544f20363020454c534520474f544f203133300a202020203630204c4554207a203d20780a202020203730204c45542078203d202879202f2078202b207829202f20320a20202020383020474f544f2035300a202020203930204946207920213d2030205448454e20474f544f2031313020454c534520474f544f203132300a2020203131302052455455524e20310a2020203132302052455455524e20300a2020203133302052455455524e207a0a456e642046756e6374696f6e0a0a46756e6374696f6e20557064617465436f646528636f646520537472696e67292055696e743634200a20202020313020204946204c4f414428226f776e65722229203d3d205349474e45522829205448454e20474f544f203330200a202020203230202052455455524e20310a20202020333020205550444154455f53435f434f444528636f6465290a202020203430202052455455524e20300a456e642046756e6374696f6e0a6a53435f414354494f4e55012af9bb8bec34ed34cc1176114023463a16cfe3bbf519453631e4702b16a4614f001694b5d973e74dd0999a9fdb4331bd45f7a81b656fb52f5d6905ae5cd45300aa01077ce14768c160b83b861e4c9e95f121404e655b3915b5e25245079c2cc7b26b010bf7bc170558956e3574713d31193f2cc49abb593902eef73c18ddf98c3af06001124907367752f16def9bc80f50a12faa25b1b1c3e5ca4ec906e1419aab3a45710020983bd50060fa32a37dc913e5601ebea8e14230ff5dfec56020bcbd106f4eb3011231960787ce9ddfc3c0adb86ccd790c0c187ee2bb23640351cd9a7bc1b751350002a3cce6935d132c8442f4277230145ffe10b76d75f093be50ff32405e5cfe4d012394f010ed595c359598204f095aba6e9c06033e52f52281e246258d7e36065d012f35f7b48af6a55dcdd7b07f3312c6f935c07c2b5455fa0271277fa94f5c99500102621999da7d1c9bf25ada4e8247ad260c875bb4b5aa7d6008f3374802464ea80003f7d0cf59f898fe07425b45b5560a7d2692c243f8bcb1601be69c33ab962b0d0126e35e062c45fbb78bd580de535f1c2ff026ce4d2a91df7018203b55761b2b9a002e0990e276829b77e68ba92d5d0969f15f7b86cbac25c72ac450bb4958971473000000000000000000000000000000000000000000000000000000000000000003c384f524a067d14574301f1628a918f7af5b290ac134b27e9ad3364573861703483c229e709a194ca75d34ac9da75c9f646631fa81e51b5a823b649106d2d80007c150d6960f4d514d50f349bf639341e329d4dc8475b512c109bafe283c5691012402e9cba949a4a34b185bdf4895412296b288133de3a392d14ed8278fdc238b1badb2adc6002324c6de3bb8bb41523529d4134d33de4e68964fecdcce3405fe01f9d156c869a6bacdefcb2180ec46a1117e0f0331fadb8f8bd19a7ca3fce26b286fcfe2ee1c439b9b0404c52634050b238ae25ef27e19f43ee2961d057245140f8dd72e737c8bdf564a785b266fe1399eab5aebd5c68c05ac3a13911f78873b2a0e08ffd07012f50fccdc496d1b55fae9a21e19f4dbda92549f7d5fb2bb9b5022cde50faddf8a762e48435d18a343328306e913fae4bde3997d5d69f68450452b7beb005c12b85dc3f52b2de9ce8085f92f5b97cfc9efa47f3e755f6abb8b56257d7854d3a0724963863d19b7e00d637c5b9df639c2343018cb9adf823fd277056e84b958e5167354ceb4c6251833fff0e8a14405de9c10e49ff59e02ff4ab300043cea382029bd18ce3ccc0114b28a686cb341cd5621d634bc7d1d87c31f1ddd0110bd5c43bc1397d8632a01d288a551b87e3b2bd08669068a948fb8eb05b6f442000a2a098997d8774d685be4c8cf6aae2ede8436ffe3d4afe476c81b3aa9b57efa00047053caa87650b5a15cb7bbcbb83e48c7cf92d0f4a9a82d43ef23ea3ba59bf50101368054f27a18802c525ff6e313337dcbda45ba1ef17fa9215b61c15811b7de0106ed4d4f48e564fbe505091e0d6e915cf557958578a0c872ba1414e2fc76094c012d685a81c5983f1f7bccb15b60f556472cfc0eae92a5699feaa509c11d2a974c0020f5789417c44b8dedc6eed466615d5ccb115a428145315087748996f637aa0c002090170c2fd6354db3ac4c393468df0541b00c35f927f77851ca0166d51f0fc6000ea007653ce44c0e11332edf2a0e61ca29dc208157d21c4152cd91096b469b2700262a2680917e4e13fd7720c01003fa72cd3ff3c2ec5174a3d1bd8a9cd1e4bd920116d7899d08b81aa09be8d7fb614692f8f9f389326fe2944aac9fb9b726218582002cfbcfbac1e758ec4905f41f9a1c3ded0a04ede347927c09c3aa43bad66f461c00
DERO explorer source code | explorer version (api): under development (1.0) | dero version: golang pre-alpha | Copyright 2017-2022 Dero Project