diff --git a/growth-program/output/growth-program.abi.json b/growth-program/output/growth-program.abi.json index 844fffc..5a4dcb4 100644 --- a/growth-program/output/growth-program.abi.json +++ b/growth-program/output/growth-program.abi.json @@ -10,7 +10,7 @@ "contractCrate": { "name": "growth-program", "version": "0.0.0", - "gitVersion": "v1.0.2-158-g6a49882" + "gitVersion": "v1.0.2-162-g6750cb9" }, "framework": { "name": "multiversx-sc", @@ -21,7 +21,10 @@ "constructor": { "docs": [ "Arguments:", - "min_reward_dollars_per_energy: Scaled to PRECISION const.", + "min_reward_dollars_per_energy is a value scaled to PRECISION*PRECISION.", + "For example, if the desired RDPE is that 10^18 units of energy give 10^{-15} dollars of rewards,", + "then we should provide the argument 10^{-15}*10^{-18}*PRECISION*PRECISION = 10^3.", + "", "alpha: Percentage, scaled to MAX_PERCENTAGE const.", "beta: Percentage, scaled to MAX_PERCENTAGE const." ], @@ -188,10 +191,6 @@ "name": "end_week", "type": "u32" }, - { - "name": "initial_rewards_dollar_per_energy", - "type": "BigUint" - }, { "name": "signer", "type": "Address" @@ -261,6 +260,11 @@ "outputs": [] }, { + "docs": [ + "min_reward_dollars_per_energy is a value scaled to PRECISION*PRECISION.", + "For example, if the desired RDPE is that 10^18 units of energy give 10^{-15} dollars of rewards,", + "then we should provide the argument 10^{-15}*10^{-18}*PRECISION*PRECISION = 10^3." + ], "name": "setMinRewardDollarsPerEnergy", "onlyOwner": true, "mutability": "mutable", @@ -272,6 +276,18 @@ ], "outputs": [] }, + { + "name": "setInitialRdpeFromApr", + "onlyOwner": true, + "mutability": "mutable", + "inputs": [ + { + "name": "apr", + "type": "BigUint" + } + ], + "outputs": [] + }, { "name": "setNextWeekRewardDollarsPerEnergy", "onlyOwner": true, @@ -282,7 +298,7 @@ "type": "u32" }, { - "name": "new_min", + "name": "rew_dollars_per_energy", "type": "BigUint" } ], diff --git a/growth-program/output/growth-program.mxsc.json b/growth-program/output/growth-program.mxsc.json index 055763f..e970f5b 100644 --- a/growth-program/output/growth-program.mxsc.json +++ b/growth-program/output/growth-program.mxsc.json @@ -21,7 +21,10 @@ "constructor": { "docs": [ "Arguments:", - "min_reward_dollars_per_energy: Scaled to PRECISION const.", + "min_reward_dollars_per_energy is a value scaled to PRECISION*PRECISION.", + "For example, if the desired RDPE is that 10^18 units of energy give 10^{-15} dollars of rewards,", + "then we should provide the argument 10^{-15}*10^{-18}*PRECISION*PRECISION = 10^3.", + "", "alpha: Percentage, scaled to MAX_PERCENTAGE const.", "beta: Percentage, scaled to MAX_PERCENTAGE const." ], @@ -188,10 +191,6 @@ "name": "end_week", "type": "u32" }, - { - "name": "initial_rewards_dollar_per_energy", - "type": "BigUint" - }, { "name": "signer", "type": "Address" @@ -261,6 +260,11 @@ "outputs": [] }, { + "docs": [ + "min_reward_dollars_per_energy is a value scaled to PRECISION*PRECISION.", + "For example, if the desired RDPE is that 10^18 units of energy give 10^{-15} dollars of rewards,", + "then we should provide the argument 10^{-15}*10^{-18}*PRECISION*PRECISION = 10^3." + ], "name": "setMinRewardDollarsPerEnergy", "onlyOwner": true, "mutability": "mutable", @@ -272,6 +276,18 @@ ], "outputs": [] }, + { + "name": "setInitialRdpeFromApr", + "onlyOwner": true, + "mutability": "mutable", + "inputs": [ + { + "name": "apr", + "type": "BigUint" + } + ], + "outputs": [] + }, { "name": "setNextWeekRewardDollarsPerEnergy", "onlyOwner": true, @@ -282,7 +298,7 @@ "type": "u32" }, { - "name": "new_min", + "name": "rew_dollars_per_energy", "type": "BigUint" } ], @@ -742,6 +758,6 @@ } } }, - "size": 20837, - "code": "0061736d0100000001a8011b60000060017f017f60027f7f0060027f7f017f6000017f60017f0060037f7f7f0060037f7f7f017f60047f7f7f7f0060057f7f7f7f7f0060027f7e0060047f7f7f7f017f60027f7e017f60017f017e6000017e60027f7f017e60017e0060027e7f0060057f7f7e7f7f017f60067e7f7f7f7f7f017f60057e7f7f7f7f017f60047f7f7f7e0060017e017f60047f7e7f7f0060037f7f7e017f60047f7f7f7e017f60037f7e7f017f02bb093303656e760e626967496e74536574496e743634000a03656e7609626967496e74416464000603656e760b7369676e616c4572726f72000203656e760a6d4275666665724e6577000403656e760d6d427566666572417070656e64000303656e76096d4275666665724571000303656e760d6d42756666657246696e697368000103656e76106d4275666665724765744c656e677468000103656e76226d616e616765644d756c74695472616e73666572455344544e465445786563757465001203656e761b6d616e61676564457865637574654f6e44657374436f6e74657874001303656e760d6d616e6167656443616c6c6572000503656e76106d616e61676564534341646472657373000503656e76136d616e616765644f776e657241646472657373000503656e760f6d4275666665724765744279746573000303656e760f6973536d617274436f6e7472616374000103656e76126d427566666572476574417267756d656e74000303656e76126d427566666572417070656e644279746573000703656e76126d616e616765645369676e616c4572726f72000503656e7611676574417267756d656e744c656e677468000103656e761b736d616c6c496e74476574556e7369676e6564417267756d656e74000d03656e7619626967496e74476574556e7369676e6564417267756d656e74000203656e760f6765744e756d417267756d656e7473000403656e7614626967496e7446696e697368556e7369676e6564000503656e7614736d616c6c496e7446696e6973685369676e6564001003656e7609626967496e74537562000603656e7609626967496e74436d70000303656e760f6d4275666665725365744279746573000703656e760a626967496e7454446976000603656e7609626967496e744d756c000603656e76196d42756666657246726f6d426967496e74556e7369676e6564000303656e76176d427566666572546f426967496e74556e7369676e6564000303656e760a626967496e7453717274000203656e76146d427566666572436f707942797465536c696365000b03656e76126d42756666657253746f726167654c6f6164000303656e76136d42756666657253746f7261676553746f7265000303656e760a6765744761734c656674000e03656e760f636c65616e52657475726e44617461000003656e7611676574426c6f636b54696d657374616d70000e03656e761c6d616e616765644765744d756c74694553445443616c6c56616c7565000503656e761776616c6964617465546f6b656e4964656e746966696572000103656e760e636865636b4e6f5061796d656e74000003656e7609626967496e74506f77000603656e7616736d616c6c496e7446696e697368556e7369676e6564001003656e76146d616e6167656456657269667945643235353139000703656e760d676574426c6f636b45706f6368000e03656e761d6d42756666657253746f726167654c6f616446726f6d41646472657373000603656e76156d427566666572546f426967496e745369676e6564000303656e7609626967496e74416273000203656e760f6d616e6167656457726974654c6f67000203656e760a626967496e745369676e000103656e76136d42756666657247657442797465536c696365000b03f001ee01010409000103050102040205020804030203010101020102020202010201021404040400010807020707070107010705050500050105010601090602010a090b030f081508090209010b0a090f08020701010206010302030303020101030104160201010b080b0605010d010102020503020202170602020206020a02010101030c110f0c0a0c06060a0707180404041904090d020201010504080403040301020103030303030403040505040506000403050402020211060504080505010604060c0c1a040400000000000000000000000000000000000000000000000000000000000000000000000000000005030100030616037f01418080080b7f0041f9df080b7f004180e0080b07c30629066d656d6f7279020004696e697400fa01077570677261646500fb010a61646450726f6a65637400fc010f73657450726f6a6563744f776e657200fd010c706175736550726f6a65637400fe010e756e706175736550726f6a65637400ff010f697350726f6a656374416374697665008002137365744d696e52657761726473506572696f64008102187365744d696e5765656b6c795265776172647356616c7565008202156465706f736974496e697469616c52657761726473008302186465706f7369744164646974696f6e616c526577617264730084021773657446656573436f6c6c6563746f7241646472657373008502146f776e65725769746864726177526577617264730086020d66696e69736850726f6772616d0087021c7365744d696e526577617264446f6c6c617273506572456e65726779008802217365744e6578745765656b526577617264446f6c6c617273506572456e6572677900890208736574416c706861008a020773657442657461008b021c736574546f74616c456e65726779466f7243757272656e745765656b008c021c676574546f74616c456e65726779466f7243757272656e745765656b008d020c636c61696d52657761726473008e02176765744578656d707465645061727469636970616e7473008f020e67657455736572436c61696d65640090020d757064617465526577617264730091020e67657452657761726473496e666f0092021567657452657761726473546f74616c416d6f756e74009302196765745265776172647352656d61696e696e67416d6f756e740094020f6765744e6f746573486973746f72790095020c6368616e67655369676e65720096020e67657443757272656e745765656b0097021e67657454696d657374616d70735374617274416e64456e644f665765656b0098021a67657446697273745765656b537461727454696d657374616d7000990217736574456e65726779466163746f727941646472657373009a0217676574456e65726779466163746f727941646472657373009b02057061757365009c0207756e7061757365009d02086973506175736564009e020863616c6c4261636b009f020a5f5f646174615f656e6403010b5f5f686561705f6261736503020ae67dee011601017f1034220142001000200120012000100120010b1901017f41b8910841b8910828020041016b220036020020000b2e000240200120024d0440200220044d0d011036000b1036000b2000200220016b3602042000200120036a3602000b060010a002000b0f01017f10032201200010041a20010b0b0020002001100541004a0b19002000103a45044041f58008410f103b000b103c2000103d0b1400200041d9df08100d1a41d9df08100e41004a0b0900200020011002000b0a0041e98b08411410420b09002000200110a0010b6c01027f230041106b220124002000027f41d0df082d0000220245044041d0df0841013a000041ccdf084100360200200141086a4100103f2001280208200128020c41a891084100104010410c010b41a89108410010420b360200200020024101733a0004200141106a24000b3e01017f230041106b22022400200241086a41bc91084190ce00200110ee01200228020c21012000200228020836020020002001360204200241106a24000bb50201067f200120034604402001220341104f04402000410020006b41037122046a210520040440200221010340200020012d00003a0000200141016a2101200041016a22002005490d000b0b2005200320046b2203417c7122066a21000240200220046a22044103710440200641004c0d012004410374220141187121072004417c71220841046a2102410020016b4118712109200828020021010340200520012007762002280200220120097472360200200241046a2102200541046a22052000490d000b0c010b200641004c0d0020042102034020052002280200360200200241046a2102200541046a22052000490d000b0b20034103712103200420066a21020b20030440200020036a21010340200020022d00003a0000200241016a2102200041016a22002001490d000b0b0f0b1036000b1301017f1034220041a891084100101a1a20000b1101017f1034220220002001101a1a20020b0b0020002001104410061a0b4901017f230041106b22022400200220013a000c20022000360208200241086a109b01200228020820022d000c044041ccdf08410036020041d0df0841003a00000b200241106a24000b08002000104610470b7101047f230041106b220124002001410036020c20002001410c6a2202410441db8208410b107e200120002802082000280200220320024104107fa722021080012001280200410147044041db8208410b41e68208410f1058000b20012802042000200220036a360200200141106a24000b0d00200010342200101e1a20000b0a00200010492001104a0b0f01017f103422012000101d1a20010bb40101037f230041106b22022400200220001007220341187420034180fe03714108747220034108764180fe03712003411876727236020c20012002410c6a410410ba010240024020012d000404402000100722044190ce0041ccdf0828020022036b4b0d0120022003200320046a220110bb012000410020022802002002280204107c1a41ccdf0820013602000c020b200128020020001089010c010b2001109b01200128020020001089010b200241106a24000b0a00200010492001104c0b5101027f230041106b22022400200220001007220341187420034180fe03714108747220034108764180fe03712003411876727236020c20012002410c6a410410860120012000108901200241106a24000b3701017f2001104e220210072101200041106a41003a00002000410c6a20013602002000200236020820002001360204200041003602000b0d0020001034220010211a20000b6902057f017e200128020c220410504504402001290300210710412105104121062001280208230041106b22012400104121031037210220012004103336020c20012007370300200120023602082003200110512000200342002005200610081a200141106a24000b0b0c00200010870141ff0171450bd20102027f017e230041106b2203240020032001280208220241187420024180fe03714108747220024108764180fe0371200241187672723602002003200128020c220241187420024180fe03714108747220024108764180fe03712002411876727236020c20032001290300220442388620044280fe0383422886842004428080fc0783421886200442808080f80f834208868484200442088842808080f80f832004421888428080fc07838420044228884280fe0383200442388884848437020420002003411010101a200341106a24000b1500200020012002200320041034220110091a20010b0c01017f10342200100a20000b0c01017f10342200100b20000b0c01017f10342200100c20000b150010551053103804400f0b41f4900841241002000b0d00200010342200100f1a20000b2e01017f41a681084117104222042000200110101a200441bd8108410310101a20042002200310101a20041011000b0c00200020012002105b10570b4601017f230041106b220224002002200141187420014180fe03714108747220014108764180fe03712001411876727236020c20002002410c6a410410101a200241106a24000b2f01017f2000280200220341d4df082802004e04402001200241c0810841111058000b2000200341016a36020020030b2501017e20001013220342ffffffff0f5804402003a70f0b2001200241998008410e1058000b2f01017f230041106b22032400200341003a000f20002003410f6a410120012002107e20032d000f200341106a24000b2601017e2000101322014280808080105a0440418a8408410a41998008410e1058000b2001a70b1f00200010572200100741204704402001200241908b0841101058000b20000b0c00200010342200101420000b0a00200020012002105c0b1900200041d4df082802004e04400f0b41d1810841121002000b1400101520004604400f0b41e3810841191002000b1900200041d4df082802004c04400f0b41c0810841111002000b0b0041d4df0810153602000b08002000106710160b08002000104e10470b090020001069ad10170b3001017e027f02402000109d012201420158044041002001a741016b0d021a0c010b41a88b084112108501000b41010b0b1f0020002001200210182000106b41ff017104400f0b41fc810841301002000b1500410241012000103122001b4100200041004e1b0b9f0202087f017e230041406a22052400200541206a41ac82084114106d20052802202108200528022422062003106e2004106f2103104122092003ad107020062009105a20041007210a200541306a210b410021030340200a200341106a2209490440200520082006200120021071200528020421012000200528020036020020002001360204200541406b240005200b42003703002005420037032820042003200541286a2207411010721a2005410036023c20072005413c6a220c107321032007200c1074210d200541286a2005413c6a10732107200541186a2008200620031075200541106a2005280218200528021c200d1076200541086a2005280210200528021420071077200528020c210620052802082108200921030c010b0b0b1800200120021042210120001041360204200020013602000b100010411a200020012802001037105a0b0900200010074104760b3801017f230041106b2202240020024200370308200220014100200241086a10a701200020022802002002280204101a1a200241106a24000b900101037f230041106b2205240002402003107b0d00200220031079200410072106410021030340200341046a220720064b0d012005410036020c200420032005410c6a4104107c1a2002200528020c220341187420034180fe03714108747220034108764180fe0371200341187672721079200721030c000b000b2000200236020420002001360200200541106a24000b0f00200020012003200210324100470b7201017f230041106b220224002002410036020c2002200020012802002200200041046a22001098012002410c6a410420022802002002280204104020012000360200200228020c2100200241106a2400200041187420004180fe03714108747220004108764180fe0371200041187672720ba60102017e017f230041106b22032400200342003703082003200020012802002200200041086a2200109801200341086a41082003280200200328020410402001200036020020032903082102200341106a2400200242388620024280fe0383422886842002428080fc0783421886200242808080f80f834208868484200242088842808080f80f832002421888428080fc07838420024228884280fe038320024238888484840b160020022003107920002002360204200020013602000b160020022003107d20002002360204200020013602000b1b0010411a200220031049105a20002002360204200020013602000b9c0101027f230041306b22052400200541286a41c08208410f106d200541206a2005280228200528022c20042802081075200541186a2005280220200528022420042903001076200541106a2005280218200528021c200428020c1077200528021021042005280214220620031079200541086a20042006200120021071200528020c21012000200528020836020020002001360204200541306a24000b0d0010411a200020011037105a0b7101017f230041206b22052400200541186a41cf8208410c106d200541106a2005280218200528021c20031075200541086a200528021020052802142004107720052005280208200528020c200120021071200528020421012000200528020036020020002001360204200541206a24000b070020001007450b0c00200020012002200310720b1201017f104122022001107020002002105a0b1c002000200120022003200410c5012000200028020020026a3602000b3401017e02402001450d0003402001450d01200141016b210120003100002002420886842102200041016a21000c000b000b20020b1f0020012002200310032201102021022000200136020420002002453602000b920101037f230041106b220224002002410036020c024020012002410c6a220341041082012204450440200220012802082001280200220420034104107fa722031080012000027f20022802004101460440200020022802043602042001200320046a36020041000c010b2000410f36020441e682080b3602000c010b2000410f360204200020043602000b200241106a24000b3201017f41e682082103200041086a200028020020012002109901047f41e68208052000200028020020026a36020041000b0b5501047f230041106b2201240020001084012102200141086a20002802082000280200220320021080012001280208410147044041e68208410f108501000b200128020c2000200220036a360200200141106a24000b5502017f017e230041106b220124002001410036020c200041086a20002802002001410c6a4104109901044041e68208410f108501000b2000200028020041046a3602002001410c6a4104107f200141106a2400a70b1a01017f41ea83084116104222022000200110101a20021011000b0b0020002001200210101a0b09002000106b41016b0b1500417f200020011019220041004720004100481b0b09002000200110041a0b0c00200020002001100120000b0c00200020002001101b20000b0c00200020002001101c20000b0a0020002000200110010b11002000200041a08d06108f01101b20000b0b0041722000ad100041720b0f00200020002001108f01101c20000b0e01017f103422012000101f20010b0e01017f103422004200100020000b1b002000420053044041f5820841111002000b41722000100041720b810102047f017e230041206b22022400200241106a42003703002002420037030820014100200241086a22034110107c2002410036021c20032002411c6a2204107321052003200410742106200241086a2002411c6a10732103044041868308411d1002000b2000200336020c2000200536020820002006370300200241206a24000b1900200041feffffff074604404180800841191002000b20000b5f01027f230041206b22012400200010074120460440200141186a4200370300200141106a4200370300200141086a420037030020014200370300200041002001412010721a2001412041a38308412010970121020b200141206a240020020b5301027f2001200346047f4100210302402001450d00034020002d0000220420022d00002205460440200041016a2100200241016a2102200141016b22010d010c020b0b200420056b21030b20030541010b450b2f000240200220034d0440200341104b0d012000200320026b3602042000200120026a3602000f0b1036000b1036000bb30101037f230041106b22042400027f024020002d000845044020002802002205100722064190ce004b0d0141d0df082d00000d0141ccdf08200636020041d0df0841013a0000200441086a2006103f200541002004280208200428020c107c1a200041013a00080b4101200120036a220041ccdf082802004b0d011a200420012000109a012002200320042802002004280204104041000c010b200041003a00082005200120022003107c0b200441106a24000b32000240200120024d044020024190ce004d0d011036000b1036000b2000200220016b3602042000200141bc91086a3602000b5801027f230041106b2201240020002d0004200041003a00040440200141086a410041ccdf08280200109a0120002802002001280208200128020c10101a41ccdf08410036020041d0df0841003a00000b200141106a24000b2201017e2000109d0122014280808080105a044041998008410e108501000b2001a70b5e02027f017e230041106b22012400200142003703082000104e22001007220241094f044041998008410e108501000b2001200141086a200210eb0120004100200128020022002001280204220210721a20002002107f200141106a24000b1c002000104e22001007412047044041908b084110108501000b20000b0d002000416710211a416710070b09002000200110221a0b0b0020002001104910221a0b1400416c41a891084100101a1a2000416c10221a0b1a0020001037220041d48308410510101a2001200010a40120000b09002000200110d3010ba60101057f230041206b220224002002410c6a22032001104d200310830121012002410c6a10830110472104200310840121032002410c6a10840121052002410c6a10840121062002280210200228020c4604402002411c6a2d0000044041ccdf08410036020041d0df0841003a00000b200020063602102000200536020c200020033602082000200436020420002001360200200241206a24000f0b41998008410e108501000b3901017f230041106b220224002002420037030820022001ad4101200241086a10a70120002002280200200228020410a801200241106a24000b900202047f017e2003200142388620014280fe0383422886842001428080fc0783421886200142808080f80f834208868484200142088842808080f80f832001421888428080fc0783842001423888220820014228884280fe03838484843700000240200150044041a8910821030c010b200204402001427f510440200341076a2103410121040c020b2008a7c022054107752106200541004821050b200641ff0171210603400240024020044108470440200320046a2d000022072006460d02200245200741077620054672450440200441016b220441094f0d020b200320046a2103410820046b21040c040b1036000b10a002000b200441016a21040c000b000b20002004360204200020033602000b0d00200020012002104210221a0b080020002001103d0b7001027f230041106b220224002002103e200220022d00043a000c200220022802003602082001280200200241086a2203104a2001280204200310482001280208200310ab01200128020c200310ab012001280210200310ab012000200228020820022d000c10ac01200241106a24000b4601017f230041106b220224002002200041187420004180fe03714108747220004108764180fe03712000411876727236020c20012002410c6a410410ba01200241106a24000b0d00200020012002104410221a0b0a0020002001ad10ae010b3801017f230041106b2202240020024200370308200220014100200241086a10a70120002002280200200228020410a801200241106a24000b09002000200110a1010b0d01017f20001067200010a2010b08002000109f01450b130020001037220041a29108410610101a20000b1a00200010372200419e9108410410101a2000200110890120000b1a0020001037220041989108410610101a2001200010b50120000b7801017f230041106b220224002002200042388620004280fe0383422886842000428080fc0783421886200042808080f80f834208868484200042088842808080f80f832000421888428080fc07838420004228884280fe038320004238888484843703082001200241086a4108108601200241106a24000b0c002000200110b301109d010b1a0020001037220041e48308410610101a2001200010b50120000b5001037f20002802082203200110b90145044020002802042202109c0121042000280200200441016a220010a301200110ae0120022000ad10ae012002109c0121002003200110b7012000ad10ae010b0b0f002000200110b701109c014100470b800101027f230041106b220324000240024020002d000404404190ce0041ccdf0828020022046b2002490d01200341086a2004200220046a220010bb012003280208200328020c20012002104041ccdf0820003602000c020b20002802002001200210101a0c010b2000109b0120002802002001200210101a0b200341106a24000b3f01017f230041106b22032400200341086a2001200241bc91084190ce001035200328020c21012000200328020836020020002001360204200341106a24000b2201017f1034220242001000200010920136020c20002001370300200020023602080b910101037f230041106b220324002000109501210441a38e0841071042210510412200200110792000200210791092012101102320042001200520001052210010242000100721012003410036020c2003200036020420032001410276360208200341046a41db8208410b10be01103722001007412047044041db8208410b41908b0841101058000b200341106a240020000b7b01027f230041106b22032400200028020821042003410036020c200028020020044102742003410c6a4104107c450440200328020c21012000200441016a360208200141187420014180fe03714108747220014108764180fe0371200141187672721037200341106a24000f0b2001200241c0810841111058000b8f0101057f20001037210310c001104e210410c101104e210510c201109e0122061037200310372004103710bd01220710960145044020062004200510bd012203109601044041948408412b103b000b200310c001104e200720002001200210c301200210c3010f0b20062003200510bd012203109601450440200320002001200210c3010f0b41bf8408412b103b000b0a0041818d08410c10420b0a0041e98c08410b10420b0a0041f48c08410d10420bd10201047f230041306b2204240010c401109e01109501210641cc8b08411d10422107104122052000107920052003107d2001104110372200104c4200200010b50120022000104b20052000105a109201210010232006200020072005105221001024200010072101200441003602142004200036020c200420014102763602102004410c6a41db8208410b10be01220110072100200441286a41003a0000200441246a2000360200200420013602202004200036021c200441003602182004410036022c200441186a2004412c6a410441db8208410b10c501024020042d002f044020042d002c450d010b200441186a41db8208410b105d1a0b200441186a220010461a200010c6011a200010452100200428021c200428021846044020042d0028044041ccdf08410036020041d0df0841003a00000b200441306a240020000f0b41db8208410b41998008410e1058000b0a00418d8d08410d10420b2300200041086a20002802002001200210990104402003200441e68208410f1058000b0b3602017f017e230041106b22012400200142003703082000200141086a2200410841db8208410b107e20004108107f200141106a24000b13001053200010c801200010c901200110a6010b1b002000200110ca01109e01103845044041e085084129103b000b0b1300200041bc8c08410d1042220010d30120000b1300200041b08c08410c1042220010d30120000b170010cc01109c012000490440418986084112103b000b0b0a0041c98c08410d10420bb90101037f024010ce0122052003280208490d00200328020c220420054f0d00200420032802102206460d002005200220046a2202200520022005491b20011b2201200620012006491b22012004200120044b1b210510920121020340200420054604400240200641016b20014d044020032802042002108d010c010b2000200110cf012200106722042002108d012000200410af010b2003200136020c0520022000200410cf0110b001108d01200441016a21040c010b0b0b0b2b01027e1025220010d001109d01220154044041bc9008411a103b000b200020017d4280f52480a741016a0b1a00200041d98f0841161042220010d3012001200010a40120000b0a0041ef8f08411710420b1b002000200141ff0171410274418890086a280200109001108e010b980301097f230041306b2205240010ce0121012000419a8d0841121042220610d3012001200610a4010240200610b1014504402006106721000c010b200541086a200010d40110a5012000200110d50110672101200528020820014280a30510bf010240200010ce01220310d601220710b1014504402007106721010c010b2000200341016b220210d70110672000200210d8011067108a0121082000200210d901106721042000200210d70110672201105045044020042000200210d80110672004108c012001108b01108a011a0b10da0110672101200810500d00200410500d002005411c6a200010d40110a5012000200310d50110672103200528021c20034280a30510bf0121032000200210db0110672003108c01109101210220082004108c01109101210410dc0110672200200042808090bbbad6adf00d109301101c200720002002108c01200441a08d06109001108b01220020012000200110880141ff01714101461b220110a1010b2001108c012200200042808090bbbad6adf00d109301101b2006200010a1010b200541306a240020000b4601017f230041106b220224002002200041187420004180fe03714108747220004108764180fe03712000411876727236020c20012002410c6a4104108601200241106a24000b1300200041978f08410b1042220010d30120000b1a00200041b28f0841121042220010d3012001200010a40120000b1a00200041b98d0841131042220010d3012001200010a40120000b1a00200041f98d0841141042220010d3012001200010a40120000b1a002000418d8e0841161042220010d3012001200010a40120000b1a00200041e28d0841171042220010d3012001200010a40120000b0a0041cc8d08411610420b1a00200041ac8d08410d1042220010d3012001200010a40120000b0a0041ca8508410510420b0a0010da01200010af010b0a0010df01200010af010b0a0041c68508410410420b0a0010dc01200010af010ba605020c7f017e230041306b2203240010e201200010cb01416b2107024041d8df082d000022040440416b41ffffffff0720041b21070c010b41d8df0841013a0000416b10260b4101210802402007106f410146044020071007210d200341206a210e4100210403402004210b200541106a2206200d4b0d02200e42003703002003420037031820072005200341186a2205411010721a200341003602004101210420082005200310732109200520031074210f200341186a20031073210a20062105410021080d000b1036000b4184810841221002000b02400240024002400240200f5004401053220b200010c80120012002492206450d0110ce0120014f0d02200220016b220c108f01210410342205200a2004101b20091037200510334280f52410bf0110e301106710e401450d030240200010d401220810b101450440200341186a200810a501200341106a200341286a2802002204200220022004491b3602002003200328022422042001200120044b1b360224200341086a200341206a29020037030020032003290218220f370300200fa721040c010b2009103721041092012107200320023602102003200136020c2003200136020820032007360204200320043602000b200920041038450d04200041012003200310cd012002200120061b2102034020012002460d062000200110d5012204106722062005108d012004200610af012000200110cf012204106722062005108d012004200610af01200141016a21010c000b000b419b8908411d103b000b41f888084114103b000b41aa90084112103b000b41be8808410f103b000b418c8908410f103b000b200c108f0121001034220120052000101c200a200a2001106a2003200a3602242003420037031820032009360220200b200341186a104f2008200310aa01200341306a24000b130010ed011069044041ba8b084112103b000b0b0a0041c48f08411510420b10002000200110880141ff01714102490b1b002000103a45044041ee8a08411e103b000b10e601200010a9010b0a0041da8e08411410420b8a0101047f230041106b220324002001280204220241046a220420012802084b047f41000520012802002003410036020c28020020022003410c6a4104107c1a200328020c210220012004360204200241187420024180fe03714108747220024108764180fe037120024118767272210241010b21012000200236020420002001360200200341106a24000b2e01027f200110372102200110372203418c8b08410410101a2000200336020420002001360200200020023602080b2701017f230041106b22022400200220003a000f20012002410f6a4101108601200241106a24000b7801017f230041106b220224002002200042388620004280fe0383422886842000428080fc0783421886200042808080f80f834208868484200042088842808080f80f832000421888428080fc07838420004228884280fe038320004238888484843703082001200241086a410810ba01200241106a24000b3a01017f230041106b22032400200341086a20014108200210ee01200328020c21012000200328020836020020002001360204200341106a24000b0a0010ed01200010a6010b0a0041d68c08411310420b3b01017f230041106b22042400200441086a41002003200120021035200428020c21012000200428020836020020002001360204200441106a24000b1d00024020001096014504402000103a0d010b418e8c084112103b000b0b13002000102745044041a08c084110103b000b0b1300200041e0880841061042220010d30120000b1f00200141aa8e08410b1042220110d3012002200110a4012000200110e8010b0a0041b58e08411110420b1f00200141c68e0841141042220110d3012002200110a4012000200110e8010b1a00200041ee8e08410e1042220010d3012001200010b50120000b1a00200041fc8e0841101042220010d3012001200010b50120000b21002000418c8f0841041042220010d3012001200010b5012002200010a40120000b0a0041908f08410710420b0a0041a28f08411010420b8a02020a7f017e1028410a106341001060410110602106410210602107410341b88508410e105f2100410441a98508410f105f21014105419385084116105f4106418085084113105f2102410741ea84084116105f410810572103410910572104200010ef01200110ef01200210ef01200310f001200410f00110c201200010a90110c401200110a90110f301200210a90110e50110c101200310a00110c001200410a001103910dd01200610e001200710de0110f901421a10ae011034220042e807100010342201420a10001034220220014106108f01102920002002108c01210010e301200010af011025210a10d001200a200a4280b4caae067d4280f524827d10ae01410110ec010b08001028410010630b4002027f017e1028105641011063410041d08608410d105f210110cc01109c01210010cc01200041016a2200ad220210ae01200010ca01200110a9012002102a0b2401027f10281056410210634100105e410141dd86084109105f210110ca01200110a9010b11001028410110634100105e410010c7010b11001028410110634100105e410110c7010b11001028410110634100105e10c90110680b2001017f1028105641011063410041d8880841081061210010f901200010ad010b1a01017f102810564101106341001060210010e301200010af010b900101057f410510634100105e2100410141ee8808410a10612101410241e68808410810612102410310602103410441e088084106105f21040240200010d40110b101044010f901109c01200220016b4b0d0120002001200210e1012000200110d601200310af01200010f101200410a901200010c901410110a6010f0b41b889084121103b000b41d989084114103b000ba30101057f230041206b22002400410310634100105e2102410141ee8808410a10612103410241e68808410810612104024002400240200210d401220110b1014504402000410c6a200110a50110ce01200028021c22014f0d0120012003490d02200028021820044b0d0320022003200410e101200041206a24000f0b41928a084122103b000b41ed89084115103b000b41aa90084112103b000b41828a084110103b000b17001028105641011063410041ea84084116105f10e5010ba80201087f230041306b2200240010281056410210634100105e2102410141ee8808410a10612103200210cb012000410c6a2205200210d401220610a501024010ce012204200028021c2201490440200120034d200028021820034f720d01200320044d0d01200241012001200510cd01410021051092012107200028021c21042003210103402005200120044b7245044020072002200110cf0110b001108d012002200110d50110a201200120044f2105200120012004496a21010c010b0b1055200028020c103721022000200736022c2000420037032020002002360228200041206a104f0240200320002802184704402000200336021c20062000410c6a10aa010c010b200610a2010b200041306a24000f0b41d78a084117103b000b41aa90084112103b000be50302077f017e230041e0006b220024001028410110634100105e210210e2012000411c6a2201200210d401220310a501200310a20110ce01200028022c4f0440200241012000200110cd0102402000280220220510500d00200028021c210610e601109e01109501210241b48a08410f1042210410412101104121032000200536023c20002006360238200042003703302003200041306a1051200020023602402000427f37033820002001360234200020043602302000109201220536024802400240024002402003106f0e020200010b200041d0006a2003109401027f2000290350500440200041086a200420012000280258200028025c107a200028020c210120002802080c010b1054200041106a200420012002200041d0006a107820002802142101210220002802100b210410920121050c010b10542102200020042001200041406b2003106c20002903382107200028020421012000280200210410920121052007427f520d010b102321070b200720022005200420011052210210244100210420021007210320004100360238200020023602302000200341027622013602340340200120044d0d01200041306a41db8208410b10be011a20002802342101200028023821040c000b000b200041e0006a24000f0b41c38a084114103b000b110010281056410110634100106010dd010b2d01027f10281056410210634100105e2100410110602101200010cb01200010ce0141016a10d601200110af010b110010281056410110634100106010e0010b110010281056410110634100106010de010b8e0202037f017e230041206b2200240010281065410010642000410036020c2000410c6a2102104121010340200228020041d4df082802004804402001200241cd8808410b1059105a0c010b0b200028020c1062200110072102200041003602142000200241027622023602102000200136020c4100210102400340200120024904402000410c6a41a08b08410810be0121012000420037031820011007220241094f0d022000200041186a200210eb0120014100200028020022012000280204220210721a20012002107f22034280808080105a0d022003a7220110cb01200110d2011a20002802102102200028021421010c010b0b200041206a24000f0b41a08b08410841998008410e1058000b1a01017f1028410110634100105e220010cb01200010d20110160bc114020e7f037e230041a0016b2200240010281065410310644100105e2105410110602108027f230041206b2201240002400240024041021012450440410321020c010b410210572204100721022001411c6a41003a0000200141186a200236020020012004360214200120023602102001410036020c41032102024002402001410c6a41a38708410a105d41ff01710e020100040b2001410c6a41a38708410a105d220241ff017141034f0d030b2001280210200128020c470d0120012d001c450d0041ccdf08410036020041d0df0841003a00000b200141206a240020020c020b41a38708410a41998008410e1058000b41a38708410a41a78008410d1058000b210a20004103360234200041ec006a2102410021040240200041346a2207220128020041d4df082802004e0440410121040c010b2001418d87084116105921032001418d87084116105b10572201100741c000460d00418d8708411641908b0841101058000b20022001360208200220033602042002200436020020002802341062200028026c2106200028027021022000280274210910e201200510cb0110ce0121042007200510d401220b10a5010240024002400240024002400240200028024420044b0440200041c8006a2005200410f20120001053220736025410f8012201200710b301109d01220e500440200110b201109d01210e2001200710b301200e42017c220e10ae012001200e10b4012007103d200e500d02200110b201200e10ae010b2000280250200e10b9010d06200041e8006a22032005200410f40102402000280270200e10b9010d00200510c9011069450d0320060d04411e1041220110a401200141d69008411e10101a2005200110d3012004200110a4012001200710041a200020021007220641187420064180fe03714108747220064108764180fe03712006411876727236026820012003410410101a2001200210041a200510f101109e0120012009102b1a20021007410b4f0d052005200e2005200e10f6012206109c01220110f701200041286a103e200020002d002c3a006c2000200028022836026820022003104a2004200310ab01200028026820002d006c10ac012006200141016a10ad0120014114490d002005200e2005200e10f5012201109c01220210f70110a2012001200241016a10ad010b200541012000200041346a10cd01200041c8006a200e10b801200510d20121062005200410d50110672109102c210f103c109f01450d0541a09008410a10422201200710041a103c109e0120014167102d416710372201107b450440200110072102200041f8006a41003a0000200041f4006a2002360200200020013602702000200236026c2000410036026820004188016a2201200041e8006a220310810102402000280288010d00200028028c0110342202102e1a20004200370388012003200141081082010d0020014108107f2110200120031081012000280288010d00200028028c0110472101200028026c2000280268470d0020002d0078044041ccdf08410036020041d0df0841003a00000b0240200f2010510d00200110870141ff01714101470d00200110332103200f2010580d00200f20107d109301210c1034220d2003200c101c20022002200d10180b20002001360274200020023602702000200f3703680c090b20002d0078044041ccdf08410036020041d0df0841003a00000b41cb8008412a103b000b200041e8006a200f10bc010c070b41b98708412e103b000b41d98308410b1002000b41cf85084111103b000b41f68708411f103b000b41ea8608410f103b000b200041e8006a200f10bc010c010b41e78708410f103b000b024020002802702201106b41ff017141014d044010920121030c010b103422032001102f0b20092003108c012006108b01210220002802341037210102400240024002400240200a41ff0171410346044010df01106721072005200410cf011067200210880141ff017141ff01470d0220081050450d032005200410d8012206106722082003108d012006200810af01200120072002108c01108e0142901c10bf0121032005200410db012201106722072003108d012001200710af01200041e8006a22032005200441016a10f4012003200e10b8010c010b2005200410cf0122061067220920022002200910880141ff01714101461b22091033200a10d1012202200810e401450d0320061067220820082002106a2006200810af012005200410d7012206106722082003108d012006200810af012003200a10d10121032005200410d9012206106722082003108d012006200810af0120011037200942901c10bf0121032005200410db012204106722062003108d012004200610af014207210f024002400240200a41ff017141016b0e020100020b420e210f0b200020023602644200210e2000420037035820002001360260200710372107200210500d01102c210e10f301109e01109501210141b48008410a1042210310412204200e200f7c107d20042007107910412207200041d8006a1051200020013602782000427f3703702000200436026c20002003360268200010920122023602800102400240024002402007106f0e020200010b20004188016a2007109401027f200029038801500440200041186a20032004200028029001200028029401107a20002802182103200028021c0c010b1054200041206a20032004200120004188016a107820002802202103210120002802240b210410920121020c010b10542101200041106a20032004200041f8006a2007106c2000290370210e20002802142104200028021021031092012102200e427f520d010b1023210e0b200e2001200220032004105221011024200110072102200041003602900120002001360288012000200241027636028c0120004188016a41db8208410b10be01220210072101200041f8006a41003a0000200041f4006a2001360200200020023602702000200136026c20004100360268200041e8006a10462201100741044604402000410036029c01200141002000419c016a2202410410721a41feffffff0720012002410441d0830841041097011b21010b200041e8006a220210c601210e200210452102200028026c2000280268470d0520002d0078044041ccdf08410036020041d0df0841003a00000b200141feffffff07470d0141c38308410d1002000b200020023602644200210e20004200370358200020013602602007200041d8006a104f0b200b200041346a10aa01027f200a41ff01714103470440200210330c010b1092010b1041220441fd8b0841111042105a2004200041d4006a106e200510411037220510d3012005104b0240200a41ff0171220341034704404101200510e9012003410274419490086a2802002d0000200510e901200420051030200041086a103e200020002d000c3a006c200020002802083602682001200041e8006a2201104a200e200110ea01200220011048200028026820002d006c10430c010b4100200510e9012004200510300b200041a0016a24000f0b419588084116103b000b41ab88084113103b000b41be8808410f103b000b41db8208410b41998008410e1058000bd20101087f230041206b220024001028410210634100105e2101410141f9860841041061210210f801210410412103200041146a2001200210f4012000280218109c01210520002802142106410121010340200120054b45044020042006200110a301109d0110b4012207109f0104402007109e0121020b200320021079200141016a21010c010b0b2000200336021020002003100736021c200041003602182000200041106a3602140340200041086a200041146a10e70120002802080440200028020c10061a0c010b0b200041206a24000b6402047f017e230041106b22002400102841031063410041ad8708410c105f21014101105e2102410241f9860841041061210310f801200110b601220450047e420005200041046a2002200310f201200028020c200410b901ad0b1017200041106a24000b9e0101067f230041206b2200240010281065410110644100105e21042000410136020c02402000410c6a2203220128020041d4df082802004e0440410121020c010b200141fd86084110105b41fd86084110105c21010b20002001360204200020023602002000280204210520002802002101200028020c10622003200410d401220210a501200420012005200310cd012002200310aa01200041206a24000b850101027f230041306b22002400102841011063200041146a4100105e10d40110a501200041086a103e200020002d000c3a002c200020002802083602282000280214200041286a2201104a200028021820011048200028021c200110ab012000280220200110ab012000280224200110ab01200028022820002d002c1043200041306a24000b1b001028410210634100105e410141f986084104106110d50110660b1b001028410210634100105e410141f986084104106110cf0110660b990202077f017e230041206b220024001028410210634100105e2102410141e686084104105f2101200210cb01104121050240024010f801200110b6012207500d002002200710f501109c0121062002200710f601109c0121010340200120064d0d012000410c6a220320022007200141016b220110f701104d2003108301200310840121032000280210200028020c470d0220002d001c044041ccdf08410036020041d0df0841003a00000b104110372204104c2003200410a40120052004105a0c000b000b20002005360208200020051007360214200041003602102000200041086a36020c034020002000410c6a10e70120002802000440200028020410061a0c010b0b200041206a24000f0b41998008410e108501000b5001047f1028410210634100105e2100410141808408410a105f2102105321011055210302402001200010ca01109e0110380d002001200310380d00419b86084135103b000b200010f101200210a9010b0e0010284100106310ce01ad102a0b7302027f017e230041106b22002400102841011063410041f9860841041061210110d001109d012000103e200020002d00043a000c200020002802003602082001ad4280f5247e7c2202200041086a220110ea01200242fff4247c200110ea01200028020820002d000c1043200041106a24000b100010284100106310d001109d01102a0b16001028105641011063410041c18008410a105f10390b1000102841001063103c109e0110061a0b0f001028105641001063410110ec010b0f001028105641001063410010ec010b0d0010284100106310ed0110680b02000b0b0041a89108410e1002000b0bb2110300418080080ba303726563697069656e742061646472657373206e6f7420736574696e70757420746f6f206c6f6e67696e76616c69642076616c75656c6f636b546f6b656e7300010273635f616464726573734661696c6564206465636f64696e6720726573756c742066726f6d20656e6572677920666163746f7279496e76616c69642061646472657373696e636f7272656374206e756d626572206f662045534454207472616e7366657273617267756d656e74206465636f6465206572726f722028293a20746f6f2066657720617267756d656e7473746f6f206d616e7920617267756d656e747377726f6e67206e756d626572206f6620617267756d656e747363616e6e6f74207375627472616374206265636175736520726573756c7420776f756c64206265206e656761746976654d756c7469455344544e46545472616e73666572455344544e46545472616e73666572455344545472616e7366657273796e6320726573756c74696e70757420746f6f2073686f72746361737420746f20693634206572726f724d616e6167656456656320696e646578206f7574206f662072616e67650041c383080bf30d4553445420657870656374656445474c442e6974656d4944204f766572666c6f772e696e64657873746f72616765206465636f6465206572726f723a206e65775f7369676e657270726f6a6563745f6964496e76616c6964205745474c442d55534443207061697220616464726573732066726f6d20726f75746572496e76616c696420544f4b454e2d55534443207061697220616464726573732066726f6d20726f75746572666565735f636f6c6c6563746f725f6164647265737373696d706c655f6c6f636b5f61646472657373656e657267795f666163746f72795f61646472657373736166655f70726963655f70616972726f757465725f6164647265737362657461616c70686150726f6a656374206973207061757365644f6e6c792070726f6a656374206f776e6572206d61792063616c6c207468697320656e64706f696e74496e76616c69642070726f6a6563742049444f6e6c79207363206f776e6572206f722070726f6a656374206f776e6572206d61792063616c6c207468697320656e64706f696e7470726f6a6563745f6f776e65726e65775f6f776e6572757365724c656e67746820746f6f206c6f6e677765656b6f70745f6d61785f6e725f7765656b736f70745f6e6f74655f616e645f7369676e6174757265636c61696d5f74797065757365725f616464726573734d6179206e6f7420636c61696d207265776172647320666f7220746869732070726f6a65637420616e796d6f7265416c726561647920636c61696d65644d7573742070726f76696465206e6f746520616e64207369676e617475726543616e20636c61696d2066756c6c2072657761726473496e76616c6964206d696e2072657761726473546f6f20666577207265776172647370726f6a6563745f6964736e725f7765656b737369676e6572656e645f7765656b73746172745f7765656b496e76616c6964207765656b206e756d62657273496e76616c6964207061796d656e744f6e6c792066756e6769626c6520746f6b656e73206163636570746564496e697469616c207265776172647320616c7265616479206465706f7369746564546f6f2066657720726577617264207765656b7350726f6a65637420616c726561647920656e646564496e76616c696420656e64207765656b4d757374206465706f73697420696e697469616c20726577617264732066697273746465706f7369745377617046656573456e64207765656b206e6f74207265616368656443616e6e6f7420776974686472617720616e796d6f7265496e76616c6964206665657320636f6c6c6563746f7220616464726573732e6c656e626164206172726179206c656e6774687661722061726773696e707574206f7574206f662072616e6765436f6e747261637420697320706175736564676574536166655072696365427954696d657374616d704f6666736574656e65726779466163746f727941646472657373636c61696d526577617264734576656e74496e76616c69642053432061646472657373496e76616c696420746f6b656e20494470726f6a6563744f776e657270726f6a6563744163746976656c61737450726f6a656374496470617573655f6d6f64756c653a70617573656475736463546f6b656e4964726f75746572416464726573737765676c64546f6b656e496473616665507269636550616972746f74616c456e65726779466f725765656b726567526577446f6c6c617273726577446f6c6c617273506572456e657267796d696e526577446f6c6c617273506572456e65726779696e74456e65726779466f72526577436c61696d657273726567456e65726779526577436c61696d657273726567456e657267794578656d70436c61696d6572736765745061697275736572436c61696d656473696d706c654c6f636b416464726573736578656d707465645061727469636970616e747366656573436f6c6c6563746f724164647265737366697273744e6f7465496e64657863757272656e744e6f7465496e6465786e6f74657573657249647372657761726473496e666f6d696e52657761726473506572696f6472657761726473546f74616c416d6f756e746d696e5765656b6c795265776172647356616c75657265776172647352656d61696e696e67416d6f756e7466697273745765656b537461727454696d657374616d700000a861000050c30000a08601003e0002003f0002004000020075736572456e65726779496e76616c6964207374617274207765656b5765656b2030206973206e6f7420612076616c6964207765656b7845786368616e676547726f77746856315461736b436f6d706c65746564456e64706f696e742063616e206f6e6c792062652063616c6c6564206279206f776e6572616464724964616464726c617374496470616e6963206f636375727265640041b891080b049cffffff" + "size": 21390, + "code": "0061736d0100000001a8011b60000060017f017f60027f7f0060027f7f017f6000017f60017f0060037f7f7f0060037f7f7f017f60047f7f7f7f0060027f7e0060057f7f7f7f7f0060047f7f7f7f017f60027f7e017f60017f017e6000017e60027f7f017e60017e0060017e017f60027e7f0060057f7f7e7f7f017f60067e7f7f7f7f7f017f60057e7f7f7f7f017f60047f7f7f7e0060047f7e7f7f0060037f7f7e017f60047f7f7f7e017f60037f7e7f017f02bb093303656e760e626967496e74536574496e743634000903656e7609626967496e74416464000603656e760b7369676e616c4572726f72000203656e760a6d4275666665724e6577000403656e760d6d427566666572417070656e64000303656e76096d4275666665724571000303656e760d6d42756666657246696e697368000103656e76106d4275666665724765744c656e677468000103656e76226d616e616765644d756c74695472616e73666572455344544e465445786563757465001303656e761b6d616e61676564457865637574654f6e44657374436f6e74657874001403656e760d6d616e6167656443616c6c6572000503656e76106d616e61676564534341646472657373000503656e76136d616e616765644f776e657241646472657373000503656e760f6d4275666665724765744279746573000303656e760f6973536d617274436f6e7472616374000103656e76126d427566666572476574417267756d656e74000303656e76126d427566666572417070656e644279746573000703656e76126d616e616765645369676e616c4572726f72000503656e7611676574417267756d656e744c656e677468000103656e761b736d616c6c496e74476574556e7369676e6564417267756d656e74000d03656e7619626967496e74476574556e7369676e6564417267756d656e74000203656e760f6765744e756d417267756d656e7473000403656e7614626967496e7446696e697368556e7369676e6564000503656e7614736d616c6c496e7446696e6973685369676e6564001003656e7609626967496e74537562000603656e7609626967496e74436d70000303656e760f6d4275666665725365744279746573000703656e760a626967496e7454446976000603656e7609626967496e744d756c000603656e76196d42756666657246726f6d426967496e74556e7369676e6564000303656e76176d427566666572546f426967496e74556e7369676e6564000303656e7609626967496e74506f77000603656e760a626967496e7453717274000203656e76146d427566666572436f707942797465536c696365000b03656e76126d42756666657253746f726167654c6f6164000303656e76136d42756666657253746f7261676553746f7265000303656e760a6765744761734c656674000e03656e760f636c65616e52657475726e44617461000003656e7611676574426c6f636b54696d657374616d70000e03656e761c6d616e616765644765744d756c74694553445443616c6c56616c7565000503656e761776616c6964617465546f6b656e4964656e746966696572000103656e760e636865636b4e6f5061796d656e74000003656e7616736d616c6c496e7446696e697368556e7369676e6564001003656e761d6d42756666657253746f726167654c6f616446726f6d41646472657373000603656e76146d616e6167656456657269667945643235353139000703656e760d676574426c6f636b45706f6368000e03656e76156d427566666572546f426967496e745369676e6564000303656e7609626967496e74416273000203656e760f6d616e6167656457726974654c6f67000203656e760a626967496e745369676e000103656e76136d42756666657247657442797465536c696365000b03f801f60101040a0004110901030501020402050208040302030101010201020202020102010215040404000108070207070701070107050505000501050106010a060201090a0b030f0816080a020a010b090a0f08020701010206010302030303020101030c110101040201010b080b0605010d010102020602020503020202170602020902010101030c120f0c090c06060907071804040419040a0d0205020104010804030301040301020303030304030405050405060004030504020202120605040108050501040604060c0c1a04040000000000000000000000000000000000000000000000000000000000000000000000000000000005030100030616037f01418080080b7f004185e1080b7f004190e1080b07dc062a066d656d6f7279020004696e697400810207757067726164650082020a61646450726f6a6563740083020f73657450726f6a6563744f776e65720084020c706175736550726f6a6563740085020e756e706175736550726f6a6563740086020f697350726f6a656374416374697665008702137365744d696e52657761726473506572696f64008802187365744d696e5765656b6c795265776172647356616c7565008902156465706f736974496e697469616c52657761726473008a02186465706f7369744164646974696f6e616c52657761726473008b021773657446656573436f6c6c6563746f7241646472657373008c02146f776e6572576974686472617752657761726473008d020d66696e69736850726f6772616d008e021c7365744d696e526577617264446f6c6c617273506572456e65726779008f0215736574496e697469616c5264706546726f6d417072009002217365744e6578745765656b526577617264446f6c6c617273506572456e6572677900910208736574416c70686100920207736574426574610093021c736574546f74616c456e65726779466f7243757272656e745765656b0094021c676574546f74616c456e65726779466f7243757272656e745765656b0095020c636c61696d52657761726473009602176765744578656d707465645061727469636970616e74730097020e67657455736572436c61696d65640098020d757064617465526577617264730099020e67657452657761726473496e666f009a021567657452657761726473546f74616c416d6f756e74009b02196765745265776172647352656d61696e696e67416d6f756e74009c020f6765744e6f746573486973746f7279009d020c6368616e67655369676e6572009e020e67657443757272656e745765656b009f021e67657454696d657374616d70735374617274416e64456e644f665765656b00a0021a67657446697273745765656b537461727454696d657374616d7000a10217736574456e65726779466163746f72794164647265737300a20217676574456e65726779466163746f72794164647265737300a30205706175736500a40207756e706175736500a50208697350617573656400a6020863616c6c4261636b00a7020a5f5f646174615f656e6403010b5f5f686561705f6261736503020ae18001f6011601017f1034220142001000200120012000100120010b1901017f41c4920841c4920828020041016b220036020020000b2e000240200120024d0440200220044d0d011036000b1036000b2000200220016b3602042000200120036a3602000b060010a802000b0e01017f10342200420a100020000b0e01017f103422012000103920010b19002001420053044041f5820841111002000b2000200110000b0f01017f10032201200010041a20010b0b0020002001100541004a0b19002000103d45044041f58008410f103e000b103f200010400b1400200041e5e008100d1a41e5e008100e41004a0b0900200020011002000b0a0041ca8c08411410450b09002000200110a8010b6c01027f230041106b220124002000027f41dce0082d0000220245044041dce00841013a000041d8e0084100360200200141086a410010422001280208200128020c41b492084100104310440c010b41b49208410010450b360200200020024101733a0004200141106a24000b3e01017f230041106b22022400200241086a41c892084190ce00200110f401200228020c21012000200228020836020020002001360204200241106a24000bb50201067f200120034604402001220341104f04402000410020006b41037122046a210520040440200221010340200020012d00003a0000200141016a2101200041016a22002005490d000b0b2005200320046b2203417c7122066a21000240200220046a22044103710440200641004c0d012004410374220141187121072004417c71220841046a2102410020016b4118712109200828020021010340200520012007762002280200220120097472360200200241046a2102200541046a22052000490d000b0c010b200641004c0d0020042102034020052002280200360200200241046a2102200541046a22052000490d000b0b20034103712103200420066a21020b20030440200020036a21010340200020022d00003a0000200241016a2102200041016a22002001490d000b0b0f0b1036000b1301017f1034220041b492084100101a1a20000b1101017f1034220220002001101a1a20020b0b0020002001104710061a0b4901017f230041106b22022400200220013a000c20022000360208200241086a10a001200228020820022d000c044041d8e008410036020041dce00841003a00000b200241106a24000b080020001049104a0b7301047f230041106b220124002001410036020c20002001410c6a2202410441db8208410b108101200120002802082000280200220320024104108201a722021083012001280200410147044041db8208410b41e68208410f105b000b20012802042000200220036a360200200141106a24000b0d00200010342200101e1a20000b0a002000104c2001104d0b0f01017f103422012000101d1a20010bb40101037f230041106b22022400200220001007220341187420034180fe03714108747220034108764180fe03712003411876727236020c20012002410c6a410410bf010240024020012d000404402000100722044190ce0041d8e00828020022036b4b0d0120022003200320046a220110c0012000410020022802002002280204107f1a41d8e00820013602000c020b20012802002000108c010c010b200110a00120012802002000108c010b200241106a24000b0a002000104c2001104f0b5101027f230041106b22022400200220001007220341187420034180fe03714108747220034108764180fe03712003411876727236020c20012002410c6a410410890120012000108c01200241106a24000b3701017f20011051220210072101200041106a41003a00002000410c6a20013602002000200236020820002001360204200041003602000b0d0020001034220010221a20000b6902057f017e200128020c220410534504402001290300210710442105104421062001280208230041106b2201240010442103103a210220012004103336020c20012007370300200120023602082003200110542000200342002005200610081a200141106a24000b0b0c002000108a0141ff0171450bd20102027f017e230041106b2203240020032001280208220241187420024180fe03714108747220024108764180fe0371200241187672723602002003200128020c220241187420024180fe03714108747220024108764180fe03712002411876727236020c20032001290300220442388620044280fe0383422886842004428080fc0783421886200442808080f80f834208868484200442088842808080f80f832004421888428080fc07838420044228884280fe0383200442388884848437020420002003411010101a200341106a24000b1500200020012002200320041034220110091a20010b0c01017f10342200100a20000b0c01017f10342200100b20000b0c01017f10342200100c20000b150010581056103b04400f0b4180920841241002000b0d00200010342200100f1a20000b2e01017f41a681084117104522042000200110101a200441bd8108410310101a20042002200310101a20041011000b0c00200020012002105e105a0b4601017f230041106b220224002002200141187420014180fe03714108747220014108764180fe03712001411876727236020c20002002410c6a410410101a200241106a24000b2f01017f2000280200220341e0e0082802004e04402001200241c081084111105b000b2000200341016a36020020030b2501017e20001013220342ffffffff0f5804402003a70f0b2001200241998008410e105b000b3001017f230041106b22032400200341003a000f20002003410f6a41012001200210810120032d000f200341106a24000b2601017e2000101322014280808080105a0440418a8408410a41998008410e105b000b2001a70b1f002000105a2200100741204704402001200241f18b084110105b000b20000b0c00200010342200101420000b0a00200020012002105f0b1900200041e0e0082802004e04400f0b41d1810841121002000b1400101520004604400f0b41e3810841191002000b1900200041e0e0082802004c04400f0b41c0810841111002000b0b0041e0e00810153602000b08002000106a10160b080020001051104a0b09002000106cad10170b3001017e027f0240200010a2012201420158044041002001a741016b0d021a0c010b41898c084112108801000b41010b0b1f0020002001200210182000106e41ff017104400f0b41fc810841301002000b1500410241012000103122001b4100200041004e1b0b9f0202087f017e230041406a22052400200541206a41ac820841141070200528022021082005280224220620031071200410722103104422092003ad107320062009105d20041007210a200541306a210b410021030340200a200341106a2209490440200520082006200120021074200528020421012000200528020036020020002001360204200541406b240005200b42003703002005420037032820042003200541286a2207411010751a2005410036023c20072005413c6a220c107621032007200c1077210d200541286a2005413c6a10762107200541186a2008200620031078200541106a2005280218200528021c200d1079200541086a200528021020052802142007107a200528020c210620052802082108200921030c010b0b0b1800200120021045210120001044360204200020013602000b100010441a20002001280200103a105d0b0900200010074104760b3801017f230041106b2202240020024200370308200220014100200241086a10af01200020022802002002280204101a1a200241106a24000b900101037f230041106b2205240002402003107e0d0020022003107c200410072106410021030340200341046a220720064b0d012005410036020c200420032005410c6a4104107f1a2002200528020c220341187420034180fe03714108747220034108764180fe037120034118767272107c200721030c000b000b2000200236020420002001360200200541106a24000b0f00200020012003200210324100470b7201017f230041106b220224002002410036020c2002200020012802002200200041046a2200109d012002410c6a410420022802002002280204104320012000360200200228020c2100200241106a2400200041187420004180fe03714108747220004108764180fe0371200041187672720ba60102017e017f230041106b22032400200342003703082003200020012802002200200041086a2200109d01200341086a41082003280200200328020410432001200036020020032903082102200341106a2400200242388620024280fe0383422886842002428080fc0783421886200242808080f80f834208868484200242088842808080f80f832002421888428080fc07838420024228884280fe038320024238888484840b160020022003107c20002002360204200020013602000b17002002200310800120002002360204200020013602000b1b0010441a20022003104c105d20002002360204200020013602000b9c0101027f230041306b22052400200541286a41c08208410f1070200541206a2005280228200528022c20042802081078200541186a2005280220200528022420042903001079200541106a2005280218200528021c200428020c107a20052802102104200528021422062003107c200541086a20042006200120021074200528020c21012000200528020836020020002001360204200541306a24000b0d0010441a20002001103a105d0b7101017f230041206b22052400200541186a41cf8208410c1070200541106a2005280218200528021c20031078200541086a200528021020052802142004107a20052005280208200528020c200120021074200528020421012000200528020036020020002001360204200541206a24000b070020001007450b0c00200020012002200310750b1201017f104422022001107320002002105d0b1c002000200120022003200410ca012000200028020020026a3602000b3401017e02402001450d0003402001450d01200141016b210120003100002002420886842102200041016a21000c000b000b20020b1f0020012002200310032201102121022000200136020420002002453602000b930101037f230041106b220224002002410036020c024020012002410c6a220341041085012204450440200220012802082001280200220420034104108201a722031083012000027f20022802004101460440200020022802043602042001200320046a36020041000c010b2000410f36020441e682080b3602000c010b2000410f360204200020043602000b200241106a24000b3201017f41e682082103200041086a200028020020012002109e01047f41e68208052000200028020020026a36020041000b0b5501047f230041106b2201240020001087012102200141086a20002802082000280200220320021083012001280208410147044041e68208410f108801000b200128020c2000200220036a360200200141106a24000b5602017f017e230041106b220124002001410036020c200041086a20002802002001410c6a4104109e01044041e68208410f108801000b2000200028020041046a3602002001410c6a4104108201200141106a2400a70b1a01017f41ea83084116104522022000200110101a20021011000b0b0020002001200210101a0b09002000106e41016b0b1500417f200020011019220041004720004100481b0b09002000200110041a0b0c00200020002001100120000b0c00200020002001101b20000b0c00200020002001101c20000b0a0020002000200110010b11002000200041a08d06109201101b20000b0b0041722000ad100041720b0f00200020002001109201101c20000b0f00200020002001109501101c20000b0a0041722000103941720b1301017f1034220120004106109201101f20010b0e01017f103422012000102020010b0e01017f103422004200100020000b810102047f017e230041206b22022400200241106a42003703002002420037030820014100200241086a22034110107f2002410036021c20032002411c6a2204107621052003200410772106200241086a2002411c6a10762103044041868308411d1002000b2000200336020c2000200536020820002006370300200241206a24000b1900200041feffffff074604404180800841191002000b20000b5f01027f230041206b22012400200010074120460440200141186a4200370300200141106a4200370300200141086a420037030020014200370300200041002001412010751a2001412041a383084120109c0121020b200141206a240020020b5301027f2001200346047f4100210302402001450d00034020002d0000220420022d00002205460440200041016a2100200241016a2102200141016b22010d010c020b0b200420056b21030b20030541010b450b2f000240200220034d0440200341104b0d012000200320026b3602042000200120026a3602000f0b1036000b1036000bb30101037f230041106b22042400027f024020002d000845044020002802002205100722064190ce004b0d0141dce0082d00000d0141d8e008200636020041dce00841013a0000200441086a20061042200541002004280208200428020c107f1a200041013a00080b4101200120036a220041d8e0082802004b0d011a200420012000109f012002200320042802002004280204104341000c010b200041003a00082005200120022003107f0b200441106a24000b32000240200120024d044020024190ce004d0d011036000b1036000b2000200220016b3602042000200141c892086a3602000b5801027f230041106b2201240020002d0004200041003a00040440200141086a410041d8e008280200109f0120002802002001280208200128020c10101a41d8e008410036020041dce00841003a00000b200141106a24000b2201017e200010a20122014280808080105a044041998008410e108801000b2001a70b5f02027f017e230041106b22012400200142003703082000105122001007220241094f044041998008410e108801000b2001200141086a200210f00120004100200128020022002001280204220210751a20002002108201200141106a24000b1c002000105122001007412047044041f18b084110108801000b20000b0d002000416710221a416710070b7001027f230041106b2202240020021041200220022d00043a000c200220022802003602082001280200200241086a2203104d20012802042003104b2001280208200310a601200128020c200310a6012001280210200310a6012000200228020820022d000c10a701200241106a24000b4601017f230041106b220224002002200041187420004180fe03714108747220004108764180fe03712000411876727236020c20012002410c6a410410bf01200241106a24000b0d00200020012002104710231a0b09002000200110231a0b0b0020002001104c10231a0b1400416c41b492084100101a1a2000416c10231a0b1a002000103a220041d48308410510101a2001200010ac0120000b09002000200110da010ba60101057f230041206b220224002002410c6a220320011050200310860121012002410c6a108601104a2104200310870121032002410c6a10870121052002410c6a10870121062002280210200228020c4604402002411c6a2d0000044041d8e008410036020041dce00841003a00000b200020063602102000200536020c200020033602082000200436020420002001360200200241206a24000f0b41998008410e108801000b3901017f230041106b220224002002420037030820022001ad4101200241086a10af0120002002280200200228020410b001200241106a24000b900202047f017e2003200142388620014280fe0383422886842001428080fc0783421886200142808080f80f834208868484200142088842808080f80f832001421888428080fc0783842001423888220820014228884280fe03838484843700000240200150044041b4920821030c010b200204402001427f510440200341076a2103410121040c020b2008a7c022054107752106200541004821050b200641ff0171210603400240024020044108470440200320046a2d000022072006460d02200245200741077620054672450440200441016b220441094f0d020b200320046a2103410820046b21040c040b1036000b10a802000b200441016a21040c000b000b20002004360204200020033602000b0d00200020012002104510231a0b08002000200110400b0a0020002001ad10b3010b3801017f230041106b2202240020024200370308200220014100200241086a10af0120002002280200200228020410b001200241106a24000b09002000200110a9010b0d01017f2000106a200010aa010b0800200010a401450b13002000103a220041ae9208410610101a20000b1a002000103a220041aa9208410410101a20002001108c0120000b1a002000103a220041a49208410610101a2001200010ba0120000b7801017f230041106b220224002002200042388620004280fe0383422886842000428080fc0783421886200042808080f80f834208868484200042088842808080f80f832000421888428080fc07838420004228884280fe038320004238888484843703082001200241086a4108108901200241106a24000b0c002000200110b80110a2010b1a002000103a220041e48308410610101a2001200010ba0120000b5001037f20002802082203200110be014504402000280204220210a10121042000280200200441016a220010ab01200110b30120022000ad10b301200210a10121002003200110bc012000ad10b3010b0b0f002000200110bc0110a1014100470b800101027f230041106b220324000240024020002d000404404190ce0041d8e00828020022046b2002490d01200341086a2004200220046a220010c0012003280208200328020c20012002104341d8e00820003602000c020b20002802002001200210101a0c010b200010a00120002802002001200210101a0b200341106a24000b3f01017f230041106b22032400200341086a2001200241c892084190ce001035200328020c21012000200328020836020020002001360204200341106a24000b2201017f1034220242001000200010980136020c20002001370300200020023602080b910101037f230041106b220324002000109a01210441a08f08410710452105104422002001107c20002002107c1098012101102420042001200520001055210010252000100721012003410036020c2003200036020420032001410276360208200341046a41db8208410b10c301103a22001007412047044041db8208410b41f18b084110105b000b200341106a240020000b7b01027f230041106b22032400200028020821042003410036020c200028020020044102742003410c6a4104107f450440200328020c21012000200441016a360208200141187420014180fe03714108747220014108764180fe037120014118767272103a200341106a24000f0b2001200241c081084111105b000b8f0101057f2000103a210310c5011051210410c6011051210510c70110a3012206103a2003103a2004103a10c2012207109b0145044020062004200510c2012203109b01044041948408412b103e000b200310c5011051200720002001200210c801200210c8010f0b20062003200510c2012203109b01450440200320002001200210c8010f0b41bf8408412b103e000b0a0041e28d08410c10450b0a0041ca8d08410b10450b0a0041d58d08410d10450bd20201047f230041306b2204240010c90110a301109a01210641ad8c08411d10452107104422052000107c2005200310800120011044103a2200104f4200200010ba0120022000104e20052000105d109801210010242006200020072005105521001025200010072101200441003602142004200036020c200420014102763602102004410c6a41db8208410b10c301220110072100200441286a41003a0000200441246a2000360200200420013602202004200036021c200441003602182004410036022c200441186a2004412c6a410441db8208410b10ca01024020042d002f044020042d002c450d010b200441186a41db8208410b10601a0b200441186a220010491a200010cb011a200010482100200428021c200428021846044020042d0028044041d8e008410036020041dce00841003a00000b200441306a240020000f0b41db8208410b41998008410e105b000b0a0041ee8d08410d10450b2300200041086a200028020020012002109e0104402003200441e68208410f105b000b0b3802017f017e230041106b22012400200142003703082000200141086a2200410841db8208410b10810120004108108201200141106a24000b1800200010cd011056200010ce01200010cf01200110ae010b170010d00110a1012000490440418986084112103e000b0b2a01017f1058210202402000200110d10110a301103b0d0020002002103b0d00419b86084135103e000b0b13002000419d8d08410d1045220010da0120000b0a0041aa8d08410d10450b1300200041918d08410c1045220010da0120000bd90101047f024010d30122052003280208490d00200328020c220420054f0d00200420032802102206460d002005200220046a2202200520022005491b20011b2205200620052006491b22012004200120044b1b210710980121020340200420074604400240200520064f0440200328020420021090010c010b2000200110d4012204106a220520021090012004200510b4012000200110d5012204106a220520021090012004200510b4010b2003200136020c0520022000200410d40110b501109001200441016a21040c010b0b0b200010d601200310a5010b2b01027e1026220010d70110a201220154044041c89108411a103e000b200020017d4280f52480a741016a0b1a00200041d6900841161045220010da012001200010ac0120000b1a00200041af900841121045220010da012001200010ac0120000b1300200041949008410b1045220010da0120000b0a0041ec9008411710450b1b002000200141ff0171410274418491086a2802001093011091010bbc0301097f230041306b2204240010d3012101200041fb8d0841121045220510da012001200510ac010240200510b6014504402005106a21000c010b200441086a200010d60110ad012000200110d501106a2101200428020820014280a30510c40121090240200010d301220310db01220710b6014504402007106a21010c010b2000200341016b220210dc01106a2000200210dd01106a108d0121082000200210de01106a21062000200210dc01106a2201105345044020062000200210dd01106a2006108f012001108e01108d011a0b10df01106a2101200810530d00200610530d002004411c6a200010d60110ad012000200310d501106a2103200428021c20034280a30510c40121032000200210e001106a2003108f01109701210020082006108f011097012102200710e101106a42808090bbbad6adf00d10940142808090bbbad6adf00d1094012000108f01200241a08d06109301108e011037109601108e012200200120002001108b0141ff01714101461b220110a9010b20011037109601108f0121002005200942808090bbbad6adf00d10940142808090bbbad6adf00d1094012000108e01220010a9010b200441306a240020000b4601017f230041106b220224002002200041187420004180fe03714108747220004108764180fe03712000411876727236020c20012002410c6a4104108901200241106a24000b1a002000419a8e0841131045220010da012001200010ac0120000b1a00200041da8e0841141045220010da012001200010ac0120000b1a002000418a8f0841161045220010da012001200010ac0120000b1a00200041c38e0841171045220010da012001200010ac0120000b0a0041ad8e08411610450b1a002000418d8e08410d1045220010da012001200010ac0120000b0a0041ca8508410510450b0a0010df01200010b4010b0a0010e401200010b4010b0a0041c68508410410450b0a0010e101200010b4010bc305020c7f017e230041306b2203240010e701200010cd01416b2108024041e4e0082d000022050440416b41ffffffff0720051b21080c010b41e4e00841013a0000416b10270b4101210402402008107241014604404100210520081007210d200341206a210e034020092107200541106a220c200d4b0d02200e42003703002003420037031820082005200341186a2205411010751a20034100360200410121092004200520031076210a200520031077210f200341186a20031076210b200c2105410021040d000b1036000b4184810841221002000b024002400240024002400240200f50044010562209200010d10110a301103b044020012002492207450d0210d30120014f0d03200220016b220c109201210410342205200b2004101b200a103a200510334280a30510c40110e801106a10e901450d04200010d601220410b6010d05200341186a200410ad01200a2003280218103b450d06200341206a2204200428020022062001200120064b1b360200200341106a200341286a2802002206200220022006491b3602002003200328022422062001200120064b1b360224200341086a2004290200370300200320032902183703000c070b41e085084129103e000b41d08908411d103e000b41ad89084114103e000b41b691084112103e000b41f38808410f103e000b200a103a21041098012106200320023602102003200136020c2003200136020820032006360204200320043602000c010b41c18908410f103e000b200041012003200310d2012002200120071b2102034020012002464504402000200110d5012204106a220720051090012004200710b4012000200110d4012204106a220720051090012004200710b401200141016a21010c010b0b200c10920121001034220120052000101c200b200b2001106d2003200b360224200342003703182003200a3602202009200341186a1052200341306a24000b130010f201106c0440419b8c084112103e000b0b0a0041c19008411510450b100020002001108b0141ff01714102490b1b002000103d45044041cf8b08411e103e000b10eb01200010b1010b0a0041d78f08411410450b8a0101047f230041106b220324002001280204220241046a220420012802084b047f41000520012802002003410036020c28020020022003410c6a4104107f1a200328020c210220012004360204200241187420024180fe03714108747220024108764180fe037120024118767272210241010b21012000200236020420002001360200200341106a24000b2e01027f2001103a21022001103a220341ed8b08410410101a2000200336020420002001360200200020023602080b2701017f230041106b22022400200220003a000f20012002410f6a4101108901200241106a24000b7801017f230041106b220224002002200042388620004280fe0383422886842000428080fc0783421886200042808080f80f834208868484200042088842808080f80f832000421888428080fc07838420004228884280fe038320004238888484843703082001200241086a410810bf01200241106a24000b3a01017f230041106b22032400200341086a20014108200210f401200328020c21012000200328020836020020002001360204200341106a24000b0a0010f201200010ae010b0a0041b78d08411310450b0e002000108a0141ff01714101460b3b01017f230041106b22042400200441086a41002003200120021035200428020c21012000200428020836020020002001360204200441106a24000b1d0002402000109b014504402000103d0d010b41ef8c084112103e000b0b13002000102845044041818d084110103e000b0b130020004195890841061045220010da0120000b0a0041ee8e08411c10450b1f00200141a78f08410b1045220110da012002200110ac012000200110ed010b0a0041b28f08411110450b1f00200141c38f0841141045220110da012002200110ac012000200110ed010b1a00200041eb8f08410e1045220010da012001200010ba0120000b1a00200041f98f0841101045220010da012001200010ba0120000b210020004189900841041045220010da012001200010ba012002200010ac0120000b0a00418d9008410710450b0a00419f9008411010450bf201020a7f017e1029410a106641001063410110632106410210632107410341b88508410e10622100410441a98508410f1062210141054193850841161062410641808508411310622102410741ea8408411610624108105a21034109105a2104200010f501200110f501200210f501200310f601200410f60110c701200010b10110c901200110b10110fa01200210b10110ea0110c601200310a80110c501200410a801103c10e201200610e501200710e301108002421a10b30142e80710381037109601108f01210010e801200010b4011026210a10d701200a200a4280b4caae067d4280f524827d10b301410110f1010b08001029410010660b4002027f017e1029105941011066410041d08608410d1062210110d00110a101210010d001200041016a2200ad220210b301200010d101200110b1012002102a0b2d01027f1029105941021066410010612100410141dd8608410910622101200010cd01200010d101200110b1010b110010294101106641001061410010cc010b110010294101106641001061410110cc010b11001029410110664100106110cf01106b0b2001017f10291059410110664100418d8908410810642100108002200010b2010b1a01017f102910594101106641001063210010e801200010b4010ba30101047f41041066410010612100410141a38908410a106421024102419b890841081064210141034195890841061062210302400240200010d60110b601044010800210a101200120026b4b0d0120002002200110e60110f801106a220110f301450d022000200210db01200110b401200010f701200310b101200010cf01410110ae010f0b41ed89084121103e000b418e8a084114103e000b41a28a08412c103e000ba30101057f230041206b2200240041031066410010612102410141a38908410a106421034102419b8908410810642104024002400240200210d601220110b6014504402000410c6a200110ad0110d301200028021c22014f0d0120012003490d02200028021820044b0d0320022003200410e601200041206a24000f0b41f38a084122103e000b41ce8a084115103e000b41b691084112103e000b41e38a084110103e000b17001029105941011066410041ea84084116106210ea010ba80201087f230041306b220024001029105941021066410010612102410141a38908410a10642103200210cd012000410c6a2205200210d601220610ad01024010d3012204200028021c2201490440200120034d200028021820034b720d01200320044d0d01200241012001200510d201410021051098012107200028021c21042003210103402005200120044b7245044020072002200110d40110b5011090012002200110d50110aa01200120044f2105200120012004496a21010c010b0b1058200028020c103a21022000200736022c2000420037032020002002360228200041206a10520240200320002802184704402000200336021c20062000410c6a10a5010c010b200610aa010b200041306a24000f0b41b88b084117103e000b41b691084112103e000be50302077f017e230041e0006b2200240010294101106641001061210210e7012000411c6a2201200210d601220310ad0110d301200028022c4f0440200241012000200110d201200310aa0102402000280220220510530d00200028021c210610eb0110a301109a01210241958b08410f1045210410442101104421032000200536023c20002006360238200042003703302003200041306a1054200020023602402000427f3703382000200136023420002004360230200010980122053602480240024002400240200310720e020200010b200041d0006a2003109901027f2000290350500440200041086a200420012000280258200028025c107d200028020c210120002802080c010b1057200041106a200420012002200041d0006a107b20002802142101210220002802100b210410980121050c010b10572102200020042001200041406b2003106f20002903382107200028020421012000280200210410980121052007427f520d010b102421070b200720022005200420011055210210254100210420021007210320004100360238200020023602302000200341027622013602340340200120044d0d01200041306a41db8208410b10c3011a20002802342101200028023821040c000b000b200041e0006a24000f0b41a48b084114103e000b110010291059410110664100106310e2010b910101037f1029105941011066410010634280c8afa025103842808090bbbad6adf00d109401210041a69108411010452102103f10a30120024167102b4167103a200010334280a30510c401108f0142808090bbbad6adf00d10940142808090bbbad6adf00d109401103710960141a08d06109301413410930142a00b1094012000108f01108e01210010f801200010b4010b2d01027f1029105941021066410010612100410110632101200010cd01200010d30141016a10db01200110b4010b110010291059410110664100106310e5010b110010291059410110664100106310e3010b8f0202037f017e230041206b2200240010291068410010672000410036020c2000410c6a2102104421010340200228020041e0e0082802004804402001200241828908410b105c105d0c010b0b200028020c1065200110072102200041003602142000200241027622023602102000200136020c4100210102400340200120024904402000410c6a41818c08410810c30121012000420037031820011007220241094f0d022000200041186a200210f00120014100200028020022012000280204220210751a2001200210820122034280808080105a0d022003a7220110cd01200110d9011a20002802102102200028021421010c010b0b200041206a24000f0b41818c08410841998008410e105b000b1a01017f10294101106641001061220010cd01200010d90110160bdb14020d7f037e230041a0016b220024001029106841031067410010612105410110632108027f230041206b2201240002400240024041021012450440410321020c010b4102105a2203100721022001411c6a41003a0000200141186a200236020020012003360214200120023602102001410036020c41032102024002402001410c6a41af8708410a106041ff01710e020100040b2001410c6a41af8708410a1060220241ff017141034f0d030b2001280210200128020c470d0120012d001c450d0041d8e008410036020041dce00841003a00000b200141206a240020020c020b41af8708410a41998008410e105b000b41af8708410a41a78008410d105b000b210a20004103360234200041ec006a2102410021030240200041346a2206220128020041e0e0082802004e0440410121030c010b2001419987084116105c21042001419987084116105e105a2201100741c000460d0041998708411641f18b084110105b000b20022001360208200220043602042002200336020020002802341065200028026c2107200028027021032000280274210910e701200510cd0110d30121022006200510d60110ad0102400240024002400240024002400240200028023c20024d0440200220002802444f0d01200041c8006a2005200210f90120001056220636025410ff012201200610b80110a201220d500440200110b70110a201210d2001200610b801200d42017c220d10b3012001200d10b90120061040200d500d03200110b701200d10b3010b2000280250200d10be010d07200510cf01106c450d03200041e8006a22042005200210fb0102402000280270200d10be010d0020070d05411e1044220110ac01200141e29108411e10101a2005200110da012002200110ac012001200610041a200020031007220741187420074180fe03714108747220074108764180fe03712007411876727236026820012004410410101a2001200310041a200510f70110a30120012009102c1a20031007410b4f0d062005200d2005200d10fd01220710a101220110fe01200041286a1041200020002d002c3a006c2000200028022836026820032004104d2002200410a601200028026820002d006c10a7012007200141016a10b20120014114490d002005200d2005200d10fc01220110a101220310fe0110aa012001200341016a10b2010b200541012000200041346a10d201200041c8006a200d10bd01200510d90121072005200210d501106a2109102d210e103f10a401450d06419c9108410a10452201200610041a103f10a30120014167102b4167103a2201107e450440200110072103200041f8006a41003a0000200041f4006a2003360200200020013602702000200336026c2000410036026820004188016a2201200041e8006a220410840102402000280288010d00200028028c0110342203102e1a20004200370388012004200141081085010d0020014108108201210f200120041084012000280288010d00200028028c01104a2101200028026c2000280268470d0020002d0078044041d8e008410036020041dce00841003a00000b0240200e200f510d00200110f301450d00200110332104200e200f580d00200e200f7d109501210b1034220c2004200b101c20032003200c10180b20002001360274200020033602702000200e3703680c0a0b20002d0078044041d8e008410036020041dce00841003a00000b41cb8008412a103e000b200041e8006a200e10c1010c080b41c587084117103e000b41dc8708412e103e000b41d98308410b1002000b41cf85084111103e000b41998808411f103e000b41ea8608410f103e000b200041e8006a200e10c1010c010b418a8808410f103e000b024020002802702201106e41ff017141014d044010980121040c010b103422042001102f0b027f2007105304401098010c010b20092004108f012007108e010b21032000280234103a21010240024002400240027f0240200a41ff0171410346044010e401106a21062005200210d401106a2003108b0141ff017141ff01470d03200810530d0141ce88084113103e000b2005200210d4012207106a220910f301450d032009200320032009108b0141ff01714101461b22091033200a10d8012203200810e901450d042007106a220820082003106d2007200810b4012005200210dc012207106a220820041090012007200810b4012004200a10d80121042005200210de012207106a220820041090012007200810b4012001103a200942901c10c40121042005200210e0012202106a220720041090012002200710b4014207210e0240024002400240200a41ff017141016b0e020100020b420e210e0b200020033602644200210d20004200370358200020013602602006103a2102200310530d01102d210d10fa0110a301109a01210141b48008410a1045210610442203200d200e7c10800120032002107c10442202200041d8006a1054200020013602782000427f3703702000200336026c2000200636026820001098012204360280010240024002400240200210720e020200010b20004188016a2002109901027f200029038801500440200041186a20062003200028029001200028029401107d20002802182106200028021c0c010b1057200041206a20062003200120004188016a107b20002802202106210120002802240b210310980121040c010b10572101200041106a20062003200041f8006a2002106f2000290370210d20002802142103200028021021061098012104200d427f520d010b1024210d0b200d2001200420062003105521011025200110072102200041003602900120002001360288012000200241027636028c0120004188016a41db8208410b10c301220210072101200041f8006a41003a0000200041f4006a2001360200200020023602702000200136026c20004100360268200041e8006a10492201100741044604402000410036029c01200141002000419c016a2202410410751a41feffffff0720012002410441d083084104109c011b21010b200041e8006a220210cb01210d200210482103200028026c2000280268470d0720002d0078044041d8e008410036020041dce00841003a00000b200141feffffff07470d0141c38308410d1002000b200020033602644200210d20004200370358200020013602602006200041d8006a10520b200310330c010b2005200210dd012207106a220820041090012007200810b401200120062003108f0110910142901c10c40121042005200210e0012201106a220320041090012001200310b401200041e8006a22042005200241016a10fb012004200d10bd011098010b1044220441de8c0841111045105d2004200041d4006a107120051044103a220210da012002104e0240200a41ff0171220541034704404101200210ee012005410274419091086a2802002d0000200210ee01200420021030200041086a1041200020002d000c3a006c200020002802083602682001200041e8006a2201104d200d200110ef0120032001104b200028026820002d006c10460c010b4100200210ee012004200210300b200041a0016a24000f0b41b888084116103e000b41e188084112103e000b41f38808410f103e000b41db8208410b41998008410e105b000bd20101087f230041206b22002400102941021066410010612101410141f9860841041064210210ff01210410442103200041146a2001200210fb01200028021810a101210520002802142106410121010340200120054b45044020042006200110ab0110a20110b901220710a4010440200710a30121020b20032002107c200141016a21010c010b0b2000200336021020002003100736021c200041003602182000200041106a3602140340200041086a200041146a10ec0120002802080440200028020c10061a0c010b0b200041206a24000b6402047f017e230041106b22002400102941031066410041b98708410c10622101410110612102410241f9860841041064210310ff01200110bb01220450047e420005200041046a2002200310f901200028020c200410be01ad0b1017200041106a24000b950101057f230041206b2200240010291068410110674100106121032000410136020c02402000410c6a2204220128020041e0e0082802004e0440410121020c010b200141fd86084110105e41fd86084110105f21010b20002001360204200020023602002000280204210120002802002102200028020c10652004200310d60110ad01200320022001200410d201200041206a24000b850101027f230041306b22002400102941011066200041146a4100106110d60110ad01200041086a1041200020002d000c3a002c200020002802083602282000280214200041286a2201104d20002802182001104b200028021c200110a6012000280220200110a6012000280224200110a601200028022820002d002c1046200041306a24000b1b0010294102106641001061410141f986084104106410d50110690b1b0010294102106641001061410141f986084104106410d40110690b990202077f017e230041206b22002400102941021066410010612102410141e68608410410622101200210cd01104421050240024010ff01200110bb012207500d002002200710fc0110a10121062002200710fd0110a10121010340200120064d0d012000410c6a220320022007200141016b220110fe0110502003108601200310870121032000280210200028020c470d0220002d001c044041d8e008410036020041dce00841003a00000b1044103a2204104f2003200410ac0120052004105d0c000b000b20002005360208200020051007360214200041003602102000200041086a36020c034020002000410c6a10ec0120002802000440200028020410061a0c010b0b200041206a24000f0b41998008410e108801000b2d01027f102941021066410010612100410141808408410a106221011056200010ce01200010f701200110b1010b0e0010294100106610d301ad102a0b830102027f017e230041106b22002400102941011066410041f98608410410642201450440418d8708410c103e000b10d70110a20120001041200020002d00043a000c200020002802003602082001ad4280f5247e7c22024280f5247d200041086a220110ef01200242017d200110ef01200028020820002d000c1046200041106a24000b100010294100106610d70110a201102a0b16001029105941011066410041c18008410a1062103c0b1000102941001066103f10a30110061a0b0f001029105941001066410110f1010b0f001029105941001066410010f1010b0d0010294100106610f201106b0b02000b0b0041b49208410e1002000b0bbe120300418080080ba303726563697069656e742061646472657373206e6f7420736574696e70757420746f6f206c6f6e67696e76616c69642076616c75656c6f636b546f6b656e7300010273635f616464726573734661696c6564206465636f64696e6720726573756c742066726f6d20656e6572677920666163746f7279496e76616c69642061646472657373696e636f7272656374206e756d626572206f662045534454207472616e7366657273617267756d656e74206465636f6465206572726f722028293a20746f6f2066657720617267756d656e7473746f6f206d616e7920617267756d656e747377726f6e67206e756d626572206f6620617267756d656e747363616e6e6f74207375627472616374206265636175736520726573756c7420776f756c64206265206e656761746976654d756c7469455344544e46545472616e73666572455344544e46545472616e73666572455344545472616e7366657273796e6320726573756c74696e70757420746f6f2073686f72746361737420746f20693634206572726f724d616e6167656456656320696e646578206f7574206f662072616e67650041c383080bff0e4553445420657870656374656445474c442e6974656d4944204f766572666c6f772e696e64657873746f72616765206465636f6465206572726f723a206e65775f7369676e657270726f6a6563745f6964496e76616c6964205745474c442d55534443207061697220616464726573732066726f6d20726f75746572496e76616c696420544f4b454e2d55534443207061697220616464726573732066726f6d20726f75746572666565735f636f6c6c6563746f725f6164647265737373696d706c655f6c6f636b5f61646472657373656e657267795f666163746f72795f61646472657373736166655f70726963655f70616972726f757465725f6164647265737362657461616c70686150726f6a656374206973207061757365644f6e6c792070726f6a656374206f776e6572206d61792063616c6c207468697320656e64706f696e74496e76616c69642070726f6a6563742049444f6e6c79207363206f776e6572206f722070726f6a656374206f776e6572206d61792063616c6c207468697320656e64706f696e7470726f6a6563745f6f776e65726e65775f6f776e6572757365724c656e67746820746f6f206c6f6e677765656b6f70745f6d61785f6e725f7765656b73496e76616c6964207765656b6f70745f6e6f74655f616e645f7369676e6174757265636c61696d5f74797065757365725f6164647265737350726f6a656374206e6f742073746172746564207965744d6179206e6f7420636c61696d207265776172647320666f7220746869732070726f6a65637420616e796d6f7265416c726561647920636c61696d65644d7573742070726f76696465206e6f746520616e64207369676e617475726543616e20636c61696d2066756c6c2072657761726473496e76616c6964206d696e20726577617264734e6f7420656e6f7567682072657761726473546f6f20666577207265776172647370726f6a6563745f6964736e725f7765656b737369676e6572656e645f7765656b73746172745f7765656b496e76616c6964207765656b206e756d62657273496e76616c6964207061796d656e744f6e6c792066756e6769626c6520746f6b656e73206163636570746564496e697469616c207265776172647320616c7265616479206465706f7369746564546f6f2066657720726577617264207765656b734669727374207765656b207265776172647320646f6c6c61722070657220656e65726779206e6f742073657450726f6a65637420616c726561647920656e646564496e76616c696420656e64207765656b4d757374206465706f73697420696e697469616c20726577617264732066697273746465706f7369745377617046656573456e64207765656b206e6f74207265616368656443616e6e6f7420776974686472617720616e796d6f7265496e76616c6964206665657320636f6c6c6563746f7220616464726573732e6c656e626164206172726179206c656e6774687661722061726773696e707574206f7574206f662072616e6765436f6e747261637420697320706175736564676574536166655072696365427954696d657374616d704f6666736574656e65726779466163746f727941646472657373636c61696d526577617264734576656e74496e76616c69642053432061646472657373496e76616c696420746f6b656e20494470726f6a6563744f776e657270726f6a6563744163746976656c61737450726f6a656374496470617573655f6d6f64756c653a70617573656475736463546f6b656e4964726f75746572416464726573737765676c64546f6b656e496473616665507269636550616972746f74616c456e65726779466f725765656b726567526577446f6c6c617273726577446f6c6c617273506572456e657267796d696e526577446f6c6c617273506572456e65726779696e74456e65726779466f72526577436c61696d657273726567456e65726779526577436c61696d65727366697273745765656b526577446f6c6c617273506572456e65726779726567456e657267794578656d70436c61696d6572736765745061697275736572436c61696d656473696d706c654c6f636b416464726573736578656d707465645061727469636970616e747366656573436f6c6c6563746f724164647265737366697273744e6f7465496e64657863757272656e744e6f7465496e6465786e6f74657573657249647372657761726473496e666f6d696e52657761726473506572696f6472657761726473546f74616c416d6f756e746d696e5765656b6c795265776172647356616c75657265776172647352656d61696e696e67416d6f756e7466697273745765656b537461727454696d657374616d7000a861000050c30000a08601003e0002003f0002004000020075736572456e65726779626173654173736574546f6b656e4964496e76616c6964207374617274207765656b5765656b2030206973206e6f7420612076616c6964207765656b7845786368616e676547726f77746856315461736b436f6d706c65746564456e64706f696e742063616e206f6e6c792062652063616c6c6564206279206f776e6572616464724964616464726c617374496470616e6963206f636375727265640041c492080b049cffffff" } diff --git a/growth-program/output/growth-program.wasm b/growth-program/output/growth-program.wasm index 92d9a46..6a5453b 100755 Binary files a/growth-program/output/growth-program.wasm and b/growth-program/output/growth-program.wasm differ diff --git a/growth-program/src/lib.rs b/growth-program/src/lib.rs index ee507ba..fc85f95 100644 --- a/growth-program/src/lib.rs +++ b/growth-program/src/lib.rs @@ -16,6 +16,7 @@ pub const MAX_PERCENTAGE: u32 = 100_000; pub const HOUR_IN_SECONDS: Timestamp = 60 * 60; pub const DAY_IN_SECONDS: Timestamp = 24 * 60 * 60; pub const WEEK_IN_SECONDS: Timestamp = 7 * DAY_IN_SECONDS; +pub const WEEKS_PER_YEAR: u32 = 52; pub const PRECISION: u64 = 1_000_000_000_000_000_000; pub static GROWTH_SIGNATURE_PREFIX: &[u8] = b"xExchangeGrowthV1TaskCompleted"; @@ -42,7 +43,10 @@ pub trait GrowthProgram: + multiversx_sc_modules::pause::PauseModule { /// Arguments: - /// min_reward_dollars_per_energy: Scaled to PRECISION const. + /// min_reward_dollars_per_energy is a value scaled to PRECISION*PRECISION. + /// For example, if the desired RDPE is that 10^18 units of energy give 10^{-15} dollars of rewards, + /// then we should provide the argument 10^{-15}*10^{-18}*PRECISION*PRECISION = 10^3. + /// /// alpha: Percentage, scaled to MAX_PERCENTAGE const. /// beta: Percentage, scaled to MAX_PERCENTAGE const. #[init] diff --git a/growth-program/src/price_query.rs b/growth-program/src/price_query.rs index 5e399e7..c205200 100644 --- a/growth-program/src/price_query.rs +++ b/growth-program/src/price_query.rs @@ -15,7 +15,7 @@ pub enum PairQueryResponse { #[multiversx_sc::module] pub trait PriceQueryModule { - fn get_dollar_value( + fn get_usdc_value( &self, token_id: TokenIdentifier, amount: BigUint, diff --git a/growth-program/src/project.rs b/growth-program/src/project.rs index 301cd61..d4cf9ae 100644 --- a/growth-program/src/project.rs +++ b/growth-program/src/project.rs @@ -19,6 +19,7 @@ pub trait ProjectsModule { #[only_owner] #[endpoint(setProjectOwner)] fn set_project_owner(&self, project_id: ProjectId, new_owner: ManagedAddress) { + self.require_valid_project_id(project_id); self.project_owner(project_id).set(new_owner); } @@ -33,8 +34,10 @@ pub trait ProjectsModule { } fn pause_common(&self, project_id: ProjectId, pause_status: bool) { + self.require_valid_project_id(project_id); + let caller = self.blockchain().get_caller(); - self.require_is_project_owner(&caller, project_id); + self.require_sc_owner_or_project_owner(&caller, project_id); self.project_active(project_id).set(pause_status); } diff --git a/growth-program/src/rewards/claim.rs b/growth-program/src/rewards/claim.rs index 2dc5241..cb0ef7b 100644 --- a/growth-program/src/rewards/claim.rs +++ b/growth-program/src/rewards/claim.rs @@ -42,6 +42,10 @@ pub trait ClaimRewardsModule: let current_week = self.get_current_week(); let info_mapper = self.rewards_info(project_id); let mut rewards_info = info_mapper.get(); + require!( + current_week >= rewards_info.start_week, + "Project not started yet" + ); require!( current_week < rewards_info.end_week, "May not claim rewards for this project anymore" @@ -69,7 +73,11 @@ pub trait ClaimRewardsModule: let total_rewards = self.rewards_total_amount(project_id, current_week).get(); let user_original_energy = self.get_energy_amount(&caller); - let rew_advertised = total_rewards * &user_original_energy / total_energy; + let rew_advertised = if total_energy != 0 { + total_rewards * &user_original_energy / total_energy + } else { + BigUint::zero() + }; let opt_rewards = match claim_type { ClaimType::Exemption => { let claim_exemption_args = ClaimExemptionArgs { @@ -103,8 +111,6 @@ pub trait ClaimRewardsModule: } }; - info_mapper.set(rewards_info); - let total_rewards = match &opt_rewards { OptionalValue::Some(payment) => payment.amount.clone(), OptionalValue::None => BigUint::zero(), @@ -148,6 +154,8 @@ pub trait ClaimRewardsModule: } fn check_signature(&self, args: CheckSignatureArgs) { + self.require_project_active(args.project_id); + if self .exempted_participants(args.project_id, args.current_week) .contains(&args.user_id) @@ -155,7 +163,6 @@ pub trait ClaimRewardsModule: return; } - self.require_project_active(args.project_id); require!( args.opt_note_and_signature.is_some(), "Must provide note and signature" @@ -200,7 +207,7 @@ pub trait ClaimRewardsModule: let rew_available = beta * args.rew_advertised / MAX_PERCENTAGE; let rew_available_dollar_value = - self.get_dollar_value(args.reward_token_id, rew_available, HOUR_IN_SECONDS); + self.get_usdc_value(args.reward_token_id, rew_available, HOUR_IN_SECONDS); self.registered_rewards_dollars(args.project_id, args.current_week) .update(|reg_rew_dollars| *reg_rew_dollars += rew_available_dollar_value); @@ -212,6 +219,7 @@ pub trait ClaimRewardsModule: fn claim_rewards_normal(&self, args: ClaimRewardsArgs) -> EsdtTokenPayment { let rem_rewards_mapper = self.rewards_remaining_amount(args.project_id, args.current_week); let remaining_rewards = rem_rewards_mapper.get(); + require!(remaining_rewards > 0, "Not enough rewards"); let rew_available = core::cmp::min(args.rew_advertised, remaining_rewards); let user_rewards = @@ -229,7 +237,7 @@ pub trait ClaimRewardsModule: .update(|int_energy| *int_energy += &user_adjusted_energy); let rew_available_dollar_value = - self.get_dollar_value(args.reward_token_id.clone(), rew_available, HOUR_IN_SECONDS); + self.get_usdc_value(args.reward_token_id.clone(), rew_available, HOUR_IN_SECONDS); self.registered_rewards_dollars(args.project_id, args.current_week) .update(|reg_rew_dollars| *reg_rew_dollars += rew_available_dollar_value); diff --git a/growth-program/src/rewards/common_rewards.rs b/growth-program/src/rewards/common_rewards.rs index 9652e12..e082ca4 100644 --- a/growth-program/src/rewards/common_rewards.rs +++ b/growth-program/src/rewards/common_rewards.rs @@ -14,6 +14,18 @@ pub struct RewardsInfo { pub end_week: Week, } +impl RewardsInfo { + pub fn new(reward_token_id: TokenIdentifier, start_week: Week, end_week: Week) -> Self { + RewardsInfo { + reward_token_id, + undistributed_rewards: BigUint::zero(), + start_week, + last_update_week: start_week, + end_week, + } + } +} + #[multiversx_sc::module] pub trait CommonRewardsModule: super::week_timekeeping::WeekTimekeepingModule { #[endpoint(updateRewards)] @@ -22,9 +34,8 @@ pub trait CommonRewardsModule: super::week_timekeeping::WeekTimekeepingModule { project_id: ProjectId, opt_max_nr_weeks: OptionalValue, ) { - self.rewards_info(project_id).update(|rewards_info| { - self.update_rewards(project_id, opt_max_nr_weeks, rewards_info); - }); + let mut rewards_info = self.rewards_info(project_id).get(); + self.update_rewards(project_id, opt_max_nr_weeks, &mut rewards_info); } fn update_rewards( @@ -35,14 +46,17 @@ pub trait CommonRewardsModule: super::week_timekeeping::WeekTimekeepingModule { ) { let current_week = self.get_current_week(); if rewards_info.start_week > current_week { + self.rewards_info(project_id).set(rewards_info); return; } if rewards_info.last_update_week >= current_week { + self.rewards_info(project_id).set(rewards_info); return; } if rewards_info.last_update_week == rewards_info.end_week { + self.rewards_info(project_id).set(rewards_info); return; } @@ -61,14 +75,18 @@ pub trait CommonRewardsModule: super::week_timekeeping::WeekTimekeepingModule { total_undistributed_rewards += undistributed_rewards; } - if last_week < rewards_info.end_week - 1 { + if last_week < rewards_info.end_week { self.rewards_remaining_amount(project_id, last_week) - .update(|rem_rew| *rem_rew += total_undistributed_rewards); + .update(|rem_rew| *rem_rew += &total_undistributed_rewards); + self.rewards_total_amount(project_id, last_week) + .update(|rew_total| *rew_total += total_undistributed_rewards); } else { rewards_info.undistributed_rewards += total_undistributed_rewards; } rewards_info.last_update_week = last_week; + + self.rewards_info(project_id).set(rewards_info); } #[storage_mapper("minRewardsPeriod")] diff --git a/growth-program/src/rewards/deposit.rs b/growth-program/src/rewards/deposit.rs index ac129cd..33ce0ac 100644 --- a/growth-program/src/rewards/deposit.rs +++ b/growth-program/src/rewards/deposit.rs @@ -3,7 +3,7 @@ use super::week_timekeeping::Week; use crate::{ project::{ProjectId, PROJECT_UNPAUSED}, rewards::common_rewards::RewardsInfo, - WEEK_IN_SECONDS, + DAY_IN_SECONDS, }; multiversx_sc::imports!(); @@ -19,6 +19,7 @@ pub trait DepositRewardsModule: + super::week_timekeeping::WeekTimekeepingModule + crate::validation::ValidationModule + multiversx_sc_modules::pause::PauseModule + + energy_query::EnergyQueryModule { #[only_owner] #[endpoint(setMinRewardsPeriod)] @@ -39,7 +40,6 @@ pub trait DepositRewardsModule: project_id: ProjectId, start_week: Week, end_week: Week, - initial_rewards_dollar_per_energy: BigUint, signer: ManagedAddress, ) { require!( @@ -53,8 +53,14 @@ pub trait DepositRewardsModule: self.deposit_rewards_common(project_id, start_week, end_week); + let first_week_rdpe = self.first_week_reward_dollars_per_energy().get(); + require!( + first_week_rdpe > 0, + "First week rewards dollar per energy not set" + ); + self.rewards_dollars_per_energy(project_id, start_week) - .set(initial_rewards_dollar_per_energy); + .set(first_week_rdpe); self.signer(project_id).set(signer); self.project_active(project_id).set(PROJECT_UNPAUSED); } @@ -103,37 +109,35 @@ pub trait DepositRewardsModule: let week_diff = end_week - start_week; let rewards_per_week = &payment.amount / week_diff as u32; - let dollar_value = self.get_dollar_value( + let dollar_value = self.get_usdc_value( payment.token_identifier.clone(), rewards_per_week.clone(), - WEEK_IN_SECONDS, + DAY_IN_SECONDS, ); let min_weekly_rewards_value = self.min_weekly_rewards_value().get(); require!(dollar_value >= min_weekly_rewards_value, "Too few rewards"); let info_mapper = self.rewards_info(project_id); - let mut rewards_info = if info_mapper.is_empty() { - RewardsInfo { - reward_token_id: payment.token_identifier.clone(), - undistributed_rewards: BigUint::zero(), - start_week, - last_update_week: start_week, - end_week, - } - } else { + let mut rewards_info = if !info_mapper.is_empty() { let mut rewards_info = info_mapper.get(); + require!( + payment.token_identifier == rewards_info.reward_token_id, + "Invalid payment" + ); + rewards_info.last_update_week = core::cmp::min(rewards_info.last_update_week, start_week); rewards_info.end_week = core::cmp::max(rewards_info.end_week, end_week); + if current_week < start_week && start_week < rewards_info.start_week { + rewards_info.start_week = start_week; + } + rewards_info + } else { + RewardsInfo::new(payment.token_identifier.clone(), start_week, end_week) }; - require!( - payment.token_identifier == rewards_info.reward_token_id, - "Invalid payment" - ); - self.update_rewards(project_id, OptionalValue::None, &mut rewards_info); for week in start_week..end_week { @@ -147,7 +151,5 @@ pub trait DepositRewardsModule: let surplus_payment = EsdtTokenPayment::new(payment.token_identifier, 0, surplus_amount); self.send() .direct_non_zero_esdt_payment(&caller, &surplus_payment); - - info_mapper.set(rewards_info); } } diff --git a/growth-program/src/rewards/energy.rs b/growth-program/src/rewards/energy.rs index a271585..e220c5f 100644 --- a/growth-program/src/rewards/energy.rs +++ b/growth-program/src/rewards/energy.rs @@ -1,31 +1,63 @@ use super::week_timekeeping::Week; -use crate::{project::ProjectId, DAY_IN_SECONDS, MAX_PERCENTAGE, PRECISION}; +use crate::{ + project::ProjectId, DAY_IN_SECONDS, MAX_PERCENTAGE, PRECISION, USDC_DECIMALS, WEEKS_PER_YEAR, +}; multiversx_sc::imports!(); multiversx_sc::derive_imports!(); +pub const ENERGY_FOUR_YEARS_MEX: u64 = 4 * 360; +pub const MEX_AMOUNT_FOR_APR_MATH: u64 = 10_000_000_000; + #[multiversx_sc::module] pub trait EnergyModule: super::common_rewards::CommonRewardsModule + crate::price_query::PriceQueryModule + crate::project::ProjectsModule + super::week_timekeeping::WeekTimekeepingModule + + energy_query::EnergyQueryModule { + /// min_reward_dollars_per_energy is a value scaled to PRECISION*PRECISION. + /// For example, if the desired RDPE is that 10^18 units of energy give 10^{-15} dollars of rewards, + /// then we should provide the argument 10^{-15}*10^{-18}*PRECISION*PRECISION = 10^3. #[only_owner] #[endpoint(setMinRewardDollarsPerEnergy)] fn set_min_reward_dollars_per_energy(&self, min_value: BigUint) { self.min_reward_dollars_per_energy().set(min_value); } + // The APR should be expressed in MAX_PERC units, e.g. 500 represents 5%. + // Here the base investment for this APR is MEX locked for 4 years. + #[only_owner] + #[endpoint(setInitialRdpeFromApr)] + fn set_initial_rdpe_from_apr(&self, apr: BigUint) { + let mex_amount = BigUint::from(MEX_AMOUNT_FOR_APR_MATH) * PRECISION; + let mex_token_id = self.get_base_token_id(); + let mex_price = self.get_usdc_value(mex_token_id, mex_amount.clone(), DAY_IN_SECONDS); + let num = apr * mex_price * PRECISION * PRECISION; + let den = BigUint::from(10u32).pow(USDC_DECIMALS) + * MAX_PERCENTAGE + * WEEKS_PER_YEAR + * ENERGY_FOUR_YEARS_MEX + * mex_amount; + let first_week_reward_dollars_per_energy = num / den; + self.first_week_reward_dollars_per_energy() + .set(first_week_reward_dollars_per_energy); + } + #[only_owner] #[endpoint(setNextWeekRewardDollarsPerEnergy)] - fn set_next_week_reward_dollars_per_energy(&self, project_id: ProjectId, new_min: BigUint) { + fn set_next_week_reward_dollars_per_energy( + &self, + project_id: ProjectId, + rew_dollars_per_energy: BigUint, + ) { self.require_valid_project_id(project_id); let week = self.get_current_week() + 1; self.rewards_dollars_per_energy(project_id, week) - .set(new_min); + .set(rew_dollars_per_energy); } #[only_owner] @@ -66,9 +98,10 @@ pub trait EnergyModule: let rewards_info = self.rewards_info(project_id).get(); let total_rewards = self.rewards_total_amount(project_id, current_week).get(); let rewards_value = - self.get_dollar_value(rewards_info.reward_token_id, total_rewards, DAY_IN_SECONDS); - let energy_per_rew_dollar = self.get_reward_dollar_per_energy(project_id); - let total_energy = rewards_value * energy_per_rew_dollar / PRECISION; + self.get_usdc_value(rewards_info.reward_token_id, total_rewards, DAY_IN_SECONDS); + let reward_per_dollar_energy = + self.get_reward_dollar_per_energy(project_id) * BigUint::from(10u32).pow(USDC_DECIMALS); + let total_energy = rewards_value * PRECISION * PRECISION / reward_per_dollar_energy; mapper.set(&total_energy); total_energy @@ -99,7 +132,7 @@ pub trait EnergyModule: let rewards_info = self.rewards_info(project_id).get(); let total_rewards_current_week = self.rewards_total_amount(project_id, current_week).get(); - let rewards_value_current_week = self.get_dollar_value( + let rewards_value_current_week = self.get_usdc_value( rewards_info.reward_token_id, total_rewards_current_week, DAY_IN_SECONDS, @@ -112,7 +145,9 @@ pub trait EnergyModule: let den = (registered_energy_prev_week * interested_energy_prev_week).sqrt(); let alpha = self.alpha().get(); - let calculated_value = alpha * PRECISION * num / (den * MAX_PERCENTAGE); + let calculated_value = alpha * PRECISION * PRECISION * num + / (den * MAX_PERCENTAGE) + / BigUint::from(10u32).pow(USDC_DECIMALS); let rdpe_for_week = core::cmp::max(calculated_value, min_reward_dollar_per_energy); mapper.set(&rdpe_for_week); @@ -175,6 +210,9 @@ pub trait EnergyModule: week: Week, ) -> SingleValueMapper; + #[storage_mapper("firstWeekRewDollarsPerEnergy")] + fn first_week_reward_dollars_per_energy(&self) -> SingleValueMapper; + #[storage_mapper("rewDollarsPerEnergy")] fn rewards_dollars_per_energy( &self, diff --git a/growth-program/src/rewards/week_timekeeping.rs b/growth-program/src/rewards/week_timekeeping.rs index a3cf466..5ff5f35 100644 --- a/growth-program/src/rewards/week_timekeeping.rs +++ b/growth-program/src/rewards/week_timekeeping.rs @@ -3,7 +3,6 @@ use crate::{Timestamp, WEEK_IN_SECONDS}; multiversx_sc::imports!(); multiversx_sc::derive_imports!(); -pub const FIRST_WEEK: Week = 1; pub const MONDAY_19_02_2024_GMT_TIMESTAMP: u64 = 1_708_300_800; static INVALID_WEEK_ERR_MSG: &[u8] = b"Week 0 is not a valid week"; @@ -27,8 +26,10 @@ pub trait WeekTimekeepingModule { #[view(getTimestampsStartAndEndOfWeek)] fn get_timestamps_start_and_end_of_week(&self, week: Week) -> StartEndWeekTimestampPair { + require!(week > 0, "Invalid week"); + let first_week_start_timestamp = self.first_week_start_timestamp().get(); - let start = first_week_start_timestamp + week as u64 * WEEK_IN_SECONDS; + let start = first_week_start_timestamp + (week as u64 - 1) * WEEK_IN_SECONDS; let end = start + WEEK_IN_SECONDS - 1; StartEndWeekTimestampPair { start, end } diff --git a/growth-program/src/rewards/withdraw.rs b/growth-program/src/rewards/withdraw.rs index 648860d..1e2822d 100644 --- a/growth-program/src/rewards/withdraw.rs +++ b/growth-program/src/rewards/withdraw.rs @@ -44,7 +44,7 @@ pub trait WithdrawRewardsModule: "Cannot withdraw anymore" ); require!( - start_week > rewards_info.last_update_week, + start_week >= rewards_info.last_update_week, INVALID_START_WEEK_ERR_MSG ); require!( @@ -80,7 +80,8 @@ pub trait WithdrawRewardsModule: fn finish_program(&self, project_id: ProjectId) { self.require_not_paused(); - let mut rewards_info = self.rewards_info(project_id).take(); + let rewards_mapper = self.rewards_info(project_id); + let mut rewards_info = rewards_mapper.get(); let current_week = self.get_current_week(); require!( current_week >= rewards_info.end_week, @@ -88,6 +89,7 @@ pub trait WithdrawRewardsModule: ); self.update_rewards(project_id, OptionalValue::None, &mut rewards_info); + rewards_mapper.clear(); if rewards_info.undistributed_rewards == 0 { return; diff --git a/growth-program/tests/growth_program_setup/mod.rs b/growth-program/tests/growth_program_setup/mod.rs index 66a2d65..24206b3 100644 --- a/growth-program/tests/growth_program_setup/mod.rs +++ b/growth-program/tests/growth_program_setup/mod.rs @@ -7,6 +7,7 @@ use growth_program::{ claim::ClaimRewardsModule, claim_types::{ClaimType, LockOption}, deposit::DepositRewardsModule, + energy::EnergyModule, week_timekeeping::{Epoch, MONDAY_19_02_2024_GMT_TIMESTAMP}, }, GrowthProgram, Timestamp, DEFAULT_MIN_REWARDS_PERIOD, MAX_PERCENTAGE, PRECISION, @@ -320,6 +321,9 @@ where managed_token_id!(WEGLD_TOKEN_ID), ); + sc.first_week_reward_dollars_per_energy() + .set(managed_biguint!(DEFAULT_ENERGY_PER_DOLLAR) * PRECISION * PRECISION); + sc.set_paused(false); }) .assert_ok(); @@ -377,13 +381,7 @@ where |sc| { let signer_addr = managed_address!(&Address::from(&SIGNER_ADDRESS)); - sc.deposit_initial_rewards( - 1, - 2, - 2 + DEFAULT_MIN_REWARDS_PERIOD, - managed_biguint!(DEFAULT_ENERGY_PER_DOLLAR) * PRECISION, - signer_addr, - ); + sc.deposit_initial_rewards(1, 2, 2 + DEFAULT_MIN_REWARDS_PERIOD, signer_addr); }, ) .assert_ok(); @@ -398,13 +396,7 @@ where |sc| { let signer_addr = managed_address!(&Address::from(&SIGNER_ADDRESS)); - sc.deposit_initial_rewards( - 2, - 2, - 2 + DEFAULT_MIN_REWARDS_PERIOD, - managed_biguint!(DEFAULT_ENERGY_PER_DOLLAR), - signer_addr, - ); + sc.deposit_initial_rewards(2, 2, 2 + DEFAULT_MIN_REWARDS_PERIOD, signer_addr); }, ) .assert_ok(); diff --git a/growth-program/tests/test.rs b/growth-program/tests/test.rs index 555ff7a..5790991 100644 --- a/growth-program/tests/test.rs +++ b/growth-program/tests/test.rs @@ -3,7 +3,8 @@ pub mod growth_program_setup; use growth_program::{ rewards::{ - claim_types::LockOption, + claim::ClaimRewardsModule, + claim_types::{ClaimType, LockOption}, common_rewards::{CommonRewardsModule, RewardsInfo}, deposit::DepositRewardsModule, energy::EnergyModule, @@ -11,11 +12,15 @@ use growth_program::{ DEFAULT_MIN_REWARDS_PERIOD, }; use growth_program_setup::*; -use multiversx_sc::types::Address; +use multiversx_sc::{ + codec::multi_types::OptionalValue, + types::{Address, ManagedByteArray}, +}; use multiversx_sc_scenario::{ - managed_address, managed_biguint, managed_token_id, managed_token_id_wrapped, rust_biguint, - DebugApi, + managed_address, managed_biguint, managed_buffer, managed_token_id, managed_token_id_wrapped, + rust_biguint, DebugApi, }; +use num_traits::FromPrimitive; use simple_lock::locked_token::LockedTokenAttributes; #[test] @@ -65,7 +70,7 @@ fn deposit_too_few_rewards_test() { |sc| { let signer_addr = managed_address!(&Address::from(&SIGNER_ADDRESS)); - sc.deposit_initial_rewards(1, 2, 28, managed_biguint!(1), signer_addr); + sc.deposit_initial_rewards(1, 2, 28, signer_addr); }, ) .assert_user_error("Too few rewards"); @@ -96,7 +101,7 @@ fn deposit_wrong_week_amount_test() { |sc| { let signer_addr = managed_address!(&Address::from(&SIGNER_ADDRESS)); - sc.deposit_initial_rewards(1, 2, 5, managed_biguint!(1), signer_addr); + sc.deposit_initial_rewards(1, 2, 5, signer_addr); }, ) .assert_user_error("Too few reward weeks"); @@ -230,7 +235,7 @@ fn claim_ok_first_week_unlocked_test() { .b_mock .execute_query(&setup.gp_wrapper, |sc| { let total_energy = sc.total_energy_for_week(1, 2).get(); - assert_eq!(total_energy, managed_biguint!(192307692307690)); + assert_eq!(total_energy, managed_biguint!(7692307)); let interested_energy = sc.interested_energy_rewards_claimers(1, 2).get(); assert_eq!(interested_energy, managed_biguint!(348000) / 4u32); // 25% for full unlocked @@ -240,7 +245,7 @@ fn claim_ok_first_week_unlocked_test() { setup.b_mock.check_esdt_balance( &setup.first_user_addr, FIRST_PROJ_TOKEN, - &rust_biguint!(17400000000000208), + &num_bigint::BigUint::from_u128(435000039150003523500317).unwrap(), ); // first user try claim again @@ -286,7 +291,7 @@ fn claim_ok_first_week_locked_test() { .b_mock .execute_query(&setup.gp_wrapper, |sc| { let total_energy = sc.total_energy_for_week(1, 2).get(); - assert_eq!(total_energy, managed_biguint!(192307692307690)); + assert_eq!(total_energy, managed_biguint!(7692307)); let interested_energy = sc.interested_energy_rewards_claimers(1, 2).get(); assert_eq!(interested_energy, managed_biguint!(348000) / 2u32); // 50% for one week lock @@ -298,7 +303,7 @@ fn claim_ok_first_week_locked_test() { &setup.first_user_addr, LOCKED_TOKEN_ID, 1, - &rust_biguint!(34800000000000417), + &num_bigint::BigUint::from_u128(870000078300007047000634).unwrap(), Some(&LockedTokenAttributes:: { original_token_id: managed_token_id_wrapped!(FIRST_PROJ_TOKEN), original_token_nonce: 0, @@ -325,12 +330,24 @@ fn claim_too_many_rewards_test() { let sig_first_user_week_2 = hex_literal::hex!("3360e54f357cbb67b1c34771b633d0f7ad9779019a0dcee252d972315c1edb8178012f057c94714e52b3d461ef333cb3020c29e3f98e467a4d3341880891690e"); setup - .claim( - &setup.first_user_addr.clone(), - 1, - LockOption::None, - 17400000000000209, - &sig_first_user_week_2, + .b_mock + .execute_tx( + &setup.first_user_addr, + &setup.gp_wrapper, + &rust_biguint!(0), + |sc| { + let multi_value_arg = ( + managed_buffer!(b"lala"), + ManagedByteArray::new_from_bytes(&sig_first_user_week_2), + ) + .into(); + let _ = sc.claim_rewards( + 1, + multiversx_sc::types::BigUint::from(870000078300007047000634u128) + 1u32, + ClaimType::Rewards(LockOption::None), + OptionalValue::Some(multi_value_arg), + ); + }, ) .assert_user_error("Too few rewards"); } diff --git a/growth-program/wasm/src/lib.rs b/growth-program/wasm/src/lib.rs index 04c70c8..d41fe78 100644 --- a/growth-program/wasm/src/lib.rs +++ b/growth-program/wasm/src/lib.rs @@ -5,9 +5,9 @@ //////////////////////////////////////////////////// // Init: 1 -// Endpoints: 36 +// Endpoints: 37 // Async Callback (empty): 1 -// Total number of exported functions: 38 +// Total number of exported functions: 39 #![no_std] #![allow(internal_features)] @@ -34,6 +34,7 @@ multiversx_sc_wasm_adapter::endpoints! { ownerWithdrawRewards => owner_withdraw_rewards finishProgram => finish_program setMinRewardDollarsPerEnergy => set_min_reward_dollars_per_energy + setInitialRdpeFromApr => set_initial_rdpe_from_apr setNextWeekRewardDollarsPerEnergy => set_next_week_reward_dollars_per_energy setAlpha => set_alpha setBeta => set_beta