diff --git a/contracts/script/PointTokenVault.s.sol b/contracts/script/PointTokenVault.s.sol index e31e5f3..4aef556 100644 --- a/contracts/script/PointTokenVault.s.sol +++ b/contracts/script/PointTokenVault.s.sol @@ -132,7 +132,7 @@ contract PointTokenVaultScripts is BatchScript { // Update merkle root vm.startBroadcast(MAINNET_MERKLE_UPDATER); - vaultV0_1_0.updateRoot(0xc0ca8b4749c3dbe63b8cc2aae178418a7db0d76c951ca29a9cbe4b0f5d830dfe); + vaultV0_1_0.updateRoot(0xb7fc593b2beeb58536854e23d90c834d18163116f77115b7756723ab4c75cc27); vm.stopBroadcast(); } diff --git a/contracts/test/SetRedemptionENA4Nov24.t.sol b/contracts/test/SetRedemptionENA4Nov24.t.sol index ae871b5..50b2987 100644 --- a/contracts/test/SetRedemptionENA4Nov24.t.sol +++ b/contracts/test/SetRedemptionENA4Nov24.t.sol @@ -26,15 +26,16 @@ contract SetRedemptionENA4Nov24Test is Test { } function test_RedemptionRights1() public { - bytes32[] memory proof = new bytes32[](4); + bytes32[] memory proof = new bytes32[](5); - proof[0] = 0xe0c93f69992755e2a8ff4ba9852d79204f42a82e3517feb32ed3db3ffc0ff0ef; - proof[1] = 0x2edc92e0f7721f84ac287a3d576011980a1c14d2055e9471d23704d678db8f27; - proof[2] = 0x5ac7248cc4f84bfe2aad55418ecd3de62da088a0e5f5467f4cb5bbef25ff5830; - proof[3] = 0x624abde6fe9afe030ebe5563711d71d0d93eb659435f14b21333ff4169089b09; + proof[0] = 0x4e0230e7a7546148f373efe52256490c04ea0019e199f2256a375e75cf2b6b96; + proof[1] = 0xd34225a2c1a481ba0168f312d34ee9de0a88feed77c0e8abea7cf91f3e339457; + proof[2] = 0x293adbeb89d378ab93aa3e1414a8538d16558496f452f97a15b2b35b8f030105; + proof[3] = 0xed5b80c058650c0f5fbb2459e555a3e83132077bc35f3df20b3131a660d3c2e9; + proof[4] = 0x209013010ef1908570b1143bf8468f383a325131f6475a543c110d5726b2d57a; address USER = 0x25E426b153e74Ab36b2685c3A464272De60888Ae; - uint256 AMOUNT = 36548738436181752113; + uint256 AMOUNT = 40609709373358106059; vm.prank(USER); vaultV0_1_0.redeemRewards(PointTokenVault.Claim(pointsId, AMOUNT, AMOUNT, proof), USER); @@ -57,15 +58,16 @@ contract SetRedemptionENA4Nov24Test is Test { } function test_RedemptionRights1_ClaimTooMuch() public { - bytes32[] memory proof = new bytes32[](4); + bytes32[] memory proof = new bytes32[](5); - proof[0] = 0xe0c93f69992755e2a8ff4ba9852d79204f42a82e3517feb32ed3db3ffc0ff0ef; - proof[1] = 0x2edc92e0f7721f84ac287a3d576011980a1c14d2055e9471d23704d678db8f27; - proof[2] = 0x5ac7248cc4f84bfe2aad55418ecd3de62da088a0e5f5467f4cb5bbef25ff5830; - proof[3] = 0x624abde6fe9afe030ebe5563711d71d0d93eb659435f14b21333ff4169089b09; + proof[0] = 0x4e0230e7a7546148f373efe52256490c04ea0019e199f2256a375e75cf2b6b96; + proof[1] = 0xd34225a2c1a481ba0168f312d34ee9de0a88feed77c0e8abea7cf91f3e339457; + proof[2] = 0x293adbeb89d378ab93aa3e1414a8538d16558496f452f97a15b2b35b8f030105; + proof[3] = 0xed5b80c058650c0f5fbb2459e555a3e83132077bc35f3df20b3131a660d3c2e9; + proof[4] = 0x209013010ef1908570b1143bf8468f383a325131f6475a543c110d5726b2d57a; address USER = 0x25E426b153e74Ab36b2685c3A464272De60888Ae; - uint256 TOTAL_CLAIMABLE = 36548738436181752113; + uint256 TOTAL_CLAIMABLE = 40609709373358106059; uint256 CLAIM_AMOUNT = TOTAL_CLAIMABLE + 10; vm.prank(USER); @@ -270,6 +272,48 @@ contract SetRedemptionENA4Nov24Test is Test { } } + function test_RedemptionRightsCalculatedAmount_Feb6() public { + uint256 rewardsPerPToken = 63381137368827226; + + uint256 originalReceivedTokens = 1324312 * 1e17; + uint256 newTokens = 2546753846 * 1e13 + 2546753846 * 1e13 + 20374030768 * 1e12; + uint256 expectedProportion = originalReceivedTokens * 1e18 / (originalReceivedTokens + newTokens); + + uint256 expectedRedemptionRights; + uint256 redemptionRightAmountOriginal; + uint256 redemptionRightAmountJan7; + + RedemptionFiles memory rf; + rf.root = vm.projectRoot(); + rf.path = string.concat(rf.root, "/js-scripts/generateRedemptionRights/out/merged-distribution.json"); + rf.merged = vm.readFile(rf.path); + rf.path = string.concat(rf.root, "/js-scripts/generateRedemptionRights/out/merged-distribution-06Feb25.json"); + rf.merged2 = vm.readFile(rf.path); + + string[] memory users = vm.parseJsonKeys(rf.merged, string.concat(".redemptionRights")); + for (uint256 i = 0; i < users.length; i++) { + try vm.parseJsonUint( + rf.merged, string.concat(".redemptionRights.", users[i], ".", vm.toString(pointsId), ".amount") + ) returns (uint256 amount) { + redemptionRightAmountOriginal = amount; + } catch { + redemptionRightAmountOriginal = 0; + } + + try vm.parseJsonUint( + rf.merged2, string.concat(".redemptionRights.", users[i], ".", vm.toString(pointsId), ".amount") + ) returns (uint256 amount) { + redemptionRightAmountJan7 = amount; + } catch { + redemptionRightAmountJan7 = 0; + } + + uint256 proportion = redemptionRightAmountOriginal * 1e18 / redemptionRightAmountJan7; + + assertApproxEqAbs(proportion, expectedProportion, 1e10); + } + } + function stringToAddress(string memory _address) internal returns (address) { // Remove "0x" prefix if present bytes memory _addressBytes = bytes(_address); diff --git a/foundry.toml b/foundry.toml index 359bb59..70fd479 100644 --- a/foundry.toml +++ b/foundry.toml @@ -14,8 +14,11 @@ fs_permissions = [{ access = "read", path = "./js-scripts/generateRedemptionRigh { access = "read", path = "./js-scripts/generateRedemptionRights/out/merged-distribution.json" }, { access = "read", path = "js-scripts/generateRedemptionRights/out/merged-distribution-03Dec24.json" }, { access = "read", path = "js-scripts/generateRedemptionRights/out/merged-distribution-07Jan25.json" }, +{ access = "read", path = "js-scripts/generateRedemptionRights/out/merged-distribution-06Feb25.json" }, { access = "read", path = "./js-scripts/generateRedemptionRights/out/ptoken-snapshot-kpsats.json" }, { access = "read", path = "./out/PointTokenVault.sol/PointTokenVault.json" }] +optimize = true +optimizer_runs = 100 [rpc_endpoints] sepolia = "${SEPOLIA_RPC_URL}" diff --git a/js-scripts/generateRedemptionRights/out/merged-distribution-06Feb25.json b/js-scripts/generateRedemptionRights/out/merged-distribution-06Feb25.json new file mode 100644 index 0000000..9e2657a --- /dev/null +++ b/js-scripts/generateRedemptionRights/out/merged-distribution-06Feb25.json @@ -0,0 +1,261 @@ +{ + "root": "0xb7fc593b2beeb58536854e23d90c834d18163116f77115b7756723ab4c75cc27", + "redemptionRights": { + "0x25E426b153e74Ab36b2685c3A464272De60888Ae": { + "0x1852756d70656c206b506f696e743a20457468656e61205332066b7053415453": { + "amount": "40609709373358106059", + "proof": [ + "0x4e0230e7a7546148f373efe52256490c04ea0019e199f2256a375e75cf2b6b96", + "0xd34225a2c1a481ba0168f312d34ee9de0a88feed77c0e8abea7cf91f3e339457", + "0x293adbeb89d378ab93aa3e1414a8538d16558496f452f97a15b2b35b8f030105", + "0xed5b80c058650c0f5fbb2459e555a3e83132077bc35f3df20b3131a660d3c2e9", + "0x209013010ef1908570b1143bf8468f383a325131f6475a543c110d5726b2d57a" + ] + } + }, + "0xAF9e4E01525C4856E00Cb0F363AFc34E7decD6a7": { + "0x1852756d70656c206b506f696e743a20457468656e61205332066b7053415453": { + "amount": "58984958010612340871383", + "proof": [ + "0xeacdc144ac6c5e5552f99b899703349c29730a1252e15c4309754807ed6e2229", + "0x777dfd831aa600c6701f755fcb534f1e5e2d8465058ecf270473c466c5752f1a", + "0x86f7be7a7880df047614c923a1e343e36ad9d69d3a9192d7f0deda297173f013" + ] + } + }, + "0x028CC8E3Ff248Dc59052eaAD2a1e749F3B835B99": { + "0x1852756d70656c206b506f696e743a20457468656e61205332066b7053415453": { + "amount": "21882546167125741776", + "proof": [ + "0x7bf20977e7c90c46c38de3a73d199d9b463c33ab5496a500e1e18594a0f5376c", + "0xfaca43636023a73bf06295aa693c262efe0bb3231357a68b8ad7eec7e901c8ef", + "0x04fdf08423ea2533ebeead3afb4e1be313755fe59ade56e2693d33fa1f9b403c", + "0x1c6578f815e3c3e3bb570ca6d330f1e693bc38ae42378ba5aa824b87b9324819", + "0x209013010ef1908570b1143bf8468f383a325131f6475a543c110d5726b2d57a" + ] + } + }, + "0x6CD72B1E6E300340A48943d6aF34EF5AE07D3577": { + "0x1852756d70656c206b506f696e743a20457468656e61205332066b7053415453": { + "amount": "137993291710040908804", + "proof": [ + "0xdc6743cb29d00ac8467f33ac244256f40e5d7fc8e8813cfc8d3c0ab87f1df4d2", + "0xc6f15a7cbd986873c6b761e81c98ee8ac4afd1c9885b7d8e0ae4de752040ab12", + "0xbe7420793ee18eb2e160f7049ccc5d9f9df686f28ab109e7492a99d4201e1ac4", + "0x86f7be7a7880df047614c923a1e343e36ad9d69d3a9192d7f0deda297173f013" + ] + } + }, + "0x1d848bf0dcF1b48f5621c37d062f2696D9d71AC4": { + "0x1852756d70656c206b506f696e743a20457468656e61205332066b7053415453": { + "amount": "111620588625197937051803", + "proof": [ + "0xdde89b58cb52c5b2902c8b50b3802222e9e975a8006f6f11d5583f732e23998f", + "0x777dfd831aa600c6701f755fcb534f1e5e2d8465058ecf270473c466c5752f1a", + "0x86f7be7a7880df047614c923a1e343e36ad9d69d3a9192d7f0deda297173f013" + ] + } + }, + "0x76DB9edf1451933711fc0A0c622E013ebD229EaB": { + "0x1852756d70656c206b506f696e743a20457468656e61205332066b7053415453": { + "amount": "22037101215348679954480", + "proof": [ + "0x191a3f5a1c7f9b1657f56cf44eb79a72b47ad4be40fae5ced80af9e38731e10c", + "0xc592776c4d9fee4a882f21630c99b17ba30c04e77027301cffa84626343d1a01", + "0x69b6adbb54f0c8cd62a02c93ac393e08190d53425ff77a263351f8c54e5e20ac", + "0xed5b80c058650c0f5fbb2459e555a3e83132077bc35f3df20b3131a660d3c2e9", + "0x209013010ef1908570b1143bf8468f383a325131f6475a543c110d5726b2d57a" + ] + } + }, + "0xB6462B67fe692223DFFb61C8DC8Ad080CBa180Cc": { + "0x1852756d70656c206b506f696e743a20457468656e61205332066b7053415453": { + "amount": "9533936868278384099608", + "proof": [ + "0x4169640ec64e945d0e1427bf7d59e350149faa815384948bc1f24869883d119a", + "0x68b3e6d3ca8173af7db289203232acdd75ca32737dad548c26bb2579edcec536", + "0x293adbeb89d378ab93aa3e1414a8538d16558496f452f97a15b2b35b8f030105", + "0xed5b80c058650c0f5fbb2459e555a3e83132077bc35f3df20b3131a660d3c2e9", + "0x209013010ef1908570b1143bf8468f383a325131f6475a543c110d5726b2d57a" + ] + } + }, + "0x24C694d193B19119bcDea9D40a3b0bfaFb281E6D": { + "0x1852756d70656c206b506f696e743a20457468656e61205332066b7053415453": { + "amount": "7746902357752402164", + "proof": [ + "0x78deb65d050ba8aa2fe43ae96177d8cc33d848a2a1fbe9750e973da0c9f401ba", + "0xfaca43636023a73bf06295aa693c262efe0bb3231357a68b8ad7eec7e901c8ef", + "0x04fdf08423ea2533ebeead3afb4e1be313755fe59ade56e2693d33fa1f9b403c", + "0x1c6578f815e3c3e3bb570ca6d330f1e693bc38ae42378ba5aa824b87b9324819", + "0x209013010ef1908570b1143bf8468f383a325131f6475a543c110d5726b2d57a" + ] + } + }, + "0x44Cb2d713BDa3858001f038645fD05E23E5DE03D": { + "0x1852756d70656c206b506f696e743a20457468656e61205332066b7053415453": { + "amount": "1345521453878585634509", + "proof": [ + "0x22bd0a3dd00ce6d39746f618e1314a076f69dc34b7f13b915a642b5600e25305", + "0xe159d103c569d42d373ef68df9802b2b4f658495087d0b8c6ccf07f1c4e0f1bd", + "0x69b6adbb54f0c8cd62a02c93ac393e08190d53425ff77a263351f8c54e5e20ac", + "0xed5b80c058650c0f5fbb2459e555a3e83132077bc35f3df20b3131a660d3c2e9", + "0x209013010ef1908570b1143bf8468f383a325131f6475a543c110d5726b2d57a" + ] + } + }, + "0xe2C3445a84de723Ef4425922165a58D22AD06e33": { + "0x1852756d70656c206b506f696e743a20457468656e61205332066b7053415453": { + "amount": "6396002047482052196", + "proof": [ + "0x317c6f5f7976247dcfccf19e913fbbd7860d50c3594c894895d5eccc2b71cd8e", + "0x68b3e6d3ca8173af7db289203232acdd75ca32737dad548c26bb2579edcec536", + "0x293adbeb89d378ab93aa3e1414a8538d16558496f452f97a15b2b35b8f030105", + "0xed5b80c058650c0f5fbb2459e555a3e83132077bc35f3df20b3131a660d3c2e9", + "0x209013010ef1908570b1143bf8468f383a325131f6475a543c110d5726b2d57a" + ] + } + }, + "0xD6633c1382896079D3576eC43519d844a8C80B56": { + "0x1852756d70656c206b506f696e743a20457468656e61205332066b7053415453": { + "amount": "3573063028308574113", + "proof": [ + "0x991fd8976022911aeb40e40bcb5754f9529f2080710f7ec1db8ace85c4f7b7f8", + "0x9fcad9eaad9b566f6c3bbd4cf63e1ecdd1ae8f5ae46730804df189d86fd83fe6", + "0xe0560ae4c81a503729c4cba116c6c7e9fbad976a5a6ab4a57cd9fa4fecc6b991", + "0x1c6578f815e3c3e3bb570ca6d330f1e693bc38ae42378ba5aa824b87b9324819", + "0x209013010ef1908570b1143bf8468f383a325131f6475a543c110d5726b2d57a" + ] + } + } + }, + "pTokens": { + "0x25E426b153e74Ab36b2685c3A464272De60888Ae": { + "0x1852756d70656c206b506f696e743a20457468656e61205332066b7053415453": { + "amount": "833020026897918484874", + "proof": [ + "0xb605c6d24f4591b726ca75a2244f789388c19ffebedd76217fe0eda994f0a8a4", + "0x1d9bc6b1b89a700e4e4dd4fe69ce88a2bf772ff173b45f30a3c3ce4b20bf5d8e", + "0xbe7420793ee18eb2e160f7049ccc5d9f9df686f28ab109e7492a99d4201e1ac4", + "0x86f7be7a7880df047614c923a1e343e36ad9d69d3a9192d7f0deda297173f013" + ] + }, + "0x1552756d70656c20506f696e743a205a69726375697408705a49524355495400": { + "amount": "335440188667996950000", + "proof": [ + "0x9edee009e8a38592409a0a19964fdf70a20917b6bc8cf0908c7802a22b7d8bc8", + "0x9fcad9eaad9b566f6c3bbd4cf63e1ecdd1ae8f5ae46730804df189d86fd83fe6", + "0xe0560ae4c81a503729c4cba116c6c7e9fbad976a5a6ab4a57cd9fa4fecc6b991", + "0x1c6578f815e3c3e3bb570ca6d330f1e693bc38ae42378ba5aa824b87b9324819", + "0x209013010ef1908570b1143bf8468f383a325131f6475a543c110d5726b2d57a" + ] + } + }, + "0x24C694d193B19119bcDea9D40a3b0bfaFb281E6D": { + "0x1852756d70656c206b506f696e743a20457468656e61205332066b7053415453": { + "amount": "152407798291890457882", + "proof": [ + "0x8b788cab342842ae529d8efac9659e1af9367270c13caaf4c8b5ef4c67a51402", + "0x1765bfbf5c943fd336cca418ca85cede631e814975b43b16fcc822ec9d42d205", + "0xe0560ae4c81a503729c4cba116c6c7e9fbad976a5a6ab4a57cd9fa4fecc6b991", + "0x1c6578f815e3c3e3bb570ca6d330f1e693bc38ae42378ba5aa824b87b9324819", + "0x209013010ef1908570b1143bf8468f383a325131f6475a543c110d5726b2d57a" + ] + } + }, + "0xe2C3445a84de723Ef4425922165a58D22AD06e33": { + "0x1852756d70656c206b506f696e743a20457468656e61205332066b7053415453": { + "amount": "131187337543613434191", + "proof": [ + "0x2b3dd7a5a5bd16dd868595073eb6b06671bc2ee308a802110c47550f2758ab4a", + "0xe159d103c569d42d373ef68df9802b2b4f658495087d0b8c6ccf07f1c4e0f1bd", + "0x69b6adbb54f0c8cd62a02c93ac393e08190d53425ff77a263351f8c54e5e20ac", + "0xed5b80c058650c0f5fbb2459e555a3e83132077bc35f3df20b3131a660d3c2e9", + "0x209013010ef1908570b1143bf8468f383a325131f6475a543c110d5726b2d57a" + ] + } + }, + "0xD6633c1382896079D3576eC43519d844a8C80B56": { + "0x1852756d70656c206b506f696e743a20457468656e61205332066b7053415453": { + "amount": "73286503362495655536", + "proof": [ + "0xdc8de7adb85950e14f805db6aaaf1b6f79e8d306c56c52b89000e0649bfb1ef3", + "0xc6f15a7cbd986873c6b761e81c98ee8ac4afd1c9885b7d8e0ae4de752040ab12", + "0xbe7420793ee18eb2e160f7049ccc5d9f9df686f28ab109e7492a99d4201e1ac4", + "0x86f7be7a7880df047614c923a1e343e36ad9d69d3a9192d7f0deda297173f013" + ] + } + }, + "0x028CC8E3Ff248Dc59052eaAD2a1e749F3B835B99": { + "0x1852756d70656c206b506f696e743a20457468656e61205332066b7053415453": { + "amount": "4977606283426392328730", + "proof": [ + "0xa11fb0c1a4d796bcb6fa408ad7fead1f27c139ee194686098410c137f2d5d224", + "0x1d9bc6b1b89a700e4e4dd4fe69ce88a2bf772ff173b45f30a3c3ce4b20bf5d8e", + "0xbe7420793ee18eb2e160f7049ccc5d9f9df686f28ab109e7492a99d4201e1ac4", + "0x86f7be7a7880df047614c923a1e343e36ad9d69d3a9192d7f0deda297173f013" + ] + } + }, + "0x6CD72B1E6E300340A48943d6aF34EF5AE07D3577": { + "0x1852756d70656c206b506f696e743a20457468656e61205332066b7053415453": { + "amount": "2830357527081490335359", + "proof": [ + "0x6258fb3ee01fe8edb76a1ee2cb317cd32b8464c63e31903826acd02863982f31", + "0x2d3612b2d3c4fda5d706b31ea1dead8d963ed2495d7edce1a94551023b51ee71", + "0x04fdf08423ea2533ebeead3afb4e1be313755fe59ade56e2693d33fa1f9b403c", + "0x1c6578f815e3c3e3bb570ca6d330f1e693bc38ae42378ba5aa824b87b9324819", + "0x209013010ef1908570b1143bf8468f383a325131f6475a543c110d5726b2d57a" + ] + } + }, + "0xAF9e4E01525C4856E00Cb0F363AFc34E7decD6a7": { + "0x1852756d70656c206b506f696e743a20457468656e61205332066b7053415453": { + "amount": "522530241238727636619443", + "proof": [ + "0x1a6ff22a61cbe337b27479cdcc2e9d6e85eeac8d48e3061686b7c9ca60a44987", + "0xc592776c4d9fee4a882f21630c99b17ba30c04e77027301cffa84626343d1a01", + "0x69b6adbb54f0c8cd62a02c93ac393e08190d53425ff77a263351f8c54e5e20ac", + "0xed5b80c058650c0f5fbb2459e555a3e83132077bc35f3df20b3131a660d3c2e9", + "0x209013010ef1908570b1143bf8468f383a325131f6475a543c110d5726b2d57a" + ] + } + }, + "0x0e7518B332F469a6A2F59E690F225cef5157cca9": { + "0x1852756d70656c206b506f696e743a20457468656e61205332066b7053415453": { + "amount": "262106044120029423561824", + "proof": [ + "0x5d600b4010a987913edf4ead345def2cc7496dc5d9d41d88c697869aa38cfe4b", + "0xd34225a2c1a481ba0168f312d34ee9de0a88feed77c0e8abea7cf91f3e339457", + "0x293adbeb89d378ab93aa3e1414a8538d16558496f452f97a15b2b35b8f030105", + "0xed5b80c058650c0f5fbb2459e555a3e83132077bc35f3df20b3131a660d3c2e9", + "0x209013010ef1908570b1143bf8468f383a325131f6475a543c110d5726b2d57a" + ] + } + }, + "0x347ab2e403710583Ade28Ef0871e73581599C8C8": { + "0x1852756d70656c206b506f696e743a20457468656e61205332066b7053415453": { + "amount": "988835303595225079157382", + "proof": [ + "0x7c1140f479d8f8e1295f0da50f5554de0c77b7b73783022f63b840e186a69c3d", + "0x1765bfbf5c943fd336cca418ca85cede631e814975b43b16fcc822ec9d42d205", + "0xe0560ae4c81a503729c4cba116c6c7e9fbad976a5a6ab4a57cd9fa4fecc6b991", + "0x1c6578f815e3c3e3bb570ca6d330f1e693bc38ae42378ba5aa824b87b9324819", + "0x209013010ef1908570b1143bf8468f383a325131f6475a543c110d5726b2d57a" + ] + } + }, + "0x1d848bf0dcF1b48f5621c37d062f2696D9d71AC4": { + "0x1852756d70656c206b506f696e743a20457468656e61205332066b7053415453": { + "amount": "2396414216569414059964695", + "proof": [ + "0x6a69b863aea1e9a735f460a6fb449a28b7398f958c4792872d7764700936b79d", + "0x2d3612b2d3c4fda5d706b31ea1dead8d963ed2495d7edce1a94551023b51ee71", + "0x04fdf08423ea2533ebeead3afb4e1be313755fe59ade56e2693d33fa1f9b403c", + "0x1c6578f815e3c3e3bb570ca6d330f1e693bc38ae42378ba5aa824b87b9324819", + "0x209013010ef1908570b1143bf8468f383a325131f6475a543c110d5726b2d57a" + ] + } + } + } +} \ No newline at end of file diff --git a/js-scripts/generateRedemptionRights/sENA-s2-alpha-updates/06-feb-25.ts b/js-scripts/generateRedemptionRights/sENA-s2-alpha-updates/06-feb-25.ts new file mode 100644 index 0000000..7f63fca --- /dev/null +++ b/js-scripts/generateRedemptionRights/sENA-s2-alpha-updates/06-feb-25.ts @@ -0,0 +1,133 @@ +import { keccak256, encodePacked } from "viem"; +import { MerkleTree } from "merkletreejs"; +import mergedDistribution07Jan25 from "../out/merged-distribution-07Jan25.json"; +import fs from "fs"; + +const NEW_SENA = 20374030768000000000000n; + +const updateRedemptionRights = () => { + // Calculate total existing rights + const total = Object.values( + mergedDistribution07Jan25.redemptionRights + ).reduce((acc, userRights) => { + const amount = Object.values(userRights)[0].amount; + return acc + BigInt(amount); + }, 0n); + + // Update each user's rights proportionally + for (const [address, rights] of Object.entries( + mergedDistribution07Jan25.redemptionRights + )) { + const tokenId = Object.keys(rights)[0]; + const currentAmount = BigInt(rights[tokenId].amount); + + // Calculate proportion and new amount + const newAmount = (currentAmount * NEW_SENA) / total; + const updatedAmount = currentAmount + newAmount; + + // Update in the distribution object + mergedDistribution07Jan25.redemptionRights[address][tokenId].amount = + updatedAmount.toString(); + } + + // Regenerate merkle tree + const prefix = keccak256(encodePacked(["string"], ["REDEMPTION_RIGHTS"])); + + // Generate redemption rights leaves + const rightsLeaves = Object.entries( + mergedDistribution07Jan25.redemptionRights + ).flatMap(([address, rights]) => + Object.entries(rights).map(([pointsId, data]) => + keccak256( + encodePacked( + ["bytes32", "address", "bytes32", "uint256"], + [ + prefix, + address as `0x${string}`, + pointsId as `0x${string}`, + BigInt(data.amount), + ] + ) + ) + ) + ); + + // Generate pTokens leaves + const pTokenLeaves = Object.entries( + mergedDistribution07Jan25.pTokens + ).flatMap(([address, pointsData]) => + Object.entries(pointsData).map(([pointsId, data]) => + keccak256( + encodePacked( + ["address", "bytes32", "uint256"], + [ + address as `0x${string}`, + pointsId as `0x${string}`, + BigInt(data.amount), + ] + ) + ) + ) + ); + + // Build tree + const tree = new MerkleTree( + [...rightsLeaves, ...pTokenLeaves].sort(), + keccak256, + { + sortPairs: true, + } + ); + + // Update root + mergedDistribution07Jan25.root = tree.getHexRoot(); + + // Update proofs for redemption rights + for (const [address, rights] of Object.entries( + mergedDistribution07Jan25.redemptionRights + )) { + for (const [pointsId, data] of Object.entries(rights)) { + const leaf = keccak256( + encodePacked( + ["bytes32", "address", "bytes32", "uint256"], + [ + prefix, + address as `0x${string}`, + pointsId as `0x${string}`, + BigInt(data.amount), + ] + ) + ); + mergedDistribution07Jan25.redemptionRights[address][pointsId].proof = + tree.getHexProof(leaf); + } + } + + // Update proofs for pTokens + for (const [address, pointsData] of Object.entries( + mergedDistribution07Jan25.pTokens + )) { + for (const [pointsId, data] of Object.entries(pointsData)) { + const leaf = keccak256( + encodePacked( + ["address", "bytes32", "uint256"], + [ + address as `0x${string}`, + pointsId as `0x${string}`, + BigInt(data.amount), + ] + ) + ); + mergedDistribution07Jan25.pTokens[address][pointsId].proof = + tree.getHexProof(leaf); + } + } + + // Write updated distribution back to file + fs.writeFileSync( + "./js-scripts/generateRedemptionRights/out/merged-distribution-06Feb25.json", + JSON.stringify(mergedDistribution07Jan25, null, 2) + ); +}; + +updateRedemptionRights();