@latticexyz/world-modules 2.0.2-main-a09bf251 → 2.0.2-main-e86bd14d

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (149) hide show
  1. package/dist/mud.config.d.ts +32 -0
  2. package/dist/mud.config.js +1 -1
  3. package/dist/mud.config.js.map +1 -1
  4. package/out/AccessControlLib.sol/AccessControlLib.json +1 -1
  5. package/out/AccessManagementSystem.sol/AccessManagementSystem.json +1 -1
  6. package/out/AddressArray.sol/AddressArray.json +1 -1
  7. package/out/Allowances.sol/Allowances.json +1 -1
  8. package/out/ArrayLib.sol/ArrayLib.json +1 -1
  9. package/out/BalanceTransferSystem.sol/BalanceTransferSystem.json +1 -1
  10. package/out/Balances.sol/Balances.json +1 -1
  11. package/out/Base.sol/CommonBase.json +1 -1
  12. package/out/Base.sol/ScriptBase.json +1 -1
  13. package/out/Base.sol/TestBase.json +1 -1
  14. package/out/BatchCallSystem.sol/BatchCallSystem.json +1 -1
  15. package/out/Bool.sol/Bool.json +1 -1
  16. package/out/CallboundDelegationControl.sol/CallboundDelegationControl.json +1 -1
  17. package/out/CallboundDelegations.sol/CallboundDelegations.json +1 -1
  18. package/out/DelegationControlMock.sol/DelegationControlMock.json +1 -1
  19. package/out/DelegationWithSignatureModule.t.sol/Unstable_DelegationWithSignatureModuleTest.abi.json +541 -0
  20. package/out/DelegationWithSignatureModule.t.sol/Unstable_DelegationWithSignatureModuleTest.abi.json.d.ts +541 -0
  21. package/out/DelegationWithSignatureModule.t.sol/Unstable_DelegationWithSignatureModuleTest.json +1 -0
  22. package/out/ECDSA.sol/ECDSA.abi.json +29 -0
  23. package/out/ECDSA.sol/ECDSA.abi.json.d.ts +29 -0
  24. package/out/ECDSA.sol/ECDSA.json +1 -0
  25. package/out/ERC20.t.sol/ERC20Test.json +1 -1
  26. package/out/ERC20Metadata.sol/ERC20Metadata.json +1 -1
  27. package/out/ERC20Module.sol/ERC20Module.json +1 -1
  28. package/out/ERC20Module.sol/ERC20ModuleRegistrationLibrary.json +1 -1
  29. package/out/ERC20Registry.sol/ERC20Registry.json +1 -1
  30. package/out/ERC20System.sol/ERC20System.json +1 -1
  31. package/out/ERC721.t.sol/ERC721Recipient.json +1 -1
  32. package/out/ERC721.t.sol/ERC721Test.json +1 -1
  33. package/out/ERC721.t.sol/ERC721TokenReceiver.json +1 -1
  34. package/out/ERC721.t.sol/NonERC721Recipient.json +1 -1
  35. package/out/ERC721.t.sol/RevertingERC721Recipient.json +1 -1
  36. package/out/ERC721.t.sol/WrongReturnDataERC721Recipient.json +1 -1
  37. package/out/ERC721Metadata.sol/ERC721Metadata.json +1 -1
  38. package/out/ERC721Module.sol/ERC721Module.json +1 -1
  39. package/out/ERC721Module.sol/ERC721ModuleRegistrationLibrary.json +1 -1
  40. package/out/ERC721Registry.sol/ERC721Registry.json +1 -1
  41. package/out/ERC721System.sol/ERC721System.json +1 -1
  42. package/out/EchoSubscriber.sol/EchoSubscriber.json +1 -1
  43. package/out/GasReporter.sol/GasReporter.json +1 -1
  44. package/out/IBaseWorld.sol/IBaseWorld.json +1 -1
  45. package/out/IERC20.sol/IERC20.json +1 -1
  46. package/out/IERC20Errors.sol/IERC20Errors.json +1 -1
  47. package/out/IERC20Events.sol/IERC20Events.json +1 -1
  48. package/out/IERC20Mintable.sol/IERC20Mintable.json +1 -1
  49. package/out/IERC20System.sol/IERC20System.json +1 -1
  50. package/out/IERC721.sol/IERC721.json +1 -1
  51. package/out/IERC721Errors.sol/IERC721Errors.json +1 -1
  52. package/out/IERC721Events.sol/IERC721Events.json +1 -1
  53. package/out/IERC721Metadata.sol/IERC721Metadata.json +1 -1
  54. package/out/IERC721Mintable.sol/IERC721Mintable.json +1 -1
  55. package/out/IERC721Receiver.sol/IERC721Receiver.json +1 -1
  56. package/out/IMulticall3.sol/IMulticall3.json +1 -1
  57. package/out/IPuppetFactorySystem.sol/IPuppetFactorySystem.json +1 -1
  58. package/out/IUnstable_DelegationWithSignatureSystem.sol/IUnstable_DelegationWithSignatureSystem.abi.json +46 -0
  59. package/out/IUnstable_DelegationWithSignatureSystem.sol/IUnstable_DelegationWithSignatureSystem.abi.json.d.ts +46 -0
  60. package/out/IUnstable_DelegationWithSignatureSystem.sol/IUnstable_DelegationWithSignatureSystem.json +1 -0
  61. package/out/InitModule.sol/InitModule.json +1 -1
  62. package/out/KeysInTable.sol/KeysInTable.json +1 -1
  63. package/out/KeysInTableHook.sol/KeysInTableHook.json +1 -1
  64. package/out/KeysInTableModule.sol/KeysInTableModule.json +1 -1
  65. package/out/KeysInTableModule.t.sol/KeysInTableModuleTest.json +1 -1
  66. package/out/KeysWithValue.sol/KeysWithValue.json +1 -1
  67. package/out/KeysWithValueHook.sol/KeysWithValueHook.json +1 -1
  68. package/out/KeysWithValueModule.sol/KeysWithValueModule.json +1 -1
  69. package/out/KeysWithValueModule.t.sol/KeysWithValueModuleTest.json +1 -1
  70. package/out/ModuleInstallationSystem.sol/ModuleInstallationSystem.json +1 -1
  71. package/out/OperatorApproval.sol/OperatorApproval.json +1 -1
  72. package/out/Owners.sol/Owners.json +1 -1
  73. package/out/Puppet.sol/Puppet.json +1 -1
  74. package/out/PuppetDelegationControl.sol/PuppetDelegationControl.json +1 -1
  75. package/out/PuppetFactorySystem.sol/PuppetFactorySystem.json +1 -1
  76. package/out/PuppetMaster.sol/PuppetMaster.json +1 -1
  77. package/out/PuppetModule.sol/PuppetModule.json +1 -1
  78. package/out/PuppetModule.t.sol/PuppetModuleTest.json +1 -1
  79. package/out/PuppetModule.t.sol/PuppetTestSystem.json +1 -1
  80. package/out/PuppetRegistry.sol/PuppetRegistry.json +1 -1
  81. package/out/RegistrationSystem.sol/RegistrationSystem.json +1 -1
  82. package/out/RevertSubscriber.sol/RevertSubscriber.json +1 -1
  83. package/out/StandardDelegationsModule.sol/StandardDelegationsModule.json +1 -1
  84. package/out/StandardDelegationsModule.t.sol/StandardDelegationsModuleTest.json +1 -1
  85. package/out/StdAssertions.sol/StdAssertions.json +1 -1
  86. package/out/StdChains.sol/StdChains.json +1 -1
  87. package/out/StdCheats.sol/StdCheats.json +1 -1
  88. package/out/StdCheats.sol/StdCheatsSafe.json +1 -1
  89. package/out/StdError.sol/stdError.json +1 -1
  90. package/out/StdInvariant.sol/StdInvariant.json +1 -1
  91. package/out/StdJson.sol/stdJson.json +1 -1
  92. package/out/StdMath.sol/stdMath.json +1 -1
  93. package/out/StdStorage.sol/stdStorage.json +1 -1
  94. package/out/StdStorage.sol/stdStorageSafe.json +1 -1
  95. package/out/StdStyle.sol/StdStyle.json +1 -1
  96. package/out/StdUtils.sol/StdUtils.json +1 -1
  97. package/out/StoreRead.sol/StoreRead.json +1 -1
  98. package/out/StoreRegistrationSystem.sol/StoreRegistrationSystem.json +1 -1
  99. package/out/System.sol/System.json +1 -1
  100. package/out/SystemSwitch.sol/SystemSwitch.json +1 -1
  101. package/out/SystemSwitch.t.sol/EchoSystem.json +1 -1
  102. package/out/SystemSwitch.t.sol/SystemSwitchTest.json +1 -1
  103. package/out/SystemboundDelegationControl.sol/SystemboundDelegationControl.json +1 -1
  104. package/out/SystemboundDelegations.sol/SystemboundDelegations.json +1 -1
  105. package/out/Test.sol/Test.json +1 -1
  106. package/out/TimeboundDelegationControl.sol/TimeboundDelegationControl.json +1 -1
  107. package/out/TimeboundDelegations.sol/TimeboundDelegations.json +1 -1
  108. package/out/TokenApproval.sol/TokenApproval.json +1 -1
  109. package/out/TokenURI.sol/TokenURI.json +1 -1
  110. package/out/TotalSupply.sol/TotalSupply.json +1 -1
  111. package/out/TwoFields.sol/TwoFields.json +1 -1
  112. package/out/UniqueEntity.sol/UniqueEntity.json +1 -1
  113. package/out/UniqueEntityModule.sol/UniqueEntityModule.json +1 -1
  114. package/out/UniqueEntityModule.t.sol/UniqueEntityModuleTest.json +1 -1
  115. package/out/UniqueEntityModule.t.sol/UniqueEntityTestSystem.json +1 -1
  116. package/out/UniqueEntitySystem.sol/UniqueEntitySystem.json +1 -1
  117. package/out/Unstable_DelegationWithSignatureModule.sol/Unstable_DelegationWithSignatureModule.abi.json +436 -0
  118. package/out/Unstable_DelegationWithSignatureModule.sol/Unstable_DelegationWithSignatureModule.abi.json.d.ts +436 -0
  119. package/out/Unstable_DelegationWithSignatureModule.sol/Unstable_DelegationWithSignatureModule.json +1 -0
  120. package/out/Unstable_DelegationWithSignatureSystem.sol/Unstable_DelegationWithSignatureSystem.abi.json +231 -0
  121. package/out/Unstable_DelegationWithSignatureSystem.sol/Unstable_DelegationWithSignatureSystem.abi.json.d.ts +231 -0
  122. package/out/Unstable_DelegationWithSignatureSystem.sol/Unstable_DelegationWithSignatureSystem.json +1 -0
  123. package/out/UsedKeysIndex.sol/UsedKeysIndex.json +1 -1
  124. package/out/UserDelegationNonces.sol/UserDelegationNonces.abi.json +1 -0
  125. package/out/UserDelegationNonces.sol/UserDelegationNonces.json +1 -0
  126. package/out/Vm.sol/Vm.json +1 -1
  127. package/out/Vm.sol/VmSafe.json +1 -1
  128. package/out/World.sol/World.json +1 -1
  129. package/out/World.t.sol/EchoSystemHook.json +1 -1
  130. package/out/World.t.sol/IWorldTestSystem.json +1 -1
  131. package/out/World.t.sol/PayableFallbackSystem.json +1 -1
  132. package/out/World.t.sol/RevertSystemHook.json +1 -1
  133. package/out/World.t.sol/WorldTest.json +1 -1
  134. package/out/World.t.sol/WorldTestSystem.json +1 -1
  135. package/out/WorldRegistrationSystem.sol/WorldRegistrationSystem.json +1 -1
  136. package/out/console.sol/console.json +1 -1
  137. package/out/console2.sol/console2.json +1 -1
  138. package/out/query.t.sol/QueryTest.json +1 -1
  139. package/out/safeconsole.sol/safeconsole.json +1 -1
  140. package/out/test.sol/DSTest.json +1 -1
  141. package/package.json +8 -8
  142. package/src/index.sol +1 -0
  143. package/src/interfaces/IUnstable_DelegationWithSignatureSystem.sol +23 -0
  144. package/src/modules/delegation/ECDSA.sol +174 -0
  145. package/src/modules/delegation/Unstable_DelegationWithSignatureModule.sol +49 -0
  146. package/src/modules/delegation/Unstable_DelegationWithSignatureSystem.sol +47 -0
  147. package/src/modules/delegation/constants.sol +10 -0
  148. package/src/modules/delegation/getSignedMessageHash.sol +44 -0
  149. package/src/modules/delegation/tables/UserDelegationNonces.sol +199 -0
