diff --git a/contracts/config/anvil.json b/contracts/config/anvil.json index 5b8cce9b..8e3796c3 100644 --- a/contracts/config/anvil.json +++ b/contracts/config/anvil.json @@ -21,15 +21,14 @@ "rewardsCoordinatorInitPausedStatus": 0, "allocationManagerInitPausedStatus": 0, "deallocationDelay": 50, - "allocationConfigurationDelay": 75, + "allocationConfigurationDelay": 0, "beaconChainGenesisTimestamp": 1695902400 }, "avs": { "avsOwner": "0x976EA74026E726554dB657fA54763abd0C3a0aa9", "rewardsInitiator": "0x14dC79964da2C08b23698B3D3cc7Ca32193d9955", - "validatorsStrategies": [ - "0xbeaC0eeEeeeeEEeEeEEEEeeEEeEeeeEeeEEBEaC0" - ] + "validatorSetSubmitter": "0x976EA74026E726554dB657fA54763abd0C3a0aa9", + "validatorsStrategies": [] }, "snowbridge": { "randaoCommitDelay": 4, diff --git a/contracts/deployments/state-diff.checksum b/contracts/deployments/state-diff.checksum index eb0ae951..0786cc89 100644 --- a/contracts/deployments/state-diff.checksum +++ b/contracts/deployments/state-diff.checksum @@ -1 +1 @@ -764d675e54fcb006d8b2b43a6fdf8782313e6509 \ No newline at end of file +9c861e3e1d290888127bc6d772fb1a3422bdf8b3 diff --git a/contracts/deployments/state-diff.json b/contracts/deployments/state-diff.json index 8b2c6e39..7b21fbfe 100644 --- a/contracts/deployments/state-diff.json +++ b/contracts/deployments/state-diff.json @@ -1,1317 +1,53 @@ { - "4": { - "address": "0x0000BBdDc7CE488642fb579F8B00f3a590007251", - "code": "0x3373fffffffffffffffffffffffffffffffffffffffe1460d35760115f54807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1461019a57600182026001905f5b5f82111560685781019083028483029004916001019190604d565b9093900492505050366060146088573661019a573461019a575f5260205ff35b341061019a57600154600101600155600354806004026004013381556001015f358155600101602035815560010160403590553360601b5f5260605f60143760745fa0600101600355005b6003546002548082038060021160e7575060025b5f5b8181146101295782810160040260040181607402815460601b815260140181600101548152602001816002015481526020019060030154905260010160e9565b910180921461013b5790600255610146565b90505f6002555f6003555b5f54807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff141561017357505f5b6001546001828201116101885750505f61018e565b01600190035b5f555f6001556074025ff35b5f5ffd00", - "storage": {} - }, - "5": { - "address": "0x000F3df6D732807Ef1319fB7B8bB8522d0Beac02", - "code": "0x3373fffffffffffffffffffffffffffffffffffffffe14604d57602036146024575f5ffd5b5f35801560495762001fff810690815414603c575f5ffd5b62001fff01545f5260205ff35b5f5ffd5b62001fff42064281555f359062001fff015500", + "0": { + "address": "0x00000961Ef480Eb55e80D19ad83579A64c007002", + "code": "0x3373fffffffffffffffffffffffffffffffffffffffe1460cb5760115f54807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff146101f457600182026001905f5b5f82111560685781019083028483029004916001019190604d565b909390049250505036603814608857366101f457346101f4575f5260205ff35b34106101f457600154600101600155600354806003026004013381556001015f35815560010160203590553360601b5f5260385f601437604c5fa0600101600355005b6003546002548082038060101160df575060105b5f5b8181146101835782810160030260040181604c02815460601b8152601401816001015481526020019060020154807fffffffffffffffffffffffffffffffff00000000000000000000000000000000168252906010019060401c908160381c81600701538160301c81600601538160281c81600501538160201c81600401538160181c81600301538160101c81600201538160081c81600101535360010160e1565b910180921461019557906002556101a0565b90505f6002555f6003555b5f54807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff14156101cd57505f5b6001546002828201116101e25750505f6101e8565b01600290035b5f555f600155604c025ff35b5f5ffd00", "storage": { - "0x0000000000000000000000000000000000000000000000000000000000001a89": "0x00000000000000000000000000000000000000000000000000000000698aae1a", - "0x00000000000000000000000000000000000000000000000000000000000038f4": "0x9e7d19807a044666f60b3e9f46b09704ed38577467f22d171b84f7fe4da94a5d", - "0x0000000000000000000000000000000000000000000000000000000000003a13": "0xcb5e2af596722bf0a80df13cba0bec89ba364e6e4b919794f843d2293f2df5f6", - "0x00000000000000000000000000000000000000000000000000000000000019d4": "0x00000000000000000000000000000000000000000000000000000000698aad65", - "0x00000000000000000000000000000000000000000000000000000000000038b9": "0xf578164d88a0a4f458bfc794c9d46bec68c8d14cc577e0909733186c4195bea1", - "0x0000000000000000000000000000000000000000000000000000000000003aa8": "0x26345bb00929c110aa9dbbd603665a43d40062c196212eaa800d7df9087d8928", - "0x00000000000000000000000000000000000000000000000000000000000038d0": "0x64c95c5ee8896e33b6477afe2cecfb9bab1da1a2c14c58e972240d0dae49e966", - "0x0000000000000000000000000000000000000000000000000000000000003af4": "0x45d4ea7625addc31246447b4a16c32d6081937cdc30caa316fcce0649d7a1ae3", - "0x0000000000000000000000000000000000000000000000000000000000003990": "0x4811705dad48c199c7e26aa9a53a622a802795d7dd9e5487db53533ba7239ce6", - "0x0000000000000000000000000000000000000000000000000000000000001948": "0x00000000000000000000000000000000000000000000000000000000698aacd9", - "0x0000000000000000000000000000000000000000000000000000000000003964": "0x68ff69b39f0f3cec2428bb82657f96b7da9eee6a4b4075fef503a0f3a4eab7f1", - "0x00000000000000000000000000000000000000000000000000000000000038c9": "0x4d70660a6f633a308b9358040b77505acaf38e72bb73424ebacaac030c437bb0", - "0x0000000000000000000000000000000000000000000000000000000000003929": "0x34d3fa2b733abd996123adf396f1c367355dad131cec053193fd1c398715731b", - "0x000000000000000000000000000000000000000000000000000000000000398b": "0xa1637ffc101157f2b5287f397a7d6c08debf36955f2078bd664dfed2eadad745", - "0x00000000000000000000000000000000000000000000000000000000000039ad": "0x1d387660d7b1b19a0632c08712bbd1891542b3061fa48e9df9f7d3779d554234", - "0x0000000000000000000000000000000000000000000000000000000000001958": "0x00000000000000000000000000000000000000000000000000000000698aace9", - "0x0000000000000000000000000000000000000000000000000000000000001a44": "0x00000000000000000000000000000000000000000000000000000000698aadd5", - "0x0000000000000000000000000000000000000000000000000000000000001aee": "0x00000000000000000000000000000000000000000000000000000000698aae7f", - "0x00000000000000000000000000000000000000000000000000000000000038a1": "0x86114961cae080be21174c89a13ca0b13a165e8c81ecce70b45d0119e6121fdc", - "0x0000000000000000000000000000000000000000000000000000000000001946": "0x00000000000000000000000000000000000000000000000000000000698aacd7", - "0x000000000000000000000000000000000000000000000000000000000000394c": "0x98c7635d23ee565ba8551ced01224c205075e8a11cd3c2eae4ddbf8b520b49be", - "0x00000000000000000000000000000000000000000000000000000000000018e3": "0x00000000000000000000000000000000000000000000000000000000698aac74", - "0x0000000000000000000000000000000000000000000000000000000000001a57": "0x00000000000000000000000000000000000000000000000000000000698aade8", - "0x0000000000000000000000000000000000000000000000000000000000001a07": "0x00000000000000000000000000000000000000000000000000000000698aad98", - "0x0000000000000000000000000000000000000000000000000000000000001afc": "0x00000000000000000000000000000000000000000000000000000000698aae8d", - "0x0000000000000000000000000000000000000000000000000000000000001916": "0x00000000000000000000000000000000000000000000000000000000698aaca7", - "0x0000000000000000000000000000000000000000000000000000000000001b42": "0x00000000000000000000000000000000000000000000000000000000698aaed3", - "0x0000000000000000000000000000000000000000000000000000000000003963": "0xca8730b7971ea1d5639f54a05687bc4b0e81613e7c5899b65a3002376a51c415", - "0x00000000000000000000000000000000000000000000000000000000000039b2": "0xdacde82126f757e089eccdbd1cc9fe4fbb2669463e777ff671c529199d5737cf", - "0x0000000000000000000000000000000000000000000000000000000000003a81": "0xd9cde5380f3df2248d0cf168fde66fc64d53f2a00ed2093422af5cb60c0544e4", - "0x0000000000000000000000000000000000000000000000000000000000001939": "0x00000000000000000000000000000000000000000000000000000000698aacca", - "0x00000000000000000000000000000000000000000000000000000000000019cb": "0x00000000000000000000000000000000000000000000000000000000698aad5c", - "0x00000000000000000000000000000000000000000000000000000000000019d7": "0x00000000000000000000000000000000000000000000000000000000698aad68", - "0x000000000000000000000000000000000000000000000000000000000000393e": "0xb404009d5f92d8022ab87e7d93c490f3765093f9460b9fc40a2cb5dccc6df21a", - "0x00000000000000000000000000000000000000000000000000000000000018a2": "0x00000000000000000000000000000000000000000000000000000000698aac33", - "0x00000000000000000000000000000000000000000000000000000000000019e5": "0x00000000000000000000000000000000000000000000000000000000698aad76", - "0x0000000000000000000000000000000000000000000000000000000000001a83": "0x00000000000000000000000000000000000000000000000000000000698aae14", - "0x0000000000000000000000000000000000000000000000000000000000001a33": "0x00000000000000000000000000000000000000000000000000000000698aadc4", - "0x00000000000000000000000000000000000000000000000000000000000039e6": "0x659b2fa60438be0fa80b53919643f4e3b714918df215da5cea8e51663ca6cf1b", - "0x00000000000000000000000000000000000000000000000000000000000018d3": "0x00000000000000000000000000000000000000000000000000000000698aac64", - "0x00000000000000000000000000000000000000000000000000000000000019c0": "0x00000000000000000000000000000000000000000000000000000000698aad51", - "0x0000000000000000000000000000000000000000000000000000000000001a15": "0x00000000000000000000000000000000000000000000000000000000698aada6", - "0x0000000000000000000000000000000000000000000000000000000000001a9d": "0x00000000000000000000000000000000000000000000000000000000698aae2e", - "0x0000000000000000000000000000000000000000000000000000000000003a50": "0xee056fa54b9753e6dc68c7f00338d2cc2757549be735ab11fd97e0bada01f932", - "0x0000000000000000000000000000000000000000000000000000000000003b07": "0x2dbaaf47f8566703a9c62ffc6fe33970b0e764c87a7c247d90a01799bc07fa87", - "0x0000000000000000000000000000000000000000000000000000000000001ab7": "0x00000000000000000000000000000000000000000000000000000000698aae48", - "0x00000000000000000000000000000000000000000000000000000000000038c6": "0xe6c894598e486dbb754220f44c3b50e687967240ca333a01587f26d21d622b8c", - "0x0000000000000000000000000000000000000000000000000000000000003949": "0xc9bb2d9c99779f4a787ecad59ef7786fc6e210ee946883add6e69a32c1b1ac45", - "0x0000000000000000000000000000000000000000000000000000000000003b38": "0xb1c9d94350fb3244214ab82e2e76597e679f213ee08624f663c9be320363700c", - "0x000000000000000000000000000000000000000000000000000000000000396c": "0x50109ae98b69de84894cd72e03c6c870b7f9590e2774df54d3cee4c389549cc3", - "0x00000000000000000000000000000000000000000000000000000000000038f0": "0x0e1e09477ad00a18df15c0827c2f97fac6d9448d6141499027f8dbbad3abf89a", - "0x00000000000000000000000000000000000000000000000000000000000019dc": "0x00000000000000000000000000000000000000000000000000000000698aad6d", - "0x0000000000000000000000000000000000000000000000000000000000001a32": "0x00000000000000000000000000000000000000000000000000000000698aadc3", - "0x0000000000000000000000000000000000000000000000000000000000003a08": "0x188fb7851b8a1ccfcc0d22b49a3819fbb0d2a9888073cd400e348b8c94685b01", - "0x000000000000000000000000000000000000000000000000000000000000393b": "0xc2031539af9e70d028f6845b787ac710a7877457d35cc4f5fd0ca55898fa36f7", - "0x00000000000000000000000000000000000000000000000000000000000019b1": "0x00000000000000000000000000000000000000000000000000000000698aad42", - "0x0000000000000000000000000000000000000000000000000000000000003a7e": "0x04261044d3aa68fc0d7ae46b9f13bff7e9ae9e5c65d1955dc24551c54ea8e7f1", - "0x0000000000000000000000000000000000000000000000000000000000001b05": "0x00000000000000000000000000000000000000000000000000000000698aae96", - "0x0000000000000000000000000000000000000000000000000000000000003991": "0x5967ff560c4d76629a7884ddf7b8e3c13f06725a9fa6c3217561bbf0f59e636d", - "0x0000000000000000000000000000000000000000000000000000000000003952": "0xc3691bdd547ab93ff85839473d2f4b07fca9849afc3f51d2928eea568b5faae0", - "0x0000000000000000000000000000000000000000000000000000000000001ac5": "0x00000000000000000000000000000000000000000000000000000000698aae56", - "0x0000000000000000000000000000000000000000000000000000000000003b2b": "0xc659d8eb74d533547e84581f5fb790801edf99105205547a9c80dfc9a26ceaf7", - "0x00000000000000000000000000000000000000000000000000000000000038af": "0x7a900888184df9a7939e92c6bedfe6a6ee180cd0e323c5537a7dacb51adfbfd8", - "0x000000000000000000000000000000000000000000000000000000000000198e": "0x00000000000000000000000000000000000000000000000000000000698aad1f", - "0x00000000000000000000000000000000000000000000000000000000000018b8": "0x00000000000000000000000000000000000000000000000000000000698aac49", - "0x0000000000000000000000000000000000000000000000000000000000003a10": "0x93bd67006f18170ee2dceb296df27726b60d845c6cdc24c29e7168d4614e7f20", - "0x000000000000000000000000000000000000000000000000000000000000391e": "0x0a06be5410b8b274fd6c3c6badd0da03a95155b09cbc650f01d3d4593b13cd29", - "0x0000000000000000000000000000000000000000000000000000000000003906": "0xf5ef7753c064400dd7a249b45367b27433b66a028eff2d86598760bddf554a5d", - "0x00000000000000000000000000000000000000000000000000000000000039fa": "0xc2ae25984cfad8813a359671917dcf8ccfb2a1db248e596b8043cff0bf83e4c9", - "0x000000000000000000000000000000000000000000000000000000000000390f": "0x64b5842ffd23813afdec220290ce2e286c87409dadd20f982c4539fe819f29ee", - "0x0000000000000000000000000000000000000000000000000000000000001a2f": "0x00000000000000000000000000000000000000000000000000000000698aadc0", - "0x0000000000000000000000000000000000000000000000000000000000001a01": "0x00000000000000000000000000000000000000000000000000000000698aad92", - "0x00000000000000000000000000000000000000000000000000000000000019e9": "0x00000000000000000000000000000000000000000000000000000000698aad7a", - "0x0000000000000000000000000000000000000000000000000000000000001941": "0x00000000000000000000000000000000000000000000000000000000698aacd2", - "0x0000000000000000000000000000000000000000000000000000000000001b29": "0x00000000000000000000000000000000000000000000000000000000698aaeba", - "0x0000000000000000000000000000000000000000000000000000000000003a16": "0xb0e67078b28c922b20616bc63b7eaf0404a8c844c732a6081c16f42705450ccd", - "0x0000000000000000000000000000000000000000000000000000000000003a28": "0x52e4272ae24f72252edd6bbf6b28e4d778f916b7f0c575f0378baf6d2d38ef5e", - "0x00000000000000000000000000000000000000000000000000000000000019db": "0x00000000000000000000000000000000000000000000000000000000698aad6c", - "0x00000000000000000000000000000000000000000000000000000000000019eb": "0x00000000000000000000000000000000000000000000000000000000698aad7c", - "0x0000000000000000000000000000000000000000000000000000000000003917": "0xb69efbc8c578e01320564ad824cae2730fbc5a9c55226c80aff258a0e1b89572", - "0x0000000000000000000000000000000000000000000000000000000000003a39": "0x814419b6c1ca98259cf08493e95e06c69372e5a1acfb6d47a999bdc2d94decba", - "0x0000000000000000000000000000000000000000000000000000000000003ab4": "0x860c0d3d4f42688382f643039458f219ad75ebd3dc15e74a1f143ee1e3a3d22c", - "0x0000000000000000000000000000000000000000000000000000000000003a86": "0xf01770fd60b1638be2a733fda50ae19511ef41d164e5398af0871d62abeb9a24", - "0x0000000000000000000000000000000000000000000000000000000000003ab5": "0xd8f52f38850a2648a217e8ddbe856e73d48944b1b0dce4698822f2570f6fe2c9", - "0x0000000000000000000000000000000000000000000000000000000000001a1e": "0x00000000000000000000000000000000000000000000000000000000698aadaf", - "0x0000000000000000000000000000000000000000000000000000000000003962": "0xd75bb4e8e3af9e89b44585b573bf04780a075673fe14195af54697fbed04033d", - "0x0000000000000000000000000000000000000000000000000000000000001a03": "0x00000000000000000000000000000000000000000000000000000000698aad94", - "0x0000000000000000000000000000000000000000000000000000000000003a69": "0xf407f1bff4369d178fda2fdd4a53e7915405de014b01e2ea31cc719a26d6f6fa", - "0x0000000000000000000000000000000000000000000000000000000000003a49": "0x8f746f54cde49572adde784760302c93906e744cf04756732871a980d285b17e", - "0x000000000000000000000000000000000000000000000000000000000000395a": "0xe1ee2c99df2a9b4c0bddc5e917bcc35811f011db9c26a6f3f725707bc14786ac", - "0x0000000000000000000000000000000000000000000000000000000000003951": "0x3e57f99815010b96918e8c8127f0a345cba3f79acdcdea9625c4007d2a6f9a66", - "0x0000000000000000000000000000000000000000000000000000000000003a2a": "0xd4d04b3e3aa65d831043af4b4538fd3a8d456fb6e6f7c3e5235719b7b8476b11", - "0x0000000000000000000000000000000000000000000000000000000000003b34": "0x4cdb008abddf34e64b668fbe5449c72d04c20d12e164907f9f0a8268a154d43f", - "0x0000000000000000000000000000000000000000000000000000000000001a0b": "0x00000000000000000000000000000000000000000000000000000000698aad9c", - "0x0000000000000000000000000000000000000000000000000000000000001a14": "0x00000000000000000000000000000000000000000000000000000000698aada5", - "0x00000000000000000000000000000000000000000000000000000000000038b0": "0x1248fe8c032231052b3d06ec1c11c477d86739df6ad58cefa236e3498c5782eb", - "0x0000000000000000000000000000000000000000000000000000000000003946": "0xc8a6004e1084497bd73d016586fd83a6666f85abfa68362be119649883554f47", - "0x0000000000000000000000000000000000000000000000000000000000003b2a": "0x071709d72dd034238039c0677fb0302f504d1f8792d6c84de93927c6530261b5", - "0x000000000000000000000000000000000000000000000000000000000000195e": "0x00000000000000000000000000000000000000000000000000000000698aacef", - "0x00000000000000000000000000000000000000000000000000000000000019ed": "0x00000000000000000000000000000000000000000000000000000000698aad7e", - "0x000000000000000000000000000000000000000000000000000000000000395f": "0x682d408b533ec1673010d0fa4c0a908171f9df95565200bcd2b424de807a3556", - "0x0000000000000000000000000000000000000000000000000000000000003abc": "0x4433641b6fb0011bec7ee5e015e31bc2a12ce6cffc0518b727179783c0cf0e5e", - "0x0000000000000000000000000000000000000000000000000000000000003a53": "0x21f00ece426f54a5efc2fb404b8825d5ce3bd13e50eed048cbeec16466c6df6c", - "0x0000000000000000000000000000000000000000000000000000000000003ada": "0x5afd795d42860334ba7aef0f90b2ce1cdcf4c73443b7d9726e251714b9b61195", - "0x0000000000000000000000000000000000000000000000000000000000003a68": "0x563392660340c6f4e2ef0e442bd1ee606f279ca3c445107f40714ab795ddbad3", - "0x000000000000000000000000000000000000000000000000000000000000399d": "0x385fb5bca1792bd321c1d8cc59fa8a3beaeac04e3161d879c6e98bbc0e99bfca", - "0x0000000000000000000000000000000000000000000000000000000000001b30": "0x00000000000000000000000000000000000000000000000000000000698aaec1", - "0x00000000000000000000000000000000000000000000000000000000000038ec": "0xcecb4ff7e808dbd3ca6275a35cd7417cae674a59b4a9d654571f2705f0292da0", - "0x0000000000000000000000000000000000000000000000000000000000001a30": "0x00000000000000000000000000000000000000000000000000000000698aadc1", - "0x0000000000000000000000000000000000000000000000000000000000003ac2": "0x88c401ee1853067de06be00391d3e5236b2efb27dce4a390378bc506645e6af9", - "0x00000000000000000000000000000000000000000000000000000000000018bf": "0x00000000000000000000000000000000000000000000000000000000698aac50", - "0x00000000000000000000000000000000000000000000000000000000000038dc": "0xdf0f8b061c0770c699db331742472f6059bb6146c69d70c32247d04329c612e0", - "0x0000000000000000000000000000000000000000000000000000000000001900": "0x00000000000000000000000000000000000000000000000000000000698aac91", - "0x00000000000000000000000000000000000000000000000000000000000019ee": "0x00000000000000000000000000000000000000000000000000000000698aad7f", - "0x00000000000000000000000000000000000000000000000000000000000039b4": "0xe320dd4b3ad7a589dfecfac6c7c75db1b07c498d695796df66d73866c70e1feb", - "0x0000000000000000000000000000000000000000000000000000000000003b28": "0xe08a52854c4261c23e38d080b7c456dbdc488d0433575c56cf7063e0237c174f", - "0x00000000000000000000000000000000000000000000000000000000000018b7": "0x00000000000000000000000000000000000000000000000000000000698aac48", - "0x00000000000000000000000000000000000000000000000000000000000018b3": "0x00000000000000000000000000000000000000000000000000000000698aac44", - "0x00000000000000000000000000000000000000000000000000000000000039a8": "0xfacda2a2adf8f3eb6b123dd057455ac7c8da822a142de7f61c22a3b45dcd64f8", - "0x000000000000000000000000000000000000000000000000000000000000192c": "0x00000000000000000000000000000000000000000000000000000000698aacbd", - "0x00000000000000000000000000000000000000000000000000000000000038b7": "0x9fb209813d0a00ff781376e628b4a4dc21aa8ba5a2e2e1c9b3413bf5bca60a0f", - "0x00000000000000000000000000000000000000000000000000000000000018bd": "0x00000000000000000000000000000000000000000000000000000000698aac4e", - "0x0000000000000000000000000000000000000000000000000000000000001a9b": "0x00000000000000000000000000000000000000000000000000000000698aae2c", - "0x000000000000000000000000000000000000000000000000000000000000399c": "0xafb895457e2dc300c47e16413239cf57aadee0bcaa2ab34a8f5c698a446926db", - "0x000000000000000000000000000000000000000000000000000000000000397f": "0xb9daea9761fc5d047c5d6da9b92e494676dfb669cbc36aaaa6a48a72ad1692b4", - "0x0000000000000000000000000000000000000000000000000000000000001ace": "0x00000000000000000000000000000000000000000000000000000000698aae5f", - "0x000000000000000000000000000000000000000000000000000000000000398d": "0x92da92288b2adf53e8e5241aa70b54779a7e9a290870a5817262f4bcdeec4289", - "0x00000000000000000000000000000000000000000000000000000000000039ec": "0xdde009c583c619025a7f3a3b795669e0096165e5ac1dd96f3cd9c115e2027a3b", - "0x0000000000000000000000000000000000000000000000000000000000003a9f": "0xfb1a7d08178724c73f11b9bab2d903c175c3a9812381f1bad0b56d7b0ea9f483", - "0x0000000000000000000000000000000000000000000000000000000000003920": "0xfed5592983d6297c5420e3bc5469242853e719d9aa0e6695eee5d4251249300b", - "0x00000000000000000000000000000000000000000000000000000000000018e9": "0x00000000000000000000000000000000000000000000000000000000698aac7a", - "0x0000000000000000000000000000000000000000000000000000000000003969": "0xc4c0f2dd16b501ac7147db8674aa18c36a08f7cf804e14b4cdf88c02bc0d414c", - "0x0000000000000000000000000000000000000000000000000000000000001adf": "0x00000000000000000000000000000000000000000000000000000000698aae70", - "0x0000000000000000000000000000000000000000000000000000000000001af1": "0x00000000000000000000000000000000000000000000000000000000698aae82", - "0x00000000000000000000000000000000000000000000000000000000000038df": "0xb298bfa1355b334512c6d0c60207c5d978a590a74095cb1bbf2ce991cb978223", - "0x0000000000000000000000000000000000000000000000000000000000001a56": "0x00000000000000000000000000000000000000000000000000000000698aade7", - "0x0000000000000000000000000000000000000000000000000000000000001986": "0x00000000000000000000000000000000000000000000000000000000698aad17", - "0x00000000000000000000000000000000000000000000000000000000000038b5": "0xfe8ea9c5c967289fed768d3ba3dd09314911086d74c00aecbbf279a8e2244701", - "0x00000000000000000000000000000000000000000000000000000000000038bf": "0xe00b6260af6d71e9c497da680506eff3b460606522016e8f5b3791c9573931b6", - "0x0000000000000000000000000000000000000000000000000000000000001959": "0x00000000000000000000000000000000000000000000000000000000698aacea", - "0x00000000000000000000000000000000000000000000000000000000000019bc": "0x00000000000000000000000000000000000000000000000000000000698aad4d", - "0x0000000000000000000000000000000000000000000000000000000000003ae3": "0xfa76587ab62f974450aa4caf41fc6ec115ef0eb85b0174473a4344e81af5beb7", - "0x00000000000000000000000000000000000000000000000000000000000038e5": "0xcdcd789b5aa94ab2fb73c046b72e7578fa0cebea9c3a67d30c2c0a5bf0c40e2a", - "0x0000000000000000000000000000000000000000000000000000000000003974": "0xd570b0e685cca7f50479add7023feb35723b21841e621de4889f66707d4bed0c", - "0x0000000000000000000000000000000000000000000000000000000000003aeb": "0xa593ccaa116d15e1196163d1d7f43ee1c070db38cb6a792bbf9b6e7d0788e5f1", - "0x0000000000000000000000000000000000000000000000000000000000001945": "0x00000000000000000000000000000000000000000000000000000000698aacd6", - "0x000000000000000000000000000000000000000000000000000000000000191d": "0x00000000000000000000000000000000000000000000000000000000698aacae", - "0x00000000000000000000000000000000000000000000000000000000000039cb": "0x62b5d4776c4c7e7351cc34861db9405edfb8c9cd341d35f24d4f233ae1dcaad4", - "0x0000000000000000000000000000000000000000000000000000000000003939": "0x9f7a193ea8f2b57d6ca156f6d5d574122a347330522c6e5f2b269e94ecc53d5b", - "0x00000000000000000000000000000000000000000000000000000000000018ee": "0x00000000000000000000000000000000000000000000000000000000698aac7f", - "0x00000000000000000000000000000000000000000000000000000000000039ed": "0x27c4e1f9620dcf81a0bb60f3fb4f8f6443798472e27be0d0076c03a2cc836e27", - "0x00000000000000000000000000000000000000000000000000000000000039f4": "0xb9c668d2e4cd222059552922729eaee6f778bec86d077b595e7299f9eff0ceaf", - "0x0000000000000000000000000000000000000000000000000000000000001a7b": "0x00000000000000000000000000000000000000000000000000000000698aae0c", - "0x0000000000000000000000000000000000000000000000000000000000001adb": "0x00000000000000000000000000000000000000000000000000000000698aae6c", - "0x000000000000000000000000000000000000000000000000000000000000196c": "0x00000000000000000000000000000000000000000000000000000000698aacfd", - "0x0000000000000000000000000000000000000000000000000000000000003983": "0x59d270c54a285ec82407f45f78bd9ea27e98f6f69aadd20edaf52ca68841ce6c", - "0x000000000000000000000000000000000000000000000000000000000000190e": "0x00000000000000000000000000000000000000000000000000000000698aac9f", - "0x00000000000000000000000000000000000000000000000000000000000038ca": "0x080fd26ea62698abb3c69e3685dd6b535d3c72067c5a857f8163c3ad46b3266c", - "0x0000000000000000000000000000000000000000000000000000000000003a27": "0x62163057640a06819d2b90776e283fbba39443b8cd3edc90e1f43a36d012ecf5", - "0x0000000000000000000000000000000000000000000000000000000000001ab6": "0x00000000000000000000000000000000000000000000000000000000698aae47", - "0x0000000000000000000000000000000000000000000000000000000000003ae7": "0x3f764cd1012ad805cb8ff6d69f96fbcde62fbd45f28f187d961d37699ff8220f", - "0x000000000000000000000000000000000000000000000000000000000000194c": "0x00000000000000000000000000000000000000000000000000000000698aacdd", - "0x0000000000000000000000000000000000000000000000000000000000001af6": "0x00000000000000000000000000000000000000000000000000000000698aae87", - "0x00000000000000000000000000000000000000000000000000000000000038d5": "0x38169d4672e800f16ec4a11edb6c91da94410c3feed2ae692a4d5c05ca0eb697", - "0x0000000000000000000000000000000000000000000000000000000000003a6e": "0xf9d8cbe974f69842fa18e04e4ab36ebf83236c6d0f979ffdc561cd11360d8e48", - "0x000000000000000000000000000000000000000000000000000000000000194e": "0x00000000000000000000000000000000000000000000000000000000698aacdf", - "0x0000000000000000000000000000000000000000000000000000000000001a36": "0x00000000000000000000000000000000000000000000000000000000698aadc7", - "0x00000000000000000000000000000000000000000000000000000000000018e7": "0x00000000000000000000000000000000000000000000000000000000698aac78", - "0x0000000000000000000000000000000000000000000000000000000000003a20": "0xfcd6c54a2d0f112b19d6f1c13d7c45b300176bb5e3e8e60f6bd4aad0608942c9", - "0x0000000000000000000000000000000000000000000000000000000000003a67": "0xcf5e3182d415399043eb110e1de34ba3fb4a358cbc43d233131c3d07f89cc0ed", - "0x0000000000000000000000000000000000000000000000000000000000001a0f": "0x00000000000000000000000000000000000000000000000000000000698aada0", - "0x00000000000000000000000000000000000000000000000000000000000038e8": "0x6126a59b39d77c4a8c42b48c6fbe329509925f31f59c33140e3a6196b29b4390", - "0x000000000000000000000000000000000000000000000000000000000000396b": "0xab07b77e0119794579165630668407bbef0cfc1f088b4d9d3a8ddd5af2c1f70e", - "0x000000000000000000000000000000000000000000000000000000000000194d": "0x00000000000000000000000000000000000000000000000000000000698aacde", - "0x0000000000000000000000000000000000000000000000000000000000001938": "0x00000000000000000000000000000000000000000000000000000000698aacc9", - "0x0000000000000000000000000000000000000000000000000000000000003add": "0x60681dfc2c0229bebf4124f0ed00fd891ee14102f79608e9e12fbca15c032380", - "0x00000000000000000000000000000000000000000000000000000000000018a5": "0x00000000000000000000000000000000000000000000000000000000698aac36", - "0x0000000000000000000000000000000000000000000000000000000000001957": "0x00000000000000000000000000000000000000000000000000000000698aace8", - "0x00000000000000000000000000000000000000000000000000000000000038e3": "0x5e562022bd738e5f5062520168df9fba1ebe7e3f84715c92f16c9d969431523a", - "0x00000000000000000000000000000000000000000000000000000000000018a1": "0x00000000000000000000000000000000000000000000000000000000698aac32", - "0x0000000000000000000000000000000000000000000000000000000000003aba": "0x0b4306db83079c3d06a7eb2d2cc150326ef8f4f20011c3f622a88069a3597d34", - "0x0000000000000000000000000000000000000000000000000000000000003ac0": "0x3cbd38eeb048fc3cd5854a161555dc82dd7d93399d4bda4894be8eb31c73ea0d", - "0x0000000000000000000000000000000000000000000000000000000000003aef": "0xd29465054d92af50d0652edde0f6dce385950623818a9ee3f676eec24f5b8a61", - "0x0000000000000000000000000000000000000000000000000000000000001ae0": "0x00000000000000000000000000000000000000000000000000000000698aae71", - "0x0000000000000000000000000000000000000000000000000000000000003981": "0x76fc9584b173611fa6d87e1ff10a60446e3e9a850d826c0b3c4e5ff959c2d25d", - "0x0000000000000000000000000000000000000000000000000000000000003b01": "0x816c0b452079c9640a1518169ea5a07aa7d79a7d9f308608970e35b2ac6fa854", - "0x00000000000000000000000000000000000000000000000000000000000039a4": "0x9419cfb8e06a4d8504662897aac929caa1c612dfc4c5b4890fcb006cfa364090", - "0x00000000000000000000000000000000000000000000000000000000000019c5": "0x00000000000000000000000000000000000000000000000000000000698aad56", - "0x0000000000000000000000000000000000000000000000000000000000001972": "0x00000000000000000000000000000000000000000000000000000000698aad03", - "0x00000000000000000000000000000000000000000000000000000000000018e2": "0x00000000000000000000000000000000000000000000000000000000698aac73", - "0x0000000000000000000000000000000000000000000000000000000000003a74": "0x12aae63f5038011fbbf494c772994af0c41faf471fa97475407c234431748169", - "0x0000000000000000000000000000000000000000000000000000000000003b0a": "0x45350f6aba08b08608bf6e6754674f9336e17ca4732b70db4cf4ec7b13157fc2", - "0x00000000000000000000000000000000000000000000000000000000000038ac": "0x77d07ab1458c133cfd6191ba3761179909bd827f3873072a8606f783895994e0", - "0x0000000000000000000000000000000000000000000000000000000000001a27": "0x00000000000000000000000000000000000000000000000000000000698aadb8", - "0x00000000000000000000000000000000000000000000000000000000000018a9": "0x00000000000000000000000000000000000000000000000000000000698aac3a", - "0x0000000000000000000000000000000000000000000000000000000000001a72": "0x00000000000000000000000000000000000000000000000000000000698aae03", - "0x000000000000000000000000000000000000000000000000000000000000392f": "0xc6dfa85ab1c7459cea4e61efda1f20f6f3fa18bfd0ad2715ed8e11c0d51b108b", - "0x0000000000000000000000000000000000000000000000000000000000003af5": "0x41ab051a6047046f40a2e6be99ef2b85635f9da6052b67a657a5c3762d560e2a", - "0x0000000000000000000000000000000000000000000000000000000000003af9": "0x8062c9ca2c3eb21620022930510ec2d1b175fa1d0520f7874f5e359e49ed106a", - "0x0000000000000000000000000000000000000000000000000000000000001a8d": "0x00000000000000000000000000000000000000000000000000000000698aae1e", - "0x0000000000000000000000000000000000000000000000000000000000001925": "0x00000000000000000000000000000000000000000000000000000000698aacb6", - "0x0000000000000000000000000000000000000000000000000000000000003a29": "0x82d4c71e46dd8ce0a2e11b8c5148703658cf18fd3c7a60a9a83aa00b1b7a3fc1", - "0x0000000000000000000000000000000000000000000000000000000000003a84": "0x9618e222d2473550bac55784709d73f9389937a91c15435f23ae37ea0ae48d4e", - "0x0000000000000000000000000000000000000000000000000000000000001964": "0x00000000000000000000000000000000000000000000000000000000698aacf5", - "0x0000000000000000000000000000000000000000000000000000000000003999": "0x9e77c3e14b564b405adf97085132d4b75a2b8217f59586b2b11a53378173ec5c", - "0x000000000000000000000000000000000000000000000000000000000000199c": "0x00000000000000000000000000000000000000000000000000000000698aad2d", - "0x00000000000000000000000000000000000000000000000000000000000039ab": "0x0fb119756508ef88cd04e68233aae470fb1843de3fb16a6d4dc8d83af6b7e55c", - "0x0000000000000000000000000000000000000000000000000000000000003a7b": "0x87d5d9f162c1a9f7d49295cc72b48aacb4b9156723fa99458ae6e898486acb44", - "0x0000000000000000000000000000000000000000000000000000000000003a65": "0xda51f9d77f6568f998e81097b751e832ea0a9f085af70591e8ecc7ee8d664872", - "0x000000000000000000000000000000000000000000000000000000000000192a": "0x00000000000000000000000000000000000000000000000000000000698aacbb", - "0x00000000000000000000000000000000000000000000000000000000000038aa": "0x295bc302ce89624479ab9dd9b409dc94368d596329b5a42f3322690a0b590710", - "0x00000000000000000000000000000000000000000000000000000000000038be": "0xcd8ce8406601aee3e3174a103d69026d5be7b6f8971c66a7ae424d74720283dc", - "0x0000000000000000000000000000000000000000000000000000000000003921": "0x2868f272edc845a22ad4f8e3a48a508f4d5097620a4a79619dbc2f32ba8264c5", - "0x00000000000000000000000000000000000000000000000000000000000039c8": "0x0e6e6c3440486ea4daac5a79b29b5b203c54e9f3309f43f077ec458099747b30", - "0x0000000000000000000000000000000000000000000000000000000000003a32": "0x7fe997f11452c7537fe0c54adb5952fb4b2d1b3e4328304e2b247da3607d2033", - "0x0000000000000000000000000000000000000000000000000000000000003a4f": "0x08d8a7537935ae284c9513ae1b35aba59979167560173d6f065d15d1209924ee", - "0x0000000000000000000000000000000000000000000000000000000000003afd": "0xf65a0d8c631bd5aebefcce9f1e3a138299a04b11330eceb82a04b5c1ecc826f6", - "0x0000000000000000000000000000000000000000000000000000000000001a42": "0x00000000000000000000000000000000000000000000000000000000698aadd3", - "0x00000000000000000000000000000000000000000000000000000000000018f9": "0x00000000000000000000000000000000000000000000000000000000698aac8a", - "0x00000000000000000000000000000000000000000000000000000000000038c3": "0xfea09183c6f3d38da3dab267c642acbf66515154206d5f26bc44fe6b4c59aa36", - "0x00000000000000000000000000000000000000000000000000000000000018df": "0x00000000000000000000000000000000000000000000000000000000698aac70", - "0x00000000000000000000000000000000000000000000000000000000000019f4": "0x00000000000000000000000000000000000000000000000000000000698aad85", - "0x0000000000000000000000000000000000000000000000000000000000001ac7": "0x00000000000000000000000000000000000000000000000000000000698aae58", - "0x00000000000000000000000000000000000000000000000000000000000018ff": "0x00000000000000000000000000000000000000000000000000000000698aac90", - "0x0000000000000000000000000000000000000000000000000000000000003a8f": "0xde00d492eac51fa8ff882376cc61f473c03e6714ea705acc4e406698d1e47112", - "0x00000000000000000000000000000000000000000000000000000000000019c6": "0x00000000000000000000000000000000000000000000000000000000698aad57", - "0x00000000000000000000000000000000000000000000000000000000000019f6": "0x00000000000000000000000000000000000000000000000000000000698aad87", - "0x0000000000000000000000000000000000000000000000000000000000001a09": "0x00000000000000000000000000000000000000000000000000000000698aad9a", - "0x0000000000000000000000000000000000000000000000000000000000001b32": "0x00000000000000000000000000000000000000000000000000000000698aaec3", - "0x00000000000000000000000000000000000000000000000000000000000019d0": "0x00000000000000000000000000000000000000000000000000000000698aad61", - "0x0000000000000000000000000000000000000000000000000000000000001abf": "0x00000000000000000000000000000000000000000000000000000000698aae50", - "0x000000000000000000000000000000000000000000000000000000000000398a": "0x90435ab5fce7d19924a6d7356bbb8ea891bdc8e9da378ee512869757102183ab", - "0x0000000000000000000000000000000000000000000000000000000000001aa9": "0x00000000000000000000000000000000000000000000000000000000698aae3a", - "0x000000000000000000000000000000000000000000000000000000000000395b": "0x365f089623e091a6bd0929ba6f730e0777b5481048d199673e25b0ebc15ff80f", - "0x0000000000000000000000000000000000000000000000000000000000003a56": "0x8c1cd85c4ec5fbc9a28ce0db5ba2b1c13d32a5843ab15866a81f2ddb14e47baa", - "0x0000000000000000000000000000000000000000000000000000000000003aa9": "0x733d200a8a784403b953813323b32dd3da442eb190145efc0a4e784e20924327", - "0x0000000000000000000000000000000000000000000000000000000000003afa": "0xef3bcb187d1e38d984981b7e60eed2ec18dafd0457e1a69973a35deef36800c2", - "0x0000000000000000000000000000000000000000000000000000000000001ad6": "0x00000000000000000000000000000000000000000000000000000000698aae67", - "0x00000000000000000000000000000000000000000000000000000000000038a8": "0xa476d28490fbe376738d09460b5a39d24c9da0140e1e6097ea6464372e24ee1f", - "0x0000000000000000000000000000000000000000000000000000000000001ad7": "0x00000000000000000000000000000000000000000000000000000000698aae68", - "0x0000000000000000000000000000000000000000000000000000000000001930": "0x00000000000000000000000000000000000000000000000000000000698aacc1", - "0x0000000000000000000000000000000000000000000000000000000000001ad0": "0x00000000000000000000000000000000000000000000000000000000698aae61", - "0x0000000000000000000000000000000000000000000000000000000000001ad1": "0x00000000000000000000000000000000000000000000000000000000698aae62", - "0x0000000000000000000000000000000000000000000000000000000000003b0e": "0x72786023cc07c813e842061ae725cb88e22ba36b2078ad376ff5aa525161b1c4", - "0x00000000000000000000000000000000000000000000000000000000000039d8": "0x51d4b9a81a77fccecbd296e001197a7d6dd003922576022382d4f638260d5cff", - "0x00000000000000000000000000000000000000000000000000000000000039d5": "0x0549ba10bf6bdfb1c92baed8bd3bdef616b47129b01e8fec7e8bea9c64d0f94e", - "0x00000000000000000000000000000000000000000000000000000000000039f9": "0xdb3124a4b6a15a759a9b9b834b13b4a63cc57ae145ae3b103f9caf0681826851", - "0x00000000000000000000000000000000000000000000000000000000000018a6": "0x00000000000000000000000000000000000000000000000000000000698aac37", - "0x00000000000000000000000000000000000000000000000000000000000019ea": "0x00000000000000000000000000000000000000000000000000000000698aad7b", - "0x0000000000000000000000000000000000000000000000000000000000001a65": "0x00000000000000000000000000000000000000000000000000000000698aadf6", - "0x00000000000000000000000000000000000000000000000000000000000039e7": "0x37a8ab62412aed79c0f3eec06ce11491e61990de23e3a8626264deeb030be771", - "0x0000000000000000000000000000000000000000000000000000000000001a6b": "0x00000000000000000000000000000000000000000000000000000000698aadfc", - "0x00000000000000000000000000000000000000000000000000000000000018b4": "0x00000000000000000000000000000000000000000000000000000000698aac45", - "0x00000000000000000000000000000000000000000000000000000000000019bb": "0x00000000000000000000000000000000000000000000000000000000698aad4c", - "0x0000000000000000000000000000000000000000000000000000000000001b2e": "0x00000000000000000000000000000000000000000000000000000000698aaebf", - "0x0000000000000000000000000000000000000000000000000000000000003b32": "0x0ac7590ad935bb0884bab77f7caa2949ff2fa268dfe8e554f669ccdd826a9b0f", - "0x000000000000000000000000000000000000000000000000000000000000399b": "0x2a989db4e0a864641fed59d1f058cb09f422a978e5b84123f997cf6cada10f66", - "0x0000000000000000000000000000000000000000000000000000000000001944": "0x00000000000000000000000000000000000000000000000000000000698aacd5", - "0x00000000000000000000000000000000000000000000000000000000000039dd": "0x7e6e899cb1938f6f31f1cfa2a0435515afbd0cdda5f0c807f40ab76aab4dcc93", - "0x0000000000000000000000000000000000000000000000000000000000003acd": "0x63f7793d0e7c7ed0ef51dbb6934c50de4bb8525a220b02a495cb11a4ae7ca240", - "0x0000000000000000000000000000000000000000000000000000000000001921": "0x00000000000000000000000000000000000000000000000000000000698aacb2", - "0x0000000000000000000000000000000000000000000000000000000000003a78": "0x0b7c6a632c3a9b85f60831c20e7f8fb5cef668db201fc3aeff6a209ee6146088", - "0x00000000000000000000000000000000000000000000000000000000000019c3": "0x00000000000000000000000000000000000000000000000000000000698aad54", - "0x0000000000000000000000000000000000000000000000000000000000003a98": "0x942a908b6120ce2099509099d0b25d6193a3ec32557c72fa7276081d718cf9f7", - "0x0000000000000000000000000000000000000000000000000000000000003ae8": "0x84184fd81383a5d6625250617c8da3cfcdb2f682d7e70b71d5e96916e6b53689", - "0x00000000000000000000000000000000000000000000000000000000000038a5": "0xa0f5bd23058beeaeed6e7243529076af8eef7348825c20819affd19f6023f035", - "0x00000000000000000000000000000000000000000000000000000000000038c1": "0xabd1706023abbd5e49cbe7344b3233373bf4bd41164cb988ea280098afc5a557", - "0x0000000000000000000000000000000000000000000000000000000000001b01": "0x00000000000000000000000000000000000000000000000000000000698aae92", - "0x00000000000000000000000000000000000000000000000000000000000019cf": "0x00000000000000000000000000000000000000000000000000000000698aad60", - "0x0000000000000000000000000000000000000000000000000000000000003908": "0xe25b8b9c7a1a4ff89d7d57d3fcf7b8ee28d92bc70f2d583a38e1622ee713fa3d", - "0x00000000000000000000000000000000000000000000000000000000000018fb": "0x00000000000000000000000000000000000000000000000000000000698aac8c", - "0x00000000000000000000000000000000000000000000000000000000000039b0": "0xf58eca9cd4bd8c109adafe9fd6100b094b1d34211b843f4daa88d160d5977b00", - "0x00000000000000000000000000000000000000000000000000000000000018ec": "0x00000000000000000000000000000000000000000000000000000000698aac7d", - "0x00000000000000000000000000000000000000000000000000000000000018be": "0x00000000000000000000000000000000000000000000000000000000698aac4f", - "0x0000000000000000000000000000000000000000000000000000000000003a7d": "0x5ac18d9cd7deebc7544cd8fccc9db30d1d8ab980cd46f322062532e70fa30e8b", - "0x0000000000000000000000000000000000000000000000000000000000003909": "0x3519014c0d3817a7c3a36d86e8e7d8f45463c036bfe3653a7746b577f6d7a823", - "0x0000000000000000000000000000000000000000000000000000000000003930": "0x4f3832361a12c929077c857e017cd7bccbadd9225765f3cdff53c6849f3c9197", - "0x000000000000000000000000000000000000000000000000000000000000394a": "0xdd248773b8ad82850b6fe8ee798a348e4ce57a92badf9c1961c3019ebdb715c3", - "0x0000000000000000000000000000000000000000000000000000000000001989": "0x00000000000000000000000000000000000000000000000000000000698aad1a", - "0x0000000000000000000000000000000000000000000000000000000000001908": "0x00000000000000000000000000000000000000000000000000000000698aac99", - "0x0000000000000000000000000000000000000000000000000000000000001a48": "0x00000000000000000000000000000000000000000000000000000000698aadd9", - "0x0000000000000000000000000000000000000000000000000000000000001b02": "0x00000000000000000000000000000000000000000000000000000000698aae93", - "0x0000000000000000000000000000000000000000000000000000000000001a69": "0x00000000000000000000000000000000000000000000000000000000698aadfa", - "0x00000000000000000000000000000000000000000000000000000000000018d7": "0x00000000000000000000000000000000000000000000000000000000698aac68", - "0x0000000000000000000000000000000000000000000000000000000000003b33": "0x82340f48969471d6defbc707634e50f104bbc39440633ffff906283356ee687c", - "0x0000000000000000000000000000000000000000000000000000000000001acd": "0x00000000000000000000000000000000000000000000000000000000698aae5e", - "0x00000000000000000000000000000000000000000000000000000000000039c0": "0x536a5153bc6c35cc6a691a407bc3c910f6391b35d37c1d68731c29a9f758dcf1", - "0x0000000000000000000000000000000000000000000000000000000000003a0f": "0x2df9e8aca9fe89b436fdb2416677d733d8d22e6918eace646c829c1ca4874e80", - "0x00000000000000000000000000000000000000000000000000000000000039f1": "0x948e74facacb11f793b49a29600df62955358e1aa1c713325b10c9da218f16e3", - "0x0000000000000000000000000000000000000000000000000000000000001a38": "0x00000000000000000000000000000000000000000000000000000000698aadc9", - "0x0000000000000000000000000000000000000000000000000000000000001983": "0x00000000000000000000000000000000000000000000000000000000698aad14", - "0x000000000000000000000000000000000000000000000000000000000000398c": "0xe428824d64f8d72c16b644b542b10c9c3589e8f98f91c75a05342e3b2b8e8c4d", - "0x0000000000000000000000000000000000000000000000000000000000003af3": "0x3080edb28d929a658f33b390f1451e180cf786343bff335ed20f6bcb1502127f", - "0x0000000000000000000000000000000000000000000000000000000000001940": "0x00000000000000000000000000000000000000000000000000000000698aacd1", - "0x0000000000000000000000000000000000000000000000000000000000001aca": "0x00000000000000000000000000000000000000000000000000000000698aae5b", - "0x00000000000000000000000000000000000000000000000000000000000038f2": "0x32eb5af453ad28020ea966b268496386379a37cc8b895ed80a2ebed3032d7f48", - "0x0000000000000000000000000000000000000000000000000000000000001a61": "0x00000000000000000000000000000000000000000000000000000000698aadf2", - "0x0000000000000000000000000000000000000000000000000000000000001a64": "0x00000000000000000000000000000000000000000000000000000000698aadf5", - "0x0000000000000000000000000000000000000000000000000000000000003a02": "0xcf9fa29325f6557239c3af8e9cc5f88c8dc2c68c456ff3aead4f1fe48e4979bb", - "0x00000000000000000000000000000000000000000000000000000000000039ca": "0x4823a0680ed2a90a5f878bef73d5a92a133e5504b62a601083e53bd6192f870b", - "0x0000000000000000000000000000000000000000000000000000000000003a21": "0xb966fa1d4ba4e1c363192a7c25352289b37fec7d63b04dae2e370bbfaa1f17ad", - "0x000000000000000000000000000000000000000000000000000000000000193a": "0x00000000000000000000000000000000000000000000000000000000698aaccb", - "0x000000000000000000000000000000000000000000000000000000000000198b": "0x00000000000000000000000000000000000000000000000000000000698aad1c", - "0x000000000000000000000000000000000000000000000000000000000000197c": "0x00000000000000000000000000000000000000000000000000000000698aad0d", - "0x0000000000000000000000000000000000000000000000000000000000003a6f": "0x45a248fb92c5e6fcc058bb9893aff2e58dcc7485c910f2187e266992568a1816", - "0x0000000000000000000000000000000000000000000000000000000000003ae6": "0xb32d54c8f5ef5c3c34d818887eb7287e7a6aeda3480ac722e784fef25f917285", - "0x000000000000000000000000000000000000000000000000000000000000391d": "0x65e80894522c037c50853c7abb037fd36b9ef447d78fba8e343be9fe0ea9b3e4", - "0x000000000000000000000000000000000000000000000000000000000000195f": "0x00000000000000000000000000000000000000000000000000000000698aacf0", - "0x0000000000000000000000000000000000000000000000000000000000001abb": "0x00000000000000000000000000000000000000000000000000000000698aae4c", - "0x00000000000000000000000000000000000000000000000000000000000018eb": "0x00000000000000000000000000000000000000000000000000000000698aac7c", - "0x0000000000000000000000000000000000000000000000000000000000001b07": "0x00000000000000000000000000000000000000000000000000000000698aae98", - "0x0000000000000000000000000000000000000000000000000000000000003a24": "0x46903fa675564c84d35c99c74c1b797e3060f4a227a70f0ba117dd5c1b46630a", - "0x0000000000000000000000000000000000000000000000000000000000003aa6": "0xfd9f3fb15c05d7d0c23974863f6410f41ff1a83d46867b97e04418ac37006c20", - "0x00000000000000000000000000000000000000000000000000000000000039ce": "0x8931e725cd17bef84c7ec2ad038b72799f202a63747d1ace170aca0e541ce778", - "0x000000000000000000000000000000000000000000000000000000000000192b": "0x00000000000000000000000000000000000000000000000000000000698aacbc", - "0x0000000000000000000000000000000000000000000000000000000000001a98": "0x00000000000000000000000000000000000000000000000000000000698aae29", - "0x0000000000000000000000000000000000000000000000000000000000003a23": "0x2015cf727c7a1073402634a47a4ce6b3f21949a5ea5e58b64b2c2162d0756cce", - "0x0000000000000000000000000000000000000000000000000000000000003b43": "0x084d6a39483f17265747dcccd6cf7132b3653062d227ebddb5cf1fce37257d00", - "0x0000000000000000000000000000000000000000000000000000000000001933": "0x00000000000000000000000000000000000000000000000000000000698aacc4", - "0x0000000000000000000000000000000000000000000000000000000000001a04": "0x00000000000000000000000000000000000000000000000000000000698aad95", - "0x0000000000000000000000000000000000000000000000000000000000003923": "0xd35f38374842fdf817376054ed06fc827e310984a2281dfbfea694bd4f432679", - "0x0000000000000000000000000000000000000000000000000000000000003907": "0x60f1bfaf3d2256f6813f03cc730228b260925f8c46653479da51a820ca7f82b0", - "0x0000000000000000000000000000000000000000000000000000000000003b0b": "0x129ca661fae5aea1a91b0550303516f265df26b434fc22e820e9928a6d4b4ec7", - "0x0000000000000000000000000000000000000000000000000000000000003a2e": "0xdd2dac719d5731f8d1a792f96002f13eae4f5a07ae3a690e7606c0590b8ef033", - "0x0000000000000000000000000000000000000000000000000000000000003a54": "0x19d6119013d59602e600b39bc6b10208f9956bc08b8ad3dcc5c9a6c57c433aa9", - "0x000000000000000000000000000000000000000000000000000000000000191b": "0x00000000000000000000000000000000000000000000000000000000698aacac", - "0x00000000000000000000000000000000000000000000000000000000000018ac": "0x00000000000000000000000000000000000000000000000000000000698aac3d", - "0x00000000000000000000000000000000000000000000000000000000000018fc": "0x00000000000000000000000000000000000000000000000000000000698aac8d", - "0x00000000000000000000000000000000000000000000000000000000000019e4": "0x00000000000000000000000000000000000000000000000000000000698aad75", - "0x00000000000000000000000000000000000000000000000000000000000019e0": "0x00000000000000000000000000000000000000000000000000000000698aad71", - "0x0000000000000000000000000000000000000000000000000000000000003959": "0x3c18f7e4413d8d8ee647d97658cb901e3287c250c58d4e5ca8c5bda399f36182", - "0x0000000000000000000000000000000000000000000000000000000000003a85": "0x6b93511fdd39cb33b49be3663008308ec74315d6068185c5406826c7a2ba105c", - "0x0000000000000000000000000000000000000000000000000000000000003a1a": "0xd710fa2e4f98c52081b3f5e608cfa731f3ab628b1d1979a2d0b66c71d5050fd2", - "0x00000000000000000000000000000000000000000000000000000000000019a6": "0x00000000000000000000000000000000000000000000000000000000698aad37", - "0x0000000000000000000000000000000000000000000000000000000000003aa0": "0xd88f0314ebbc7a485e77f5033cc4f972b85b6f36fff98ae8203c778d07f55a01", - "0x00000000000000000000000000000000000000000000000000000000000019b0": "0x00000000000000000000000000000000000000000000000000000000698aad41", - "0x0000000000000000000000000000000000000000000000000000000000003ab1": "0xbc52074ce1945050a0c0b16300b8ca329246d8471647c308005aa129272f0986", - "0x0000000000000000000000000000000000000000000000000000000000003ae5": "0x575bb979811a9a7f52280eb7370dfbe7f5088fb97b27bf70306b4168ae82be54", - "0x000000000000000000000000000000000000000000000000000000000000394d": "0xf19a83ff35f7426821597247b69a27cde37bf4d0d6571e2947c5fff38d781ff2", - "0x000000000000000000000000000000000000000000000000000000000000190f": "0x00000000000000000000000000000000000000000000000000000000698aaca0", - "0x0000000000000000000000000000000000000000000000000000000000003a92": "0xe73055374c1b5be0a81cd852af7d0b29523ec988a0fa5a97159db695c691d7b1", - "0x0000000000000000000000000000000000000000000000000000000000001aba": "0x00000000000000000000000000000000000000000000000000000000698aae4b", - "0x0000000000000000000000000000000000000000000000000000000000001b0e": "0x00000000000000000000000000000000000000000000000000000000698aae9f", - "0x0000000000000000000000000000000000000000000000000000000000003ae2": "0xc25856c17b29ebaf58dab8f7f935ae465d2aec638f3e3691cac464e9c69da539", - "0x0000000000000000000000000000000000000000000000000000000000003afe": "0x175fbef47602789b6a640f715af54158d531fe6d1b24976fea916d985aa79420", - "0x000000000000000000000000000000000000000000000000000000000000193c": "0x00000000000000000000000000000000000000000000000000000000698aaccd", - "0x00000000000000000000000000000000000000000000000000000000000038d1": "0x901128a38ef41ede18724e138ce2c5cf21ec64bc053c1bb425780587391a9eeb", - "0x0000000000000000000000000000000000000000000000000000000000001a96": "0x00000000000000000000000000000000000000000000000000000000698aae27", - "0x0000000000000000000000000000000000000000000000000000000000003a75": "0xf217905acd62ab9b16a9352003ca7a8a67bae4b57d41dd6a9de9ead344c1d63a", - "0x0000000000000000000000000000000000000000000000000000000000003adc": "0xcac809a70bee073b55a40b1a520d2eceed1db023e772c976427cad3d87b39409", - "0x0000000000000000000000000000000000000000000000000000000000003ab7": "0x187e7034fae07e622bf753195d000911e5488bb4676ae7140eee447ec17ff040", - "0x00000000000000000000000000000000000000000000000000000000000018ab": "0x00000000000000000000000000000000000000000000000000000000698aac3c", - "0x000000000000000000000000000000000000000000000000000000000000399e": "0x1d1cc20a1015cdf8e76bed192448909bf02ae710573ae971d4d5665258e4395f", - "0x00000000000000000000000000000000000000000000000000000000000018a3": "0x00000000000000000000000000000000000000000000000000000000698aac34", - "0x00000000000000000000000000000000000000000000000000000000000038a0": "0x7b3bad8115d18d40079633c0effcde8bad55af4f66c236ea5f1e8c66813bd8ea", - "0x0000000000000000000000000000000000000000000000000000000000001a60": "0x00000000000000000000000000000000000000000000000000000000698aadf1", - "0x0000000000000000000000000000000000000000000000000000000000003ae9": "0x4513c8735d3d8da79e100d62d958d1b3780b927b9d6bd3ac36bcaf1ff43b7b5e", - "0x00000000000000000000000000000000000000000000000000000000000039e1": "0xaa99aafe55322cf492349993b93b5dd5ac5eb981c334c9133243a9287876be92", - "0x0000000000000000000000000000000000000000000000000000000000001976": "0x00000000000000000000000000000000000000000000000000000000698aad07", - "0x00000000000000000000000000000000000000000000000000000000000019b3": "0x00000000000000000000000000000000000000000000000000000000698aad44", - "0x0000000000000000000000000000000000000000000000000000000000003938": "0x4c4a830e8a95a4045a0a07f20b59dcae0becc0a4973f14eea63370fd751a213c", - "0x000000000000000000000000000000000000000000000000000000000000193d": "0x00000000000000000000000000000000000000000000000000000000698aacce", - "0x0000000000000000000000000000000000000000000000000000000000003a44": "0xf4ef03f9a1adf544ea37ae8a3a91d3b2e7a3c7a2741b370f867d027de6355829", - "0x00000000000000000000000000000000000000000000000000000000000039a1": "0x94077044990722bf089ddb627d73743b230f0ecc0362e7b51f901227b31dc7a4", - "0x0000000000000000000000000000000000000000000000000000000000001a28": "0x00000000000000000000000000000000000000000000000000000000698aadb9", - "0x0000000000000000000000000000000000000000000000000000000000001abd": "0x00000000000000000000000000000000000000000000000000000000698aae4e", - "0x0000000000000000000000000000000000000000000000000000000000001af2": "0x00000000000000000000000000000000000000000000000000000000698aae83", - "0x0000000000000000000000000000000000000000000000000000000000001914": "0x00000000000000000000000000000000000000000000000000000000698aaca5", - "0x00000000000000000000000000000000000000000000000000000000000018d0": "0x00000000000000000000000000000000000000000000000000000000698aac61", - "0x0000000000000000000000000000000000000000000000000000000000001a16": "0x00000000000000000000000000000000000000000000000000000000698aada7", - "0x0000000000000000000000000000000000000000000000000000000000001ac6": "0x00000000000000000000000000000000000000000000000000000000698aae57", - "0x00000000000000000000000000000000000000000000000000000000000038d4": "0x428cc528088662b59b6dd4de76208026277b4afa84be308b2ac3dd0507f7500a", - "0x0000000000000000000000000000000000000000000000000000000000003957": "0xff3e16b5636b85b6ee8febebd1bc299c37497ad05c6ed9eb23f0af6a75b09b66", - "0x00000000000000000000000000000000000000000000000000000000000018cf": "0x00000000000000000000000000000000000000000000000000000000698aac60", - "0x0000000000000000000000000000000000000000000000000000000000001b03": "0x00000000000000000000000000000000000000000000000000000000698aae94", - "0x0000000000000000000000000000000000000000000000000000000000003995": "0x61cd4ba51cd9a61f381ca39d3eda2e092dae3626abe5e51318be6730313858b3", - "0x00000000000000000000000000000000000000000000000000000000000039d7": "0x363aed94ee007dda992a58b1f62111d7be11494d89288ba967d04d4f574e902d", - "0x0000000000000000000000000000000000000000000000000000000000003a57": "0x6db3357048cee39f6e09236438b3273256ca578fe0894b7fa33752aecadd2e7d", - "0x0000000000000000000000000000000000000000000000000000000000001ab8": "0x00000000000000000000000000000000000000000000000000000000698aae49", - "0x00000000000000000000000000000000000000000000000000000000000039c1": "0x28766847859cf71f0f5174cfe87c8821027fbec0dda28a686024e1e3bf7eef2f", - "0x00000000000000000000000000000000000000000000000000000000000019e2": "0x00000000000000000000000000000000000000000000000000000000698aad73", - "0x0000000000000000000000000000000000000000000000000000000000001acb": "0x00000000000000000000000000000000000000000000000000000000698aae5c", - "0x00000000000000000000000000000000000000000000000000000000000039c7": "0xe98ddd880ae551013ccce516c8f70a0b147c7178ae022f34bb27abe5364497f8", - "0x0000000000000000000000000000000000000000000000000000000000001981": "0x00000000000000000000000000000000000000000000000000000000698aad12", - "0x0000000000000000000000000000000000000000000000000000000000001987": "0x00000000000000000000000000000000000000000000000000000000698aad18", - "0x00000000000000000000000000000000000000000000000000000000000039bf": "0x5eb1231d5b403010a2ef3f790cf61b1b6af916c28ea5fbc92aee656b1196e341", - "0x00000000000000000000000000000000000000000000000000000000000039ff": "0x800bb5d0f20f05f54031f74897660dc6a8e6a943e9dd48bedc06f7bd5bde9db5", - "0x0000000000000000000000000000000000000000000000000000000000003ad1": "0x2d7721fbdfca84615c523f64903eff4aa90b970bae9c0eda3fad8579d01b8752", - "0x0000000000000000000000000000000000000000000000000000000000001a26": "0x00000000000000000000000000000000000000000000000000000000698aadb7", - "0x0000000000000000000000000000000000000000000000000000000000001ac4": "0x00000000000000000000000000000000000000000000000000000000698aae55", - "0x0000000000000000000000000000000000000000000000000000000000001ad4": "0x00000000000000000000000000000000000000000000000000000000698aae65", - "0x00000000000000000000000000000000000000000000000000000000000039b8": "0xcf18235292b50fb7c58dd941ddaa9ea0475a117dd1fe05ac5072ddeb2efe2d44", - "0x00000000000000000000000000000000000000000000000000000000000039aa": "0xbc75c6363536625583bffaaf0bb296f7a769cd57052603d08260c2360ddbb665", - "0x000000000000000000000000000000000000000000000000000000000000392e": "0x37302cd049d795f6b3d4b275bbfad158a18699ad17830a0a139fe7d70e775bed", - "0x0000000000000000000000000000000000000000000000000000000000001929": "0x00000000000000000000000000000000000000000000000000000000698aacba", - "0x0000000000000000000000000000000000000000000000000000000000001b2f": "0x00000000000000000000000000000000000000000000000000000000698aaec0", - "0x0000000000000000000000000000000000000000000000000000000000001a97": "0x00000000000000000000000000000000000000000000000000000000698aae28", - "0x00000000000000000000000000000000000000000000000000000000000018d2": "0x00000000000000000000000000000000000000000000000000000000698aac63", - "0x0000000000000000000000000000000000000000000000000000000000001943": "0x00000000000000000000000000000000000000000000000000000000698aacd4", - "0x00000000000000000000000000000000000000000000000000000000000018aa": "0x00000000000000000000000000000000000000000000000000000000698aac3b", - "0x0000000000000000000000000000000000000000000000000000000000001af9": "0x00000000000000000000000000000000000000000000000000000000698aae8a", - "0x0000000000000000000000000000000000000000000000000000000000001a58": "0x00000000000000000000000000000000000000000000000000000000698aade9", - "0x00000000000000000000000000000000000000000000000000000000000018b6": "0x00000000000000000000000000000000000000000000000000000000698aac47", - "0x0000000000000000000000000000000000000000000000000000000000001a70": "0x00000000000000000000000000000000000000000000000000000000698aae01", - "0x0000000000000000000000000000000000000000000000000000000000001928": "0x00000000000000000000000000000000000000000000000000000000698aacb9", - "0x00000000000000000000000000000000000000000000000000000000000018f3": "0x00000000000000000000000000000000000000000000000000000000698aac84", - "0x0000000000000000000000000000000000000000000000000000000000003a00": "0x31cbee18c6cd7c23c5ab0cb822d6104fbdc7980cceafacf4da22fc6187cc67bb", - "0x0000000000000000000000000000000000000000000000000000000000003ad6": "0xec1a7991d239ce1a88a690c0c3803e0f63ead942aa41cc2d87052383788489cf", - "0x00000000000000000000000000000000000000000000000000000000000019cd": "0x00000000000000000000000000000000000000000000000000000000698aad5e", - "0x00000000000000000000000000000000000000000000000000000000000039fe": "0x9879b71ce4eec5ec6282707fe8ff244cd1352958f3a225fcf98d0698c8009cc6", - "0x0000000000000000000000000000000000000000000000000000000000001912": "0x00000000000000000000000000000000000000000000000000000000698aaca3", - "0x0000000000000000000000000000000000000000000000000000000000003a05": "0xa16ecff2f93b963c9f7d17613bdc67158e1a58e09bb8e0e93587e98cceb1d32c", - "0x00000000000000000000000000000000000000000000000000000000000019de": "0x00000000000000000000000000000000000000000000000000000000698aad6f", - "0x0000000000000000000000000000000000000000000000000000000000003ad3": "0xf43fa9ec6a9b114fb24e3a46a66426d8c9750642d5cc551da5511e1bd2dd8974", - "0x0000000000000000000000000000000000000000000000000000000000003a40": "0x035b9d59c35918173ab987a75357c0cde6de0b2b9f2486416147bbd51ecb41a8", - "0x0000000000000000000000000000000000000000000000000000000000003b42": "0xb8ecc960e8e62341209c4702a5e18d1899ffdd8f0ba677d713ef7e9ec639e660", - "0x0000000000000000000000000000000000000000000000000000000000001a6e": "0x00000000000000000000000000000000000000000000000000000000698aadff", - "0x0000000000000000000000000000000000000000000000000000000000001a5b": "0x00000000000000000000000000000000000000000000000000000000698aadec", - "0x0000000000000000000000000000000000000000000000000000000000003a7a": "0x537219da342b152fe472d27173831d16f68a5b2dbc84dd1649ad0c2dd9652813", - "0x0000000000000000000000000000000000000000000000000000000000001988": "0x00000000000000000000000000000000000000000000000000000000698aad19", - "0x0000000000000000000000000000000000000000000000000000000000001a34": "0x00000000000000000000000000000000000000000000000000000000698aadc5", - "0x0000000000000000000000000000000000000000000000000000000000003a3f": "0x62eb17b54950adfada88405f3088b450939e428d2056d3e2b7afb6119ca31f12", - "0x0000000000000000000000000000000000000000000000000000000000001aac": "0x00000000000000000000000000000000000000000000000000000000698aae3d", - "0x0000000000000000000000000000000000000000000000000000000000001ae7": "0x00000000000000000000000000000000000000000000000000000000698aae78", - "0x0000000000000000000000000000000000000000000000000000000000001a12": "0x00000000000000000000000000000000000000000000000000000000698aada3", - "0x0000000000000000000000000000000000000000000000000000000000001a37": "0x00000000000000000000000000000000000000000000000000000000698aadc8", - "0x00000000000000000000000000000000000000000000000000000000000038cd": "0x06fbff04272b1ec5c8ace2092c2e2bc5e2cbca07f6dbb7a39c6fc27e01b6dbde", - "0x00000000000000000000000000000000000000000000000000000000000038da": "0xa713a39019339a7018b5c1ba4695a5e0180ceb834ece6cf529193dc598522c78", - "0x00000000000000000000000000000000000000000000000000000000000039a2": "0x3e305dbdd7cda1a88287a2c42b7a5ddf38b324fdacaf60035bdb3de0b6cef19b", - "0x00000000000000000000000000000000000000000000000000000000000038e9": "0x1dad2b1f28f59f119687a9f29c800b7e40a66c73d20feac426a1ac053f526734", - "0x00000000000000000000000000000000000000000000000000000000000019f8": "0x00000000000000000000000000000000000000000000000000000000698aad89", - "0x000000000000000000000000000000000000000000000000000000000000392d": "0xadf80e87a218157031ed6017034dc5535f41227def9153fb2391a972357064b5", - "0x0000000000000000000000000000000000000000000000000000000000003ac7": "0x3f33e62b8c7866ace7494f0b4cd68965d8a8f8b993ac003849474d7b86912967", - "0x0000000000000000000000000000000000000000000000000000000000003a95": "0xc48f7441f2f82764cac889b99b64c497e49d74eab0256849ab61c9356e6bce89", - "0x0000000000000000000000000000000000000000000000000000000000001947": "0x00000000000000000000000000000000000000000000000000000000698aacd8", - "0x0000000000000000000000000000000000000000000000000000000000003926": "0xe418fc964018037c6ae42189b49965beb65df1281c858655f165c250ad7dbf9b", - "0x0000000000000000000000000000000000000000000000000000000000001aa8": "0x00000000000000000000000000000000000000000000000000000000698aae39", - "0x0000000000000000000000000000000000000000000000000000000000003a36": "0xfd1f3155d61a01c1622ec228b1f7219f865e54970b81650ccbc10b05fa21a585", - "0x00000000000000000000000000000000000000000000000000000000000018da": "0x00000000000000000000000000000000000000000000000000000000698aac6b", - "0x0000000000000000000000000000000000000000000000000000000000001a59": "0x00000000000000000000000000000000000000000000000000000000698aadea", - "0x0000000000000000000000000000000000000000000000000000000000003a66": "0xf9c7101eb3954a6b985ac73005eb611ad2915f3139592ad3c0381a055ff27838", - "0x0000000000000000000000000000000000000000000000000000000000003ac6": "0x4e27a5c044d5eec5480e269a7ba6db10c90038261580edbc6174af4bb4cd78b2", - "0x00000000000000000000000000000000000000000000000000000000000039df": "0xa7fb413817a4ea4e4c441ac83e74e1d735e801eb89c55958da440b449c3cc1ff", - "0x0000000000000000000000000000000000000000000000000000000000003a80": "0xf311b8d0326a7733ebc0954e4ee00475c0c85caa94f5db0ae14b6f74f8fe10ea", - "0x0000000000000000000000000000000000000000000000000000000000001b08": "0x00000000000000000000000000000000000000000000000000000000698aae99", - "0x0000000000000000000000000000000000000000000000000000000000001b2d": "0x00000000000000000000000000000000000000000000000000000000698aaebe", - "0x0000000000000000000000000000000000000000000000000000000000003967": "0x876a1b5b09f498f740a7e84dc5ecb37356a2ae13a5dc485a537d70265b681375", - "0x0000000000000000000000000000000000000000000000000000000000001919": "0x00000000000000000000000000000000000000000000000000000000698aacaa", - "0x0000000000000000000000000000000000000000000000000000000000003ad8": "0xe8c897733fefdcaf09e2fcb640fff8dea2c189c301b7f5b4a44775c2c02e1ab5", - "0x00000000000000000000000000000000000000000000000000000000000019ac": "0x00000000000000000000000000000000000000000000000000000000698aad3d", - "0x00000000000000000000000000000000000000000000000000000000000018c6": "0x00000000000000000000000000000000000000000000000000000000698aac57", - "0x00000000000000000000000000000000000000000000000000000000000019be": "0x00000000000000000000000000000000000000000000000000000000698aad4f", - "0x0000000000000000000000000000000000000000000000000000000000001ae4": "0x00000000000000000000000000000000000000000000000000000000698aae75", - "0x00000000000000000000000000000000000000000000000000000000000019aa": "0x00000000000000000000000000000000000000000000000000000000698aad3b", - "0x0000000000000000000000000000000000000000000000000000000000001ac0": "0x00000000000000000000000000000000000000000000000000000000698aae51", - "0x0000000000000000000000000000000000000000000000000000000000003994": "0x2df6c63b18493fd81dea210603629fd01d24a08016c756006fbeb0af05eaa184", - "0x0000000000000000000000000000000000000000000000000000000000003a0a": "0x82494c6b0ed95f4b40ac21ae5adb5eae6c1a6a4a8a4912474fed0cc0daee1009", - "0x0000000000000000000000000000000000000000000000000000000000003aaa": "0x1b3ffdf777420f02b52e89a065ab2efc88d98f009b973481d1f6ec35f5ed6462", - "0x0000000000000000000000000000000000000000000000000000000000001aae": "0x00000000000000000000000000000000000000000000000000000000698aae3f", - "0x0000000000000000000000000000000000000000000000000000000000001aa7": "0x00000000000000000000000000000000000000000000000000000000698aae38", - "0x0000000000000000000000000000000000000000000000000000000000001b37": "0x00000000000000000000000000000000000000000000000000000000698aaec8", - "0x00000000000000000000000000000000000000000000000000000000000038dd": "0x1faa7ebc9bd507498593be5e32ef0c03ced8b0f8f60435a39a53253fbd10b24c", - "0x00000000000000000000000000000000000000000000000000000000000018ad": "0x00000000000000000000000000000000000000000000000000000000698aac3e", - "0x0000000000000000000000000000000000000000000000000000000000001949": "0x00000000000000000000000000000000000000000000000000000000698aacda", - "0x0000000000000000000000000000000000000000000000000000000000001afd": "0x00000000000000000000000000000000000000000000000000000000698aae8e", - "0x0000000000000000000000000000000000000000000000000000000000003abb": "0x29ccbcd2da8071857b9a754090f93418db7b16b4632ece9d8a228f9ea8a6ff4d", - "0x0000000000000000000000000000000000000000000000000000000000001aec": "0x00000000000000000000000000000000000000000000000000000000698aae7d", - "0x0000000000000000000000000000000000000000000000000000000000001af5": "0x00000000000000000000000000000000000000000000000000000000698aae86", - "0x0000000000000000000000000000000000000000000000000000000000003a4d": "0x98144ea17ab2148a1b4f43ab8ab1f65ff022bf3a0cf1ab95c3567dd16ff675b9", - "0x0000000000000000000000000000000000000000000000000000000000003a8b": "0xa8cec6696891eb0feae537133bad5884f1be9ad8149aac167b031a79cc81d591", - "0x0000000000000000000000000000000000000000000000000000000000003ab9": "0xa135cba876adda2eaea99647029626cfcc3ec51efa3ee7cb6e5b923f20e93d9b", - "0x00000000000000000000000000000000000000000000000000000000000019d2": "0x00000000000000000000000000000000000000000000000000000000698aad63", - "0x0000000000000000000000000000000000000000000000000000000000001abc": "0x00000000000000000000000000000000000000000000000000000000698aae4d", - "0x0000000000000000000000000000000000000000000000000000000000003902": "0x384341aa113e2e9effcf0ac44634fd158b03cdc83f77b3e123f0192b299ba477", - "0x0000000000000000000000000000000000000000000000000000000000003b31": "0x791dd8b46f30e71a3279831cf473cab6eac8b4cdf82523d84299ff8e28c021ed", - "0x00000000000000000000000000000000000000000000000000000000000039eb": "0x7c1f773d8440f896b52db6696e20e1d8d77814907fb3312086aa5193b0d2c95f", - "0x0000000000000000000000000000000000000000000000000000000000003931": "0x35dc62d49323703145eb7ca680ec813b06b8640ffe9491191579e789b6811a89", - "0x00000000000000000000000000000000000000000000000000000000000019b2": "0x00000000000000000000000000000000000000000000000000000000698aad43", - "0x0000000000000000000000000000000000000000000000000000000000001954": "0x00000000000000000000000000000000000000000000000000000000698aace5", - "0x00000000000000000000000000000000000000000000000000000000000039ef": "0x8edf6472b759acf70ad7584bffec3b83c969c787d91782a56c5d756af2e0fad7", - "0x0000000000000000000000000000000000000000000000000000000000001a75": "0x00000000000000000000000000000000000000000000000000000000698aae06", - "0x0000000000000000000000000000000000000000000000000000000000003ac5": "0x8ee9bdd8779316c0fdeff134f5d02c2e8881e3c8799c053a9b92056936f22e58", - "0x0000000000000000000000000000000000000000000000000000000000003922": "0xd3333fb6a3f1969d3192749bb8e355534b18572b366e422040d157de59f59bb3", - "0x0000000000000000000000000000000000000000000000000000000000003916": "0xc4a42e2bb68453e1dde26f0450bd0ac55bd8302ed8f7cb4cfb71a52f768f8606", - "0x0000000000000000000000000000000000000000000000000000000000003ab3": "0xbe63b960532e51ab9afa7f9c6abffefd16764f3f0c424bab9f940669b5b3e342", - "0x00000000000000000000000000000000000000000000000000000000000019f2": "0x00000000000000000000000000000000000000000000000000000000698aad83", - "0x00000000000000000000000000000000000000000000000000000000000018f4": "0x00000000000000000000000000000000000000000000000000000000698aac85", - "0x0000000000000000000000000000000000000000000000000000000000003a34": "0x3db4b3f87c7ab86fc9c1d3998a5799ef950a22e9896b54672c73a1e95bd75427", - "0x0000000000000000000000000000000000000000000000000000000000003a37": "0xf23b15a137db45a16598fca91ba21099449e688aea538a8f54f7878582b6506c", - "0x0000000000000000000000000000000000000000000000000000000000003af6": "0x100cf495b5bf5723c9fe7af830b8248960e01e0ad3667e0fcef220e08363a2ae", - "0x0000000000000000000000000000000000000000000000000000000000003af8": "0xd06bf036df8b24b32ccabd6c0ca7ba08aff8d340af5e5522ea006e5c3c7a432a", - "0x0000000000000000000000000000000000000000000000000000000000001a92": "0x00000000000000000000000000000000000000000000000000000000698aae23", - "0x00000000000000000000000000000000000000000000000000000000000018fd": "0x00000000000000000000000000000000000000000000000000000000698aac8e", - "0x0000000000000000000000000000000000000000000000000000000000001aaa": "0x00000000000000000000000000000000000000000000000000000000698aae3b", - "0x0000000000000000000000000000000000000000000000000000000000003a4a": "0x5fa018617b781344ba3fe403a94a504858ce3b0f07244f108e9c1da67ae584b6", - "0x0000000000000000000000000000000000000000000000000000000000001b41": "0x00000000000000000000000000000000000000000000000000000000698aaed2", - "0x0000000000000000000000000000000000000000000000000000000000001968": "0x00000000000000000000000000000000000000000000000000000000698aacf9", - "0x00000000000000000000000000000000000000000000000000000000000038b6": "0x2b4ff4e9592b9a947a91f3ff00e8ddf49a3c881b6a7264c28d7e086bcd4d8f4d", - "0x0000000000000000000000000000000000000000000000000000000000003b2f": "0xe61587fa4fbef3c9a86f96a155ed743c3dae668407b618acda4751a559910c19", - "0x00000000000000000000000000000000000000000000000000000000000018ca": "0x00000000000000000000000000000000000000000000000000000000698aac5b", - "0x0000000000000000000000000000000000000000000000000000000000001917": "0x00000000000000000000000000000000000000000000000000000000698aaca8", - "0x00000000000000000000000000000000000000000000000000000000000019f3": "0x00000000000000000000000000000000000000000000000000000000698aad84", - "0x0000000000000000000000000000000000000000000000000000000000001a6c": "0x00000000000000000000000000000000000000000000000000000000698aadfd", - "0x0000000000000000000000000000000000000000000000000000000000001a8a": "0x00000000000000000000000000000000000000000000000000000000698aae1b", - "0x000000000000000000000000000000000000000000000000000000000000194f": "0x00000000000000000000000000000000000000000000000000000000698aace0", - "0x000000000000000000000000000000000000000000000000000000000000198c": "0x00000000000000000000000000000000000000000000000000000000698aad1d", - "0x0000000000000000000000000000000000000000000000000000000000003b40": "0x2b414542b67f93a7cde0ab26677c4f395386aa6682ba88e419b6c211076eea8a", - "0x0000000000000000000000000000000000000000000000000000000000001aad": "0x00000000000000000000000000000000000000000000000000000000698aae3e", - "0x0000000000000000000000000000000000000000000000000000000000001a79": "0x00000000000000000000000000000000000000000000000000000000698aae0a", - "0x0000000000000000000000000000000000000000000000000000000000003b30": "0x3d1e753d4a5a44315f8064f33d51cbe72ece764216c01690238b040b8c939740", - "0x0000000000000000000000000000000000000000000000000000000000001ac1": "0x00000000000000000000000000000000000000000000000000000000698aae52", - "0x0000000000000000000000000000000000000000000000000000000000001a68": "0x00000000000000000000000000000000000000000000000000000000698aadf9", - "0x00000000000000000000000000000000000000000000000000000000000038e1": "0x0681cb3e7fac290e3c646ed91466dd4ff298af6c6b10c5e98a7e39645e083e19", - "0x00000000000000000000000000000000000000000000000000000000000038ea": "0xc58468893e61cd476d437e5f94620910d5f68c5f78df9dc248da915d974385f7", - "0x0000000000000000000000000000000000000000000000000000000000003ae4": "0xb2e24f460d1d6bba7509a37983317edc8c15930add1b3b352e651495465a9792", - "0x00000000000000000000000000000000000000000000000000000000000038e2": "0x9bf8de9884c5da01aba8c2af9eaf132306d2364fcc549b3844a270128973f2ff", - "0x00000000000000000000000000000000000000000000000000000000000018d5": "0x00000000000000000000000000000000000000000000000000000000698aac66", - "0x0000000000000000000000000000000000000000000000000000000000001995": "0x00000000000000000000000000000000000000000000000000000000698aad26", - "0x000000000000000000000000000000000000000000000000000000000000192e": "0x00000000000000000000000000000000000000000000000000000000698aacbf", - "0x0000000000000000000000000000000000000000000000000000000000003a0e": "0x41295c58a31e77cd31ab8d2efa85801d29652f47aaa03b2bb997ae640b6afddb", - "0x0000000000000000000000000000000000000000000000000000000000001a2d": "0x00000000000000000000000000000000000000000000000000000000698aadbe", - "0x00000000000000000000000000000000000000000000000000000000000019d9": "0x00000000000000000000000000000000000000000000000000000000698aad6a", - "0x0000000000000000000000000000000000000000000000000000000000003b06": "0xfb070dbd3e5eeecc199a1312552f50424e7e1928ac7608c4f2c13c4a2fadd973", - "0x000000000000000000000000000000000000000000000000000000000000392a": "0xd84a43af443ea9445156a130358555353d90a421c31798386f74dafae1fcdf87", - "0x0000000000000000000000000000000000000000000000000000000000001aaf": "0x00000000000000000000000000000000000000000000000000000000698aae40", - "0x00000000000000000000000000000000000000000000000000000000000038b8": "0x591be3ccc3d76f6915abfcd026c8481506043a4f6abcbd1e5c9bbaf25f5c2420", - "0x0000000000000000000000000000000000000000000000000000000000003a5b": "0x4e1c7ca917d7c58399e80fe7bfb860acc7c439c8e61032fed3f44c63352ac4af", - "0x0000000000000000000000000000000000000000000000000000000000003a41": "0xfa40d2ac3914026486eb1812fd66866b073e2dcb27a45ef8af2e8c724bd7365b", - "0x0000000000000000000000000000000000000000000000000000000000003abe": "0x8e699e5f59d746682dfc49a252257c8d69b010c6e0d5b882c1f2bb8a7d01434c", - "0x00000000000000000000000000000000000000000000000000000000000038ed": "0x945070287d1340ad3225dc0a65b1c51168e199464dd39d2ac8d54e71fc060764", - "0x0000000000000000000000000000000000000000000000000000000000001a43": "0x00000000000000000000000000000000000000000000000000000000698aadd4", - "0x0000000000000000000000000000000000000000000000000000000000001a5e": "0x00000000000000000000000000000000000000000000000000000000698aadef", - "0x0000000000000000000000000000000000000000000000000000000000001b0f": "0x00000000000000000000000000000000000000000000000000000000698aaea0", - "0x00000000000000000000000000000000000000000000000000000000000038ef": "0x45ae40ee8b3a9ae411fe93e8d636773e1ed8f0d61331ffb78d5076929589cbaa", - "0x0000000000000000000000000000000000000000000000000000000000003984": "0xcb76a7682383c60bc50f2c12a0b65ae2eed47047960f5cd9b3181a1a36e373ef", - "0x000000000000000000000000000000000000000000000000000000000000398f": "0xeddb6190d005d8e94e03bf429c306179ee38bcdfced4c87ddf8b9d51e608788c", - "0x0000000000000000000000000000000000000000000000000000000000003a76": "0xb6107141dc7e25f0786d6fc03c836cad327bbe6ae61c5b0c5f1ecdc2182c259e", - "0x0000000000000000000000000000000000000000000000000000000000003b2c": "0x6a3262a11faeabede4f6ede564c8550f891eda7c406d5c87bfa957013704effa", - "0x00000000000000000000000000000000000000000000000000000000000018dc": "0x00000000000000000000000000000000000000000000000000000000698aac6d", - "0x00000000000000000000000000000000000000000000000000000000000038b4": "0xfd37093c2f1c91be7134f166fed9f0abc87dc457ac48ef8039641bc758e1d322", - "0x0000000000000000000000000000000000000000000000000000000000003a4b": "0x41bc33ca5027b31ea9ae61bf21950cc02cc60f0a4a59b838cc6a01e4df2f6af7", - "0x0000000000000000000000000000000000000000000000000000000000001a4a": "0x00000000000000000000000000000000000000000000000000000000698aaddb", - "0x0000000000000000000000000000000000000000000000000000000000003a97": "0xcc44546a31120ddd231529f1c748511dc306558fb02ccfa0fd334f820935841f", - "0x00000000000000000000000000000000000000000000000000000000000019a4": "0x00000000000000000000000000000000000000000000000000000000698aad35", - "0x0000000000000000000000000000000000000000000000000000000000001906": "0x00000000000000000000000000000000000000000000000000000000698aac97", - "0x0000000000000000000000000000000000000000000000000000000000001993": "0x00000000000000000000000000000000000000000000000000000000698aad24", - "0x000000000000000000000000000000000000000000000000000000000000191e": "0x00000000000000000000000000000000000000000000000000000000698aacaf", - "0x00000000000000000000000000000000000000000000000000000000000019c1": "0x00000000000000000000000000000000000000000000000000000000698aad52", - "0x00000000000000000000000000000000000000000000000000000000000039bc": "0x190e3a8221603b70d49faa2b7667e4f4d4a303f91fa363c5a289d4e579cfc60a", - "0x00000000000000000000000000000000000000000000000000000000000039c3": "0xf45af8b2166eac29c079c55493013d97a738eac4a80bdadeb399af4db425b04a", - "0x0000000000000000000000000000000000000000000000000000000000001926": "0x00000000000000000000000000000000000000000000000000000000698aacb7", - "0x0000000000000000000000000000000000000000000000000000000000001950": "0x00000000000000000000000000000000000000000000000000000000698aace1", - "0x0000000000000000000000000000000000000000000000000000000000001af4": "0x00000000000000000000000000000000000000000000000000000000698aae85", - "0x000000000000000000000000000000000000000000000000000000000000391f": "0xf27e3917c39f1bfaa21f9944274cf2e4a84c3ce1a7226d0c4b70a15cb2fdcbac", - "0x0000000000000000000000000000000000000000000000000000000000001ae5": "0x00000000000000000000000000000000000000000000000000000000698aae76", - "0x00000000000000000000000000000000000000000000000000000000000039a0": "0x93e5768f1660818721044e1b3ccbb194344dd950ba1d1f1d608675a670fd3314", - "0x00000000000000000000000000000000000000000000000000000000000019ba": "0x00000000000000000000000000000000000000000000000000000000698aad4b", - "0x0000000000000000000000000000000000000000000000000000000000001aab": "0x00000000000000000000000000000000000000000000000000000000698aae3c", - "0x00000000000000000000000000000000000000000000000000000000000018d6": "0x00000000000000000000000000000000000000000000000000000000698aac67", - "0x0000000000000000000000000000000000000000000000000000000000001b04": "0x00000000000000000000000000000000000000000000000000000000698aae95", - "0x0000000000000000000000000000000000000000000000000000000000001b00": "0x00000000000000000000000000000000000000000000000000000000698aae91", - "0x00000000000000000000000000000000000000000000000000000000000039d6": "0xcee06d36d5d8a4007411754564e9232f33be6dcafcb6051ce361687c2f9aaee9", - "0x0000000000000000000000000000000000000000000000000000000000001a4e": "0x00000000000000000000000000000000000000000000000000000000698aaddf", - "0x0000000000000000000000000000000000000000000000000000000000001a46": "0x00000000000000000000000000000000000000000000000000000000698aadd7", - "0x0000000000000000000000000000000000000000000000000000000000003900": "0x743a1bd01d6d677425884e4870194f5ca95aeaec1324dd51fc99283bfa8260ee", - "0x000000000000000000000000000000000000000000000000000000000000392c": "0x3101b82817c936c3ec4ae369133469b4872742f0cf44103598a4ce37c065b375", - "0x0000000000000000000000000000000000000000000000000000000000001ae8": "0x00000000000000000000000000000000000000000000000000000000698aae79", - "0x000000000000000000000000000000000000000000000000000000000000193f": "0x00000000000000000000000000000000000000000000000000000000698aacd0", - "0x00000000000000000000000000000000000000000000000000000000000019c9": "0x00000000000000000000000000000000000000000000000000000000698aad5a", - "0x0000000000000000000000000000000000000000000000000000000000001990": "0x00000000000000000000000000000000000000000000000000000000698aad21", - "0x0000000000000000000000000000000000000000000000000000000000001971": "0x00000000000000000000000000000000000000000000000000000000698aad02", - "0x00000000000000000000000000000000000000000000000000000000000038cb": "0x1974626171ecb129cf89f799859e107d58e922f85775ca8cdc7883853559fa6c", - "0x0000000000000000000000000000000000000000000000000000000000003940": "0xefc4c945c0defa93339fcfdde265bf8ff3c383f66d0c2099caa373209d7ab2e4", - "0x0000000000000000000000000000000000000000000000000000000000003a77": "0x81ad26783849e1da14e2ff0efd2896797e66efedd24e4960c43b4d5483575da7", - "0x0000000000000000000000000000000000000000000000000000000000001992": "0x00000000000000000000000000000000000000000000000000000000698aad23", - "0x00000000000000000000000000000000000000000000000000000000000019ff": "0x00000000000000000000000000000000000000000000000000000000698aad90", - "0x0000000000000000000000000000000000000000000000000000000000003956": "0x142f05ad93d1b2517d24771aba58b682883de438abf7e9a676226f1d345c2707", - "0x00000000000000000000000000000000000000000000000000000000000019d1": "0x00000000000000000000000000000000000000000000000000000000698aad62", - "0x0000000000000000000000000000000000000000000000000000000000001913": "0x00000000000000000000000000000000000000000000000000000000698aaca4", - "0x00000000000000000000000000000000000000000000000000000000000038eb": "0xfc6ade229bf0734cb464af3917f73dcb8bfaf43072c640c0dc121957a0b47c8f", - "0x00000000000000000000000000000000000000000000000000000000000038f3": "0x10182f735d021cf447550d0352bde15dfd6aa0272a0abbcbec3769d66301d223", - "0x0000000000000000000000000000000000000000000000000000000000003927": "0x23e809b77620547c2b7350812544f178f9019d21c1189ee806e9e987a19bfcc7", - "0x000000000000000000000000000000000000000000000000000000000000193b": "0x00000000000000000000000000000000000000000000000000000000698aaccc", - "0x0000000000000000000000000000000000000000000000000000000000001994": "0x00000000000000000000000000000000000000000000000000000000698aad25", - "0x0000000000000000000000000000000000000000000000000000000000003a3c": "0x5242df81780b1a2274ac7a9fd7713e8db9c8691779563d6eb9b1c53d5ac414eb", - "0x000000000000000000000000000000000000000000000000000000000000197b": "0x00000000000000000000000000000000000000000000000000000000698aad0c", - "0x000000000000000000000000000000000000000000000000000000000000198d": "0x00000000000000000000000000000000000000000000000000000000698aad1e", - "0x00000000000000000000000000000000000000000000000000000000000038b3": "0x614a8e42cc9ad1a5236f4e064060d2c1347699b35ee694b9f617a27711c6da22", - "0x00000000000000000000000000000000000000000000000000000000000018d8": "0x00000000000000000000000000000000000000000000000000000000698aac69", - "0x00000000000000000000000000000000000000000000000000000000000018cb": "0x00000000000000000000000000000000000000000000000000000000698aac5c", - "0x0000000000000000000000000000000000000000000000000000000000001a39": "0x00000000000000000000000000000000000000000000000000000000698aadca", - "0x0000000000000000000000000000000000000000000000000000000000001a4f": "0x00000000000000000000000000000000000000000000000000000000698aade0", - "0x000000000000000000000000000000000000000000000000000000000000390c": "0x3714c3550b4d8620250c0ec64b761ee6fe65d423dc3dd68d659499797f65606e", - "0x000000000000000000000000000000000000000000000000000000000000399f": "0xa54efb6cc53b57bf2cc04a6d84a96da7b4a5afea766d1cd4752d7ae81fce1154", - "0x000000000000000000000000000000000000000000000000000000000000190b": "0x00000000000000000000000000000000000000000000000000000000698aac9c", - "0x0000000000000000000000000000000000000000000000000000000000001aed": "0x00000000000000000000000000000000000000000000000000000000698aae7e", - "0x00000000000000000000000000000000000000000000000000000000000019af": "0x00000000000000000000000000000000000000000000000000000000698aad40", - "0x0000000000000000000000000000000000000000000000000000000000001aa4": "0x00000000000000000000000000000000000000000000000000000000698aae35", - "0x0000000000000000000000000000000000000000000000000000000000003af0": "0xd4681c70a789abcf3163455a25d410d141977f2e7bfe7d01d45e1e80c4022919", - "0x0000000000000000000000000000000000000000000000000000000000001ab1": "0x00000000000000000000000000000000000000000000000000000000698aae42", - "0x0000000000000000000000000000000000000000000000000000000000003980": "0x7b67bb12c8433c5c44eb6eed3db7cabd9da83f5350c7b05706d5486f2782b362", - "0x0000000000000000000000000000000000000000000000000000000000003982": "0x57f7dd8bdaf5b895d33d1f714a5f4c0a9d8d9bc6f1725e4b4c29249576266cb5", - "0x000000000000000000000000000000000000000000000000000000000000197f": "0x00000000000000000000000000000000000000000000000000000000698aad10", - "0x00000000000000000000000000000000000000000000000000000000000039e9": "0x2b0fcec011638292ee4e0843aa73146e19a75be7c6addb409da62031b957e2be", - "0x00000000000000000000000000000000000000000000000000000000000038fe": "0x7b1716f826e6f28837bde547ff6720ebe145e4a3fe8538b4c2cb1784047dffee", - "0x0000000000000000000000000000000000000000000000000000000000003a7f": "0xa88c22b272439656c647939bed47a2e00d2e91ef50c9502e7aea7f0bc7c1cac9", - "0x00000000000000000000000000000000000000000000000000000000000038f1": "0x517e637bc1f982a82ce1ac88e6a01cbd4fa0a1e8f2fcf98b8594cbca8b1bf42d", - "0x0000000000000000000000000000000000000000000000000000000000003992": "0x487e36f6f3b12c63fbc2cab021dc508dc8816cfde36e78494a30907a7c710436", - "0x00000000000000000000000000000000000000000000000000000000000018c2": "0x00000000000000000000000000000000000000000000000000000000698aac53", - "0x0000000000000000000000000000000000000000000000000000000000003a6c": "0x5c4516d4b02603b598682c5cf64cadc68b65d071a98d209c158c36f0fafaecea", - "0x0000000000000000000000000000000000000000000000000000000000003aa5": "0x4c6610c9736694ed8e1e8a9f7ef5e7ab844d9d78676cb0ee43b8625f3f45c00f", - "0x0000000000000000000000000000000000000000000000000000000000003ad9": "0xb9caa02ea9653b49ccb344349ba3d2628725309062a512090d285d2e39b607b4", - "0x00000000000000000000000000000000000000000000000000000000000039c2": "0x79c893ea4392b5e26826cf9b0fcde785a678a8ae8be95ddde6a4f723cdf4a03c", - "0x00000000000000000000000000000000000000000000000000000000000019a7": "0x00000000000000000000000000000000000000000000000000000000698aad38", - "0x0000000000000000000000000000000000000000000000000000000000003948": "0x8e005f6385caee45e3e70c214f915742336f70b59345cd5813c68368b678339f", - "0x00000000000000000000000000000000000000000000000000000000000038f7": "0x58a3e0cef9e3c351ea4b8d78be1a5f46489750de0e44eaea3d498b638da8b415", - "0x0000000000000000000000000000000000000000000000000000000000003913": "0xb9d531944ffa9517f42a127d7f63654ac927acde609df846e789e7942e4ac766", - "0x0000000000000000000000000000000000000000000000000000000000003a0c": "0x3dac4015e996565f0dbed47bfc4b1bfd6c5e35c4c1fc94f19dcb15f9a715cb3c", - "0x0000000000000000000000000000000000000000000000000000000000003ae0": "0xd134a10d9724f9a846cb0adf83a3c6cbd76529c23f5e0c776fa5d95224e92ec9", - "0x00000000000000000000000000000000000000000000000000000000000038e4": "0xb4d0e017198f7b2465df2a0c7c0868b7825b580f2ae6768debb001fb2af30978", - "0x0000000000000000000000000000000000000000000000000000000000003ab8": "0x43924563c9398425fe24694123f532b4460219f6c6604d6cfe3f5455d5b645e1", - "0x0000000000000000000000000000000000000000000000000000000000001a62": "0x00000000000000000000000000000000000000000000000000000000698aadf3", - "0x00000000000000000000000000000000000000000000000000000000000018ef": "0x00000000000000000000000000000000000000000000000000000000698aac80", - "0x0000000000000000000000000000000000000000000000000000000000001a90": "0x00000000000000000000000000000000000000000000000000000000698aae21", - "0x000000000000000000000000000000000000000000000000000000000000393c": "0x814cea0350973cedae3591a34f8ee7e52931e9fd375b4b56f6b70fd6419bceca", - "0x0000000000000000000000000000000000000000000000000000000000003a03": "0x65f303deee3da5dd5218a3a08b751e20f16fd4b5e8201e59f1db79655d92d1c0", - "0x000000000000000000000000000000000000000000000000000000000000197e": "0x00000000000000000000000000000000000000000000000000000000698aad0f", - "0x0000000000000000000000000000000000000000000000000000000000001abe": "0x00000000000000000000000000000000000000000000000000000000698aae4f", - "0x0000000000000000000000000000000000000000000000000000000000001b3f": "0x00000000000000000000000000000000000000000000000000000000698aaed0", - "0x00000000000000000000000000000000000000000000000000000000000038a2": "0x57cba0e8e953f3b586931a559aa6511a3374836decfaf327cd7dd22f30461079", - "0x00000000000000000000000000000000000000000000000000000000000039e4": "0xfe7a57d5ef0a2e4f17bfcb8ae9f59b4be2f7edf3f039bd12a1ab092c180179bc", - "0x0000000000000000000000000000000000000000000000000000000000001a13": "0x00000000000000000000000000000000000000000000000000000000698aada4", - "0x0000000000000000000000000000000000000000000000000000000000001918": "0x00000000000000000000000000000000000000000000000000000000698aaca9", - "0x0000000000000000000000000000000000000000000000000000000000001984": "0x00000000000000000000000000000000000000000000000000000000698aad15", - "0x0000000000000000000000000000000000000000000000000000000000003aac": "0x4bcf939012ef466e2b8523a03cda8aad0bbce0e1079b73282e8a339a322bba69", - "0x00000000000000000000000000000000000000000000000000000000000039fd": "0x1490261491a069ee716bd4ee5e057bee22c2e695edf110004a7a84361a1a3672", - "0x0000000000000000000000000000000000000000000000000000000000003a4e": "0x32e9aacb213b6d8747a63e04aeb8e1dcac34afa0c585cc0412a9349d2181f898", - "0x0000000000000000000000000000000000000000000000000000000000003a0b": "0x66719dc6c87e9142c46525f71e5f132983b08212117ed05f8b3c4738b9245b33", - "0x0000000000000000000000000000000000000000000000000000000000003a2d": "0xc805a900bcb22634e42182c0b1e64d411c4abd97ff1c32ed4dc2f6f82dc3fedd", - "0x00000000000000000000000000000000000000000000000000000000000018f2": "0x00000000000000000000000000000000000000000000000000000000698aac83", - "0x0000000000000000000000000000000000000000000000000000000000003ade": "0xf8ed0cb245f0a4a5dc2f5272b4d2bb85345ee276ed25c1a9ac2177c2ea90ffee", - "0x0000000000000000000000000000000000000000000000000000000000001a8b": "0x00000000000000000000000000000000000000000000000000000000698aae1c", - "0x00000000000000000000000000000000000000000000000000000000000018c0": "0x00000000000000000000000000000000000000000000000000000000698aac51", - "0x0000000000000000000000000000000000000000000000000000000000003965": "0xbdf75042e227becf31889cbbacca4b28ab426b18bbc2260a452a53aeef62cc85", - "0x0000000000000000000000000000000000000000000000000000000000001b34": "0x00000000000000000000000000000000000000000000000000000000698aaec5", - "0x0000000000000000000000000000000000000000000000000000000000003b3c": "0x20a52b0454c1ff3976bb576b2265aef0e9c1eacb59ac501c24e5ca402b089576", - "0x0000000000000000000000000000000000000000000000000000000000001980": "0x00000000000000000000000000000000000000000000000000000000698aad11", - "0x0000000000000000000000000000000000000000000000000000000000003a38": "0x47047c99364048a5a8dd75beff03cf6e292da40ee67fa417cac9c2d1644aaa2f", - "0x00000000000000000000000000000000000000000000000000000000000038a6": "0xd517a06ee69bb16e3d0e798816e1da8520bc8c139740a067df77a0694056e993", - "0x0000000000000000000000000000000000000000000000000000000000001a52": "0x00000000000000000000000000000000000000000000000000000000698aade3", - "0x0000000000000000000000000000000000000000000000000000000000003a48": "0xe726a51cdf1cff2ee12213d8f164367935c2250591b2f768f175ec9a363ec72e", - "0x0000000000000000000000000000000000000000000000000000000000003a31": "0xac9a88dcedfb35609b047715553429f75baff18f6d6549bf500b8feeb530b819", - "0x00000000000000000000000000000000000000000000000000000000000019e6": "0x00000000000000000000000000000000000000000000000000000000698aad77", - "0x0000000000000000000000000000000000000000000000000000000000001a1c": "0x00000000000000000000000000000000000000000000000000000000698aadad", - "0x0000000000000000000000000000000000000000000000000000000000003919": "0x3a8a805c5b9ffa865f91e204db442cd4315d249a972179f3c35f568d5bbd772c", - "0x0000000000000000000000000000000000000000000000000000000000003968": "0xdb63a70cfde8c9adbab12f1521ef261c46779fcff171e29981c116f631a10448", - "0x0000000000000000000000000000000000000000000000000000000000003a45": "0x86f89b13500e2655a11d8e9fbf8d8c4271d432b10991473eb46358f5c0f02b9b", - "0x0000000000000000000000000000000000000000000000000000000000003ad0": "0x4222b185121161a1d16fce24c30539418ffdc962939149051b8b14169fac443d", - "0x0000000000000000000000000000000000000000000000000000000000001a23": "0x00000000000000000000000000000000000000000000000000000000698aadb4", - "0x0000000000000000000000000000000000000000000000000000000000001a71": "0x00000000000000000000000000000000000000000000000000000000698aae02", - "0x00000000000000000000000000000000000000000000000000000000000038c7": "0x7f73e839ac9bb99a749cff59848d869e6a2aeaca78767415813eb976e00b6ede", - "0x000000000000000000000000000000000000000000000000000000000000396f": "0x5f6603c71c175f965a6a0de88f1ce36b2e86ecd12584024d5c82e9cc05317778", - "0x00000000000000000000000000000000000000000000000000000000000039cf": "0x42f78c2d06bcac25d59e1ae764c88cc557719b5f819c1eb8516340238bec4382", - "0x0000000000000000000000000000000000000000000000000000000000003a52": "0x98c2f9054f001cf7ebd7e91c180a6ea905cbbc0e6f94e8448468ed6cfadc1d54", - "0x0000000000000000000000000000000000000000000000000000000000003914": "0xc0d7474914232e639124e97d29fcba8ce76f032a85097b3a7081fafacc6f9762", - "0x00000000000000000000000000000000000000000000000000000000000019ce": "0x00000000000000000000000000000000000000000000000000000000698aad5f", - "0x00000000000000000000000000000000000000000000000000000000000018dd": "0x00000000000000000000000000000000000000000000000000000000698aac6e", - "0x0000000000000000000000000000000000000000000000000000000000001979": "0x00000000000000000000000000000000000000000000000000000000698aad0a", - "0x0000000000000000000000000000000000000000000000000000000000001a2a": "0x00000000000000000000000000000000000000000000000000000000698aadbb", - "0x000000000000000000000000000000000000000000000000000000000000397c": "0xb982a734a8d281484b657fbdea484571c1ac2ef5d161c1b84d0475dafbafc964", - "0x000000000000000000000000000000000000000000000000000000000000390b": "0x2ae241123c1bc555192b8a7aaa42a9066f2c4c2900f07cfd236bf2442d4543da", - "0x0000000000000000000000000000000000000000000000000000000000001b0c": "0x00000000000000000000000000000000000000000000000000000000698aae9d", - "0x0000000000000000000000000000000000000000000000000000000000003ac8": "0x1212f0a80c9b3e333fa0c7e313c8df032a0ed7412b0cfb320b118a2cce9fe56f", - "0x0000000000000000000000000000000000000000000000000000000000003afc": "0x2eb2ea49117ec0fadf8ef16dcd336a34c08b688451b2c91265da78c820c695c7", - "0x0000000000000000000000000000000000000000000000000000000000001a95": "0x00000000000000000000000000000000000000000000000000000000698aae26", - "0x0000000000000000000000000000000000000000000000000000000000003b08": "0x6f50296b4f2e7a183dc7195075f3a22525a05703a3c53ee7fb8fd33b9d1ec6b7", - "0x0000000000000000000000000000000000000000000000000000000000003b41": "0x7965d5f0de9f57e5ad42960150fded3b44bdbf299792093ba72fb4382c46132d", - "0x0000000000000000000000000000000000000000000000000000000000001a55": "0x00000000000000000000000000000000000000000000000000000000698aade6", - "0x0000000000000000000000000000000000000000000000000000000000001b36": "0x00000000000000000000000000000000000000000000000000000000698aaec7", - "0x0000000000000000000000000000000000000000000000000000000000003af1": "0x022bc82452e782723bd5db8f42dc7ed5e142f15adc794a35a670cd5b52f9b25a", - "0x0000000000000000000000000000000000000000000000000000000000001b35": "0x00000000000000000000000000000000000000000000000000000000698aaec6", - "0x0000000000000000000000000000000000000000000000000000000000003910": "0xb76452acfbe40e45c69ef2279a85141b1412cf77a534caf448c51b6aa40fa65c", - "0x00000000000000000000000000000000000000000000000000000000000039f5": "0x79b2e77a2587cc29818752c929d33741965cb3491fa69872617ff886101b095b", - "0x00000000000000000000000000000000000000000000000000000000000018bc": "0x00000000000000000000000000000000000000000000000000000000698aac4d", - "0x00000000000000000000000000000000000000000000000000000000000019a9": "0x00000000000000000000000000000000000000000000000000000000698aad3a", - "0x0000000000000000000000000000000000000000000000000000000000001aa2": "0x00000000000000000000000000000000000000000000000000000000698aae33", - "0x0000000000000000000000000000000000000000000000000000000000003aff": "0x365ffb1e8b641eb4db13b597d792a7e0ed22e9bb6e6acf87cf6ff27616b42ae8", - "0x0000000000000000000000000000000000000000000000000000000000001a20": "0x00000000000000000000000000000000000000000000000000000000698aadb1", - "0x0000000000000000000000000000000000000000000000000000000000001a94": "0x00000000000000000000000000000000000000000000000000000000698aae25", - "0x0000000000000000000000000000000000000000000000000000000000001aa3": "0x00000000000000000000000000000000000000000000000000000000698aae34", - "0x00000000000000000000000000000000000000000000000000000000000038c4": "0x0bba4a36c7b4b36834feabac251f2c1490c6c7edad9cba267d352d6e26b4780d", - "0x0000000000000000000000000000000000000000000000000000000000001afa": "0x00000000000000000000000000000000000000000000000000000000698aae8b", - "0x00000000000000000000000000000000000000000000000000000000000038d2": "0x3c69f73c8f71473ce9193863e0db656e89b51b34fc114f4f74ef382ee0c5fab3", - "0x00000000000000000000000000000000000000000000000000000000000019e1": "0x00000000000000000000000000000000000000000000000000000000698aad72", - "0x00000000000000000000000000000000000000000000000000000000000018cc": "0x00000000000000000000000000000000000000000000000000000000698aac5d", - "0x00000000000000000000000000000000000000000000000000000000000038fa": "0x882a2a0a63826fc46d65abd7514e12e66a7f22de76926fce57a59460d7f0cb25", - "0x0000000000000000000000000000000000000000000000000000000000001ade": "0x00000000000000000000000000000000000000000000000000000000698aae6f", - "0x00000000000000000000000000000000000000000000000000000000000018d1": "0x00000000000000000000000000000000000000000000000000000000698aac62", - "0x00000000000000000000000000000000000000000000000000000000000039b5": "0x12467a51ad47e72e89fcd92535a74897b06c39abcc4fa80e9013b3f67bf5c776", - "0x00000000000000000000000000000000000000000000000000000000000019bd": "0x00000000000000000000000000000000000000000000000000000000698aad4e", - "0x0000000000000000000000000000000000000000000000000000000000003a79": "0x7c07d622cffd934edcb2d2986db17df8db604def98e483c86affa22ff68b3f48", - "0x0000000000000000000000000000000000000000000000000000000000001aeb": "0x00000000000000000000000000000000000000000000000000000000698aae7c", - "0x0000000000000000000000000000000000000000000000000000000000003aa7": "0x439c4cb92a84dda266af5af71750dc8640291fec36fa8e9c344d84e4d4e9851d", - "0x0000000000000000000000000000000000000000000000000000000000003985": "0x5e9073aa8619bc19cdb95116900b1ae23246a143f6301de86769909ab396f327", - "0x00000000000000000000000000000000000000000000000000000000000018b9": "0x00000000000000000000000000000000000000000000000000000000698aac4a", - "0x00000000000000000000000000000000000000000000000000000000000018e8": "0x00000000000000000000000000000000000000000000000000000000698aac79", - "0x0000000000000000000000000000000000000000000000000000000000003acf": "0x8c4bc268df6a6504db298684f36fd123dede6cbfafff11f545de5fc702677e93", - "0x0000000000000000000000000000000000000000000000000000000000001953": "0x00000000000000000000000000000000000000000000000000000000698aace4", - "0x0000000000000000000000000000000000000000000000000000000000003b37": "0xbcf942b3834be7abeeeba1e27a72b840c0b123818296e742596304b2573197fd", - "0x0000000000000000000000000000000000000000000000000000000000003aca": "0xda8ea1c50fe1a5b880f2fe4675f84239dbc62971266b89e239751a24bad8c439", - "0x00000000000000000000000000000000000000000000000000000000000038c0": "0x9a98996faf2165db468e276c7100f555a42bc9de870e6cb6b9e9f3d639c0ee3b", - "0x00000000000000000000000000000000000000000000000000000000000019fd": "0x00000000000000000000000000000000000000000000000000000000698aad8e", - "0x0000000000000000000000000000000000000000000000000000000000003adb": "0x6afda8b8195b154d280089a9873c48925e9bcd3837cba16160c1e3205239eb6c", - "0x00000000000000000000000000000000000000000000000000000000000018b1": "0x00000000000000000000000000000000000000000000000000000000698aac42", - "0x0000000000000000000000000000000000000000000000000000000000001961": "0x00000000000000000000000000000000000000000000000000000000698aacf2", - "0x000000000000000000000000000000000000000000000000000000000000199d": "0x00000000000000000000000000000000000000000000000000000000698aad2e", - "0x00000000000000000000000000000000000000000000000000000000000039b7": "0xfc5516a8a7daf8b4d042445fcda3ca1aa874eeaf0a26692c2b61d47b8aee6f55", - "0x000000000000000000000000000000000000000000000000000000000000190c": "0x00000000000000000000000000000000000000000000000000000000698aac9d", - "0x00000000000000000000000000000000000000000000000000000000000019b7": "0x00000000000000000000000000000000000000000000000000000000698aad48", - "0x0000000000000000000000000000000000000000000000000000000000001a1f": "0x00000000000000000000000000000000000000000000000000000000698aadb0", - "0x0000000000000000000000000000000000000000000000000000000000003966": "0x9f76ea62ada0a8e958dc34978d1ca92f367adb89f3cd242e29d36be506c0ee7a", - "0x0000000000000000000000000000000000000000000000000000000000003aa1": "0x43eb746b95343248e82bd0365cd0b80d579603dea6f366cf153ae8baf4016abf", - "0x0000000000000000000000000000000000000000000000000000000000001a3c": "0x00000000000000000000000000000000000000000000000000000000698aadcd", - "0x0000000000000000000000000000000000000000000000000000000000003a96": "0xa8f508d8ef9e00d0d4ac59df107e956c5926105d45215fbfbb18ef2593c47802", - "0x0000000000000000000000000000000000000000000000000000000000001a77": "0x00000000000000000000000000000000000000000000000000000000698aae08", - "0x0000000000000000000000000000000000000000000000000000000000001acc": "0x00000000000000000000000000000000000000000000000000000000698aae5d", - "0x00000000000000000000000000000000000000000000000000000000000019d6": "0x00000000000000000000000000000000000000000000000000000000698aad67", - "0x0000000000000000000000000000000000000000000000000000000000001af3": "0x00000000000000000000000000000000000000000000000000000000698aae84", - "0x00000000000000000000000000000000000000000000000000000000000039f6": "0x6f9271e94ce2212dcebc413e284de75135adce8740a580378bfee2fee8d0ab2c", - "0x00000000000000000000000000000000000000000000000000000000000039d0": "0x352672ff11573f8e09ab0dddfe9620dc88445cb4a42d761409e7f83f865d78e2", - "0x00000000000000000000000000000000000000000000000000000000000038a7": "0x504963080a36ce434eea2d0b1a1512ff58fbc1982016d63fb94dbe6de09539cf", - "0x00000000000000000000000000000000000000000000000000000000000018af": "0x00000000000000000000000000000000000000000000000000000000698aac40", - "0x0000000000000000000000000000000000000000000000000000000000001a24": "0x00000000000000000000000000000000000000000000000000000000698aadb5", - "0x0000000000000000000000000000000000000000000000000000000000003905": "0x913fee3fb59a36ecaf778ab5f324a102dbbec21b6c12c5fc782d6e96fc6fac66", - "0x00000000000000000000000000000000000000000000000000000000000039bd": "0x9e1af18a27baf7545b67e02c7de3f7cf1eb3a6c95e31c2d966cbd4e5981c67a4", - "0x0000000000000000000000000000000000000000000000000000000000001a50": "0x00000000000000000000000000000000000000000000000000000000698aade1", - "0x0000000000000000000000000000000000000000000000000000000000001afe": "0x00000000000000000000000000000000000000000000000000000000698aae8f", - "0x0000000000000000000000000000000000000000000000000000000000001909": "0x00000000000000000000000000000000000000000000000000000000698aac9a", - "0x0000000000000000000000000000000000000000000000000000000000003943": "0x6bc966220d2e45569cdf30d486cdf1328127613422df6ac15bafe0c6513844d6", - "0x00000000000000000000000000000000000000000000000000000000000018c9": "0x00000000000000000000000000000000000000000000000000000000698aac5a", - "0x0000000000000000000000000000000000000000000000000000000000003979": "0x871c11c133e6fc478fc06fb78a2c9260a2fda5477a05ea225f8af8a9899b0ff5", - "0x00000000000000000000000000000000000000000000000000000000000039a3": "0xdf201d1a30952e01948d92605e2578c9e811fdd3f73541cbc4a31b02db9baed2", - "0x0000000000000000000000000000000000000000000000000000000000003958": "0xd73889751de9407014cdc2d6d386b9b53d9a4041731a132218773be4d847f71b", - "0x0000000000000000000000000000000000000000000000000000000000001ac3": "0x00000000000000000000000000000000000000000000000000000000698aae54", - "0x00000000000000000000000000000000000000000000000000000000000039ea": "0x276c0d7f9058008a5a92b4b2b451ef87d7cf95d71796f0051e847492279549e6", - "0x0000000000000000000000000000000000000000000000000000000000003aaf": "0x76e343bb4e3f2bb666ff58bcfb8e32680054f7b34c034b88bf8e98c93643e92b", - "0x0000000000000000000000000000000000000000000000000000000000003a15": "0x0d60b997deba7ebb2df305165c0eaab1dea34a36817aaae00316d32fbfd72a14", - "0x0000000000000000000000000000000000000000000000000000000000003972": "0x9a59776a09b8eec1fe2c98b4558aaf552be4b1599a270886200e866b51cade71", - "0x00000000000000000000000000000000000000000000000000000000000019f1": "0x00000000000000000000000000000000000000000000000000000000698aad82", - "0x0000000000000000000000000000000000000000000000000000000000001ac2": "0x00000000000000000000000000000000000000000000000000000000698aae53", - "0x0000000000000000000000000000000000000000000000000000000000001977": "0x00000000000000000000000000000000000000000000000000000000698aad08", - "0x0000000000000000000000000000000000000000000000000000000000001ad9": "0x00000000000000000000000000000000000000000000000000000000698aae6a", - "0x0000000000000000000000000000000000000000000000000000000000001a84": "0x00000000000000000000000000000000000000000000000000000000698aae15", - "0x000000000000000000000000000000000000000000000000000000000000190a": "0x00000000000000000000000000000000000000000000000000000000698aac9b", - "0x0000000000000000000000000000000000000000000000000000000000003ad7": "0x3984f3a2b02d22b229424dceeb3f62f5b82815de9d9dc51e4cef42f78ab8f496", - "0x0000000000000000000000000000000000000000000000000000000000001adc": "0x00000000000000000000000000000000000000000000000000000000698aae6d", - "0x0000000000000000000000000000000000000000000000000000000000003a06": "0x6558c27d394313c77636e06b1f3aab41550e21c4ef84527f7cc8784cd8f70f9e", - "0x0000000000000000000000000000000000000000000000000000000000003975": "0x78a60b1e26f58aecc2110bb7ef7c7ddcc6a67fbd070a9d5718a953161b7b8db1", - "0x000000000000000000000000000000000000000000000000000000000000196f": "0x00000000000000000000000000000000000000000000000000000000698aad00", - "0x0000000000000000000000000000000000000000000000000000000000001acf": "0x00000000000000000000000000000000000000000000000000000000698aae60", - "0x0000000000000000000000000000000000000000000000000000000000001ac9": "0x00000000000000000000000000000000000000000000000000000000698aae5a", - "0x0000000000000000000000000000000000000000000000000000000000003997": "0x7570d4e9ce5440b2beaf6179fd3e1a78bc0e7626f47563fb880b8474002e734e", - "0x00000000000000000000000000000000000000000000000000000000000038ab": "0x6b0d4bc6ae1ba8f9aa7e8dbbd2bd31c0e40eb75eff5c06c86c9d38ea3a8bf223", - "0x00000000000000000000000000000000000000000000000000000000000038d7": "0x74a59a461ee0be09c3a2373a1f13e07194cfce47d43b8b75e1c35803178711d2", - "0x0000000000000000000000000000000000000000000000000000000000003944": "0x6c911fddb0c32c7fee995d97d2b0b58495f4c53be01a2074b617ca8187cc5dc0", - "0x0000000000000000000000000000000000000000000000000000000000001a02": "0x00000000000000000000000000000000000000000000000000000000698aad93", - "0x0000000000000000000000000000000000000000000000000000000000001a9c": "0x00000000000000000000000000000000000000000000000000000000698aae2d", - "0x0000000000000000000000000000000000000000000000000000000000001985": "0x00000000000000000000000000000000000000000000000000000000698aad16", - "0x0000000000000000000000000000000000000000000000000000000000001ae2": "0x00000000000000000000000000000000000000000000000000000000698aae73", - "0x00000000000000000000000000000000000000000000000000000000000018f5": "0x00000000000000000000000000000000000000000000000000000000698aac86", - "0x0000000000000000000000000000000000000000000000000000000000003932": "0x58c4ac68811faf439b617819ec951c4fb6feba3dde5892bf153615e01e4fe14c", - "0x0000000000000000000000000000000000000000000000000000000000003a0d": "0xb43e81e3f03fb7c996eb77a2001c76eda5b25df60bb970c07be46212a7014bb7", - "0x00000000000000000000000000000000000000000000000000000000000038b1": "0x45d4a4d1913ca36607602f4aed2c92c5dca49e0b6611cc7c37653a159f3bd288", - "0x000000000000000000000000000000000000000000000000000000000000197d": "0x00000000000000000000000000000000000000000000000000000000698aad0e", - "0x000000000000000000000000000000000000000000000000000000000000395e": "0xe201a7eda8a0a964a90bc681829481b3061e09bba4735886825dc3b657ddad31", - "0x00000000000000000000000000000000000000000000000000000000000018d4": "0x00000000000000000000000000000000000000000000000000000000698aac65", - "0x0000000000000000000000000000000000000000000000000000000000003a18": "0x0f24d65aabaf23c14325af7a6dbc99e837fd9842141f6b1926c1380b920c2c45", - "0x0000000000000000000000000000000000000000000000000000000000001a74": "0x00000000000000000000000000000000000000000000000000000000698aae05", - "0x0000000000000000000000000000000000000000000000000000000000001a47": "0x00000000000000000000000000000000000000000000000000000000698aadd8", - "0x0000000000000000000000000000000000000000000000000000000000001a49": "0x00000000000000000000000000000000000000000000000000000000698aadda", - "0x000000000000000000000000000000000000000000000000000000000000394b": "0xf297e9cebfe424440d12e7a2dae0cbd657a030c609538f43dd124e7d2eb40ea6", - "0x0000000000000000000000000000000000000000000000000000000000001915": "0x00000000000000000000000000000000000000000000000000000000698aaca6", - "0x0000000000000000000000000000000000000000000000000000000000001a10": "0x00000000000000000000000000000000000000000000000000000000698aada1", - "0x0000000000000000000000000000000000000000000000000000000000001a80": "0x00000000000000000000000000000000000000000000000000000000698aae11", - "0x0000000000000000000000000000000000000000000000000000000000001aef": "0x00000000000000000000000000000000000000000000000000000000698aae80", - "0x0000000000000000000000000000000000000000000000000000000000001924": "0x00000000000000000000000000000000000000000000000000000000698aacb5", - "0x0000000000000000000000000000000000000000000000000000000000003b36": "0xbf84aa970299a65b19f4ee08ea066c07e54f60b622019ca76dc1b6943c37c952", - "0x0000000000000000000000000000000000000000000000000000000000001a21": "0x00000000000000000000000000000000000000000000000000000000698aadb2", - "0x0000000000000000000000000000000000000000000000000000000000003a26": "0xc9f67e24f278de659c4afffa6dcd01bf46a954dd0de7f7bc3e1e50dfa287ae21", - "0x0000000000000000000000000000000000000000000000000000000000003a30": "0x817205b566980a793530bd71e5f9ae88dc1746539505776665bb169c2766bfd0", - "0x0000000000000000000000000000000000000000000000000000000000001b0b": "0x00000000000000000000000000000000000000000000000000000000698aae9c", - "0x00000000000000000000000000000000000000000000000000000000000018b5": "0x00000000000000000000000000000000000000000000000000000000698aac46", - "0x00000000000000000000000000000000000000000000000000000000000019df": "0x00000000000000000000000000000000000000000000000000000000698aad70", - "0x0000000000000000000000000000000000000000000000000000000000001af0": "0x00000000000000000000000000000000000000000000000000000000698aae81", - "0x0000000000000000000000000000000000000000000000000000000000003ace": "0xdeb7456b84a982b6ea2144ef21b92f110e285afa58827d3aa264e087aa38d6a2", - "0x0000000000000000000000000000000000000000000000000000000000001932": "0x00000000000000000000000000000000000000000000000000000000698aacc3", - "0x000000000000000000000000000000000000000000000000000000000000199a": "0x00000000000000000000000000000000000000000000000000000000698aad2b", - "0x00000000000000000000000000000000000000000000000000000000000038ae": "0x251e944105c063e0d8cc3b245d423c5a8542cc22ab68a6646664c4c6702d3609", - "0x0000000000000000000000000000000000000000000000000000000000003a5e": "0xe6dceabf9007da84ab651b3932f19ef4f9dc5454e3193c5f0a19a772b5c1f811", - "0x0000000000000000000000000000000000000000000000000000000000003a17": "0xdf4cff1ad4090b81b0550ef2de4c58d4f5e910c93541493e38c2cdd0efe2e6a6", - "0x0000000000000000000000000000000000000000000000000000000000003aa2": "0x463c7f8cbfd0ea57fc3c858bc17f6cf2cf965b6c993dbc639b00d7669e9187f7", - "0x00000000000000000000000000000000000000000000000000000000000039de": "0xc15b89db7d564a5a8a79fa29c9efbb0d99c149dcaa75a12613f2ba6b2148b406", - "0x0000000000000000000000000000000000000000000000000000000000001956": "0x00000000000000000000000000000000000000000000000000000000698aace7", - "0x0000000000000000000000000000000000000000000000000000000000001a7e": "0x00000000000000000000000000000000000000000000000000000000698aae0f", - "0x00000000000000000000000000000000000000000000000000000000000039b6": "0x86c5a37dd8ba18159f8b416ef9bb59cc960fc54d18a4900201da401ab457aeeb", - "0x000000000000000000000000000000000000000000000000000000000000195d": "0x00000000000000000000000000000000000000000000000000000000698aacee", - "0x0000000000000000000000000000000000000000000000000000000000001a4c": "0x00000000000000000000000000000000000000000000000000000000698aaddd", - "0x0000000000000000000000000000000000000000000000000000000000001a54": "0x00000000000000000000000000000000000000000000000000000000698aade5", - "0x00000000000000000000000000000000000000000000000000000000000038cf": "0xbdcfc933f851e60ec5f3a71ba723dfbc2dfa9b0b1573b00c52d3b048d3cbede4", - "0x0000000000000000000000000000000000000000000000000000000000003976": "0x786960b2c7a4aea56423c2fa36de169dc6766880848916889f735057de874ca4", - "0x0000000000000000000000000000000000000000000000000000000000001a18": "0x00000000000000000000000000000000000000000000000000000000698aada9", - "0x0000000000000000000000000000000000000000000000000000000000003a1d": "0x2470806d33a69b387daf7c8b05e6f6f7ade5fef3a2c1ad83b16af1e6a19a7137", - "0x0000000000000000000000000000000000000000000000000000000000003a2f": "0xb657a9cf45a3621098d0d7f2effdb1de23244733df24a713903db0dd2dcc9f4b", - "0x0000000000000000000000000000000000000000000000000000000000003a3b": "0xaada13e6d305a037ea3da5a62d932ceec89978db933789c7318dc829375ad270", - "0x00000000000000000000000000000000000000000000000000000000000038d3": "0x3dcf2a8a975fc32df634289769a4903aa3f31eae80d4224e3eb9f51faab7df49", - "0x0000000000000000000000000000000000000000000000000000000000003b35": "0x208145fefc2dddf206f7c890603fb00eb61a9fe379f0f52863412f072180516a", - "0x00000000000000000000000000000000000000000000000000000000000019b5": "0x00000000000000000000000000000000000000000000000000000000698aad46", - "0x00000000000000000000000000000000000000000000000000000000000018c7": "0x00000000000000000000000000000000000000000000000000000000698aac58", - "0x0000000000000000000000000000000000000000000000000000000000003a1e": "0x1b8cee9837ae94a92337b9b0fc8c5fc4e30e9e2a68283b76212e869536166b90", - "0x00000000000000000000000000000000000000000000000000000000000019a0": "0x00000000000000000000000000000000000000000000000000000000698aad31", - "0x00000000000000000000000000000000000000000000000000000000000038cc": "0x6dbe72027285ad3b213ed2ae47721ac2a07913e1536ecaabc414bd7e8e0d762c", - "0x0000000000000000000000000000000000000000000000000000000000001a1b": "0x00000000000000000000000000000000000000000000000000000000698aadac", - "0x00000000000000000000000000000000000000000000000000000000000018f0": "0x00000000000000000000000000000000000000000000000000000000698aac81", - "0x0000000000000000000000000000000000000000000000000000000000001aa0": "0x00000000000000000000000000000000000000000000000000000000698aae31", - "0x00000000000000000000000000000000000000000000000000000000000038ce": "0x0e5072d2cc946025a995c216246273c71bda43a09bb9418eda867ca14501dc05", - "0x0000000000000000000000000000000000000000000000000000000000003971": "0xd5daad080055cb325918bde73ac90d4ad41251ccab6dc585d81a5118b5e8bd4b", - "0x0000000000000000000000000000000000000000000000000000000000001935": "0x00000000000000000000000000000000000000000000000000000000698aacc6", - "0x0000000000000000000000000000000000000000000000000000000000001969": "0x00000000000000000000000000000000000000000000000000000000698aacfa", - "0x0000000000000000000000000000000000000000000000000000000000003aec": "0x5717da929048287ede33709a6bd2c4e9f42fe339372cc1f0b0c2eb08bb9c94e0", - "0x000000000000000000000000000000000000000000000000000000000000196d": "0x00000000000000000000000000000000000000000000000000000000698aacfe", - "0x000000000000000000000000000000000000000000000000000000000000191a": "0x00000000000000000000000000000000000000000000000000000000698aacab", - "0x0000000000000000000000000000000000000000000000000000000000003af2": "0x0c9b75216b3879d5eddd1b27f69521ca9cf909fe68c5d14c0321c78b5e427a6b", - "0x0000000000000000000000000000000000000000000000000000000000003a2c": "0x52ed22ed281398f1f99109fbbd2caa9a8e18baef143d72de3b13216782f514f3", - "0x0000000000000000000000000000000000000000000000000000000000001ad2": "0x00000000000000000000000000000000000000000000000000000000698aae63", - "0x0000000000000000000000000000000000000000000000000000000000001962": "0x00000000000000000000000000000000000000000000000000000000698aacf3", - "0x00000000000000000000000000000000000000000000000000000000000038c5": "0x7b640b30e209bab374e1736152bd0357ce037523f96b69c5a9dcf4e1c774f68e", - "0x00000000000000000000000000000000000000000000000000000000000039e8": "0x5ef58284cbc0629e837abc2150c2dbabb4d8f43e5f0cdc01353e3d3a04ecd679", - "0x00000000000000000000000000000000000000000000000000000000000019fc": "0x00000000000000000000000000000000000000000000000000000000698aad8d", - "0x00000000000000000000000000000000000000000000000000000000000019c4": "0x00000000000000000000000000000000000000000000000000000000698aad55", - "0x0000000000000000000000000000000000000000000000000000000000003a46": "0xd4ceaa019ab563effa8dbf7be37ab3c23953887d040020bcfd40877d85762ead", - "0x0000000000000000000000000000000000000000000000000000000000003ab6": "0x95a81f8d922d65eec8e9c208495d7ecfb7ad7c15a46b78d380a21374fe35ef32", - "0x0000000000000000000000000000000000000000000000000000000000001a3d": "0x00000000000000000000000000000000000000000000000000000000698aadce", - "0x0000000000000000000000000000000000000000000000000000000000003aa3": "0xaba6a082c068c5341589df88228b2d6978164f861ad77e0560c13d27a1b77a08", - "0x0000000000000000000000000000000000000000000000000000000000001a29": "0x00000000000000000000000000000000000000000000000000000000698aadba", - "0x0000000000000000000000000000000000000000000000000000000000001942": "0x00000000000000000000000000000000000000000000000000000000698aacd3", - "0x0000000000000000000000000000000000000000000000000000000000003ab0": "0x04bcb8f9525ca60cc4d91f2744a5d348ad8937fc3085b23536354e0693b4a958", - "0x0000000000000000000000000000000000000000000000000000000000003b2e": "0xb829923f573ba0b854a6df86a7e7c364b64216e8898d17794b07f9f721e69a99", - "0x0000000000000000000000000000000000000000000000000000000000001a4d": "0x00000000000000000000000000000000000000000000000000000000698aadde", - "0x00000000000000000000000000000000000000000000000000000000000038f8": "0xada905d193f9c02ae49afc37d34b6bb96762b0fff165105d20a4ca5e205e8118", - "0x0000000000000000000000000000000000000000000000000000000000003a11": "0x1a30f396bae701432a8bdb61c576bc394457b86857c0cb5afe0fac0d8b433193", - "0x0000000000000000000000000000000000000000000000000000000000003912": "0x1ef674a5abb36f310a7a855e28d8b70e009e5eaaa9c965ba9ed5c4c408b6f879", - "0x00000000000000000000000000000000000000000000000000000000000039da": "0x00e4c4aec01b5b8c92ff4ff63c8609ac7383fe2b52c0da357503c8160d3d1c70", - "0x0000000000000000000000000000000000000000000000000000000000003935": "0xa24b369b6096ed17b529e69f3503def3e0469461275c9797c7afdf3efe979113", - "0x0000000000000000000000000000000000000000000000000000000000003a59": "0x2c3b84b8167df4458f9d49bd1a23a7084f30b166526fde3acd090877d2be2bab", - "0x0000000000000000000000000000000000000000000000000000000000003a6a": "0xac088cfb86d33b04f6917fb8b9e3d5bc791210c32ae5c1c5a8b2f3768968747e", - "0x00000000000000000000000000000000000000000000000000000000000019a8": "0x00000000000000000000000000000000000000000000000000000000698aad39", - "0x0000000000000000000000000000000000000000000000000000000000001a19": "0x00000000000000000000000000000000000000000000000000000000698aadaa", - "0x00000000000000000000000000000000000000000000000000000000000039ac": "0x91589a8c900b504855df52ce43f6f93478759d98bf8315381806043237cf829b", - "0x00000000000000000000000000000000000000000000000000000000000038d9": "0x279d8eeb6e59a14ab2fbb6d51ac4e8a2bedd3041f3cb838cb579e245f63df7cc", - "0x00000000000000000000000000000000000000000000000000000000000039dc": "0x482be875376bf039e98835e0e0cbc0eaf2f80eed2ad351618f7e45f668292b66", - "0x0000000000000000000000000000000000000000000000000000000000001967": "0x00000000000000000000000000000000000000000000000000000000698aacf8", - "0x0000000000000000000000000000000000000000000000000000000000001a41": "0x00000000000000000000000000000000000000000000000000000000698aadd2", - "0x0000000000000000000000000000000000000000000000000000000000003ad5": "0x46c852949c2e07128c54de9858fd3356b41e31127521ffd4ac69e0402aa7db42", - "0x0000000000000000000000000000000000000000000000000000000000001952": "0x00000000000000000000000000000000000000000000000000000000698aace3", - "0x0000000000000000000000000000000000000000000000000000000000001b38": "0x00000000000000000000000000000000000000000000000000000000698aaec9", - "0x0000000000000000000000000000000000000000000000000000000000001a86": "0x00000000000000000000000000000000000000000000000000000000698aae17", - "0x0000000000000000000000000000000000000000000000000000000000001a7c": "0x00000000000000000000000000000000000000000000000000000000698aae0d", - "0x0000000000000000000000000000000000000000000000000000000000001a73": "0x00000000000000000000000000000000000000000000000000000000698aae04", - "0x0000000000000000000000000000000000000000000000000000000000001998": "0x00000000000000000000000000000000000000000000000000000000698aad29", - "0x0000000000000000000000000000000000000000000000000000000000003998": "0x2d0f2de9a116e1f7ad46b72d79ea351e4b7902a33c50d133b89dfcaaa96d2408", - "0x00000000000000000000000000000000000000000000000000000000000019a3": "0x00000000000000000000000000000000000000000000000000000000698aad34", - "0x00000000000000000000000000000000000000000000000000000000000039e0": "0xa93581d6b1676bf11245ed488d743afd39f15af297e75f38fc40967500aaf313", - "0x0000000000000000000000000000000000000000000000000000000000001a7f": "0x00000000000000000000000000000000000000000000000000000000698aae10", - "0x000000000000000000000000000000000000000000000000000000000000391a": "0xc56a9e22e4af263a74382cd09063cf09dd8786f17734883c7acff114e4006603", - "0x0000000000000000000000000000000000000000000000000000000000001a11": "0x00000000000000000000000000000000000000000000000000000000698aada2", - "0x000000000000000000000000000000000000000000000000000000000000393f": "0xed6ea5922a226d6f1fe6ea6999cd702898ad9d8e15d8d17932fb25fe3a0b8a47", - "0x0000000000000000000000000000000000000000000000000000000000001907": "0x00000000000000000000000000000000000000000000000000000000698aac98", - "0x0000000000000000000000000000000000000000000000000000000000003a82": "0x5ecbb2cc26156429ffc270ae653a02164d1119971956262aec33d2cf992aecc7", - "0x000000000000000000000000000000000000000000000000000000000000390e": "0x29f5b4926a0f78ac7c1ed2cb83e4e965514902b852ac89973d10fe23e70a5052", - "0x00000000000000000000000000000000000000000000000000000000000018a7": "0x00000000000000000000000000000000000000000000000000000000698aac38", - "0x000000000000000000000000000000000000000000000000000000000000395d": "0xdde67434928330a74e54439ee1d2046ed2b509b686e14edd38c3078f0fd8ff75", - "0x00000000000000000000000000000000000000000000000000000000000039d4": "0x1cbab4eb3b07044c234adba440ea44accab5d585fc5f2de100d057b927e8580c", - "0x00000000000000000000000000000000000000000000000000000000000018c4": "0x00000000000000000000000000000000000000000000000000000000698aac55", - "0x0000000000000000000000000000000000000000000000000000000000001af7": "0x00000000000000000000000000000000000000000000000000000000698aae88", - "0x0000000000000000000000000000000000000000000000000000000000001b06": "0x00000000000000000000000000000000000000000000000000000000698aae97", - "0x0000000000000000000000000000000000000000000000000000000000001903": "0x00000000000000000000000000000000000000000000000000000000698aac94", - "0x0000000000000000000000000000000000000000000000000000000000001a6a": "0x00000000000000000000000000000000000000000000000000000000698aadfb", - "0x000000000000000000000000000000000000000000000000000000000000194a": "0x00000000000000000000000000000000000000000000000000000000698aacdb", - "0x000000000000000000000000000000000000000000000000000000000000192d": "0x00000000000000000000000000000000000000000000000000000000698aacbe", - "0x0000000000000000000000000000000000000000000000000000000000003996": "0xd93a1899289398cfe70eb985033f5c195f1c797516339e120c5a18d8931fa2ee", - "0x00000000000000000000000000000000000000000000000000000000000039bb": "0xb0382b2ec19e3b81465b1c0c08026ded1de8cf7505bbd97b992d3f07cd059722", - "0x0000000000000000000000000000000000000000000000000000000000001ab4": "0x00000000000000000000000000000000000000000000000000000000698aae45", - "0x0000000000000000000000000000000000000000000000000000000000003961": "0x7414b449d2b003d7bad2e5a645fadf02137d2f0a2f1cc09afda44a043ecd0957", - "0x0000000000000000000000000000000000000000000000000000000000003a6d": "0xb09b9cad4b7b21573ae9a79460ea8fc221b11cd291ef40792953756e111a05e2", - "0x000000000000000000000000000000000000000000000000000000000000391c": "0x2ec2ad4c549fd6c8bcf0db7f270b787b7c3521de03da51bc48052f59838e3270", - "0x0000000000000000000000000000000000000000000000000000000000001b39": "0x00000000000000000000000000000000000000000000000000000000698aaeca", - "0x00000000000000000000000000000000000000000000000000000000000018c3": "0x00000000000000000000000000000000000000000000000000000000698aac54", - "0x0000000000000000000000000000000000000000000000000000000000003b0d": "0x7ec0cd8a029cc9c52c0283dda7de0e0380b3c3857d354b6b06eb0142a1f86f20", - "0x00000000000000000000000000000000000000000000000000000000000038a9": "0xb69737c9c1310efa03f65a32bb358c6e3ffa45b5b51d6b51188e2f1cb540f0a8", - "0x00000000000000000000000000000000000000000000000000000000000039e3": "0x6a37c5b0e6afaef4ef4e9bd0c2a01801f6d6efe9c657786304f675bf5d166d4e", - "0x000000000000000000000000000000000000000000000000000000000000196e": "0x00000000000000000000000000000000000000000000000000000000698aacff", - "0x0000000000000000000000000000000000000000000000000000000000001a85": "0x00000000000000000000000000000000000000000000000000000000698aae16", - "0x0000000000000000000000000000000000000000000000000000000000003947": "0x53e587490c5745e1c73d9b840f7113d29f46d7cfb95b60b1486b2372ae7677f4", - "0x000000000000000000000000000000000000000000000000000000000000395c": "0x4a947205ab4b55094ec0a789405e833416a1e322bc847242291b92d46cd57784", - "0x0000000000000000000000000000000000000000000000000000000000003ac3": "0xd44f887f65637ff934bf7f1dc138c20697aa2b9179f78c30f34054006a76b4a2", - "0x00000000000000000000000000000000000000000000000000000000000039cd": "0xa5ef54b5c2489ad908d017a19d043ef67b7cd4286d1f536f741b3f9a9a839297", - "0x0000000000000000000000000000000000000000000000000000000000003a90": "0xf298e1694bc14fdb0bc431d7e7dc12dd3e6996040d90d514a4097dd5ce125eb4", - "0x00000000000000000000000000000000000000000000000000000000000038a3": "0xd442a014c29af9462c0a5ea2d1f3a036646de5a4b72dc91ef78fb70d578c5676", - "0x0000000000000000000000000000000000000000000000000000000000001a3b": "0x00000000000000000000000000000000000000000000000000000000698aadcc", - "0x00000000000000000000000000000000000000000000000000000000000038f6": "0x4b55cc733bd09e903f5d9413c2603e5d3069c97bc443cd2e5bfa528321fc26a3", - "0x0000000000000000000000000000000000000000000000000000000000003a3a": "0xd6537237644ed65da8cbe282642fc50c450f12f9c42e311588c641b4a86bf2bb", - "0x0000000000000000000000000000000000000000000000000000000000003989": "0x878be5dd6af803730c6d5bb52f0974317121e8dee8294fdb7a7e90f9927cc8dd", - "0x00000000000000000000000000000000000000000000000000000000000018ba": "0x00000000000000000000000000000000000000000000000000000000698aac4b", - "0x0000000000000000000000000000000000000000000000000000000000003ae1": "0x6687fab9f21ef91fb4b18aaebfb6782d530b9f7f0afea008398ddc59b861a56e", - "0x0000000000000000000000000000000000000000000000000000000000003b00": "0xcd61247c6e50c7e3cf56ce1808696cbc0a1ddfbf57623df75a8d5de8dceed713", - "0x00000000000000000000000000000000000000000000000000000000000019ae": "0x00000000000000000000000000000000000000000000000000000000698aad3f", - "0x00000000000000000000000000000000000000000000000000000000000038f5": "0x2c85bdd699311881fba8f7ab43846f15ab29792b50439bb52aaff8ed58f1dd46", - "0x00000000000000000000000000000000000000000000000000000000000018fa": "0x00000000000000000000000000000000000000000000000000000000698aac8b", - "0x0000000000000000000000000000000000000000000000000000000000003954": "0xc923fc836a87ebc0bba85c73515eeec852ca002414985aa37db12e7de8089576", - "0x0000000000000000000000000000000000000000000000000000000000001937": "0x00000000000000000000000000000000000000000000000000000000698aacc8", - "0x00000000000000000000000000000000000000000000000000000000000039b1": "0xd6c7e97ec82b5c8379e5f571ae31b0380dacbfbb02525e3b203603b11c99c21f", - "0x0000000000000000000000000000000000000000000000000000000000003ac1": "0xa344df238909e6876fd8bd2c99abd8ebbe1b864103aa5a147b3cfe19544878ff", - "0x0000000000000000000000000000000000000000000000000000000000001a3e": "0x00000000000000000000000000000000000000000000000000000000698aadcf", - "0x0000000000000000000000000000000000000000000000000000000000003a9a": "0xe7d94f6256f1dc2ab7fb4438bcbf2ce85b2d7419abe4c843727f96b2d90133cf", - "0x0000000000000000000000000000000000000000000000000000000000001a0c": "0x00000000000000000000000000000000000000000000000000000000698aad9d", - "0x0000000000000000000000000000000000000000000000000000000000001ad5": "0x00000000000000000000000000000000000000000000000000000000698aae66", - "0x0000000000000000000000000000000000000000000000000000000000001b33": "0x00000000000000000000000000000000000000000000000000000000698aaec4", - "0x0000000000000000000000000000000000000000000000000000000000003a71": "0xdea4fbc5849f934ced040d14c4b5f43c241c3bfc22fdaacb739ec995715ef0c9", - "0x0000000000000000000000000000000000000000000000000000000000001aa1": "0x00000000000000000000000000000000000000000000000000000000698aae32", - "0x00000000000000000000000000000000000000000000000000000000000038fc": "0x5de75c8e710c81f30a707d7e2cac5afcc1214c323563a5de25db9e403af29818", - "0x0000000000000000000000000000000000000000000000000000000000003aab": "0xeb2447c9f1bb8deb1c2340d4a01e9936490fff94c8b936e8fcf1f4e0dc5e9320", - "0x0000000000000000000000000000000000000000000000000000000000001ad8": "0x00000000000000000000000000000000000000000000000000000000698aae69", - "0x0000000000000000000000000000000000000000000000000000000000003b03": "0x0989cad3fc6ef065efbcd22dc276e23e69fb7fad8014a3dc175ddc8969f9f41a", - "0x0000000000000000000000000000000000000000000000000000000000001b2a": "0x00000000000000000000000000000000000000000000000000000000698aaebb", - "0x0000000000000000000000000000000000000000000000000000000000003933": "0x0ff4003f989d916c2c2cb9b496a6ef7f9611d562d0151bad287c83a43a7d2577", - "0x00000000000000000000000000000000000000000000000000000000000039c9": "0x16fc7fd8eada59b358aaaf7b5e3ad356ea9f1f932a1d8aabfa76b2690103e43b", - "0x0000000000000000000000000000000000000000000000000000000000003a47": "0x9f1daa1770b1d53e32aab7c3e65e5cfc612675a9596572d34136b36678b357d4", - "0x0000000000000000000000000000000000000000000000000000000000001a91": "0x00000000000000000000000000000000000000000000000000000000698aae22", - "0x0000000000000000000000000000000000000000000000000000000000001927": "0x00000000000000000000000000000000000000000000000000000000698aacb8", - "0x0000000000000000000000000000000000000000000000000000000000001a87": "0x00000000000000000000000000000000000000000000000000000000698aae18", - "0x0000000000000000000000000000000000000000000000000000000000001b3c": "0x00000000000000000000000000000000000000000000000000000000698aaecd", - "0x00000000000000000000000000000000000000000000000000000000000019b6": "0x00000000000000000000000000000000000000000000000000000000698aad47", - "0x00000000000000000000000000000000000000000000000000000000000038c8": "0xcdb177fb222c4980d621aa21d26496fa4385e90106b6ada21d44315bc58f877e", - "0x00000000000000000000000000000000000000000000000000000000000019a2": "0x00000000000000000000000000000000000000000000000000000000698aad33", - "0x00000000000000000000000000000000000000000000000000000000000038d8": "0xf84448e824ec31668f481e802349c76bb792d17b0bb819e4519da7652dce2dfd", - "0x000000000000000000000000000000000000000000000000000000000000191c": "0x00000000000000000000000000000000000000000000000000000000698aacad", - "0x0000000000000000000000000000000000000000000000000000000000003abd": "0xc671ff0926847114aaca4df008eed16dcea70e3eda2e4bf142575528031183a5", - "0x000000000000000000000000000000000000000000000000000000000000391b": "0x4454d455fbf0854b748f0bd5f6fb7c63caeda2a708893d0392c5b359a8163909", - "0x0000000000000000000000000000000000000000000000000000000000001978": "0x00000000000000000000000000000000000000000000000000000000698aad09", - "0x0000000000000000000000000000000000000000000000000000000000003a7c": "0xb284ce6af9b3811483befbb5bb92876c205e099d1b2d9d654c96d1f5b7687b3b", - "0x0000000000000000000000000000000000000000000000000000000000003a94": "0x1257271af45761a0b72296409fab2b2430471794da01b7a8325f6c9d6b35458f", - "0x0000000000000000000000000000000000000000000000000000000000001a81": "0x00000000000000000000000000000000000000000000000000000000698aae12", - "0x00000000000000000000000000000000000000000000000000000000000038bb": "0x25a3877bacd5042f0ec7a10da5bfa1d6f5373f12408cca02888462344d31c878", - "0x0000000000000000000000000000000000000000000000000000000000001b09": "0x00000000000000000000000000000000000000000000000000000000698aae9a", - "0x0000000000000000000000000000000000000000000000000000000000001920": "0x00000000000000000000000000000000000000000000000000000000698aacb1", - "0x0000000000000000000000000000000000000000000000000000000000001901": "0x00000000000000000000000000000000000000000000000000000000698aac92", - "0x0000000000000000000000000000000000000000000000000000000000001aff": "0x00000000000000000000000000000000000000000000000000000000698aae90", - "0x000000000000000000000000000000000000000000000000000000000000399a": "0x8421985d382dfe0e1dba5e6be30fc2460d9d99a2b101bdc1211874218b35a43e", - "0x0000000000000000000000000000000000000000000000000000000000001a0a": "0x00000000000000000000000000000000000000000000000000000000698aad9b", - "0x0000000000000000000000000000000000000000000000000000000000003b3f": "0x43c6f6529d16918bdc3c9acaa91deb13b8ca30b9acf6496078abaeb1e62a4afd", - "0x0000000000000000000000000000000000000000000000000000000000003941": "0x96b3375a56567491f0086648bb8ce4a3d40bb3105b1a1432cb96d02194076c6e", - "0x0000000000000000000000000000000000000000000000000000000000001aa5": "0x00000000000000000000000000000000000000000000000000000000698aae36", - "0x00000000000000000000000000000000000000000000000000000000000018bb": "0x00000000000000000000000000000000000000000000000000000000698aac4c", - "0x00000000000000000000000000000000000000000000000000000000000018fe": "0x00000000000000000000000000000000000000000000000000000000698aac8f", - "0x0000000000000000000000000000000000000000000000000000000000003904": "0x96bb79e63f694c7b8a859e437c77c5c062460caa57044381a61aee1d644a11ed", - "0x0000000000000000000000000000000000000000000000000000000000003a04": "0xd127c1f65481bdca777da724db96cb4c644027b76aed743baeebef8140b5ac24", - "0x0000000000000000000000000000000000000000000000000000000000003924": "0x23f2e364ddf093857d7b7ba1ca2eda10b05d0597d986a99c586285c32cbdfbba", - "0x000000000000000000000000000000000000000000000000000000000000198f": "0x00000000000000000000000000000000000000000000000000000000698aad20", - "0x000000000000000000000000000000000000000000000000000000000000393d": "0x8f2bc4ca98e765cb5bc617c18b766786495d150638ce1abf784021941b866d36", - "0x00000000000000000000000000000000000000000000000000000000000018ae": "0x00000000000000000000000000000000000000000000000000000000698aac3f", - "0x0000000000000000000000000000000000000000000000000000000000001ae3": "0x00000000000000000000000000000000000000000000000000000000698aae74", - "0x0000000000000000000000000000000000000000000000000000000000003b3b": "0xfc347484304f29336aed55efbf1bf0587f0ed9dc873dd1ba0a15900994d9ff4a", - "0x0000000000000000000000000000000000000000000000000000000000003ad2": "0xaedfeeb4bb9c33f67eb6fa84e34f10481718a9c686cbc044f2554d643a57810a", - "0x0000000000000000000000000000000000000000000000000000000000003a1f": "0x84393589983e44bbc1996e3434a7e3928891cfd48658aef2e298cfca13b8219f", - "0x0000000000000000000000000000000000000000000000000000000000003b05": "0x8ae583109ce733e6b31dd9cd64e02ce16d954766e15892c0b0119646d4f371cd", - "0x0000000000000000000000000000000000000000000000000000000000003973": "0x7832a35e605443f504d6f0d2454ddf842c6914a351a09375b2211aa201f4ec80", - "0x00000000000000000000000000000000000000000000000000000000000019ec": "0x00000000000000000000000000000000000000000000000000000000698aad7d", - "0x0000000000000000000000000000000000000000000000000000000000001a3f": "0x00000000000000000000000000000000000000000000000000000000698aadd0", - "0x0000000000000000000000000000000000000000000000000000000000001ad3": "0x00000000000000000000000000000000000000000000000000000000698aae64", - "0x0000000000000000000000000000000000000000000000000000000000001aea": "0x00000000000000000000000000000000000000000000000000000000698aae7b", - "0x00000000000000000000000000000000000000000000000000000000000038e7": "0x3cd74e4e087319421a0317ab8c03af1efc7db1436bca0aa181fede3d683b90af", - "0x0000000000000000000000000000000000000000000000000000000000001b43": "0x00000000000000000000000000000000000000000000000000000000698aaed4", - "0x0000000000000000000000000000000000000000000000000000000000001b3d": "0x00000000000000000000000000000000000000000000000000000000698aaece", - "0x000000000000000000000000000000000000000000000000000000000000397d": "0x9f1d8533816824b063dcaf3a470866476f661377d54105d41e8ed1b066357752", - "0x0000000000000000000000000000000000000000000000000000000000003a19": "0x1642952bb654ff9f82abbe50ad3308557616c5866f7d660f2923c8c6a9f5f754", - "0x0000000000000000000000000000000000000000000000000000000000003a70": "0x6fcc439c9dafbc567caee1d56b2712df2161201945b8f10be4852b347f1565c0", - "0x000000000000000000000000000000000000000000000000000000000000199e": "0x00000000000000000000000000000000000000000000000000000000698aad2f", - "0x00000000000000000000000000000000000000000000000000000000000019d5": "0x00000000000000000000000000000000000000000000000000000000698aad66", - "0x00000000000000000000000000000000000000000000000000000000000038c2": "0xcc85883c73e858450973efdb0f05295a767b18a91ea79e76a4e866291ac99d60", - "0x0000000000000000000000000000000000000000000000000000000000003b0c": "0xadb9174563061a904b51e85245a06542a658126bbf01ccab4af1c14aa65c2336", - "0x0000000000000000000000000000000000000000000000000000000000003945": "0xd1b98440b3207ec2f2ba18f5b04f44fabbed70657aaa91f95536bce2b766b72e", - "0x0000000000000000000000000000000000000000000000000000000000001975": "0x00000000000000000000000000000000000000000000000000000000698aad06", - "0x00000000000000000000000000000000000000000000000000000000000018b0": "0x00000000000000000000000000000000000000000000000000000000698aac41", - "0x0000000000000000000000000000000000000000000000000000000000001955": "0x00000000000000000000000000000000000000000000000000000000698aace6", - "0x0000000000000000000000000000000000000000000000000000000000003a87": "0x2d057024f33755bc415be5c39182051035d15ad259ee872cb4e0eeb15152236a", - "0x0000000000000000000000000000000000000000000000000000000000001a6f": "0x00000000000000000000000000000000000000000000000000000000698aae00", - "0x0000000000000000000000000000000000000000000000000000000000001966": "0x00000000000000000000000000000000000000000000000000000000698aacf7", - "0x00000000000000000000000000000000000000000000000000000000000018e6": "0x00000000000000000000000000000000000000000000000000000000698aac77", - "0x0000000000000000000000000000000000000000000000000000000000001a9a": "0x00000000000000000000000000000000000000000000000000000000698aae2b", - "0x00000000000000000000000000000000000000000000000000000000000018f1": "0x00000000000000000000000000000000000000000000000000000000698aac82", - "0x00000000000000000000000000000000000000000000000000000000000038fd": "0x806788323034b55ff111b707c9d86127c46c012b939d49175f768311a74b2839", - "0x0000000000000000000000000000000000000000000000000000000000001922": "0x00000000000000000000000000000000000000000000000000000000698aacb3", - "0x0000000000000000000000000000000000000000000000000000000000001afb": "0x00000000000000000000000000000000000000000000000000000000698aae8c", - "0x0000000000000000000000000000000000000000000000000000000000003a09": "0x6b8e9be21637da574ea71bc1b2531f71c410809e5523464e578eb20edf131b2d", - "0x0000000000000000000000000000000000000000000000000000000000003a12": "0xe931204d66d1cc6db7da63112b5e58ce9a296ab810b4b68ff3640ea7573db388", - "0x0000000000000000000000000000000000000000000000000000000000003a63": "0xfbce60e3264d2e28dacfda6d27ef680d956517639068d7e58c114dbce020c702", - "0x0000000000000000000000000000000000000000000000000000000000003a3d": "0x3cb1ffb38bd5a3636818b8e1f77d3299c3c5b46ec0333daff847703cd457b1ca", - "0x0000000000000000000000000000000000000000000000000000000000003a22": "0x17af1b24267b2fe0a0cfe0fe9c462f553b9bd809b0679ed30a1096fec9b3a8d2", - "0x000000000000000000000000000000000000000000000000000000000000191f": "0x00000000000000000000000000000000000000000000000000000000698aacb0", - "0x000000000000000000000000000000000000000000000000000000000000392b": "0x72173138b02ce5667576b0fe372eb302ab80676c8d30d673e72c00bec4c52a40", - "0x000000000000000000000000000000000000000000000000000000000000390a": "0xf45e7a48e800279e7f070daca087ce55fb0fae34ff54b9d6dc4cdd736eae808d", - "0x0000000000000000000000000000000000000000000000000000000000003960": "0x590d0fb59ecf90bf511b5afdedea4b26f77f8c33cb49f0ce8191964c1a0de007", - "0x0000000000000000000000000000000000000000000000000000000000001970": "0x00000000000000000000000000000000000000000000000000000000698aad01", - "0x0000000000000000000000000000000000000000000000000000000000001a88": "0x00000000000000000000000000000000000000000000000000000000698aae19", - "0x0000000000000000000000000000000000000000000000000000000000001965": "0x00000000000000000000000000000000000000000000000000000000698aacf6", - "0x0000000000000000000000000000000000000000000000000000000000001a67": "0x00000000000000000000000000000000000000000000000000000000698aadf8", - "0x0000000000000000000000000000000000000000000000000000000000001a5a": "0x00000000000000000000000000000000000000000000000000000000698aadeb", - "0x0000000000000000000000000000000000000000000000000000000000001b2c": "0x00000000000000000000000000000000000000000000000000000000698aaebd", - "0x0000000000000000000000000000000000000000000000000000000000001b3a": "0x00000000000000000000000000000000000000000000000000000000698aaecb", - "0x00000000000000000000000000000000000000000000000000000000000039be": "0xb50a6d4df5acf7a1d5e100f231419d08b69766774d5bb733a04b9829646abf6f", - "0x0000000000000000000000000000000000000000000000000000000000003a5a": "0x38a7f2a35b1f7428f960ef0c05066945f6512a7b03f3a122415768e287bc268b", - "0x0000000000000000000000000000000000000000000000000000000000003a3e": "0x4395069607e7cb234f0ca3fba03ce677ca8d0ededf406ebba7fd1d37eed6c4e5", - "0x0000000000000000000000000000000000000000000000000000000000003b3e": "0xa05b88c100b7a655a8ef3dfedde02fec9db0f7f3634e325dfb89f56e0b20d16c", - "0x00000000000000000000000000000000000000000000000000000000000039c5": "0xb32d399b0921a2ebdde7f373daea80f5142d73ac8a95e6f897ee1fe28a32f422", - "0x00000000000000000000000000000000000000000000000000000000000019e3": "0x00000000000000000000000000000000000000000000000000000000698aad74", - "0x0000000000000000000000000000000000000000000000000000000000003a73": "0x40aa6b39e755576f782922d572da10d5614d54f4baa1b367d774dd705d974508", - "0x0000000000000000000000000000000000000000000000000000000000001ab0": "0x00000000000000000000000000000000000000000000000000000000698aae41", - "0x00000000000000000000000000000000000000000000000000000000000038db": "0xa822e3f64137669eedd79ce05fbe599f472c93978ea7f4ed291fd6a8e64006b7", - "0x00000000000000000000000000000000000000000000000000000000000039cc": "0x767386592fa733021e7b5fc253722c5dec961a0adf282a6444ffcde3db546f2f", - "0x0000000000000000000000000000000000000000000000000000000000001a7a": "0x00000000000000000000000000000000000000000000000000000000698aae0b", - "0x0000000000000000000000000000000000000000000000000000000000003b3a": "0xcc687093382e887d43a420d630bc00036ef36506fed59fdc71cd0bf69bdcb404", - "0x00000000000000000000000000000000000000000000000000000000000018f7": "0x00000000000000000000000000000000000000000000000000000000698aac88", - "0x0000000000000000000000000000000000000000000000000000000000003993": "0x441fa6e6aed83e66e67f848f981a5af0aa48502f34fed65628970f71a03b3564", - "0x000000000000000000000000000000000000000000000000000000000000196b": "0x00000000000000000000000000000000000000000000000000000000698aacfc", - "0x00000000000000000000000000000000000000000000000000000000000038d6": "0x61f3dc219427ea7cb410913794befa89480d7c1b37cf36af70925e13f35dea52", - "0x0000000000000000000000000000000000000000000000000000000000003b39": "0x3b07ddd06c0b5ae055f01c254b02d62792159cdcd89bae16dd0452bb21ba8bd8", - "0x00000000000000000000000000000000000000000000000000000000000039db": "0x3b639c1a39478a8a32e44916083843347929a68c876bb5464c1bac5decce650d", - "0x0000000000000000000000000000000000000000000000000000000000001a31": "0x00000000000000000000000000000000000000000000000000000000698aadc2", - "0x00000000000000000000000000000000000000000000000000000000000018a8": "0x00000000000000000000000000000000000000000000000000000000698aac39", - "0x0000000000000000000000000000000000000000000000000000000000001a2c": "0x00000000000000000000000000000000000000000000000000000000698aadbd", - "0x0000000000000000000000000000000000000000000000000000000000003a25": "0x6a626e78aae1b333bb1a37cf1d574c87cfe08497cd26e6a5510ae4bebef1f5fa", - "0x0000000000000000000000000000000000000000000000000000000000003a8e": "0x91f0f175e340b76453ac526c8c0b34d3b7d793f4dd8dca92361e9aeadf1f6efe", - "0x0000000000000000000000000000000000000000000000000000000000001a53": "0x00000000000000000000000000000000000000000000000000000000698aade4", - "0x0000000000000000000000000000000000000000000000000000000000001a2b": "0x00000000000000000000000000000000000000000000000000000000698aadbc", - "0x0000000000000000000000000000000000000000000000000000000000001a1d": "0x00000000000000000000000000000000000000000000000000000000698aadae", - "0x0000000000000000000000000000000000000000000000000000000000001a82": "0x00000000000000000000000000000000000000000000000000000000698aae13", - "0x00000000000000000000000000000000000000000000000000000000000019ad": "0x00000000000000000000000000000000000000000000000000000000698aad3e", - "0x0000000000000000000000000000000000000000000000000000000000001ab3": "0x00000000000000000000000000000000000000000000000000000000698aae44", - "0x0000000000000000000000000000000000000000000000000000000000003936": "0x2a46a61dbb7eb5fbdd5e16e06b9c4167fa4109f6ccee4885c55a4c5dd98602e5", - "0x0000000000000000000000000000000000000000000000000000000000003918": "0x3a01832da66388faceca7fcfdaba5a1b154786610d9f69947c8b9aa13e245323", - "0x0000000000000000000000000000000000000000000000000000000000003955": "0x53ad727f6507fd432068627ca55475032d5970aafb4dcec49b050f6b376df5b4", - "0x00000000000000000000000000000000000000000000000000000000000039e5": "0x39f4aa2ddbcafabd12c27bef2259cb61220338cd706943e301b99b840dbd71be", - "0x00000000000000000000000000000000000000000000000000000000000019b4": "0x00000000000000000000000000000000000000000000000000000000698aad45", - "0x0000000000000000000000000000000000000000000000000000000000003a60": "0x4bb58e163cd4206322b77abc41ba21d154949e59fb635a670e3b19c2d5dec19d", - "0x0000000000000000000000000000000000000000000000000000000000003a99": "0xdd409bda1ebdfdcc2b200539a0c1e4cc29972d2048e0689099ff4d2af2fdb1d0", - "0x0000000000000000000000000000000000000000000000000000000000001a78": "0x00000000000000000000000000000000000000000000000000000000698aae09", - "0x00000000000000000000000000000000000000000000000000000000000038de": "0xa6c9b71e85297d9cbd8d19e40fbd0c3c1d38b9d31c4d759cac710da8abcab8be", - "0x00000000000000000000000000000000000000000000000000000000000039f2": "0x8744b113ddd3ae95a009d8d5df5792addc018abda21a6ea24c3543e979da2477", - "0x0000000000000000000000000000000000000000000000000000000000003a8c": "0x66cb29be5bc1c8d724993c0a468c74809666f8985401b792e4b208ea5311f1dc", - "0x0000000000000000000000000000000000000000000000000000000000003b04": "0x02803969cf70f7b9b2109793686aba8afcf4716c4c4120e4a35241c836fc691f", - "0x0000000000000000000000000000000000000000000000000000000000001a8f": "0x00000000000000000000000000000000000000000000000000000000698aae20", - "0x0000000000000000000000000000000000000000000000000000000000001ab2": "0x00000000000000000000000000000000000000000000000000000000698aae43", - "0x0000000000000000000000000000000000000000000000000000000000001931": "0x00000000000000000000000000000000000000000000000000000000698aacc2", - "0x0000000000000000000000000000000000000000000000000000000000003a35": "0x5aba94900dd71d61980c3ab5c333a938d0a8451b440cc9e035053f7bebdc1789", - "0x0000000000000000000000000000000000000000000000000000000000001a2e": "0x00000000000000000000000000000000000000000000000000000000698aadbf", - "0x000000000000000000000000000000000000000000000000000000000000394f": "0x251a5fa1540cda2ef970531fa4cefc78b7815168df5808fd8f1e822bcb6eca6e", - "0x0000000000000000000000000000000000000000000000000000000000003a1b": "0x820ffcfb07828d66e625fc51060b5809b07b48abd7abcbecd6c889cc4a878779", - "0x00000000000000000000000000000000000000000000000000000000000019f7": "0x00000000000000000000000000000000000000000000000000000000698aad88", - "0x000000000000000000000000000000000000000000000000000000000000397e": "0x16e532281917d1e1aa87a28863ce4ccf58df0bdf22e4c869bdf28e39875b11cf", - "0x0000000000000000000000000000000000000000000000000000000000003a9b": "0x26a0e8803850ef9b3440f590199e5e6bf94742d9d2141426ca58529ecec7966d", - "0x00000000000000000000000000000000000000000000000000000000000018d9": "0x00000000000000000000000000000000000000000000000000000000698aac6a", - "0x00000000000000000000000000000000000000000000000000000000000018de": "0x00000000000000000000000000000000000000000000000000000000698aac6f", - "0x0000000000000000000000000000000000000000000000000000000000001991": "0x00000000000000000000000000000000000000000000000000000000698aad22", - "0x000000000000000000000000000000000000000000000000000000000000196a": "0x00000000000000000000000000000000000000000000000000000000698aacfb", - "0x00000000000000000000000000000000000000000000000000000000000019e7": "0x00000000000000000000000000000000000000000000000000000000698aad78", - "0x00000000000000000000000000000000000000000000000000000000000018ce": "0x00000000000000000000000000000000000000000000000000000000698aac5f", - "0x00000000000000000000000000000000000000000000000000000000000019f9": "0x00000000000000000000000000000000000000000000000000000000698aad8a", - "0x0000000000000000000000000000000000000000000000000000000000001a6d": "0x00000000000000000000000000000000000000000000000000000000698aadfe", - "0x000000000000000000000000000000000000000000000000000000000000390d": "0x9cd7eba4c48961ead64ebb5bb6d6c80a15d1c727970238099b497dc3ea813a4f", - "0x00000000000000000000000000000000000000000000000000000000000039ee": "0x8d60db0cd692fd949c0fbfe0a033400382abab582965dfe4e39a2f70d278af6b", - "0x0000000000000000000000000000000000000000000000000000000000001997": "0x00000000000000000000000000000000000000000000000000000000698aad28", - "0x00000000000000000000000000000000000000000000000000000000000039c4": "0x298fbbd51f783132489d9a98f09c6488af279496094792a8261d01879d6dc326", - "0x00000000000000000000000000000000000000000000000000000000000019cc": "0x00000000000000000000000000000000000000000000000000000000698aad5d", - "0x0000000000000000000000000000000000000000000000000000000000003a9c": "0x2c5c9524ec873597e6e14e1a85448f285f8674246985c7a010eac91d5caf3e60", - "0x0000000000000000000000000000000000000000000000000000000000003aa4": "0xa260c2c3281c8aaf11c41bbd7b9a61fffd73c7c25fbdb3222bce11240687f738", - "0x0000000000000000000000000000000000000000000000000000000000003ad4": "0xafa977dadd1a0b91948b0f246e5cb15c0c3f24fd963925ace4a6eac9f7d1d7ba", - "0x00000000000000000000000000000000000000000000000000000000000039a6": "0x5cdd2a3e4d1627174ac183bce0d78bf1df1e21834bda8e8d9c8275b6208a4c1c", - "0x000000000000000000000000000000000000000000000000000000000000193e": "0x00000000000000000000000000000000000000000000000000000000698aaccf", - "0x000000000000000000000000000000000000000000000000000000000000397a": "0x9013e562f5c34775ef7ed5d7aa429c2be2d89aa7fe59881c77884c08ed2bd3b9", - "0x00000000000000000000000000000000000000000000000000000000000019bf": "0x00000000000000000000000000000000000000000000000000000000698aad50", - "0x00000000000000000000000000000000000000000000000000000000000039d9": "0x3dee65822ecf7332dc07c4351e9f749e4729185df0098fcd518cc95c79a99257", - "0x000000000000000000000000000000000000000000000000000000000000195c": "0x00000000000000000000000000000000000000000000000000000000698aaced", - "0x0000000000000000000000000000000000000000000000000000000000001ae9": "0x00000000000000000000000000000000000000000000000000000000698aae7a", - "0x00000000000000000000000000000000000000000000000000000000000038bd": "0xfd9051e1c7ff7d2ffae60552dd81eb88a5d888ae41bb561af9c83342acc86524", - "0x0000000000000000000000000000000000000000000000000000000000003aae": "0xddd2a4d771ff986ea2a2e415121e0e9b5a0af77333707270937b607189f46025", - "0x00000000000000000000000000000000000000000000000000000000000019c7": "0x00000000000000000000000000000000000000000000000000000000698aad58", - "0x0000000000000000000000000000000000000000000000000000000000001b40": "0x00000000000000000000000000000000000000000000000000000000698aaed1", - "0x0000000000000000000000000000000000000000000000000000000000003a01": "0xcb14f5d05e3a2af8c96ae8b6747aadb20ab5a7db1dc583c8601315f7167ca39f", - "0x0000000000000000000000000000000000000000000000000000000000003a64": "0x0637570f30e2431d5b0bbd7c2ca5817b652644a85802a02b1effacf15f02cf35", - "0x0000000000000000000000000000000000000000000000000000000000003a8d": "0xa5845c3a04e4d52e14de6c4b7190fc5199e69573b2eb4019b165c17613daa110", - "0x0000000000000000000000000000000000000000000000000000000000001b0a": "0x00000000000000000000000000000000000000000000000000000000698aae9b", - "0x000000000000000000000000000000000000000000000000000000000000195b": "0x00000000000000000000000000000000000000000000000000000000698aacec", - "0x00000000000000000000000000000000000000000000000000000000000018c5": "0x00000000000000000000000000000000000000000000000000000000698aac56", - "0x0000000000000000000000000000000000000000000000000000000000001a3a": "0x00000000000000000000000000000000000000000000000000000000698aadcb", - "0x00000000000000000000000000000000000000000000000000000000000018a4": "0x00000000000000000000000000000000000000000000000000000000698aac35", - "0x00000000000000000000000000000000000000000000000000000000000039f0": "0x5adba7844db8927ca4e8a67a39b5af4cf2d15329600003e77ef4ce3ca36820e5", - "0x0000000000000000000000000000000000000000000000000000000000003a5f": "0xeee28d9d118d9747d3e19589d69154c53227cceb0aa53d36d3e418ca6604274b", - "0x0000000000000000000000000000000000000000000000000000000000001a08": "0x00000000000000000000000000000000000000000000000000000000698aad99", - "0x0000000000000000000000000000000000000000000000000000000000001ac8": "0x00000000000000000000000000000000000000000000000000000000698aae59", - "0x0000000000000000000000000000000000000000000000000000000000003a5d": "0x9b459857d6262e7f6da4da442b607e728db9ecaf004864dac1b581ec46115dec", - "0x0000000000000000000000000000000000000000000000000000000000003ac9": "0xeaaec5aca2464de740fbd197cd2f415976fa48859d485f51e29b882dcb1b35f1", - "0x0000000000000000000000000000000000000000000000000000000000003aee": "0xefe5a89d387d5d7ca7ee3f9705afe4c4a594f355aa4fb932c6aa4ee3e8fc0823", - "0x00000000000000000000000000000000000000000000000000000000000038b2": "0x2e815843528e50a36c087305a836a50f7f9ccea296d4165c91282567fa1651a0", - "0x00000000000000000000000000000000000000000000000000000000000039a7": "0x6dbc0bbac58abf16628568142d5f39c862cf78d8c09cd49aab1c1d2099dbab5c", - "0x0000000000000000000000000000000000000000000000000000000000003a6b": "0x7a0e6f3a77b4604862e79b4232e3cb742e8044591676b2f5ddc97332ebf0f442", - "0x0000000000000000000000000000000000000000000000000000000000001a0e": "0x00000000000000000000000000000000000000000000000000000000698aad9f", - "0x00000000000000000000000000000000000000000000000000000000000039d2": "0x08d351bb5f2109d7d4e849d0a4e99b074106f47f294f3667f3f14a8f1001f303", - "0x0000000000000000000000000000000000000000000000000000000000003a4c": "0x88ad658686b4e7daf022e8bb828f8957932daa74bc8a7839bb5111539e40411e", - "0x0000000000000000000000000000000000000000000000000000000000001a76": "0x00000000000000000000000000000000000000000000000000000000698aae07", - "0x00000000000000000000000000000000000000000000000000000000000038e0": "0x83e2ab54211bd087354e02549388bbf64707b44f88dda57428f4317cd44a8751", - "0x0000000000000000000000000000000000000000000000000000000000003a43": "0x52721167f84197df6a0816062a8d98394385ed6fedcd15eb174bfcc6e645126b", - "0x0000000000000000000000000000000000000000000000000000000000003aad": "0x45280e51110e48465fc2507539b50e7e5b7694632540160712b65ca77d18d3a6", - "0x0000000000000000000000000000000000000000000000000000000000003acb": "0x762e58086835d61d6892d5bbd78696a7b7a94d14945e6f48e9b8f3c6ab9140aa", - "0x0000000000000000000000000000000000000000000000000000000000003afb": "0xad1730e776501e38bdbb9252fea2bb2c4e8f0ca864d6bc204367fc1471a3ae30", - "0x00000000000000000000000000000000000000000000000000000000000019fe": "0x00000000000000000000000000000000000000000000000000000000698aad8f", - "0x00000000000000000000000000000000000000000000000000000000000019b8": "0x00000000000000000000000000000000000000000000000000000000698aad49", - "0x0000000000000000000000000000000000000000000000000000000000003937": "0x447df2b765e57963dfe3888f2266d24595673455c8f3c590436a4597363119f9", - "0x00000000000000000000000000000000000000000000000000000000000019c2": "0x00000000000000000000000000000000000000000000000000000000698aad53", - "0x0000000000000000000000000000000000000000000000000000000000001a9e": "0x00000000000000000000000000000000000000000000000000000000698aae2f", - "0x0000000000000000000000000000000000000000000000000000000000003af7": "0xfe750d4ee36f43dc51b630c94bf97dae4878594f89c63254cb125f81dc8fb3ee", - "0x00000000000000000000000000000000000000000000000000000000000019ca": "0x00000000000000000000000000000000000000000000000000000000698aad5b", - "0x0000000000000000000000000000000000000000000000000000000000003b29": "0xd4beb3270d512144d9867237a9f33fd0be8e993a135269eeaf094a1bd5ee6e5f", - "0x0000000000000000000000000000000000000000000000000000000000003b3d": "0xc34292b58a55f7fe87de84e3e44d2f7172fb4ad32da29021db2a60c9a15d8511", - "0x00000000000000000000000000000000000000000000000000000000000019f0": "0x00000000000000000000000000000000000000000000000000000000698aad81", - "0x0000000000000000000000000000000000000000000000000000000000003ac4": "0xb7853607c22724b0aa04be97c35199241215a665a1f4da500bf0718b6583da88", - "0x0000000000000000000000000000000000000000000000000000000000001a8e": "0x00000000000000000000000000000000000000000000000000000000698aae1f", - "0x00000000000000000000000000000000000000000000000000000000000039ae": "0xd3a4bc4d29799f3bfe5e60fff56759d714ddb95573f8cf5fd11a7b72e191c9de", - "0x00000000000000000000000000000000000000000000000000000000000039e2": "0x9b10355773c2a56eb8356e7ed9e7543fc3f1d4e2115c93f10be1c8a7a78d12a6", - "0x0000000000000000000000000000000000000000000000000000000000003a62": "0x198f40a5a185bb5788ba0d13f654cd445a1d2956f3b7cc99f48b6149584a25e8", - "0x0000000000000000000000000000000000000000000000000000000000003ab2": "0xd5a71fa8c82a275fb402022ee3468fd061d4c691fbd43dbac884b4115d74a4f5", - "0x00000000000000000000000000000000000000000000000000000000000039a5": "0x1df0d012ae9efa11f9614c32db5398ce037bf107cdf4e57546b89c37fe3fc9ed", - "0x00000000000000000000000000000000000000000000000000000000000018c1": "0x00000000000000000000000000000000000000000000000000000000698aac52", - "0x0000000000000000000000000000000000000000000000000000000000003a5c": "0x173138c72cb3d2220b731257a8e21a7d1b94a2537cd366f33781f7a26558b2ad", - "0x00000000000000000000000000000000000000000000000000000000000038bc": "0x9ce00b43d38c404502d98b0d6ee71af7f7b3f7c4eb8e1d73a8a3de5bbb53a5d2", - "0x00000000000000000000000000000000000000000000000000000000000038f9": "0xff77e1e97f1048472196feaa40b249555105c21de6ee9f031d4921448cf59952", - "0x0000000000000000000000000000000000000000000000000000000000001a63": "0x00000000000000000000000000000000000000000000000000000000698aadf4", - "0x0000000000000000000000000000000000000000000000000000000000003a2b": "0x7598f64e20e107576c429f4036da9287c8227462332e660f535bcdc0ef4ac701", - "0x00000000000000000000000000000000000000000000000000000000000039f7": "0x8ad5993fc3fe695c15567fb1939a55b70103c9f2e111b6f846ba25ff281f4f86", - "0x00000000000000000000000000000000000000000000000000000000000038ad": "0x08a9f6df9912ae15b976f90d1bba8dd6688e88336bf17154152b70103ce05eea", - "0x000000000000000000000000000000000000000000000000000000000000195a": "0x00000000000000000000000000000000000000000000000000000000698aaceb", - "0x00000000000000000000000000000000000000000000000000000000000019d8": "0x00000000000000000000000000000000000000000000000000000000698aad69", - "0x0000000000000000000000000000000000000000000000000000000000001a8c": "0x00000000000000000000000000000000000000000000000000000000698aae1d", - "0x0000000000000000000000000000000000000000000000000000000000001a22": "0x00000000000000000000000000000000000000000000000000000000698aadb3", - "0x0000000000000000000000000000000000000000000000000000000000001a25": "0x00000000000000000000000000000000000000000000000000000000698aadb6", - "0x00000000000000000000000000000000000000000000000000000000000019a1": "0x00000000000000000000000000000000000000000000000000000000698aad32", - "0x000000000000000000000000000000000000000000000000000000000000192f": "0x00000000000000000000000000000000000000000000000000000000698aacc0", - "0x00000000000000000000000000000000000000000000000000000000000039fc": "0x46821de3cb9842e7fbdcebfe4a2794c2b622ff2212cf95a225c545885bef1a20", - "0x000000000000000000000000000000000000000000000000000000000000194b": "0x00000000000000000000000000000000000000000000000000000000698aacdc", - "0x00000000000000000000000000000000000000000000000000000000000018cd": "0x00000000000000000000000000000000000000000000000000000000698aac5e", - "0x00000000000000000000000000000000000000000000000000000000000019a5": "0x00000000000000000000000000000000000000000000000000000000698aad36", - "0x00000000000000000000000000000000000000000000000000000000000018b2": "0x00000000000000000000000000000000000000000000000000000000698aac43", - "0x0000000000000000000000000000000000000000000000000000000000001a7d": "0x00000000000000000000000000000000000000000000000000000000698aae0e", - "0x0000000000000000000000000000000000000000000000000000000000001ab5": "0x00000000000000000000000000000000000000000000000000000000698aae46", - "0x00000000000000000000000000000000000000000000000000000000000018ea": "0x00000000000000000000000000000000000000000000000000000000698aac7b", - "0x0000000000000000000000000000000000000000000000000000000000003942": "0x19612387b1ce2467d84cde77ba46515023c15fe71b8ffd78cd99b54fdd483692", - "0x0000000000000000000000000000000000000000000000000000000000003a72": "0xb46b749124b37c07584c749c746e7dca8d05c9c363c0674428f7670ac5eaa4b2", - "0x0000000000000000000000000000000000000000000000000000000000001a5d": "0x00000000000000000000000000000000000000000000000000000000698aadee", - "0x00000000000000000000000000000000000000000000000000000000000019e8": "0x00000000000000000000000000000000000000000000000000000000698aad79", - "0x00000000000000000000000000000000000000000000000000000000000019da": "0x00000000000000000000000000000000000000000000000000000000698aad6b", - "0x0000000000000000000000000000000000000000000000000000000000001911": "0x00000000000000000000000000000000000000000000000000000000698aaca2", - "0x0000000000000000000000000000000000000000000000000000000000001add": "0x00000000000000000000000000000000000000000000000000000000698aae6e", - "0x0000000000000000000000000000000000000000000000000000000000001a1a": "0x00000000000000000000000000000000000000000000000000000000698aadab", - "0x0000000000000000000000000000000000000000000000000000000000001b44": "0x00000000000000000000000000000000000000000000000000000000698aaed5", - "0x00000000000000000000000000000000000000000000000000000000000039ba": "0xbd60b8aece6686d19be1cbb08cdbe53eb8a836ebb6fdfbf4d7a8267907dec67d", - "0x0000000000000000000000000000000000000000000000000000000000003915": "0x0edb9386239a9e93ab60f7903c86fff88486dee39835e9db92f21737a5564cf7", - "0x0000000000000000000000000000000000000000000000000000000000003a33": "0xd60d6ff35005a1965b840e89c2b52bdec2a614085ccac755a0b2c2796e1e9952", - "0x0000000000000000000000000000000000000000000000000000000000001923": "0x00000000000000000000000000000000000000000000000000000000698aacb4", - "0x00000000000000000000000000000000000000000000000000000000000018e0": "0x00000000000000000000000000000000000000000000000000000000698aac71", - "0x00000000000000000000000000000000000000000000000000000000000018e4": "0x00000000000000000000000000000000000000000000000000000000698aac75", - "0x0000000000000000000000000000000000000000000000000000000000001951": "0x00000000000000000000000000000000000000000000000000000000698aace2", - "0x0000000000000000000000000000000000000000000000000000000000001934": "0x00000000000000000000000000000000000000000000000000000000698aacc5", - "0x00000000000000000000000000000000000000000000000000000000000019fb": "0x00000000000000000000000000000000000000000000000000000000698aad8c", - "0x0000000000000000000000000000000000000000000000000000000000001a0d": "0x00000000000000000000000000000000000000000000000000000000698aad9e", - "0x0000000000000000000000000000000000000000000000000000000000001973": "0x00000000000000000000000000000000000000000000000000000000698aad04", - "0x00000000000000000000000000000000000000000000000000000000000038a4": "0xc454a83d55fbf355edd5928597d6d1908972e1c19d143a3c9edb0e1f200e6b5f", - "0x0000000000000000000000000000000000000000000000000000000000001902": "0x00000000000000000000000000000000000000000000000000000000698aac93", - "0x0000000000000000000000000000000000000000000000000000000000003901": "0xb69854ecaffabdc9eb39f1c1cd4c74b2343bc5f8c2700896afdf88e2d867b317", - "0x0000000000000000000000000000000000000000000000000000000000001910": "0x00000000000000000000000000000000000000000000000000000000698aaca1", - "0x0000000000000000000000000000000000000000000000000000000000001974": "0x00000000000000000000000000000000000000000000000000000000698aad05", - "0x0000000000000000000000000000000000000000000000000000000000001b2b": "0x00000000000000000000000000000000000000000000000000000000698aaebc", - "0x00000000000000000000000000000000000000000000000000000000000038fb": "0x1c7ae63105896fe3a922a5e02de8f355384d2e0f0cf84abda466f6db8dea3df4", - "0x0000000000000000000000000000000000000000000000000000000000001936": "0x00000000000000000000000000000000000000000000000000000000698aacc7", - "0x0000000000000000000000000000000000000000000000000000000000003aea": "0x647b195e8c5a2c768f97205e7db8b7f141ff0c820e42b3b704f53b79d9b8f4e0", - "0x0000000000000000000000000000000000000000000000000000000000003934": "0x8cb8e7dec5198a4445fa686b19e7d0bb0579820f908b24d973674b12eb74023d", - "0x0000000000000000000000000000000000000000000000000000000000003abf": "0x72c6b147cf518f796920f1f0e4a14f533e1a5e29b2be758905b30aec92ffb475", - "0x00000000000000000000000000000000000000000000000000000000000039b3": "0x4ccce8858bd3e8f7958f3fd5de237ca31c6a4474bb7a5a8f5a60a877d047ed98", - "0x0000000000000000000000000000000000000000000000000000000000001a40": "0x00000000000000000000000000000000000000000000000000000000698aadd1", - "0x0000000000000000000000000000000000000000000000000000000000001b31": "0x00000000000000000000000000000000000000000000000000000000698aaec2", - "0x00000000000000000000000000000000000000000000000000000000000018c8": "0x00000000000000000000000000000000000000000000000000000000698aac59", - "0x00000000000000000000000000000000000000000000000000000000000038ba": "0x42957a5ffc700156e1bec074a4c2dcf441e332333f67c7e8d4e1659d5a26fb6e", - "0x00000000000000000000000000000000000000000000000000000000000019dd": "0x00000000000000000000000000000000000000000000000000000000698aad6e", - "0x0000000000000000000000000000000000000000000000000000000000001a66": "0x00000000000000000000000000000000000000000000000000000000698aadf7", - "0x00000000000000000000000000000000000000000000000000000000000019ab": "0x00000000000000000000000000000000000000000000000000000000698aad3c", - "0x00000000000000000000000000000000000000000000000000000000000039a9": "0xe7a3c08931c89ff7c1d4848f9536213c08fca42acf3ec5558ab8151685e18e70", - "0x00000000000000000000000000000000000000000000000000000000000018e1": "0x00000000000000000000000000000000000000000000000000000000698aac72", - "0x00000000000000000000000000000000000000000000000000000000000018f8": "0x00000000000000000000000000000000000000000000000000000000698aac89", - "0x0000000000000000000000000000000000000000000000000000000000001a4b": "0x00000000000000000000000000000000000000000000000000000000698aaddc", - "0x000000000000000000000000000000000000000000000000000000000000199f": "0x00000000000000000000000000000000000000000000000000000000698aad30", - "0x0000000000000000000000000000000000000000000000000000000000003928": "0x50bf4d872436f917c2f9f71dc17aa8383ef76fd5f685d1445e4c9dab5e414535", - "0x00000000000000000000000000000000000000000000000000000000000018ed": "0x00000000000000000000000000000000000000000000000000000000698aac7e", - "0x0000000000000000000000000000000000000000000000000000000000003a42": "0x615a9d1dc574b5d0ceed25f7eac2202a803b0b56b5ed48814940cb3114bf88c1", - "0x00000000000000000000000000000000000000000000000000000000000039d1": "0x0fa46cccdc02b6bdbd6beb5d0c2ee747bed5142d172369afdf814b8667767360", - "0x00000000000000000000000000000000000000000000000000000000000018f6": "0x00000000000000000000000000000000000000000000000000000000698aac87", - "0x000000000000000000000000000000000000000000000000000000000000396a": "0xea5fa450f62bd2607e9e16d2f7500ad64b5665929369202f9bb07ab0c269ab28", - "0x0000000000000000000000000000000000000000000000000000000000003b09": "0xbbead304e1d10e44a76a45adfa9629752e561e579cb304491f729387a45b8643", - "0x0000000000000000000000000000000000000000000000000000000000001a00": "0x00000000000000000000000000000000000000000000000000000000698aad91", - "0x0000000000000000000000000000000000000000000000000000000000001b0d": "0x00000000000000000000000000000000000000000000000000000000698aae9e", - "0x0000000000000000000000000000000000000000000000000000000000003aed": "0xd062c02953ddc9893637e720d8dbed3b5aeb80fb5ac411aeb90cd261e9730823", - "0x0000000000000000000000000000000000000000000000000000000000001996": "0x00000000000000000000000000000000000000000000000000000000698aad27", - "0x0000000000000000000000000000000000000000000000000000000000001a5c": "0x00000000000000000000000000000000000000000000000000000000698aaded", - "0x0000000000000000000000000000000000000000000000000000000000001a06": "0x00000000000000000000000000000000000000000000000000000000698aad97", - "0x0000000000000000000000000000000000000000000000000000000000001960": "0x00000000000000000000000000000000000000000000000000000000698aacf1", - "0x0000000000000000000000000000000000000000000000000000000000003b02": "0x132ca5256567be5f52c074615dfe5c3c680296ee658973049f4002a7dce8be5d", - "0x0000000000000000000000000000000000000000000000000000000000003a9e": "0xe4bf83a437dd10750df23b9487ac931480390659e4db7e96135a5aaf07a84ea3", - "0x0000000000000000000000000000000000000000000000000000000000003953": "0x4c22db8699b681bb256264c87692802201761b5387e500a29237ee57b2b4aa2e", - "0x0000000000000000000000000000000000000000000000000000000000001aa6": "0x00000000000000000000000000000000000000000000000000000000698aae37", - "0x0000000000000000000000000000000000000000000000000000000000001963": "0x00000000000000000000000000000000000000000000000000000000698aacf4", - "0x000000000000000000000000000000000000000000000000000000000000197a": "0x00000000000000000000000000000000000000000000000000000000698aad0b", - "0x0000000000000000000000000000000000000000000000000000000000003a83": "0x760f46203aa0d6f0c78e4d92a0fee1a484329153260ed3502196b5bf7af41c8a", - "0x0000000000000000000000000000000000000000000000000000000000003986": "0x8a14466162658cfe7ac8349f6fe52f0a15219bb6997b549272d014eafdf1ab97", - "0x00000000000000000000000000000000000000000000000000000000000019f5": "0x00000000000000000000000000000000000000000000000000000000698aad86", - "0x0000000000000000000000000000000000000000000000000000000000001a35": "0x00000000000000000000000000000000000000000000000000000000698aadc6", - "0x0000000000000000000000000000000000000000000000000000000000003903": "0x192c202c76c173a1e0a1231dbecb2f88769b2ba769c00c156420a122c09a59d9", - "0x000000000000000000000000000000000000000000000000000000000000398e": "0x85bb42545556b3f12806c56c74923e1b7f8ccd46a0e24cd0cb3031aa08793e76", - "0x0000000000000000000000000000000000000000000000000000000000003a93": "0x489cb8edc4e73962fdad3c9c3c5dc8e6641000993b1ed357ecff773520548137", - "0x0000000000000000000000000000000000000000000000000000000000003acc": "0x39e4183e134e98b892a5131347567ac9aba7e7abfa3a041812c52b9d51c56f34", - "0x000000000000000000000000000000000000000000000000000000000000198a": "0x00000000000000000000000000000000000000000000000000000000698aad1b", - "0x0000000000000000000000000000000000000000000000000000000000001a05": "0x00000000000000000000000000000000000000000000000000000000698aad96", - "0x0000000000000000000000000000000000000000000000000000000000003adf": "0xb1e8977ad362c98ed3414e14c185b5406ff55116529979a3aa2dea3335afb9e0", - "0x0000000000000000000000000000000000000000000000000000000000001b3b": "0x00000000000000000000000000000000000000000000000000000000698aaecc", - "0x0000000000000000000000000000000000000000000000000000000000003950": "0xc909c3259d4947da25fceec45fa2ffb63bfd04ee971a14ccc55fbb02109f46c5", - "0x0000000000000000000000000000000000000000000000000000000000003a14": "0xc46b6309235ccfeef7539fd1e9432883931f0c20fd6874ebf7e7d8e1b3051869", - "0x00000000000000000000000000000000000000000000000000000000000018e5": "0x00000000000000000000000000000000000000000000000000000000698aac76", - "0x0000000000000000000000000000000000000000000000000000000000003987": "0xebe5c22c52a966c2e264a57136e3d020b52d9708b8f4fa6bc7624c12fc4c0c16", - "0x00000000000000000000000000000000000000000000000000000000000019d3": "0x00000000000000000000000000000000000000000000000000000000698aad64", - "0x00000000000000000000000000000000000000000000000000000000000038ff": "0xb7de4de87430738bb9b22bdcf3a3d5a92430cafff8b38e32dee2d147b6fbd092", - "0x0000000000000000000000000000000000000000000000000000000000001af8": "0x00000000000000000000000000000000000000000000000000000000698aae89", - "0x0000000000000000000000000000000000000000000000000000000000003a89": "0xf6d9db82ec8fec67576404c2976a6672654ac0885dcdabe728266c5d0aae5825", - "0x0000000000000000000000000000000000000000000000000000000000003a8a": "0x213172e0023e43b5c4439d15ada1d5dfb641ba78728a0687e4241f1f8f51d7a8", - "0x00000000000000000000000000000000000000000000000000000000000019fa": "0x00000000000000000000000000000000000000000000000000000000698aad8b", - "0x0000000000000000000000000000000000000000000000000000000000001a17": "0x00000000000000000000000000000000000000000000000000000000698aada8", - "0x0000000000000000000000000000000000000000000000000000000000001ab9": "0x00000000000000000000000000000000000000000000000000000000698aae4a", - "0x0000000000000000000000000000000000000000000000000000000000003925": "0x52c5149955ee90928507983e6b1ccf64155815df3c41fc9b7af25a450ba25be9", - "0x0000000000000000000000000000000000000000000000000000000000001a99": "0x00000000000000000000000000000000000000000000000000000000698aae2a", - "0x0000000000000000000000000000000000000000000000000000000000003a07": "0x25038f151290f1dcee2e8044ffc702371f135f705fd0421a60e91db0b4c3e6d7", - "0x0000000000000000000000000000000000000000000000000000000000003a55": "0x7404bd36ab19ff4df1b2035316eadad18fd376550523b562d6477b36ee176255", - "0x0000000000000000000000000000000000000000000000000000000000003b2d": "0x7ffd7a7bc69c44f46e1653d137887fb4be4c7a3f324fbccbb028a35c297978ba", - "0x0000000000000000000000000000000000000000000000000000000000001ada": "0x00000000000000000000000000000000000000000000000000000000698aae6b", - "0x00000000000000000000000000000000000000000000000000000000000019b9": "0x00000000000000000000000000000000000000000000000000000000698aad4a", - "0x00000000000000000000000000000000000000000000000000000000000019ef": "0x00000000000000000000000000000000000000000000000000000000698aad80", - "0x0000000000000000000000000000000000000000000000000000000000001ae1": "0x00000000000000000000000000000000000000000000000000000000698aae72", - "0x00000000000000000000000000000000000000000000000000000000000039fb": "0xd43b04668965e3c577f2d8764ffb0ec4b03ddecec2c0db48d09f105e1b87e768", - "0x00000000000000000000000000000000000000000000000000000000000038ee": "0x42eafbde4f11eb4c9ee98cd33623c7fcaf7dc601a880a8053c9fd1df8cb54496", - "0x0000000000000000000000000000000000000000000000000000000000003970": "0xaab5f8a25cf1f499d2896e84ab1c5d3c4655710f27ea1fa3a7577bcec4842122", - "0x0000000000000000000000000000000000000000000000000000000000001999": "0x00000000000000000000000000000000000000000000000000000000698aad2a", - "0x00000000000000000000000000000000000000000000000000000000000039af": "0x94d2d4838a8f0a05ebe3f7f4d20ed7a277b094a457dba64c8fa024a93b96146b", - "0x00000000000000000000000000000000000000000000000000000000000038e6": "0x9da23236e7958804e028f92280d2e3bdfd8464bf9d177a18ee2cd7852588f8e4", - "0x00000000000000000000000000000000000000000000000000000000000018db": "0x00000000000000000000000000000000000000000000000000000000698aac6c", - "0x0000000000000000000000000000000000000000000000000000000000003a88": "0xa0a5acfbd8c2cc6ac8b41f50e7103891635ce55fef3fec784116e636389fc233", - "0x0000000000000000000000000000000000000000000000000000000000001a93": "0x00000000000000000000000000000000000000000000000000000000698aae24", - "0x0000000000000000000000000000000000000000000000000000000000003a1c": "0x11d075e8b2e2fdcdcde3ccf530b2c32bf2fb3df298d521b1104a6f53e5308db6", - "0x0000000000000000000000000000000000000000000000000000000000001a45": "0x00000000000000000000000000000000000000000000000000000000698aadd6", - "0x0000000000000000000000000000000000000000000000000000000000001982": "0x00000000000000000000000000000000000000000000000000000000698aad13", - "0x000000000000000000000000000000000000000000000000000000000000396d": "0x295d272254da75635ff281fd9a2db9c942048c05b67c0b5577c0387187f57d7d", - "0x000000000000000000000000000000000000000000000000000000000000394e": "0xeec15e0fac8173745b13d8ab75b41df6d439383b62f116926717f7f47ff9d01d", - "0x00000000000000000000000000000000000000000000000000000000000039b9": "0x24662f5f7d87b12145c30388a21e1d67dd8bc5db14e9fa1bca24949a7ac65ac9", - "0x0000000000000000000000000000000000000000000000000000000000003a51": "0x2cd4d8644d2ad041db9098f8e02c2547e71789e5518240bda8a83188b5fbc594", - "0x0000000000000000000000000000000000000000000000000000000000001904": "0x00000000000000000000000000000000000000000000000000000000698aac95", - "0x00000000000000000000000000000000000000000000000000000000000019c8": "0x00000000000000000000000000000000000000000000000000000000698aad59", - "0x00000000000000000000000000000000000000000000000000000000000039f3": "0xa6f53b7b4db2988fb59e5a5dffff791e1277c48d12eddc7cfd725843aff86c2d", - "0x000000000000000000000000000000000000000000000000000000000000396e": "0xdb282474b3595f523e51503c63015400d313f797077ec601c23e8bb8de8f0714", - "0x0000000000000000000000000000000000000000000000000000000000003977": "0x1a26c977756a19df4b6c81f90146a079b8eb3dc5577732beee551f6598f51523", - "0x0000000000000000000000000000000000000000000000000000000000003988": "0x423fe1d28877e8a613af18cb311dc5a0ab68f830b284b4b236589847011d31ca", - "0x00000000000000000000000000000000000000000000000000000000000039c6": "0x4e6d4012c65c315df6992e4c7cce3bd7428a4f705e52b0e5eec521ff1c17ba03", - "0x0000000000000000000000000000000000000000000000000000000000001905": "0x00000000000000000000000000000000000000000000000000000000698aac96", - "0x0000000000000000000000000000000000000000000000000000000000003a91": "0xbed69f8255f388f4dc79fdd46b15c01c973e81f5cd44bbfb0f7280e235af3df4", - "0x00000000000000000000000000000000000000000000000000000000000039d3": "0xb9d92a7239171a7bd8e16e9f9cfbf548fabdb8982de82f7136fbc63b503cb9f0", - "0x0000000000000000000000000000000000000000000000000000000000001a51": "0x00000000000000000000000000000000000000000000000000000000698aade2", - "0x0000000000000000000000000000000000000000000000000000000000001a9f": "0x00000000000000000000000000000000000000000000000000000000698aae30", - "0x0000000000000000000000000000000000000000000000000000000000001ae6": "0x00000000000000000000000000000000000000000000000000000000698aae77", - "0x0000000000000000000000000000000000000000000000000000000000001b3e": "0x00000000000000000000000000000000000000000000000000000000698aaecf", - "0x0000000000000000000000000000000000000000000000000000000000003911": "0x99d83f1a6e1ed6b5f8ba22b6244baaa92d250a99623800d9799e5082a46d6917", - "0x000000000000000000000000000000000000000000000000000000000000397b": "0xf444eb912bda7699ce786b78bf5a864e20688a3839e7ca17403f3fe4552ff657", - "0x000000000000000000000000000000000000000000000000000000000000199b": "0x00000000000000000000000000000000000000000000000000000000698aad2c", - "0x00000000000000000000000000000000000000000000000000000000000039f8": "0x472e172b11e0b38a2ab74e105469a539de6c8991fcf8f0b1a1f128a4808ff55e", - "0x000000000000000000000000000000000000000000000000000000000000190d": "0x00000000000000000000000000000000000000000000000000000000698aac9e", - "0x0000000000000000000000000000000000000000000000000000000000001a5f": "0x00000000000000000000000000000000000000000000000000000000698aadf0", - "0x0000000000000000000000000000000000000000000000000000000000003a58": "0x9caaf230de4abfd9869ea02694b2f50f31736202c0c430ebe78eb5c12d64abed", - "0x0000000000000000000000000000000000000000000000000000000000003a9d": "0x0727a9f20797354a70ac06c230df2707e19a2750c03bdfebbf7eb4cda05bd3d6", - "0x0000000000000000000000000000000000000000000000000000000000003978": "0x073b2aa397c3dae26b219043eca7cada58b124b56928db7c65ac668cf591b51e", - "0x0000000000000000000000000000000000000000000000000000000000003a61": "0x23503ae722697c14ed5b26d35296243d2469fac23843480ca21066aac5fd0a2f", - "0x000000000000000000000000000000000000000000000000000000000000393a": "0x074189f49c429567c69edbaec7b88b3e3010c06a7d84a47a853b7df667759d32" + "0x0000000000000000000000000000000000000000000000000000000000000000": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" } }, + "2": { + "address": "0x00000000219ab540356cBB839Cbe05303d7705Fa", + "code": "0x60806040526004361061003f5760003560e01c806301ffc9a71461004457806322895118146100a4578063621fd130146101ba578063c5f2892f14610244575b600080fd5b34801561005057600080fd5b506100906004803603602081101561006757600080fd5b50357fffffffff000000000000000000000000000000000000000000000000000000001661026b565b604080519115158252519081900360200190f35b6101b8600480360360808110156100ba57600080fd5b8101906020810181356401000000008111156100d557600080fd5b8201836020820111156100e757600080fd5b8035906020019184600183028401116401000000008311171561010957600080fd5b91939092909160208101903564010000000081111561012757600080fd5b82018360208201111561013957600080fd5b8035906020019184600183028401116401000000008311171561015b57600080fd5b91939092909160208101903564010000000081111561017957600080fd5b82018360208201111561018b57600080fd5b803590602001918460018302840111640100000000831117156101ad57600080fd5b919350915035610304565b005b3480156101c657600080fd5b506101cf6110b5565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102095781810151838201526020016101f1565b50505050905090810190601f1680156102365780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561025057600080fd5b506102596110c7565b60408051918252519081900360200190f35b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a70000000000000000000000000000000000000000000000000000000014806102fe57507fffffffff0000000000000000000000000000000000000000000000000000000082167f8564090700000000000000000000000000000000000000000000000000000000145b92915050565b6030861461035d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806118056026913960400191505060405180910390fd5b602084146103b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603681526020018061179c6036913960400191505060405180910390fd5b6060821461040f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806118786029913960400191505060405180910390fd5b670de0b6b3a7640000341015610470576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806118526026913960400191505060405180910390fd5b633b9aca003406156104cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806117d26033913960400191505060405180910390fd5b633b9aca00340467ffffffffffffffff811115610535576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018061182b6027913960400191505060405180910390fd5b6060610540826114ba565b90507f649bbc62d0e31342afea4e5cd82d4049e7e1ee912fc0889aa790803be39038c589898989858a8a6105756020546114ba565b6040805160a0808252810189905290819060208201908201606083016080840160c085018e8e80828437600083820152601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690910187810386528c815260200190508c8c808284376000838201819052601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690920188810386528c5181528c51602091820193918e019250908190849084905b83811015610648578181015183820152602001610630565b50505050905090810190601f1680156106755780820380516001836020036101000a031916815260200191505b5086810383528881526020018989808284376000838201819052601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169092018881038452895181528951602091820193918b019250908190849084905b838110156106ef5781810151838201526020016106d7565b50505050905090810190601f16801561071c5780820380516001836020036101000a031916815260200191505b509d505050505050505050505050505060405180910390a1600060028a8a600060801b604051602001808484808284377fffffffffffffffffffffffffffffffff0000000000000000000000000000000090941691909301908152604080517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0818403018152601090920190819052815191955093508392506020850191508083835b602083106107fc57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016107bf565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610859573d6000803e3d6000fd5b5050506040513d602081101561086e57600080fd5b5051905060006002806108846040848a8c6116fe565b6040516020018083838082843780830192505050925050506040516020818303038152906040526040518082805190602001908083835b602083106108f857805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016108bb565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610955573d6000803e3d6000fd5b5050506040513d602081101561096a57600080fd5b5051600261097b896040818d6116fe565b60405160009060200180848480828437919091019283525050604080518083038152602092830191829052805190945090925082918401908083835b602083106109f457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016109b7565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610a51573d6000803e3d6000fd5b5050506040513d6020811015610a6657600080fd5b5051604080516020818101949094528082019290925280518083038201815260609092019081905281519192909182918401908083835b60208310610ada57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610a9d565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610b37573d6000803e3d6000fd5b5050506040513d6020811015610b4c57600080fd5b50516040805160208101858152929350600092600292839287928f928f92018383808284378083019250505093505050506040516020818303038152906040526040518082805190602001908083835b60208310610bd957805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610b9c565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610c36573d6000803e3d6000fd5b5050506040513d6020811015610c4b57600080fd5b50516040518651600291889160009188916020918201918291908601908083835b60208310610ca957805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610c6c565b6001836020036101000a0380198251168184511680821785525050505050509050018367ffffffffffffffff191667ffffffffffffffff1916815260180182815260200193505050506040516020818303038152906040526040518082805190602001908083835b60208310610d4e57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610d11565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610dab573d6000803e3d6000fd5b5050506040513d6020811015610dc057600080fd5b5051604080516020818101949094528082019290925280518083038201815260609092019081905281519192909182918401908083835b60208310610e3457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610df7565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610e91573d6000803e3d6000fd5b5050506040513d6020811015610ea657600080fd5b50519050858114610f02576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260548152602001806117486054913960600191505060405180910390fd5b60205463ffffffff11610f60576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806117276021913960400191505060405180910390fd5b602080546001019081905560005b60208110156110a9578160011660011415610fa0578260008260208110610f9157fe5b0155506110ac95505050505050565b600260008260208110610faf57fe5b01548460405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831061102557805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610fe8565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015611082573d6000803e3d6000fd5b5050506040513d602081101561109757600080fd5b50519250600282049150600101610f6e565b50fe5b50505050505050565b60606110c26020546114ba565b905090565b6020546000908190815b60208110156112f05781600116600114156111e6576002600082602081106110f557fe5b01548460405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831061116b57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161112e565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa1580156111c8573d6000803e3d6000fd5b5050506040513d60208110156111dd57600080fd5b505192506112e2565b600283602183602081106111f657fe5b015460405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831061126b57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161122e565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa1580156112c8573d6000803e3d6000fd5b5050506040513d60208110156112dd57600080fd5b505192505b6002820491506001016110d1565b506002826112ff6020546114ba565b600060401b6040516020018084815260200183805190602001908083835b6020831061135a57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161131d565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790527fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000095909516920191825250604080518083037ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8018152601890920190819052815191955093508392850191508083835b6020831061143f57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611402565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa15801561149c573d6000803e3d6000fd5b5050506040513d60208110156114b157600080fd5b50519250505090565b60408051600880825281830190925260609160208201818036833701905050905060c082901b8060071a60f81b826000815181106114f457fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060061a60f81b8260018151811061153757fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060051a60f81b8260028151811061157a57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060041a60f81b826003815181106115bd57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060031a60f81b8260048151811061160057fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060021a60f81b8260058151811061164357fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060011a60f81b8260068151811061168657fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060001a60f81b826007815181106116c957fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535050919050565b6000808585111561170d578182fd5b83861115611719578182fd5b505082019391909203915056fe4465706f736974436f6e74726163743a206d65726b6c6520747265652066756c6c4465706f736974436f6e74726163743a207265636f6e7374727563746564204465706f7369744461746120646f6573206e6f74206d6174636820737570706c696564206465706f7369745f646174615f726f6f744465706f736974436f6e74726163743a20696e76616c6964207769746864726177616c5f63726564656e7469616c73206c656e6774684465706f736974436f6e74726163743a206465706f7369742076616c7565206e6f74206d756c7469706c65206f6620677765694465706f736974436f6e74726163743a20696e76616c6964207075626b6579206c656e6774684465706f736974436f6e74726163743a206465706f7369742076616c756520746f6f20686967684465706f736974436f6e74726163743a206465706f7369742076616c756520746f6f206c6f774465706f736974436f6e74726163743a20696e76616c6964207369676e6174757265206c656e677468a2646970667358221220dceca8706b29e917dacf25fceef95acac8d90d765ac926663ce4096195952b6164736f6c634300060b0033000000000000000000", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000023": "0xdb56114e00fdd4c1f85c892bf35ac9a89289aaecb1ebd0a96cde606a748b5d71", + "0x0000000000000000000000000000000000000000000000000000000000000028": "0x87eb0ddba57e35f6d286673802a4af5975e22506c7cf4c64bb6be5ee11527f2c", + "0x0000000000000000000000000000000000000000000000000000000000000038": "0xe71f0aa83cc32edfbefa9f4d3e0174ca85182eec9f3a09f6a6c0df6377a510d7", + "0x000000000000000000000000000000000000000000000000000000000000003b": "0x619e312724bb6d7c3153ed9de791d764a366b389af13c58bf8a8d90481a46765", + "0x0000000000000000000000000000000000000000000000000000000000000031": "0x8fe6b1689256c0d385f42f5bbe2027a22c1996e110ba97c171d3e5948de92beb", + "0x0000000000000000000000000000000000000000000000000000000000000039": "0x31206fa80a50bb6abe29085058f16212212a60eec8f049fecb92d8c8e0a84bc0", + "0x0000000000000000000000000000000000000000000000000000000000000035": "0xcddba7b592e3133393c16194fac7431abf2f5485ed711db282183c819e08ebaa", + "0x000000000000000000000000000000000000000000000000000000000000002d": "0xb7d05f875f140027ef5118a2247bbb84ce8f2f0f1123623085daf7960c329f5f", + "0x0000000000000000000000000000000000000000000000000000000000000033": "0x95eec8b2e541cad4e91de38385f2e046619f54496c2382cb6cacd5b98c26f5a4", + "0x0000000000000000000000000000000000000000000000000000000000000034": "0xf893e908917775b62bff23294dbbe3a1cd8e6cc1c35b4801887b646a6f81f17f", + "0x000000000000000000000000000000000000000000000000000000000000002e": "0xdf6af5f5bbdb6be9ef8aa618e4bf8073960867171e29676f8b284dea6a08a85e", + "0x000000000000000000000000000000000000000000000000000000000000002a": "0x506d86582d252405b840018792cad2bf1259f1ef5aa5f887e13cb2f0094f51e1", + "0x000000000000000000000000000000000000000000000000000000000000003f": "0xb5fe28e79f1b850f8658246ce9b6a1e7b49fc06db7143e8fe0b4f2b0c5523a5c", + "0x000000000000000000000000000000000000000000000000000000000000002c": "0x6cf04127db05441cd833107a52be852868890e4317e6a02ab47683aa75964220", + "0x000000000000000000000000000000000000000000000000000000000000002f": "0xb58d900f5e182e3c50ef74969ea16c7726c549757cc23523c369587da7293784", + "0x0000000000000000000000000000000000000000000000000000000000000029": "0x26846476fd5fc54a5d43385167c95144f2643f533cc85bb9d16b782f8d7db193", + "0x0000000000000000000000000000000000000000000000000000000000000025": "0x536d98837f2dd165a55d5eeae91485954472d56f246df256bf3cae19352a123c", + "0x000000000000000000000000000000000000000000000000000000000000003a": "0x21352bfecbeddde993839f614c3dac0a3ee37543f9b412b16199dc158e23b544", + "0x0000000000000000000000000000000000000000000000000000000000000027": "0xd88ddfeed400a8755596b21942c1497e114c302e6118290f91e6772976041fa1", + "0x0000000000000000000000000000000000000000000000000000000000000024": "0xc78009fdf07fc56a11f122370658a353aaa542ed63e44c4bc15ff4cd105ab33c", + "0x0000000000000000000000000000000000000000000000000000000000000036": "0x8a8d7fe3af8caa085a7639a832001457dfb9128a8061142ad0335629ff23ff9c", + "0x0000000000000000000000000000000000000000000000000000000000000026": "0x9efde052aa15429fae05bad4d0b1d7c64da64d03d7a1854a588c2cb8430c0d30", + "0x000000000000000000000000000000000000000000000000000000000000003d": "0x848930bd7ba8cac54661072113fb278869e07bb8587f91392933374d017bcbe1", + "0x0000000000000000000000000000000000000000000000000000000000000037": "0xfeb3c337d7a51a6fbf00b9e34c52e1c9195c969bd4e7a0bfd51d5c5bed9c1167", + "0x0000000000000000000000000000000000000000000000000000000000000030": "0xd49a7502ffcfb0340b1d7885688500ca308161a7f96b62df9d083b71fcc8f2bb", + "0x000000000000000000000000000000000000000000000000000000000000003e": "0x8869ff2c22b28cc10510d9853292803328be4fb0e80495e8bb8d271f5b889636", + "0x0000000000000000000000000000000000000000000000000000000000000040": "0x985e929f70af28d0bdd1a90a808f977f597c7c778c489e98d3bd8910d31ac0f7", + "0x0000000000000000000000000000000000000000000000000000000000000022": "0xf5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb4b", + "0x000000000000000000000000000000000000000000000000000000000000003c": "0x7cdd2986268250628d0c10e385c58c6191e6fbe05191bcc04f133f2cea72c1c4", + "0x0000000000000000000000000000000000000000000000000000000000000032": "0x8d0d63c39ebade8509e0ae3c9c3876fb5fa112be18f905ecacfecb92057603ab", + "0x000000000000000000000000000000000000000000000000000000000000002b": "0xffff0ad7e659772f9534c195c815efc4014ef1e1daed4404c06385d11192e92b" + } + }, + "3": { + "address": "0x0000F90827F1C53a10cb7A02335B175320002935", + "code": "0x3373fffffffffffffffffffffffffffffffffffffffe14604657602036036042575f35600143038111604257611fff81430311604257611fff9006545f5260205ff35b5f5ffd5b5f35611fff60014303065500", + "storage": {} + }, "1": { "address": "0x1111111111111111111111111111111111111111", "code": "0x608060405234801561000f575f5ffd5b506004361061004a575f3560e01c80632baeceb71461004e5780638381f58a146100585780638da5cb5b14610073578063d826f88f1461009e575b5f5ffd5b6100566100a6565b005b6100605f5481565b6040519081526020015b60405180910390f35b600154610086906001600160a01b031681565b6040516001600160a01b03909116815260200161006a565b61005661010d565b5f5f54116100fb5760405162461bcd60e51b815260206004820152601f60248201527f4e756d6265722073686f756c642062652067726561746572207468616e20300060448201526064015b60405180910390fd5b60015f54610109919061016d565b5f55565b6001546001600160a01b031633146101675760405162461bcd60e51b815260206004820152601760248201527f4f6e6c792063616c6c61626c65206279206f776e65722100000000000000000060448201526064016100f2565b600a5f55565b8181038181111561018c57634e487b7160e01b5f52601160045260245ffd5b9291505056fea2646970667358221220ac5899491afd834afd223fd632497d1c0c7593961eda22f04c58db4b504999cf64736f6c634300081c0033000000", @@ -1320,703 +56,16 @@ "0x0000000000000000000000000000000000000000000000000000000000000001": "0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266" } }, - "3": { - "address": "0x0000F90827F1C53a10cb7A02335B175320002935", - "code": "0x3373fffffffffffffffffffffffffffffffffffffffe14604657602036036042575f35600143038111604257611fff81430311604257611fff9006545f5260205ff35b5f5ffd5b5f35611fff60014303065500", + "4": { + "address": "0x0000BBdDc7CE488642fb579F8B00f3a590007251", + "code": "0x3373fffffffffffffffffffffffffffffffffffffffe1460d35760115f54807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1461019a57600182026001905f5b5f82111560685781019083028483029004916001019190604d565b9093900492505050366060146088573661019a573461019a575f5260205ff35b341061019a57600154600101600155600354806004026004013381556001015f358155600101602035815560010160403590553360601b5f5260605f60143760745fa0600101600355005b6003546002548082038060021160e7575060025b5f5b8181146101295782810160040260040181607402815460601b815260140181600101548152602001816002015481526020019060030154905260010160e9565b910180921461013b5790600255610146565b90505f6002555f6003555b5f54807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff141561017357505f5b6001546001828201116101885750505f61018e565b01600190035b5f555f6001556074025ff35b5f5ffd00", "storage": { - "0x0000000000000000000000000000000000000000000000000000000000000005": "0xb1da8b5448b3050338088d5f2c83d87cd878e77ac18cadbe13742bc15e04a474", - "0x00000000000000000000000000000000000000000000000000000000000001b3": "0xa225dfe92e8f68abc6d41f33c571f6371ff85569b97bde8ac0b26fb32a9f44c6", - "0x00000000000000000000000000000000000000000000000000000000000000cd": "0x938de779bac3c62f5c95075f85f26002b14620c1a05388736d1122c9b753edef", - "0x0000000000000000000000000000000000000000000000000000000000000070": "0x802dfc12b71f4e09d8dfd16e38ad0ae997f9598b41a1f47229866a8eafc55d46", - "0x00000000000000000000000000000000000000000000000000000000000000d4": "0x54820261a0aedbb18d16f650d9a43c45b89d5a3f0521d397b037823d1a88d24b", - "0x00000000000000000000000000000000000000000000000000000000000001d4": "0x7a7bd0b21039c09c01ffc78ba2fedaf1b974e0b153fbe8fe93cee6e64d12dda4", - "0x0000000000000000000000000000000000000000000000000000000000000236": "0x72aa0c1a47f1924b675a7ee1ee8dd6ca94312a58e0de4171e0ac13a6567ecd65", - "0x0000000000000000000000000000000000000000000000000000000000000206": "0xa00a8ce042e70f6edb43fa1293a8d52ec3958964a2e4ca4d7a8b7489333e6f4c", - "0x0000000000000000000000000000000000000000000000000000000000000238": "0xf5cae0f07090e383defa6ecc9a99ecdfb4b7a95aa5f7285c748682d17abdac98", - "0x000000000000000000000000000000000000000000000000000000000000004d": "0x4527d220a4decd2bc851e93e65f2c3b022702f2b9d0dd06778172c93bf8ab627", - "0x0000000000000000000000000000000000000000000000000000000000000253": "0x04a34b31c608605dcdbcc052518f27f922a2b7b7d0ebc199bbf907de8f08d483", - "0x0000000000000000000000000000000000000000000000000000000000000089": "0xe7046ac0e019939b419b45dc1d86f56a1945b966ff98115b713668df615eca5f", - "0x000000000000000000000000000000000000000000000000000000000000017f": "0xe3ba9fc4aebd6704e1f1bea410403b3fdb0abeddcbdcc60431bda5e83a1dd995", - "0x0000000000000000000000000000000000000000000000000000000000000197": "0x61ac0252cbe72e0282b35cb3c860533d5214380cb2a6ecb38ea8ea9b9f964a7b", - "0x00000000000000000000000000000000000000000000000000000000000001ae": "0x4060cb5691c3d327d4b97707dd516342a3b5ce18f6925ac7bfa7d31174d79a65", - "0x0000000000000000000000000000000000000000000000000000000000000210": "0x65e6fa780c359dd9e834ce8615b5fa2a97a74b5f97dcdd48b73d88752b52c5e1", - "0x0000000000000000000000000000000000000000000000000000000000000027": "0x9b389f49b88e942a7da7736f962998fd2b674d09ac9790be2af61e02a885c846", - "0x0000000000000000000000000000000000000000000000000000000000000223": "0x7f8a3140dbf217ed48a33fb540fed2b2a4283e8119d85f2d45251f0d480e1906", - "0x00000000000000000000000000000000000000000000000000000000000001f3": "0xdb9b3de271b40400797c7f0fcb29af072b72d6c7b5b7cd62a0604ed58ab44907", - "0x00000000000000000000000000000000000000000000000000000000000001fd": "0xa3130c09cc98bf1ec2831b95b527052c8f2f826905e324de326793d4b06f6a68", - "0x000000000000000000000000000000000000000000000000000000000000004e": "0x53ca1cc39634e2ed9eb06d09a44b54d7942791984de582626d44cf3d25a411d1", - "0x000000000000000000000000000000000000000000000000000000000000027f": "0xe1249205719134dd6bb76a560d9ed8e486e0d13e925595106fca186c4dcccc5b", - "0x000000000000000000000000000000000000000000000000000000000000006b": "0xdb3fbfc8c1c01a65a1fc3c1cab0c7502ba2a16289f256d22b4f7a284e7ed1266", - "0x000000000000000000000000000000000000000000000000000000000000025c": "0x0ef55e95abf4b62f54f99c7cf2780e7510875a3b41131fe4c25daad9ace116be", - "0x00000000000000000000000000000000000000000000000000000000000000a4": "0xc45fc689f198f6dc7e1f6d728c060c02faff3f6e72f1fcd1cb1c55e9020a6945", - "0x00000000000000000000000000000000000000000000000000000000000000b7": "0x55e0aaf4478ea21ce06c0ab1d174444c666b7c3a3333a1c41d3e4e2179a182aa", - "0x00000000000000000000000000000000000000000000000000000000000000af": "0x1e0d4f2c436fa3a72040dfd1aa9fd7959ee6c648de70ab4381edc003fd8a841c", - "0x0000000000000000000000000000000000000000000000000000000000000198": "0xf313f1a1e5397c516bc2c06de3652197f7877678b12db161fc3ac8803ac72b0d", - "0x00000000000000000000000000000000000000000000000000000000000000b6": "0x355cdb3620c1aef62757e9790c08e6f7c9195ee304fa0d79172e4d33cf6bcf91", - "0x00000000000000000000000000000000000000000000000000000000000001dd": "0xa4ba1506233926afbd3e5e9bd8d866393e4b628dc90d22103257deba5f4af701", - "0x000000000000000000000000000000000000000000000000000000000000023d": "0xcd994b2dc57605e99656fb2425fae73fdafbded7dd8531af241d9663b952788b", - "0x00000000000000000000000000000000000000000000000000000000000000df": "0xe979a07044c69656c42f2758a90487b9ab891a78e016fa40e7469fdbb996b65d", - "0x00000000000000000000000000000000000000000000000000000000000001db": "0x12a674a6a9cce5c6f86224992f4c1674e46bb6690300f64416ffa96d8fd5bd01", - "0x00000000000000000000000000000000000000000000000000000000000000de": "0x56ac1c37288fe63ed11808d3c65ef11a66509d23ecd37d491bcb246893e93b36", - "0x00000000000000000000000000000000000000000000000000000000000000e4": "0x70fc617137f86ba1bda50c3b64155d1325477fb58700b254ccfe83ac0a57911a", - "0x00000000000000000000000000000000000000000000000000000000000001a3": "0xad59405166179987011975c5a2ba54f8ba0251f6110ce15f4a802013bf305aaf", - "0x0000000000000000000000000000000000000000000000000000000000000037": "0x6cd400914e6e5c45dc9b683842718f53110f366cad4ad525c5e189a31066cdfd", - "0x000000000000000000000000000000000000000000000000000000000000006c": "0xaf0ccfa11ab581efa4b1efbf778b799354b7bcf8abac414fab9a9a7bf681dffd", - "0x00000000000000000000000000000000000000000000000000000000000000a7": "0xbac037caa96c6c19b9034a556c83f39cf3ee4f5ed8e8ce981b49616ce888f25d", - "0x0000000000000000000000000000000000000000000000000000000000000128": "0x77b9c00a8054402931b7f42143b1f61c124525e7951e56b3be7cbf5b6d15e2b8", - "0x00000000000000000000000000000000000000000000000000000000000000f6": "0xa9baecc2d82ae162877c1afb8c76d8f867d7099b49763e8c2de5ae242ab1ab2a", - "0x0000000000000000000000000000000000000000000000000000000000000147": "0x03dacc9e620ec1e441be4a9b241d997f8204abee564c37f277070032c4a30b3f", - "0x0000000000000000000000000000000000000000000000000000000000000181": "0x855b406894136743ca4cbf8140904b2c6bf1c6cecc6186acb1da234d205e1507", - "0x000000000000000000000000000000000000000000000000000000000000009c": "0x5ae7873fa8ea0469a6cb73ac79ae6cfd49414b656ec57ff75a0b725be172b4de", - "0x000000000000000000000000000000000000000000000000000000000000024c": "0x192d4e59d500f30b56d210f09913fc3705656c53d5673019257ffc9fdf183b89", - "0x000000000000000000000000000000000000000000000000000000000000011f": "0x430d563924958ca476330c24903012ab2e86ff23e730ebce22c2e2a43cb5422a", - "0x000000000000000000000000000000000000000000000000000000000000017b": "0x2375c8802f80cfd36207b42db87218500dac0efa478095cc42d88dd71709846c", - "0x000000000000000000000000000000000000000000000000000000000000002c": "0xcb8825aabb87f8695262b89c87932494bcd859c6fe488511ec724afa8e4b62db", - "0x0000000000000000000000000000000000000000000000000000000000000156": "0x1a0f6499cd0138707704ae1e20b3f0b698e3a37e91a7d65924a4c1df792075af", - "0x0000000000000000000000000000000000000000000000000000000000000204": "0x4b33dbc154f2116cb2fce2f66dbdf6c082eab4b49780bb3be503ea3cd56430d7", - "0x0000000000000000000000000000000000000000000000000000000000000006": "0x61309cc9eebe83c1873251bb4a9a07c31620598272ed50e0aef061ac2298645c", - "0x00000000000000000000000000000000000000000000000000000000000000ef": "0xcb8d9c203a312f9a77bb13ff263fe5e3232dc41a1a2dce96f0c3f6719c5d29f1", - "0x000000000000000000000000000000000000000000000000000000000000012a": "0x6c37f525ff62ffc2a3749568b7411f6f1654c537ecf37339a905c6505800ba7b", - "0x00000000000000000000000000000000000000000000000000000000000001ba": "0x6e85f8f978e7315d704da2b6c559bf63d0ef205bfbb39e4bc190c3cf0a135c8a", - "0x000000000000000000000000000000000000000000000000000000000000022c": "0xec0b0251b7a12851da9277a63ec2a5dd55c202e16b4342fe194475b0b63d0146", - "0x000000000000000000000000000000000000000000000000000000000000000b": "0x9b54cabdb0bbb852ac9da971fad023bca5268d522ed104c65f7500710d42fc50", - "0x0000000000000000000000000000000000000000000000000000000000000234": "0x0a53ae0c4b80855132113147cc8b072e628534687c27886424f153125923baa2", - "0x000000000000000000000000000000000000000000000000000000000000026c": "0x83ce6e7c67b3ee2f24e01af8c5d135e97ce5e4bac4c89f48fda8dc5615520dd7", - "0x0000000000000000000000000000000000000000000000000000000000000108": "0x2cf69e88033c225567ea8b6505d8f1e056c9ef4eed192365335a58a408798313", - "0x000000000000000000000000000000000000000000000000000000000000003d": "0x39613f8019045af8462bea572eb9ffae39a118398d5737a723513b46093f4082", - "0x000000000000000000000000000000000000000000000000000000000000003a": "0x458a256ad3d571e0404212ffaf36172e0bdb96306dfc7203c432ea456a71b137", - "0x00000000000000000000000000000000000000000000000000000000000001c1": "0x27a6f8bc922eb0df2200d36a938f77cdc8f4729deea433e930b8bab6540276e7", - "0x000000000000000000000000000000000000000000000000000000000000010a": "0x56ee09db90cf74c51b3d753b1a834c5f3fbb52b3fdeddd770be94ddd0bf179e8", - "0x00000000000000000000000000000000000000000000000000000000000000bd": "0x3ffcffba1ad3ccd4b6237fc608a2ceb1f452dbd5706ce0351a73bec328d6bc25", - "0x00000000000000000000000000000000000000000000000000000000000000fe": "0xafdf818a498d1fb8e0c964a2fbbea4a9b5c2ca16a20aa168ddf37080d02cd5ed", - "0x00000000000000000000000000000000000000000000000000000000000001c9": "0x03c9993f8f712dbb77a47e44f6655cd35e287af5455c6e5cab3932b7f19e03ce", - "0x00000000000000000000000000000000000000000000000000000000000001d3": "0xf0757a782ec76decb8805382f701f7f77a03e32315088463a8d6392030590c04", - "0x0000000000000000000000000000000000000000000000000000000000000202": "0xcd66198d0450594091cd57ee761e32db5886bfdb77c0d5ac0c957e28a6bcfd41", - "0x0000000000000000000000000000000000000000000000000000000000000259": "0xadad1c02409b75610005dea9334651489ee69c2e8caeaa78ea3568dccd2b8f08", - "0x0000000000000000000000000000000000000000000000000000000000000010": "0xfcb07c84f0bf1da2837791f43f283d4fb12275bc8ffc3917d743d4893bca382b", - "0x0000000000000000000000000000000000000000000000000000000000000074": "0xca9263fcd80ab271751985bb57a6bf60fcd6797e2d28bf8197e309e46b4e2b8d", - "0x0000000000000000000000000000000000000000000000000000000000000160": "0x932e32dfeb107b5f4aa5a93a4d023809e117abffea79da02d57ac6e0d7ca618a", - "0x00000000000000000000000000000000000000000000000000000000000000b4": "0xcc65659ac93545b04afb90619494cc34bfd3aa293cd10f10021ba5b5e9905264", - "0x000000000000000000000000000000000000000000000000000000000000004a": "0xde62b17898e112282ee82714a84074734dc87b7fa9afa8f209f4c759fda6eb2f", - "0x00000000000000000000000000000000000000000000000000000000000001bf": "0x33553c7041003e99adac1f4e6053e5d57a521a8d5ab2006707ae75d92c5bfe18", - "0x0000000000000000000000000000000000000000000000000000000000000054": "0xb52d35b1204bf9996af4562d0f1b49798a58cf6e5e0add9b84949deea652ac51", - "0x00000000000000000000000000000000000000000000000000000000000001d6": "0x447053d96569f6aeb01271459a2c48c566d7979963822e799c1d310c5f5e4477", - "0x0000000000000000000000000000000000000000000000000000000000000162": "0x0601c6f89612d9fffa753e84e15c7a1d43b0c68da7943a06907bd1b7e7b5b52e", - "0x0000000000000000000000000000000000000000000000000000000000000077": "0x4d01d906af0c13d8f236a2c9a2e78de2b2e4475c70e6160c4c25c2f5420213e2", - "0x000000000000000000000000000000000000000000000000000000000000005b": "0x3bf2a1799c3c29eaea1b69315eaea105b0aeb089141d0ff026754070e096f649", - "0x000000000000000000000000000000000000000000000000000000000000022d": "0xc3e60f46c4ea489ed7375c064e052947dba0a6725a90432864a562abe54ad84c", - "0x00000000000000000000000000000000000000000000000000000000000001fc": "0x8bda953f6682b5c0069fb6ac6cbc504a5df798e40f80d404118997462ebf0699", - "0x0000000000000000000000000000000000000000000000000000000000000214": "0x4f770754062a9c9b0792371f5532a60f228375dab8839f1383bb30a396333273", - "0x00000000000000000000000000000000000000000000000000000000000001f9": "0x7e49b24671216414db1d42b58c50503b1c5b7fecf2d83941e845a214b2b5b2a2", - "0x000000000000000000000000000000000000000000000000000000000000004b": "0x737044e5e982dc268c8cc22ae1683e00a93116d125d76e10a571de054e32465b", - "0x00000000000000000000000000000000000000000000000000000000000000a3": "0xe370d87500a3b59e55693395d8eec9a6b9393770be2b148670626a2e9f9dafd0", - "0x000000000000000000000000000000000000000000000000000000000000003f": "0x99be20f8dd8b8ac3804338fa84aa1663be5f9bb36b76e5d80766621520d252ce", - "0x000000000000000000000000000000000000000000000000000000000000010d": "0x0680f26031b1442663be5284517f45ca97a8c1360ce806739a3c86cf41b1b554", - "0x0000000000000000000000000000000000000000000000000000000000000138": "0x95839c831bbe549f8d5d5c8fa986c4826960abe86bb8c91dc341e1f6bcef948d", - "0x00000000000000000000000000000000000000000000000000000000000000fb": "0x19abab152e8f0a1481b08a49122bbce7e041a7d5c48d4ec8fa6e8ff4d0445dcd", - "0x000000000000000000000000000000000000000000000000000000000000022b": "0x51d0669a6e98e8636b966e1831bd0571117107ab47d4df6bc9f2185577b0ca91", - "0x0000000000000000000000000000000000000000000000000000000000000286": "0x91b6abe6f55b758a2c8241f575d86cb4e4dc928df94dd0e9f785caa177772a6a", - "0x000000000000000000000000000000000000000000000000000000000000005e": "0xe18212efef1569fcbadcf18a9f42a0f0f6c026fcb020ef59192e51f19501dcba", - "0x000000000000000000000000000000000000000000000000000000000000007b": "0xf6fd3cb6e78bc642f4bd23a93954c9a7ff136cb7e8e7072568af5a93a8e5996f", - "0x00000000000000000000000000000000000000000000000000000000000001ca": "0x88f6c19c90be7c631766e061185af608b6a303fd4349ea20bb5164adc700a12d", - "0x00000000000000000000000000000000000000000000000000000000000001ee": "0x3ad96be7fea0b7fd75e0dbbd785c9896f403abe4cb88326d3d17d2a8f14b9866", - "0x000000000000000000000000000000000000000000000000000000000000020c": "0x9693445bf26ac14c25383183c90126ef8b9ea8fc5c068610e39d0436d6bc7113", - "0x0000000000000000000000000000000000000000000000000000000000000060": "0xb2d934c42d65a52bf6c5eef0df68b203dc623d8961bb52f5c7008e3648fc5864", - "0x000000000000000000000000000000000000000000000000000000000000000c": "0xa6dc2008ce216b0426fd4a2ab7cb44a018e1887e3494bd63b1ab7612bd67ed8b", - "0x0000000000000000000000000000000000000000000000000000000000000036": "0xdacab5848f31c60712a14068d0a133f3cfe0ee18590900e88013798f4ed86bd7", - "0x0000000000000000000000000000000000000000000000000000000000000033": "0x883affcfe4cfd9a7a6d4b6e5fdfdf899769e418b172157ba22f87ef5395e918c", - "0x00000000000000000000000000000000000000000000000000000000000001e5": "0x59d03feb433e96d850b5fece5a30b3262f359c3516e9ecc54eef7adbbd700da6", - "0x000000000000000000000000000000000000000000000000000000000000023f": "0xcc4f55fd3739ec8e530832eea6b7ec851952f661071d99619280733dd3605163", - "0x00000000000000000000000000000000000000000000000000000000000000e1": "0x78deb5d00b0c328cac9a1bd4379809e61d1a221e88d4cc2a88f9deca4867cae2", - "0x000000000000000000000000000000000000000000000000000000000000025f": "0xdb8839cffa176f8877a3e0602e9c08460a35fdc06a171c277f9e3af25c896dac", - "0x0000000000000000000000000000000000000000000000000000000000000165": "0xc70503a8e4fb470d74bd263617668bbf36264236b8aaf1bae2aaadf4fcc70fd3", - "0x00000000000000000000000000000000000000000000000000000000000000e3": "0xfdebf0f0cadc64ff0b43143bc66361485c9ff695e77738522d0c5d66d36a7bed", - "0x0000000000000000000000000000000000000000000000000000000000000130": "0xbb29a929769d06f35322f28f06312ef5e872459df578243242bb7bbf465fd2c9", - "0x0000000000000000000000000000000000000000000000000000000000000019": "0xff720d5a99b67242799996096c56c21be80d7bed411861b67a14ad826ee2bd8f", - "0x0000000000000000000000000000000000000000000000000000000000000274": "0xad1c0f9cb31358a27fb31f5c69eb144982bcfccc608556b06a6309a39717ec65", - "0x0000000000000000000000000000000000000000000000000000000000000127": "0x4c1f3aa0e0218c6f587e8a0d35c2a12c65e684f3974af141f386758308455c96", - "0x0000000000000000000000000000000000000000000000000000000000000061": "0xbd452ba91532ff6c8a4c9b93634ce63161858e95d7cc183887fc446371b04e76", - "0x000000000000000000000000000000000000000000000000000000000000019d": "0xde669f180710555928e865c1c1ea64e4dfdc98ef393f3526d2492b8995ceb99c", - "0x0000000000000000000000000000000000000000000000000000000000000171": "0x74bb8410442cbe9db0b3b48f70a74e3f9ceefa880b04c240ad5d48c0acc15966", - "0x0000000000000000000000000000000000000000000000000000000000000159": "0xde258a136d29d2e06390811a7f5b0758484b92dd132dbc10a67721ce40b00403", - "0x0000000000000000000000000000000000000000000000000000000000000208": "0x4a6dce903a8783fda49812d657dac1bd6eea5f3a636f43222ccbc5869926ffba", - "0x0000000000000000000000000000000000000000000000000000000000000277": "0xea7959bc97af0bdddddd3a67b371941d43271135e1cbe7c13e9795b6260cd440", - "0x0000000000000000000000000000000000000000000000000000000000000190": "0x8f877145481769be6d7582ac02075bbfcfe3096d799b2b4a22b948a275aa3e85", - "0x000000000000000000000000000000000000000000000000000000000000005a": "0x564816ae9649ac90156d9ea08da2fbd483d71b9c165b8adb5df3c75a847408b1", - "0x000000000000000000000000000000000000000000000000000000000000021d": "0x0a4c402fa62c9807ef334d26e2291b5144cd2d873d2095b17e810d031c52df5f", - "0x0000000000000000000000000000000000000000000000000000000000000275": "0x0a0f5a1a1cfb349b5d217ab9bbc4e306b7a67c261eeacc930941c1a4f2228c02", - "0x00000000000000000000000000000000000000000000000000000000000001ed": "0x8157d9f11e7dbfa6d800cc7821546b1bbe19d851b7967adbe2542eae031f568e", - "0x0000000000000000000000000000000000000000000000000000000000000008": "0x2214bb88ab467c64596c02d69f5f70698a0e749584c48e734b44e9420a6d7ee0", - "0x00000000000000000000000000000000000000000000000000000000000000d1": "0x1f17389bb8f5cd060a1a62d83c1cf2078f1598c587e5f334e66ed9813f749af3", - "0x0000000000000000000000000000000000000000000000000000000000000189": "0xec144dadbd2fce7f5edfe8ea48e72bbfa83a72241c4c2292dd10481936cd8de0", - "0x000000000000000000000000000000000000000000000000000000000000024e": "0xeb5052585e48892bbac0128ccc0a51b5101946509a7d803862e036b34725f477", - "0x00000000000000000000000000000000000000000000000000000000000001c7": "0xba52f19339cdaaede9963986c1f5da13f128a7fed188e1f92be46d88c791ea0a", - "0x000000000000000000000000000000000000000000000000000000000000027c": "0x6abc239fac77876266fe65e3a173eae7a2f550703a669135ef98af1d936512f0", - "0x0000000000000000000000000000000000000000000000000000000000000145": "0xbdef4050d6e60341cb8d2f7c18d53943c16b76b9526bcb0710a67ae8b098b138", - "0x000000000000000000000000000000000000000000000000000000000000020d": "0x5a278e8ad8b9def4e9b66ae9c6dc39146ab3e88d5da28796b53f9898ff7c9d98", - "0x000000000000000000000000000000000000000000000000000000000000001a": "0x7c5ddb6e35a37477b618fd950becc5a38538c0b24b2935152189ee7b26ed8b0b", - "0x000000000000000000000000000000000000000000000000000000000000002a": "0xf87323abdd9149a260bd1eb496562a1b5b42179685a95dab0ba5b9ee8cd91eb5", - "0x0000000000000000000000000000000000000000000000000000000000000023": "0xb58fcc2eeae3a77f0f411526645033157e47b87cfd7d5dca78a3e99146d04bc4", - "0x000000000000000000000000000000000000000000000000000000000000027b": "0x2f91f2b79aa21ecc059904cd8838187882ab1d87793282dfe135448db0cc299c", - "0x0000000000000000000000000000000000000000000000000000000000000058": "0x46742b61c9f92c01d25716ff6ff06dfb252c7570d61fbe011da4ef4110f71d67", - "0x0000000000000000000000000000000000000000000000000000000000000166": "0x7c3d1f245d7030403b92d84a06bde1f22f5e789c8229cac8bba3d420edfe2c79", - "0x00000000000000000000000000000000000000000000000000000000000000ce": "0x31c07655d7da97667b8bee42e75fd653d24f26abc89ebd5db21ed591536db5c0", - "0x000000000000000000000000000000000000000000000000000000000000015c": "0xaeacc4597a23f1147794fb5b9e25ae7c11016f9362675234235a20469ec62baa", - "0x00000000000000000000000000000000000000000000000000000000000001c2": "0x972ff6c9c022dbe5ab8bc4a4f294b7e515001836610062c172a564bb5467639e", - "0x00000000000000000000000000000000000000000000000000000000000000cf": "0x494f2a39192df2cf8c2e0b710f1bfb4317bbf53e94326c7b05071a3e8cad6b66", - "0x000000000000000000000000000000000000000000000000000000000000015e": "0x319c50192d60a4d87d92da8ada08a6fe381219a408424fae4dae7cdd6f24ce57", - "0x000000000000000000000000000000000000000000000000000000000000004c": "0xbe61d94801e3b44ffccc8613f5ea057961280711d5945572f2635a0b5d81bdaf", - "0x0000000000000000000000000000000000000000000000000000000000000125": "0x9037219dbfaac96297b5a9235fe5e9696ce014aae70ff4864d95ae66ee5968cf", - "0x0000000000000000000000000000000000000000000000000000000000000167": "0x03fb62f86f0c60074c1ccd6497711c5ad8b22b51ea3f65ca50e74f1ac5ff518d", - "0x0000000000000000000000000000000000000000000000000000000000000102": "0x179261c76eca2245b7257d8d343433b11e3a5b81bdb18b82b3e4780821405804", - "0x0000000000000000000000000000000000000000000000000000000000000116": "0x9deaf54657e442ac30f58582a461d2dd992b5bdb16a4e33c00c66f05c8939e52", - "0x0000000000000000000000000000000000000000000000000000000000000049": "0xf2d7d343b386dbbbe72b0b28620230fa87ddc0606540a1cfdca68f737ceec699", - "0x0000000000000000000000000000000000000000000000000000000000000250": "0x900fbc0b901f6dea9eb04e677729d98257dfc550b90f970348f7f7a567b52d9f", - "0x0000000000000000000000000000000000000000000000000000000000000134": "0x49515e3ddc5ed34497e0475c614ff51c7c76335527284ceed38a02f1fe377da8", - "0x0000000000000000000000000000000000000000000000000000000000000017": "0x9d55a241d0ec6208d2287c0090f7cf1bd39de9be472f1d8a023c91dad431964d", - "0x000000000000000000000000000000000000000000000000000000000000023b": "0x822beeeff01564a56deeb7140f4673c19b26d8f572f940d44c275333bed651eb", - "0x0000000000000000000000000000000000000000000000000000000000000169": "0x46907a0a08f9801651720c3bbe49beb5d04566eba77036d20858f6ad12770e0a", - "0x0000000000000000000000000000000000000000000000000000000000000177": "0x020e36a628ddd934fc40f5b8350f6dfb976f6842cdb4d5dba914034ade5741c6", - "0x00000000000000000000000000000000000000000000000000000000000000d2": "0x1c27568606b963dd56cdc1653ebf030c9cc6e892b3eb911c5a72cf7e5bf7f8a0", - "0x0000000000000000000000000000000000000000000000000000000000000095": "0x6d4d18cafffce47228a11a6f76a19abb9cc06a6a4e95afd3f50b6f58f16e81e8", - "0x00000000000000000000000000000000000000000000000000000000000000c8": "0xab437c4673cd18573b315929beae53125bb05f962e7a2b4c4b806e3b1ec0562d", - "0x000000000000000000000000000000000000000000000000000000000000026b": "0x8ee5dcde1df5a26017bc73c8abcb5e32346577a58b488ae5df995a16f1f15b26", - "0x00000000000000000000000000000000000000000000000000000000000001a9": "0x3d09170bd3b749472665a1091cec17b6ab77263397f6f76e9a835a3b387a24dd", - "0x00000000000000000000000000000000000000000000000000000000000001f8": "0x5cab15195bd718ce4be6ba03ec70e55b4ef6d601592f8f78e4f239774993a277", - "0x000000000000000000000000000000000000000000000000000000000000022f": "0xecf40ea2fb96a22df05366f5017910697053a64828fdfce00a3377c174f07250", - "0x0000000000000000000000000000000000000000000000000000000000000040": "0xd442a29bf2dfe929d8f2aab4d3a4949a78d51e2fd8188527be5a763a2e80ba90", - "0x0000000000000000000000000000000000000000000000000000000000000031": "0x80bb977bfc97caffe94351d7eec6a10c06ebd4638060ec17e8feb82f9ff73914", - "0x000000000000000000000000000000000000000000000000000000000000013c": "0x29badfcfc25316f5fd161051b4b061cd8690a84b7ad836c2f35b2be1a4b0ca7c", - "0x0000000000000000000000000000000000000000000000000000000000000237": "0xc8de4e035727d58e3171b0b4e645f8f02f0c96d623d2731ef6cafb031cd93146", - "0x0000000000000000000000000000000000000000000000000000000000000267": "0x92401f549d330a80db704a71541dcbd170ad5fc9082afe005641025307cabb4c", - "0x0000000000000000000000000000000000000000000000000000000000000131": "0x635d30d8fc0bff0759dab542249c6a66eedb21c21460be246b0a7c955cd70b55", - "0x0000000000000000000000000000000000000000000000000000000000000213": "0xae76e6625b8e06b7487aa4353d1011e10b8d8b12616d5af29350bdd2b74e093d", - "0x0000000000000000000000000000000000000000000000000000000000000034": "0xf08c492a631215befa5faed405f17535f8004f0b068f9b90dcfdb49bcc733d53", - "0x0000000000000000000000000000000000000000000000000000000000000199": "0x6047e491d9e5f903f1b77350d5818e9d99639caa5d13986a353de6e68e6d29d4", - "0x00000000000000000000000000000000000000000000000000000000000000c2": "0x3dc2ce37123b0a6e0d9ff3441c1b8cb0fd2aa95a903122325415ef5539e1cde6", - "0x00000000000000000000000000000000000000000000000000000000000001c5": "0x94fee52da31a4bde23619a1e9d83ee1c9508504072cc20412525484ce6aea0cc", - "0x0000000000000000000000000000000000000000000000000000000000000067": "0x2bae9688f0a59016b81e940f4824f067f10b766cd53f314ad6fc54d939994a02", - "0x000000000000000000000000000000000000000000000000000000000000021a": "0x0944c597f0fc86b4b3c4b9ab4f6c8333c7f6cdfdc6d5570fad8a8001e621d27f", - "0x00000000000000000000000000000000000000000000000000000000000001ff": "0xc41a1be7d0312e3baeef20dbac20c398db16b79cb5c1b62d519dd7f56af2d94c", - "0x000000000000000000000000000000000000000000000000000000000000013e": "0x98a97f0cd2ff583513e2962a8b372c3f5e828dbccf71735b38a0482d462cc15e", - "0x0000000000000000000000000000000000000000000000000000000000000168": "0x64d91f24cbceb359a9b63d2aa5b1d75532d320847acc00f7bb8dce2a7c01d402", - "0x0000000000000000000000000000000000000000000000000000000000000239": "0xb8c99e04d316187c0f7423f278013b378814c98f4dee8289bd8dd458623f59b6", - "0x000000000000000000000000000000000000000000000000000000000000012f": "0x2f4f28f39b54a26d2fe0719daf4075243335474312e543b732cb7dbba1f5e5e2", - "0x0000000000000000000000000000000000000000000000000000000000000183": "0x58cb9c7fe88882a9f515f2f5a4fa035c7c231d52c3ce1aba090f4007847fa68f", - "0x0000000000000000000000000000000000000000000000000000000000000154": "0xda8832d2f8364e4e3ea7c9b1e1eb55bb458544ee549ecaab2c494bf3ea676a54", - "0x000000000000000000000000000000000000000000000000000000000000000e": "0x109f3312b799f72ff7a8c4fb1ccf19a80321c012905c41cc443f730cbee1e421", - "0x0000000000000000000000000000000000000000000000000000000000000288": "0xbf4693778dbe09e262b3cb42a6c1e2b0b3bdb7d6cf1f780422efe8bef56881f4", - "0x0000000000000000000000000000000000000000000000000000000000000059": "0x258bd08b8ed8a5f273e282ea044b444a34657a38fbf68e1fc1b22c727bd77b67", - "0x00000000000000000000000000000000000000000000000000000000000000ae": "0x82cb3f0538e013a7b6ba431bd4deb00f1699906d95057f08f053d8c93af01373", - "0x000000000000000000000000000000000000000000000000000000000000024a": "0x2f8914b33350e244f1c335d6830df8fbf56a5d1f11cef464236a0ba52f8273d2", - "0x00000000000000000000000000000000000000000000000000000000000001a2": "0x4baf9e524f5016b78cd46f4de31719f95551a3fe60578e480d54710e3156cd3a", - "0x00000000000000000000000000000000000000000000000000000000000001c0": "0xb3ee2f3c2d13d1d359713d3149e3d4ae2473f4151637e1fa95eb68dd8bc27886", - "0x0000000000000000000000000000000000000000000000000000000000000226": "0x736578ef99f7be9516d23742da1f7b23b77b15c097a6bb49dee05c2eda5bb906", - "0x0000000000000000000000000000000000000000000000000000000000000193": "0x5732ce6d835875e36f8b093e1fc8e2cbe6600247d0182252a8ed1ae5226d68d8", - "0x000000000000000000000000000000000000000000000000000000000000018a": "0xb9d4bbc90e8ec85434528ef6d6a9a643aadbf0c430c41eb1211f51d789931c06", - "0x0000000000000000000000000000000000000000000000000000000000000092": "0x4fd9c3edc45bc30ce2eb32edca302e4a26a91c7576967db3536bf18b4e1ddc27", - "0x0000000000000000000000000000000000000000000000000000000000000024": "0x02a4a99567761c379d7ccde4c05335d7ecbcdc9ab5cd937d77a351ff7ce1536b", - "0x0000000000000000000000000000000000000000000000000000000000000098": "0xed62badce0ed49a80471a8ca7ecd554bbbaf764a6564aef459b7b12771e4541f", - "0x00000000000000000000000000000000000000000000000000000000000000ea": "0x9d80d5b85f057b58cba421485583ab466e64b41a5fe2609a00e858fe652bf6de", - "0x0000000000000000000000000000000000000000000000000000000000000046": "0x00daffd92656e8b15b3fc5a1f3cd6f3d4a685d474ffba0fbbd711713ee6927d6", - "0x0000000000000000000000000000000000000000000000000000000000000148": "0xabe4ccf7457d1e03516e0bad3b40a9a41682561885d2207048ec38c32f235d44", - "0x0000000000000000000000000000000000000000000000000000000000000192": "0xb487a59f2127dc9345503c0c24addea4673e422add9fbd5ad9b6e7f426b0c917", - "0x00000000000000000000000000000000000000000000000000000000000000d6": "0xc6ef5c1f8e3d8685bb9f6334ebeaebeadea582e03ff00f3d1f90da474365ffd9", - "0x0000000000000000000000000000000000000000000000000000000000000132": "0x82e7e78d0f4437c4a1f59e765282d5f4575f5bf5f6e1a58cb1ae7b4d36551ff8", - "0x000000000000000000000000000000000000000000000000000000000000023e": "0xef0130c207968ce3ad962377c39413c823009e0a07e16b675c481e27d51f391e", - "0x0000000000000000000000000000000000000000000000000000000000000133": "0xd21b042458ad0f0182e7a78da96dac7ea48adb874da5d4920ee6ad7935b4434c", - "0x00000000000000000000000000000000000000000000000000000000000001fe": "0x5d54223bfea11032c2a115190eb17b3a70f71e3e285d6f6b5d57b5f261a69fea", - "0x000000000000000000000000000000000000000000000000000000000000018c": "0x2bde8fe0bad5cc1cd0fa2c30d636e46698332117df1d49aa43ef04bc839eeac4", - "0x0000000000000000000000000000000000000000000000000000000000000025": "0xe4da21ad573fdcbb2ff2d159fd0f16924ddfc18b4213bfc049356e8a45b2442a", - "0x0000000000000000000000000000000000000000000000000000000000000071": "0xff4c6cc1f512868ab532eab17eeafe747515b0b9e8a169b2aca5d28a2f34d428", - "0x0000000000000000000000000000000000000000000000000000000000000013": "0x0458c429b2aad4f2248b3617121b103de082a80cf91bb5bf7fe251006f7817a1", - "0x000000000000000000000000000000000000000000000000000000000000013d": "0x86a0b1c21d016994a41d3a1748d0e7295b0acc4f4bcb3dbcd16db0d6ce988cd4", - "0x000000000000000000000000000000000000000000000000000000000000009d": "0x4a4a33d5ae1c3fe6c4938452c6f586ff03d074b415d2d39b7761a5947240fae9", - "0x0000000000000000000000000000000000000000000000000000000000000069": "0x5a6de1c86a36a58627567499c55307e23d4a579ae67bb020bea077b24fe5e28f", - "0x0000000000000000000000000000000000000000000000000000000000000078": "0x848f2516a552b6e639cdb514b2bb508eb67b1c51e74b2a49a31ebbabb7a3901c", - "0x00000000000000000000000000000000000000000000000000000000000001e3": "0x50d006b687fa3bf825a48d954a55a33c5b3bd98c84a6cbcccc221a76ef02a7c4", - "0x00000000000000000000000000000000000000000000000000000000000000ee": "0x156ef733e651bf32493cc1c147bb28b090a72f8997d396b6f3e534c359f80ebc", - "0x0000000000000000000000000000000000000000000000000000000000000099": "0x382c429a2d12bef4873e776d99a54e2a51958e59f390237a0fdc29826c848b81", - "0x0000000000000000000000000000000000000000000000000000000000000000": "0x26df077527b5201b7df0380d9ed57d8e862ea69d01e8fb02b2b6f86bf56ce8c6", - "0x000000000000000000000000000000000000000000000000000000000000017d": "0x7a2cbdffc9ee939c3ff925182006d6e56e6a5da23d4eb12e83954a89ee86136c", - "0x00000000000000000000000000000000000000000000000000000000000000ca": "0x64b751be10693a973691cfeebb64937a3754cfd66b2ed778467a24dcadf9f3f9", - "0x0000000000000000000000000000000000000000000000000000000000000101": "0xf2a77fb03de4afd09eca14a4ee1cbeba85c3348583cce0c9abe37776d66cc50b", - "0x00000000000000000000000000000000000000000000000000000000000000bc": "0xbf18c0f37d8a1be5f719eb150bbd0682a154ccfb81a73be52b42e523d81dfc89", - "0x0000000000000000000000000000000000000000000000000000000000000035": "0xf920bc07fe08af4c9c811c2bb66f546b3c2ec708bae0f255b800ca22e9750eee", - "0x000000000000000000000000000000000000000000000000000000000000027d": "0xa31dd5f48a36adfdcc5c5396c6d5b357598640da5cfadcef0448c9fda0fa6c75", - "0x00000000000000000000000000000000000000000000000000000000000000ad": "0xcf7982bdb5770cfe99070cd50c4f02b804fbea475627579260ce4b7fdc833389", - "0x00000000000000000000000000000000000000000000000000000000000001eb": "0xca6b74bc3b3624e9a696ab5462983d59711b20ec1be5df17a1063a91796fdcaf", - "0x00000000000000000000000000000000000000000000000000000000000000f1": "0x868ba48de0ab2e6811dfc3bd407e4f6dfb86473999176e7ff9078869b80ade1a", - "0x0000000000000000000000000000000000000000000000000000000000000282": "0x374d71b5abcc82929d12e5c125ff37793ea22b48919856e48bad9768ca437d2f", - "0x0000000000000000000000000000000000000000000000000000000000000188": "0x27d8a40eb6711e2e5b0ba3178a8b508c8f44a120a0c7b1878bf45b3533495269", - "0x000000000000000000000000000000000000000000000000000000000000003c": "0x79a4ac4120bbbc6e273bf1d4358c104321bfc9e52e1bff976f2c4c37d95d4b1c", - "0x000000000000000000000000000000000000000000000000000000000000006e": "0x17229f6febb60448311218065e05386ffbe85a1504b2a3136583d73b0d93c29b", - "0x0000000000000000000000000000000000000000000000000000000000000075": "0x94481580c5d13f0d7daa43dda120cda76390289d8ae6d3c9baece1b044045090", - "0x000000000000000000000000000000000000000000000000000000000000020b": "0x8380ebf1d504fe569c0f6b4e2a98448738115d21b860bd5a8122da31c668d028", - "0x0000000000000000000000000000000000000000000000000000000000000014": "0xc81897bc0fc5a9c52239295d56bf8212641e2f2ea2b239864513c3c05c3fe442", - "0x0000000000000000000000000000000000000000000000000000000000000038": "0xa5c2c3face980fcc79f7a39edcf9c0225464e1f718d2f47362077ce838979ea0", - "0x0000000000000000000000000000000000000000000000000000000000000115": "0xd1cc48dbf94ddc4fc9aa61788c1e74c05f4cce2811cfcf71c42256939262e591", - "0x0000000000000000000000000000000000000000000000000000000000000050": "0xf7eb63a79437c01b518901bc56b90920a39d7b0932fa2a01d9644af6fb13c0ae", - "0x0000000000000000000000000000000000000000000000000000000000000063": "0xd0f1d6f5bcdb61ec1cb83ad72f4360932528c61cf5b2b1d5263c1a644858e9e0", - "0x0000000000000000000000000000000000000000000000000000000000000158": "0xa774de7f69de69905174cce41480f95d2ef0cc7cdfadfd87d29b66371d71a6f4", - "0x000000000000000000000000000000000000000000000000000000000000016f": "0xd236edc76bf4df776af66653f6d16c1ccf726024af6d22fda449a880dea77a35", - "0x000000000000000000000000000000000000000000000000000000000000018d": "0x1e02fc6cf2826e48c8d7e0e651324af3b515a1a59fa5a2f907e27aec3d6f42ac", - "0x0000000000000000000000000000000000000000000000000000000000000042": "0x4e5e7cb6389e250b2e3a445f0d19995a7a8fd6f58c46fb1afc7717d24c1e3e65", - "0x000000000000000000000000000000000000000000000000000000000000019f": "0xa3d481773934c078ff15d66f971ae74c3d94f43db62421033d42c0da1869920c", - "0x0000000000000000000000000000000000000000000000000000000000000135": "0xefdc430564ebaa09fbfb77863d9866dd63eb644521d50da2beb3a60526a5b8b3", - "0x000000000000000000000000000000000000000000000000000000000000018f": "0x7a90dfd1e376939a4626fad2326db75de4a72c75f213c051018010d9c03576d5", - "0x00000000000000000000000000000000000000000000000000000000000000b2": "0x52855b41f4295fea7ba3c7577bf92ebe34411269b36f710f878b9581fb632ebb", - "0x0000000000000000000000000000000000000000000000000000000000000107": "0xe548e411dc878554fd7dd0f4ee31d5405ec82fffc02da55ef4e8116781ba62fe", - "0x000000000000000000000000000000000000000000000000000000000000005f": "0x24fa9436f1aba0e7e3ce5443b3708d7165982b22ca4ebe0e40af4c0ca7c6e399", - "0x0000000000000000000000000000000000000000000000000000000000000044": "0x648505c3f794f0c879fc463932f6a3247634c7faab75aaceff06f5da56c34f61", - "0x0000000000000000000000000000000000000000000000000000000000000082": "0x87dcd1e1ceab77a62db560e1c9b1a8379c68f60e078f683e18bbe2ac5c999b7f", - "0x00000000000000000000000000000000000000000000000000000000000001b7": "0xa661711ae2ec309b8a050ed36079952f3adf1c794a0cf8486ffaf67ee3dc87de", - "0x0000000000000000000000000000000000000000000000000000000000000230": "0x8ca4138d4dec8612fc83d1960abf96d367fd48176e6ac605ba889ac22cf42c95", - "0x000000000000000000000000000000000000000000000000000000000000024f": "0xe89e63446ba905df66e4e5c1e2bf1252ada9739fcc4312710880ba620b7d310b", - "0x0000000000000000000000000000000000000000000000000000000000000260": "0x3a4ae9a6503623e03b82dc4a081c1356488d9c8a9fbd82331e34d5685800ed78", - "0x0000000000000000000000000000000000000000000000000000000000000271": "0xe5cb6480b6b9f62b6d64707111dc5cb844c879a53a39ff48ce92408474755d7a", - "0x0000000000000000000000000000000000000000000000000000000000000018": "0x703bddb2b167e8e96f2ef9f3435a02757fbbdf64291e01781a87de6ef610bb53", - "0x000000000000000000000000000000000000000000000000000000000000006a": "0x6f8da28df3009fd9c422c8c893aebe0caa2d9366f6587f0439958e221a3c5be6", - "0x0000000000000000000000000000000000000000000000000000000000000242": "0xdcc6b435aafc2a9d5241b4688b5267d6c39eef05a684c3e79e070c06c2c1a5f4", - "0x000000000000000000000000000000000000000000000000000000000000027a": "0x1111f0f83a2066e5f9301ccfe184b37228a4fa9c124e158509736e973ab53939", - "0x000000000000000000000000000000000000000000000000000000000000007d": "0x3f8aaf2d023806e4cf14d011089c8fce4850998eb1d48175ded0da9e3efc5cc0", - "0x00000000000000000000000000000000000000000000000000000000000001be": "0x86488bc737fbc8e5e348e0e6762c333b3e9c8b21fe3416dd6f8e5eeb22e40067", - "0x00000000000000000000000000000000000000000000000000000000000000ff": "0xd560aadd02ea55ce6af71e6e74c9752b53f3cfbd8a8a6b1f191b495a1ae17872", - "0x00000000000000000000000000000000000000000000000000000000000001e1": "0x0b9614f0f7616e8e681b45bb66f438e51642bf69e157bde0ba42ced4d33e2466", - "0x00000000000000000000000000000000000000000000000000000000000001b8": "0x79f12b6afca7fd4c5bad65d96c5824539323c42a4277f6ba104fd0675ef445c1", - "0x000000000000000000000000000000000000000000000000000000000000009b": "0x6490aba42c1f131231ea1452f1f53b54d232648430454942cf54085b2e4c2a0c", - "0x000000000000000000000000000000000000000000000000000000000000015a": "0x19ffa04818478969cdd6c1c08b79fa8725a8be338870010bdbea4613e0122190", - "0x000000000000000000000000000000000000000000000000000000000000013a": "0x0915a68e3ee81ddcb61f3606b843fc61339f961369857c8d1e9a063e053d3a04", - "0x0000000000000000000000000000000000000000000000000000000000000268": "0x68f73e93f860b615c7d86ba522681aeae9da4753468307c582702a6e77329936", - "0x0000000000000000000000000000000000000000000000000000000000000015": "0xccbe8c41af0cf01e68f11677e1bd0a8606ec23e69d7cdc9336512e08ae0f1d8d", - "0x0000000000000000000000000000000000000000000000000000000000000203": "0x935b37d0f117d9a531f7d69c2be4f3d87ea8224ab0858c0ab1c1710a64076a53", - "0x000000000000000000000000000000000000000000000000000000000000017a": "0xbc6c38663f6d859556b3def544c071996774f7720834ffa79d3791709b62888d", - "0x0000000000000000000000000000000000000000000000000000000000000195": "0x1b37f65e76685508da93b1899d113ea1d4ff262851241defe67fd044fc2183a9", - "0x00000000000000000000000000000000000000000000000000000000000000d3": "0x4045c62a4085f8039416bfed522b5e6d2877fb479fbf515bd008a2756ce91cb6", - "0x00000000000000000000000000000000000000000000000000000000000001de": "0xbcaa6e5b51a06323f3ba5a2e12ed11c5667b66d5bb2075411b1b07f092d98718", - "0x0000000000000000000000000000000000000000000000000000000000000258": "0x07126718ded7406398d58ab2492f4b091e31532ba28eb7e4834a4a16dc66386c", - "0x000000000000000000000000000000000000000000000000000000000000027e": "0x599a9e1b96b880997c1af9337e31d4f3c3cda5f7a0d86356096b74dd580a73f6", - "0x00000000000000000000000000000000000000000000000000000000000000f7": "0xd67a58dfa347505d7db9e850defaa8a30e4ce018a593e9f457bf44fea885cbf6", - "0x000000000000000000000000000000000000000000000000000000000000019c": "0x4c15cae5e248978c52652b5c80b9eea86b8240d4c3450aec4f9e61493c38654a", - "0x0000000000000000000000000000000000000000000000000000000000000200": "0x28a71decb7b97718b47e61b528de764fb0aed52e212056f2e6a5cbbc3eb26eb2", - "0x00000000000000000000000000000000000000000000000000000000000001e0": "0x2e7725c7f8c96b2c54efb9b22cf63c968947d2b1c880f5cccedd670afe70afcc", - "0x00000000000000000000000000000000000000000000000000000000000000fd": "0x2d4cb631631c0be9b9453806decf2d11e901dc476143afe9444423c4e1875bd9", - "0x00000000000000000000000000000000000000000000000000000000000001bd": "0x832cc05c3d156bbdb13d5e68d26432cec5c1144d96a4d0e3985f4fa9a4006919", - "0x00000000000000000000000000000000000000000000000000000000000000fc": "0x77779a207cede47c22f737618fb0ec4ad8a84a09167978a7346d2aa294714af1", - "0x00000000000000000000000000000000000000000000000000000000000001fa": "0x0fc0fd09605a687ea2b84c3576aa2420fc049cbe2a0e34ece3338ba47f2dc954", - "0x000000000000000000000000000000000000000000000000000000000000025e": "0x726254a74ba58cca1d4cee337c5ba07c901c8303f3834b65192832dcf53e8250", - "0x0000000000000000000000000000000000000000000000000000000000000105": "0x9d007d032f78b7bc3f40fdc80d6e6676fa67da00faadcfd9bba0bcf247668e19", - "0x000000000000000000000000000000000000000000000000000000000000013f": "0xd6bf80091fb7cebef61c0a2e7b439b9f26835a5960b0de7e4d19f75c11ea891b", - "0x00000000000000000000000000000000000000000000000000000000000001aa": "0xd83136f2639d79a658d09eef21b04a05e0849a06813cc9435181886c3b6c2fa8", - "0x00000000000000000000000000000000000000000000000000000000000000dd": "0x1239d66ed5a6df83e965af815038301d0a505898bdd5c062afad0d1575fcfe16", - "0x000000000000000000000000000000000000000000000000000000000000023a": "0xd2e5d3c5e5d4c404b2c02ac56bdb99a7c4d6fa5b31fe93e33e9f987e690b4b38", - "0x000000000000000000000000000000000000000000000000000000000000026f": "0xc649926483ba358cf1478f830f6428671d83a6fedc84e0c3ed5a2081b78445ae", - "0x0000000000000000000000000000000000000000000000000000000000000043": "0xaf71e92b6fffffc8644aadf28485809e442048d6a65f6155512bdbff81c62277", - "0x000000000000000000000000000000000000000000000000000000000000010c": "0x858e39b1dda8e5c6259bf6a42ed7f636f0a70b7f135a1d9069ded94835bb5c16", - "0x000000000000000000000000000000000000000000000000000000000000019a": "0xfaa76f520fc07266094175f13c90f291822170dc2e66595d69c988fe0f5c61af", - "0x000000000000000000000000000000000000000000000000000000000000020a": "0xd0c4d9ee3351423ee341d9273b41867b3453ed27c0e57611462ded97ccd9b698", - "0x00000000000000000000000000000000000000000000000000000000000001f5": "0x24caebb5f6cbe2461788cabfab20cdd87f862e45f2c0f4ad9252b287fecd6a74", - "0x0000000000000000000000000000000000000000000000000000000000000244": "0x3f97e584121ddbfcd739be0d5c6d0a19b341a6bd0283707b93a297abea15d269", - "0x000000000000000000000000000000000000000000000000000000000000007f": "0x287e62cb535fdabe79f4d444111362c6b6b6926bb1ade9d5939668ed39c19f75", - "0x00000000000000000000000000000000000000000000000000000000000001d2": "0xd4b269c2c21136026579440d25ff4aa8048701265a24fed47f25ad768c630c9e", - "0x00000000000000000000000000000000000000000000000000000000000000d0": "0xc06d4a19aef730da19557031ce9127491cb9803bdfd61e513623f28e8d9fd448", - "0x0000000000000000000000000000000000000000000000000000000000000278": "0xd4050be4fff83e2ad83f60af8249615be66142ad2aedf7aa135a07cb1ce0549b", - "0x0000000000000000000000000000000000000000000000000000000000000124": "0xd4d627d8634b13e4f94d46fd075f30cc0abfbd81edad2efdb41e278d1ae71ce2", - "0x0000000000000000000000000000000000000000000000000000000000000196": "0x95f9160078c1bd0fba04dc47582fe9d01cfd67c5120678be7451d26ccee4c78d", - "0x000000000000000000000000000000000000000000000000000000000000001d": "0xa7a7ab6784a3aa68ee7ca0c20ff18946b87f9edc7c5f18e3c970e775479d39af", - "0x000000000000000000000000000000000000000000000000000000000000021b": "0x701699f36996b724847fd0613967719e907584959ea2a340b036bb05b95d013a", - "0x0000000000000000000000000000000000000000000000000000000000000076": "0x9f416eff40929170a1dbdcae9c2d87784184b49d522658e94addc1b7ffe187d9", - "0x0000000000000000000000000000000000000000000000000000000000000233": "0x51f65e1ac91831a49dd1486d55a9a1e1233c4e5a4e95c0d90118006b7c85b822", - "0x00000000000000000000000000000000000000000000000000000000000000d8": "0x1d0313d1b4535b771434d0f83382a81f5f6a2bf2ffa7200dc55ecfcfa050d1fc", - "0x000000000000000000000000000000000000000000000000000000000000025d": "0xd26bca1c7f88682133f9ebc2b34e115bceaf3a95dce1789290ac4269a93009fb", - "0x0000000000000000000000000000000000000000000000000000000000000029": "0xdb7e817850b4a07158a04a335a0bba8dffcf601a5635cf0e0301e667a437ff16", - "0x0000000000000000000000000000000000000000000000000000000000000080": "0x07e047a1512711b7cd07053490bcc40fc266a4d3a8da00d42bfb4d2c7db44f31", - "0x0000000000000000000000000000000000000000000000000000000000000068": "0x1a443cecb45032bfc593720c32092ac55b36e6c00c0935503d03667edeb9e48d", - "0x00000000000000000000000000000000000000000000000000000000000001af": "0xd40f920986d2adc72012d485476c20924396c9ff687112f6fa6e4131f38e4bb2", - "0x00000000000000000000000000000000000000000000000000000000000000b8": "0x69631a55ca031f55f10e161b90f51c05f657c6c2d0c5c20d602d40e8e3aecc9f", - "0x000000000000000000000000000000000000000000000000000000000000014a": "0x28ac009f6b3e8d7b6fc63b925004e4f3569fec4b98ad0f20c8bdce49b0f333d7", - "0x000000000000000000000000000000000000000000000000000000000000017c": "0x97599ed2c16f005c728d6985741b0a4ce744208de609c8bc59e1be04bfe6f60d", - "0x00000000000000000000000000000000000000000000000000000000000001cd": "0x588b93107c89fdbe2f0b57021d825561d081accb7226c47f53f75b3aee01b049", - "0x000000000000000000000000000000000000000000000000000000000000028a": "0x2aee83848f9bc683b6d57e0dffd979286c5ab57a90fa39d23470a94cc5c8f461", - "0x000000000000000000000000000000000000000000000000000000000000015f": "0x2d0da23bc8be00e5759ba564711ce49555d4d0a26222fb144f0a9d1df2c8c20d", - "0x0000000000000000000000000000000000000000000000000000000000000055": "0xe4965fc9852aca8d14b3b823281c693c5972b9260118dd6e789cb0852b15eca0", - "0x000000000000000000000000000000000000000000000000000000000000003b": "0xdd90c6203521cabe8ee1f6a57367670bd6c94e0bc23ac0db2074fdc4b652163e", - "0x000000000000000000000000000000000000000000000000000000000000011e": "0xb4f44dcc280acbdc37f8ed1930307736c22040d3f0e896bef313bf914e6bc83e", - "0x00000000000000000000000000000000000000000000000000000000000001cb": "0x648ffbdbca535a873d70ee82ffe1a24398301f294e83135607c5ae65635b9790", - "0x000000000000000000000000000000000000000000000000000000000000016b": "0x6ecca431205af377d38a0f983966c59243cf51703862d6e021773100ed04811b", - "0x0000000000000000000000000000000000000000000000000000000000000212": "0x68a2ddd0abe61a17d62d17a9b89b924ab67028cbfd4bec379a1b994f9d903114", - "0x00000000000000000000000000000000000000000000000000000000000000e9": "0xa8b970d647dd444eab7e46fcf815e346a1b15d11b924385a5cf0b0bbbd032245", - "0x0000000000000000000000000000000000000000000000000000000000000120": "0xb4816e94a4e5a6480043d52140f7978d10b9aa636273779b35293c33d1df3aa4", - "0x00000000000000000000000000000000000000000000000000000000000001ac": "0x1d9aac8f8e86ef4f42568e54bb694981e0c27954f71ea03ff0d3779704c147d3", - "0x0000000000000000000000000000000000000000000000000000000000000062": "0x97483dab787b43cd5dc716ed94a97b84040c4ae345a4a9c0b252cf75dfe51199", - "0x0000000000000000000000000000000000000000000000000000000000000021": "0x7dacef4bc2f75c59ece609521f3a19e3ab763f8d9900a84dfe37b4f95e20f4be", - "0x00000000000000000000000000000000000000000000000000000000000000e8": "0x4e3e6a76f62326b972ac9042d1402ed2d5de19245c861447c23a9e98aacb960e", - "0x00000000000000000000000000000000000000000000000000000000000000e5": "0x6ded38880a475983f18b2141dee9a6f7264d12c65117dc4b721d523a835a6662", - "0x000000000000000000000000000000000000000000000000000000000000017e": "0x6417c21c330c20a769dc06db5d19c1a6ea9a8e7cc9917f1d8b3bcbf4e41dee60", - "0x00000000000000000000000000000000000000000000000000000000000001da": "0x3a798a8e27aaaf88529f1e57219526ff3bd544c09064f738204931ec0e767bb7", - "0x00000000000000000000000000000000000000000000000000000000000001e8": "0x642e5c2475d9444e0215bef786fe7f661060bdb00cb8a349fc8e64c766063e92", - "0x0000000000000000000000000000000000000000000000000000000000000079": "0x248f4186991e5ecbcccb375ad885ebea7ea058c78f82431ec8fd54ee5100d42e", - "0x0000000000000000000000000000000000000000000000000000000000000117": "0x3ef7acc15a39aa5a6c61314d254f39fb42d4745a98a3dc007f8b363beccd21e9", - "0x0000000000000000000000000000000000000000000000000000000000000151": "0xa3bb00371b923cba41d79d80117342dc4c4353a044875c114bccb8180dd30db4", - "0x0000000000000000000000000000000000000000000000000000000000000087": "0xcccaf68b138632654eb3a88a58a82c23496b1b0a8c5b4543c78d6fc15cad5e76", - "0x000000000000000000000000000000000000000000000000000000000000022a": "0xb4edce730f4b15aeca6d8c888bc710c1d1ba9e2a8074de01cfc39a79dc1090cf", - "0x00000000000000000000000000000000000000000000000000000000000000c4": "0x4227546d279f577f67ed5dd4df89ee4daa74d3e594b902f926324e250b3c89d7", - "0x000000000000000000000000000000000000000000000000000000000000024d": "0x1d1a3f28eaf5b4c50f6cc33d5e4eb1ebe3430a608d227d9f31949d1905837dca", - "0x0000000000000000000000000000000000000000000000000000000000000205": "0xca636254f75950d768b122d0d0d584c51155b93a927578f8db31d6a96aa711b7", - "0x0000000000000000000000000000000000000000000000000000000000000039": "0x5cc57c52928f469cb2729fe3a4fbb4873b40223fe1d66b1ca3cdbbac10ae24ac", - "0x000000000000000000000000000000000000000000000000000000000000002f": "0x29ee9072aa3d7a0fc96bbccd4c0ea8a73fa1e7b93cdc17b191e8f530b36844fb", - "0x0000000000000000000000000000000000000000000000000000000000000141": "0x6965f5cddde352c7008c9ffe907bb21613294429083745207a11ba4a8805e617", - "0x0000000000000000000000000000000000000000000000000000000000000084": "0x9d637614e510f7f2d8afb1b95650aca32210b3de9646dafbb656b3532331d5cf", - "0x0000000000000000000000000000000000000000000000000000000000000164": "0x4d7e540afc3d7b7846333a22a5ebebf578249ebe62f07baf05799edc8c7d970b", - "0x00000000000000000000000000000000000000000000000000000000000001e6": "0x6081e404d24e6818007acd13b5b5ba0d377b551bc209a7023b3af461dfeeeaf1", - "0x0000000000000000000000000000000000000000000000000000000000000269": "0x9e24d773edb7d212e0e1eef1ea762a3b827eb0144207d890b483998c03b042b8", - "0x00000000000000000000000000000000000000000000000000000000000000c9": "0xc8deb3c26cce2c0b7c56ae7dc86611b7bd2a0dc26bf91e7e29b8fbb434cfabaa", - "0x00000000000000000000000000000000000000000000000000000000000001ce": "0x8fb9a51c7e0426b22538c452b27a4809b178fe559d8215b2066c74cf1bf7c47f", - "0x0000000000000000000000000000000000000000000000000000000000000255": "0x1b74d9831d02d3020a6650b42fb169e4988b0d5557a89061a43046bf02fe887b", - "0x0000000000000000000000000000000000000000000000000000000000000270": "0x37ca818e199854bffacc64b43610b8d8d02ab3243b954401d7549cb23c31bbdc", - "0x0000000000000000000000000000000000000000000000000000000000000251": "0x7586eb516e43d36eb3f43686a045a42d1053264b0292abb4bcd6d6a83526275a", - "0x0000000000000000000000000000000000000000000000000000000000000285": "0x7da281b71597e77c827f816a66d5c79de75beade0d7f1b95c9b92e0fe641ffa5", - "0x000000000000000000000000000000000000000000000000000000000000018e": "0xd795f8481681a147b569e5e3d7056b02018fa6dcdcb3ef111fe0efa36c691268", - "0x00000000000000000000000000000000000000000000000000000000000000dc": "0xba7902ca62ac3c95e41168d51e6097e929c4af7b722798adb630c2b902d07179", - "0x000000000000000000000000000000000000000000000000000000000000021f": "0x5639221248d1487fb153b28c1fcf2fa386802743d8c0a164b3b325387ab94f08", - "0x0000000000000000000000000000000000000000000000000000000000000142": "0x85848b7c01b895aae90628a4b03b78f83146d75bfcd38ee0eb245dbc3cfbb6ed", - "0x00000000000000000000000000000000000000000000000000000000000000bf": "0xef2101e2f81e664850e572752827d992ab7ba1ebf2aa302b0eea7cbdb606bd4e", - "0x000000000000000000000000000000000000000000000000000000000000012c": "0x2e302ee9613488713e70613a267736c5751606e7b6687e10837b3f44ec15fba7", - "0x000000000000000000000000000000000000000000000000000000000000000d": "0x5a2896fdbca5095b6a86c13614e2758835ba57a12828650d722f6ece3504b0f5", - "0x0000000000000000000000000000000000000000000000000000000000000136": "0x2e9564038c1090c36feba04ac3ea24c9c767cb4b16ed81c0f78d1a998771ba63", - "0x0000000000000000000000000000000000000000000000000000000000000175": "0x1dc33afe526941a4a508cdb3ead5ffc3311d352c6d66220dfb1520419fc81f10", - "0x00000000000000000000000000000000000000000000000000000000000000f3": "0x05ec51e6b94deb41ac94d3b860189361a07087733a14acb496a99b944bf6af89", - "0x000000000000000000000000000000000000000000000000000000000000001b": "0xf3abbcd084f7c6a2f0305a3057dbfe2f8e05c51bd1a53739c6cab25efc5c35b8", - "0x00000000000000000000000000000000000000000000000000000000000000a0": "0xf28495a275678e57fd456e6184438f812259d1f0d737f5792b0e32afe79446d9", - "0x00000000000000000000000000000000000000000000000000000000000000f5": "0xf93bac599a7b235832fce1ed9919b17a487271ab2f92bb5f4f26a50028078253", - "0x000000000000000000000000000000000000000000000000000000000000012d": "0x5a04b6c6777f7aac572fce5c7bb8c6fc54c77dcd4000a78084ee8c3e59aeaa2a", - "0x00000000000000000000000000000000000000000000000000000000000001f6": "0x15e0820d9bbdead16354e2c19a018d5576d664a81d3444f7fe1e5725ad5988dd", - "0x000000000000000000000000000000000000000000000000000000000000012b": "0x54dc1993ade37f678307dd998e0b9ffe0d6e70dbefedd3a4de56e27630a55f3d", - "0x000000000000000000000000000000000000000000000000000000000000007e": "0x27b336a93aa33dcee08eeb6c9b7a7fb20ea1e3c415fcffef5b763788cf849e9e", - "0x0000000000000000000000000000000000000000000000000000000000000106": "0xf56cd391f99ae076c0e142c90da37dad552558129b46b4237ed05cd49f1d0e14", - "0x000000000000000000000000000000000000000000000000000000000000000f": "0xd73c08ddec5ca2bbe9caaaae23ce5e4b086f0eae97c62ecaef29a5dd25984667", - "0x0000000000000000000000000000000000000000000000000000000000000052": "0x3737267f56c840a4a5a2c0a9134cf0e7da1c88338b62d14d2c9f0aeb7d199197", - "0x00000000000000000000000000000000000000000000000000000000000000c3": "0x147cc8b5827470d02bd7dc0cfc6469bb93444f7cf467dd9349eef8e48e59a702", - "0x0000000000000000000000000000000000000000000000000000000000000066": "0x4548f974f088bd34eb3fee9e03ad0af099ba51e8129f1f8c5b114a7b73696372", - "0x00000000000000000000000000000000000000000000000000000000000000be": "0x233bd4cb0d640a12b4c2a433c92b8a1e4a045056ee7cbf5caa7c0c80b7c6c611", - "0x00000000000000000000000000000000000000000000000000000000000001b2": "0xc354cb7eef571413acbaa081292816f2b667a48b7bce2f04888454d93fe90d2f", - "0x0000000000000000000000000000000000000000000000000000000000000201": "0xe0b6df2af36750192cdb4a03d0584c0af3615e7b0c0ca858d46ea124cfceebc9", - "0x000000000000000000000000000000000000000000000000000000000000014b": "0x14a21e55d5df119a4b7ca9b920f18f6f50565449f440da262afc8a0597f037eb", - "0x0000000000000000000000000000000000000000000000000000000000000215": "0xa34eb3fac473e5f658bb0791f7735ef1f1e85886585f47bc52ec3aa4237577d6", - "0x000000000000000000000000000000000000000000000000000000000000026d": "0xc6141e8df4931aee0cc4c9b9d1ffee292b0f9b1f4d0f0314f48ecd67ed8394a1", - "0x0000000000000000000000000000000000000000000000000000000000000152": "0x21995bcbfec464a641e025552e9e6fc571383ecd0bca7b13777a480eb4058a72", - "0x00000000000000000000000000000000000000000000000000000000000001c8": "0x1497e6dfa2ab856fdabdd15868c384187acbe8ddecb6d4c1d1a3720d17dbff9a", - "0x000000000000000000000000000000000000000000000000000000000000008b": "0x891b21b94627c6a07857cb0f05ba3bb79b2931eb0134ab37494814035432fc26", - "0x0000000000000000000000000000000000000000000000000000000000000163": "0x42095cdb70bf50546fa6d86be8a2f7bc889fc335b1667e6c6ee1aefa2461c2b6", - "0x0000000000000000000000000000000000000000000000000000000000000113": "0x59bd1df10008e1656a344b21c0b312975060fd1a9c3413648026b6b90209212b", - "0x0000000000000000000000000000000000000000000000000000000000000053": "0xa670e7b10efca03a54070c7cfcd7661c48b69ec4256d998b9d1686b810fefa17", - "0x00000000000000000000000000000000000000000000000000000000000000a1": "0xc5a9f39161c992bb6916765afdfedfa32040b9fa432189a71e071c6e7a6d64d6", - "0x000000000000000000000000000000000000000000000000000000000000011b": "0xd010d50b0929fa8f10880015095d401165170e8f685c2974aee4de07e8177295", - "0x00000000000000000000000000000000000000000000000000000000000000da": "0xf55fa1b36f8fe4da624301ed3c195a2aa0765344e51addfb25b357d90a3ad921", - "0x00000000000000000000000000000000000000000000000000000000000001ea": "0x9c064f585b287c48b0635559b8e2f276344669d695a0f8cc35ebb9f19496bbbe", - "0x00000000000000000000000000000000000000000000000000000000000000b3": "0x662daeec7e14e8bba55efb3fc0c5c00e0b2807002ec19de6e49180ad16b672b9", - "0x0000000000000000000000000000000000000000000000000000000000000225": "0xef0fd04c30bcc63d9b5a601a08c9b8569644d4d46c28629748348fdb63510453", - "0x0000000000000000000000000000000000000000000000000000000000000231": "0xc4460e3d78ec5cb41cdda06e517e3ba92f0e1449b2c40ffb2b31208817a1187e", - "0x000000000000000000000000000000000000000000000000000000000000026e": "0x33a43ee56148cc8c8a5c8ed3799e4a67ec5835bc976262019b962dc202918e46", - "0x00000000000000000000000000000000000000000000000000000000000001cf": "0x62599afd6b7ee0d423a448f8cc31c847ff46f410448a0233875f24eb8d5024f8", - "0x0000000000000000000000000000000000000000000000000000000000000222": "0x0c6a0e10365294166b79423b18372ca3bbbf14cde8c80ca3f96e35ab3076278a", - "0x000000000000000000000000000000000000000000000000000000000000008e": "0xe56427fdf880275cf14c1219c13b1f376dcef98092fbc9454ec5d24ac824746e", - "0x0000000000000000000000000000000000000000000000000000000000000173": "0xe6f544c34f86bee61de2e621844e1aa094dad142d933968cc2ff07d101f9aeb0", - "0x0000000000000000000000000000000000000000000000000000000000000096": "0xe3a48a81786634ae2719e2f611aaed19f136ba94761b0c30da72ef955ccc0011", - "0x000000000000000000000000000000000000000000000000000000000000015d": "0xf34ccb485b7f4aa6c3d70e1cb82144aa856f306e3dbae64bfab34a2b1f19c650", - "0x00000000000000000000000000000000000000000000000000000000000001cc": "0x3de24e439fc154f715a89579d1efa3bc609fbda4df7ce147bac426ea4d17cc26", - "0x000000000000000000000000000000000000000000000000000000000000004f": "0x0547582120c8e7297db439a9e9f8bd9733fb0f379973c78fc3a4fc048d0e9bc7", - "0x0000000000000000000000000000000000000000000000000000000000000232": "0xef94ad84d2ef0cf0a7ec5dd0d0d22b24f67a552054370eea4a0e11fd399f28ff", - "0x0000000000000000000000000000000000000000000000000000000000000090": "0x3d60f9802482869c8bb1a4aa92cc6a66c103112cf1102951d12b565d4f3154cc", - "0x00000000000000000000000000000000000000000000000000000000000000ab": "0xa3ed2a9f8d6320adc7f1f383254ba63fadbc611bfd527baec49af56c1dd45130", - "0x00000000000000000000000000000000000000000000000000000000000001c3": "0x5ae396b961c0932e51943e8909868c993046c7bbcc431b4f374afc07edefa37d", - "0x0000000000000000000000000000000000000000000000000000000000000003": "0xb35b8efa2859d670f0df8771a683b2649dcb06a1397805ac3cb7d1a0a9b591cb", - "0x0000000000000000000000000000000000000000000000000000000000000129": "0x2bf0102c9c93c2e57224a0c9051c966c7dbeeb84a03e3c33039bcd96fdac026d", - "0x0000000000000000000000000000000000000000000000000000000000000216": "0xebda5180f105bf04d68877806de782dd0f0b8e4cacc1f52e29ddcef05ea2d701", - "0x0000000000000000000000000000000000000000000000000000000000000257": "0x632ef0111f6af761b73b02414e2f59aa72a7b1acbb5a75f3b6cec6fe9ca2a0a0", - "0x00000000000000000000000000000000000000000000000000000000000000ec": "0xf87c777dbc92128146cbf82f22916a99c6fd55c1fc4f6b8878e5c9edad923874", - "0x0000000000000000000000000000000000000000000000000000000000000122": "0x9c53c6310790001949fa25394371538027828505dee786ca86fe176ef0aa7ed3", - "0x0000000000000000000000000000000000000000000000000000000000000026": "0x23c5cefcb55ee59e276c42e5b81d82c89b15c4f7921847b48fccc6f8ec5e0ae6", - "0x000000000000000000000000000000000000000000000000000000000000001e": "0x955c9ffe69b0dd69beca81e783b0273e537c45669a0da003cbb7a487bef1f66a", - "0x00000000000000000000000000000000000000000000000000000000000000c0": "0xc1c70f9239e52d0caa491f94f4c4bb8b2f54ba0da4f13beb31b1fc9e201b3432", - "0x0000000000000000000000000000000000000000000000000000000000000161": "0xc5a89f45c34bcdf89edefa53bffd00587fce7fb1ebae72a83f9d7ac14b7d0876", - "0x0000000000000000000000000000000000000000000000000000000000000009": "0x5b08916336461b04f71499963b9f4456e798702df63046469d7a27576fc54ffa", - "0x0000000000000000000000000000000000000000000000000000000000000218": "0xb2ab639f83fb854bcb4732153fd8b34cb9a99ac61a54429f1498998058bfbee5", - "0x0000000000000000000000000000000000000000000000000000000000000140": "0x70d1df3a21f5e4f769c22f9f61d73577344679e4ee8b8662a30cc37abf25053d", - "0x0000000000000000000000000000000000000000000000000000000000000110": "0x7a2e489653830d4082c7e7073c8cd7997d6826ba2c76b66174da5215b9fc241f", - "0x00000000000000000000000000000000000000000000000000000000000001d5": "0x83024d30e4858bd0e7ae0801ad46e5c5902dd59f903de0c0f45c54a92d9f7b8a", - "0x000000000000000000000000000000000000000000000000000000000000010e": "0x1e59a277b6f234fbb68d794e568c9b4086aeb20b3547fbe8037c57f3a1a97706", - "0x000000000000000000000000000000000000000000000000000000000000005d": "0x17ce8b230a2d6e156e1645c53a59b277ef0351e4b281123fa3178e5d16064add", - "0x000000000000000000000000000000000000000000000000000000000000006d": "0x9e2be4e45cf05840541d3737734e22129171972de073e4ce43da71822f54a36c", - "0x00000000000000000000000000000000000000000000000000000000000001bb": "0xfd4b9623978fb60452d408c8302a0d702c82009328964501268900a9f81d8f4e", - "0x0000000000000000000000000000000000000000000000000000000000000004": "0x17064ae2b53a319296943b87dbd1f622445ecfec1558d89281018afb3a11a388", - "0x00000000000000000000000000000000000000000000000000000000000000cb": "0xc72d8a666d277c90bfae413b1526f838a20038ad30746fdf3e3530654028f512", - "0x0000000000000000000000000000000000000000000000000000000000000091": "0xe514a1dcaecb733c966b35f68107933cad0ac0a8d25b5cff29b84d3f479e3b6f", - "0x000000000000000000000000000000000000000000000000000000000000014f": "0x0b70fc79ed2ac9ff4b3dda504069ff8be8c89f84cbde21dda31cb9102009b65b", - "0x00000000000000000000000000000000000000000000000000000000000001c6": "0x1369eb90bb1bd45054f9447fa908d7dfe3ce86d092146429a85fd3f248c9d8cc", - "0x000000000000000000000000000000000000000000000000000000000000002d": "0x518a10547b7a1c75ab927c2e723e40c33a920367c2c2651ad4297cb9454fb139", - "0x00000000000000000000000000000000000000000000000000000000000001f4": "0x2581a662fed66d86a67cfb030e872bb5463c9397738d9e4060e55efe3c9ce18f", - "0x00000000000000000000000000000000000000000000000000000000000001f7": "0xbc8a2a0d95ad7b9215adbdfe4f585b11e140cf945081e0e452f014012187a00e", - "0x0000000000000000000000000000000000000000000000000000000000000114": "0xbdba7fa567ef5a60c5cbba525924070533733c98bfb24ba772c711eb4856bee4", - "0x0000000000000000000000000000000000000000000000000000000000000088": "0xee550be30668f91de1c6957b5ff0af9ecde5233a341b07e24f8e9da8b232d0c9", - "0x0000000000000000000000000000000000000000000000000000000000000065": "0xba40f54c6c6a6e50fa56aa06d38cd827b9f068492e7d76d0c46f8296d7e6e439", - "0x00000000000000000000000000000000000000000000000000000000000001d1": "0x27cdaac27303a5bfbe588938d50c98d205b6f22b3c334bab306c94825cc30476", - "0x00000000000000000000000000000000000000000000000000000000000001ad": "0x3adb94a570e78266dd2eb2fed957e3e3e1a6eda3462d59c5a5c6a93f232ca0e4", - "0x000000000000000000000000000000000000000000000000000000000000010b": "0xee2c85a92d9182c655895c8731257f67f9329107d74e91cc5f8a372f374af2ca", - "0x00000000000000000000000000000000000000000000000000000000000000e2": "0xd154f9ffb6e82c8ce3d45619be2f6756bd4194720c4788de2d1f4a2ff0c196f7", - "0x0000000000000000000000000000000000000000000000000000000000000139": "0xc39d50ad1481a3d2ea26e52a30694506de7bb0fe20de1e77b44f7b1a91d07a98", - "0x0000000000000000000000000000000000000000000000000000000000000280": "0xe102f871c105ed9c82c60938c4b18da372d58c73e0e9dca5b2590a67cd2c6265", - "0x0000000000000000000000000000000000000000000000000000000000000245": "0xb047bf6b8acaf2750a0d83c53da544807d1e0e3a2f100de7fcd9c0ed4b8b6cea", - "0x00000000000000000000000000000000000000000000000000000000000001c4": "0x02230b5e8f83a6603dc8945fa147d04efda5395e600e6aab590ba99c1bdccf83", - "0x0000000000000000000000000000000000000000000000000000000000000012": "0x21bfe4b1a46fdfd3c0cd18e5528d557feba4bbabb5a9205b4d9f62e6392b3f26", - "0x0000000000000000000000000000000000000000000000000000000000000045": "0xbf8f4a96c65ee53a58f93a9b320e4537d6481253427cc6a65ce92cb8a75f4ada", - "0x000000000000000000000000000000000000000000000000000000000000022e": "0xb85bc15f7585ad0675c89aab649ef52167b37f24c227c5420092e91e81ddae5b", - "0x00000000000000000000000000000000000000000000000000000000000000f9": "0xcd9e5356a1fcaf73a391a37be44dbd0b0565a0b09ddf92980ff5725406edb41d", - "0x0000000000000000000000000000000000000000000000000000000000000172": "0x16146b0d87a25c37e0edb34493b6f4fb98dabfb66014873da97ce03535800949", - "0x00000000000000000000000000000000000000000000000000000000000000aa": "0x81ac5c80b857b69573054d3e2077545ef8c5f7b4156504b39c68517144cb865e", - "0x00000000000000000000000000000000000000000000000000000000000000b9": "0x193bbe90b5f361462599c7bf07f9b5e22aea092653e5c2e251bc565fc223935b", - "0x0000000000000000000000000000000000000000000000000000000000000184": "0x21b649d5bd96fe75c334c0d256ed482245cf6d5319eae1ea1a1c0c6451a5746a", - "0x00000000000000000000000000000000000000000000000000000000000001e9": "0x9a578faa60708917d9e259cfb5d56389c2b16d5f9010bf1c1c0de187b986db38", - "0x0000000000000000000000000000000000000000000000000000000000000143": "0xd8f19c79339f75185b02f3844e9467d8752ecb0661a473d37e87add48e0e7fe8", - "0x0000000000000000000000000000000000000000000000000000000000000235": "0x45ede00980b9c489c214c42ebcc0c4671c663a73c2a794c4980f9336a2f9b535", - "0x000000000000000000000000000000000000000000000000000000000000008a": "0x82eadb666de29dbbde8f3118dc868826fe56129a25f33c054a720addd50375ad", - "0x00000000000000000000000000000000000000000000000000000000000000c5": "0x5a486464cb95ddee0f74cb3fdb26273622d5e34178134bc77ace5fc043eddbea", - "0x00000000000000000000000000000000000000000000000000000000000000e0": "0x69e02138f0e2789e57d1dd755f15e7df9a6b099399401988afa0522d143c857a", - "0x0000000000000000000000000000000000000000000000000000000000000264": "0xa88b6985b8c967384505b5d77f65cbfd65900768a0d4e7aec15a5d8b7c4284a9", - "0x0000000000000000000000000000000000000000000000000000000000000284": "0xe114a0c12aa64a99ff6b9a45d7de0afd3bb0fa03b6876451236b2cabda6ed0e1", - "0x00000000000000000000000000000000000000000000000000000000000001e7": "0xf8d47aa5ca018ace151aec710c68ebd4f340db36edbc5c5544166fb5787b14f0", - "0x000000000000000000000000000000000000000000000000000000000000018b": "0x84e8003347dea917087f9f883513646d65464d96e98c39aab9055a60086ad796", - "0x0000000000000000000000000000000000000000000000000000000000000207": "0x5055644fbae45d71622b2f15872e0a2b0503cd22a1c4336bb14109633c588160", - "0x00000000000000000000000000000000000000000000000000000000000001b5": "0x830d360db5892e19c69fa198bcc3165c7211e061b518aea14aedcb854acc69b0", - "0x00000000000000000000000000000000000000000000000000000000000000f8": "0x798e35a3ea2529759acdcd35ea80b3292671a2dc665f5257b9e0884545acd04c", - "0x0000000000000000000000000000000000000000000000000000000000000020": "0xd14854257e21c3fa2ae12a56e23f56fdc0cac609e9ca24edbc6f5d35829b58a7", - "0x00000000000000000000000000000000000000000000000000000000000000b5": "0x4fecdb960225ff41112aee1c0b1ade9c87cc6354575d72c2cd154f4cce93bab5", - "0x000000000000000000000000000000000000000000000000000000000000020f": "0x3762c1820e2362e90cff73d9f3f8b669627eca3a602da593fd8d793d607aa5f3", - "0x000000000000000000000000000000000000000000000000000000000000021e": "0x876a3644f6a7204e33dada521930fdfe5888bfca3586dcf62ac71192ea77cb3e", - "0x0000000000000000000000000000000000000000000000000000000000000262": "0xae8fd73f1e9c864860edb440e7e8f2ed4b4683c02880ea39b28dda0b4259ac81", - "0x0000000000000000000000000000000000000000000000000000000000000007": "0x1009a94cccf7d402655d949ab7366aef399bf309546e0f45df9cb677d331f1ec", - "0x00000000000000000000000000000000000000000000000000000000000001d8": "0x23455a0d24549f4a58d7e0ee60ceb17f1063cc38eccc0cd50e6db406f9cfd5a1", - "0x0000000000000000000000000000000000000000000000000000000000000272": "0x62bc3e6b6b64b6c7ea880965eede195d8824eea439f2ec890677596b4df74811", - "0x000000000000000000000000000000000000000000000000000000000000011d": "0x30d726a5eec4fd8a8e9c5ce97fbd60ecb414c3af67ba723de878fccf374fd6b8", - "0x0000000000000000000000000000000000000000000000000000000000000155": "0xf0f769533b09c820b2833c3d8a193edfffc72f6defee118d8c53725c5ecb5515", - "0x0000000000000000000000000000000000000000000000000000000000000097": "0xeabb3f341e4bde1c4923cc781b648d5b12d75f2c52aa3893b3efcd5ba9d17311", - "0x000000000000000000000000000000000000000000000000000000000000013b": "0xc155ce63b9be6bf0207432fb9062e1e4b177762febb90bd84cb9706a8f52c229", - "0x000000000000000000000000000000000000000000000000000000000000016a": "0xff160b217057122b44d6704662e0e9726fc486a96d238762b8c281aaf14bbb82", - "0x00000000000000000000000000000000000000000000000000000000000000e6": "0x84052643444b87c4ad1cfe2510d464d8489305676284f51c8ab5f79a5dee0c62", - "0x0000000000000000000000000000000000000000000000000000000000000048": "0x234076307c0c34b353092cee67e201c6afff910fc3fb509defe3f8fecc514dd2", - "0x0000000000000000000000000000000000000000000000000000000000000185": "0x431ab1fc21b1aebb46aec1d5b1dd8ac4add415c6e63abc4e92258b3a158732fd", - "0x0000000000000000000000000000000000000000000000000000000000000137": "0x4b568a742aae7bb292768f54d47a4dd07d2e912aa1297a9a12ff5f50fe9d18e0", - "0x0000000000000000000000000000000000000000000000000000000000000182": "0x693128f06cebf6294ff7cbc317f5c5fafe76eaaeda0ac5e2dc3eec791e2853fe", - "0x00000000000000000000000000000000000000000000000000000000000001df": "0xb190b690693805b10a20df4c06f08c77a1e00f814971624dc88c8cb40ee3b071", - "0x0000000000000000000000000000000000000000000000000000000000000180": "0x8c44e909c96b5862185333df68e93c3e563b5c26e1998e101c942e74631213e6", - "0x0000000000000000000000000000000000000000000000000000000000000221": "0x5d257a091df58e7d6b5e386651d8d27cf76aecd31aa65a5c033412c85776a17d", - "0x000000000000000000000000000000000000000000000000000000000000014e": "0x97fcf4ecb1350ee750932c1913adafbe98610413425fc8eedcbbcb4920bd170f", - "0x00000000000000000000000000000000000000000000000000000000000000cc": "0x8b27547884614c94df38c80d2cf9fd43077c44e99340a9d416f3ff24933cd65f", - "0x00000000000000000000000000000000000000000000000000000000000000b0": "0x7e56a0a9b5074736e7c2ce894152c21b1558344cd329f07e7e44de57115bd331", - "0x000000000000000000000000000000000000000000000000000000000000016e": "0x0cbfa221f2e1aceda9c9beee2f775884634d877bbc4b37d36de2fec1b5352474", - "0x00000000000000000000000000000000000000000000000000000000000000a9": "0x63465621268af450ebe5c737fe44f7d46a0267285473dd49af56cf7a38755f0a", - "0x000000000000000000000000000000000000000000000000000000000000016d": "0xfef6390b80463e594074168a83922db9c051cb32bb9b5eef66d3225e83960368", - "0x00000000000000000000000000000000000000000000000000000000000001ab": "0x954721913f8b6aa752acccef0d7c6b70af214334d8ad6baf2bedfa8c8845610f", - "0x0000000000000000000000000000000000000000000000000000000000000174": "0xc41cd5eea3bec758506b4fc5a7731c281303352f443db2eb62feabb201c4bfcf", - "0x00000000000000000000000000000000000000000000000000000000000001bc": "0xdc074df82991059e790a049c534fda4282ec6e41057dc36d37b193c6fc176141", - "0x000000000000000000000000000000000000000000000000000000000000008f": "0x4bc47b29253a935cca90998fa23f4bf4206c87c69aba0afd8ffcd639e55ae098", - "0x0000000000000000000000000000000000000000000000000000000000000056": "0x6c76da62b84cec98147e2102130dd152a46b2e22b9e9e7476fddb0f2e8aa3fd8", - "0x000000000000000000000000000000000000000000000000000000000000014d": "0x9485e454814566a562ccbdb0439b3e0a9458187b4a9ddd53335672a701f1488b", - "0x0000000000000000000000000000000000000000000000000000000000000229": "0x27f236c464a486a2b053cb4037309c3dead0fd1aeac543556fed3f3960c42362", - "0x0000000000000000000000000000000000000000000000000000000000000104": "0x5923c72f3c254572d93e057628519949e62f7ce0f6d285dfbe087e387f943866", - "0x000000000000000000000000000000000000000000000000000000000000007c": "0x135eec817a6a7ebcde3d2d4efe43f1366078742d85c1ab6dc10ab7e79d152dee", - "0x0000000000000000000000000000000000000000000000000000000000000246": "0xde9de0c2ad248ef9458dd41aca03fc7717fc5ef674f85b990035332f2fbbdae6", - "0x0000000000000000000000000000000000000000000000000000000000000273": "0x05ebba6060ad68f181dc076a619101a974df73dc5d60954afe7e80b2bc937d54", - "0x0000000000000000000000000000000000000000000000000000000000000276": "0x202cd54e41b3f24ed7aebb13bfa01f1b89e4780f07a93e35215c66a1f228ada4", - "0x0000000000000000000000000000000000000000000000000000000000000261": "0xbe199a1c63f1cfb42f949110608adfb26f76211899f62a96d662078cb9c88166", - "0x0000000000000000000000000000000000000000000000000000000000000083": "0xbb8fc0fdbf196c9975beaf724dfa04838b20fd97c1c8d5be05618f6294883a26", - "0x0000000000000000000000000000000000000000000000000000000000000279": "0xa2531771ea9439a11d7f518a370c7aee814d970161b101e2cb22b3e27543599e", - "0x0000000000000000000000000000000000000000000000000000000000000178": "0x878221b8425f3b434430147569ebc30628ae538b73800daebfc57075f3fdbc4c", - "0x000000000000000000000000000000000000000000000000000000000000001c": "0xc839d51f96a684a8f27cbe83439636d21e4a4c5a12740397c5a54ee30429391d", - "0x000000000000000000000000000000000000000000000000000000000000024b": "0xa7dbdef6eea6f9345ac1cf906064c2a5bc5c50be5979788a7eb9e2afccd70d58", - "0x000000000000000000000000000000000000000000000000000000000000016c": "0xbbb1e03d16cb352c90965b5f7db24f52b44f0c12efa581843dbc460b24d06294", - "0x000000000000000000000000000000000000000000000000000000000000015b": "0x220b45546c207010dec7a8e2a2923d76b6ade134689aecc95b2c74a90f530638", - "0x0000000000000000000000000000000000000000000000000000000000000254": "0x33ec3f2fbb56e3088b6bfb2c44db399e403092706a5be014a89447c3558ad86b", - "0x0000000000000000000000000000000000000000000000000000000000000266": "0x9f937d04044c376eacd6b82610611baea6dab3381182d57b3ce0b4c7980540e1", - "0x00000000000000000000000000000000000000000000000000000000000000e7": "0xdb08d1bfdf23ba35135e08820c2a2eb34d62e85a3d4a1bc9bf7f363a9d6676e0", - "0x00000000000000000000000000000000000000000000000000000000000000c1": "0x207a5765a65942c447ab28bdd0ed7b267a3e78f6c246eac7c2fc921d6314fe93", - "0x00000000000000000000000000000000000000000000000000000000000000d9": "0x30250d3046703d384a2d68fb53a6924feed1b1c97c3e541c0d6a79d0991a7177", - "0x0000000000000000000000000000000000000000000000000000000000000002": "0xbf27348a77b2f3ed155d6bf1eff3690fe6f8d3e13e7f7c5fe7baf4fa301385c2", - "0x00000000000000000000000000000000000000000000000000000000000001a0": "0x22be6338f53fd21388e53d790160ed3c8da0025e5acf30b55c4ede908950c02a", - "0x00000000000000000000000000000000000000000000000000000000000000a5": "0x6c49ab9230699a4cf486c5a8ed7f3ddd098d72347ed13f750c3e185ee6dbc632", - "0x00000000000000000000000000000000000000000000000000000000000000fa": "0x77d5f708a3fa287617ce4a7738713084c847bbfdd2a683a7de5d6cf7d65cd2e5", - "0x00000000000000000000000000000000000000000000000000000000000001b1": "0x86a43ea9d722da66f8cc0533137638202d7966b2bcb5860faab43cb42a6f5213", - "0x00000000000000000000000000000000000000000000000000000000000001b4": "0x4ce809869531b4c2b48d86a324b441bba9cc7f2c5e51475189a4ea4f3a39a9d7", - "0x000000000000000000000000000000000000000000000000000000000000009a": "0xa343e85e5b78e4fceb9cb7ca17948b2d73e7992c4b6c9f6cc7b5904cbc06f431", - "0x00000000000000000000000000000000000000000000000000000000000000c6": "0xa134930b4ed905012516c329100137e0b1812e7052467b632a546bd310fcae1c", - "0x00000000000000000000000000000000000000000000000000000000000000f4": "0x1f44e82e8b97aefb354f98db891982b40168576145532c98f24a69938d998e4e", - "0x000000000000000000000000000000000000000000000000000000000000002b": "0x1af2adbc77bb490973121363eed191960b1260ec21d30cedc4edf1867e50d8df", - "0x000000000000000000000000000000000000000000000000000000000000019b": "0x0ac96a2768f82a83a9887e0718744c5cd11eb86f25beef9b93e446b577e8332f", - "0x00000000000000000000000000000000000000000000000000000000000001e4": "0x5a80dabc07af6b5470f779947f61164e8bd6784123a3dd8dafe2b3d4ac8d3d14", - "0x000000000000000000000000000000000000000000000000000000000000025a": "0xb753115acbf0b42dabf11997fab3435ae3fbc2c344311d35a00651836404cccc", - "0x000000000000000000000000000000000000000000000000000000000000012e": "0x838f28f5419a2510ac6adc13b1a4f293217a96c9d467a2ec0ccf877e73aed152", - "0x0000000000000000000000000000000000000000000000000000000000000179": "0xbd6d58275d7976ac805a56769ee02d4828398ec4ac4911f9e782af912fadd522", - "0x000000000000000000000000000000000000000000000000000000000000021c": "0xad16327f76a43900af411b51045b3161977caa0a519ec4bdc93e414d52839540", - "0x000000000000000000000000000000000000000000000000000000000000023c": "0xabe50fcba8e256d39065393ce08fe776d6421c146ca7d96ba5ff6e90f833da46", - "0x0000000000000000000000000000000000000000000000000000000000000263": "0x5b6fcc5834aa239d40080aaaa9062cac4d6ea2ec799c01aa977aab3df18e4fcc", - "0x0000000000000000000000000000000000000000000000000000000000000028": "0x68b1255d17111bb7b3693cb0311cdca3bba7d12d489bd805ba1dec26ac054487", - "0x0000000000000000000000000000000000000000000000000000000000000030": "0xb654e21930bd9a79cb13e47b1710d3e0b945aef6b88fa4eb1bf9afd1d279eaad", - "0x0000000000000000000000000000000000000000000000000000000000000209": "0x5f166882d53bc7d2c41f149f19c60304223033e14614d7b1b41959009791d5b4", - "0x000000000000000000000000000000000000000000000000000000000000026a": "0x14b42299af7453079139c3e6fe8c5fca27bf2556fc78a2a2c25326a1d61ebd8e", - "0x00000000000000000000000000000000000000000000000000000000000000db": "0x2f4c1faf3b29520e30006fdda182636c5e55577195192435761649dde3255738", - "0x0000000000000000000000000000000000000000000000000000000000000243": "0x852f4dfae77e038db0e9bc025638e2c02a5d404e35425e740072204e73a36f17", - "0x00000000000000000000000000000000000000000000000000000000000000d7": "0x5ce3a8f93c2c8c7ae3f827d371ffc23b20b0ccb9db6b2388bb91c59392b70865", - "0x0000000000000000000000000000000000000000000000000000000000000256": "0x89b9e92c45dcbf836c482d4d423dc16d9320c4514c48927b4cf7fbfe0f3f6083", - "0x0000000000000000000000000000000000000000000000000000000000000146": "0xe612d4f53e4a5ef6148be957373a886954caf98d1c0781cc1f82ea3dae723a0b", - "0x00000000000000000000000000000000000000000000000000000000000000d5": "0x6d7b48767bef299187c57a744a5caece33c2839ef18c2c61226413ae28db77f4", - "0x0000000000000000000000000000000000000000000000000000000000000170": "0xf218a5264f911dd629ee9017d59f90fdd17c2b8e152a05ca7e7f2e6ce6dbfbe5", - "0x00000000000000000000000000000000000000000000000000000000000001a1": "0x7be1573e8f88aa2a468e7983da1ac5926dabeb38292b7516615441f4b26d38e3", - "0x00000000000000000000000000000000000000000000000000000000000000f2": "0xcf2218dbce31b688a3c9f848007b1c96a0dc49fe801092615c87509ff75f58be", - "0x0000000000000000000000000000000000000000000000000000000000000157": "0xb6d124b5a6a0f339bf025f12961bfb48f512f516ed22edebec070abe9569ee8a", - "0x00000000000000000000000000000000000000000000000000000000000001b9": "0x0846f46f6a1c6cb080aa0fde858c6893c04a38d8bd56cd009bab9fb403a188bf", - "0x000000000000000000000000000000000000000000000000000000000000007a": "0x0bef5334a1d80154d35356e3c619058ec4a4bcf48606488a0499fc42c735b5f8", - "0x0000000000000000000000000000000000000000000000000000000000000041": "0xf5365bccdef240190828b60ff8c3d9f104aff3bd69ac46fea204b7a9de20a037", - "0x0000000000000000000000000000000000000000000000000000000000000057": "0xf8dbd32053bc083612dc83c0dfe7222ae17380f3b202b675e9f75f205e41958c", - "0x00000000000000000000000000000000000000000000000000000000000001d0": "0x1a65898f2b696f4feaab1a396208b01dd80ed022dd393dac66ba197a733f8f07", - "0x0000000000000000000000000000000000000000000000000000000000000086": "0xaecaf74dd8120fb64b28c73cd379aad0257550b02000a1bd5759f4eeadfc61a1", - "0x00000000000000000000000000000000000000000000000000000000000000f0": "0x776ffb530f996212a584b952dfa188ca5b187e589a217f06726afce02067ea44", - "0x00000000000000000000000000000000000000000000000000000000000001b0": "0x19fd2f4afb323e9c19f4c6d1ab3973193c98e01a2e075f86bc5d9038c1fc6705", - "0x000000000000000000000000000000000000000000000000000000000000009f": "0xbef58722f2ca4bdfc42f70ee862c9a686070a9df2411b7210f80917aca91f367", - "0x0000000000000000000000000000000000000000000000000000000000000281": "0x32c0d6dcc6cd0945d755507ac3297a3c00e182781aaff9b1cb104ab432955563", - "0x0000000000000000000000000000000000000000000000000000000000000241": "0xe3a3ba23ae999cf43d8768e3e28aa88e3b21052ef06bd7c71c9dabc8fad01663", - "0x0000000000000000000000000000000000000000000000000000000000000047": "0xb7afb0baf93ec4d6ad0ef3974958390dd4863ef05800d4c0952b96b0c8071023", - "0x0000000000000000000000000000000000000000000000000000000000000064": "0xaa41b2d8ca6cb0431115e7e439f6562c94f3f00224d10f7edf35404094d7f67d", - "0x00000000000000000000000000000000000000000000000000000000000001d9": "0xd35c3657c1030f03475ba25f1b2fe58af0627a667610547fc9bb114601a0c3f4", - "0x000000000000000000000000000000000000000000000000000000000000001f": "0x1dc3c352d0d5f2ec4c975277c9aa01a794afa8d19c3ee15bd62c08ae776d6ce6", - "0x0000000000000000000000000000000000000000000000000000000000000072": "0x7d3ba6cdff30ccf063b6c735d416b991cede564385b2b914fae4fa5b4c7bfbb6", - "0x0000000000000000000000000000000000000000000000000000000000000240": "0x266f6620e9bc6d54d8a61b32776f2c76881abb0ee96027bd6011b044b02ea7f2", - "0x0000000000000000000000000000000000000000000000000000000000000249": "0xb1d48df5130213309559aa533b7e94e62ae642ecefa28efee2216de0a99d1a1d", - "0x0000000000000000000000000000000000000000000000000000000000000283": "0xf65f29bb31a6144ddf89732f3c1d3c95de8523876058ff9368636a1eaa1a3b34", - "0x00000000000000000000000000000000000000000000000000000000000001e2": "0xe8134851a5a961fbcd7338d6946bead6934007ae007ae6b6eb85b3ce8e685b73", - "0x00000000000000000000000000000000000000000000000000000000000001d7": "0xc5927c71125f0fab233d23889f0200d85ee0b1242d1c6dc4b6c062ab8bc3cff3", - "0x0000000000000000000000000000000000000000000000000000000000000126": "0xa1bfeeccef67f173be73bb14fbd44ae3b17f651159868cb3f40d8e168cd54643", - "0x0000000000000000000000000000000000000000000000000000000000000112": "0xf04e8ec0e93f6edef04df44986d14fd64836e9eb5152ac9ce4874d2b4bf392bd", - "0x0000000000000000000000000000000000000000000000000000000000000121": "0x5315e8d8d4b946c23b1fb66c0092a326590edd426b6954a4e55fad9572b0b774", - "0x0000000000000000000000000000000000000000000000000000000000000186": "0xbe23c627000879aece26cb617bf0597de9d1d0f40744bc3e0084766cb9ee70fb", - "0x00000000000000000000000000000000000000000000000000000000000000bb": "0xb9b4ada494825887c234658c3d3234ed6aa3bc9fe2b8bc93a22e04b2f3f28537", - "0x0000000000000000000000000000000000000000000000000000000000000149": "0xdae39999c4d529faebf5ff90760dc801624e1edbd36832d44245e3f9ccba38d2", - "0x0000000000000000000000000000000000000000000000000000000000000111": "0x8a01a5e2008f675f920564472a99e0bb543fed1389d6c94627c2f62d050872f3", - "0x00000000000000000000000000000000000000000000000000000000000001a7": "0x7f772e25d0a073340e59242e88e879dcc16b832d11c131ef172baee51e792ed9", - "0x000000000000000000000000000000000000000000000000000000000000011c": "0xa6f9c6f1f73ca211e8eb0e7231532ea06180460b95b0dda0d4ff89e0f4e7fd96", - "0x00000000000000000000000000000000000000000000000000000000000000a2": "0x9921b5863ed3280af053379cdf6688a563054126b90e78e203bd589f14a76aba", - "0x000000000000000000000000000000000000000000000000000000000000011a": "0xe28802004c5bc25101080ed27cb50ff2d359cde6abeb87614c0e22d64c0fe0b5", - "0x0000000000000000000000000000000000000000000000000000000000000176": "0xfac61c63b7a661db43bae364704fd0dc72af5731cbdca8927c0310e257ec4f31", - "0x00000000000000000000000000000000000000000000000000000000000000ed": "0x027b0ac357ad16400d280875cf42643e2527021657df4b6decbcc51e8324db92", - "0x0000000000000000000000000000000000000000000000000000000000000265": "0xdf0390f1357d31bed5120f052e57f2913e5d76cf87151f51e4f195af9606b230", - "0x0000000000000000000000000000000000000000000000000000000000000085": "0xce877e24c81b0862799d796886bb121336a3cce6c36e570c5a7b79e6b3ce799e", - "0x0000000000000000000000000000000000000000000000000000000000000289": "0x3b9b89d9d3c7d03f516e3e4e3d4d669b2cdbf5f3da083e6aa76c0d4fe2f242a6", - "0x0000000000000000000000000000000000000000000000000000000000000219": "0x9507de6385b4bbd4655ab4c72571dd9b29371ca41b71e43b73d40e0257aa00ae", - "0x000000000000000000000000000000000000000000000000000000000000003e": "0x79aa97a9ca5b62ed4f0daff758b4f0efb35c606972fdaa3750a86c29f2706ada", - "0x00000000000000000000000000000000000000000000000000000000000000c7": "0xcac7aae8d047556bb556a8b042720210cfe38963d4fc7dcaf6af7d460c176adc", - "0x000000000000000000000000000000000000000000000000000000000000010f": "0xec91d0aebf60694da82cfd4ae80877576c0d5c97950d1ac890729e35dea07982", - "0x0000000000000000000000000000000000000000000000000000000000000153": "0xa266c963292cdb6b315e8ffddb6b7dbcb6fe0857e7025435da80f5a3d4da02c7", - "0x0000000000000000000000000000000000000000000000000000000000000081": "0x02eacd73829e06ed571c20e4d0841f30ddf2f4411c6684ebdac265b286c76249", - "0x0000000000000000000000000000000000000000000000000000000000000094": "0x3328be3776d1d7bc0c8c5ae84afb34654f5be6433cf2e99535ca589fdd86b7e0", - "0x00000000000000000000000000000000000000000000000000000000000000ba": "0xc8c22a42bdc429030b7e3a3568d7cab2c167a40a0a03e062d2f8c6a444d1140b", - "0x000000000000000000000000000000000000000000000000000000000000019e": "0x331506742ddee947d03873bf951f57fa3f338d3ad918cf88404a3f573ad2a5cc", - "0x0000000000000000000000000000000000000000000000000000000000000211": "0x204d206b6676066ff2e63ecf9af73080544ba72f303ed1926fa41e5c00e62409", - "0x00000000000000000000000000000000000000000000000000000000000001b6": "0x53faeb3aa9040c9405ef54294f0d5e859ca17b84198755a3e8066527bc600ebd", - "0x00000000000000000000000000000000000000000000000000000000000001a4": "0x2b44885969fe88b7a7769b50e8eaa8f50a4530881c9ec90de57d91d01c47b2a1", - "0x00000000000000000000000000000000000000000000000000000000000000ac": "0xb72fe08ab91679e7656a1eacac0d58ebfe2435f77b5f73581853671b7def6be2", - "0x0000000000000000000000000000000000000000000000000000000000000103": "0x32217d792fb51bf5f21464ce4088424eed46aa85ebfd850f4b50df09c8ddef6d", - "0x00000000000000000000000000000000000000000000000000000000000000a8": "0xe4bd8ed9e3bc1cc8f8c2f0d3fd27be9335fae1ce3588d7b95cf448d5e6faf4a7", - "0x000000000000000000000000000000000000000000000000000000000000008c": "0x815221a27c240b604e4e54b888513a92be360d204e96cfe50cc635d200ef0177", - "0x00000000000000000000000000000000000000000000000000000000000001dc": "0x0874f7c6404ceae5cf1eed3e35db68b87de291fa919f74ddbb746f3a42de96b9", - "0x0000000000000000000000000000000000000000000000000000000000000011": "0x10d46f4ace55326889757b13ea077867180ca8db24acd4b1138259ded485e378", - "0x0000000000000000000000000000000000000000000000000000000000000187": "0x6bd5c97cd87bdeae493b60d72fc1ecdef12ab908edf06f0d69e986ed20d9ee0c", - "0x000000000000000000000000000000000000000000000000000000000000020e": "0xc8595c7a7aa375d3854915f73fd48d988384c6903bed2fa68527b750ca8a702e", - "0x0000000000000000000000000000000000000000000000000000000000000144": "0x892ffac7060a90b50e65c676c305fc8ac1e938006c585cd5ce0644b46a3cc3f0", - "0x000000000000000000000000000000000000000000000000000000000000025b": "0xe53729b46072a5535d976b11e402d363c4886dbc0f742091923655446e2e501b", - "0x0000000000000000000000000000000000000000000000000000000000000022": "0x861ea12d4849aef21658ca73cc4fc3f4698c70d82413aa83585b42728557c60b", - "0x00000000000000000000000000000000000000000000000000000000000001fb": "0x8459304715fb2e0b63905782aaf39965c88a4a6376c5e6a93fc513eacae07af2", - "0x000000000000000000000000000000000000000000000000000000000000000a": "0x939cd304900fd0b6b4c808980a2176a4f16ce65cf885765506366c311b3a16b9", - "0x0000000000000000000000000000000000000000000000000000000000000016": "0xddda8ed16d0867684aaff80546b438f0da5d37cbc7fa1a1ea863d2a57bc12429", - "0x000000000000000000000000000000000000000000000000000000000000006f": "0x2553d790b7435b689fe1e55a86dc6aef3c12c97e9d554f375e32b7a5eb8ea1a4", - "0x0000000000000000000000000000000000000000000000000000000000000100": "0xe76f22e912014b1f6e327fc9908e3244039651ee009563f4fe7ccc12fd8e4eb8", - "0x0000000000000000000000000000000000000000000000000000000000000109": "0xb9061e44396368f09fb2a80202dcde9f2d48659c5110c847e8d1d21d151196e7", - "0x0000000000000000000000000000000000000000000000000000000000000228": "0xe0cd1ef21fda79bcfefeca142b8f30699382934cfd6f785f3253a0f4c66516ab", - "0x00000000000000000000000000000000000000000000000000000000000001f1": "0x45f6e5be0fd7b38a852d268c2eb3c5d6551bcc6c35dd09639fec1a60270baea6", - "0x00000000000000000000000000000000000000000000000000000000000000eb": "0xf8961be5fabd4ce36f4296fc19009d3dcada8347cb020a64ead39afdb1deab66", - "0x0000000000000000000000000000000000000000000000000000000000000220": "0x3552fe3b47de103377cc4ead334bcda6ff461b55d41315d95544c6c07aa69e3c", - "0x000000000000000000000000000000000000000000000000000000000000009e": "0x0d4da3ea09acbb958352de26fce6f5dd536c7a4055795df4d8376314bf218de2", - "0x000000000000000000000000000000000000000000000000000000000000005c": "0xef988b1adaab4e92fcf1228948d90ff79b0bbfc7960bf1ed0076f54546cebd63", - "0x0000000000000000000000000000000000000000000000000000000000000123": "0xad705c1ff3d066a5ce3db74ee6bf880e232c0261ebb5ba64bb04aec827af7808", - "0x00000000000000000000000000000000000000000000000000000000000001ec": "0x2a166d699d14dbdf4d9afad88a6a72e57ea904a6fcc5142aa705a2363343d0b7", - "0x0000000000000000000000000000000000000000000000000000000000000224": "0x64327bc76d0c979ba8cbdc1f62e1892b9fc23a4e0087ea5c500dbef49fe9eb6e", - "0x0000000000000000000000000000000000000000000000000000000000000093": "0xe58ca36a667caa88fcfb92c2dfa7317df1e786819374b8b27fe22ff92048607f", - "0x00000000000000000000000000000000000000000000000000000000000001ef": "0x7505ff439555a797b6694cb9ecf742f7de2bf689e7703741173bd94a93241597", - "0x0000000000000000000000000000000000000000000000000000000000000191": "0x171c6e9ac738ed0f0471d42a60a855b019adc637c478c600b0fb826b2e9402ad", - "0x000000000000000000000000000000000000000000000000000000000000008d": "0x735a85f8386de8d1e637491251a3b4479bf93b8ce946aab834bbd5f5b9f69e0c", - "0x00000000000000000000000000000000000000000000000000000000000001f2": "0x3a6992e4c60186bc18174bd8786fd94a1c48c4a73e8d39751cda48df6a8f993e", - "0x0000000000000000000000000000000000000000000000000000000000000194": "0xd52e2abd050768b7f910076e147c029f3a1ab5559b9c03de0eef31e685b3a7e6", - "0x0000000000000000000000000000000000000000000000000000000000000001": "0x45442572e97fdf62578f8ddf310bed79b193dfc4440dd071d4286227d38f52a4", - "0x00000000000000000000000000000000000000000000000000000000000001f0": "0xa4ba9ecc82a99054a9465f992c2f617d3c12543c7075623c3c6040dc2dcc666b", - "0x0000000000000000000000000000000000000000000000000000000000000252": "0x32440941da6630be54ed36bd5ec49e6f773618a467cedfd3ac42ec48220d2483", - "0x000000000000000000000000000000000000000000000000000000000000014c": "0x3ee55146eeda31909d0b61bc64d3955a75128da601e58ab08fc5d0da3d2b5fe1", - "0x00000000000000000000000000000000000000000000000000000000000001a6": "0xe7288f8f418102a0a9acb1b56e1d3428e3336799c0946aac300e84b8658fb5b6", - "0x00000000000000000000000000000000000000000000000000000000000000b1": "0xfacd566ba45ed12b3b4d0bc6a56c07b886d6acc617109b7b00b118f81897a791", - "0x00000000000000000000000000000000000000000000000000000000000001a5": "0x9210eb85120d799f6d3618400901b2d499b2a983c3dbf022778240c4eff2debb", - "0x0000000000000000000000000000000000000000000000000000000000000032": "0xa77a96a0740fd6c05612abe272659d8adef33bab65c4645169e9e1503a1b01c0", - "0x0000000000000000000000000000000000000000000000000000000000000118": "0x1d7362969936de66e5a7188875a26c4ec0ea1522c781b27c95b9e2bc9573ac6d", - "0x0000000000000000000000000000000000000000000000000000000000000119": "0xd3696b6d05bd44a082b4be55bfb160e1af0dfef15477a6e7ccc93d751546d501", - "0x0000000000000000000000000000000000000000000000000000000000000217": "0x2e760a7eb2aa1fea018353f848619c49f5bb8cc68471a869ada36693bce10250", - "0x0000000000000000000000000000000000000000000000000000000000000051": "0x8510e1cc2d7e5851a5c3249747e1714a42b2022d289cbac007be1c8663499b61", - "0x0000000000000000000000000000000000000000000000000000000000000247": "0xdef6ee1d20cf605b4e202939d108e24ce06ea90e8f9f923d21d2b121ac65310a", - "0x0000000000000000000000000000000000000000000000000000000000000248": "0x26a10b4351040fc51f66e6fa4595a73032396c17ccf6de555616781e7991f200", - "0x00000000000000000000000000000000000000000000000000000000000000a6": "0xd52b053d27d77addf3541ef34d897d81c408efe6646b5c40d52731def85d2dac", - "0x000000000000000000000000000000000000000000000000000000000000002e": "0x717c475259955efa97e3ab0fec2d359acc68405e308e49ea029e657058b80142", - "0x0000000000000000000000000000000000000000000000000000000000000287": "0x21037cd843221e4af6736a076a8255632496c515d58dcce30a1b86a70aed1a87", - "0x0000000000000000000000000000000000000000000000000000000000000227": "0x6f6f9b10797f0e2fb1ab8cc700fc05becf5bd5bbd4c87d4008f3cdd6f8d41323", - "0x0000000000000000000000000000000000000000000000000000000000000073": "0xf0bd344c13a282c72f1228def6279637299e5652cffa25f5f251cb4c1eea7f8e", - "0x0000000000000000000000000000000000000000000000000000000000000150": "0xd91848b669d3afa6a90842650a8ddd3bdaef50a452a5f47c71200480526ac8e7", - "0x00000000000000000000000000000000000000000000000000000000000001a8": "0x4e19dcf9de79cf5a48d381b888aa62abc83969d675fec2f55b97ea57d5b0c71b" + "0x0000000000000000000000000000000000000000000000000000000000000000": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" } }, - "2": { - "address": "0x00000000219ab540356cBB839Cbe05303d7705Fa", - "code": "0x60806040526004361061003f5760003560e01c806301ffc9a71461004457806322895118146100a4578063621fd130146101ba578063c5f2892f14610244575b600080fd5b34801561005057600080fd5b506100906004803603602081101561006757600080fd5b50357fffffffff000000000000000000000000000000000000000000000000000000001661026b565b604080519115158252519081900360200190f35b6101b8600480360360808110156100ba57600080fd5b8101906020810181356401000000008111156100d557600080fd5b8201836020820111156100e757600080fd5b8035906020019184600183028401116401000000008311171561010957600080fd5b91939092909160208101903564010000000081111561012757600080fd5b82018360208201111561013957600080fd5b8035906020019184600183028401116401000000008311171561015b57600080fd5b91939092909160208101903564010000000081111561017957600080fd5b82018360208201111561018b57600080fd5b803590602001918460018302840111640100000000831117156101ad57600080fd5b919350915035610304565b005b3480156101c657600080fd5b506101cf6110b5565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102095781810151838201526020016101f1565b50505050905090810190601f1680156102365780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561025057600080fd5b506102596110c7565b60408051918252519081900360200190f35b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a70000000000000000000000000000000000000000000000000000000014806102fe57507fffffffff0000000000000000000000000000000000000000000000000000000082167f8564090700000000000000000000000000000000000000000000000000000000145b92915050565b6030861461035d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806118056026913960400191505060405180910390fd5b602084146103b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603681526020018061179c6036913960400191505060405180910390fd5b6060821461040f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806118786029913960400191505060405180910390fd5b670de0b6b3a7640000341015610470576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806118526026913960400191505060405180910390fd5b633b9aca003406156104cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806117d26033913960400191505060405180910390fd5b633b9aca00340467ffffffffffffffff811115610535576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018061182b6027913960400191505060405180910390fd5b6060610540826114ba565b90507f649bbc62d0e31342afea4e5cd82d4049e7e1ee912fc0889aa790803be39038c589898989858a8a6105756020546114ba565b6040805160a0808252810189905290819060208201908201606083016080840160c085018e8e80828437600083820152601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690910187810386528c815260200190508c8c808284376000838201819052601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690920188810386528c5181528c51602091820193918e019250908190849084905b83811015610648578181015183820152602001610630565b50505050905090810190601f1680156106755780820380516001836020036101000a031916815260200191505b5086810383528881526020018989808284376000838201819052601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169092018881038452895181528951602091820193918b019250908190849084905b838110156106ef5781810151838201526020016106d7565b50505050905090810190601f16801561071c5780820380516001836020036101000a031916815260200191505b509d505050505050505050505050505060405180910390a1600060028a8a600060801b604051602001808484808284377fffffffffffffffffffffffffffffffff0000000000000000000000000000000090941691909301908152604080517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0818403018152601090920190819052815191955093508392506020850191508083835b602083106107fc57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016107bf565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610859573d6000803e3d6000fd5b5050506040513d602081101561086e57600080fd5b5051905060006002806108846040848a8c6116fe565b6040516020018083838082843780830192505050925050506040516020818303038152906040526040518082805190602001908083835b602083106108f857805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016108bb565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610955573d6000803e3d6000fd5b5050506040513d602081101561096a57600080fd5b5051600261097b896040818d6116fe565b60405160009060200180848480828437919091019283525050604080518083038152602092830191829052805190945090925082918401908083835b602083106109f457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016109b7565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610a51573d6000803e3d6000fd5b5050506040513d6020811015610a6657600080fd5b5051604080516020818101949094528082019290925280518083038201815260609092019081905281519192909182918401908083835b60208310610ada57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610a9d565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610b37573d6000803e3d6000fd5b5050506040513d6020811015610b4c57600080fd5b50516040805160208101858152929350600092600292839287928f928f92018383808284378083019250505093505050506040516020818303038152906040526040518082805190602001908083835b60208310610bd957805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610b9c565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610c36573d6000803e3d6000fd5b5050506040513d6020811015610c4b57600080fd5b50516040518651600291889160009188916020918201918291908601908083835b60208310610ca957805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610c6c565b6001836020036101000a0380198251168184511680821785525050505050509050018367ffffffffffffffff191667ffffffffffffffff1916815260180182815260200193505050506040516020818303038152906040526040518082805190602001908083835b60208310610d4e57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610d11565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610dab573d6000803e3d6000fd5b5050506040513d6020811015610dc057600080fd5b5051604080516020818101949094528082019290925280518083038201815260609092019081905281519192909182918401908083835b60208310610e3457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610df7565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610e91573d6000803e3d6000fd5b5050506040513d6020811015610ea657600080fd5b50519050858114610f02576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260548152602001806117486054913960600191505060405180910390fd5b60205463ffffffff11610f60576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806117276021913960400191505060405180910390fd5b602080546001019081905560005b60208110156110a9578160011660011415610fa0578260008260208110610f9157fe5b0155506110ac95505050505050565b600260008260208110610faf57fe5b01548460405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831061102557805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610fe8565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015611082573d6000803e3d6000fd5b5050506040513d602081101561109757600080fd5b50519250600282049150600101610f6e565b50fe5b50505050505050565b60606110c26020546114ba565b905090565b6020546000908190815b60208110156112f05781600116600114156111e6576002600082602081106110f557fe5b01548460405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831061116b57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161112e565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa1580156111c8573d6000803e3d6000fd5b5050506040513d60208110156111dd57600080fd5b505192506112e2565b600283602183602081106111f657fe5b015460405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831061126b57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161122e565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa1580156112c8573d6000803e3d6000fd5b5050506040513d60208110156112dd57600080fd5b505192505b6002820491506001016110d1565b506002826112ff6020546114ba565b600060401b6040516020018084815260200183805190602001908083835b6020831061135a57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161131d565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790527fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000095909516920191825250604080518083037ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8018152601890920190819052815191955093508392850191508083835b6020831061143f57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611402565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa15801561149c573d6000803e3d6000fd5b5050506040513d60208110156114b157600080fd5b50519250505090565b60408051600880825281830190925260609160208201818036833701905050905060c082901b8060071a60f81b826000815181106114f457fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060061a60f81b8260018151811061153757fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060051a60f81b8260028151811061157a57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060041a60f81b826003815181106115bd57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060031a60f81b8260048151811061160057fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060021a60f81b8260058151811061164357fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060011a60f81b8260068151811061168657fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060001a60f81b826007815181106116c957fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535050919050565b6000808585111561170d578182fd5b83861115611719578182fd5b505082019391909203915056fe4465706f736974436f6e74726163743a206d65726b6c6520747265652066756c6c4465706f736974436f6e74726163743a207265636f6e7374727563746564204465706f7369744461746120646f6573206e6f74206d6174636820737570706c696564206465706f7369745f646174615f726f6f744465706f736974436f6e74726163743a20696e76616c6964207769746864726177616c5f63726564656e7469616c73206c656e6774684465706f736974436f6e74726163743a206465706f7369742076616c7565206e6f74206d756c7469706c65206f6620677765694465706f736974436f6e74726163743a20696e76616c6964207075626b6579206c656e6774684465706f736974436f6e74726163743a206465706f7369742076616c756520746f6f20686967684465706f736974436f6e74726163743a206465706f7369742076616c756520746f6f206c6f774465706f736974436f6e74726163743a20696e76616c6964207369676e6174757265206c656e677468a2646970667358221220dceca8706b29e917dacf25fceef95acac8d90d765ac926663ce4096195952b6164736f6c634300060b0033000000000000000000", - "storage": { - "0x000000000000000000000000000000000000000000000000000000000000003e": "0x8869ff2c22b28cc10510d9853292803328be4fb0e80495e8bb8d271f5b889636", - "0x0000000000000000000000000000000000000000000000000000000000000027": "0xd88ddfeed400a8755596b21942c1497e114c302e6118290f91e6772976041fa1", - "0x0000000000000000000000000000000000000000000000000000000000000028": "0x87eb0ddba57e35f6d286673802a4af5975e22506c7cf4c64bb6be5ee11527f2c", - "0x000000000000000000000000000000000000000000000000000000000000002a": "0x506d86582d252405b840018792cad2bf1259f1ef5aa5f887e13cb2f0094f51e1", - "0x000000000000000000000000000000000000000000000000000000000000002c": "0x6cf04127db05441cd833107a52be852868890e4317e6a02ab47683aa75964220", - "0x000000000000000000000000000000000000000000000000000000000000002e": "0xdf6af5f5bbdb6be9ef8aa618e4bf8073960867171e29676f8b284dea6a08a85e", - "0x0000000000000000000000000000000000000000000000000000000000000022": "0xf5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb4b", - "0x0000000000000000000000000000000000000000000000000000000000000037": "0xfeb3c337d7a51a6fbf00b9e34c52e1c9195c969bd4e7a0bfd51d5c5bed9c1167", - "0x000000000000000000000000000000000000000000000000000000000000002b": "0xffff0ad7e659772f9534c195c815efc4014ef1e1daed4404c06385d11192e92b", - "0x0000000000000000000000000000000000000000000000000000000000000038": "0xe71f0aa83cc32edfbefa9f4d3e0174ca85182eec9f3a09f6a6c0df6377a510d7", - "0x0000000000000000000000000000000000000000000000000000000000000025": "0x536d98837f2dd165a55d5eeae91485954472d56f246df256bf3cae19352a123c", - "0x000000000000000000000000000000000000000000000000000000000000003b": "0x619e312724bb6d7c3153ed9de791d764a366b389af13c58bf8a8d90481a46765", - "0x000000000000000000000000000000000000000000000000000000000000003f": "0xb5fe28e79f1b850f8658246ce9b6a1e7b49fc06db7143e8fe0b4f2b0c5523a5c", - "0x0000000000000000000000000000000000000000000000000000000000000033": "0x95eec8b2e541cad4e91de38385f2e046619f54496c2382cb6cacd5b98c26f5a4", - "0x000000000000000000000000000000000000000000000000000000000000002d": "0xb7d05f875f140027ef5118a2247bbb84ce8f2f0f1123623085daf7960c329f5f", - "0x0000000000000000000000000000000000000000000000000000000000000024": "0xc78009fdf07fc56a11f122370658a353aaa542ed63e44c4bc15ff4cd105ab33c", - "0x0000000000000000000000000000000000000000000000000000000000000026": "0x9efde052aa15429fae05bad4d0b1d7c64da64d03d7a1854a588c2cb8430c0d30", - "0x0000000000000000000000000000000000000000000000000000000000000031": "0x8fe6b1689256c0d385f42f5bbe2027a22c1996e110ba97c171d3e5948de92beb", - "0x0000000000000000000000000000000000000000000000000000000000000032": "0x8d0d63c39ebade8509e0ae3c9c3876fb5fa112be18f905ecacfecb92057603ab", - "0x000000000000000000000000000000000000000000000000000000000000003c": "0x7cdd2986268250628d0c10e385c58c6191e6fbe05191bcc04f133f2cea72c1c4", - "0x0000000000000000000000000000000000000000000000000000000000000034": "0xf893e908917775b62bff23294dbbe3a1cd8e6cc1c35b4801887b646a6f81f17f", - "0x0000000000000000000000000000000000000000000000000000000000000030": "0xd49a7502ffcfb0340b1d7885688500ca308161a7f96b62df9d083b71fcc8f2bb", - "0x000000000000000000000000000000000000000000000000000000000000003d": "0x848930bd7ba8cac54661072113fb278869e07bb8587f91392933374d017bcbe1", - "0x0000000000000000000000000000000000000000000000000000000000000029": "0x26846476fd5fc54a5d43385167c95144f2643f533cc85bb9d16b782f8d7db193", - "0x0000000000000000000000000000000000000000000000000000000000000039": "0x31206fa80a50bb6abe29085058f16212212a60eec8f049fecb92d8c8e0a84bc0", - "0x0000000000000000000000000000000000000000000000000000000000000036": "0x8a8d7fe3af8caa085a7639a832001457dfb9128a8061142ad0335629ff23ff9c", - "0x0000000000000000000000000000000000000000000000000000000000000040": "0x985e929f70af28d0bdd1a90a808f977f597c7c778c489e98d3bd8910d31ac0f7", - "0x000000000000000000000000000000000000000000000000000000000000003a": "0x21352bfecbeddde993839f614c3dac0a3ee37543f9b412b16199dc158e23b544", - "0x0000000000000000000000000000000000000000000000000000000000000023": "0xdb56114e00fdd4c1f85c892bf35ac9a89289aaecb1ebd0a96cde606a748b5d71", - "0x000000000000000000000000000000000000000000000000000000000000002f": "0xb58d900f5e182e3c50ef74969ea16c7726c549757cc23523c369587da7293784", - "0x0000000000000000000000000000000000000000000000000000000000000035": "0xcddba7b592e3133393c16194fac7431abf2f5485ed711db282183c819e08ebaa" - } - }, - "0": { - "address": "0x00000961Ef480Eb55e80D19ad83579A64c007002", - "code": "0x3373fffffffffffffffffffffffffffffffffffffffe1460cb5760115f54807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff146101f457600182026001905f5b5f82111560685781019083028483029004916001019190604d565b909390049250505036603814608857366101f457346101f4575f5260205ff35b34106101f457600154600101600155600354806003026004013381556001015f35815560010160203590553360601b5f5260385f601437604c5fa0600101600355005b6003546002548082038060101160df575060105b5f5b8181146101835782810160030260040181604c02815460601b8152601401816001015481526020019060020154807fffffffffffffffffffffffffffffffff00000000000000000000000000000000168252906010019060401c908160381c81600701538160301c81600601538160281c81600501538160201c81600401538160181c81600301538160101c81600201538160081c81600101535360010160e1565b910180921461019557906002556101a0565b90505f6002555f6003555b5f54807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff14156101cd57505f5b6001546002828201116101e25750505f6101e8565b01600290035b5f555f600155604c025ff35b5f5ffd00", + "5": { + "address": "0x000F3df6D732807Ef1319fB7B8bB8522d0Beac02", + "code": "0x3373fffffffffffffffffffffffffffffffffffffffe14604d57602036146024575f5ffd5b5f35801560495762001fff810690815414603c575f5ffd5b62001fff01545f5260205ff35b5f5ffd5b62001fff42064281555f359062001fff015500", "storage": {} } } diff --git a/contracts/foundry.lock b/contracts/foundry.lock new file mode 100644 index 00000000..1a3a4fb3 --- /dev/null +++ b/contracts/foundry.lock @@ -0,0 +1,11 @@ +{ + "lib/eigenlayer-contracts": { + "rev": "7ecc83c7b180850531bc5b8b953a7340adeecd43" + }, + "lib/forge-std": { + "rev": "9530d9ec702df1b27b7f8f50c0a63a11b1b5fba9" + }, + "lib/snowbridge": { + "rev": "13263fefa29a3f4af50e5650dcd93fe3afac44db" + } +} \ No newline at end of file diff --git a/contracts/script/deploy/Config.sol b/contracts/script/deploy/Config.sol index ccb764b2..63558988 100644 --- a/contracts/script/deploy/Config.sol +++ b/contracts/script/deploy/Config.sol @@ -20,6 +20,7 @@ contract Config { address avsOwner; address rewardsInitiator; address[] validatorsStrategies; + address validatorSetSubmitter; } // EigenLayer parameters diff --git a/contracts/script/deploy/DeployBase.s.sol b/contracts/script/deploy/DeployBase.s.sol index dab827e2..c9bd5077 100644 --- a/contracts/script/deploy/DeployBase.s.sol +++ b/contracts/script/deploy/DeployBase.s.sol @@ -32,6 +32,10 @@ import { } from "eigenlayer-contracts/src/contracts/permissions/PermissionController.sol"; import {EigenPodManager} from "eigenlayer-contracts/src/contracts/pods/EigenPodManager.sol"; import {IETHPOSDeposit} from "eigenlayer-contracts/src/contracts/interfaces/IETHPOSDeposit.sol"; +import {IStrategy} from "eigenlayer-contracts/src/contracts/interfaces/IStrategy.sol"; +import { + IRewardsCoordinatorTypes +} from "eigenlayer-contracts/src/contracts/interfaces/IRewardsCoordinator.sol"; // DataHaven imports import {DataHavenServiceManager} from "../../src/DataHavenServiceManager.sol"; @@ -41,8 +45,9 @@ import {ValidatorsUtils} from "../../script/utils/ValidatorsUtils.sol"; struct ServiceManagerInitParams { address avsOwner; address rewardsInitiator; - address[] validatorsStrategies; + IRewardsCoordinatorTypes.StrategyAndMultiplier[] validatorsStrategiesAndMultipliers; address gateway; + address validatorSetSubmitter; string initialVersion; address versionUpdater; } @@ -248,6 +253,16 @@ abstract contract DeployBase is Script, DeployParams, Accounts { "ServiceManager Implementation", address(serviceManagerImplementation) ); + // Build StrategyAndMultiplier[] from config addresses with default multiplier of 1. + // Multipliers can be updated post-deployment via setStrategiesAndMultipliers if needed. + IRewardsCoordinatorTypes.StrategyAndMultiplier[] memory strategiesAndMultipliers = new IRewardsCoordinatorTypes + .StrategyAndMultiplier[](avsConfig.validatorsStrategies.length); + for (uint256 i = 0; i < avsConfig.validatorsStrategies.length; i++) { + strategiesAndMultipliers[i] = IRewardsCoordinatorTypes.StrategyAndMultiplier({ + strategy: IStrategy(avsConfig.validatorsStrategies[i]), multiplier: 1 + }); + } + // Read version from environment variable (passed by TypeScript wrapper) string memory version = vm.envOr("DATAHAVEN_VERSION", string("0.1.0")); console.log("| Version: %s", version); @@ -256,8 +271,9 @@ abstract contract DeployBase is Script, DeployParams, Accounts { ServiceManagerInitParams memory initParams = ServiceManagerInitParams({ avsOwner: avsConfig.avsOwner, rewardsInitiator: avsConfig.rewardsInitiator, - validatorsStrategies: avsConfig.validatorsStrategies, + validatorsStrategiesAndMultipliers: strategiesAndMultipliers, gateway: address(gateway), + validatorSetSubmitter: avsConfig.validatorSetSubmitter, initialVersion: version, versionUpdater: _deployer }); diff --git a/contracts/script/deploy/DeployLive.s.sol b/contracts/script/deploy/DeployLive.s.sol index fa6e1796..d92a5519 100644 --- a/contracts/script/deploy/DeployLive.s.sol +++ b/contracts/script/deploy/DeployLive.s.sol @@ -120,8 +120,9 @@ contract DeployLive is DeployBase { DataHavenServiceManager.initialize.selector, params.avsOwner, params.rewardsInitiator, - params.validatorsStrategies, + params.validatorsStrategiesAndMultipliers, params.gateway, + params.validatorSetSubmitter, params.initialVersion, params.versionUpdater ); diff --git a/contracts/script/deploy/DeployLocal.s.sol b/contracts/script/deploy/DeployLocal.s.sol index 93fc43a8..36c7268d 100644 --- a/contracts/script/deploy/DeployLocal.s.sol +++ b/contracts/script/deploy/DeployLocal.s.sol @@ -206,8 +206,9 @@ contract DeployLocal is DeployBase { DataHavenServiceManager.initialize.selector, params.avsOwner, params.rewardsInitiator, - params.validatorsStrategies, + params.validatorsStrategiesAndMultipliers, params.gateway, + params.validatorSetSubmitter, params.initialVersion, params.versionUpdater ); @@ -359,11 +360,15 @@ contract DeployLocal is DeployBase { function _prepareStrategiesForServiceManager( ServiceManagerInitParams memory params ) internal view { - if (params.validatorsStrategies.length == 0) { - params.validatorsStrategies = new address[](deployedStrategies.length); + if (params.validatorsStrategiesAndMultipliers.length == 0) { + IRewardsCoordinatorTypes.StrategyAndMultiplier[] memory sm = + new IRewardsCoordinatorTypes.StrategyAndMultiplier[](deployedStrategies.length); for (uint256 i = 0; i < deployedStrategies.length; i++) { - params.validatorsStrategies[i] = deployedStrategies[i].address_; + sm[i] = IRewardsCoordinatorTypes.StrategyAndMultiplier({ + strategy: IStrategy(deployedStrategies[i].address_), multiplier: 1 + }); } + params.validatorsStrategiesAndMultipliers = sm; } } diff --git a/contracts/script/deploy/DeployParams.s.sol b/contracts/script/deploy/DeployParams.s.sol index 1c21f32d..eda4630f 100644 --- a/contracts/script/deploy/DeployParams.s.sol +++ b/contracts/script/deploy/DeployParams.s.sol @@ -79,6 +79,12 @@ contract DeployParams is Script, Config { config.validatorsStrategies = vm.parseJsonAddressArray(configJson, ".avs.validatorsStrategies"); + try vm.parseJsonAddress(configJson, ".avs.validatorSetSubmitter") returns (address addr) { + config.validatorSetSubmitter = addr; + } catch { + config.validatorSetSubmitter = address(0); + } + return config; } diff --git a/contracts/script/fixtures/DataHavenServiceManagerBadLayout.sol b/contracts/script/fixtures/DataHavenServiceManagerBadLayout.sol index 919cc346..ffaa0018 100644 --- a/contracts/script/fixtures/DataHavenServiceManagerBadLayout.sol +++ b/contracts/script/fixtures/DataHavenServiceManagerBadLayout.sol @@ -16,9 +16,10 @@ contract DataHavenServiceManagerBadLayout is OwnableUpgradeable { mapping(address => bool) public validatorsAllowlist; IGatewayV2 private _snowbridgeGateway; mapping(address => address) public validatorEthAddressToSolochainAddress; + mapping(address => address) public validatorSolochainAddressToEthAddress; // Keep the original gap size to mirror shape, despite the shift - uint256[46] private __GAP; + uint256[45] private __GAP; // Keep a compatible constructor signature for upgrade tests. constructor( diff --git a/contracts/script/transact/AllocateOperatorStake.s.sol b/contracts/script/transact/AllocateOperatorStake.s.sol new file mode 100644 index 00000000..6372e9fd --- /dev/null +++ b/contracts/script/transact/AllocateOperatorStake.s.sol @@ -0,0 +1,61 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.27; + +// EigenLayer imports +import { + IAllocationManagerTypes +} from "eigenlayer-contracts/src/contracts/interfaces/IAllocationManager.sol"; +import {OperatorSet} from "eigenlayer-contracts/src/contracts/libraries/OperatorSetLib.sol"; +import {IStrategy} from "eigenlayer-contracts/src/contracts/interfaces/IStrategy.sol"; + +// Testing imports +import {Script} from "forge-std/Script.sol"; +import {console} from "forge-std/console.sol"; +import {Logging} from "../utils/Logging.sol"; +import {ELScriptStorage} from "../utils/ELScriptStorage.s.sol"; +import {DHScriptStorage} from "../utils/DHScriptStorage.s.sol"; +import {Accounts} from "../utils/Accounts.sol"; + +/** + * @title AllocateOperatorStake + * @notice Allocates full magnitude to the validator operator set. + * Must be run AFTER SignUpValidator (needs at least 1 block gap + * for the allocation delay to initialize). + */ +contract AllocateOperatorStake is Script, ELScriptStorage, DHScriptStorage, Accounts { + function run() public { + string memory network = vm.envOr("NETWORK", string("anvil")); + Logging.logHeader("ALLOCATE OPERATOR STAKE"); + console.log("| Network: %s", network); + Logging.logFooter(); + + _loadELContracts(network); + _loadDHContracts(network); + + IStrategy[] memory strategies = new IStrategy[](deployedStrategies.length); + for (uint256 i = 0; i < deployedStrategies.length; i++) { + strategies[i] = IStrategy(address(deployedStrategies[i].strategy)); + } + + uint64[] memory newMagnitudes = new uint64[](strategies.length); + for (uint256 i = 0; i < strategies.length; i++) { + newMagnitudes[i] = 1e18; + } + + IAllocationManagerTypes.AllocateParams[] memory allocParams = + new IAllocationManagerTypes.AllocateParams[](1); + allocParams[0] = IAllocationManagerTypes.AllocateParams({ + operatorSet: OperatorSet({ + avs: address(serviceManager), id: serviceManager.VALIDATORS_SET_ID() + }), + strategies: strategies, + newMagnitudes: newMagnitudes + }); + + vm.broadcast(_operatorPrivateKey); + allocationManager.modifyAllocations(_operator, allocParams); + Logging.logStep( + string.concat("Allocated full magnitude for operator: ", vm.toString(_operator)) + ); + } +} diff --git a/contracts/scripts/check-storage-layout-negative.sh b/contracts/scripts/check-storage-layout-negative.sh index 18d842cf..be79ba9b 100755 --- a/contracts/scripts/check-storage-layout-negative.sh +++ b/contracts/scripts/check-storage-layout-negative.sh @@ -20,7 +20,7 @@ if [ "$EXIT_CODE" -eq 0 ]; then exit 1 fi -if ! printf '%s\n' "$OUTPUT" | grep -q "ERROR: Storage layout has changed!"; then +if ! printf '%s\n' "$OUTPUT" | grep -qE "ERROR: (Storage layout has changed!|__GAP invariant violated!)"; then echo "ERROR: Storage layout check failed, but not for the expected reason." echo "" echo "Output:" diff --git a/contracts/scripts/check-storage-layout.sh b/contracts/scripts/check-storage-layout.sh index 8e2aeb09..895dbdb8 100755 --- a/contracts/scripts/check-storage-layout.sh +++ b/contracts/scripts/check-storage-layout.sh @@ -33,8 +33,8 @@ normalize_json() { | .storage | map( del(.astId, .contract) - # Remove unstable AST ID suffixes from type strings (e.g., t_contract(IGatewayV2)12345) - | .type |= sub("\\)[0-9]+$"; ")") + # Remove unstable AST IDs from type strings (e.g., t_contract(IGatewayV2)12345, nested mappings) + | .type |= gsub("\\)[0-9]+"; ")") ) | sort_by(.slot | tonumber)' "$1" } @@ -59,4 +59,26 @@ if ! diff -q /tmp/snap_normalized.json /tmp/curr_normalized.json > /dev/null 2>& exit 1 fi +# Verify gap invariant: __GAP slot + array size must equal a fixed constant. +# This catches cases where a new variable is added but __GAP is not shrunk accordingly. +EXPECTED_GAP_TOTAL=151 +GAP_SLOT=$(jq '.storage[] | select(.label == "__GAP") | .slot | tonumber' /tmp/current_layout.json) +GAP_SIZE=$(jq -r '.storage[] | select(.label == "__GAP") | .type' /tmp/current_layout.json \ + | grep -oE '[0-9]+' | tail -1) + +if [ -n "$GAP_SLOT" ] && [ -n "$GAP_SIZE" ]; then + GAP_TOTAL=$((GAP_SLOT + GAP_SIZE)) + if [ "$GAP_TOTAL" -ne "$EXPECTED_GAP_TOTAL" ]; then + echo "" + echo "==========================================" + echo "ERROR: __GAP invariant violated!" + echo "==========================================" + echo "" + echo " slot($GAP_SLOT) + size($GAP_SIZE) = $GAP_TOTAL, expected $EXPECTED_GAP_TOTAL" + echo "" + echo "If you added a new state variable, shrink __GAP by the same number of slots." + exit 1 + fi +fi + echo "Storage layout OK - no changes detected" diff --git a/contracts/src/DataHavenServiceManager.sol b/contracts/src/DataHavenServiceManager.sol index 1aec5488..eb858a6b 100644 --- a/contracts/src/DataHavenServiceManager.sol +++ b/contracts/src/DataHavenServiceManager.sol @@ -43,6 +43,9 @@ contract DataHavenServiceManager is OwnableUpgradeable, IAVSRegistrar, IDataHave /// @notice The EigenLayer operator set ID for the Validators securing the DataHaven network. uint32 public constant VALIDATORS_SET_ID = 0; + /// @notice Maximum number of active validators in the set + uint32 public constant MAX_ACTIVE_VALIDATORS = 32; + // ============ Immutables ============ /// @notice The EigenLayer AllocationManager contract @@ -65,6 +68,14 @@ contract DataHavenServiceManager is OwnableUpgradeable, IAVSRegistrar, IDataHave /// @inheritdoc IDataHavenServiceManager mapping(address => address) public validatorEthAddressToSolochainAddress; + mapping(address => address) public validatorSolochainAddressToEthAddress; + + /// @inheritdoc IDataHavenServiceManager + address public validatorSetSubmitter; + + /// @inheritdoc IDataHavenServiceManager + mapping(IStrategy => uint96) public strategiesAndMultipliers; + /// @notice Semantic version of the deployed DataHaven AVS stack. /// Set during initialization based on deployment chain. /// This should match the `version` field in the corresponding @@ -77,7 +88,7 @@ contract DataHavenServiceManager is OwnableUpgradeable, IAVSRegistrar, IDataHave /// @notice Storage gap for upgradeability (must be at end of state variables) // solhint-disable-next-line var-name-mixedcase - uint256[44] private __GAP; + uint256[41] private __GAP; // ============ Modifiers ============ @@ -99,6 +110,12 @@ contract DataHavenServiceManager is OwnableUpgradeable, IAVSRegistrar, IDataHave _; } + /// @notice Restricts function to the validator set submitter + modifier onlyValidatorSetSubmitter() { + _checkValidatorSetSubmitter(); + _; + } + /// @notice Restricts function to the version updater or owner modifier onlyVersionUpdater() { _checkVersionUpdater(); @@ -121,6 +138,10 @@ contract DataHavenServiceManager is OwnableUpgradeable, IAVSRegistrar, IDataHave require(msg.sender == address(_ALLOCATION_MANAGER), OnlyAllocationManager()); } + function _checkValidatorSetSubmitter() internal view { + require(msg.sender == validatorSetSubmitter, OnlyValidatorSetSubmitter()); + } + function _checkVersionUpdater() internal view { require( msg.sender == versionUpdater || msg.sender == owner(), "Only version updater or owner" @@ -145,8 +166,9 @@ contract DataHavenServiceManager is OwnableUpgradeable, IAVSRegistrar, IDataHave function initialize( address initialOwner, address _rewardsInitiator, - IStrategy[] memory validatorsStrategies, + IRewardsCoordinatorTypes.StrategyAndMultiplier[] memory validatorsStrategiesAndMultipliers, address _snowbridgeGatewayAddress, + address _validatorSetSubmitter, string memory initialVersion, address _versionUpdater ) public virtual initializer { @@ -169,16 +191,31 @@ contract DataHavenServiceManager is OwnableUpgradeable, IAVSRegistrar, IDataHave // Register the DataHaven service in the AllocationManager. _ALLOCATION_MANAGER.updateAVSMetadataURI(address(this), DATAHAVEN_AVS_METADATA); + // Build the strategies array and populate multipliers atomically so that + // getStrategiesInOperatorSet and strategiesAndMultipliers are always consistent. + IStrategy[] memory strategies = new IStrategy[](validatorsStrategiesAndMultipliers.length); + for (uint256 i = 0; i < validatorsStrategiesAndMultipliers.length; i++) { + strategies[i] = validatorsStrategiesAndMultipliers[i].strategy; + strategiesAndMultipliers[validatorsStrategiesAndMultipliers[i].strategy] = + validatorsStrategiesAndMultipliers[i].multiplier; + } + // Create the operator set for the DataHaven service. IAllocationManagerTypes.CreateSetParams[] memory operatorSets = new IAllocationManagerTypes.CreateSetParams[](1); operatorSets[0] = IAllocationManagerTypes.CreateSetParams({ - operatorSetId: VALIDATORS_SET_ID, strategies: validatorsStrategies + operatorSetId: VALIDATORS_SET_ID, strategies: strategies }); _ALLOCATION_MANAGER.createOperatorSets(address(this), operatorSets); // Set the Snowbridge Gateway address. _snowbridgeGateway = IGatewayV2(_snowbridgeGatewayAddress); + + // Set the validator set submitter if provided. + if (_validatorSetSubmitter != address(0)) { + validatorSetSubmitter = _validatorSetSubmitter; + emit ValidatorSetSubmitterUpdated(address(0), _validatorSetSubmitter); + } } // ============ View Functions ============ @@ -192,38 +229,107 @@ contract DataHavenServiceManager is OwnableUpgradeable, IAVSRegistrar, IDataHave // ============ External Functions ============ /// @inheritdoc IDataHavenServiceManager - function sendNewValidatorSet( + function setValidatorSetSubmitter( + address newSubmitter + ) external onlyOwner { + require(newSubmitter != address(0), ZeroAddress()); + address oldSubmitter = validatorSetSubmitter; + validatorSetSubmitter = newSubmitter; + emit ValidatorSetSubmitterUpdated(oldSubmitter, newSubmitter); + } + + // ============ External Functions ============ + + /// @inheritdoc IDataHavenServiceManager + function sendNewValidatorSetForEra( + uint64 targetEra, uint128 executionFee, uint128 relayerFee - ) external payable onlyOwner { - bytes memory message = buildNewValidatorSetMessage(); + ) external payable onlyValidatorSetSubmitter { + bytes memory message = buildNewValidatorSetMessageForEra(targetEra); _snowbridgeGateway.v2_sendMessage{value: msg.value}( message, new bytes[](0), bytes(""), executionFee, relayerFee ); + emit ValidatorSetMessageSubmitted(targetEra, keccak256(message), msg.sender); } /// @inheritdoc IDataHavenServiceManager - function buildNewValidatorSetMessage() public view returns (bytes memory) { + function buildNewValidatorSetMessageForEra( + uint64 targetEra + ) public view returns (bytes memory) { OperatorSet memory operatorSet = OperatorSet({avs: address(this), id: VALIDATORS_SET_ID}); - address[] memory currentValidatorSet = _ALLOCATION_MANAGER.getMembers(operatorSet); + address[] memory operators = _ALLOCATION_MANAGER.getMembers(operatorSet); + IStrategy[] memory strategies = _ALLOCATION_MANAGER.getStrategiesInOperatorSet(operatorSet); - // Allocate max size, then resize after filtering - address[] memory newValidatorSet = new address[](currentValidatorSet.length); - uint256 validCount = 0; - for (uint256 i = 0; i < currentValidatorSet.length; i++) { - address solochainAddr = validatorEthAddressToSolochainAddress[currentValidatorSet[i]]; - if (solochainAddr != address(0)) { - newValidatorSet[validCount] = solochainAddr; - ++validCount; + // Get allocated stake for all operators across all strategies + uint256[][] memory allocatedStake = + _ALLOCATION_MANAGER.getAllocatedStake(operatorSet, operators, strategies); + + // Collect candidates: operators with solochain mapping and non-zero weighted stake + address[] memory candidateSolochain = new address[](operators.length); + uint256[] memory candidateStake = new uint256[](operators.length); + address[] memory candidateOperator = new address[](operators.length); + uint256 candidateCount = 0; + + for (uint256 i = 0; i < operators.length; i++) { + address solochainAddr = validatorEthAddressToSolochainAddress[operators[i]]; + if (solochainAddr == address(0)) continue; + + // Compute weighted stake across all strategies: + // weightedStake = sum(allocatedStake[i][j] * multiplier[j]) + uint256 weightedStake = 0; + for (uint256 j = 0; j < strategies.length; j++) { + weightedStake += allocatedStake[i][j] + * uint256(strategiesAndMultipliers[strategies[j]]); + } + + if (weightedStake == 0) continue; + + candidateSolochain[candidateCount] = solochainAddr; + candidateStake[candidateCount] = weightedStake; + candidateOperator[candidateCount] = operators[i]; + candidateCount++; + } + + require(candidateCount != 0, EmptyValidatorSet()); + + // Partial selection sort: pick top min(MAX_ACTIVE_VALIDATORS, candidateCount) + uint256 selectCount = + candidateCount < MAX_ACTIVE_VALIDATORS ? candidateCount : MAX_ACTIVE_VALIDATORS; + + for (uint256 i = 0; i < selectCount; i++) { + uint256 bestIdx = i; + for (uint256 j = i + 1; j < candidateCount; j++) { + if (_isBetterCandidate( + candidateStake[j], + candidateOperator[j], + candidateStake[bestIdx], + candidateOperator[bestIdx] + )) { + bestIdx = j; + } + } + if (bestIdx != i) { + // Swap all parallel arrays + (candidateSolochain[i], candidateSolochain[bestIdx]) = + (candidateSolochain[bestIdx], candidateSolochain[i]); + (candidateStake[i], candidateStake[bestIdx]) = + (candidateStake[bestIdx], candidateStake[i]); + (candidateOperator[i], candidateOperator[bestIdx]) = + (candidateOperator[bestIdx], candidateOperator[i]); } } - // Resize array to actual count - assembly { - mstore(newValidatorSet, validCount) + + // Build the final validator set from sorted solochain addresses + address[] memory newValidatorSet = new address[](selectCount); + for (uint256 i = 0; i < selectCount; i++) { + newValidatorSet[i] = candidateSolochain[i]; } return DataHavenSnowbridgeMessages.scaleEncodeNewValidatorSetMessagePayload( - DataHavenSnowbridgeMessages.NewValidatorSetPayload({validators: newValidatorSet}) + DataHavenSnowbridgeMessages.NewValidatorSetPayload({ + validators: newValidatorSet, externalIndex: targetEra + }) ); } @@ -232,7 +338,20 @@ contract DataHavenServiceManager is OwnableUpgradeable, IAVSRegistrar, IDataHave address solochainAddress ) external onlyValidator { require(solochainAddress != address(0), ZeroAddress()); + + address existingEthOperator = validatorSolochainAddressToEthAddress[solochainAddress]; + require( + existingEthOperator == address(0) || existingEthOperator == msg.sender, + SolochainAddressAlreadyAssigned() + ); + + address oldSolochainAddress = validatorEthAddressToSolochainAddress[msg.sender]; + if (oldSolochainAddress != address(0) && oldSolochainAddress != solochainAddress) { + delete validatorSolochainAddressToEthAddress[oldSolochainAddress]; + } + validatorEthAddressToSolochainAddress[msg.sender] = solochainAddress; + validatorSolochainAddressToEthAddress[solochainAddress] = msg.sender; emit SolochainAddressUpdated(msg.sender, solochainAddress); } @@ -263,7 +382,21 @@ contract DataHavenServiceManager is OwnableUpgradeable, IAVSRegistrar, IDataHave require(operatorSetIds.length == 1, CantRegisterToMultipleOperatorSets()); require(operatorSetIds[0] == VALIDATORS_SET_ID, InvalidOperatorSetId()); require(validatorsAllowlist[operator], OperatorNotInAllowlist()); - validatorEthAddressToSolochainAddress[operator] = _toAddress(data); + + address solochainAddress = _toAddress(data); + address existingEthOperator = validatorSolochainAddressToEthAddress[solochainAddress]; + require( + existingEthOperator == address(0) || existingEthOperator == operator, + SolochainAddressAlreadyAssigned() + ); + + address oldSolochainAddress = validatorEthAddressToSolochainAddress[operator]; + if (oldSolochainAddress != address(0) && oldSolochainAddress != solochainAddress) { + delete validatorSolochainAddressToEthAddress[oldSolochainAddress]; + } + + validatorEthAddressToSolochainAddress[operator] = solochainAddress; + validatorSolochainAddressToEthAddress[solochainAddress] = operator; emit OperatorRegistered(operator, operatorSetIds[0]); } @@ -278,7 +411,11 @@ contract DataHavenServiceManager is OwnableUpgradeable, IAVSRegistrar, IDataHave require(operatorSetIds.length == 1, CantDeregisterFromMultipleOperatorSets()); require(operatorSetIds[0] == VALIDATORS_SET_ID, InvalidOperatorSetId()); + address oldSolochainAddress = validatorEthAddressToSolochainAddress[operator]; delete validatorEthAddressToSolochainAddress[operator]; + if (oldSolochainAddress != address(0)) { + delete validatorSolochainAddressToEthAddress[oldSolochainAddress]; + } emit OperatorDeregistered(operator, operatorSetIds[0]); } @@ -322,15 +459,71 @@ contract DataHavenServiceManager is OwnableUpgradeable, IAVSRegistrar, IDataHave _ALLOCATION_MANAGER.removeStrategiesFromOperatorSet( address(this), VALIDATORS_SET_ID, _strategies ); + + for (uint256 i = 0; i < _strategies.length; i++) { + delete strategiesAndMultipliers[_strategies[i]]; + } } /// @inheritdoc IDataHavenServiceManager function addStrategiesToValidatorsSupportedStrategies( - IStrategy[] calldata _strategies + IRewardsCoordinatorTypes.StrategyAndMultiplier[] calldata _strategyMultipliers ) external onlyOwner { - _ALLOCATION_MANAGER.addStrategiesToOperatorSet( - address(this), VALIDATORS_SET_ID, _strategies - ); + IStrategy[] memory strategies = new IStrategy[](_strategyMultipliers.length); + for (uint256 i = 0; i < _strategyMultipliers.length; i++) { + strategies[i] = _strategyMultipliers[i].strategy; + strategiesAndMultipliers[_strategyMultipliers[i].strategy] = + _strategyMultipliers[i].multiplier; + } + + _ALLOCATION_MANAGER.addStrategiesToOperatorSet(address(this), VALIDATORS_SET_ID, strategies); + + emit StrategiesAndMultipliersSet(_strategyMultipliers); + } + + /// @inheritdoc IDataHavenServiceManager + function setStrategiesAndMultipliers( + IRewardsCoordinatorTypes.StrategyAndMultiplier[] calldata _strategyMultipliers + ) external onlyOwner { + OperatorSet memory operatorSet = OperatorSet({avs: address(this), id: VALIDATORS_SET_ID}); + IStrategy[] memory registered = _ALLOCATION_MANAGER.getStrategiesInOperatorSet(operatorSet); + + for (uint256 i = 0; i < _strategyMultipliers.length; i++) { + bool found = false; + for (uint256 j = 0; j < registered.length; j++) { + if (registered[j] == _strategyMultipliers[i].strategy) { + found = true; + break; + } + } + require(found, StrategyNotInOperatorSet()); + + strategiesAndMultipliers[_strategyMultipliers[i].strategy] = + _strategyMultipliers[i].multiplier; + } + + emit StrategiesAndMultipliersSet(_strategyMultipliers); + } + + /// @inheritdoc IDataHavenServiceManager + function getStrategiesAndMultipliers() + external + view + returns (IRewardsCoordinatorTypes.StrategyAndMultiplier[] memory) + { + OperatorSet memory operatorSet = OperatorSet({avs: address(this), id: VALIDATORS_SET_ID}); + IStrategy[] memory strategies = _ALLOCATION_MANAGER.getStrategiesInOperatorSet(operatorSet); + + IRewardsCoordinatorTypes.StrategyAndMultiplier[] memory result = + new IRewardsCoordinatorTypes.StrategyAndMultiplier[](strategies.length); + + for (uint256 i = 0; i < strategies.length; i++) { + result[i] = IRewardsCoordinatorTypes.StrategyAndMultiplier({ + strategy: strategies[i], multiplier: strategiesAndMultipliers[strategies[i]] + }); + } + + return result; } // ============ Version Management ============ @@ -365,16 +558,22 @@ contract DataHavenServiceManager is OwnableUpgradeable, IAVSRegistrar, IDataHave function submitRewards( IRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission calldata submission ) external override onlyRewardsInitiator { + IRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission memory translatedSubmission = + submission; uint256 totalAmount = 0; - for (uint256 i = 0; i < submission.operatorRewards.length; i++) { - totalAmount += submission.operatorRewards[i].amount; + for (uint256 i = 0; i < translatedSubmission.operatorRewards.length; i++) { + translatedSubmission.operatorRewards[i].operator = + _ethOperatorFromSolochain(translatedSubmission.operatorRewards[i].operator); + totalAmount += translatedSubmission.operatorRewards[i].amount; } + _sortOperatorRewards(translatedSubmission.operatorRewards); + submission.token.safeIncreaseAllowance(address(_REWARDS_COORDINATOR), totalAmount); IRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission[] memory submissions = new IRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission[](1); - submissions[0] = submission; + submissions[0] = translatedSubmission; OperatorSet memory operatorSet = OperatorSet({avs: address(this), id: VALIDATORS_SET_ID}); _REWARDS_COORDINATOR.createOperatorDirectedOperatorSetRewardsSubmission( @@ -425,9 +624,10 @@ contract DataHavenServiceManager is OwnableUpgradeable, IAVSRegistrar, IDataHave SlashingRequest[] calldata slashings ) external onlyRewardsInitiator { for (uint256 i = 0; i < slashings.length; i++) { + address ethOperator = _ethOperatorFromSolochain(slashings[i].operator); IAllocationManagerTypes.SlashingParams memory slashingParams = IAllocationManagerTypes.SlashingParams({ - operator: slashings[i].operator, + operator: ethOperator, operatorSetId: VALIDATORS_SET_ID, strategies: slashings[i].strategies, wadsToSlash: slashings[i].wadsToSlash, @@ -442,6 +642,26 @@ contract DataHavenServiceManager is OwnableUpgradeable, IAVSRegistrar, IDataHave // ============ Internal Functions ============ + /** + * @notice Sorts operator rewards array by operator address in ascending order using insertion sort + * @dev Insertion sort is optimal for small arrays (validator set capped at 32) + * @param rewards The operator rewards array to sort in-place + */ + function _sortOperatorRewards( + IRewardsCoordinatorTypes.OperatorReward[] memory rewards + ) private pure { + uint256 len = rewards.length; + for (uint256 i = 1; i < len; i++) { + IRewardsCoordinatorTypes.OperatorReward memory key = rewards[i]; + uint256 j = i; + while (j > 0 && rewards[j - 1].operator > key.operator) { + rewards[j] = rewards[j - 1]; + j--; + } + rewards[j] = key; + } + } + /** * @notice Safely converts a 20-byte array to an address * @param data The bytes to convert (must be exactly 20 bytes) @@ -450,10 +670,43 @@ contract DataHavenServiceManager is OwnableUpgradeable, IAVSRegistrar, IDataHave function _toAddress( bytes memory data ) private pure returns (address result) { - require(data.length == 20, "Invalid address length"); + require(data.length == 20, InvalidSolochainAddressLength()); assembly { result := shr(96, mload(add(data, 32))) } require(result != address(0), ZeroAddress()); } + + /** + * @notice Determines if candidate A ranks higher than candidate B + * @dev Higher stake wins; on tie, lower operator address wins + * @param stakeA Weighted stake of candidate A + * @param opA Operator address of candidate A + * @param stakeB Weighted stake of candidate B + * @param opB Operator address of candidate B + * @return True if candidate A ranks higher than candidate B + */ + function _isBetterCandidate( + uint256 stakeA, + address opA, + uint256 stakeB, + address opB + ) private pure returns (bool) { + if (stakeA != stakeB) { + return stakeA > stakeB; + } + return opA < opB; + } + + /** + * @notice Returns the EigenLayer operator address for a Solochain validator address + * @dev Reverts if the Solochain address has not been mapped to an operator + */ + function _ethOperatorFromSolochain( + address solochainAddress + ) internal view returns (address) { + address ethOperator = validatorSolochainAddressToEthAddress[solochainAddress]; + require(ethOperator != address(0), UnknownSolochainAddress()); + return ethOperator; + } } diff --git a/contracts/src/interfaces/IDataHavenServiceManager.sol b/contracts/src/interfaces/IDataHavenServiceManager.sol index cf7c2039..570020b7 100644 --- a/contracts/src/interfaces/IDataHavenServiceManager.sol +++ b/contracts/src/interfaces/IDataHavenServiceManager.sol @@ -32,6 +32,19 @@ interface IDataHavenServiceManagerErrors { error ZeroAddress(); /// @notice Thrown when the solochain address data length is not 20 bytes error InvalidSolochainAddressLength(); + /// @notice Thrown when the caller is not the authorized validator set submitter + error OnlyValidatorSetSubmitter(); + /// @notice Thrown when trying to submit a validator set message with zero validators + error EmptyValidatorSet(); + + /// @notice Thrown when a Solochain address has not been mapped to an EigenLayer operator + error UnknownSolochainAddress(); + + /// @notice Thrown when a Solochain address is already assigned to a different operator + error SolochainAddressAlreadyAssigned(); + + /// @notice Thrown when a strategy is not registered in the operator set + error StrategyNotInOperatorSet(); } /** @@ -88,6 +101,23 @@ interface IDataHavenServiceManagerEvents { /// @notice Emitted when a batch of slashing request is being successfully slashed event SlashingComplete(); + + /// @notice Emitted when strategy multipliers are set or updated + /// @param strategyMultipliers Array of strategy-multiplier pairs that were set + event StrategiesAndMultipliersSet(IRewardsCoordinatorTypes + .StrategyAndMultiplier[] strategyMultipliers); + /// @notice Emitted when the validator set submitter address is updated + /// @param oldSubmitter The previous validator set submitter address + /// @param newSubmitter The new validator set submitter address + event ValidatorSetSubmitterUpdated(address indexed oldSubmitter, address indexed newSubmitter); + + /// @notice Emitted when a validator set message is submitted for a target era + /// @param targetEra The target era for the validator set + /// @param payloadHash The keccak256 hash of the encoded message payload + /// @param submitter The address that submitted the validator set message + event ValidatorSetMessageSubmitted( + uint64 indexed targetEra, bytes32 payloadHash, address indexed submitter + ); } /** @@ -127,11 +157,36 @@ interface IDataHavenServiceManager is address validatorAddress ) external view returns (address); + /// @notice Returns the address authorized to submit validator set messages + /// @return The validator set submitter address + function validatorSetSubmitter() external view returns (address); + + /** + * @notice Sets the address authorized to submit validator set messages + * @param newSubmitter The new validator set submitter address + * @dev Only callable by the owner + */ + function setValidatorSetSubmitter( + address newSubmitter + ) external; + + /** + * @notice Converts a Solochain validator address to the corresponding EigenLayer operator address + * @param solochainAddress The Solochain validator address to convert + * @return The corresponding EigenLayer operator address + */ + function validatorSolochainAddressToEthAddress( + address solochainAddress + ) external view returns (address); + /** * @notice Initializes the DataHaven Service Manager * @param initialOwner Address of the initial owner * @param rewardsInitiator Address authorized to initiate rewards - * @param validatorsStrategies Array of strategies supported by validators + * @param validatorsStrategiesAndMultipliers Array of strategy-multiplier pairs for the validators + * operator set. Each multiplier must be non-zero. + * @param _snowbridgeGatewayAddress Address of the Snowbridge Gateway + * @param _validatorSetSubmitter Address authorized to submit validator set messages * @param _snowbridgeGatewayAddress Address of the Snowbridge Gateway * @param initialVersion Initial semantic version string (e.g., "1.0.0") * @param _versionUpdater Address authorized to update the contract version @@ -139,31 +194,41 @@ interface IDataHavenServiceManager is function initialize( address initialOwner, address rewardsInitiator, - IStrategy[] memory validatorsStrategies, + IRewardsCoordinatorTypes.StrategyAndMultiplier[] memory validatorsStrategiesAndMultipliers, address _snowbridgeGatewayAddress, + address _validatorSetSubmitter, string memory initialVersion, address _versionUpdater ) external; /** - * @notice Sends a new validator set to the Snowbridge Gateway + * @notice Sends a new validator set for a target era to the Snowbridge Gateway * @dev The new validator set is made up of the Validators currently * registered in the DataHaven Service Manager as operators of * the Validators operator set (operatorSetId = VALIDATORS_SET_ID) - * @dev Only callable by the owner + * @dev Only callable by the validator set submitter + * @param targetEra The target era for the validator set submission * @param executionFee The execution fee for the Snowbridge message * @param relayerFee The relayer fee for the Snowbridge message */ - function sendNewValidatorSet( + function sendNewValidatorSetForEra( + uint64 targetEra, uint128 executionFee, uint128 relayerFee ) external payable; /** - * @notice Builds a new validator set message to be sent to the Snowbridge Gateway - * @return The encoded message bytes to be sent to the Snowbridge Gateway + * @notice Builds a SCALE-encoded message containing the top validators by weighted stake + * @dev Selects up to MAX_ACTIVE_VALIDATORS from registered operators. Each operator's + * weighted stake is computed as: sum(allocatedStake[j] * multiplier[j]) + * across all strategies. Operators without a solochain address mapping or with zero + * weighted stake are excluded. Ties are broken by lower operator address. + * @param targetEra The target era to encode in the message + * @return The SCALE-encoded message bytes to be sent to the Snowbridge Gateway */ - function buildNewValidatorSetMessage() external view returns (bytes memory); + function buildNewValidatorSetMessageForEra( + uint64 targetEra + ) external view returns (bytes memory); /** * @notice Updates the Solochain address for a Validator @@ -215,10 +280,39 @@ interface IDataHavenServiceManager is /** * @notice Adds strategies to the list of supported strategies for DataHaven Validators - * @param _strategies Array of strategy contracts to add to validators operator set + * @dev Each strategy's multiplier determines its weight in the validator selection + * formula: weightedStake = sum(allocatedStake[j] * multiplier[j]) + * @param _strategyMultipliers Array of strategy-multiplier pairs to add */ function addStrategiesToValidatorsSupportedStrategies( - IStrategy[] calldata _strategies + IRewardsCoordinatorTypes.StrategyAndMultiplier[] calldata _strategyMultipliers + ) external; + + /** + * @notice Returns the maximum number of active validators in the set + * @return The maximum active validators constant + */ + function MAX_ACTIVE_VALIDATORS() external pure returns (uint32); + + /** + * @notice Returns the multiplier for a given strategy + * @dev The multiplier determines how much an operator's allocated stake in this strategy + * contributes to their weighted stake during validator set selection. + * @param strategy The strategy to look up + * @return The multiplier weight + */ + function strategiesAndMultipliers( + IStrategy strategy + ) external view returns (uint96); + + /** + * @notice Updates multipliers for strategies already in the operator set + * @dev Does not add or remove strategies from EigenLayer; only updates multiplier weights + * used in the validator selection weighted stake formula + * @param _strategyMultipliers Array of strategy-multiplier pairs to update + */ + function setStrategiesAndMultipliers( + IRewardsCoordinatorTypes.StrategyAndMultiplier[] calldata _strategyMultipliers ) external; /** @@ -239,6 +333,15 @@ interface IDataHavenServiceManager is address newVersionUpdater ) external; + /** + * @notice Returns all strategies with their multipliers + * @return Array of StrategyAndMultiplier structs with strategy addresses and multiplier weights + */ + function getStrategiesAndMultipliers() + external + view + returns (IRewardsCoordinatorTypes.StrategyAndMultiplier[] memory); + // ============ Rewards Submitter Functions ============ /** diff --git a/contracts/src/libraries/DataHavenSnowbridgeMessages.sol b/contracts/src/libraries/DataHavenSnowbridgeMessages.sol index 3517eff1..e6ff132b 100644 --- a/contracts/src/libraries/DataHavenSnowbridgeMessages.sol +++ b/contracts/src/libraries/DataHavenSnowbridgeMessages.sol @@ -35,6 +35,8 @@ library DataHavenSnowbridgeMessages { struct NewValidatorSetPayload { /// @notice The list of validators in the DataHaven network. address[] validators; + /// @notice The external index (target era) for the validator set. + uint64 externalIndex; } /** @@ -48,8 +50,6 @@ library DataHavenSnowbridgeMessages { uint32 validatorsLen = uint32(payload.validators.length); address[] memory validatorSet = payload.validators; - uint64 externalIndex = uint64(0); - // Flatten the validator set into a single bytes array bytes memory validatorsFlattened; for (uint32 i = 0; i < validatorSet.length; i++) { @@ -63,7 +63,7 @@ library DataHavenSnowbridgeMessages { bytes1(uint8(OutboundCommandV1.ReceiveValidators)), ScaleCodec.encodeCompactU32(validatorsLen), validatorsFlattened, - ScaleCodec.encodeU64(externalIndex) + ScaleCodec.encodeU64(payload.externalIndex) ); } } diff --git a/contracts/storage-snapshots/DataHavenServiceManager.storage.json b/contracts/storage-snapshots/DataHavenServiceManager.storage.json index e4e29477..0921d956 100644 --- a/contracts/storage-snapshots/DataHavenServiceManager.storage.json +++ b/contracts/storage-snapshots/DataHavenServiceManager.storage.json @@ -41,7 +41,7 @@ "type": "t_array(t_uint256)49_storage" }, { - "astId": 23771, + "astId": 23775, "contract": "src/DataHavenServiceManager.sol:DataHavenServiceManager", "label": "rewardsInitiator", "offset": 0, @@ -49,7 +49,7 @@ "type": "t_address" }, { - "astId": 23776, + "astId": 23780, "contract": "src/DataHavenServiceManager.sol:DataHavenServiceManager", "label": "validatorsAllowlist", "offset": 0, @@ -57,7 +57,7 @@ "type": "t_mapping(t_address,t_bool)" }, { - "astId": 23780, + "astId": 23784, "contract": "src/DataHavenServiceManager.sol:DataHavenServiceManager", "label": "_snowbridgeGateway", "offset": 0, @@ -65,13 +65,37 @@ "type": "t_contract(IGatewayV2)23481" }, { - "astId": 23785, + "astId": 23789, "contract": "src/DataHavenServiceManager.sol:DataHavenServiceManager", "label": "validatorEthAddressToSolochainAddress", "offset": 0, "slot": "104", "type": "t_mapping(t_address,t_address)" }, + { + "astId": 23793, + "contract": "src/DataHavenServiceManager.sol:DataHavenServiceManager", + "label": "validatorSolochainAddressToEthAddress", + "offset": 0, + "slot": "105", + "type": "t_mapping(t_address,t_address)" + }, + { + "astId": 23796, + "contract": "src/DataHavenServiceManager.sol:DataHavenServiceManager", + "label": "validatorSetSubmitter", + "offset": 0, + "slot": "106", + "type": "t_address" + }, + { + "astId": 23802, + "contract": "src/DataHavenServiceManager.sol:DataHavenServiceManager", + "label": "strategiesAndMultipliers", + "offset": 0, + "slot": "107", + "type": "t_mapping(t_contract(IStrategy)7361,t_uint96)" + }, { "astId": 23788, "contract": "src/DataHavenServiceManager.sol:DataHavenServiceManager", @@ -93,8 +117,8 @@ "contract": "src/DataHavenServiceManager.sol:DataHavenServiceManager", "label": "__GAP", "offset": 0, - "slot": "107", - "type": "t_array(t_uint256)44_storage" + "slot": "105", + "type": "t_array(t_uint256)46_storage" } ], "types": { @@ -103,10 +127,10 @@ "label": "address", "numberOfBytes": "20" }, - "t_array(t_uint256)44_storage": { + "t_array(t_uint256)46_storage": { "encoding": "inplace", - "label": "uint256[44]", - "numberOfBytes": "1408", + "label": "uint256[46]", + "numberOfBytes": "1472", "base": "t_uint256" }, "t_array(t_uint256)49_storage": { @@ -131,6 +155,11 @@ "label": "contract IGatewayV2", "numberOfBytes": "20" }, + "t_contract(IStrategy)7361": { + "encoding": "inplace", + "label": "contract IStrategy", + "numberOfBytes": "20" + }, "t_mapping(t_address,t_address)": { "encoding": "mapping", "key": "t_address", @@ -145,11 +174,6 @@ "numberOfBytes": "32", "value": "t_bool" }, - "t_string_storage": { - "encoding": "bytes", - "label": "string", - "numberOfBytes": "32" - }, "t_uint256": { "encoding": "inplace", "label": "uint256", @@ -159,6 +183,11 @@ "encoding": "inplace", "label": "uint8", "numberOfBytes": "1" + }, + "t_uint96": { + "encoding": "inplace", + "label": "uint96", + "numberOfBytes": "12" } } } diff --git a/contracts/test/MessageEncoding.t.sol b/contracts/test/MessageEncoding.t.sol index 6b351835..d52fe108 100644 --- a/contracts/test/MessageEncoding.t.sol +++ b/contracts/test/MessageEncoding.t.sol @@ -15,7 +15,9 @@ contract MessageEncodingTest is Test { address[] memory mockValidators = TestUtils.generateMockValidatorsAddresses(3); DataHavenSnowbridgeMessages.NewValidatorSetPayload memory payload = - DataHavenSnowbridgeMessages.NewValidatorSetPayload({validators: mockValidators}); + DataHavenSnowbridgeMessages.NewValidatorSetPayload({ + validators: mockValidators, externalIndex: uint64(0) + }); bytes memory encodedMessage = DataHavenSnowbridgeMessages.scaleEncodeNewValidatorSetMessagePayload(payload); diff --git a/contracts/test/OperatorAddressMappings.t.sol b/contracts/test/OperatorAddressMappings.t.sol new file mode 100644 index 00000000..e49f9abd --- /dev/null +++ b/contracts/test/OperatorAddressMappings.t.sol @@ -0,0 +1,158 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.27; + +import {AVSDeployer} from "./utils/AVSDeployer.sol"; +import {DataHavenServiceManager} from "../src/DataHavenServiceManager.sol"; +import { + IAllocationManagerTypes +} from "eigenlayer-contracts/src/contracts/interfaces/IAllocationManager.sol"; +import {Test} from "forge-std/Test.sol"; + +contract OperatorAddressMappingsTest is AVSDeployer { + address public snowbridgeAgent = address(uint160(uint256(keccak256("snowbridgeAgent")))); + + address internal operator1 = address(uint160(uint256(keccak256("operator1")))); + address internal operator2 = address(uint160(uint256(keccak256("operator2")))); + + function setUp() public virtual { + _deployMockEigenLayerAndAVS(); + + // Configure the rewards initiator (not strictly needed for these tests, + // but keeps setup consistent with other suites). + vm.prank(avsOwner); + serviceManager.setRewardsInitiator(snowbridgeAgent); + } + + function _registerOperator( + address ethOperator, + address solochainOperator + ) internal { + vm.prank(avsOwner); + serviceManager.addValidatorToAllowlist(ethOperator); + + vm.prank(ethOperator); + delegationManager.registerAsOperator(address(0), 0, ""); + + uint32[] memory operatorSetIds = new uint32[](1); + operatorSetIds[0] = serviceManager.VALIDATORS_SET_ID(); + IAllocationManagerTypes.RegisterParams memory registerParams = + IAllocationManagerTypes.RegisterParams({ + avs: address(serviceManager), + operatorSetIds: operatorSetIds, + data: abi.encodePacked(solochainOperator) + }); + + vm.prank(ethOperator); + allocationManager.registerForOperatorSets(ethOperator, registerParams); + } + + function test_registerOperator_revertsIfSolochainAlreadyAssignedToDifferentOperator() public { + address sharedSolochain = address(0xBEEF); + + _registerOperator(operator1, sharedSolochain); + + // operator2 cannot claim the same solochain address + vm.prank(avsOwner); + serviceManager.addValidatorToAllowlist(operator2); + vm.prank(operator2); + delegationManager.registerAsOperator(address(0), 0, ""); + + uint32[] memory operatorSetIds = new uint32[](1); + operatorSetIds[0] = serviceManager.VALIDATORS_SET_ID(); + IAllocationManagerTypes.RegisterParams memory registerParams = + IAllocationManagerTypes.RegisterParams({ + avs: address(serviceManager), + operatorSetIds: operatorSetIds, + data: abi.encodePacked(sharedSolochain) + }); + + vm.prank(operator2); + vm.expectRevert(abi.encodeWithSignature("SolochainAddressAlreadyAssigned()")); + allocationManager.registerForOperatorSets(operator2, registerParams); + } + + function test_updateSolochainAddressForValidator_revertsIfAlreadyAssignedToDifferentOperator() + public + { + address solo1 = address(0xBEEF); + address solo2 = address(0xCAFE); + + _registerOperator(operator1, solo1); + _registerOperator(operator2, solo2); + + // operator2 cannot update to operator1's solochain address + vm.prank(operator2); + vm.expectRevert(abi.encodeWithSignature("SolochainAddressAlreadyAssigned()")); + serviceManager.updateSolochainAddressForValidator(solo1); + } + + function test_updateSolochainAddressForValidator_clearsOldReverseMapping() public { + address soloOld = address(0xBEEF); + address soloNew = address(0xCAFE); + + _registerOperator(operator1, soloOld); + + assertEq( + serviceManager.validatorEthAddressToSolochainAddress(operator1), + soloOld, + "forward mapping should be set" + ); + assertEq( + serviceManager.validatorSolochainAddressToEthAddress(soloOld), + operator1, + "reverse mapping should be set" + ); + + vm.prank(operator1); + serviceManager.updateSolochainAddressForValidator(soloNew); + + assertEq( + serviceManager.validatorEthAddressToSolochainAddress(operator1), + soloNew, + "forward mapping should update" + ); + assertEq( + serviceManager.validatorSolochainAddressToEthAddress(soloNew), + operator1, + "reverse mapping should update" + ); + assertEq( + serviceManager.validatorSolochainAddressToEthAddress(soloOld), + address(0), + "old reverse mapping should be cleared" + ); + } + + function test_registerOperator_replacesSolochainAndClearsOldReverseMapping() public { + address soloOld = address(0xBEEF); + address soloNew = address(0xCAFE); + + _registerOperator(operator1, soloOld); + + // simulate allocationManager registering operator1 again with a new solochain address + uint32[] memory operatorSetIds = new uint32[](1); + operatorSetIds[0] = serviceManager.VALIDATORS_SET_ID(); + + vm.prank(address(allocationManager)); + serviceManager.registerOperator( + operator1, address(serviceManager), operatorSetIds, abi.encodePacked(soloNew) + ); + + assertEq( + serviceManager.validatorEthAddressToSolochainAddress(operator1), + soloNew, + "forward mapping should update" + ); + assertEq( + serviceManager.validatorSolochainAddressToEthAddress(soloNew), + operator1, + "reverse mapping should update" + ); + assertEq( + serviceManager.validatorSolochainAddressToEthAddress(soloOld), + address(0), + "old reverse mapping should be cleared" + ); + } +} + diff --git a/contracts/test/RewardsSubmitter.t.sol b/contracts/test/RewardsSubmitter.t.sol index 705ca575..8364296a 100644 --- a/contracts/test/RewardsSubmitter.t.sol +++ b/contracts/test/RewardsSubmitter.t.sol @@ -6,8 +6,13 @@ pragma solidity ^0.8.13; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import { + IRewardsCoordinator, IRewardsCoordinatorTypes } from "eigenlayer-contracts/src/contracts/interfaces/IRewardsCoordinator.sol"; +import { + IAllocationManagerTypes +} from "eigenlayer-contracts/src/contracts/interfaces/IAllocationManager.sol"; +import {OperatorSet} from "eigenlayer-contracts/src/contracts/libraries/OperatorSetLib.sol"; import {AVSDeployer} from "./utils/AVSDeployer.sol"; import {ERC20FixedSupply} from "./utils/ERC20FixedSupply.sol"; @@ -41,6 +46,30 @@ contract RewardsSubmitterTest is AVSDeployer { IERC20(address(rewardToken)).safeTransfer(address(serviceManager), 100000e18); } + function _registerOperator( + address ethOperator, + address solochainOperator + ) internal { + // Allow our operator to register + vm.prank(avsOwner); + serviceManager.addValidatorToAllowlist(ethOperator); + + vm.prank(ethOperator); + delegationManager.registerAsOperator(address(0), 0, ""); + + uint32[] memory operatorSetIds = new uint32[](1); + operatorSetIds[0] = serviceManager.VALIDATORS_SET_ID(); + IAllocationManagerTypes.RegisterParams memory registerParams = + IAllocationManagerTypes.RegisterParams({ + avs: address(serviceManager), + operatorSetIds: operatorSetIds, + data: abi.encodePacked(solochainOperator) + }); + + vm.prank(ethOperator); + allocationManager.registerForOperatorSets(ethOperator, registerParams); + } + // Helper function to build a submission function _buildSubmission( uint256 rewardAmount, @@ -91,6 +120,7 @@ contract RewardsSubmitterTest is AVSDeployer { // ============ Access Control Tests ============ function test_submitRewards_revertsIfNotRewardsInitiator() public { + _registerOperator(operator1, operator1); IRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission memory submission = _buildSubmission(1000e18, operator1); @@ -102,6 +132,7 @@ contract RewardsSubmitterTest is AVSDeployer { // ============ Success Tests ============ function test_submitRewards_singleOperator() public { + _registerOperator(operator1, operator1); uint256 rewardAmount = 1000e18; IRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission memory submission = _buildSubmission(rewardAmount, operator1); @@ -116,6 +147,9 @@ contract RewardsSubmitterTest is AVSDeployer { } function test_submitRewards_multipleOperators() public { + _registerOperator(operator1, operator1); + _registerOperator(operator2, operator2); + // Build strategies IRewardsCoordinatorTypes.StrategyAndMultiplier[] memory strategiesAndMultipliers = new IRewardsCoordinatorTypes.StrategyAndMultiplier[](deployedStrategies.length); @@ -126,8 +160,8 @@ contract RewardsSubmitterTest is AVSDeployer { } // Ensure operators are sorted in ascending order (required by EigenLayer) - address opLow = address(0x1); - address opHigh = address(0x2); + (address opLow, address opHigh) = + operator1 < operator2 ? (operator1, operator2) : (operator2, operator1); uint256 amount1 = 600e18; uint256 amount2 = 400e18; @@ -160,6 +194,7 @@ contract RewardsSubmitterTest is AVSDeployer { } function test_submitRewards_multipleSubmissions() public { + _registerOperator(operator1, operator1); uint32 duration = TEST_CALCULATION_INTERVAL; // Submit for period 0 @@ -188,6 +223,7 @@ contract RewardsSubmitterTest is AVSDeployer { } function test_submitRewards_withCustomDescription() public { + _registerOperator(operator1, operator1); // Build submission with custom description IRewardsCoordinatorTypes.StrategyAndMultiplier[] memory strategiesAndMultipliers = new IRewardsCoordinatorTypes.StrategyAndMultiplier[](1); @@ -217,6 +253,7 @@ contract RewardsSubmitterTest is AVSDeployer { } function test_submitRewards_withDifferentToken() public { + _registerOperator(operator1, operator1); // Deploy a different token ERC20FixedSupply otherToken = new ERC20FixedSupply("Other", "OTHER", 1000000e18, address(this)); @@ -251,4 +288,153 @@ contract RewardsSubmitterTest is AVSDeployer { emit IDataHavenServiceManagerEvents.RewardsSubmitted(500e18, 1); serviceManager.submitRewards(submission); } + + function test_submitRewards_translatesSolochainOperatorToEthOperator() public { + address solochainOperator = address(0xBEEF); + _registerOperator(operator1, solochainOperator); + assertEq( + serviceManager.validatorEthAddressToSolochainAddress(operator1), + solochainOperator, + "forward mapping should be set" + ); + assertEq( + serviceManager.validatorSolochainAddressToEthAddress(solochainOperator), + operator1, + "reverse mapping should be set" + ); + + uint256 rewardAmount = 1000e18; + IRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission memory submission = + _buildSubmission(rewardAmount, solochainOperator); + + // Warp to a time after the period ends + vm.warp(submission.startTimestamp + submission.duration + 1); + + IRewardsCoordinatorTypes.OperatorReward[] memory expectedOperatorRewards = + new IRewardsCoordinatorTypes.OperatorReward[](1); + expectedOperatorRewards[0] = + IRewardsCoordinatorTypes.OperatorReward({operator: operator1, amount: rewardAmount}); + + IRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission memory expectedSubmission = + IRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission({ + strategiesAndMultipliers: submission.strategiesAndMultipliers, + token: submission.token, + operatorRewards: expectedOperatorRewards, + startTimestamp: submission.startTimestamp, + duration: submission.duration, + description: submission.description + }); + + IRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission[] memory submissions = + new IRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission[](1); + submissions[0] = expectedSubmission; + + OperatorSet memory operatorSet = + OperatorSet({avs: address(serviceManager), id: serviceManager.VALIDATORS_SET_ID()}); + vm.expectCall( + address(rewardsCoordinator), + abi.encodeCall( + IRewardsCoordinator.createOperatorDirectedOperatorSetRewardsSubmission, + (operatorSet, submissions) + ) + ); + + assertEq( + submission.operatorRewards[0].operator, + solochainOperator, + "submission should use solochain operator" + ); + vm.prank(snowbridgeAgent); + serviceManager.submitRewards(submission); + } + + function test_submitRewards_revertsIfUnknownSolochainAddress() public { + address unknownSolochainOperator = address(0xDEAD); + IRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission memory submission = + _buildSubmission(1000e18, unknownSolochainOperator); + + vm.prank(snowbridgeAgent); + vm.expectRevert(abi.encodeWithSignature("UnknownSolochainAddress()")); + serviceManager.submitRewards(submission); + } + + function test_submitRewards_sortsTranslatedOperatorsByAddress() public { + (address ethLow, address ethHigh) = + operator1 < operator2 ? (operator1, operator2) : (operator2, operator1); + + address solochainLow = address(0x1000); + address solochainHigh = address(0x2000); + + _registerOperator(ethLow, solochainHigh); + _registerOperator(ethHigh, solochainLow); + + IRewardsCoordinatorTypes.StrategyAndMultiplier[] memory strategiesAndMultipliers = + new IRewardsCoordinatorTypes.StrategyAndMultiplier[](deployedStrategies.length); + for (uint256 i = 0; i < deployedStrategies.length; i++) { + strategiesAndMultipliers[i] = IRewardsCoordinatorTypes.StrategyAndMultiplier({ + strategy: deployedStrategies[i], multiplier: uint96((i + 1) * 1e18) + }); + } + + uint256 amountForEthLow = 600e18; + uint256 amountForEthHigh = 400e18; + uint256 totalAmount = amountForEthLow + amountForEthHigh; + + IRewardsCoordinatorTypes.OperatorReward[] memory inputOperatorRewards = + new IRewardsCoordinatorTypes.OperatorReward[](2); + inputOperatorRewards[0] = IRewardsCoordinatorTypes.OperatorReward({ + operator: solochainLow, amount: amountForEthHigh + }); + inputOperatorRewards[1] = IRewardsCoordinatorTypes.OperatorReward({ + operator: solochainHigh, amount: amountForEthLow + }); + + IRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission memory submission = + IRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission({ + strategiesAndMultipliers: strategiesAndMultipliers, + token: IERC20(address(rewardToken)), + operatorRewards: inputOperatorRewards, + startTimestamp: GENESIS_REWARDS_TIMESTAMP, + duration: TEST_CALCULATION_INTERVAL, + description: "DataHaven rewards" + }); + + vm.warp(submission.startTimestamp + submission.duration + 1); + + IRewardsCoordinatorTypes.OperatorReward[] memory expectedOperatorRewards = + new IRewardsCoordinatorTypes.OperatorReward[](2); + expectedOperatorRewards[0] = + IRewardsCoordinatorTypes.OperatorReward({operator: ethLow, amount: amountForEthLow}); + expectedOperatorRewards[1] = + IRewardsCoordinatorTypes.OperatorReward({operator: ethHigh, amount: amountForEthHigh}); + + IRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission memory expectedSubmission = + IRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission({ + strategiesAndMultipliers: strategiesAndMultipliers, + token: submission.token, + operatorRewards: expectedOperatorRewards, + startTimestamp: submission.startTimestamp, + duration: submission.duration, + description: submission.description + }); + + IRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission[] memory submissions = + new IRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission[](1); + submissions[0] = expectedSubmission; + + OperatorSet memory operatorSet = + OperatorSet({avs: address(serviceManager), id: serviceManager.VALIDATORS_SET_ID()}); + vm.expectCall( + address(rewardsCoordinator), + abi.encodeCall( + IRewardsCoordinator.createOperatorDirectedOperatorSetRewardsSubmission, + (operatorSet, submissions) + ) + ); + + vm.prank(snowbridgeAgent); + vm.expectEmit(false, false, false, true); + emit IDataHavenServiceManagerEvents.RewardsSubmitted(totalAmount, 2); + serviceManager.submitRewards(submission); + } } diff --git a/contracts/test/Slashing.t.sol b/contracts/test/Slashing.t.sol index 3e7c399e..8cac549a 100644 --- a/contracts/test/Slashing.t.sol +++ b/contracts/test/Slashing.t.sol @@ -26,6 +26,8 @@ contract SlashingTest is AVSDeployer { } function test_fulfilSlashingRequest() public { + address solochainOperator = address(0xBEEF); + // Allow our operator to register vm.prank(avsOwner); serviceManager.addValidatorToAllowlist(operator); @@ -43,7 +45,7 @@ contract SlashingTest is AVSDeployer { IAllocationManagerTypes.RegisterParams({ avs: address(serviceManager), operatorSetIds: operatorSetIds, - data: abi.encodePacked(address(operator)) + data: abi.encodePacked(solochainOperator) }); vm.prank(operator); @@ -61,7 +63,7 @@ contract SlashingTest is AVSDeployer { IStrategy[] memory strategies = allocationManager.getStrategiesInOperatorSet(operatorSet); slashings[0] = IDataHavenServiceManager.SlashingRequest( - operator, strategies, wadsToSlash, "Testing slashing" + solochainOperator, strategies, wadsToSlash, "Testing slashing" ); console.log(block.number); @@ -83,6 +85,8 @@ contract SlashingTest is AVSDeployer { } function test_fulfilSlashingRequestForOnlyOneStrategy() public { + address solochainOperator = address(0xBEEF); + // Allow our operator to register vm.prank(avsOwner); serviceManager.addValidatorToAllowlist(operator); @@ -100,7 +104,7 @@ contract SlashingTest is AVSDeployer { IAllocationManagerTypes.RegisterParams({ avs: address(serviceManager), operatorSetIds: operatorSetIds, - data: abi.encodePacked(address(operator)) + data: abi.encodePacked(solochainOperator) }); vm.prank(operator); @@ -119,7 +123,7 @@ contract SlashingTest is AVSDeployer { strategiesToSlash[0] = strategies[0]; slashings[0] = IDataHavenServiceManager.SlashingRequest( - operator, strategiesToSlash, wadsToSlash, "Testing slashing" + solochainOperator, strategiesToSlash, wadsToSlash, "Testing slashing" ); console.log(block.number); @@ -139,4 +143,24 @@ contract SlashingTest is AVSDeployer { emit IDataHavenServiceManagerEvents.SlashingComplete(); serviceManager.slashValidatorsOperator(slashings); } + + function test_fulfilSlashingRequest_revertsIfUnknownSolochainAddress() public { + // Configure the rewards initiator (because only the reward agent can submit slashing request) + vm.prank(avsOwner); + serviceManager.setRewardsInitiator(snowbridgeAgent); + + address unknownSolochainOperator = address(0xDEAD); + DataHavenServiceManager.SlashingRequest[] memory slashings = + new DataHavenServiceManager.SlashingRequest[](1); + slashings[0] = IDataHavenServiceManager.SlashingRequest( + unknownSolochainOperator, + new IStrategy[](0), + new uint256[](0), + "Testing unknown solochain operator" + ); + + vm.prank(snowbridgeAgent); + vm.expectRevert(abi.encodeWithSignature("UnknownSolochainAddress()")); + serviceManager.slashValidatorsOperator(slashings); + } } diff --git a/contracts/test/SnowbridgeIntegration.t.sol b/contracts/test/SnowbridgeIntegration.t.sol index d86bce53..f967553c 100644 --- a/contracts/test/SnowbridgeIntegration.t.sol +++ b/contracts/test/SnowbridgeIntegration.t.sol @@ -10,8 +10,13 @@ import {OperatorSet} from "eigenlayer-contracts/src/contracts/libraries/Operator import {SnowbridgeAndAVSDeployer} from "./utils/SnowbridgeAndAVSDeployer.sol"; contract SnowbridgeIntegrationTest is SnowbridgeAndAVSDeployer { + address public submitter = address(uint160(uint256(keccak256("submitter")))); + function setUp() public { _deployMockAllContracts(); + // Set up the validator set submitter + vm.prank(avsOwner); + serviceManager.setValidatorSetSubmitter(submitter); } function beforeTestSetup( @@ -19,7 +24,8 @@ contract SnowbridgeIntegrationTest is SnowbridgeAndAVSDeployer { ) public pure returns (bytes[] memory beforeTestCalldata) { if (testSelector == this.test_sendNewValidatorsSetMessage.selector) { beforeTestCalldata = new bytes[](1); - beforeTestCalldata[0] = abi.encodeWithSelector(this.setupValidatorsAsOperators.selector); + beforeTestCalldata[0] = + abi.encodeWithSelector(this.setupValidatorsAsOperatorsWithAllocations.selector); } } @@ -36,11 +42,13 @@ contract SnowbridgeIntegrationTest is SnowbridgeAndAVSDeployer { ); } - // Mock balance for the AVS owner - vm.deal(avsOwner, 1000000 ether); + uint64 targetEra = 42; + + // Mock balance for the submitter + vm.deal(submitter, 1000000 ether); // Send the new validator set message to the Snowbridge Gateway - bytes memory message = serviceManager.buildNewValidatorSetMessage(); + bytes memory message = serviceManager.buildNewValidatorSetMessageForEra(targetEra); Payload memory payload = Payload({ origin: address(serviceManager), assets: new Asset[](0), @@ -52,7 +60,7 @@ contract SnowbridgeIntegrationTest is SnowbridgeAndAVSDeployer { }); cheats.expectEmit(); emit IGatewayV2.OutboundMessageAccepted(1, payload); - cheats.prank(avsOwner); - serviceManager.sendNewValidatorSet{value: 2 ether}(1 ether, 1 ether); + cheats.prank(submitter); + serviceManager.sendNewValidatorSetForEra{value: 2 ether}(targetEra, 1 ether, 1 ether); } } diff --git a/contracts/test/ValidatorSetSelection.t.sol b/contracts/test/ValidatorSetSelection.t.sol new file mode 100644 index 00000000..d58be58c --- /dev/null +++ b/contracts/test/ValidatorSetSelection.t.sol @@ -0,0 +1,568 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.27; + +/* solhint-disable func-name-mixedcase */ + +import {SnowbridgeAndAVSDeployer} from "./utils/SnowbridgeAndAVSDeployer.sol"; +import {DataHavenSnowbridgeMessages} from "../src/libraries/DataHavenSnowbridgeMessages.sol"; +import {IDataHavenServiceManagerErrors} from "../src/interfaces/IDataHavenServiceManager.sol"; +import {IStrategy} from "eigenlayer-contracts/src/contracts/interfaces/IStrategy.sol"; +import { + IRewardsCoordinatorTypes +} from "eigenlayer-contracts/src/contracts/interfaces/IRewardsCoordinator.sol"; +import { + IAllocationManagerTypes +} from "eigenlayer-contracts/src/contracts/interfaces/IAllocationManager.sol"; +import {OperatorSet} from "eigenlayer-contracts/src/contracts/libraries/OperatorSetLib.sol"; +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; + +contract ValidatorSetSelectionTest is SnowbridgeAndAVSDeployer { + function setUp() public { + _deployMockAllContracts(); + } + + // ============ Helpers ============ + + function _getStrategies() internal view returns (IStrategy[] memory) { + IStrategy[] memory strategies = new IStrategy[](deployedStrategies.length); + for (uint256 i = 0; i < deployedStrategies.length; i++) { + strategies[i] = deployedStrategies[i]; + } + return strategies; + } + + function _setupMultipliers( + uint96[] memory multipliers + ) internal { + IStrategy[] memory strategies = _getStrategies(); + + IRewardsCoordinatorTypes.StrategyAndMultiplier[] memory sm = + new IRewardsCoordinatorTypes.StrategyAndMultiplier[](strategies.length); + for (uint256 i = 0; i < strategies.length; i++) { + sm[i] = IRewardsCoordinatorTypes.StrategyAndMultiplier({ + strategy: strategies[i], multiplier: multipliers[i] + }); + } + + cheats.startPrank(avsOwner); + serviceManager.removeStrategiesFromValidatorsSupportedStrategies(strategies); + serviceManager.addStrategiesToValidatorsSupportedStrategies(sm); + cheats.stopPrank(); + } + + function _uniformMultipliers() internal pure returns (uint96[] memory) { + uint96[] memory m = new uint96[](3); + m[0] = 1; + m[1] = 1; + m[2] = 1; + return m; + } + + function _registerOperator( + address op, + address solochainAddr, + uint256[] memory stakeAmounts + ) internal { + cheats.prank(avsOwner); + serviceManager.addValidatorToAllowlist(op); + + cheats.startPrank(op); + for (uint256 j = 0; j < deployedStrategies.length; j++) { + IERC20 linkedToken = deployedStrategies[j].underlyingToken(); + _setERC20Balance(address(linkedToken), op, stakeAmounts[j]); + linkedToken.approve(address(strategyManager), stakeAmounts[j]); + strategyManager.depositIntoStrategy(deployedStrategies[j], linkedToken, stakeAmounts[j]); + } + delegationManager.registerAsOperator(address(0), 0, ""); + + uint32[] memory operatorSetIds = new uint32[](1); + operatorSetIds[0] = serviceManager.VALIDATORS_SET_ID(); + IAllocationManagerTypes.RegisterParams memory registerParams = + IAllocationManagerTypes.RegisterParams({ + avs: address(serviceManager), + operatorSetIds: operatorSetIds, + data: abi.encodePacked(solochainAddr) + }); + allocationManager.registerForOperatorSets(op, registerParams); + cheats.stopPrank(); + } + + function _uniformStakes( + uint256 amount + ) internal view returns (uint256[] memory) { + uint256[] memory stakes = new uint256[](deployedStrategies.length); + for (uint256 j = 0; j < stakes.length; j++) { + stakes[j] = amount; + } + return stakes; + } + + function _allocateForOperator( + address op + ) internal { + IStrategy[] memory strategies = _getStrategies(); + uint64[] memory newMagnitudes = new uint64[](strategies.length); + for (uint256 j = 0; j < strategies.length; j++) { + newMagnitudes[j] = 1e18; + } + + IAllocationManagerTypes.AllocateParams[] memory allocParams = + new IAllocationManagerTypes.AllocateParams[](1); + allocParams[0] = IAllocationManagerTypes.AllocateParams({ + operatorSet: OperatorSet({ + avs: address(serviceManager), id: serviceManager.VALIDATORS_SET_ID() + }), + strategies: strategies, + newMagnitudes: newMagnitudes + }); + + cheats.prank(op); + allocationManager.modifyAllocations(op, allocParams); + } + + function _advancePastAllocationConfigDelay() internal { + uint32 delay = allocationManager.ALLOCATION_CONFIGURATION_DELAY(); + cheats.roll(block.number + delay + 1); + } + + function _advancePastAllocationEffect() internal { + cheats.roll(block.number + 1); + } + + function _buildExpectedMessage( + address[] memory validators, + uint64 externalIndex + ) internal pure returns (bytes memory) { + return DataHavenSnowbridgeMessages.scaleEncodeNewValidatorSetMessagePayload( + DataHavenSnowbridgeMessages.NewValidatorSetPayload({ + validators: validators, externalIndex: externalIndex + }) + ); + } + + // ============ Admin Function Tests ============ + + // Test #7: Add strategy + multiplier in one call; verify both stored + function test_addStrategies_setsMultiplierAtomically() public { + IStrategy[] memory strategies = _getStrategies(); + + IRewardsCoordinatorTypes.StrategyAndMultiplier[] memory sm = + new IRewardsCoordinatorTypes.StrategyAndMultiplier[](3); + sm[0] = IRewardsCoordinatorTypes.StrategyAndMultiplier({ + strategy: strategies[0], multiplier: 5000 + }); + sm[1] = IRewardsCoordinatorTypes.StrategyAndMultiplier({ + strategy: strategies[1], multiplier: 10000 + }); + sm[2] = IRewardsCoordinatorTypes.StrategyAndMultiplier({ + strategy: strategies[2], multiplier: 2000 + }); + + cheats.startPrank(avsOwner); + serviceManager.removeStrategiesFromValidatorsSupportedStrategies(strategies); + serviceManager.addStrategiesToValidatorsSupportedStrategies(sm); + cheats.stopPrank(); + + assertEq(serviceManager.strategiesAndMultipliers(strategies[0]), 5000); + assertEq(serviceManager.strategiesAndMultipliers(strategies[1]), 10000); + assertEq(serviceManager.strategiesAndMultipliers(strategies[2]), 2000); + } + + // Test #9: Remove strategy → multiplier and tracking bool deleted + function test_removeStrategies_cleansUpMultiplier() public { + IStrategy[] memory strategies = _getStrategies(); + + IRewardsCoordinatorTypes.StrategyAndMultiplier[] memory sm = + new IRewardsCoordinatorTypes.StrategyAndMultiplier[](3); + sm[0] = IRewardsCoordinatorTypes.StrategyAndMultiplier({ + strategy: strategies[0], multiplier: 5000 + }); + sm[1] = IRewardsCoordinatorTypes.StrategyAndMultiplier({ + strategy: strategies[1], multiplier: 10000 + }); + sm[2] = IRewardsCoordinatorTypes.StrategyAndMultiplier({ + strategy: strategies[2], multiplier: 2000 + }); + + cheats.startPrank(avsOwner); + serviceManager.removeStrategiesFromValidatorsSupportedStrategies(strategies); + serviceManager.addStrategiesToValidatorsSupportedStrategies(sm); + + assertEq(serviceManager.strategiesAndMultipliers(strategies[1]), 10000); + + serviceManager.removeStrategiesFromValidatorsSupportedStrategies(strategies); + cheats.stopPrank(); + + assertEq(serviceManager.strategiesAndMultipliers(strategies[0]), 0); + assertEq(serviceManager.strategiesAndMultipliers(strategies[1]), 0); + assertEq(serviceManager.strategiesAndMultipliers(strategies[2]), 0); + } + + // Test #11: Returns correct StrategyAndMultiplier structs + function test_getStrategiesAndMultipliers_returnsCorrect() public { + IStrategy[] memory strategies = _getStrategies(); + + IRewardsCoordinatorTypes.StrategyAndMultiplier[] memory sm = + new IRewardsCoordinatorTypes.StrategyAndMultiplier[](3); + sm[0] = IRewardsCoordinatorTypes.StrategyAndMultiplier({ + strategy: strategies[0], multiplier: 5000 + }); + sm[1] = IRewardsCoordinatorTypes.StrategyAndMultiplier({ + strategy: strategies[1], multiplier: 10000 + }); + sm[2] = IRewardsCoordinatorTypes.StrategyAndMultiplier({ + strategy: strategies[2], multiplier: 2000 + }); + + cheats.startPrank(avsOwner); + serviceManager.removeStrategiesFromValidatorsSupportedStrategies(strategies); + serviceManager.addStrategiesToValidatorsSupportedStrategies(sm); + cheats.stopPrank(); + + IRewardsCoordinatorTypes.StrategyAndMultiplier[] memory result = + serviceManager.getStrategiesAndMultipliers(); + + assertEq(result.length, 3); + for (uint256 i = 0; i < result.length; i++) { + uint96 expectedMultiplier = serviceManager.strategiesAndMultipliers(result[i].strategy); + assertEq(result[i].multiplier, expectedMultiplier); + } + } + + // Test: setStrategiesAndMultipliers updates existing multipliers + function test_setStrategiesAndMultipliers_updatesMultipliers() public { + IStrategy[] memory strategies = _getStrategies(); + + // Set initial multipliers via _setupMultipliers + uint96[] memory initial = new uint96[](3); + initial[0] = 5000; + initial[1] = 10000; + initial[2] = 2000; + _setupMultipliers(initial); + + // Update multipliers + IRewardsCoordinatorTypes.StrategyAndMultiplier[] memory updated = + new IRewardsCoordinatorTypes.StrategyAndMultiplier[](3); + updated[0] = IRewardsCoordinatorTypes.StrategyAndMultiplier({ + strategy: strategies[0], multiplier: 1 + }); + updated[1] = IRewardsCoordinatorTypes.StrategyAndMultiplier({ + strategy: strategies[1], multiplier: 1 + }); + updated[2] = IRewardsCoordinatorTypes.StrategyAndMultiplier({ + strategy: strategies[2], multiplier: 9999 + }); + + cheats.prank(avsOwner); + serviceManager.setStrategiesAndMultipliers(updated); + + assertEq(serviceManager.strategiesAndMultipliers(strategies[0]), 1); + assertEq(serviceManager.strategiesAndMultipliers(strategies[1]), 1); + assertEq(serviceManager.strategiesAndMultipliers(strategies[2]), 9999); + } + + // Test: setStrategiesAndMultipliers changes validator ranking + function test_setStrategiesAndMultipliers_affectsRanking() public { + uint96[] memory mults = new uint96[](3); + mults[0] = 10000; + mults[1] = 1; + mults[2] = 1; + _setupMultipliers(mults); + + // Op A: heavy in strategy 0 (high multiplier) → initially ranked first + address opA = vm.addr(801); + address solochainA = address(uint160(0x6001)); + uint256[] memory stakesA = new uint256[](3); + stakesA[0] = 1000 ether; + stakesA[1] = 10 ether; + stakesA[2] = 10 ether; + _registerOperator(opA, solochainA, stakesA); + + // Op B: heavy in strategy 1 (low multiplier) → initially ranked second + address opB = vm.addr(802); + address solochainB = address(uint160(0x6002)); + uint256[] memory stakesB = new uint256[](3); + stakesB[0] = 10 ether; + stakesB[1] = 1000 ether; + stakesB[2] = 10 ether; + _registerOperator(opB, solochainB, stakesB); + + _advancePastAllocationConfigDelay(); + _allocateForOperator(opA); + _allocateForOperator(opB); + _advancePastAllocationEffect(); + + // Before update: A ranks first (strategy 0 has multiplier 10_000) + address[] memory expectedBefore = new address[](2); + expectedBefore[0] = solochainA; + expectedBefore[1] = solochainB; + assertEq( + serviceManager.buildNewValidatorSetMessageForEra(0), + _buildExpectedMessage(expectedBefore, 0) + ); + + // Flip multipliers: strategy 1 now has high multiplier + IStrategy[] memory strategies = _getStrategies(); + IRewardsCoordinatorTypes.StrategyAndMultiplier[] memory flipped = + new IRewardsCoordinatorTypes.StrategyAndMultiplier[](3); + flipped[0] = IRewardsCoordinatorTypes.StrategyAndMultiplier({ + strategy: strategies[0], multiplier: 1 + }); + flipped[1] = IRewardsCoordinatorTypes.StrategyAndMultiplier({ + strategy: strategies[1], multiplier: 10000 + }); + flipped[2] = IRewardsCoordinatorTypes.StrategyAndMultiplier({ + strategy: strategies[2], multiplier: 1 + }); + + cheats.prank(avsOwner); + serviceManager.setStrategiesAndMultipliers(flipped); + + // After update: B ranks first (strategy 1 now has multiplier 10_000) + address[] memory expectedAfter = new address[](2); + expectedAfter[0] = solochainB; + expectedAfter[1] = solochainA; + assertEq( + serviceManager.buildNewValidatorSetMessageForEra(0), + _buildExpectedMessage(expectedAfter, 0) + ); + } + + // ============ Selection Tests ============ + + // Test #1: 3 strategies with different multipliers; verify correct ordering + function test_weightedStake_multipleStrategies() public { + uint96[] memory mults = new uint96[](3); + mults[0] = 5000; + mults[1] = 10000; + mults[2] = 2000; + _setupMultipliers(mults); + + // Op A: heavy in strategy 0 (multiplier 5000) + address opA = vm.addr(101); + address solochainA = address(uint160(0xA01)); + uint256[] memory stakesA = new uint256[](3); + stakesA[0] = 1000 ether; + stakesA[1] = 100 ether; + stakesA[2] = 100 ether; + _registerOperator(opA, solochainA, stakesA); + + // Op B: heavy in strategy 1 (multiplier 10000) → highest weighted stake + address opB = vm.addr(102); + address solochainB = address(uint160(0xB01)); + uint256[] memory stakesB = new uint256[](3); + stakesB[0] = 100 ether; + stakesB[1] = 1000 ether; + stakesB[2] = 100 ether; + _registerOperator(opB, solochainB, stakesB); + + // Op C: heavy in strategy 2 (multiplier 2000) → lowest weighted stake + address opC = vm.addr(103); + address solochainC = address(uint160(0xC01)); + uint256[] memory stakesC = new uint256[](3); + stakesC[0] = 100 ether; + stakesC[1] = 100 ether; + stakesC[2] = 1000 ether; + _registerOperator(opC, solochainC, stakesC); + + _advancePastAllocationConfigDelay(); + + _allocateForOperator(opA); + _allocateForOperator(opB); + _allocateForOperator(opC); + + _advancePastAllocationEffect(); + + // Expected order: B (highest multiplied strategy), A, C + address[] memory expected = new address[](3); + expected[0] = solochainB; + expected[1] = solochainA; + expected[2] = solochainC; + + assertEq( + serviceManager.buildNewValidatorSetMessageForEra(0), _buildExpectedMessage(expected, 0) + ); + } + + // Test #2: 2 operators with identical weighted stake; lower Eth address ranks first + function test_tieBreak_lowerAddressWins() public { + _setupMultipliers(_uniformMultipliers()); + + address addrA = vm.addr(201); + address addrB = vm.addr(202); + + // Ensure addrLow < addrHigh + address addrLow = addrA < addrB ? addrA : addrB; + address addrHigh = addrA < addrB ? addrB : addrA; + + address solochainLow = address(uint160(0xBB)); + address solochainHigh = address(uint160(0xAA)); + + _registerOperator(addrLow, solochainLow, _uniformStakes(500 ether)); + _registerOperator(addrHigh, solochainHigh, _uniformStakes(500 ether)); + + _advancePastAllocationConfigDelay(); + + _allocateForOperator(addrLow); + _allocateForOperator(addrHigh); + + _advancePastAllocationEffect(); + + // Lower Eth address wins tie-break + address[] memory expected = new address[](2); + expected[0] = solochainLow; + expected[1] = solochainHigh; + + assertEq( + serviceManager.buildNewValidatorSetMessageForEra(0), _buildExpectedMessage(expected, 0) + ); + } + + // Test #3: Register 35 operators; verify only top 32 selected + function test_topN_moreThan32() public { + _setupMultipliers(_uniformMultipliers()); + + uint256 totalOps = 35; + address[] memory operators = new address[](totalOps); + address[] memory solochainAddrs = new address[](totalOps); + + for (uint256 i = 0; i < totalOps; i++) { + operators[i] = vm.addr(300 + i); + solochainAddrs[i] = address(uint160(0x1000 + i)); + _registerOperator(operators[i], solochainAddrs[i], _uniformStakes((i + 1) * 10 ether)); + } + + _advancePastAllocationConfigDelay(); + + for (uint256 i = 0; i < totalOps; i++) { + _allocateForOperator(operators[i]); + } + + _advancePastAllocationEffect(); + + bytes memory message = serviceManager.buildNewValidatorSetMessageForEra(0); + + // Top 32 by descending stake: operators at indices 34, 33, ..., 3 + address[] memory expected = new address[](32); + for (uint256 i = 0; i < 32; i++) { + expected[i] = solochainAddrs[totalOps - 1 - i]; + } + + assertEq(message, _buildExpectedMessage(expected, 0)); + } + + // Test #4: 5 operators; all included in output + function test_lessThan32_includesAll() public { + _setupMultipliers(_uniformMultipliers()); + + uint256 totalOps = 5; + address[] memory operators = new address[](totalOps); + address[] memory solochainAddrs = new address[](totalOps); + + for (uint256 i = 0; i < totalOps; i++) { + operators[i] = vm.addr(400 + i); + solochainAddrs[i] = address(uint160(0x2000 + i)); + _registerOperator(operators[i], solochainAddrs[i], _uniformStakes((i + 1) * 100 ether)); + } + + _advancePastAllocationConfigDelay(); + + for (uint256 i = 0; i < totalOps; i++) { + _allocateForOperator(operators[i]); + } + + _advancePastAllocationEffect(); + + // All 5 included, sorted by descending stake + address[] memory expected = new address[](5); + for (uint256 i = 0; i < 5; i++) { + expected[i] = solochainAddrs[totalOps - 1 - i]; + } + + assertEq( + serviceManager.buildNewValidatorSetMessageForEra(0), _buildExpectedMessage(expected, 0) + ); + } + + // Test #5: Operator with zero allocation excluded + function test_zeroWeightedStake_filtered() public { + _setupMultipliers(_uniformMultipliers()); + + address op1 = vm.addr(501); + address solochain1 = address(uint160(0x3001)); + _registerOperator(op1, solochain1, _uniformStakes(100 ether)); + + address op2 = vm.addr(502); + address solochain2 = address(uint160(0x3002)); + _registerOperator(op2, solochain2, _uniformStakes(200 ether)); + + // op3 registered but NOT allocated → zero weighted stake + address op3 = vm.addr(503); + address solochain3 = address(uint160(0x3003)); + _registerOperator(op3, solochain3, _uniformStakes(300 ether)); + + _advancePastAllocationConfigDelay(); + + // Only allocate for op1 and op2 + _allocateForOperator(op1); + _allocateForOperator(op2); + + _advancePastAllocationEffect(); + + // op3 should be filtered out + address[] memory expected = new address[](2); + expected[0] = solochain2; + expected[1] = solochain1; + + assertEq( + serviceManager.buildNewValidatorSetMessageForEra(0), _buildExpectedMessage(expected, 0) + ); + } + + // Test #6: A zero multiplier is accepted and causes that strategy's stake to contribute + // no weight. The operator is still included if other strategies have non-zero multipliers. + function test_zeroMultiplier_accepted_contributesNoWeight() public { + IStrategy[] memory strategies = _getStrategies(); + + // Zero-out the first strategy's multiplier via setStrategiesAndMultipliers + IRewardsCoordinatorTypes.StrategyAndMultiplier[] memory sm = + new IRewardsCoordinatorTypes.StrategyAndMultiplier[](1); + sm[0] = IRewardsCoordinatorTypes.StrategyAndMultiplier({ + strategy: strategies[0], multiplier: 0 + }); + + cheats.prank(avsOwner); + serviceManager.setStrategiesAndMultipliers(sm); + + assertEq(serviceManager.strategiesAndMultipliers(strategies[0]), 0); + } + + // Test #12: Full integration — weighted selection + correct message encoding + function test_buildMessage_encodesCorrectly() public { + _setupMultipliers(_uniformMultipliers()); + + address op1 = vm.addr(701); + address solochain1 = address(uint160(0x5001)); + _registerOperator(op1, solochain1, _uniformStakes(500 ether)); + + address op2 = vm.addr(702); + address solochain2 = address(uint160(0x5002)); + _registerOperator(op2, solochain2, _uniformStakes(1000 ether)); + + _advancePastAllocationConfigDelay(); + + _allocateForOperator(op1); + _allocateForOperator(op2); + + _advancePastAllocationEffect(); + + bytes memory message = serviceManager.buildNewValidatorSetMessageForEra(0); + + // op2 has higher stake → first + address[] memory expected = new address[](2); + expected[0] = solochain2; + expected[1] = solochain1; + + assertEq(message, _buildExpectedMessage(expected, 0)); + } +} diff --git a/contracts/test/ValidatorSetSubmitter.t.sol b/contracts/test/ValidatorSetSubmitter.t.sol new file mode 100644 index 00000000..ab6cdef7 --- /dev/null +++ b/contracts/test/ValidatorSetSubmitter.t.sol @@ -0,0 +1,287 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.13; + +/* solhint-disable func-name-mixedcase */ + +import {SnowbridgeAndAVSDeployer} from "./utils/SnowbridgeAndAVSDeployer.sol"; +import { + IDataHavenServiceManagerErrors, + IDataHavenServiceManagerEvents +} from "../src/interfaces/IDataHavenServiceManager.sol"; +import {DataHavenServiceManager} from "../src/DataHavenServiceManager.sol"; +import { + TransparentUpgradeableProxy +} from "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; +import { + IRewardsCoordinatorTypes +} from "eigenlayer-contracts/src/contracts/interfaces/IRewardsCoordinator.sol"; + +contract ValidatorSetSubmitterTest is SnowbridgeAndAVSDeployer { + address public submitterA = address(uint160(uint256(keccak256("submitterA")))); + address public submitterB = address(uint160(uint256(keccak256("submitterB")))); + address public nonOwner = address(uint160(uint256(keccak256("nonOwner")))); + + function setUp() public { + _deployMockAllContracts(); + } + + function beforeTestSetup( + bytes4 testSelector + ) public pure returns (bytes[] memory beforeTestCalldata) { + if ( + testSelector == this.test_sendNewValidatorSetForEra_success.selector + || testSelector + == this.test_buildNewValidatorSetMessageForEra_encodesTargetEra.selector + || testSelector == this.test_fuzz_sendNewValidatorSetForEra.selector + || testSelector + == this.test_buildNewValidatorSetMessageForEra_exactEncoding.selector + ) { + beforeTestCalldata = new bytes[](1); + beforeTestCalldata[0] = + abi.encodeWithSelector(this.setupValidatorsAsOperatorsWithAllocations.selector); + } + } + + // ============ setValidatorSetSubmitter ============ + + function test_setValidatorSetSubmitter() public { + // After initialization, validatorSetSubmitter is already set to avsOwner + assertEq( + serviceManager.validatorSetSubmitter(), + avsOwner, + "validatorSetSubmitter should be set to avsOwner after init" + ); + + cheats.expectEmit(); + emit IDataHavenServiceManagerEvents.ValidatorSetSubmitterUpdated(avsOwner, submitterA); + cheats.prank(avsOwner); + serviceManager.setValidatorSetSubmitter(submitterA); + + assertEq( + serviceManager.validatorSetSubmitter(), + submitterA, + "validatorSetSubmitter should be set" + ); + } + + function test_setValidatorSetSubmitter_revertsIfNotOwner() public { + cheats.prank(nonOwner); + cheats.expectRevert(); + serviceManager.setValidatorSetSubmitter(submitterA); + } + + function test_setValidatorSetSubmitter_revertsOnZeroAddress() public { + cheats.prank(avsOwner); + cheats.expectRevert( + abi.encodeWithSelector(IDataHavenServiceManagerErrors.ZeroAddress.selector) + ); + serviceManager.setValidatorSetSubmitter(address(0)); + } + + function test_setValidatorSetSubmitter_rotation() public { + // Set submitter A (rotating from avsOwner set during init) + cheats.prank(avsOwner); + serviceManager.setValidatorSetSubmitter(submitterA); + assertEq(serviceManager.validatorSetSubmitter(), submitterA); + + // Rotate to submitter B + cheats.expectEmit(); + emit IDataHavenServiceManagerEvents.ValidatorSetSubmitterUpdated(submitterA, submitterB); + cheats.prank(avsOwner); + serviceManager.setValidatorSetSubmitter(submitterB); + assertEq(serviceManager.validatorSetSubmitter(), submitterB); + + // Old submitter A can no longer submit + vm.deal(submitterA, 10 ether); + cheats.prank(submitterA); + cheats.expectRevert( + abi.encodeWithSelector( + IDataHavenServiceManagerErrors.OnlyValidatorSetSubmitter.selector + ) + ); + serviceManager.sendNewValidatorSetForEra{value: 2 ether}(1, 1 ether, 1 ether); + } + + // ============ sendNewValidatorSetForEra ============ + + function test_sendNewValidatorSetForEra_revertsIfNotSubmitter() public { + cheats.prank(avsOwner); + serviceManager.setValidatorSetSubmitter(submitterA); + + vm.deal(nonOwner, 10 ether); + cheats.prank(nonOwner); + cheats.expectRevert( + abi.encodeWithSelector( + IDataHavenServiceManagerErrors.OnlyValidatorSetSubmitter.selector + ) + ); + serviceManager.sendNewValidatorSetForEra{value: 2 ether}(1, 1 ether, 1 ether); + } + + function test_sendNewValidatorSetForEra_success() public { + cheats.prank(avsOwner); + serviceManager.setValidatorSetSubmitter(submitterA); + + uint64 targetEra = 42; + vm.deal(submitterA, 1000000 ether); + + bytes memory message = serviceManager.buildNewValidatorSetMessageForEra(targetEra); + bytes32 expectedHash = keccak256(message); + + cheats.expectEmit(); + emit IDataHavenServiceManagerEvents.ValidatorSetMessageSubmitted( + targetEra, expectedHash, submitterA + ); + cheats.prank(submitterA); + serviceManager.sendNewValidatorSetForEra{value: 2 ether}(targetEra, 1 ether, 1 ether); + } + + function test_sendNewValidatorSetForEra_revertsOnEmptyValidatorSet() public { + cheats.prank(avsOwner); + serviceManager.setValidatorSetSubmitter(submitterA); + + vm.deal(submitterA, 10 ether); + cheats.prank(submitterA); + cheats.expectRevert( + abi.encodeWithSelector(IDataHavenServiceManagerErrors.EmptyValidatorSet.selector) + ); + serviceManager.sendNewValidatorSetForEra{value: 2 ether}(1, 1 ether, 1 ether); + } + + function test_ownerCannotCallSendNewValidatorSetForEra() public { + cheats.prank(avsOwner); + serviceManager.setValidatorSetSubmitter(submitterA); + + vm.deal(avsOwner, 10 ether); + cheats.prank(avsOwner); + cheats.expectRevert( + abi.encodeWithSelector( + IDataHavenServiceManagerErrors.OnlyValidatorSetSubmitter.selector + ) + ); + serviceManager.sendNewValidatorSetForEra{value: 2 ether}(1, 1 ether, 1 ether); + } + + // ============ buildNewValidatorSetMessageForEra ============ + + function test_buildNewValidatorSetMessageForEra_encodesTargetEra() public view { + bytes memory messageEra1 = serviceManager.buildNewValidatorSetMessageForEra(1); + bytes memory messageEra2 = serviceManager.buildNewValidatorSetMessageForEra(2); + bytes memory messageEra100 = serviceManager.buildNewValidatorSetMessageForEra(100); + + // Different era values must produce different encoded output + assertTrue( + keccak256(messageEra1) != keccak256(messageEra2), + "Messages for different eras should differ" + ); + assertTrue( + keccak256(messageEra1) != keccak256(messageEra100), + "Messages for different eras should differ" + ); + } + + function test_sendNewValidatorSetForEra_revertsWhenSubmitterIsZeroAddress() public { + // Deploy a fresh proxy with address(0) as the submitter + IRewardsCoordinatorTypes.StrategyAndMultiplier[] memory emptyStrategies = + new IRewardsCoordinatorTypes.StrategyAndMultiplier[](0); + + cheats.startPrank(regularDeployer); + DataHavenServiceManager zeroSubmitterSM = DataHavenServiceManager( + address( + new TransparentUpgradeableProxy( + address(serviceManagerImplementation), + address(proxyAdmin), + abi.encodeWithSelector( + DataHavenServiceManager.initialize.selector, + avsOwner, + rewardsInitiator, + emptyStrategies, + address(snowbridgeGatewayMock), + address(0) + ) + ) + ) + ); + cheats.stopPrank(); + + assertEq( + zeroSubmitterSM.validatorSetSubmitter(), + address(0), + "validatorSetSubmitter should be address(0)" + ); + + vm.deal(submitterA, 10 ether); + cheats.prank(submitterA); + cheats.expectRevert( + abi.encodeWithSelector( + IDataHavenServiceManagerErrors.OnlyValidatorSetSubmitter.selector + ) + ); + zeroSubmitterSM.sendNewValidatorSetForEra{value: 2 ether}(1, 1 ether, 1 ether); + } + + function test_fuzz_sendNewValidatorSetForEra( + uint64 targetEra + ) public { + cheats.prank(avsOwner); + serviceManager.setValidatorSetSubmitter(submitterA); + + vm.deal(submitterA, 1000000 ether); + + bytes memory message = serviceManager.buildNewValidatorSetMessageForEra(targetEra); + bytes32 expectedHash = keccak256(message); + + cheats.expectEmit(); + emit IDataHavenServiceManagerEvents.ValidatorSetMessageSubmitted( + targetEra, expectedHash, submitterA + ); + cheats.prank(submitterA); + serviceManager.sendNewValidatorSetForEra{value: 2 ether}(targetEra, 1 ether, 1 ether); + } + + function test_buildNewValidatorSetMessageForEra_exactEncoding() public view { + uint64 targetEra = 42; + bytes memory message = serviceManager.buildNewValidatorSetMessageForEra(targetEra); + + // Total: 4 (EL_MESSAGE_ID) + 1 (V0) + 1 (ReceiveValidators) + // + 1 (compact 10) + 10*20 (validators) + 8 (era) = 215 + assertEq(message.length, 215, "Message length should be 215 bytes"); + + // First 4 bytes: EL_MESSAGE_ID = 0x70150038 + assertEq(uint8(message[0]), 0x70, "EL_MESSAGE_ID byte 0"); + assertEq(uint8(message[1]), 0x15, "EL_MESSAGE_ID byte 1"); + assertEq(uint8(message[2]), 0x00, "EL_MESSAGE_ID byte 2"); + assertEq(uint8(message[3]), 0x38, "EL_MESSAGE_ID byte 3"); + + // Byte 4: V0 = 0x00 + assertEq(uint8(message[4]), 0x00, "V0 byte mismatch"); + + // Byte 5: ReceiveValidators = 0x00 + assertEq(uint8(message[5]), 0x00, "ReceiveValidators byte mismatch"); + + // Byte 6: SCALE compact encoding of 10 validators = 10 << 2 = 40 = 0x28 + assertEq(uint8(message[6]), 0x28, "Compact encoding of 10 validators"); + + // Last 8 bytes: era 42 in SCALE little-endian = 0x2A00000000000000 + assertEq(uint8(message[207]), 0x2A, "Era LE byte 0"); + assertEq(uint8(message[208]), 0x00, "Era LE byte 1"); + assertEq(uint8(message[209]), 0x00, "Era LE byte 2"); + assertEq(uint8(message[210]), 0x00, "Era LE byte 3"); + assertEq(uint8(message[211]), 0x00, "Era LE byte 4"); + assertEq(uint8(message[212]), 0x00, "Era LE byte 5"); + assertEq(uint8(message[213]), 0x00, "Era LE byte 6"); + assertEq(uint8(message[214]), 0x00, "Era LE byte 7"); + } + + // ============ Legacy function removed ============ + + function test_legacySendNewValidatorSet_removed() public { + // The old sendNewValidatorSet(uint128,uint128) selector should not be callable + bytes memory callData = + abi.encodeWithSelector(bytes4(keccak256("sendNewValidatorSet(uint128,uint128)")), 1, 1); + vm.deal(avsOwner, 10 ether); + cheats.prank(avsOwner); + (bool success,) = address(serviceManager).call{value: 2 ether}(callData); + assertFalse(success, "Legacy sendNewValidatorSet should not be callable"); + } +} diff --git a/contracts/test/storage/StorageLayout.t.sol b/contracts/test/storage/StorageLayout.t.sol index de81e0b9..69a3cd92 100644 --- a/contracts/test/storage/StorageLayout.t.sol +++ b/contracts/test/storage/StorageLayout.t.sol @@ -21,10 +21,12 @@ contract StorageLayoutTest is AVSDeployer { // 1. Populate state address testValidator = address(0x1234); address newRewardsInitiator = address(0x9999); + address testSubmitter = address(0x5678); vm.startPrank(avsOwner); serviceManager.addValidatorToAllowlist(testValidator); serviceManager.setRewardsInitiator(newRewardsInitiator); + serviceManager.setValidatorSetSubmitter(testSubmitter); vm.stopPrank(); // 2. Record state before upgrade @@ -32,6 +34,7 @@ contract StorageLayoutTest is AVSDeployer { address rewardsInitiatorBefore = serviceManager.rewardsInitiator(); address ownerBefore = serviceManager.owner(); address gatewayBefore = serviceManager.snowbridgeGateway(); + address submitterBefore = serviceManager.validatorSetSubmitter(); // 3. Deploy new implementation DataHavenServiceManager newImpl = @@ -58,6 +61,11 @@ contract StorageLayoutTest is AVSDeployer { gatewayBefore, "snowbridgeGateway should be preserved" ); + assertEq( + serviceManager.validatorSetSubmitter(), + submitterBefore, + "validatorSetSubmitter should be preserved" + ); } /// @notice Verifies validatorEthAddressToSolochainAddress mapping is preserved @@ -85,9 +93,12 @@ contract StorageLayoutTest is AVSDeployer { bool inAllowlistBefore = serviceManager.validatorsAllowlist(testValidator); address solochainAddressBefore = serviceManager.validatorEthAddressToSolochainAddress(testValidator); + address ethOperatorBefore = + serviceManager.validatorSolochainAddressToEthAddress(testSolochainAddress); // Verify the mapping was set correctly before upgrade assertEq(solochainAddressBefore, testSolochainAddress, "Solochain address should be set"); + assertEq(ethOperatorBefore, testValidator, "Eth operator should be set"); // Deploy new implementation and upgrade DataHavenServiceManager newImpl = @@ -112,6 +123,16 @@ contract StorageLayoutTest is AVSDeployer { testSolochainAddress, "validatorEthAddressToSolochainAddress should have correct value after upgrade" ); + assertEq( + serviceManager.validatorSolochainAddressToEthAddress(testSolochainAddress), + ethOperatorBefore, + "validatorSolochainAddressToEthAddress mapping should be preserved after upgrade" + ); + assertEq( + serviceManager.validatorSolochainAddressToEthAddress(testSolochainAddress), + testValidator, + "validatorSolochainAddressToEthAddress should have correct value after upgrade" + ); } /// @notice Verifies multiple validators in allowlist are preserved diff --git a/contracts/test/utils/AVSDeployer.sol b/contracts/test/utils/AVSDeployer.sol index 79b6894a..5c59d53c 100644 --- a/contracts/test/utils/AVSDeployer.sol +++ b/contracts/test/utils/AVSDeployer.sol @@ -239,14 +239,6 @@ contract AVSDeployer is Test { serviceManagerImplementation = new DataHavenServiceManager(rewardsCoordinator, allocationManager); - // Create array for validators strategies required by DataHavenServiceManager - IStrategy[] memory validatorsStrategies = new IStrategy[](deployedStrategies.length); - - // For testing purposes, we'll use the deployed strategies for validators - for (uint256 i = 0; i < deployedStrategies.length; i++) { - validatorsStrategies[i] = deployedStrategies[i]; - } - serviceManager = DataHavenServiceManager( address( new TransparentUpgradeableProxy( @@ -256,8 +248,9 @@ contract AVSDeployer is Test { DataHavenServiceManager.initialize.selector, avsOwner, rewardsInitiator, - validatorsStrategies, + defaultStrategyAndMultipliers, address(snowbridgeGatewayMock), + avsOwner, "v-mock", versionUpdater ) diff --git a/contracts/test/utils/SnowbridgeAndAVSDeployer.sol b/contracts/test/utils/SnowbridgeAndAVSDeployer.sol index d0874122..f06babf7 100644 --- a/contracts/test/utils/SnowbridgeAndAVSDeployer.sol +++ b/contracts/test/utils/SnowbridgeAndAVSDeployer.sol @@ -16,6 +16,11 @@ import {TestUtils} from "./TestUtils.sol"; import { IAllocationManagerTypes } from "eigenlayer-contracts/src/contracts/interfaces/IAllocationManager.sol"; +import {IStrategy} from "eigenlayer-contracts/src/contracts/interfaces/IStrategy.sol"; +import { + IRewardsCoordinatorTypes +} from "eigenlayer-contracts/src/contracts/interfaces/IRewardsCoordinator.sol"; +import {OperatorSet} from "eigenlayer-contracts/src/contracts/libraries/OperatorSetLib.sol"; import {ValidatorsUtils} from "../../script/utils/ValidatorsUtils.sol"; import {console} from "forge-std/Test.sol"; @@ -145,6 +150,61 @@ contract SnowbridgeAndAVSDeployer is AVSDeployer { serviceManager.setSnowbridgeGateway(address(gateway)); } + function setupValidatorsAsOperatorsWithAllocations() public { + setupValidatorsAsOperators(); + + // Remove strategies added during initialize (without multipliers) + // and re-add them with explicit multipliers + IStrategy[] memory strategies = new IStrategy[](deployedStrategies.length); + for (uint256 i = 0; i < deployedStrategies.length; i++) { + strategies[i] = deployedStrategies[i]; + } + + IRewardsCoordinatorTypes.StrategyAndMultiplier[] memory sm = + new IRewardsCoordinatorTypes.StrategyAndMultiplier[](deployedStrategies.length); + for (uint256 i = 0; i < deployedStrategies.length; i++) { + sm[i] = IRewardsCoordinatorTypes.StrategyAndMultiplier({ + strategy: strategies[i], + multiplier: 1 // 1x multiplier for all strategies + }); + } + + cheats.startPrank(avsOwner); + serviceManager.removeStrategiesFromValidatorsSupportedStrategies(strategies); + serviceManager.addStrategiesToValidatorsSupportedStrategies(sm); + cheats.stopPrank(); + + // Advance past ALLOCATION_CONFIGURATION_DELAY (1 day = 86400 blocks in test setup) + // so operator allocation delays take effect + uint32 allocationConfigDelay = allocationManager.ALLOCATION_CONFIGURATION_DELAY(); + cheats.roll(block.number + allocationConfigDelay + 1); + + // For each operator, allocate full magnitude to the DataHaven operator set + for (uint256 i = 0; i < validatorsAllowlist.length; i++) { + IAllocationManagerTypes.AllocateParams[] memory allocParams = + new IAllocationManagerTypes.AllocateParams[](1); + + uint64[] memory newMagnitudes = new uint64[](deployedStrategies.length); + for (uint256 j = 0; j < deployedStrategies.length; j++) { + newMagnitudes[j] = 1e18; // 100% magnitude + } + + allocParams[0] = IAllocationManagerTypes.AllocateParams({ + operatorSet: OperatorSet({ + avs: address(serviceManager), id: serviceManager.VALIDATORS_SET_ID() + }), + strategies: strategies, + newMagnitudes: newMagnitudes + }); + + cheats.prank(validatorsAllowlist[i]); + allocationManager.modifyAllocations(validatorsAllowlist[i], allocParams); + } + + // Advance past allocation effect delay (operator delay is 0, so just +1 block) + cheats.roll(block.number + 1); + } + function setupValidatorsAsOperators() public { for (uint256 i = 0; i < validatorsAllowlist.length; i++) { console.log("Setting up validator %s as operator", validatorsAllowlist[i]); diff --git a/operator/Cargo.lock b/operator/Cargo.lock index 5ffba155..60011856 100644 --- a/operator/Cargo.lock +++ b/operator/Cargo.lock @@ -1521,7 +1521,7 @@ dependencies = [ "pallet-message-queue", "parity-scale-codec", "scale-info", - "snowbridge-core 0.24.0", + "snowbridge-core 0.25.0", "sp-core", "sp-runtime", "sp-std", @@ -2607,7 +2607,7 @@ dependencies = [ [[package]] name = "datahaven-mainnet-runtime" -version = "0.24.0" +version = "0.25.0" dependencies = [ "alloy-core", "bridge-hub-common 0.13.1", @@ -2719,8 +2719,8 @@ dependencies = [ "shp-treasury-funding", "shp-tx-implicits-runtime-api", "smallvec", - "snowbridge-beacon-primitives 0.24.0", - "snowbridge-core 0.24.0", + "snowbridge-beacon-primitives 0.25.0", + "snowbridge-core 0.25.0", "snowbridge-inbound-queue-primitives", "snowbridge-merkle-tree", "snowbridge-outbound-queue-primitives", @@ -2763,7 +2763,7 @@ dependencies = [ [[package]] name = "datahaven-node" -version = "0.24.0" +version = "0.25.0" dependencies = [ "async-channel 1.9.0", "clap", @@ -2876,7 +2876,7 @@ dependencies = [ [[package]] name = "datahaven-runtime-common" -version = "0.24.0" +version = "0.25.0" dependencies = [ "alloy-core", "fp-account", @@ -2910,7 +2910,7 @@ dependencies = [ [[package]] name = "datahaven-stagenet-runtime" -version = "0.24.0" +version = "0.25.0" dependencies = [ "alloy-core", "bridge-hub-common 0.13.1", @@ -3022,8 +3022,8 @@ dependencies = [ "shp-treasury-funding", "shp-tx-implicits-runtime-api", "smallvec", - "snowbridge-beacon-primitives 0.24.0", - "snowbridge-core 0.24.0", + "snowbridge-beacon-primitives 0.25.0", + "snowbridge-core 0.25.0", "snowbridge-inbound-queue-primitives", "snowbridge-merkle-tree", "snowbridge-outbound-queue-primitives", @@ -3066,7 +3066,7 @@ dependencies = [ [[package]] name = "datahaven-testnet-runtime" -version = "0.24.0" +version = "0.25.0" dependencies = [ "alloy-core", "bridge-hub-common 0.13.1", @@ -3178,8 +3178,8 @@ dependencies = [ "shp-treasury-funding", "shp-tx-implicits-runtime-api", "smallvec", - "snowbridge-beacon-primitives 0.24.0", - "snowbridge-core 0.24.0", + "snowbridge-beacon-primitives 0.25.0", + "snowbridge-core 0.25.0", "snowbridge-inbound-queue-primitives", "snowbridge-merkle-tree", "snowbridge-outbound-queue-primitives", @@ -3371,7 +3371,7 @@ dependencies = [ [[package]] name = "dhp-bridge" -version = "0.24.0" +version = "0.25.0" dependencies = [ "frame-support", "frame-system", @@ -3379,7 +3379,7 @@ dependencies = [ "pallet-datahaven-native-transfer", "pallet-external-validators", "parity-scale-codec", - "snowbridge-core 0.24.0", + "snowbridge-core 0.25.0", "snowbridge-inbound-queue-primitives", "sp-core", "sp-std", @@ -8639,8 +8639,8 @@ dependencies = [ [[package]] name = "pallet-bucket-nfts" -version = "0.4.1" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.4.1#b5d6eb2ffa153d97e079d1fda382773b466f4702" +version = "0.4.2" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.4.2#5b52af21ca6c60db96bb7c3fe7c069075e941614" dependencies = [ "frame-benchmarking", "frame-support", @@ -8696,8 +8696,8 @@ dependencies = [ [[package]] name = "pallet-cr-randomness" -version = "0.4.1" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.4.1#b5d6eb2ffa153d97e079d1fda382773b466f4702" +version = "0.4.2" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.4.2#5b52af21ca6c60db96bb7c3fe7c069075e941614" dependencies = [ "frame-support", "frame-system", @@ -8716,7 +8716,7 @@ dependencies = [ [[package]] name = "pallet-datahaven-native-transfer" -version = "0.24.0" +version = "0.25.0" dependencies = [ "frame-benchmarking", "frame-support", @@ -8724,7 +8724,7 @@ dependencies = [ "pallet-balances", "parity-scale-codec", "scale-info", - "snowbridge-core 0.24.0", + "snowbridge-core 0.25.0", "snowbridge-outbound-queue-primitives", "sp-core", "sp-io", @@ -8828,7 +8828,7 @@ dependencies = [ [[package]] name = "pallet-evm-precompile-balances-erc20" -version = "0.24.0" +version = "0.25.0" dependencies = [ "fp-evm", "frame-support", @@ -8851,7 +8851,7 @@ dependencies = [ [[package]] name = "pallet-evm-precompile-batch" -version = "0.24.0" +version = "0.25.0" dependencies = [ "evm", "fp-evm", @@ -8890,7 +8890,7 @@ dependencies = [ [[package]] name = "pallet-evm-precompile-call-permit" -version = "0.24.0" +version = "0.25.0" dependencies = [ "evm", "fp-evm", @@ -8956,7 +8956,7 @@ dependencies = [ [[package]] name = "pallet-evm-precompile-datahaven-native-transfer" -version = "0.24.0" +version = "0.25.0" dependencies = [ "evm", "fp-evm", @@ -8970,7 +8970,7 @@ dependencies = [ "parity-scale-codec", "precompile-utils", "scale-info", - "snowbridge-core 0.24.0", + "snowbridge-core 0.25.0", "snowbridge-outbound-queue-primitives", "sp-core", "sp-io", @@ -8980,8 +8980,8 @@ dependencies = [ [[package]] name = "pallet-evm-precompile-file-system" -version = "0.4.1" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.4.1#b5d6eb2ffa153d97e079d1fda382773b466f4702" +version = "0.4.2" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.4.2#5b52af21ca6c60db96bb7c3fe7c069075e941614" dependencies = [ "fp-account", "fp-evm", @@ -9049,7 +9049,7 @@ dependencies = [ [[package]] name = "pallet-evm-precompile-proxy" -version = "0.24.0" +version = "0.25.0" dependencies = [ "evm", "fp-evm", @@ -9093,7 +9093,7 @@ dependencies = [ [[package]] name = "pallet-evm-precompile-registry" -version = "0.24.0" +version = "0.25.0" dependencies = [ "fp-evm", "frame-support", @@ -9144,7 +9144,7 @@ dependencies = [ "parity-scale-codec", "scale-info", "serde", - "snowbridge-core 0.24.0", + "snowbridge-core 0.25.0", "snowbridge-outbound-queue-primitives", "sp-core", "sp-io", @@ -9154,7 +9154,7 @@ dependencies = [ [[package]] name = "pallet-external-validators" -version = "0.24.0" +version = "0.25.0" dependencies = [ "frame-benchmarking", "frame-support", @@ -9178,7 +9178,7 @@ dependencies = [ [[package]] name = "pallet-external-validators-rewards" -version = "0.24.0" +version = "0.25.0" dependencies = [ "frame-benchmarking", "frame-support", @@ -9191,7 +9191,7 @@ dependencies = [ "pallet-timestamp", "parity-scale-codec", "scale-info", - "snowbridge-core 0.24.0", + "snowbridge-core 0.25.0", "snowbridge-outbound-queue-primitives", "sp-core", "sp-io", @@ -9220,8 +9220,8 @@ dependencies = [ [[package]] name = "pallet-file-system" -version = "0.4.1" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.4.1#b5d6eb2ffa153d97e079d1fda382773b466f4702" +version = "0.4.2" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.4.2#5b52af21ca6c60db96bb7c3fe7c069075e941614" dependencies = [ "frame-benchmarking", "frame-support", @@ -9249,8 +9249,8 @@ dependencies = [ [[package]] name = "pallet-file-system-runtime-api" -version = "0.4.1" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.4.1#b5d6eb2ffa153d97e079d1fda382773b466f4702" +version = "0.4.2" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.4.2#5b52af21ca6c60db96bb7c3fe7c069075e941614" dependencies = [ "parity-scale-codec", "scale-info", @@ -9417,7 +9417,7 @@ dependencies = [ [[package]] name = "pallet-outbound-commitment-store" -version = "0.24.0" +version = "0.25.0" dependencies = [ "frame-support", "frame-system", @@ -9445,8 +9445,8 @@ dependencies = [ [[package]] name = "pallet-payment-streams" -version = "0.4.1" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.4.1#b5d6eb2ffa153d97e079d1fda382773b466f4702" +version = "0.4.2" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.4.2#5b52af21ca6c60db96bb7c3fe7c069075e941614" dependencies = [ "frame-benchmarking", "frame-support", @@ -9465,8 +9465,8 @@ dependencies = [ [[package]] name = "pallet-payment-streams-runtime-api" -version = "0.4.1" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.4.1#b5d6eb2ffa153d97e079d1fda382773b466f4702" +version = "0.4.2" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.4.2#5b52af21ca6c60db96bb7c3fe7c069075e941614" dependencies = [ "parity-scale-codec", "scale-info", @@ -9493,8 +9493,8 @@ dependencies = [ [[package]] name = "pallet-proofs-dealer" -version = "0.4.1" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.4.1#b5d6eb2ffa153d97e079d1fda382773b466f4702" +version = "0.4.2" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.4.2#5b52af21ca6c60db96bb7c3fe7c069075e941614" dependencies = [ "frame-benchmarking", "frame-support", @@ -9519,8 +9519,8 @@ dependencies = [ [[package]] name = "pallet-proofs-dealer-runtime-api" -version = "0.4.1" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.4.1#b5d6eb2ffa153d97e079d1fda382773b466f4702" +version = "0.4.2" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.4.2#5b52af21ca6c60db96bb7c3fe7c069075e941614" dependencies = [ "parity-scale-codec", "scale-info", @@ -9541,7 +9541,7 @@ dependencies = [ [[package]] name = "pallet-proxy-genesis-companion" -version = "0.24.0" +version = "0.25.0" dependencies = [ "frame-support", "frame-system", @@ -9558,8 +9558,8 @@ dependencies = [ [[package]] name = "pallet-randomness" -version = "0.4.1" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.4.1#b5d6eb2ffa153d97e079d1fda382773b466f4702" +version = "0.4.2" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.4.2#5b52af21ca6c60db96bb7c3fe7c069075e941614" dependencies = [ "frame-benchmarking", "frame-support", @@ -9652,7 +9652,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" -version = "0.24.0" +version = "0.25.0" dependencies = [ "frame-benchmarking", "frame-support", @@ -9696,8 +9696,8 @@ dependencies = [ [[package]] name = "pallet-storage-providers" -version = "0.4.1" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.4.1#b5d6eb2ffa153d97e079d1fda382773b466f4702" +version = "0.4.2" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.4.2#5b52af21ca6c60db96bb7c3fe7c069075e941614" dependencies = [ "frame-benchmarking", "frame-support", @@ -9718,8 +9718,8 @@ dependencies = [ [[package]] name = "pallet-storage-providers-runtime-api" -version = "0.4.1" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.4.1#b5d6eb2ffa153d97e079d1fda382773b466f4702" +version = "0.4.2" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.4.2#5b52af21ca6c60db96bb7c3fe7c069075e941614" dependencies = [ "parity-scale-codec", "scale-info", @@ -13881,8 +13881,8 @@ dependencies = [ [[package]] name = "shc-actors-derive" -version = "0.4.1" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.4.1#b5d6eb2ffa153d97e079d1fda382773b466f4702" +version = "0.4.2" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.4.2#5b52af21ca6c60db96bb7c3fe7c069075e941614" dependencies = [ "once_cell", "proc-macro2", @@ -13894,8 +13894,8 @@ dependencies = [ [[package]] name = "shc-actors-framework" -version = "0.4.1" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.4.1#b5d6eb2ffa153d97e079d1fda382773b466f4702" +version = "0.4.2" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.4.2#5b52af21ca6c60db96bb7c3fe7c069075e941614" dependencies = [ "anyhow", "bincode", @@ -13913,8 +13913,8 @@ dependencies = [ [[package]] name = "shc-blockchain-service" -version = "0.4.1" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.4.1#b5d6eb2ffa153d97e079d1fda382773b466f4702" +version = "0.4.2" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.4.2#5b52af21ca6c60db96bb7c3fe7c069075e941614" dependencies = [ "anyhow", "array-bytes", @@ -13969,8 +13969,8 @@ dependencies = [ [[package]] name = "shc-blockchain-service-db" -version = "0.4.1" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.4.1#b5d6eb2ffa153d97e079d1fda382773b466f4702" +version = "0.4.2" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.4.2#5b52af21ca6c60db96bb7c3fe7c069075e941614" dependencies = [ "chrono", "diesel", @@ -13993,8 +13993,8 @@ dependencies = [ [[package]] name = "shc-client" -version = "0.4.1" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.4.1#b5d6eb2ffa153d97e079d1fda382773b466f4702" +version = "0.4.2" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.4.2#5b52af21ca6c60db96bb7c3fe7c069075e941614" dependencies = [ "anyhow", "array-bytes", @@ -14002,6 +14002,7 @@ dependencies = [ "async-trait", "axum", "axum-extra", + "bytes", "chrono", "frame-benchmarking", "frame-benchmarking-cli", @@ -14067,12 +14068,13 @@ dependencies = [ [[package]] name = "shc-common" -version = "0.4.1" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.4.1#b5d6eb2ffa153d97e079d1fda382773b466f4702" +version = "0.4.2" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.4.2#5b52af21ca6c60db96bb7c3fe7c069075e941614" dependencies = [ "anyhow", "bigdecimal", "bincode", + "bytes", "cumulus-primitives-core", "cumulus-primitives-storage-weight-reclaim", "fp-account", @@ -14131,8 +14133,8 @@ dependencies = [ [[package]] name = "shc-file-manager" -version = "0.4.1" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.4.1#b5d6eb2ffa153d97e079d1fda382773b466f4702" +version = "0.4.2" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.4.2#5b52af21ca6c60db96bb7c3fe7c069075e941614" dependencies = [ "bincode", "hash-db", @@ -14140,6 +14142,7 @@ dependencies = [ "kvdb-memorydb", "kvdb-rocksdb", "log", + "lru 0.16.3", "parity-scale-codec", "serde_json", "shc-common", @@ -14155,8 +14158,8 @@ dependencies = [ [[package]] name = "shc-file-transfer-service" -version = "0.4.1" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.4.1#b5d6eb2ffa153d97e079d1fda382773b466f4702" +version = "0.4.2" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.4.2#5b52af21ca6c60db96bb7c3fe7c069075e941614" dependencies = [ "anyhow", "array-bytes", @@ -14164,6 +14167,7 @@ dependencies = [ "async-trait", "chrono", "futures", + "pallet-storage-providers-runtime-api", "parity-scale-codec", "prost 0.12.6", "prost-build 0.12.6", @@ -14178,14 +14182,15 @@ dependencies = [ "shc-common", "shp-file-key-verifier", "shp-file-metadata", + "sp-api", "thiserror 1.0.69", "tokio", ] [[package]] name = "shc-fisherman-service" -version = "0.4.1" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.4.1#b5d6eb2ffa153d97e079d1fda382773b466f4702" +version = "0.4.2" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.4.2#5b52af21ca6c60db96bb7c3fe7c069075e941614" dependencies = [ "async-trait", "diesel", @@ -14215,8 +14220,8 @@ dependencies = [ [[package]] name = "shc-forest-manager" -version = "0.4.1" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.4.1#b5d6eb2ffa153d97e079d1fda382773b466f4702" +version = "0.4.2" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.4.2#5b52af21ca6c60db96bb7c3fe7c069075e941614" dependencies = [ "anyhow", "async-trait", @@ -14241,8 +14246,8 @@ dependencies = [ [[package]] name = "shc-indexer-db" -version = "0.4.1" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.4.1#b5d6eb2ffa153d97e079d1fda382773b466f4702" +version = "0.4.2" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.4.2#5b52af21ca6c60db96bb7c3fe7c069075e941614" dependencies = [ "bigdecimal", "chrono", @@ -14269,8 +14274,8 @@ dependencies = [ [[package]] name = "shc-indexer-service" -version = "0.4.1" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.4.1#b5d6eb2ffa153d97e079d1fda382773b466f4702" +version = "0.4.2" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.4.2#5b52af21ca6c60db96bb7c3fe7c069075e941614" dependencies = [ "anyhow", "array-bytes", @@ -14320,8 +14325,8 @@ dependencies = [ [[package]] name = "shc-rpc" -version = "0.4.1" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.4.1#b5d6eb2ffa153d97e079d1fda382773b466f4702" +version = "0.4.2" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.4.2#5b52af21ca6c60db96bb7c3fe7c069075e941614" dependencies = [ "array-bytes", "async-trait", @@ -14366,8 +14371,8 @@ dependencies = [ [[package]] name = "shc-telemetry" -version = "0.4.1" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.4.1#b5d6eb2ffa153d97e079d1fda382773b466f4702" +version = "0.4.2" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.4.2#5b52af21ca6c60db96bb7c3fe7c069075e941614" dependencies = [ "log", "substrate-prometheus-endpoint", @@ -14383,8 +14388,8 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "shp-constants" -version = "0.4.1" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.4.1#b5d6eb2ffa153d97e079d1fda382773b466f4702" +version = "0.4.2" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.4.2#5b52af21ca6c60db96bb7c3fe7c069075e941614" dependencies = [ "sp-core", "sp-runtime", @@ -14392,8 +14397,8 @@ dependencies = [ [[package]] name = "shp-data-price-updater" -version = "0.4.1" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.4.1#b5d6eb2ffa153d97e079d1fda382773b466f4702" +version = "0.4.2" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.4.2#5b52af21ca6c60db96bb7c3fe7c069075e941614" dependencies = [ "frame-support", "parity-scale-codec", @@ -14407,8 +14412,8 @@ dependencies = [ [[package]] name = "shp-file-key-verifier" -version = "0.4.1" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.4.1#b5d6eb2ffa153d97e079d1fda382773b466f4702" +version = "0.4.2" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.4.2#5b52af21ca6c60db96bb7c3fe7c069075e941614" dependencies = [ "frame-support", "parity-scale-codec", @@ -14425,8 +14430,8 @@ dependencies = [ [[package]] name = "shp-file-metadata" -version = "0.4.1" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.4.1#b5d6eb2ffa153d97e079d1fda382773b466f4702" +version = "0.4.2" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.4.2#5b52af21ca6c60db96bb7c3fe7c069075e941614" dependencies = [ "hex", "num-bigint", @@ -14441,8 +14446,8 @@ dependencies = [ [[package]] name = "shp-forest-verifier" -version = "0.4.1" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.4.1#b5d6eb2ffa153d97e079d1fda382773b466f4702" +version = "0.4.2" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.4.2#5b52af21ca6c60db96bb7c3fe7c069075e941614" dependencies = [ "frame-support", "parity-scale-codec", @@ -14458,16 +14463,16 @@ dependencies = [ [[package]] name = "shp-opaque" -version = "0.4.1" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.4.1#b5d6eb2ffa153d97e079d1fda382773b466f4702" +version = "0.4.2" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.4.2#5b52af21ca6c60db96bb7c3fe7c069075e941614" dependencies = [ "sp-runtime", ] [[package]] name = "shp-session-keys" -version = "0.4.1" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.4.1#b5d6eb2ffa153d97e079d1fda382773b466f4702" +version = "0.4.2" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.4.2#5b52af21ca6c60db96bb7c3fe7c069075e941614" dependencies = [ "async-trait", "parity-scale-codec", @@ -14481,8 +14486,8 @@ dependencies = [ [[package]] name = "shp-traits" -version = "0.4.1" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.4.1#b5d6eb2ffa153d97e079d1fda382773b466f4702" +version = "0.4.2" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.4.2#5b52af21ca6c60db96bb7c3fe7c069075e941614" dependencies = [ "frame-support", "parity-scale-codec", @@ -14495,8 +14500,8 @@ dependencies = [ [[package]] name = "shp-treasury-funding" -version = "0.4.1" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.4.1#b5d6eb2ffa153d97e079d1fda382773b466f4702" +version = "0.4.2" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.4.2#5b52af21ca6c60db96bb7c3fe7c069075e941614" dependencies = [ "log", "shp-traits", @@ -14506,8 +14511,8 @@ dependencies = [ [[package]] name = "shp-tx-implicits-runtime-api" -version = "0.4.1" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.4.1#b5d6eb2ffa153d97e079d1fda382773b466f4702" +version = "0.4.2" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.4.2#5b52af21ca6c60db96bb7c3fe7c069075e941614" dependencies = [ "parity-scale-codec", "scale-info", @@ -14519,8 +14524,8 @@ dependencies = [ [[package]] name = "shp-types" -version = "0.4.1" -source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.4.1#b5d6eb2ffa153d97e079d1fda382773b466f4702" +version = "0.4.2" +source = "git+https://github.com/Moonsong-Labs/storage-hub.git?tag=v0.4.2#5b52af21ca6c60db96bb7c3fe7c069075e941614" dependencies = [ "sp-core", "sp-runtime", @@ -14800,7 +14805,7 @@ dependencies = [ [[package]] name = "snowbridge-beacon-primitives" -version = "0.24.0" +version = "0.25.0" dependencies = [ "byte-slice-cast", "frame-support", @@ -14845,7 +14850,7 @@ dependencies = [ [[package]] name = "snowbridge-core" -version = "0.24.0" +version = "0.25.0" dependencies = [ "bp-relayers", "ethabi-decode", @@ -14922,8 +14927,8 @@ dependencies = [ "log", "parity-scale-codec", "scale-info", - "snowbridge-beacon-primitives 0.24.0", - "snowbridge-core 0.24.0", + "snowbridge-beacon-primitives 0.25.0", + "snowbridge-core 0.25.0", "snowbridge-verification-primitives", "sp-core", "sp-io", @@ -14936,7 +14941,7 @@ dependencies = [ [[package]] name = "snowbridge-merkle-tree" -version = "0.24.0" +version = "0.25.0" dependencies = [ "array-bytes", "hex", @@ -14977,7 +14982,7 @@ dependencies = [ [[package]] name = "snowbridge-outbound-queue-primitives" -version = "0.24.0" +version = "0.25.0" dependencies = [ "alloy-core", "ethabi-decode", @@ -14989,7 +14994,7 @@ dependencies = [ "parity-scale-codec", "polkadot-parachain-primitives", "scale-info", - "snowbridge-core 0.24.0", + "snowbridge-core 0.25.0", "snowbridge-verification-primitives", "sp-arithmetic", "sp-core", @@ -15003,12 +15008,12 @@ dependencies = [ [[package]] name = "snowbridge-outbound-queue-v2-runtime-api" -version = "0.24.0" +version = "0.25.0" dependencies = [ "frame-support", "parity-scale-codec", "scale-info", - "snowbridge-core 0.24.0", + "snowbridge-core 0.25.0", "snowbridge-merkle-tree", "snowbridge-outbound-queue-primitives", "sp-api", @@ -15018,7 +15023,7 @@ dependencies = [ [[package]] name = "snowbridge-pallet-ethereum-client" -version = "0.24.0" +version = "0.25.0" dependencies = [ "frame-benchmarking", "frame-support", @@ -15031,8 +15036,8 @@ dependencies = [ "scale-info", "serde", "serde_json", - "snowbridge-beacon-primitives 0.24.0", - "snowbridge-core 0.24.0", + "snowbridge-beacon-primitives 0.25.0", + "snowbridge-core 0.25.0", "snowbridge-ethereum 0.3.0", "snowbridge-inbound-queue-primitives", "snowbridge-pallet-ethereum-client-fixtures", @@ -15048,8 +15053,8 @@ name = "snowbridge-pallet-ethereum-client-fixtures" version = "0.9.0" dependencies = [ "hex-literal 0.3.4", - "snowbridge-beacon-primitives 0.24.0", - "snowbridge-core 0.24.0", + "snowbridge-beacon-primitives 0.25.0", + "snowbridge-core 0.25.0", "snowbridge-inbound-queue-primitives", "sp-core", "sp-std", @@ -15057,7 +15062,7 @@ dependencies = [ [[package]] name = "snowbridge-pallet-inbound-queue-v2" -version = "0.24.0" +version = "0.25.0" dependencies = [ "alloy-core", "bp-relayers", @@ -15071,8 +15076,8 @@ dependencies = [ "parity-scale-codec", "scale-info", "serde", - "snowbridge-beacon-primitives 0.24.0", - "snowbridge-core 0.24.0", + "snowbridge-beacon-primitives 0.25.0", + "snowbridge-core 0.25.0", "snowbridge-inbound-queue-primitives", "snowbridge-pallet-ethereum-client", "snowbridge-pallet-inbound-queue-v2-fixtures", @@ -15093,8 +15098,8 @@ name = "snowbridge-pallet-inbound-queue-v2-fixtures" version = "0.10.0" dependencies = [ "hex-literal 0.3.4", - "snowbridge-beacon-primitives 0.24.0", - "snowbridge-core 0.24.0", + "snowbridge-beacon-primitives 0.25.0", + "snowbridge-core 0.25.0", "snowbridge-inbound-queue-primitives", "sp-core", "sp-std", @@ -15124,7 +15129,7 @@ dependencies = [ [[package]] name = "snowbridge-pallet-outbound-queue-v2" -version = "0.24.0" +version = "0.25.0" dependencies = [ "alloy-core", "bp-relayers", @@ -15138,8 +15143,8 @@ dependencies = [ "parity-scale-codec", "scale-info", "serde", - "snowbridge-beacon-primitives 0.24.0", - "snowbridge-core 0.24.0", + "snowbridge-beacon-primitives 0.25.0", + "snowbridge-core 0.25.0", "snowbridge-inbound-queue-primitives", "snowbridge-merkle-tree", "snowbridge-outbound-queue-primitives", @@ -15170,7 +15175,7 @@ dependencies = [ "parity-scale-codec", "polkadot-primitives", "scale-info", - "snowbridge-core 0.24.0", + "snowbridge-core 0.25.0", "snowbridge-outbound-queue-primitives", "snowbridge-pallet-outbound-queue", "sp-core", @@ -15183,7 +15188,7 @@ dependencies = [ [[package]] name = "snowbridge-pallet-system-v2" -version = "0.24.0" +version = "0.25.0" dependencies = [ "frame-benchmarking", "frame-support", @@ -15195,7 +15200,7 @@ dependencies = [ "parity-scale-codec", "polkadot-primitives", "scale-info", - "snowbridge-core 0.24.0", + "snowbridge-core 0.25.0", "snowbridge-outbound-queue-primitives", "snowbridge-pallet-outbound-queue-v2", "snowbridge-pallet-system", @@ -15211,10 +15216,10 @@ dependencies = [ [[package]] name = "snowbridge-system-v2-runtime-api" -version = "0.24.0" +version = "0.25.0" dependencies = [ "parity-scale-codec", - "snowbridge-core 0.24.0", + "snowbridge-core 0.25.0", "sp-api", "sp-std", "staging-xcm", @@ -15222,7 +15227,7 @@ dependencies = [ [[package]] name = "snowbridge-test-utils" -version = "0.24.0" +version = "0.25.0" dependencies = [ "frame-benchmarking", "frame-support", @@ -15242,12 +15247,12 @@ dependencies = [ [[package]] name = "snowbridge-verification-primitives" -version = "0.24.0" +version = "0.25.0" dependencies = [ "frame-support", "parity-scale-codec", "scale-info", - "snowbridge-beacon-primitives 0.24.0", + "snowbridge-beacon-primitives 0.25.0", "sp-core", "sp-std", ] diff --git a/operator/Cargo.toml b/operator/Cargo.toml index 92fd4f46..4419b4b3 100644 --- a/operator/Cargo.toml +++ b/operator/Cargo.toml @@ -5,7 +5,7 @@ edition = "2021" homepage = "https://datahaven.xyz/" license = "GPL-3" repository = "https://github.com/datahavenxyz/datahaven" -version = "0.24.0" +version = "0.25.0" [workspace] members = [ @@ -272,42 +272,42 @@ fc-storage = { git = "https://github.com/polkadot-evm/frontier", branch = "stabl # StorageHub ## Runtime -pallet-bucket-nfts = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.4.1", default-features = false } -pallet-cr-randomness = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.4.1", default-features = false } -pallet-file-system = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.4.1", default-features = false } -pallet-file-system-runtime-api = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.4.1", default-features = false } -pallet-payment-streams = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.4.1", default-features = false } -pallet-payment-streams-runtime-api = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.4.1", default-features = false } -pallet-proofs-dealer = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.4.1", default-features = false } -pallet-proofs-dealer-runtime-api = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.4.1", default-features = false } -pallet-randomness = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.4.1", default-features = false } -pallet-storage-providers = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.4.1", default-features = false } -pallet-storage-providers-runtime-api = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.4.1", default-features = false } -shp-constants = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.4.1", default-features = false } -shp-data-price-updater = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.4.1", default-features = false } -shp-file-key-verifier = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.4.1", default-features = false } -shp-file-metadata = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.4.1", default-features = false } -shp-forest-verifier = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.4.1", default-features = false } -shp-traits = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.4.1", default-features = false } -shp-treasury-funding = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.4.1", default-features = false } +pallet-bucket-nfts = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.4.2", default-features = false } +pallet-cr-randomness = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.4.2", default-features = false } +pallet-file-system = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.4.2", default-features = false } +pallet-file-system-runtime-api = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.4.2", default-features = false } +pallet-payment-streams = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.4.2", default-features = false } +pallet-payment-streams-runtime-api = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.4.2", default-features = false } +pallet-proofs-dealer = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.4.2", default-features = false } +pallet-proofs-dealer-runtime-api = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.4.2", default-features = false } +pallet-randomness = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.4.2", default-features = false } +pallet-storage-providers = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.4.2", default-features = false } +pallet-storage-providers-runtime-api = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.4.2", default-features = false } +shp-constants = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.4.2", default-features = false } +shp-data-price-updater = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.4.2", default-features = false } +shp-file-key-verifier = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.4.2", default-features = false } +shp-file-metadata = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.4.2", default-features = false } +shp-forest-verifier = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.4.2", default-features = false } +shp-traits = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.4.2", default-features = false } +shp-treasury-funding = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.4.2", default-features = false } ## Client -shc-actors-derive = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.4.1", default-features = false } -shc-actors-framework = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.4.1", default-features = false } -shc-blockchain-service = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.4.1", default-features = false } -shc-client = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.4.1", default-features = false } -shc-common = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.4.1", default-features = false } -shc-file-manager = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.4.1", default-features = false } -shc-file-transfer-service = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.4.1", default-features = false } -shc-fisherman-service = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.4.1", default-features = false } -shc-forest-manager = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.4.1", default-features = false } -shc-indexer-db = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.4.1", default-features = false } -shc-indexer-service = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.4.1", default-features = false } -shc-rpc = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.4.1", default-features = false } -shp-opaque = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.4.1", default-features = false } -shp-tx-implicits-runtime-api = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.4.1", default-features = false } -shp-types = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.4.1", default-features = false } +shc-actors-derive = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.4.2", default-features = false } +shc-actors-framework = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.4.2", default-features = false } +shc-blockchain-service = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.4.2", default-features = false } +shc-client = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.4.2", default-features = false } +shc-common = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.4.2", default-features = false } +shc-file-manager = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.4.2", default-features = false } +shc-file-transfer-service = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.4.2", default-features = false } +shc-fisherman-service = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.4.2", default-features = false } +shc-forest-manager = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.4.2", default-features = false } +shc-indexer-db = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.4.2", default-features = false } +shc-indexer-service = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.4.2", default-features = false } +shc-rpc = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.4.2", default-features = false } +shp-opaque = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.4.2", default-features = false } +shp-tx-implicits-runtime-api = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.4.2", default-features = false } +shp-types = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.4.2", default-features = false } ## Precompiles -pallet-evm-precompile-file-system = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.4.1", default-features = false } +pallet-evm-precompile-file-system = { git = "https://github.com/Moonsong-Labs/storage-hub.git", tag = "v0.4.2", default-features = false } # Static linking diff --git a/operator/node/src/cli.rs b/operator/node/src/cli.rs index af0ac8af..d661df4e 100644 --- a/operator/node/src/cli.rs +++ b/operator/node/src/cli.rs @@ -28,6 +28,7 @@ use shc_indexer_db::models::{FileFiltering, FileOrdering}; use shc_indexer_service::IndexerMode; use shc_rpc::RpcConfig; use shp_types::StorageDataUnit; +use sp_core::H256; // Available Sealing methods. #[derive(Copy, Clone, Debug, Default, ValueEnum)] @@ -73,6 +74,7 @@ pub struct Cli { "pending_db_url", "fisherman", "fisherman_database_url", "trusted_file_transfer_server", "trusted_file_transfer_server_host", "trusted_file_transfer_server_port", + "trusted_file_transfer_batch_size_bytes", "trusted_msps", ])] pub provider_config_file: Option, @@ -497,6 +499,26 @@ pub struct ProviderConfigurations { default_value = "7070" )] pub trusted_file_transfer_server_port: Option, + + /// Batch size in bytes used by MSP trusted upload ingestion (default: 2MB). + #[arg( + long, + value_name = "BYTES", + help_heading = "Trusted File Transfer Server Options", + default_value = "2097152", + value_parser = clap::value_parser!(u64).range(1..) + )] + pub trusted_file_transfer_batch_size_bytes: Option, + + /// Comma-separated list of trusted MSP IDs that this BSP accepts download requests from. + /// Only applicable when running as a BSP provider. + #[arg( + long = "trusted-msps", + value_delimiter = ',', + value_name = "MSP_ID", + help_heading = "BSP Download Authorisation" + )] + pub trusted_msps: Vec, } impl ProviderConfigurations { @@ -669,6 +691,8 @@ impl ProviderConfigurations { trusted_file_transfer_server: self.trusted_file_transfer_server, trusted_file_transfer_server_host: self.trusted_file_transfer_server_host.clone(), trusted_file_transfer_server_port: self.trusted_file_transfer_server_port, + trusted_file_transfer_batch_size_bytes: self.trusted_file_transfer_batch_size_bytes, + trusted_msps: self.trusted_msps.clone(), max_open_forests: self.max_open_forests, // We don't support maintenance mode for now. // maintenance_mode: self.maintenance_mode, diff --git a/operator/node/src/command.rs b/operator/node/src/command.rs index 7346833a..bcd4a3a4 100644 --- a/operator/node/src/command.rs +++ b/operator/node/src/command.rs @@ -37,6 +37,7 @@ use shc_client::builder::{ }; use shc_rpc::RpcConfig; use shp_types::StorageDataUnit; +use sp_core::H256; /// Configuration for the provider. #[derive(Debug, Clone, Deserialize)] @@ -92,6 +93,12 @@ pub struct ProviderOptions { /// Port for trusted file transfer HTTP server. #[serde(default, skip_serializing_if = "Option::is_none")] pub trusted_file_transfer_server_port: Option, + /// Batch size in bytes for trusted file transfer uploads. + #[serde(default, skip_serializing_if = "Option::is_none")] + pub trusted_file_transfer_batch_size_bytes: Option, + /// List of trusted MSP IDs that BSP nodes accept download requests from. + #[serde(default, skip_serializing_if = "Vec::is_empty")] + pub trusted_msps: Vec, // Whether the node is running in maintenance mode. We are not supporting maintenance mode. // pub maintenance_mode: bool, } diff --git a/operator/node/src/service.rs b/operator/node/src/service.rs index b203e7c7..f8f34140 100644 --- a/operator/node/src/service.rs +++ b/operator/node/src/service.rs @@ -1192,19 +1192,10 @@ where let task_spawner = TaskSpawner::new(task_manager.spawn_handle(), task_spawner_name); let mut builder = StorageHubBuilder::::new(task_spawner, prometheus_registry); - // Setup file transfer service (common to all roles) let (file_transfer_request_protocol_name, file_transfer_request_receiver) = file_transfer_request_protocol .expect("FileTransfer request protocol should already be initialised."); - builder - .with_file_transfer( - file_transfer_request_receiver, - file_transfer_request_protocol_name, - network.clone(), - ) - .await; - // Role-specific configuration let rpc_config = match role_options { RoleOptions::Provider(ProviderOptions { @@ -1226,8 +1217,20 @@ where trusted_file_transfer_server, trusted_file_transfer_server_host, trusted_file_transfer_server_port, + trusted_file_transfer_batch_size_bytes, + trusted_msps, .. }) => { + // Setup file transfer service with trusted MSPs config + builder + .with_file_transfer( + client.clone(), + trusted_msps.clone(), + file_transfer_request_receiver, + file_transfer_request_protocol_name, + network.clone(), + ) + .await; info!( "Starting as a Storage Provider. Storage path: {:?}, Max storage capacity: {:?}, Jump capacity: {:?}, MSP charging period: {:?}", storage_path, max_storage_capacity, jump_capacity, msp_charging_period, @@ -1262,11 +1265,17 @@ where } if *trusted_file_transfer_server { + let batch_target_bytes = trusted_file_transfer_batch_size_bytes + .and_then(|size| usize::try_from(size).ok()) + .unwrap_or( + shc_client::trusted_file_transfer::server::DEFAULT_BATCH_TARGET_BYTES, + ); let file_transfer_config = shc_client::trusted_file_transfer::server::Config { host: trusted_file_transfer_server_host .clone() .unwrap_or_else(|| "127.0.0.1".to_string()), port: trusted_file_transfer_server_port.unwrap_or(7070), + batch_target_bytes, }; builder.with_trusted_file_transfer_server(file_transfer_config); } @@ -1281,6 +1290,17 @@ where rpc_config.clone() } RoleOptions::Fisherman(fisherman_options) => { + // Setup file transfer service (no trusted MSPs for fisherman) + builder + .with_file_transfer( + client.clone(), + vec![], + file_transfer_request_receiver, + file_transfer_request_protocol_name, + network.clone(), + ) + .await; + // Validate configuration compatibility with indexer if let Some(indexer_cfg) = indexer_options { if indexer_cfg.indexer_mode == shc_indexer_service::IndexerMode::Lite { diff --git a/operator/pallets/external-validators/src/lib.rs b/operator/pallets/external-validators/src/lib.rs index 5602f78d..7b2fdaf5 100644 --- a/operator/pallets/external-validators/src/lib.rs +++ b/operator/pallets/external-validators/src/lib.rs @@ -309,6 +309,12 @@ pub mod pallet { NoKeysRegistered, /// Unable to derive validator id from account id UnableToDeriveValidatorId, + /// The target era is too old (targetEra <= ActiveEra). Message arrived late. + TargetEraTooOld, + /// The target era is too far ahead (targetEra > ActiveEra + 1). + TargetEraTooNew, + /// The target era has already been seen (targetEra <= ExternalIndex). Duplicate or stale. + DuplicateOrStaleTargetEra, } #[pallet::call] @@ -419,6 +425,9 @@ pub mod pallet { validators: Vec, external_index: u64, ) -> DispatchResult { + // Validate the target era before accepting the validator set + Self::validate_target_era(external_index)?; + // If more validators than max, take the first n let validators = BoundedVec::truncate_from(validators); >::put(&validators); @@ -431,6 +440,27 @@ pub mod pallet { Ok(()) } + fn validate_target_era(target_era: u64) -> DispatchResult { + let active_era_index = Self::active_era() + .map(|info| info.index as u64) + .unwrap_or(0); + let current_external_index = ExternalIndex::::get(); + + // Must target exactly the next era + if target_era <= active_era_index { + return Err(Error::::TargetEraTooOld.into()); + } + if target_era > active_era_index + 1 { + return Err(Error::::TargetEraTooNew.into()); + } + // Dedupe/stale guard + if target_era <= current_external_index { + return Err(Error::::DuplicateOrStaleTargetEra.into()); + } + + Ok(()) + } + /// Helper to set a new `ForceEra` mode. pub(crate) fn set_force_era(mode: Forcing) { log::info!("Setting force era mode {:?}.", mode); diff --git a/operator/pallets/external-validators/src/tests.rs b/operator/pallets/external-validators/src/tests.rs index b25d5ab1..e37bc582 100644 --- a/operator/pallets/external-validators/src/tests.rs +++ b/operator/pallets/external-validators/src/tests.rs @@ -345,10 +345,96 @@ fn era_hooks() { }); } +#[test] +fn target_era_validation_accepts_next_era() { + new_test_ext().execute_with(|| { + // Advance to era 1 (session 6 starts era 1) + run_to_session(6); + + // ActiveEra is now 1, so target era 2 (ActiveEra + 1) should succeed + assert_ok!(ExternalValidators::set_external_validators_inner( + vec![50, 51], + 2 + )); + }); +} + +#[test] +fn target_era_validation_rejects_old_era() { + new_test_ext().execute_with(|| { + // Advance to era 1 + run_to_session(6); + + // target_era = 0 (ActiveEra - 1) should fail + assert_noop!( + ExternalValidators::set_external_validators_inner(vec![50, 51], 0), + Error::::TargetEraTooOld + ); + + // target_era = 1 (== ActiveEra) should also fail + assert_noop!( + ExternalValidators::set_external_validators_inner(vec![50, 51], 1), + Error::::TargetEraTooOld + ); + }); +} + +#[test] +fn target_era_validation_rejects_too_new_era() { + new_test_ext().execute_with(|| { + // Advance to era 1 + run_to_session(6); + + // target_era = 3 (ActiveEra + 2) should fail + assert_noop!( + ExternalValidators::set_external_validators_inner(vec![50, 51], 3), + Error::::TargetEraTooNew + ); + }); +} + +#[test] +fn target_era_validation_rejects_duplicate() { + new_test_ext().execute_with(|| { + // Advance to era 1 + run_to_session(6); + + // First submission with target_era = 2 should succeed + assert_ok!(ExternalValidators::set_external_validators_inner( + vec![50, 51], + 2 + )); + + // Second submission with same target_era = 2 should fail (duplicate) + assert_noop!( + ExternalValidators::set_external_validators_inner(vec![50, 51], 2), + Error::::DuplicateOrStaleTargetEra + ); + }); +} + +#[test] +fn target_era_validation_at_genesis() { + new_test_ext().execute_with(|| { + // At genesis, ActiveEra = 0, so target_era = 1 (ActiveEra + 1) should succeed + assert_ok!(ExternalValidators::set_external_validators_inner( + vec![50, 51], + 1 + )); + + // target_era = 0 should fail (too old, <= ActiveEra) + assert_noop!( + ExternalValidators::set_external_validators_inner(vec![50, 51], 0), + Error::::TargetEraTooOld + ); + }); +} + #[test] fn era_hooks_with_external_index() { new_test_ext().execute_with(|| { - let first_external_index = 1000; + // ActiveEra starts at 0, so target era 1 (ActiveEra + 1) is valid + let first_external_index = 1; assert_ok!(ExternalValidators::set_external_validators_inner( vec![50, 51], first_external_index @@ -356,7 +442,8 @@ fn era_hooks_with_external_index() { run_to_session(8); - let second_external_index = 2000; + // ActiveEra is now 1, so target era 2 (ActiveEra + 1) is valid + let second_external_index = 2; assert_ok!(ExternalValidators::set_external_validators_inner( vec![50, 51], @@ -388,3 +475,81 @@ fn era_hooks_with_external_index() { assert_eq!(Mock::mock().called_hooks, expected_calls); }); } + +#[test] +fn set_external_validators_extrinsic_rejects_bad_origin() { + new_test_ext().execute_with(|| { + // signed by an arbitrary non-root account → BadOrigin + assert_noop!( + ExternalValidators::set_external_validators(RuntimeOrigin::signed(1), vec![50, 51], 1), + BadOrigin + ); + + // unsigned → BadOrigin + assert_noop!( + ExternalValidators::set_external_validators(RuntimeOrigin::none(), vec![50, 51], 1), + BadOrigin + ); + + // root origin (requires signed(777) specifically, not sudo root) → BadOrigin + assert_noop!( + ExternalValidators::set_external_validators(RuntimeOrigin::root(), vec![50, 51], 1), + BadOrigin + ); + + // success with the correct signed origin + assert_ok!(ExternalValidators::set_external_validators( + RuntimeOrigin::signed(RootAccount::get()), + vec![50, 51], + 1 + )); + }); +} + +#[test] +fn target_era_validation_rejects_u64_max() { + new_test_ext().execute_with(|| { + // At genesis, active_era = 0; u64::MAX is far above active_era + 1 + assert_noop!( + ExternalValidators::set_external_validators_inner(vec![50, 51], u64::MAX), + Error::::TargetEraTooNew + ); + }); +} + +#[test] +fn era_boundary_race_submit_advance_resubmit() { + new_test_ext().execute_with(|| { + // At genesis (active_era = 0), submit for era 1 + assert_ok!(ExternalValidators::set_external_validators_inner( + vec![50, 51], + 1 + )); + + // Advance to era 1 (session 6 starts era 1) + run_to_session(6); + + // Re-submit for era 1 now that active_era = 1 → TargetEraTooOld + assert_noop!( + ExternalValidators::set_external_validators_inner(vec![50, 51], 1), + Error::::TargetEraTooOld + ); + }); +} + +#[test] +fn era_boundary_race_resubmit_without_advance() { + new_test_ext().execute_with(|| { + // At genesis (active_era = 0), submit for era 1 + assert_ok!(ExternalValidators::set_external_validators_inner( + vec![50, 51], + 1 + )); + + // Immediately re-submit for era 1 without advancing → DuplicateOrStaleTargetEra + assert_noop!( + ExternalValidators::set_external_validators_inner(vec![50, 51], 1), + Error::::DuplicateOrStaleTargetEra + ); + }); +} diff --git a/operator/runtime/mainnet/src/configs/mod.rs b/operator/runtime/mainnet/src/configs/mod.rs index c47d432c..fe152317 100644 --- a/operator/runtime/mainnet/src/configs/mod.rs +++ b/operator/runtime/mainnet/src/configs/mod.rs @@ -1838,7 +1838,7 @@ mod tests { message_id: EL_MESSAGE_ID, message: BridgeMessage::V1(InboundCommand::ReceiveValidators { validators: Vec::new(), - external_index: 0, + external_index: 1, }), }; diff --git a/operator/runtime/stagenet/src/configs/mod.rs b/operator/runtime/stagenet/src/configs/mod.rs index 25be93a7..b07e9a5c 100644 --- a/operator/runtime/stagenet/src/configs/mod.rs +++ b/operator/runtime/stagenet/src/configs/mod.rs @@ -1819,7 +1819,7 @@ mod tests { message_id: EL_MESSAGE_ID, message: BridgeMessage::V1(InboundCommand::ReceiveValidators { validators: Vec::new(), - external_index: 0, + external_index: 1, }), }; diff --git a/operator/runtime/testnet/src/configs/mod.rs b/operator/runtime/testnet/src/configs/mod.rs index 826e00cc..2ea41697 100644 --- a/operator/runtime/testnet/src/configs/mod.rs +++ b/operator/runtime/testnet/src/configs/mod.rs @@ -1841,7 +1841,7 @@ mod tests { message_id: EL_MESSAGE_ID, message: BridgeMessage::V1(InboundCommand::ReceiveValidators { validators: Vec::new(), - external_index: 0, + external_index: 1, }), }; diff --git a/specs/validator-set-selection/validator-set-selection.md b/specs/validator-set-selection/validator-set-selection.md new file mode 100644 index 00000000..b13f4680 --- /dev/null +++ b/specs/validator-set-selection/validator-set-selection.md @@ -0,0 +1,247 @@ +# Validator Set Selection Specification +## Top-32 by Weighted Stake (Continuation of PR #433) + +- Status: Draft +- Owners: DataHaven Team +- Last Updated: February 12, 2026 +- Depends on: PR #433 (`feat: automated validator set submission with era targeting`) + +## 1. Summary + +PR #433 introduced era-targeted validator-set submission with a dedicated submitter role and runtime era validation. This spec is a continuation of that work. + +This document adds deterministic weighted-stake selection so the outbound validator set is ranked before it is bridged: + +1. Ethereum computes weighted stake per operator. +2. Ethereum deterministically sorts operators and selects top candidates. +3. DataHaven enforces a final total active authority cap of 32 after combining whitelisted and external validators. + +The era-targeting model from PR #433 remains unchanged. + +## 2. Baseline From PR #433 + +This spec assumes the following behavior already exists: + +1. `DataHavenServiceManager.sendNewValidatorSetForEra(uint64 targetEra, ...)` is used for submission. +2. Submission is restricted to `validatorSetSubmitter` (`onlyValidatorSetSubmitter`). +3. `external_index` in the Snowbridge payload is the `targetEra`. +4. DataHaven runtime enforces era validity (`targetEra` old/too-new/duplicate checks). + +## 3. Goals + +1. Select external validators by weighted stake instead of raw member ordering. +2. Keep selection deterministic (`same chain state -> same selected set`). +3. Preserve PR #433 era-targeting invariants and submitter authorization flow. +4. Enforce total active authority cap = 32 (`whitelisted + external`). +5. Keep payload shape stable unless there is a hard requirement to version it. + +## 4. Non-Goals + +1. Replacing PR #433 submitter-role model. +2. Changing PR #433 era-target validation semantics. +3. Redesigning Snowbridge transport internals. +4. Changing reward formulas in this spec. + +## 5. Current Behavior (Post-PR #433) + +### 5.1 Ethereum + +`buildNewValidatorSetMessageForEra(targetEra)` gathers all operator-set members with a mapped solochain address and forwards them in that order. There is no stake-based ranking. + +### 5.2 Payload + +Current payload carries: + +1. `validators` +2. `external_index` (interpreted as `targetEra`) + +### 5.3 DataHaven Runtime + +`set_external_validators_inner()` stores incoming validators and `ExternalIndex`, then era application and validator composition logic consume them. + +### 5.4 Limitation + +Without stake-aware ordering, high-stake operators may be displaced by lower-stake operators when list size pressure or downstream caps apply. + +## 6. Design Decisions + +### D1. Do ranking on Ethereum + +EigenLayer membership/allocation context is available on Ethereum, so weighted ranking is computed there. + +### D2. Keep PR #433 era semantics unchanged + +`external_index` must continue to encode `targetEra`. This spec does not repurpose it (no nonce/block-number substitution). + +### D3. Deterministic tie-break + +For equal weighted stake, lower Ethereum operator address wins. + +### D4. Cap applies to total active authorities + +Final active validator set must satisfy: + +`final_active = take_32(dedupe(whitelisted ++ external_sorted_limited))` + +### D5. Strategy multipliers are explicit and default to zero if unset + +Multipliers are owner-managed in `strategiesAndMultipliers`. If an entry is unset for a strategy, its effective multiplier is `0` (no weighted contribution). + +### D6. Keep strategy list and multipliers in sync + +Multiplier lifecycle is tied to strategy lifecycle: + +1. Add strategy -> add multiplier in the same call via `IRewardsCoordinatorTypes.StrategyAndMultiplier` struct. +2. Remove strategy -> delete multiplier in the same call. + +## 7. Weighted Stake Model + +For each operator `o`: + +`weightedStake(o) = sum_i( allocatedStake(o, strategy_i) * multiplier(strategy_i) )` + +Where: + +1. `allocatedStake` comes from EigenLayer allocation data. +2. `multiplier` is a per-strategy weight (no normalization divisor is applied during ranking). + +### 7.1 Strategy Weight Semantics + +1. Every supported strategy should have an explicit multiplier entry for operational clarity. +2. Missing multiplier entry is treated as `0` multiplier. +3. Multiplier values are managed explicitly by owner/governance. + +### 7.2 Unit Assumption + +Stake inputs must be unit-consistent across strategies. If they are not, normalize before summing. + +## 8. Ethereum Contract Changes (On Top of PR #433) + +File: `contracts/src/DataHavenServiceManager.sol` + +### 8.1 New State + +```solidity +uint32 public constant MAX_ACTIVE_VALIDATORS = 32; +mapping(IStrategy => uint96) public strategiesAndMultipliers; +``` + +### 8.2 New/Updated Admin APIs + +```solidity +function setStrategiesAndMultipliers(IRewardsCoordinatorTypes.StrategyAndMultiplier[] calldata strategyMultipliers) external onlyOwner; +function addStrategiesToValidatorsSupportedStrategies(IRewardsCoordinatorTypes.StrategyAndMultiplier[] calldata strategyMultipliers) external onlyOwner; +function removeStrategiesFromValidatorsSupportedStrategies(IStrategy[] calldata strategies) external onlyOwner; +function getStrategiesAndMultipliers() external view returns (IRewardsCoordinatorTypes.StrategyAndMultiplier[] memory); +``` + +Using EigenLayer's `StrategyAndMultiplier` struct pairs each strategy with its multiplier, eliminating the possibility of length mismatches between parallel arrays. Duplicate strategies in `addStrategies` are rejected by EigenLayer's `StrategyAlreadyInOperatorSet` check; duplicates in `setStrategiesAndMultipliers` are harmless (last-write-wins on the mapping). + +### 8.3 Updated Selection Flow + +`buildNewValidatorSetMessageForEra(uint64 targetEra)` should: + +1. Read validator operator set members. +2. Compute weighted stake per operator. +3. Filter out operators with no solochain mapping. +4. Resolve multiplier from `strategiesAndMultipliers` for each strategy used. +5. If any strategy is missing a multiplier entry, treat it as `0` multiplier. +6. Filter out operators with zero weighted stake. +7. Select at most `MAX_ACTIVE_VALIDATORS` (32) candidates by weighted stake desc + address asc tie-break (if fewer than 32 eligible candidates exist, include all). +8. Encode using existing payload shape with `externalIndex = targetEra`. + +For any EigenLayer call that consumes `StrategyAndMultiplier[]`, materialize the list in ascending strategy-address order. + +`sendNewValidatorSetForEra(...)` and `onlyValidatorSetSubmitter` remain unchanged from PR #433. + +## 9. Bridge Message Format + +No payload version bump in this spec. + +Continue using existing `ReceiveValidators` message shape: + +```text +[EL_MESSAGE_ID] +[MessageVersion] +[ReceiveValidators] +[validator_count] +[validators (N * 20B)] +[external_index (u64 targetEra)] +``` + +If stake vectors are required in the future, that should be a separate versioned command proposal. + +## 10. DataHaven Runtime Changes + +File: `operator/pallets/external-validators/src/lib.rs` + +### 10.1 Keep PR #433 era validation + +Retain existing target-era gates and error semantics (`TargetEraTooOld`, `TargetEraTooNew`, `DuplicateOrStaleTargetEra`). + +### 10.2 Enforce final total cap = 32 + +At validator composition time: + +1. `w = whitelisted.len()` +2. `external_budget = 32.saturating_sub(w)` +3. Use at most `external_budget` external validators from the ranked list. +4. Build final set as `take_32(dedupe(whitelisted ++ external_limited))`. + +### 10.3 Runtime constants + +`MaxExternalValidators` can remain a defensive bound, but final active enforcement must guarantee max 32 authorities. + +## 11. Rollout Plan + +1. Merge/deploy PR #433 baseline first (submitter role + era-target checks). +2. Deploy ServiceManager upgrade with weighted ranking logic. +3. Backfill/confirm `strategiesAndMultipliers` for all currently supported strategies. +4. Deploy runtime changes for final total-cap enforcement. +5. Re-run submitter daemon unchanged (it still submits `targetEra = ActiveEra + 1`). +6. Monitor across multiple era cycles before production rollout. + +## 12. Testing Plan + +### 12.1 Solidity + +1. Weighted stake computation across multiple strategies. +2. Deterministic tie-break behavior. +3. Top-32 selection when candidate count exceeds 32. +4. Behavior when candidate count is below 32. +5. Zero-stake filtering. +6. Missing multiplier entries are treated as zero contribution. +7. `addStrategies...` sets multipliers atomically via `StrategyAndMultiplier` struct. +8. `removeStrategies...` removes multiplier entries for removed strategies. +9. `getStrategiesAndMultipliers()` returns a list matching EigenLayer's operator set strategies. +11. Integration with `buildNewValidatorSetMessageForEra(targetEra)` and correct target era encoding. + +### 12.2 Runtime + +1. Existing PR #433 era-validation tests continue to pass unchanged. +2. Final active authority cap remains <= 32 with mixed whitelisted/external sets. +3. Composition logic preserves whitelisted priority while enforcing cap. + +### 12.3 Integration / E2E + +1. End-to-end submission through `sendNewValidatorSetForEra` with ranked validator output. +2. Delayed relay still fails with PR #433 semantics (no regressions). +3. Ranked selection outcome is deterministic across repeated runs at fixed state. + +## 13. Security Considerations + +1. Owner-managed strategy weights are governance-sensitive and should remain multisig/governance controlled. +2. Deterministic ordering prevents non-deterministic set drift. +3. Preserve PR #433 stale/duplicate/too-early rejection invariants. +4. Apply overflow checks in weighted arithmetic and any integer downcasts. + +## 14. File Change Summary + +1. `contracts/src/DataHavenServiceManager.sol` + - weighted stake computation and deterministic top selection in `buildNewValidatorSetMessageForEra`. +2. `contracts/src/interfaces/IDataHavenServiceManager.sol` + - `strategiesAndMultipliers` naming and add/remove strategy API signature updates with multipliers. +3. `operator/pallets/external-validators/src/lib.rs` + - final authority cap enforcement at composition time (while keeping PR #433 era validation behavior). +4. `contracts/test/*`, `operator/pallets/external-validators/src/tests.rs`, `test/e2e/suites/validator-set-update.test.ts` + - unit/runtime/e2e coverage for weighted selection + strategy/multiplier sync + cap behavior + non-regression on era-targeted flow. diff --git a/specs/validator-set-submission/validator-set-submission.md b/specs/validator-set-submission/validator-set-submission.md new file mode 100644 index 00000000..bfcf47b6 --- /dev/null +++ b/specs/validator-set-submission/validator-set-submission.md @@ -0,0 +1,268 @@ +# Validator Set Submission +**Status:** Accepted +**Owner:** DataHaven Protocol / AVS Integration +**Last Updated:** 2026-02-11 +**Scope:** Ethereum -> Snowbridge -> DataHaven validator set synchronization + +## Background +This specification defines an automation-first validator-set synchronization flow. +In this document: +- the validator-set submitter runs once per era window, and +- each message is valid only for the immediate next era. +The primary objective is to run an off-chain validator-set-submitter that automatically calls validator-set submission without manual intervention. +The design is: +1. Validator-set messages are permissioned on Ethereum by a dedicated submitter role. +2. The payload field `external_index` is used as `targetEra` (the era the message is intended for). +3. DataHaven accepts a message only if it targets the next era at receive time. +4. Delayed messages for past eras are rejected and never applied to later eras. +This enforces the invariant: **at most one canonical validator-set apply per target era, and no late-era spillover**. + +### Current mechanism (as-is) +- Manual and one-shot submission flow is done via `test/scripts/update-validator-set.ts`. +- `sendNewValidatorSet(uint128 executionFee, uint128 relayerFee)` in `contracts/src/DataHavenServiceManager.sol` is owner-only. +- Message building currently does not carry explicit era intent. +- DataHaven inbound processing applies decoded `external_index` without era-target validation. +- Operational flow relies on fixed fee constants and has no automated submission pipeline. + +## Problems addressed by this spec +- Manual operation for validator-set submission. +- Late relay can cause old messages to arrive after their intended era. +- Ambiguity between "message order" and "era intent". +- Owner-key usage for routine automated submissions. + +## Goals +1. Run an off-chain component that automatically submits validator-set updates in the required era window. +2. Ensure each message is explicitly bound to a specific target era. +3. Accept a message only when it targets the immediate next era. +4. Reject delayed (past-era), duplicate, and too-far-ahead messages deterministically. +5. Accept that a failed submission for a given era is permanently missed (single submission window per era). +6. Avoid skipping era advancement even when validator addresses are unchanged. + +### Non-goals +- Redesigning Snowbridge protocol internals. +- Replacing the existing owner/governance model outside submitter assignment. +- Building a multi-node HA control plane (single submitter process is acceptable initially). + +## Terminology +- `ActiveEra`: era currently active on DataHaven. +- `NextEra`: `ActiveEra + 1`. +- `targetEra`: era this validator-set message is intended for. +- `external_index`: payload field; in this design, its value is `targetEra`. +- `ExternalIndex`: latest bridge-received `targetEra` accepted on DataHaven. +- `PendingExternalIndex`: staged external index applied when the next era starts. +- `CurrentExternalIndex`: external index currently applied to the active era. +- `Canonical apply`: the accepted validator-set apply for a specific `targetEra`. + +## Proposed design + +### High-level overview +The solution centers on a long-running off-chain validator-set-submitter under `test/tools/` that automatically submits validator-set updates. +Contract and runtime changes make the submitter service safe and deterministic: +- only the submitter role can send validator-set messages, +- payloads include explicit era intent (`targetEra`), and +- DataHaven accepts only messages targeting `NextEra`. +The submitter subscribes to finalized session changes via PAPI's `watchValue("finalized")` on `Session.CurrentIndex`. On each session change it evaluates whether submission is needed, and acts during the last session of the active era. Each era gets a single submission attempt — if it fails, the era is missed and the submitter moves on. + +``` +┌───────────────────────────────┐ submit (for era) ┌───────────────────────────────┐ +│ Validator-Set-Submitter │ ──────────────────────────► │ ServiceManager (Ethereum) │ +│ - watches session changes │ │ - submitter-gated API │ +│ - computes targetEra │ │ - builds payload with target │ +│ - single attempt per era │ └───────────────┬───────────────┘ +└───────────────────────────────┘ │ + │ Snowbridge message + ▼ +┌────────────────────────────────────────────────────────────────────────────────────────────────┐ +│ DataHaven inbound (`operator/primitives/bridge`) + external validators pallet │ +│ - authorized origin check │ +│ - era gate: targetEra == ActiveEra + 1 │ +│ - duplicate/stale gate: targetEra > ExternalIndex │ +│ - delayed messages for past eras are rejected │ +└────────────────────────────────────────────────────────────────────────────────────────────────┘ +``` + +### A) Ethereum contract changes +**Target contract** +- `contracts/src/DataHavenServiceManager.sol` + +**Permissioned submitter role** +- Add state: + - `address public validatorSetSubmitter` +- Add admin API: + - `setValidatorSetSubmitter(address newSubmitter) external onlyOwner` + - `newSubmitter` MUST be non-zero + - emit `ValidatorSetSubmitterUpdated(oldSubmitter, newSubmitter)` +- Add modifier: + - `onlyValidatorSetSubmitter` (revert unless `msg.sender == validatorSetSubmitter`) + +**Era-targeted submission** +- Add submission API: + - `sendNewValidatorSetForEra(uint64 targetEra, uint128 executionFee, uint128 relayerFee) external payable onlyValidatorSetSubmitter` + - builds validator payload with `targetEra` + - calls gateway `v2_sendMessage` + - emits `ValidatorSetMessageSubmitted` +- Add builder API: + - `buildNewValidatorSetMessageForEra(uint64 targetEra) public view returns (bytes memory)` + - encodes `targetEra` as `external_index` + +**Legacy submission path** +- Legacy `sendNewValidatorSet(uint128,uint128)` must be removed from the production contract. + +**Contract-side trust scope (this release)** +- No additional `lastSubmittedTargetEra` contract guard is required in this release. +- Rationale: submission is permissioned and runtime is the source of truth for era correctness (`targetEra == ActiveEra + 1`). + +**Events** +- `event ValidatorSetSubmitterUpdated(address indexed oldSubmitter, address indexed newSubmitter);` +- `event ValidatorSetMessageSubmitted(uint64 indexed targetEra, bytes32 payloadHash, address indexed submitter);` + +### B) Runtime changes (DataHaven) +**Target processor** +- `operator/primitives/bridge/src/lib.rs` in `EigenLayerMessageProcessor::process_message` + +**Era-target validation rule** +Before `set_external_validators_inner`, validate `targetEra`: +1. Must satisfy `targetEra == ActiveEra + 1` +2. Must satisfy `targetEra > ExternalIndex` (dedupe/stale guard) +Reject cases: +- `targetEra <= ActiveEra`: delayed/past-era message. +- `targetEra > ActiveEra + 1`: too-far-ahead message. +- `targetEra <= ExternalIndex`: stale/duplicate message. +This ensures a delayed message cannot be applied to a later era. + +**Error semantics** +Return deterministic dispatch errors, for example: +- `TargetEraTooOld` +- `TargetEraTooNew` +- `DuplicateOrStaleTargetEra` + +**Authorization** +- Keep existing authorized-origin checks unchanged. + +### C) Validator-set-submitter service (`test/tools/`) +**Location and runtime model** +- New component at `test/tools/validator-set-submitter/` +- Long-running daemon +- TypeScript + Bun + +**Authoritative inputs** +- DataHaven: + - `ActiveEra` + - `ExternalIndex` + - `CurrentExternalIndex` + - `SessionsPerEra` and era-window session boundaries +- Ethereum: + - current validator set view from ServiceManager message-builder inputs + +**Target era computation** +- `targetEra = ActiveEra + 1` + +**Submission model** +- Submitter subscribes to finalized `Session.CurrentIndex` via PAPI `watchValue("finalized")`. +- On each session change, evaluates preconditions: `ActiveEra` set, `targetEra` not already processed, `ExternalIndex < targetEra`, and current session is the last session of the era. +- One submission attempt per era window. If the attempt fails (revert, missing event, or error), the era is marked as processed and permanently missed. +- Rationale: `validate_target_era` on the Substrate side rejects `targetEra <= activeEraIndex`, so once `ActiveEra` advances past the target, retries are impossible. +- Overlapping session emissions are dropped via RxJS `exhaustMap`. + +**Delay/gap behavior (required)** +- If message for era `N` is delayed and arrives after `ActiveEra >= N`, it is rejected. +- If message for era `N` never relays, the system can still proceed by submitting for era `N+1` when `ActiveEra = N`. +- Out-of-order future messages are rejected until they become the next era target. + +**Success criteria** +- Transaction receipt status is `success`. +- `OutboundMessageAccepted` event emitted in receipt logs. + +**State model** +- Submitter is recoverable from chain state (reads `ActiveEra`, `ExternalIndex`, and session boundaries on each tick). +- In-memory state is limited to `submittedEra` (the last processed target era), held in a closure. + +## API / interface changes + +### Ethereum interface +- Add era-targeted submit function. +- Add submitter admin function + getter. +- Add era-targeted builder function. + +### DataHaven runtime behavior +- Add next-era-only acceptance in inbound bridge path. +- Add explicit delayed/too-early/duplicate rejection paths. + +### Tooling +- New daemon CLI entrypoint: + - `bun test/tools/validator-set-submitter/main.ts run` + - optional `--dry-run` + +## Security considerations +- Submitter key compromise risk is reduced by dedicated role separation (vs broad owner use). +- Era-target checks prevent delayed-message replay into later eras. +- Authorized-origin restriction remains required and unchanged. +- Single-attempt model eliminates fee burn loops; a failed era is missed rather than retried. + +## Observability and operations +Required metrics/log dimensions: +- `targetEra` +- current `ActiveEra` and `ExternalIndex` +- current session index +- outbound tx hash +- fee pair used +- submission outcome (success / revert / missing event / error) +Alert conditions: +- missed submission window (failed attempt logged as "era will be missed") +- repeated era misses across consecutive eras +- subscription errors on `Session.CurrentIndex` + +## Testing + +### Solidity tests +- submitter-only enforcement +- submitter rotation by owner +- payload encodes caller `targetEra` +- event fields emitted correctly +- zero-address submitter rejected +- legacy `sendNewValidatorSet` path is removed (no callable legacy submit path) + +### Runtime tests +- accepts only `targetEra == ActiveEra + 1` +- rejects `targetEra <= ActiveEra` (late) +- rejects `targetEra > ActiveEra + 1` (too early) +- rejects `targetEra <= ExternalIndex` (duplicate/stale) +- origin authorization behavior unchanged + +### Integration tests +- one canonical apply per target era +- delayed message for old era is rejected after era advances +- missing relay for era `N` does not block acceptance for era `N+1` when it becomes next +- boundary race: arrival at era transition behaves correctly (`N` stale, `N+1` accepted) + +## Rollout +1. Implement and test contract + runtime changes. +2. Deploy to stagenet. +3. Run submitter service in dry-run mode and validate era-target decisions. +4. Enable active mode. +5. Monitor across multiple era cycles. +6. Promote to mainnet after stability criteria are met. + +## Dependencies +- Existing manual script `test/scripts/update-validator-set.ts` may remain for emergency/manual use, but must be marked non-canonical. +- Legacy unscoped submit path `sendNewValidatorSet` must be removed in production. + +## Possible improvements (future) +- Keep this release simple: `external_index` carries `targetEra`, and runtime enforces next-era-only acceptance. +- Add a generalized failure-handling strategy for the submitter, including retry behavior for transient issues while preserving safety and idempotency. +- Add generalized resiliency for event watching and connectivity, including recovery after disconnects and missed updates. +- Add production monitoring and operations dashboards (for example Prometheus/Grafana) covering service health, submission outcomes, retries, missed eras, and end-to-end latency. +- Add alerting/SLO definitions for validator-set submission reliability and response runbooks for incidents. +- Alternative direction: remove era dependency from payload and use an Ethereum-stamped freshness model: + - `ServiceManager` assigns message metadata on-chain (e.g., `issuedAt` timestamp and monotonic message nonce/ID). + - DataHaven accepts only fresh messages within a configured max relay delay and rejects expired ones. + - This reduces trust in submitter-provided era values while preserving deterministic stale/duplicate rejection. + +## Acceptance criteria +This spec is accepted when: +- an off-chain validator-set-submitter runs unattended and automatically submits validator-set updates +- dedicated submitter role exists and is enforced +- era-targeted submission API is live +- runtime applies messages only when they target the next era +- delayed messages for past eras are rejected and not applied to later eras +- end-to-end tests pass for delayed/missing/out-of-order scenarios diff --git a/test/.papi/descriptors/package.json b/test/.papi/descriptors/package.json index b7060c4b..d7be6139 100644 --- a/test/.papi/descriptors/package.json +++ b/test/.papi/descriptors/package.json @@ -1,5 +1,5 @@ { - "version": "0.1.0-autogenerated.17981369281038341211", + "version": "0.1.0-autogenerated.13357056092938763018", "name": "@polkadot-api/descriptors", "files": [ "dist" diff --git a/test/.papi/metadata/datahaven.scale b/test/.papi/metadata/datahaven.scale index 0b0e1f95..5b2fcad3 100644 Binary files a/test/.papi/metadata/datahaven.scale and b/test/.papi/metadata/datahaven.scale differ diff --git a/test/cli/handlers/launch/index.ts b/test/cli/handlers/launch/index.ts index 922a16da..a6f90f51 100644 --- a/test/cli/handlers/launch/index.ts +++ b/test/cli/handlers/launch/index.ts @@ -13,7 +13,7 @@ import { setParametersFromCollection } from "./parameters"; import { launchRelayers } from "./relayer"; import { launchStorageHubComponents } from "./storagehub"; import { performSummaryOperations } from "./summary"; -import { performValidatorOperations } from "./validator"; +import { performValidatorOperations, performValidatorSetUpdate } from "./validator"; export const NETWORK_ID = "cli-launch"; @@ -43,6 +43,7 @@ export interface LaunchOptions { deployContracts?: boolean; fundValidators?: boolean; setupValidators?: boolean; + updateValidatorSet?: boolean; setParameters?: boolean; relayer?: boolean; relayerImageTag: string; @@ -84,8 +85,9 @@ const launchFunction = async (options: LaunchOptions, launchedNetwork: LaunchedN } // skip deploying contracts if we have injected it + let contractsDeployed = false; if (options.deployContracts && !options.injectContracts) { - const contractsDeployed = await deployContracts({ + contractsDeployed = await deployContracts({ rpcUrl: launchedNetwork.elRpcUrl, verified: options.verified, blockscoutBackendUrl, @@ -107,6 +109,8 @@ const launchFunction = async (options: LaunchOptions, launchedNetwork: LaunchedN await launchRelayers(options, launchedNetwork); + await performValidatorSetUpdate(options, launchedNetwork.elRpcUrl, contractsDeployed); + await launchStorageHubComponents(options, launchedNetwork); await performSummaryOperations(options, launchedNetwork); diff --git a/test/cli/handlers/launch/validator.ts b/test/cli/handlers/launch/validator.ts index bcfa071a..6cdb901c 100644 --- a/test/cli/handlers/launch/validator.ts +++ b/test/cli/handlers/launch/validator.ts @@ -75,11 +75,31 @@ export const performValidatorOperations = async ( * @returns Promise resolving when the operation is complete */ export const performValidatorSetUpdate = async ( + options: LaunchOptions, networkRpcUrl: string, contractsDeployed: boolean ) => { printHeader("Updating DataHaven Validator Set"); + let shouldUpdateValidatorSet = options.updateValidatorSet; + if (shouldUpdateValidatorSet === undefined) { + shouldUpdateValidatorSet = await confirmWithTimeout( + "Do you want to update the validator set?", + true, + 10 + ); + } else { + logger.info( + `🏳️ Using flag option: ${shouldUpdateValidatorSet ? "will update" : "will not update"} validator set` + ); + } + + if (!shouldUpdateValidatorSet) { + logger.info("👍 Skipping validator set update"); + printDivider(); + return; + } + if (!contractsDeployed) { logger.warn( "⚠️ Updating validator set but contracts were not deployed in this CLI run. Could have unexpected results." diff --git a/test/contract-bindings/generated.ts b/test/contract-bindings/generated.ts index 55edfbd6..ce7b724f 100644 --- a/test/contract-bindings/generated.ts +++ b/test/contract-bindings/generated.ts @@ -2054,6 +2054,13 @@ export const dataHavenServiceManagerAbi = [ outputs: [{ name: '', internalType: 'string', type: 'string' }], stateMutability: 'view', }, + { + type: 'function', + inputs: [], + name: 'MAX_ACTIVE_VALIDATORS', + outputs: [{ name: '', internalType: 'uint32', type: 'uint32' }], + stateMutability: 'view', + }, { type: 'function', inputs: [], @@ -2065,9 +2072,17 @@ export const dataHavenServiceManagerAbi = [ type: 'function', inputs: [ { - name: '_strategies', - internalType: 'contract IStrategy[]', - type: 'address[]', + name: '_strategyMultipliers', + internalType: 'struct IRewardsCoordinatorTypes.StrategyAndMultiplier[]', + type: 'tuple[]', + components: [ + { + name: 'strategy', + internalType: 'contract IStrategy', + type: 'address', + }, + { name: 'multiplier', internalType: 'uint96', type: 'uint96' }, + ], }, ], name: 'addStrategiesToValidatorsSupportedStrategies', @@ -2083,8 +2098,8 @@ export const dataHavenServiceManagerAbi = [ }, { type: 'function', - inputs: [], - name: 'buildNewValidatorSetMessage', + inputs: [{ name: 'targetEra', internalType: 'uint64', type: 'uint64' }], + name: 'buildNewValidatorSetMessageForEra', outputs: [{ name: '', internalType: 'bytes', type: 'bytes' }], stateMutability: 'view', }, @@ -2109,21 +2124,55 @@ export const dataHavenServiceManagerAbi = [ outputs: [], stateMutability: 'nonpayable', }, + { + type: 'function', + inputs: [], + name: 'getStrategiesAndMultipliers', + outputs: [ + { + name: '', + internalType: 'struct IRewardsCoordinatorTypes.StrategyAndMultiplier[]', + type: 'tuple[]', + components: [ + { + name: 'strategy', + internalType: 'contract IStrategy', + type: 'address', + }, + { name: 'multiplier', internalType: 'uint96', type: 'uint96' }, + ], + }, + ], + stateMutability: 'view', + }, { type: 'function', inputs: [ { name: 'initialOwner', internalType: 'address', type: 'address' }, { name: '_rewardsInitiator', internalType: 'address', type: 'address' }, { - name: 'validatorsStrategies', - internalType: 'contract IStrategy[]', - type: 'address[]', + name: 'validatorsStrategiesAndMultipliers', + internalType: 'struct IRewardsCoordinatorTypes.StrategyAndMultiplier[]', + type: 'tuple[]', + components: [ + { + name: 'strategy', + internalType: 'contract IStrategy', + type: 'address', + }, + { name: 'multiplier', internalType: 'uint96', type: 'uint96' }, + ], }, { name: '_snowbridgeGatewayAddress', internalType: 'address', type: 'address', }, + { + name: '_validatorSetSubmitter', + internalType: 'address', + type: 'address', + }, { name: 'initialVersion', internalType: 'string', type: 'string' }, { name: '_versionUpdater', internalType: 'address', type: 'address' }, ], @@ -2187,10 +2236,11 @@ export const dataHavenServiceManagerAbi = [ { type: 'function', inputs: [ + { name: 'targetEra', internalType: 'uint64', type: 'uint64' }, { name: 'executionFee', internalType: 'uint128', type: 'uint128' }, { name: 'relayerFee', internalType: 'uint128', type: 'uint128' }, ], - name: 'sendNewValidatorSet', + name: 'sendNewValidatorSetForEra', outputs: [], stateMutability: 'payable', }, @@ -2216,6 +2266,36 @@ export const dataHavenServiceManagerAbi = [ outputs: [], stateMutability: 'nonpayable', }, + { + type: 'function', + inputs: [ + { + name: '_strategyMultipliers', + internalType: 'struct IRewardsCoordinatorTypes.StrategyAndMultiplier[]', + type: 'tuple[]', + components: [ + { + name: 'strategy', + internalType: 'contract IStrategy', + type: 'address', + }, + { name: 'multiplier', internalType: 'uint96', type: 'uint96' }, + ], + }, + ], + name: 'setStrategiesAndMultipliers', + outputs: [], + stateMutability: 'nonpayable', + }, + { + type: 'function', + inputs: [ + { name: 'newSubmitter', internalType: 'address', type: 'address' }, + ], + name: 'setValidatorSetSubmitter', + outputs: [], + stateMutability: 'nonpayable', + }, { type: 'function', inputs: [ @@ -2255,6 +2335,13 @@ export const dataHavenServiceManagerAbi = [ outputs: [{ name: '', internalType: 'address', type: 'address' }], stateMutability: 'view', }, + { + type: 'function', + inputs: [{ name: '', internalType: 'contract IStrategy', type: 'address' }], + name: 'strategiesAndMultipliers', + outputs: [{ name: '', internalType: 'uint96', type: 'uint96' }], + stateMutability: 'view', + }, { type: 'function', inputs: [ @@ -2342,6 +2429,20 @@ export const dataHavenServiceManagerAbi = [ outputs: [{ name: '', internalType: 'address', type: 'address' }], stateMutability: 'view', }, + { + type: 'function', + inputs: [], + name: 'validatorSetSubmitter', + outputs: [{ name: '', internalType: 'address', type: 'address' }], + stateMutability: 'view', + }, + { + type: 'function', + inputs: [{ name: '', internalType: 'address', type: 'address' }], + name: 'validatorSolochainAddressToEthAddress', + outputs: [{ name: '', internalType: 'address', type: 'address' }], + stateMutability: 'view', + }, { type: 'function', inputs: [{ name: '', internalType: 'address', type: 'address' }], @@ -2501,6 +2602,27 @@ export const dataHavenServiceManagerAbi = [ ], name: 'SolochainAddressUpdated', }, + { + type: 'event', + anonymous: false, + inputs: [ + { + name: 'strategyMultipliers', + internalType: 'struct IRewardsCoordinatorTypes.StrategyAndMultiplier[]', + type: 'tuple[]', + components: [ + { + name: 'strategy', + internalType: 'contract IStrategy', + type: 'address', + }, + { name: 'multiplier', internalType: 'uint96', type: 'uint96' }, + ], + indexed: false, + }, + ], + name: 'StrategiesAndMultipliersSet', + }, { type: 'event', anonymous: false, @@ -2527,6 +2649,50 @@ export const dataHavenServiceManagerAbi = [ ], name: 'ValidatorRemovedFromAllowlist', }, + { + type: 'event', + anonymous: false, + inputs: [ + { + name: 'targetEra', + internalType: 'uint64', + type: 'uint64', + indexed: true, + }, + { + name: 'payloadHash', + internalType: 'bytes32', + type: 'bytes32', + indexed: false, + }, + { + name: 'submitter', + internalType: 'address', + type: 'address', + indexed: true, + }, + ], + name: 'ValidatorSetMessageSubmitted', + }, + { + type: 'event', + anonymous: false, + inputs: [ + { + name: 'oldSubmitter', + internalType: 'address', + type: 'address', + indexed: true, + }, + { + name: 'newSubmitter', + internalType: 'address', + type: 'address', + indexed: true, + }, + ], + name: 'ValidatorSetSubmitterUpdated', + }, { type: 'event', anonymous: false, @@ -2568,12 +2734,17 @@ export const dataHavenServiceManagerAbi = [ { type: 'error', inputs: [], name: 'CallerIsNotValidator' }, { type: 'error', inputs: [], name: 'CantDeregisterFromMultipleOperatorSets' }, { type: 'error', inputs: [], name: 'CantRegisterToMultipleOperatorSets' }, + { type: 'error', inputs: [], name: 'EmptyValidatorSet' }, { type: 'error', inputs: [], name: 'IncorrectAVSAddress' }, { type: 'error', inputs: [], name: 'InvalidOperatorSetId' }, { type: 'error', inputs: [], name: 'InvalidSolochainAddressLength' }, { type: 'error', inputs: [], name: 'OnlyAllocationManager' }, { type: 'error', inputs: [], name: 'OnlyRewardsInitiator' }, + { type: 'error', inputs: [], name: 'OnlyValidatorSetSubmitter' }, { type: 'error', inputs: [], name: 'OperatorNotInAllowlist' }, + { type: 'error', inputs: [], name: 'SolochainAddressAlreadyAssigned' }, + { type: 'error', inputs: [], name: 'StrategyNotInOperatorSet' }, + { type: 'error', inputs: [], name: 'UnknownSolochainAddress' }, { type: 'error', inputs: [], name: 'ZeroAddress' }, ] as const @@ -10721,6 +10892,15 @@ export const readDataHavenServiceManagerDatahavenVersion = functionName: 'DATAHAVEN_VERSION', }) +/** + * Wraps __{@link readContract}__ with `abi` set to __{@link dataHavenServiceManagerAbi}__ and `functionName` set to `"MAX_ACTIVE_VALIDATORS"` + */ +export const readDataHavenServiceManagerMaxActiveValidators = + /*#__PURE__*/ createReadContract({ + abi: dataHavenServiceManagerAbi, + functionName: 'MAX_ACTIVE_VALIDATORS', + }) + /** * Wraps __{@link readContract}__ with `abi` set to __{@link dataHavenServiceManagerAbi}__ and `functionName` set to `"VALIDATORS_SET_ID"` */ @@ -10731,12 +10911,21 @@ export const readDataHavenServiceManagerValidatorsSetId = }) /** - * Wraps __{@link readContract}__ with `abi` set to __{@link dataHavenServiceManagerAbi}__ and `functionName` set to `"buildNewValidatorSetMessage"` + * Wraps __{@link readContract}__ with `abi` set to __{@link dataHavenServiceManagerAbi}__ and `functionName` set to `"buildNewValidatorSetMessageForEra"` */ -export const readDataHavenServiceManagerBuildNewValidatorSetMessage = +export const readDataHavenServiceManagerBuildNewValidatorSetMessageForEra = /*#__PURE__*/ createReadContract({ abi: dataHavenServiceManagerAbi, - functionName: 'buildNewValidatorSetMessage', + functionName: 'buildNewValidatorSetMessageForEra', + }) + +/** + * Wraps __{@link readContract}__ with `abi` set to __{@link dataHavenServiceManagerAbi}__ and `functionName` set to `"getStrategiesAndMultipliers"` + */ +export const readDataHavenServiceManagerGetStrategiesAndMultipliers = + /*#__PURE__*/ createReadContract({ + abi: dataHavenServiceManagerAbi, + functionName: 'getStrategiesAndMultipliers', }) /** @@ -10766,6 +10955,15 @@ export const readDataHavenServiceManagerSnowbridgeGateway = functionName: 'snowbridgeGateway', }) +/** + * Wraps __{@link readContract}__ with `abi` set to __{@link dataHavenServiceManagerAbi}__ and `functionName` set to `"strategiesAndMultipliers"` + */ +export const readDataHavenServiceManagerStrategiesAndMultipliers = + /*#__PURE__*/ createReadContract({ + abi: dataHavenServiceManagerAbi, + functionName: 'strategiesAndMultipliers', + }) + /** * Wraps __{@link readContract}__ with `abi` set to __{@link dataHavenServiceManagerAbi}__ and `functionName` set to `"supportsAVS"` */ @@ -10784,6 +10982,24 @@ export const readDataHavenServiceManagerValidatorEthAddressToSolochainAddress = functionName: 'validatorEthAddressToSolochainAddress', }) +/** + * Wraps __{@link readContract}__ with `abi` set to __{@link dataHavenServiceManagerAbi}__ and `functionName` set to `"validatorSetSubmitter"` + */ +export const readDataHavenServiceManagerValidatorSetSubmitter = + /*#__PURE__*/ createReadContract({ + abi: dataHavenServiceManagerAbi, + functionName: 'validatorSetSubmitter', + }) + +/** + * Wraps __{@link readContract}__ with `abi` set to __{@link dataHavenServiceManagerAbi}__ and `functionName` set to `"validatorSolochainAddressToEthAddress"` + */ +export const readDataHavenServiceManagerValidatorSolochainAddressToEthAddress = + /*#__PURE__*/ createReadContract({ + abi: dataHavenServiceManagerAbi, + functionName: 'validatorSolochainAddressToEthAddress', + }) + /** * Wraps __{@link readContract}__ with `abi` set to __{@link dataHavenServiceManagerAbi}__ and `functionName` set to `"validatorsAllowlist"` */ @@ -10900,12 +11116,12 @@ export const writeDataHavenServiceManagerRenounceOwnership = }) /** - * Wraps __{@link writeContract}__ with `abi` set to __{@link dataHavenServiceManagerAbi}__ and `functionName` set to `"sendNewValidatorSet"` + * Wraps __{@link writeContract}__ with `abi` set to __{@link dataHavenServiceManagerAbi}__ and `functionName` set to `"sendNewValidatorSetForEra"` */ -export const writeDataHavenServiceManagerSendNewValidatorSet = +export const writeDataHavenServiceManagerSendNewValidatorSetForEra = /*#__PURE__*/ createWriteContract({ abi: dataHavenServiceManagerAbi, - functionName: 'sendNewValidatorSet', + functionName: 'sendNewValidatorSetForEra', }) /** @@ -10926,6 +11142,24 @@ export const writeDataHavenServiceManagerSetSnowbridgeGateway = functionName: 'setSnowbridgeGateway', }) +/** + * Wraps __{@link writeContract}__ with `abi` set to __{@link dataHavenServiceManagerAbi}__ and `functionName` set to `"setStrategiesAndMultipliers"` + */ +export const writeDataHavenServiceManagerSetStrategiesAndMultipliers = + /*#__PURE__*/ createWriteContract({ + abi: dataHavenServiceManagerAbi, + functionName: 'setStrategiesAndMultipliers', + }) + +/** + * Wraps __{@link writeContract}__ with `abi` set to __{@link dataHavenServiceManagerAbi}__ and `functionName` set to `"setValidatorSetSubmitter"` + */ +export const writeDataHavenServiceManagerSetValidatorSetSubmitter = + /*#__PURE__*/ createWriteContract({ + abi: dataHavenServiceManagerAbi, + functionName: 'setValidatorSetSubmitter', + }) + /** * Wraps __{@link writeContract}__ with `abi` set to __{@link dataHavenServiceManagerAbi}__ and `functionName` set to `"setVersionUpdater"` */ @@ -11077,12 +11311,12 @@ export const simulateDataHavenServiceManagerRenounceOwnership = }) /** - * Wraps __{@link simulateContract}__ with `abi` set to __{@link dataHavenServiceManagerAbi}__ and `functionName` set to `"sendNewValidatorSet"` + * Wraps __{@link simulateContract}__ with `abi` set to __{@link dataHavenServiceManagerAbi}__ and `functionName` set to `"sendNewValidatorSetForEra"` */ -export const simulateDataHavenServiceManagerSendNewValidatorSet = +export const simulateDataHavenServiceManagerSendNewValidatorSetForEra = /*#__PURE__*/ createSimulateContract({ abi: dataHavenServiceManagerAbi, - functionName: 'sendNewValidatorSet', + functionName: 'sendNewValidatorSetForEra', }) /** @@ -11103,6 +11337,24 @@ export const simulateDataHavenServiceManagerSetSnowbridgeGateway = functionName: 'setSnowbridgeGateway', }) +/** + * Wraps __{@link simulateContract}__ with `abi` set to __{@link dataHavenServiceManagerAbi}__ and `functionName` set to `"setStrategiesAndMultipliers"` + */ +export const simulateDataHavenServiceManagerSetStrategiesAndMultipliers = + /*#__PURE__*/ createSimulateContract({ + abi: dataHavenServiceManagerAbi, + functionName: 'setStrategiesAndMultipliers', + }) + +/** + * Wraps __{@link simulateContract}__ with `abi` set to __{@link dataHavenServiceManagerAbi}__ and `functionName` set to `"setValidatorSetSubmitter"` + */ +export const simulateDataHavenServiceManagerSetValidatorSetSubmitter = + /*#__PURE__*/ createSimulateContract({ + abi: dataHavenServiceManagerAbi, + functionName: 'setValidatorSetSubmitter', + }) + /** * Wraps __{@link simulateContract}__ with `abi` set to __{@link dataHavenServiceManagerAbi}__ and `functionName` set to `"setVersionUpdater"` */ @@ -11253,6 +11505,15 @@ export const watchDataHavenServiceManagerSolochainAddressUpdatedEvent = eventName: 'SolochainAddressUpdated', }) +/** + * Wraps __{@link watchContractEvent}__ with `abi` set to __{@link dataHavenServiceManagerAbi}__ and `eventName` set to `"StrategiesAndMultipliersSet"` + */ +export const watchDataHavenServiceManagerStrategiesAndMultipliersSetEvent = + /*#__PURE__*/ createWatchContractEvent({ + abi: dataHavenServiceManagerAbi, + eventName: 'StrategiesAndMultipliersSet', + }) + /** * Wraps __{@link watchContractEvent}__ with `abi` set to __{@link dataHavenServiceManagerAbi}__ and `eventName` set to `"ValidatorAddedToAllowlist"` */ @@ -11271,6 +11532,24 @@ export const watchDataHavenServiceManagerValidatorRemovedFromAllowlistEvent = eventName: 'ValidatorRemovedFromAllowlist', }) +/** + * Wraps __{@link watchContractEvent}__ with `abi` set to __{@link dataHavenServiceManagerAbi}__ and `eventName` set to `"ValidatorSetMessageSubmitted"` + */ +export const watchDataHavenServiceManagerValidatorSetMessageSubmittedEvent = + /*#__PURE__*/ createWatchContractEvent({ + abi: dataHavenServiceManagerAbi, + eventName: 'ValidatorSetMessageSubmitted', + }) + +/** + * Wraps __{@link watchContractEvent}__ with `abi` set to __{@link dataHavenServiceManagerAbi}__ and `eventName` set to `"ValidatorSetSubmitterUpdated"` + */ +export const watchDataHavenServiceManagerValidatorSetSubmitterUpdatedEvent = + /*#__PURE__*/ createWatchContractEvent({ + abi: dataHavenServiceManagerAbi, + eventName: 'ValidatorSetSubmitterUpdated', + }) + /** * Wraps __{@link watchContractEvent}__ with `abi` set to __{@link dataHavenServiceManagerAbi}__ and `eventName` set to `"VersionUpdated"` */ diff --git a/test/e2e/framework/index.ts b/test/e2e/framework/index.ts index c76b4215..da11bf24 100644 --- a/test/e2e/framework/index.ts +++ b/test/e2e/framework/index.ts @@ -1,4 +1,5 @@ export * from "./connectors"; export * from "./manager"; +export * from "./submitter"; export * from "./suite"; export * from "./validators"; diff --git a/test/e2e/framework/submitter.ts b/test/e2e/framework/submitter.ts new file mode 100644 index 00000000..cad168eb --- /dev/null +++ b/test/e2e/framework/submitter.ts @@ -0,0 +1,135 @@ +/** + * E2E test helper for managing the validator-set-submitter Docker container. + * + * The submitter daemon automates `sendNewValidatorSetForEra` calls on the + * ServiceManager contract. This module builds the image, launches the + * container on the shared Docker network, and tears it down after the test. + */ + +import path from "node:path"; +import { $ } from "bun"; +import { ANVIL_FUNDED_ACCOUNTS, logger, waitForContainerToStart, waitForLog } from "utils"; +import { RELAYER_CONFIG_DIR } from "../../launcher/relayers"; + +const SUBMITTER_IMAGE = "datahavenxyz/validator-set-submitter:local"; +const SUBMITTER_READY_LOG = "Submitter started — watching session changes"; +const SUBMITTER_READY_TIMEOUT_SECONDS = 30; +const SUBMITTER_LOG_TAIL_LINES = 200; + +/** + * Builds the validator-set-submitter Docker image from the repo root. + */ +export async function buildSubmitterImage(): Promise { + logger.debug("Building validator-set-submitter Docker image..."); + const repoRoot = path.resolve(import.meta.dir, "../../.."); + await $`docker build -f test/tools/validator-set-submitter/Dockerfile -t ${SUBMITTER_IMAGE} .` + .cwd(repoRoot) + .quiet(); + logger.debug("Validator-set-submitter image built successfully"); +} + +export interface LaunchSubmitterOptions { + /** Docker network name (from launchedNetwork.networkName) */ + networkName: string; + /** Network ID for container naming */ + networkId: string; + /** Host-facing Ethereum RPC URL (e.g. http://127.0.0.1:32000) */ + ethereumRpcUrl: string; + /** DataHaven container name for inter-container networking */ + datahavenContainerName: string; + /** ServiceManager contract address from deployments */ + serviceManagerAddress: string; +} + +/** + * Launches the validator-set-submitter as a Docker container. + * + * Generates a YAML config, mounts it into the container, and connects + * it to the same Docker network as the DH nodes and relayers. + */ +export async function launchSubmitter(options: LaunchSubmitterOptions): Promise<{ + containerName: string; + cleanup: () => Promise; +}> { + const { networkName, networkId, ethereumRpcUrl, datahavenContainerName, serviceManagerAddress } = + options; + + const containerName = `submitter-${networkId}`; + + // Extract port from host-facing URL and rewrite for Docker inter-container access + const ethUrl = new URL(ethereumRpcUrl); + const dockerEthRpcUrl = `http://host.docker.internal:${ethUrl.port}`; + const dockerDhWsUrl = `ws://${datahavenContainerName}:9944`; + + // Generate YAML config + const configContent = [ + `ethereum_rpc_url: "${dockerEthRpcUrl}"`, + `datahaven_ws_url: "${dockerDhWsUrl}"`, + `service_manager_address: "${serviceManagerAddress}"`, + `network_id: "anvil"`, + `execution_fee: "0.1"`, + `relayer_fee: "0.2"` + ].join("\n"); + + const configFileName = `submitter-config-${networkId}.yml`; + await $`mkdir -p ${RELAYER_CONFIG_DIR}`.quiet(); + const hostConfigPath = path.resolve(path.join(RELAYER_CONFIG_DIR, configFileName)); + await Bun.write(hostConfigPath, configContent); + logger.debug(`Submitter config written to ${hostConfigPath}`); + + // Remove any existing container with the same name + await $`docker rm -f ${containerName}`.quiet().nothrow(); + + // Launch the container + const args = [ + "run", + "-d", + "--name", + containerName, + "--network", + networkName, + "--add-host", + "host.docker.internal:host-gateway", + "-v", + `${hostConfigPath}:/config/config.yml:ro`, + "-e", + `SUBMITTER_PRIVATE_KEY=${ANVIL_FUNDED_ACCOUNTS[6].privateKey}`, + SUBMITTER_IMAGE + ]; + + await $`docker ${args}`.quiet(); + await waitForContainerToStart(containerName); + try { + await waitForLog({ + containerName, + search: SUBMITTER_READY_LOG, + timeoutSeconds: SUBMITTER_READY_TIMEOUT_SECONDS + }); + } catch (error) { + const logs = + (await $`docker logs --tail ${SUBMITTER_LOG_TAIL_LINES} ${containerName}`.nothrow().text()) || + ""; + await stopSubmitter(containerName); + throw new Error( + `Submitter did not become ready. Expected log "${SUBMITTER_READY_LOG}". Last ${SUBMITTER_LOG_TAIL_LINES} log lines:\n${logs}`, + { cause: error } + ); + } + + logger.debug(`Submitter container ${containerName} started`); + + const cleanup = async () => { + await stopSubmitter(containerName); + }; + + return { containerName, cleanup }; +} + +/** + * Stops and removes the submitter container. + */ +export async function stopSubmitter(containerName: string): Promise { + logger.debug(`Stopping submitter container ${containerName}...`); + await $`docker rm -f ${containerName}`.quiet().nothrow(); + logger.debug(`Submitter container ${containerName} removed`); +} diff --git a/test/e2e/framework/validators.ts b/test/e2e/framework/validators.ts index 4dcd074c..2ecee8a9 100644 --- a/test/e2e/framework/validators.ts +++ b/test/e2e/framework/validators.ts @@ -7,11 +7,13 @@ import { $ } from "bun"; import { allocationManagerAbi, dataHavenServiceManagerAbi, - delegationManagerAbi + delegationManagerAbi, + strategyManagerAbi } from "contract-bindings"; import { type Deployments, logger, waitForContainerToStart } from "utils"; import { DEFAULT_SUBSTRATE_WS_PORT } from "utils/constants"; import { getPublicPort } from "utils/docker"; +import { erc20Abi } from "viem"; import { privateKeyToAccount } from "viem/accounts"; import validatorSet from "../../configs/validator-set.json"; import type { LaunchedNetwork } from "../../launcher/types/launchedNetwork"; @@ -120,9 +122,50 @@ export async function registerOperator( const { connectors, deployments } = options; const validator = getValidator(validatorName); const account = privateKeyToAccount(validator.privateKey as `0x${string}`); + const { publicClient, walletClient } = connectors; + + // Deposit tokens into deployed strategies + const deployedStrategies = deployments.DeployedStrategies ?? []; + for (const strategy of deployedStrategies) { + const balance = await publicClient.readContract({ + address: strategy.underlyingToken as `0x${string}`, + abi: erc20Abi, + functionName: "balanceOf", + args: [account.address] + }); + + if (balance > 0n) { + const depositAmount = balance / 10n; + + const approveHash = await walletClient.writeContract({ + address: strategy.underlyingToken as `0x${string}`, + abi: erc20Abi, + functionName: "approve", + args: [deployments.StrategyManager, depositAmount], + account, + chain: null + }); + await publicClient.waitForTransactionReceipt({ hash: approveHash }); + + const depositHash = await walletClient.writeContract({ + address: deployments.StrategyManager, + abi: strategyManagerAbi, + functionName: "depositIntoStrategy", + args: [ + strategy.address as `0x${string}`, + strategy.underlyingToken as `0x${string}`, + depositAmount + ], + account, + chain: null + }); + await publicClient.waitForTransactionReceipt({ hash: depositHash }); + logger.debug(`Deposited ${depositAmount} tokens into strategy ${strategy.address}`); + } + } // Register as EigenLayer operator - const operatorHash = await connectors.walletClient.writeContract({ + const operatorHash = await walletClient.writeContract({ address: deployments.DelegationManager as `0x${string}`, abi: delegationManagerAbi, functionName: "registerAsOperator", @@ -131,7 +174,7 @@ export async function registerOperator( chain: null }); - const operatorReceipt = await connectors.publicClient.waitForTransactionReceipt({ + const operatorReceipt = await publicClient.waitForTransactionReceipt({ hash: operatorHash }); if (operatorReceipt.status !== "success") { @@ -139,7 +182,7 @@ export async function registerOperator( } // Register for operator sets - const hash = await connectors.walletClient.writeContract({ + const registerHash = await walletClient.writeContract({ address: deployments.AllocationManager as `0x${string}`, abi: allocationManagerAbi, functionName: "registerForOperatorSets", @@ -155,10 +198,40 @@ export async function registerOperator( chain: null }); - const receipt = await connectors.publicClient.waitForTransactionReceipt({ hash }); - if (receipt.status !== "success") { - throw new Error(`Operator set registration failed: ${receipt.status}`); + const registerReceipt = await publicClient.waitForTransactionReceipt({ hash: registerHash }); + if (registerReceipt.status !== "success") { + throw new Error(`Operator set registration failed: ${registerReceipt.status}`); } - logger.debug(`Registered ${validatorName} as operator (gas: ${receipt.gasUsed})`); + // Allocate full magnitude to the validator operator set + const strategyAddresses = deployedStrategies.map((s) => s.address as `0x${string}`); + const newMagnitudes = strategyAddresses.map(() => BigInt(1e18)); + + const allocateHash = await walletClient.writeContract({ + address: deployments.AllocationManager as `0x${string}`, + abi: allocationManagerAbi, + functionName: "modifyAllocations", + args: [ + account.address, + [ + { + operatorSet: { + avs: deployments.ServiceManager as `0x${string}`, + id: 0 + }, + strategies: strategyAddresses, + newMagnitudes + } + ] + ], + account, + chain: null + }); + + const allocateReceipt = await publicClient.waitForTransactionReceipt({ hash: allocateHash }); + if (allocateReceipt.status !== "success") { + throw new Error(`Magnitude allocation failed: ${allocateReceipt.status}`); + } + + logger.debug(`Registered ${validatorName} as operator (gas: ${registerReceipt.gasUsed})`); } diff --git a/test/e2e/suites/validator-set-update.test.ts b/test/e2e/suites/validator-set-update.test.ts index 7e324e79..c5a665c4 100644 --- a/test/e2e/suites/validator-set-update.test.ts +++ b/test/e2e/suites/validator-set-update.test.ts @@ -5,27 +5,29 @@ * - Start network and ensure 4 validator nodes are running (Alice, Bob, Charlie, Dave). * - Confirm initial mapping exists only for Alice/Bob on `ServiceManager`. * - Allowlist and register Charlie/Dave as operators on Ethereum. - * - Send updated validator set via `ServiceManager.sendNewValidatorSet`, assert Gateway `OutboundMessageAccepted`. + * - Send updated validator set via `ServiceManager.sendNewValidatorSetForEra`, + * assert Gateway `OutboundMessageAccepted`. * - Observe `ExternalValidators.ExternalValidatorsSet` on DataHaven (substrate), confirming propagation. */ import { beforeAll, describe, expect, it } from "bun:test"; -import { getOwnerAccount } from "launcher/validators"; import { CROSS_CHAIN_TIMEOUTS, type Deployments, + getPapiSigner, logger, parseDeploymentsFile, ZERO_ADDRESS } from "utils"; import { waitForDataHavenEvent } from "utils/events"; -import { decodeEventLog, parseEther } from "viem"; -import { dataHavenServiceManagerAbi, gatewayAbi } from "../../contract-bindings"; +import { dataHavenServiceManagerAbi } from "../../contract-bindings"; import { addValidatorToAllowlist, BaseTestSuite, + buildSubmitterImage, getValidator, isValidatorRunning, launchDatahavenValidator, + launchSubmitter, registerOperator, type TestConnectors } from "../framework"; @@ -48,11 +50,18 @@ class ValidatorSetUpdateTestSuite extends BaseTestSuite { launchDatahavenValidator("charlie", { launchedNetwork }), launchDatahavenValidator("dave", { launchedNetwork }) ]); + + // Build the submitter Docker image so it's ready for the test + await buildSubmitterImage(); } public getNetworkId(): string { return this.getConnectors().launchedNetwork.networkId; } + + public getLaunchedNetwork() { + return this.getConnectors().launchedNetwork; + } } // Create the test suite instance @@ -67,6 +76,20 @@ describe("Validator Set Update", () => { beforeAll(async () => { deployments = await parseDeploymentsFile(); connectors = suite.getTestConnectors(); + + // Pause era rotation early so the active era stabilizes during tests 1-3 (~28s), + // avoiding the ~80s wait inside the cross-chain test. + // Tests 1-3 only touch Ethereum contracts and don't depend on era rotation. + const { dhApi } = connectors; + const pauseTx = dhApi.tx.Sudo.sudo({ + call: dhApi.tx.ExternalValidators.force_era({ + mode: { type: "ForceNone", value: undefined } + }).decodedCall + }); + const pauseResult = await pauseTx.signAndSubmit(getPapiSigner("ALITH")); + if (!pauseResult.ok) { + throw new Error("Failed to pause era rotation"); + } }); it("should verify test environment", async () => { @@ -157,41 +180,60 @@ describe("Validator Set Update", () => { it( "should send updated validator set and verify on DataHaven", async () => { - const { publicClient, walletClient, dhApi } = connectors; + const { dhApi } = connectors; - // Send the updated validator set via Snowbridge - const hash = await walletClient.writeContract({ - address: deployments.ServiceManager as `0x${string}`, - abi: dataHavenServiceManagerAbi, - functionName: "sendNewValidatorSet", - args: [parseEther("0.1"), parseEther("0.2")], - value: parseEther("0.3"), - gas: 1000000n, - account: getOwnerAccount(), - chain: null - }); - - const receipt = await publicClient.waitForTransactionReceipt({ hash }); - expect(receipt.status).toBe("success"); - - // Verify OutboundMessageAccepted event was emitted - const hasOutboundAccepted = (receipt.logs ?? []).some((log: any) => { - try { - const decoded = decodeEventLog({ abi: gatewayAbi, data: log.data, topics: log.topics }); - return decoded.eventName === "OutboundMessageAccepted"; - } catch { - return false; + // Era rotation was paused in beforeAll. Wait for any pending transition to settle + // (ForceNone prevents new eras, but an in-progress one must finish first). + let stableEraIndex: number; + // eslint-disable-next-line no-constant-condition + while (true) { + const activeEra = (await dhApi.query.ExternalValidators.ActiveEra.getValue())?.index ?? 0; + const currentEra = (await dhApi.query.ExternalValidators.CurrentEra.getValue()) ?? 0; + if (currentEra === activeEra) { + stableEraIndex = activeEra; + break; } - }); - expect(hasOutboundAccepted).toBe(true); + await new Promise((r) => setTimeout(r, 6_000)); // ~1 substrate block + } - // Wait for the validator set to be updated on Substrate - await waitForDataHavenEvent({ + const targetEra = BigInt(stableEraIndex + 1); + const validatorSetUpdated = waitForDataHavenEvent({ api: dhApi, pallet: "ExternalValidators", event: "ExternalValidatorsSet", + filter: (event: { external_index: number | bigint }) => + BigInt(event.external_index) === targetEra, timeout: CROSS_CHAIN_TIMEOUTS.ETH_TO_DH_MS }); + // Prevent unhandled rejection if launchSubmitter fails before we await this promise. + void validatorSetUpdated.catch(() => undefined); + + // Launch the submitter daemon — it will detect the last-session condition + // and automatically call sendNewValidatorSetForEra on the ServiceManager. + const launchedNetwork = suite.getLaunchedNetwork(); + const { cleanup: cleanupSubmitter } = await launchSubmitter({ + networkName: launchedNetwork.networkName, + networkId: suite.getNetworkId(), + ethereumRpcUrl: connectors.elRpcUrl, + datahavenContainerName: `datahaven-alice-${suite.getNetworkId()}`, + serviceManagerAddress: deployments.ServiceManager + }); + + try { + logger.info("Waiting for ExternalValidators.ExternalValidatorsSet event on DataHaven..."); + // Wait for the validator set to be updated on Substrate + await validatorSetUpdated; + } finally { + await cleanupSubmitter(); + } + + // Resume era rotation + const resumeTx = dhApi.tx.Sudo.sudo({ + call: dhApi.tx.ExternalValidators.force_era({ + mode: { type: "NotForcing", value: undefined } + }).decodedCall + }); + await resumeTx.signAndSubmit(getPapiSigner("ALITH")); // Verify new validators are in storage const validators = await dhApi.query.ExternalValidators.ExternalValidators.getValue(); diff --git a/test/launcher/relayers.ts b/test/launcher/relayers.ts index 27fca347..a64cbad4 100644 --- a/test/launcher/relayers.ts +++ b/test/launcher/relayers.ts @@ -441,8 +441,8 @@ export const launchRelayers = async ( await $`mkdir -p ${RELAYER_CONFIG_DIR}`.quiet(); const datastorePath = "tmp/datastore"; - logger.debug(`Ensuring datastore directory exists: ${datastorePath}`); - await $`mkdir -p ${datastorePath}`.quiet(); + logger.debug(`Clearing and recreating datastore directory: ${datastorePath}`); + await $`rm -rf ${datastorePath} && mkdir -p ${datastorePath}`.quiet(); const ethWsPort = await getPortFromKurtosis("el-1-reth-lodestar", "ws", kurtosisEnclaveName); const ethHttpPort = await getPortFromKurtosis("cl-1-lodestar-reth", "http", kurtosisEnclaveName); diff --git a/test/package.json b/test/package.json index c18048eb..dc2da493 100644 --- a/test/package.json +++ b/test/package.json @@ -30,6 +30,8 @@ "test:e2e:parallel": "bun scripts/test-parallel.ts", "moonwall:test": "moonwall test dev_datahaven", "moonwall:run": "moonwall run dev_datahaven", + "submitter": "bun run tools/validator-set-submitter/main.ts run", + "submitter:dry-run": "bun run tools/validator-set-submitter/main.ts run --dry-run", "typecheck": "tsc --noEmit", "tsgo": "tsgo tsc --noEmit --pretty --skipLibCheck", "postinstall": "papi" diff --git a/test/scripts/deploy-contracts.ts b/test/scripts/deploy-contracts.ts index 93c0cf8c..9f637a8b 100644 --- a/test/scripts/deploy-contracts.ts +++ b/test/scripts/deploy-contracts.ts @@ -179,33 +179,29 @@ export const updateParameters = async ( parameterCollection: ParameterCollection, chain?: string ) => { - try { - const deployments = await parseDeploymentsFile(chain); - const gatewayAddress = deployments.Gateway; - const serviceManagerAddress = deployments.ServiceManager; + const deployments = await parseDeploymentsFile(chain); + const gatewayAddress = deployments.Gateway; + const serviceManagerAddress = deployments.ServiceManager; - if (gatewayAddress) { - logger.debug(`📝 Adding EthereumGatewayAddress parameter: ${gatewayAddress}`); + if (gatewayAddress) { + logger.debug(`📝 Adding EthereumGatewayAddress parameter: ${gatewayAddress}`); - parameterCollection.addParameter({ - name: "EthereumGatewayAddress", - value: gatewayAddress - }); - } else { - logger.warn("⚠️ Gateway address not found in deployments file"); - } + parameterCollection.addParameter({ + name: "EthereumGatewayAddress", + value: gatewayAddress + }); + } else { + logger.warn("⚠️ Gateway address not found in deployments file"); + } - if (serviceManagerAddress) { - logger.debug(`📝 Adding DatahavenServiceManagerAddress parameter: ${serviceManagerAddress}`); - parameterCollection.addParameter({ - name: "DatahavenServiceManagerAddress", - value: serviceManagerAddress - }); - } else { - logger.warn("⚠️ ServiceManager address not found in deployments file"); - } - } catch (error) { - logger.error(`Failed to read parameters from deployment: ${error}`); + if (serviceManagerAddress) { + logger.debug(`📝 Adding DatahavenServiceManagerAddress parameter: ${serviceManagerAddress}`); + parameterCollection.addParameter({ + name: "DatahavenServiceManagerAddress", + value: serviceManagerAddress + }); + } else { + logger.warn("⚠️ ServiceManager address not found in deployments file"); } }; diff --git a/test/scripts/generate-contracts.ts b/test/scripts/generate-contracts.ts index 8bceea82..3bb42a3c 100644 --- a/test/scripts/generate-contracts.ts +++ b/test/scripts/generate-contracts.ts @@ -125,7 +125,7 @@ async function formatStateDiff(): Promise { // Use a higher max size (3MB) to handle the large state-diff.json file const result = - await $`bun run biome format --files-max-size=3000000 --write ${STATE_DIFF_PATH}`.quiet(); + await $`bun run biome format --files-max-size=4000000 --write ${STATE_DIFF_PATH}`.quiet(); if (result.exitCode !== 0) { logger.warn("⚠️ Biome formatting had issues, but continuing..."); diff --git a/test/scripts/set-datahaven-parameters.ts b/test/scripts/set-datahaven-parameters.ts index 83885e02..fa31b6cd 100644 --- a/test/scripts/set-datahaven-parameters.ts +++ b/test/scripts/set-datahaven-parameters.ts @@ -50,8 +50,20 @@ export const setDataHavenParameters = async ( const result = await tx.signAndSubmit(signer); - if (!result.ok) { - logger.error(`❌ Transaction failed: ${result.block.hash}`); + // sudo always returns Ok at the extrinsic level — check the Sudid event + // for the inner call result + const sudidEvent = result.events.find( + (e: any) => e.type === "Sudo" && e.value?.type === "Sudid" + ); + + if (!sudidEvent) { + logger.error("❌ Sudo.Sudid event not found in transaction events"); + return false; + } + + const sudoResult = (sudidEvent.value as any).value.sudo_result; + if (sudoResult.type === "Err") { + logger.error(`❌ Sudo inner call failed: ${JSON.stringify(sudoResult)}`); return false; } diff --git a/test/scripts/setup-validators.ts b/test/scripts/setup-validators.ts index 4edbbb93..8adce8f5 100644 --- a/test/scripts/setup-validators.ts +++ b/test/scripts/setup-validators.ts @@ -124,6 +124,29 @@ export const setupValidators = async (options: SetupValidatorsOptions): Promise< logger.success(`Successfully registered validator ${validator.publicKey}`); } + // Allocate stake for each validator (must run in a separate script because + // the allocation delay needs at least 1 block after registerAsOperator) + logger.info("📊 Allocating operator stake..."); + for (const [i, validator] of validatorsToRegister.entries()) { + logger.info(`📊 Allocating stake for validator ${i} (${validator.publicKey})`); + + const env = { + ...process.env, + NETWORK: networkName, + OPERATOR_PRIVATE_KEY: validator.privateKey, + OPERATOR_SOLOCHAIN_ADDRESS: validator.solochainAddress || "" + }; + + const allocateCommand = `forge script script/transact/AllocateOperatorStake.s.sol --rpc-url ${rpcUrl} --broadcast --no-rpc-rate-limit --non-interactive`; + await runShellCommandWithLogger(allocateCommand, { + env, + cwd: "../contracts", + logLevel: "debug" + }); + + logger.success(`Successfully allocated stake for validator ${validator.publicKey}`); + } + return true; }; diff --git a/test/scripts/update-validator-set.ts b/test/scripts/update-validator-set.ts index 2665a936..ffcb892d 100644 --- a/test/scripts/update-validator-set.ts +++ b/test/scripts/update-validator-set.ts @@ -7,6 +7,7 @@ import { logger } from "../utils/index"; interface UpdateValidatorSetOptions { rpcUrl: string; + targetEra?: bigint; } /** @@ -51,8 +52,15 @@ export const updateValidatorSet = async (options: UpdateValidatorSetOptions): Pr const executionFee = "100000000000000000"; // 0.1 ETH const relayerFee = "200000000000000000"; // 0.2 ETH const value = "300000000000000000"; // 0.3 ETH (sum of fees) + const targetEra = options.targetEra ?? 1n; - const sendCommand = `printf '%s\\n' "\${PRIVATE_KEY}" | ${castExecutable} send --interactive --value ${value} ${serviceManagerAddress} "sendNewValidatorSet(uint128,uint128)" ${executionFee} ${relayerFee} --rpc-url ${rpcUrl}`; + if (options.targetEra === undefined) { + logger.warn( + "No target era specified; defaulting to era 1. Use --target-era for already-running networks." + ); + } + + const sendCommand = `${castExecutable} send --private-key ${ownerPrivateKey} --value ${value} ${serviceManagerAddress} "sendNewValidatorSetForEra(uint64,uint128,uint128)" ${targetEra} ${executionFee} ${relayerFee} --rpc-url ${rpcUrl}`; logger.debug(`Running command: ${sendCommand}`); @@ -94,6 +102,7 @@ if (import.meta.main) { const args = process.argv.slice(2); const options: { rpcUrl?: string; + targetEra?: bigint; } = {}; // Extract RPC URL @@ -102,6 +111,12 @@ if (import.meta.main) { options.rpcUrl = args[rpcUrlIndex + 1]; } + // Extract target era + const targetEraIndex = args.indexOf("--target-era"); + if (targetEraIndex !== -1 && targetEraIndex + 1 < args.length) { + options.targetEra = BigInt(args[targetEraIndex + 1]); + } + // Check required parameters if (!options.rpcUrl) { console.error("Error: --rpc-url parameter is required"); @@ -110,7 +125,8 @@ if (import.meta.main) { // Run update updateValidatorSet({ - rpcUrl: options.rpcUrl + rpcUrl: options.rpcUrl, + targetEra: options.targetEra }).catch((error) => { console.error("Validator set update failed:", error); process.exit(1); diff --git a/test/tools/validator-set-submitter/Dockerfile b/test/tools/validator-set-submitter/Dockerfile new file mode 100644 index 00000000..5e7d9b44 --- /dev/null +++ b/test/tools/validator-set-submitter/Dockerfile @@ -0,0 +1,37 @@ +# Validator Set Submitter image +# +# Build from the repository root: +# docker build -f test/tools/validator-set-submitter/Dockerfile \ +# -t datahavenxyz/validator-set-submitter:local . +# +# Runtime expectations: +# - Mount a config file at /config/config.yml +# - Provide SUBMITTER_PRIVATE_KEY (or pass --submitter-private-key) +# - Set service_manager_address in config.yml (contracts/deployments is not in the image) + +FROM oven/bun:1.3.3-slim AS deps + +WORKDIR /app + +COPY test/package.json test/bun.lock test/tsconfig.json ./ +COPY test/.papi ./.papi +RUN bun install --frozen-lockfile --production + +FROM oven/bun:1.3.3-slim + +WORKDIR /app + +RUN useradd -m -u 1001 -U -s /bin/sh -d /submitter submitter + +COPY --from=deps /app/node_modules ./node_modules +COPY test/tsconfig.json test/bunfig.toml ./ +COPY test/tools/validator-set-submitter/ ./tools/validator-set-submitter/ +COPY test/contract-bindings/ ./contract-bindings/ +COPY test/utils/ ./utils/ + +ENV NODE_ENV=production + +USER submitter + +ENTRYPOINT ["bun", "run", "tools/validator-set-submitter/main.ts", "run"] +CMD ["--config", "/config/config.yml"] diff --git a/test/tools/validator-set-submitter/README.md b/test/tools/validator-set-submitter/README.md new file mode 100644 index 00000000..62a2f9f9 --- /dev/null +++ b/test/tools/validator-set-submitter/README.md @@ -0,0 +1,108 @@ +# Validator Set Submitter + +Long-running daemon that automatically submits validator-set updates from Ethereum to DataHaven each era via Snowbridge. + +## How it works + +The submitter subscribes to finalized `Session.CurrentIndex` changes on DataHaven. On each session change it evaluates: + +1. Is `ActiveEra` set? +2. Has `targetEra` (`ActiveEra + 1`) already been processed? +3. Is `ExternalIndex` already at or past `targetEra`? +4. Is the current session the last session of the era? + +If all preconditions are met, it calls `sendNewValidatorSetForEra` on the ServiceManager contract. Each era gets a single submission attempt — if it fails, the era is missed and the submitter moves on to the next. + +## Prerequisites + +- The submitter account must be registered on-chain via `setValidatorSetSubmitter` on the ServiceManager. +- An Ethereum RPC endpoint and a DataHaven WebSocket endpoint must be reachable. +- Dependencies installed: `bun i` from the `test/` directory. + +## Configuration + +Copy `config.yml` and fill in your values: + +```yaml +# Connections +ethereum_rpc_url: "http://127.0.0.1:8545" +datahaven_ws_url: "ws://127.0.0.1:9944" + +# Optional if provided via --submitter-private-key or SUBMITTER_PRIVATE_KEY env var +# The private key of the account authorized as validatorSetSubmitter +submitter_private_key: "0x..." + +# Optional — falls back to contracts/deployments/{network_id}.json +# service_manager_address: "0x..." +network_id: "anvil" + +# Fees (in ETH, sent as msg.value to cover Snowbridge relay costs) +execution_fee: "0.1" +relayer_fee: "0.2" +``` + +## Usage + +From the `test/` directory: + +```bash +# Start the submitter +bun tools/validator-set-submitter/main.ts run + +# With a custom config path +bun tools/validator-set-submitter/main.ts run --config ./path/to/config.yml + +# Provide private key via environment variable +SUBMITTER_PRIVATE_KEY=0x... bun tools/validator-set-submitter/main.ts run + +# Provide private key via CLI argument +bun tools/validator-set-submitter/main.ts run --submitter-private-key 0x... + +# Dry run — logs what would be submitted without sending transactions +bun tools/validator-set-submitter/main.ts run --dry-run +``` + +Private key precedence is: `--submitter-private-key` > `SUBMITTER_PRIVATE_KEY` > `submitter_private_key` in config file. + +## Docker + +Build the image from the repository root: + +```bash +docker build -f test/tools/validator-set-submitter/Dockerfile \ + -t datahavenxyz/validator-set-submitter:local . +``` + +Run the submitter with mounted config and env private key: + +```bash +docker run --rm \ + -v "$(pwd)/test/tools/validator-set-submitter/config.yml:/config/config.yml:ro" \ + -e SUBMITTER_PRIVATE_KEY=0x... \ + datahavenxyz/validator-set-submitter:local +``` + +Dry run: + +```bash +docker run --rm \ + -v "$(pwd)/test/tools/validator-set-submitter/config.yml:/config/config.yml:ro" \ + -e SUBMITTER_PRIVATE_KEY=0x... \ + datahavenxyz/validator-set-submitter:local --dry-run +``` + +The Docker image does not include `contracts/deployments/*.json`. In containerized runs, set `service_manager_address` in your config. + +## Startup checks + +On launch the submitter verifies: + +- Ethereum RPC is reachable (fetches current block number). +- DataHaven WebSocket is reachable (fetches current block header). +- The configured private key matches the on-chain `validatorSetSubmitter` address. + +If any check fails, the process exits immediately. + +## Shutdown + +Send `SIGINT` (Ctrl+C) or `SIGTERM`. The submitter unsubscribes from session changes and tears down connections cleanly. diff --git a/test/tools/validator-set-submitter/chain.ts b/test/tools/validator-set-submitter/chain.ts new file mode 100644 index 00000000..8899b33c --- /dev/null +++ b/test/tools/validator-set-submitter/chain.ts @@ -0,0 +1,61 @@ +import type { DataHavenApi } from "utils/papi"; +import type { PublicClient } from "viem"; +import { dataHavenServiceManagerAbi } from "../../contract-bindings"; + +/** + * Reads the current ActiveEra from the ExternalValidators pallet. + * Returns `{ index, start }` where `index` is the era number. + */ +export async function getActiveEra(dhApi: DataHavenApi) { + const era = await dhApi.query.ExternalValidators.ActiveEra.getValue(); + return era; +} + +/** + * Reads the ExternalIndex — the latest era that has been confirmed on-chain + * via an inbound Snowbridge message. + */ +export async function getExternalIndex(dhApi: DataHavenApi): Promise { + const index = await dhApi.query.ExternalValidators.ExternalIndex.getValue(); + return BigInt(index); +} + +/** + * The target era for the next submission is always ActiveEra + 1. + */ +export function computeTargetEra(activeEraIndex: number): bigint { + return BigInt(activeEraIndex + 1); +} + +/** + * Reads the on-chain `validatorSetSubmitter` address from the ServiceManager contract. + */ +export async function getOnChainSubmitter( + publicClient: PublicClient, + serviceManagerAddress: `0x${string}` +): Promise<`0x${string}`> { + const submitter = await publicClient.readContract({ + address: serviceManagerAddress, + abi: dataHavenServiceManagerAbi, + functionName: "validatorSetSubmitter" + }); + return submitter as `0x${string}`; +} + +/** + * Returns true if the current session is the last session of the active era. + * Uses the on-chain SessionsPerEra constant and ErasStartSessionIndex storage. + */ +export async function isLastSessionOfEra(dhApi: DataHavenApi): Promise { + const activeEra = await dhApi.query.ExternalValidators.ActiveEra.getValue(); + if (!activeEra) return false; + + const sessionsPerEra = await dhApi.constants.ExternalValidators.SessionsPerEra(); + const eraStartSession = await dhApi.query.ExternalValidators.ErasStartSessionIndex.getValue( + activeEra.index + ); + if (eraStartSession === undefined) return false; + + const currentSession = await dhApi.query.Session.CurrentIndex.getValue(); + return currentSession >= eraStartSession + sessionsPerEra - 1; +} diff --git a/test/tools/validator-set-submitter/config.ts b/test/tools/validator-set-submitter/config.ts new file mode 100644 index 00000000..419ea8d4 --- /dev/null +++ b/test/tools/validator-set-submitter/config.ts @@ -0,0 +1,101 @@ +import { parseDeploymentsFile } from "utils"; +import { parseEther } from "viem"; +import { parse as parseYaml } from "yaml"; + +export interface SubmitterConfig { + ethereumRpcUrl: string; + datahavenWsUrl: string; + submitterPrivateKey: `0x${string}`; + serviceManagerAddress: `0x${string}`; + networkId: string; + executionFee: bigint; + relayerFee: bigint; + dryRun: boolean; +} + +interface CliOverrides { + dryRun?: boolean; + submitterPrivateKey?: string; +} + +export async function loadConfig( + configPath: string, + cli: CliOverrides = {} +): Promise { + const file = Bun.file(configPath); + if (!(await file.exists())) { + throw new Error(`Config file not found: ${configPath}`); + } + const raw = parseYaml(await file.text()) as Record; + + const ethereumRpcUrl = requireString(raw, "ethereum_rpc_url"); + const datahavenWsUrl = requireString(raw, "datahaven_ws_url"); + const submitterPrivateKey = resolveSubmitterPrivateKey(raw, cli.submitterPrivateKey); + const networkId = optionalString(raw, "network_id") ?? "anvil"; + + let serviceManagerAddress = optionalHexString(raw, "service_manager_address"); + if (!serviceManagerAddress) { + const deployments = await parseDeploymentsFile(networkId); + serviceManagerAddress = deployments.ServiceManager; + } + + const executionFee = parseEther(optionalString(raw, "execution_fee") ?? "0.1"); + const relayerFee = parseEther(optionalString(raw, "relayer_fee") ?? "0.2"); + + return { + ethereumRpcUrl, + datahavenWsUrl, + submitterPrivateKey, + serviceManagerAddress, + networkId, + executionFee, + relayerFee, + dryRun: cli.dryRun ?? false + }; +} + +function resolveSubmitterPrivateKey( + raw: Record, + cliPrivateKey?: string +): `0x${string}` { + const submitterPrivateKey = + cliPrivateKey ?? + process.env.SUBMITTER_PRIVATE_KEY ?? + optionalString(raw, "submitter_private_key"); + + if (!submitterPrivateKey || submitterPrivateKey.length === 0) { + throw new Error( + "Missing submitter private key. Provide --submitter-private-key, SUBMITTER_PRIVATE_KEY, or submitter_private_key in config." + ); + } + + if (!/^0x[0-9a-fA-F]{64}$/.test(submitterPrivateKey)) { + throw new Error("Submitter private key must be a 66-character hex string (0x + 64 hex chars)"); + } + + return submitterPrivateKey as `0x${string}`; +} + +function requireString(raw: Record, key: string): string { + const val = raw[key]; + if (typeof val !== "string" || val.length === 0) { + throw new Error(`Missing required config field: ${key}`); + } + return val; +} + +function optionalString(raw: Record, key: string): string | undefined { + const val = raw[key]; + if (val === undefined || val === null) return undefined; + if (typeof val !== "string") return String(val); + return val; +} + +function optionalHexString(raw: Record, key: string): `0x${string}` | undefined { + const val = optionalString(raw, key); + if (!val) return undefined; + if (!val.startsWith("0x")) { + throw new Error(`Config field ${key} must start with 0x`); + } + return val as `0x${string}`; +} diff --git a/test/tools/validator-set-submitter/config.yml b/test/tools/validator-set-submitter/config.yml new file mode 100644 index 00000000..4c883359 --- /dev/null +++ b/test/tools/validator-set-submitter/config.yml @@ -0,0 +1,21 @@ +# Validator Set Submitter Configuration +# Copy this file and update values for your environment. + +# Connections +ethereum_rpc_url: "http://127.0.0.1:8545" +datahaven_ws_url: "ws://127.0.0.1:9944" + +# Credentials +# Optional if provided via --submitter-private-key or SUBMITTER_PRIVATE_KEY env var +# The private key of the account authorized as validatorSetSubmitter on the ServiceManager +submitter_private_key: "0x..." + +# Contract +# Optional — if omitted, falls back to contracts/deployments/{network_id}.json +# Note: Docker image does not include contracts/deployments; set this explicitly when running in Docker. +# service_manager_address: "0x..." +network_id: "anvil" + +# Fees (in ETH, sent as msg.value to cover Snowbridge relay costs) +execution_fee: "0.1" +relayer_fee: "0.2" diff --git a/test/tools/validator-set-submitter/main.ts b/test/tools/validator-set-submitter/main.ts new file mode 100644 index 00000000..3f0052ab --- /dev/null +++ b/test/tools/validator-set-submitter/main.ts @@ -0,0 +1,92 @@ +import { Command } from "@commander-js/extra-typings"; +import { logger } from "utils/logger"; +import { privateKeyToAccount } from "viem/accounts"; +import { getOnChainSubmitter } from "./chain"; +import { loadConfig } from "./config"; +import { createClients, startSubmitter } from "./submitter"; + +const program = new Command() + .name("validator-set-submitter") + .description("Automatically submits validator-set updates from Ethereum to DataHaven each era"); + +program + .command("run") + .description("Start the submitter daemon") + .option( + "--config ", + "Path to YAML config file", + "./tools/validator-set-submitter/config.yml" + ) + .option( + "--submitter-private-key ", + "Override submitter private key (or use SUBMITTER_PRIVATE_KEY env var)" + ) + .option("--dry-run", "Log what would be submitted without sending transactions", false) + .action(async (opts) => { + const config = await loadConfig(opts.config, { + dryRun: opts.dryRun, + submitterPrivateKey: opts.submitterPrivateKey + }); + + logger.info("Validator Set Submitter starting..."); + logger.info(`Ethereum RPC: ${config.ethereumRpcUrl}`); + logger.info(`DataHaven WS: ${config.datahavenWsUrl}`); + logger.info(`ServiceManager: ${config.serviceManagerAddress}`); + logger.info(`Dry run: ${config.dryRun}`); + + const clients = createClients(config); + + // Startup self-checks + try { + const blockNumber = await clients.publicClient.getBlockNumber(); + logger.info(`Ethereum connected — block #${blockNumber}`); + } catch (err) { + logger.error(`Cannot connect to Ethereum RPC: ${err}`); + process.exit(1); + } + + try { + const header = await clients.papiClient.getBlockHeader(); + logger.info(`DataHaven connected — block #${header.number}`); + } catch (err) { + logger.error(`Cannot connect to DataHaven WS: ${err}`); + process.exit(1); + } + + // Verify our account is authorized on-chain + try { + const account = privateKeyToAccount(config.submitterPrivateKey); + const onChainSubmitter = await getOnChainSubmitter( + clients.publicClient, + config.serviceManagerAddress + ); + if (onChainSubmitter.toLowerCase() !== account.address.toLowerCase()) { + logger.error( + `Account ${account.address} is not the authorized submitter (on-chain: ${onChainSubmitter})` + ); + process.exit(1); + } + logger.info(`Authorized submitter verified: ${account.address}`); + } catch (err) { + logger.error(`Failed to verify submitter authorization: ${err}`); + process.exit(1); + } + + // Graceful shutdown + const ac = new AbortController(); + const shutdown = () => { + logger.info("Shutdown signal received, stopping..."); + ac.abort(); + }; + process.on("SIGINT", shutdown); + process.on("SIGTERM", shutdown); + + try { + await startSubmitter(clients, config, ac.signal); + } finally { + clients.papiClient.destroy(); + logger.info("Submitter stopped, PAPI client destroyed"); + } + }); + +program.parse(); diff --git a/test/tools/validator-set-submitter/submitter.ts b/test/tools/validator-set-submitter/submitter.ts new file mode 100644 index 00000000..ad6d4593 --- /dev/null +++ b/test/tools/validator-set-submitter/submitter.ts @@ -0,0 +1,209 @@ +import { EMPTY, exhaustMap } from "rxjs"; +import { logger } from "utils/logger"; +import { createPapiConnectors, type DataHavenApi } from "utils/papi"; +import { + type Account, + createPublicClient, + createWalletClient, + decodeEventLog, + http, + type PublicClient, + type WalletClient +} from "viem"; +import { privateKeyToAccount } from "viem/accounts"; +import { dataHavenServiceManagerAbi, gatewayAbi } from "../../contract-bindings"; +import { computeTargetEra, getActiveEra, getExternalIndex, isLastSessionOfEra } from "./chain"; +import type { SubmitterConfig } from "./config"; + +interface SubmitterClients { + publicClient: PublicClient; + walletClient: WalletClient, undefined, Account>; + dhApi: DataHavenApi; + papiClient: ReturnType["client"]; +} + +const RECEIPT_TIMEOUT_MS = 120_000; + +export function createClients(config: SubmitterConfig): SubmitterClients { + const account = privateKeyToAccount(config.submitterPrivateKey); + const transport = http(config.ethereumRpcUrl); + + const publicClient = createPublicClient({ transport }); + const walletClient = createWalletClient({ account, transport }); + const { client: papiClient, typedApi: dhApi } = createPapiConnectors(config.datahavenWsUrl); + + return { publicClient, walletClient, dhApi, papiClient }; +} + +/** + * Returns a promise that resolves when the signal is aborted. + */ +function onAbort(signal: AbortSignal): Promise { + if (signal.aborted) return Promise.resolve(); + return new Promise((resolve) => + signal.addEventListener("abort", () => resolve(), { once: true }) + ); +} + +/** + * Waits for a transaction receipt with a hard timeout, and exits early on abort. + */ +async function waitForReceiptWithAbort( + publicClient: PublicClient, + hash: `0x${string}`, + signal: AbortSignal +) { + return Promise.race([ + publicClient.waitForTransactionReceipt({ + hash, + timeout: RECEIPT_TIMEOUT_MS + }), + onAbort(signal).then(() => { + throw signal.reason ?? new Error("Aborted while waiting for transaction receipt"); + }) + ]); +} + +/** + * Creates a tick handler that closes over submission state. + * Each call evaluates a session change and submits if eligible. + */ +function createTicker(clients: SubmitterClients, config: SubmitterConfig, signal: AbortSignal) { + let submittedEra: bigint | undefined; + + return async (currentSession: number): Promise => { + const { dhApi } = clients; + + const activeEra = await getActiveEra(dhApi); + if (!activeEra) { + logger.warn("ActiveEra not set yet"); + return; + } + + const targetEra = computeTargetEra(activeEra.index); + if (submittedEra === targetEra) return; + + const externalIndex = await getExternalIndex(dhApi); + if (externalIndex >= targetEra) { + submittedEra = targetEra; + return; + } + + if (!(await isLastSessionOfEra(dhApi))) return; + + logger.info( + `Session=${currentSession} ActiveEra=${activeEra.index} TargetEra=${targetEra} ExternalIndex=${externalIndex}` + ); + + const succeeded = await submitForEra(clients, config, targetEra, signal); + if (succeeded) submittedEra = targetEra; + }; +} + +/** + * Watches finalized session changes and submits validator sets when eligible. + * Runs until the signal is aborted. + */ +export async function startSubmitter( + clients: SubmitterClients, + config: SubmitterConfig, + signal: AbortSignal +): Promise { + const { dhApi } = clients; + const tick = createTicker(clients, config, signal); + + logger.info("Submitter started — watching session changes"); + + const sub = dhApi.query.Session.CurrentIndex.watchValue("finalized") + .pipe( + exhaustMap((currentSession) => { + if (signal.aborted) return EMPTY; + return tick(currentSession).catch((err) => { + if (!signal.aborted) logger.error(`Tick error: ${err}`); + }); + }) + ) + .subscribe({ + error: (err) => { + if (!signal.aborted) logger.error(`Session subscription error: ${err}`); + } + }); + + const done = new Promise((resolve) => sub.add(() => resolve())); + await Promise.race([onAbort(signal), done]); + sub.unsubscribe(); + + logger.info("Submitter stopped"); +} + +/** + * Submits the validator set for a single target era. + * Logs success or failure internally. + */ +async function submitForEra( + clients: SubmitterClients, + config: SubmitterConfig, + targetEra: bigint, + signal: AbortSignal +): Promise { + const { publicClient, walletClient } = clients; + + const totalFee = config.executionFee + config.relayerFee; + logger.info( + `Submitting era ${targetEra} (execFee=${config.executionFee} relayerFee=${config.relayerFee})` + ); + + if (config.dryRun) { + const message = await publicClient.readContract({ + address: config.serviceManagerAddress, + abi: dataHavenServiceManagerAbi, + functionName: "buildNewValidatorSetMessageForEra", + args: [targetEra] + }); + logger.info(`[DRY RUN] Would send message: ${message}`); + return true; + } + + try { + const hash = await walletClient.writeContract({ + address: config.serviceManagerAddress, + abi: dataHavenServiceManagerAbi, + functionName: "sendNewValidatorSetForEra", + args: [targetEra, config.executionFee, config.relayerFee], + value: totalFee, + chain: null + }); + logger.info(`Transaction sent: ${hash}`); + + const receipt = await waitForReceiptWithAbort(publicClient, hash, signal); + if (receipt.status !== "success") { + logger.error(`Transaction reverted: ${hash}`); + return false; + } + + const hasOutbound = receipt.logs.some((log) => { + try { + const decoded = decodeEventLog({ + abi: gatewayAbi, + data: log.data, + topics: log.topics + }); + return decoded.eventName === "OutboundMessageAccepted"; + } catch { + return false; + } + }); + + if (!hasOutbound) { + logger.warn("Transaction succeeded but no OutboundMessageAccepted event found"); + return false; + } + + logger.info("OutboundMessageAccepted confirmed"); + return true; + } catch (err: unknown) { + if (signal.aborted) return false; + logger.error(`Submission attempt failed: ${err}`); + return false; + } +} diff --git a/test/tsconfig.json b/test/tsconfig.json index eb6e8a8d..77329677 100644 --- a/test/tsconfig.json +++ b/test/tsconfig.json @@ -43,6 +43,7 @@ "cli/**/*.ts", "wagmi.config.ts", "contract-bindings/*.ts", - "launcher/**/*.ts" + "launcher/**/*.ts", + "tools/**/*.ts" ] }