@@ -1 +1 @@
1
- {"abi":[],"bytecode":{"object":"0x602d6037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea164736f6c6343000818000a","sourceMap":"163:397734:130:-:0;;;;;;;;;;;;;;;-1:-1:-1;;;163:397734:130;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x73000000000000000000000000000000000000000030146080604052600080fdfea164736f6c6343000818000a","sourceMap":"163:397734:130:-:0;;;;;;;;","linkReferences":{}},"methodIdentifiers":{},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"author\":\"philogy <https://github.com/philogy>\",\"details\":\"Code generated automatically by script.\",\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"node_modules/forge-std/src/safeconsole.sol\":\"safeconsole\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":3000},\"remappings\":[\":@latticexyz/=node_modules/@latticexyz/\",\":ds-test/=node_modules/ds-test/src/\",\":forge-std/=node_modules/forge-std/src/\"]},\"sources\":{\"node_modules/forge-std/src/safeconsole.sol\":{\"keccak256\":\"0xbaf41fdc6c54297e7cd8250e48b0f20eaac918e342a1028cef3f9a52ac086381\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a500ad81dea226f9910e6b50f99a9ff930105e393a692cbfb2185e4cdb4424ae\",\"dweb:/ipfs/QmVbUQpXNMmMWRiy4FvBNczzq46BMGfUoBikvSHNiCxVTq\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.24+commit.e11b9ed9"},"language":"Solidity","output":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@latticexyz/=node_modules/@latticexyz/","ds-test/=node_modules/ds-test/src/","forge-std/=node_modules/forge-std/src/"],"optimizer":{"enabled":true,"runs":3000},"metadata":{"bytecodeHash":"none"},"compilationTarget":{"node_modules/forge-std/src/safeconsole.sol":"safeconsole"},"evmVersion":"paris","libraries":{}},"sources":{"node_modules/forge-std/src/safeconsole.sol":{"keccak256":"0xbaf41fdc6c54297e7cd8250e48b0f20eaac918e342a1028cef3f9a52ac086381","urls":["bzz-raw://a500ad81dea226f9910e6b50f99a9ff930105e393a692cbfb2185e4cdb4424ae","dweb:/ipfs/QmVbUQpXNMmMWRiy4FvBNczzq46BMGfUoBikvSHNiCxVTq"],"license":"MIT"}},"version":1},"id":130}
1
+ {"abi":[],"bytecode":{"object":"0x602d6037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea164736f6c6343000818000a","sourceMap":"163:397734:131:-:0;;;;;;;;;;;;;;;-1:-1:-1;;;163:397734:131;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x73000000000000000000000000000000000000000030146080604052600080fdfea164736f6c6343000818000a","sourceMap":"163:397734:131:-:0;;;;;;;;","linkReferences":{}},"methodIdentifiers":{},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"author\":\"philogy <https://github.com/philogy>\",\"details\":\"Code generated automatically by script.\",\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"node_modules/forge-std/src/safeconsole.sol\":\"safeconsole\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":3000},\"remappings\":[\":@latticexyz/=node_modules/@latticexyz/\",\":ds-test/=node_modules/ds-test/src/\",\":forge-std/=node_modules/forge-std/src/\"]},\"sources\":{\"node_modules/forge-std/src/safeconsole.sol\":{\"keccak256\":\"0xbaf41fdc6c54297e7cd8250e48b0f20eaac918e342a1028cef3f9a52ac086381\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a500ad81dea226f9910e6b50f99a9ff930105e393a692cbfb2185e4cdb4424ae\",\"dweb:/ipfs/QmVbUQpXNMmMWRiy4FvBNczzq46BMGfUoBikvSHNiCxVTq\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.24+commit.e11b9ed9"},"language":"Solidity","output":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@latticexyz/=node_modules/@latticexyz/","ds-test/=node_modules/ds-test/src/","forge-std/=node_modules/forge-std/src/"],"optimizer":{"enabled":true,"runs":3000},"metadata":{"bytecodeHash":"none"},"compilationTarget":{"node_modules/forge-std/src/safeconsole.sol":"safeconsole"},"evmVersion":"paris","libraries":{}},"sources":{"node_modules/forge-std/src/safeconsole.sol":{"keccak256":"0xbaf41fdc6c54297e7cd8250e48b0f20eaac918e342a1028cef3f9a52ac086381","urls":["bzz-raw://a500ad81dea226f9910e6b50f99a9ff930105e393a692cbfb2185e4cdb4424ae","dweb:/ipfs/QmVbUQpXNMmMWRiy4FvBNczzq46BMGfUoBikvSHNiCxVTq"],"license":"MIT"}},"version":1},"id":131}
@@ -1 +1 @@
1
- {"abi":[{"type":"function","name":"IS_TEST","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"failed","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"type":"event","name":"log","inputs":[{"name":"","type":"string","indexed":false,"internalType":"string"}],"anonymous":false},{"type":"event","name":"log_address","inputs":[{"name":"","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"log_bytes","inputs":[{"name":"","type":"bytes","indexed":false,"internalType":"bytes"}],"anonymous":false},{"type":"event","name":"log_bytes32","inputs":[{"name":"","type":"bytes32","indexed":false,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"log_int","inputs":[{"name":"","type":"int256","indexed":false,"internalType":"int256"}],"anonymous":false},{"type":"event","name":"log_named_address","inputs":[{"name":"key","type":"string","indexed":false,"internalType":"string"},{"name":"val","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"log_named_bytes","inputs":[{"name":"key","type":"string","indexed":false,"internalType":"string"},{"name":"val","type":"bytes","indexed":false,"internalType":"bytes"}],"anonymous":false},{"type":"event","name":"log_named_bytes32","inputs":[{"name":"key","type":"string","indexed":false,"internalType":"string"},{"name":"val","type":"bytes32","indexed":false,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"log_named_decimal_int","inputs":[{"name":"key","type":"string","indexed":false,"internalType":"string"},{"name":"val","type":"int256","indexed":false,"internalType":"int256"},{"name":"decimals","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"log_named_decimal_uint","inputs":[{"name":"key","type":"string","indexed":false,"internalType":"string"},{"name":"val","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"decimals","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"log_named_int","inputs":[{"name":"key","type":"string","indexed":false,"internalType":"string"},{"name":"val","type":"int256","indexed":false,"internalType":"int256"}],"anonymous":false},{"type":"event","name":"log_named_string","inputs":[{"name":"key","type":"string","indexed":false,"internalType":"string"},{"name":"val","type":"string","indexed":false,"internalType":"string"}],"anonymous":false},{"type":"event","name":"log_named_uint","inputs":[{"name":"key","type":"string","indexed":false,"internalType":"string"},{"name":"val","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"log_string","inputs":[{"name":"","type":"string","indexed":false,"internalType":"string"}],"anonymous":false},{"type":"event","name":"log_uint","inputs":[{"name":"","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"logs","inputs":[{"name":"","type":"bytes","indexed":false,"internalType":"bytes"}],"anonymous":false}],"bytecode":{"object":"0x60806040526000805460ff1916600117905534801561001d57600080fd5b506102728061002d6000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063ba414fa61461003b578063fa7626d414610057575b600080fd5b610043610064565b604051901515815260200160405180910390f35b6000546100439060ff1681565b60008054610100900460ff16156100845750600054610100900460ff1690565b6000737109709ecfa91a80626ff3989d68f67f5b1dd12d3b156101bf5760408051737109709ecfa91a80626ff3989d68f67f5b1dd12d602082018190527f6661696c6564000000000000000000000000000000000000000000000000000082840152825180830384018152606083019093526000929091610129917f667f9d70ca411d70ead50d8d5c22070dafc36ad75f3dcf5e7237b22ade9aecc4916080016101f4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905261016191610230565b6000604051808303816000865af19150503d806000811461019e576040519150601f19603f3d011682016040523d82523d6000602084013e6101a3565b606091505b50915050808060200190518101906101bb9190610243565b9150505b919050565b6000815160005b818110156101e557602081850181015186830152016101cb565b50600093019283525090919050565b7fffffffff0000000000000000000000000000000000000000000000000000000083168152600061022860048301846101c4565b949350505050565b600061023c82846101c4565b9392505050565b60006020828403121561025557600080fd5b8151801515811461023c57600080fdfea164736f6c6343000818000a","sourceMap":"715:19781:113:-:0;;;1572:26;;;-1:-1:-1;;1572:26:113;1594:4;1572:26;;;715:19781;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x608060405234801561001057600080fd5b50600436106100365760003560e01c8063ba414fa61461003b578063fa7626d414610057575b600080fd5b610043610064565b604051901515815260200160405180910390f35b6000546100439060ff1681565b60008054610100900460ff16156100845750600054610100900460ff1690565b6000737109709ecfa91a80626ff3989d68f67f5b1dd12d3b156101bf5760408051737109709ecfa91a80626ff3989d68f67f5b1dd12d602082018190527f6661696c6564000000000000000000000000000000000000000000000000000082840152825180830384018152606083019093526000929091610129917f667f9d70ca411d70ead50d8d5c22070dafc36ad75f3dcf5e7237b22ade9aecc4916080016101f4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905261016191610230565b6000604051808303816000865af19150503d806000811461019e576040519150601f19603f3d011682016040523d82523d6000602084013e6101a3565b606091505b50915050808060200190518101906101bb9190610243565b9150505b919050565b6000815160005b818110156101e557602081850181015186830152016101cb565b50600093019283525090919050565b7fffffffff0000000000000000000000000000000000000000000000000000000083168152600061022860048301846101c4565b949350505050565b600061023c82846101c4565b9392505050565b60006020828403121561025557600080fd5b8151801515811461023c57600080fdfea164736f6c6343000818000a","sourceMap":"715:19781:113:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1819:584;;;:::i;:::-;;;179:14:214;;172:22;154:41;;142:2;127:18;1819:584:113;;;;;;;1572:26;;;;;;;;;1819:584;1853:4;1873:7;;;;;;;1869:528;;;-1:-1:-1;1903:7:113;;;;;;;;1819:584::o;1869:528::-;1941:17;2997:42;2985:55;3066:16;1980:374;;2196:43;;;1671:64;2196:43;;;380:74:214;;;2221:17:113;470:18:214;;;463:34;2196:43:113;;;;;;;;;353:18:214;;;2196:43:113;;;-1:-1:-1;;1671:64:113;;2086:175;;2135:34;;2086:175;;;:::i;:::-;;;;;;;;;;;;;;;2047:232;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2020:259;;;2323:7;2312:27;;;;;;;;;;;;:::i;:::-;2297:42;;2002:352;1980:374;2374:12;1819:584;-1:-1:-1;1819:584:113:o;508:322:214:-;549:3;587:5;581:12;611:1;621:128;635:6;632:1;629:13;621:128;;;732:4;717:13;;;713:24;;707:31;694:11;;;687:52;650:12;621:128;;;-1:-1:-1;804:1:214;768:16;;793:13;;;-1:-1:-1;768:16:214;;508:322;-1:-1:-1;508:322:214:o;835:324::-;1032:66;1024:6;1020:79;1015:3;1008:92;990:3;1116:37;1150:1;1145:3;1141:11;1133:6;1116:37;:::i;:::-;1109:44;835:324;-1:-1:-1;;;;835:324:214:o;1164:189::-;1293:3;1318:29;1343:3;1335:6;1318:29;:::i;:::-;1311:36;1164:189;-1:-1:-1;;;1164:189:214:o;1358:277::-;1425:6;1478:2;1466:9;1457:7;1453:23;1449:32;1446:52;;;1494:1;1491;1484:12;1446:52;1526:9;1520:16;1579:5;1572:13;1565:21;1558:5;1555:32;1545:60;;1601:1;1598;1591:12","linkReferences":{}},"methodIdentifiers":{"IS_TEST()":"fa7626d4","failed()":"ba414fa6"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"name\":\"log\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"log_address\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"log_bytes\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"log_bytes32\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"name\":\"log_int\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"val\",\"type\":\"address\"}],\"name\":\"log_named_address\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"val\",\"type\":\"bytes\"}],\"name\":\"log_named_bytes\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"val\",\"type\":\"bytes32\"}],\"name\":\"log_named_bytes32\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"int256\",\"name\":\"val\",\"type\":\"int256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"decimals\",\"type\":\"uint256\"}],\"name\":\"log_named_decimal_int\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"val\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"decimals\",\"type\":\"uint256\"}],\"name\":\"log_named_decimal_uint\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"int256\",\"name\":\"val\",\"type\":\"int256\"}],\"name\":\"log_named_int\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"val\",\"type\":\"string\"}],\"name\":\"log_named_string\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"val\",\"type\":\"uint256\"}],\"name\":\"log_named_uint\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"name\":\"log_string\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"log_uint\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"logs\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"IS_TEST\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"failed\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"node_modules/ds-test/src/test.sol\":\"DSTest\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":3000},\"remappings\":[\":@latticexyz/=node_modules/@latticexyz/\",\":ds-test/=node_modules/ds-test/src/\",\":forge-std/=node_modules/forge-std/src/\"]},\"sources\":{\"node_modules/ds-test/src/test.sol\":{\"keccak256\":\"0x8758531bbac3972efcf1fa46383dbe1d276406fe527bc7abb2f236486278e83b\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://1f64264d61506847acf8761e84aff690cebe830958eac00bac7924d8be569240\",\"dweb:/ipfs/QmSekDJvJ82MZAmr63n7YvfLzQ7gS4NLSHPmHL3GN3rw8k\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.24+commit.e11b9ed9"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"string","name":"","type":"string","indexed":false}],"type":"event","name":"log","anonymous":false},{"inputs":[{"internalType":"address","name":"","type":"address","indexed":false}],"type":"event","name":"log_address","anonymous":false},{"inputs":[{"internalType":"bytes","name":"","type":"bytes","indexed":false}],"type":"event","name":"log_bytes","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32","indexed":false}],"type":"event","name":"log_bytes32","anonymous":false},{"inputs":[{"internalType":"int256","name":"","type":"int256","indexed":false}],"type":"event","name":"log_int","anonymous":false},{"inputs":[{"internalType":"string","name":"key","type":"string","indexed":false},{"internalType":"address","name":"val","type":"address","indexed":false}],"type":"event","name":"log_named_address","anonymous":false},{"inputs":[{"internalType":"string","name":"key","type":"string","indexed":false},{"internalType":"bytes","name":"val","type":"bytes","indexed":false}],"type":"event","name":"log_named_bytes","anonymous":false},{"inputs":[{"internalType":"string","name":"key","type":"string","indexed":false},{"internalType":"bytes32","name":"val","type":"bytes32","indexed":false}],"type":"event","name":"log_named_bytes32","anonymous":false},{"inputs":[{"internalType":"string","name":"key","type":"string","indexed":false},{"internalType":"int256","name":"val","type":"int256","indexed":false},{"internalType":"uint256","name":"decimals","type":"uint256","indexed":false}],"type":"event","name":"log_named_decimal_int","anonymous":false},{"inputs":[{"internalType":"string","name":"key","type":"string","indexed":false},{"internalType":"uint256","name":"val","type":"uint256","indexed":false},{"internalType":"uint256","name":"decimals","type":"uint256","indexed":false}],"type":"event","name":"log_named_decimal_uint","anonymous":false},{"inputs":[{"internalType":"string","name":"key","type":"string","indexed":false},{"internalType":"int256","name":"val","type":"int256","indexed":false}],"type":"event","name":"log_named_int","anonymous":false},{"inputs":[{"internalType":"string","name":"key","type":"string","indexed":false},{"internalType":"string","name":"val","type":"string","indexed":false}],"type":"event","name":"log_named_string","anonymous":false},{"inputs":[{"internalType":"string","name":"key","type":"string","indexed":false},{"internalType":"uint256","name":"val","type":"uint256","indexed":false}],"type":"event","name":"log_named_uint","anonymous":false},{"inputs":[{"internalType":"string","name":"","type":"string","indexed":false}],"type":"event","name":"log_string","anonymous":false},{"inputs":[{"internalType":"uint256","name":"","type":"uint256","indexed":false}],"type":"event","name":"log_uint","anonymous":false},{"inputs":[{"internalType":"bytes","name":"","type":"bytes","indexed":false}],"type":"event","name":"logs","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"IS_TEST","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"failed","outputs":[{"internalType":"bool","name":"","type":"bool"}]}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@latticexyz/=node_modules/@latticexyz/","ds-test/=node_modules/ds-test/src/","forge-std/=node_modules/forge-std/src/"],"optimizer":{"enabled":true,"runs":3000},"metadata":{"bytecodeHash":"none"},"compilationTarget":{"node_modules/ds-test/src/test.sol":"DSTest"},"evmVersion":"paris","libraries":{}},"sources":{"node_modules/ds-test/src/test.sol":{"keccak256":"0x8758531bbac3972efcf1fa46383dbe1d276406fe527bc7abb2f236486278e83b","urls":["bzz-raw://1f64264d61506847acf8761e84aff690cebe830958eac00bac7924d8be569240","dweb:/ipfs/QmSekDJvJ82MZAmr63n7YvfLzQ7gS4NLSHPmHL3GN3rw8k"],"license":"GPL-3.0-or-later"}},"version":1},"id":113}
1
+ {"abi":[{"type":"function","name":"IS_TEST","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"failed","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"type":"event","name":"log","inputs":[{"name":"","type":"string","indexed":false,"internalType":"string"}],"anonymous":false},{"type":"event","name":"log_address","inputs":[{"name":"","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"log_bytes","inputs":[{"name":"","type":"bytes","indexed":false,"internalType":"bytes"}],"anonymous":false},{"type":"event","name":"log_bytes32","inputs":[{"name":"","type":"bytes32","indexed":false,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"log_int","inputs":[{"name":"","type":"int256","indexed":false,"internalType":"int256"}],"anonymous":false},{"type":"event","name":"log_named_address","inputs":[{"name":"key","type":"string","indexed":false,"internalType":"string"},{"name":"val","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"log_named_bytes","inputs":[{"name":"key","type":"string","indexed":false,"internalType":"string"},{"name":"val","type":"bytes","indexed":false,"internalType":"bytes"}],"anonymous":false},{"type":"event","name":"log_named_bytes32","inputs":[{"name":"key","type":"string","indexed":false,"internalType":"string"},{"name":"val","type":"bytes32","indexed":false,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"log_named_decimal_int","inputs":[{"name":"key","type":"string","indexed":false,"internalType":"string"},{"name":"val","type":"int256","indexed":false,"internalType":"int256"},{"name":"decimals","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"log_named_decimal_uint","inputs":[{"name":"key","type":"string","indexed":false,"internalType":"string"},{"name":"val","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"decimals","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"log_named_int","inputs":[{"name":"key","type":"string","indexed":false,"internalType":"string"},{"name":"val","type":"int256","indexed":false,"internalType":"int256"}],"anonymous":false},{"type":"event","name":"log_named_string","inputs":[{"name":"key","type":"string","indexed":false,"internalType":"string"},{"name":"val","type":"string","indexed":false,"internalType":"string"}],"anonymous":false},{"type":"event","name":"log_named_uint","inputs":[{"name":"key","type":"string","indexed":false,"internalType":"string"},{"name":"val","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"log_string","inputs":[{"name":"","type":"string","indexed":false,"internalType":"string"}],"anonymous":false},{"type":"event","name":"log_uint","inputs":[{"name":"","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"logs","inputs":[{"name":"","type":"bytes","indexed":false,"internalType":"bytes"}],"anonymous":false}],"bytecode":{"object":"0x60806040526000805460ff1916600117905534801561001d57600080fd5b506102728061002d6000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063ba414fa61461003b578063fa7626d414610057575b600080fd5b610043610064565b604051901515815260200160405180910390f35b6000546100439060ff1681565b60008054610100900460ff16156100845750600054610100900460ff1690565b6000737109709ecfa91a80626ff3989d68f67f5b1dd12d3b156101bf5760408051737109709ecfa91a80626ff3989d68f67f5b1dd12d602082018190527f6661696c6564000000000000000000000000000000000000000000000000000082840152825180830384018152606083019093526000929091610129917f667f9d70ca411d70ead50d8d5c22070dafc36ad75f3dcf5e7237b22ade9aecc4916080016101f4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905261016191610230565b6000604051808303816000865af19150503d806000811461019e576040519150601f19603f3d011682016040523d82523d6000602084013e6101a3565b606091505b50915050808060200190518101906101bb9190610243565b9150505b919050565b6000815160005b818110156101e557602081850181015186830152016101cb565b50600093019283525090919050565b7fffffffff0000000000000000000000000000000000000000000000000000000083168152600061022860048301846101c4565b949350505050565b600061023c82846101c4565b9392505050565b60006020828403121561025557600080fd5b8151801515811461023c57600080fdfea164736f6c6343000818000a","sourceMap":"715:19781:114:-:0;;;1572:26;;;-1:-1:-1;;1572:26:114;1594:4;1572:26;;;715:19781;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x608060405234801561001057600080fd5b50600436106100365760003560e01c8063ba414fa61461003b578063fa7626d414610057575b600080fd5b610043610064565b604051901515815260200160405180910390f35b6000546100439060ff1681565b60008054610100900460ff16156100845750600054610100900460ff1690565b6000737109709ecfa91a80626ff3989d68f67f5b1dd12d3b156101bf5760408051737109709ecfa91a80626ff3989d68f67f5b1dd12d602082018190527f6661696c6564000000000000000000000000000000000000000000000000000082840152825180830384018152606083019093526000929091610129917f667f9d70ca411d70ead50d8d5c22070dafc36ad75f3dcf5e7237b22ade9aecc4916080016101f4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905261016191610230565b6000604051808303816000865af19150503d806000811461019e576040519150601f19603f3d011682016040523d82523d6000602084013e6101a3565b606091505b50915050808060200190518101906101bb9190610243565b9150505b919050565b6000815160005b818110156101e557602081850181015186830152016101cb565b50600093019283525090919050565b7fffffffff0000000000000000000000000000000000000000000000000000000083168152600061022860048301846101c4565b949350505050565b600061023c82846101c4565b9392505050565b60006020828403121561025557600080fd5b8151801515811461023c57600080fdfea164736f6c6343000818000a","sourceMap":"715:19781:114:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1819:584;;;:::i;:::-;;;179:14:223;;172:22;154:41;;142:2;127:18;1819:584:114;;;;;;;1572:26;;;;;;;;;1819:584;1853:4;1873:7;;;;;;;1869:528;;;-1:-1:-1;1903:7:114;;;;;;;;1819:584::o;1869:528::-;1941:17;2997:42;2985:55;3066:16;1980:374;;2196:43;;;1671:64;2196:43;;;380:74:223;;;2221:17:114;470:18:223;;;463:34;2196:43:114;;;;;;;;;353:18:223;;;2196:43:114;;;-1:-1:-1;;1671:64:114;;2086:175;;2135:34;;2086:175;;;:::i;:::-;;;;;;;;;;;;;;;2047:232;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2020:259;;;2323:7;2312:27;;;;;;;;;;;;:::i;:::-;2297:42;;2002:352;1980:374;2374:12;1819:584;-1:-1:-1;1819:584:114:o;508:322:223:-;549:3;587:5;581:12;611:1;621:128;635:6;632:1;629:13;621:128;;;732:4;717:13;;;713:24;;707:31;694:11;;;687:52;650:12;621:128;;;-1:-1:-1;804:1:223;768:16;;793:13;;;-1:-1:-1;768:16:223;;508:322;-1:-1:-1;508:322:223:o;835:324::-;1032:66;1024:6;1020:79;1015:3;1008:92;990:3;1116:37;1150:1;1145:3;1141:11;1133:6;1116:37;:::i;:::-;1109:44;835:324;-1:-1:-1;;;;835:324:223:o;1164:189::-;1293:3;1318:29;1343:3;1335:6;1318:29;:::i;:::-;1311:36;1164:189;-1:-1:-1;;;1164:189:223:o;1358:277::-;1425:6;1478:2;1466:9;1457:7;1453:23;1449:32;1446:52;;;1494:1;1491;1484:12;1446:52;1526:9;1520:16;1579:5;1572:13;1565:21;1558:5;1555:32;1545:60;;1601:1;1598;1591:12","linkReferences":{}},"methodIdentifiers":{"IS_TEST()":"fa7626d4","failed()":"ba414fa6"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"name\":\"log\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"log_address\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"log_bytes\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"log_bytes32\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"name\":\"log_int\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"val\",\"type\":\"address\"}],\"name\":\"log_named_address\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"val\",\"type\":\"bytes\"}],\"name\":\"log_named_bytes\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"val\",\"type\":\"bytes32\"}],\"name\":\"log_named_bytes32\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"int256\",\"name\":\"val\",\"type\":\"int256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"decimals\",\"type\":\"uint256\"}],\"name\":\"log_named_decimal_int\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"val\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"decimals\",\"type\":\"uint256\"}],\"name\":\"log_named_decimal_uint\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"int256\",\"name\":\"val\",\"type\":\"int256\"}],\"name\":\"log_named_int\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"val\",\"type\":\"string\"}],\"name\":\"log_named_string\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"val\",\"type\":\"uint256\"}],\"name\":\"log_named_uint\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"name\":\"log_string\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"log_uint\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"logs\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"IS_TEST\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"failed\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"node_modules/ds-test/src/test.sol\":\"DSTest\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":3000},\"remappings\":[\":@latticexyz/=node_modules/@latticexyz/\",\":ds-test/=node_modules/ds-test/src/\",\":forge-std/=node_modules/forge-std/src/\"]},\"sources\":{\"node_modules/ds-test/src/test.sol\":{\"keccak256\":\"0x8758531bbac3972efcf1fa46383dbe1d276406fe527bc7abb2f236486278e83b\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://1f64264d61506847acf8761e84aff690cebe830958eac00bac7924d8be569240\",\"dweb:/ipfs/QmSekDJvJ82MZAmr63n7YvfLzQ7gS4NLSHPmHL3GN3rw8k\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.24+commit.e11b9ed9"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"string","name":"","type":"string","indexed":false}],"type":"event","name":"log","anonymous":false},{"inputs":[{"internalType":"address","name":"","type":"address","indexed":false}],"type":"event","name":"log_address","anonymous":false},{"inputs":[{"internalType":"bytes","name":"","type":"bytes","indexed":false}],"type":"event","name":"log_bytes","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32","indexed":false}],"type":"event","name":"log_bytes32","anonymous":false},{"inputs":[{"internalType":"int256","name":"","type":"int256","indexed":false}],"type":"event","name":"log_int","anonymous":false},{"inputs":[{"internalType":"string","name":"key","type":"string","indexed":false},{"internalType":"address","name":"val","type":"address","indexed":false}],"type":"event","name":"log_named_address","anonymous":false},{"inputs":[{"internalType":"string","name":"key","type":"string","indexed":false},{"internalType":"bytes","name":"val","type":"bytes","indexed":false}],"type":"event","name":"log_named_bytes","anonymous":false},{"inputs":[{"internalType":"string","name":"key","type":"string","indexed":false},{"internalType":"bytes32","name":"val","type":"bytes32","indexed":false}],"type":"event","name":"log_named_bytes32","anonymous":false},{"inputs":[{"internalType":"string","name":"key","type":"string","indexed":false},{"internalType":"int256","name":"val","type":"int256","indexed":false},{"internalType":"uint256","name":"decimals","type":"uint256","indexed":false}],"type":"event","name":"log_named_decimal_int","anonymous":false},{"inputs":[{"internalType":"string","name":"key","type":"string","indexed":false},{"internalType":"uint256","name":"val","type":"uint256","indexed":false},{"internalType":"uint256","name":"decimals","type":"uint256","indexed":false}],"type":"event","name":"log_named_decimal_uint","anonymous":false},{"inputs":[{"internalType":"string","name":"key","type":"string","indexed":false},{"internalType":"int256","name":"val","type":"int256","indexed":false}],"type":"event","name":"log_named_int","anonymous":false},{"inputs":[{"internalType":"string","name":"key","type":"string","indexed":false},{"internalType":"string","name":"val","type":"string","indexed":false}],"type":"event","name":"log_named_string","anonymous":false},{"inputs":[{"internalType":"string","name":"key","type":"string","indexed":false},{"internalType":"uint256","name":"val","type":"uint256","indexed":false}],"type":"event","name":"log_named_uint","anonymous":false},{"inputs":[{"internalType":"string","name":"","type":"string","indexed":false}],"type":"event","name":"log_string","anonymous":false},{"inputs":[{"internalType":"uint256","name":"","type":"uint256","indexed":false}],"type":"event","name":"log_uint","anonymous":false},{"inputs":[{"internalType":"bytes","name":"","type":"bytes","indexed":false}],"type":"event","name":"logs","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"IS_TEST","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"failed","outputs":[{"internalType":"bool","name":"","type":"bool"}]}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@latticexyz/=node_modules/@latticexyz/","ds-test/=node_modules/ds-test/src/","forge-std/=node_modules/forge-std/src/"],"optimizer":{"enabled":true,"runs":3000},"metadata":{"bytecodeHash":"none"},"compilationTarget":{"node_modules/ds-test/src/test.sol":"DSTest"},"evmVersion":"paris","libraries":{}},"sources":{"node_modules/ds-test/src/test.sol":{"keccak256":"0x8758531bbac3972efcf1fa46383dbe1d276406fe527bc7abb2f236486278e83b","urls":["bzz-raw://1f64264d61506847acf8761e84aff690cebe830958eac00bac7924d8be569240","dweb:/ipfs/QmSekDJvJ82MZAmr63n7YvfLzQ7gS4NLSHPmHL3GN3rw8k"],"license":"GPL-3.0-or-later"}},"version":1},"id":114}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@latticexyz/world-modules",
3
- "version": "2.0.2-main-a09bf251",
3
+ "version": "2.0.2-main-e86bd14d",
4
4
  "description": "World modules",
5
5
  "repository": {
6
6
  "type": "git",
@@ -15,11 +15,11 @@
15
15
  },
16
16
  "dependencies": {
17
17
  "zod": "^3.21.4",
18
- "@latticexyz/common": "2.0.2-main-a09bf251",
19
- "@latticexyz/schema-type": "2.0.2-main-a09bf251",
20
- "@latticexyz/config": "2.0.2-main-a09bf251",
21
- "@latticexyz/store": "2.0.2-main-a09bf251",
22
- "@latticexyz/world": "2.0.2-main-a09bf251"
18
+ "@latticexyz/common": "2.0.2-main-e86bd14d",
19
+ "@latticexyz/config": "2.0.2-main-e86bd14d",
20
+ "@latticexyz/schema-type": "2.0.2-main-e86bd14d",
21
+ "@latticexyz/store": "2.0.2-main-e86bd14d",
22
+ "@latticexyz/world": "2.0.2-main-e86bd14d"
23
23
  },
24
24
  "devDependencies": {
25
25
  "@types/ejs": "^3.1.1",
@@ -34,8 +34,8 @@
34
34
  "tsup": "^6.7.0",
35
35
  "tsx": "^3.12.6",
36
36
  "vitest": "0.34.6",
37
- "@latticexyz/abi-ts": "2.0.2-main-a09bf251",
38
- "@latticexyz/gas-report": "2.0.2-main-a09bf251"
37
+ "@latticexyz/abi-ts": "2.0.2-main-e86bd14d",
38
+ "@latticexyz/gas-report": "2.0.2-main-e86bd14d"
39
39
  },
40
40
  "publishConfig": {
41
41
  "access": "public"
package/src/index.sol CHANGED
@@ -22,3 +22,4 @@ import { Owners } from "./modules/erc721-puppet/tables/Owners.sol";
22
22
  import { TokenApproval } from "./modules/erc721-puppet/tables/TokenApproval.sol";
23
23
  import { OperatorApproval } from "./modules/erc721-puppet/tables/OperatorApproval.sol";
24
24
  import { ERC721Registry } from "./modules/erc721-puppet/tables/ERC721Registry.sol";
25
+ import { UserDelegationNonces } from "./modules/delegation/tables/UserDelegationNonces.sol";
@@ -0,0 +1,23 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity >=0.8.24;
3
+
4
+ /* Autogenerated file. Do not edit manually. */
5
+
6
+ import { ResourceId } from "@latticexyz/store/src/ResourceId.sol";
7
+
8
+ /**
9
+ * @title IUnstable_DelegationWithSignatureSystem
10
+ * @author MUD (https://mud.dev) by Lattice (https://lattice.xyz)
11
+ * @dev This interface is automatically generated from the corresponding system contract. Do not edit manually.
12
+ */
13
+ interface IUnstable_DelegationWithSignatureSystem {
14
+ error InvalidSignature(address signer);
15
+
16
+ function registerDelegationWithSignature(
17
+ address delegatee,
18
+ ResourceId delegationControlId,
19
+ bytes memory initCallData,
20
+ address delegator,
21
+ bytes memory signature
22
+ ) external;
23
+ }
@@ -0,0 +1,174 @@
1
+ // SPDX-License-Identifier: MIT
2
+ // OpenZeppelin Contracts (last updated v5.0.0) (utils/cryptography/ECDSA.sol)
3
+
4
+ pragma solidity >=0.8.24;
5
+
6
+ /**
7
+ * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
8
+ *
9
+ * These functions can be used to verify that a message was signed by the holder
10
+ * of the private keys of a given address.
11
+ */
12
+ library ECDSA {
13
+ enum RecoverError {
14
+ NoError,
15
+ InvalidSignature,
16
+ InvalidSignatureLength,
17
+ InvalidSignatureS
18
+ }
19
+
20
+ /**
21
+ * @dev The signature derives the `address(0)`.
22
+ */
23
+ error ECDSAInvalidSignature();
24
+
25
+ /**
26
+ * @dev The signature has an invalid length.
27
+ */
28
+ error ECDSAInvalidSignatureLength(uint256 length);
29
+
30
+ /**
31
+ * @dev The signature has an S value that is in the upper half order.
32
+ */
33
+ error ECDSAInvalidSignatureS(bytes32 s);
34
+
35
+ /**
36
+ * @dev Returns the address that signed a hashed message (`hash`) with `signature` or an error. This will not
37
+ * return address(0) without also returning an error description. Errors are documented using an enum (error type)
38
+ * and a bytes32 providing additional information about the error.
39
+ *
40
+ * If no error is returned, then the address can be used for verification purposes.
41
+ *
42
+ * The `ecrecover` EVM precompile allows for malleable (non-unique) signatures:
43
+ * this function rejects them by requiring the `s` value to be in the lower
44
+ * half order, and the `v` value to be either 27 or 28.
45
+ *
46
+ * IMPORTANT: `hash` _must_ be the result of a hash operation for the
47
+ * verification to be secure: it is possible to craft signatures that
48
+ * recover to arbitrary addresses for non-hashed data. A safe way to ensure
49
+ * this is by receiving a hash of the original message (which may otherwise
50
+ * be too long), and then calling {MessageHashUtils-toEthSignedMessageHash} on it.
51
+ *
52
+ * Documentation for signature generation:
53
+ * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
54
+ * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
55
+ */
56
+ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError, bytes32) {
57
+ if (signature.length == 65) {
58
+ bytes32 r;
59
+ bytes32 s;
60
+ uint8 v;
61
+ // ecrecover takes the signature parameters, and the only way to get them
62
+ // currently is to use assembly.
63
+ /// @solidity memory-safe-assembly
64
+ assembly {
65
+ r := mload(add(signature, 0x20))
66
+ s := mload(add(signature, 0x40))
67
+ v := byte(0, mload(add(signature, 0x60)))
68
+ }
69
+ return tryRecover(hash, v, r, s);
70
+ } else {
71
+ return (address(0), RecoverError.InvalidSignatureLength, bytes32(signature.length));
72
+ }
73
+ }
74
+
75
+ /**
76
+ * @dev Returns the address that signed a hashed message (`hash`) with
77
+ * `signature`. This address can then be used for verification purposes.
78
+ *
79
+ * The `ecrecover` EVM precompile allows for malleable (non-unique) signatures:
80
+ * this function rejects them by requiring the `s` value to be in the lower
81
+ * half order, and the `v` value to be either 27 or 28.
82
+ *
83
+ * IMPORTANT: `hash` _must_ be the result of a hash operation for the
84
+ * verification to be secure: it is possible to craft signatures that
85
+ * recover to arbitrary addresses for non-hashed data. A safe way to ensure
86
+ * this is by receiving a hash of the original message (which may otherwise
87
+ * be too long), and then calling {MessageHashUtils-toEthSignedMessageHash} on it.
88
+ */
89
+ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
90
+ (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, signature);
91
+ _throwError(error, errorArg);
92
+ return recovered;
93
+ }
94
+
95
+ /**
96
+ * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
97
+ *
98
+ * See https://eips.ethereum.org/EIPS/eip-2098[ERC-2098 short signatures]
99
+ */
100
+ function tryRecover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address, RecoverError, bytes32) {
101
+ unchecked {
102
+ bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
103
+ // We do not check for an overflow here since the shift operation results in 0 or 1.
104
+ uint8 v = uint8((uint256(vs) >> 255) + 27);
105
+ return tryRecover(hash, v, r, s);
106
+ }
107
+ }
108
+
109
+ /**
110
+ * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
111
+ */
112
+ function recover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address) {
113
+ (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, r, vs);
114
+ _throwError(error, errorArg);
115
+ return recovered;
116
+ }
117
+
118
+ /**
119
+ * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
120
+ * `r` and `s` signature fields separately.
121
+ */
122
+ function tryRecover(
123
+ bytes32 hash,
124
+ uint8 v,
125
+ bytes32 r,
126
+ bytes32 s
127
+ ) internal pure returns (address, RecoverError, bytes32) {
128
+ // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
129
+ // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
130
+ // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
131
+ // signatures from current libraries generate a unique signature with an s-value in the lower half order.
132
+ //
133
+ // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
134
+ // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
135
+ // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
136
+ // these malleable signatures as well.
137
+ if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
138
+ return (address(0), RecoverError.InvalidSignatureS, s);
139
+ }
140
+
141
+ // If the signature is valid (and not malleable), return the signer address
142
+ address signer = ecrecover(hash, v, r, s);
143
+ if (signer == address(0)) {
144
+ return (address(0), RecoverError.InvalidSignature, bytes32(0));
145
+ }
146
+
147
+ return (signer, RecoverError.NoError, bytes32(0));
148
+ }
149
+
150
+ /**
151
+ * @dev Overload of {ECDSA-recover} that receives the `v`,
152
+ * `r` and `s` signature fields separately.
153
+ */
154
+ function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {
155
+ (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, v, r, s);
156
+ _throwError(error, errorArg);
157
+ return recovered;
158
+ }
159
+
160
+ /**
161
+ * @dev Optionally reverts with the corresponding custom error according to the `error` argument provided.
162
+ */
163
+ function _throwError(RecoverError error, bytes32 errorArg) private pure {
164
+ if (error == RecoverError.NoError) {
165
+ return; // no error: do nothing
166
+ } else if (error == RecoverError.InvalidSignature) {
167
+ revert ECDSAInvalidSignature();
168
+ } else if (error == RecoverError.InvalidSignatureLength) {
169
+ revert ECDSAInvalidSignatureLength(uint256(errorArg));
170
+ } else if (error == RecoverError.InvalidSignatureS) {
171
+ revert ECDSAInvalidSignatureS(errorArg);
172
+ }
173
+ }
174
+ }
@@ -0,0 +1,49 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity >=0.8.24;
3
+
4
+ import { IBaseWorld } from "@latticexyz/world/src/codegen/interfaces/IBaseWorld.sol";
5
+
6
+ import { Module } from "@latticexyz/world/src/Module.sol";
7
+ import { revertWithBytes } from "@latticexyz/world/src/revertWithBytes.sol";
8
+
9
+ import { UserDelegationNonces } from "./tables/UserDelegationNonces.sol";
10
+ import { Unstable_DelegationWithSignatureSystem } from "./Unstable_DelegationWithSignatureSystem.sol";
11
+
12
+ import { DELEGATION_SYSTEM_ID } from "./constants.sol";
13
+
14
+ contract Unstable_DelegationWithSignatureModule is Module {
15
+ Unstable_DelegationWithSignatureSystem private immutable delegationWithSignatureSystem =
16
+ new Unstable_DelegationWithSignatureSystem();
17
+
18
+ function installRoot(bytes memory encodedArgs) public {
19
+ requireNotInstalled(__self, encodedArgs);
20
+
21
+ IBaseWorld world = IBaseWorld(_world());
22
+
23
+ // Register table
24
+ UserDelegationNonces._register();
25
+
26
+ // Register system
27
+ (bool success, bytes memory data) = address(world).delegatecall(
28
+ abi.encodeCall(world.registerSystem, (DELEGATION_SYSTEM_ID, delegationWithSignatureSystem, true))
29
+ );
30
+ if (!success) revertWithBytes(data);
31
+
32
+ // Register system's functions
33
+ (success, data) = address(world).delegatecall(
34
+ abi.encodeCall(
35
+ world.registerRootFunctionSelector,
36
+ (
37
+ DELEGATION_SYSTEM_ID,
38
+ "registerDelegationWithSignature(address,bytes32,bytes,address,bytes)",
39
+ "registerDelegationWithSignature(address,bytes32,bytes,address,bytes)"
40
+ )
41
+ )
42
+ );
43
+ if (!success) revertWithBytes(data);
44
+ }
45
+
46
+ function install(bytes memory) public pure {
47
+ revert Module_NonRootInstallNotSupported();
48
+ }
49
+ }
@@ -0,0 +1,47 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity >=0.8.24;
3
+
4
+ import { ResourceId } from "@latticexyz/store/src/ResourceId.sol";
5
+ import { System } from "@latticexyz/world/src/System.sol";
6
+ import { createDelegation } from "@latticexyz/world/src/modules/init/implementations/createDelegation.sol";
7
+
8
+ import { UserDelegationNonces } from "./tables/UserDelegationNonces.sol";
9
+ import { getSignedMessageHash } from "./getSignedMessageHash.sol";
10
+ import { ECDSA } from "./ECDSA.sol";
11
+
12
+ contract Unstable_DelegationWithSignatureSystem is System {
13
+ /**
14
+ * @dev Mismatched signature.
15
+ */
16
+ error InvalidSignature(address signer);
17
+
18
+ /**
19
+ * @notice Registers a delegation for `delegator` with a signature
20
+ * @dev Creates a new delegation from the caller to the specified delegatee
21
+ * @param delegatee The address of the delegatee
22
+ * @param delegationControlId The ID controlling the delegation
23
+ * @param initCallData The initialization data for the delegation
24
+ * @param delegator The address of the delegator
25
+ * @param signature The EIP712 signature
26
+ */
27
+ function registerDelegationWithSignature(
28
+ address delegatee,
29
+ ResourceId delegationControlId,
30
+ bytes memory initCallData,
31
+ address delegator,
32
+ bytes memory signature
33
+ ) public {
34
+ uint256 nonce = UserDelegationNonces.get(delegator);
35
+ bytes32 hash = getSignedMessageHash(delegatee, delegationControlId, initCallData, delegator, nonce, _world());
36
+
37
+ // If the message was not signed by the delegator or is invalid, revert
38
+ address signer = ECDSA.recover(hash, signature);
39
+ if (signer != delegator) {
40
+ revert InvalidSignature(signer);
41
+ }
42
+
43
+ UserDelegationNonces.set(delegator, nonce + 1);
44
+
45
+ createDelegation(delegator, delegatee, delegationControlId, initCallData);
46
+ }
47
+ }
@@ -0,0 +1,10 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity >=0.8.24;
3
+
4
+ import { ResourceId } from "@latticexyz/world/src/WorldResourceId.sol";
5
+ import { ROOT_NAMESPACE } from "@latticexyz/world/src/constants.sol";
6
+ import { RESOURCE_TABLE, RESOURCE_SYSTEM, RESOURCE_NAMESPACE } from "@latticexyz/world/src/worldResourceTypes.sol";
7
+
8
+ ResourceId constant DELEGATION_SYSTEM_ID = ResourceId.wrap(
9
+ (bytes32(abi.encodePacked(RESOURCE_SYSTEM, ROOT_NAMESPACE, "Delegation")))
10
+ );
@@ -0,0 +1,44 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity >=0.8.24;
3
+
4
+ import { ResourceId } from "@latticexyz/store/src/ResourceId.sol";
5
+
6
+ // Implements EIP712 signatures https://eips.ethereum.org/EIPS/eip-712
7
+
8
+ bytes32 constant DELEGATION_TYPEHASH = keccak256(
9
+ "Delegation(address delegatee,bytes32 delegationControlId,bytes initCallData,address delegator,uint256 nonce)"
10
+ );
11
+
12
+ /**
13
+ * @notice Generate the message hash for a given delegation signature.
14
+ * @dev We include the delegator to prevent generating a garbage signature and registering a delegation for the corresponding recovered address.
15
+ * @param delegatee The address of the delegatee
16
+ * @param delegationControlId The ID controlling the delegation
17
+ * @param initCallData The initialization data for the delegation
18
+ * @param delegator The address of the delegator
19
+ * @param nonce The nonce of the delegator
20
+ * @param worldAddress The world address
21
+ */
22
+ function getSignedMessageHash(
23
+ address delegatee,
24
+ ResourceId delegationControlId,
25
+ bytes memory initCallData,
26
+ address delegator,
27
+ uint256 nonce,
28
+ address worldAddress
29
+ ) view returns (bytes32) {
30
+ bytes32 domainSeperator = keccak256(
31
+ abi.encode(keccak256("EIP712Domain(uint256 chainId,address verifyingContract)"), block.chainid, worldAddress)
32
+ );
33
+
34
+ return
35
+ keccak256(
36
+ abi.encodePacked(
37
+ "\x19\x01",
38
+ domainSeperator,
39
+ keccak256(
40
+ abi.encode(DELEGATION_TYPEHASH, delegatee, delegationControlId, keccak256(initCallData), delegator, nonce)
41
+ )
42
+ )
43
+ );
44
+ }