From 0e42adfa8e6d855f06c57395ffead79dfa8b73e4 Mon Sep 17 00:00:00 2001 From: Ansonhkg Date: Wed, 13 Sep 2023 16:40:34 +0100 Subject: [PATCH 1/9] update config --- lit.config.json | 34 +++++++++++++++------------------- 1 file changed, 15 insertions(+), 19 deletions(-) diff --git a/lit.config.json b/lit.config.json index 2c79192301..ff95c9206e 100644 --- a/lit.config.json +++ b/lit.config.json @@ -11,32 +11,28 @@ "AMOUNT": 1, "DEFAULT_GAS": 0.025, "AUTH_METHOD_ACCESS_TOKEN": "", + "HEX_TEST_MEMO": "0x4a532d53444b2054657374", "CONTROLLER_PRIVATE_KEY": "f21d3fafe29fa10d26092ce4e91cd7108b734b98393f79b3c2cd04de24ca6817", "CONTROLLER_ADDRESS": "0xeF71c2604f17Ec6Fc13409DF24EfdC440D240d37", - "PKP_TOKENID": "95757505626559048115160041453327002174209563758060265420687464470766615265286", - "PKP_PUBKEY": "0433754fd30b49d260a23e035a1f396451e94928674aa1b67cc54f65e1572c722184bdb47da1082ecd31c6a3f400e50834452440c463c9a24d857e33c5cff87f0f", - "PKP_ETH_ADDRESS": "0x9e8C253F28F65aa0809518D940fBfA76fF00f1ee", - "PKP_COSMOS_ADDRESS": "cosmos15q50fd00rwkyagzwdr0uffmy0pnpq5quh0g6xy", + "PKP_TOKENID": "4817247653356976697974290636295717432755904941615400157762061752316489997932", + "PKP_PUBKEY": "040926f545f13245d3ceb36fe00bb1ebbc3e3cebb4c4c737e5bde68fce8e9056b2df598dad99ad55de46689f383ef07cd07077fb6d29261fec14ad990cabce50f6", + "PKP_ETH_ADDRESS": "0xaD690823D1E5ed90cBaAC551dAa610F498AbAfC3", + "PKP_COSMOS_ADDRESS": "cosmos1jys64cc7ethk7eycarexkgmckjk6x0vawrk0dn", "CONTROLLER_AUTHSIG": { - "sig": "0xaf2d252cbddecd5fac28a3cfafbbdf94ec634ab08e141d8032974bd1b5e5c31e3efcb942b72785ac176d3c05ac944048d70bc8240437eb7f03ce61dc843a72a41c", + "sig": "0xf84ad3d3efa42abcae2b3567c836f1342552a75ed038e9403b77a7c47e3500242572c86ddee7f9af4994793a741111553ac7652897ee5447b143b8067557a3511b", "derivedVia": "web3.eth.personal.sign", - "signedMessage": "localhost wants you to sign in with your Ethereum account:\n0xeF71c2604f17Ec6Fc13409DF24EfdC440D240d37\n\nTESTING TESTING 123\n\nURI: https://localhost/login\nVersion: 1\nChain ID: 1\nNonce: yygbAjEtG1XxWNV33\nIssued At: 2023-09-12T16:11:48.783Z\nExpiration Time: 2023-09-19T16:11:48.782Z", + "signedMessage": "localhost wants you to sign in with your Ethereum account:\n0xeF71c2604f17Ec6Fc13409DF24EfdC440D240d37\n\nTESTING TESTING 123\n\nURI: https://localhost/login\nVersion: 1\nChain ID: 1\nNonce: lB8fEJ0f1lRIhXcEl\nIssued At: 2023-09-13T15:11:37.387Z\nExpiration Time: 2023-09-20T15:11:37.387Z", "address": "0xeF71c2604f17Ec6Fc13409DF24EfdC440D240d37" }, "CONTROLLER_ADDRESS_2": "0xeF71c2604f17Ec6Fc13409DF24EfdC440D240d37", - "PKP_TOKENID_2": "24835099358268997048937914101324619256896125722026624265212264014817443445477", - "PKP_PUBKEY_2": "04a6a49cf9b44ffd69437afed95b1c5efb0b574ade5071646d7ac6cf2a9d43d293d451da5cb1667b310e6de82ea300963e572b10f91e7e660bf7ccd0284ede66d2", - "PKP_ETH_ADDRESS_2": "0xf414Aeb37a99776813a66c07FA686A32c9340496", - "PKP_COSMOS_ADDRESS_2": "cosmos1fd5zanrsrfjxrdwxxlnfeadel575rpsajje0gq", + "PKP_TOKENID_2": "89667777952586633309603568722064635097225550400851111260038665193968462222244", + "PKP_PUBKEY_2": "0443ca6128c4e38b2f3c57bf6acb2d9cc09700d10761188926eddf48a4efb4fa4cdd288c773ae7978f07b57c77fd37da3a1718483441b4b5cb1705fc4b6f75f53b", + "PKP_ETH_ADDRESS_2": "0xA5d8d25A4eDf2e6392F8435b82354929Ffd45407", + "PKP_COSMOS_ADDRESS_2": "cosmos1r2uwzl75jvaafn9jg5yjds39f8wgd8rmtjtz2l", "CONTROLLER_AUTHSIG_2": { - "sig": "0xdfaca99bbed1389ef92c5bdc4983484fad9255669000d1fefcb4230025b2a8184218954db813ab2195ad5cedbe635b12bf7c592050e713c2ada9caecf9de04f71b", + "sig": "0xcbccc0a5cd0ce70453041af59e69a291996bc6ecab17a59a7c015fc619d9c3a04dc529232a1e46eac571610d2db5e101e688ce62debd21b0d7ebac91c747bc131c", "derivedVia": "web3.eth.personal.sign", - "signedMessage": "localhost wants you to sign in with your Ethereum account:\n0xeF71c2604f17Ec6Fc13409DF24EfdC440D240d37\n\nTESTING TESTING 123\n\nURI: https://localhost/login\nVersion: 1\nChain ID: 1\nNonce: QuxJ9dJ8QV6BgWDPW\nIssued At: 2023-09-12T16:11:59.316Z\nExpiration Time: 2023-09-19T16:11:59.316Z", + "signedMessage": "localhost wants you to sign in with your Ethereum account:\n0xeF71c2604f17Ec6Fc13409DF24EfdC440D240d37\n\nTESTING TESTING 123\n\nURI: https://localhost/login\nVersion: 1\nChain ID: 1\nNonce: QpsgqataXyKS1qGxk\nIssued At: 2023-09-13T15:11:44.041Z\nExpiration Time: 2023-09-20T15:11:44.041Z", "address": "0xeF71c2604f17Ec6Fc13409DF24EfdC440D240d37" - }, - "PKP_ETH_ADDRESS_2": "0xf26Bdd71BACf9D99F5739B4b1a2733E209248170", - "STYTCH_APP_ID": "project-test-de4e2690-1506-4cf5-8bce-44571ddaebc9", - "STYTCH_USER_ID": "user-test-68103e01-7468-4abf-83c8-885db2ca1c6c", - "STYTCH_TEST_TOKEN": "eyJhbGciOiJSUzI1NiIsImtpZCI6Imp3ay10ZXN0LWZiMjhlYmY2LTQ3NTMtNDdkMS1iMGUzLTRhY2NkMWE1MTc1NyIsInR5cCI6IkpXVCJ9.eyJhdWQiOlsicHJvamVjdC10ZXN0LWRlNGUyNjkwLTE1MDYtNGNmNS04YmNlLTQ0NTcxZGRhZWJjOSJdLCJleHAiOjE2ODg1Njc0MTQsImh0dHBzOi8vc3R5dGNoLmNvbS9zZXNzaW9uIjp7ImlkIjoic2Vzc2lvbi10ZXN0LTlkZDI3ZGE1LTVjNjQtNDE5NS04NjdlLWIxNGE3MWE5M2MxMSIsInN0YXJ0ZWRfYXQiOiIyMDIzLTA3LTA1VDE0OjI1OjE0WiIsImxhc3RfYWNjZXNzZWRfYXQiOiIyMDIzLTA3LTA1VDE0OjI1OjE0WiIsImV4cGlyZXNfYXQiOiIyMDIzLTA5LTEzVDAxOjA1OjE0WiIsImF0dHJpYnV0ZXMiOnsidXNlcl9hZ2VudCI6IiIsImlwX2FkZHJlc3MiOiIifSwiYXV0aGVudGljYXRpb25fZmFjdG9ycyI6W3sidHlwZSI6Im90cCIsImRlbGl2ZXJ5X21ldGhvZCI6ImVtYWlsIiwibGFzdF9hdXRoZW50aWNhdGVkX2F0IjoiMjAyMy0wNy0wNVQxNDoyNToxNFoiLCJlbWFpbF9mYWN0b3IiOnsiZW1haWxfaWQiOiJlbWFpbC10ZXN0LTAwMzZmM2YzLTQ0MjQtNDg2My1iYWQ3LTFkNGU3NTM1ZDJiMCIsImVtYWlsX2FkZHJlc3MiOiJqb3NoQGxpdHByb3RvY29sLmNvbSJ9fV19LCJpYXQiOjE2ODg1NjcxMTQsImlzcyI6InN0eXRjaC5jb20vcHJvamVjdC10ZXN0LWRlNGUyNjkwLTE1MDYtNGNmNS04YmNlLTQ0NTcxZGRhZWJjOSIsIm5iZiI6MTY4ODU2NzExNCwic3ViIjoidXNlci10ZXN0LTY4MTAzZTAxLTc0NjgtNGFiZi04M2M4LTg4NWRiMmNhMWM2YyJ9.rZgaunT1UV2pmliZ0V7nYqYtyfdGas4eY6Q6RCzEEBc5y1K66lopUbvvkfNsLJUjSc3vw12NlIX3Q47zm0XEP8AahrJ0QWAC4v9gmZKVYbKiL2JppqnaxtNLZV9Zo1KAiqm9gdqRQSD29222RTC59PI52AOZd4iTv4lSBIPG2J9rUkUwaRI23bGLMQ8XVkTSS7wcd1Ls08Q-VDXuwl8vuoJhssBfNfxFigk7cKHwbbM-o1sh3upEzV-WFgvJrTstPUNbHOBvGnqKDZX6A_45M5zBnHrerifz4-ST771tajiuW2lQXWvocyYlRT8_a0XBsW77UhU-YBTvKVpj3jmH4A" - -} + } +} \ No newline at end of file From 29b4f8526dd8f6efc5e478b0514b7ba865356a18 Mon Sep 17 00:00:00 2001 From: Ansonhkg Date: Wed, 13 Sep 2023 16:40:46 +0100 Subject: [PATCH 2/9] update config --- apps/html/index.html | 4 +- apps/react/src/app/app.tsx | 2 +- bun.lockb | Bin 0 -> 1438025 bytes .../Allowlist.sol/Allowlist.json | 232 ++ .../lit-contracts/Allowlist.sol/Allowlist.ts | 442 ++++ .../Allowlist.sol/AllowlistContract.js | 8 + .../Allowlist.sol/AllowlistContract.mjs | 8 + .../Allowlist.sol/AllowlistContract.ts | 11 + .../Allowlist.sol/AllowlistData.js | 232 ++ .../Allowlist.sol/AllowlistData.mjs | 232 ++ .../Allowlist.sol/AllowlistData.ts | 232 ++ .../lit-contracts/Allowlist.sol/common.ts | 44 + .../factories/Allowlist__factory.ts | 248 ++ .../Allowlist.sol/factories/index.ts | 4 + .../lit-contracts/Allowlist.sol/index.js | 2 + .../lit-contracts/Allowlist.sol/index.mjs | 2 + .../lit-contracts/Allowlist.sol/index.ts | 3 + .../DomainWaleltRegistry.json | 655 +++++ .../DomainWaleltRegistry.ts | 1054 ++++++++ .../DomainWaleltRegistryContract.js | 8 + .../DomainWaleltRegistryContract.mjs | 8 + .../DomainWaleltRegistryContract.ts | 11 + .../DomainWaleltRegistryData.js | 655 +++++ .../DomainWaleltRegistryData.mjs | 655 +++++ .../DomainWaleltRegistryData.ts | 655 +++++ .../DomainWaleltRegistry.sol/common.ts | 44 + .../DomainWaleltRegistry__factory.ts | 678 +++++ .../factories/index.ts | 4 + .../DomainWaleltRegistry.sol/index.js | 2 + .../DomainWaleltRegistry.sol/index.mjs | 2 + .../DomainWaleltRegistry.sol/index.ts | 3 + .../DomainWalletOracle.json | 722 +++++ .../DomainWalletOracle.ts | 1111 ++++++++ .../DomainWalletOracleContract.js | 8 + .../DomainWalletOracleContract.mjs | 8 + .../DomainWalletOracleContract.ts | 11 + .../DomainWalletOracleData.js | 722 +++++ .../DomainWalletOracleData.mjs | 722 +++++ .../DomainWalletOracleData.ts | 722 +++++ .../DomainWalletOracle.sol/common.ts | 44 + .../factories/DomainWalletOracle__factory.ts | 741 ++++++ .../DomainWalletOracle.sol/factories/index.ts | 4 + .../DomainWalletOracle.sol/index.js | 2 + .../DomainWalletOracle.sol/index.mjs | 2 + .../DomainWalletOracle.sol/index.ts | 3 + .../lit-contracts/LITToken.sol/LITToken.json | 313 +++ .../lit-contracts/LITToken.sol/LITToken.ts | 488 ++++ .../LITToken.sol/LITTokenContract.js | 8 + .../LITToken.sol/LITTokenContract.mjs | 8 + .../LITToken.sol/LITTokenContract.ts | 11 + .../LITToken.sol/LITTokenData.js | 313 +++ .../LITToken.sol/LITTokenData.mjs | 313 +++ .../LITToken.sol/LITTokenData.ts | 313 +++ .../lit-contracts/LITToken.sol/common.ts | 44 + .../factories/LITToken__factory.ts | 329 +++ .../LITToken.sol/factories/index.ts | 4 + .../lit-contracts/LITToken.sol/index.js | 2 + .../lit-contracts/LITToken.sol/index.mjs | 2 + .../lit-contracts/LITToken.sol/index.ts | 3 + .../Multisender.sol/Multisender.json | 110 + .../Multisender.sol/Multisender.ts | 297 +++ .../Multisender.sol/MultisenderContract.js | 8 + .../Multisender.sol/MultisenderContract.mjs | 8 + .../Multisender.sol/MultisenderContract.ts | 11 + .../Multisender.sol/MultisenderData.js | 110 + .../Multisender.sol/MultisenderData.mjs | 110 + .../Multisender.sol/MultisenderData.ts | 110 + .../lit-contracts/Multisender.sol/common.ts | 44 + .../factories/Multisender__factory.ts | 126 + .../Multisender.sol/factories/index.ts | 4 + .../lit-contracts/Multisender.sol/index.js | 2 + .../lit-contracts/Multisender.sol/index.mjs | 2 + .../lit-contracts/Multisender.sol/index.ts | 3 + .../PKPHelper.sol/PKPHelper.json | 782 ++++++ .../lit-contracts/PKPHelper.sol/PKPHelper.ts | 1231 +++++++++ .../PKPHelper.sol/PKPHelperContract.js | 8 + .../PKPHelper.sol/PKPHelperContract.mjs | 8 + .../PKPHelper.sol/PKPHelperContract.ts | 11 + .../PKPHelper.sol/PKPHelperData.js | 782 ++++++ .../PKPHelper.sol/PKPHelperData.mjs | 782 ++++++ .../PKPHelper.sol/PKPHelperData.ts | 782 ++++++ .../lit-contracts/PKPHelper.sol/common.ts | 44 + .../factories/PKPHelper__factory.ts | 798 ++++++ .../PKPHelper.sol/factories/index.ts | 4 + .../lit-contracts/PKPHelper.sol/index.js | 2 + .../lit-contracts/PKPHelper.sol/index.mjs | 2 + .../lit-contracts/PKPHelper.sol/index.ts | 3 + .../lit-contracts/PKPNFT.sol/PKPNFT.json | 892 +++++++ .../lit-contracts/PKPNFT.sol/PKPNFT.ts | 1454 ++++++++++ .../PKPNFT.sol/PKPNFTContract.js | 8 + .../PKPNFT.sol/PKPNFTContract.mjs | 8 + .../PKPNFT.sol/PKPNFTContract.ts | 11 + .../lit-contracts/PKPNFT.sol/PKPNFTData.js | 892 +++++++ .../lit-contracts/PKPNFT.sol/PKPNFTData.mjs | 892 +++++++ .../lit-contracts/PKPNFT.sol/PKPNFTData.ts | 892 +++++++ .../lit-contracts/PKPNFT.sol/common.ts | 44 + .../PKPNFT.sol/factories/PKPNFT__factory.ts | 905 +++++++ .../PKPNFT.sol/factories/index.ts | 4 + .../scripts/lit-contracts/PKPNFT.sol/index.js | 2 + .../lit-contracts/PKPNFT.sol/index.mjs | 2 + .../scripts/lit-contracts/PKPNFT.sol/index.ts | 3 + .../PKPPermissions.sol/PKPPermissions.json | 994 +++++++ .../PKPPermissions.sol/PKPPermissions.ts | 1614 ++++++++++++ .../PKPPermissionsContract.js | 8 + .../PKPPermissionsContract.mjs | 8 + .../PKPPermissionsContract.ts | 11 + .../PKPPermissions.sol/PKPPermissionsData.js | 994 +++++++ .../PKPPermissions.sol/PKPPermissionsData.mjs | 994 +++++++ .../PKPPermissions.sol/PKPPermissionsData.ts | 994 +++++++ .../PKPPermissions.sol/common.ts | 44 + .../factories/PKPPermissions__factory.ts | 1013 +++++++ .../PKPPermissions.sol/factories/index.ts | 4 + .../lit-contracts/PKPPermissions.sol/index.js | 2 + .../PKPPermissions.sol/index.mjs | 2 + .../lit-contracts/PKPPermissions.sol/index.ts | 3 + .../PubkeyRouter.sol/PubkeyRouter.json | 783 ++++++ .../PubkeyRouter.sol/PubkeyRouter.ts | 1186 +++++++++ .../PubkeyRouter.sol/PubkeyRouterContract.js | 8 + .../PubkeyRouter.sol/PubkeyRouterContract.mjs | 8 + .../PubkeyRouter.sol/PubkeyRouterContract.ts | 11 + .../PubkeyRouter.sol/PubkeyRouterData.js | 783 ++++++ .../PubkeyRouter.sol/PubkeyRouterData.mjs | 783 ++++++ .../PubkeyRouter.sol/PubkeyRouterData.ts | 783 ++++++ .../lit-contracts/PubkeyRouter.sol/common.ts | 44 + .../factories/PubkeyRouter__factory.ts | 799 ++++++ .../PubkeyRouter.sol/factories/index.ts | 4 + .../lit-contracts/PubkeyRouter.sol/index.js | 2 + .../lit-contracts/PubkeyRouter.sol/index.mjs | 2 + .../lit-contracts/PubkeyRouter.sol/index.ts | 3 + .../RateLimitNFT.sol/RateLimitNFT.json | 921 +++++++ .../RateLimitNFT.sol/RateLimitNFT.ts | 1634 ++++++++++++ .../RateLimitNFT.sol/RateLimitNFTContract.js | 8 + .../RateLimitNFT.sol/RateLimitNFTContract.mjs | 8 + .../RateLimitNFT.sol/RateLimitNFTContract.ts | 11 + .../RateLimitNFT.sol/RateLimitNFTData.js | 921 +++++++ .../RateLimitNFT.sol/RateLimitNFTData.mjs | 921 +++++++ .../RateLimitNFT.sol/RateLimitNFTData.ts | 921 +++++++ .../lit-contracts/RateLimitNFT.sol/common.ts | 44 + .../factories/RateLimitNFT__factory.ts | 937 +++++++ .../RateLimitNFT.sol/factories/index.ts | 4 + .../lit-contracts/RateLimitNFT.sol/index.js | 2 + .../lit-contracts/RateLimitNFT.sol/index.mjs | 2 + .../lit-contracts/RateLimitNFT.sol/index.ts | 3 + .../lit-contracts/Resolver.sol/Resolver.json | 596 +++++ .../lit-contracts/Resolver.sol/Resolver.ts | 1002 +++++++ .../Resolver.sol/ResolverContract.js | 8 + .../Resolver.sol/ResolverContract.mjs | 8 + .../Resolver.sol/ResolverContract.ts | 11 + .../Resolver.sol/ResolverData.js | 596 +++++ .../Resolver.sol/ResolverData.mjs | 596 +++++ .../Resolver.sol/ResolverData.ts | 596 +++++ .../lit-contracts/Resolver.sol/common.ts | 44 + .../factories/Resolver__factory.ts | 612 +++++ .../Resolver.sol/factories/index.ts | 4 + .../lit-contracts/Resolver.sol/index.js | 2 + .../lit-contracts/Resolver.sol/index.mjs | 2 + .../lit-contracts/Resolver.sol/index.ts | 3 + .../lit-contracts/Staking.sol/Staking.json | 1672 ++++++++++++ .../lit-contracts/Staking.sol/Staking.ts | 2347 +++++++++++++++++ .../Staking.sol/StakingContract.js | 8 + .../Staking.sol/StakingContract.mjs | 8 + .../Staking.sol/StakingContract.ts | 11 + .../lit-contracts/Staking.sol/StakingData.js | 1672 ++++++++++++ .../lit-contracts/Staking.sol/StakingData.mjs | 1672 ++++++++++++ .../lit-contracts/Staking.sol/StakingData.ts | 1672 ++++++++++++ .../lit-contracts/Staking.sol/common.ts | 44 + .../Staking.sol/factories/Staking__factory.ts | 1688 ++++++++++++ .../Staking.sol/factories/index.ts | 4 + .../lit-contracts/Staking.sol/index.js | 2 + .../lit-contracts/Staking.sol/index.mjs | 2 + .../lit-contracts/Staking.sol/index.ts | 3 + tools/scripts/lit-contracts/types.ts | 12 + tools/scripts/types.ts | 12 + yarn.lock | 139 +- 174 files changed, 58568 insertions(+), 7 deletions(-) create mode 100755 bun.lockb create mode 100644 tools/scripts/lit-contracts/Allowlist.sol/Allowlist.json create mode 100644 tools/scripts/lit-contracts/Allowlist.sol/Allowlist.ts create mode 100644 tools/scripts/lit-contracts/Allowlist.sol/AllowlistContract.js create mode 100644 tools/scripts/lit-contracts/Allowlist.sol/AllowlistContract.mjs create mode 100644 tools/scripts/lit-contracts/Allowlist.sol/AllowlistContract.ts create mode 100644 tools/scripts/lit-contracts/Allowlist.sol/AllowlistData.js create mode 100644 tools/scripts/lit-contracts/Allowlist.sol/AllowlistData.mjs create mode 100644 tools/scripts/lit-contracts/Allowlist.sol/AllowlistData.ts create mode 100644 tools/scripts/lit-contracts/Allowlist.sol/common.ts create mode 100644 tools/scripts/lit-contracts/Allowlist.sol/factories/Allowlist__factory.ts create mode 100644 tools/scripts/lit-contracts/Allowlist.sol/factories/index.ts create mode 100644 tools/scripts/lit-contracts/Allowlist.sol/index.js create mode 100644 tools/scripts/lit-contracts/Allowlist.sol/index.mjs create mode 100644 tools/scripts/lit-contracts/Allowlist.sol/index.ts create mode 100644 tools/scripts/lit-contracts/DomainWaleltRegistry.sol/DomainWaleltRegistry.json create mode 100644 tools/scripts/lit-contracts/DomainWaleltRegistry.sol/DomainWaleltRegistry.ts create mode 100644 tools/scripts/lit-contracts/DomainWaleltRegistry.sol/DomainWaleltRegistryContract.js create mode 100644 tools/scripts/lit-contracts/DomainWaleltRegistry.sol/DomainWaleltRegistryContract.mjs create mode 100644 tools/scripts/lit-contracts/DomainWaleltRegistry.sol/DomainWaleltRegistryContract.ts create mode 100644 tools/scripts/lit-contracts/DomainWaleltRegistry.sol/DomainWaleltRegistryData.js create mode 100644 tools/scripts/lit-contracts/DomainWaleltRegistry.sol/DomainWaleltRegistryData.mjs create mode 100644 tools/scripts/lit-contracts/DomainWaleltRegistry.sol/DomainWaleltRegistryData.ts create mode 100644 tools/scripts/lit-contracts/DomainWaleltRegistry.sol/common.ts create mode 100644 tools/scripts/lit-contracts/DomainWaleltRegistry.sol/factories/DomainWaleltRegistry__factory.ts create mode 100644 tools/scripts/lit-contracts/DomainWaleltRegistry.sol/factories/index.ts create mode 100644 tools/scripts/lit-contracts/DomainWaleltRegistry.sol/index.js create mode 100644 tools/scripts/lit-contracts/DomainWaleltRegistry.sol/index.mjs create mode 100644 tools/scripts/lit-contracts/DomainWaleltRegistry.sol/index.ts create mode 100644 tools/scripts/lit-contracts/DomainWalletOracle.sol/DomainWalletOracle.json create mode 100644 tools/scripts/lit-contracts/DomainWalletOracle.sol/DomainWalletOracle.ts create mode 100644 tools/scripts/lit-contracts/DomainWalletOracle.sol/DomainWalletOracleContract.js create mode 100644 tools/scripts/lit-contracts/DomainWalletOracle.sol/DomainWalletOracleContract.mjs create mode 100644 tools/scripts/lit-contracts/DomainWalletOracle.sol/DomainWalletOracleContract.ts create mode 100644 tools/scripts/lit-contracts/DomainWalletOracle.sol/DomainWalletOracleData.js create mode 100644 tools/scripts/lit-contracts/DomainWalletOracle.sol/DomainWalletOracleData.mjs create mode 100644 tools/scripts/lit-contracts/DomainWalletOracle.sol/DomainWalletOracleData.ts create mode 100644 tools/scripts/lit-contracts/DomainWalletOracle.sol/common.ts create mode 100644 tools/scripts/lit-contracts/DomainWalletOracle.sol/factories/DomainWalletOracle__factory.ts create mode 100644 tools/scripts/lit-contracts/DomainWalletOracle.sol/factories/index.ts create mode 100644 tools/scripts/lit-contracts/DomainWalletOracle.sol/index.js create mode 100644 tools/scripts/lit-contracts/DomainWalletOracle.sol/index.mjs create mode 100644 tools/scripts/lit-contracts/DomainWalletOracle.sol/index.ts create mode 100644 tools/scripts/lit-contracts/LITToken.sol/LITToken.json create mode 100644 tools/scripts/lit-contracts/LITToken.sol/LITToken.ts create mode 100644 tools/scripts/lit-contracts/LITToken.sol/LITTokenContract.js create mode 100644 tools/scripts/lit-contracts/LITToken.sol/LITTokenContract.mjs create mode 100644 tools/scripts/lit-contracts/LITToken.sol/LITTokenContract.ts create mode 100644 tools/scripts/lit-contracts/LITToken.sol/LITTokenData.js create mode 100644 tools/scripts/lit-contracts/LITToken.sol/LITTokenData.mjs create mode 100644 tools/scripts/lit-contracts/LITToken.sol/LITTokenData.ts create mode 100644 tools/scripts/lit-contracts/LITToken.sol/common.ts create mode 100644 tools/scripts/lit-contracts/LITToken.sol/factories/LITToken__factory.ts create mode 100644 tools/scripts/lit-contracts/LITToken.sol/factories/index.ts create mode 100644 tools/scripts/lit-contracts/LITToken.sol/index.js create mode 100644 tools/scripts/lit-contracts/LITToken.sol/index.mjs create mode 100644 tools/scripts/lit-contracts/LITToken.sol/index.ts create mode 100644 tools/scripts/lit-contracts/Multisender.sol/Multisender.json create mode 100644 tools/scripts/lit-contracts/Multisender.sol/Multisender.ts create mode 100644 tools/scripts/lit-contracts/Multisender.sol/MultisenderContract.js create mode 100644 tools/scripts/lit-contracts/Multisender.sol/MultisenderContract.mjs create mode 100644 tools/scripts/lit-contracts/Multisender.sol/MultisenderContract.ts create mode 100644 tools/scripts/lit-contracts/Multisender.sol/MultisenderData.js create mode 100644 tools/scripts/lit-contracts/Multisender.sol/MultisenderData.mjs create mode 100644 tools/scripts/lit-contracts/Multisender.sol/MultisenderData.ts create mode 100644 tools/scripts/lit-contracts/Multisender.sol/common.ts create mode 100644 tools/scripts/lit-contracts/Multisender.sol/factories/Multisender__factory.ts create mode 100644 tools/scripts/lit-contracts/Multisender.sol/factories/index.ts create mode 100644 tools/scripts/lit-contracts/Multisender.sol/index.js create mode 100644 tools/scripts/lit-contracts/Multisender.sol/index.mjs create mode 100644 tools/scripts/lit-contracts/Multisender.sol/index.ts create mode 100644 tools/scripts/lit-contracts/PKPHelper.sol/PKPHelper.json create mode 100644 tools/scripts/lit-contracts/PKPHelper.sol/PKPHelper.ts create mode 100644 tools/scripts/lit-contracts/PKPHelper.sol/PKPHelperContract.js create mode 100644 tools/scripts/lit-contracts/PKPHelper.sol/PKPHelperContract.mjs create mode 100644 tools/scripts/lit-contracts/PKPHelper.sol/PKPHelperContract.ts create mode 100644 tools/scripts/lit-contracts/PKPHelper.sol/PKPHelperData.js create mode 100644 tools/scripts/lit-contracts/PKPHelper.sol/PKPHelperData.mjs create mode 100644 tools/scripts/lit-contracts/PKPHelper.sol/PKPHelperData.ts create mode 100644 tools/scripts/lit-contracts/PKPHelper.sol/common.ts create mode 100644 tools/scripts/lit-contracts/PKPHelper.sol/factories/PKPHelper__factory.ts create mode 100644 tools/scripts/lit-contracts/PKPHelper.sol/factories/index.ts create mode 100644 tools/scripts/lit-contracts/PKPHelper.sol/index.js create mode 100644 tools/scripts/lit-contracts/PKPHelper.sol/index.mjs create mode 100644 tools/scripts/lit-contracts/PKPHelper.sol/index.ts create mode 100644 tools/scripts/lit-contracts/PKPNFT.sol/PKPNFT.json create mode 100644 tools/scripts/lit-contracts/PKPNFT.sol/PKPNFT.ts create mode 100644 tools/scripts/lit-contracts/PKPNFT.sol/PKPNFTContract.js create mode 100644 tools/scripts/lit-contracts/PKPNFT.sol/PKPNFTContract.mjs create mode 100644 tools/scripts/lit-contracts/PKPNFT.sol/PKPNFTContract.ts create mode 100644 tools/scripts/lit-contracts/PKPNFT.sol/PKPNFTData.js create mode 100644 tools/scripts/lit-contracts/PKPNFT.sol/PKPNFTData.mjs create mode 100644 tools/scripts/lit-contracts/PKPNFT.sol/PKPNFTData.ts create mode 100644 tools/scripts/lit-contracts/PKPNFT.sol/common.ts create mode 100644 tools/scripts/lit-contracts/PKPNFT.sol/factories/PKPNFT__factory.ts create mode 100644 tools/scripts/lit-contracts/PKPNFT.sol/factories/index.ts create mode 100644 tools/scripts/lit-contracts/PKPNFT.sol/index.js create mode 100644 tools/scripts/lit-contracts/PKPNFT.sol/index.mjs create mode 100644 tools/scripts/lit-contracts/PKPNFT.sol/index.ts create mode 100644 tools/scripts/lit-contracts/PKPPermissions.sol/PKPPermissions.json create mode 100644 tools/scripts/lit-contracts/PKPPermissions.sol/PKPPermissions.ts create mode 100644 tools/scripts/lit-contracts/PKPPermissions.sol/PKPPermissionsContract.js create mode 100644 tools/scripts/lit-contracts/PKPPermissions.sol/PKPPermissionsContract.mjs create mode 100644 tools/scripts/lit-contracts/PKPPermissions.sol/PKPPermissionsContract.ts create mode 100644 tools/scripts/lit-contracts/PKPPermissions.sol/PKPPermissionsData.js create mode 100644 tools/scripts/lit-contracts/PKPPermissions.sol/PKPPermissionsData.mjs create mode 100644 tools/scripts/lit-contracts/PKPPermissions.sol/PKPPermissionsData.ts create mode 100644 tools/scripts/lit-contracts/PKPPermissions.sol/common.ts create mode 100644 tools/scripts/lit-contracts/PKPPermissions.sol/factories/PKPPermissions__factory.ts create mode 100644 tools/scripts/lit-contracts/PKPPermissions.sol/factories/index.ts create mode 100644 tools/scripts/lit-contracts/PKPPermissions.sol/index.js create mode 100644 tools/scripts/lit-contracts/PKPPermissions.sol/index.mjs create mode 100644 tools/scripts/lit-contracts/PKPPermissions.sol/index.ts create mode 100644 tools/scripts/lit-contracts/PubkeyRouter.sol/PubkeyRouter.json create mode 100644 tools/scripts/lit-contracts/PubkeyRouter.sol/PubkeyRouter.ts create mode 100644 tools/scripts/lit-contracts/PubkeyRouter.sol/PubkeyRouterContract.js create mode 100644 tools/scripts/lit-contracts/PubkeyRouter.sol/PubkeyRouterContract.mjs create mode 100644 tools/scripts/lit-contracts/PubkeyRouter.sol/PubkeyRouterContract.ts create mode 100644 tools/scripts/lit-contracts/PubkeyRouter.sol/PubkeyRouterData.js create mode 100644 tools/scripts/lit-contracts/PubkeyRouter.sol/PubkeyRouterData.mjs create mode 100644 tools/scripts/lit-contracts/PubkeyRouter.sol/PubkeyRouterData.ts create mode 100644 tools/scripts/lit-contracts/PubkeyRouter.sol/common.ts create mode 100644 tools/scripts/lit-contracts/PubkeyRouter.sol/factories/PubkeyRouter__factory.ts create mode 100644 tools/scripts/lit-contracts/PubkeyRouter.sol/factories/index.ts create mode 100644 tools/scripts/lit-contracts/PubkeyRouter.sol/index.js create mode 100644 tools/scripts/lit-contracts/PubkeyRouter.sol/index.mjs create mode 100644 tools/scripts/lit-contracts/PubkeyRouter.sol/index.ts create mode 100644 tools/scripts/lit-contracts/RateLimitNFT.sol/RateLimitNFT.json create mode 100644 tools/scripts/lit-contracts/RateLimitNFT.sol/RateLimitNFT.ts create mode 100644 tools/scripts/lit-contracts/RateLimitNFT.sol/RateLimitNFTContract.js create mode 100644 tools/scripts/lit-contracts/RateLimitNFT.sol/RateLimitNFTContract.mjs create mode 100644 tools/scripts/lit-contracts/RateLimitNFT.sol/RateLimitNFTContract.ts create mode 100644 tools/scripts/lit-contracts/RateLimitNFT.sol/RateLimitNFTData.js create mode 100644 tools/scripts/lit-contracts/RateLimitNFT.sol/RateLimitNFTData.mjs create mode 100644 tools/scripts/lit-contracts/RateLimitNFT.sol/RateLimitNFTData.ts create mode 100644 tools/scripts/lit-contracts/RateLimitNFT.sol/common.ts create mode 100644 tools/scripts/lit-contracts/RateLimitNFT.sol/factories/RateLimitNFT__factory.ts create mode 100644 tools/scripts/lit-contracts/RateLimitNFT.sol/factories/index.ts create mode 100644 tools/scripts/lit-contracts/RateLimitNFT.sol/index.js create mode 100644 tools/scripts/lit-contracts/RateLimitNFT.sol/index.mjs create mode 100644 tools/scripts/lit-contracts/RateLimitNFT.sol/index.ts create mode 100644 tools/scripts/lit-contracts/Resolver.sol/Resolver.json create mode 100644 tools/scripts/lit-contracts/Resolver.sol/Resolver.ts create mode 100644 tools/scripts/lit-contracts/Resolver.sol/ResolverContract.js create mode 100644 tools/scripts/lit-contracts/Resolver.sol/ResolverContract.mjs create mode 100644 tools/scripts/lit-contracts/Resolver.sol/ResolverContract.ts create mode 100644 tools/scripts/lit-contracts/Resolver.sol/ResolverData.js create mode 100644 tools/scripts/lit-contracts/Resolver.sol/ResolverData.mjs create mode 100644 tools/scripts/lit-contracts/Resolver.sol/ResolverData.ts create mode 100644 tools/scripts/lit-contracts/Resolver.sol/common.ts create mode 100644 tools/scripts/lit-contracts/Resolver.sol/factories/Resolver__factory.ts create mode 100644 tools/scripts/lit-contracts/Resolver.sol/factories/index.ts create mode 100644 tools/scripts/lit-contracts/Resolver.sol/index.js create mode 100644 tools/scripts/lit-contracts/Resolver.sol/index.mjs create mode 100644 tools/scripts/lit-contracts/Resolver.sol/index.ts create mode 100644 tools/scripts/lit-contracts/Staking.sol/Staking.json create mode 100644 tools/scripts/lit-contracts/Staking.sol/Staking.ts create mode 100644 tools/scripts/lit-contracts/Staking.sol/StakingContract.js create mode 100644 tools/scripts/lit-contracts/Staking.sol/StakingContract.mjs create mode 100644 tools/scripts/lit-contracts/Staking.sol/StakingContract.ts create mode 100644 tools/scripts/lit-contracts/Staking.sol/StakingData.js create mode 100644 tools/scripts/lit-contracts/Staking.sol/StakingData.mjs create mode 100644 tools/scripts/lit-contracts/Staking.sol/StakingData.ts create mode 100644 tools/scripts/lit-contracts/Staking.sol/common.ts create mode 100644 tools/scripts/lit-contracts/Staking.sol/factories/Staking__factory.ts create mode 100644 tools/scripts/lit-contracts/Staking.sol/factories/index.ts create mode 100644 tools/scripts/lit-contracts/Staking.sol/index.js create mode 100644 tools/scripts/lit-contracts/Staking.sol/index.mjs create mode 100644 tools/scripts/lit-contracts/Staking.sol/index.ts create mode 100644 tools/scripts/lit-contracts/types.ts create mode 100644 tools/scripts/types.ts diff --git a/apps/html/index.html b/apps/html/index.html index 9af1da7fd1..b99eea0d55 100644 --- a/apps/html/index.html +++ b/apps/html/index.html @@ -1,4 +1,4 @@ - + @@ -62,7 +62,7 @@ - (HTML) THIS FILE IS AUTOMATICALLY GENERATED FROM tools/scripts/gen-html.mjs Wed, 13 Sep 2023 02:51:35 GMT + (HTML) THIS FILE IS AUTOMATICALLY GENERATED FROM tools/scripts/gen-html.mjs Wed, 13 Sep 2023 15:40:07 GMT diff --git a/apps/react/src/app/app.tsx b/apps/react/src/app/app.tsx index 10041e018d..031fb3118e 100644 --- a/apps/react/src/app/app.tsx +++ b/apps/react/src/app/app.tsx @@ -1802,7 +1802,7 @@ pre { `, }} /> - (REACT) THIS FILE IS AUTOMATICALLY GENERATED FROM tools/scripts/gen-react.mjs Wed, 13 Sep 2023 02:51:36 GMT + (REACT) THIS FILE IS AUTOMATICALLY GENERATED FROM tools/scripts/gen-react.mjs Wed, 13 Sep 2023 15:40:07 GMT
diff --git a/bun.lockb b/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..14e1d3fced65ca8bc8e9a67f93658c03fda2914b GIT binary patch literal 1438025 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

&7B+#ra?(#U{#N+wxG{zYtT@I7PF?XRTEI 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

`3KG}oOM>%I&>6~b65}pn7 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

E*R4^!G`g}ca15U9 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

hZLEpHv!HmBi~2k(#OPESQhvLr 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

ZOX_rQ4Yn3T$vOm!fo5KACt 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 Sl;T$3b~to9{n!7~|Na;EjJUY~ literal 0 HcmV?d00001 diff --git a/tools/scripts/lit-contracts/Allowlist.sol/Allowlist.json b/tools/scripts/lit-contracts/Allowlist.sol/Allowlist.json new file mode 100644 index 0000000000..5878624222 --- /dev/null +++ b/tools/scripts/lit-contracts/Allowlist.sol/Allowlist.json @@ -0,0 +1,232 @@ +{ + "date": "2023-09-10T22:33:10.000Z", + "address": "0x01385531dF2397425acb2Dffd3fA5Fd76729504a", + "contractName": "Allowlist", + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "AdminAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "AdminRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "key", + "type": "bytes32" + } + ], + "name": "ItemAllowed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "key", + "type": "bytes32" + } + ], + "name": "ItemNotAllowed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "addAdmin", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "allowAll", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "allowedItems", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "key", + "type": "bytes32" + } + ], + "name": "isAllowed", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "removeAdmin", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bool", + "name": "_allowAll", + "type": "bool" + } + ], + "name": "setAllowAll", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "key", + "type": "bytes32" + } + ], + "name": "setAllowed", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "key", + "type": "bytes32" + } + ], + "name": "setNotAllowed", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ] +} \ No newline at end of file diff --git a/tools/scripts/lit-contracts/Allowlist.sol/Allowlist.ts b/tools/scripts/lit-contracts/Allowlist.sol/Allowlist.ts new file mode 100644 index 0000000000..10e5d1d4af --- /dev/null +++ b/tools/scripts/lit-contracts/Allowlist.sol/Allowlist.ts @@ -0,0 +1,442 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumber, + BytesLike, + CallOverrides, + ContractTransaction, + Overrides, + PopulatedTransaction, + Signer, + utils, +} from "ethers"; +import type { + FunctionFragment, + Result, + EventFragment, +} from "@ethersproject/abi"; +import type { Listener, Provider } from "@ethersproject/providers"; +import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, +} from "./common"; + +export interface AllowlistInterface extends utils.Interface { + functions: { + "addAdmin(address)": FunctionFragment; + "allowAll()": FunctionFragment; + "allowedItems(bytes32)": FunctionFragment; + "isAllowed(bytes32)": FunctionFragment; + "owner()": FunctionFragment; + "removeAdmin(address)": FunctionFragment; + "renounceOwnership()": FunctionFragment; + "setAllowAll(bool)": FunctionFragment; + "setAllowed(bytes32)": FunctionFragment; + "setNotAllowed(bytes32)": FunctionFragment; + "transferOwnership(address)": FunctionFragment; + }; + + getFunction( + nameOrSignatureOrTopic: + | "addAdmin" + | "allowAll" + | "allowedItems" + | "isAllowed" + | "owner" + | "removeAdmin" + | "renounceOwnership" + | "setAllowAll" + | "setAllowed" + | "setNotAllowed" + | "transferOwnership" + ): FunctionFragment; + + encodeFunctionData(functionFragment: "addAdmin", values: [string]): string; + encodeFunctionData(functionFragment: "allowAll", values?: undefined): string; + encodeFunctionData( + functionFragment: "allowedItems", + values: [BytesLike] + ): string; + encodeFunctionData( + functionFragment: "isAllowed", + values: [BytesLike] + ): string; + encodeFunctionData(functionFragment: "owner", values?: undefined): string; + encodeFunctionData(functionFragment: "removeAdmin", values: [string]): string; + encodeFunctionData( + functionFragment: "renounceOwnership", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "setAllowAll", + values: [boolean] + ): string; + encodeFunctionData( + functionFragment: "setAllowed", + values: [BytesLike] + ): string; + encodeFunctionData( + functionFragment: "setNotAllowed", + values: [BytesLike] + ): string; + encodeFunctionData( + functionFragment: "transferOwnership", + values: [string] + ): string; + + decodeFunctionResult(functionFragment: "addAdmin", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "allowAll", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "allowedItems", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "isAllowed", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "owner", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "removeAdmin", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "renounceOwnership", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setAllowAll", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "setAllowed", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "setNotAllowed", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "transferOwnership", + data: BytesLike + ): Result; + + events: { + "AdminAdded(address)": EventFragment; + "AdminRemoved(address)": EventFragment; + "ItemAllowed(bytes32)": EventFragment; + "ItemNotAllowed(bytes32)": EventFragment; + "OwnershipTransferred(address,address)": EventFragment; + }; + + getEvent(nameOrSignatureOrTopic: "AdminAdded"): EventFragment; + getEvent(nameOrSignatureOrTopic: "AdminRemoved"): EventFragment; + getEvent(nameOrSignatureOrTopic: "ItemAllowed"): EventFragment; + getEvent(nameOrSignatureOrTopic: "ItemNotAllowed"): EventFragment; + getEvent(nameOrSignatureOrTopic: "OwnershipTransferred"): EventFragment; +} + +export interface AdminAddedEventObject { + newAdmin: string; +} +export type AdminAddedEvent = TypedEvent<[string], AdminAddedEventObject>; + +export type AdminAddedEventFilter = TypedEventFilter; + +export interface AdminRemovedEventObject { + newAdmin: string; +} +export type AdminRemovedEvent = TypedEvent<[string], AdminRemovedEventObject>; + +export type AdminRemovedEventFilter = TypedEventFilter; + +export interface ItemAllowedEventObject { + key: string; +} +export type ItemAllowedEvent = TypedEvent<[string], ItemAllowedEventObject>; + +export type ItemAllowedEventFilter = TypedEventFilter; + +export interface ItemNotAllowedEventObject { + key: string; +} +export type ItemNotAllowedEvent = TypedEvent< + [string], + ItemNotAllowedEventObject +>; + +export type ItemNotAllowedEventFilter = TypedEventFilter; + +export interface OwnershipTransferredEventObject { + previousOwner: string; + newOwner: string; +} +export type OwnershipTransferredEvent = TypedEvent< + [string, string], + OwnershipTransferredEventObject +>; + +export type OwnershipTransferredEventFilter = + TypedEventFilter; + +export interface Allowlist extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: AllowlistInterface; + + queryFilter( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>; + + listeners( + eventFilter?: TypedEventFilter + ): Array>; + listeners(eventName?: string): Array; + removeAllListeners( + eventFilter: TypedEventFilter + ): this; + removeAllListeners(eventName?: string): this; + off: OnEvent; + on: OnEvent; + once: OnEvent; + removeListener: OnEvent; + + functions: { + addAdmin( + newAdmin: string, + overrides?: Overrides & { from?: string } + ): Promise; + + allowAll(overrides?: CallOverrides): Promise<[boolean]>; + + allowedItems( + arg0: BytesLike, + overrides?: CallOverrides + ): Promise<[boolean]>; + + isAllowed(key: BytesLike, overrides?: CallOverrides): Promise<[boolean]>; + + owner(overrides?: CallOverrides): Promise<[string]>; + + removeAdmin( + newAdmin: string, + overrides?: Overrides & { from?: string } + ): Promise; + + renounceOwnership( + overrides?: Overrides & { from?: string } + ): Promise; + + setAllowAll( + _allowAll: boolean, + overrides?: Overrides & { from?: string } + ): Promise; + + setAllowed( + key: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + + setNotAllowed( + key: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + + transferOwnership( + newOwner: string, + overrides?: Overrides & { from?: string } + ): Promise; + }; + + addAdmin( + newAdmin: string, + overrides?: Overrides & { from?: string } + ): Promise; + + allowAll(overrides?: CallOverrides): Promise; + + allowedItems(arg0: BytesLike, overrides?: CallOverrides): Promise; + + isAllowed(key: BytesLike, overrides?: CallOverrides): Promise; + + owner(overrides?: CallOverrides): Promise; + + removeAdmin( + newAdmin: string, + overrides?: Overrides & { from?: string } + ): Promise; + + renounceOwnership( + overrides?: Overrides & { from?: string } + ): Promise; + + setAllowAll( + _allowAll: boolean, + overrides?: Overrides & { from?: string } + ): Promise; + + setAllowed( + key: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + + setNotAllowed( + key: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + + transferOwnership( + newOwner: string, + overrides?: Overrides & { from?: string } + ): Promise; + + callStatic: { + addAdmin(newAdmin: string, overrides?: CallOverrides): Promise; + + allowAll(overrides?: CallOverrides): Promise; + + allowedItems(arg0: BytesLike, overrides?: CallOverrides): Promise; + + isAllowed(key: BytesLike, overrides?: CallOverrides): Promise; + + owner(overrides?: CallOverrides): Promise; + + removeAdmin(newAdmin: string, overrides?: CallOverrides): Promise; + + renounceOwnership(overrides?: CallOverrides): Promise; + + setAllowAll(_allowAll: boolean, overrides?: CallOverrides): Promise; + + setAllowed(key: BytesLike, overrides?: CallOverrides): Promise; + + setNotAllowed(key: BytesLike, overrides?: CallOverrides): Promise; + + transferOwnership( + newOwner: string, + overrides?: CallOverrides + ): Promise; + }; + + filters: { + "AdminAdded(address)"(newAdmin?: string | null): AdminAddedEventFilter; + AdminAdded(newAdmin?: string | null): AdminAddedEventFilter; + + "AdminRemoved(address)"(newAdmin?: string | null): AdminRemovedEventFilter; + AdminRemoved(newAdmin?: string | null): AdminRemovedEventFilter; + + "ItemAllowed(bytes32)"(key?: BytesLike | null): ItemAllowedEventFilter; + ItemAllowed(key?: BytesLike | null): ItemAllowedEventFilter; + + "ItemNotAllowed(bytes32)"( + key?: BytesLike | null + ): ItemNotAllowedEventFilter; + ItemNotAllowed(key?: BytesLike | null): ItemNotAllowedEventFilter; + + "OwnershipTransferred(address,address)"( + previousOwner?: string | null, + newOwner?: string | null + ): OwnershipTransferredEventFilter; + OwnershipTransferred( + previousOwner?: string | null, + newOwner?: string | null + ): OwnershipTransferredEventFilter; + }; + + estimateGas: { + addAdmin( + newAdmin: string, + overrides?: Overrides & { from?: string } + ): Promise; + + allowAll(overrides?: CallOverrides): Promise; + + allowedItems( + arg0: BytesLike, + overrides?: CallOverrides + ): Promise; + + isAllowed(key: BytesLike, overrides?: CallOverrides): Promise; + + owner(overrides?: CallOverrides): Promise; + + removeAdmin( + newAdmin: string, + overrides?: Overrides & { from?: string } + ): Promise; + + renounceOwnership( + overrides?: Overrides & { from?: string } + ): Promise; + + setAllowAll( + _allowAll: boolean, + overrides?: Overrides & { from?: string } + ): Promise; + + setAllowed( + key: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + + setNotAllowed( + key: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + + transferOwnership( + newOwner: string, + overrides?: Overrides & { from?: string } + ): Promise; + }; + + populateTransaction: { + addAdmin( + newAdmin: string, + overrides?: Overrides & { from?: string } + ): Promise; + + allowAll(overrides?: CallOverrides): Promise; + + allowedItems( + arg0: BytesLike, + overrides?: CallOverrides + ): Promise; + + isAllowed( + key: BytesLike, + overrides?: CallOverrides + ): Promise; + + owner(overrides?: CallOverrides): Promise; + + removeAdmin( + newAdmin: string, + overrides?: Overrides & { from?: string } + ): Promise; + + renounceOwnership( + overrides?: Overrides & { from?: string } + ): Promise; + + setAllowAll( + _allowAll: boolean, + overrides?: Overrides & { from?: string } + ): Promise; + + setAllowed( + key: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + + setNotAllowed( + key: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + + transferOwnership( + newOwner: string, + overrides?: Overrides & { from?: string } + ): Promise; + }; +} diff --git a/tools/scripts/lit-contracts/Allowlist.sol/AllowlistContract.js b/tools/scripts/lit-contracts/Allowlist.sol/AllowlistContract.js new file mode 100644 index 0000000000..9329b0e195 --- /dev/null +++ b/tools/scripts/lit-contracts/Allowlist.sol/AllowlistContract.js @@ -0,0 +1,8 @@ +import { ethers } from "ethers"; +import { AllowlistData } from "./AllowlistData.js"; + +export const getAllowlistContract = (provider) => new ethers.Contract( + AllowlistData.address, + AllowlistData.abi, + provider +); \ No newline at end of file diff --git a/tools/scripts/lit-contracts/Allowlist.sol/AllowlistContract.mjs b/tools/scripts/lit-contracts/Allowlist.sol/AllowlistContract.mjs new file mode 100644 index 0000000000..cf5fef8f4d --- /dev/null +++ b/tools/scripts/lit-contracts/Allowlist.sol/AllowlistContract.mjs @@ -0,0 +1,8 @@ +import { ethers } from "ethers"; +import { AllowlistData } from "./AllowlistData.mjs"; + +export const getAllowlistContract = (provider) => new ethers.Contract( + AllowlistData.address, + AllowlistData.abi, + provider +); \ No newline at end of file diff --git a/tools/scripts/lit-contracts/Allowlist.sol/AllowlistContract.ts b/tools/scripts/lit-contracts/Allowlist.sol/AllowlistContract.ts new file mode 100644 index 0000000000..3be4e75ac4 --- /dev/null +++ b/tools/scripts/lit-contracts/Allowlist.sol/AllowlistContract.ts @@ -0,0 +1,11 @@ +import { ethers } from "ethers"; +import { AllowlistData } from "./AllowlistData"; +import { Allowlist } from "./Allowlist"; + +export const getAllowlistContract = (provider: any) => { + return new ethers.Contract( + AllowlistData.address, + AllowlistData.abi, + provider + ) as unknown as Allowlist; +} \ No newline at end of file diff --git a/tools/scripts/lit-contracts/Allowlist.sol/AllowlistData.js b/tools/scripts/lit-contracts/Allowlist.sol/AllowlistData.js new file mode 100644 index 0000000000..37a8872bc8 --- /dev/null +++ b/tools/scripts/lit-contracts/Allowlist.sol/AllowlistData.js @@ -0,0 +1,232 @@ +export const AllowlistData = { + "date": "2023-09-10T22:33:10.000Z", + "address": "0x01385531dF2397425acb2Dffd3fA5Fd76729504a", + "contractName": "Allowlist", + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "AdminAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "AdminRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "key", + "type": "bytes32" + } + ], + "name": "ItemAllowed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "key", + "type": "bytes32" + } + ], + "name": "ItemNotAllowed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "addAdmin", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "allowAll", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "allowedItems", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "key", + "type": "bytes32" + } + ], + "name": "isAllowed", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "removeAdmin", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bool", + "name": "_allowAll", + "type": "bool" + } + ], + "name": "setAllowAll", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "key", + "type": "bytes32" + } + ], + "name": "setAllowed", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "key", + "type": "bytes32" + } + ], + "name": "setNotAllowed", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ] +} \ No newline at end of file diff --git a/tools/scripts/lit-contracts/Allowlist.sol/AllowlistData.mjs b/tools/scripts/lit-contracts/Allowlist.sol/AllowlistData.mjs new file mode 100644 index 0000000000..37a8872bc8 --- /dev/null +++ b/tools/scripts/lit-contracts/Allowlist.sol/AllowlistData.mjs @@ -0,0 +1,232 @@ +export const AllowlistData = { + "date": "2023-09-10T22:33:10.000Z", + "address": "0x01385531dF2397425acb2Dffd3fA5Fd76729504a", + "contractName": "Allowlist", + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "AdminAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "AdminRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "key", + "type": "bytes32" + } + ], + "name": "ItemAllowed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "key", + "type": "bytes32" + } + ], + "name": "ItemNotAllowed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "addAdmin", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "allowAll", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "allowedItems", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "key", + "type": "bytes32" + } + ], + "name": "isAllowed", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "removeAdmin", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bool", + "name": "_allowAll", + "type": "bool" + } + ], + "name": "setAllowAll", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "key", + "type": "bytes32" + } + ], + "name": "setAllowed", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "key", + "type": "bytes32" + } + ], + "name": "setNotAllowed", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ] +} \ No newline at end of file diff --git a/tools/scripts/lit-contracts/Allowlist.sol/AllowlistData.ts b/tools/scripts/lit-contracts/Allowlist.sol/AllowlistData.ts new file mode 100644 index 0000000000..37a8872bc8 --- /dev/null +++ b/tools/scripts/lit-contracts/Allowlist.sol/AllowlistData.ts @@ -0,0 +1,232 @@ +export const AllowlistData = { + "date": "2023-09-10T22:33:10.000Z", + "address": "0x01385531dF2397425acb2Dffd3fA5Fd76729504a", + "contractName": "Allowlist", + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "AdminAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "AdminRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "key", + "type": "bytes32" + } + ], + "name": "ItemAllowed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "key", + "type": "bytes32" + } + ], + "name": "ItemNotAllowed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "addAdmin", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "allowAll", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "allowedItems", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "key", + "type": "bytes32" + } + ], + "name": "isAllowed", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "removeAdmin", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bool", + "name": "_allowAll", + "type": "bool" + } + ], + "name": "setAllowAll", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "key", + "type": "bytes32" + } + ], + "name": "setAllowed", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "key", + "type": "bytes32" + } + ], + "name": "setNotAllowed", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ] +} \ No newline at end of file diff --git a/tools/scripts/lit-contracts/Allowlist.sol/common.ts b/tools/scripts/lit-contracts/Allowlist.sol/common.ts new file mode 100644 index 0000000000..2fc40c7fb1 --- /dev/null +++ b/tools/scripts/lit-contracts/Allowlist.sol/common.ts @@ -0,0 +1,44 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { Listener } from "@ethersproject/providers"; +import type { Event, EventFilter } from "ethers"; + +export interface TypedEvent< + TArgsArray extends Array = any, + TArgsObject = any +> extends Event { + args: TArgsArray & TArgsObject; +} + +export interface TypedEventFilter<_TEvent extends TypedEvent> + extends EventFilter {} + +export interface TypedListener { + (...listenerArg: [...__TypechainArgsArray, TEvent]): void; +} + +type __TypechainArgsArray = T extends TypedEvent ? U : never; + +export interface OnEvent { + ( + eventFilter: TypedEventFilter, + listener: TypedListener + ): TRes; + (eventName: string, listener: Listener): TRes; +} + +export type MinEthersFactory = { + deploy(...a: ARGS[]): Promise; +}; + +export type GetContractTypeFromFactory = F extends MinEthersFactory< + infer C, + any +> + ? C + : never; + +export type GetARGsTypeFromFactory = F extends MinEthersFactory + ? Parameters + : never; diff --git a/tools/scripts/lit-contracts/Allowlist.sol/factories/Allowlist__factory.ts b/tools/scripts/lit-contracts/Allowlist.sol/factories/Allowlist__factory.ts new file mode 100644 index 0000000000..76032b4bf2 --- /dev/null +++ b/tools/scripts/lit-contracts/Allowlist.sol/factories/Allowlist__factory.ts @@ -0,0 +1,248 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Signer, utils } from "ethers"; +import type { Provider } from "@ethersproject/providers"; +import type { Allowlist, AllowlistInterface } from "../Allowlist"; + +const _abi = [ + { + inputs: [], + stateMutability: "nonpayable", + type: "constructor", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "newAdmin", + type: "address", + }, + ], + name: "AdminAdded", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "newAdmin", + type: "address", + }, + ], + name: "AdminRemoved", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "bytes32", + name: "key", + type: "bytes32", + }, + ], + name: "ItemAllowed", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "bytes32", + name: "key", + type: "bytes32", + }, + ], + name: "ItemNotAllowed", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "previousOwner", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "newOwner", + type: "address", + }, + ], + name: "OwnershipTransferred", + type: "event", + }, + { + inputs: [ + { + internalType: "address", + name: "newAdmin", + type: "address", + }, + ], + name: "addAdmin", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "allowAll", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + name: "allowedItems", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "key", + type: "bytes32", + }, + ], + name: "isAllowed", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "owner", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "newAdmin", + type: "address", + }, + ], + name: "removeAdmin", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "renounceOwnership", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "bool", + name: "_allowAll", + type: "bool", + }, + ], + name: "setAllowAll", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "key", + type: "bytes32", + }, + ], + name: "setAllowed", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "key", + type: "bytes32", + }, + ], + name: "setNotAllowed", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "newOwner", + type: "address", + }, + ], + name: "transferOwnership", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, +] as const; + +export class Allowlist__factory { + static readonly abi = _abi; + static createInterface(): AllowlistInterface { + return new utils.Interface(_abi) as AllowlistInterface; + } + static connect( + address: string, + signerOrProvider: Signer | Provider + ): Allowlist { + return new Contract(address, _abi, signerOrProvider) as Allowlist; + } +} diff --git a/tools/scripts/lit-contracts/Allowlist.sol/factories/index.ts b/tools/scripts/lit-contracts/Allowlist.sol/factories/index.ts new file mode 100644 index 0000000000..5f8c591301 --- /dev/null +++ b/tools/scripts/lit-contracts/Allowlist.sol/factories/index.ts @@ -0,0 +1,4 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export { Allowlist__factory } from "./Allowlist__factory"; diff --git a/tools/scripts/lit-contracts/Allowlist.sol/index.js b/tools/scripts/lit-contracts/Allowlist.sol/index.js new file mode 100644 index 0000000000..592531a5e6 --- /dev/null +++ b/tools/scripts/lit-contracts/Allowlist.sol/index.js @@ -0,0 +1,2 @@ +export * from "./AllowlistData.js"; +export * from "./AllowlistContract.js"; \ No newline at end of file diff --git a/tools/scripts/lit-contracts/Allowlist.sol/index.mjs b/tools/scripts/lit-contracts/Allowlist.sol/index.mjs new file mode 100644 index 0000000000..df4be03ecd --- /dev/null +++ b/tools/scripts/lit-contracts/Allowlist.sol/index.mjs @@ -0,0 +1,2 @@ +export * from "./AllowlistData.mjs"; +export * from "./AllowlistContract.mjs"; \ No newline at end of file diff --git a/tools/scripts/lit-contracts/Allowlist.sol/index.ts b/tools/scripts/lit-contracts/Allowlist.sol/index.ts new file mode 100644 index 0000000000..de80c77e9d --- /dev/null +++ b/tools/scripts/lit-contracts/Allowlist.sol/index.ts @@ -0,0 +1,3 @@ +export * from "./AllowlistData"; +export * from "./AllowlistContract"; +export * from "./Allowlist"; \ No newline at end of file diff --git a/tools/scripts/lit-contracts/DomainWaleltRegistry.sol/DomainWaleltRegistry.json b/tools/scripts/lit-contracts/DomainWaleltRegistry.sol/DomainWaleltRegistry.json new file mode 100644 index 0000000000..dc0c29b1fe --- /dev/null +++ b/tools/scripts/lit-contracts/DomainWaleltRegistry.sol/DomainWaleltRegistry.json @@ -0,0 +1,655 @@ +{ + "date": "2023-09-10T22:33:15.000Z", + "address": "0xD586F808878B624FaaC306A7b6A7383c324cb269", + "contractName": "DomainWaleltRegistry", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_resolver", + "type": "address" + }, + { + "internalType": "enum ContractResolver.Env", + "name": "_env", + "type": "uint8" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "metadataCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "validMetadataCount", + "type": "uint256" + } + ], + "name": "InvalidNftMetadataCollectionLength", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "adminAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "NonAdminCaller", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "inputs": [], + "name": "ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "contractResolver", + "outputs": [ + { + "internalType": "contract ContractResolver", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "env", + "outputs": [ + { + "internalType": "enum ContractResolver.Env", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "getDomainIdByTokenId", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "uri", + "type": "bytes" + } + ], + "name": "getDomainTokenIdByUri", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "getDomainUri", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "getExpiration", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "id", + "type": "uint64" + } + ], + "name": "getPkpTokenId", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "hasExpired", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "hasOwner", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "isOwner", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "isRouted", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "userId", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "uri", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "ttl", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + }, + { + "internalType": "string[]", + "name": "nftMetadata", + "type": "string[]" + } + ], + "name": "registerDomain", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "userId", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "uri", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "ttl", + "type": "uint256" + }, + { + "internalType": "uint256[]", + "name": "permittedAuthMethodTypes", + "type": "uint256[]" + }, + { + "internalType": "bytes[]", + "name": "permittedAuthMethodIds", + "type": "bytes[]" + }, + { + "internalType": "bytes[]", + "name": "permittedAuthMethodPubkeys", + "type": "bytes[]" + }, + { + "internalType": "uint256[][]", + "name": "permittedAuthMethodScopes", + "type": "uint256[][]" + }, + { + "internalType": "string[]", + "name": "nftMetadata", + "type": "string[]" + } + ], + "name": "registerDomainAndMintNext", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "id", + "type": "uint64" + }, + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "registerPKP", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "removeDomain", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "revokeDomain", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "adminAddress", + "type": "address" + } + ], + "name": "setAdmin", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + }, + { + "internalType": "string[]", + "name": "nftMetadata", + "type": "string[]" + } + ], + "name": "setPKPMetadata", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ] +} \ No newline at end of file diff --git a/tools/scripts/lit-contracts/DomainWaleltRegistry.sol/DomainWaleltRegistry.ts b/tools/scripts/lit-contracts/DomainWaleltRegistry.sol/DomainWaleltRegistry.ts new file mode 100644 index 0000000000..f427f03925 --- /dev/null +++ b/tools/scripts/lit-contracts/DomainWaleltRegistry.sol/DomainWaleltRegistry.ts @@ -0,0 +1,1054 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumber, + BigNumberish, + BytesLike, + CallOverrides, + ContractTransaction, + Overrides, + PayableOverrides, + PopulatedTransaction, + Signer, + utils, +} from "ethers"; +import type { + FunctionFragment, + Result, + EventFragment, +} from "@ethersproject/abi"; +import type { Listener, Provider } from "@ethersproject/providers"; +import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, +} from "./common"; + +export interface DomainWaleltRegistryInterface extends utils.Interface { + functions: { + "ADMIN_ROLE()": FunctionFragment; + "DEFAULT_ADMIN_ROLE()": FunctionFragment; + "contractResolver()": FunctionFragment; + "env()": FunctionFragment; + "getDomainIdByTokenId(uint256)": FunctionFragment; + "getDomainTokenIdByUri(bytes)": FunctionFragment; + "getDomainUri(uint256)": FunctionFragment; + "getExpiration(uint256)": FunctionFragment; + "getPkpTokenId(uint64)": FunctionFragment; + "getRoleAdmin(bytes32)": FunctionFragment; + "grantRole(bytes32,address)": FunctionFragment; + "hasExpired(uint256)": FunctionFragment; + "hasOwner(uint256)": FunctionFragment; + "hasRole(bytes32,address)": FunctionFragment; + "isOwner(uint256)": FunctionFragment; + "isRouted(uint256)": FunctionFragment; + "registerDomain(bytes,bytes,uint256,uint256,string[])": FunctionFragment; + "registerDomainAndMintNext(bytes,bytes,uint256,uint256[],bytes[],bytes[],uint256[][],string[])": FunctionFragment; + "registerPKP(uint64,uint256)": FunctionFragment; + "removeDomain(uint256)": FunctionFragment; + "renounceRole(bytes32,address)": FunctionFragment; + "revokeDomain(uint256)": FunctionFragment; + "revokeRole(bytes32,address)": FunctionFragment; + "setAdmin(address)": FunctionFragment; + "setPKPMetadata(uint256,string[])": FunctionFragment; + "supportsInterface(bytes4)": FunctionFragment; + }; + + getFunction( + nameOrSignatureOrTopic: + | "ADMIN_ROLE" + | "DEFAULT_ADMIN_ROLE" + | "contractResolver" + | "env" + | "getDomainIdByTokenId" + | "getDomainTokenIdByUri" + | "getDomainUri" + | "getExpiration" + | "getPkpTokenId" + | "getRoleAdmin" + | "grantRole" + | "hasExpired" + | "hasOwner" + | "hasRole" + | "isOwner" + | "isRouted" + | "registerDomain" + | "registerDomainAndMintNext" + | "registerPKP" + | "removeDomain" + | "renounceRole" + | "revokeDomain" + | "revokeRole" + | "setAdmin" + | "setPKPMetadata" + | "supportsInterface" + ): FunctionFragment; + + encodeFunctionData( + functionFragment: "ADMIN_ROLE", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "DEFAULT_ADMIN_ROLE", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "contractResolver", + values?: undefined + ): string; + encodeFunctionData(functionFragment: "env", values?: undefined): string; + encodeFunctionData( + functionFragment: "getDomainIdByTokenId", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "getDomainTokenIdByUri", + values: [BytesLike] + ): string; + encodeFunctionData( + functionFragment: "getDomainUri", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "getExpiration", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "getPkpTokenId", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "getRoleAdmin", + values: [BytesLike] + ): string; + encodeFunctionData( + functionFragment: "grantRole", + values: [BytesLike, string] + ): string; + encodeFunctionData( + functionFragment: "hasExpired", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "hasOwner", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "hasRole", + values: [BytesLike, string] + ): string; + encodeFunctionData( + functionFragment: "isOwner", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "isRouted", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "registerDomain", + values: [BytesLike, BytesLike, BigNumberish, BigNumberish, string[]] + ): string; + encodeFunctionData( + functionFragment: "registerDomainAndMintNext", + values: [ + BytesLike, + BytesLike, + BigNumberish, + BigNumberish[], + BytesLike[], + BytesLike[], + BigNumberish[][], + string[] + ] + ): string; + encodeFunctionData( + functionFragment: "registerPKP", + values: [BigNumberish, BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "removeDomain", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "renounceRole", + values: [BytesLike, string] + ): string; + encodeFunctionData( + functionFragment: "revokeDomain", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "revokeRole", + values: [BytesLike, string] + ): string; + encodeFunctionData(functionFragment: "setAdmin", values: [string]): string; + encodeFunctionData( + functionFragment: "setPKPMetadata", + values: [BigNumberish, string[]] + ): string; + encodeFunctionData( + functionFragment: "supportsInterface", + values: [BytesLike] + ): string; + + decodeFunctionResult(functionFragment: "ADMIN_ROLE", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "DEFAULT_ADMIN_ROLE", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "contractResolver", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "env", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "getDomainIdByTokenId", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getDomainTokenIdByUri", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getDomainUri", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getExpiration", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getPkpTokenId", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getRoleAdmin", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "grantRole", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "hasExpired", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "hasOwner", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "hasRole", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "isOwner", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "isRouted", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "registerDomain", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "registerDomainAndMintNext", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "registerPKP", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "removeDomain", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "renounceRole", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "revokeDomain", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "revokeRole", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "setAdmin", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "setPKPMetadata", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "supportsInterface", + data: BytesLike + ): Result; + + events: { + "RoleAdminChanged(bytes32,bytes32,bytes32)": EventFragment; + "RoleGranted(bytes32,address,address)": EventFragment; + "RoleRevoked(bytes32,address,address)": EventFragment; + }; + + getEvent(nameOrSignatureOrTopic: "RoleAdminChanged"): EventFragment; + getEvent(nameOrSignatureOrTopic: "RoleGranted"): EventFragment; + getEvent(nameOrSignatureOrTopic: "RoleRevoked"): EventFragment; +} + +export interface RoleAdminChangedEventObject { + role: string; + previousAdminRole: string; + newAdminRole: string; +} +export type RoleAdminChangedEvent = TypedEvent< + [string, string, string], + RoleAdminChangedEventObject +>; + +export type RoleAdminChangedEventFilter = + TypedEventFilter; + +export interface RoleGrantedEventObject { + role: string; + account: string; + sender: string; +} +export type RoleGrantedEvent = TypedEvent< + [string, string, string], + RoleGrantedEventObject +>; + +export type RoleGrantedEventFilter = TypedEventFilter; + +export interface RoleRevokedEventObject { + role: string; + account: string; + sender: string; +} +export type RoleRevokedEvent = TypedEvent< + [string, string, string], + RoleRevokedEventObject +>; + +export type RoleRevokedEventFilter = TypedEventFilter; + +export interface DomainWaleltRegistry extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: DomainWaleltRegistryInterface; + + queryFilter( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>; + + listeners( + eventFilter?: TypedEventFilter + ): Array>; + listeners(eventName?: string): Array; + removeAllListeners( + eventFilter: TypedEventFilter + ): this; + removeAllListeners(eventName?: string): this; + off: OnEvent; + on: OnEvent; + once: OnEvent; + removeListener: OnEvent; + + functions: { + ADMIN_ROLE(overrides?: CallOverrides): Promise<[string]>; + + DEFAULT_ADMIN_ROLE(overrides?: CallOverrides): Promise<[string]>; + + contractResolver(overrides?: CallOverrides): Promise<[string]>; + + env(overrides?: CallOverrides): Promise<[number]>; + + getDomainIdByTokenId( + pkpTokenId: BigNumberish, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + getDomainTokenIdByUri( + uri: BytesLike, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + getDomainUri( + pkpTokenId: BigNumberish, + overrides?: CallOverrides + ): Promise<[string]>; + + getExpiration( + pkpTokenId: BigNumberish, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + getPkpTokenId( + id: BigNumberish, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + getRoleAdmin(role: BytesLike, overrides?: CallOverrides): Promise<[string]>; + + grantRole( + role: BytesLike, + account: string, + overrides?: Overrides & { from?: string } + ): Promise; + + hasExpired( + pkpTokenId: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + hasOwner( + pkpTokenId: BigNumberish, + overrides?: CallOverrides + ): Promise<[boolean]>; + + hasRole( + role: BytesLike, + account: string, + overrides?: CallOverrides + ): Promise<[boolean]>; + + isOwner( + pkpTokenId: BigNumberish, + overrides?: CallOverrides + ): Promise<[boolean]>; + + isRouted( + pkpTokenId: BigNumberish, + overrides?: CallOverrides + ): Promise<[boolean]>; + + registerDomain( + userId: BytesLike, + uri: BytesLike, + ttl: BigNumberish, + pkpTokenId: BigNumberish, + nftMetadata: string[], + overrides?: Overrides & { from?: string } + ): Promise; + + registerDomainAndMintNext( + userId: BytesLike, + uri: BytesLike, + ttl: BigNumberish, + permittedAuthMethodTypes: BigNumberish[], + permittedAuthMethodIds: BytesLike[], + permittedAuthMethodPubkeys: BytesLike[], + permittedAuthMethodScopes: BigNumberish[][], + nftMetadata: string[], + overrides?: PayableOverrides & { from?: string } + ): Promise; + + registerPKP( + id: BigNumberish, + pkpTokenId: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + removeDomain( + pkpTokenId: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + renounceRole( + role: BytesLike, + account: string, + overrides?: Overrides & { from?: string } + ): Promise; + + revokeDomain( + pkpTokenId: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + revokeRole( + role: BytesLike, + account: string, + overrides?: Overrides & { from?: string } + ): Promise; + + setAdmin( + adminAddress: string, + overrides?: Overrides & { from?: string } + ): Promise; + + setPKPMetadata( + pkpTokenId: BigNumberish, + nftMetadata: string[], + overrides?: Overrides & { from?: string } + ): Promise; + + supportsInterface( + interfaceId: BytesLike, + overrides?: CallOverrides + ): Promise<[boolean]>; + }; + + ADMIN_ROLE(overrides?: CallOverrides): Promise; + + DEFAULT_ADMIN_ROLE(overrides?: CallOverrides): Promise; + + contractResolver(overrides?: CallOverrides): Promise; + + env(overrides?: CallOverrides): Promise; + + getDomainIdByTokenId( + pkpTokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getDomainTokenIdByUri( + uri: BytesLike, + overrides?: CallOverrides + ): Promise; + + getDomainUri( + pkpTokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getExpiration( + pkpTokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getPkpTokenId( + id: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getRoleAdmin(role: BytesLike, overrides?: CallOverrides): Promise; + + grantRole( + role: BytesLike, + account: string, + overrides?: Overrides & { from?: string } + ): Promise; + + hasExpired( + pkpTokenId: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + hasOwner( + pkpTokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + hasRole( + role: BytesLike, + account: string, + overrides?: CallOverrides + ): Promise; + + isOwner( + pkpTokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + isRouted( + pkpTokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + registerDomain( + userId: BytesLike, + uri: BytesLike, + ttl: BigNumberish, + pkpTokenId: BigNumberish, + nftMetadata: string[], + overrides?: Overrides & { from?: string } + ): Promise; + + registerDomainAndMintNext( + userId: BytesLike, + uri: BytesLike, + ttl: BigNumberish, + permittedAuthMethodTypes: BigNumberish[], + permittedAuthMethodIds: BytesLike[], + permittedAuthMethodPubkeys: BytesLike[], + permittedAuthMethodScopes: BigNumberish[][], + nftMetadata: string[], + overrides?: PayableOverrides & { from?: string } + ): Promise; + + registerPKP( + id: BigNumberish, + pkpTokenId: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + removeDomain( + pkpTokenId: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + renounceRole( + role: BytesLike, + account: string, + overrides?: Overrides & { from?: string } + ): Promise; + + revokeDomain( + pkpTokenId: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + revokeRole( + role: BytesLike, + account: string, + overrides?: Overrides & { from?: string } + ): Promise; + + setAdmin( + adminAddress: string, + overrides?: Overrides & { from?: string } + ): Promise; + + setPKPMetadata( + pkpTokenId: BigNumberish, + nftMetadata: string[], + overrides?: Overrides & { from?: string } + ): Promise; + + supportsInterface( + interfaceId: BytesLike, + overrides?: CallOverrides + ): Promise; + + callStatic: { + ADMIN_ROLE(overrides?: CallOverrides): Promise; + + DEFAULT_ADMIN_ROLE(overrides?: CallOverrides): Promise; + + contractResolver(overrides?: CallOverrides): Promise; + + env(overrides?: CallOverrides): Promise; + + getDomainIdByTokenId( + pkpTokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getDomainTokenIdByUri( + uri: BytesLike, + overrides?: CallOverrides + ): Promise; + + getDomainUri( + pkpTokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getExpiration( + pkpTokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getPkpTokenId( + id: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getRoleAdmin(role: BytesLike, overrides?: CallOverrides): Promise; + + grantRole( + role: BytesLike, + account: string, + overrides?: CallOverrides + ): Promise; + + hasExpired( + pkpTokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + hasOwner( + pkpTokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + hasRole( + role: BytesLike, + account: string, + overrides?: CallOverrides + ): Promise; + + isOwner( + pkpTokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + isRouted( + pkpTokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + registerDomain( + userId: BytesLike, + uri: BytesLike, + ttl: BigNumberish, + pkpTokenId: BigNumberish, + nftMetadata: string[], + overrides?: CallOverrides + ): Promise; + + registerDomainAndMintNext( + userId: BytesLike, + uri: BytesLike, + ttl: BigNumberish, + permittedAuthMethodTypes: BigNumberish[], + permittedAuthMethodIds: BytesLike[], + permittedAuthMethodPubkeys: BytesLike[], + permittedAuthMethodScopes: BigNumberish[][], + nftMetadata: string[], + overrides?: CallOverrides + ): Promise; + + registerPKP( + id: BigNumberish, + pkpTokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + removeDomain( + pkpTokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + renounceRole( + role: BytesLike, + account: string, + overrides?: CallOverrides + ): Promise; + + revokeDomain( + pkpTokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + revokeRole( + role: BytesLike, + account: string, + overrides?: CallOverrides + ): Promise; + + setAdmin(adminAddress: string, overrides?: CallOverrides): Promise; + + setPKPMetadata( + pkpTokenId: BigNumberish, + nftMetadata: string[], + overrides?: CallOverrides + ): Promise; + + supportsInterface( + interfaceId: BytesLike, + overrides?: CallOverrides + ): Promise; + }; + + filters: { + "RoleAdminChanged(bytes32,bytes32,bytes32)"( + role?: BytesLike | null, + previousAdminRole?: BytesLike | null, + newAdminRole?: BytesLike | null + ): RoleAdminChangedEventFilter; + RoleAdminChanged( + role?: BytesLike | null, + previousAdminRole?: BytesLike | null, + newAdminRole?: BytesLike | null + ): RoleAdminChangedEventFilter; + + "RoleGranted(bytes32,address,address)"( + role?: BytesLike | null, + account?: string | null, + sender?: string | null + ): RoleGrantedEventFilter; + RoleGranted( + role?: BytesLike | null, + account?: string | null, + sender?: string | null + ): RoleGrantedEventFilter; + + "RoleRevoked(bytes32,address,address)"( + role?: BytesLike | null, + account?: string | null, + sender?: string | null + ): RoleRevokedEventFilter; + RoleRevoked( + role?: BytesLike | null, + account?: string | null, + sender?: string | null + ): RoleRevokedEventFilter; + }; + + estimateGas: { + ADMIN_ROLE(overrides?: CallOverrides): Promise; + + DEFAULT_ADMIN_ROLE(overrides?: CallOverrides): Promise; + + contractResolver(overrides?: CallOverrides): Promise; + + env(overrides?: CallOverrides): Promise; + + getDomainIdByTokenId( + pkpTokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getDomainTokenIdByUri( + uri: BytesLike, + overrides?: CallOverrides + ): Promise; + + getDomainUri( + pkpTokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getExpiration( + pkpTokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getPkpTokenId( + id: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getRoleAdmin( + role: BytesLike, + overrides?: CallOverrides + ): Promise; + + grantRole( + role: BytesLike, + account: string, + overrides?: Overrides & { from?: string } + ): Promise; + + hasExpired( + pkpTokenId: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + hasOwner( + pkpTokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + hasRole( + role: BytesLike, + account: string, + overrides?: CallOverrides + ): Promise; + + isOwner( + pkpTokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + isRouted( + pkpTokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + registerDomain( + userId: BytesLike, + uri: BytesLike, + ttl: BigNumberish, + pkpTokenId: BigNumberish, + nftMetadata: string[], + overrides?: Overrides & { from?: string } + ): Promise; + + registerDomainAndMintNext( + userId: BytesLike, + uri: BytesLike, + ttl: BigNumberish, + permittedAuthMethodTypes: BigNumberish[], + permittedAuthMethodIds: BytesLike[], + permittedAuthMethodPubkeys: BytesLike[], + permittedAuthMethodScopes: BigNumberish[][], + nftMetadata: string[], + overrides?: PayableOverrides & { from?: string } + ): Promise; + + registerPKP( + id: BigNumberish, + pkpTokenId: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + removeDomain( + pkpTokenId: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + renounceRole( + role: BytesLike, + account: string, + overrides?: Overrides & { from?: string } + ): Promise; + + revokeDomain( + pkpTokenId: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + revokeRole( + role: BytesLike, + account: string, + overrides?: Overrides & { from?: string } + ): Promise; + + setAdmin( + adminAddress: string, + overrides?: Overrides & { from?: string } + ): Promise; + + setPKPMetadata( + pkpTokenId: BigNumberish, + nftMetadata: string[], + overrides?: Overrides & { from?: string } + ): Promise; + + supportsInterface( + interfaceId: BytesLike, + overrides?: CallOverrides + ): Promise; + }; + + populateTransaction: { + ADMIN_ROLE(overrides?: CallOverrides): Promise; + + DEFAULT_ADMIN_ROLE( + overrides?: CallOverrides + ): Promise; + + contractResolver(overrides?: CallOverrides): Promise; + + env(overrides?: CallOverrides): Promise; + + getDomainIdByTokenId( + pkpTokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getDomainTokenIdByUri( + uri: BytesLike, + overrides?: CallOverrides + ): Promise; + + getDomainUri( + pkpTokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getExpiration( + pkpTokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getPkpTokenId( + id: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getRoleAdmin( + role: BytesLike, + overrides?: CallOverrides + ): Promise; + + grantRole( + role: BytesLike, + account: string, + overrides?: Overrides & { from?: string } + ): Promise; + + hasExpired( + pkpTokenId: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + hasOwner( + pkpTokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + hasRole( + role: BytesLike, + account: string, + overrides?: CallOverrides + ): Promise; + + isOwner( + pkpTokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + isRouted( + pkpTokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + registerDomain( + userId: BytesLike, + uri: BytesLike, + ttl: BigNumberish, + pkpTokenId: BigNumberish, + nftMetadata: string[], + overrides?: Overrides & { from?: string } + ): Promise; + + registerDomainAndMintNext( + userId: BytesLike, + uri: BytesLike, + ttl: BigNumberish, + permittedAuthMethodTypes: BigNumberish[], + permittedAuthMethodIds: BytesLike[], + permittedAuthMethodPubkeys: BytesLike[], + permittedAuthMethodScopes: BigNumberish[][], + nftMetadata: string[], + overrides?: PayableOverrides & { from?: string } + ): Promise; + + registerPKP( + id: BigNumberish, + pkpTokenId: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + removeDomain( + pkpTokenId: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + renounceRole( + role: BytesLike, + account: string, + overrides?: Overrides & { from?: string } + ): Promise; + + revokeDomain( + pkpTokenId: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + revokeRole( + role: BytesLike, + account: string, + overrides?: Overrides & { from?: string } + ): Promise; + + setAdmin( + adminAddress: string, + overrides?: Overrides & { from?: string } + ): Promise; + + setPKPMetadata( + pkpTokenId: BigNumberish, + nftMetadata: string[], + overrides?: Overrides & { from?: string } + ): Promise; + + supportsInterface( + interfaceId: BytesLike, + overrides?: CallOverrides + ): Promise; + }; +} diff --git a/tools/scripts/lit-contracts/DomainWaleltRegistry.sol/DomainWaleltRegistryContract.js b/tools/scripts/lit-contracts/DomainWaleltRegistry.sol/DomainWaleltRegistryContract.js new file mode 100644 index 0000000000..0b2f9fa38b --- /dev/null +++ b/tools/scripts/lit-contracts/DomainWaleltRegistry.sol/DomainWaleltRegistryContract.js @@ -0,0 +1,8 @@ +import { ethers } from "ethers"; +import { DomainWaleltRegistryData } from "./DomainWaleltRegistryData.js"; + +export const getDomainWaleltRegistryContract = (provider) => new ethers.Contract( + DomainWaleltRegistryData.address, + DomainWaleltRegistryData.abi, + provider +); \ No newline at end of file diff --git a/tools/scripts/lit-contracts/DomainWaleltRegistry.sol/DomainWaleltRegistryContract.mjs b/tools/scripts/lit-contracts/DomainWaleltRegistry.sol/DomainWaleltRegistryContract.mjs new file mode 100644 index 0000000000..0957b0bae6 --- /dev/null +++ b/tools/scripts/lit-contracts/DomainWaleltRegistry.sol/DomainWaleltRegistryContract.mjs @@ -0,0 +1,8 @@ +import { ethers } from "ethers"; +import { DomainWaleltRegistryData } from "./DomainWaleltRegistryData.mjs"; + +export const getDomainWaleltRegistryContract = (provider) => new ethers.Contract( + DomainWaleltRegistryData.address, + DomainWaleltRegistryData.abi, + provider +); \ No newline at end of file diff --git a/tools/scripts/lit-contracts/DomainWaleltRegistry.sol/DomainWaleltRegistryContract.ts b/tools/scripts/lit-contracts/DomainWaleltRegistry.sol/DomainWaleltRegistryContract.ts new file mode 100644 index 0000000000..2284c1fe00 --- /dev/null +++ b/tools/scripts/lit-contracts/DomainWaleltRegistry.sol/DomainWaleltRegistryContract.ts @@ -0,0 +1,11 @@ +import { ethers } from "ethers"; +import { DomainWaleltRegistryData } from "./DomainWaleltRegistryData"; +import { DomainWaleltRegistry } from "./DomainWaleltRegistry"; + +export const getDomainWaleltRegistryContract = (provider: any) => { + return new ethers.Contract( + DomainWaleltRegistryData.address, + DomainWaleltRegistryData.abi, + provider + ) as unknown as DomainWaleltRegistry; +} \ No newline at end of file diff --git a/tools/scripts/lit-contracts/DomainWaleltRegistry.sol/DomainWaleltRegistryData.js b/tools/scripts/lit-contracts/DomainWaleltRegistry.sol/DomainWaleltRegistryData.js new file mode 100644 index 0000000000..bcc5cb5a5a --- /dev/null +++ b/tools/scripts/lit-contracts/DomainWaleltRegistry.sol/DomainWaleltRegistryData.js @@ -0,0 +1,655 @@ +export const DomainWaleltRegistryData = { + "date": "2023-09-10T22:33:15.000Z", + "address": "0xD586F808878B624FaaC306A7b6A7383c324cb269", + "contractName": "DomainWaleltRegistry", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_resolver", + "type": "address" + }, + { + "internalType": "enum ContractResolver.Env", + "name": "_env", + "type": "uint8" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "metadataCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "validMetadataCount", + "type": "uint256" + } + ], + "name": "InvalidNftMetadataCollectionLength", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "adminAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "NonAdminCaller", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "inputs": [], + "name": "ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "contractResolver", + "outputs": [ + { + "internalType": "contract ContractResolver", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "env", + "outputs": [ + { + "internalType": "enum ContractResolver.Env", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "getDomainIdByTokenId", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "uri", + "type": "bytes" + } + ], + "name": "getDomainTokenIdByUri", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "getDomainUri", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "getExpiration", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "id", + "type": "uint64" + } + ], + "name": "getPkpTokenId", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "hasExpired", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "hasOwner", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "isOwner", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "isRouted", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "userId", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "uri", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "ttl", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + }, + { + "internalType": "string[]", + "name": "nftMetadata", + "type": "string[]" + } + ], + "name": "registerDomain", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "userId", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "uri", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "ttl", + "type": "uint256" + }, + { + "internalType": "uint256[]", + "name": "permittedAuthMethodTypes", + "type": "uint256[]" + }, + { + "internalType": "bytes[]", + "name": "permittedAuthMethodIds", + "type": "bytes[]" + }, + { + "internalType": "bytes[]", + "name": "permittedAuthMethodPubkeys", + "type": "bytes[]" + }, + { + "internalType": "uint256[][]", + "name": "permittedAuthMethodScopes", + "type": "uint256[][]" + }, + { + "internalType": "string[]", + "name": "nftMetadata", + "type": "string[]" + } + ], + "name": "registerDomainAndMintNext", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "id", + "type": "uint64" + }, + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "registerPKP", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "removeDomain", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "revokeDomain", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "adminAddress", + "type": "address" + } + ], + "name": "setAdmin", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + }, + { + "internalType": "string[]", + "name": "nftMetadata", + "type": "string[]" + } + ], + "name": "setPKPMetadata", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ] +} \ No newline at end of file diff --git a/tools/scripts/lit-contracts/DomainWaleltRegistry.sol/DomainWaleltRegistryData.mjs b/tools/scripts/lit-contracts/DomainWaleltRegistry.sol/DomainWaleltRegistryData.mjs new file mode 100644 index 0000000000..bcc5cb5a5a --- /dev/null +++ b/tools/scripts/lit-contracts/DomainWaleltRegistry.sol/DomainWaleltRegistryData.mjs @@ -0,0 +1,655 @@ +export const DomainWaleltRegistryData = { + "date": "2023-09-10T22:33:15.000Z", + "address": "0xD586F808878B624FaaC306A7b6A7383c324cb269", + "contractName": "DomainWaleltRegistry", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_resolver", + "type": "address" + }, + { + "internalType": "enum ContractResolver.Env", + "name": "_env", + "type": "uint8" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "metadataCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "validMetadataCount", + "type": "uint256" + } + ], + "name": "InvalidNftMetadataCollectionLength", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "adminAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "NonAdminCaller", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "inputs": [], + "name": "ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "contractResolver", + "outputs": [ + { + "internalType": "contract ContractResolver", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "env", + "outputs": [ + { + "internalType": "enum ContractResolver.Env", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "getDomainIdByTokenId", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "uri", + "type": "bytes" + } + ], + "name": "getDomainTokenIdByUri", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "getDomainUri", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "getExpiration", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "id", + "type": "uint64" + } + ], + "name": "getPkpTokenId", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "hasExpired", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "hasOwner", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "isOwner", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "isRouted", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "userId", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "uri", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "ttl", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + }, + { + "internalType": "string[]", + "name": "nftMetadata", + "type": "string[]" + } + ], + "name": "registerDomain", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "userId", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "uri", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "ttl", + "type": "uint256" + }, + { + "internalType": "uint256[]", + "name": "permittedAuthMethodTypes", + "type": "uint256[]" + }, + { + "internalType": "bytes[]", + "name": "permittedAuthMethodIds", + "type": "bytes[]" + }, + { + "internalType": "bytes[]", + "name": "permittedAuthMethodPubkeys", + "type": "bytes[]" + }, + { + "internalType": "uint256[][]", + "name": "permittedAuthMethodScopes", + "type": "uint256[][]" + }, + { + "internalType": "string[]", + "name": "nftMetadata", + "type": "string[]" + } + ], + "name": "registerDomainAndMintNext", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "id", + "type": "uint64" + }, + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "registerPKP", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "removeDomain", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "revokeDomain", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "adminAddress", + "type": "address" + } + ], + "name": "setAdmin", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + }, + { + "internalType": "string[]", + "name": "nftMetadata", + "type": "string[]" + } + ], + "name": "setPKPMetadata", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ] +} \ No newline at end of file diff --git a/tools/scripts/lit-contracts/DomainWaleltRegistry.sol/DomainWaleltRegistryData.ts b/tools/scripts/lit-contracts/DomainWaleltRegistry.sol/DomainWaleltRegistryData.ts new file mode 100644 index 0000000000..bcc5cb5a5a --- /dev/null +++ b/tools/scripts/lit-contracts/DomainWaleltRegistry.sol/DomainWaleltRegistryData.ts @@ -0,0 +1,655 @@ +export const DomainWaleltRegistryData = { + "date": "2023-09-10T22:33:15.000Z", + "address": "0xD586F808878B624FaaC306A7b6A7383c324cb269", + "contractName": "DomainWaleltRegistry", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_resolver", + "type": "address" + }, + { + "internalType": "enum ContractResolver.Env", + "name": "_env", + "type": "uint8" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "metadataCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "validMetadataCount", + "type": "uint256" + } + ], + "name": "InvalidNftMetadataCollectionLength", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "adminAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "NonAdminCaller", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "inputs": [], + "name": "ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "contractResolver", + "outputs": [ + { + "internalType": "contract ContractResolver", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "env", + "outputs": [ + { + "internalType": "enum ContractResolver.Env", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "getDomainIdByTokenId", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "uri", + "type": "bytes" + } + ], + "name": "getDomainTokenIdByUri", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "getDomainUri", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "getExpiration", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "id", + "type": "uint64" + } + ], + "name": "getPkpTokenId", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "hasExpired", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "hasOwner", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "isOwner", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "isRouted", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "userId", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "uri", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "ttl", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + }, + { + "internalType": "string[]", + "name": "nftMetadata", + "type": "string[]" + } + ], + "name": "registerDomain", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "userId", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "uri", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "ttl", + "type": "uint256" + }, + { + "internalType": "uint256[]", + "name": "permittedAuthMethodTypes", + "type": "uint256[]" + }, + { + "internalType": "bytes[]", + "name": "permittedAuthMethodIds", + "type": "bytes[]" + }, + { + "internalType": "bytes[]", + "name": "permittedAuthMethodPubkeys", + "type": "bytes[]" + }, + { + "internalType": "uint256[][]", + "name": "permittedAuthMethodScopes", + "type": "uint256[][]" + }, + { + "internalType": "string[]", + "name": "nftMetadata", + "type": "string[]" + } + ], + "name": "registerDomainAndMintNext", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "id", + "type": "uint64" + }, + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "registerPKP", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "removeDomain", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "revokeDomain", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "adminAddress", + "type": "address" + } + ], + "name": "setAdmin", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + }, + { + "internalType": "string[]", + "name": "nftMetadata", + "type": "string[]" + } + ], + "name": "setPKPMetadata", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ] +} \ No newline at end of file diff --git a/tools/scripts/lit-contracts/DomainWaleltRegistry.sol/common.ts b/tools/scripts/lit-contracts/DomainWaleltRegistry.sol/common.ts new file mode 100644 index 0000000000..2fc40c7fb1 --- /dev/null +++ b/tools/scripts/lit-contracts/DomainWaleltRegistry.sol/common.ts @@ -0,0 +1,44 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { Listener } from "@ethersproject/providers"; +import type { Event, EventFilter } from "ethers"; + +export interface TypedEvent< + TArgsArray extends Array = any, + TArgsObject = any +> extends Event { + args: TArgsArray & TArgsObject; +} + +export interface TypedEventFilter<_TEvent extends TypedEvent> + extends EventFilter {} + +export interface TypedListener { + (...listenerArg: [...__TypechainArgsArray, TEvent]): void; +} + +type __TypechainArgsArray = T extends TypedEvent ? U : never; + +export interface OnEvent { + ( + eventFilter: TypedEventFilter, + listener: TypedListener + ): TRes; + (eventName: string, listener: Listener): TRes; +} + +export type MinEthersFactory = { + deploy(...a: ARGS[]): Promise; +}; + +export type GetContractTypeFromFactory = F extends MinEthersFactory< + infer C, + any +> + ? C + : never; + +export type GetARGsTypeFromFactory = F extends MinEthersFactory + ? Parameters + : never; diff --git a/tools/scripts/lit-contracts/DomainWaleltRegistry.sol/factories/DomainWaleltRegistry__factory.ts b/tools/scripts/lit-contracts/DomainWaleltRegistry.sol/factories/DomainWaleltRegistry__factory.ts new file mode 100644 index 0000000000..3a276a433f --- /dev/null +++ b/tools/scripts/lit-contracts/DomainWaleltRegistry.sol/factories/DomainWaleltRegistry__factory.ts @@ -0,0 +1,678 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Signer, utils } from "ethers"; +import type { Provider } from "@ethersproject/providers"; +import type { + DomainWaleltRegistry, + DomainWaleltRegistryInterface, +} from "../DomainWaleltRegistry"; + +const _abi = [ + { + inputs: [ + { + internalType: "address", + name: "_resolver", + type: "address", + }, + { + internalType: "enum ContractResolver.Env", + name: "_env", + type: "uint8", + }, + ], + stateMutability: "nonpayable", + type: "constructor", + }, + { + inputs: [ + { + internalType: "uint256", + name: "metadataCount", + type: "uint256", + }, + { + internalType: "uint256", + name: "validMetadataCount", + type: "uint256", + }, + ], + name: "InvalidNftMetadataCollectionLength", + type: "error", + }, + { + inputs: [ + { + internalType: "address", + name: "adminAddress", + type: "address", + }, + { + internalType: "address", + name: "account", + type: "address", + }, + ], + name: "NonAdminCaller", + type: "error", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "bytes32", + name: "role", + type: "bytes32", + }, + { + indexed: true, + internalType: "bytes32", + name: "previousAdminRole", + type: "bytes32", + }, + { + indexed: true, + internalType: "bytes32", + name: "newAdminRole", + type: "bytes32", + }, + ], + name: "RoleAdminChanged", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "bytes32", + name: "role", + type: "bytes32", + }, + { + indexed: true, + internalType: "address", + name: "account", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "sender", + type: "address", + }, + ], + name: "RoleGranted", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "bytes32", + name: "role", + type: "bytes32", + }, + { + indexed: true, + internalType: "address", + name: "account", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "sender", + type: "address", + }, + ], + name: "RoleRevoked", + type: "event", + }, + { + inputs: [], + name: "ADMIN_ROLE", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "DEFAULT_ADMIN_ROLE", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "contractResolver", + outputs: [ + { + internalType: "contract ContractResolver", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "env", + outputs: [ + { + internalType: "enum ContractResolver.Env", + name: "", + type: "uint8", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "pkpTokenId", + type: "uint256", + }, + ], + name: "getDomainIdByTokenId", + outputs: [ + { + internalType: "uint64", + name: "", + type: "uint64", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes", + name: "uri", + type: "bytes", + }, + ], + name: "getDomainTokenIdByUri", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "pkpTokenId", + type: "uint256", + }, + ], + name: "getDomainUri", + outputs: [ + { + internalType: "bytes", + name: "", + type: "bytes", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "pkpTokenId", + type: "uint256", + }, + ], + name: "getExpiration", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint64", + name: "id", + type: "uint64", + }, + ], + name: "getPkpTokenId", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "role", + type: "bytes32", + }, + ], + name: "getRoleAdmin", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "role", + type: "bytes32", + }, + { + internalType: "address", + name: "account", + type: "address", + }, + ], + name: "grantRole", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "pkpTokenId", + type: "uint256", + }, + ], + name: "hasExpired", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "pkpTokenId", + type: "uint256", + }, + ], + name: "hasOwner", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "role", + type: "bytes32", + }, + { + internalType: "address", + name: "account", + type: "address", + }, + ], + name: "hasRole", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "pkpTokenId", + type: "uint256", + }, + ], + name: "isOwner", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "pkpTokenId", + type: "uint256", + }, + ], + name: "isRouted", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes", + name: "userId", + type: "bytes", + }, + { + internalType: "bytes", + name: "uri", + type: "bytes", + }, + { + internalType: "uint256", + name: "ttl", + type: "uint256", + }, + { + internalType: "uint256", + name: "pkpTokenId", + type: "uint256", + }, + { + internalType: "string[]", + name: "nftMetadata", + type: "string[]", + }, + ], + name: "registerDomain", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes", + name: "userId", + type: "bytes", + }, + { + internalType: "bytes", + name: "uri", + type: "bytes", + }, + { + internalType: "uint256", + name: "ttl", + type: "uint256", + }, + { + internalType: "uint256[]", + name: "permittedAuthMethodTypes", + type: "uint256[]", + }, + { + internalType: "bytes[]", + name: "permittedAuthMethodIds", + type: "bytes[]", + }, + { + internalType: "bytes[]", + name: "permittedAuthMethodPubkeys", + type: "bytes[]", + }, + { + internalType: "uint256[][]", + name: "permittedAuthMethodScopes", + type: "uint256[][]", + }, + { + internalType: "string[]", + name: "nftMetadata", + type: "string[]", + }, + ], + name: "registerDomainAndMintNext", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "payable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint64", + name: "id", + type: "uint64", + }, + { + internalType: "uint256", + name: "pkpTokenId", + type: "uint256", + }, + ], + name: "registerPKP", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "pkpTokenId", + type: "uint256", + }, + ], + name: "removeDomain", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "role", + type: "bytes32", + }, + { + internalType: "address", + name: "account", + type: "address", + }, + ], + name: "renounceRole", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "pkpTokenId", + type: "uint256", + }, + ], + name: "revokeDomain", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "role", + type: "bytes32", + }, + { + internalType: "address", + name: "account", + type: "address", + }, + ], + name: "revokeRole", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "adminAddress", + type: "address", + }, + ], + name: "setAdmin", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "pkpTokenId", + type: "uint256", + }, + { + internalType: "string[]", + name: "nftMetadata", + type: "string[]", + }, + ], + name: "setPKPMetadata", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes4", + name: "interfaceId", + type: "bytes4", + }, + ], + name: "supportsInterface", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, +] as const; + +export class DomainWaleltRegistry__factory { + static readonly abi = _abi; + static createInterface(): DomainWaleltRegistryInterface { + return new utils.Interface(_abi) as DomainWaleltRegistryInterface; + } + static connect( + address: string, + signerOrProvider: Signer | Provider + ): DomainWaleltRegistry { + return new Contract( + address, + _abi, + signerOrProvider + ) as DomainWaleltRegistry; + } +} diff --git a/tools/scripts/lit-contracts/DomainWaleltRegistry.sol/factories/index.ts b/tools/scripts/lit-contracts/DomainWaleltRegistry.sol/factories/index.ts new file mode 100644 index 0000000000..3a07c807f0 --- /dev/null +++ b/tools/scripts/lit-contracts/DomainWaleltRegistry.sol/factories/index.ts @@ -0,0 +1,4 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export { DomainWaleltRegistry__factory } from "./DomainWaleltRegistry__factory"; diff --git a/tools/scripts/lit-contracts/DomainWaleltRegistry.sol/index.js b/tools/scripts/lit-contracts/DomainWaleltRegistry.sol/index.js new file mode 100644 index 0000000000..ffd6366b01 --- /dev/null +++ b/tools/scripts/lit-contracts/DomainWaleltRegistry.sol/index.js @@ -0,0 +1,2 @@ +export * from "./DomainWaleltRegistryData.js"; +export * from "./DomainWaleltRegistryContract.js"; \ No newline at end of file diff --git a/tools/scripts/lit-contracts/DomainWaleltRegistry.sol/index.mjs b/tools/scripts/lit-contracts/DomainWaleltRegistry.sol/index.mjs new file mode 100644 index 0000000000..8ba9082e84 --- /dev/null +++ b/tools/scripts/lit-contracts/DomainWaleltRegistry.sol/index.mjs @@ -0,0 +1,2 @@ +export * from "./DomainWaleltRegistryData.mjs"; +export * from "./DomainWaleltRegistryContract.mjs"; \ No newline at end of file diff --git a/tools/scripts/lit-contracts/DomainWaleltRegistry.sol/index.ts b/tools/scripts/lit-contracts/DomainWaleltRegistry.sol/index.ts new file mode 100644 index 0000000000..b0ab1195aa --- /dev/null +++ b/tools/scripts/lit-contracts/DomainWaleltRegistry.sol/index.ts @@ -0,0 +1,3 @@ +export * from "./DomainWaleltRegistryData"; +export * from "./DomainWaleltRegistryContract"; +export * from "./DomainWaleltRegistry"; \ No newline at end of file diff --git a/tools/scripts/lit-contracts/DomainWalletOracle.sol/DomainWalletOracle.json b/tools/scripts/lit-contracts/DomainWalletOracle.sol/DomainWalletOracle.json new file mode 100644 index 0000000000..141a92a1cc --- /dev/null +++ b/tools/scripts/lit-contracts/DomainWalletOracle.sol/DomainWalletOracle.json @@ -0,0 +1,722 @@ +{ + "date": "2023-09-10T22:33:16.000Z", + "address": "0x9BBDBD163C117fb4e1F9b4F4002bCF53915Dfc40", + "contractName": "DomainWalletOracle", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_contractResolver", + "type": "address" + }, + { + "internalType": "enum ContractResolver.Env", + "name": "_env", + "type": "uint8" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "uri", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "DomainAlreadyRegistered", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "registryAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "NonRegistryCaller", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes", + "name": "subDomain", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "ttl", + "type": "uint256" + } + ], + "name": "Expired", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint64", + "name": "id", + "type": "uint64" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "subDomain", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "ttl", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "Registered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "subDomain", + "type": "bytes" + } + ], + "name": "Removed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "subDomain", + "type": "bytes" + } + ], + "name": "Revoked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "inputs": [], + "name": "ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "uri", + "type": "bytes" + } + ], + "name": "checkRegistration", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "contractResolver", + "outputs": [ + { + "internalType": "contract ContractResolver", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "env", + "outputs": [ + { + "internalType": "enum ContractResolver.Env", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "getDomainIdByTokenId", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "uri", + "type": "bytes" + } + ], + "name": "getDomainTokenIdByUri", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "getDomainUri", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "getExpiration", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "id", + "type": "uint64" + } + ], + "name": "getPkpTokenId", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "getRecord", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "hasExpired", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "hasOwner", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "isOwner", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "isRouted", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "userId", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "uri", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "ttl", + "type": "uint256" + } + ], + "name": "registerDomain", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "id", + "type": "uint64" + }, + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "registerPKP", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "removeDomain", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "revokeDomain", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "acct", + "type": "address" + } + ], + "name": "setAdmin", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "record", + "type": "bytes" + } + ], + "name": "updateDomainRecord", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ] +} \ No newline at end of file diff --git a/tools/scripts/lit-contracts/DomainWalletOracle.sol/DomainWalletOracle.ts b/tools/scripts/lit-contracts/DomainWalletOracle.sol/DomainWalletOracle.ts new file mode 100644 index 0000000000..0a53ee9e52 --- /dev/null +++ b/tools/scripts/lit-contracts/DomainWalletOracle.sol/DomainWalletOracle.ts @@ -0,0 +1,1111 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumber, + BigNumberish, + BytesLike, + CallOverrides, + ContractTransaction, + Overrides, + PopulatedTransaction, + Signer, + utils, +} from "ethers"; +import type { + FunctionFragment, + Result, + EventFragment, +} from "@ethersproject/abi"; +import type { Listener, Provider } from "@ethersproject/providers"; +import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, +} from "./common"; + +export interface DomainWalletOracleInterface extends utils.Interface { + functions: { + "ADMIN_ROLE()": FunctionFragment; + "DEFAULT_ADMIN_ROLE()": FunctionFragment; + "checkRegistration(bytes)": FunctionFragment; + "contractResolver()": FunctionFragment; + "env()": FunctionFragment; + "getDomainIdByTokenId(uint256)": FunctionFragment; + "getDomainTokenIdByUri(bytes)": FunctionFragment; + "getDomainUri(uint256)": FunctionFragment; + "getExpiration(uint256)": FunctionFragment; + "getPkpTokenId(uint64)": FunctionFragment; + "getRecord(uint256)": FunctionFragment; + "getRoleAdmin(bytes32)": FunctionFragment; + "grantRole(bytes32,address)": FunctionFragment; + "hasExpired(uint256)": FunctionFragment; + "hasOwner(uint256)": FunctionFragment; + "hasRole(bytes32,address)": FunctionFragment; + "isOwner(uint256)": FunctionFragment; + "isRouted(uint256)": FunctionFragment; + "registerDomain(bytes,bytes,uint256,uint256)": FunctionFragment; + "registerPKP(uint64,uint256)": FunctionFragment; + "removeDomain(uint256)": FunctionFragment; + "renounceRole(bytes32,address)": FunctionFragment; + "revokeDomain(uint256)": FunctionFragment; + "revokeRole(bytes32,address)": FunctionFragment; + "setAdmin(address)": FunctionFragment; + "supportsInterface(bytes4)": FunctionFragment; + "updateDomainRecord(uint256,bytes)": FunctionFragment; + }; + + getFunction( + nameOrSignatureOrTopic: + | "ADMIN_ROLE" + | "DEFAULT_ADMIN_ROLE" + | "checkRegistration" + | "contractResolver" + | "env" + | "getDomainIdByTokenId" + | "getDomainTokenIdByUri" + | "getDomainUri" + | "getExpiration" + | "getPkpTokenId" + | "getRecord" + | "getRoleAdmin" + | "grantRole" + | "hasExpired" + | "hasOwner" + | "hasRole" + | "isOwner" + | "isRouted" + | "registerDomain" + | "registerPKP" + | "removeDomain" + | "renounceRole" + | "revokeDomain" + | "revokeRole" + | "setAdmin" + | "supportsInterface" + | "updateDomainRecord" + ): FunctionFragment; + + encodeFunctionData( + functionFragment: "ADMIN_ROLE", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "DEFAULT_ADMIN_ROLE", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "checkRegistration", + values: [BytesLike] + ): string; + encodeFunctionData( + functionFragment: "contractResolver", + values?: undefined + ): string; + encodeFunctionData(functionFragment: "env", values?: undefined): string; + encodeFunctionData( + functionFragment: "getDomainIdByTokenId", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "getDomainTokenIdByUri", + values: [BytesLike] + ): string; + encodeFunctionData( + functionFragment: "getDomainUri", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "getExpiration", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "getPkpTokenId", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "getRecord", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "getRoleAdmin", + values: [BytesLike] + ): string; + encodeFunctionData( + functionFragment: "grantRole", + values: [BytesLike, string] + ): string; + encodeFunctionData( + functionFragment: "hasExpired", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "hasOwner", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "hasRole", + values: [BytesLike, string] + ): string; + encodeFunctionData( + functionFragment: "isOwner", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "isRouted", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "registerDomain", + values: [BytesLike, BytesLike, BigNumberish, BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "registerPKP", + values: [BigNumberish, BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "removeDomain", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "renounceRole", + values: [BytesLike, string] + ): string; + encodeFunctionData( + functionFragment: "revokeDomain", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "revokeRole", + values: [BytesLike, string] + ): string; + encodeFunctionData(functionFragment: "setAdmin", values: [string]): string; + encodeFunctionData( + functionFragment: "supportsInterface", + values: [BytesLike] + ): string; + encodeFunctionData( + functionFragment: "updateDomainRecord", + values: [BigNumberish, BytesLike] + ): string; + + decodeFunctionResult(functionFragment: "ADMIN_ROLE", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "DEFAULT_ADMIN_ROLE", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "checkRegistration", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "contractResolver", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "env", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "getDomainIdByTokenId", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getDomainTokenIdByUri", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getDomainUri", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getExpiration", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getPkpTokenId", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "getRecord", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "getRoleAdmin", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "grantRole", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "hasExpired", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "hasOwner", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "hasRole", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "isOwner", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "isRouted", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "registerDomain", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "registerPKP", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "removeDomain", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "renounceRole", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "revokeDomain", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "revokeRole", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "setAdmin", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "supportsInterface", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "updateDomainRecord", + data: BytesLike + ): Result; + + events: { + "Expired(bytes,uint256,uint256)": EventFragment; + "Registered(uint64,bytes,uint256,uint256)": EventFragment; + "Removed(uint256,bytes)": EventFragment; + "Revoked(uint256,bytes)": EventFragment; + "RoleAdminChanged(bytes32,bytes32,bytes32)": EventFragment; + "RoleGranted(bytes32,address,address)": EventFragment; + "RoleRevoked(bytes32,address,address)": EventFragment; + }; + + getEvent(nameOrSignatureOrTopic: "Expired"): EventFragment; + getEvent(nameOrSignatureOrTopic: "Registered"): EventFragment; + getEvent(nameOrSignatureOrTopic: "Removed"): EventFragment; + getEvent(nameOrSignatureOrTopic: "Revoked"): EventFragment; + getEvent(nameOrSignatureOrTopic: "RoleAdminChanged"): EventFragment; + getEvent(nameOrSignatureOrTopic: "RoleGranted"): EventFragment; + getEvent(nameOrSignatureOrTopic: "RoleRevoked"): EventFragment; +} + +export interface ExpiredEventObject { + subDomain: string; + tokenId: BigNumber; + ttl: BigNumber; +} +export type ExpiredEvent = TypedEvent< + [string, BigNumber, BigNumber], + ExpiredEventObject +>; + +export type ExpiredEventFilter = TypedEventFilter; + +export interface RegisteredEventObject { + id: BigNumber; + subDomain: string; + ttl: BigNumber; + tokenId: BigNumber; +} +export type RegisteredEvent = TypedEvent< + [BigNumber, string, BigNumber, BigNumber], + RegisteredEventObject +>; + +export type RegisteredEventFilter = TypedEventFilter; + +export interface RemovedEventObject { + tokenId: BigNumber; + subDomain: string; +} +export type RemovedEvent = TypedEvent<[BigNumber, string], RemovedEventObject>; + +export type RemovedEventFilter = TypedEventFilter; + +export interface RevokedEventObject { + tokenId: BigNumber; + subDomain: string; +} +export type RevokedEvent = TypedEvent<[BigNumber, string], RevokedEventObject>; + +export type RevokedEventFilter = TypedEventFilter; + +export interface RoleAdminChangedEventObject { + role: string; + previousAdminRole: string; + newAdminRole: string; +} +export type RoleAdminChangedEvent = TypedEvent< + [string, string, string], + RoleAdminChangedEventObject +>; + +export type RoleAdminChangedEventFilter = + TypedEventFilter; + +export interface RoleGrantedEventObject { + role: string; + account: string; + sender: string; +} +export type RoleGrantedEvent = TypedEvent< + [string, string, string], + RoleGrantedEventObject +>; + +export type RoleGrantedEventFilter = TypedEventFilter; + +export interface RoleRevokedEventObject { + role: string; + account: string; + sender: string; +} +export type RoleRevokedEvent = TypedEvent< + [string, string, string], + RoleRevokedEventObject +>; + +export type RoleRevokedEventFilter = TypedEventFilter; + +export interface DomainWalletOracle extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: DomainWalletOracleInterface; + + queryFilter( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>; + + listeners( + eventFilter?: TypedEventFilter + ): Array>; + listeners(eventName?: string): Array; + removeAllListeners( + eventFilter: TypedEventFilter + ): this; + removeAllListeners(eventName?: string): this; + off: OnEvent; + on: OnEvent; + once: OnEvent; + removeListener: OnEvent; + + functions: { + ADMIN_ROLE(overrides?: CallOverrides): Promise<[string]>; + + DEFAULT_ADMIN_ROLE(overrides?: CallOverrides): Promise<[string]>; + + checkRegistration( + uri: BytesLike, + overrides?: CallOverrides + ): Promise<[void]>; + + contractResolver(overrides?: CallOverrides): Promise<[string]>; + + env(overrides?: CallOverrides): Promise<[number]>; + + getDomainIdByTokenId( + pkpTokenId: BigNumberish, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + getDomainTokenIdByUri( + uri: BytesLike, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + getDomainUri( + pkpTokenId: BigNumberish, + overrides?: CallOverrides + ): Promise<[string]>; + + getExpiration( + pkpTokenId: BigNumberish, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + getPkpTokenId( + id: BigNumberish, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + getRecord( + pkpTokenId: BigNumberish, + overrides?: CallOverrides + ): Promise<[string]>; + + getRoleAdmin(role: BytesLike, overrides?: CallOverrides): Promise<[string]>; + + grantRole( + role: BytesLike, + account: string, + overrides?: Overrides & { from?: string } + ): Promise; + + hasExpired( + pkpTokenId: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + hasOwner( + pkpTokenId: BigNumberish, + overrides?: CallOverrides + ): Promise<[boolean]>; + + hasRole( + role: BytesLike, + account: string, + overrides?: CallOverrides + ): Promise<[boolean]>; + + isOwner( + pkpTokenId: BigNumberish, + overrides?: CallOverrides + ): Promise<[boolean]>; + + isRouted( + pkpTokenId: BigNumberish, + overrides?: CallOverrides + ): Promise<[boolean]>; + + registerDomain( + userId: BytesLike, + uri: BytesLike, + pkpTokenId: BigNumberish, + ttl: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + registerPKP( + id: BigNumberish, + pkpTokenId: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + removeDomain( + pkpTokenId: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + renounceRole( + role: BytesLike, + account: string, + overrides?: Overrides & { from?: string } + ): Promise; + + revokeDomain( + pkpTokenId: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + revokeRole( + role: BytesLike, + account: string, + overrides?: Overrides & { from?: string } + ): Promise; + + setAdmin( + acct: string, + overrides?: Overrides & { from?: string } + ): Promise; + + supportsInterface( + interfaceId: BytesLike, + overrides?: CallOverrides + ): Promise<[boolean]>; + + updateDomainRecord( + pkpTokenId: BigNumberish, + record: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + }; + + ADMIN_ROLE(overrides?: CallOverrides): Promise; + + DEFAULT_ADMIN_ROLE(overrides?: CallOverrides): Promise; + + checkRegistration(uri: BytesLike, overrides?: CallOverrides): Promise; + + contractResolver(overrides?: CallOverrides): Promise; + + env(overrides?: CallOverrides): Promise; + + getDomainIdByTokenId( + pkpTokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getDomainTokenIdByUri( + uri: BytesLike, + overrides?: CallOverrides + ): Promise; + + getDomainUri( + pkpTokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getExpiration( + pkpTokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getPkpTokenId( + id: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getRecord( + pkpTokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getRoleAdmin(role: BytesLike, overrides?: CallOverrides): Promise; + + grantRole( + role: BytesLike, + account: string, + overrides?: Overrides & { from?: string } + ): Promise; + + hasExpired( + pkpTokenId: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + hasOwner( + pkpTokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + hasRole( + role: BytesLike, + account: string, + overrides?: CallOverrides + ): Promise; + + isOwner( + pkpTokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + isRouted( + pkpTokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + registerDomain( + userId: BytesLike, + uri: BytesLike, + pkpTokenId: BigNumberish, + ttl: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + registerPKP( + id: BigNumberish, + pkpTokenId: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + removeDomain( + pkpTokenId: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + renounceRole( + role: BytesLike, + account: string, + overrides?: Overrides & { from?: string } + ): Promise; + + revokeDomain( + pkpTokenId: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + revokeRole( + role: BytesLike, + account: string, + overrides?: Overrides & { from?: string } + ): Promise; + + setAdmin( + acct: string, + overrides?: Overrides & { from?: string } + ): Promise; + + supportsInterface( + interfaceId: BytesLike, + overrides?: CallOverrides + ): Promise; + + updateDomainRecord( + pkpTokenId: BigNumberish, + record: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + + callStatic: { + ADMIN_ROLE(overrides?: CallOverrides): Promise; + + DEFAULT_ADMIN_ROLE(overrides?: CallOverrides): Promise; + + checkRegistration(uri: BytesLike, overrides?: CallOverrides): Promise; + + contractResolver(overrides?: CallOverrides): Promise; + + env(overrides?: CallOverrides): Promise; + + getDomainIdByTokenId( + pkpTokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getDomainTokenIdByUri( + uri: BytesLike, + overrides?: CallOverrides + ): Promise; + + getDomainUri( + pkpTokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getExpiration( + pkpTokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getPkpTokenId( + id: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getRecord( + pkpTokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getRoleAdmin(role: BytesLike, overrides?: CallOverrides): Promise; + + grantRole( + role: BytesLike, + account: string, + overrides?: CallOverrides + ): Promise; + + hasExpired( + pkpTokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + hasOwner( + pkpTokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + hasRole( + role: BytesLike, + account: string, + overrides?: CallOverrides + ): Promise; + + isOwner( + pkpTokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + isRouted( + pkpTokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + registerDomain( + userId: BytesLike, + uri: BytesLike, + pkpTokenId: BigNumberish, + ttl: BigNumberish, + overrides?: CallOverrides + ): Promise; + + registerPKP( + id: BigNumberish, + pkpTokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + removeDomain( + pkpTokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + renounceRole( + role: BytesLike, + account: string, + overrides?: CallOverrides + ): Promise; + + revokeDomain( + pkpTokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + revokeRole( + role: BytesLike, + account: string, + overrides?: CallOverrides + ): Promise; + + setAdmin(acct: string, overrides?: CallOverrides): Promise; + + supportsInterface( + interfaceId: BytesLike, + overrides?: CallOverrides + ): Promise; + + updateDomainRecord( + pkpTokenId: BigNumberish, + record: BytesLike, + overrides?: CallOverrides + ): Promise; + }; + + filters: { + "Expired(bytes,uint256,uint256)"( + subDomain?: null, + tokenId?: null, + ttl?: null + ): ExpiredEventFilter; + Expired(subDomain?: null, tokenId?: null, ttl?: null): ExpiredEventFilter; + + "Registered(uint64,bytes,uint256,uint256)"( + id?: null, + subDomain?: null, + ttl?: null, + tokenId?: null + ): RegisteredEventFilter; + Registered( + id?: null, + subDomain?: null, + ttl?: null, + tokenId?: null + ): RegisteredEventFilter; + + "Removed(uint256,bytes)"( + tokenId?: null, + subDomain?: null + ): RemovedEventFilter; + Removed(tokenId?: null, subDomain?: null): RemovedEventFilter; + + "Revoked(uint256,bytes)"( + tokenId?: null, + subDomain?: null + ): RevokedEventFilter; + Revoked(tokenId?: null, subDomain?: null): RevokedEventFilter; + + "RoleAdminChanged(bytes32,bytes32,bytes32)"( + role?: BytesLike | null, + previousAdminRole?: BytesLike | null, + newAdminRole?: BytesLike | null + ): RoleAdminChangedEventFilter; + RoleAdminChanged( + role?: BytesLike | null, + previousAdminRole?: BytesLike | null, + newAdminRole?: BytesLike | null + ): RoleAdminChangedEventFilter; + + "RoleGranted(bytes32,address,address)"( + role?: BytesLike | null, + account?: string | null, + sender?: string | null + ): RoleGrantedEventFilter; + RoleGranted( + role?: BytesLike | null, + account?: string | null, + sender?: string | null + ): RoleGrantedEventFilter; + + "RoleRevoked(bytes32,address,address)"( + role?: BytesLike | null, + account?: string | null, + sender?: string | null + ): RoleRevokedEventFilter; + RoleRevoked( + role?: BytesLike | null, + account?: string | null, + sender?: string | null + ): RoleRevokedEventFilter; + }; + + estimateGas: { + ADMIN_ROLE(overrides?: CallOverrides): Promise; + + DEFAULT_ADMIN_ROLE(overrides?: CallOverrides): Promise; + + checkRegistration( + uri: BytesLike, + overrides?: CallOverrides + ): Promise; + + contractResolver(overrides?: CallOverrides): Promise; + + env(overrides?: CallOverrides): Promise; + + getDomainIdByTokenId( + pkpTokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getDomainTokenIdByUri( + uri: BytesLike, + overrides?: CallOverrides + ): Promise; + + getDomainUri( + pkpTokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getExpiration( + pkpTokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getPkpTokenId( + id: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getRecord( + pkpTokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getRoleAdmin( + role: BytesLike, + overrides?: CallOverrides + ): Promise; + + grantRole( + role: BytesLike, + account: string, + overrides?: Overrides & { from?: string } + ): Promise; + + hasExpired( + pkpTokenId: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + hasOwner( + pkpTokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + hasRole( + role: BytesLike, + account: string, + overrides?: CallOverrides + ): Promise; + + isOwner( + pkpTokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + isRouted( + pkpTokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + registerDomain( + userId: BytesLike, + uri: BytesLike, + pkpTokenId: BigNumberish, + ttl: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + registerPKP( + id: BigNumberish, + pkpTokenId: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + removeDomain( + pkpTokenId: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + renounceRole( + role: BytesLike, + account: string, + overrides?: Overrides & { from?: string } + ): Promise; + + revokeDomain( + pkpTokenId: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + revokeRole( + role: BytesLike, + account: string, + overrides?: Overrides & { from?: string } + ): Promise; + + setAdmin( + acct: string, + overrides?: Overrides & { from?: string } + ): Promise; + + supportsInterface( + interfaceId: BytesLike, + overrides?: CallOverrides + ): Promise; + + updateDomainRecord( + pkpTokenId: BigNumberish, + record: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + }; + + populateTransaction: { + ADMIN_ROLE(overrides?: CallOverrides): Promise; + + DEFAULT_ADMIN_ROLE( + overrides?: CallOverrides + ): Promise; + + checkRegistration( + uri: BytesLike, + overrides?: CallOverrides + ): Promise; + + contractResolver(overrides?: CallOverrides): Promise; + + env(overrides?: CallOverrides): Promise; + + getDomainIdByTokenId( + pkpTokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getDomainTokenIdByUri( + uri: BytesLike, + overrides?: CallOverrides + ): Promise; + + getDomainUri( + pkpTokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getExpiration( + pkpTokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getPkpTokenId( + id: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getRecord( + pkpTokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getRoleAdmin( + role: BytesLike, + overrides?: CallOverrides + ): Promise; + + grantRole( + role: BytesLike, + account: string, + overrides?: Overrides & { from?: string } + ): Promise; + + hasExpired( + pkpTokenId: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + hasOwner( + pkpTokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + hasRole( + role: BytesLike, + account: string, + overrides?: CallOverrides + ): Promise; + + isOwner( + pkpTokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + isRouted( + pkpTokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + registerDomain( + userId: BytesLike, + uri: BytesLike, + pkpTokenId: BigNumberish, + ttl: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + registerPKP( + id: BigNumberish, + pkpTokenId: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + removeDomain( + pkpTokenId: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + renounceRole( + role: BytesLike, + account: string, + overrides?: Overrides & { from?: string } + ): Promise; + + revokeDomain( + pkpTokenId: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + revokeRole( + role: BytesLike, + account: string, + overrides?: Overrides & { from?: string } + ): Promise; + + setAdmin( + acct: string, + overrides?: Overrides & { from?: string } + ): Promise; + + supportsInterface( + interfaceId: BytesLike, + overrides?: CallOverrides + ): Promise; + + updateDomainRecord( + pkpTokenId: BigNumberish, + record: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + }; +} diff --git a/tools/scripts/lit-contracts/DomainWalletOracle.sol/DomainWalletOracleContract.js b/tools/scripts/lit-contracts/DomainWalletOracle.sol/DomainWalletOracleContract.js new file mode 100644 index 0000000000..8198065c6e --- /dev/null +++ b/tools/scripts/lit-contracts/DomainWalletOracle.sol/DomainWalletOracleContract.js @@ -0,0 +1,8 @@ +import { ethers } from "ethers"; +import { DomainWalletOracleData } from "./DomainWalletOracleData.js"; + +export const getDomainWalletOracleContract = (provider) => new ethers.Contract( + DomainWalletOracleData.address, + DomainWalletOracleData.abi, + provider +); \ No newline at end of file diff --git a/tools/scripts/lit-contracts/DomainWalletOracle.sol/DomainWalletOracleContract.mjs b/tools/scripts/lit-contracts/DomainWalletOracle.sol/DomainWalletOracleContract.mjs new file mode 100644 index 0000000000..471ad283b3 --- /dev/null +++ b/tools/scripts/lit-contracts/DomainWalletOracle.sol/DomainWalletOracleContract.mjs @@ -0,0 +1,8 @@ +import { ethers } from "ethers"; +import { DomainWalletOracleData } from "./DomainWalletOracleData.mjs"; + +export const getDomainWalletOracleContract = (provider) => new ethers.Contract( + DomainWalletOracleData.address, + DomainWalletOracleData.abi, + provider +); \ No newline at end of file diff --git a/tools/scripts/lit-contracts/DomainWalletOracle.sol/DomainWalletOracleContract.ts b/tools/scripts/lit-contracts/DomainWalletOracle.sol/DomainWalletOracleContract.ts new file mode 100644 index 0000000000..3d07d1b916 --- /dev/null +++ b/tools/scripts/lit-contracts/DomainWalletOracle.sol/DomainWalletOracleContract.ts @@ -0,0 +1,11 @@ +import { ethers } from "ethers"; +import { DomainWalletOracleData } from "./DomainWalletOracleData"; +import { DomainWalletOracle } from "./DomainWalletOracle"; + +export const getDomainWalletOracleContract = (provider: any) => { + return new ethers.Contract( + DomainWalletOracleData.address, + DomainWalletOracleData.abi, + provider + ) as unknown as DomainWalletOracle; +} \ No newline at end of file diff --git a/tools/scripts/lit-contracts/DomainWalletOracle.sol/DomainWalletOracleData.js b/tools/scripts/lit-contracts/DomainWalletOracle.sol/DomainWalletOracleData.js new file mode 100644 index 0000000000..4349ce7e37 --- /dev/null +++ b/tools/scripts/lit-contracts/DomainWalletOracle.sol/DomainWalletOracleData.js @@ -0,0 +1,722 @@ +export const DomainWalletOracleData = { + "date": "2023-09-10T22:33:16.000Z", + "address": "0x9BBDBD163C117fb4e1F9b4F4002bCF53915Dfc40", + "contractName": "DomainWalletOracle", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_contractResolver", + "type": "address" + }, + { + "internalType": "enum ContractResolver.Env", + "name": "_env", + "type": "uint8" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "uri", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "DomainAlreadyRegistered", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "registryAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "NonRegistryCaller", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes", + "name": "subDomain", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "ttl", + "type": "uint256" + } + ], + "name": "Expired", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint64", + "name": "id", + "type": "uint64" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "subDomain", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "ttl", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "Registered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "subDomain", + "type": "bytes" + } + ], + "name": "Removed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "subDomain", + "type": "bytes" + } + ], + "name": "Revoked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "inputs": [], + "name": "ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "uri", + "type": "bytes" + } + ], + "name": "checkRegistration", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "contractResolver", + "outputs": [ + { + "internalType": "contract ContractResolver", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "env", + "outputs": [ + { + "internalType": "enum ContractResolver.Env", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "getDomainIdByTokenId", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "uri", + "type": "bytes" + } + ], + "name": "getDomainTokenIdByUri", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "getDomainUri", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "getExpiration", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "id", + "type": "uint64" + } + ], + "name": "getPkpTokenId", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "getRecord", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "hasExpired", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "hasOwner", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "isOwner", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "isRouted", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "userId", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "uri", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "ttl", + "type": "uint256" + } + ], + "name": "registerDomain", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "id", + "type": "uint64" + }, + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "registerPKP", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "removeDomain", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "revokeDomain", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "acct", + "type": "address" + } + ], + "name": "setAdmin", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "record", + "type": "bytes" + } + ], + "name": "updateDomainRecord", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ] +} \ No newline at end of file diff --git a/tools/scripts/lit-contracts/DomainWalletOracle.sol/DomainWalletOracleData.mjs b/tools/scripts/lit-contracts/DomainWalletOracle.sol/DomainWalletOracleData.mjs new file mode 100644 index 0000000000..4349ce7e37 --- /dev/null +++ b/tools/scripts/lit-contracts/DomainWalletOracle.sol/DomainWalletOracleData.mjs @@ -0,0 +1,722 @@ +export const DomainWalletOracleData = { + "date": "2023-09-10T22:33:16.000Z", + "address": "0x9BBDBD163C117fb4e1F9b4F4002bCF53915Dfc40", + "contractName": "DomainWalletOracle", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_contractResolver", + "type": "address" + }, + { + "internalType": "enum ContractResolver.Env", + "name": "_env", + "type": "uint8" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "uri", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "DomainAlreadyRegistered", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "registryAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "NonRegistryCaller", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes", + "name": "subDomain", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "ttl", + "type": "uint256" + } + ], + "name": "Expired", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint64", + "name": "id", + "type": "uint64" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "subDomain", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "ttl", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "Registered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "subDomain", + "type": "bytes" + } + ], + "name": "Removed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "subDomain", + "type": "bytes" + } + ], + "name": "Revoked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "inputs": [], + "name": "ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "uri", + "type": "bytes" + } + ], + "name": "checkRegistration", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "contractResolver", + "outputs": [ + { + "internalType": "contract ContractResolver", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "env", + "outputs": [ + { + "internalType": "enum ContractResolver.Env", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "getDomainIdByTokenId", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "uri", + "type": "bytes" + } + ], + "name": "getDomainTokenIdByUri", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "getDomainUri", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "getExpiration", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "id", + "type": "uint64" + } + ], + "name": "getPkpTokenId", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "getRecord", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "hasExpired", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "hasOwner", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "isOwner", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "isRouted", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "userId", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "uri", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "ttl", + "type": "uint256" + } + ], + "name": "registerDomain", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "id", + "type": "uint64" + }, + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "registerPKP", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "removeDomain", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "revokeDomain", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "acct", + "type": "address" + } + ], + "name": "setAdmin", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "record", + "type": "bytes" + } + ], + "name": "updateDomainRecord", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ] +} \ No newline at end of file diff --git a/tools/scripts/lit-contracts/DomainWalletOracle.sol/DomainWalletOracleData.ts b/tools/scripts/lit-contracts/DomainWalletOracle.sol/DomainWalletOracleData.ts new file mode 100644 index 0000000000..4349ce7e37 --- /dev/null +++ b/tools/scripts/lit-contracts/DomainWalletOracle.sol/DomainWalletOracleData.ts @@ -0,0 +1,722 @@ +export const DomainWalletOracleData = { + "date": "2023-09-10T22:33:16.000Z", + "address": "0x9BBDBD163C117fb4e1F9b4F4002bCF53915Dfc40", + "contractName": "DomainWalletOracle", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_contractResolver", + "type": "address" + }, + { + "internalType": "enum ContractResolver.Env", + "name": "_env", + "type": "uint8" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "uri", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "DomainAlreadyRegistered", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "registryAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "NonRegistryCaller", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes", + "name": "subDomain", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "ttl", + "type": "uint256" + } + ], + "name": "Expired", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint64", + "name": "id", + "type": "uint64" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "subDomain", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "ttl", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "Registered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "subDomain", + "type": "bytes" + } + ], + "name": "Removed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "subDomain", + "type": "bytes" + } + ], + "name": "Revoked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "inputs": [], + "name": "ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "uri", + "type": "bytes" + } + ], + "name": "checkRegistration", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "contractResolver", + "outputs": [ + { + "internalType": "contract ContractResolver", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "env", + "outputs": [ + { + "internalType": "enum ContractResolver.Env", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "getDomainIdByTokenId", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "uri", + "type": "bytes" + } + ], + "name": "getDomainTokenIdByUri", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "getDomainUri", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "getExpiration", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "id", + "type": "uint64" + } + ], + "name": "getPkpTokenId", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "getRecord", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "hasExpired", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "hasOwner", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "isOwner", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "isRouted", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "userId", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "uri", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "ttl", + "type": "uint256" + } + ], + "name": "registerDomain", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "id", + "type": "uint64" + }, + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "registerPKP", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "removeDomain", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + } + ], + "name": "revokeDomain", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "acct", + "type": "address" + } + ], + "name": "setAdmin", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pkpTokenId", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "record", + "type": "bytes" + } + ], + "name": "updateDomainRecord", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ] +} \ No newline at end of file diff --git a/tools/scripts/lit-contracts/DomainWalletOracle.sol/common.ts b/tools/scripts/lit-contracts/DomainWalletOracle.sol/common.ts new file mode 100644 index 0000000000..2fc40c7fb1 --- /dev/null +++ b/tools/scripts/lit-contracts/DomainWalletOracle.sol/common.ts @@ -0,0 +1,44 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { Listener } from "@ethersproject/providers"; +import type { Event, EventFilter } from "ethers"; + +export interface TypedEvent< + TArgsArray extends Array = any, + TArgsObject = any +> extends Event { + args: TArgsArray & TArgsObject; +} + +export interface TypedEventFilter<_TEvent extends TypedEvent> + extends EventFilter {} + +export interface TypedListener { + (...listenerArg: [...__TypechainArgsArray, TEvent]): void; +} + +type __TypechainArgsArray = T extends TypedEvent ? U : never; + +export interface OnEvent { + ( + eventFilter: TypedEventFilter, + listener: TypedListener + ): TRes; + (eventName: string, listener: Listener): TRes; +} + +export type MinEthersFactory = { + deploy(...a: ARGS[]): Promise; +}; + +export type GetContractTypeFromFactory = F extends MinEthersFactory< + infer C, + any +> + ? C + : never; + +export type GetARGsTypeFromFactory = F extends MinEthersFactory + ? Parameters + : never; diff --git a/tools/scripts/lit-contracts/DomainWalletOracle.sol/factories/DomainWalletOracle__factory.ts b/tools/scripts/lit-contracts/DomainWalletOracle.sol/factories/DomainWalletOracle__factory.ts new file mode 100644 index 0000000000..19866c8d7b --- /dev/null +++ b/tools/scripts/lit-contracts/DomainWalletOracle.sol/factories/DomainWalletOracle__factory.ts @@ -0,0 +1,741 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Signer, utils } from "ethers"; +import type { Provider } from "@ethersproject/providers"; +import type { + DomainWalletOracle, + DomainWalletOracleInterface, +} from "../DomainWalletOracle"; + +const _abi = [ + { + inputs: [ + { + internalType: "address", + name: "_contractResolver", + type: "address", + }, + { + internalType: "enum ContractResolver.Env", + name: "_env", + type: "uint8", + }, + ], + stateMutability: "nonpayable", + type: "constructor", + }, + { + inputs: [ + { + internalType: "bytes", + name: "uri", + type: "bytes", + }, + { + internalType: "uint256", + name: "pkpTokenId", + type: "uint256", + }, + ], + name: "DomainAlreadyRegistered", + type: "error", + }, + { + inputs: [ + { + internalType: "address", + name: "registryAddress", + type: "address", + }, + { + internalType: "address", + name: "account", + type: "address", + }, + ], + name: "NonRegistryCaller", + type: "error", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "bytes", + name: "subDomain", + type: "bytes", + }, + { + indexed: false, + internalType: "uint256", + name: "tokenId", + type: "uint256", + }, + { + indexed: false, + internalType: "uint256", + name: "ttl", + type: "uint256", + }, + ], + name: "Expired", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint64", + name: "id", + type: "uint64", + }, + { + indexed: false, + internalType: "bytes", + name: "subDomain", + type: "bytes", + }, + { + indexed: false, + internalType: "uint256", + name: "ttl", + type: "uint256", + }, + { + indexed: false, + internalType: "uint256", + name: "tokenId", + type: "uint256", + }, + ], + name: "Registered", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "tokenId", + type: "uint256", + }, + { + indexed: false, + internalType: "bytes", + name: "subDomain", + type: "bytes", + }, + ], + name: "Removed", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "tokenId", + type: "uint256", + }, + { + indexed: false, + internalType: "bytes", + name: "subDomain", + type: "bytes", + }, + ], + name: "Revoked", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "bytes32", + name: "role", + type: "bytes32", + }, + { + indexed: true, + internalType: "bytes32", + name: "previousAdminRole", + type: "bytes32", + }, + { + indexed: true, + internalType: "bytes32", + name: "newAdminRole", + type: "bytes32", + }, + ], + name: "RoleAdminChanged", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "bytes32", + name: "role", + type: "bytes32", + }, + { + indexed: true, + internalType: "address", + name: "account", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "sender", + type: "address", + }, + ], + name: "RoleGranted", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "bytes32", + name: "role", + type: "bytes32", + }, + { + indexed: true, + internalType: "address", + name: "account", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "sender", + type: "address", + }, + ], + name: "RoleRevoked", + type: "event", + }, + { + inputs: [], + name: "ADMIN_ROLE", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "DEFAULT_ADMIN_ROLE", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes", + name: "uri", + type: "bytes", + }, + ], + name: "checkRegistration", + outputs: [], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "contractResolver", + outputs: [ + { + internalType: "contract ContractResolver", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "env", + outputs: [ + { + internalType: "enum ContractResolver.Env", + name: "", + type: "uint8", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "pkpTokenId", + type: "uint256", + }, + ], + name: "getDomainIdByTokenId", + outputs: [ + { + internalType: "uint64", + name: "", + type: "uint64", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes", + name: "uri", + type: "bytes", + }, + ], + name: "getDomainTokenIdByUri", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "pkpTokenId", + type: "uint256", + }, + ], + name: "getDomainUri", + outputs: [ + { + internalType: "bytes", + name: "", + type: "bytes", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "pkpTokenId", + type: "uint256", + }, + ], + name: "getExpiration", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint64", + name: "id", + type: "uint64", + }, + ], + name: "getPkpTokenId", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "pkpTokenId", + type: "uint256", + }, + ], + name: "getRecord", + outputs: [ + { + internalType: "bytes", + name: "", + type: "bytes", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "role", + type: "bytes32", + }, + ], + name: "getRoleAdmin", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "role", + type: "bytes32", + }, + { + internalType: "address", + name: "account", + type: "address", + }, + ], + name: "grantRole", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "pkpTokenId", + type: "uint256", + }, + ], + name: "hasExpired", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "pkpTokenId", + type: "uint256", + }, + ], + name: "hasOwner", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "role", + type: "bytes32", + }, + { + internalType: "address", + name: "account", + type: "address", + }, + ], + name: "hasRole", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "pkpTokenId", + type: "uint256", + }, + ], + name: "isOwner", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "pkpTokenId", + type: "uint256", + }, + ], + name: "isRouted", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes", + name: "userId", + type: "bytes", + }, + { + internalType: "bytes", + name: "uri", + type: "bytes", + }, + { + internalType: "uint256", + name: "pkpTokenId", + type: "uint256", + }, + { + internalType: "uint256", + name: "ttl", + type: "uint256", + }, + ], + name: "registerDomain", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint64", + name: "id", + type: "uint64", + }, + { + internalType: "uint256", + name: "pkpTokenId", + type: "uint256", + }, + ], + name: "registerPKP", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "pkpTokenId", + type: "uint256", + }, + ], + name: "removeDomain", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "role", + type: "bytes32", + }, + { + internalType: "address", + name: "account", + type: "address", + }, + ], + name: "renounceRole", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "pkpTokenId", + type: "uint256", + }, + ], + name: "revokeDomain", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "role", + type: "bytes32", + }, + { + internalType: "address", + name: "account", + type: "address", + }, + ], + name: "revokeRole", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "acct", + type: "address", + }, + ], + name: "setAdmin", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes4", + name: "interfaceId", + type: "bytes4", + }, + ], + name: "supportsInterface", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "pkpTokenId", + type: "uint256", + }, + { + internalType: "bytes", + name: "record", + type: "bytes", + }, + ], + name: "updateDomainRecord", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, +] as const; + +export class DomainWalletOracle__factory { + static readonly abi = _abi; + static createInterface(): DomainWalletOracleInterface { + return new utils.Interface(_abi) as DomainWalletOracleInterface; + } + static connect( + address: string, + signerOrProvider: Signer | Provider + ): DomainWalletOracle { + return new Contract(address, _abi, signerOrProvider) as DomainWalletOracle; + } +} diff --git a/tools/scripts/lit-contracts/DomainWalletOracle.sol/factories/index.ts b/tools/scripts/lit-contracts/DomainWalletOracle.sol/factories/index.ts new file mode 100644 index 0000000000..bff299e868 --- /dev/null +++ b/tools/scripts/lit-contracts/DomainWalletOracle.sol/factories/index.ts @@ -0,0 +1,4 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export { DomainWalletOracle__factory } from "./DomainWalletOracle__factory"; diff --git a/tools/scripts/lit-contracts/DomainWalletOracle.sol/index.js b/tools/scripts/lit-contracts/DomainWalletOracle.sol/index.js new file mode 100644 index 0000000000..08a4721cc7 --- /dev/null +++ b/tools/scripts/lit-contracts/DomainWalletOracle.sol/index.js @@ -0,0 +1,2 @@ +export * from "./DomainWalletOracleData.js"; +export * from "./DomainWalletOracleContract.js"; \ No newline at end of file diff --git a/tools/scripts/lit-contracts/DomainWalletOracle.sol/index.mjs b/tools/scripts/lit-contracts/DomainWalletOracle.sol/index.mjs new file mode 100644 index 0000000000..e3ab0e4f31 --- /dev/null +++ b/tools/scripts/lit-contracts/DomainWalletOracle.sol/index.mjs @@ -0,0 +1,2 @@ +export * from "./DomainWalletOracleData.mjs"; +export * from "./DomainWalletOracleContract.mjs"; \ No newline at end of file diff --git a/tools/scripts/lit-contracts/DomainWalletOracle.sol/index.ts b/tools/scripts/lit-contracts/DomainWalletOracle.sol/index.ts new file mode 100644 index 0000000000..ad74fd9171 --- /dev/null +++ b/tools/scripts/lit-contracts/DomainWalletOracle.sol/index.ts @@ -0,0 +1,3 @@ +export * from "./DomainWalletOracleData"; +export * from "./DomainWalletOracleContract"; +export * from "./DomainWalletOracle"; \ No newline at end of file diff --git a/tools/scripts/lit-contracts/LITToken.sol/LITToken.json b/tools/scripts/lit-contracts/LITToken.sol/LITToken.json new file mode 100644 index 0000000000..2f98eeba38 --- /dev/null +++ b/tools/scripts/lit-contracts/LITToken.sol/LITToken.json @@ -0,0 +1,313 @@ +{ + "date": "2023-09-12T02:27:59.000Z", + "address": "0x53695556f8a1a064EdFf91767f15652BbfaFaD04", + "contractName": "LITToken", + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "src", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "guy", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "wad", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "dst", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "wad", + "type": "uint256" + } + ], + "name": "Deposit", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "src", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "dst", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "wad", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "src", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "wad", + "type": "uint256" + } + ], + "name": "Withdrawal", + "type": "event" + }, + { + "stateMutability": "payable", + "type": "fallback" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "guy", + "type": "address" + }, + { + "internalType": "uint256", + "name": "wad", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "burnFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "deposit", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "dst", + "type": "address" + }, + { + "internalType": "uint256", + "name": "wad", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "src", + "type": "address" + }, + { + "internalType": "address", + "name": "dst", + "type": "address" + }, + { + "internalType": "uint256", + "name": "wad", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "wad", + "type": "uint256" + } + ], + "name": "withdraw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ] +} \ No newline at end of file diff --git a/tools/scripts/lit-contracts/LITToken.sol/LITToken.ts b/tools/scripts/lit-contracts/LITToken.sol/LITToken.ts new file mode 100644 index 0000000000..e3858a633b --- /dev/null +++ b/tools/scripts/lit-contracts/LITToken.sol/LITToken.ts @@ -0,0 +1,488 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumber, + BigNumberish, + BytesLike, + CallOverrides, + ContractTransaction, + Overrides, + PayableOverrides, + PopulatedTransaction, + Signer, + utils, +} from "ethers"; +import type { + FunctionFragment, + Result, + EventFragment, +} from "@ethersproject/abi"; +import type { Listener, Provider } from "@ethersproject/providers"; +import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, +} from "./common"; + +export interface LITTokenInterface extends utils.Interface { + functions: { + "allowance(address,address)": FunctionFragment; + "approve(address,uint256)": FunctionFragment; + "balanceOf(address)": FunctionFragment; + "burnFrom(address,uint256)": FunctionFragment; + "decimals()": FunctionFragment; + "deposit()": FunctionFragment; + "name()": FunctionFragment; + "symbol()": FunctionFragment; + "totalSupply()": FunctionFragment; + "transfer(address,uint256)": FunctionFragment; + "transferFrom(address,address,uint256)": FunctionFragment; + "withdraw(uint256)": FunctionFragment; + }; + + getFunction( + nameOrSignatureOrTopic: + | "allowance" + | "approve" + | "balanceOf" + | "burnFrom" + | "decimals" + | "deposit" + | "name" + | "symbol" + | "totalSupply" + | "transfer" + | "transferFrom" + | "withdraw" + ): FunctionFragment; + + encodeFunctionData( + functionFragment: "allowance", + values: [string, string] + ): string; + encodeFunctionData( + functionFragment: "approve", + values: [string, BigNumberish] + ): string; + encodeFunctionData(functionFragment: "balanceOf", values: [string]): string; + encodeFunctionData( + functionFragment: "burnFrom", + values: [string, BigNumberish] + ): string; + encodeFunctionData(functionFragment: "decimals", values?: undefined): string; + encodeFunctionData(functionFragment: "deposit", values?: undefined): string; + encodeFunctionData(functionFragment: "name", values?: undefined): string; + encodeFunctionData(functionFragment: "symbol", values?: undefined): string; + encodeFunctionData( + functionFragment: "totalSupply", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "transfer", + values: [string, BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "transferFrom", + values: [string, string, BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "withdraw", + values: [BigNumberish] + ): string; + + decodeFunctionResult(functionFragment: "allowance", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "approve", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "balanceOf", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "burnFrom", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "decimals", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "deposit", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "name", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "symbol", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "totalSupply", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "transfer", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "transferFrom", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "withdraw", data: BytesLike): Result; + + events: { + "Approval(address,address,uint256)": EventFragment; + "Deposit(address,uint256)": EventFragment; + "Transfer(address,address,uint256)": EventFragment; + "Withdrawal(address,uint256)": EventFragment; + }; + + getEvent(nameOrSignatureOrTopic: "Approval"): EventFragment; + getEvent(nameOrSignatureOrTopic: "Deposit"): EventFragment; + getEvent(nameOrSignatureOrTopic: "Transfer"): EventFragment; + getEvent(nameOrSignatureOrTopic: "Withdrawal"): EventFragment; +} + +export interface ApprovalEventObject { + src: string; + guy: string; + wad: BigNumber; +} +export type ApprovalEvent = TypedEvent< + [string, string, BigNumber], + ApprovalEventObject +>; + +export type ApprovalEventFilter = TypedEventFilter; + +export interface DepositEventObject { + dst: string; + wad: BigNumber; +} +export type DepositEvent = TypedEvent<[string, BigNumber], DepositEventObject>; + +export type DepositEventFilter = TypedEventFilter; + +export interface TransferEventObject { + src: string; + dst: string; + wad: BigNumber; +} +export type TransferEvent = TypedEvent< + [string, string, BigNumber], + TransferEventObject +>; + +export type TransferEventFilter = TypedEventFilter; + +export interface WithdrawalEventObject { + src: string; + wad: BigNumber; +} +export type WithdrawalEvent = TypedEvent< + [string, BigNumber], + WithdrawalEventObject +>; + +export type WithdrawalEventFilter = TypedEventFilter; + +export interface LITToken extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: LITTokenInterface; + + queryFilter( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>; + + listeners( + eventFilter?: TypedEventFilter + ): Array>; + listeners(eventName?: string): Array; + removeAllListeners( + eventFilter: TypedEventFilter + ): this; + removeAllListeners(eventName?: string): this; + off: OnEvent; + on: OnEvent; + once: OnEvent; + removeListener: OnEvent; + + functions: { + allowance( + arg0: string, + arg1: string, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + approve( + guy: string, + wad: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + balanceOf(arg0: string, overrides?: CallOverrides): Promise<[BigNumber]>; + + burnFrom( + account: string, + amount: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + decimals(overrides?: CallOverrides): Promise<[number]>; + + deposit( + overrides?: PayableOverrides & { from?: string } + ): Promise; + + name(overrides?: CallOverrides): Promise<[string]>; + + symbol(overrides?: CallOverrides): Promise<[string]>; + + totalSupply(overrides?: CallOverrides): Promise<[BigNumber]>; + + transfer( + dst: string, + wad: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + transferFrom( + src: string, + dst: string, + wad: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + withdraw( + wad: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + }; + + allowance( + arg0: string, + arg1: string, + overrides?: CallOverrides + ): Promise; + + approve( + guy: string, + wad: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + balanceOf(arg0: string, overrides?: CallOverrides): Promise; + + burnFrom( + account: string, + amount: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + decimals(overrides?: CallOverrides): Promise; + + deposit( + overrides?: PayableOverrides & { from?: string } + ): Promise; + + name(overrides?: CallOverrides): Promise; + + symbol(overrides?: CallOverrides): Promise; + + totalSupply(overrides?: CallOverrides): Promise; + + transfer( + dst: string, + wad: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + transferFrom( + src: string, + dst: string, + wad: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + withdraw( + wad: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + callStatic: { + allowance( + arg0: string, + arg1: string, + overrides?: CallOverrides + ): Promise; + + approve( + guy: string, + wad: BigNumberish, + overrides?: CallOverrides + ): Promise; + + balanceOf(arg0: string, overrides?: CallOverrides): Promise; + + burnFrom( + account: string, + amount: BigNumberish, + overrides?: CallOverrides + ): Promise; + + decimals(overrides?: CallOverrides): Promise; + + deposit(overrides?: CallOverrides): Promise; + + name(overrides?: CallOverrides): Promise; + + symbol(overrides?: CallOverrides): Promise; + + totalSupply(overrides?: CallOverrides): Promise; + + transfer( + dst: string, + wad: BigNumberish, + overrides?: CallOverrides + ): Promise; + + transferFrom( + src: string, + dst: string, + wad: BigNumberish, + overrides?: CallOverrides + ): Promise; + + withdraw(wad: BigNumberish, overrides?: CallOverrides): Promise; + }; + + filters: { + "Approval(address,address,uint256)"( + src?: string | null, + guy?: string | null, + wad?: null + ): ApprovalEventFilter; + Approval( + src?: string | null, + guy?: string | null, + wad?: null + ): ApprovalEventFilter; + + "Deposit(address,uint256)"( + dst?: string | null, + wad?: null + ): DepositEventFilter; + Deposit(dst?: string | null, wad?: null): DepositEventFilter; + + "Transfer(address,address,uint256)"( + src?: string | null, + dst?: string | null, + wad?: null + ): TransferEventFilter; + Transfer( + src?: string | null, + dst?: string | null, + wad?: null + ): TransferEventFilter; + + "Withdrawal(address,uint256)"( + src?: string | null, + wad?: null + ): WithdrawalEventFilter; + Withdrawal(src?: string | null, wad?: null): WithdrawalEventFilter; + }; + + estimateGas: { + allowance( + arg0: string, + arg1: string, + overrides?: CallOverrides + ): Promise; + + approve( + guy: string, + wad: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + balanceOf(arg0: string, overrides?: CallOverrides): Promise; + + burnFrom( + account: string, + amount: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + decimals(overrides?: CallOverrides): Promise; + + deposit( + overrides?: PayableOverrides & { from?: string } + ): Promise; + + name(overrides?: CallOverrides): Promise; + + symbol(overrides?: CallOverrides): Promise; + + totalSupply(overrides?: CallOverrides): Promise; + + transfer( + dst: string, + wad: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + transferFrom( + src: string, + dst: string, + wad: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + withdraw( + wad: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + }; + + populateTransaction: { + allowance( + arg0: string, + arg1: string, + overrides?: CallOverrides + ): Promise; + + approve( + guy: string, + wad: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + balanceOf( + arg0: string, + overrides?: CallOverrides + ): Promise; + + burnFrom( + account: string, + amount: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + decimals(overrides?: CallOverrides): Promise; + + deposit( + overrides?: PayableOverrides & { from?: string } + ): Promise; + + name(overrides?: CallOverrides): Promise; + + symbol(overrides?: CallOverrides): Promise; + + totalSupply(overrides?: CallOverrides): Promise; + + transfer( + dst: string, + wad: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + transferFrom( + src: string, + dst: string, + wad: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + withdraw( + wad: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + }; +} diff --git a/tools/scripts/lit-contracts/LITToken.sol/LITTokenContract.js b/tools/scripts/lit-contracts/LITToken.sol/LITTokenContract.js new file mode 100644 index 0000000000..1a5bffd3ea --- /dev/null +++ b/tools/scripts/lit-contracts/LITToken.sol/LITTokenContract.js @@ -0,0 +1,8 @@ +import { ethers } from "ethers"; +import { LITTokenData } from "./LITTokenData.js"; + +export const getLITTokenContract = (provider) => new ethers.Contract( + LITTokenData.address, + LITTokenData.abi, + provider +); \ No newline at end of file diff --git a/tools/scripts/lit-contracts/LITToken.sol/LITTokenContract.mjs b/tools/scripts/lit-contracts/LITToken.sol/LITTokenContract.mjs new file mode 100644 index 0000000000..4a43b4e455 --- /dev/null +++ b/tools/scripts/lit-contracts/LITToken.sol/LITTokenContract.mjs @@ -0,0 +1,8 @@ +import { ethers } from "ethers"; +import { LITTokenData } from "./LITTokenData.mjs"; + +export const getLITTokenContract = (provider) => new ethers.Contract( + LITTokenData.address, + LITTokenData.abi, + provider +); \ No newline at end of file diff --git a/tools/scripts/lit-contracts/LITToken.sol/LITTokenContract.ts b/tools/scripts/lit-contracts/LITToken.sol/LITTokenContract.ts new file mode 100644 index 0000000000..e4278b37d4 --- /dev/null +++ b/tools/scripts/lit-contracts/LITToken.sol/LITTokenContract.ts @@ -0,0 +1,11 @@ +import { ethers } from "ethers"; +import { LITTokenData } from "./LITTokenData"; +import { LITToken } from "./LITToken"; + +export const getLITTokenContract = (provider: any) => { + return new ethers.Contract( + LITTokenData.address, + LITTokenData.abi, + provider + ) as unknown as LITToken; +} \ No newline at end of file diff --git a/tools/scripts/lit-contracts/LITToken.sol/LITTokenData.js b/tools/scripts/lit-contracts/LITToken.sol/LITTokenData.js new file mode 100644 index 0000000000..45f0412039 --- /dev/null +++ b/tools/scripts/lit-contracts/LITToken.sol/LITTokenData.js @@ -0,0 +1,313 @@ +export const LITTokenData = { + "date": "2023-09-12T02:27:59.000Z", + "address": "0x53695556f8a1a064EdFf91767f15652BbfaFaD04", + "contractName": "LITToken", + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "src", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "guy", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "wad", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "dst", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "wad", + "type": "uint256" + } + ], + "name": "Deposit", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "src", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "dst", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "wad", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "src", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "wad", + "type": "uint256" + } + ], + "name": "Withdrawal", + "type": "event" + }, + { + "stateMutability": "payable", + "type": "fallback" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "guy", + "type": "address" + }, + { + "internalType": "uint256", + "name": "wad", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "burnFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "deposit", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "dst", + "type": "address" + }, + { + "internalType": "uint256", + "name": "wad", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "src", + "type": "address" + }, + { + "internalType": "address", + "name": "dst", + "type": "address" + }, + { + "internalType": "uint256", + "name": "wad", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "wad", + "type": "uint256" + } + ], + "name": "withdraw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ] +} \ No newline at end of file diff --git a/tools/scripts/lit-contracts/LITToken.sol/LITTokenData.mjs b/tools/scripts/lit-contracts/LITToken.sol/LITTokenData.mjs new file mode 100644 index 0000000000..45f0412039 --- /dev/null +++ b/tools/scripts/lit-contracts/LITToken.sol/LITTokenData.mjs @@ -0,0 +1,313 @@ +export const LITTokenData = { + "date": "2023-09-12T02:27:59.000Z", + "address": "0x53695556f8a1a064EdFf91767f15652BbfaFaD04", + "contractName": "LITToken", + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "src", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "guy", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "wad", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "dst", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "wad", + "type": "uint256" + } + ], + "name": "Deposit", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "src", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "dst", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "wad", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "src", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "wad", + "type": "uint256" + } + ], + "name": "Withdrawal", + "type": "event" + }, + { + "stateMutability": "payable", + "type": "fallback" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "guy", + "type": "address" + }, + { + "internalType": "uint256", + "name": "wad", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "burnFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "deposit", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "dst", + "type": "address" + }, + { + "internalType": "uint256", + "name": "wad", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "src", + "type": "address" + }, + { + "internalType": "address", + "name": "dst", + "type": "address" + }, + { + "internalType": "uint256", + "name": "wad", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "wad", + "type": "uint256" + } + ], + "name": "withdraw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ] +} \ No newline at end of file diff --git a/tools/scripts/lit-contracts/LITToken.sol/LITTokenData.ts b/tools/scripts/lit-contracts/LITToken.sol/LITTokenData.ts new file mode 100644 index 0000000000..45f0412039 --- /dev/null +++ b/tools/scripts/lit-contracts/LITToken.sol/LITTokenData.ts @@ -0,0 +1,313 @@ +export const LITTokenData = { + "date": "2023-09-12T02:27:59.000Z", + "address": "0x53695556f8a1a064EdFf91767f15652BbfaFaD04", + "contractName": "LITToken", + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "src", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "guy", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "wad", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "dst", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "wad", + "type": "uint256" + } + ], + "name": "Deposit", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "src", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "dst", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "wad", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "src", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "wad", + "type": "uint256" + } + ], + "name": "Withdrawal", + "type": "event" + }, + { + "stateMutability": "payable", + "type": "fallback" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "guy", + "type": "address" + }, + { + "internalType": "uint256", + "name": "wad", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "burnFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "deposit", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "dst", + "type": "address" + }, + { + "internalType": "uint256", + "name": "wad", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "src", + "type": "address" + }, + { + "internalType": "address", + "name": "dst", + "type": "address" + }, + { + "internalType": "uint256", + "name": "wad", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "wad", + "type": "uint256" + } + ], + "name": "withdraw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ] +} \ No newline at end of file diff --git a/tools/scripts/lit-contracts/LITToken.sol/common.ts b/tools/scripts/lit-contracts/LITToken.sol/common.ts new file mode 100644 index 0000000000..2fc40c7fb1 --- /dev/null +++ b/tools/scripts/lit-contracts/LITToken.sol/common.ts @@ -0,0 +1,44 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { Listener } from "@ethersproject/providers"; +import type { Event, EventFilter } from "ethers"; + +export interface TypedEvent< + TArgsArray extends Array = any, + TArgsObject = any +> extends Event { + args: TArgsArray & TArgsObject; +} + +export interface TypedEventFilter<_TEvent extends TypedEvent> + extends EventFilter {} + +export interface TypedListener { + (...listenerArg: [...__TypechainArgsArray, TEvent]): void; +} + +type __TypechainArgsArray = T extends TypedEvent ? U : never; + +export interface OnEvent { + ( + eventFilter: TypedEventFilter, + listener: TypedListener + ): TRes; + (eventName: string, listener: Listener): TRes; +} + +export type MinEthersFactory = { + deploy(...a: ARGS[]): Promise; +}; + +export type GetContractTypeFromFactory = F extends MinEthersFactory< + infer C, + any +> + ? C + : never; + +export type GetARGsTypeFromFactory = F extends MinEthersFactory + ? Parameters + : never; diff --git a/tools/scripts/lit-contracts/LITToken.sol/factories/LITToken__factory.ts b/tools/scripts/lit-contracts/LITToken.sol/factories/LITToken__factory.ts new file mode 100644 index 0000000000..487023e0e3 --- /dev/null +++ b/tools/scripts/lit-contracts/LITToken.sol/factories/LITToken__factory.ts @@ -0,0 +1,329 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Signer, utils } from "ethers"; +import type { Provider } from "@ethersproject/providers"; +import type { LITToken, LITTokenInterface } from "../LITToken"; + +const _abi = [ + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "src", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "guy", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "wad", + type: "uint256", + }, + ], + name: "Approval", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "dst", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "wad", + type: "uint256", + }, + ], + name: "Deposit", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "src", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "dst", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "wad", + type: "uint256", + }, + ], + name: "Transfer", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "src", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "wad", + type: "uint256", + }, + ], + name: "Withdrawal", + type: "event", + }, + { + stateMutability: "payable", + type: "fallback", + }, + { + inputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + { + internalType: "address", + name: "", + type: "address", + }, + ], + name: "allowance", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "guy", + type: "address", + }, + { + internalType: "uint256", + name: "wad", + type: "uint256", + }, + ], + name: "approve", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + name: "balanceOf", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "account", + type: "address", + }, + { + internalType: "uint256", + name: "amount", + type: "uint256", + }, + ], + name: "burnFrom", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "decimals", + outputs: [ + { + internalType: "uint8", + name: "", + type: "uint8", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "deposit", + outputs: [], + stateMutability: "payable", + type: "function", + }, + { + inputs: [], + name: "name", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "symbol", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "totalSupply", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "dst", + type: "address", + }, + { + internalType: "uint256", + name: "wad", + type: "uint256", + }, + ], + name: "transfer", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "src", + type: "address", + }, + { + internalType: "address", + name: "dst", + type: "address", + }, + { + internalType: "uint256", + name: "wad", + type: "uint256", + }, + ], + name: "transferFrom", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "wad", + type: "uint256", + }, + ], + name: "withdraw", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + stateMutability: "payable", + type: "receive", + }, +] as const; + +export class LITToken__factory { + static readonly abi = _abi; + static createInterface(): LITTokenInterface { + return new utils.Interface(_abi) as LITTokenInterface; + } + static connect( + address: string, + signerOrProvider: Signer | Provider + ): LITToken { + return new Contract(address, _abi, signerOrProvider) as LITToken; + } +} diff --git a/tools/scripts/lit-contracts/LITToken.sol/factories/index.ts b/tools/scripts/lit-contracts/LITToken.sol/factories/index.ts new file mode 100644 index 0000000000..c0c07c6acb --- /dev/null +++ b/tools/scripts/lit-contracts/LITToken.sol/factories/index.ts @@ -0,0 +1,4 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export { LITToken__factory } from "./LITToken__factory"; diff --git a/tools/scripts/lit-contracts/LITToken.sol/index.js b/tools/scripts/lit-contracts/LITToken.sol/index.js new file mode 100644 index 0000000000..416657aac7 --- /dev/null +++ b/tools/scripts/lit-contracts/LITToken.sol/index.js @@ -0,0 +1,2 @@ +export * from "./LITTokenData.js"; +export * from "./LITTokenContract.js"; \ No newline at end of file diff --git a/tools/scripts/lit-contracts/LITToken.sol/index.mjs b/tools/scripts/lit-contracts/LITToken.sol/index.mjs new file mode 100644 index 0000000000..e5c7b8c133 --- /dev/null +++ b/tools/scripts/lit-contracts/LITToken.sol/index.mjs @@ -0,0 +1,2 @@ +export * from "./LITTokenData.mjs"; +export * from "./LITTokenContract.mjs"; \ No newline at end of file diff --git a/tools/scripts/lit-contracts/LITToken.sol/index.ts b/tools/scripts/lit-contracts/LITToken.sol/index.ts new file mode 100644 index 0000000000..c8277afec5 --- /dev/null +++ b/tools/scripts/lit-contracts/LITToken.sol/index.ts @@ -0,0 +1,3 @@ +export * from "./LITTokenData"; +export * from "./LITTokenContract"; +export * from "./LITToken"; \ No newline at end of file diff --git a/tools/scripts/lit-contracts/Multisender.sol/Multisender.json b/tools/scripts/lit-contracts/Multisender.sol/Multisender.json new file mode 100644 index 0000000000..d67f7c2557 --- /dev/null +++ b/tools/scripts/lit-contracts/Multisender.sol/Multisender.json @@ -0,0 +1,110 @@ +{ + "date": "2023-09-10T22:33:26.000Z", + "address": "0x373195723448308d43a43989790C0b768Ef14853", + "contractName": "Multisender", + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "_recipients", + "type": "address[]" + } + ], + "name": "sendEth", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "_recipients", + "type": "address[]" + }, + { + "internalType": "address", + "name": "tokenContract", + "type": "address" + } + ], + "name": "sendTokens", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "withdraw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "tokenContract", + "type": "address" + } + ], + "name": "withdrawTokens", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ] +} \ No newline at end of file diff --git a/tools/scripts/lit-contracts/Multisender.sol/Multisender.ts b/tools/scripts/lit-contracts/Multisender.sol/Multisender.ts new file mode 100644 index 0000000000..b8f9451d0e --- /dev/null +++ b/tools/scripts/lit-contracts/Multisender.sol/Multisender.ts @@ -0,0 +1,297 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumber, + BytesLike, + CallOverrides, + ContractTransaction, + Overrides, + PayableOverrides, + PopulatedTransaction, + Signer, + utils, +} from "ethers"; +import type { + FunctionFragment, + Result, + EventFragment, +} from "@ethersproject/abi"; +import type { Listener, Provider } from "@ethersproject/providers"; +import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, +} from "./common"; + +export interface MultisenderInterface extends utils.Interface { + functions: { + "owner()": FunctionFragment; + "renounceOwnership()": FunctionFragment; + "sendEth(address[])": FunctionFragment; + "sendTokens(address[],address)": FunctionFragment; + "transferOwnership(address)": FunctionFragment; + "withdraw()": FunctionFragment; + "withdrawTokens(address)": FunctionFragment; + }; + + getFunction( + nameOrSignatureOrTopic: + | "owner" + | "renounceOwnership" + | "sendEth" + | "sendTokens" + | "transferOwnership" + | "withdraw" + | "withdrawTokens" + ): FunctionFragment; + + encodeFunctionData(functionFragment: "owner", values?: undefined): string; + encodeFunctionData( + functionFragment: "renounceOwnership", + values?: undefined + ): string; + encodeFunctionData(functionFragment: "sendEth", values: [string[]]): string; + encodeFunctionData( + functionFragment: "sendTokens", + values: [string[], string] + ): string; + encodeFunctionData( + functionFragment: "transferOwnership", + values: [string] + ): string; + encodeFunctionData(functionFragment: "withdraw", values?: undefined): string; + encodeFunctionData( + functionFragment: "withdrawTokens", + values: [string] + ): string; + + decodeFunctionResult(functionFragment: "owner", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "renounceOwnership", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "sendEth", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "sendTokens", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "transferOwnership", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "withdraw", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "withdrawTokens", + data: BytesLike + ): Result; + + events: { + "OwnershipTransferred(address,address)": EventFragment; + }; + + getEvent(nameOrSignatureOrTopic: "OwnershipTransferred"): EventFragment; +} + +export interface OwnershipTransferredEventObject { + previousOwner: string; + newOwner: string; +} +export type OwnershipTransferredEvent = TypedEvent< + [string, string], + OwnershipTransferredEventObject +>; + +export type OwnershipTransferredEventFilter = + TypedEventFilter; + +export interface Multisender extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: MultisenderInterface; + + queryFilter( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>; + + listeners( + eventFilter?: TypedEventFilter + ): Array>; + listeners(eventName?: string): Array; + removeAllListeners( + eventFilter: TypedEventFilter + ): this; + removeAllListeners(eventName?: string): this; + off: OnEvent; + on: OnEvent; + once: OnEvent; + removeListener: OnEvent; + + functions: { + owner(overrides?: CallOverrides): Promise<[string]>; + + renounceOwnership( + overrides?: Overrides & { from?: string } + ): Promise; + + sendEth( + _recipients: string[], + overrides?: PayableOverrides & { from?: string } + ): Promise; + + sendTokens( + _recipients: string[], + tokenContract: string, + overrides?: Overrides & { from?: string } + ): Promise; + + transferOwnership( + newOwner: string, + overrides?: Overrides & { from?: string } + ): Promise; + + withdraw( + overrides?: Overrides & { from?: string } + ): Promise; + + withdrawTokens( + tokenContract: string, + overrides?: Overrides & { from?: string } + ): Promise; + }; + + owner(overrides?: CallOverrides): Promise; + + renounceOwnership( + overrides?: Overrides & { from?: string } + ): Promise; + + sendEth( + _recipients: string[], + overrides?: PayableOverrides & { from?: string } + ): Promise; + + sendTokens( + _recipients: string[], + tokenContract: string, + overrides?: Overrides & { from?: string } + ): Promise; + + transferOwnership( + newOwner: string, + overrides?: Overrides & { from?: string } + ): Promise; + + withdraw( + overrides?: Overrides & { from?: string } + ): Promise; + + withdrawTokens( + tokenContract: string, + overrides?: Overrides & { from?: string } + ): Promise; + + callStatic: { + owner(overrides?: CallOverrides): Promise; + + renounceOwnership(overrides?: CallOverrides): Promise; + + sendEth(_recipients: string[], overrides?: CallOverrides): Promise; + + sendTokens( + _recipients: string[], + tokenContract: string, + overrides?: CallOverrides + ): Promise; + + transferOwnership( + newOwner: string, + overrides?: CallOverrides + ): Promise; + + withdraw(overrides?: CallOverrides): Promise; + + withdrawTokens( + tokenContract: string, + overrides?: CallOverrides + ): Promise; + }; + + filters: { + "OwnershipTransferred(address,address)"( + previousOwner?: string | null, + newOwner?: string | null + ): OwnershipTransferredEventFilter; + OwnershipTransferred( + previousOwner?: string | null, + newOwner?: string | null + ): OwnershipTransferredEventFilter; + }; + + estimateGas: { + owner(overrides?: CallOverrides): Promise; + + renounceOwnership( + overrides?: Overrides & { from?: string } + ): Promise; + + sendEth( + _recipients: string[], + overrides?: PayableOverrides & { from?: string } + ): Promise; + + sendTokens( + _recipients: string[], + tokenContract: string, + overrides?: Overrides & { from?: string } + ): Promise; + + transferOwnership( + newOwner: string, + overrides?: Overrides & { from?: string } + ): Promise; + + withdraw(overrides?: Overrides & { from?: string }): Promise; + + withdrawTokens( + tokenContract: string, + overrides?: Overrides & { from?: string } + ): Promise; + }; + + populateTransaction: { + owner(overrides?: CallOverrides): Promise; + + renounceOwnership( + overrides?: Overrides & { from?: string } + ): Promise; + + sendEth( + _recipients: string[], + overrides?: PayableOverrides & { from?: string } + ): Promise; + + sendTokens( + _recipients: string[], + tokenContract: string, + overrides?: Overrides & { from?: string } + ): Promise; + + transferOwnership( + newOwner: string, + overrides?: Overrides & { from?: string } + ): Promise; + + withdraw( + overrides?: Overrides & { from?: string } + ): Promise; + + withdrawTokens( + tokenContract: string, + overrides?: Overrides & { from?: string } + ): Promise; + }; +} diff --git a/tools/scripts/lit-contracts/Multisender.sol/MultisenderContract.js b/tools/scripts/lit-contracts/Multisender.sol/MultisenderContract.js new file mode 100644 index 0000000000..ff3869c18f --- /dev/null +++ b/tools/scripts/lit-contracts/Multisender.sol/MultisenderContract.js @@ -0,0 +1,8 @@ +import { ethers } from "ethers"; +import { MultisenderData } from "./MultisenderData.js"; + +export const getMultisenderContract = (provider) => new ethers.Contract( + MultisenderData.address, + MultisenderData.abi, + provider +); \ No newline at end of file diff --git a/tools/scripts/lit-contracts/Multisender.sol/MultisenderContract.mjs b/tools/scripts/lit-contracts/Multisender.sol/MultisenderContract.mjs new file mode 100644 index 0000000000..c492221f3e --- /dev/null +++ b/tools/scripts/lit-contracts/Multisender.sol/MultisenderContract.mjs @@ -0,0 +1,8 @@ +import { ethers } from "ethers"; +import { MultisenderData } from "./MultisenderData.mjs"; + +export const getMultisenderContract = (provider) => new ethers.Contract( + MultisenderData.address, + MultisenderData.abi, + provider +); \ No newline at end of file diff --git a/tools/scripts/lit-contracts/Multisender.sol/MultisenderContract.ts b/tools/scripts/lit-contracts/Multisender.sol/MultisenderContract.ts new file mode 100644 index 0000000000..0c7102ddb7 --- /dev/null +++ b/tools/scripts/lit-contracts/Multisender.sol/MultisenderContract.ts @@ -0,0 +1,11 @@ +import { ethers } from "ethers"; +import { MultisenderData } from "./MultisenderData"; +import { Multisender } from "./Multisender"; + +export const getMultisenderContract = (provider: any) => { + return new ethers.Contract( + MultisenderData.address, + MultisenderData.abi, + provider + ) as unknown as Multisender; +} \ No newline at end of file diff --git a/tools/scripts/lit-contracts/Multisender.sol/MultisenderData.js b/tools/scripts/lit-contracts/Multisender.sol/MultisenderData.js new file mode 100644 index 0000000000..36b8993131 --- /dev/null +++ b/tools/scripts/lit-contracts/Multisender.sol/MultisenderData.js @@ -0,0 +1,110 @@ +export const MultisenderData = { + "date": "2023-09-10T22:33:26.000Z", + "address": "0x373195723448308d43a43989790C0b768Ef14853", + "contractName": "Multisender", + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "_recipients", + "type": "address[]" + } + ], + "name": "sendEth", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "_recipients", + "type": "address[]" + }, + { + "internalType": "address", + "name": "tokenContract", + "type": "address" + } + ], + "name": "sendTokens", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "withdraw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "tokenContract", + "type": "address" + } + ], + "name": "withdrawTokens", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ] +} \ No newline at end of file diff --git a/tools/scripts/lit-contracts/Multisender.sol/MultisenderData.mjs b/tools/scripts/lit-contracts/Multisender.sol/MultisenderData.mjs new file mode 100644 index 0000000000..36b8993131 --- /dev/null +++ b/tools/scripts/lit-contracts/Multisender.sol/MultisenderData.mjs @@ -0,0 +1,110 @@ +export const MultisenderData = { + "date": "2023-09-10T22:33:26.000Z", + "address": "0x373195723448308d43a43989790C0b768Ef14853", + "contractName": "Multisender", + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "_recipients", + "type": "address[]" + } + ], + "name": "sendEth", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "_recipients", + "type": "address[]" + }, + { + "internalType": "address", + "name": "tokenContract", + "type": "address" + } + ], + "name": "sendTokens", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "withdraw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "tokenContract", + "type": "address" + } + ], + "name": "withdrawTokens", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ] +} \ No newline at end of file diff --git a/tools/scripts/lit-contracts/Multisender.sol/MultisenderData.ts b/tools/scripts/lit-contracts/Multisender.sol/MultisenderData.ts new file mode 100644 index 0000000000..36b8993131 --- /dev/null +++ b/tools/scripts/lit-contracts/Multisender.sol/MultisenderData.ts @@ -0,0 +1,110 @@ +export const MultisenderData = { + "date": "2023-09-10T22:33:26.000Z", + "address": "0x373195723448308d43a43989790C0b768Ef14853", + "contractName": "Multisender", + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "_recipients", + "type": "address[]" + } + ], + "name": "sendEth", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "_recipients", + "type": "address[]" + }, + { + "internalType": "address", + "name": "tokenContract", + "type": "address" + } + ], + "name": "sendTokens", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "withdraw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "tokenContract", + "type": "address" + } + ], + "name": "withdrawTokens", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ] +} \ No newline at end of file diff --git a/tools/scripts/lit-contracts/Multisender.sol/common.ts b/tools/scripts/lit-contracts/Multisender.sol/common.ts new file mode 100644 index 0000000000..2fc40c7fb1 --- /dev/null +++ b/tools/scripts/lit-contracts/Multisender.sol/common.ts @@ -0,0 +1,44 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { Listener } from "@ethersproject/providers"; +import type { Event, EventFilter } from "ethers"; + +export interface TypedEvent< + TArgsArray extends Array = any, + TArgsObject = any +> extends Event { + args: TArgsArray & TArgsObject; +} + +export interface TypedEventFilter<_TEvent extends TypedEvent> + extends EventFilter {} + +export interface TypedListener { + (...listenerArg: [...__TypechainArgsArray, TEvent]): void; +} + +type __TypechainArgsArray = T extends TypedEvent ? U : never; + +export interface OnEvent { + ( + eventFilter: TypedEventFilter, + listener: TypedListener + ): TRes; + (eventName: string, listener: Listener): TRes; +} + +export type MinEthersFactory = { + deploy(...a: ARGS[]): Promise; +}; + +export type GetContractTypeFromFactory = F extends MinEthersFactory< + infer C, + any +> + ? C + : never; + +export type GetARGsTypeFromFactory = F extends MinEthersFactory + ? Parameters + : never; diff --git a/tools/scripts/lit-contracts/Multisender.sol/factories/Multisender__factory.ts b/tools/scripts/lit-contracts/Multisender.sol/factories/Multisender__factory.ts new file mode 100644 index 0000000000..f6edb4d797 --- /dev/null +++ b/tools/scripts/lit-contracts/Multisender.sol/factories/Multisender__factory.ts @@ -0,0 +1,126 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Signer, utils } from "ethers"; +import type { Provider } from "@ethersproject/providers"; +import type { Multisender, MultisenderInterface } from "../Multisender"; + +const _abi = [ + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "previousOwner", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "newOwner", + type: "address", + }, + ], + name: "OwnershipTransferred", + type: "event", + }, + { + inputs: [], + name: "owner", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "renounceOwnership", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address[]", + name: "_recipients", + type: "address[]", + }, + ], + name: "sendEth", + outputs: [], + stateMutability: "payable", + type: "function", + }, + { + inputs: [ + { + internalType: "address[]", + name: "_recipients", + type: "address[]", + }, + { + internalType: "address", + name: "tokenContract", + type: "address", + }, + ], + name: "sendTokens", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "newOwner", + type: "address", + }, + ], + name: "transferOwnership", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "withdraw", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "tokenContract", + type: "address", + }, + ], + name: "withdrawTokens", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, +] as const; + +export class Multisender__factory { + static readonly abi = _abi; + static createInterface(): MultisenderInterface { + return new utils.Interface(_abi) as MultisenderInterface; + } + static connect( + address: string, + signerOrProvider: Signer | Provider + ): Multisender { + return new Contract(address, _abi, signerOrProvider) as Multisender; + } +} diff --git a/tools/scripts/lit-contracts/Multisender.sol/factories/index.ts b/tools/scripts/lit-contracts/Multisender.sol/factories/index.ts new file mode 100644 index 0000000000..7da42242e2 --- /dev/null +++ b/tools/scripts/lit-contracts/Multisender.sol/factories/index.ts @@ -0,0 +1,4 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export { Multisender__factory } from "./Multisender__factory"; diff --git a/tools/scripts/lit-contracts/Multisender.sol/index.js b/tools/scripts/lit-contracts/Multisender.sol/index.js new file mode 100644 index 0000000000..6a8254f7fe --- /dev/null +++ b/tools/scripts/lit-contracts/Multisender.sol/index.js @@ -0,0 +1,2 @@ +export * from "./MultisenderData.js"; +export * from "./MultisenderContract.js"; \ No newline at end of file diff --git a/tools/scripts/lit-contracts/Multisender.sol/index.mjs b/tools/scripts/lit-contracts/Multisender.sol/index.mjs new file mode 100644 index 0000000000..cf5e3f7f80 --- /dev/null +++ b/tools/scripts/lit-contracts/Multisender.sol/index.mjs @@ -0,0 +1,2 @@ +export * from "./MultisenderData.mjs"; +export * from "./MultisenderContract.mjs"; \ No newline at end of file diff --git a/tools/scripts/lit-contracts/Multisender.sol/index.ts b/tools/scripts/lit-contracts/Multisender.sol/index.ts new file mode 100644 index 0000000000..0919db0a2a --- /dev/null +++ b/tools/scripts/lit-contracts/Multisender.sol/index.ts @@ -0,0 +1,3 @@ +export * from "./MultisenderData"; +export * from "./MultisenderContract"; +export * from "./Multisender"; \ No newline at end of file diff --git a/tools/scripts/lit-contracts/PKPHelper.sol/PKPHelper.json b/tools/scripts/lit-contracts/PKPHelper.sol/PKPHelper.json new file mode 100644 index 0000000000..87c4bfb1c2 --- /dev/null +++ b/tools/scripts/lit-contracts/PKPHelper.sol/PKPHelper.json @@ -0,0 +1,782 @@ +{ + "date": "2023-09-11T20:23:48.000Z", + "address": "0xA8C519a051b85A2010C498145C698074782AB6DF", + "contractName": "PKPHelper", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_resolver", + "type": "address" + }, + { + "internalType": "enum ContractResolver.Env", + "name": "_env", + "type": "uint8" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "newResolverAddress", + "type": "address" + } + ], + "name": "ContractResolverAddressSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "keyType", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "derivedKeyId", + "type": "bytes32" + }, + { + "components": [ + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + } + ], + "internalType": "struct IPubkeyRouter.Signature[]", + "name": "signatures", + "type": "tuple[]" + }, + { + "internalType": "uint256[]", + "name": "permittedAuthMethodTypes", + "type": "uint256[]" + }, + { + "internalType": "bytes[]", + "name": "permittedAuthMethodIds", + "type": "bytes[]" + }, + { + "internalType": "bytes[]", + "name": "permittedAuthMethodPubkeys", + "type": "bytes[]" + }, + { + "internalType": "uint256[][]", + "name": "permittedAuthMethodScopes", + "type": "uint256[][]" + }, + { + "internalType": "bool", + "name": "addPkpEthAddressAsPermittedAddress", + "type": "bool" + }, + { + "internalType": "bool", + "name": "sendPkpToItself", + "type": "bool" + } + ], + "name": "claimAndMintNextAndAddAuthMethods", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "keyType", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "derivedKeyId", + "type": "bytes32" + }, + { + "components": [ + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + } + ], + "internalType": "struct IPubkeyRouter.Signature[]", + "name": "signatures", + "type": "tuple[]" + }, + { + "internalType": "address[]", + "name": "permittedAddresses", + "type": "address[]" + }, + { + "internalType": "uint256[][]", + "name": "permittedAddressScopes", + "type": "uint256[][]" + }, + { + "internalType": "uint256[]", + "name": "permittedAuthMethodTypes", + "type": "uint256[]" + }, + { + "internalType": "bytes[]", + "name": "permittedAuthMethodIds", + "type": "bytes[]" + }, + { + "internalType": "bytes[]", + "name": "permittedAuthMethodPubkeys", + "type": "bytes[]" + }, + { + "internalType": "uint256[][]", + "name": "permittedAuthMethodScopes", + "type": "uint256[][]" + }, + { + "internalType": "bool", + "name": "addPkpEthAddressAsPermittedAddress", + "type": "bool" + }, + { + "internalType": "bool", + "name": "sendPkpToItself", + "type": "bool" + } + ], + "name": "claimAndMintNextAndAddAuthMethodsWithTypes", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "contractResolver", + "outputs": [ + { + "internalType": "contract ContractResolver", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "env", + "outputs": [ + { + "internalType": "enum ContractResolver.Env", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getDomainWalletRegistry", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPKPNftMetdataAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPkpNftAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPkpPermissionsAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "keyType", + "type": "uint256" + }, + { + "internalType": "uint256[]", + "name": "permittedAuthMethodTypes", + "type": "uint256[]" + }, + { + "internalType": "bytes[]", + "name": "permittedAuthMethodIds", + "type": "bytes[]" + }, + { + "internalType": "bytes[]", + "name": "permittedAuthMethodPubkeys", + "type": "bytes[]" + }, + { + "internalType": "uint256[][]", + "name": "permittedAuthMethodScopes", + "type": "uint256[][]" + }, + { + "internalType": "bool", + "name": "addPkpEthAddressAsPermittedAddress", + "type": "bool" + }, + { + "internalType": "bool", + "name": "sendPkpToItself", + "type": "bool" + } + ], + "name": "mintNextAndAddAuthMethods", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "keyType", + "type": "uint256" + }, + { + "internalType": "bytes[]", + "name": "permittedIpfsCIDs", + "type": "bytes[]" + }, + { + "internalType": "uint256[][]", + "name": "permittedIpfsCIDScopes", + "type": "uint256[][]" + }, + { + "internalType": "address[]", + "name": "permittedAddresses", + "type": "address[]" + }, + { + "internalType": "uint256[][]", + "name": "permittedAddressScopes", + "type": "uint256[][]" + }, + { + "internalType": "uint256[]", + "name": "permittedAuthMethodTypes", + "type": "uint256[]" + }, + { + "internalType": "bytes[]", + "name": "permittedAuthMethodIds", + "type": "bytes[]" + }, + { + "internalType": "bytes[]", + "name": "permittedAuthMethodPubkeys", + "type": "bytes[]" + }, + { + "internalType": "uint256[][]", + "name": "permittedAuthMethodScopes", + "type": "uint256[][]" + }, + { + "internalType": "bool", + "name": "addPkpEthAddressAsPermittedAddress", + "type": "bool" + }, + { + "internalType": "bool", + "name": "sendPkpToItself", + "type": "bool" + } + ], + "name": "mintNextAndAddAuthMethodsWithTypes", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "keyType", + "type": "uint256" + }, + { + "internalType": "uint256[]", + "name": "permittedAuthMethodTypes", + "type": "uint256[]" + }, + { + "internalType": "bytes[]", + "name": "permittedAuthMethodIds", + "type": "bytes[]" + }, + { + "internalType": "bytes[]", + "name": "permittedAuthMethodPubkeys", + "type": "bytes[]" + }, + { + "internalType": "uint256[][]", + "name": "permittedAuthMethodScopes", + "type": "uint256[][]" + }, + { + "internalType": "string[]", + "name": "nftMetadata", + "type": "string[]" + }, + { + "internalType": "bool", + "name": "addPkpEthAddressAsPermittedAddress", + "type": "bool" + }, + { + "internalType": "bool", + "name": "sendPkpToItself", + "type": "bool" + } + ], + "name": "mintNextAndAddDomainWalletMetadata", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "name": "onERC721Received", + "outputs": [ + { + "internalType": "bytes4", + "name": "", + "type": "bytes4" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "removePkpMetadata", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newResolverAddress", + "type": "address" + } + ], + "name": "setContractResolver", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "string[]", + "name": "nftMetadata", + "type": "string[]" + } + ], + "name": "setPkpMetadata", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ] +} \ No newline at end of file diff --git a/tools/scripts/lit-contracts/PKPHelper.sol/PKPHelper.ts b/tools/scripts/lit-contracts/PKPHelper.sol/PKPHelper.ts new file mode 100644 index 0000000000..5f31189b8a --- /dev/null +++ b/tools/scripts/lit-contracts/PKPHelper.sol/PKPHelper.ts @@ -0,0 +1,1231 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumber, + BigNumberish, + BytesLike, + CallOverrides, + ContractTransaction, + Overrides, + PayableOverrides, + PopulatedTransaction, + Signer, + utils, +} from "ethers"; +import type { + FunctionFragment, + Result, + EventFragment, +} from "@ethersproject/abi"; +import type { Listener, Provider } from "@ethersproject/providers"; +import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, +} from "./common"; + +export declare namespace IPubkeyRouter { + export type SignatureStruct = { r: BytesLike; s: BytesLike; v: BigNumberish }; + + export type SignatureStructOutput = [string, string, number] & { + r: string; + s: string; + v: number; + }; +} + +export interface PKPHelperInterface extends utils.Interface { + functions: { + "DEFAULT_ADMIN_ROLE()": FunctionFragment; + "claimAndMintNextAndAddAuthMethods(uint256,bytes32,(bytes32,bytes32,uint8)[],uint256[],bytes[],bytes[],uint256[][],bool,bool)": FunctionFragment; + "claimAndMintNextAndAddAuthMethodsWithTypes(uint256,bytes32,(bytes32,bytes32,uint8)[],address[],uint256[][],uint256[],bytes[],bytes[],uint256[][],bool,bool)": FunctionFragment; + "contractResolver()": FunctionFragment; + "env()": FunctionFragment; + "getDomainWalletRegistry()": FunctionFragment; + "getPKPNftMetdataAddress()": FunctionFragment; + "getPkpNftAddress()": FunctionFragment; + "getPkpPermissionsAddress()": FunctionFragment; + "getRoleAdmin(bytes32)": FunctionFragment; + "grantRole(bytes32,address)": FunctionFragment; + "hasRole(bytes32,address)": FunctionFragment; + "mintNextAndAddAuthMethods(uint256,uint256[],bytes[],bytes[],uint256[][],bool,bool)": FunctionFragment; + "mintNextAndAddAuthMethodsWithTypes(uint256,bytes[],uint256[][],address[],uint256[][],uint256[],bytes[],bytes[],uint256[][],bool,bool)": FunctionFragment; + "mintNextAndAddDomainWalletMetadata(uint256,uint256[],bytes[],bytes[],uint256[][],string[],bool,bool)": FunctionFragment; + "onERC721Received(address,address,uint256,bytes)": FunctionFragment; + "owner()": FunctionFragment; + "removePkpMetadata(uint256)": FunctionFragment; + "renounceOwnership()": FunctionFragment; + "renounceRole(bytes32,address)": FunctionFragment; + "revokeRole(bytes32,address)": FunctionFragment; + "setContractResolver(address)": FunctionFragment; + "setPkpMetadata(uint256,string[])": FunctionFragment; + "supportsInterface(bytes4)": FunctionFragment; + "transferOwnership(address)": FunctionFragment; + }; + + getFunction( + nameOrSignatureOrTopic: + | "DEFAULT_ADMIN_ROLE" + | "claimAndMintNextAndAddAuthMethods" + | "claimAndMintNextAndAddAuthMethodsWithTypes" + | "contractResolver" + | "env" + | "getDomainWalletRegistry" + | "getPKPNftMetdataAddress" + | "getPkpNftAddress" + | "getPkpPermissionsAddress" + | "getRoleAdmin" + | "grantRole" + | "hasRole" + | "mintNextAndAddAuthMethods" + | "mintNextAndAddAuthMethodsWithTypes" + | "mintNextAndAddDomainWalletMetadata" + | "onERC721Received" + | "owner" + | "removePkpMetadata" + | "renounceOwnership" + | "renounceRole" + | "revokeRole" + | "setContractResolver" + | "setPkpMetadata" + | "supportsInterface" + | "transferOwnership" + ): FunctionFragment; + + encodeFunctionData( + functionFragment: "DEFAULT_ADMIN_ROLE", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "claimAndMintNextAndAddAuthMethods", + values: [ + BigNumberish, + BytesLike, + IPubkeyRouter.SignatureStruct[], + BigNumberish[], + BytesLike[], + BytesLike[], + BigNumberish[][], + boolean, + boolean + ] + ): string; + encodeFunctionData( + functionFragment: "claimAndMintNextAndAddAuthMethodsWithTypes", + values: [ + BigNumberish, + BytesLike, + IPubkeyRouter.SignatureStruct[], + string[], + BigNumberish[][], + BigNumberish[], + BytesLike[], + BytesLike[], + BigNumberish[][], + boolean, + boolean + ] + ): string; + encodeFunctionData( + functionFragment: "contractResolver", + values?: undefined + ): string; + encodeFunctionData(functionFragment: "env", values?: undefined): string; + encodeFunctionData( + functionFragment: "getDomainWalletRegistry", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "getPKPNftMetdataAddress", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "getPkpNftAddress", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "getPkpPermissionsAddress", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "getRoleAdmin", + values: [BytesLike] + ): string; + encodeFunctionData( + functionFragment: "grantRole", + values: [BytesLike, string] + ): string; + encodeFunctionData( + functionFragment: "hasRole", + values: [BytesLike, string] + ): string; + encodeFunctionData( + functionFragment: "mintNextAndAddAuthMethods", + values: [ + BigNumberish, + BigNumberish[], + BytesLike[], + BytesLike[], + BigNumberish[][], + boolean, + boolean + ] + ): string; + encodeFunctionData( + functionFragment: "mintNextAndAddAuthMethodsWithTypes", + values: [ + BigNumberish, + BytesLike[], + BigNumberish[][], + string[], + BigNumberish[][], + BigNumberish[], + BytesLike[], + BytesLike[], + BigNumberish[][], + boolean, + boolean + ] + ): string; + encodeFunctionData( + functionFragment: "mintNextAndAddDomainWalletMetadata", + values: [ + BigNumberish, + BigNumberish[], + BytesLike[], + BytesLike[], + BigNumberish[][], + string[], + boolean, + boolean + ] + ): string; + encodeFunctionData( + functionFragment: "onERC721Received", + values: [string, string, BigNumberish, BytesLike] + ): string; + encodeFunctionData(functionFragment: "owner", values?: undefined): string; + encodeFunctionData( + functionFragment: "removePkpMetadata", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "renounceOwnership", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "renounceRole", + values: [BytesLike, string] + ): string; + encodeFunctionData( + functionFragment: "revokeRole", + values: [BytesLike, string] + ): string; + encodeFunctionData( + functionFragment: "setContractResolver", + values: [string] + ): string; + encodeFunctionData( + functionFragment: "setPkpMetadata", + values: [BigNumberish, string[]] + ): string; + encodeFunctionData( + functionFragment: "supportsInterface", + values: [BytesLike] + ): string; + encodeFunctionData( + functionFragment: "transferOwnership", + values: [string] + ): string; + + decodeFunctionResult( + functionFragment: "DEFAULT_ADMIN_ROLE", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "claimAndMintNextAndAddAuthMethods", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "claimAndMintNextAndAddAuthMethodsWithTypes", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "contractResolver", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "env", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "getDomainWalletRegistry", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getPKPNftMetdataAddress", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getPkpNftAddress", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getPkpPermissionsAddress", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getRoleAdmin", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "grantRole", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "hasRole", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "mintNextAndAddAuthMethods", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "mintNextAndAddAuthMethodsWithTypes", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "mintNextAndAddDomainWalletMetadata", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "onERC721Received", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "owner", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "removePkpMetadata", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "renounceOwnership", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "renounceRole", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "revokeRole", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "setContractResolver", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setPkpMetadata", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "supportsInterface", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "transferOwnership", + data: BytesLike + ): Result; + + events: { + "ContractResolverAddressSet(address)": EventFragment; + "OwnershipTransferred(address,address)": EventFragment; + "RoleAdminChanged(bytes32,bytes32,bytes32)": EventFragment; + "RoleGranted(bytes32,address,address)": EventFragment; + "RoleRevoked(bytes32,address,address)": EventFragment; + }; + + getEvent(nameOrSignatureOrTopic: "ContractResolverAddressSet"): EventFragment; + getEvent(nameOrSignatureOrTopic: "OwnershipTransferred"): EventFragment; + getEvent(nameOrSignatureOrTopic: "RoleAdminChanged"): EventFragment; + getEvent(nameOrSignatureOrTopic: "RoleGranted"): EventFragment; + getEvent(nameOrSignatureOrTopic: "RoleRevoked"): EventFragment; +} + +export interface ContractResolverAddressSetEventObject { + newResolverAddress: string; +} +export type ContractResolverAddressSetEvent = TypedEvent< + [string], + ContractResolverAddressSetEventObject +>; + +export type ContractResolverAddressSetEventFilter = + TypedEventFilter; + +export interface OwnershipTransferredEventObject { + previousOwner: string; + newOwner: string; +} +export type OwnershipTransferredEvent = TypedEvent< + [string, string], + OwnershipTransferredEventObject +>; + +export type OwnershipTransferredEventFilter = + TypedEventFilter; + +export interface RoleAdminChangedEventObject { + role: string; + previousAdminRole: string; + newAdminRole: string; +} +export type RoleAdminChangedEvent = TypedEvent< + [string, string, string], + RoleAdminChangedEventObject +>; + +export type RoleAdminChangedEventFilter = + TypedEventFilter; + +export interface RoleGrantedEventObject { + role: string; + account: string; + sender: string; +} +export type RoleGrantedEvent = TypedEvent< + [string, string, string], + RoleGrantedEventObject +>; + +export type RoleGrantedEventFilter = TypedEventFilter; + +export interface RoleRevokedEventObject { + role: string; + account: string; + sender: string; +} +export type RoleRevokedEvent = TypedEvent< + [string, string, string], + RoleRevokedEventObject +>; + +export type RoleRevokedEventFilter = TypedEventFilter; + +export interface PKPHelper extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: PKPHelperInterface; + + queryFilter( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>; + + listeners( + eventFilter?: TypedEventFilter + ): Array>; + listeners(eventName?: string): Array; + removeAllListeners( + eventFilter: TypedEventFilter + ): this; + removeAllListeners(eventName?: string): this; + off: OnEvent; + on: OnEvent; + once: OnEvent; + removeListener: OnEvent; + + functions: { + DEFAULT_ADMIN_ROLE(overrides?: CallOverrides): Promise<[string]>; + + claimAndMintNextAndAddAuthMethods( + keyType: BigNumberish, + derivedKeyId: BytesLike, + signatures: IPubkeyRouter.SignatureStruct[], + permittedAuthMethodTypes: BigNumberish[], + permittedAuthMethodIds: BytesLike[], + permittedAuthMethodPubkeys: BytesLike[], + permittedAuthMethodScopes: BigNumberish[][], + addPkpEthAddressAsPermittedAddress: boolean, + sendPkpToItself: boolean, + overrides?: PayableOverrides & { from?: string } + ): Promise; + + claimAndMintNextAndAddAuthMethodsWithTypes( + keyType: BigNumberish, + derivedKeyId: BytesLike, + signatures: IPubkeyRouter.SignatureStruct[], + permittedAddresses: string[], + permittedAddressScopes: BigNumberish[][], + permittedAuthMethodTypes: BigNumberish[], + permittedAuthMethodIds: BytesLike[], + permittedAuthMethodPubkeys: BytesLike[], + permittedAuthMethodScopes: BigNumberish[][], + addPkpEthAddressAsPermittedAddress: boolean, + sendPkpToItself: boolean, + overrides?: PayableOverrides & { from?: string } + ): Promise; + + contractResolver(overrides?: CallOverrides): Promise<[string]>; + + env(overrides?: CallOverrides): Promise<[number]>; + + getDomainWalletRegistry(overrides?: CallOverrides): Promise<[string]>; + + getPKPNftMetdataAddress(overrides?: CallOverrides): Promise<[string]>; + + getPkpNftAddress(overrides?: CallOverrides): Promise<[string]>; + + getPkpPermissionsAddress(overrides?: CallOverrides): Promise<[string]>; + + getRoleAdmin(role: BytesLike, overrides?: CallOverrides): Promise<[string]>; + + grantRole( + role: BytesLike, + account: string, + overrides?: Overrides & { from?: string } + ): Promise; + + hasRole( + role: BytesLike, + account: string, + overrides?: CallOverrides + ): Promise<[boolean]>; + + mintNextAndAddAuthMethods( + keyType: BigNumberish, + permittedAuthMethodTypes: BigNumberish[], + permittedAuthMethodIds: BytesLike[], + permittedAuthMethodPubkeys: BytesLike[], + permittedAuthMethodScopes: BigNumberish[][], + addPkpEthAddressAsPermittedAddress: boolean, + sendPkpToItself: boolean, + overrides?: PayableOverrides & { from?: string } + ): Promise; + + mintNextAndAddAuthMethodsWithTypes( + keyType: BigNumberish, + permittedIpfsCIDs: BytesLike[], + permittedIpfsCIDScopes: BigNumberish[][], + permittedAddresses: string[], + permittedAddressScopes: BigNumberish[][], + permittedAuthMethodTypes: BigNumberish[], + permittedAuthMethodIds: BytesLike[], + permittedAuthMethodPubkeys: BytesLike[], + permittedAuthMethodScopes: BigNumberish[][], + addPkpEthAddressAsPermittedAddress: boolean, + sendPkpToItself: boolean, + overrides?: PayableOverrides & { from?: string } + ): Promise; + + mintNextAndAddDomainWalletMetadata( + keyType: BigNumberish, + permittedAuthMethodTypes: BigNumberish[], + permittedAuthMethodIds: BytesLike[], + permittedAuthMethodPubkeys: BytesLike[], + permittedAuthMethodScopes: BigNumberish[][], + nftMetadata: string[], + addPkpEthAddressAsPermittedAddress: boolean, + sendPkpToItself: boolean, + overrides?: PayableOverrides & { from?: string } + ): Promise; + + onERC721Received( + arg0: string, + arg1: string, + arg2: BigNumberish, + arg3: BytesLike, + overrides?: CallOverrides + ): Promise<[string]>; + + owner(overrides?: CallOverrides): Promise<[string]>; + + removePkpMetadata( + tokenId: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + renounceOwnership( + overrides?: Overrides & { from?: string } + ): Promise; + + renounceRole( + role: BytesLike, + account: string, + overrides?: Overrides & { from?: string } + ): Promise; + + revokeRole( + role: BytesLike, + account: string, + overrides?: Overrides & { from?: string } + ): Promise; + + setContractResolver( + newResolverAddress: string, + overrides?: Overrides & { from?: string } + ): Promise; + + setPkpMetadata( + tokenId: BigNumberish, + nftMetadata: string[], + overrides?: Overrides & { from?: string } + ): Promise; + + supportsInterface( + interfaceId: BytesLike, + overrides?: CallOverrides + ): Promise<[boolean]>; + + transferOwnership( + newOwner: string, + overrides?: Overrides & { from?: string } + ): Promise; + }; + + DEFAULT_ADMIN_ROLE(overrides?: CallOverrides): Promise; + + claimAndMintNextAndAddAuthMethods( + keyType: BigNumberish, + derivedKeyId: BytesLike, + signatures: IPubkeyRouter.SignatureStruct[], + permittedAuthMethodTypes: BigNumberish[], + permittedAuthMethodIds: BytesLike[], + permittedAuthMethodPubkeys: BytesLike[], + permittedAuthMethodScopes: BigNumberish[][], + addPkpEthAddressAsPermittedAddress: boolean, + sendPkpToItself: boolean, + overrides?: PayableOverrides & { from?: string } + ): Promise; + + claimAndMintNextAndAddAuthMethodsWithTypes( + keyType: BigNumberish, + derivedKeyId: BytesLike, + signatures: IPubkeyRouter.SignatureStruct[], + permittedAddresses: string[], + permittedAddressScopes: BigNumberish[][], + permittedAuthMethodTypes: BigNumberish[], + permittedAuthMethodIds: BytesLike[], + permittedAuthMethodPubkeys: BytesLike[], + permittedAuthMethodScopes: BigNumberish[][], + addPkpEthAddressAsPermittedAddress: boolean, + sendPkpToItself: boolean, + overrides?: PayableOverrides & { from?: string } + ): Promise; + + contractResolver(overrides?: CallOverrides): Promise; + + env(overrides?: CallOverrides): Promise; + + getDomainWalletRegistry(overrides?: CallOverrides): Promise; + + getPKPNftMetdataAddress(overrides?: CallOverrides): Promise; + + getPkpNftAddress(overrides?: CallOverrides): Promise; + + getPkpPermissionsAddress(overrides?: CallOverrides): Promise; + + getRoleAdmin(role: BytesLike, overrides?: CallOverrides): Promise; + + grantRole( + role: BytesLike, + account: string, + overrides?: Overrides & { from?: string } + ): Promise; + + hasRole( + role: BytesLike, + account: string, + overrides?: CallOverrides + ): Promise; + + mintNextAndAddAuthMethods( + keyType: BigNumberish, + permittedAuthMethodTypes: BigNumberish[], + permittedAuthMethodIds: BytesLike[], + permittedAuthMethodPubkeys: BytesLike[], + permittedAuthMethodScopes: BigNumberish[][], + addPkpEthAddressAsPermittedAddress: boolean, + sendPkpToItself: boolean, + overrides?: PayableOverrides & { from?: string } + ): Promise; + + mintNextAndAddAuthMethodsWithTypes( + keyType: BigNumberish, + permittedIpfsCIDs: BytesLike[], + permittedIpfsCIDScopes: BigNumberish[][], + permittedAddresses: string[], + permittedAddressScopes: BigNumberish[][], + permittedAuthMethodTypes: BigNumberish[], + permittedAuthMethodIds: BytesLike[], + permittedAuthMethodPubkeys: BytesLike[], + permittedAuthMethodScopes: BigNumberish[][], + addPkpEthAddressAsPermittedAddress: boolean, + sendPkpToItself: boolean, + overrides?: PayableOverrides & { from?: string } + ): Promise; + + mintNextAndAddDomainWalletMetadata( + keyType: BigNumberish, + permittedAuthMethodTypes: BigNumberish[], + permittedAuthMethodIds: BytesLike[], + permittedAuthMethodPubkeys: BytesLike[], + permittedAuthMethodScopes: BigNumberish[][], + nftMetadata: string[], + addPkpEthAddressAsPermittedAddress: boolean, + sendPkpToItself: boolean, + overrides?: PayableOverrides & { from?: string } + ): Promise; + + onERC721Received( + arg0: string, + arg1: string, + arg2: BigNumberish, + arg3: BytesLike, + overrides?: CallOverrides + ): Promise; + + owner(overrides?: CallOverrides): Promise; + + removePkpMetadata( + tokenId: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + renounceOwnership( + overrides?: Overrides & { from?: string } + ): Promise; + + renounceRole( + role: BytesLike, + account: string, + overrides?: Overrides & { from?: string } + ): Promise; + + revokeRole( + role: BytesLike, + account: string, + overrides?: Overrides & { from?: string } + ): Promise; + + setContractResolver( + newResolverAddress: string, + overrides?: Overrides & { from?: string } + ): Promise; + + setPkpMetadata( + tokenId: BigNumberish, + nftMetadata: string[], + overrides?: Overrides & { from?: string } + ): Promise; + + supportsInterface( + interfaceId: BytesLike, + overrides?: CallOverrides + ): Promise; + + transferOwnership( + newOwner: string, + overrides?: Overrides & { from?: string } + ): Promise; + + callStatic: { + DEFAULT_ADMIN_ROLE(overrides?: CallOverrides): Promise; + + claimAndMintNextAndAddAuthMethods( + keyType: BigNumberish, + derivedKeyId: BytesLike, + signatures: IPubkeyRouter.SignatureStruct[], + permittedAuthMethodTypes: BigNumberish[], + permittedAuthMethodIds: BytesLike[], + permittedAuthMethodPubkeys: BytesLike[], + permittedAuthMethodScopes: BigNumberish[][], + addPkpEthAddressAsPermittedAddress: boolean, + sendPkpToItself: boolean, + overrides?: CallOverrides + ): Promise; + + claimAndMintNextAndAddAuthMethodsWithTypes( + keyType: BigNumberish, + derivedKeyId: BytesLike, + signatures: IPubkeyRouter.SignatureStruct[], + permittedAddresses: string[], + permittedAddressScopes: BigNumberish[][], + permittedAuthMethodTypes: BigNumberish[], + permittedAuthMethodIds: BytesLike[], + permittedAuthMethodPubkeys: BytesLike[], + permittedAuthMethodScopes: BigNumberish[][], + addPkpEthAddressAsPermittedAddress: boolean, + sendPkpToItself: boolean, + overrides?: CallOverrides + ): Promise; + + contractResolver(overrides?: CallOverrides): Promise; + + env(overrides?: CallOverrides): Promise; + + getDomainWalletRegistry(overrides?: CallOverrides): Promise; + + getPKPNftMetdataAddress(overrides?: CallOverrides): Promise; + + getPkpNftAddress(overrides?: CallOverrides): Promise; + + getPkpPermissionsAddress(overrides?: CallOverrides): Promise; + + getRoleAdmin(role: BytesLike, overrides?: CallOverrides): Promise; + + grantRole( + role: BytesLike, + account: string, + overrides?: CallOverrides + ): Promise; + + hasRole( + role: BytesLike, + account: string, + overrides?: CallOverrides + ): Promise; + + mintNextAndAddAuthMethods( + keyType: BigNumberish, + permittedAuthMethodTypes: BigNumberish[], + permittedAuthMethodIds: BytesLike[], + permittedAuthMethodPubkeys: BytesLike[], + permittedAuthMethodScopes: BigNumberish[][], + addPkpEthAddressAsPermittedAddress: boolean, + sendPkpToItself: boolean, + overrides?: CallOverrides + ): Promise; + + mintNextAndAddAuthMethodsWithTypes( + keyType: BigNumberish, + permittedIpfsCIDs: BytesLike[], + permittedIpfsCIDScopes: BigNumberish[][], + permittedAddresses: string[], + permittedAddressScopes: BigNumberish[][], + permittedAuthMethodTypes: BigNumberish[], + permittedAuthMethodIds: BytesLike[], + permittedAuthMethodPubkeys: BytesLike[], + permittedAuthMethodScopes: BigNumberish[][], + addPkpEthAddressAsPermittedAddress: boolean, + sendPkpToItself: boolean, + overrides?: CallOverrides + ): Promise; + + mintNextAndAddDomainWalletMetadata( + keyType: BigNumberish, + permittedAuthMethodTypes: BigNumberish[], + permittedAuthMethodIds: BytesLike[], + permittedAuthMethodPubkeys: BytesLike[], + permittedAuthMethodScopes: BigNumberish[][], + nftMetadata: string[], + addPkpEthAddressAsPermittedAddress: boolean, + sendPkpToItself: boolean, + overrides?: CallOverrides + ): Promise; + + onERC721Received( + arg0: string, + arg1: string, + arg2: BigNumberish, + arg3: BytesLike, + overrides?: CallOverrides + ): Promise; + + owner(overrides?: CallOverrides): Promise; + + removePkpMetadata( + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + renounceOwnership(overrides?: CallOverrides): Promise; + + renounceRole( + role: BytesLike, + account: string, + overrides?: CallOverrides + ): Promise; + + revokeRole( + role: BytesLike, + account: string, + overrides?: CallOverrides + ): Promise; + + setContractResolver( + newResolverAddress: string, + overrides?: CallOverrides + ): Promise; + + setPkpMetadata( + tokenId: BigNumberish, + nftMetadata: string[], + overrides?: CallOverrides + ): Promise; + + supportsInterface( + interfaceId: BytesLike, + overrides?: CallOverrides + ): Promise; + + transferOwnership( + newOwner: string, + overrides?: CallOverrides + ): Promise; + }; + + filters: { + "ContractResolverAddressSet(address)"( + newResolverAddress?: null + ): ContractResolverAddressSetEventFilter; + ContractResolverAddressSet( + newResolverAddress?: null + ): ContractResolverAddressSetEventFilter; + + "OwnershipTransferred(address,address)"( + previousOwner?: string | null, + newOwner?: string | null + ): OwnershipTransferredEventFilter; + OwnershipTransferred( + previousOwner?: string | null, + newOwner?: string | null + ): OwnershipTransferredEventFilter; + + "RoleAdminChanged(bytes32,bytes32,bytes32)"( + role?: BytesLike | null, + previousAdminRole?: BytesLike | null, + newAdminRole?: BytesLike | null + ): RoleAdminChangedEventFilter; + RoleAdminChanged( + role?: BytesLike | null, + previousAdminRole?: BytesLike | null, + newAdminRole?: BytesLike | null + ): RoleAdminChangedEventFilter; + + "RoleGranted(bytes32,address,address)"( + role?: BytesLike | null, + account?: string | null, + sender?: string | null + ): RoleGrantedEventFilter; + RoleGranted( + role?: BytesLike | null, + account?: string | null, + sender?: string | null + ): RoleGrantedEventFilter; + + "RoleRevoked(bytes32,address,address)"( + role?: BytesLike | null, + account?: string | null, + sender?: string | null + ): RoleRevokedEventFilter; + RoleRevoked( + role?: BytesLike | null, + account?: string | null, + sender?: string | null + ): RoleRevokedEventFilter; + }; + + estimateGas: { + DEFAULT_ADMIN_ROLE(overrides?: CallOverrides): Promise; + + claimAndMintNextAndAddAuthMethods( + keyType: BigNumberish, + derivedKeyId: BytesLike, + signatures: IPubkeyRouter.SignatureStruct[], + permittedAuthMethodTypes: BigNumberish[], + permittedAuthMethodIds: BytesLike[], + permittedAuthMethodPubkeys: BytesLike[], + permittedAuthMethodScopes: BigNumberish[][], + addPkpEthAddressAsPermittedAddress: boolean, + sendPkpToItself: boolean, + overrides?: PayableOverrides & { from?: string } + ): Promise; + + claimAndMintNextAndAddAuthMethodsWithTypes( + keyType: BigNumberish, + derivedKeyId: BytesLike, + signatures: IPubkeyRouter.SignatureStruct[], + permittedAddresses: string[], + permittedAddressScopes: BigNumberish[][], + permittedAuthMethodTypes: BigNumberish[], + permittedAuthMethodIds: BytesLike[], + permittedAuthMethodPubkeys: BytesLike[], + permittedAuthMethodScopes: BigNumberish[][], + addPkpEthAddressAsPermittedAddress: boolean, + sendPkpToItself: boolean, + overrides?: PayableOverrides & { from?: string } + ): Promise; + + contractResolver(overrides?: CallOverrides): Promise; + + env(overrides?: CallOverrides): Promise; + + getDomainWalletRegistry(overrides?: CallOverrides): Promise; + + getPKPNftMetdataAddress(overrides?: CallOverrides): Promise; + + getPkpNftAddress(overrides?: CallOverrides): Promise; + + getPkpPermissionsAddress(overrides?: CallOverrides): Promise; + + getRoleAdmin( + role: BytesLike, + overrides?: CallOverrides + ): Promise; + + grantRole( + role: BytesLike, + account: string, + overrides?: Overrides & { from?: string } + ): Promise; + + hasRole( + role: BytesLike, + account: string, + overrides?: CallOverrides + ): Promise; + + mintNextAndAddAuthMethods( + keyType: BigNumberish, + permittedAuthMethodTypes: BigNumberish[], + permittedAuthMethodIds: BytesLike[], + permittedAuthMethodPubkeys: BytesLike[], + permittedAuthMethodScopes: BigNumberish[][], + addPkpEthAddressAsPermittedAddress: boolean, + sendPkpToItself: boolean, + overrides?: PayableOverrides & { from?: string } + ): Promise; + + mintNextAndAddAuthMethodsWithTypes( + keyType: BigNumberish, + permittedIpfsCIDs: BytesLike[], + permittedIpfsCIDScopes: BigNumberish[][], + permittedAddresses: string[], + permittedAddressScopes: BigNumberish[][], + permittedAuthMethodTypes: BigNumberish[], + permittedAuthMethodIds: BytesLike[], + permittedAuthMethodPubkeys: BytesLike[], + permittedAuthMethodScopes: BigNumberish[][], + addPkpEthAddressAsPermittedAddress: boolean, + sendPkpToItself: boolean, + overrides?: PayableOverrides & { from?: string } + ): Promise; + + mintNextAndAddDomainWalletMetadata( + keyType: BigNumberish, + permittedAuthMethodTypes: BigNumberish[], + permittedAuthMethodIds: BytesLike[], + permittedAuthMethodPubkeys: BytesLike[], + permittedAuthMethodScopes: BigNumberish[][], + nftMetadata: string[], + addPkpEthAddressAsPermittedAddress: boolean, + sendPkpToItself: boolean, + overrides?: PayableOverrides & { from?: string } + ): Promise; + + onERC721Received( + arg0: string, + arg1: string, + arg2: BigNumberish, + arg3: BytesLike, + overrides?: CallOverrides + ): Promise; + + owner(overrides?: CallOverrides): Promise; + + removePkpMetadata( + tokenId: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + renounceOwnership( + overrides?: Overrides & { from?: string } + ): Promise; + + renounceRole( + role: BytesLike, + account: string, + overrides?: Overrides & { from?: string } + ): Promise; + + revokeRole( + role: BytesLike, + account: string, + overrides?: Overrides & { from?: string } + ): Promise; + + setContractResolver( + newResolverAddress: string, + overrides?: Overrides & { from?: string } + ): Promise; + + setPkpMetadata( + tokenId: BigNumberish, + nftMetadata: string[], + overrides?: Overrides & { from?: string } + ): Promise; + + supportsInterface( + interfaceId: BytesLike, + overrides?: CallOverrides + ): Promise; + + transferOwnership( + newOwner: string, + overrides?: Overrides & { from?: string } + ): Promise; + }; + + populateTransaction: { + DEFAULT_ADMIN_ROLE( + overrides?: CallOverrides + ): Promise; + + claimAndMintNextAndAddAuthMethods( + keyType: BigNumberish, + derivedKeyId: BytesLike, + signatures: IPubkeyRouter.SignatureStruct[], + permittedAuthMethodTypes: BigNumberish[], + permittedAuthMethodIds: BytesLike[], + permittedAuthMethodPubkeys: BytesLike[], + permittedAuthMethodScopes: BigNumberish[][], + addPkpEthAddressAsPermittedAddress: boolean, + sendPkpToItself: boolean, + overrides?: PayableOverrides & { from?: string } + ): Promise; + + claimAndMintNextAndAddAuthMethodsWithTypes( + keyType: BigNumberish, + derivedKeyId: BytesLike, + signatures: IPubkeyRouter.SignatureStruct[], + permittedAddresses: string[], + permittedAddressScopes: BigNumberish[][], + permittedAuthMethodTypes: BigNumberish[], + permittedAuthMethodIds: BytesLike[], + permittedAuthMethodPubkeys: BytesLike[], + permittedAuthMethodScopes: BigNumberish[][], + addPkpEthAddressAsPermittedAddress: boolean, + sendPkpToItself: boolean, + overrides?: PayableOverrides & { from?: string } + ): Promise; + + contractResolver(overrides?: CallOverrides): Promise; + + env(overrides?: CallOverrides): Promise; + + getDomainWalletRegistry( + overrides?: CallOverrides + ): Promise; + + getPKPNftMetdataAddress( + overrides?: CallOverrides + ): Promise; + + getPkpNftAddress(overrides?: CallOverrides): Promise; + + getPkpPermissionsAddress( + overrides?: CallOverrides + ): Promise; + + getRoleAdmin( + role: BytesLike, + overrides?: CallOverrides + ): Promise; + + grantRole( + role: BytesLike, + account: string, + overrides?: Overrides & { from?: string } + ): Promise; + + hasRole( + role: BytesLike, + account: string, + overrides?: CallOverrides + ): Promise; + + mintNextAndAddAuthMethods( + keyType: BigNumberish, + permittedAuthMethodTypes: BigNumberish[], + permittedAuthMethodIds: BytesLike[], + permittedAuthMethodPubkeys: BytesLike[], + permittedAuthMethodScopes: BigNumberish[][], + addPkpEthAddressAsPermittedAddress: boolean, + sendPkpToItself: boolean, + overrides?: PayableOverrides & { from?: string } + ): Promise; + + mintNextAndAddAuthMethodsWithTypes( + keyType: BigNumberish, + permittedIpfsCIDs: BytesLike[], + permittedIpfsCIDScopes: BigNumberish[][], + permittedAddresses: string[], + permittedAddressScopes: BigNumberish[][], + permittedAuthMethodTypes: BigNumberish[], + permittedAuthMethodIds: BytesLike[], + permittedAuthMethodPubkeys: BytesLike[], + permittedAuthMethodScopes: BigNumberish[][], + addPkpEthAddressAsPermittedAddress: boolean, + sendPkpToItself: boolean, + overrides?: PayableOverrides & { from?: string } + ): Promise; + + mintNextAndAddDomainWalletMetadata( + keyType: BigNumberish, + permittedAuthMethodTypes: BigNumberish[], + permittedAuthMethodIds: BytesLike[], + permittedAuthMethodPubkeys: BytesLike[], + permittedAuthMethodScopes: BigNumberish[][], + nftMetadata: string[], + addPkpEthAddressAsPermittedAddress: boolean, + sendPkpToItself: boolean, + overrides?: PayableOverrides & { from?: string } + ): Promise; + + onERC721Received( + arg0: string, + arg1: string, + arg2: BigNumberish, + arg3: BytesLike, + overrides?: CallOverrides + ): Promise; + + owner(overrides?: CallOverrides): Promise; + + removePkpMetadata( + tokenId: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + renounceOwnership( + overrides?: Overrides & { from?: string } + ): Promise; + + renounceRole( + role: BytesLike, + account: string, + overrides?: Overrides & { from?: string } + ): Promise; + + revokeRole( + role: BytesLike, + account: string, + overrides?: Overrides & { from?: string } + ): Promise; + + setContractResolver( + newResolverAddress: string, + overrides?: Overrides & { from?: string } + ): Promise; + + setPkpMetadata( + tokenId: BigNumberish, + nftMetadata: string[], + overrides?: Overrides & { from?: string } + ): Promise; + + supportsInterface( + interfaceId: BytesLike, + overrides?: CallOverrides + ): Promise; + + transferOwnership( + newOwner: string, + overrides?: Overrides & { from?: string } + ): Promise; + }; +} diff --git a/tools/scripts/lit-contracts/PKPHelper.sol/PKPHelperContract.js b/tools/scripts/lit-contracts/PKPHelper.sol/PKPHelperContract.js new file mode 100644 index 0000000000..2e54877c3f --- /dev/null +++ b/tools/scripts/lit-contracts/PKPHelper.sol/PKPHelperContract.js @@ -0,0 +1,8 @@ +import { ethers } from "ethers"; +import { PKPHelperData } from "./PKPHelperData.js"; + +export const getPKPHelperContract = (provider) => new ethers.Contract( + PKPHelperData.address, + PKPHelperData.abi, + provider +); \ No newline at end of file diff --git a/tools/scripts/lit-contracts/PKPHelper.sol/PKPHelperContract.mjs b/tools/scripts/lit-contracts/PKPHelper.sol/PKPHelperContract.mjs new file mode 100644 index 0000000000..38b77b12c5 --- /dev/null +++ b/tools/scripts/lit-contracts/PKPHelper.sol/PKPHelperContract.mjs @@ -0,0 +1,8 @@ +import { ethers } from "ethers"; +import { PKPHelperData } from "./PKPHelperData.mjs"; + +export const getPKPHelperContract = (provider) => new ethers.Contract( + PKPHelperData.address, + PKPHelperData.abi, + provider +); \ No newline at end of file diff --git a/tools/scripts/lit-contracts/PKPHelper.sol/PKPHelperContract.ts b/tools/scripts/lit-contracts/PKPHelper.sol/PKPHelperContract.ts new file mode 100644 index 0000000000..1b9eec5604 --- /dev/null +++ b/tools/scripts/lit-contracts/PKPHelper.sol/PKPHelperContract.ts @@ -0,0 +1,11 @@ +import { ethers } from "ethers"; +import { PKPHelperData } from "./PKPHelperData"; +import { PKPHelper } from "./PKPHelper"; + +export const getPKPHelperContract = (provider: any) => { + return new ethers.Contract( + PKPHelperData.address, + PKPHelperData.abi, + provider + ) as unknown as PKPHelper; +} \ No newline at end of file diff --git a/tools/scripts/lit-contracts/PKPHelper.sol/PKPHelperData.js b/tools/scripts/lit-contracts/PKPHelper.sol/PKPHelperData.js new file mode 100644 index 0000000000..de9b16e341 --- /dev/null +++ b/tools/scripts/lit-contracts/PKPHelper.sol/PKPHelperData.js @@ -0,0 +1,782 @@ +export const PKPHelperData = { + "date": "2023-09-11T20:23:48.000Z", + "address": "0xA8C519a051b85A2010C498145C698074782AB6DF", + "contractName": "PKPHelper", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_resolver", + "type": "address" + }, + { + "internalType": "enum ContractResolver.Env", + "name": "_env", + "type": "uint8" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "newResolverAddress", + "type": "address" + } + ], + "name": "ContractResolverAddressSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "keyType", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "derivedKeyId", + "type": "bytes32" + }, + { + "components": [ + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + } + ], + "internalType": "struct IPubkeyRouter.Signature[]", + "name": "signatures", + "type": "tuple[]" + }, + { + "internalType": "uint256[]", + "name": "permittedAuthMethodTypes", + "type": "uint256[]" + }, + { + "internalType": "bytes[]", + "name": "permittedAuthMethodIds", + "type": "bytes[]" + }, + { + "internalType": "bytes[]", + "name": "permittedAuthMethodPubkeys", + "type": "bytes[]" + }, + { + "internalType": "uint256[][]", + "name": "permittedAuthMethodScopes", + "type": "uint256[][]" + }, + { + "internalType": "bool", + "name": "addPkpEthAddressAsPermittedAddress", + "type": "bool" + }, + { + "internalType": "bool", + "name": "sendPkpToItself", + "type": "bool" + } + ], + "name": "claimAndMintNextAndAddAuthMethods", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "keyType", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "derivedKeyId", + "type": "bytes32" + }, + { + "components": [ + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + } + ], + "internalType": "struct IPubkeyRouter.Signature[]", + "name": "signatures", + "type": "tuple[]" + }, + { + "internalType": "address[]", + "name": "permittedAddresses", + "type": "address[]" + }, + { + "internalType": "uint256[][]", + "name": "permittedAddressScopes", + "type": "uint256[][]" + }, + { + "internalType": "uint256[]", + "name": "permittedAuthMethodTypes", + "type": "uint256[]" + }, + { + "internalType": "bytes[]", + "name": "permittedAuthMethodIds", + "type": "bytes[]" + }, + { + "internalType": "bytes[]", + "name": "permittedAuthMethodPubkeys", + "type": "bytes[]" + }, + { + "internalType": "uint256[][]", + "name": "permittedAuthMethodScopes", + "type": "uint256[][]" + }, + { + "internalType": "bool", + "name": "addPkpEthAddressAsPermittedAddress", + "type": "bool" + }, + { + "internalType": "bool", + "name": "sendPkpToItself", + "type": "bool" + } + ], + "name": "claimAndMintNextAndAddAuthMethodsWithTypes", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "contractResolver", + "outputs": [ + { + "internalType": "contract ContractResolver", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "env", + "outputs": [ + { + "internalType": "enum ContractResolver.Env", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getDomainWalletRegistry", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPKPNftMetdataAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPkpNftAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPkpPermissionsAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "keyType", + "type": "uint256" + }, + { + "internalType": "uint256[]", + "name": "permittedAuthMethodTypes", + "type": "uint256[]" + }, + { + "internalType": "bytes[]", + "name": "permittedAuthMethodIds", + "type": "bytes[]" + }, + { + "internalType": "bytes[]", + "name": "permittedAuthMethodPubkeys", + "type": "bytes[]" + }, + { + "internalType": "uint256[][]", + "name": "permittedAuthMethodScopes", + "type": "uint256[][]" + }, + { + "internalType": "bool", + "name": "addPkpEthAddressAsPermittedAddress", + "type": "bool" + }, + { + "internalType": "bool", + "name": "sendPkpToItself", + "type": "bool" + } + ], + "name": "mintNextAndAddAuthMethods", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "keyType", + "type": "uint256" + }, + { + "internalType": "bytes[]", + "name": "permittedIpfsCIDs", + "type": "bytes[]" + }, + { + "internalType": "uint256[][]", + "name": "permittedIpfsCIDScopes", + "type": "uint256[][]" + }, + { + "internalType": "address[]", + "name": "permittedAddresses", + "type": "address[]" + }, + { + "internalType": "uint256[][]", + "name": "permittedAddressScopes", + "type": "uint256[][]" + }, + { + "internalType": "uint256[]", + "name": "permittedAuthMethodTypes", + "type": "uint256[]" + }, + { + "internalType": "bytes[]", + "name": "permittedAuthMethodIds", + "type": "bytes[]" + }, + { + "internalType": "bytes[]", + "name": "permittedAuthMethodPubkeys", + "type": "bytes[]" + }, + { + "internalType": "uint256[][]", + "name": "permittedAuthMethodScopes", + "type": "uint256[][]" + }, + { + "internalType": "bool", + "name": "addPkpEthAddressAsPermittedAddress", + "type": "bool" + }, + { + "internalType": "bool", + "name": "sendPkpToItself", + "type": "bool" + } + ], + "name": "mintNextAndAddAuthMethodsWithTypes", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "keyType", + "type": "uint256" + }, + { + "internalType": "uint256[]", + "name": "permittedAuthMethodTypes", + "type": "uint256[]" + }, + { + "internalType": "bytes[]", + "name": "permittedAuthMethodIds", + "type": "bytes[]" + }, + { + "internalType": "bytes[]", + "name": "permittedAuthMethodPubkeys", + "type": "bytes[]" + }, + { + "internalType": "uint256[][]", + "name": "permittedAuthMethodScopes", + "type": "uint256[][]" + }, + { + "internalType": "string[]", + "name": "nftMetadata", + "type": "string[]" + }, + { + "internalType": "bool", + "name": "addPkpEthAddressAsPermittedAddress", + "type": "bool" + }, + { + "internalType": "bool", + "name": "sendPkpToItself", + "type": "bool" + } + ], + "name": "mintNextAndAddDomainWalletMetadata", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "name": "onERC721Received", + "outputs": [ + { + "internalType": "bytes4", + "name": "", + "type": "bytes4" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "removePkpMetadata", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newResolverAddress", + "type": "address" + } + ], + "name": "setContractResolver", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "string[]", + "name": "nftMetadata", + "type": "string[]" + } + ], + "name": "setPkpMetadata", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ] +} \ No newline at end of file diff --git a/tools/scripts/lit-contracts/PKPHelper.sol/PKPHelperData.mjs b/tools/scripts/lit-contracts/PKPHelper.sol/PKPHelperData.mjs new file mode 100644 index 0000000000..de9b16e341 --- /dev/null +++ b/tools/scripts/lit-contracts/PKPHelper.sol/PKPHelperData.mjs @@ -0,0 +1,782 @@ +export const PKPHelperData = { + "date": "2023-09-11T20:23:48.000Z", + "address": "0xA8C519a051b85A2010C498145C698074782AB6DF", + "contractName": "PKPHelper", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_resolver", + "type": "address" + }, + { + "internalType": "enum ContractResolver.Env", + "name": "_env", + "type": "uint8" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "newResolverAddress", + "type": "address" + } + ], + "name": "ContractResolverAddressSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "keyType", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "derivedKeyId", + "type": "bytes32" + }, + { + "components": [ + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + } + ], + "internalType": "struct IPubkeyRouter.Signature[]", + "name": "signatures", + "type": "tuple[]" + }, + { + "internalType": "uint256[]", + "name": "permittedAuthMethodTypes", + "type": "uint256[]" + }, + { + "internalType": "bytes[]", + "name": "permittedAuthMethodIds", + "type": "bytes[]" + }, + { + "internalType": "bytes[]", + "name": "permittedAuthMethodPubkeys", + "type": "bytes[]" + }, + { + "internalType": "uint256[][]", + "name": "permittedAuthMethodScopes", + "type": "uint256[][]" + }, + { + "internalType": "bool", + "name": "addPkpEthAddressAsPermittedAddress", + "type": "bool" + }, + { + "internalType": "bool", + "name": "sendPkpToItself", + "type": "bool" + } + ], + "name": "claimAndMintNextAndAddAuthMethods", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "keyType", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "derivedKeyId", + "type": "bytes32" + }, + { + "components": [ + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + } + ], + "internalType": "struct IPubkeyRouter.Signature[]", + "name": "signatures", + "type": "tuple[]" + }, + { + "internalType": "address[]", + "name": "permittedAddresses", + "type": "address[]" + }, + { + "internalType": "uint256[][]", + "name": "permittedAddressScopes", + "type": "uint256[][]" + }, + { + "internalType": "uint256[]", + "name": "permittedAuthMethodTypes", + "type": "uint256[]" + }, + { + "internalType": "bytes[]", + "name": "permittedAuthMethodIds", + "type": "bytes[]" + }, + { + "internalType": "bytes[]", + "name": "permittedAuthMethodPubkeys", + "type": "bytes[]" + }, + { + "internalType": "uint256[][]", + "name": "permittedAuthMethodScopes", + "type": "uint256[][]" + }, + { + "internalType": "bool", + "name": "addPkpEthAddressAsPermittedAddress", + "type": "bool" + }, + { + "internalType": "bool", + "name": "sendPkpToItself", + "type": "bool" + } + ], + "name": "claimAndMintNextAndAddAuthMethodsWithTypes", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "contractResolver", + "outputs": [ + { + "internalType": "contract ContractResolver", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "env", + "outputs": [ + { + "internalType": "enum ContractResolver.Env", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getDomainWalletRegistry", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPKPNftMetdataAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPkpNftAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPkpPermissionsAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "keyType", + "type": "uint256" + }, + { + "internalType": "uint256[]", + "name": "permittedAuthMethodTypes", + "type": "uint256[]" + }, + { + "internalType": "bytes[]", + "name": "permittedAuthMethodIds", + "type": "bytes[]" + }, + { + "internalType": "bytes[]", + "name": "permittedAuthMethodPubkeys", + "type": "bytes[]" + }, + { + "internalType": "uint256[][]", + "name": "permittedAuthMethodScopes", + "type": "uint256[][]" + }, + { + "internalType": "bool", + "name": "addPkpEthAddressAsPermittedAddress", + "type": "bool" + }, + { + "internalType": "bool", + "name": "sendPkpToItself", + "type": "bool" + } + ], + "name": "mintNextAndAddAuthMethods", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "keyType", + "type": "uint256" + }, + { + "internalType": "bytes[]", + "name": "permittedIpfsCIDs", + "type": "bytes[]" + }, + { + "internalType": "uint256[][]", + "name": "permittedIpfsCIDScopes", + "type": "uint256[][]" + }, + { + "internalType": "address[]", + "name": "permittedAddresses", + "type": "address[]" + }, + { + "internalType": "uint256[][]", + "name": "permittedAddressScopes", + "type": "uint256[][]" + }, + { + "internalType": "uint256[]", + "name": "permittedAuthMethodTypes", + "type": "uint256[]" + }, + { + "internalType": "bytes[]", + "name": "permittedAuthMethodIds", + "type": "bytes[]" + }, + { + "internalType": "bytes[]", + "name": "permittedAuthMethodPubkeys", + "type": "bytes[]" + }, + { + "internalType": "uint256[][]", + "name": "permittedAuthMethodScopes", + "type": "uint256[][]" + }, + { + "internalType": "bool", + "name": "addPkpEthAddressAsPermittedAddress", + "type": "bool" + }, + { + "internalType": "bool", + "name": "sendPkpToItself", + "type": "bool" + } + ], + "name": "mintNextAndAddAuthMethodsWithTypes", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "keyType", + "type": "uint256" + }, + { + "internalType": "uint256[]", + "name": "permittedAuthMethodTypes", + "type": "uint256[]" + }, + { + "internalType": "bytes[]", + "name": "permittedAuthMethodIds", + "type": "bytes[]" + }, + { + "internalType": "bytes[]", + "name": "permittedAuthMethodPubkeys", + "type": "bytes[]" + }, + { + "internalType": "uint256[][]", + "name": "permittedAuthMethodScopes", + "type": "uint256[][]" + }, + { + "internalType": "string[]", + "name": "nftMetadata", + "type": "string[]" + }, + { + "internalType": "bool", + "name": "addPkpEthAddressAsPermittedAddress", + "type": "bool" + }, + { + "internalType": "bool", + "name": "sendPkpToItself", + "type": "bool" + } + ], + "name": "mintNextAndAddDomainWalletMetadata", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "name": "onERC721Received", + "outputs": [ + { + "internalType": "bytes4", + "name": "", + "type": "bytes4" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "removePkpMetadata", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newResolverAddress", + "type": "address" + } + ], + "name": "setContractResolver", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "string[]", + "name": "nftMetadata", + "type": "string[]" + } + ], + "name": "setPkpMetadata", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ] +} \ No newline at end of file diff --git a/tools/scripts/lit-contracts/PKPHelper.sol/PKPHelperData.ts b/tools/scripts/lit-contracts/PKPHelper.sol/PKPHelperData.ts new file mode 100644 index 0000000000..de9b16e341 --- /dev/null +++ b/tools/scripts/lit-contracts/PKPHelper.sol/PKPHelperData.ts @@ -0,0 +1,782 @@ +export const PKPHelperData = { + "date": "2023-09-11T20:23:48.000Z", + "address": "0xA8C519a051b85A2010C498145C698074782AB6DF", + "contractName": "PKPHelper", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_resolver", + "type": "address" + }, + { + "internalType": "enum ContractResolver.Env", + "name": "_env", + "type": "uint8" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "newResolverAddress", + "type": "address" + } + ], + "name": "ContractResolverAddressSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "keyType", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "derivedKeyId", + "type": "bytes32" + }, + { + "components": [ + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + } + ], + "internalType": "struct IPubkeyRouter.Signature[]", + "name": "signatures", + "type": "tuple[]" + }, + { + "internalType": "uint256[]", + "name": "permittedAuthMethodTypes", + "type": "uint256[]" + }, + { + "internalType": "bytes[]", + "name": "permittedAuthMethodIds", + "type": "bytes[]" + }, + { + "internalType": "bytes[]", + "name": "permittedAuthMethodPubkeys", + "type": "bytes[]" + }, + { + "internalType": "uint256[][]", + "name": "permittedAuthMethodScopes", + "type": "uint256[][]" + }, + { + "internalType": "bool", + "name": "addPkpEthAddressAsPermittedAddress", + "type": "bool" + }, + { + "internalType": "bool", + "name": "sendPkpToItself", + "type": "bool" + } + ], + "name": "claimAndMintNextAndAddAuthMethods", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "keyType", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "derivedKeyId", + "type": "bytes32" + }, + { + "components": [ + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + } + ], + "internalType": "struct IPubkeyRouter.Signature[]", + "name": "signatures", + "type": "tuple[]" + }, + { + "internalType": "address[]", + "name": "permittedAddresses", + "type": "address[]" + }, + { + "internalType": "uint256[][]", + "name": "permittedAddressScopes", + "type": "uint256[][]" + }, + { + "internalType": "uint256[]", + "name": "permittedAuthMethodTypes", + "type": "uint256[]" + }, + { + "internalType": "bytes[]", + "name": "permittedAuthMethodIds", + "type": "bytes[]" + }, + { + "internalType": "bytes[]", + "name": "permittedAuthMethodPubkeys", + "type": "bytes[]" + }, + { + "internalType": "uint256[][]", + "name": "permittedAuthMethodScopes", + "type": "uint256[][]" + }, + { + "internalType": "bool", + "name": "addPkpEthAddressAsPermittedAddress", + "type": "bool" + }, + { + "internalType": "bool", + "name": "sendPkpToItself", + "type": "bool" + } + ], + "name": "claimAndMintNextAndAddAuthMethodsWithTypes", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "contractResolver", + "outputs": [ + { + "internalType": "contract ContractResolver", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "env", + "outputs": [ + { + "internalType": "enum ContractResolver.Env", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getDomainWalletRegistry", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPKPNftMetdataAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPkpNftAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPkpPermissionsAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "keyType", + "type": "uint256" + }, + { + "internalType": "uint256[]", + "name": "permittedAuthMethodTypes", + "type": "uint256[]" + }, + { + "internalType": "bytes[]", + "name": "permittedAuthMethodIds", + "type": "bytes[]" + }, + { + "internalType": "bytes[]", + "name": "permittedAuthMethodPubkeys", + "type": "bytes[]" + }, + { + "internalType": "uint256[][]", + "name": "permittedAuthMethodScopes", + "type": "uint256[][]" + }, + { + "internalType": "bool", + "name": "addPkpEthAddressAsPermittedAddress", + "type": "bool" + }, + { + "internalType": "bool", + "name": "sendPkpToItself", + "type": "bool" + } + ], + "name": "mintNextAndAddAuthMethods", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "keyType", + "type": "uint256" + }, + { + "internalType": "bytes[]", + "name": "permittedIpfsCIDs", + "type": "bytes[]" + }, + { + "internalType": "uint256[][]", + "name": "permittedIpfsCIDScopes", + "type": "uint256[][]" + }, + { + "internalType": "address[]", + "name": "permittedAddresses", + "type": "address[]" + }, + { + "internalType": "uint256[][]", + "name": "permittedAddressScopes", + "type": "uint256[][]" + }, + { + "internalType": "uint256[]", + "name": "permittedAuthMethodTypes", + "type": "uint256[]" + }, + { + "internalType": "bytes[]", + "name": "permittedAuthMethodIds", + "type": "bytes[]" + }, + { + "internalType": "bytes[]", + "name": "permittedAuthMethodPubkeys", + "type": "bytes[]" + }, + { + "internalType": "uint256[][]", + "name": "permittedAuthMethodScopes", + "type": "uint256[][]" + }, + { + "internalType": "bool", + "name": "addPkpEthAddressAsPermittedAddress", + "type": "bool" + }, + { + "internalType": "bool", + "name": "sendPkpToItself", + "type": "bool" + } + ], + "name": "mintNextAndAddAuthMethodsWithTypes", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "keyType", + "type": "uint256" + }, + { + "internalType": "uint256[]", + "name": "permittedAuthMethodTypes", + "type": "uint256[]" + }, + { + "internalType": "bytes[]", + "name": "permittedAuthMethodIds", + "type": "bytes[]" + }, + { + "internalType": "bytes[]", + "name": "permittedAuthMethodPubkeys", + "type": "bytes[]" + }, + { + "internalType": "uint256[][]", + "name": "permittedAuthMethodScopes", + "type": "uint256[][]" + }, + { + "internalType": "string[]", + "name": "nftMetadata", + "type": "string[]" + }, + { + "internalType": "bool", + "name": "addPkpEthAddressAsPermittedAddress", + "type": "bool" + }, + { + "internalType": "bool", + "name": "sendPkpToItself", + "type": "bool" + } + ], + "name": "mintNextAndAddDomainWalletMetadata", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "name": "onERC721Received", + "outputs": [ + { + "internalType": "bytes4", + "name": "", + "type": "bytes4" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "removePkpMetadata", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newResolverAddress", + "type": "address" + } + ], + "name": "setContractResolver", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "string[]", + "name": "nftMetadata", + "type": "string[]" + } + ], + "name": "setPkpMetadata", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ] +} \ No newline at end of file diff --git a/tools/scripts/lit-contracts/PKPHelper.sol/common.ts b/tools/scripts/lit-contracts/PKPHelper.sol/common.ts new file mode 100644 index 0000000000..2fc40c7fb1 --- /dev/null +++ b/tools/scripts/lit-contracts/PKPHelper.sol/common.ts @@ -0,0 +1,44 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { Listener } from "@ethersproject/providers"; +import type { Event, EventFilter } from "ethers"; + +export interface TypedEvent< + TArgsArray extends Array = any, + TArgsObject = any +> extends Event { + args: TArgsArray & TArgsObject; +} + +export interface TypedEventFilter<_TEvent extends TypedEvent> + extends EventFilter {} + +export interface TypedListener { + (...listenerArg: [...__TypechainArgsArray, TEvent]): void; +} + +type __TypechainArgsArray = T extends TypedEvent ? U : never; + +export interface OnEvent { + ( + eventFilter: TypedEventFilter, + listener: TypedListener + ): TRes; + (eventName: string, listener: Listener): TRes; +} + +export type MinEthersFactory = { + deploy(...a: ARGS[]): Promise; +}; + +export type GetContractTypeFromFactory = F extends MinEthersFactory< + infer C, + any +> + ? C + : never; + +export type GetARGsTypeFromFactory = F extends MinEthersFactory + ? Parameters + : never; diff --git a/tools/scripts/lit-contracts/PKPHelper.sol/factories/PKPHelper__factory.ts b/tools/scripts/lit-contracts/PKPHelper.sol/factories/PKPHelper__factory.ts new file mode 100644 index 0000000000..dd3882b222 --- /dev/null +++ b/tools/scripts/lit-contracts/PKPHelper.sol/factories/PKPHelper__factory.ts @@ -0,0 +1,798 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Signer, utils } from "ethers"; +import type { Provider } from "@ethersproject/providers"; +import type { PKPHelper, PKPHelperInterface } from "../PKPHelper"; + +const _abi = [ + { + inputs: [ + { + internalType: "address", + name: "_resolver", + type: "address", + }, + { + internalType: "enum ContractResolver.Env", + name: "_env", + type: "uint8", + }, + ], + stateMutability: "nonpayable", + type: "constructor", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "address", + name: "newResolverAddress", + type: "address", + }, + ], + name: "ContractResolverAddressSet", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "previousOwner", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "newOwner", + type: "address", + }, + ], + name: "OwnershipTransferred", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "bytes32", + name: "role", + type: "bytes32", + }, + { + indexed: true, + internalType: "bytes32", + name: "previousAdminRole", + type: "bytes32", + }, + { + indexed: true, + internalType: "bytes32", + name: "newAdminRole", + type: "bytes32", + }, + ], + name: "RoleAdminChanged", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "bytes32", + name: "role", + type: "bytes32", + }, + { + indexed: true, + internalType: "address", + name: "account", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "sender", + type: "address", + }, + ], + name: "RoleGranted", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "bytes32", + name: "role", + type: "bytes32", + }, + { + indexed: true, + internalType: "address", + name: "account", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "sender", + type: "address", + }, + ], + name: "RoleRevoked", + type: "event", + }, + { + inputs: [], + name: "DEFAULT_ADMIN_ROLE", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "keyType", + type: "uint256", + }, + { + internalType: "bytes32", + name: "derivedKeyId", + type: "bytes32", + }, + { + components: [ + { + internalType: "bytes32", + name: "r", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "s", + type: "bytes32", + }, + { + internalType: "uint8", + name: "v", + type: "uint8", + }, + ], + internalType: "struct IPubkeyRouter.Signature[]", + name: "signatures", + type: "tuple[]", + }, + { + internalType: "uint256[]", + name: "permittedAuthMethodTypes", + type: "uint256[]", + }, + { + internalType: "bytes[]", + name: "permittedAuthMethodIds", + type: "bytes[]", + }, + { + internalType: "bytes[]", + name: "permittedAuthMethodPubkeys", + type: "bytes[]", + }, + { + internalType: "uint256[][]", + name: "permittedAuthMethodScopes", + type: "uint256[][]", + }, + { + internalType: "bool", + name: "addPkpEthAddressAsPermittedAddress", + type: "bool", + }, + { + internalType: "bool", + name: "sendPkpToItself", + type: "bool", + }, + ], + name: "claimAndMintNextAndAddAuthMethods", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "payable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "keyType", + type: "uint256", + }, + { + internalType: "bytes32", + name: "derivedKeyId", + type: "bytes32", + }, + { + components: [ + { + internalType: "bytes32", + name: "r", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "s", + type: "bytes32", + }, + { + internalType: "uint8", + name: "v", + type: "uint8", + }, + ], + internalType: "struct IPubkeyRouter.Signature[]", + name: "signatures", + type: "tuple[]", + }, + { + internalType: "address[]", + name: "permittedAddresses", + type: "address[]", + }, + { + internalType: "uint256[][]", + name: "permittedAddressScopes", + type: "uint256[][]", + }, + { + internalType: "uint256[]", + name: "permittedAuthMethodTypes", + type: "uint256[]", + }, + { + internalType: "bytes[]", + name: "permittedAuthMethodIds", + type: "bytes[]", + }, + { + internalType: "bytes[]", + name: "permittedAuthMethodPubkeys", + type: "bytes[]", + }, + { + internalType: "uint256[][]", + name: "permittedAuthMethodScopes", + type: "uint256[][]", + }, + { + internalType: "bool", + name: "addPkpEthAddressAsPermittedAddress", + type: "bool", + }, + { + internalType: "bool", + name: "sendPkpToItself", + type: "bool", + }, + ], + name: "claimAndMintNextAndAddAuthMethodsWithTypes", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "payable", + type: "function", + }, + { + inputs: [], + name: "contractResolver", + outputs: [ + { + internalType: "contract ContractResolver", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "env", + outputs: [ + { + internalType: "enum ContractResolver.Env", + name: "", + type: "uint8", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "getDomainWalletRegistry", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "getPKPNftMetdataAddress", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "getPkpNftAddress", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "getPkpPermissionsAddress", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "role", + type: "bytes32", + }, + ], + name: "getRoleAdmin", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "role", + type: "bytes32", + }, + { + internalType: "address", + name: "account", + type: "address", + }, + ], + name: "grantRole", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "role", + type: "bytes32", + }, + { + internalType: "address", + name: "account", + type: "address", + }, + ], + name: "hasRole", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "keyType", + type: "uint256", + }, + { + internalType: "uint256[]", + name: "permittedAuthMethodTypes", + type: "uint256[]", + }, + { + internalType: "bytes[]", + name: "permittedAuthMethodIds", + type: "bytes[]", + }, + { + internalType: "bytes[]", + name: "permittedAuthMethodPubkeys", + type: "bytes[]", + }, + { + internalType: "uint256[][]", + name: "permittedAuthMethodScopes", + type: "uint256[][]", + }, + { + internalType: "bool", + name: "addPkpEthAddressAsPermittedAddress", + type: "bool", + }, + { + internalType: "bool", + name: "sendPkpToItself", + type: "bool", + }, + ], + name: "mintNextAndAddAuthMethods", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "payable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "keyType", + type: "uint256", + }, + { + internalType: "bytes[]", + name: "permittedIpfsCIDs", + type: "bytes[]", + }, + { + internalType: "uint256[][]", + name: "permittedIpfsCIDScopes", + type: "uint256[][]", + }, + { + internalType: "address[]", + name: "permittedAddresses", + type: "address[]", + }, + { + internalType: "uint256[][]", + name: "permittedAddressScopes", + type: "uint256[][]", + }, + { + internalType: "uint256[]", + name: "permittedAuthMethodTypes", + type: "uint256[]", + }, + { + internalType: "bytes[]", + name: "permittedAuthMethodIds", + type: "bytes[]", + }, + { + internalType: "bytes[]", + name: "permittedAuthMethodPubkeys", + type: "bytes[]", + }, + { + internalType: "uint256[][]", + name: "permittedAuthMethodScopes", + type: "uint256[][]", + }, + { + internalType: "bool", + name: "addPkpEthAddressAsPermittedAddress", + type: "bool", + }, + { + internalType: "bool", + name: "sendPkpToItself", + type: "bool", + }, + ], + name: "mintNextAndAddAuthMethodsWithTypes", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "payable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "keyType", + type: "uint256", + }, + { + internalType: "uint256[]", + name: "permittedAuthMethodTypes", + type: "uint256[]", + }, + { + internalType: "bytes[]", + name: "permittedAuthMethodIds", + type: "bytes[]", + }, + { + internalType: "bytes[]", + name: "permittedAuthMethodPubkeys", + type: "bytes[]", + }, + { + internalType: "uint256[][]", + name: "permittedAuthMethodScopes", + type: "uint256[][]", + }, + { + internalType: "string[]", + name: "nftMetadata", + type: "string[]", + }, + { + internalType: "bool", + name: "addPkpEthAddressAsPermittedAddress", + type: "bool", + }, + { + internalType: "bool", + name: "sendPkpToItself", + type: "bool", + }, + ], + name: "mintNextAndAddDomainWalletMetadata", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "payable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + { + internalType: "address", + name: "", + type: "address", + }, + { + internalType: "uint256", + name: "", + type: "uint256", + }, + { + internalType: "bytes", + name: "", + type: "bytes", + }, + ], + name: "onERC721Received", + outputs: [ + { + internalType: "bytes4", + name: "", + type: "bytes4", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "owner", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "tokenId", + type: "uint256", + }, + ], + name: "removePkpMetadata", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "renounceOwnership", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "role", + type: "bytes32", + }, + { + internalType: "address", + name: "account", + type: "address", + }, + ], + name: "renounceRole", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "role", + type: "bytes32", + }, + { + internalType: "address", + name: "account", + type: "address", + }, + ], + name: "revokeRole", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "newResolverAddress", + type: "address", + }, + ], + name: "setContractResolver", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "tokenId", + type: "uint256", + }, + { + internalType: "string[]", + name: "nftMetadata", + type: "string[]", + }, + ], + name: "setPkpMetadata", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes4", + name: "interfaceId", + type: "bytes4", + }, + ], + name: "supportsInterface", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "newOwner", + type: "address", + }, + ], + name: "transferOwnership", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, +] as const; + +export class PKPHelper__factory { + static readonly abi = _abi; + static createInterface(): PKPHelperInterface { + return new utils.Interface(_abi) as PKPHelperInterface; + } + static connect( + address: string, + signerOrProvider: Signer | Provider + ): PKPHelper { + return new Contract(address, _abi, signerOrProvider) as PKPHelper; + } +} diff --git a/tools/scripts/lit-contracts/PKPHelper.sol/factories/index.ts b/tools/scripts/lit-contracts/PKPHelper.sol/factories/index.ts new file mode 100644 index 0000000000..2001431a27 --- /dev/null +++ b/tools/scripts/lit-contracts/PKPHelper.sol/factories/index.ts @@ -0,0 +1,4 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export { PKPHelper__factory } from "./PKPHelper__factory"; diff --git a/tools/scripts/lit-contracts/PKPHelper.sol/index.js b/tools/scripts/lit-contracts/PKPHelper.sol/index.js new file mode 100644 index 0000000000..32a8d8a06a --- /dev/null +++ b/tools/scripts/lit-contracts/PKPHelper.sol/index.js @@ -0,0 +1,2 @@ +export * from "./PKPHelperData.js"; +export * from "./PKPHelperContract.js"; \ No newline at end of file diff --git a/tools/scripts/lit-contracts/PKPHelper.sol/index.mjs b/tools/scripts/lit-contracts/PKPHelper.sol/index.mjs new file mode 100644 index 0000000000..7305ad388e --- /dev/null +++ b/tools/scripts/lit-contracts/PKPHelper.sol/index.mjs @@ -0,0 +1,2 @@ +export * from "./PKPHelperData.mjs"; +export * from "./PKPHelperContract.mjs"; \ No newline at end of file diff --git a/tools/scripts/lit-contracts/PKPHelper.sol/index.ts b/tools/scripts/lit-contracts/PKPHelper.sol/index.ts new file mode 100644 index 0000000000..b8f59423a9 --- /dev/null +++ b/tools/scripts/lit-contracts/PKPHelper.sol/index.ts @@ -0,0 +1,3 @@ +export * from "./PKPHelperData"; +export * from "./PKPHelperContract"; +export * from "./PKPHelper"; \ No newline at end of file diff --git a/tools/scripts/lit-contracts/PKPNFT.sol/PKPNFT.json b/tools/scripts/lit-contracts/PKPNFT.sol/PKPNFT.json new file mode 100644 index 0000000000..8d5264b8fa --- /dev/null +++ b/tools/scripts/lit-contracts/PKPNFT.sol/PKPNFT.json @@ -0,0 +1,892 @@ +{ + "date": "2023-09-12T16:11:57.000Z", + "address": "0xBBaa35e9b4a38c8f639d25f49c529967Ffeb0C06", + "contractName": "PKPNFT", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "resolverAddress", + "type": "address" + }, + { + "internalType": "enum ContractResolver.Env", + "name": "_env", + "type": "uint8" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "approved", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "approved", + "type": "bool" + } + ], + "name": "ApprovalForAll", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "newResolverAddress", + "type": "address" + } + ], + "name": "ContractResolverAddressSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "newFreeMintSigner", + "type": "address" + } + ], + "name": "FreeMintSignerSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "newMintCost", + "type": "uint256" + } + ], + "name": "MintCostSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "pubkey", + "type": "bytes" + } + ], + "name": "PKPMinted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Withdrew", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "burn", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "keyType", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "derivedKeyId", + "type": "bytes32" + }, + { + "components": [ + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + } + ], + "internalType": "struct IPubkeyRouter.Signature[]", + "name": "signatures", + "type": "tuple[]" + } + ], + "name": "claimAndMint", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "contractResolver", + "outputs": [ + { + "internalType": "contract ContractResolver", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "env", + "outputs": [ + { + "internalType": "enum ContractResolver.Env", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "exists", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "freeMintSigner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "getApproved", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "getEthAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getNextDerivedKeyId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPkpNftMetadataAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPkpPermissionsAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "getPubkey", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getRouterAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getStakingAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "operator", + "type": "address" + } + ], + "name": "isApprovedForAll", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "mintCost", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "keyType", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "ipfsCID", + "type": "bytes" + } + ], + "name": "mintGrantAndBurnNext", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "keyType", + "type": "uint256" + } + ], + "name": "mintNext", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "ownerOf", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "hash", + "type": "bytes32" + } + ], + "name": "prefixed", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "redeemedFreeMintIds", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "safeTransferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "safeTransferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "internalType": "bool", + "name": "approved", + "type": "bool" + } + ], + "name": "setApprovalForAll", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newResolverAddress", + "type": "address" + } + ], + "name": "setContractResolver", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newFreeMintSigner", + "type": "address" + } + ], + "name": "setFreeMintSigner", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newMintCost", + "type": "uint256" + } + ], + "name": "setMintCost", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "tokenByIndex", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "tokenOfOwnerByIndex", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "tokenURI", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "withdraw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ] +} \ No newline at end of file diff --git a/tools/scripts/lit-contracts/PKPNFT.sol/PKPNFT.ts b/tools/scripts/lit-contracts/PKPNFT.sol/PKPNFT.ts new file mode 100644 index 0000000000..d68f71b52c --- /dev/null +++ b/tools/scripts/lit-contracts/PKPNFT.sol/PKPNFT.ts @@ -0,0 +1,1454 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumber, + BigNumberish, + BytesLike, + CallOverrides, + ContractTransaction, + Overrides, + PayableOverrides, + PopulatedTransaction, + Signer, + utils, +} from "ethers"; +import type { + FunctionFragment, + Result, + EventFragment, +} from "@ethersproject/abi"; +import type { Listener, Provider } from "@ethersproject/providers"; +import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, +} from "./common"; + +export declare namespace IPubkeyRouter { + export type SignatureStruct = { r: BytesLike; s: BytesLike; v: BigNumberish }; + + export type SignatureStructOutput = [string, string, number] & { + r: string; + s: string; + v: number; + }; +} + +export interface PKPNFTInterface extends utils.Interface { + functions: { + "approve(address,uint256)": FunctionFragment; + "balanceOf(address)": FunctionFragment; + "burn(uint256)": FunctionFragment; + "claimAndMint(uint256,bytes32,(bytes32,bytes32,uint8)[])": FunctionFragment; + "contractResolver()": FunctionFragment; + "env()": FunctionFragment; + "exists(uint256)": FunctionFragment; + "freeMintSigner()": FunctionFragment; + "getApproved(uint256)": FunctionFragment; + "getEthAddress(uint256)": FunctionFragment; + "getNextDerivedKeyId()": FunctionFragment; + "getPkpNftMetadataAddress()": FunctionFragment; + "getPkpPermissionsAddress()": FunctionFragment; + "getPubkey(uint256)": FunctionFragment; + "getRouterAddress()": FunctionFragment; + "getStakingAddress()": FunctionFragment; + "isApprovedForAll(address,address)": FunctionFragment; + "mintCost()": FunctionFragment; + "mintGrantAndBurnNext(uint256,bytes)": FunctionFragment; + "mintNext(uint256)": FunctionFragment; + "name()": FunctionFragment; + "owner()": FunctionFragment; + "ownerOf(uint256)": FunctionFragment; + "prefixed(bytes32)": FunctionFragment; + "redeemedFreeMintIds(uint256)": FunctionFragment; + "renounceOwnership()": FunctionFragment; + "safeTransferFrom(address,address,uint256)": FunctionFragment; + "safeTransferFrom(address,address,uint256,bytes)": FunctionFragment; + "setApprovalForAll(address,bool)": FunctionFragment; + "setContractResolver(address)": FunctionFragment; + "setFreeMintSigner(address)": FunctionFragment; + "setMintCost(uint256)": FunctionFragment; + "supportsInterface(bytes4)": FunctionFragment; + "symbol()": FunctionFragment; + "tokenByIndex(uint256)": FunctionFragment; + "tokenOfOwnerByIndex(address,uint256)": FunctionFragment; + "tokenURI(uint256)": FunctionFragment; + "totalSupply()": FunctionFragment; + "transferFrom(address,address,uint256)": FunctionFragment; + "transferOwnership(address)": FunctionFragment; + "withdraw()": FunctionFragment; + }; + + getFunction( + nameOrSignatureOrTopic: + | "approve" + | "balanceOf" + | "burn" + | "claimAndMint" + | "contractResolver" + | "env" + | "exists" + | "freeMintSigner" + | "getApproved" + | "getEthAddress" + | "getNextDerivedKeyId" + | "getPkpNftMetadataAddress" + | "getPkpPermissionsAddress" + | "getPubkey" + | "getRouterAddress" + | "getStakingAddress" + | "isApprovedForAll" + | "mintCost" + | "mintGrantAndBurnNext" + | "mintNext" + | "name" + | "owner" + | "ownerOf" + | "prefixed" + | "redeemedFreeMintIds" + | "renounceOwnership" + | "safeTransferFrom(address,address,uint256)" + | "safeTransferFrom(address,address,uint256,bytes)" + | "setApprovalForAll" + | "setContractResolver" + | "setFreeMintSigner" + | "setMintCost" + | "supportsInterface" + | "symbol" + | "tokenByIndex" + | "tokenOfOwnerByIndex" + | "tokenURI" + | "totalSupply" + | "transferFrom" + | "transferOwnership" + | "withdraw" + ): FunctionFragment; + + encodeFunctionData( + functionFragment: "approve", + values: [string, BigNumberish] + ): string; + encodeFunctionData(functionFragment: "balanceOf", values: [string]): string; + encodeFunctionData(functionFragment: "burn", values: [BigNumberish]): string; + encodeFunctionData( + functionFragment: "claimAndMint", + values: [BigNumberish, BytesLike, IPubkeyRouter.SignatureStruct[]] + ): string; + encodeFunctionData( + functionFragment: "contractResolver", + values?: undefined + ): string; + encodeFunctionData(functionFragment: "env", values?: undefined): string; + encodeFunctionData( + functionFragment: "exists", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "freeMintSigner", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "getApproved", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "getEthAddress", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "getNextDerivedKeyId", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "getPkpNftMetadataAddress", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "getPkpPermissionsAddress", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "getPubkey", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "getRouterAddress", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "getStakingAddress", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "isApprovedForAll", + values: [string, string] + ): string; + encodeFunctionData(functionFragment: "mintCost", values?: undefined): string; + encodeFunctionData( + functionFragment: "mintGrantAndBurnNext", + values: [BigNumberish, BytesLike] + ): string; + encodeFunctionData( + functionFragment: "mintNext", + values: [BigNumberish] + ): string; + encodeFunctionData(functionFragment: "name", values?: undefined): string; + encodeFunctionData(functionFragment: "owner", values?: undefined): string; + encodeFunctionData( + functionFragment: "ownerOf", + values: [BigNumberish] + ): string; + encodeFunctionData(functionFragment: "prefixed", values: [BytesLike]): string; + encodeFunctionData( + functionFragment: "redeemedFreeMintIds", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "renounceOwnership", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "safeTransferFrom(address,address,uint256)", + values: [string, string, BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "safeTransferFrom(address,address,uint256,bytes)", + values: [string, string, BigNumberish, BytesLike] + ): string; + encodeFunctionData( + functionFragment: "setApprovalForAll", + values: [string, boolean] + ): string; + encodeFunctionData( + functionFragment: "setContractResolver", + values: [string] + ): string; + encodeFunctionData( + functionFragment: "setFreeMintSigner", + values: [string] + ): string; + encodeFunctionData( + functionFragment: "setMintCost", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "supportsInterface", + values: [BytesLike] + ): string; + encodeFunctionData(functionFragment: "symbol", values?: undefined): string; + encodeFunctionData( + functionFragment: "tokenByIndex", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "tokenOfOwnerByIndex", + values: [string, BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "tokenURI", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "totalSupply", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "transferFrom", + values: [string, string, BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "transferOwnership", + values: [string] + ): string; + encodeFunctionData(functionFragment: "withdraw", values?: undefined): string; + + decodeFunctionResult(functionFragment: "approve", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "balanceOf", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "burn", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "claimAndMint", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "contractResolver", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "env", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "exists", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "freeMintSigner", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getApproved", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getEthAddress", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getNextDerivedKeyId", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getPkpNftMetadataAddress", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getPkpPermissionsAddress", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "getPubkey", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "getRouterAddress", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getStakingAddress", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "isApprovedForAll", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "mintCost", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "mintGrantAndBurnNext", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "mintNext", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "name", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "owner", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "ownerOf", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "prefixed", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "redeemedFreeMintIds", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "renounceOwnership", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "safeTransferFrom(address,address,uint256)", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "safeTransferFrom(address,address,uint256,bytes)", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setApprovalForAll", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setContractResolver", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setFreeMintSigner", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setMintCost", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "supportsInterface", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "symbol", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "tokenByIndex", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "tokenOfOwnerByIndex", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "tokenURI", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "totalSupply", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "transferFrom", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "transferOwnership", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "withdraw", data: BytesLike): Result; + + events: { + "Approval(address,address,uint256)": EventFragment; + "ApprovalForAll(address,address,bool)": EventFragment; + "ContractResolverAddressSet(address)": EventFragment; + "FreeMintSignerSet(address)": EventFragment; + "MintCostSet(uint256)": EventFragment; + "OwnershipTransferred(address,address)": EventFragment; + "PKPMinted(uint256,bytes)": EventFragment; + "Transfer(address,address,uint256)": EventFragment; + "Withdrew(uint256)": EventFragment; + }; + + getEvent(nameOrSignatureOrTopic: "Approval"): EventFragment; + getEvent(nameOrSignatureOrTopic: "ApprovalForAll"): EventFragment; + getEvent(nameOrSignatureOrTopic: "ContractResolverAddressSet"): EventFragment; + getEvent(nameOrSignatureOrTopic: "FreeMintSignerSet"): EventFragment; + getEvent(nameOrSignatureOrTopic: "MintCostSet"): EventFragment; + getEvent(nameOrSignatureOrTopic: "OwnershipTransferred"): EventFragment; + getEvent(nameOrSignatureOrTopic: "PKPMinted"): EventFragment; + getEvent(nameOrSignatureOrTopic: "Transfer"): EventFragment; + getEvent(nameOrSignatureOrTopic: "Withdrew"): EventFragment; +} + +export interface ApprovalEventObject { + owner: string; + approved: string; + tokenId: BigNumber; +} +export type ApprovalEvent = TypedEvent< + [string, string, BigNumber], + ApprovalEventObject +>; + +export type ApprovalEventFilter = TypedEventFilter; + +export interface ApprovalForAllEventObject { + owner: string; + operator: string; + approved: boolean; +} +export type ApprovalForAllEvent = TypedEvent< + [string, string, boolean], + ApprovalForAllEventObject +>; + +export type ApprovalForAllEventFilter = TypedEventFilter; + +export interface ContractResolverAddressSetEventObject { + newResolverAddress: string; +} +export type ContractResolverAddressSetEvent = TypedEvent< + [string], + ContractResolverAddressSetEventObject +>; + +export type ContractResolverAddressSetEventFilter = + TypedEventFilter; + +export interface FreeMintSignerSetEventObject { + newFreeMintSigner: string; +} +export type FreeMintSignerSetEvent = TypedEvent< + [string], + FreeMintSignerSetEventObject +>; + +export type FreeMintSignerSetEventFilter = + TypedEventFilter; + +export interface MintCostSetEventObject { + newMintCost: BigNumber; +} +export type MintCostSetEvent = TypedEvent<[BigNumber], MintCostSetEventObject>; + +export type MintCostSetEventFilter = TypedEventFilter; + +export interface OwnershipTransferredEventObject { + previousOwner: string; + newOwner: string; +} +export type OwnershipTransferredEvent = TypedEvent< + [string, string], + OwnershipTransferredEventObject +>; + +export type OwnershipTransferredEventFilter = + TypedEventFilter; + +export interface PKPMintedEventObject { + tokenId: BigNumber; + pubkey: string; +} +export type PKPMintedEvent = TypedEvent< + [BigNumber, string], + PKPMintedEventObject +>; + +export type PKPMintedEventFilter = TypedEventFilter; + +export interface TransferEventObject { + from: string; + to: string; + tokenId: BigNumber; +} +export type TransferEvent = TypedEvent< + [string, string, BigNumber], + TransferEventObject +>; + +export type TransferEventFilter = TypedEventFilter; + +export interface WithdrewEventObject { + amount: BigNumber; +} +export type WithdrewEvent = TypedEvent<[BigNumber], WithdrewEventObject>; + +export type WithdrewEventFilter = TypedEventFilter; + +export interface PKPNFT extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: PKPNFTInterface; + + queryFilter( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>; + + listeners( + eventFilter?: TypedEventFilter + ): Array>; + listeners(eventName?: string): Array; + removeAllListeners( + eventFilter: TypedEventFilter + ): this; + removeAllListeners(eventName?: string): this; + off: OnEvent; + on: OnEvent; + once: OnEvent; + removeListener: OnEvent; + + functions: { + approve( + to: string, + tokenId: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + balanceOf(owner: string, overrides?: CallOverrides): Promise<[BigNumber]>; + + burn( + tokenId: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + claimAndMint( + keyType: BigNumberish, + derivedKeyId: BytesLike, + signatures: IPubkeyRouter.SignatureStruct[], + overrides?: PayableOverrides & { from?: string } + ): Promise; + + contractResolver(overrides?: CallOverrides): Promise<[string]>; + + env(overrides?: CallOverrides): Promise<[number]>; + + exists( + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise<[boolean]>; + + freeMintSigner(overrides?: CallOverrides): Promise<[string]>; + + getApproved( + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise<[string]>; + + getEthAddress( + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise<[string]>; + + getNextDerivedKeyId(overrides?: CallOverrides): Promise<[string]>; + + getPkpNftMetadataAddress(overrides?: CallOverrides): Promise<[string]>; + + getPkpPermissionsAddress(overrides?: CallOverrides): Promise<[string]>; + + getPubkey( + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise<[string]>; + + getRouterAddress(overrides?: CallOverrides): Promise<[string]>; + + getStakingAddress(overrides?: CallOverrides): Promise<[string]>; + + isApprovedForAll( + owner: string, + operator: string, + overrides?: CallOverrides + ): Promise<[boolean]>; + + mintCost(overrides?: CallOverrides): Promise<[BigNumber]>; + + mintGrantAndBurnNext( + keyType: BigNumberish, + ipfsCID: BytesLike, + overrides?: PayableOverrides & { from?: string } + ): Promise; + + mintNext( + keyType: BigNumberish, + overrides?: PayableOverrides & { from?: string } + ): Promise; + + name(overrides?: CallOverrides): Promise<[string]>; + + owner(overrides?: CallOverrides): Promise<[string]>; + + ownerOf( + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise<[string]>; + + prefixed(hash: BytesLike, overrides?: CallOverrides): Promise<[string]>; + + redeemedFreeMintIds( + arg0: BigNumberish, + overrides?: CallOverrides + ): Promise<[boolean]>; + + renounceOwnership( + overrides?: Overrides & { from?: string } + ): Promise; + + "safeTransferFrom(address,address,uint256)"( + from: string, + to: string, + tokenId: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + "safeTransferFrom(address,address,uint256,bytes)"( + from: string, + to: string, + tokenId: BigNumberish, + data: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + + setApprovalForAll( + operator: string, + approved: boolean, + overrides?: Overrides & { from?: string } + ): Promise; + + setContractResolver( + newResolverAddress: string, + overrides?: Overrides & { from?: string } + ): Promise; + + setFreeMintSigner( + newFreeMintSigner: string, + overrides?: Overrides & { from?: string } + ): Promise; + + setMintCost( + newMintCost: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + supportsInterface( + interfaceId: BytesLike, + overrides?: CallOverrides + ): Promise<[boolean]>; + + symbol(overrides?: CallOverrides): Promise<[string]>; + + tokenByIndex( + index: BigNumberish, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + tokenOfOwnerByIndex( + owner: string, + index: BigNumberish, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + tokenURI( + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise<[string]>; + + totalSupply(overrides?: CallOverrides): Promise<[BigNumber]>; + + transferFrom( + from: string, + to: string, + tokenId: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + transferOwnership( + newOwner: string, + overrides?: Overrides & { from?: string } + ): Promise; + + withdraw( + overrides?: Overrides & { from?: string } + ): Promise; + }; + + approve( + to: string, + tokenId: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + balanceOf(owner: string, overrides?: CallOverrides): Promise; + + burn( + tokenId: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + claimAndMint( + keyType: BigNumberish, + derivedKeyId: BytesLike, + signatures: IPubkeyRouter.SignatureStruct[], + overrides?: PayableOverrides & { from?: string } + ): Promise; + + contractResolver(overrides?: CallOverrides): Promise; + + env(overrides?: CallOverrides): Promise; + + exists(tokenId: BigNumberish, overrides?: CallOverrides): Promise; + + freeMintSigner(overrides?: CallOverrides): Promise; + + getApproved( + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getEthAddress( + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getNextDerivedKeyId(overrides?: CallOverrides): Promise; + + getPkpNftMetadataAddress(overrides?: CallOverrides): Promise; + + getPkpPermissionsAddress(overrides?: CallOverrides): Promise; + + getPubkey(tokenId: BigNumberish, overrides?: CallOverrides): Promise; + + getRouterAddress(overrides?: CallOverrides): Promise; + + getStakingAddress(overrides?: CallOverrides): Promise; + + isApprovedForAll( + owner: string, + operator: string, + overrides?: CallOverrides + ): Promise; + + mintCost(overrides?: CallOverrides): Promise; + + mintGrantAndBurnNext( + keyType: BigNumberish, + ipfsCID: BytesLike, + overrides?: PayableOverrides & { from?: string } + ): Promise; + + mintNext( + keyType: BigNumberish, + overrides?: PayableOverrides & { from?: string } + ): Promise; + + name(overrides?: CallOverrides): Promise; + + owner(overrides?: CallOverrides): Promise; + + ownerOf(tokenId: BigNumberish, overrides?: CallOverrides): Promise; + + prefixed(hash: BytesLike, overrides?: CallOverrides): Promise; + + redeemedFreeMintIds( + arg0: BigNumberish, + overrides?: CallOverrides + ): Promise; + + renounceOwnership( + overrides?: Overrides & { from?: string } + ): Promise; + + "safeTransferFrom(address,address,uint256)"( + from: string, + to: string, + tokenId: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + "safeTransferFrom(address,address,uint256,bytes)"( + from: string, + to: string, + tokenId: BigNumberish, + data: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + + setApprovalForAll( + operator: string, + approved: boolean, + overrides?: Overrides & { from?: string } + ): Promise; + + setContractResolver( + newResolverAddress: string, + overrides?: Overrides & { from?: string } + ): Promise; + + setFreeMintSigner( + newFreeMintSigner: string, + overrides?: Overrides & { from?: string } + ): Promise; + + setMintCost( + newMintCost: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + supportsInterface( + interfaceId: BytesLike, + overrides?: CallOverrides + ): Promise; + + symbol(overrides?: CallOverrides): Promise; + + tokenByIndex( + index: BigNumberish, + overrides?: CallOverrides + ): Promise; + + tokenOfOwnerByIndex( + owner: string, + index: BigNumberish, + overrides?: CallOverrides + ): Promise; + + tokenURI(tokenId: BigNumberish, overrides?: CallOverrides): Promise; + + totalSupply(overrides?: CallOverrides): Promise; + + transferFrom( + from: string, + to: string, + tokenId: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + transferOwnership( + newOwner: string, + overrides?: Overrides & { from?: string } + ): Promise; + + withdraw( + overrides?: Overrides & { from?: string } + ): Promise; + + callStatic: { + approve( + to: string, + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + balanceOf(owner: string, overrides?: CallOverrides): Promise; + + burn(tokenId: BigNumberish, overrides?: CallOverrides): Promise; + + claimAndMint( + keyType: BigNumberish, + derivedKeyId: BytesLike, + signatures: IPubkeyRouter.SignatureStruct[], + overrides?: CallOverrides + ): Promise; + + contractResolver(overrides?: CallOverrides): Promise; + + env(overrides?: CallOverrides): Promise; + + exists(tokenId: BigNumberish, overrides?: CallOverrides): Promise; + + freeMintSigner(overrides?: CallOverrides): Promise; + + getApproved( + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getEthAddress( + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getNextDerivedKeyId(overrides?: CallOverrides): Promise; + + getPkpNftMetadataAddress(overrides?: CallOverrides): Promise; + + getPkpPermissionsAddress(overrides?: CallOverrides): Promise; + + getPubkey( + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getRouterAddress(overrides?: CallOverrides): Promise; + + getStakingAddress(overrides?: CallOverrides): Promise; + + isApprovedForAll( + owner: string, + operator: string, + overrides?: CallOverrides + ): Promise; + + mintCost(overrides?: CallOverrides): Promise; + + mintGrantAndBurnNext( + keyType: BigNumberish, + ipfsCID: BytesLike, + overrides?: CallOverrides + ): Promise; + + mintNext( + keyType: BigNumberish, + overrides?: CallOverrides + ): Promise; + + name(overrides?: CallOverrides): Promise; + + owner(overrides?: CallOverrides): Promise; + + ownerOf(tokenId: BigNumberish, overrides?: CallOverrides): Promise; + + prefixed(hash: BytesLike, overrides?: CallOverrides): Promise; + + redeemedFreeMintIds( + arg0: BigNumberish, + overrides?: CallOverrides + ): Promise; + + renounceOwnership(overrides?: CallOverrides): Promise; + + "safeTransferFrom(address,address,uint256)"( + from: string, + to: string, + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + "safeTransferFrom(address,address,uint256,bytes)"( + from: string, + to: string, + tokenId: BigNumberish, + data: BytesLike, + overrides?: CallOverrides + ): Promise; + + setApprovalForAll( + operator: string, + approved: boolean, + overrides?: CallOverrides + ): Promise; + + setContractResolver( + newResolverAddress: string, + overrides?: CallOverrides + ): Promise; + + setFreeMintSigner( + newFreeMintSigner: string, + overrides?: CallOverrides + ): Promise; + + setMintCost( + newMintCost: BigNumberish, + overrides?: CallOverrides + ): Promise; + + supportsInterface( + interfaceId: BytesLike, + overrides?: CallOverrides + ): Promise; + + symbol(overrides?: CallOverrides): Promise; + + tokenByIndex( + index: BigNumberish, + overrides?: CallOverrides + ): Promise; + + tokenOfOwnerByIndex( + owner: string, + index: BigNumberish, + overrides?: CallOverrides + ): Promise; + + tokenURI(tokenId: BigNumberish, overrides?: CallOverrides): Promise; + + totalSupply(overrides?: CallOverrides): Promise; + + transferFrom( + from: string, + to: string, + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + transferOwnership( + newOwner: string, + overrides?: CallOverrides + ): Promise; + + withdraw(overrides?: CallOverrides): Promise; + }; + + filters: { + "Approval(address,address,uint256)"( + owner?: string | null, + approved?: string | null, + tokenId?: BigNumberish | null + ): ApprovalEventFilter; + Approval( + owner?: string | null, + approved?: string | null, + tokenId?: BigNumberish | null + ): ApprovalEventFilter; + + "ApprovalForAll(address,address,bool)"( + owner?: string | null, + operator?: string | null, + approved?: null + ): ApprovalForAllEventFilter; + ApprovalForAll( + owner?: string | null, + operator?: string | null, + approved?: null + ): ApprovalForAllEventFilter; + + "ContractResolverAddressSet(address)"( + newResolverAddress?: null + ): ContractResolverAddressSetEventFilter; + ContractResolverAddressSet( + newResolverAddress?: null + ): ContractResolverAddressSetEventFilter; + + "FreeMintSignerSet(address)"( + newFreeMintSigner?: string | null + ): FreeMintSignerSetEventFilter; + FreeMintSignerSet( + newFreeMintSigner?: string | null + ): FreeMintSignerSetEventFilter; + + "MintCostSet(uint256)"(newMintCost?: null): MintCostSetEventFilter; + MintCostSet(newMintCost?: null): MintCostSetEventFilter; + + "OwnershipTransferred(address,address)"( + previousOwner?: string | null, + newOwner?: string | null + ): OwnershipTransferredEventFilter; + OwnershipTransferred( + previousOwner?: string | null, + newOwner?: string | null + ): OwnershipTransferredEventFilter; + + "PKPMinted(uint256,bytes)"( + tokenId?: BigNumberish | null, + pubkey?: null + ): PKPMintedEventFilter; + PKPMinted( + tokenId?: BigNumberish | null, + pubkey?: null + ): PKPMintedEventFilter; + + "Transfer(address,address,uint256)"( + from?: string | null, + to?: string | null, + tokenId?: BigNumberish | null + ): TransferEventFilter; + Transfer( + from?: string | null, + to?: string | null, + tokenId?: BigNumberish | null + ): TransferEventFilter; + + "Withdrew(uint256)"(amount?: null): WithdrewEventFilter; + Withdrew(amount?: null): WithdrewEventFilter; + }; + + estimateGas: { + approve( + to: string, + tokenId: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + balanceOf(owner: string, overrides?: CallOverrides): Promise; + + burn( + tokenId: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + claimAndMint( + keyType: BigNumberish, + derivedKeyId: BytesLike, + signatures: IPubkeyRouter.SignatureStruct[], + overrides?: PayableOverrides & { from?: string } + ): Promise; + + contractResolver(overrides?: CallOverrides): Promise; + + env(overrides?: CallOverrides): Promise; + + exists( + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + freeMintSigner(overrides?: CallOverrides): Promise; + + getApproved( + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getEthAddress( + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getNextDerivedKeyId(overrides?: CallOverrides): Promise; + + getPkpNftMetadataAddress(overrides?: CallOverrides): Promise; + + getPkpPermissionsAddress(overrides?: CallOverrides): Promise; + + getPubkey( + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getRouterAddress(overrides?: CallOverrides): Promise; + + getStakingAddress(overrides?: CallOverrides): Promise; + + isApprovedForAll( + owner: string, + operator: string, + overrides?: CallOverrides + ): Promise; + + mintCost(overrides?: CallOverrides): Promise; + + mintGrantAndBurnNext( + keyType: BigNumberish, + ipfsCID: BytesLike, + overrides?: PayableOverrides & { from?: string } + ): Promise; + + mintNext( + keyType: BigNumberish, + overrides?: PayableOverrides & { from?: string } + ): Promise; + + name(overrides?: CallOverrides): Promise; + + owner(overrides?: CallOverrides): Promise; + + ownerOf( + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + prefixed(hash: BytesLike, overrides?: CallOverrides): Promise; + + redeemedFreeMintIds( + arg0: BigNumberish, + overrides?: CallOverrides + ): Promise; + + renounceOwnership( + overrides?: Overrides & { from?: string } + ): Promise; + + "safeTransferFrom(address,address,uint256)"( + from: string, + to: string, + tokenId: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + "safeTransferFrom(address,address,uint256,bytes)"( + from: string, + to: string, + tokenId: BigNumberish, + data: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + + setApprovalForAll( + operator: string, + approved: boolean, + overrides?: Overrides & { from?: string } + ): Promise; + + setContractResolver( + newResolverAddress: string, + overrides?: Overrides & { from?: string } + ): Promise; + + setFreeMintSigner( + newFreeMintSigner: string, + overrides?: Overrides & { from?: string } + ): Promise; + + setMintCost( + newMintCost: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + supportsInterface( + interfaceId: BytesLike, + overrides?: CallOverrides + ): Promise; + + symbol(overrides?: CallOverrides): Promise; + + tokenByIndex( + index: BigNumberish, + overrides?: CallOverrides + ): Promise; + + tokenOfOwnerByIndex( + owner: string, + index: BigNumberish, + overrides?: CallOverrides + ): Promise; + + tokenURI( + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + totalSupply(overrides?: CallOverrides): Promise; + + transferFrom( + from: string, + to: string, + tokenId: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + transferOwnership( + newOwner: string, + overrides?: Overrides & { from?: string } + ): Promise; + + withdraw(overrides?: Overrides & { from?: string }): Promise; + }; + + populateTransaction: { + approve( + to: string, + tokenId: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + balanceOf( + owner: string, + overrides?: CallOverrides + ): Promise; + + burn( + tokenId: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + claimAndMint( + keyType: BigNumberish, + derivedKeyId: BytesLike, + signatures: IPubkeyRouter.SignatureStruct[], + overrides?: PayableOverrides & { from?: string } + ): Promise; + + contractResolver(overrides?: CallOverrides): Promise; + + env(overrides?: CallOverrides): Promise; + + exists( + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + freeMintSigner(overrides?: CallOverrides): Promise; + + getApproved( + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getEthAddress( + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getNextDerivedKeyId( + overrides?: CallOverrides + ): Promise; + + getPkpNftMetadataAddress( + overrides?: CallOverrides + ): Promise; + + getPkpPermissionsAddress( + overrides?: CallOverrides + ): Promise; + + getPubkey( + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getRouterAddress(overrides?: CallOverrides): Promise; + + getStakingAddress(overrides?: CallOverrides): Promise; + + isApprovedForAll( + owner: string, + operator: string, + overrides?: CallOverrides + ): Promise; + + mintCost(overrides?: CallOverrides): Promise; + + mintGrantAndBurnNext( + keyType: BigNumberish, + ipfsCID: BytesLike, + overrides?: PayableOverrides & { from?: string } + ): Promise; + + mintNext( + keyType: BigNumberish, + overrides?: PayableOverrides & { from?: string } + ): Promise; + + name(overrides?: CallOverrides): Promise; + + owner(overrides?: CallOverrides): Promise; + + ownerOf( + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + prefixed( + hash: BytesLike, + overrides?: CallOverrides + ): Promise; + + redeemedFreeMintIds( + arg0: BigNumberish, + overrides?: CallOverrides + ): Promise; + + renounceOwnership( + overrides?: Overrides & { from?: string } + ): Promise; + + "safeTransferFrom(address,address,uint256)"( + from: string, + to: string, + tokenId: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + "safeTransferFrom(address,address,uint256,bytes)"( + from: string, + to: string, + tokenId: BigNumberish, + data: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + + setApprovalForAll( + operator: string, + approved: boolean, + overrides?: Overrides & { from?: string } + ): Promise; + + setContractResolver( + newResolverAddress: string, + overrides?: Overrides & { from?: string } + ): Promise; + + setFreeMintSigner( + newFreeMintSigner: string, + overrides?: Overrides & { from?: string } + ): Promise; + + setMintCost( + newMintCost: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + supportsInterface( + interfaceId: BytesLike, + overrides?: CallOverrides + ): Promise; + + symbol(overrides?: CallOverrides): Promise; + + tokenByIndex( + index: BigNumberish, + overrides?: CallOverrides + ): Promise; + + tokenOfOwnerByIndex( + owner: string, + index: BigNumberish, + overrides?: CallOverrides + ): Promise; + + tokenURI( + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + totalSupply(overrides?: CallOverrides): Promise; + + transferFrom( + from: string, + to: string, + tokenId: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + transferOwnership( + newOwner: string, + overrides?: Overrides & { from?: string } + ): Promise; + + withdraw( + overrides?: Overrides & { from?: string } + ): Promise; + }; +} diff --git a/tools/scripts/lit-contracts/PKPNFT.sol/PKPNFTContract.js b/tools/scripts/lit-contracts/PKPNFT.sol/PKPNFTContract.js new file mode 100644 index 0000000000..2309da83a6 --- /dev/null +++ b/tools/scripts/lit-contracts/PKPNFT.sol/PKPNFTContract.js @@ -0,0 +1,8 @@ +import { ethers } from "ethers"; +import { PKPNFTData } from "./PKPNFTData.js"; + +export const getPKPNFTContract = (provider) => new ethers.Contract( + PKPNFTData.address, + PKPNFTData.abi, + provider +); \ No newline at end of file diff --git a/tools/scripts/lit-contracts/PKPNFT.sol/PKPNFTContract.mjs b/tools/scripts/lit-contracts/PKPNFT.sol/PKPNFTContract.mjs new file mode 100644 index 0000000000..b3517c1533 --- /dev/null +++ b/tools/scripts/lit-contracts/PKPNFT.sol/PKPNFTContract.mjs @@ -0,0 +1,8 @@ +import { ethers } from "ethers"; +import { PKPNFTData } from "./PKPNFTData.mjs"; + +export const getPKPNFTContract = (provider) => new ethers.Contract( + PKPNFTData.address, + PKPNFTData.abi, + provider +); \ No newline at end of file diff --git a/tools/scripts/lit-contracts/PKPNFT.sol/PKPNFTContract.ts b/tools/scripts/lit-contracts/PKPNFT.sol/PKPNFTContract.ts new file mode 100644 index 0000000000..910521e742 --- /dev/null +++ b/tools/scripts/lit-contracts/PKPNFT.sol/PKPNFTContract.ts @@ -0,0 +1,11 @@ +import { ethers } from "ethers"; +import { PKPNFTData } from "./PKPNFTData"; +import { PKPNFT } from "./PKPNFT"; + +export const getPKPNFTContract = (provider: any) => { + return new ethers.Contract( + PKPNFTData.address, + PKPNFTData.abi, + provider + ) as unknown as PKPNFT; +} \ No newline at end of file diff --git a/tools/scripts/lit-contracts/PKPNFT.sol/PKPNFTData.js b/tools/scripts/lit-contracts/PKPNFT.sol/PKPNFTData.js new file mode 100644 index 0000000000..45a1068c79 --- /dev/null +++ b/tools/scripts/lit-contracts/PKPNFT.sol/PKPNFTData.js @@ -0,0 +1,892 @@ +export const PKPNFTData = { + "date": "2023-09-12T16:11:57.000Z", + "address": "0xBBaa35e9b4a38c8f639d25f49c529967Ffeb0C06", + "contractName": "PKPNFT", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "resolverAddress", + "type": "address" + }, + { + "internalType": "enum ContractResolver.Env", + "name": "_env", + "type": "uint8" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "approved", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "approved", + "type": "bool" + } + ], + "name": "ApprovalForAll", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "newResolverAddress", + "type": "address" + } + ], + "name": "ContractResolverAddressSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "newFreeMintSigner", + "type": "address" + } + ], + "name": "FreeMintSignerSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "newMintCost", + "type": "uint256" + } + ], + "name": "MintCostSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "pubkey", + "type": "bytes" + } + ], + "name": "PKPMinted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Withdrew", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "burn", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "keyType", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "derivedKeyId", + "type": "bytes32" + }, + { + "components": [ + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + } + ], + "internalType": "struct IPubkeyRouter.Signature[]", + "name": "signatures", + "type": "tuple[]" + } + ], + "name": "claimAndMint", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "contractResolver", + "outputs": [ + { + "internalType": "contract ContractResolver", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "env", + "outputs": [ + { + "internalType": "enum ContractResolver.Env", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "exists", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "freeMintSigner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "getApproved", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "getEthAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getNextDerivedKeyId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPkpNftMetadataAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPkpPermissionsAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "getPubkey", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getRouterAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getStakingAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "operator", + "type": "address" + } + ], + "name": "isApprovedForAll", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "mintCost", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "keyType", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "ipfsCID", + "type": "bytes" + } + ], + "name": "mintGrantAndBurnNext", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "keyType", + "type": "uint256" + } + ], + "name": "mintNext", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "ownerOf", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "hash", + "type": "bytes32" + } + ], + "name": "prefixed", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "redeemedFreeMintIds", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "safeTransferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "safeTransferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "internalType": "bool", + "name": "approved", + "type": "bool" + } + ], + "name": "setApprovalForAll", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newResolverAddress", + "type": "address" + } + ], + "name": "setContractResolver", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newFreeMintSigner", + "type": "address" + } + ], + "name": "setFreeMintSigner", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newMintCost", + "type": "uint256" + } + ], + "name": "setMintCost", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "tokenByIndex", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "tokenOfOwnerByIndex", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "tokenURI", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "withdraw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ] +} \ No newline at end of file diff --git a/tools/scripts/lit-contracts/PKPNFT.sol/PKPNFTData.mjs b/tools/scripts/lit-contracts/PKPNFT.sol/PKPNFTData.mjs new file mode 100644 index 0000000000..45a1068c79 --- /dev/null +++ b/tools/scripts/lit-contracts/PKPNFT.sol/PKPNFTData.mjs @@ -0,0 +1,892 @@ +export const PKPNFTData = { + "date": "2023-09-12T16:11:57.000Z", + "address": "0xBBaa35e9b4a38c8f639d25f49c529967Ffeb0C06", + "contractName": "PKPNFT", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "resolverAddress", + "type": "address" + }, + { + "internalType": "enum ContractResolver.Env", + "name": "_env", + "type": "uint8" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "approved", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "approved", + "type": "bool" + } + ], + "name": "ApprovalForAll", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "newResolverAddress", + "type": "address" + } + ], + "name": "ContractResolverAddressSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "newFreeMintSigner", + "type": "address" + } + ], + "name": "FreeMintSignerSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "newMintCost", + "type": "uint256" + } + ], + "name": "MintCostSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "pubkey", + "type": "bytes" + } + ], + "name": "PKPMinted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Withdrew", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "burn", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "keyType", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "derivedKeyId", + "type": "bytes32" + }, + { + "components": [ + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + } + ], + "internalType": "struct IPubkeyRouter.Signature[]", + "name": "signatures", + "type": "tuple[]" + } + ], + "name": "claimAndMint", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "contractResolver", + "outputs": [ + { + "internalType": "contract ContractResolver", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "env", + "outputs": [ + { + "internalType": "enum ContractResolver.Env", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "exists", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "freeMintSigner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "getApproved", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "getEthAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getNextDerivedKeyId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPkpNftMetadataAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPkpPermissionsAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "getPubkey", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getRouterAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getStakingAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "operator", + "type": "address" + } + ], + "name": "isApprovedForAll", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "mintCost", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "keyType", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "ipfsCID", + "type": "bytes" + } + ], + "name": "mintGrantAndBurnNext", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "keyType", + "type": "uint256" + } + ], + "name": "mintNext", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "ownerOf", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "hash", + "type": "bytes32" + } + ], + "name": "prefixed", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "redeemedFreeMintIds", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "safeTransferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "safeTransferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "internalType": "bool", + "name": "approved", + "type": "bool" + } + ], + "name": "setApprovalForAll", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newResolverAddress", + "type": "address" + } + ], + "name": "setContractResolver", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newFreeMintSigner", + "type": "address" + } + ], + "name": "setFreeMintSigner", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newMintCost", + "type": "uint256" + } + ], + "name": "setMintCost", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "tokenByIndex", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "tokenOfOwnerByIndex", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "tokenURI", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "withdraw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ] +} \ No newline at end of file diff --git a/tools/scripts/lit-contracts/PKPNFT.sol/PKPNFTData.ts b/tools/scripts/lit-contracts/PKPNFT.sol/PKPNFTData.ts new file mode 100644 index 0000000000..45a1068c79 --- /dev/null +++ b/tools/scripts/lit-contracts/PKPNFT.sol/PKPNFTData.ts @@ -0,0 +1,892 @@ +export const PKPNFTData = { + "date": "2023-09-12T16:11:57.000Z", + "address": "0xBBaa35e9b4a38c8f639d25f49c529967Ffeb0C06", + "contractName": "PKPNFT", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "resolverAddress", + "type": "address" + }, + { + "internalType": "enum ContractResolver.Env", + "name": "_env", + "type": "uint8" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "approved", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "approved", + "type": "bool" + } + ], + "name": "ApprovalForAll", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "newResolverAddress", + "type": "address" + } + ], + "name": "ContractResolverAddressSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "newFreeMintSigner", + "type": "address" + } + ], + "name": "FreeMintSignerSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "newMintCost", + "type": "uint256" + } + ], + "name": "MintCostSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "pubkey", + "type": "bytes" + } + ], + "name": "PKPMinted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Withdrew", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "burn", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "keyType", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "derivedKeyId", + "type": "bytes32" + }, + { + "components": [ + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + } + ], + "internalType": "struct IPubkeyRouter.Signature[]", + "name": "signatures", + "type": "tuple[]" + } + ], + "name": "claimAndMint", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "contractResolver", + "outputs": [ + { + "internalType": "contract ContractResolver", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "env", + "outputs": [ + { + "internalType": "enum ContractResolver.Env", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "exists", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "freeMintSigner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "getApproved", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "getEthAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getNextDerivedKeyId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPkpNftMetadataAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPkpPermissionsAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "getPubkey", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getRouterAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getStakingAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "operator", + "type": "address" + } + ], + "name": "isApprovedForAll", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "mintCost", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "keyType", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "ipfsCID", + "type": "bytes" + } + ], + "name": "mintGrantAndBurnNext", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "keyType", + "type": "uint256" + } + ], + "name": "mintNext", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "ownerOf", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "hash", + "type": "bytes32" + } + ], + "name": "prefixed", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "redeemedFreeMintIds", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "safeTransferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "safeTransferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "internalType": "bool", + "name": "approved", + "type": "bool" + } + ], + "name": "setApprovalForAll", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newResolverAddress", + "type": "address" + } + ], + "name": "setContractResolver", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newFreeMintSigner", + "type": "address" + } + ], + "name": "setFreeMintSigner", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newMintCost", + "type": "uint256" + } + ], + "name": "setMintCost", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "tokenByIndex", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "tokenOfOwnerByIndex", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "tokenURI", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "withdraw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ] +} \ No newline at end of file diff --git a/tools/scripts/lit-contracts/PKPNFT.sol/common.ts b/tools/scripts/lit-contracts/PKPNFT.sol/common.ts new file mode 100644 index 0000000000..2fc40c7fb1 --- /dev/null +++ b/tools/scripts/lit-contracts/PKPNFT.sol/common.ts @@ -0,0 +1,44 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { Listener } from "@ethersproject/providers"; +import type { Event, EventFilter } from "ethers"; + +export interface TypedEvent< + TArgsArray extends Array = any, + TArgsObject = any +> extends Event { + args: TArgsArray & TArgsObject; +} + +export interface TypedEventFilter<_TEvent extends TypedEvent> + extends EventFilter {} + +export interface TypedListener { + (...listenerArg: [...__TypechainArgsArray, TEvent]): void; +} + +type __TypechainArgsArray = T extends TypedEvent ? U : never; + +export interface OnEvent { + ( + eventFilter: TypedEventFilter, + listener: TypedListener + ): TRes; + (eventName: string, listener: Listener): TRes; +} + +export type MinEthersFactory = { + deploy(...a: ARGS[]): Promise; +}; + +export type GetContractTypeFromFactory = F extends MinEthersFactory< + infer C, + any +> + ? C + : never; + +export type GetARGsTypeFromFactory = F extends MinEthersFactory + ? Parameters + : never; diff --git a/tools/scripts/lit-contracts/PKPNFT.sol/factories/PKPNFT__factory.ts b/tools/scripts/lit-contracts/PKPNFT.sol/factories/PKPNFT__factory.ts new file mode 100644 index 0000000000..6a037f791f --- /dev/null +++ b/tools/scripts/lit-contracts/PKPNFT.sol/factories/PKPNFT__factory.ts @@ -0,0 +1,905 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Signer, utils } from "ethers"; +import type { Provider } from "@ethersproject/providers"; +import type { PKPNFT, PKPNFTInterface } from "../PKPNFT"; + +const _abi = [ + { + inputs: [ + { + internalType: "address", + name: "resolverAddress", + type: "address", + }, + { + internalType: "enum ContractResolver.Env", + name: "_env", + type: "uint8", + }, + ], + stateMutability: "nonpayable", + type: "constructor", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "owner", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "approved", + type: "address", + }, + { + indexed: true, + internalType: "uint256", + name: "tokenId", + type: "uint256", + }, + ], + name: "Approval", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "owner", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "operator", + type: "address", + }, + { + indexed: false, + internalType: "bool", + name: "approved", + type: "bool", + }, + ], + name: "ApprovalForAll", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "address", + name: "newResolverAddress", + type: "address", + }, + ], + name: "ContractResolverAddressSet", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "newFreeMintSigner", + type: "address", + }, + ], + name: "FreeMintSignerSet", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "newMintCost", + type: "uint256", + }, + ], + name: "MintCostSet", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "previousOwner", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "newOwner", + type: "address", + }, + ], + name: "OwnershipTransferred", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "uint256", + name: "tokenId", + type: "uint256", + }, + { + indexed: false, + internalType: "bytes", + name: "pubkey", + type: "bytes", + }, + ], + name: "PKPMinted", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "from", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "to", + type: "address", + }, + { + indexed: true, + internalType: "uint256", + name: "tokenId", + type: "uint256", + }, + ], + name: "Transfer", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "amount", + type: "uint256", + }, + ], + name: "Withdrew", + type: "event", + }, + { + inputs: [ + { + internalType: "address", + name: "to", + type: "address", + }, + { + internalType: "uint256", + name: "tokenId", + type: "uint256", + }, + ], + name: "approve", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "owner", + type: "address", + }, + ], + name: "balanceOf", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "tokenId", + type: "uint256", + }, + ], + name: "burn", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "keyType", + type: "uint256", + }, + { + internalType: "bytes32", + name: "derivedKeyId", + type: "bytes32", + }, + { + components: [ + { + internalType: "bytes32", + name: "r", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "s", + type: "bytes32", + }, + { + internalType: "uint8", + name: "v", + type: "uint8", + }, + ], + internalType: "struct IPubkeyRouter.Signature[]", + name: "signatures", + type: "tuple[]", + }, + ], + name: "claimAndMint", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "payable", + type: "function", + }, + { + inputs: [], + name: "contractResolver", + outputs: [ + { + internalType: "contract ContractResolver", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "env", + outputs: [ + { + internalType: "enum ContractResolver.Env", + name: "", + type: "uint8", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "tokenId", + type: "uint256", + }, + ], + name: "exists", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "freeMintSigner", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "tokenId", + type: "uint256", + }, + ], + name: "getApproved", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "tokenId", + type: "uint256", + }, + ], + name: "getEthAddress", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "getNextDerivedKeyId", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "getPkpNftMetadataAddress", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "getPkpPermissionsAddress", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "tokenId", + type: "uint256", + }, + ], + name: "getPubkey", + outputs: [ + { + internalType: "bytes", + name: "", + type: "bytes", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "getRouterAddress", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "getStakingAddress", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "owner", + type: "address", + }, + { + internalType: "address", + name: "operator", + type: "address", + }, + ], + name: "isApprovedForAll", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "mintCost", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "keyType", + type: "uint256", + }, + { + internalType: "bytes", + name: "ipfsCID", + type: "bytes", + }, + ], + name: "mintGrantAndBurnNext", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "payable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "keyType", + type: "uint256", + }, + ], + name: "mintNext", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "payable", + type: "function", + }, + { + inputs: [], + name: "name", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "owner", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "tokenId", + type: "uint256", + }, + ], + name: "ownerOf", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "hash", + type: "bytes32", + }, + ], + name: "prefixed", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "pure", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + name: "redeemedFreeMintIds", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "renounceOwnership", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "from", + type: "address", + }, + { + internalType: "address", + name: "to", + type: "address", + }, + { + internalType: "uint256", + name: "tokenId", + type: "uint256", + }, + ], + name: "safeTransferFrom", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "from", + type: "address", + }, + { + internalType: "address", + name: "to", + type: "address", + }, + { + internalType: "uint256", + name: "tokenId", + type: "uint256", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + ], + name: "safeTransferFrom", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "operator", + type: "address", + }, + { + internalType: "bool", + name: "approved", + type: "bool", + }, + ], + name: "setApprovalForAll", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "newResolverAddress", + type: "address", + }, + ], + name: "setContractResolver", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "newFreeMintSigner", + type: "address", + }, + ], + name: "setFreeMintSigner", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "newMintCost", + type: "uint256", + }, + ], + name: "setMintCost", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes4", + name: "interfaceId", + type: "bytes4", + }, + ], + name: "supportsInterface", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "symbol", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "index", + type: "uint256", + }, + ], + name: "tokenByIndex", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "owner", + type: "address", + }, + { + internalType: "uint256", + name: "index", + type: "uint256", + }, + ], + name: "tokenOfOwnerByIndex", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "tokenId", + type: "uint256", + }, + ], + name: "tokenURI", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "totalSupply", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "from", + type: "address", + }, + { + internalType: "address", + name: "to", + type: "address", + }, + { + internalType: "uint256", + name: "tokenId", + type: "uint256", + }, + ], + name: "transferFrom", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "newOwner", + type: "address", + }, + ], + name: "transferOwnership", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "withdraw", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, +] as const; + +export class PKPNFT__factory { + static readonly abi = _abi; + static createInterface(): PKPNFTInterface { + return new utils.Interface(_abi) as PKPNFTInterface; + } + static connect(address: string, signerOrProvider: Signer | Provider): PKPNFT { + return new Contract(address, _abi, signerOrProvider) as PKPNFT; + } +} diff --git a/tools/scripts/lit-contracts/PKPNFT.sol/factories/index.ts b/tools/scripts/lit-contracts/PKPNFT.sol/factories/index.ts new file mode 100644 index 0000000000..8953eaa589 --- /dev/null +++ b/tools/scripts/lit-contracts/PKPNFT.sol/factories/index.ts @@ -0,0 +1,4 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export { PKPNFT__factory } from "./PKPNFT__factory"; diff --git a/tools/scripts/lit-contracts/PKPNFT.sol/index.js b/tools/scripts/lit-contracts/PKPNFT.sol/index.js new file mode 100644 index 0000000000..95fff17ad1 --- /dev/null +++ b/tools/scripts/lit-contracts/PKPNFT.sol/index.js @@ -0,0 +1,2 @@ +export * from "./PKPNFTData.js"; +export * from "./PKPNFTContract.js"; \ No newline at end of file diff --git a/tools/scripts/lit-contracts/PKPNFT.sol/index.mjs b/tools/scripts/lit-contracts/PKPNFT.sol/index.mjs new file mode 100644 index 0000000000..5cc1bc1eba --- /dev/null +++ b/tools/scripts/lit-contracts/PKPNFT.sol/index.mjs @@ -0,0 +1,2 @@ +export * from "./PKPNFTData.mjs"; +export * from "./PKPNFTContract.mjs"; \ No newline at end of file diff --git a/tools/scripts/lit-contracts/PKPNFT.sol/index.ts b/tools/scripts/lit-contracts/PKPNFT.sol/index.ts new file mode 100644 index 0000000000..c98e8c8449 --- /dev/null +++ b/tools/scripts/lit-contracts/PKPNFT.sol/index.ts @@ -0,0 +1,3 @@ +export * from "./PKPNFTData"; +export * from "./PKPNFTContract"; +export * from "./PKPNFT"; \ No newline at end of file diff --git a/tools/scripts/lit-contracts/PKPPermissions.sol/PKPPermissions.json b/tools/scripts/lit-contracts/PKPPermissions.sol/PKPPermissions.json new file mode 100644 index 0000000000..d658832cd5 --- /dev/null +++ b/tools/scripts/lit-contracts/PKPPermissions.sol/PKPPermissions.json @@ -0,0 +1,994 @@ +{ + "date": "2023-09-10T22:33:17.000Z", + "address": "0x61Dc305F03cFF5Ba8f39D5F8F9BE2D3298e8aE38", + "contractName": "PKPPermissions", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_resolver", + "type": "address" + }, + { + "internalType": "enum ContractResolver.Env", + "name": "_env", + "type": "uint8" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "newResolverAddress", + "type": "address" + } + ], + "name": "ContractResolverAddressSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "authMethodType", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "id", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "userPubkey", + "type": "bytes" + } + ], + "name": "PermittedAuthMethodAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "authMethodType", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "id", + "type": "bytes" + } + ], + "name": "PermittedAuthMethodRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "authMethodType", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "id", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "scopeId", + "type": "uint256" + } + ], + "name": "PermittedAuthMethodScopeAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "authMethodType", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "id", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "scopeId", + "type": "uint256" + } + ], + "name": "PermittedAuthMethodScopeRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "group", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "root", + "type": "bytes32" + } + ], + "name": "RootHashUpdated", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "ipfsCID", + "type": "bytes" + }, + { + "internalType": "uint256[]", + "name": "scopes", + "type": "uint256[]" + } + ], + "name": "addPermittedAction", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "scopes", + "type": "uint256[]" + } + ], + "name": "addPermittedAddress", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "authMethodType", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "id", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "userPubkey", + "type": "bytes" + } + ], + "internalType": "struct PKPPermissions.AuthMethod", + "name": "authMethod", + "type": "tuple" + }, + { + "internalType": "uint256[]", + "name": "scopes", + "type": "uint256[]" + } + ], + "name": "addPermittedAuthMethod", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "authMethodType", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "id", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "scopeId", + "type": "uint256" + } + ], + "name": "addPermittedAuthMethodScope", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "authMethods", + "outputs": [ + { + "internalType": "uint256", + "name": "authMethodType", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "id", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "userPubkey", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "uint256[]", + "name": "permittedAuthMethodTypesToAdd", + "type": "uint256[]" + }, + { + "internalType": "bytes[]", + "name": "permittedAuthMethodIdsToAdd", + "type": "bytes[]" + }, + { + "internalType": "bytes[]", + "name": "permittedAuthMethodPubkeysToAdd", + "type": "bytes[]" + }, + { + "internalType": "uint256[][]", + "name": "permittedAuthMethodScopesToAdd", + "type": "uint256[][]" + }, + { + "internalType": "uint256[]", + "name": "permittedAuthMethodTypesToRemove", + "type": "uint256[]" + }, + { + "internalType": "bytes[]", + "name": "permittedAuthMethodIdsToRemove", + "type": "bytes[]" + } + ], + "name": "batchAddRemoveAuthMethods", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "contractResolver", + "outputs": [ + { + "internalType": "contract ContractResolver", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "env", + "outputs": [ + { + "internalType": "enum ContractResolver.Env", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "authMethodType", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "id", + "type": "bytes" + } + ], + "name": "getAuthMethodId", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "getEthAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "getPermittedActions", + "outputs": [ + { + "internalType": "bytes[]", + "name": "", + "type": "bytes[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "getPermittedAddresses", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "authMethodType", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "id", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "maxScopeId", + "type": "uint256" + } + ], + "name": "getPermittedAuthMethodScopes", + "outputs": [ + { + "internalType": "bool[]", + "name": "", + "type": "bool[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "getPermittedAuthMethods", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "authMethodType", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "id", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "userPubkey", + "type": "bytes" + } + ], + "internalType": "struct PKPPermissions.AuthMethod[]", + "name": "", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPkpNftAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "getPubkey", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getRouterAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "authMethodType", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "id", + "type": "bytes" + } + ], + "name": "getTokenIdsForAuthMethod", + "outputs": [ + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "authMethodType", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "id", + "type": "bytes" + } + ], + "name": "getUserPubkeyForAuthMethod", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "ipfsCID", + "type": "bytes" + } + ], + "name": "isPermittedAction", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "user", + "type": "address" + } + ], + "name": "isPermittedAddress", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "authMethodType", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "id", + "type": "bytes" + } + ], + "name": "isPermittedAuthMethod", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "authMethodType", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "id", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "scopeId", + "type": "uint256" + } + ], + "name": "isPermittedAuthMethodScopePresent", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "ipfsCID", + "type": "bytes" + } + ], + "name": "removePermittedAction", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "user", + "type": "address" + } + ], + "name": "removePermittedAddress", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "authMethodType", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "id", + "type": "bytes" + } + ], + "name": "removePermittedAuthMethod", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "authMethodType", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "id", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "scopeId", + "type": "uint256" + } + ], + "name": "removePermittedAuthMethodScope", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newResolverAddress", + "type": "address" + } + ], + "name": "setContractResolver", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "group", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "root", + "type": "bytes32" + } + ], + "name": "setRootHash", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "group", + "type": "uint256" + }, + { + "internalType": "bytes32[]", + "name": "proof", + "type": "bytes32[]" + }, + { + "internalType": "bytes32", + "name": "leaf", + "type": "bytes32" + } + ], + "name": "verifyState", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "group", + "type": "uint256" + }, + { + "internalType": "bytes32[]", + "name": "proof", + "type": "bytes32[]" + }, + { + "internalType": "bool[]", + "name": "proofFlags", + "type": "bool[]" + }, + { + "internalType": "bytes32[]", + "name": "leaves", + "type": "bytes32[]" + } + ], + "name": "verifyStates", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ] +} \ No newline at end of file diff --git a/tools/scripts/lit-contracts/PKPPermissions.sol/PKPPermissions.ts b/tools/scripts/lit-contracts/PKPPermissions.sol/PKPPermissions.ts new file mode 100644 index 0000000000..74d88d8f2f --- /dev/null +++ b/tools/scripts/lit-contracts/PKPPermissions.sol/PKPPermissions.ts @@ -0,0 +1,1614 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumber, + BigNumberish, + BytesLike, + CallOverrides, + ContractTransaction, + Overrides, + PopulatedTransaction, + Signer, + utils, +} from "ethers"; +import type { + FunctionFragment, + Result, + EventFragment, +} from "@ethersproject/abi"; +import type { Listener, Provider } from "@ethersproject/providers"; +import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, +} from "./common"; + +export declare namespace PKPPermissions { + export type AuthMethodStruct = { + authMethodType: BigNumberish; + id: BytesLike; + userPubkey: BytesLike; + }; + + export type AuthMethodStructOutput = [BigNumber, string, string] & { + authMethodType: BigNumber; + id: string; + userPubkey: string; + }; +} + +export interface PKPPermissionsInterface extends utils.Interface { + functions: { + "addPermittedAction(uint256,bytes,uint256[])": FunctionFragment; + "addPermittedAddress(uint256,address,uint256[])": FunctionFragment; + "addPermittedAuthMethod(uint256,(uint256,bytes,bytes),uint256[])": FunctionFragment; + "addPermittedAuthMethodScope(uint256,uint256,bytes,uint256)": FunctionFragment; + "authMethods(uint256)": FunctionFragment; + "batchAddRemoveAuthMethods(uint256,uint256[],bytes[],bytes[],uint256[][],uint256[],bytes[])": FunctionFragment; + "contractResolver()": FunctionFragment; + "env()": FunctionFragment; + "getAuthMethodId(uint256,bytes)": FunctionFragment; + "getEthAddress(uint256)": FunctionFragment; + "getPermittedActions(uint256)": FunctionFragment; + "getPermittedAddresses(uint256)": FunctionFragment; + "getPermittedAuthMethodScopes(uint256,uint256,bytes,uint256)": FunctionFragment; + "getPermittedAuthMethods(uint256)": FunctionFragment; + "getPkpNftAddress()": FunctionFragment; + "getPubkey(uint256)": FunctionFragment; + "getRouterAddress()": FunctionFragment; + "getTokenIdsForAuthMethod(uint256,bytes)": FunctionFragment; + "getUserPubkeyForAuthMethod(uint256,bytes)": FunctionFragment; + "isPermittedAction(uint256,bytes)": FunctionFragment; + "isPermittedAddress(uint256,address)": FunctionFragment; + "isPermittedAuthMethod(uint256,uint256,bytes)": FunctionFragment; + "isPermittedAuthMethodScopePresent(uint256,uint256,bytes,uint256)": FunctionFragment; + "owner()": FunctionFragment; + "removePermittedAction(uint256,bytes)": FunctionFragment; + "removePermittedAddress(uint256,address)": FunctionFragment; + "removePermittedAuthMethod(uint256,uint256,bytes)": FunctionFragment; + "removePermittedAuthMethodScope(uint256,uint256,bytes,uint256)": FunctionFragment; + "renounceOwnership()": FunctionFragment; + "setContractResolver(address)": FunctionFragment; + "setRootHash(uint256,uint256,bytes32)": FunctionFragment; + "transferOwnership(address)": FunctionFragment; + "verifyState(uint256,uint256,bytes32[],bytes32)": FunctionFragment; + "verifyStates(uint256,uint256,bytes32[],bool[],bytes32[])": FunctionFragment; + }; + + getFunction( + nameOrSignatureOrTopic: + | "addPermittedAction" + | "addPermittedAddress" + | "addPermittedAuthMethod" + | "addPermittedAuthMethodScope" + | "authMethods" + | "batchAddRemoveAuthMethods" + | "contractResolver" + | "env" + | "getAuthMethodId" + | "getEthAddress" + | "getPermittedActions" + | "getPermittedAddresses" + | "getPermittedAuthMethodScopes" + | "getPermittedAuthMethods" + | "getPkpNftAddress" + | "getPubkey" + | "getRouterAddress" + | "getTokenIdsForAuthMethod" + | "getUserPubkeyForAuthMethod" + | "isPermittedAction" + | "isPermittedAddress" + | "isPermittedAuthMethod" + | "isPermittedAuthMethodScopePresent" + | "owner" + | "removePermittedAction" + | "removePermittedAddress" + | "removePermittedAuthMethod" + | "removePermittedAuthMethodScope" + | "renounceOwnership" + | "setContractResolver" + | "setRootHash" + | "transferOwnership" + | "verifyState" + | "verifyStates" + ): FunctionFragment; + + encodeFunctionData( + functionFragment: "addPermittedAction", + values: [BigNumberish, BytesLike, BigNumberish[]] + ): string; + encodeFunctionData( + functionFragment: "addPermittedAddress", + values: [BigNumberish, string, BigNumberish[]] + ): string; + encodeFunctionData( + functionFragment: "addPermittedAuthMethod", + values: [BigNumberish, PKPPermissions.AuthMethodStruct, BigNumberish[]] + ): string; + encodeFunctionData( + functionFragment: "addPermittedAuthMethodScope", + values: [BigNumberish, BigNumberish, BytesLike, BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "authMethods", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "batchAddRemoveAuthMethods", + values: [ + BigNumberish, + BigNumberish[], + BytesLike[], + BytesLike[], + BigNumberish[][], + BigNumberish[], + BytesLike[] + ] + ): string; + encodeFunctionData( + functionFragment: "contractResolver", + values?: undefined + ): string; + encodeFunctionData(functionFragment: "env", values?: undefined): string; + encodeFunctionData( + functionFragment: "getAuthMethodId", + values: [BigNumberish, BytesLike] + ): string; + encodeFunctionData( + functionFragment: "getEthAddress", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "getPermittedActions", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "getPermittedAddresses", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "getPermittedAuthMethodScopes", + values: [BigNumberish, BigNumberish, BytesLike, BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "getPermittedAuthMethods", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "getPkpNftAddress", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "getPubkey", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "getRouterAddress", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "getTokenIdsForAuthMethod", + values: [BigNumberish, BytesLike] + ): string; + encodeFunctionData( + functionFragment: "getUserPubkeyForAuthMethod", + values: [BigNumberish, BytesLike] + ): string; + encodeFunctionData( + functionFragment: "isPermittedAction", + values: [BigNumberish, BytesLike] + ): string; + encodeFunctionData( + functionFragment: "isPermittedAddress", + values: [BigNumberish, string] + ): string; + encodeFunctionData( + functionFragment: "isPermittedAuthMethod", + values: [BigNumberish, BigNumberish, BytesLike] + ): string; + encodeFunctionData( + functionFragment: "isPermittedAuthMethodScopePresent", + values: [BigNumberish, BigNumberish, BytesLike, BigNumberish] + ): string; + encodeFunctionData(functionFragment: "owner", values?: undefined): string; + encodeFunctionData( + functionFragment: "removePermittedAction", + values: [BigNumberish, BytesLike] + ): string; + encodeFunctionData( + functionFragment: "removePermittedAddress", + values: [BigNumberish, string] + ): string; + encodeFunctionData( + functionFragment: "removePermittedAuthMethod", + values: [BigNumberish, BigNumberish, BytesLike] + ): string; + encodeFunctionData( + functionFragment: "removePermittedAuthMethodScope", + values: [BigNumberish, BigNumberish, BytesLike, BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "renounceOwnership", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "setContractResolver", + values: [string] + ): string; + encodeFunctionData( + functionFragment: "setRootHash", + values: [BigNumberish, BigNumberish, BytesLike] + ): string; + encodeFunctionData( + functionFragment: "transferOwnership", + values: [string] + ): string; + encodeFunctionData( + functionFragment: "verifyState", + values: [BigNumberish, BigNumberish, BytesLike[], BytesLike] + ): string; + encodeFunctionData( + functionFragment: "verifyStates", + values: [BigNumberish, BigNumberish, BytesLike[], boolean[], BytesLike[]] + ): string; + + decodeFunctionResult( + functionFragment: "addPermittedAction", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "addPermittedAddress", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "addPermittedAuthMethod", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "addPermittedAuthMethodScope", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "authMethods", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "batchAddRemoveAuthMethods", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "contractResolver", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "env", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "getAuthMethodId", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getEthAddress", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getPermittedActions", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getPermittedAddresses", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getPermittedAuthMethodScopes", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getPermittedAuthMethods", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getPkpNftAddress", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "getPubkey", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "getRouterAddress", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getTokenIdsForAuthMethod", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getUserPubkeyForAuthMethod", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "isPermittedAction", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "isPermittedAddress", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "isPermittedAuthMethod", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "isPermittedAuthMethodScopePresent", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "owner", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "removePermittedAction", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "removePermittedAddress", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "removePermittedAuthMethod", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "removePermittedAuthMethodScope", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "renounceOwnership", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setContractResolver", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setRootHash", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "transferOwnership", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "verifyState", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "verifyStates", + data: BytesLike + ): Result; + + events: { + "ContractResolverAddressSet(address)": EventFragment; + "OwnershipTransferred(address,address)": EventFragment; + "PermittedAuthMethodAdded(uint256,uint256,bytes,bytes)": EventFragment; + "PermittedAuthMethodRemoved(uint256,uint256,bytes)": EventFragment; + "PermittedAuthMethodScopeAdded(uint256,uint256,bytes,uint256)": EventFragment; + "PermittedAuthMethodScopeRemoved(uint256,uint256,bytes,uint256)": EventFragment; + "RootHashUpdated(uint256,uint256,bytes32)": EventFragment; + }; + + getEvent(nameOrSignatureOrTopic: "ContractResolverAddressSet"): EventFragment; + getEvent(nameOrSignatureOrTopic: "OwnershipTransferred"): EventFragment; + getEvent(nameOrSignatureOrTopic: "PermittedAuthMethodAdded"): EventFragment; + getEvent(nameOrSignatureOrTopic: "PermittedAuthMethodRemoved"): EventFragment; + getEvent( + nameOrSignatureOrTopic: "PermittedAuthMethodScopeAdded" + ): EventFragment; + getEvent( + nameOrSignatureOrTopic: "PermittedAuthMethodScopeRemoved" + ): EventFragment; + getEvent(nameOrSignatureOrTopic: "RootHashUpdated"): EventFragment; +} + +export interface ContractResolverAddressSetEventObject { + newResolverAddress: string; +} +export type ContractResolverAddressSetEvent = TypedEvent< + [string], + ContractResolverAddressSetEventObject +>; + +export type ContractResolverAddressSetEventFilter = + TypedEventFilter; + +export interface OwnershipTransferredEventObject { + previousOwner: string; + newOwner: string; +} +export type OwnershipTransferredEvent = TypedEvent< + [string, string], + OwnershipTransferredEventObject +>; + +export type OwnershipTransferredEventFilter = + TypedEventFilter; + +export interface PermittedAuthMethodAddedEventObject { + tokenId: BigNumber; + authMethodType: BigNumber; + id: string; + userPubkey: string; +} +export type PermittedAuthMethodAddedEvent = TypedEvent< + [BigNumber, BigNumber, string, string], + PermittedAuthMethodAddedEventObject +>; + +export type PermittedAuthMethodAddedEventFilter = + TypedEventFilter; + +export interface PermittedAuthMethodRemovedEventObject { + tokenId: BigNumber; + authMethodType: BigNumber; + id: string; +} +export type PermittedAuthMethodRemovedEvent = TypedEvent< + [BigNumber, BigNumber, string], + PermittedAuthMethodRemovedEventObject +>; + +export type PermittedAuthMethodRemovedEventFilter = + TypedEventFilter; + +export interface PermittedAuthMethodScopeAddedEventObject { + tokenId: BigNumber; + authMethodType: BigNumber; + id: string; + scopeId: BigNumber; +} +export type PermittedAuthMethodScopeAddedEvent = TypedEvent< + [BigNumber, BigNumber, string, BigNumber], + PermittedAuthMethodScopeAddedEventObject +>; + +export type PermittedAuthMethodScopeAddedEventFilter = + TypedEventFilter; + +export interface PermittedAuthMethodScopeRemovedEventObject { + tokenId: BigNumber; + authMethodType: BigNumber; + id: string; + scopeId: BigNumber; +} +export type PermittedAuthMethodScopeRemovedEvent = TypedEvent< + [BigNumber, BigNumber, string, BigNumber], + PermittedAuthMethodScopeRemovedEventObject +>; + +export type PermittedAuthMethodScopeRemovedEventFilter = + TypedEventFilter; + +export interface RootHashUpdatedEventObject { + tokenId: BigNumber; + group: BigNumber; + root: string; +} +export type RootHashUpdatedEvent = TypedEvent< + [BigNumber, BigNumber, string], + RootHashUpdatedEventObject +>; + +export type RootHashUpdatedEventFilter = TypedEventFilter; + +export interface PKPPermissions extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: PKPPermissionsInterface; + + queryFilter( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>; + + listeners( + eventFilter?: TypedEventFilter + ): Array>; + listeners(eventName?: string): Array; + removeAllListeners( + eventFilter: TypedEventFilter + ): this; + removeAllListeners(eventName?: string): this; + off: OnEvent; + on: OnEvent; + once: OnEvent; + removeListener: OnEvent; + + functions: { + addPermittedAction( + tokenId: BigNumberish, + ipfsCID: BytesLike, + scopes: BigNumberish[], + overrides?: Overrides & { from?: string } + ): Promise; + + addPermittedAddress( + tokenId: BigNumberish, + user: string, + scopes: BigNumberish[], + overrides?: Overrides & { from?: string } + ): Promise; + + addPermittedAuthMethod( + tokenId: BigNumberish, + authMethod: PKPPermissions.AuthMethodStruct, + scopes: BigNumberish[], + overrides?: Overrides & { from?: string } + ): Promise; + + addPermittedAuthMethodScope( + tokenId: BigNumberish, + authMethodType: BigNumberish, + id: BytesLike, + scopeId: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + authMethods( + arg0: BigNumberish, + overrides?: CallOverrides + ): Promise< + [BigNumber, string, string] & { + authMethodType: BigNumber; + id: string; + userPubkey: string; + } + >; + + batchAddRemoveAuthMethods( + tokenId: BigNumberish, + permittedAuthMethodTypesToAdd: BigNumberish[], + permittedAuthMethodIdsToAdd: BytesLike[], + permittedAuthMethodPubkeysToAdd: BytesLike[], + permittedAuthMethodScopesToAdd: BigNumberish[][], + permittedAuthMethodTypesToRemove: BigNumberish[], + permittedAuthMethodIdsToRemove: BytesLike[], + overrides?: Overrides & { from?: string } + ): Promise; + + contractResolver(overrides?: CallOverrides): Promise<[string]>; + + env(overrides?: CallOverrides): Promise<[number]>; + + getAuthMethodId( + authMethodType: BigNumberish, + id: BytesLike, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + getEthAddress( + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise<[string]>; + + getPermittedActions( + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise<[string[]]>; + + getPermittedAddresses( + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise<[string[]]>; + + getPermittedAuthMethodScopes( + tokenId: BigNumberish, + authMethodType: BigNumberish, + id: BytesLike, + maxScopeId: BigNumberish, + overrides?: CallOverrides + ): Promise<[boolean[]]>; + + getPermittedAuthMethods( + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise<[PKPPermissions.AuthMethodStructOutput[]]>; + + getPkpNftAddress(overrides?: CallOverrides): Promise<[string]>; + + getPubkey( + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise<[string]>; + + getRouterAddress(overrides?: CallOverrides): Promise<[string]>; + + getTokenIdsForAuthMethod( + authMethodType: BigNumberish, + id: BytesLike, + overrides?: CallOverrides + ): Promise<[BigNumber[]]>; + + getUserPubkeyForAuthMethod( + authMethodType: BigNumberish, + id: BytesLike, + overrides?: CallOverrides + ): Promise<[string]>; + + isPermittedAction( + tokenId: BigNumberish, + ipfsCID: BytesLike, + overrides?: CallOverrides + ): Promise<[boolean]>; + + isPermittedAddress( + tokenId: BigNumberish, + user: string, + overrides?: CallOverrides + ): Promise<[boolean]>; + + isPermittedAuthMethod( + tokenId: BigNumberish, + authMethodType: BigNumberish, + id: BytesLike, + overrides?: CallOverrides + ): Promise<[boolean]>; + + isPermittedAuthMethodScopePresent( + tokenId: BigNumberish, + authMethodType: BigNumberish, + id: BytesLike, + scopeId: BigNumberish, + overrides?: CallOverrides + ): Promise<[boolean]>; + + owner(overrides?: CallOverrides): Promise<[string]>; + + removePermittedAction( + tokenId: BigNumberish, + ipfsCID: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + + removePermittedAddress( + tokenId: BigNumberish, + user: string, + overrides?: Overrides & { from?: string } + ): Promise; + + removePermittedAuthMethod( + tokenId: BigNumberish, + authMethodType: BigNumberish, + id: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + + removePermittedAuthMethodScope( + tokenId: BigNumberish, + authMethodType: BigNumberish, + id: BytesLike, + scopeId: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + renounceOwnership( + overrides?: Overrides & { from?: string } + ): Promise; + + setContractResolver( + newResolverAddress: string, + overrides?: Overrides & { from?: string } + ): Promise; + + setRootHash( + tokenId: BigNumberish, + group: BigNumberish, + root: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + + transferOwnership( + newOwner: string, + overrides?: Overrides & { from?: string } + ): Promise; + + verifyState( + tokenId: BigNumberish, + group: BigNumberish, + proof: BytesLike[], + leaf: BytesLike, + overrides?: CallOverrides + ): Promise<[boolean]>; + + verifyStates( + tokenId: BigNumberish, + group: BigNumberish, + proof: BytesLike[], + proofFlags: boolean[], + leaves: BytesLike[], + overrides?: CallOverrides + ): Promise<[boolean]>; + }; + + addPermittedAction( + tokenId: BigNumberish, + ipfsCID: BytesLike, + scopes: BigNumberish[], + overrides?: Overrides & { from?: string } + ): Promise; + + addPermittedAddress( + tokenId: BigNumberish, + user: string, + scopes: BigNumberish[], + overrides?: Overrides & { from?: string } + ): Promise; + + addPermittedAuthMethod( + tokenId: BigNumberish, + authMethod: PKPPermissions.AuthMethodStruct, + scopes: BigNumberish[], + overrides?: Overrides & { from?: string } + ): Promise; + + addPermittedAuthMethodScope( + tokenId: BigNumberish, + authMethodType: BigNumberish, + id: BytesLike, + scopeId: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + authMethods( + arg0: BigNumberish, + overrides?: CallOverrides + ): Promise< + [BigNumber, string, string] & { + authMethodType: BigNumber; + id: string; + userPubkey: string; + } + >; + + batchAddRemoveAuthMethods( + tokenId: BigNumberish, + permittedAuthMethodTypesToAdd: BigNumberish[], + permittedAuthMethodIdsToAdd: BytesLike[], + permittedAuthMethodPubkeysToAdd: BytesLike[], + permittedAuthMethodScopesToAdd: BigNumberish[][], + permittedAuthMethodTypesToRemove: BigNumberish[], + permittedAuthMethodIdsToRemove: BytesLike[], + overrides?: Overrides & { from?: string } + ): Promise; + + contractResolver(overrides?: CallOverrides): Promise; + + env(overrides?: CallOverrides): Promise; + + getAuthMethodId( + authMethodType: BigNumberish, + id: BytesLike, + overrides?: CallOverrides + ): Promise; + + getEthAddress( + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getPermittedActions( + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getPermittedAddresses( + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getPermittedAuthMethodScopes( + tokenId: BigNumberish, + authMethodType: BigNumberish, + id: BytesLike, + maxScopeId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getPermittedAuthMethods( + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getPkpNftAddress(overrides?: CallOverrides): Promise; + + getPubkey(tokenId: BigNumberish, overrides?: CallOverrides): Promise; + + getRouterAddress(overrides?: CallOverrides): Promise; + + getTokenIdsForAuthMethod( + authMethodType: BigNumberish, + id: BytesLike, + overrides?: CallOverrides + ): Promise; + + getUserPubkeyForAuthMethod( + authMethodType: BigNumberish, + id: BytesLike, + overrides?: CallOverrides + ): Promise; + + isPermittedAction( + tokenId: BigNumberish, + ipfsCID: BytesLike, + overrides?: CallOverrides + ): Promise; + + isPermittedAddress( + tokenId: BigNumberish, + user: string, + overrides?: CallOverrides + ): Promise; + + isPermittedAuthMethod( + tokenId: BigNumberish, + authMethodType: BigNumberish, + id: BytesLike, + overrides?: CallOverrides + ): Promise; + + isPermittedAuthMethodScopePresent( + tokenId: BigNumberish, + authMethodType: BigNumberish, + id: BytesLike, + scopeId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + owner(overrides?: CallOverrides): Promise; + + removePermittedAction( + tokenId: BigNumberish, + ipfsCID: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + + removePermittedAddress( + tokenId: BigNumberish, + user: string, + overrides?: Overrides & { from?: string } + ): Promise; + + removePermittedAuthMethod( + tokenId: BigNumberish, + authMethodType: BigNumberish, + id: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + + removePermittedAuthMethodScope( + tokenId: BigNumberish, + authMethodType: BigNumberish, + id: BytesLike, + scopeId: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + renounceOwnership( + overrides?: Overrides & { from?: string } + ): Promise; + + setContractResolver( + newResolverAddress: string, + overrides?: Overrides & { from?: string } + ): Promise; + + setRootHash( + tokenId: BigNumberish, + group: BigNumberish, + root: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + + transferOwnership( + newOwner: string, + overrides?: Overrides & { from?: string } + ): Promise; + + verifyState( + tokenId: BigNumberish, + group: BigNumberish, + proof: BytesLike[], + leaf: BytesLike, + overrides?: CallOverrides + ): Promise; + + verifyStates( + tokenId: BigNumberish, + group: BigNumberish, + proof: BytesLike[], + proofFlags: boolean[], + leaves: BytesLike[], + overrides?: CallOverrides + ): Promise; + + callStatic: { + addPermittedAction( + tokenId: BigNumberish, + ipfsCID: BytesLike, + scopes: BigNumberish[], + overrides?: CallOverrides + ): Promise; + + addPermittedAddress( + tokenId: BigNumberish, + user: string, + scopes: BigNumberish[], + overrides?: CallOverrides + ): Promise; + + addPermittedAuthMethod( + tokenId: BigNumberish, + authMethod: PKPPermissions.AuthMethodStruct, + scopes: BigNumberish[], + overrides?: CallOverrides + ): Promise; + + addPermittedAuthMethodScope( + tokenId: BigNumberish, + authMethodType: BigNumberish, + id: BytesLike, + scopeId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + authMethods( + arg0: BigNumberish, + overrides?: CallOverrides + ): Promise< + [BigNumber, string, string] & { + authMethodType: BigNumber; + id: string; + userPubkey: string; + } + >; + + batchAddRemoveAuthMethods( + tokenId: BigNumberish, + permittedAuthMethodTypesToAdd: BigNumberish[], + permittedAuthMethodIdsToAdd: BytesLike[], + permittedAuthMethodPubkeysToAdd: BytesLike[], + permittedAuthMethodScopesToAdd: BigNumberish[][], + permittedAuthMethodTypesToRemove: BigNumberish[], + permittedAuthMethodIdsToRemove: BytesLike[], + overrides?: CallOverrides + ): Promise; + + contractResolver(overrides?: CallOverrides): Promise; + + env(overrides?: CallOverrides): Promise; + + getAuthMethodId( + authMethodType: BigNumberish, + id: BytesLike, + overrides?: CallOverrides + ): Promise; + + getEthAddress( + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getPermittedActions( + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getPermittedAddresses( + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getPermittedAuthMethodScopes( + tokenId: BigNumberish, + authMethodType: BigNumberish, + id: BytesLike, + maxScopeId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getPermittedAuthMethods( + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getPkpNftAddress(overrides?: CallOverrides): Promise; + + getPubkey( + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getRouterAddress(overrides?: CallOverrides): Promise; + + getTokenIdsForAuthMethod( + authMethodType: BigNumberish, + id: BytesLike, + overrides?: CallOverrides + ): Promise; + + getUserPubkeyForAuthMethod( + authMethodType: BigNumberish, + id: BytesLike, + overrides?: CallOverrides + ): Promise; + + isPermittedAction( + tokenId: BigNumberish, + ipfsCID: BytesLike, + overrides?: CallOverrides + ): Promise; + + isPermittedAddress( + tokenId: BigNumberish, + user: string, + overrides?: CallOverrides + ): Promise; + + isPermittedAuthMethod( + tokenId: BigNumberish, + authMethodType: BigNumberish, + id: BytesLike, + overrides?: CallOverrides + ): Promise; + + isPermittedAuthMethodScopePresent( + tokenId: BigNumberish, + authMethodType: BigNumberish, + id: BytesLike, + scopeId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + owner(overrides?: CallOverrides): Promise; + + removePermittedAction( + tokenId: BigNumberish, + ipfsCID: BytesLike, + overrides?: CallOverrides + ): Promise; + + removePermittedAddress( + tokenId: BigNumberish, + user: string, + overrides?: CallOverrides + ): Promise; + + removePermittedAuthMethod( + tokenId: BigNumberish, + authMethodType: BigNumberish, + id: BytesLike, + overrides?: CallOverrides + ): Promise; + + removePermittedAuthMethodScope( + tokenId: BigNumberish, + authMethodType: BigNumberish, + id: BytesLike, + scopeId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + renounceOwnership(overrides?: CallOverrides): Promise; + + setContractResolver( + newResolverAddress: string, + overrides?: CallOverrides + ): Promise; + + setRootHash( + tokenId: BigNumberish, + group: BigNumberish, + root: BytesLike, + overrides?: CallOverrides + ): Promise; + + transferOwnership( + newOwner: string, + overrides?: CallOverrides + ): Promise; + + verifyState( + tokenId: BigNumberish, + group: BigNumberish, + proof: BytesLike[], + leaf: BytesLike, + overrides?: CallOverrides + ): Promise; + + verifyStates( + tokenId: BigNumberish, + group: BigNumberish, + proof: BytesLike[], + proofFlags: boolean[], + leaves: BytesLike[], + overrides?: CallOverrides + ): Promise; + }; + + filters: { + "ContractResolverAddressSet(address)"( + newResolverAddress?: null + ): ContractResolverAddressSetEventFilter; + ContractResolverAddressSet( + newResolverAddress?: null + ): ContractResolverAddressSetEventFilter; + + "OwnershipTransferred(address,address)"( + previousOwner?: string | null, + newOwner?: string | null + ): OwnershipTransferredEventFilter; + OwnershipTransferred( + previousOwner?: string | null, + newOwner?: string | null + ): OwnershipTransferredEventFilter; + + "PermittedAuthMethodAdded(uint256,uint256,bytes,bytes)"( + tokenId?: BigNumberish | null, + authMethodType?: null, + id?: null, + userPubkey?: null + ): PermittedAuthMethodAddedEventFilter; + PermittedAuthMethodAdded( + tokenId?: BigNumberish | null, + authMethodType?: null, + id?: null, + userPubkey?: null + ): PermittedAuthMethodAddedEventFilter; + + "PermittedAuthMethodRemoved(uint256,uint256,bytes)"( + tokenId?: BigNumberish | null, + authMethodType?: null, + id?: null + ): PermittedAuthMethodRemovedEventFilter; + PermittedAuthMethodRemoved( + tokenId?: BigNumberish | null, + authMethodType?: null, + id?: null + ): PermittedAuthMethodRemovedEventFilter; + + "PermittedAuthMethodScopeAdded(uint256,uint256,bytes,uint256)"( + tokenId?: BigNumberish | null, + authMethodType?: null, + id?: null, + scopeId?: null + ): PermittedAuthMethodScopeAddedEventFilter; + PermittedAuthMethodScopeAdded( + tokenId?: BigNumberish | null, + authMethodType?: null, + id?: null, + scopeId?: null + ): PermittedAuthMethodScopeAddedEventFilter; + + "PermittedAuthMethodScopeRemoved(uint256,uint256,bytes,uint256)"( + tokenId?: BigNumberish | null, + authMethodType?: null, + id?: null, + scopeId?: null + ): PermittedAuthMethodScopeRemovedEventFilter; + PermittedAuthMethodScopeRemoved( + tokenId?: BigNumberish | null, + authMethodType?: null, + id?: null, + scopeId?: null + ): PermittedAuthMethodScopeRemovedEventFilter; + + "RootHashUpdated(uint256,uint256,bytes32)"( + tokenId?: BigNumberish | null, + group?: BigNumberish | null, + root?: null + ): RootHashUpdatedEventFilter; + RootHashUpdated( + tokenId?: BigNumberish | null, + group?: BigNumberish | null, + root?: null + ): RootHashUpdatedEventFilter; + }; + + estimateGas: { + addPermittedAction( + tokenId: BigNumberish, + ipfsCID: BytesLike, + scopes: BigNumberish[], + overrides?: Overrides & { from?: string } + ): Promise; + + addPermittedAddress( + tokenId: BigNumberish, + user: string, + scopes: BigNumberish[], + overrides?: Overrides & { from?: string } + ): Promise; + + addPermittedAuthMethod( + tokenId: BigNumberish, + authMethod: PKPPermissions.AuthMethodStruct, + scopes: BigNumberish[], + overrides?: Overrides & { from?: string } + ): Promise; + + addPermittedAuthMethodScope( + tokenId: BigNumberish, + authMethodType: BigNumberish, + id: BytesLike, + scopeId: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + authMethods( + arg0: BigNumberish, + overrides?: CallOverrides + ): Promise; + + batchAddRemoveAuthMethods( + tokenId: BigNumberish, + permittedAuthMethodTypesToAdd: BigNumberish[], + permittedAuthMethodIdsToAdd: BytesLike[], + permittedAuthMethodPubkeysToAdd: BytesLike[], + permittedAuthMethodScopesToAdd: BigNumberish[][], + permittedAuthMethodTypesToRemove: BigNumberish[], + permittedAuthMethodIdsToRemove: BytesLike[], + overrides?: Overrides & { from?: string } + ): Promise; + + contractResolver(overrides?: CallOverrides): Promise; + + env(overrides?: CallOverrides): Promise; + + getAuthMethodId( + authMethodType: BigNumberish, + id: BytesLike, + overrides?: CallOverrides + ): Promise; + + getEthAddress( + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getPermittedActions( + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getPermittedAddresses( + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getPermittedAuthMethodScopes( + tokenId: BigNumberish, + authMethodType: BigNumberish, + id: BytesLike, + maxScopeId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getPermittedAuthMethods( + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getPkpNftAddress(overrides?: CallOverrides): Promise; + + getPubkey( + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getRouterAddress(overrides?: CallOverrides): Promise; + + getTokenIdsForAuthMethod( + authMethodType: BigNumberish, + id: BytesLike, + overrides?: CallOverrides + ): Promise; + + getUserPubkeyForAuthMethod( + authMethodType: BigNumberish, + id: BytesLike, + overrides?: CallOverrides + ): Promise; + + isPermittedAction( + tokenId: BigNumberish, + ipfsCID: BytesLike, + overrides?: CallOverrides + ): Promise; + + isPermittedAddress( + tokenId: BigNumberish, + user: string, + overrides?: CallOverrides + ): Promise; + + isPermittedAuthMethod( + tokenId: BigNumberish, + authMethodType: BigNumberish, + id: BytesLike, + overrides?: CallOverrides + ): Promise; + + isPermittedAuthMethodScopePresent( + tokenId: BigNumberish, + authMethodType: BigNumberish, + id: BytesLike, + scopeId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + owner(overrides?: CallOverrides): Promise; + + removePermittedAction( + tokenId: BigNumberish, + ipfsCID: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + + removePermittedAddress( + tokenId: BigNumberish, + user: string, + overrides?: Overrides & { from?: string } + ): Promise; + + removePermittedAuthMethod( + tokenId: BigNumberish, + authMethodType: BigNumberish, + id: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + + removePermittedAuthMethodScope( + tokenId: BigNumberish, + authMethodType: BigNumberish, + id: BytesLike, + scopeId: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + renounceOwnership( + overrides?: Overrides & { from?: string } + ): Promise; + + setContractResolver( + newResolverAddress: string, + overrides?: Overrides & { from?: string } + ): Promise; + + setRootHash( + tokenId: BigNumberish, + group: BigNumberish, + root: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + + transferOwnership( + newOwner: string, + overrides?: Overrides & { from?: string } + ): Promise; + + verifyState( + tokenId: BigNumberish, + group: BigNumberish, + proof: BytesLike[], + leaf: BytesLike, + overrides?: CallOverrides + ): Promise; + + verifyStates( + tokenId: BigNumberish, + group: BigNumberish, + proof: BytesLike[], + proofFlags: boolean[], + leaves: BytesLike[], + overrides?: CallOverrides + ): Promise; + }; + + populateTransaction: { + addPermittedAction( + tokenId: BigNumberish, + ipfsCID: BytesLike, + scopes: BigNumberish[], + overrides?: Overrides & { from?: string } + ): Promise; + + addPermittedAddress( + tokenId: BigNumberish, + user: string, + scopes: BigNumberish[], + overrides?: Overrides & { from?: string } + ): Promise; + + addPermittedAuthMethod( + tokenId: BigNumberish, + authMethod: PKPPermissions.AuthMethodStruct, + scopes: BigNumberish[], + overrides?: Overrides & { from?: string } + ): Promise; + + addPermittedAuthMethodScope( + tokenId: BigNumberish, + authMethodType: BigNumberish, + id: BytesLike, + scopeId: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + authMethods( + arg0: BigNumberish, + overrides?: CallOverrides + ): Promise; + + batchAddRemoveAuthMethods( + tokenId: BigNumberish, + permittedAuthMethodTypesToAdd: BigNumberish[], + permittedAuthMethodIdsToAdd: BytesLike[], + permittedAuthMethodPubkeysToAdd: BytesLike[], + permittedAuthMethodScopesToAdd: BigNumberish[][], + permittedAuthMethodTypesToRemove: BigNumberish[], + permittedAuthMethodIdsToRemove: BytesLike[], + overrides?: Overrides & { from?: string } + ): Promise; + + contractResolver(overrides?: CallOverrides): Promise; + + env(overrides?: CallOverrides): Promise; + + getAuthMethodId( + authMethodType: BigNumberish, + id: BytesLike, + overrides?: CallOverrides + ): Promise; + + getEthAddress( + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getPermittedActions( + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getPermittedAddresses( + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getPermittedAuthMethodScopes( + tokenId: BigNumberish, + authMethodType: BigNumberish, + id: BytesLike, + maxScopeId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getPermittedAuthMethods( + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getPkpNftAddress(overrides?: CallOverrides): Promise; + + getPubkey( + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getRouterAddress(overrides?: CallOverrides): Promise; + + getTokenIdsForAuthMethod( + authMethodType: BigNumberish, + id: BytesLike, + overrides?: CallOverrides + ): Promise; + + getUserPubkeyForAuthMethod( + authMethodType: BigNumberish, + id: BytesLike, + overrides?: CallOverrides + ): Promise; + + isPermittedAction( + tokenId: BigNumberish, + ipfsCID: BytesLike, + overrides?: CallOverrides + ): Promise; + + isPermittedAddress( + tokenId: BigNumberish, + user: string, + overrides?: CallOverrides + ): Promise; + + isPermittedAuthMethod( + tokenId: BigNumberish, + authMethodType: BigNumberish, + id: BytesLike, + overrides?: CallOverrides + ): Promise; + + isPermittedAuthMethodScopePresent( + tokenId: BigNumberish, + authMethodType: BigNumberish, + id: BytesLike, + scopeId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + owner(overrides?: CallOverrides): Promise; + + removePermittedAction( + tokenId: BigNumberish, + ipfsCID: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + + removePermittedAddress( + tokenId: BigNumberish, + user: string, + overrides?: Overrides & { from?: string } + ): Promise; + + removePermittedAuthMethod( + tokenId: BigNumberish, + authMethodType: BigNumberish, + id: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + + removePermittedAuthMethodScope( + tokenId: BigNumberish, + authMethodType: BigNumberish, + id: BytesLike, + scopeId: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + renounceOwnership( + overrides?: Overrides & { from?: string } + ): Promise; + + setContractResolver( + newResolverAddress: string, + overrides?: Overrides & { from?: string } + ): Promise; + + setRootHash( + tokenId: BigNumberish, + group: BigNumberish, + root: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + + transferOwnership( + newOwner: string, + overrides?: Overrides & { from?: string } + ): Promise; + + verifyState( + tokenId: BigNumberish, + group: BigNumberish, + proof: BytesLike[], + leaf: BytesLike, + overrides?: CallOverrides + ): Promise; + + verifyStates( + tokenId: BigNumberish, + group: BigNumberish, + proof: BytesLike[], + proofFlags: boolean[], + leaves: BytesLike[], + overrides?: CallOverrides + ): Promise; + }; +} diff --git a/tools/scripts/lit-contracts/PKPPermissions.sol/PKPPermissionsContract.js b/tools/scripts/lit-contracts/PKPPermissions.sol/PKPPermissionsContract.js new file mode 100644 index 0000000000..1b33ab5b79 --- /dev/null +++ b/tools/scripts/lit-contracts/PKPPermissions.sol/PKPPermissionsContract.js @@ -0,0 +1,8 @@ +import { ethers } from "ethers"; +import { PKPPermissionsData } from "./PKPPermissionsData.js"; + +export const getPKPPermissionsContract = (provider) => new ethers.Contract( + PKPPermissionsData.address, + PKPPermissionsData.abi, + provider +); \ No newline at end of file diff --git a/tools/scripts/lit-contracts/PKPPermissions.sol/PKPPermissionsContract.mjs b/tools/scripts/lit-contracts/PKPPermissions.sol/PKPPermissionsContract.mjs new file mode 100644 index 0000000000..6702e76129 --- /dev/null +++ b/tools/scripts/lit-contracts/PKPPermissions.sol/PKPPermissionsContract.mjs @@ -0,0 +1,8 @@ +import { ethers } from "ethers"; +import { PKPPermissionsData } from "./PKPPermissionsData.mjs"; + +export const getPKPPermissionsContract = (provider) => new ethers.Contract( + PKPPermissionsData.address, + PKPPermissionsData.abi, + provider +); \ No newline at end of file diff --git a/tools/scripts/lit-contracts/PKPPermissions.sol/PKPPermissionsContract.ts b/tools/scripts/lit-contracts/PKPPermissions.sol/PKPPermissionsContract.ts new file mode 100644 index 0000000000..fe1dc07189 --- /dev/null +++ b/tools/scripts/lit-contracts/PKPPermissions.sol/PKPPermissionsContract.ts @@ -0,0 +1,11 @@ +import { ethers } from "ethers"; +import { PKPPermissionsData } from "./PKPPermissionsData"; +import { PKPPermissions } from "./PKPPermissions"; + +export const getPKPPermissionsContract = (provider: any) => { + return new ethers.Contract( + PKPPermissionsData.address, + PKPPermissionsData.abi, + provider + ) as unknown as PKPPermissions; +} \ No newline at end of file diff --git a/tools/scripts/lit-contracts/PKPPermissions.sol/PKPPermissionsData.js b/tools/scripts/lit-contracts/PKPPermissions.sol/PKPPermissionsData.js new file mode 100644 index 0000000000..5f408ef9fd --- /dev/null +++ b/tools/scripts/lit-contracts/PKPPermissions.sol/PKPPermissionsData.js @@ -0,0 +1,994 @@ +export const PKPPermissionsData = { + "date": "2023-09-10T22:33:17.000Z", + "address": "0x61Dc305F03cFF5Ba8f39D5F8F9BE2D3298e8aE38", + "contractName": "PKPPermissions", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_resolver", + "type": "address" + }, + { + "internalType": "enum ContractResolver.Env", + "name": "_env", + "type": "uint8" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "newResolverAddress", + "type": "address" + } + ], + "name": "ContractResolverAddressSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "authMethodType", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "id", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "userPubkey", + "type": "bytes" + } + ], + "name": "PermittedAuthMethodAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "authMethodType", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "id", + "type": "bytes" + } + ], + "name": "PermittedAuthMethodRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "authMethodType", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "id", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "scopeId", + "type": "uint256" + } + ], + "name": "PermittedAuthMethodScopeAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "authMethodType", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "id", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "scopeId", + "type": "uint256" + } + ], + "name": "PermittedAuthMethodScopeRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "group", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "root", + "type": "bytes32" + } + ], + "name": "RootHashUpdated", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "ipfsCID", + "type": "bytes" + }, + { + "internalType": "uint256[]", + "name": "scopes", + "type": "uint256[]" + } + ], + "name": "addPermittedAction", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "scopes", + "type": "uint256[]" + } + ], + "name": "addPermittedAddress", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "authMethodType", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "id", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "userPubkey", + "type": "bytes" + } + ], + "internalType": "struct PKPPermissions.AuthMethod", + "name": "authMethod", + "type": "tuple" + }, + { + "internalType": "uint256[]", + "name": "scopes", + "type": "uint256[]" + } + ], + "name": "addPermittedAuthMethod", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "authMethodType", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "id", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "scopeId", + "type": "uint256" + } + ], + "name": "addPermittedAuthMethodScope", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "authMethods", + "outputs": [ + { + "internalType": "uint256", + "name": "authMethodType", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "id", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "userPubkey", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "uint256[]", + "name": "permittedAuthMethodTypesToAdd", + "type": "uint256[]" + }, + { + "internalType": "bytes[]", + "name": "permittedAuthMethodIdsToAdd", + "type": "bytes[]" + }, + { + "internalType": "bytes[]", + "name": "permittedAuthMethodPubkeysToAdd", + "type": "bytes[]" + }, + { + "internalType": "uint256[][]", + "name": "permittedAuthMethodScopesToAdd", + "type": "uint256[][]" + }, + { + "internalType": "uint256[]", + "name": "permittedAuthMethodTypesToRemove", + "type": "uint256[]" + }, + { + "internalType": "bytes[]", + "name": "permittedAuthMethodIdsToRemove", + "type": "bytes[]" + } + ], + "name": "batchAddRemoveAuthMethods", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "contractResolver", + "outputs": [ + { + "internalType": "contract ContractResolver", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "env", + "outputs": [ + { + "internalType": "enum ContractResolver.Env", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "authMethodType", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "id", + "type": "bytes" + } + ], + "name": "getAuthMethodId", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "getEthAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "getPermittedActions", + "outputs": [ + { + "internalType": "bytes[]", + "name": "", + "type": "bytes[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "getPermittedAddresses", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "authMethodType", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "id", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "maxScopeId", + "type": "uint256" + } + ], + "name": "getPermittedAuthMethodScopes", + "outputs": [ + { + "internalType": "bool[]", + "name": "", + "type": "bool[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "getPermittedAuthMethods", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "authMethodType", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "id", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "userPubkey", + "type": "bytes" + } + ], + "internalType": "struct PKPPermissions.AuthMethod[]", + "name": "", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPkpNftAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "getPubkey", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getRouterAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "authMethodType", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "id", + "type": "bytes" + } + ], + "name": "getTokenIdsForAuthMethod", + "outputs": [ + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "authMethodType", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "id", + "type": "bytes" + } + ], + "name": "getUserPubkeyForAuthMethod", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "ipfsCID", + "type": "bytes" + } + ], + "name": "isPermittedAction", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "user", + "type": "address" + } + ], + "name": "isPermittedAddress", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "authMethodType", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "id", + "type": "bytes" + } + ], + "name": "isPermittedAuthMethod", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "authMethodType", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "id", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "scopeId", + "type": "uint256" + } + ], + "name": "isPermittedAuthMethodScopePresent", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "ipfsCID", + "type": "bytes" + } + ], + "name": "removePermittedAction", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "user", + "type": "address" + } + ], + "name": "removePermittedAddress", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "authMethodType", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "id", + "type": "bytes" + } + ], + "name": "removePermittedAuthMethod", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "authMethodType", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "id", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "scopeId", + "type": "uint256" + } + ], + "name": "removePermittedAuthMethodScope", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newResolverAddress", + "type": "address" + } + ], + "name": "setContractResolver", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "group", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "root", + "type": "bytes32" + } + ], + "name": "setRootHash", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "group", + "type": "uint256" + }, + { + "internalType": "bytes32[]", + "name": "proof", + "type": "bytes32[]" + }, + { + "internalType": "bytes32", + "name": "leaf", + "type": "bytes32" + } + ], + "name": "verifyState", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "group", + "type": "uint256" + }, + { + "internalType": "bytes32[]", + "name": "proof", + "type": "bytes32[]" + }, + { + "internalType": "bool[]", + "name": "proofFlags", + "type": "bool[]" + }, + { + "internalType": "bytes32[]", + "name": "leaves", + "type": "bytes32[]" + } + ], + "name": "verifyStates", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ] +} \ No newline at end of file diff --git a/tools/scripts/lit-contracts/PKPPermissions.sol/PKPPermissionsData.mjs b/tools/scripts/lit-contracts/PKPPermissions.sol/PKPPermissionsData.mjs new file mode 100644 index 0000000000..5f408ef9fd --- /dev/null +++ b/tools/scripts/lit-contracts/PKPPermissions.sol/PKPPermissionsData.mjs @@ -0,0 +1,994 @@ +export const PKPPermissionsData = { + "date": "2023-09-10T22:33:17.000Z", + "address": "0x61Dc305F03cFF5Ba8f39D5F8F9BE2D3298e8aE38", + "contractName": "PKPPermissions", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_resolver", + "type": "address" + }, + { + "internalType": "enum ContractResolver.Env", + "name": "_env", + "type": "uint8" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "newResolverAddress", + "type": "address" + } + ], + "name": "ContractResolverAddressSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "authMethodType", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "id", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "userPubkey", + "type": "bytes" + } + ], + "name": "PermittedAuthMethodAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "authMethodType", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "id", + "type": "bytes" + } + ], + "name": "PermittedAuthMethodRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "authMethodType", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "id", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "scopeId", + "type": "uint256" + } + ], + "name": "PermittedAuthMethodScopeAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "authMethodType", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "id", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "scopeId", + "type": "uint256" + } + ], + "name": "PermittedAuthMethodScopeRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "group", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "root", + "type": "bytes32" + } + ], + "name": "RootHashUpdated", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "ipfsCID", + "type": "bytes" + }, + { + "internalType": "uint256[]", + "name": "scopes", + "type": "uint256[]" + } + ], + "name": "addPermittedAction", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "scopes", + "type": "uint256[]" + } + ], + "name": "addPermittedAddress", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "authMethodType", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "id", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "userPubkey", + "type": "bytes" + } + ], + "internalType": "struct PKPPermissions.AuthMethod", + "name": "authMethod", + "type": "tuple" + }, + { + "internalType": "uint256[]", + "name": "scopes", + "type": "uint256[]" + } + ], + "name": "addPermittedAuthMethod", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "authMethodType", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "id", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "scopeId", + "type": "uint256" + } + ], + "name": "addPermittedAuthMethodScope", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "authMethods", + "outputs": [ + { + "internalType": "uint256", + "name": "authMethodType", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "id", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "userPubkey", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "uint256[]", + "name": "permittedAuthMethodTypesToAdd", + "type": "uint256[]" + }, + { + "internalType": "bytes[]", + "name": "permittedAuthMethodIdsToAdd", + "type": "bytes[]" + }, + { + "internalType": "bytes[]", + "name": "permittedAuthMethodPubkeysToAdd", + "type": "bytes[]" + }, + { + "internalType": "uint256[][]", + "name": "permittedAuthMethodScopesToAdd", + "type": "uint256[][]" + }, + { + "internalType": "uint256[]", + "name": "permittedAuthMethodTypesToRemove", + "type": "uint256[]" + }, + { + "internalType": "bytes[]", + "name": "permittedAuthMethodIdsToRemove", + "type": "bytes[]" + } + ], + "name": "batchAddRemoveAuthMethods", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "contractResolver", + "outputs": [ + { + "internalType": "contract ContractResolver", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "env", + "outputs": [ + { + "internalType": "enum ContractResolver.Env", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "authMethodType", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "id", + "type": "bytes" + } + ], + "name": "getAuthMethodId", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "getEthAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "getPermittedActions", + "outputs": [ + { + "internalType": "bytes[]", + "name": "", + "type": "bytes[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "getPermittedAddresses", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "authMethodType", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "id", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "maxScopeId", + "type": "uint256" + } + ], + "name": "getPermittedAuthMethodScopes", + "outputs": [ + { + "internalType": "bool[]", + "name": "", + "type": "bool[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "getPermittedAuthMethods", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "authMethodType", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "id", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "userPubkey", + "type": "bytes" + } + ], + "internalType": "struct PKPPermissions.AuthMethod[]", + "name": "", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPkpNftAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "getPubkey", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getRouterAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "authMethodType", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "id", + "type": "bytes" + } + ], + "name": "getTokenIdsForAuthMethod", + "outputs": [ + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "authMethodType", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "id", + "type": "bytes" + } + ], + "name": "getUserPubkeyForAuthMethod", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "ipfsCID", + "type": "bytes" + } + ], + "name": "isPermittedAction", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "user", + "type": "address" + } + ], + "name": "isPermittedAddress", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "authMethodType", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "id", + "type": "bytes" + } + ], + "name": "isPermittedAuthMethod", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "authMethodType", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "id", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "scopeId", + "type": "uint256" + } + ], + "name": "isPermittedAuthMethodScopePresent", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "ipfsCID", + "type": "bytes" + } + ], + "name": "removePermittedAction", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "user", + "type": "address" + } + ], + "name": "removePermittedAddress", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "authMethodType", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "id", + "type": "bytes" + } + ], + "name": "removePermittedAuthMethod", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "authMethodType", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "id", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "scopeId", + "type": "uint256" + } + ], + "name": "removePermittedAuthMethodScope", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newResolverAddress", + "type": "address" + } + ], + "name": "setContractResolver", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "group", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "root", + "type": "bytes32" + } + ], + "name": "setRootHash", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "group", + "type": "uint256" + }, + { + "internalType": "bytes32[]", + "name": "proof", + "type": "bytes32[]" + }, + { + "internalType": "bytes32", + "name": "leaf", + "type": "bytes32" + } + ], + "name": "verifyState", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "group", + "type": "uint256" + }, + { + "internalType": "bytes32[]", + "name": "proof", + "type": "bytes32[]" + }, + { + "internalType": "bool[]", + "name": "proofFlags", + "type": "bool[]" + }, + { + "internalType": "bytes32[]", + "name": "leaves", + "type": "bytes32[]" + } + ], + "name": "verifyStates", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ] +} \ No newline at end of file diff --git a/tools/scripts/lit-contracts/PKPPermissions.sol/PKPPermissionsData.ts b/tools/scripts/lit-contracts/PKPPermissions.sol/PKPPermissionsData.ts new file mode 100644 index 0000000000..5f408ef9fd --- /dev/null +++ b/tools/scripts/lit-contracts/PKPPermissions.sol/PKPPermissionsData.ts @@ -0,0 +1,994 @@ +export const PKPPermissionsData = { + "date": "2023-09-10T22:33:17.000Z", + "address": "0x61Dc305F03cFF5Ba8f39D5F8F9BE2D3298e8aE38", + "contractName": "PKPPermissions", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_resolver", + "type": "address" + }, + { + "internalType": "enum ContractResolver.Env", + "name": "_env", + "type": "uint8" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "newResolverAddress", + "type": "address" + } + ], + "name": "ContractResolverAddressSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "authMethodType", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "id", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "userPubkey", + "type": "bytes" + } + ], + "name": "PermittedAuthMethodAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "authMethodType", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "id", + "type": "bytes" + } + ], + "name": "PermittedAuthMethodRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "authMethodType", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "id", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "scopeId", + "type": "uint256" + } + ], + "name": "PermittedAuthMethodScopeAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "authMethodType", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "id", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "scopeId", + "type": "uint256" + } + ], + "name": "PermittedAuthMethodScopeRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "group", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "root", + "type": "bytes32" + } + ], + "name": "RootHashUpdated", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "ipfsCID", + "type": "bytes" + }, + { + "internalType": "uint256[]", + "name": "scopes", + "type": "uint256[]" + } + ], + "name": "addPermittedAction", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "scopes", + "type": "uint256[]" + } + ], + "name": "addPermittedAddress", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "authMethodType", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "id", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "userPubkey", + "type": "bytes" + } + ], + "internalType": "struct PKPPermissions.AuthMethod", + "name": "authMethod", + "type": "tuple" + }, + { + "internalType": "uint256[]", + "name": "scopes", + "type": "uint256[]" + } + ], + "name": "addPermittedAuthMethod", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "authMethodType", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "id", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "scopeId", + "type": "uint256" + } + ], + "name": "addPermittedAuthMethodScope", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "authMethods", + "outputs": [ + { + "internalType": "uint256", + "name": "authMethodType", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "id", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "userPubkey", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "uint256[]", + "name": "permittedAuthMethodTypesToAdd", + "type": "uint256[]" + }, + { + "internalType": "bytes[]", + "name": "permittedAuthMethodIdsToAdd", + "type": "bytes[]" + }, + { + "internalType": "bytes[]", + "name": "permittedAuthMethodPubkeysToAdd", + "type": "bytes[]" + }, + { + "internalType": "uint256[][]", + "name": "permittedAuthMethodScopesToAdd", + "type": "uint256[][]" + }, + { + "internalType": "uint256[]", + "name": "permittedAuthMethodTypesToRemove", + "type": "uint256[]" + }, + { + "internalType": "bytes[]", + "name": "permittedAuthMethodIdsToRemove", + "type": "bytes[]" + } + ], + "name": "batchAddRemoveAuthMethods", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "contractResolver", + "outputs": [ + { + "internalType": "contract ContractResolver", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "env", + "outputs": [ + { + "internalType": "enum ContractResolver.Env", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "authMethodType", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "id", + "type": "bytes" + } + ], + "name": "getAuthMethodId", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "getEthAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "getPermittedActions", + "outputs": [ + { + "internalType": "bytes[]", + "name": "", + "type": "bytes[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "getPermittedAddresses", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "authMethodType", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "id", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "maxScopeId", + "type": "uint256" + } + ], + "name": "getPermittedAuthMethodScopes", + "outputs": [ + { + "internalType": "bool[]", + "name": "", + "type": "bool[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "getPermittedAuthMethods", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "authMethodType", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "id", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "userPubkey", + "type": "bytes" + } + ], + "internalType": "struct PKPPermissions.AuthMethod[]", + "name": "", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPkpNftAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "getPubkey", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getRouterAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "authMethodType", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "id", + "type": "bytes" + } + ], + "name": "getTokenIdsForAuthMethod", + "outputs": [ + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "authMethodType", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "id", + "type": "bytes" + } + ], + "name": "getUserPubkeyForAuthMethod", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "ipfsCID", + "type": "bytes" + } + ], + "name": "isPermittedAction", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "user", + "type": "address" + } + ], + "name": "isPermittedAddress", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "authMethodType", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "id", + "type": "bytes" + } + ], + "name": "isPermittedAuthMethod", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "authMethodType", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "id", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "scopeId", + "type": "uint256" + } + ], + "name": "isPermittedAuthMethodScopePresent", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "ipfsCID", + "type": "bytes" + } + ], + "name": "removePermittedAction", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "user", + "type": "address" + } + ], + "name": "removePermittedAddress", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "authMethodType", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "id", + "type": "bytes" + } + ], + "name": "removePermittedAuthMethod", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "authMethodType", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "id", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "scopeId", + "type": "uint256" + } + ], + "name": "removePermittedAuthMethodScope", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newResolverAddress", + "type": "address" + } + ], + "name": "setContractResolver", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "group", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "root", + "type": "bytes32" + } + ], + "name": "setRootHash", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "group", + "type": "uint256" + }, + { + "internalType": "bytes32[]", + "name": "proof", + "type": "bytes32[]" + }, + { + "internalType": "bytes32", + "name": "leaf", + "type": "bytes32" + } + ], + "name": "verifyState", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "group", + "type": "uint256" + }, + { + "internalType": "bytes32[]", + "name": "proof", + "type": "bytes32[]" + }, + { + "internalType": "bool[]", + "name": "proofFlags", + "type": "bool[]" + }, + { + "internalType": "bytes32[]", + "name": "leaves", + "type": "bytes32[]" + } + ], + "name": "verifyStates", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ] +} \ No newline at end of file diff --git a/tools/scripts/lit-contracts/PKPPermissions.sol/common.ts b/tools/scripts/lit-contracts/PKPPermissions.sol/common.ts new file mode 100644 index 0000000000..2fc40c7fb1 --- /dev/null +++ b/tools/scripts/lit-contracts/PKPPermissions.sol/common.ts @@ -0,0 +1,44 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { Listener } from "@ethersproject/providers"; +import type { Event, EventFilter } from "ethers"; + +export interface TypedEvent< + TArgsArray extends Array = any, + TArgsObject = any +> extends Event { + args: TArgsArray & TArgsObject; +} + +export interface TypedEventFilter<_TEvent extends TypedEvent> + extends EventFilter {} + +export interface TypedListener { + (...listenerArg: [...__TypechainArgsArray, TEvent]): void; +} + +type __TypechainArgsArray = T extends TypedEvent ? U : never; + +export interface OnEvent { + ( + eventFilter: TypedEventFilter, + listener: TypedListener + ): TRes; + (eventName: string, listener: Listener): TRes; +} + +export type MinEthersFactory = { + deploy(...a: ARGS[]): Promise; +}; + +export type GetContractTypeFromFactory = F extends MinEthersFactory< + infer C, + any +> + ? C + : never; + +export type GetARGsTypeFromFactory = F extends MinEthersFactory + ? Parameters + : never; diff --git a/tools/scripts/lit-contracts/PKPPermissions.sol/factories/PKPPermissions__factory.ts b/tools/scripts/lit-contracts/PKPPermissions.sol/factories/PKPPermissions__factory.ts new file mode 100644 index 0000000000..25908ca03c --- /dev/null +++ b/tools/scripts/lit-contracts/PKPPermissions.sol/factories/PKPPermissions__factory.ts @@ -0,0 +1,1013 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Signer, utils } from "ethers"; +import type { Provider } from "@ethersproject/providers"; +import type { + PKPPermissions, + PKPPermissionsInterface, +} from "../PKPPermissions"; + +const _abi = [ + { + inputs: [ + { + internalType: "address", + name: "_resolver", + type: "address", + }, + { + internalType: "enum ContractResolver.Env", + name: "_env", + type: "uint8", + }, + ], + stateMutability: "nonpayable", + type: "constructor", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "address", + name: "newResolverAddress", + type: "address", + }, + ], + name: "ContractResolverAddressSet", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "previousOwner", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "newOwner", + type: "address", + }, + ], + name: "OwnershipTransferred", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "uint256", + name: "tokenId", + type: "uint256", + }, + { + indexed: false, + internalType: "uint256", + name: "authMethodType", + type: "uint256", + }, + { + indexed: false, + internalType: "bytes", + name: "id", + type: "bytes", + }, + { + indexed: false, + internalType: "bytes", + name: "userPubkey", + type: "bytes", + }, + ], + name: "PermittedAuthMethodAdded", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "uint256", + name: "tokenId", + type: "uint256", + }, + { + indexed: false, + internalType: "uint256", + name: "authMethodType", + type: "uint256", + }, + { + indexed: false, + internalType: "bytes", + name: "id", + type: "bytes", + }, + ], + name: "PermittedAuthMethodRemoved", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "uint256", + name: "tokenId", + type: "uint256", + }, + { + indexed: false, + internalType: "uint256", + name: "authMethodType", + type: "uint256", + }, + { + indexed: false, + internalType: "bytes", + name: "id", + type: "bytes", + }, + { + indexed: false, + internalType: "uint256", + name: "scopeId", + type: "uint256", + }, + ], + name: "PermittedAuthMethodScopeAdded", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "uint256", + name: "tokenId", + type: "uint256", + }, + { + indexed: false, + internalType: "uint256", + name: "authMethodType", + type: "uint256", + }, + { + indexed: false, + internalType: "bytes", + name: "id", + type: "bytes", + }, + { + indexed: false, + internalType: "uint256", + name: "scopeId", + type: "uint256", + }, + ], + name: "PermittedAuthMethodScopeRemoved", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "uint256", + name: "tokenId", + type: "uint256", + }, + { + indexed: true, + internalType: "uint256", + name: "group", + type: "uint256", + }, + { + indexed: false, + internalType: "bytes32", + name: "root", + type: "bytes32", + }, + ], + name: "RootHashUpdated", + type: "event", + }, + { + inputs: [ + { + internalType: "uint256", + name: "tokenId", + type: "uint256", + }, + { + internalType: "bytes", + name: "ipfsCID", + type: "bytes", + }, + { + internalType: "uint256[]", + name: "scopes", + type: "uint256[]", + }, + ], + name: "addPermittedAction", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "tokenId", + type: "uint256", + }, + { + internalType: "address", + name: "user", + type: "address", + }, + { + internalType: "uint256[]", + name: "scopes", + type: "uint256[]", + }, + ], + name: "addPermittedAddress", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "tokenId", + type: "uint256", + }, + { + components: [ + { + internalType: "uint256", + name: "authMethodType", + type: "uint256", + }, + { + internalType: "bytes", + name: "id", + type: "bytes", + }, + { + internalType: "bytes", + name: "userPubkey", + type: "bytes", + }, + ], + internalType: "struct PKPPermissions.AuthMethod", + name: "authMethod", + type: "tuple", + }, + { + internalType: "uint256[]", + name: "scopes", + type: "uint256[]", + }, + ], + name: "addPermittedAuthMethod", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "tokenId", + type: "uint256", + }, + { + internalType: "uint256", + name: "authMethodType", + type: "uint256", + }, + { + internalType: "bytes", + name: "id", + type: "bytes", + }, + { + internalType: "uint256", + name: "scopeId", + type: "uint256", + }, + ], + name: "addPermittedAuthMethodScope", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + name: "authMethods", + outputs: [ + { + internalType: "uint256", + name: "authMethodType", + type: "uint256", + }, + { + internalType: "bytes", + name: "id", + type: "bytes", + }, + { + internalType: "bytes", + name: "userPubkey", + type: "bytes", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "tokenId", + type: "uint256", + }, + { + internalType: "uint256[]", + name: "permittedAuthMethodTypesToAdd", + type: "uint256[]", + }, + { + internalType: "bytes[]", + name: "permittedAuthMethodIdsToAdd", + type: "bytes[]", + }, + { + internalType: "bytes[]", + name: "permittedAuthMethodPubkeysToAdd", + type: "bytes[]", + }, + { + internalType: "uint256[][]", + name: "permittedAuthMethodScopesToAdd", + type: "uint256[][]", + }, + { + internalType: "uint256[]", + name: "permittedAuthMethodTypesToRemove", + type: "uint256[]", + }, + { + internalType: "bytes[]", + name: "permittedAuthMethodIdsToRemove", + type: "bytes[]", + }, + ], + name: "batchAddRemoveAuthMethods", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "contractResolver", + outputs: [ + { + internalType: "contract ContractResolver", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "env", + outputs: [ + { + internalType: "enum ContractResolver.Env", + name: "", + type: "uint8", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "authMethodType", + type: "uint256", + }, + { + internalType: "bytes", + name: "id", + type: "bytes", + }, + ], + name: "getAuthMethodId", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "pure", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "tokenId", + type: "uint256", + }, + ], + name: "getEthAddress", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "tokenId", + type: "uint256", + }, + ], + name: "getPermittedActions", + outputs: [ + { + internalType: "bytes[]", + name: "", + type: "bytes[]", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "tokenId", + type: "uint256", + }, + ], + name: "getPermittedAddresses", + outputs: [ + { + internalType: "address[]", + name: "", + type: "address[]", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "tokenId", + type: "uint256", + }, + { + internalType: "uint256", + name: "authMethodType", + type: "uint256", + }, + { + internalType: "bytes", + name: "id", + type: "bytes", + }, + { + internalType: "uint256", + name: "maxScopeId", + type: "uint256", + }, + ], + name: "getPermittedAuthMethodScopes", + outputs: [ + { + internalType: "bool[]", + name: "", + type: "bool[]", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "tokenId", + type: "uint256", + }, + ], + name: "getPermittedAuthMethods", + outputs: [ + { + components: [ + { + internalType: "uint256", + name: "authMethodType", + type: "uint256", + }, + { + internalType: "bytes", + name: "id", + type: "bytes", + }, + { + internalType: "bytes", + name: "userPubkey", + type: "bytes", + }, + ], + internalType: "struct PKPPermissions.AuthMethod[]", + name: "", + type: "tuple[]", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "getPkpNftAddress", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "tokenId", + type: "uint256", + }, + ], + name: "getPubkey", + outputs: [ + { + internalType: "bytes", + name: "", + type: "bytes", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "getRouterAddress", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "authMethodType", + type: "uint256", + }, + { + internalType: "bytes", + name: "id", + type: "bytes", + }, + ], + name: "getTokenIdsForAuthMethod", + outputs: [ + { + internalType: "uint256[]", + name: "", + type: "uint256[]", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "authMethodType", + type: "uint256", + }, + { + internalType: "bytes", + name: "id", + type: "bytes", + }, + ], + name: "getUserPubkeyForAuthMethod", + outputs: [ + { + internalType: "bytes", + name: "", + type: "bytes", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "tokenId", + type: "uint256", + }, + { + internalType: "bytes", + name: "ipfsCID", + type: "bytes", + }, + ], + name: "isPermittedAction", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "tokenId", + type: "uint256", + }, + { + internalType: "address", + name: "user", + type: "address", + }, + ], + name: "isPermittedAddress", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "tokenId", + type: "uint256", + }, + { + internalType: "uint256", + name: "authMethodType", + type: "uint256", + }, + { + internalType: "bytes", + name: "id", + type: "bytes", + }, + ], + name: "isPermittedAuthMethod", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "tokenId", + type: "uint256", + }, + { + internalType: "uint256", + name: "authMethodType", + type: "uint256", + }, + { + internalType: "bytes", + name: "id", + type: "bytes", + }, + { + internalType: "uint256", + name: "scopeId", + type: "uint256", + }, + ], + name: "isPermittedAuthMethodScopePresent", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "owner", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "tokenId", + type: "uint256", + }, + { + internalType: "bytes", + name: "ipfsCID", + type: "bytes", + }, + ], + name: "removePermittedAction", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "tokenId", + type: "uint256", + }, + { + internalType: "address", + name: "user", + type: "address", + }, + ], + name: "removePermittedAddress", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "tokenId", + type: "uint256", + }, + { + internalType: "uint256", + name: "authMethodType", + type: "uint256", + }, + { + internalType: "bytes", + name: "id", + type: "bytes", + }, + ], + name: "removePermittedAuthMethod", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "tokenId", + type: "uint256", + }, + { + internalType: "uint256", + name: "authMethodType", + type: "uint256", + }, + { + internalType: "bytes", + name: "id", + type: "bytes", + }, + { + internalType: "uint256", + name: "scopeId", + type: "uint256", + }, + ], + name: "removePermittedAuthMethodScope", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "renounceOwnership", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "newResolverAddress", + type: "address", + }, + ], + name: "setContractResolver", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "tokenId", + type: "uint256", + }, + { + internalType: "uint256", + name: "group", + type: "uint256", + }, + { + internalType: "bytes32", + name: "root", + type: "bytes32", + }, + ], + name: "setRootHash", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "newOwner", + type: "address", + }, + ], + name: "transferOwnership", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "tokenId", + type: "uint256", + }, + { + internalType: "uint256", + name: "group", + type: "uint256", + }, + { + internalType: "bytes32[]", + name: "proof", + type: "bytes32[]", + }, + { + internalType: "bytes32", + name: "leaf", + type: "bytes32", + }, + ], + name: "verifyState", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "tokenId", + type: "uint256", + }, + { + internalType: "uint256", + name: "group", + type: "uint256", + }, + { + internalType: "bytes32[]", + name: "proof", + type: "bytes32[]", + }, + { + internalType: "bool[]", + name: "proofFlags", + type: "bool[]", + }, + { + internalType: "bytes32[]", + name: "leaves", + type: "bytes32[]", + }, + ], + name: "verifyStates", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, +] as const; + +export class PKPPermissions__factory { + static readonly abi = _abi; + static createInterface(): PKPPermissionsInterface { + return new utils.Interface(_abi) as PKPPermissionsInterface; + } + static connect( + address: string, + signerOrProvider: Signer | Provider + ): PKPPermissions { + return new Contract(address, _abi, signerOrProvider) as PKPPermissions; + } +} diff --git a/tools/scripts/lit-contracts/PKPPermissions.sol/factories/index.ts b/tools/scripts/lit-contracts/PKPPermissions.sol/factories/index.ts new file mode 100644 index 0000000000..4c8a00df4a --- /dev/null +++ b/tools/scripts/lit-contracts/PKPPermissions.sol/factories/index.ts @@ -0,0 +1,4 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export { PKPPermissions__factory } from "./PKPPermissions__factory"; diff --git a/tools/scripts/lit-contracts/PKPPermissions.sol/index.js b/tools/scripts/lit-contracts/PKPPermissions.sol/index.js new file mode 100644 index 0000000000..94b1f7e07b --- /dev/null +++ b/tools/scripts/lit-contracts/PKPPermissions.sol/index.js @@ -0,0 +1,2 @@ +export * from "./PKPPermissionsData.js"; +export * from "./PKPPermissionsContract.js"; \ No newline at end of file diff --git a/tools/scripts/lit-contracts/PKPPermissions.sol/index.mjs b/tools/scripts/lit-contracts/PKPPermissions.sol/index.mjs new file mode 100644 index 0000000000..17b83f5a2b --- /dev/null +++ b/tools/scripts/lit-contracts/PKPPermissions.sol/index.mjs @@ -0,0 +1,2 @@ +export * from "./PKPPermissionsData.mjs"; +export * from "./PKPPermissionsContract.mjs"; \ No newline at end of file diff --git a/tools/scripts/lit-contracts/PKPPermissions.sol/index.ts b/tools/scripts/lit-contracts/PKPPermissions.sol/index.ts new file mode 100644 index 0000000000..0cd252a471 --- /dev/null +++ b/tools/scripts/lit-contracts/PKPPermissions.sol/index.ts @@ -0,0 +1,3 @@ +export * from "./PKPPermissionsData"; +export * from "./PKPPermissionsContract"; +export * from "./PKPPermissions"; \ No newline at end of file diff --git a/tools/scripts/lit-contracts/PubkeyRouter.sol/PubkeyRouter.json b/tools/scripts/lit-contracts/PubkeyRouter.sol/PubkeyRouter.json new file mode 100644 index 0000000000..2853d1141e --- /dev/null +++ b/tools/scripts/lit-contracts/PubkeyRouter.sol/PubkeyRouter.json @@ -0,0 +1,783 @@ +{ + "date": "2023-09-10T22:43:15.000Z", + "address": "0xb26b4DC365843cDaE996F526913D3D4F45343aE8", + "contractName": "PubkeyRouter", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_resolver", + "type": "address" + }, + { + "internalType": "enum ContractResolver.Env", + "name": "_env", + "type": "uint8" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "newResolverAddress", + "type": "address" + } + ], + "name": "ContractResolverAddressSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "pubkey", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "address", + "name": "stakingContract", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "keyType", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "derivedKeyId", + "type": "bytes32" + } + ], + "name": "PubkeyRoutingDataSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "stakingContract", + "type": "address" + }, + { + "components": [ + { + "internalType": "bytes", + "name": "pubkey", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "keyType", + "type": "uint256" + } + ], + "indexed": false, + "internalType": "struct IPubkeyRouter.RootKey", + "name": "rootKey", + "type": "tuple" + } + ], + "name": "RootKeySet", + "type": "event" + }, + { + "inputs": [], + "name": "ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + } + ], + "internalType": "struct IPubkeyRouter.Signature[]", + "name": "signatures", + "type": "tuple[]" + }, + { + "internalType": "bytes", + "name": "signedMessage", + "type": "bytes" + }, + { + "internalType": "address", + "name": "stakingContractAddress", + "type": "address" + } + ], + "name": "checkNodeSignatures", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "contractResolver", + "outputs": [ + { + "internalType": "contract ContractResolver", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "pubkey", + "type": "bytes" + } + ], + "name": "deriveEthAddressFromPubkey", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "env", + "outputs": [ + { + "internalType": "enum ContractResolver.Env", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "ethAddressToPkpId", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "stakingContract", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "derivedKeyId", + "type": "bytes32" + } + ], + "name": "getDerivedPubkey", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "getEthAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPkpNftAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "getPubkey", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "stakingContract", + "type": "address" + } + ], + "name": "getRootKeys", + "outputs": [ + { + "components": [ + { + "internalType": "bytes", + "name": "pubkey", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "keyType", + "type": "uint256" + } + ], + "internalType": "struct IPubkeyRouter.RootKey[]", + "name": "", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "getRoutingData", + "outputs": [ + { + "components": [ + { + "internalType": "bytes", + "name": "pubkey", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "keyType", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "derivedKeyId", + "type": "bytes32" + } + ], + "internalType": "struct PubkeyRouter.PubkeyRoutingData", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "isRouted", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "pubkeys", + "outputs": [ + { + "internalType": "bytes", + "name": "pubkey", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "keyType", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "derivedKeyId", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "rootKeys", + "outputs": [ + { + "internalType": "bytes", + "name": "pubkey", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "keyType", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newResolverAddress", + "type": "address" + } + ], + "name": "setContractResolver", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "pubkey", + "type": "bytes" + }, + { + "internalType": "address", + "name": "stakingContractAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "keyType", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "derivedKeyId", + "type": "bytes32" + } + ], + "name": "setRoutingData", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "pubkey", + "type": "bytes" + }, + { + "internalType": "address", + "name": "stakingContract", + "type": "address" + }, + { + "internalType": "uint256", + "name": "keyType", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "derivedKeyId", + "type": "bytes32" + } + ], + "name": "setRoutingDataAsAdmin", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "stakingContractAddress", + "type": "address" + }, + { + "components": [ + { + "internalType": "bytes", + "name": "pubkey", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "keyType", + "type": "uint256" + } + ], + "internalType": "struct IPubkeyRouter.RootKey[]", + "name": "newRootKeys", + "type": "tuple[]" + } + ], + "name": "voteForRootKeys", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "name": "votesToRegisterRootKeys", + "outputs": [ + { + "internalType": "uint256", + "name": "votes", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + } + ] +} \ No newline at end of file diff --git a/tools/scripts/lit-contracts/PubkeyRouter.sol/PubkeyRouter.ts b/tools/scripts/lit-contracts/PubkeyRouter.sol/PubkeyRouter.ts new file mode 100644 index 0000000000..5295fe4801 --- /dev/null +++ b/tools/scripts/lit-contracts/PubkeyRouter.sol/PubkeyRouter.ts @@ -0,0 +1,1186 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumber, + BigNumberish, + BytesLike, + CallOverrides, + ContractTransaction, + Overrides, + PopulatedTransaction, + Signer, + utils, +} from "ethers"; +import type { + FunctionFragment, + Result, + EventFragment, +} from "@ethersproject/abi"; +import type { Listener, Provider } from "@ethersproject/providers"; +import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, +} from "./common"; + +export declare namespace IPubkeyRouter { + export type RootKeyStruct = { pubkey: BytesLike; keyType: BigNumberish }; + + export type RootKeyStructOutput = [string, BigNumber] & { + pubkey: string; + keyType: BigNumber; + }; + + export type SignatureStruct = { r: BytesLike; s: BytesLike; v: BigNumberish }; + + export type SignatureStructOutput = [string, string, number] & { + r: string; + s: string; + v: number; + }; +} + +export declare namespace PubkeyRouter { + export type PubkeyRoutingDataStruct = { + pubkey: BytesLike; + keyType: BigNumberish; + derivedKeyId: BytesLike; + }; + + export type PubkeyRoutingDataStructOutput = [string, BigNumber, string] & { + pubkey: string; + keyType: BigNumber; + derivedKeyId: string; + }; +} + +export interface PubkeyRouterInterface extends utils.Interface { + functions: { + "ADMIN_ROLE()": FunctionFragment; + "DEFAULT_ADMIN_ROLE()": FunctionFragment; + "checkNodeSignatures((bytes32,bytes32,uint8)[],bytes,address)": FunctionFragment; + "contractResolver()": FunctionFragment; + "deriveEthAddressFromPubkey(bytes)": FunctionFragment; + "env()": FunctionFragment; + "ethAddressToPkpId(address)": FunctionFragment; + "getDerivedPubkey(address,bytes32)": FunctionFragment; + "getEthAddress(uint256)": FunctionFragment; + "getPkpNftAddress()": FunctionFragment; + "getPubkey(uint256)": FunctionFragment; + "getRoleAdmin(bytes32)": FunctionFragment; + "getRootKeys(address)": FunctionFragment; + "getRoutingData(uint256)": FunctionFragment; + "grantRole(bytes32,address)": FunctionFragment; + "hasRole(bytes32,address)": FunctionFragment; + "isRouted(uint256)": FunctionFragment; + "pubkeys(uint256)": FunctionFragment; + "renounceRole(bytes32,address)": FunctionFragment; + "revokeRole(bytes32,address)": FunctionFragment; + "rootKeys(address,uint256)": FunctionFragment; + "setContractResolver(address)": FunctionFragment; + "setRoutingData(uint256,bytes,address,uint256,bytes32)": FunctionFragment; + "setRoutingDataAsAdmin(uint256,bytes,address,uint256,bytes32)": FunctionFragment; + "supportsInterface(bytes4)": FunctionFragment; + "voteForRootKeys(address,(bytes,uint256)[])": FunctionFragment; + "votesToRegisterRootKeys(address,bytes)": FunctionFragment; + }; + + getFunction( + nameOrSignatureOrTopic: + | "ADMIN_ROLE" + | "DEFAULT_ADMIN_ROLE" + | "checkNodeSignatures" + | "contractResolver" + | "deriveEthAddressFromPubkey" + | "env" + | "ethAddressToPkpId" + | "getDerivedPubkey" + | "getEthAddress" + | "getPkpNftAddress" + | "getPubkey" + | "getRoleAdmin" + | "getRootKeys" + | "getRoutingData" + | "grantRole" + | "hasRole" + | "isRouted" + | "pubkeys" + | "renounceRole" + | "revokeRole" + | "rootKeys" + | "setContractResolver" + | "setRoutingData" + | "setRoutingDataAsAdmin" + | "supportsInterface" + | "voteForRootKeys" + | "votesToRegisterRootKeys" + ): FunctionFragment; + + encodeFunctionData( + functionFragment: "ADMIN_ROLE", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "DEFAULT_ADMIN_ROLE", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "checkNodeSignatures", + values: [IPubkeyRouter.SignatureStruct[], BytesLike, string] + ): string; + encodeFunctionData( + functionFragment: "contractResolver", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "deriveEthAddressFromPubkey", + values: [BytesLike] + ): string; + encodeFunctionData(functionFragment: "env", values?: undefined): string; + encodeFunctionData( + functionFragment: "ethAddressToPkpId", + values: [string] + ): string; + encodeFunctionData( + functionFragment: "getDerivedPubkey", + values: [string, BytesLike] + ): string; + encodeFunctionData( + functionFragment: "getEthAddress", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "getPkpNftAddress", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "getPubkey", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "getRoleAdmin", + values: [BytesLike] + ): string; + encodeFunctionData(functionFragment: "getRootKeys", values: [string]): string; + encodeFunctionData( + functionFragment: "getRoutingData", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "grantRole", + values: [BytesLike, string] + ): string; + encodeFunctionData( + functionFragment: "hasRole", + values: [BytesLike, string] + ): string; + encodeFunctionData( + functionFragment: "isRouted", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "pubkeys", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "renounceRole", + values: [BytesLike, string] + ): string; + encodeFunctionData( + functionFragment: "revokeRole", + values: [BytesLike, string] + ): string; + encodeFunctionData( + functionFragment: "rootKeys", + values: [string, BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "setContractResolver", + values: [string] + ): string; + encodeFunctionData( + functionFragment: "setRoutingData", + values: [BigNumberish, BytesLike, string, BigNumberish, BytesLike] + ): string; + encodeFunctionData( + functionFragment: "setRoutingDataAsAdmin", + values: [BigNumberish, BytesLike, string, BigNumberish, BytesLike] + ): string; + encodeFunctionData( + functionFragment: "supportsInterface", + values: [BytesLike] + ): string; + encodeFunctionData( + functionFragment: "voteForRootKeys", + values: [string, IPubkeyRouter.RootKeyStruct[]] + ): string; + encodeFunctionData( + functionFragment: "votesToRegisterRootKeys", + values: [string, BytesLike] + ): string; + + decodeFunctionResult(functionFragment: "ADMIN_ROLE", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "DEFAULT_ADMIN_ROLE", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "checkNodeSignatures", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "contractResolver", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "deriveEthAddressFromPubkey", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "env", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "ethAddressToPkpId", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getDerivedPubkey", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getEthAddress", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getPkpNftAddress", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "getPubkey", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "getRoleAdmin", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getRootKeys", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getRoutingData", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "grantRole", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "hasRole", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "isRouted", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "pubkeys", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "renounceRole", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "revokeRole", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "rootKeys", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "setContractResolver", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setRoutingData", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setRoutingDataAsAdmin", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "supportsInterface", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "voteForRootKeys", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "votesToRegisterRootKeys", + data: BytesLike + ): Result; + + events: { + "ContractResolverAddressSet(address)": EventFragment; + "PubkeyRoutingDataSet(uint256,bytes,address,uint256,bytes32)": EventFragment; + "RoleAdminChanged(bytes32,bytes32,bytes32)": EventFragment; + "RoleGranted(bytes32,address,address)": EventFragment; + "RoleRevoked(bytes32,address,address)": EventFragment; + "RootKeySet(address,(bytes,uint256))": EventFragment; + }; + + getEvent(nameOrSignatureOrTopic: "ContractResolverAddressSet"): EventFragment; + getEvent(nameOrSignatureOrTopic: "PubkeyRoutingDataSet"): EventFragment; + getEvent(nameOrSignatureOrTopic: "RoleAdminChanged"): EventFragment; + getEvent(nameOrSignatureOrTopic: "RoleGranted"): EventFragment; + getEvent(nameOrSignatureOrTopic: "RoleRevoked"): EventFragment; + getEvent(nameOrSignatureOrTopic: "RootKeySet"): EventFragment; +} + +export interface ContractResolverAddressSetEventObject { + newResolverAddress: string; +} +export type ContractResolverAddressSetEvent = TypedEvent< + [string], + ContractResolverAddressSetEventObject +>; + +export type ContractResolverAddressSetEventFilter = + TypedEventFilter; + +export interface PubkeyRoutingDataSetEventObject { + tokenId: BigNumber; + pubkey: string; + stakingContract: string; + keyType: BigNumber; + derivedKeyId: string; +} +export type PubkeyRoutingDataSetEvent = TypedEvent< + [BigNumber, string, string, BigNumber, string], + PubkeyRoutingDataSetEventObject +>; + +export type PubkeyRoutingDataSetEventFilter = + TypedEventFilter; + +export interface RoleAdminChangedEventObject { + role: string; + previousAdminRole: string; + newAdminRole: string; +} +export type RoleAdminChangedEvent = TypedEvent< + [string, string, string], + RoleAdminChangedEventObject +>; + +export type RoleAdminChangedEventFilter = + TypedEventFilter; + +export interface RoleGrantedEventObject { + role: string; + account: string; + sender: string; +} +export type RoleGrantedEvent = TypedEvent< + [string, string, string], + RoleGrantedEventObject +>; + +export type RoleGrantedEventFilter = TypedEventFilter; + +export interface RoleRevokedEventObject { + role: string; + account: string; + sender: string; +} +export type RoleRevokedEvent = TypedEvent< + [string, string, string], + RoleRevokedEventObject +>; + +export type RoleRevokedEventFilter = TypedEventFilter; + +export interface RootKeySetEventObject { + stakingContract: string; + rootKey: IPubkeyRouter.RootKeyStructOutput; +} +export type RootKeySetEvent = TypedEvent< + [string, IPubkeyRouter.RootKeyStructOutput], + RootKeySetEventObject +>; + +export type RootKeySetEventFilter = TypedEventFilter; + +export interface PubkeyRouter extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: PubkeyRouterInterface; + + queryFilter( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>; + + listeners( + eventFilter?: TypedEventFilter + ): Array>; + listeners(eventName?: string): Array; + removeAllListeners( + eventFilter: TypedEventFilter + ): this; + removeAllListeners(eventName?: string): this; + off: OnEvent; + on: OnEvent; + once: OnEvent; + removeListener: OnEvent; + + functions: { + ADMIN_ROLE(overrides?: CallOverrides): Promise<[string]>; + + DEFAULT_ADMIN_ROLE(overrides?: CallOverrides): Promise<[string]>; + + checkNodeSignatures( + signatures: IPubkeyRouter.SignatureStruct[], + signedMessage: BytesLike, + stakingContractAddress: string, + overrides?: CallOverrides + ): Promise<[boolean]>; + + contractResolver(overrides?: CallOverrides): Promise<[string]>; + + deriveEthAddressFromPubkey( + pubkey: BytesLike, + overrides?: CallOverrides + ): Promise<[string]>; + + env(overrides?: CallOverrides): Promise<[number]>; + + ethAddressToPkpId( + arg0: string, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + getDerivedPubkey( + stakingContract: string, + derivedKeyId: BytesLike, + overrides?: CallOverrides + ): Promise<[string]>; + + getEthAddress( + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise<[string]>; + + getPkpNftAddress(overrides?: CallOverrides): Promise<[string]>; + + getPubkey( + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise<[string]>; + + getRoleAdmin(role: BytesLike, overrides?: CallOverrides): Promise<[string]>; + + getRootKeys( + stakingContract: string, + overrides?: CallOverrides + ): Promise<[IPubkeyRouter.RootKeyStructOutput[]]>; + + getRoutingData( + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise<[PubkeyRouter.PubkeyRoutingDataStructOutput]>; + + grantRole( + role: BytesLike, + account: string, + overrides?: Overrides & { from?: string } + ): Promise; + + hasRole( + role: BytesLike, + account: string, + overrides?: CallOverrides + ): Promise<[boolean]>; + + isRouted( + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise<[boolean]>; + + pubkeys( + arg0: BigNumberish, + overrides?: CallOverrides + ): Promise< + [string, BigNumber, string] & { + pubkey: string; + keyType: BigNumber; + derivedKeyId: string; + } + >; + + renounceRole( + role: BytesLike, + account: string, + overrides?: Overrides & { from?: string } + ): Promise; + + revokeRole( + role: BytesLike, + account: string, + overrides?: Overrides & { from?: string } + ): Promise; + + rootKeys( + arg0: string, + arg1: BigNumberish, + overrides?: CallOverrides + ): Promise<[string, BigNumber] & { pubkey: string; keyType: BigNumber }>; + + setContractResolver( + newResolverAddress: string, + overrides?: Overrides & { from?: string } + ): Promise; + + setRoutingData( + tokenId: BigNumberish, + pubkey: BytesLike, + stakingContractAddress: string, + keyType: BigNumberish, + derivedKeyId: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + + setRoutingDataAsAdmin( + tokenId: BigNumberish, + pubkey: BytesLike, + stakingContract: string, + keyType: BigNumberish, + derivedKeyId: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + + supportsInterface( + interfaceId: BytesLike, + overrides?: CallOverrides + ): Promise<[boolean]>; + + voteForRootKeys( + stakingContractAddress: string, + newRootKeys: IPubkeyRouter.RootKeyStruct[], + overrides?: Overrides & { from?: string } + ): Promise; + + votesToRegisterRootKeys( + arg0: string, + arg1: BytesLike, + overrides?: CallOverrides + ): Promise<[BigNumber] & { votes: BigNumber }>; + }; + + ADMIN_ROLE(overrides?: CallOverrides): Promise; + + DEFAULT_ADMIN_ROLE(overrides?: CallOverrides): Promise; + + checkNodeSignatures( + signatures: IPubkeyRouter.SignatureStruct[], + signedMessage: BytesLike, + stakingContractAddress: string, + overrides?: CallOverrides + ): Promise; + + contractResolver(overrides?: CallOverrides): Promise; + + deriveEthAddressFromPubkey( + pubkey: BytesLike, + overrides?: CallOverrides + ): Promise; + + env(overrides?: CallOverrides): Promise; + + ethAddressToPkpId( + arg0: string, + overrides?: CallOverrides + ): Promise; + + getDerivedPubkey( + stakingContract: string, + derivedKeyId: BytesLike, + overrides?: CallOverrides + ): Promise; + + getEthAddress( + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getPkpNftAddress(overrides?: CallOverrides): Promise; + + getPubkey(tokenId: BigNumberish, overrides?: CallOverrides): Promise; + + getRoleAdmin(role: BytesLike, overrides?: CallOverrides): Promise; + + getRootKeys( + stakingContract: string, + overrides?: CallOverrides + ): Promise; + + getRoutingData( + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + grantRole( + role: BytesLike, + account: string, + overrides?: Overrides & { from?: string } + ): Promise; + + hasRole( + role: BytesLike, + account: string, + overrides?: CallOverrides + ): Promise; + + isRouted(tokenId: BigNumberish, overrides?: CallOverrides): Promise; + + pubkeys( + arg0: BigNumberish, + overrides?: CallOverrides + ): Promise< + [string, BigNumber, string] & { + pubkey: string; + keyType: BigNumber; + derivedKeyId: string; + } + >; + + renounceRole( + role: BytesLike, + account: string, + overrides?: Overrides & { from?: string } + ): Promise; + + revokeRole( + role: BytesLike, + account: string, + overrides?: Overrides & { from?: string } + ): Promise; + + rootKeys( + arg0: string, + arg1: BigNumberish, + overrides?: CallOverrides + ): Promise<[string, BigNumber] & { pubkey: string; keyType: BigNumber }>; + + setContractResolver( + newResolverAddress: string, + overrides?: Overrides & { from?: string } + ): Promise; + + setRoutingData( + tokenId: BigNumberish, + pubkey: BytesLike, + stakingContractAddress: string, + keyType: BigNumberish, + derivedKeyId: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + + setRoutingDataAsAdmin( + tokenId: BigNumberish, + pubkey: BytesLike, + stakingContract: string, + keyType: BigNumberish, + derivedKeyId: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + + supportsInterface( + interfaceId: BytesLike, + overrides?: CallOverrides + ): Promise; + + voteForRootKeys( + stakingContractAddress: string, + newRootKeys: IPubkeyRouter.RootKeyStruct[], + overrides?: Overrides & { from?: string } + ): Promise; + + votesToRegisterRootKeys( + arg0: string, + arg1: BytesLike, + overrides?: CallOverrides + ): Promise; + + callStatic: { + ADMIN_ROLE(overrides?: CallOverrides): Promise; + + DEFAULT_ADMIN_ROLE(overrides?: CallOverrides): Promise; + + checkNodeSignatures( + signatures: IPubkeyRouter.SignatureStruct[], + signedMessage: BytesLike, + stakingContractAddress: string, + overrides?: CallOverrides + ): Promise; + + contractResolver(overrides?: CallOverrides): Promise; + + deriveEthAddressFromPubkey( + pubkey: BytesLike, + overrides?: CallOverrides + ): Promise; + + env(overrides?: CallOverrides): Promise; + + ethAddressToPkpId( + arg0: string, + overrides?: CallOverrides + ): Promise; + + getDerivedPubkey( + stakingContract: string, + derivedKeyId: BytesLike, + overrides?: CallOverrides + ): Promise; + + getEthAddress( + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getPkpNftAddress(overrides?: CallOverrides): Promise; + + getPubkey( + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getRoleAdmin(role: BytesLike, overrides?: CallOverrides): Promise; + + getRootKeys( + stakingContract: string, + overrides?: CallOverrides + ): Promise; + + getRoutingData( + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + grantRole( + role: BytesLike, + account: string, + overrides?: CallOverrides + ): Promise; + + hasRole( + role: BytesLike, + account: string, + overrides?: CallOverrides + ): Promise; + + isRouted( + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + pubkeys( + arg0: BigNumberish, + overrides?: CallOverrides + ): Promise< + [string, BigNumber, string] & { + pubkey: string; + keyType: BigNumber; + derivedKeyId: string; + } + >; + + renounceRole( + role: BytesLike, + account: string, + overrides?: CallOverrides + ): Promise; + + revokeRole( + role: BytesLike, + account: string, + overrides?: CallOverrides + ): Promise; + + rootKeys( + arg0: string, + arg1: BigNumberish, + overrides?: CallOverrides + ): Promise<[string, BigNumber] & { pubkey: string; keyType: BigNumber }>; + + setContractResolver( + newResolverAddress: string, + overrides?: CallOverrides + ): Promise; + + setRoutingData( + tokenId: BigNumberish, + pubkey: BytesLike, + stakingContractAddress: string, + keyType: BigNumberish, + derivedKeyId: BytesLike, + overrides?: CallOverrides + ): Promise; + + setRoutingDataAsAdmin( + tokenId: BigNumberish, + pubkey: BytesLike, + stakingContract: string, + keyType: BigNumberish, + derivedKeyId: BytesLike, + overrides?: CallOverrides + ): Promise; + + supportsInterface( + interfaceId: BytesLike, + overrides?: CallOverrides + ): Promise; + + voteForRootKeys( + stakingContractAddress: string, + newRootKeys: IPubkeyRouter.RootKeyStruct[], + overrides?: CallOverrides + ): Promise; + + votesToRegisterRootKeys( + arg0: string, + arg1: BytesLike, + overrides?: CallOverrides + ): Promise; + }; + + filters: { + "ContractResolverAddressSet(address)"( + newResolverAddress?: null + ): ContractResolverAddressSetEventFilter; + ContractResolverAddressSet( + newResolverAddress?: null + ): ContractResolverAddressSetEventFilter; + + "PubkeyRoutingDataSet(uint256,bytes,address,uint256,bytes32)"( + tokenId?: BigNumberish | null, + pubkey?: null, + stakingContract?: null, + keyType?: null, + derivedKeyId?: null + ): PubkeyRoutingDataSetEventFilter; + PubkeyRoutingDataSet( + tokenId?: BigNumberish | null, + pubkey?: null, + stakingContract?: null, + keyType?: null, + derivedKeyId?: null + ): PubkeyRoutingDataSetEventFilter; + + "RoleAdminChanged(bytes32,bytes32,bytes32)"( + role?: BytesLike | null, + previousAdminRole?: BytesLike | null, + newAdminRole?: BytesLike | null + ): RoleAdminChangedEventFilter; + RoleAdminChanged( + role?: BytesLike | null, + previousAdminRole?: BytesLike | null, + newAdminRole?: BytesLike | null + ): RoleAdminChangedEventFilter; + + "RoleGranted(bytes32,address,address)"( + role?: BytesLike | null, + account?: string | null, + sender?: string | null + ): RoleGrantedEventFilter; + RoleGranted( + role?: BytesLike | null, + account?: string | null, + sender?: string | null + ): RoleGrantedEventFilter; + + "RoleRevoked(bytes32,address,address)"( + role?: BytesLike | null, + account?: string | null, + sender?: string | null + ): RoleRevokedEventFilter; + RoleRevoked( + role?: BytesLike | null, + account?: string | null, + sender?: string | null + ): RoleRevokedEventFilter; + + "RootKeySet(address,(bytes,uint256))"( + stakingContract?: null, + rootKey?: null + ): RootKeySetEventFilter; + RootKeySet(stakingContract?: null, rootKey?: null): RootKeySetEventFilter; + }; + + estimateGas: { + ADMIN_ROLE(overrides?: CallOverrides): Promise; + + DEFAULT_ADMIN_ROLE(overrides?: CallOverrides): Promise; + + checkNodeSignatures( + signatures: IPubkeyRouter.SignatureStruct[], + signedMessage: BytesLike, + stakingContractAddress: string, + overrides?: CallOverrides + ): Promise; + + contractResolver(overrides?: CallOverrides): Promise; + + deriveEthAddressFromPubkey( + pubkey: BytesLike, + overrides?: CallOverrides + ): Promise; + + env(overrides?: CallOverrides): Promise; + + ethAddressToPkpId( + arg0: string, + overrides?: CallOverrides + ): Promise; + + getDerivedPubkey( + stakingContract: string, + derivedKeyId: BytesLike, + overrides?: CallOverrides + ): Promise; + + getEthAddress( + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getPkpNftAddress(overrides?: CallOverrides): Promise; + + getPubkey( + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getRoleAdmin( + role: BytesLike, + overrides?: CallOverrides + ): Promise; + + getRootKeys( + stakingContract: string, + overrides?: CallOverrides + ): Promise; + + getRoutingData( + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + grantRole( + role: BytesLike, + account: string, + overrides?: Overrides & { from?: string } + ): Promise; + + hasRole( + role: BytesLike, + account: string, + overrides?: CallOverrides + ): Promise; + + isRouted( + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + pubkeys(arg0: BigNumberish, overrides?: CallOverrides): Promise; + + renounceRole( + role: BytesLike, + account: string, + overrides?: Overrides & { from?: string } + ): Promise; + + revokeRole( + role: BytesLike, + account: string, + overrides?: Overrides & { from?: string } + ): Promise; + + rootKeys( + arg0: string, + arg1: BigNumberish, + overrides?: CallOverrides + ): Promise; + + setContractResolver( + newResolverAddress: string, + overrides?: Overrides & { from?: string } + ): Promise; + + setRoutingData( + tokenId: BigNumberish, + pubkey: BytesLike, + stakingContractAddress: string, + keyType: BigNumberish, + derivedKeyId: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + + setRoutingDataAsAdmin( + tokenId: BigNumberish, + pubkey: BytesLike, + stakingContract: string, + keyType: BigNumberish, + derivedKeyId: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + + supportsInterface( + interfaceId: BytesLike, + overrides?: CallOverrides + ): Promise; + + voteForRootKeys( + stakingContractAddress: string, + newRootKeys: IPubkeyRouter.RootKeyStruct[], + overrides?: Overrides & { from?: string } + ): Promise; + + votesToRegisterRootKeys( + arg0: string, + arg1: BytesLike, + overrides?: CallOverrides + ): Promise; + }; + + populateTransaction: { + ADMIN_ROLE(overrides?: CallOverrides): Promise; + + DEFAULT_ADMIN_ROLE( + overrides?: CallOverrides + ): Promise; + + checkNodeSignatures( + signatures: IPubkeyRouter.SignatureStruct[], + signedMessage: BytesLike, + stakingContractAddress: string, + overrides?: CallOverrides + ): Promise; + + contractResolver(overrides?: CallOverrides): Promise; + + deriveEthAddressFromPubkey( + pubkey: BytesLike, + overrides?: CallOverrides + ): Promise; + + env(overrides?: CallOverrides): Promise; + + ethAddressToPkpId( + arg0: string, + overrides?: CallOverrides + ): Promise; + + getDerivedPubkey( + stakingContract: string, + derivedKeyId: BytesLike, + overrides?: CallOverrides + ): Promise; + + getEthAddress( + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getPkpNftAddress(overrides?: CallOverrides): Promise; + + getPubkey( + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getRoleAdmin( + role: BytesLike, + overrides?: CallOverrides + ): Promise; + + getRootKeys( + stakingContract: string, + overrides?: CallOverrides + ): Promise; + + getRoutingData( + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + grantRole( + role: BytesLike, + account: string, + overrides?: Overrides & { from?: string } + ): Promise; + + hasRole( + role: BytesLike, + account: string, + overrides?: CallOverrides + ): Promise; + + isRouted( + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + pubkeys( + arg0: BigNumberish, + overrides?: CallOverrides + ): Promise; + + renounceRole( + role: BytesLike, + account: string, + overrides?: Overrides & { from?: string } + ): Promise; + + revokeRole( + role: BytesLike, + account: string, + overrides?: Overrides & { from?: string } + ): Promise; + + rootKeys( + arg0: string, + arg1: BigNumberish, + overrides?: CallOverrides + ): Promise; + + setContractResolver( + newResolverAddress: string, + overrides?: Overrides & { from?: string } + ): Promise; + + setRoutingData( + tokenId: BigNumberish, + pubkey: BytesLike, + stakingContractAddress: string, + keyType: BigNumberish, + derivedKeyId: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + + setRoutingDataAsAdmin( + tokenId: BigNumberish, + pubkey: BytesLike, + stakingContract: string, + keyType: BigNumberish, + derivedKeyId: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + + supportsInterface( + interfaceId: BytesLike, + overrides?: CallOverrides + ): Promise; + + voteForRootKeys( + stakingContractAddress: string, + newRootKeys: IPubkeyRouter.RootKeyStruct[], + overrides?: Overrides & { from?: string } + ): Promise; + + votesToRegisterRootKeys( + arg0: string, + arg1: BytesLike, + overrides?: CallOverrides + ): Promise; + }; +} diff --git a/tools/scripts/lit-contracts/PubkeyRouter.sol/PubkeyRouterContract.js b/tools/scripts/lit-contracts/PubkeyRouter.sol/PubkeyRouterContract.js new file mode 100644 index 0000000000..72d5c30d13 --- /dev/null +++ b/tools/scripts/lit-contracts/PubkeyRouter.sol/PubkeyRouterContract.js @@ -0,0 +1,8 @@ +import { ethers } from "ethers"; +import { PubkeyRouterData } from "./PubkeyRouterData.js"; + +export const getPubkeyRouterContract = (provider) => new ethers.Contract( + PubkeyRouterData.address, + PubkeyRouterData.abi, + provider +); \ No newline at end of file diff --git a/tools/scripts/lit-contracts/PubkeyRouter.sol/PubkeyRouterContract.mjs b/tools/scripts/lit-contracts/PubkeyRouter.sol/PubkeyRouterContract.mjs new file mode 100644 index 0000000000..c2b5d82a97 --- /dev/null +++ b/tools/scripts/lit-contracts/PubkeyRouter.sol/PubkeyRouterContract.mjs @@ -0,0 +1,8 @@ +import { ethers } from "ethers"; +import { PubkeyRouterData } from "./PubkeyRouterData.mjs"; + +export const getPubkeyRouterContract = (provider) => new ethers.Contract( + PubkeyRouterData.address, + PubkeyRouterData.abi, + provider +); \ No newline at end of file diff --git a/tools/scripts/lit-contracts/PubkeyRouter.sol/PubkeyRouterContract.ts b/tools/scripts/lit-contracts/PubkeyRouter.sol/PubkeyRouterContract.ts new file mode 100644 index 0000000000..c0417a498d --- /dev/null +++ b/tools/scripts/lit-contracts/PubkeyRouter.sol/PubkeyRouterContract.ts @@ -0,0 +1,11 @@ +import { ethers } from "ethers"; +import { PubkeyRouterData } from "./PubkeyRouterData"; +import { PubkeyRouter } from "./PubkeyRouter"; + +export const getPubkeyRouterContract = (provider: any) => { + return new ethers.Contract( + PubkeyRouterData.address, + PubkeyRouterData.abi, + provider + ) as unknown as PubkeyRouter; +} \ No newline at end of file diff --git a/tools/scripts/lit-contracts/PubkeyRouter.sol/PubkeyRouterData.js b/tools/scripts/lit-contracts/PubkeyRouter.sol/PubkeyRouterData.js new file mode 100644 index 0000000000..c10bcba99c --- /dev/null +++ b/tools/scripts/lit-contracts/PubkeyRouter.sol/PubkeyRouterData.js @@ -0,0 +1,783 @@ +export const PubkeyRouterData = { + "date": "2023-09-10T22:43:15.000Z", + "address": "0xb26b4DC365843cDaE996F526913D3D4F45343aE8", + "contractName": "PubkeyRouter", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_resolver", + "type": "address" + }, + { + "internalType": "enum ContractResolver.Env", + "name": "_env", + "type": "uint8" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "newResolverAddress", + "type": "address" + } + ], + "name": "ContractResolverAddressSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "pubkey", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "address", + "name": "stakingContract", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "keyType", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "derivedKeyId", + "type": "bytes32" + } + ], + "name": "PubkeyRoutingDataSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "stakingContract", + "type": "address" + }, + { + "components": [ + { + "internalType": "bytes", + "name": "pubkey", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "keyType", + "type": "uint256" + } + ], + "indexed": false, + "internalType": "struct IPubkeyRouter.RootKey", + "name": "rootKey", + "type": "tuple" + } + ], + "name": "RootKeySet", + "type": "event" + }, + { + "inputs": [], + "name": "ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + } + ], + "internalType": "struct IPubkeyRouter.Signature[]", + "name": "signatures", + "type": "tuple[]" + }, + { + "internalType": "bytes", + "name": "signedMessage", + "type": "bytes" + }, + { + "internalType": "address", + "name": "stakingContractAddress", + "type": "address" + } + ], + "name": "checkNodeSignatures", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "contractResolver", + "outputs": [ + { + "internalType": "contract ContractResolver", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "pubkey", + "type": "bytes" + } + ], + "name": "deriveEthAddressFromPubkey", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "env", + "outputs": [ + { + "internalType": "enum ContractResolver.Env", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "ethAddressToPkpId", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "stakingContract", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "derivedKeyId", + "type": "bytes32" + } + ], + "name": "getDerivedPubkey", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "getEthAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPkpNftAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "getPubkey", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "stakingContract", + "type": "address" + } + ], + "name": "getRootKeys", + "outputs": [ + { + "components": [ + { + "internalType": "bytes", + "name": "pubkey", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "keyType", + "type": "uint256" + } + ], + "internalType": "struct IPubkeyRouter.RootKey[]", + "name": "", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "getRoutingData", + "outputs": [ + { + "components": [ + { + "internalType": "bytes", + "name": "pubkey", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "keyType", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "derivedKeyId", + "type": "bytes32" + } + ], + "internalType": "struct PubkeyRouter.PubkeyRoutingData", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "isRouted", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "pubkeys", + "outputs": [ + { + "internalType": "bytes", + "name": "pubkey", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "keyType", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "derivedKeyId", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "rootKeys", + "outputs": [ + { + "internalType": "bytes", + "name": "pubkey", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "keyType", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newResolverAddress", + "type": "address" + } + ], + "name": "setContractResolver", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "pubkey", + "type": "bytes" + }, + { + "internalType": "address", + "name": "stakingContractAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "keyType", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "derivedKeyId", + "type": "bytes32" + } + ], + "name": "setRoutingData", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "pubkey", + "type": "bytes" + }, + { + "internalType": "address", + "name": "stakingContract", + "type": "address" + }, + { + "internalType": "uint256", + "name": "keyType", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "derivedKeyId", + "type": "bytes32" + } + ], + "name": "setRoutingDataAsAdmin", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "stakingContractAddress", + "type": "address" + }, + { + "components": [ + { + "internalType": "bytes", + "name": "pubkey", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "keyType", + "type": "uint256" + } + ], + "internalType": "struct IPubkeyRouter.RootKey[]", + "name": "newRootKeys", + "type": "tuple[]" + } + ], + "name": "voteForRootKeys", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "name": "votesToRegisterRootKeys", + "outputs": [ + { + "internalType": "uint256", + "name": "votes", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + } + ] +} \ No newline at end of file diff --git a/tools/scripts/lit-contracts/PubkeyRouter.sol/PubkeyRouterData.mjs b/tools/scripts/lit-contracts/PubkeyRouter.sol/PubkeyRouterData.mjs new file mode 100644 index 0000000000..c10bcba99c --- /dev/null +++ b/tools/scripts/lit-contracts/PubkeyRouter.sol/PubkeyRouterData.mjs @@ -0,0 +1,783 @@ +export const PubkeyRouterData = { + "date": "2023-09-10T22:43:15.000Z", + "address": "0xb26b4DC365843cDaE996F526913D3D4F45343aE8", + "contractName": "PubkeyRouter", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_resolver", + "type": "address" + }, + { + "internalType": "enum ContractResolver.Env", + "name": "_env", + "type": "uint8" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "newResolverAddress", + "type": "address" + } + ], + "name": "ContractResolverAddressSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "pubkey", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "address", + "name": "stakingContract", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "keyType", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "derivedKeyId", + "type": "bytes32" + } + ], + "name": "PubkeyRoutingDataSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "stakingContract", + "type": "address" + }, + { + "components": [ + { + "internalType": "bytes", + "name": "pubkey", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "keyType", + "type": "uint256" + } + ], + "indexed": false, + "internalType": "struct IPubkeyRouter.RootKey", + "name": "rootKey", + "type": "tuple" + } + ], + "name": "RootKeySet", + "type": "event" + }, + { + "inputs": [], + "name": "ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + } + ], + "internalType": "struct IPubkeyRouter.Signature[]", + "name": "signatures", + "type": "tuple[]" + }, + { + "internalType": "bytes", + "name": "signedMessage", + "type": "bytes" + }, + { + "internalType": "address", + "name": "stakingContractAddress", + "type": "address" + } + ], + "name": "checkNodeSignatures", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "contractResolver", + "outputs": [ + { + "internalType": "contract ContractResolver", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "pubkey", + "type": "bytes" + } + ], + "name": "deriveEthAddressFromPubkey", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "env", + "outputs": [ + { + "internalType": "enum ContractResolver.Env", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "ethAddressToPkpId", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "stakingContract", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "derivedKeyId", + "type": "bytes32" + } + ], + "name": "getDerivedPubkey", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "getEthAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPkpNftAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "getPubkey", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "stakingContract", + "type": "address" + } + ], + "name": "getRootKeys", + "outputs": [ + { + "components": [ + { + "internalType": "bytes", + "name": "pubkey", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "keyType", + "type": "uint256" + } + ], + "internalType": "struct IPubkeyRouter.RootKey[]", + "name": "", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "getRoutingData", + "outputs": [ + { + "components": [ + { + "internalType": "bytes", + "name": "pubkey", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "keyType", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "derivedKeyId", + "type": "bytes32" + } + ], + "internalType": "struct PubkeyRouter.PubkeyRoutingData", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "isRouted", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "pubkeys", + "outputs": [ + { + "internalType": "bytes", + "name": "pubkey", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "keyType", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "derivedKeyId", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "rootKeys", + "outputs": [ + { + "internalType": "bytes", + "name": "pubkey", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "keyType", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newResolverAddress", + "type": "address" + } + ], + "name": "setContractResolver", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "pubkey", + "type": "bytes" + }, + { + "internalType": "address", + "name": "stakingContractAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "keyType", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "derivedKeyId", + "type": "bytes32" + } + ], + "name": "setRoutingData", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "pubkey", + "type": "bytes" + }, + { + "internalType": "address", + "name": "stakingContract", + "type": "address" + }, + { + "internalType": "uint256", + "name": "keyType", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "derivedKeyId", + "type": "bytes32" + } + ], + "name": "setRoutingDataAsAdmin", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "stakingContractAddress", + "type": "address" + }, + { + "components": [ + { + "internalType": "bytes", + "name": "pubkey", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "keyType", + "type": "uint256" + } + ], + "internalType": "struct IPubkeyRouter.RootKey[]", + "name": "newRootKeys", + "type": "tuple[]" + } + ], + "name": "voteForRootKeys", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "name": "votesToRegisterRootKeys", + "outputs": [ + { + "internalType": "uint256", + "name": "votes", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + } + ] +} \ No newline at end of file diff --git a/tools/scripts/lit-contracts/PubkeyRouter.sol/PubkeyRouterData.ts b/tools/scripts/lit-contracts/PubkeyRouter.sol/PubkeyRouterData.ts new file mode 100644 index 0000000000..c10bcba99c --- /dev/null +++ b/tools/scripts/lit-contracts/PubkeyRouter.sol/PubkeyRouterData.ts @@ -0,0 +1,783 @@ +export const PubkeyRouterData = { + "date": "2023-09-10T22:43:15.000Z", + "address": "0xb26b4DC365843cDaE996F526913D3D4F45343aE8", + "contractName": "PubkeyRouter", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_resolver", + "type": "address" + }, + { + "internalType": "enum ContractResolver.Env", + "name": "_env", + "type": "uint8" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "newResolverAddress", + "type": "address" + } + ], + "name": "ContractResolverAddressSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "pubkey", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "address", + "name": "stakingContract", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "keyType", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "derivedKeyId", + "type": "bytes32" + } + ], + "name": "PubkeyRoutingDataSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "stakingContract", + "type": "address" + }, + { + "components": [ + { + "internalType": "bytes", + "name": "pubkey", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "keyType", + "type": "uint256" + } + ], + "indexed": false, + "internalType": "struct IPubkeyRouter.RootKey", + "name": "rootKey", + "type": "tuple" + } + ], + "name": "RootKeySet", + "type": "event" + }, + { + "inputs": [], + "name": "ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + } + ], + "internalType": "struct IPubkeyRouter.Signature[]", + "name": "signatures", + "type": "tuple[]" + }, + { + "internalType": "bytes", + "name": "signedMessage", + "type": "bytes" + }, + { + "internalType": "address", + "name": "stakingContractAddress", + "type": "address" + } + ], + "name": "checkNodeSignatures", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "contractResolver", + "outputs": [ + { + "internalType": "contract ContractResolver", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "pubkey", + "type": "bytes" + } + ], + "name": "deriveEthAddressFromPubkey", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "env", + "outputs": [ + { + "internalType": "enum ContractResolver.Env", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "ethAddressToPkpId", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "stakingContract", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "derivedKeyId", + "type": "bytes32" + } + ], + "name": "getDerivedPubkey", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "getEthAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPkpNftAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "getPubkey", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "stakingContract", + "type": "address" + } + ], + "name": "getRootKeys", + "outputs": [ + { + "components": [ + { + "internalType": "bytes", + "name": "pubkey", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "keyType", + "type": "uint256" + } + ], + "internalType": "struct IPubkeyRouter.RootKey[]", + "name": "", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "getRoutingData", + "outputs": [ + { + "components": [ + { + "internalType": "bytes", + "name": "pubkey", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "keyType", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "derivedKeyId", + "type": "bytes32" + } + ], + "internalType": "struct PubkeyRouter.PubkeyRoutingData", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "isRouted", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "pubkeys", + "outputs": [ + { + "internalType": "bytes", + "name": "pubkey", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "keyType", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "derivedKeyId", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "rootKeys", + "outputs": [ + { + "internalType": "bytes", + "name": "pubkey", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "keyType", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newResolverAddress", + "type": "address" + } + ], + "name": "setContractResolver", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "pubkey", + "type": "bytes" + }, + { + "internalType": "address", + "name": "stakingContractAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "keyType", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "derivedKeyId", + "type": "bytes32" + } + ], + "name": "setRoutingData", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "pubkey", + "type": "bytes" + }, + { + "internalType": "address", + "name": "stakingContract", + "type": "address" + }, + { + "internalType": "uint256", + "name": "keyType", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "derivedKeyId", + "type": "bytes32" + } + ], + "name": "setRoutingDataAsAdmin", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "stakingContractAddress", + "type": "address" + }, + { + "components": [ + { + "internalType": "bytes", + "name": "pubkey", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "keyType", + "type": "uint256" + } + ], + "internalType": "struct IPubkeyRouter.RootKey[]", + "name": "newRootKeys", + "type": "tuple[]" + } + ], + "name": "voteForRootKeys", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "name": "votesToRegisterRootKeys", + "outputs": [ + { + "internalType": "uint256", + "name": "votes", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + } + ] +} \ No newline at end of file diff --git a/tools/scripts/lit-contracts/PubkeyRouter.sol/common.ts b/tools/scripts/lit-contracts/PubkeyRouter.sol/common.ts new file mode 100644 index 0000000000..2fc40c7fb1 --- /dev/null +++ b/tools/scripts/lit-contracts/PubkeyRouter.sol/common.ts @@ -0,0 +1,44 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { Listener } from "@ethersproject/providers"; +import type { Event, EventFilter } from "ethers"; + +export interface TypedEvent< + TArgsArray extends Array = any, + TArgsObject = any +> extends Event { + args: TArgsArray & TArgsObject; +} + +export interface TypedEventFilter<_TEvent extends TypedEvent> + extends EventFilter {} + +export interface TypedListener { + (...listenerArg: [...__TypechainArgsArray, TEvent]): void; +} + +type __TypechainArgsArray = T extends TypedEvent ? U : never; + +export interface OnEvent { + ( + eventFilter: TypedEventFilter, + listener: TypedListener + ): TRes; + (eventName: string, listener: Listener): TRes; +} + +export type MinEthersFactory = { + deploy(...a: ARGS[]): Promise; +}; + +export type GetContractTypeFromFactory = F extends MinEthersFactory< + infer C, + any +> + ? C + : never; + +export type GetARGsTypeFromFactory = F extends MinEthersFactory + ? Parameters + : never; diff --git a/tools/scripts/lit-contracts/PubkeyRouter.sol/factories/PubkeyRouter__factory.ts b/tools/scripts/lit-contracts/PubkeyRouter.sol/factories/PubkeyRouter__factory.ts new file mode 100644 index 0000000000..97f5998e08 --- /dev/null +++ b/tools/scripts/lit-contracts/PubkeyRouter.sol/factories/PubkeyRouter__factory.ts @@ -0,0 +1,799 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Signer, utils } from "ethers"; +import type { Provider } from "@ethersproject/providers"; +import type { PubkeyRouter, PubkeyRouterInterface } from "../PubkeyRouter"; + +const _abi = [ + { + inputs: [ + { + internalType: "address", + name: "_resolver", + type: "address", + }, + { + internalType: "enum ContractResolver.Env", + name: "_env", + type: "uint8", + }, + ], + stateMutability: "nonpayable", + type: "constructor", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "address", + name: "newResolverAddress", + type: "address", + }, + ], + name: "ContractResolverAddressSet", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "uint256", + name: "tokenId", + type: "uint256", + }, + { + indexed: false, + internalType: "bytes", + name: "pubkey", + type: "bytes", + }, + { + indexed: false, + internalType: "address", + name: "stakingContract", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "keyType", + type: "uint256", + }, + { + indexed: false, + internalType: "bytes32", + name: "derivedKeyId", + type: "bytes32", + }, + ], + name: "PubkeyRoutingDataSet", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "bytes32", + name: "role", + type: "bytes32", + }, + { + indexed: true, + internalType: "bytes32", + name: "previousAdminRole", + type: "bytes32", + }, + { + indexed: true, + internalType: "bytes32", + name: "newAdminRole", + type: "bytes32", + }, + ], + name: "RoleAdminChanged", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "bytes32", + name: "role", + type: "bytes32", + }, + { + indexed: true, + internalType: "address", + name: "account", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "sender", + type: "address", + }, + ], + name: "RoleGranted", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "bytes32", + name: "role", + type: "bytes32", + }, + { + indexed: true, + internalType: "address", + name: "account", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "sender", + type: "address", + }, + ], + name: "RoleRevoked", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "address", + name: "stakingContract", + type: "address", + }, + { + components: [ + { + internalType: "bytes", + name: "pubkey", + type: "bytes", + }, + { + internalType: "uint256", + name: "keyType", + type: "uint256", + }, + ], + indexed: false, + internalType: "struct IPubkeyRouter.RootKey", + name: "rootKey", + type: "tuple", + }, + ], + name: "RootKeySet", + type: "event", + }, + { + inputs: [], + name: "ADMIN_ROLE", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "DEFAULT_ADMIN_ROLE", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + components: [ + { + internalType: "bytes32", + name: "r", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "s", + type: "bytes32", + }, + { + internalType: "uint8", + name: "v", + type: "uint8", + }, + ], + internalType: "struct IPubkeyRouter.Signature[]", + name: "signatures", + type: "tuple[]", + }, + { + internalType: "bytes", + name: "signedMessage", + type: "bytes", + }, + { + internalType: "address", + name: "stakingContractAddress", + type: "address", + }, + ], + name: "checkNodeSignatures", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "contractResolver", + outputs: [ + { + internalType: "contract ContractResolver", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes", + name: "pubkey", + type: "bytes", + }, + ], + name: "deriveEthAddressFromPubkey", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "pure", + type: "function", + }, + { + inputs: [], + name: "env", + outputs: [ + { + internalType: "enum ContractResolver.Env", + name: "", + type: "uint8", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + name: "ethAddressToPkpId", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "stakingContract", + type: "address", + }, + { + internalType: "bytes32", + name: "derivedKeyId", + type: "bytes32", + }, + ], + name: "getDerivedPubkey", + outputs: [ + { + internalType: "bytes", + name: "", + type: "bytes", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "tokenId", + type: "uint256", + }, + ], + name: "getEthAddress", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "getPkpNftAddress", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "tokenId", + type: "uint256", + }, + ], + name: "getPubkey", + outputs: [ + { + internalType: "bytes", + name: "", + type: "bytes", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "role", + type: "bytes32", + }, + ], + name: "getRoleAdmin", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "stakingContract", + type: "address", + }, + ], + name: "getRootKeys", + outputs: [ + { + components: [ + { + internalType: "bytes", + name: "pubkey", + type: "bytes", + }, + { + internalType: "uint256", + name: "keyType", + type: "uint256", + }, + ], + internalType: "struct IPubkeyRouter.RootKey[]", + name: "", + type: "tuple[]", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "tokenId", + type: "uint256", + }, + ], + name: "getRoutingData", + outputs: [ + { + components: [ + { + internalType: "bytes", + name: "pubkey", + type: "bytes", + }, + { + internalType: "uint256", + name: "keyType", + type: "uint256", + }, + { + internalType: "bytes32", + name: "derivedKeyId", + type: "bytes32", + }, + ], + internalType: "struct PubkeyRouter.PubkeyRoutingData", + name: "", + type: "tuple", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "role", + type: "bytes32", + }, + { + internalType: "address", + name: "account", + type: "address", + }, + ], + name: "grantRole", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "role", + type: "bytes32", + }, + { + internalType: "address", + name: "account", + type: "address", + }, + ], + name: "hasRole", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "tokenId", + type: "uint256", + }, + ], + name: "isRouted", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + name: "pubkeys", + outputs: [ + { + internalType: "bytes", + name: "pubkey", + type: "bytes", + }, + { + internalType: "uint256", + name: "keyType", + type: "uint256", + }, + { + internalType: "bytes32", + name: "derivedKeyId", + type: "bytes32", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "role", + type: "bytes32", + }, + { + internalType: "address", + name: "account", + type: "address", + }, + ], + name: "renounceRole", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "role", + type: "bytes32", + }, + { + internalType: "address", + name: "account", + type: "address", + }, + ], + name: "revokeRole", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + name: "rootKeys", + outputs: [ + { + internalType: "bytes", + name: "pubkey", + type: "bytes", + }, + { + internalType: "uint256", + name: "keyType", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "newResolverAddress", + type: "address", + }, + ], + name: "setContractResolver", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "tokenId", + type: "uint256", + }, + { + internalType: "bytes", + name: "pubkey", + type: "bytes", + }, + { + internalType: "address", + name: "stakingContractAddress", + type: "address", + }, + { + internalType: "uint256", + name: "keyType", + type: "uint256", + }, + { + internalType: "bytes32", + name: "derivedKeyId", + type: "bytes32", + }, + ], + name: "setRoutingData", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "tokenId", + type: "uint256", + }, + { + internalType: "bytes", + name: "pubkey", + type: "bytes", + }, + { + internalType: "address", + name: "stakingContract", + type: "address", + }, + { + internalType: "uint256", + name: "keyType", + type: "uint256", + }, + { + internalType: "bytes32", + name: "derivedKeyId", + type: "bytes32", + }, + ], + name: "setRoutingDataAsAdmin", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes4", + name: "interfaceId", + type: "bytes4", + }, + ], + name: "supportsInterface", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "stakingContractAddress", + type: "address", + }, + { + components: [ + { + internalType: "bytes", + name: "pubkey", + type: "bytes", + }, + { + internalType: "uint256", + name: "keyType", + type: "uint256", + }, + ], + internalType: "struct IPubkeyRouter.RootKey[]", + name: "newRootKeys", + type: "tuple[]", + }, + ], + name: "voteForRootKeys", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + { + internalType: "bytes", + name: "", + type: "bytes", + }, + ], + name: "votesToRegisterRootKeys", + outputs: [ + { + internalType: "uint256", + name: "votes", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, +] as const; + +export class PubkeyRouter__factory { + static readonly abi = _abi; + static createInterface(): PubkeyRouterInterface { + return new utils.Interface(_abi) as PubkeyRouterInterface; + } + static connect( + address: string, + signerOrProvider: Signer | Provider + ): PubkeyRouter { + return new Contract(address, _abi, signerOrProvider) as PubkeyRouter; + } +} diff --git a/tools/scripts/lit-contracts/PubkeyRouter.sol/factories/index.ts b/tools/scripts/lit-contracts/PubkeyRouter.sol/factories/index.ts new file mode 100644 index 0000000000..5af769e0c0 --- /dev/null +++ b/tools/scripts/lit-contracts/PubkeyRouter.sol/factories/index.ts @@ -0,0 +1,4 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export { PubkeyRouter__factory } from "./PubkeyRouter__factory"; diff --git a/tools/scripts/lit-contracts/PubkeyRouter.sol/index.js b/tools/scripts/lit-contracts/PubkeyRouter.sol/index.js new file mode 100644 index 0000000000..6c13671071 --- /dev/null +++ b/tools/scripts/lit-contracts/PubkeyRouter.sol/index.js @@ -0,0 +1,2 @@ +export * from "./PubkeyRouterData.js"; +export * from "./PubkeyRouterContract.js"; \ No newline at end of file diff --git a/tools/scripts/lit-contracts/PubkeyRouter.sol/index.mjs b/tools/scripts/lit-contracts/PubkeyRouter.sol/index.mjs new file mode 100644 index 0000000000..0b3f298547 --- /dev/null +++ b/tools/scripts/lit-contracts/PubkeyRouter.sol/index.mjs @@ -0,0 +1,2 @@ +export * from "./PubkeyRouterData.mjs"; +export * from "./PubkeyRouterContract.mjs"; \ No newline at end of file diff --git a/tools/scripts/lit-contracts/PubkeyRouter.sol/index.ts b/tools/scripts/lit-contracts/PubkeyRouter.sol/index.ts new file mode 100644 index 0000000000..0ba7b19a71 --- /dev/null +++ b/tools/scripts/lit-contracts/PubkeyRouter.sol/index.ts @@ -0,0 +1,3 @@ +export * from "./PubkeyRouterData"; +export * from "./PubkeyRouterContract"; +export * from "./PubkeyRouter"; \ No newline at end of file diff --git a/tools/scripts/lit-contracts/RateLimitNFT.sol/RateLimitNFT.json b/tools/scripts/lit-contracts/RateLimitNFT.sol/RateLimitNFT.json new file mode 100644 index 0000000000..9ba31c69fb --- /dev/null +++ b/tools/scripts/lit-contracts/RateLimitNFT.sol/RateLimitNFT.json @@ -0,0 +1,921 @@ +{ + "date": "2023-09-10T22:33:11.000Z", + "address": "0x8624EE1100B45DD3e55B7399446CbF01ab5Db333", + "contractName": "RateLimitNFT", + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "newAdditionalRequestsPerKilosecondCost", + "type": "uint256" + } + ], + "name": "AdditionalRequestsPerKilosecondCostSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "approved", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "approved", + "type": "bool" + } + ], + "name": "ApprovalForAll", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "newFreeMintSigner", + "type": "address" + } + ], + "name": "FreeMintSignerSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "newFreeRequestsPerRateLimitWindow", + "type": "uint256" + } + ], + "name": "FreeRequestsPerRateLimitWindowSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "newRLIHolderRateLimitWindowSeconds", + "type": "uint256" + } + ], + "name": "RLIHolderRateLimitWindowSecondsSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "newRateLimitWindowSeconds", + "type": "uint256" + } + ], + "name": "RateLimitWindowSecondsSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Withdrew", + "type": "event" + }, + { + "inputs": [], + "name": "RLIHolderRateLimitWindowSeconds", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "additionalRequestsPerKilosecondCost", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "burn", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "requestsPerKilosecond", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expiresAt", + "type": "uint256" + } + ], + "name": "calculateCost", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "payingAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expiresAt", + "type": "uint256" + } + ], + "name": "calculateRequestsPerKilosecond", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "capacity", + "outputs": [ + { + "internalType": "uint256", + "name": "requestsPerKilosecond", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expiresAt", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "defaultRateLimitWindowSeconds", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "expiresAt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "requestsPerKilosecond", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "msgHash", + "type": "bytes32" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "freeMint", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "expiresAt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "requestsPerKilosecond", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "msgHash", + "type": "bytes32" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "freeMintSigTest", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "freeMintSigner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "freeRequestsPerRateLimitWindow", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "getApproved", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "operator", + "type": "address" + } + ], + "name": "isApprovedForAll", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "isExpired", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "expiresAt", + "type": "uint256" + } + ], + "name": "mint", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "ownerOf", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "hash", + "type": "bytes32" + } + ], + "name": "prefixed", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "redeemedFreeMints", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "safeTransferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "safeTransferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newAdditionalRequestsPerKilosecondCost", + "type": "uint256" + } + ], + "name": "setAdditionalRequestsPerKilosecondCost", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "internalType": "bool", + "name": "approved", + "type": "bool" + } + ], + "name": "setApprovalForAll", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newFreeMintSigner", + "type": "address" + } + ], + "name": "setFreeMintSigner", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newFreeRequestsPerRateLimitWindow", + "type": "uint256" + } + ], + "name": "setFreeRequestsPerRateLimitWindow", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newRLIHolderRateLimitWindowSeconds", + "type": "uint256" + } + ], + "name": "setRLIHolderRateLimitWindowSeconds", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newRateLimitWindowSeconds", + "type": "uint256" + } + ], + "name": "setRateLimitWindowSeconds", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "tokenByIndex", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "tokenIdCounter", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "tokenOfOwnerByIndex", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "tokenURI", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "withdraw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ] +} \ No newline at end of file diff --git a/tools/scripts/lit-contracts/RateLimitNFT.sol/RateLimitNFT.ts b/tools/scripts/lit-contracts/RateLimitNFT.sol/RateLimitNFT.ts new file mode 100644 index 0000000000..2694e29a99 --- /dev/null +++ b/tools/scripts/lit-contracts/RateLimitNFT.sol/RateLimitNFT.ts @@ -0,0 +1,1634 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumber, + BigNumberish, + BytesLike, + CallOverrides, + ContractTransaction, + Overrides, + PayableOverrides, + PopulatedTransaction, + Signer, + utils, +} from "ethers"; +import type { + FunctionFragment, + Result, + EventFragment, +} from "@ethersproject/abi"; +import type { Listener, Provider } from "@ethersproject/providers"; +import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, +} from "./common"; + +export interface RateLimitNFTInterface extends utils.Interface { + functions: { + "RLIHolderRateLimitWindowSeconds()": FunctionFragment; + "additionalRequestsPerKilosecondCost()": FunctionFragment; + "approve(address,uint256)": FunctionFragment; + "balanceOf(address)": FunctionFragment; + "burn(uint256)": FunctionFragment; + "calculateCost(uint256,uint256)": FunctionFragment; + "calculateRequestsPerKilosecond(uint256,uint256)": FunctionFragment; + "capacity(uint256)": FunctionFragment; + "defaultRateLimitWindowSeconds()": FunctionFragment; + "freeMint(uint256,uint256,bytes32,uint8,bytes32,bytes32)": FunctionFragment; + "freeMintSigTest(uint256,uint256,bytes32,uint8,bytes32,bytes32)": FunctionFragment; + "freeMintSigner()": FunctionFragment; + "freeRequestsPerRateLimitWindow()": FunctionFragment; + "getApproved(uint256)": FunctionFragment; + "isApprovedForAll(address,address)": FunctionFragment; + "isExpired(uint256)": FunctionFragment; + "mint(uint256)": FunctionFragment; + "name()": FunctionFragment; + "owner()": FunctionFragment; + "ownerOf(uint256)": FunctionFragment; + "prefixed(bytes32)": FunctionFragment; + "redeemedFreeMints(bytes32)": FunctionFragment; + "renounceOwnership()": FunctionFragment; + "safeTransferFrom(address,address,uint256)": FunctionFragment; + "safeTransferFrom(address,address,uint256,bytes)": FunctionFragment; + "setAdditionalRequestsPerKilosecondCost(uint256)": FunctionFragment; + "setApprovalForAll(address,bool)": FunctionFragment; + "setFreeMintSigner(address)": FunctionFragment; + "setFreeRequestsPerRateLimitWindow(uint256)": FunctionFragment; + "setRLIHolderRateLimitWindowSeconds(uint256)": FunctionFragment; + "setRateLimitWindowSeconds(uint256)": FunctionFragment; + "supportsInterface(bytes4)": FunctionFragment; + "symbol()": FunctionFragment; + "tokenByIndex(uint256)": FunctionFragment; + "tokenIdCounter()": FunctionFragment; + "tokenOfOwnerByIndex(address,uint256)": FunctionFragment; + "tokenURI(uint256)": FunctionFragment; + "totalSupply()": FunctionFragment; + "transferFrom(address,address,uint256)": FunctionFragment; + "transferOwnership(address)": FunctionFragment; + "withdraw()": FunctionFragment; + }; + + getFunction( + nameOrSignatureOrTopic: + | "RLIHolderRateLimitWindowSeconds" + | "additionalRequestsPerKilosecondCost" + | "approve" + | "balanceOf" + | "burn" + | "calculateCost" + | "calculateRequestsPerKilosecond" + | "capacity" + | "defaultRateLimitWindowSeconds" + | "freeMint" + | "freeMintSigTest" + | "freeMintSigner" + | "freeRequestsPerRateLimitWindow" + | "getApproved" + | "isApprovedForAll" + | "isExpired" + | "mint" + | "name" + | "owner" + | "ownerOf" + | "prefixed" + | "redeemedFreeMints" + | "renounceOwnership" + | "safeTransferFrom(address,address,uint256)" + | "safeTransferFrom(address,address,uint256,bytes)" + | "setAdditionalRequestsPerKilosecondCost" + | "setApprovalForAll" + | "setFreeMintSigner" + | "setFreeRequestsPerRateLimitWindow" + | "setRLIHolderRateLimitWindowSeconds" + | "setRateLimitWindowSeconds" + | "supportsInterface" + | "symbol" + | "tokenByIndex" + | "tokenIdCounter" + | "tokenOfOwnerByIndex" + | "tokenURI" + | "totalSupply" + | "transferFrom" + | "transferOwnership" + | "withdraw" + ): FunctionFragment; + + encodeFunctionData( + functionFragment: "RLIHolderRateLimitWindowSeconds", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "additionalRequestsPerKilosecondCost", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "approve", + values: [string, BigNumberish] + ): string; + encodeFunctionData(functionFragment: "balanceOf", values: [string]): string; + encodeFunctionData(functionFragment: "burn", values: [BigNumberish]): string; + encodeFunctionData( + functionFragment: "calculateCost", + values: [BigNumberish, BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "calculateRequestsPerKilosecond", + values: [BigNumberish, BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "capacity", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "defaultRateLimitWindowSeconds", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "freeMint", + values: [ + BigNumberish, + BigNumberish, + BytesLike, + BigNumberish, + BytesLike, + BytesLike + ] + ): string; + encodeFunctionData( + functionFragment: "freeMintSigTest", + values: [ + BigNumberish, + BigNumberish, + BytesLike, + BigNumberish, + BytesLike, + BytesLike + ] + ): string; + encodeFunctionData( + functionFragment: "freeMintSigner", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "freeRequestsPerRateLimitWindow", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "getApproved", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "isApprovedForAll", + values: [string, string] + ): string; + encodeFunctionData( + functionFragment: "isExpired", + values: [BigNumberish] + ): string; + encodeFunctionData(functionFragment: "mint", values: [BigNumberish]): string; + encodeFunctionData(functionFragment: "name", values?: undefined): string; + encodeFunctionData(functionFragment: "owner", values?: undefined): string; + encodeFunctionData( + functionFragment: "ownerOf", + values: [BigNumberish] + ): string; + encodeFunctionData(functionFragment: "prefixed", values: [BytesLike]): string; + encodeFunctionData( + functionFragment: "redeemedFreeMints", + values: [BytesLike] + ): string; + encodeFunctionData( + functionFragment: "renounceOwnership", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "safeTransferFrom(address,address,uint256)", + values: [string, string, BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "safeTransferFrom(address,address,uint256,bytes)", + values: [string, string, BigNumberish, BytesLike] + ): string; + encodeFunctionData( + functionFragment: "setAdditionalRequestsPerKilosecondCost", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "setApprovalForAll", + values: [string, boolean] + ): string; + encodeFunctionData( + functionFragment: "setFreeMintSigner", + values: [string] + ): string; + encodeFunctionData( + functionFragment: "setFreeRequestsPerRateLimitWindow", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "setRLIHolderRateLimitWindowSeconds", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "setRateLimitWindowSeconds", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "supportsInterface", + values: [BytesLike] + ): string; + encodeFunctionData(functionFragment: "symbol", values?: undefined): string; + encodeFunctionData( + functionFragment: "tokenByIndex", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "tokenIdCounter", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "tokenOfOwnerByIndex", + values: [string, BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "tokenURI", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "totalSupply", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "transferFrom", + values: [string, string, BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "transferOwnership", + values: [string] + ): string; + encodeFunctionData(functionFragment: "withdraw", values?: undefined): string; + + decodeFunctionResult( + functionFragment: "RLIHolderRateLimitWindowSeconds", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "additionalRequestsPerKilosecondCost", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "approve", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "balanceOf", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "burn", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "calculateCost", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "calculateRequestsPerKilosecond", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "capacity", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "defaultRateLimitWindowSeconds", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "freeMint", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "freeMintSigTest", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "freeMintSigner", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "freeRequestsPerRateLimitWindow", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getApproved", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "isApprovedForAll", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "isExpired", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "mint", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "name", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "owner", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "ownerOf", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "prefixed", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "redeemedFreeMints", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "renounceOwnership", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "safeTransferFrom(address,address,uint256)", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "safeTransferFrom(address,address,uint256,bytes)", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setAdditionalRequestsPerKilosecondCost", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setApprovalForAll", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setFreeMintSigner", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setFreeRequestsPerRateLimitWindow", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setRLIHolderRateLimitWindowSeconds", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setRateLimitWindowSeconds", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "supportsInterface", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "symbol", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "tokenByIndex", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "tokenIdCounter", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "tokenOfOwnerByIndex", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "tokenURI", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "totalSupply", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "transferFrom", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "transferOwnership", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "withdraw", data: BytesLike): Result; + + events: { + "AdditionalRequestsPerKilosecondCostSet(uint256)": EventFragment; + "Approval(address,address,uint256)": EventFragment; + "ApprovalForAll(address,address,bool)": EventFragment; + "FreeMintSignerSet(address)": EventFragment; + "FreeRequestsPerRateLimitWindowSet(uint256)": EventFragment; + "OwnershipTransferred(address,address)": EventFragment; + "RLIHolderRateLimitWindowSecondsSet(uint256)": EventFragment; + "RateLimitWindowSecondsSet(uint256)": EventFragment; + "Transfer(address,address,uint256)": EventFragment; + "Withdrew(uint256)": EventFragment; + }; + + getEvent( + nameOrSignatureOrTopic: "AdditionalRequestsPerKilosecondCostSet" + ): EventFragment; + getEvent(nameOrSignatureOrTopic: "Approval"): EventFragment; + getEvent(nameOrSignatureOrTopic: "ApprovalForAll"): EventFragment; + getEvent(nameOrSignatureOrTopic: "FreeMintSignerSet"): EventFragment; + getEvent( + nameOrSignatureOrTopic: "FreeRequestsPerRateLimitWindowSet" + ): EventFragment; + getEvent(nameOrSignatureOrTopic: "OwnershipTransferred"): EventFragment; + getEvent( + nameOrSignatureOrTopic: "RLIHolderRateLimitWindowSecondsSet" + ): EventFragment; + getEvent(nameOrSignatureOrTopic: "RateLimitWindowSecondsSet"): EventFragment; + getEvent(nameOrSignatureOrTopic: "Transfer"): EventFragment; + getEvent(nameOrSignatureOrTopic: "Withdrew"): EventFragment; +} + +export interface AdditionalRequestsPerKilosecondCostSetEventObject { + newAdditionalRequestsPerKilosecondCost: BigNumber; +} +export type AdditionalRequestsPerKilosecondCostSetEvent = TypedEvent< + [BigNumber], + AdditionalRequestsPerKilosecondCostSetEventObject +>; + +export type AdditionalRequestsPerKilosecondCostSetEventFilter = + TypedEventFilter; + +export interface ApprovalEventObject { + owner: string; + approved: string; + tokenId: BigNumber; +} +export type ApprovalEvent = TypedEvent< + [string, string, BigNumber], + ApprovalEventObject +>; + +export type ApprovalEventFilter = TypedEventFilter; + +export interface ApprovalForAllEventObject { + owner: string; + operator: string; + approved: boolean; +} +export type ApprovalForAllEvent = TypedEvent< + [string, string, boolean], + ApprovalForAllEventObject +>; + +export type ApprovalForAllEventFilter = TypedEventFilter; + +export interface FreeMintSignerSetEventObject { + newFreeMintSigner: string; +} +export type FreeMintSignerSetEvent = TypedEvent< + [string], + FreeMintSignerSetEventObject +>; + +export type FreeMintSignerSetEventFilter = + TypedEventFilter; + +export interface FreeRequestsPerRateLimitWindowSetEventObject { + newFreeRequestsPerRateLimitWindow: BigNumber; +} +export type FreeRequestsPerRateLimitWindowSetEvent = TypedEvent< + [BigNumber], + FreeRequestsPerRateLimitWindowSetEventObject +>; + +export type FreeRequestsPerRateLimitWindowSetEventFilter = + TypedEventFilter; + +export interface OwnershipTransferredEventObject { + previousOwner: string; + newOwner: string; +} +export type OwnershipTransferredEvent = TypedEvent< + [string, string], + OwnershipTransferredEventObject +>; + +export type OwnershipTransferredEventFilter = + TypedEventFilter; + +export interface RLIHolderRateLimitWindowSecondsSetEventObject { + newRLIHolderRateLimitWindowSeconds: BigNumber; +} +export type RLIHolderRateLimitWindowSecondsSetEvent = TypedEvent< + [BigNumber], + RLIHolderRateLimitWindowSecondsSetEventObject +>; + +export type RLIHolderRateLimitWindowSecondsSetEventFilter = + TypedEventFilter; + +export interface RateLimitWindowSecondsSetEventObject { + newRateLimitWindowSeconds: BigNumber; +} +export type RateLimitWindowSecondsSetEvent = TypedEvent< + [BigNumber], + RateLimitWindowSecondsSetEventObject +>; + +export type RateLimitWindowSecondsSetEventFilter = + TypedEventFilter; + +export interface TransferEventObject { + from: string; + to: string; + tokenId: BigNumber; +} +export type TransferEvent = TypedEvent< + [string, string, BigNumber], + TransferEventObject +>; + +export type TransferEventFilter = TypedEventFilter; + +export interface WithdrewEventObject { + amount: BigNumber; +} +export type WithdrewEvent = TypedEvent<[BigNumber], WithdrewEventObject>; + +export type WithdrewEventFilter = TypedEventFilter; + +export interface RateLimitNFT extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: RateLimitNFTInterface; + + queryFilter( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>; + + listeners( + eventFilter?: TypedEventFilter + ): Array>; + listeners(eventName?: string): Array; + removeAllListeners( + eventFilter: TypedEventFilter + ): this; + removeAllListeners(eventName?: string): this; + off: OnEvent; + on: OnEvent; + once: OnEvent; + removeListener: OnEvent; + + functions: { + RLIHolderRateLimitWindowSeconds( + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + additionalRequestsPerKilosecondCost( + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + approve( + to: string, + tokenId: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + balanceOf(owner: string, overrides?: CallOverrides): Promise<[BigNumber]>; + + burn( + tokenId: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + calculateCost( + requestsPerKilosecond: BigNumberish, + expiresAt: BigNumberish, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + calculateRequestsPerKilosecond( + payingAmount: BigNumberish, + expiresAt: BigNumberish, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + capacity( + arg0: BigNumberish, + overrides?: CallOverrides + ): Promise< + [BigNumber, BigNumber] & { + requestsPerKilosecond: BigNumber; + expiresAt: BigNumber; + } + >; + + defaultRateLimitWindowSeconds( + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + freeMint( + expiresAt: BigNumberish, + requestsPerKilosecond: BigNumberish, + msgHash: BytesLike, + v: BigNumberish, + r: BytesLike, + s: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + + freeMintSigTest( + expiresAt: BigNumberish, + requestsPerKilosecond: BigNumberish, + msgHash: BytesLike, + v: BigNumberish, + r: BytesLike, + s: BytesLike, + overrides?: CallOverrides + ): Promise<[void]>; + + freeMintSigner(overrides?: CallOverrides): Promise<[string]>; + + freeRequestsPerRateLimitWindow( + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + getApproved( + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise<[string]>; + + isApprovedForAll( + owner: string, + operator: string, + overrides?: CallOverrides + ): Promise<[boolean]>; + + isExpired( + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise<[boolean]>; + + mint( + expiresAt: BigNumberish, + overrides?: PayableOverrides & { from?: string } + ): Promise; + + name(overrides?: CallOverrides): Promise<[string]>; + + owner(overrides?: CallOverrides): Promise<[string]>; + + ownerOf( + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise<[string]>; + + prefixed(hash: BytesLike, overrides?: CallOverrides): Promise<[string]>; + + redeemedFreeMints( + arg0: BytesLike, + overrides?: CallOverrides + ): Promise<[boolean]>; + + renounceOwnership( + overrides?: Overrides & { from?: string } + ): Promise; + + "safeTransferFrom(address,address,uint256)"( + from: string, + to: string, + tokenId: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + "safeTransferFrom(address,address,uint256,bytes)"( + from: string, + to: string, + tokenId: BigNumberish, + data: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + + setAdditionalRequestsPerKilosecondCost( + newAdditionalRequestsPerKilosecondCost: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + setApprovalForAll( + operator: string, + approved: boolean, + overrides?: Overrides & { from?: string } + ): Promise; + + setFreeMintSigner( + newFreeMintSigner: string, + overrides?: Overrides & { from?: string } + ): Promise; + + setFreeRequestsPerRateLimitWindow( + newFreeRequestsPerRateLimitWindow: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + setRLIHolderRateLimitWindowSeconds( + newRLIHolderRateLimitWindowSeconds: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + setRateLimitWindowSeconds( + newRateLimitWindowSeconds: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + supportsInterface( + interfaceId: BytesLike, + overrides?: CallOverrides + ): Promise<[boolean]>; + + symbol(overrides?: CallOverrides): Promise<[string]>; + + tokenByIndex( + index: BigNumberish, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + tokenIdCounter(overrides?: CallOverrides): Promise<[BigNumber]>; + + tokenOfOwnerByIndex( + owner: string, + index: BigNumberish, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + tokenURI( + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise<[string]>; + + totalSupply(overrides?: CallOverrides): Promise<[BigNumber]>; + + transferFrom( + from: string, + to: string, + tokenId: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + transferOwnership( + newOwner: string, + overrides?: Overrides & { from?: string } + ): Promise; + + withdraw( + overrides?: Overrides & { from?: string } + ): Promise; + }; + + RLIHolderRateLimitWindowSeconds( + overrides?: CallOverrides + ): Promise; + + additionalRequestsPerKilosecondCost( + overrides?: CallOverrides + ): Promise; + + approve( + to: string, + tokenId: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + balanceOf(owner: string, overrides?: CallOverrides): Promise; + + burn( + tokenId: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + calculateCost( + requestsPerKilosecond: BigNumberish, + expiresAt: BigNumberish, + overrides?: CallOverrides + ): Promise; + + calculateRequestsPerKilosecond( + payingAmount: BigNumberish, + expiresAt: BigNumberish, + overrides?: CallOverrides + ): Promise; + + capacity( + arg0: BigNumberish, + overrides?: CallOverrides + ): Promise< + [BigNumber, BigNumber] & { + requestsPerKilosecond: BigNumber; + expiresAt: BigNumber; + } + >; + + defaultRateLimitWindowSeconds(overrides?: CallOverrides): Promise; + + freeMint( + expiresAt: BigNumberish, + requestsPerKilosecond: BigNumberish, + msgHash: BytesLike, + v: BigNumberish, + r: BytesLike, + s: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + + freeMintSigTest( + expiresAt: BigNumberish, + requestsPerKilosecond: BigNumberish, + msgHash: BytesLike, + v: BigNumberish, + r: BytesLike, + s: BytesLike, + overrides?: CallOverrides + ): Promise; + + freeMintSigner(overrides?: CallOverrides): Promise; + + freeRequestsPerRateLimitWindow(overrides?: CallOverrides): Promise; + + getApproved( + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + isApprovedForAll( + owner: string, + operator: string, + overrides?: CallOverrides + ): Promise; + + isExpired(tokenId: BigNumberish, overrides?: CallOverrides): Promise; + + mint( + expiresAt: BigNumberish, + overrides?: PayableOverrides & { from?: string } + ): Promise; + + name(overrides?: CallOverrides): Promise; + + owner(overrides?: CallOverrides): Promise; + + ownerOf(tokenId: BigNumberish, overrides?: CallOverrides): Promise; + + prefixed(hash: BytesLike, overrides?: CallOverrides): Promise; + + redeemedFreeMints( + arg0: BytesLike, + overrides?: CallOverrides + ): Promise; + + renounceOwnership( + overrides?: Overrides & { from?: string } + ): Promise; + + "safeTransferFrom(address,address,uint256)"( + from: string, + to: string, + tokenId: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + "safeTransferFrom(address,address,uint256,bytes)"( + from: string, + to: string, + tokenId: BigNumberish, + data: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + + setAdditionalRequestsPerKilosecondCost( + newAdditionalRequestsPerKilosecondCost: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + setApprovalForAll( + operator: string, + approved: boolean, + overrides?: Overrides & { from?: string } + ): Promise; + + setFreeMintSigner( + newFreeMintSigner: string, + overrides?: Overrides & { from?: string } + ): Promise; + + setFreeRequestsPerRateLimitWindow( + newFreeRequestsPerRateLimitWindow: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + setRLIHolderRateLimitWindowSeconds( + newRLIHolderRateLimitWindowSeconds: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + setRateLimitWindowSeconds( + newRateLimitWindowSeconds: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + supportsInterface( + interfaceId: BytesLike, + overrides?: CallOverrides + ): Promise; + + symbol(overrides?: CallOverrides): Promise; + + tokenByIndex( + index: BigNumberish, + overrides?: CallOverrides + ): Promise; + + tokenIdCounter(overrides?: CallOverrides): Promise; + + tokenOfOwnerByIndex( + owner: string, + index: BigNumberish, + overrides?: CallOverrides + ): Promise; + + tokenURI(tokenId: BigNumberish, overrides?: CallOverrides): Promise; + + totalSupply(overrides?: CallOverrides): Promise; + + transferFrom( + from: string, + to: string, + tokenId: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + transferOwnership( + newOwner: string, + overrides?: Overrides & { from?: string } + ): Promise; + + withdraw( + overrides?: Overrides & { from?: string } + ): Promise; + + callStatic: { + RLIHolderRateLimitWindowSeconds( + overrides?: CallOverrides + ): Promise; + + additionalRequestsPerKilosecondCost( + overrides?: CallOverrides + ): Promise; + + approve( + to: string, + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + balanceOf(owner: string, overrides?: CallOverrides): Promise; + + burn(tokenId: BigNumberish, overrides?: CallOverrides): Promise; + + calculateCost( + requestsPerKilosecond: BigNumberish, + expiresAt: BigNumberish, + overrides?: CallOverrides + ): Promise; + + calculateRequestsPerKilosecond( + payingAmount: BigNumberish, + expiresAt: BigNumberish, + overrides?: CallOverrides + ): Promise; + + capacity( + arg0: BigNumberish, + overrides?: CallOverrides + ): Promise< + [BigNumber, BigNumber] & { + requestsPerKilosecond: BigNumber; + expiresAt: BigNumber; + } + >; + + defaultRateLimitWindowSeconds( + overrides?: CallOverrides + ): Promise; + + freeMint( + expiresAt: BigNumberish, + requestsPerKilosecond: BigNumberish, + msgHash: BytesLike, + v: BigNumberish, + r: BytesLike, + s: BytesLike, + overrides?: CallOverrides + ): Promise; + + freeMintSigTest( + expiresAt: BigNumberish, + requestsPerKilosecond: BigNumberish, + msgHash: BytesLike, + v: BigNumberish, + r: BytesLike, + s: BytesLike, + overrides?: CallOverrides + ): Promise; + + freeMintSigner(overrides?: CallOverrides): Promise; + + freeRequestsPerRateLimitWindow( + overrides?: CallOverrides + ): Promise; + + getApproved( + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + isApprovedForAll( + owner: string, + operator: string, + overrides?: CallOverrides + ): Promise; + + isExpired( + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + mint( + expiresAt: BigNumberish, + overrides?: CallOverrides + ): Promise; + + name(overrides?: CallOverrides): Promise; + + owner(overrides?: CallOverrides): Promise; + + ownerOf(tokenId: BigNumberish, overrides?: CallOverrides): Promise; + + prefixed(hash: BytesLike, overrides?: CallOverrides): Promise; + + redeemedFreeMints( + arg0: BytesLike, + overrides?: CallOverrides + ): Promise; + + renounceOwnership(overrides?: CallOverrides): Promise; + + "safeTransferFrom(address,address,uint256)"( + from: string, + to: string, + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + "safeTransferFrom(address,address,uint256,bytes)"( + from: string, + to: string, + tokenId: BigNumberish, + data: BytesLike, + overrides?: CallOverrides + ): Promise; + + setAdditionalRequestsPerKilosecondCost( + newAdditionalRequestsPerKilosecondCost: BigNumberish, + overrides?: CallOverrides + ): Promise; + + setApprovalForAll( + operator: string, + approved: boolean, + overrides?: CallOverrides + ): Promise; + + setFreeMintSigner( + newFreeMintSigner: string, + overrides?: CallOverrides + ): Promise; + + setFreeRequestsPerRateLimitWindow( + newFreeRequestsPerRateLimitWindow: BigNumberish, + overrides?: CallOverrides + ): Promise; + + setRLIHolderRateLimitWindowSeconds( + newRLIHolderRateLimitWindowSeconds: BigNumberish, + overrides?: CallOverrides + ): Promise; + + setRateLimitWindowSeconds( + newRateLimitWindowSeconds: BigNumberish, + overrides?: CallOverrides + ): Promise; + + supportsInterface( + interfaceId: BytesLike, + overrides?: CallOverrides + ): Promise; + + symbol(overrides?: CallOverrides): Promise; + + tokenByIndex( + index: BigNumberish, + overrides?: CallOverrides + ): Promise; + + tokenIdCounter(overrides?: CallOverrides): Promise; + + tokenOfOwnerByIndex( + owner: string, + index: BigNumberish, + overrides?: CallOverrides + ): Promise; + + tokenURI(tokenId: BigNumberish, overrides?: CallOverrides): Promise; + + totalSupply(overrides?: CallOverrides): Promise; + + transferFrom( + from: string, + to: string, + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + transferOwnership( + newOwner: string, + overrides?: CallOverrides + ): Promise; + + withdraw(overrides?: CallOverrides): Promise; + }; + + filters: { + "AdditionalRequestsPerKilosecondCostSet(uint256)"( + newAdditionalRequestsPerKilosecondCost?: null + ): AdditionalRequestsPerKilosecondCostSetEventFilter; + AdditionalRequestsPerKilosecondCostSet( + newAdditionalRequestsPerKilosecondCost?: null + ): AdditionalRequestsPerKilosecondCostSetEventFilter; + + "Approval(address,address,uint256)"( + owner?: string | null, + approved?: string | null, + tokenId?: BigNumberish | null + ): ApprovalEventFilter; + Approval( + owner?: string | null, + approved?: string | null, + tokenId?: BigNumberish | null + ): ApprovalEventFilter; + + "ApprovalForAll(address,address,bool)"( + owner?: string | null, + operator?: string | null, + approved?: null + ): ApprovalForAllEventFilter; + ApprovalForAll( + owner?: string | null, + operator?: string | null, + approved?: null + ): ApprovalForAllEventFilter; + + "FreeMintSignerSet(address)"( + newFreeMintSigner?: string | null + ): FreeMintSignerSetEventFilter; + FreeMintSignerSet( + newFreeMintSigner?: string | null + ): FreeMintSignerSetEventFilter; + + "FreeRequestsPerRateLimitWindowSet(uint256)"( + newFreeRequestsPerRateLimitWindow?: null + ): FreeRequestsPerRateLimitWindowSetEventFilter; + FreeRequestsPerRateLimitWindowSet( + newFreeRequestsPerRateLimitWindow?: null + ): FreeRequestsPerRateLimitWindowSetEventFilter; + + "OwnershipTransferred(address,address)"( + previousOwner?: string | null, + newOwner?: string | null + ): OwnershipTransferredEventFilter; + OwnershipTransferred( + previousOwner?: string | null, + newOwner?: string | null + ): OwnershipTransferredEventFilter; + + "RLIHolderRateLimitWindowSecondsSet(uint256)"( + newRLIHolderRateLimitWindowSeconds?: null + ): RLIHolderRateLimitWindowSecondsSetEventFilter; + RLIHolderRateLimitWindowSecondsSet( + newRLIHolderRateLimitWindowSeconds?: null + ): RLIHolderRateLimitWindowSecondsSetEventFilter; + + "RateLimitWindowSecondsSet(uint256)"( + newRateLimitWindowSeconds?: null + ): RateLimitWindowSecondsSetEventFilter; + RateLimitWindowSecondsSet( + newRateLimitWindowSeconds?: null + ): RateLimitWindowSecondsSetEventFilter; + + "Transfer(address,address,uint256)"( + from?: string | null, + to?: string | null, + tokenId?: BigNumberish | null + ): TransferEventFilter; + Transfer( + from?: string | null, + to?: string | null, + tokenId?: BigNumberish | null + ): TransferEventFilter; + + "Withdrew(uint256)"(amount?: null): WithdrewEventFilter; + Withdrew(amount?: null): WithdrewEventFilter; + }; + + estimateGas: { + RLIHolderRateLimitWindowSeconds( + overrides?: CallOverrides + ): Promise; + + additionalRequestsPerKilosecondCost( + overrides?: CallOverrides + ): Promise; + + approve( + to: string, + tokenId: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + balanceOf(owner: string, overrides?: CallOverrides): Promise; + + burn( + tokenId: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + calculateCost( + requestsPerKilosecond: BigNumberish, + expiresAt: BigNumberish, + overrides?: CallOverrides + ): Promise; + + calculateRequestsPerKilosecond( + payingAmount: BigNumberish, + expiresAt: BigNumberish, + overrides?: CallOverrides + ): Promise; + + capacity(arg0: BigNumberish, overrides?: CallOverrides): Promise; + + defaultRateLimitWindowSeconds( + overrides?: CallOverrides + ): Promise; + + freeMint( + expiresAt: BigNumberish, + requestsPerKilosecond: BigNumberish, + msgHash: BytesLike, + v: BigNumberish, + r: BytesLike, + s: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + + freeMintSigTest( + expiresAt: BigNumberish, + requestsPerKilosecond: BigNumberish, + msgHash: BytesLike, + v: BigNumberish, + r: BytesLike, + s: BytesLike, + overrides?: CallOverrides + ): Promise; + + freeMintSigner(overrides?: CallOverrides): Promise; + + freeRequestsPerRateLimitWindow( + overrides?: CallOverrides + ): Promise; + + getApproved( + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + isApprovedForAll( + owner: string, + operator: string, + overrides?: CallOverrides + ): Promise; + + isExpired( + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + mint( + expiresAt: BigNumberish, + overrides?: PayableOverrides & { from?: string } + ): Promise; + + name(overrides?: CallOverrides): Promise; + + owner(overrides?: CallOverrides): Promise; + + ownerOf( + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + prefixed(hash: BytesLike, overrides?: CallOverrides): Promise; + + redeemedFreeMints( + arg0: BytesLike, + overrides?: CallOverrides + ): Promise; + + renounceOwnership( + overrides?: Overrides & { from?: string } + ): Promise; + + "safeTransferFrom(address,address,uint256)"( + from: string, + to: string, + tokenId: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + "safeTransferFrom(address,address,uint256,bytes)"( + from: string, + to: string, + tokenId: BigNumberish, + data: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + + setAdditionalRequestsPerKilosecondCost( + newAdditionalRequestsPerKilosecondCost: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + setApprovalForAll( + operator: string, + approved: boolean, + overrides?: Overrides & { from?: string } + ): Promise; + + setFreeMintSigner( + newFreeMintSigner: string, + overrides?: Overrides & { from?: string } + ): Promise; + + setFreeRequestsPerRateLimitWindow( + newFreeRequestsPerRateLimitWindow: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + setRLIHolderRateLimitWindowSeconds( + newRLIHolderRateLimitWindowSeconds: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + setRateLimitWindowSeconds( + newRateLimitWindowSeconds: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + supportsInterface( + interfaceId: BytesLike, + overrides?: CallOverrides + ): Promise; + + symbol(overrides?: CallOverrides): Promise; + + tokenByIndex( + index: BigNumberish, + overrides?: CallOverrides + ): Promise; + + tokenIdCounter(overrides?: CallOverrides): Promise; + + tokenOfOwnerByIndex( + owner: string, + index: BigNumberish, + overrides?: CallOverrides + ): Promise; + + tokenURI( + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + totalSupply(overrides?: CallOverrides): Promise; + + transferFrom( + from: string, + to: string, + tokenId: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + transferOwnership( + newOwner: string, + overrides?: Overrides & { from?: string } + ): Promise; + + withdraw(overrides?: Overrides & { from?: string }): Promise; + }; + + populateTransaction: { + RLIHolderRateLimitWindowSeconds( + overrides?: CallOverrides + ): Promise; + + additionalRequestsPerKilosecondCost( + overrides?: CallOverrides + ): Promise; + + approve( + to: string, + tokenId: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + balanceOf( + owner: string, + overrides?: CallOverrides + ): Promise; + + burn( + tokenId: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + calculateCost( + requestsPerKilosecond: BigNumberish, + expiresAt: BigNumberish, + overrides?: CallOverrides + ): Promise; + + calculateRequestsPerKilosecond( + payingAmount: BigNumberish, + expiresAt: BigNumberish, + overrides?: CallOverrides + ): Promise; + + capacity( + arg0: BigNumberish, + overrides?: CallOverrides + ): Promise; + + defaultRateLimitWindowSeconds( + overrides?: CallOverrides + ): Promise; + + freeMint( + expiresAt: BigNumberish, + requestsPerKilosecond: BigNumberish, + msgHash: BytesLike, + v: BigNumberish, + r: BytesLike, + s: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + + freeMintSigTest( + expiresAt: BigNumberish, + requestsPerKilosecond: BigNumberish, + msgHash: BytesLike, + v: BigNumberish, + r: BytesLike, + s: BytesLike, + overrides?: CallOverrides + ): Promise; + + freeMintSigner(overrides?: CallOverrides): Promise; + + freeRequestsPerRateLimitWindow( + overrides?: CallOverrides + ): Promise; + + getApproved( + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + isApprovedForAll( + owner: string, + operator: string, + overrides?: CallOverrides + ): Promise; + + isExpired( + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + mint( + expiresAt: BigNumberish, + overrides?: PayableOverrides & { from?: string } + ): Promise; + + name(overrides?: CallOverrides): Promise; + + owner(overrides?: CallOverrides): Promise; + + ownerOf( + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + prefixed( + hash: BytesLike, + overrides?: CallOverrides + ): Promise; + + redeemedFreeMints( + arg0: BytesLike, + overrides?: CallOverrides + ): Promise; + + renounceOwnership( + overrides?: Overrides & { from?: string } + ): Promise; + + "safeTransferFrom(address,address,uint256)"( + from: string, + to: string, + tokenId: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + "safeTransferFrom(address,address,uint256,bytes)"( + from: string, + to: string, + tokenId: BigNumberish, + data: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + + setAdditionalRequestsPerKilosecondCost( + newAdditionalRequestsPerKilosecondCost: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + setApprovalForAll( + operator: string, + approved: boolean, + overrides?: Overrides & { from?: string } + ): Promise; + + setFreeMintSigner( + newFreeMintSigner: string, + overrides?: Overrides & { from?: string } + ): Promise; + + setFreeRequestsPerRateLimitWindow( + newFreeRequestsPerRateLimitWindow: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + setRLIHolderRateLimitWindowSeconds( + newRLIHolderRateLimitWindowSeconds: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + setRateLimitWindowSeconds( + newRateLimitWindowSeconds: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + supportsInterface( + interfaceId: BytesLike, + overrides?: CallOverrides + ): Promise; + + symbol(overrides?: CallOverrides): Promise; + + tokenByIndex( + index: BigNumberish, + overrides?: CallOverrides + ): Promise; + + tokenIdCounter(overrides?: CallOverrides): Promise; + + tokenOfOwnerByIndex( + owner: string, + index: BigNumberish, + overrides?: CallOverrides + ): Promise; + + tokenURI( + tokenId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + totalSupply(overrides?: CallOverrides): Promise; + + transferFrom( + from: string, + to: string, + tokenId: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + transferOwnership( + newOwner: string, + overrides?: Overrides & { from?: string } + ): Promise; + + withdraw( + overrides?: Overrides & { from?: string } + ): Promise; + }; +} diff --git a/tools/scripts/lit-contracts/RateLimitNFT.sol/RateLimitNFTContract.js b/tools/scripts/lit-contracts/RateLimitNFT.sol/RateLimitNFTContract.js new file mode 100644 index 0000000000..4e64bfb343 --- /dev/null +++ b/tools/scripts/lit-contracts/RateLimitNFT.sol/RateLimitNFTContract.js @@ -0,0 +1,8 @@ +import { ethers } from "ethers"; +import { RateLimitNFTData } from "./RateLimitNFTData.js"; + +export const getRateLimitNFTContract = (provider) => new ethers.Contract( + RateLimitNFTData.address, + RateLimitNFTData.abi, + provider +); \ No newline at end of file diff --git a/tools/scripts/lit-contracts/RateLimitNFT.sol/RateLimitNFTContract.mjs b/tools/scripts/lit-contracts/RateLimitNFT.sol/RateLimitNFTContract.mjs new file mode 100644 index 0000000000..75a4640012 --- /dev/null +++ b/tools/scripts/lit-contracts/RateLimitNFT.sol/RateLimitNFTContract.mjs @@ -0,0 +1,8 @@ +import { ethers } from "ethers"; +import { RateLimitNFTData } from "./RateLimitNFTData.mjs"; + +export const getRateLimitNFTContract = (provider) => new ethers.Contract( + RateLimitNFTData.address, + RateLimitNFTData.abi, + provider +); \ No newline at end of file diff --git a/tools/scripts/lit-contracts/RateLimitNFT.sol/RateLimitNFTContract.ts b/tools/scripts/lit-contracts/RateLimitNFT.sol/RateLimitNFTContract.ts new file mode 100644 index 0000000000..19b5940525 --- /dev/null +++ b/tools/scripts/lit-contracts/RateLimitNFT.sol/RateLimitNFTContract.ts @@ -0,0 +1,11 @@ +import { ethers } from "ethers"; +import { RateLimitNFTData } from "./RateLimitNFTData"; +import { RateLimitNFT } from "./RateLimitNFT"; + +export const getRateLimitNFTContract = (provider: any) => { + return new ethers.Contract( + RateLimitNFTData.address, + RateLimitNFTData.abi, + provider + ) as unknown as RateLimitNFT; +} \ No newline at end of file diff --git a/tools/scripts/lit-contracts/RateLimitNFT.sol/RateLimitNFTData.js b/tools/scripts/lit-contracts/RateLimitNFT.sol/RateLimitNFTData.js new file mode 100644 index 0000000000..b5fd2b3a5d --- /dev/null +++ b/tools/scripts/lit-contracts/RateLimitNFT.sol/RateLimitNFTData.js @@ -0,0 +1,921 @@ +export const RateLimitNFTData = { + "date": "2023-09-10T22:33:11.000Z", + "address": "0x8624EE1100B45DD3e55B7399446CbF01ab5Db333", + "contractName": "RateLimitNFT", + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "newAdditionalRequestsPerKilosecondCost", + "type": "uint256" + } + ], + "name": "AdditionalRequestsPerKilosecondCostSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "approved", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "approved", + "type": "bool" + } + ], + "name": "ApprovalForAll", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "newFreeMintSigner", + "type": "address" + } + ], + "name": "FreeMintSignerSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "newFreeRequestsPerRateLimitWindow", + "type": "uint256" + } + ], + "name": "FreeRequestsPerRateLimitWindowSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "newRLIHolderRateLimitWindowSeconds", + "type": "uint256" + } + ], + "name": "RLIHolderRateLimitWindowSecondsSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "newRateLimitWindowSeconds", + "type": "uint256" + } + ], + "name": "RateLimitWindowSecondsSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Withdrew", + "type": "event" + }, + { + "inputs": [], + "name": "RLIHolderRateLimitWindowSeconds", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "additionalRequestsPerKilosecondCost", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "burn", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "requestsPerKilosecond", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expiresAt", + "type": "uint256" + } + ], + "name": "calculateCost", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "payingAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expiresAt", + "type": "uint256" + } + ], + "name": "calculateRequestsPerKilosecond", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "capacity", + "outputs": [ + { + "internalType": "uint256", + "name": "requestsPerKilosecond", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expiresAt", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "defaultRateLimitWindowSeconds", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "expiresAt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "requestsPerKilosecond", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "msgHash", + "type": "bytes32" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "freeMint", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "expiresAt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "requestsPerKilosecond", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "msgHash", + "type": "bytes32" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "freeMintSigTest", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "freeMintSigner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "freeRequestsPerRateLimitWindow", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "getApproved", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "operator", + "type": "address" + } + ], + "name": "isApprovedForAll", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "isExpired", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "expiresAt", + "type": "uint256" + } + ], + "name": "mint", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "ownerOf", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "hash", + "type": "bytes32" + } + ], + "name": "prefixed", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "redeemedFreeMints", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "safeTransferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "safeTransferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newAdditionalRequestsPerKilosecondCost", + "type": "uint256" + } + ], + "name": "setAdditionalRequestsPerKilosecondCost", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "internalType": "bool", + "name": "approved", + "type": "bool" + } + ], + "name": "setApprovalForAll", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newFreeMintSigner", + "type": "address" + } + ], + "name": "setFreeMintSigner", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newFreeRequestsPerRateLimitWindow", + "type": "uint256" + } + ], + "name": "setFreeRequestsPerRateLimitWindow", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newRLIHolderRateLimitWindowSeconds", + "type": "uint256" + } + ], + "name": "setRLIHolderRateLimitWindowSeconds", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newRateLimitWindowSeconds", + "type": "uint256" + } + ], + "name": "setRateLimitWindowSeconds", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "tokenByIndex", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "tokenIdCounter", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "tokenOfOwnerByIndex", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "tokenURI", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "withdraw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ] +} \ No newline at end of file diff --git a/tools/scripts/lit-contracts/RateLimitNFT.sol/RateLimitNFTData.mjs b/tools/scripts/lit-contracts/RateLimitNFT.sol/RateLimitNFTData.mjs new file mode 100644 index 0000000000..b5fd2b3a5d --- /dev/null +++ b/tools/scripts/lit-contracts/RateLimitNFT.sol/RateLimitNFTData.mjs @@ -0,0 +1,921 @@ +export const RateLimitNFTData = { + "date": "2023-09-10T22:33:11.000Z", + "address": "0x8624EE1100B45DD3e55B7399446CbF01ab5Db333", + "contractName": "RateLimitNFT", + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "newAdditionalRequestsPerKilosecondCost", + "type": "uint256" + } + ], + "name": "AdditionalRequestsPerKilosecondCostSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "approved", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "approved", + "type": "bool" + } + ], + "name": "ApprovalForAll", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "newFreeMintSigner", + "type": "address" + } + ], + "name": "FreeMintSignerSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "newFreeRequestsPerRateLimitWindow", + "type": "uint256" + } + ], + "name": "FreeRequestsPerRateLimitWindowSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "newRLIHolderRateLimitWindowSeconds", + "type": "uint256" + } + ], + "name": "RLIHolderRateLimitWindowSecondsSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "newRateLimitWindowSeconds", + "type": "uint256" + } + ], + "name": "RateLimitWindowSecondsSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Withdrew", + "type": "event" + }, + { + "inputs": [], + "name": "RLIHolderRateLimitWindowSeconds", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "additionalRequestsPerKilosecondCost", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "burn", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "requestsPerKilosecond", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expiresAt", + "type": "uint256" + } + ], + "name": "calculateCost", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "payingAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expiresAt", + "type": "uint256" + } + ], + "name": "calculateRequestsPerKilosecond", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "capacity", + "outputs": [ + { + "internalType": "uint256", + "name": "requestsPerKilosecond", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expiresAt", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "defaultRateLimitWindowSeconds", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "expiresAt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "requestsPerKilosecond", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "msgHash", + "type": "bytes32" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "freeMint", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "expiresAt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "requestsPerKilosecond", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "msgHash", + "type": "bytes32" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "freeMintSigTest", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "freeMintSigner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "freeRequestsPerRateLimitWindow", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "getApproved", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "operator", + "type": "address" + } + ], + "name": "isApprovedForAll", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "isExpired", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "expiresAt", + "type": "uint256" + } + ], + "name": "mint", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "ownerOf", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "hash", + "type": "bytes32" + } + ], + "name": "prefixed", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "redeemedFreeMints", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "safeTransferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "safeTransferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newAdditionalRequestsPerKilosecondCost", + "type": "uint256" + } + ], + "name": "setAdditionalRequestsPerKilosecondCost", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "internalType": "bool", + "name": "approved", + "type": "bool" + } + ], + "name": "setApprovalForAll", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newFreeMintSigner", + "type": "address" + } + ], + "name": "setFreeMintSigner", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newFreeRequestsPerRateLimitWindow", + "type": "uint256" + } + ], + "name": "setFreeRequestsPerRateLimitWindow", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newRLIHolderRateLimitWindowSeconds", + "type": "uint256" + } + ], + "name": "setRLIHolderRateLimitWindowSeconds", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newRateLimitWindowSeconds", + "type": "uint256" + } + ], + "name": "setRateLimitWindowSeconds", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "tokenByIndex", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "tokenIdCounter", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "tokenOfOwnerByIndex", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "tokenURI", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "withdraw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ] +} \ No newline at end of file diff --git a/tools/scripts/lit-contracts/RateLimitNFT.sol/RateLimitNFTData.ts b/tools/scripts/lit-contracts/RateLimitNFT.sol/RateLimitNFTData.ts new file mode 100644 index 0000000000..b5fd2b3a5d --- /dev/null +++ b/tools/scripts/lit-contracts/RateLimitNFT.sol/RateLimitNFTData.ts @@ -0,0 +1,921 @@ +export const RateLimitNFTData = { + "date": "2023-09-10T22:33:11.000Z", + "address": "0x8624EE1100B45DD3e55B7399446CbF01ab5Db333", + "contractName": "RateLimitNFT", + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "newAdditionalRequestsPerKilosecondCost", + "type": "uint256" + } + ], + "name": "AdditionalRequestsPerKilosecondCostSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "approved", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "approved", + "type": "bool" + } + ], + "name": "ApprovalForAll", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "newFreeMintSigner", + "type": "address" + } + ], + "name": "FreeMintSignerSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "newFreeRequestsPerRateLimitWindow", + "type": "uint256" + } + ], + "name": "FreeRequestsPerRateLimitWindowSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "newRLIHolderRateLimitWindowSeconds", + "type": "uint256" + } + ], + "name": "RLIHolderRateLimitWindowSecondsSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "newRateLimitWindowSeconds", + "type": "uint256" + } + ], + "name": "RateLimitWindowSecondsSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Withdrew", + "type": "event" + }, + { + "inputs": [], + "name": "RLIHolderRateLimitWindowSeconds", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "additionalRequestsPerKilosecondCost", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "burn", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "requestsPerKilosecond", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expiresAt", + "type": "uint256" + } + ], + "name": "calculateCost", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "payingAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expiresAt", + "type": "uint256" + } + ], + "name": "calculateRequestsPerKilosecond", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "capacity", + "outputs": [ + { + "internalType": "uint256", + "name": "requestsPerKilosecond", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expiresAt", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "defaultRateLimitWindowSeconds", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "expiresAt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "requestsPerKilosecond", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "msgHash", + "type": "bytes32" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "freeMint", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "expiresAt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "requestsPerKilosecond", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "msgHash", + "type": "bytes32" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "freeMintSigTest", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "freeMintSigner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "freeRequestsPerRateLimitWindow", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "getApproved", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "operator", + "type": "address" + } + ], + "name": "isApprovedForAll", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "isExpired", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "expiresAt", + "type": "uint256" + } + ], + "name": "mint", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "ownerOf", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "hash", + "type": "bytes32" + } + ], + "name": "prefixed", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "redeemedFreeMints", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "safeTransferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "safeTransferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newAdditionalRequestsPerKilosecondCost", + "type": "uint256" + } + ], + "name": "setAdditionalRequestsPerKilosecondCost", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "internalType": "bool", + "name": "approved", + "type": "bool" + } + ], + "name": "setApprovalForAll", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newFreeMintSigner", + "type": "address" + } + ], + "name": "setFreeMintSigner", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newFreeRequestsPerRateLimitWindow", + "type": "uint256" + } + ], + "name": "setFreeRequestsPerRateLimitWindow", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newRLIHolderRateLimitWindowSeconds", + "type": "uint256" + } + ], + "name": "setRLIHolderRateLimitWindowSeconds", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newRateLimitWindowSeconds", + "type": "uint256" + } + ], + "name": "setRateLimitWindowSeconds", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "tokenByIndex", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "tokenIdCounter", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "tokenOfOwnerByIndex", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "tokenURI", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "withdraw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ] +} \ No newline at end of file diff --git a/tools/scripts/lit-contracts/RateLimitNFT.sol/common.ts b/tools/scripts/lit-contracts/RateLimitNFT.sol/common.ts new file mode 100644 index 0000000000..2fc40c7fb1 --- /dev/null +++ b/tools/scripts/lit-contracts/RateLimitNFT.sol/common.ts @@ -0,0 +1,44 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { Listener } from "@ethersproject/providers"; +import type { Event, EventFilter } from "ethers"; + +export interface TypedEvent< + TArgsArray extends Array = any, + TArgsObject = any +> extends Event { + args: TArgsArray & TArgsObject; +} + +export interface TypedEventFilter<_TEvent extends TypedEvent> + extends EventFilter {} + +export interface TypedListener { + (...listenerArg: [...__TypechainArgsArray, TEvent]): void; +} + +type __TypechainArgsArray = T extends TypedEvent ? U : never; + +export interface OnEvent { + ( + eventFilter: TypedEventFilter, + listener: TypedListener + ): TRes; + (eventName: string, listener: Listener): TRes; +} + +export type MinEthersFactory = { + deploy(...a: ARGS[]): Promise; +}; + +export type GetContractTypeFromFactory = F extends MinEthersFactory< + infer C, + any +> + ? C + : never; + +export type GetARGsTypeFromFactory = F extends MinEthersFactory + ? Parameters + : never; diff --git a/tools/scripts/lit-contracts/RateLimitNFT.sol/factories/RateLimitNFT__factory.ts b/tools/scripts/lit-contracts/RateLimitNFT.sol/factories/RateLimitNFT__factory.ts new file mode 100644 index 0000000000..4ee6c8fc4a --- /dev/null +++ b/tools/scripts/lit-contracts/RateLimitNFT.sol/factories/RateLimitNFT__factory.ts @@ -0,0 +1,937 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Signer, utils } from "ethers"; +import type { Provider } from "@ethersproject/providers"; +import type { RateLimitNFT, RateLimitNFTInterface } from "../RateLimitNFT"; + +const _abi = [ + { + inputs: [], + stateMutability: "nonpayable", + type: "constructor", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "newAdditionalRequestsPerKilosecondCost", + type: "uint256", + }, + ], + name: "AdditionalRequestsPerKilosecondCostSet", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "owner", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "approved", + type: "address", + }, + { + indexed: true, + internalType: "uint256", + name: "tokenId", + type: "uint256", + }, + ], + name: "Approval", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "owner", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "operator", + type: "address", + }, + { + indexed: false, + internalType: "bool", + name: "approved", + type: "bool", + }, + ], + name: "ApprovalForAll", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "newFreeMintSigner", + type: "address", + }, + ], + name: "FreeMintSignerSet", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "newFreeRequestsPerRateLimitWindow", + type: "uint256", + }, + ], + name: "FreeRequestsPerRateLimitWindowSet", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "previousOwner", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "newOwner", + type: "address", + }, + ], + name: "OwnershipTransferred", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "newRLIHolderRateLimitWindowSeconds", + type: "uint256", + }, + ], + name: "RLIHolderRateLimitWindowSecondsSet", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "newRateLimitWindowSeconds", + type: "uint256", + }, + ], + name: "RateLimitWindowSecondsSet", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "from", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "to", + type: "address", + }, + { + indexed: true, + internalType: "uint256", + name: "tokenId", + type: "uint256", + }, + ], + name: "Transfer", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "amount", + type: "uint256", + }, + ], + name: "Withdrew", + type: "event", + }, + { + inputs: [], + name: "RLIHolderRateLimitWindowSeconds", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "additionalRequestsPerKilosecondCost", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "to", + type: "address", + }, + { + internalType: "uint256", + name: "tokenId", + type: "uint256", + }, + ], + name: "approve", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "owner", + type: "address", + }, + ], + name: "balanceOf", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "tokenId", + type: "uint256", + }, + ], + name: "burn", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "requestsPerKilosecond", + type: "uint256", + }, + { + internalType: "uint256", + name: "expiresAt", + type: "uint256", + }, + ], + name: "calculateCost", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "payingAmount", + type: "uint256", + }, + { + internalType: "uint256", + name: "expiresAt", + type: "uint256", + }, + ], + name: "calculateRequestsPerKilosecond", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + name: "capacity", + outputs: [ + { + internalType: "uint256", + name: "requestsPerKilosecond", + type: "uint256", + }, + { + internalType: "uint256", + name: "expiresAt", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "defaultRateLimitWindowSeconds", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "expiresAt", + type: "uint256", + }, + { + internalType: "uint256", + name: "requestsPerKilosecond", + type: "uint256", + }, + { + internalType: "bytes32", + name: "msgHash", + type: "bytes32", + }, + { + internalType: "uint8", + name: "v", + type: "uint8", + }, + { + internalType: "bytes32", + name: "r", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "s", + type: "bytes32", + }, + ], + name: "freeMint", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "expiresAt", + type: "uint256", + }, + { + internalType: "uint256", + name: "requestsPerKilosecond", + type: "uint256", + }, + { + internalType: "bytes32", + name: "msgHash", + type: "bytes32", + }, + { + internalType: "uint8", + name: "v", + type: "uint8", + }, + { + internalType: "bytes32", + name: "r", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "s", + type: "bytes32", + }, + ], + name: "freeMintSigTest", + outputs: [], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "freeMintSigner", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "freeRequestsPerRateLimitWindow", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "tokenId", + type: "uint256", + }, + ], + name: "getApproved", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "owner", + type: "address", + }, + { + internalType: "address", + name: "operator", + type: "address", + }, + ], + name: "isApprovedForAll", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "tokenId", + type: "uint256", + }, + ], + name: "isExpired", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "expiresAt", + type: "uint256", + }, + ], + name: "mint", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "payable", + type: "function", + }, + { + inputs: [], + name: "name", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "owner", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "tokenId", + type: "uint256", + }, + ], + name: "ownerOf", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "hash", + type: "bytes32", + }, + ], + name: "prefixed", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "pure", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + name: "redeemedFreeMints", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "renounceOwnership", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "from", + type: "address", + }, + { + internalType: "address", + name: "to", + type: "address", + }, + { + internalType: "uint256", + name: "tokenId", + type: "uint256", + }, + ], + name: "safeTransferFrom", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "from", + type: "address", + }, + { + internalType: "address", + name: "to", + type: "address", + }, + { + internalType: "uint256", + name: "tokenId", + type: "uint256", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + ], + name: "safeTransferFrom", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "newAdditionalRequestsPerKilosecondCost", + type: "uint256", + }, + ], + name: "setAdditionalRequestsPerKilosecondCost", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "operator", + type: "address", + }, + { + internalType: "bool", + name: "approved", + type: "bool", + }, + ], + name: "setApprovalForAll", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "newFreeMintSigner", + type: "address", + }, + ], + name: "setFreeMintSigner", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "newFreeRequestsPerRateLimitWindow", + type: "uint256", + }, + ], + name: "setFreeRequestsPerRateLimitWindow", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "newRLIHolderRateLimitWindowSeconds", + type: "uint256", + }, + ], + name: "setRLIHolderRateLimitWindowSeconds", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "newRateLimitWindowSeconds", + type: "uint256", + }, + ], + name: "setRateLimitWindowSeconds", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes4", + name: "interfaceId", + type: "bytes4", + }, + ], + name: "supportsInterface", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "symbol", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "index", + type: "uint256", + }, + ], + name: "tokenByIndex", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "tokenIdCounter", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "owner", + type: "address", + }, + { + internalType: "uint256", + name: "index", + type: "uint256", + }, + ], + name: "tokenOfOwnerByIndex", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "tokenId", + type: "uint256", + }, + ], + name: "tokenURI", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "totalSupply", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "from", + type: "address", + }, + { + internalType: "address", + name: "to", + type: "address", + }, + { + internalType: "uint256", + name: "tokenId", + type: "uint256", + }, + ], + name: "transferFrom", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "newOwner", + type: "address", + }, + ], + name: "transferOwnership", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "withdraw", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, +] as const; + +export class RateLimitNFT__factory { + static readonly abi = _abi; + static createInterface(): RateLimitNFTInterface { + return new utils.Interface(_abi) as RateLimitNFTInterface; + } + static connect( + address: string, + signerOrProvider: Signer | Provider + ): RateLimitNFT { + return new Contract(address, _abi, signerOrProvider) as RateLimitNFT; + } +} diff --git a/tools/scripts/lit-contracts/RateLimitNFT.sol/factories/index.ts b/tools/scripts/lit-contracts/RateLimitNFT.sol/factories/index.ts new file mode 100644 index 0000000000..12c6b7ea6b --- /dev/null +++ b/tools/scripts/lit-contracts/RateLimitNFT.sol/factories/index.ts @@ -0,0 +1,4 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export { RateLimitNFT__factory } from "./RateLimitNFT__factory"; diff --git a/tools/scripts/lit-contracts/RateLimitNFT.sol/index.js b/tools/scripts/lit-contracts/RateLimitNFT.sol/index.js new file mode 100644 index 0000000000..a496f01c8c --- /dev/null +++ b/tools/scripts/lit-contracts/RateLimitNFT.sol/index.js @@ -0,0 +1,2 @@ +export * from "./RateLimitNFTData.js"; +export * from "./RateLimitNFTContract.js"; \ No newline at end of file diff --git a/tools/scripts/lit-contracts/RateLimitNFT.sol/index.mjs b/tools/scripts/lit-contracts/RateLimitNFT.sol/index.mjs new file mode 100644 index 0000000000..87c40cfeac --- /dev/null +++ b/tools/scripts/lit-contracts/RateLimitNFT.sol/index.mjs @@ -0,0 +1,2 @@ +export * from "./RateLimitNFTData.mjs"; +export * from "./RateLimitNFTContract.mjs"; \ No newline at end of file diff --git a/tools/scripts/lit-contracts/RateLimitNFT.sol/index.ts b/tools/scripts/lit-contracts/RateLimitNFT.sol/index.ts new file mode 100644 index 0000000000..570b2d4947 --- /dev/null +++ b/tools/scripts/lit-contracts/RateLimitNFT.sol/index.ts @@ -0,0 +1,3 @@ +export * from "./RateLimitNFTData"; +export * from "./RateLimitNFTContract"; +export * from "./RateLimitNFT"; \ No newline at end of file diff --git a/tools/scripts/lit-contracts/Resolver.sol/Resolver.json b/tools/scripts/lit-contracts/Resolver.sol/Resolver.json new file mode 100644 index 0000000000..8a37ac89fb --- /dev/null +++ b/tools/scripts/lit-contracts/Resolver.sol/Resolver.json @@ -0,0 +1,596 @@ +{ + "date": "2023-09-10T22:33:24.000Z", + "address": "0x0bca885Cf322D0E478DC48Fb84b4f522144db9D7", + "contractName": "Resolver", + "abi": [ + { + "inputs": [ + { + "internalType": "enum ContractResolver.Env", + "name": "env", + "type": "uint8" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "AdminRoleRequired", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "enum ContractResolver.Env", + "name": "env", + "type": "uint8" + } + ], + "name": "AllowedEnvAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "enum ContractResolver.Env", + "name": "env", + "type": "uint8" + } + ], + "name": "AllowedEnvRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "typ", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "enum ContractResolver.Env", + "name": "env", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "address", + "name": "addr", + "type": "address" + } + ], + "name": "SetContract", + "type": "event" + }, + { + "inputs": [], + "name": "ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ALLOWLIST_CONTRACT", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "DOMAIN_WALLET_ORACLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "DOMAIN_WALLET_REGISTRY", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "HD_KEY_DERIVER_CONTRACT", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "LIT_TOKEN_CONTRACT", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MULTI_SENDER_CONTRACT", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PKP_HELPER_CONTRACT", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PKP_NFT_CONTRACT", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PKP_NFT_METADATA_CONTRACT", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PKP_PERMISSIONS_CONTRACT", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PUB_KEY_ROUTER_CONTRACT", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "RATE_LIMIT_NFT_CONTRACT", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "RELEASE_REGISTER_CONTRACT", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "STAKING_BALANCES_CONTRACT", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "STAKING_CONTRACT", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "enum ContractResolver.Env", + "name": "env", + "type": "uint8" + } + ], + "name": "addAllowedEnv", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "typ", + "type": "bytes32" + }, + { + "internalType": "enum ContractResolver.Env", + "name": "env", + "type": "uint8" + } + ], + "name": "getContract", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "enum ContractResolver.Env", + "name": "env", + "type": "uint8" + } + ], + "name": "removeAllowedEnv", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "setAdmin", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "typ", + "type": "bytes32" + }, + { + "internalType": "enum ContractResolver.Env", + "name": "env", + "type": "uint8" + }, + { + "internalType": "address", + "name": "addr", + "type": "address" + } + ], + "name": "setContract", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + }, + { + "internalType": "enum ContractResolver.Env", + "name": "", + "type": "uint8" + } + ], + "name": "typeAddresses", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } + ] +} \ No newline at end of file diff --git a/tools/scripts/lit-contracts/Resolver.sol/Resolver.ts b/tools/scripts/lit-contracts/Resolver.sol/Resolver.ts new file mode 100644 index 0000000000..26ebf44d71 --- /dev/null +++ b/tools/scripts/lit-contracts/Resolver.sol/Resolver.ts @@ -0,0 +1,1002 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumber, + BigNumberish, + BytesLike, + CallOverrides, + ContractTransaction, + Overrides, + PopulatedTransaction, + Signer, + utils, +} from "ethers"; +import type { + FunctionFragment, + Result, + EventFragment, +} from "@ethersproject/abi"; +import type { Listener, Provider } from "@ethersproject/providers"; +import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, +} from "./common"; + +export interface ResolverInterface extends utils.Interface { + functions: { + "ADMIN_ROLE()": FunctionFragment; + "ALLOWLIST_CONTRACT()": FunctionFragment; + "DEFAULT_ADMIN_ROLE()": FunctionFragment; + "DOMAIN_WALLET_ORACLE()": FunctionFragment; + "DOMAIN_WALLET_REGISTRY()": FunctionFragment; + "HD_KEY_DERIVER_CONTRACT()": FunctionFragment; + "LIT_TOKEN_CONTRACT()": FunctionFragment; + "MULTI_SENDER_CONTRACT()": FunctionFragment; + "PKP_HELPER_CONTRACT()": FunctionFragment; + "PKP_NFT_CONTRACT()": FunctionFragment; + "PKP_NFT_METADATA_CONTRACT()": FunctionFragment; + "PKP_PERMISSIONS_CONTRACT()": FunctionFragment; + "PUB_KEY_ROUTER_CONTRACT()": FunctionFragment; + "RATE_LIMIT_NFT_CONTRACT()": FunctionFragment; + "RELEASE_REGISTER_CONTRACT()": FunctionFragment; + "STAKING_BALANCES_CONTRACT()": FunctionFragment; + "STAKING_CONTRACT()": FunctionFragment; + "addAllowedEnv(uint8)": FunctionFragment; + "getContract(bytes32,uint8)": FunctionFragment; + "getRoleAdmin(bytes32)": FunctionFragment; + "grantRole(bytes32,address)": FunctionFragment; + "hasRole(bytes32,address)": FunctionFragment; + "removeAllowedEnv(uint8)": FunctionFragment; + "renounceRole(bytes32,address)": FunctionFragment; + "revokeRole(bytes32,address)": FunctionFragment; + "setAdmin(address)": FunctionFragment; + "setContract(bytes32,uint8,address)": FunctionFragment; + "supportsInterface(bytes4)": FunctionFragment; + "typeAddresses(bytes32,uint8)": FunctionFragment; + }; + + getFunction( + nameOrSignatureOrTopic: + | "ADMIN_ROLE" + | "ALLOWLIST_CONTRACT" + | "DEFAULT_ADMIN_ROLE" + | "DOMAIN_WALLET_ORACLE" + | "DOMAIN_WALLET_REGISTRY" + | "HD_KEY_DERIVER_CONTRACT" + | "LIT_TOKEN_CONTRACT" + | "MULTI_SENDER_CONTRACT" + | "PKP_HELPER_CONTRACT" + | "PKP_NFT_CONTRACT" + | "PKP_NFT_METADATA_CONTRACT" + | "PKP_PERMISSIONS_CONTRACT" + | "PUB_KEY_ROUTER_CONTRACT" + | "RATE_LIMIT_NFT_CONTRACT" + | "RELEASE_REGISTER_CONTRACT" + | "STAKING_BALANCES_CONTRACT" + | "STAKING_CONTRACT" + | "addAllowedEnv" + | "getContract" + | "getRoleAdmin" + | "grantRole" + | "hasRole" + | "removeAllowedEnv" + | "renounceRole" + | "revokeRole" + | "setAdmin" + | "setContract" + | "supportsInterface" + | "typeAddresses" + ): FunctionFragment; + + encodeFunctionData( + functionFragment: "ADMIN_ROLE", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "ALLOWLIST_CONTRACT", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "DEFAULT_ADMIN_ROLE", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "DOMAIN_WALLET_ORACLE", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "DOMAIN_WALLET_REGISTRY", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "HD_KEY_DERIVER_CONTRACT", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "LIT_TOKEN_CONTRACT", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "MULTI_SENDER_CONTRACT", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "PKP_HELPER_CONTRACT", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "PKP_NFT_CONTRACT", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "PKP_NFT_METADATA_CONTRACT", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "PKP_PERMISSIONS_CONTRACT", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "PUB_KEY_ROUTER_CONTRACT", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "RATE_LIMIT_NFT_CONTRACT", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "RELEASE_REGISTER_CONTRACT", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "STAKING_BALANCES_CONTRACT", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "STAKING_CONTRACT", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "addAllowedEnv", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "getContract", + values: [BytesLike, BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "getRoleAdmin", + values: [BytesLike] + ): string; + encodeFunctionData( + functionFragment: "grantRole", + values: [BytesLike, string] + ): string; + encodeFunctionData( + functionFragment: "hasRole", + values: [BytesLike, string] + ): string; + encodeFunctionData( + functionFragment: "removeAllowedEnv", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "renounceRole", + values: [BytesLike, string] + ): string; + encodeFunctionData( + functionFragment: "revokeRole", + values: [BytesLike, string] + ): string; + encodeFunctionData(functionFragment: "setAdmin", values: [string]): string; + encodeFunctionData( + functionFragment: "setContract", + values: [BytesLike, BigNumberish, string] + ): string; + encodeFunctionData( + functionFragment: "supportsInterface", + values: [BytesLike] + ): string; + encodeFunctionData( + functionFragment: "typeAddresses", + values: [BytesLike, BigNumberish] + ): string; + + decodeFunctionResult(functionFragment: "ADMIN_ROLE", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "ALLOWLIST_CONTRACT", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "DEFAULT_ADMIN_ROLE", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "DOMAIN_WALLET_ORACLE", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "DOMAIN_WALLET_REGISTRY", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "HD_KEY_DERIVER_CONTRACT", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "LIT_TOKEN_CONTRACT", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "MULTI_SENDER_CONTRACT", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "PKP_HELPER_CONTRACT", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "PKP_NFT_CONTRACT", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "PKP_NFT_METADATA_CONTRACT", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "PKP_PERMISSIONS_CONTRACT", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "PUB_KEY_ROUTER_CONTRACT", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "RATE_LIMIT_NFT_CONTRACT", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "RELEASE_REGISTER_CONTRACT", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "STAKING_BALANCES_CONTRACT", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "STAKING_CONTRACT", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "addAllowedEnv", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getContract", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getRoleAdmin", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "grantRole", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "hasRole", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "removeAllowedEnv", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "renounceRole", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "revokeRole", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "setAdmin", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "setContract", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "supportsInterface", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "typeAddresses", + data: BytesLike + ): Result; + + events: { + "AllowedEnvAdded(uint8)": EventFragment; + "AllowedEnvRemoved(uint8)": EventFragment; + "RoleAdminChanged(bytes32,bytes32,bytes32)": EventFragment; + "RoleGranted(bytes32,address,address)": EventFragment; + "RoleRevoked(bytes32,address,address)": EventFragment; + "SetContract(bytes32,uint8,address)": EventFragment; + }; + + getEvent(nameOrSignatureOrTopic: "AllowedEnvAdded"): EventFragment; + getEvent(nameOrSignatureOrTopic: "AllowedEnvRemoved"): EventFragment; + getEvent(nameOrSignatureOrTopic: "RoleAdminChanged"): EventFragment; + getEvent(nameOrSignatureOrTopic: "RoleGranted"): EventFragment; + getEvent(nameOrSignatureOrTopic: "RoleRevoked"): EventFragment; + getEvent(nameOrSignatureOrTopic: "SetContract"): EventFragment; +} + +export interface AllowedEnvAddedEventObject { + env: number; +} +export type AllowedEnvAddedEvent = TypedEvent< + [number], + AllowedEnvAddedEventObject +>; + +export type AllowedEnvAddedEventFilter = TypedEventFilter; + +export interface AllowedEnvRemovedEventObject { + env: number; +} +export type AllowedEnvRemovedEvent = TypedEvent< + [number], + AllowedEnvRemovedEventObject +>; + +export type AllowedEnvRemovedEventFilter = + TypedEventFilter; + +export interface RoleAdminChangedEventObject { + role: string; + previousAdminRole: string; + newAdminRole: string; +} +export type RoleAdminChangedEvent = TypedEvent< + [string, string, string], + RoleAdminChangedEventObject +>; + +export type RoleAdminChangedEventFilter = + TypedEventFilter; + +export interface RoleGrantedEventObject { + role: string; + account: string; + sender: string; +} +export type RoleGrantedEvent = TypedEvent< + [string, string, string], + RoleGrantedEventObject +>; + +export type RoleGrantedEventFilter = TypedEventFilter; + +export interface RoleRevokedEventObject { + role: string; + account: string; + sender: string; +} +export type RoleRevokedEvent = TypedEvent< + [string, string, string], + RoleRevokedEventObject +>; + +export type RoleRevokedEventFilter = TypedEventFilter; + +export interface SetContractEventObject { + typ: string; + env: number; + addr: string; +} +export type SetContractEvent = TypedEvent< + [string, number, string], + SetContractEventObject +>; + +export type SetContractEventFilter = TypedEventFilter; + +export interface Resolver extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: ResolverInterface; + + queryFilter( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>; + + listeners( + eventFilter?: TypedEventFilter + ): Array>; + listeners(eventName?: string): Array; + removeAllListeners( + eventFilter: TypedEventFilter + ): this; + removeAllListeners(eventName?: string): this; + off: OnEvent; + on: OnEvent; + once: OnEvent; + removeListener: OnEvent; + + functions: { + ADMIN_ROLE(overrides?: CallOverrides): Promise<[string]>; + + ALLOWLIST_CONTRACT(overrides?: CallOverrides): Promise<[string]>; + + DEFAULT_ADMIN_ROLE(overrides?: CallOverrides): Promise<[string]>; + + DOMAIN_WALLET_ORACLE(overrides?: CallOverrides): Promise<[string]>; + + DOMAIN_WALLET_REGISTRY(overrides?: CallOverrides): Promise<[string]>; + + HD_KEY_DERIVER_CONTRACT(overrides?: CallOverrides): Promise<[string]>; + + LIT_TOKEN_CONTRACT(overrides?: CallOverrides): Promise<[string]>; + + MULTI_SENDER_CONTRACT(overrides?: CallOverrides): Promise<[string]>; + + PKP_HELPER_CONTRACT(overrides?: CallOverrides): Promise<[string]>; + + PKP_NFT_CONTRACT(overrides?: CallOverrides): Promise<[string]>; + + PKP_NFT_METADATA_CONTRACT(overrides?: CallOverrides): Promise<[string]>; + + PKP_PERMISSIONS_CONTRACT(overrides?: CallOverrides): Promise<[string]>; + + PUB_KEY_ROUTER_CONTRACT(overrides?: CallOverrides): Promise<[string]>; + + RATE_LIMIT_NFT_CONTRACT(overrides?: CallOverrides): Promise<[string]>; + + RELEASE_REGISTER_CONTRACT(overrides?: CallOverrides): Promise<[string]>; + + STAKING_BALANCES_CONTRACT(overrides?: CallOverrides): Promise<[string]>; + + STAKING_CONTRACT(overrides?: CallOverrides): Promise<[string]>; + + addAllowedEnv( + env: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + getContract( + typ: BytesLike, + env: BigNumberish, + overrides?: CallOverrides + ): Promise<[string]>; + + getRoleAdmin(role: BytesLike, overrides?: CallOverrides): Promise<[string]>; + + grantRole( + role: BytesLike, + account: string, + overrides?: Overrides & { from?: string } + ): Promise; + + hasRole( + role: BytesLike, + account: string, + overrides?: CallOverrides + ): Promise<[boolean]>; + + removeAllowedEnv( + env: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + renounceRole( + role: BytesLike, + account: string, + overrides?: Overrides & { from?: string } + ): Promise; + + revokeRole( + role: BytesLike, + account: string, + overrides?: Overrides & { from?: string } + ): Promise; + + setAdmin( + newAdmin: string, + overrides?: Overrides & { from?: string } + ): Promise; + + setContract( + typ: BytesLike, + env: BigNumberish, + addr: string, + overrides?: Overrides & { from?: string } + ): Promise; + + supportsInterface( + interfaceId: BytesLike, + overrides?: CallOverrides + ): Promise<[boolean]>; + + typeAddresses( + arg0: BytesLike, + arg1: BigNumberish, + overrides?: CallOverrides + ): Promise<[string]>; + }; + + ADMIN_ROLE(overrides?: CallOverrides): Promise; + + ALLOWLIST_CONTRACT(overrides?: CallOverrides): Promise; + + DEFAULT_ADMIN_ROLE(overrides?: CallOverrides): Promise; + + DOMAIN_WALLET_ORACLE(overrides?: CallOverrides): Promise; + + DOMAIN_WALLET_REGISTRY(overrides?: CallOverrides): Promise; + + HD_KEY_DERIVER_CONTRACT(overrides?: CallOverrides): Promise; + + LIT_TOKEN_CONTRACT(overrides?: CallOverrides): Promise; + + MULTI_SENDER_CONTRACT(overrides?: CallOverrides): Promise; + + PKP_HELPER_CONTRACT(overrides?: CallOverrides): Promise; + + PKP_NFT_CONTRACT(overrides?: CallOverrides): Promise; + + PKP_NFT_METADATA_CONTRACT(overrides?: CallOverrides): Promise; + + PKP_PERMISSIONS_CONTRACT(overrides?: CallOverrides): Promise; + + PUB_KEY_ROUTER_CONTRACT(overrides?: CallOverrides): Promise; + + RATE_LIMIT_NFT_CONTRACT(overrides?: CallOverrides): Promise; + + RELEASE_REGISTER_CONTRACT(overrides?: CallOverrides): Promise; + + STAKING_BALANCES_CONTRACT(overrides?: CallOverrides): Promise; + + STAKING_CONTRACT(overrides?: CallOverrides): Promise; + + addAllowedEnv( + env: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + getContract( + typ: BytesLike, + env: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getRoleAdmin(role: BytesLike, overrides?: CallOverrides): Promise; + + grantRole( + role: BytesLike, + account: string, + overrides?: Overrides & { from?: string } + ): Promise; + + hasRole( + role: BytesLike, + account: string, + overrides?: CallOverrides + ): Promise; + + removeAllowedEnv( + env: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + renounceRole( + role: BytesLike, + account: string, + overrides?: Overrides & { from?: string } + ): Promise; + + revokeRole( + role: BytesLike, + account: string, + overrides?: Overrides & { from?: string } + ): Promise; + + setAdmin( + newAdmin: string, + overrides?: Overrides & { from?: string } + ): Promise; + + setContract( + typ: BytesLike, + env: BigNumberish, + addr: string, + overrides?: Overrides & { from?: string } + ): Promise; + + supportsInterface( + interfaceId: BytesLike, + overrides?: CallOverrides + ): Promise; + + typeAddresses( + arg0: BytesLike, + arg1: BigNumberish, + overrides?: CallOverrides + ): Promise; + + callStatic: { + ADMIN_ROLE(overrides?: CallOverrides): Promise; + + ALLOWLIST_CONTRACT(overrides?: CallOverrides): Promise; + + DEFAULT_ADMIN_ROLE(overrides?: CallOverrides): Promise; + + DOMAIN_WALLET_ORACLE(overrides?: CallOverrides): Promise; + + DOMAIN_WALLET_REGISTRY(overrides?: CallOverrides): Promise; + + HD_KEY_DERIVER_CONTRACT(overrides?: CallOverrides): Promise; + + LIT_TOKEN_CONTRACT(overrides?: CallOverrides): Promise; + + MULTI_SENDER_CONTRACT(overrides?: CallOverrides): Promise; + + PKP_HELPER_CONTRACT(overrides?: CallOverrides): Promise; + + PKP_NFT_CONTRACT(overrides?: CallOverrides): Promise; + + PKP_NFT_METADATA_CONTRACT(overrides?: CallOverrides): Promise; + + PKP_PERMISSIONS_CONTRACT(overrides?: CallOverrides): Promise; + + PUB_KEY_ROUTER_CONTRACT(overrides?: CallOverrides): Promise; + + RATE_LIMIT_NFT_CONTRACT(overrides?: CallOverrides): Promise; + + RELEASE_REGISTER_CONTRACT(overrides?: CallOverrides): Promise; + + STAKING_BALANCES_CONTRACT(overrides?: CallOverrides): Promise; + + STAKING_CONTRACT(overrides?: CallOverrides): Promise; + + addAllowedEnv(env: BigNumberish, overrides?: CallOverrides): Promise; + + getContract( + typ: BytesLike, + env: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getRoleAdmin(role: BytesLike, overrides?: CallOverrides): Promise; + + grantRole( + role: BytesLike, + account: string, + overrides?: CallOverrides + ): Promise; + + hasRole( + role: BytesLike, + account: string, + overrides?: CallOverrides + ): Promise; + + removeAllowedEnv( + env: BigNumberish, + overrides?: CallOverrides + ): Promise; + + renounceRole( + role: BytesLike, + account: string, + overrides?: CallOverrides + ): Promise; + + revokeRole( + role: BytesLike, + account: string, + overrides?: CallOverrides + ): Promise; + + setAdmin(newAdmin: string, overrides?: CallOverrides): Promise; + + setContract( + typ: BytesLike, + env: BigNumberish, + addr: string, + overrides?: CallOverrides + ): Promise; + + supportsInterface( + interfaceId: BytesLike, + overrides?: CallOverrides + ): Promise; + + typeAddresses( + arg0: BytesLike, + arg1: BigNumberish, + overrides?: CallOverrides + ): Promise; + }; + + filters: { + "AllowedEnvAdded(uint8)"(env?: null): AllowedEnvAddedEventFilter; + AllowedEnvAdded(env?: null): AllowedEnvAddedEventFilter; + + "AllowedEnvRemoved(uint8)"(env?: null): AllowedEnvRemovedEventFilter; + AllowedEnvRemoved(env?: null): AllowedEnvRemovedEventFilter; + + "RoleAdminChanged(bytes32,bytes32,bytes32)"( + role?: BytesLike | null, + previousAdminRole?: BytesLike | null, + newAdminRole?: BytesLike | null + ): RoleAdminChangedEventFilter; + RoleAdminChanged( + role?: BytesLike | null, + previousAdminRole?: BytesLike | null, + newAdminRole?: BytesLike | null + ): RoleAdminChangedEventFilter; + + "RoleGranted(bytes32,address,address)"( + role?: BytesLike | null, + account?: string | null, + sender?: string | null + ): RoleGrantedEventFilter; + RoleGranted( + role?: BytesLike | null, + account?: string | null, + sender?: string | null + ): RoleGrantedEventFilter; + + "RoleRevoked(bytes32,address,address)"( + role?: BytesLike | null, + account?: string | null, + sender?: string | null + ): RoleRevokedEventFilter; + RoleRevoked( + role?: BytesLike | null, + account?: string | null, + sender?: string | null + ): RoleRevokedEventFilter; + + "SetContract(bytes32,uint8,address)"( + typ?: null, + env?: null, + addr?: null + ): SetContractEventFilter; + SetContract(typ?: null, env?: null, addr?: null): SetContractEventFilter; + }; + + estimateGas: { + ADMIN_ROLE(overrides?: CallOverrides): Promise; + + ALLOWLIST_CONTRACT(overrides?: CallOverrides): Promise; + + DEFAULT_ADMIN_ROLE(overrides?: CallOverrides): Promise; + + DOMAIN_WALLET_ORACLE(overrides?: CallOverrides): Promise; + + DOMAIN_WALLET_REGISTRY(overrides?: CallOverrides): Promise; + + HD_KEY_DERIVER_CONTRACT(overrides?: CallOverrides): Promise; + + LIT_TOKEN_CONTRACT(overrides?: CallOverrides): Promise; + + MULTI_SENDER_CONTRACT(overrides?: CallOverrides): Promise; + + PKP_HELPER_CONTRACT(overrides?: CallOverrides): Promise; + + PKP_NFT_CONTRACT(overrides?: CallOverrides): Promise; + + PKP_NFT_METADATA_CONTRACT(overrides?: CallOverrides): Promise; + + PKP_PERMISSIONS_CONTRACT(overrides?: CallOverrides): Promise; + + PUB_KEY_ROUTER_CONTRACT(overrides?: CallOverrides): Promise; + + RATE_LIMIT_NFT_CONTRACT(overrides?: CallOverrides): Promise; + + RELEASE_REGISTER_CONTRACT(overrides?: CallOverrides): Promise; + + STAKING_BALANCES_CONTRACT(overrides?: CallOverrides): Promise; + + STAKING_CONTRACT(overrides?: CallOverrides): Promise; + + addAllowedEnv( + env: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + getContract( + typ: BytesLike, + env: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getRoleAdmin( + role: BytesLike, + overrides?: CallOverrides + ): Promise; + + grantRole( + role: BytesLike, + account: string, + overrides?: Overrides & { from?: string } + ): Promise; + + hasRole( + role: BytesLike, + account: string, + overrides?: CallOverrides + ): Promise; + + removeAllowedEnv( + env: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + renounceRole( + role: BytesLike, + account: string, + overrides?: Overrides & { from?: string } + ): Promise; + + revokeRole( + role: BytesLike, + account: string, + overrides?: Overrides & { from?: string } + ): Promise; + + setAdmin( + newAdmin: string, + overrides?: Overrides & { from?: string } + ): Promise; + + setContract( + typ: BytesLike, + env: BigNumberish, + addr: string, + overrides?: Overrides & { from?: string } + ): Promise; + + supportsInterface( + interfaceId: BytesLike, + overrides?: CallOverrides + ): Promise; + + typeAddresses( + arg0: BytesLike, + arg1: BigNumberish, + overrides?: CallOverrides + ): Promise; + }; + + populateTransaction: { + ADMIN_ROLE(overrides?: CallOverrides): Promise; + + ALLOWLIST_CONTRACT( + overrides?: CallOverrides + ): Promise; + + DEFAULT_ADMIN_ROLE( + overrides?: CallOverrides + ): Promise; + + DOMAIN_WALLET_ORACLE( + overrides?: CallOverrides + ): Promise; + + DOMAIN_WALLET_REGISTRY( + overrides?: CallOverrides + ): Promise; + + HD_KEY_DERIVER_CONTRACT( + overrides?: CallOverrides + ): Promise; + + LIT_TOKEN_CONTRACT( + overrides?: CallOverrides + ): Promise; + + MULTI_SENDER_CONTRACT( + overrides?: CallOverrides + ): Promise; + + PKP_HELPER_CONTRACT( + overrides?: CallOverrides + ): Promise; + + PKP_NFT_CONTRACT(overrides?: CallOverrides): Promise; + + PKP_NFT_METADATA_CONTRACT( + overrides?: CallOverrides + ): Promise; + + PKP_PERMISSIONS_CONTRACT( + overrides?: CallOverrides + ): Promise; + + PUB_KEY_ROUTER_CONTRACT( + overrides?: CallOverrides + ): Promise; + + RATE_LIMIT_NFT_CONTRACT( + overrides?: CallOverrides + ): Promise; + + RELEASE_REGISTER_CONTRACT( + overrides?: CallOverrides + ): Promise; + + STAKING_BALANCES_CONTRACT( + overrides?: CallOverrides + ): Promise; + + STAKING_CONTRACT(overrides?: CallOverrides): Promise; + + addAllowedEnv( + env: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + getContract( + typ: BytesLike, + env: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getRoleAdmin( + role: BytesLike, + overrides?: CallOverrides + ): Promise; + + grantRole( + role: BytesLike, + account: string, + overrides?: Overrides & { from?: string } + ): Promise; + + hasRole( + role: BytesLike, + account: string, + overrides?: CallOverrides + ): Promise; + + removeAllowedEnv( + env: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + renounceRole( + role: BytesLike, + account: string, + overrides?: Overrides & { from?: string } + ): Promise; + + revokeRole( + role: BytesLike, + account: string, + overrides?: Overrides & { from?: string } + ): Promise; + + setAdmin( + newAdmin: string, + overrides?: Overrides & { from?: string } + ): Promise; + + setContract( + typ: BytesLike, + env: BigNumberish, + addr: string, + overrides?: Overrides & { from?: string } + ): Promise; + + supportsInterface( + interfaceId: BytesLike, + overrides?: CallOverrides + ): Promise; + + typeAddresses( + arg0: BytesLike, + arg1: BigNumberish, + overrides?: CallOverrides + ): Promise; + }; +} diff --git a/tools/scripts/lit-contracts/Resolver.sol/ResolverContract.js b/tools/scripts/lit-contracts/Resolver.sol/ResolverContract.js new file mode 100644 index 0000000000..8e964f4fa8 --- /dev/null +++ b/tools/scripts/lit-contracts/Resolver.sol/ResolverContract.js @@ -0,0 +1,8 @@ +import { ethers } from "ethers"; +import { ResolverData } from "./ResolverData.js"; + +export const getResolverContract = (provider) => new ethers.Contract( + ResolverData.address, + ResolverData.abi, + provider +); \ No newline at end of file diff --git a/tools/scripts/lit-contracts/Resolver.sol/ResolverContract.mjs b/tools/scripts/lit-contracts/Resolver.sol/ResolverContract.mjs new file mode 100644 index 0000000000..8c413b61bf --- /dev/null +++ b/tools/scripts/lit-contracts/Resolver.sol/ResolverContract.mjs @@ -0,0 +1,8 @@ +import { ethers } from "ethers"; +import { ResolverData } from "./ResolverData.mjs"; + +export const getResolverContract = (provider) => new ethers.Contract( + ResolverData.address, + ResolverData.abi, + provider +); \ No newline at end of file diff --git a/tools/scripts/lit-contracts/Resolver.sol/ResolverContract.ts b/tools/scripts/lit-contracts/Resolver.sol/ResolverContract.ts new file mode 100644 index 0000000000..3360719992 --- /dev/null +++ b/tools/scripts/lit-contracts/Resolver.sol/ResolverContract.ts @@ -0,0 +1,11 @@ +import { ethers } from "ethers"; +import { ResolverData } from "./ResolverData"; +import { Resolver } from "./Resolver"; + +export const getResolverContract = (provider: any) => { + return new ethers.Contract( + ResolverData.address, + ResolverData.abi, + provider + ) as unknown as Resolver; +} \ No newline at end of file diff --git a/tools/scripts/lit-contracts/Resolver.sol/ResolverData.js b/tools/scripts/lit-contracts/Resolver.sol/ResolverData.js new file mode 100644 index 0000000000..348fe39ceb --- /dev/null +++ b/tools/scripts/lit-contracts/Resolver.sol/ResolverData.js @@ -0,0 +1,596 @@ +export const ResolverData = { + "date": "2023-09-10T22:33:24.000Z", + "address": "0x0bca885Cf322D0E478DC48Fb84b4f522144db9D7", + "contractName": "Resolver", + "abi": [ + { + "inputs": [ + { + "internalType": "enum ContractResolver.Env", + "name": "env", + "type": "uint8" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "AdminRoleRequired", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "enum ContractResolver.Env", + "name": "env", + "type": "uint8" + } + ], + "name": "AllowedEnvAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "enum ContractResolver.Env", + "name": "env", + "type": "uint8" + } + ], + "name": "AllowedEnvRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "typ", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "enum ContractResolver.Env", + "name": "env", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "address", + "name": "addr", + "type": "address" + } + ], + "name": "SetContract", + "type": "event" + }, + { + "inputs": [], + "name": "ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ALLOWLIST_CONTRACT", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "DOMAIN_WALLET_ORACLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "DOMAIN_WALLET_REGISTRY", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "HD_KEY_DERIVER_CONTRACT", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "LIT_TOKEN_CONTRACT", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MULTI_SENDER_CONTRACT", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PKP_HELPER_CONTRACT", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PKP_NFT_CONTRACT", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PKP_NFT_METADATA_CONTRACT", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PKP_PERMISSIONS_CONTRACT", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PUB_KEY_ROUTER_CONTRACT", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "RATE_LIMIT_NFT_CONTRACT", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "RELEASE_REGISTER_CONTRACT", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "STAKING_BALANCES_CONTRACT", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "STAKING_CONTRACT", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "enum ContractResolver.Env", + "name": "env", + "type": "uint8" + } + ], + "name": "addAllowedEnv", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "typ", + "type": "bytes32" + }, + { + "internalType": "enum ContractResolver.Env", + "name": "env", + "type": "uint8" + } + ], + "name": "getContract", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "enum ContractResolver.Env", + "name": "env", + "type": "uint8" + } + ], + "name": "removeAllowedEnv", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "setAdmin", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "typ", + "type": "bytes32" + }, + { + "internalType": "enum ContractResolver.Env", + "name": "env", + "type": "uint8" + }, + { + "internalType": "address", + "name": "addr", + "type": "address" + } + ], + "name": "setContract", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + }, + { + "internalType": "enum ContractResolver.Env", + "name": "", + "type": "uint8" + } + ], + "name": "typeAddresses", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } + ] +} \ No newline at end of file diff --git a/tools/scripts/lit-contracts/Resolver.sol/ResolverData.mjs b/tools/scripts/lit-contracts/Resolver.sol/ResolverData.mjs new file mode 100644 index 0000000000..348fe39ceb --- /dev/null +++ b/tools/scripts/lit-contracts/Resolver.sol/ResolverData.mjs @@ -0,0 +1,596 @@ +export const ResolverData = { + "date": "2023-09-10T22:33:24.000Z", + "address": "0x0bca885Cf322D0E478DC48Fb84b4f522144db9D7", + "contractName": "Resolver", + "abi": [ + { + "inputs": [ + { + "internalType": "enum ContractResolver.Env", + "name": "env", + "type": "uint8" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "AdminRoleRequired", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "enum ContractResolver.Env", + "name": "env", + "type": "uint8" + } + ], + "name": "AllowedEnvAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "enum ContractResolver.Env", + "name": "env", + "type": "uint8" + } + ], + "name": "AllowedEnvRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "typ", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "enum ContractResolver.Env", + "name": "env", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "address", + "name": "addr", + "type": "address" + } + ], + "name": "SetContract", + "type": "event" + }, + { + "inputs": [], + "name": "ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ALLOWLIST_CONTRACT", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "DOMAIN_WALLET_ORACLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "DOMAIN_WALLET_REGISTRY", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "HD_KEY_DERIVER_CONTRACT", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "LIT_TOKEN_CONTRACT", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MULTI_SENDER_CONTRACT", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PKP_HELPER_CONTRACT", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PKP_NFT_CONTRACT", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PKP_NFT_METADATA_CONTRACT", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PKP_PERMISSIONS_CONTRACT", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PUB_KEY_ROUTER_CONTRACT", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "RATE_LIMIT_NFT_CONTRACT", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "RELEASE_REGISTER_CONTRACT", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "STAKING_BALANCES_CONTRACT", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "STAKING_CONTRACT", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "enum ContractResolver.Env", + "name": "env", + "type": "uint8" + } + ], + "name": "addAllowedEnv", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "typ", + "type": "bytes32" + }, + { + "internalType": "enum ContractResolver.Env", + "name": "env", + "type": "uint8" + } + ], + "name": "getContract", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "enum ContractResolver.Env", + "name": "env", + "type": "uint8" + } + ], + "name": "removeAllowedEnv", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "setAdmin", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "typ", + "type": "bytes32" + }, + { + "internalType": "enum ContractResolver.Env", + "name": "env", + "type": "uint8" + }, + { + "internalType": "address", + "name": "addr", + "type": "address" + } + ], + "name": "setContract", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + }, + { + "internalType": "enum ContractResolver.Env", + "name": "", + "type": "uint8" + } + ], + "name": "typeAddresses", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } + ] +} \ No newline at end of file diff --git a/tools/scripts/lit-contracts/Resolver.sol/ResolverData.ts b/tools/scripts/lit-contracts/Resolver.sol/ResolverData.ts new file mode 100644 index 0000000000..348fe39ceb --- /dev/null +++ b/tools/scripts/lit-contracts/Resolver.sol/ResolverData.ts @@ -0,0 +1,596 @@ +export const ResolverData = { + "date": "2023-09-10T22:33:24.000Z", + "address": "0x0bca885Cf322D0E478DC48Fb84b4f522144db9D7", + "contractName": "Resolver", + "abi": [ + { + "inputs": [ + { + "internalType": "enum ContractResolver.Env", + "name": "env", + "type": "uint8" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "AdminRoleRequired", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "enum ContractResolver.Env", + "name": "env", + "type": "uint8" + } + ], + "name": "AllowedEnvAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "enum ContractResolver.Env", + "name": "env", + "type": "uint8" + } + ], + "name": "AllowedEnvRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "typ", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "enum ContractResolver.Env", + "name": "env", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "address", + "name": "addr", + "type": "address" + } + ], + "name": "SetContract", + "type": "event" + }, + { + "inputs": [], + "name": "ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ALLOWLIST_CONTRACT", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "DOMAIN_WALLET_ORACLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "DOMAIN_WALLET_REGISTRY", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "HD_KEY_DERIVER_CONTRACT", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "LIT_TOKEN_CONTRACT", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MULTI_SENDER_CONTRACT", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PKP_HELPER_CONTRACT", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PKP_NFT_CONTRACT", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PKP_NFT_METADATA_CONTRACT", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PKP_PERMISSIONS_CONTRACT", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PUB_KEY_ROUTER_CONTRACT", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "RATE_LIMIT_NFT_CONTRACT", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "RELEASE_REGISTER_CONTRACT", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "STAKING_BALANCES_CONTRACT", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "STAKING_CONTRACT", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "enum ContractResolver.Env", + "name": "env", + "type": "uint8" + } + ], + "name": "addAllowedEnv", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "typ", + "type": "bytes32" + }, + { + "internalType": "enum ContractResolver.Env", + "name": "env", + "type": "uint8" + } + ], + "name": "getContract", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "enum ContractResolver.Env", + "name": "env", + "type": "uint8" + } + ], + "name": "removeAllowedEnv", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "setAdmin", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "typ", + "type": "bytes32" + }, + { + "internalType": "enum ContractResolver.Env", + "name": "env", + "type": "uint8" + }, + { + "internalType": "address", + "name": "addr", + "type": "address" + } + ], + "name": "setContract", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + }, + { + "internalType": "enum ContractResolver.Env", + "name": "", + "type": "uint8" + } + ], + "name": "typeAddresses", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } + ] +} \ No newline at end of file diff --git a/tools/scripts/lit-contracts/Resolver.sol/common.ts b/tools/scripts/lit-contracts/Resolver.sol/common.ts new file mode 100644 index 0000000000..2fc40c7fb1 --- /dev/null +++ b/tools/scripts/lit-contracts/Resolver.sol/common.ts @@ -0,0 +1,44 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { Listener } from "@ethersproject/providers"; +import type { Event, EventFilter } from "ethers"; + +export interface TypedEvent< + TArgsArray extends Array = any, + TArgsObject = any +> extends Event { + args: TArgsArray & TArgsObject; +} + +export interface TypedEventFilter<_TEvent extends TypedEvent> + extends EventFilter {} + +export interface TypedListener { + (...listenerArg: [...__TypechainArgsArray, TEvent]): void; +} + +type __TypechainArgsArray = T extends TypedEvent ? U : never; + +export interface OnEvent { + ( + eventFilter: TypedEventFilter, + listener: TypedListener + ): TRes; + (eventName: string, listener: Listener): TRes; +} + +export type MinEthersFactory = { + deploy(...a: ARGS[]): Promise; +}; + +export type GetContractTypeFromFactory = F extends MinEthersFactory< + infer C, + any +> + ? C + : never; + +export type GetARGsTypeFromFactory = F extends MinEthersFactory + ? Parameters + : never; diff --git a/tools/scripts/lit-contracts/Resolver.sol/factories/Resolver__factory.ts b/tools/scripts/lit-contracts/Resolver.sol/factories/Resolver__factory.ts new file mode 100644 index 0000000000..81f7f380fd --- /dev/null +++ b/tools/scripts/lit-contracts/Resolver.sol/factories/Resolver__factory.ts @@ -0,0 +1,612 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Signer, utils } from "ethers"; +import type { Provider } from "@ethersproject/providers"; +import type { Resolver, ResolverInterface } from "../Resolver"; + +const _abi = [ + { + inputs: [ + { + internalType: "enum ContractResolver.Env", + name: "env", + type: "uint8", + }, + ], + stateMutability: "nonpayable", + type: "constructor", + }, + { + inputs: [], + name: "AdminRoleRequired", + type: "error", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "enum ContractResolver.Env", + name: "env", + type: "uint8", + }, + ], + name: "AllowedEnvAdded", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "enum ContractResolver.Env", + name: "env", + type: "uint8", + }, + ], + name: "AllowedEnvRemoved", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "bytes32", + name: "role", + type: "bytes32", + }, + { + indexed: true, + internalType: "bytes32", + name: "previousAdminRole", + type: "bytes32", + }, + { + indexed: true, + internalType: "bytes32", + name: "newAdminRole", + type: "bytes32", + }, + ], + name: "RoleAdminChanged", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "bytes32", + name: "role", + type: "bytes32", + }, + { + indexed: true, + internalType: "address", + name: "account", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "sender", + type: "address", + }, + ], + name: "RoleGranted", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "bytes32", + name: "role", + type: "bytes32", + }, + { + indexed: true, + internalType: "address", + name: "account", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "sender", + type: "address", + }, + ], + name: "RoleRevoked", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "bytes32", + name: "typ", + type: "bytes32", + }, + { + indexed: false, + internalType: "enum ContractResolver.Env", + name: "env", + type: "uint8", + }, + { + indexed: false, + internalType: "address", + name: "addr", + type: "address", + }, + ], + name: "SetContract", + type: "event", + }, + { + inputs: [], + name: "ADMIN_ROLE", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "ALLOWLIST_CONTRACT", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "DEFAULT_ADMIN_ROLE", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "DOMAIN_WALLET_ORACLE", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "DOMAIN_WALLET_REGISTRY", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "HD_KEY_DERIVER_CONTRACT", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "LIT_TOKEN_CONTRACT", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "MULTI_SENDER_CONTRACT", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "PKP_HELPER_CONTRACT", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "PKP_NFT_CONTRACT", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "PKP_NFT_METADATA_CONTRACT", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "PKP_PERMISSIONS_CONTRACT", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "PUB_KEY_ROUTER_CONTRACT", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "RATE_LIMIT_NFT_CONTRACT", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "RELEASE_REGISTER_CONTRACT", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "STAKING_BALANCES_CONTRACT", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "STAKING_CONTRACT", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "enum ContractResolver.Env", + name: "env", + type: "uint8", + }, + ], + name: "addAllowedEnv", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "typ", + type: "bytes32", + }, + { + internalType: "enum ContractResolver.Env", + name: "env", + type: "uint8", + }, + ], + name: "getContract", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "role", + type: "bytes32", + }, + ], + name: "getRoleAdmin", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "role", + type: "bytes32", + }, + { + internalType: "address", + name: "account", + type: "address", + }, + ], + name: "grantRole", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "role", + type: "bytes32", + }, + { + internalType: "address", + name: "account", + type: "address", + }, + ], + name: "hasRole", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "enum ContractResolver.Env", + name: "env", + type: "uint8", + }, + ], + name: "removeAllowedEnv", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "role", + type: "bytes32", + }, + { + internalType: "address", + name: "account", + type: "address", + }, + ], + name: "renounceRole", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "role", + type: "bytes32", + }, + { + internalType: "address", + name: "account", + type: "address", + }, + ], + name: "revokeRole", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "newAdmin", + type: "address", + }, + ], + name: "setAdmin", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "typ", + type: "bytes32", + }, + { + internalType: "enum ContractResolver.Env", + name: "env", + type: "uint8", + }, + { + internalType: "address", + name: "addr", + type: "address", + }, + ], + name: "setContract", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes4", + name: "interfaceId", + type: "bytes4", + }, + ], + name: "supportsInterface", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + { + internalType: "enum ContractResolver.Env", + name: "", + type: "uint8", + }, + ], + name: "typeAddresses", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, +] as const; + +export class Resolver__factory { + static readonly abi = _abi; + static createInterface(): ResolverInterface { + return new utils.Interface(_abi) as ResolverInterface; + } + static connect( + address: string, + signerOrProvider: Signer | Provider + ): Resolver { + return new Contract(address, _abi, signerOrProvider) as Resolver; + } +} diff --git a/tools/scripts/lit-contracts/Resolver.sol/factories/index.ts b/tools/scripts/lit-contracts/Resolver.sol/factories/index.ts new file mode 100644 index 0000000000..a12c334e41 --- /dev/null +++ b/tools/scripts/lit-contracts/Resolver.sol/factories/index.ts @@ -0,0 +1,4 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export { Resolver__factory } from "./Resolver__factory"; diff --git a/tools/scripts/lit-contracts/Resolver.sol/index.js b/tools/scripts/lit-contracts/Resolver.sol/index.js new file mode 100644 index 0000000000..bc175183b4 --- /dev/null +++ b/tools/scripts/lit-contracts/Resolver.sol/index.js @@ -0,0 +1,2 @@ +export * from "./ResolverData.js"; +export * from "./ResolverContract.js"; \ No newline at end of file diff --git a/tools/scripts/lit-contracts/Resolver.sol/index.mjs b/tools/scripts/lit-contracts/Resolver.sol/index.mjs new file mode 100644 index 0000000000..c8720fba07 --- /dev/null +++ b/tools/scripts/lit-contracts/Resolver.sol/index.mjs @@ -0,0 +1,2 @@ +export * from "./ResolverData.mjs"; +export * from "./ResolverContract.mjs"; \ No newline at end of file diff --git a/tools/scripts/lit-contracts/Resolver.sol/index.ts b/tools/scripts/lit-contracts/Resolver.sol/index.ts new file mode 100644 index 0000000000..43e767a266 --- /dev/null +++ b/tools/scripts/lit-contracts/Resolver.sol/index.ts @@ -0,0 +1,3 @@ +export * from "./ResolverData"; +export * from "./ResolverContract"; +export * from "./Resolver"; \ No newline at end of file diff --git a/tools/scripts/lit-contracts/Staking.sol/Staking.json b/tools/scripts/lit-contracts/Staking.sol/Staking.json new file mode 100644 index 0000000000..f6698be036 --- /dev/null +++ b/tools/scripts/lit-contracts/Staking.sol/Staking.json @@ -0,0 +1,1672 @@ +{ + "date": "2023-09-12T16:59:07.000Z", + "address": "0x07A5bE9e0Aa724563e904B5e7AF37921e193f801", + "contractName": "Staking", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_resolver", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "_keyTypes", + "type": "uint256[]" + }, + { + "internalType": "enum ContractResolver.Env", + "name": "_env", + "type": "uint8" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "ActiveValidatorsCannotLeave", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "stakingAddress", + "type": "address" + } + ], + "name": "CannotRejoinUntilNextEpochBecauseKicked", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "senderPubKey", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "receiverPubKey", + "type": "uint256" + } + ], + "name": "CannotReuseCommsKeys", + "type": "error" + }, + { + "inputs": [], + "name": "CannotStakeZero", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "stakerAddress", + "type": "address" + } + ], + "name": "CannotVoteTwice", + "type": "error" + }, + { + "inputs": [], + "name": "CannotWithdrawZero", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "nodeAddress", + "type": "address" + } + ], + "name": "CouldNotMapNodeAddressToStakerAddress", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "enum Staking.States", + "name": "state", + "type": "uint8" + } + ], + "name": "MustBeInActiveOrUnlockedOrPausedState", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "enum Staking.States", + "name": "state", + "type": "uint8" + } + ], + "name": "MustBeInActiveOrUnlockedState", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "enum Staking.States", + "name": "state", + "type": "uint8" + } + ], + "name": "MustBeInNextValidatorSetLockedOrReadyForNextEpochState", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "enum Staking.States", + "name": "state", + "type": "uint8" + } + ], + "name": "MustBeInNextValidatorSetLockedState", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "enum Staking.States", + "name": "state", + "type": "uint8" + } + ], + "name": "MustBeInReadyForNextEpochState", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "stakerAddress", + "type": "address" + } + ], + "name": "MustBeValidatorInNextEpochToKick", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "currentTimestamp", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "epochEndTime", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "timeout", + "type": "uint256" + } + ], + "name": "NotEnoughTimeElapsedForTimeoutSinceLastEpoch", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "currentTimestamp", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "epochEndTime", + "type": "uint256" + } + ], + "name": "NotEnoughTimeElapsedSinceLastEpoch", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "validatorCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minimumValidatorCount", + "type": "uint256" + } + ], + "name": "NotEnoughValidatorsInNextEpoch", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "currentReadyValidatorCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "nextReadyValidatorCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minimumValidatorCountToBeReady", + "type": "uint256" + } + ], + "name": "NotEnoughValidatorsReadyForNextEpoch", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "currentEpochNumber", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "receivedEpochNumber", + "type": "uint256" + } + ], + "name": "SignaledReadyForWrongEpochNumber", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "stakerAddress", + "type": "address" + } + ], + "name": "StakerNotPermitted", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "yourBalance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "requestedWithdrawlAmount", + "type": "uint256" + } + ], + "name": "TryingToWithdrawMoreThanStaked", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "validator", + "type": "address" + }, + { + "internalType": "address[]", + "name": "validatorsInNextEpoch", + "type": "address[]" + } + ], + "name": "ValidatorIsNotInNextEpoch", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "newTokenRewardPerTokenPerEpoch", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newComplaintTolerance", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newComplaintIntervalSecs", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256[]", + "name": "newKeyTypes", + "type": "uint256[]" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newMinimumValidatorCount", + "type": "uint256" + } + ], + "name": "ConfigSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "newEpochEndTime", + "type": "uint256" + } + ], + "name": "EpochEndTimeSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "newEpochLength", + "type": "uint256" + } + ], + "name": "EpochLengthSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "newEpochTimeout", + "type": "uint256" + } + ], + "name": "EpochTimeoutSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "reason", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newKickPenaltyPercent", + "type": "uint256" + } + ], + "name": "KickPenaltyPercentSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "staker", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "epochNumber", + "type": "uint256" + } + ], + "name": "ReadyForNextEpoch", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Recovered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "staker", + "type": "address" + } + ], + "name": "RequestToJoin", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "staker", + "type": "address" + } + ], + "name": "RequestToLeave", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "newResolverContractAddress", + "type": "address" + } + ], + "name": "ResolverContractAddressSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "newDuration", + "type": "uint256" + } + ], + "name": "RewardsDurationUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "newStakingTokenAddress", + "type": "address" + } + ], + "name": "StakingTokenSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "enum Staking.States", + "name": "newState", + "type": "uint8" + } + ], + "name": "StateChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "staker", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amountBurned", + "type": "uint256" + } + ], + "name": "ValidatorKickedFromNextEpoch", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "staker", + "type": "address" + } + ], + "name": "ValidatorRejoinedNextEpoch", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "reporter", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "validatorStakerAddress", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "reason", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "VotedToKickValidatorInNextEpoch", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "validatorStakerAddress", + "type": "address" + } + ], + "name": "adminKickValidatorInNextEpoch", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "staker", + "type": "address" + } + ], + "name": "adminRejoinValidator", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "validatorStakerAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amountToPenalize", + "type": "uint256" + } + ], + "name": "adminSlashValidator", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "advanceEpoch", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "config", + "outputs": [ + { + "internalType": "uint256", + "name": "tokenRewardPerTokenPerEpoch", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "complaintTolerance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "complaintIntervalSecs", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minimumValidatorCount", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "contractResolver", + "outputs": [ + { + "internalType": "contract ContractResolver", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "countOfCurrentValidatorsReadyForNextEpoch", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "countOfNextValidatorsReadyForNextEpoch", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "currentValidatorCountForConsensus", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "env", + "outputs": [ + { + "internalType": "enum ContractResolver.Env", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "epoch", + "outputs": [ + { + "internalType": "uint256", + "name": "epochLength", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "number", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "endTime", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "retries", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "timeout", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "exit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getKeyTypes", + "outputs": [ + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getKickedValidators", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getReward", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getStakingBalancesAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getTokenAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getValidatorsInCurrentEpoch", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getValidatorsInCurrentEpochLength", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getValidatorsInNextEpoch", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "addresses", + "type": "address[]" + } + ], + "name": "getValidatorsStructs", + "outputs": [ + { + "components": [ + { + "internalType": "uint32", + "name": "ip", + "type": "uint32" + }, + { + "internalType": "uint128", + "name": "ipv6", + "type": "uint128" + }, + { + "internalType": "uint32", + "name": "port", + "type": "uint32" + }, + { + "internalType": "address", + "name": "nodeAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "reward", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "senderPubKey", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "receiverPubKey", + "type": "uint256" + } + ], + "internalType": "struct Staking.Validator[]", + "name": "", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getValidatorsStructsInCurrentEpoch", + "outputs": [ + { + "components": [ + { + "internalType": "uint32", + "name": "ip", + "type": "uint32" + }, + { + "internalType": "uint128", + "name": "ipv6", + "type": "uint128" + }, + { + "internalType": "uint32", + "name": "port", + "type": "uint32" + }, + { + "internalType": "address", + "name": "nodeAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "reward", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "senderPubKey", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "receiverPubKey", + "type": "uint256" + } + ], + "internalType": "struct Staking.Validator[]", + "name": "", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getValidatorsStructsInNextEpoch", + "outputs": [ + { + "components": [ + { + "internalType": "uint32", + "name": "ip", + "type": "uint32" + }, + { + "internalType": "uint128", + "name": "ipv6", + "type": "uint128" + }, + { + "internalType": "uint32", + "name": "port", + "type": "uint32" + }, + { + "internalType": "address", + "name": "nodeAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "reward", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "senderPubKey", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "receiverPubKey", + "type": "uint256" + } + ], + "internalType": "struct Staking.Validator[]", + "name": "", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "epochNumber", + "type": "uint256" + }, + { + "internalType": "address", + "name": "validatorStakerAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "voterStakerAddress", + "type": "address" + } + ], + "name": "getVotingStatusToKickValidator", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "isActiveValidator", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "isActiveValidatorByNodeAddress", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "isReadyForNextEpoch", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "kickPenaltyPercentByReason", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "validatorStakerAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "reason", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "kickValidatorInNextEpoch", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "lockValidatorsForNextEpoch", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "nextValidatorCountForConsensus", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "nodeAddressToStakerAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pauseEpoch", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "readyForNextEpoch", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "ip", + "type": "uint32" + }, + { + "internalType": "uint128", + "name": "ipv6", + "type": "uint128" + }, + { + "internalType": "uint32", + "name": "port", + "type": "uint32" + }, + { + "internalType": "address", + "name": "nodeAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "senderPubKey", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "receiverPubKey", + "type": "uint256" + } + ], + "name": "requestToJoin", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "requestToLeave", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newTokenRewardPerTokenPerEpoch", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "newComplaintTolerance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "newComplaintIntervalSecs", + "type": "uint256" + }, + { + "internalType": "uint256[]", + "name": "newKeyTypes", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "newMinimumValidatorCount", + "type": "uint256" + } + ], + "name": "setConfig", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newResolverAddress", + "type": "address" + } + ], + "name": "setContractResolver", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newEpochEndTime", + "type": "uint256" + } + ], + "name": "setEpochEndTime", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newEpochLength", + "type": "uint256" + } + ], + "name": "setEpochLength", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "enum Staking.States", + "name": "newState", + "type": "uint8" + } + ], + "name": "setEpochState", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newEpochTimeout", + "type": "uint256" + } + ], + "name": "setEpochTimeout", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "ip", + "type": "uint32" + }, + { + "internalType": "uint128", + "name": "ipv6", + "type": "uint128" + }, + { + "internalType": "uint32", + "name": "port", + "type": "uint32" + }, + { + "internalType": "address", + "name": "nodeAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "senderPubKey", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "receiverPubKey", + "type": "uint256" + } + ], + "name": "setIpPortNodeAddressAndCommunicationPubKeys", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "reason", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "newKickPenaltyPercent", + "type": "uint256" + } + ], + "name": "setKickPenaltyPercent", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "stakerAddress", + "type": "address" + } + ], + "name": "shouldKickValidator", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "epochNumber", + "type": "uint256" + } + ], + "name": "signalReadyForNextEpoch", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "stake", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint32", + "name": "ip", + "type": "uint32" + }, + { + "internalType": "uint128", + "name": "ipv6", + "type": "uint128" + }, + { + "internalType": "uint32", + "name": "port", + "type": "uint32" + }, + { + "internalType": "address", + "name": "nodeAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "senderPubKey", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "receiverPubKey", + "type": "uint256" + } + ], + "name": "stakeAndJoin", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "state", + "outputs": [ + { + "internalType": "enum Staking.States", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalStaked", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "unlockValidatorsForNextEpoch", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "usedCommsKeys", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "validators", + "outputs": [ + { + "internalType": "uint32", + "name": "ip", + "type": "uint32" + }, + { + "internalType": "uint128", + "name": "ipv6", + "type": "uint128" + }, + { + "internalType": "uint32", + "name": "port", + "type": "uint32" + }, + { + "internalType": "address", + "name": "nodeAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "reward", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "senderPubKey", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "receiverPubKey", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "votesToKickValidatorsInNextEpoch", + "outputs": [ + { + "internalType": "uint256", + "name": "votes", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "withdraw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ] +} \ No newline at end of file diff --git a/tools/scripts/lit-contracts/Staking.sol/Staking.ts b/tools/scripts/lit-contracts/Staking.sol/Staking.ts new file mode 100644 index 0000000000..f70eb42316 --- /dev/null +++ b/tools/scripts/lit-contracts/Staking.sol/Staking.ts @@ -0,0 +1,2347 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumber, + BigNumberish, + BytesLike, + CallOverrides, + ContractTransaction, + Overrides, + PopulatedTransaction, + Signer, + utils, +} from "ethers"; +import type { + FunctionFragment, + Result, + EventFragment, +} from "@ethersproject/abi"; +import type { Listener, Provider } from "@ethersproject/providers"; +import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, +} from "./common"; + +export declare namespace Staking { + export type ValidatorStruct = { + ip: BigNumberish; + ipv6: BigNumberish; + port: BigNumberish; + nodeAddress: string; + reward: BigNumberish; + senderPubKey: BigNumberish; + receiverPubKey: BigNumberish; + }; + + export type ValidatorStructOutput = [ + number, + BigNumber, + number, + string, + BigNumber, + BigNumber, + BigNumber + ] & { + ip: number; + ipv6: BigNumber; + port: number; + nodeAddress: string; + reward: BigNumber; + senderPubKey: BigNumber; + receiverPubKey: BigNumber; + }; +} + +export interface StakingInterface extends utils.Interface { + functions: { + "adminKickValidatorInNextEpoch(address)": FunctionFragment; + "adminRejoinValidator(address)": FunctionFragment; + "adminSlashValidator(address,uint256)": FunctionFragment; + "advanceEpoch()": FunctionFragment; + "config()": FunctionFragment; + "contractResolver()": FunctionFragment; + "countOfCurrentValidatorsReadyForNextEpoch()": FunctionFragment; + "countOfNextValidatorsReadyForNextEpoch()": FunctionFragment; + "currentValidatorCountForConsensus()": FunctionFragment; + "env()": FunctionFragment; + "epoch()": FunctionFragment; + "exit()": FunctionFragment; + "getKeyTypes()": FunctionFragment; + "getKickedValidators()": FunctionFragment; + "getReward()": FunctionFragment; + "getStakingBalancesAddress()": FunctionFragment; + "getTokenAddress()": FunctionFragment; + "getValidatorsInCurrentEpoch()": FunctionFragment; + "getValidatorsInCurrentEpochLength()": FunctionFragment; + "getValidatorsInNextEpoch()": FunctionFragment; + "getValidatorsStructs(address[])": FunctionFragment; + "getValidatorsStructsInCurrentEpoch()": FunctionFragment; + "getValidatorsStructsInNextEpoch()": FunctionFragment; + "getVotingStatusToKickValidator(uint256,address,address)": FunctionFragment; + "isActiveValidator(address)": FunctionFragment; + "isActiveValidatorByNodeAddress(address)": FunctionFragment; + "isReadyForNextEpoch()": FunctionFragment; + "kickPenaltyPercentByReason(uint256)": FunctionFragment; + "kickValidatorInNextEpoch(address,uint256,bytes)": FunctionFragment; + "lockValidatorsForNextEpoch()": FunctionFragment; + "nextValidatorCountForConsensus()": FunctionFragment; + "nodeAddressToStakerAddress(address)": FunctionFragment; + "owner()": FunctionFragment; + "pauseEpoch()": FunctionFragment; + "readyForNextEpoch(address)": FunctionFragment; + "renounceOwnership()": FunctionFragment; + "requestToJoin(uint32,uint128,uint32,address,uint256,uint256)": FunctionFragment; + "requestToLeave()": FunctionFragment; + "setConfig(uint256,uint256,uint256,uint256[],uint256)": FunctionFragment; + "setContractResolver(address)": FunctionFragment; + "setEpochEndTime(uint256)": FunctionFragment; + "setEpochLength(uint256)": FunctionFragment; + "setEpochState(uint8)": FunctionFragment; + "setEpochTimeout(uint256)": FunctionFragment; + "setIpPortNodeAddressAndCommunicationPubKeys(uint32,uint128,uint32,address,uint256,uint256)": FunctionFragment; + "setKickPenaltyPercent(uint256,uint256)": FunctionFragment; + "shouldKickValidator(address)": FunctionFragment; + "signalReadyForNextEpoch(uint256)": FunctionFragment; + "stake(uint256)": FunctionFragment; + "stakeAndJoin(uint256,uint32,uint128,uint32,address,uint256,uint256)": FunctionFragment; + "state()": FunctionFragment; + "totalStaked()": FunctionFragment; + "transferOwnership(address)": FunctionFragment; + "unlockValidatorsForNextEpoch()": FunctionFragment; + "usedCommsKeys(bytes32)": FunctionFragment; + "validators(address)": FunctionFragment; + "votesToKickValidatorsInNextEpoch(uint256,address)": FunctionFragment; + "withdraw(uint256)": FunctionFragment; + }; + + getFunction( + nameOrSignatureOrTopic: + | "adminKickValidatorInNextEpoch" + | "adminRejoinValidator" + | "adminSlashValidator" + | "advanceEpoch" + | "config" + | "contractResolver" + | "countOfCurrentValidatorsReadyForNextEpoch" + | "countOfNextValidatorsReadyForNextEpoch" + | "currentValidatorCountForConsensus" + | "env" + | "epoch" + | "exit" + | "getKeyTypes" + | "getKickedValidators" + | "getReward" + | "getStakingBalancesAddress" + | "getTokenAddress" + | "getValidatorsInCurrentEpoch" + | "getValidatorsInCurrentEpochLength" + | "getValidatorsInNextEpoch" + | "getValidatorsStructs" + | "getValidatorsStructsInCurrentEpoch" + | "getValidatorsStructsInNextEpoch" + | "getVotingStatusToKickValidator" + | "isActiveValidator" + | "isActiveValidatorByNodeAddress" + | "isReadyForNextEpoch" + | "kickPenaltyPercentByReason" + | "kickValidatorInNextEpoch" + | "lockValidatorsForNextEpoch" + | "nextValidatorCountForConsensus" + | "nodeAddressToStakerAddress" + | "owner" + | "pauseEpoch" + | "readyForNextEpoch" + | "renounceOwnership" + | "requestToJoin" + | "requestToLeave" + | "setConfig" + | "setContractResolver" + | "setEpochEndTime" + | "setEpochLength" + | "setEpochState" + | "setEpochTimeout" + | "setIpPortNodeAddressAndCommunicationPubKeys" + | "setKickPenaltyPercent" + | "shouldKickValidator" + | "signalReadyForNextEpoch" + | "stake" + | "stakeAndJoin" + | "state" + | "totalStaked" + | "transferOwnership" + | "unlockValidatorsForNextEpoch" + | "usedCommsKeys" + | "validators" + | "votesToKickValidatorsInNextEpoch" + | "withdraw" + ): FunctionFragment; + + encodeFunctionData( + functionFragment: "adminKickValidatorInNextEpoch", + values: [string] + ): string; + encodeFunctionData( + functionFragment: "adminRejoinValidator", + values: [string] + ): string; + encodeFunctionData( + functionFragment: "adminSlashValidator", + values: [string, BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "advanceEpoch", + values?: undefined + ): string; + encodeFunctionData(functionFragment: "config", values?: undefined): string; + encodeFunctionData( + functionFragment: "contractResolver", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "countOfCurrentValidatorsReadyForNextEpoch", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "countOfNextValidatorsReadyForNextEpoch", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "currentValidatorCountForConsensus", + values?: undefined + ): string; + encodeFunctionData(functionFragment: "env", values?: undefined): string; + encodeFunctionData(functionFragment: "epoch", values?: undefined): string; + encodeFunctionData(functionFragment: "exit", values?: undefined): string; + encodeFunctionData( + functionFragment: "getKeyTypes", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "getKickedValidators", + values?: undefined + ): string; + encodeFunctionData(functionFragment: "getReward", values?: undefined): string; + encodeFunctionData( + functionFragment: "getStakingBalancesAddress", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "getTokenAddress", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "getValidatorsInCurrentEpoch", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "getValidatorsInCurrentEpochLength", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "getValidatorsInNextEpoch", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "getValidatorsStructs", + values: [string[]] + ): string; + encodeFunctionData( + functionFragment: "getValidatorsStructsInCurrentEpoch", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "getValidatorsStructsInNextEpoch", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "getVotingStatusToKickValidator", + values: [BigNumberish, string, string] + ): string; + encodeFunctionData( + functionFragment: "isActiveValidator", + values: [string] + ): string; + encodeFunctionData( + functionFragment: "isActiveValidatorByNodeAddress", + values: [string] + ): string; + encodeFunctionData( + functionFragment: "isReadyForNextEpoch", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "kickPenaltyPercentByReason", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "kickValidatorInNextEpoch", + values: [string, BigNumberish, BytesLike] + ): string; + encodeFunctionData( + functionFragment: "lockValidatorsForNextEpoch", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "nextValidatorCountForConsensus", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "nodeAddressToStakerAddress", + values: [string] + ): string; + encodeFunctionData(functionFragment: "owner", values?: undefined): string; + encodeFunctionData( + functionFragment: "pauseEpoch", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "readyForNextEpoch", + values: [string] + ): string; + encodeFunctionData( + functionFragment: "renounceOwnership", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "requestToJoin", + values: [ + BigNumberish, + BigNumberish, + BigNumberish, + string, + BigNumberish, + BigNumberish + ] + ): string; + encodeFunctionData( + functionFragment: "requestToLeave", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "setConfig", + values: [ + BigNumberish, + BigNumberish, + BigNumberish, + BigNumberish[], + BigNumberish + ] + ): string; + encodeFunctionData( + functionFragment: "setContractResolver", + values: [string] + ): string; + encodeFunctionData( + functionFragment: "setEpochEndTime", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "setEpochLength", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "setEpochState", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "setEpochTimeout", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "setIpPortNodeAddressAndCommunicationPubKeys", + values: [ + BigNumberish, + BigNumberish, + BigNumberish, + string, + BigNumberish, + BigNumberish + ] + ): string; + encodeFunctionData( + functionFragment: "setKickPenaltyPercent", + values: [BigNumberish, BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "shouldKickValidator", + values: [string] + ): string; + encodeFunctionData( + functionFragment: "signalReadyForNextEpoch", + values: [BigNumberish] + ): string; + encodeFunctionData(functionFragment: "stake", values: [BigNumberish]): string; + encodeFunctionData( + functionFragment: "stakeAndJoin", + values: [ + BigNumberish, + BigNumberish, + BigNumberish, + BigNumberish, + string, + BigNumberish, + BigNumberish + ] + ): string; + encodeFunctionData(functionFragment: "state", values?: undefined): string; + encodeFunctionData( + functionFragment: "totalStaked", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "transferOwnership", + values: [string] + ): string; + encodeFunctionData( + functionFragment: "unlockValidatorsForNextEpoch", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "usedCommsKeys", + values: [BytesLike] + ): string; + encodeFunctionData(functionFragment: "validators", values: [string]): string; + encodeFunctionData( + functionFragment: "votesToKickValidatorsInNextEpoch", + values: [BigNumberish, string] + ): string; + encodeFunctionData( + functionFragment: "withdraw", + values: [BigNumberish] + ): string; + + decodeFunctionResult( + functionFragment: "adminKickValidatorInNextEpoch", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "adminRejoinValidator", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "adminSlashValidator", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "advanceEpoch", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "config", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "contractResolver", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "countOfCurrentValidatorsReadyForNextEpoch", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "countOfNextValidatorsReadyForNextEpoch", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "currentValidatorCountForConsensus", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "env", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "epoch", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "exit", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "getKeyTypes", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getKickedValidators", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "getReward", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "getStakingBalancesAddress", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getTokenAddress", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getValidatorsInCurrentEpoch", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getValidatorsInCurrentEpochLength", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getValidatorsInNextEpoch", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getValidatorsStructs", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getValidatorsStructsInCurrentEpoch", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getValidatorsStructsInNextEpoch", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getVotingStatusToKickValidator", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "isActiveValidator", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "isActiveValidatorByNodeAddress", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "isReadyForNextEpoch", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "kickPenaltyPercentByReason", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "kickValidatorInNextEpoch", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "lockValidatorsForNextEpoch", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "nextValidatorCountForConsensus", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "nodeAddressToStakerAddress", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "owner", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "pauseEpoch", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "readyForNextEpoch", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "renounceOwnership", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "requestToJoin", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "requestToLeave", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "setConfig", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "setContractResolver", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setEpochEndTime", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setEpochLength", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setEpochState", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setEpochTimeout", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setIpPortNodeAddressAndCommunicationPubKeys", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setKickPenaltyPercent", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "shouldKickValidator", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "signalReadyForNextEpoch", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "stake", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "stakeAndJoin", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "state", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "totalStaked", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "transferOwnership", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "unlockValidatorsForNextEpoch", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "usedCommsKeys", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "validators", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "votesToKickValidatorsInNextEpoch", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "withdraw", data: BytesLike): Result; + + events: { + "ConfigSet(uint256,uint256,uint256,uint256[],uint256)": EventFragment; + "EpochEndTimeSet(uint256)": EventFragment; + "EpochLengthSet(uint256)": EventFragment; + "EpochTimeoutSet(uint256)": EventFragment; + "KickPenaltyPercentSet(uint256,uint256)": EventFragment; + "OwnershipTransferred(address,address)": EventFragment; + "ReadyForNextEpoch(address,uint256)": EventFragment; + "Recovered(address,uint256)": EventFragment; + "RequestToJoin(address)": EventFragment; + "RequestToLeave(address)": EventFragment; + "ResolverContractAddressSet(address)": EventFragment; + "RewardsDurationUpdated(uint256)": EventFragment; + "StakingTokenSet(address)": EventFragment; + "StateChanged(uint8)": EventFragment; + "ValidatorKickedFromNextEpoch(address,uint256)": EventFragment; + "ValidatorRejoinedNextEpoch(address)": EventFragment; + "VotedToKickValidatorInNextEpoch(address,address,uint256,bytes)": EventFragment; + }; + + getEvent(nameOrSignatureOrTopic: "ConfigSet"): EventFragment; + getEvent(nameOrSignatureOrTopic: "EpochEndTimeSet"): EventFragment; + getEvent(nameOrSignatureOrTopic: "EpochLengthSet"): EventFragment; + getEvent(nameOrSignatureOrTopic: "EpochTimeoutSet"): EventFragment; + getEvent(nameOrSignatureOrTopic: "KickPenaltyPercentSet"): EventFragment; + getEvent(nameOrSignatureOrTopic: "OwnershipTransferred"): EventFragment; + getEvent(nameOrSignatureOrTopic: "ReadyForNextEpoch"): EventFragment; + getEvent(nameOrSignatureOrTopic: "Recovered"): EventFragment; + getEvent(nameOrSignatureOrTopic: "RequestToJoin"): EventFragment; + getEvent(nameOrSignatureOrTopic: "RequestToLeave"): EventFragment; + getEvent(nameOrSignatureOrTopic: "ResolverContractAddressSet"): EventFragment; + getEvent(nameOrSignatureOrTopic: "RewardsDurationUpdated"): EventFragment; + getEvent(nameOrSignatureOrTopic: "StakingTokenSet"): EventFragment; + getEvent(nameOrSignatureOrTopic: "StateChanged"): EventFragment; + getEvent( + nameOrSignatureOrTopic: "ValidatorKickedFromNextEpoch" + ): EventFragment; + getEvent(nameOrSignatureOrTopic: "ValidatorRejoinedNextEpoch"): EventFragment; + getEvent( + nameOrSignatureOrTopic: "VotedToKickValidatorInNextEpoch" + ): EventFragment; +} + +export interface ConfigSetEventObject { + newTokenRewardPerTokenPerEpoch: BigNumber; + newComplaintTolerance: BigNumber; + newComplaintIntervalSecs: BigNumber; + newKeyTypes: BigNumber[]; + newMinimumValidatorCount: BigNumber; +} +export type ConfigSetEvent = TypedEvent< + [BigNumber, BigNumber, BigNumber, BigNumber[], BigNumber], + ConfigSetEventObject +>; + +export type ConfigSetEventFilter = TypedEventFilter; + +export interface EpochEndTimeSetEventObject { + newEpochEndTime: BigNumber; +} +export type EpochEndTimeSetEvent = TypedEvent< + [BigNumber], + EpochEndTimeSetEventObject +>; + +export type EpochEndTimeSetEventFilter = TypedEventFilter; + +export interface EpochLengthSetEventObject { + newEpochLength: BigNumber; +} +export type EpochLengthSetEvent = TypedEvent< + [BigNumber], + EpochLengthSetEventObject +>; + +export type EpochLengthSetEventFilter = TypedEventFilter; + +export interface EpochTimeoutSetEventObject { + newEpochTimeout: BigNumber; +} +export type EpochTimeoutSetEvent = TypedEvent< + [BigNumber], + EpochTimeoutSetEventObject +>; + +export type EpochTimeoutSetEventFilter = TypedEventFilter; + +export interface KickPenaltyPercentSetEventObject { + reason: BigNumber; + newKickPenaltyPercent: BigNumber; +} +export type KickPenaltyPercentSetEvent = TypedEvent< + [BigNumber, BigNumber], + KickPenaltyPercentSetEventObject +>; + +export type KickPenaltyPercentSetEventFilter = + TypedEventFilter; + +export interface OwnershipTransferredEventObject { + previousOwner: string; + newOwner: string; +} +export type OwnershipTransferredEvent = TypedEvent< + [string, string], + OwnershipTransferredEventObject +>; + +export type OwnershipTransferredEventFilter = + TypedEventFilter; + +export interface ReadyForNextEpochEventObject { + staker: string; + epochNumber: BigNumber; +} +export type ReadyForNextEpochEvent = TypedEvent< + [string, BigNumber], + ReadyForNextEpochEventObject +>; + +export type ReadyForNextEpochEventFilter = + TypedEventFilter; + +export interface RecoveredEventObject { + token: string; + amount: BigNumber; +} +export type RecoveredEvent = TypedEvent< + [string, BigNumber], + RecoveredEventObject +>; + +export type RecoveredEventFilter = TypedEventFilter; + +export interface RequestToJoinEventObject { + staker: string; +} +export type RequestToJoinEvent = TypedEvent<[string], RequestToJoinEventObject>; + +export type RequestToJoinEventFilter = TypedEventFilter; + +export interface RequestToLeaveEventObject { + staker: string; +} +export type RequestToLeaveEvent = TypedEvent< + [string], + RequestToLeaveEventObject +>; + +export type RequestToLeaveEventFilter = TypedEventFilter; + +export interface ResolverContractAddressSetEventObject { + newResolverContractAddress: string; +} +export type ResolverContractAddressSetEvent = TypedEvent< + [string], + ResolverContractAddressSetEventObject +>; + +export type ResolverContractAddressSetEventFilter = + TypedEventFilter; + +export interface RewardsDurationUpdatedEventObject { + newDuration: BigNumber; +} +export type RewardsDurationUpdatedEvent = TypedEvent< + [BigNumber], + RewardsDurationUpdatedEventObject +>; + +export type RewardsDurationUpdatedEventFilter = + TypedEventFilter; + +export interface StakingTokenSetEventObject { + newStakingTokenAddress: string; +} +export type StakingTokenSetEvent = TypedEvent< + [string], + StakingTokenSetEventObject +>; + +export type StakingTokenSetEventFilter = TypedEventFilter; + +export interface StateChangedEventObject { + newState: number; +} +export type StateChangedEvent = TypedEvent<[number], StateChangedEventObject>; + +export type StateChangedEventFilter = TypedEventFilter; + +export interface ValidatorKickedFromNextEpochEventObject { + staker: string; + amountBurned: BigNumber; +} +export type ValidatorKickedFromNextEpochEvent = TypedEvent< + [string, BigNumber], + ValidatorKickedFromNextEpochEventObject +>; + +export type ValidatorKickedFromNextEpochEventFilter = + TypedEventFilter; + +export interface ValidatorRejoinedNextEpochEventObject { + staker: string; +} +export type ValidatorRejoinedNextEpochEvent = TypedEvent< + [string], + ValidatorRejoinedNextEpochEventObject +>; + +export type ValidatorRejoinedNextEpochEventFilter = + TypedEventFilter; + +export interface VotedToKickValidatorInNextEpochEventObject { + reporter: string; + validatorStakerAddress: string; + reason: BigNumber; + data: string; +} +export type VotedToKickValidatorInNextEpochEvent = TypedEvent< + [string, string, BigNumber, string], + VotedToKickValidatorInNextEpochEventObject +>; + +export type VotedToKickValidatorInNextEpochEventFilter = + TypedEventFilter; + +export interface Staking extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: StakingInterface; + + queryFilter( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>; + + listeners( + eventFilter?: TypedEventFilter + ): Array>; + listeners(eventName?: string): Array; + removeAllListeners( + eventFilter: TypedEventFilter + ): this; + removeAllListeners(eventName?: string): this; + off: OnEvent; + on: OnEvent; + once: OnEvent; + removeListener: OnEvent; + + functions: { + adminKickValidatorInNextEpoch( + validatorStakerAddress: string, + overrides?: Overrides & { from?: string } + ): Promise; + + adminRejoinValidator( + staker: string, + overrides?: Overrides & { from?: string } + ): Promise; + + adminSlashValidator( + validatorStakerAddress: string, + amountToPenalize: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + advanceEpoch( + overrides?: Overrides & { from?: string } + ): Promise; + + config( + overrides?: CallOverrides + ): Promise< + [BigNumber, BigNumber, BigNumber, BigNumber] & { + tokenRewardPerTokenPerEpoch: BigNumber; + complaintTolerance: BigNumber; + complaintIntervalSecs: BigNumber; + minimumValidatorCount: BigNumber; + } + >; + + contractResolver(overrides?: CallOverrides): Promise<[string]>; + + countOfCurrentValidatorsReadyForNextEpoch( + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + countOfNextValidatorsReadyForNextEpoch( + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + currentValidatorCountForConsensus( + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + env(overrides?: CallOverrides): Promise<[number]>; + + epoch( + overrides?: CallOverrides + ): Promise< + [BigNumber, BigNumber, BigNumber, BigNumber, BigNumber] & { + epochLength: BigNumber; + number: BigNumber; + endTime: BigNumber; + retries: BigNumber; + timeout: BigNumber; + } + >; + + exit( + overrides?: Overrides & { from?: string } + ): Promise; + + getKeyTypes(overrides?: CallOverrides): Promise<[BigNumber[]]>; + + getKickedValidators(overrides?: CallOverrides): Promise<[string[]]>; + + getReward( + overrides?: Overrides & { from?: string } + ): Promise; + + getStakingBalancesAddress(overrides?: CallOverrides): Promise<[string]>; + + getTokenAddress(overrides?: CallOverrides): Promise<[string]>; + + getValidatorsInCurrentEpoch(overrides?: CallOverrides): Promise<[string[]]>; + + getValidatorsInCurrentEpochLength( + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + getValidatorsInNextEpoch(overrides?: CallOverrides): Promise<[string[]]>; + + getValidatorsStructs( + addresses: string[], + overrides?: CallOverrides + ): Promise<[Staking.ValidatorStructOutput[]]>; + + getValidatorsStructsInCurrentEpoch( + overrides?: CallOverrides + ): Promise<[Staking.ValidatorStructOutput[]]>; + + getValidatorsStructsInNextEpoch( + overrides?: CallOverrides + ): Promise<[Staking.ValidatorStructOutput[]]>; + + getVotingStatusToKickValidator( + epochNumber: BigNumberish, + validatorStakerAddress: string, + voterStakerAddress: string, + overrides?: CallOverrides + ): Promise<[BigNumber, boolean]>; + + isActiveValidator( + account: string, + overrides?: CallOverrides + ): Promise<[boolean]>; + + isActiveValidatorByNodeAddress( + account: string, + overrides?: CallOverrides + ): Promise<[boolean]>; + + isReadyForNextEpoch(overrides?: CallOverrides): Promise<[boolean]>; + + kickPenaltyPercentByReason( + arg0: BigNumberish, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + kickValidatorInNextEpoch( + validatorStakerAddress: string, + reason: BigNumberish, + data: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + + lockValidatorsForNextEpoch( + overrides?: Overrides & { from?: string } + ): Promise; + + nextValidatorCountForConsensus( + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + nodeAddressToStakerAddress( + arg0: string, + overrides?: CallOverrides + ): Promise<[string]>; + + owner(overrides?: CallOverrides): Promise<[string]>; + + pauseEpoch( + overrides?: Overrides & { from?: string } + ): Promise; + + readyForNextEpoch( + arg0: string, + overrides?: CallOverrides + ): Promise<[boolean]>; + + renounceOwnership( + overrides?: Overrides & { from?: string } + ): Promise; + + requestToJoin( + ip: BigNumberish, + ipv6: BigNumberish, + port: BigNumberish, + nodeAddress: string, + senderPubKey: BigNumberish, + receiverPubKey: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + requestToLeave( + overrides?: Overrides & { from?: string } + ): Promise; + + setConfig( + newTokenRewardPerTokenPerEpoch: BigNumberish, + newComplaintTolerance: BigNumberish, + newComplaintIntervalSecs: BigNumberish, + newKeyTypes: BigNumberish[], + newMinimumValidatorCount: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + setContractResolver( + newResolverAddress: string, + overrides?: Overrides & { from?: string } + ): Promise; + + setEpochEndTime( + newEpochEndTime: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + setEpochLength( + newEpochLength: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + setEpochState( + newState: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + setEpochTimeout( + newEpochTimeout: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + setIpPortNodeAddressAndCommunicationPubKeys( + ip: BigNumberish, + ipv6: BigNumberish, + port: BigNumberish, + nodeAddress: string, + senderPubKey: BigNumberish, + receiverPubKey: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + setKickPenaltyPercent( + reason: BigNumberish, + newKickPenaltyPercent: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + shouldKickValidator( + stakerAddress: string, + overrides?: CallOverrides + ): Promise<[boolean]>; + + signalReadyForNextEpoch( + epochNumber: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + stake( + amount: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + stakeAndJoin( + amount: BigNumberish, + ip: BigNumberish, + ipv6: BigNumberish, + port: BigNumberish, + nodeAddress: string, + senderPubKey: BigNumberish, + receiverPubKey: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + state(overrides?: CallOverrides): Promise<[number]>; + + totalStaked(overrides?: CallOverrides): Promise<[BigNumber]>; + + transferOwnership( + newOwner: string, + overrides?: Overrides & { from?: string } + ): Promise; + + unlockValidatorsForNextEpoch( + overrides?: Overrides & { from?: string } + ): Promise; + + usedCommsKeys( + arg0: BytesLike, + overrides?: CallOverrides + ): Promise<[boolean]>; + + validators( + arg0: string, + overrides?: CallOverrides + ): Promise< + [number, BigNumber, number, string, BigNumber, BigNumber, BigNumber] & { + ip: number; + ipv6: BigNumber; + port: number; + nodeAddress: string; + reward: BigNumber; + senderPubKey: BigNumber; + receiverPubKey: BigNumber; + } + >; + + votesToKickValidatorsInNextEpoch( + arg0: BigNumberish, + arg1: string, + overrides?: CallOverrides + ): Promise<[BigNumber] & { votes: BigNumber }>; + + withdraw( + amount: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + }; + + adminKickValidatorInNextEpoch( + validatorStakerAddress: string, + overrides?: Overrides & { from?: string } + ): Promise; + + adminRejoinValidator( + staker: string, + overrides?: Overrides & { from?: string } + ): Promise; + + adminSlashValidator( + validatorStakerAddress: string, + amountToPenalize: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + advanceEpoch( + overrides?: Overrides & { from?: string } + ): Promise; + + config( + overrides?: CallOverrides + ): Promise< + [BigNumber, BigNumber, BigNumber, BigNumber] & { + tokenRewardPerTokenPerEpoch: BigNumber; + complaintTolerance: BigNumber; + complaintIntervalSecs: BigNumber; + minimumValidatorCount: BigNumber; + } + >; + + contractResolver(overrides?: CallOverrides): Promise; + + countOfCurrentValidatorsReadyForNextEpoch( + overrides?: CallOverrides + ): Promise; + + countOfNextValidatorsReadyForNextEpoch( + overrides?: CallOverrides + ): Promise; + + currentValidatorCountForConsensus( + overrides?: CallOverrides + ): Promise; + + env(overrides?: CallOverrides): Promise; + + epoch( + overrides?: CallOverrides + ): Promise< + [BigNumber, BigNumber, BigNumber, BigNumber, BigNumber] & { + epochLength: BigNumber; + number: BigNumber; + endTime: BigNumber; + retries: BigNumber; + timeout: BigNumber; + } + >; + + exit(overrides?: Overrides & { from?: string }): Promise; + + getKeyTypes(overrides?: CallOverrides): Promise; + + getKickedValidators(overrides?: CallOverrides): Promise; + + getReward( + overrides?: Overrides & { from?: string } + ): Promise; + + getStakingBalancesAddress(overrides?: CallOverrides): Promise; + + getTokenAddress(overrides?: CallOverrides): Promise; + + getValidatorsInCurrentEpoch(overrides?: CallOverrides): Promise; + + getValidatorsInCurrentEpochLength( + overrides?: CallOverrides + ): Promise; + + getValidatorsInNextEpoch(overrides?: CallOverrides): Promise; + + getValidatorsStructs( + addresses: string[], + overrides?: CallOverrides + ): Promise; + + getValidatorsStructsInCurrentEpoch( + overrides?: CallOverrides + ): Promise; + + getValidatorsStructsInNextEpoch( + overrides?: CallOverrides + ): Promise; + + getVotingStatusToKickValidator( + epochNumber: BigNumberish, + validatorStakerAddress: string, + voterStakerAddress: string, + overrides?: CallOverrides + ): Promise<[BigNumber, boolean]>; + + isActiveValidator( + account: string, + overrides?: CallOverrides + ): Promise; + + isActiveValidatorByNodeAddress( + account: string, + overrides?: CallOverrides + ): Promise; + + isReadyForNextEpoch(overrides?: CallOverrides): Promise; + + kickPenaltyPercentByReason( + arg0: BigNumberish, + overrides?: CallOverrides + ): Promise; + + kickValidatorInNextEpoch( + validatorStakerAddress: string, + reason: BigNumberish, + data: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + + lockValidatorsForNextEpoch( + overrides?: Overrides & { from?: string } + ): Promise; + + nextValidatorCountForConsensus(overrides?: CallOverrides): Promise; + + nodeAddressToStakerAddress( + arg0: string, + overrides?: CallOverrides + ): Promise; + + owner(overrides?: CallOverrides): Promise; + + pauseEpoch( + overrides?: Overrides & { from?: string } + ): Promise; + + readyForNextEpoch(arg0: string, overrides?: CallOverrides): Promise; + + renounceOwnership( + overrides?: Overrides & { from?: string } + ): Promise; + + requestToJoin( + ip: BigNumberish, + ipv6: BigNumberish, + port: BigNumberish, + nodeAddress: string, + senderPubKey: BigNumberish, + receiverPubKey: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + requestToLeave( + overrides?: Overrides & { from?: string } + ): Promise; + + setConfig( + newTokenRewardPerTokenPerEpoch: BigNumberish, + newComplaintTolerance: BigNumberish, + newComplaintIntervalSecs: BigNumberish, + newKeyTypes: BigNumberish[], + newMinimumValidatorCount: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + setContractResolver( + newResolverAddress: string, + overrides?: Overrides & { from?: string } + ): Promise; + + setEpochEndTime( + newEpochEndTime: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + setEpochLength( + newEpochLength: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + setEpochState( + newState: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + setEpochTimeout( + newEpochTimeout: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + setIpPortNodeAddressAndCommunicationPubKeys( + ip: BigNumberish, + ipv6: BigNumberish, + port: BigNumberish, + nodeAddress: string, + senderPubKey: BigNumberish, + receiverPubKey: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + setKickPenaltyPercent( + reason: BigNumberish, + newKickPenaltyPercent: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + shouldKickValidator( + stakerAddress: string, + overrides?: CallOverrides + ): Promise; + + signalReadyForNextEpoch( + epochNumber: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + stake( + amount: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + stakeAndJoin( + amount: BigNumberish, + ip: BigNumberish, + ipv6: BigNumberish, + port: BigNumberish, + nodeAddress: string, + senderPubKey: BigNumberish, + receiverPubKey: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + state(overrides?: CallOverrides): Promise; + + totalStaked(overrides?: CallOverrides): Promise; + + transferOwnership( + newOwner: string, + overrides?: Overrides & { from?: string } + ): Promise; + + unlockValidatorsForNextEpoch( + overrides?: Overrides & { from?: string } + ): Promise; + + usedCommsKeys(arg0: BytesLike, overrides?: CallOverrides): Promise; + + validators( + arg0: string, + overrides?: CallOverrides + ): Promise< + [number, BigNumber, number, string, BigNumber, BigNumber, BigNumber] & { + ip: number; + ipv6: BigNumber; + port: number; + nodeAddress: string; + reward: BigNumber; + senderPubKey: BigNumber; + receiverPubKey: BigNumber; + } + >; + + votesToKickValidatorsInNextEpoch( + arg0: BigNumberish, + arg1: string, + overrides?: CallOverrides + ): Promise; + + withdraw( + amount: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + callStatic: { + adminKickValidatorInNextEpoch( + validatorStakerAddress: string, + overrides?: CallOverrides + ): Promise; + + adminRejoinValidator( + staker: string, + overrides?: CallOverrides + ): Promise; + + adminSlashValidator( + validatorStakerAddress: string, + amountToPenalize: BigNumberish, + overrides?: CallOverrides + ): Promise; + + advanceEpoch(overrides?: CallOverrides): Promise; + + config( + overrides?: CallOverrides + ): Promise< + [BigNumber, BigNumber, BigNumber, BigNumber] & { + tokenRewardPerTokenPerEpoch: BigNumber; + complaintTolerance: BigNumber; + complaintIntervalSecs: BigNumber; + minimumValidatorCount: BigNumber; + } + >; + + contractResolver(overrides?: CallOverrides): Promise; + + countOfCurrentValidatorsReadyForNextEpoch( + overrides?: CallOverrides + ): Promise; + + countOfNextValidatorsReadyForNextEpoch( + overrides?: CallOverrides + ): Promise; + + currentValidatorCountForConsensus( + overrides?: CallOverrides + ): Promise; + + env(overrides?: CallOverrides): Promise; + + epoch( + overrides?: CallOverrides + ): Promise< + [BigNumber, BigNumber, BigNumber, BigNumber, BigNumber] & { + epochLength: BigNumber; + number: BigNumber; + endTime: BigNumber; + retries: BigNumber; + timeout: BigNumber; + } + >; + + exit(overrides?: CallOverrides): Promise; + + getKeyTypes(overrides?: CallOverrides): Promise; + + getKickedValidators(overrides?: CallOverrides): Promise; + + getReward(overrides?: CallOverrides): Promise; + + getStakingBalancesAddress(overrides?: CallOverrides): Promise; + + getTokenAddress(overrides?: CallOverrides): Promise; + + getValidatorsInCurrentEpoch(overrides?: CallOverrides): Promise; + + getValidatorsInCurrentEpochLength( + overrides?: CallOverrides + ): Promise; + + getValidatorsInNextEpoch(overrides?: CallOverrides): Promise; + + getValidatorsStructs( + addresses: string[], + overrides?: CallOverrides + ): Promise; + + getValidatorsStructsInCurrentEpoch( + overrides?: CallOverrides + ): Promise; + + getValidatorsStructsInNextEpoch( + overrides?: CallOverrides + ): Promise; + + getVotingStatusToKickValidator( + epochNumber: BigNumberish, + validatorStakerAddress: string, + voterStakerAddress: string, + overrides?: CallOverrides + ): Promise<[BigNumber, boolean]>; + + isActiveValidator( + account: string, + overrides?: CallOverrides + ): Promise; + + isActiveValidatorByNodeAddress( + account: string, + overrides?: CallOverrides + ): Promise; + + isReadyForNextEpoch(overrides?: CallOverrides): Promise; + + kickPenaltyPercentByReason( + arg0: BigNumberish, + overrides?: CallOverrides + ): Promise; + + kickValidatorInNextEpoch( + validatorStakerAddress: string, + reason: BigNumberish, + data: BytesLike, + overrides?: CallOverrides + ): Promise; + + lockValidatorsForNextEpoch(overrides?: CallOverrides): Promise; + + nextValidatorCountForConsensus( + overrides?: CallOverrides + ): Promise; + + nodeAddressToStakerAddress( + arg0: string, + overrides?: CallOverrides + ): Promise; + + owner(overrides?: CallOverrides): Promise; + + pauseEpoch(overrides?: CallOverrides): Promise; + + readyForNextEpoch( + arg0: string, + overrides?: CallOverrides + ): Promise; + + renounceOwnership(overrides?: CallOverrides): Promise; + + requestToJoin( + ip: BigNumberish, + ipv6: BigNumberish, + port: BigNumberish, + nodeAddress: string, + senderPubKey: BigNumberish, + receiverPubKey: BigNumberish, + overrides?: CallOverrides + ): Promise; + + requestToLeave(overrides?: CallOverrides): Promise; + + setConfig( + newTokenRewardPerTokenPerEpoch: BigNumberish, + newComplaintTolerance: BigNumberish, + newComplaintIntervalSecs: BigNumberish, + newKeyTypes: BigNumberish[], + newMinimumValidatorCount: BigNumberish, + overrides?: CallOverrides + ): Promise; + + setContractResolver( + newResolverAddress: string, + overrides?: CallOverrides + ): Promise; + + setEpochEndTime( + newEpochEndTime: BigNumberish, + overrides?: CallOverrides + ): Promise; + + setEpochLength( + newEpochLength: BigNumberish, + overrides?: CallOverrides + ): Promise; + + setEpochState( + newState: BigNumberish, + overrides?: CallOverrides + ): Promise; + + setEpochTimeout( + newEpochTimeout: BigNumberish, + overrides?: CallOverrides + ): Promise; + + setIpPortNodeAddressAndCommunicationPubKeys( + ip: BigNumberish, + ipv6: BigNumberish, + port: BigNumberish, + nodeAddress: string, + senderPubKey: BigNumberish, + receiverPubKey: BigNumberish, + overrides?: CallOverrides + ): Promise; + + setKickPenaltyPercent( + reason: BigNumberish, + newKickPenaltyPercent: BigNumberish, + overrides?: CallOverrides + ): Promise; + + shouldKickValidator( + stakerAddress: string, + overrides?: CallOverrides + ): Promise; + + signalReadyForNextEpoch( + epochNumber: BigNumberish, + overrides?: CallOverrides + ): Promise; + + stake(amount: BigNumberish, overrides?: CallOverrides): Promise; + + stakeAndJoin( + amount: BigNumberish, + ip: BigNumberish, + ipv6: BigNumberish, + port: BigNumberish, + nodeAddress: string, + senderPubKey: BigNumberish, + receiverPubKey: BigNumberish, + overrides?: CallOverrides + ): Promise; + + state(overrides?: CallOverrides): Promise; + + totalStaked(overrides?: CallOverrides): Promise; + + transferOwnership( + newOwner: string, + overrides?: CallOverrides + ): Promise; + + unlockValidatorsForNextEpoch(overrides?: CallOverrides): Promise; + + usedCommsKeys(arg0: BytesLike, overrides?: CallOverrides): Promise; + + validators( + arg0: string, + overrides?: CallOverrides + ): Promise< + [number, BigNumber, number, string, BigNumber, BigNumber, BigNumber] & { + ip: number; + ipv6: BigNumber; + port: number; + nodeAddress: string; + reward: BigNumber; + senderPubKey: BigNumber; + receiverPubKey: BigNumber; + } + >; + + votesToKickValidatorsInNextEpoch( + arg0: BigNumberish, + arg1: string, + overrides?: CallOverrides + ): Promise; + + withdraw(amount: BigNumberish, overrides?: CallOverrides): Promise; + }; + + filters: { + "ConfigSet(uint256,uint256,uint256,uint256[],uint256)"( + newTokenRewardPerTokenPerEpoch?: null, + newComplaintTolerance?: null, + newComplaintIntervalSecs?: null, + newKeyTypes?: null, + newMinimumValidatorCount?: null + ): ConfigSetEventFilter; + ConfigSet( + newTokenRewardPerTokenPerEpoch?: null, + newComplaintTolerance?: null, + newComplaintIntervalSecs?: null, + newKeyTypes?: null, + newMinimumValidatorCount?: null + ): ConfigSetEventFilter; + + "EpochEndTimeSet(uint256)"( + newEpochEndTime?: null + ): EpochEndTimeSetEventFilter; + EpochEndTimeSet(newEpochEndTime?: null): EpochEndTimeSetEventFilter; + + "EpochLengthSet(uint256)"(newEpochLength?: null): EpochLengthSetEventFilter; + EpochLengthSet(newEpochLength?: null): EpochLengthSetEventFilter; + + "EpochTimeoutSet(uint256)"( + newEpochTimeout?: null + ): EpochTimeoutSetEventFilter; + EpochTimeoutSet(newEpochTimeout?: null): EpochTimeoutSetEventFilter; + + "KickPenaltyPercentSet(uint256,uint256)"( + reason?: null, + newKickPenaltyPercent?: null + ): KickPenaltyPercentSetEventFilter; + KickPenaltyPercentSet( + reason?: null, + newKickPenaltyPercent?: null + ): KickPenaltyPercentSetEventFilter; + + "OwnershipTransferred(address,address)"( + previousOwner?: string | null, + newOwner?: string | null + ): OwnershipTransferredEventFilter; + OwnershipTransferred( + previousOwner?: string | null, + newOwner?: string | null + ): OwnershipTransferredEventFilter; + + "ReadyForNextEpoch(address,uint256)"( + staker?: string | null, + epochNumber?: null + ): ReadyForNextEpochEventFilter; + ReadyForNextEpoch( + staker?: string | null, + epochNumber?: null + ): ReadyForNextEpochEventFilter; + + "Recovered(address,uint256)"( + token?: null, + amount?: null + ): RecoveredEventFilter; + Recovered(token?: null, amount?: null): RecoveredEventFilter; + + "RequestToJoin(address)"(staker?: string | null): RequestToJoinEventFilter; + RequestToJoin(staker?: string | null): RequestToJoinEventFilter; + + "RequestToLeave(address)"( + staker?: string | null + ): RequestToLeaveEventFilter; + RequestToLeave(staker?: string | null): RequestToLeaveEventFilter; + + "ResolverContractAddressSet(address)"( + newResolverContractAddress?: null + ): ResolverContractAddressSetEventFilter; + ResolverContractAddressSet( + newResolverContractAddress?: null + ): ResolverContractAddressSetEventFilter; + + "RewardsDurationUpdated(uint256)"( + newDuration?: null + ): RewardsDurationUpdatedEventFilter; + RewardsDurationUpdated( + newDuration?: null + ): RewardsDurationUpdatedEventFilter; + + "StakingTokenSet(address)"( + newStakingTokenAddress?: null + ): StakingTokenSetEventFilter; + StakingTokenSet(newStakingTokenAddress?: null): StakingTokenSetEventFilter; + + "StateChanged(uint8)"(newState?: null): StateChangedEventFilter; + StateChanged(newState?: null): StateChangedEventFilter; + + "ValidatorKickedFromNextEpoch(address,uint256)"( + staker?: string | null, + amountBurned?: null + ): ValidatorKickedFromNextEpochEventFilter; + ValidatorKickedFromNextEpoch( + staker?: string | null, + amountBurned?: null + ): ValidatorKickedFromNextEpochEventFilter; + + "ValidatorRejoinedNextEpoch(address)"( + staker?: null + ): ValidatorRejoinedNextEpochEventFilter; + ValidatorRejoinedNextEpoch( + staker?: null + ): ValidatorRejoinedNextEpochEventFilter; + + "VotedToKickValidatorInNextEpoch(address,address,uint256,bytes)"( + reporter?: string | null, + validatorStakerAddress?: string | null, + reason?: BigNumberish | null, + data?: null + ): VotedToKickValidatorInNextEpochEventFilter; + VotedToKickValidatorInNextEpoch( + reporter?: string | null, + validatorStakerAddress?: string | null, + reason?: BigNumberish | null, + data?: null + ): VotedToKickValidatorInNextEpochEventFilter; + }; + + estimateGas: { + adminKickValidatorInNextEpoch( + validatorStakerAddress: string, + overrides?: Overrides & { from?: string } + ): Promise; + + adminRejoinValidator( + staker: string, + overrides?: Overrides & { from?: string } + ): Promise; + + adminSlashValidator( + validatorStakerAddress: string, + amountToPenalize: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + advanceEpoch(overrides?: Overrides & { from?: string }): Promise; + + config(overrides?: CallOverrides): Promise; + + contractResolver(overrides?: CallOverrides): Promise; + + countOfCurrentValidatorsReadyForNextEpoch( + overrides?: CallOverrides + ): Promise; + + countOfNextValidatorsReadyForNextEpoch( + overrides?: CallOverrides + ): Promise; + + currentValidatorCountForConsensus( + overrides?: CallOverrides + ): Promise; + + env(overrides?: CallOverrides): Promise; + + epoch(overrides?: CallOverrides): Promise; + + exit(overrides?: Overrides & { from?: string }): Promise; + + getKeyTypes(overrides?: CallOverrides): Promise; + + getKickedValidators(overrides?: CallOverrides): Promise; + + getReward(overrides?: Overrides & { from?: string }): Promise; + + getStakingBalancesAddress(overrides?: CallOverrides): Promise; + + getTokenAddress(overrides?: CallOverrides): Promise; + + getValidatorsInCurrentEpoch(overrides?: CallOverrides): Promise; + + getValidatorsInCurrentEpochLength( + overrides?: CallOverrides + ): Promise; + + getValidatorsInNextEpoch(overrides?: CallOverrides): Promise; + + getValidatorsStructs( + addresses: string[], + overrides?: CallOverrides + ): Promise; + + getValidatorsStructsInCurrentEpoch( + overrides?: CallOverrides + ): Promise; + + getValidatorsStructsInNextEpoch( + overrides?: CallOverrides + ): Promise; + + getVotingStatusToKickValidator( + epochNumber: BigNumberish, + validatorStakerAddress: string, + voterStakerAddress: string, + overrides?: CallOverrides + ): Promise; + + isActiveValidator( + account: string, + overrides?: CallOverrides + ): Promise; + + isActiveValidatorByNodeAddress( + account: string, + overrides?: CallOverrides + ): Promise; + + isReadyForNextEpoch(overrides?: CallOverrides): Promise; + + kickPenaltyPercentByReason( + arg0: BigNumberish, + overrides?: CallOverrides + ): Promise; + + kickValidatorInNextEpoch( + validatorStakerAddress: string, + reason: BigNumberish, + data: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + + lockValidatorsForNextEpoch( + overrides?: Overrides & { from?: string } + ): Promise; + + nextValidatorCountForConsensus( + overrides?: CallOverrides + ): Promise; + + nodeAddressToStakerAddress( + arg0: string, + overrides?: CallOverrides + ): Promise; + + owner(overrides?: CallOverrides): Promise; + + pauseEpoch(overrides?: Overrides & { from?: string }): Promise; + + readyForNextEpoch( + arg0: string, + overrides?: CallOverrides + ): Promise; + + renounceOwnership( + overrides?: Overrides & { from?: string } + ): Promise; + + requestToJoin( + ip: BigNumberish, + ipv6: BigNumberish, + port: BigNumberish, + nodeAddress: string, + senderPubKey: BigNumberish, + receiverPubKey: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + requestToLeave( + overrides?: Overrides & { from?: string } + ): Promise; + + setConfig( + newTokenRewardPerTokenPerEpoch: BigNumberish, + newComplaintTolerance: BigNumberish, + newComplaintIntervalSecs: BigNumberish, + newKeyTypes: BigNumberish[], + newMinimumValidatorCount: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + setContractResolver( + newResolverAddress: string, + overrides?: Overrides & { from?: string } + ): Promise; + + setEpochEndTime( + newEpochEndTime: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + setEpochLength( + newEpochLength: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + setEpochState( + newState: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + setEpochTimeout( + newEpochTimeout: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + setIpPortNodeAddressAndCommunicationPubKeys( + ip: BigNumberish, + ipv6: BigNumberish, + port: BigNumberish, + nodeAddress: string, + senderPubKey: BigNumberish, + receiverPubKey: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + setKickPenaltyPercent( + reason: BigNumberish, + newKickPenaltyPercent: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + shouldKickValidator( + stakerAddress: string, + overrides?: CallOverrides + ): Promise; + + signalReadyForNextEpoch( + epochNumber: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + stake( + amount: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + stakeAndJoin( + amount: BigNumberish, + ip: BigNumberish, + ipv6: BigNumberish, + port: BigNumberish, + nodeAddress: string, + senderPubKey: BigNumberish, + receiverPubKey: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + state(overrides?: CallOverrides): Promise; + + totalStaked(overrides?: CallOverrides): Promise; + + transferOwnership( + newOwner: string, + overrides?: Overrides & { from?: string } + ): Promise; + + unlockValidatorsForNextEpoch( + overrides?: Overrides & { from?: string } + ): Promise; + + usedCommsKeys( + arg0: BytesLike, + overrides?: CallOverrides + ): Promise; + + validators(arg0: string, overrides?: CallOverrides): Promise; + + votesToKickValidatorsInNextEpoch( + arg0: BigNumberish, + arg1: string, + overrides?: CallOverrides + ): Promise; + + withdraw( + amount: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + }; + + populateTransaction: { + adminKickValidatorInNextEpoch( + validatorStakerAddress: string, + overrides?: Overrides & { from?: string } + ): Promise; + + adminRejoinValidator( + staker: string, + overrides?: Overrides & { from?: string } + ): Promise; + + adminSlashValidator( + validatorStakerAddress: string, + amountToPenalize: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + advanceEpoch( + overrides?: Overrides & { from?: string } + ): Promise; + + config(overrides?: CallOverrides): Promise; + + contractResolver(overrides?: CallOverrides): Promise; + + countOfCurrentValidatorsReadyForNextEpoch( + overrides?: CallOverrides + ): Promise; + + countOfNextValidatorsReadyForNextEpoch( + overrides?: CallOverrides + ): Promise; + + currentValidatorCountForConsensus( + overrides?: CallOverrides + ): Promise; + + env(overrides?: CallOverrides): Promise; + + epoch(overrides?: CallOverrides): Promise; + + exit( + overrides?: Overrides & { from?: string } + ): Promise; + + getKeyTypes(overrides?: CallOverrides): Promise; + + getKickedValidators( + overrides?: CallOverrides + ): Promise; + + getReward( + overrides?: Overrides & { from?: string } + ): Promise; + + getStakingBalancesAddress( + overrides?: CallOverrides + ): Promise; + + getTokenAddress(overrides?: CallOverrides): Promise; + + getValidatorsInCurrentEpoch( + overrides?: CallOverrides + ): Promise; + + getValidatorsInCurrentEpochLength( + overrides?: CallOverrides + ): Promise; + + getValidatorsInNextEpoch( + overrides?: CallOverrides + ): Promise; + + getValidatorsStructs( + addresses: string[], + overrides?: CallOverrides + ): Promise; + + getValidatorsStructsInCurrentEpoch( + overrides?: CallOverrides + ): Promise; + + getValidatorsStructsInNextEpoch( + overrides?: CallOverrides + ): Promise; + + getVotingStatusToKickValidator( + epochNumber: BigNumberish, + validatorStakerAddress: string, + voterStakerAddress: string, + overrides?: CallOverrides + ): Promise; + + isActiveValidator( + account: string, + overrides?: CallOverrides + ): Promise; + + isActiveValidatorByNodeAddress( + account: string, + overrides?: CallOverrides + ): Promise; + + isReadyForNextEpoch( + overrides?: CallOverrides + ): Promise; + + kickPenaltyPercentByReason( + arg0: BigNumberish, + overrides?: CallOverrides + ): Promise; + + kickValidatorInNextEpoch( + validatorStakerAddress: string, + reason: BigNumberish, + data: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + + lockValidatorsForNextEpoch( + overrides?: Overrides & { from?: string } + ): Promise; + + nextValidatorCountForConsensus( + overrides?: CallOverrides + ): Promise; + + nodeAddressToStakerAddress( + arg0: string, + overrides?: CallOverrides + ): Promise; + + owner(overrides?: CallOverrides): Promise; + + pauseEpoch( + overrides?: Overrides & { from?: string } + ): Promise; + + readyForNextEpoch( + arg0: string, + overrides?: CallOverrides + ): Promise; + + renounceOwnership( + overrides?: Overrides & { from?: string } + ): Promise; + + requestToJoin( + ip: BigNumberish, + ipv6: BigNumberish, + port: BigNumberish, + nodeAddress: string, + senderPubKey: BigNumberish, + receiverPubKey: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + requestToLeave( + overrides?: Overrides & { from?: string } + ): Promise; + + setConfig( + newTokenRewardPerTokenPerEpoch: BigNumberish, + newComplaintTolerance: BigNumberish, + newComplaintIntervalSecs: BigNumberish, + newKeyTypes: BigNumberish[], + newMinimumValidatorCount: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + setContractResolver( + newResolverAddress: string, + overrides?: Overrides & { from?: string } + ): Promise; + + setEpochEndTime( + newEpochEndTime: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + setEpochLength( + newEpochLength: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + setEpochState( + newState: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + setEpochTimeout( + newEpochTimeout: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + setIpPortNodeAddressAndCommunicationPubKeys( + ip: BigNumberish, + ipv6: BigNumberish, + port: BigNumberish, + nodeAddress: string, + senderPubKey: BigNumberish, + receiverPubKey: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + setKickPenaltyPercent( + reason: BigNumberish, + newKickPenaltyPercent: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + shouldKickValidator( + stakerAddress: string, + overrides?: CallOverrides + ): Promise; + + signalReadyForNextEpoch( + epochNumber: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + stake( + amount: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + stakeAndJoin( + amount: BigNumberish, + ip: BigNumberish, + ipv6: BigNumberish, + port: BigNumberish, + nodeAddress: string, + senderPubKey: BigNumberish, + receiverPubKey: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + state(overrides?: CallOverrides): Promise; + + totalStaked(overrides?: CallOverrides): Promise; + + transferOwnership( + newOwner: string, + overrides?: Overrides & { from?: string } + ): Promise; + + unlockValidatorsForNextEpoch( + overrides?: Overrides & { from?: string } + ): Promise; + + usedCommsKeys( + arg0: BytesLike, + overrides?: CallOverrides + ): Promise; + + validators( + arg0: string, + overrides?: CallOverrides + ): Promise; + + votesToKickValidatorsInNextEpoch( + arg0: BigNumberish, + arg1: string, + overrides?: CallOverrides + ): Promise; + + withdraw( + amount: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + }; +} diff --git a/tools/scripts/lit-contracts/Staking.sol/StakingContract.js b/tools/scripts/lit-contracts/Staking.sol/StakingContract.js new file mode 100644 index 0000000000..b4d797dd6d --- /dev/null +++ b/tools/scripts/lit-contracts/Staking.sol/StakingContract.js @@ -0,0 +1,8 @@ +import { ethers } from "ethers"; +import { StakingData } from "./StakingData.js"; + +export const getStakingContract = (provider) => new ethers.Contract( + StakingData.address, + StakingData.abi, + provider +); \ No newline at end of file diff --git a/tools/scripts/lit-contracts/Staking.sol/StakingContract.mjs b/tools/scripts/lit-contracts/Staking.sol/StakingContract.mjs new file mode 100644 index 0000000000..0986ebdf87 --- /dev/null +++ b/tools/scripts/lit-contracts/Staking.sol/StakingContract.mjs @@ -0,0 +1,8 @@ +import { ethers } from "ethers"; +import { StakingData } from "./StakingData.mjs"; + +export const getStakingContract = (provider) => new ethers.Contract( + StakingData.address, + StakingData.abi, + provider +); \ No newline at end of file diff --git a/tools/scripts/lit-contracts/Staking.sol/StakingContract.ts b/tools/scripts/lit-contracts/Staking.sol/StakingContract.ts new file mode 100644 index 0000000000..cedd4e710a --- /dev/null +++ b/tools/scripts/lit-contracts/Staking.sol/StakingContract.ts @@ -0,0 +1,11 @@ +import { ethers } from "ethers"; +import { StakingData } from "./StakingData"; +import { Staking } from "./Staking"; + +export const getStakingContract = (provider: any) => { + return new ethers.Contract( + StakingData.address, + StakingData.abi, + provider + ) as unknown as Staking; +} \ No newline at end of file diff --git a/tools/scripts/lit-contracts/Staking.sol/StakingData.js b/tools/scripts/lit-contracts/Staking.sol/StakingData.js new file mode 100644 index 0000000000..fb2b5dcd4b --- /dev/null +++ b/tools/scripts/lit-contracts/Staking.sol/StakingData.js @@ -0,0 +1,1672 @@ +export const StakingData = { + "date": "2023-09-12T16:59:07.000Z", + "address": "0x07A5bE9e0Aa724563e904B5e7AF37921e193f801", + "contractName": "Staking", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_resolver", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "_keyTypes", + "type": "uint256[]" + }, + { + "internalType": "enum ContractResolver.Env", + "name": "_env", + "type": "uint8" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "ActiveValidatorsCannotLeave", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "stakingAddress", + "type": "address" + } + ], + "name": "CannotRejoinUntilNextEpochBecauseKicked", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "senderPubKey", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "receiverPubKey", + "type": "uint256" + } + ], + "name": "CannotReuseCommsKeys", + "type": "error" + }, + { + "inputs": [], + "name": "CannotStakeZero", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "stakerAddress", + "type": "address" + } + ], + "name": "CannotVoteTwice", + "type": "error" + }, + { + "inputs": [], + "name": "CannotWithdrawZero", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "nodeAddress", + "type": "address" + } + ], + "name": "CouldNotMapNodeAddressToStakerAddress", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "enum Staking.States", + "name": "state", + "type": "uint8" + } + ], + "name": "MustBeInActiveOrUnlockedOrPausedState", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "enum Staking.States", + "name": "state", + "type": "uint8" + } + ], + "name": "MustBeInActiveOrUnlockedState", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "enum Staking.States", + "name": "state", + "type": "uint8" + } + ], + "name": "MustBeInNextValidatorSetLockedOrReadyForNextEpochState", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "enum Staking.States", + "name": "state", + "type": "uint8" + } + ], + "name": "MustBeInNextValidatorSetLockedState", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "enum Staking.States", + "name": "state", + "type": "uint8" + } + ], + "name": "MustBeInReadyForNextEpochState", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "stakerAddress", + "type": "address" + } + ], + "name": "MustBeValidatorInNextEpochToKick", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "currentTimestamp", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "epochEndTime", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "timeout", + "type": "uint256" + } + ], + "name": "NotEnoughTimeElapsedForTimeoutSinceLastEpoch", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "currentTimestamp", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "epochEndTime", + "type": "uint256" + } + ], + "name": "NotEnoughTimeElapsedSinceLastEpoch", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "validatorCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minimumValidatorCount", + "type": "uint256" + } + ], + "name": "NotEnoughValidatorsInNextEpoch", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "currentReadyValidatorCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "nextReadyValidatorCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minimumValidatorCountToBeReady", + "type": "uint256" + } + ], + "name": "NotEnoughValidatorsReadyForNextEpoch", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "currentEpochNumber", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "receivedEpochNumber", + "type": "uint256" + } + ], + "name": "SignaledReadyForWrongEpochNumber", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "stakerAddress", + "type": "address" + } + ], + "name": "StakerNotPermitted", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "yourBalance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "requestedWithdrawlAmount", + "type": "uint256" + } + ], + "name": "TryingToWithdrawMoreThanStaked", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "validator", + "type": "address" + }, + { + "internalType": "address[]", + "name": "validatorsInNextEpoch", + "type": "address[]" + } + ], + "name": "ValidatorIsNotInNextEpoch", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "newTokenRewardPerTokenPerEpoch", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newComplaintTolerance", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newComplaintIntervalSecs", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256[]", + "name": "newKeyTypes", + "type": "uint256[]" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newMinimumValidatorCount", + "type": "uint256" + } + ], + "name": "ConfigSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "newEpochEndTime", + "type": "uint256" + } + ], + "name": "EpochEndTimeSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "newEpochLength", + "type": "uint256" + } + ], + "name": "EpochLengthSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "newEpochTimeout", + "type": "uint256" + } + ], + "name": "EpochTimeoutSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "reason", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newKickPenaltyPercent", + "type": "uint256" + } + ], + "name": "KickPenaltyPercentSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "staker", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "epochNumber", + "type": "uint256" + } + ], + "name": "ReadyForNextEpoch", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Recovered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "staker", + "type": "address" + } + ], + "name": "RequestToJoin", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "staker", + "type": "address" + } + ], + "name": "RequestToLeave", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "newResolverContractAddress", + "type": "address" + } + ], + "name": "ResolverContractAddressSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "newDuration", + "type": "uint256" + } + ], + "name": "RewardsDurationUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "newStakingTokenAddress", + "type": "address" + } + ], + "name": "StakingTokenSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "enum Staking.States", + "name": "newState", + "type": "uint8" + } + ], + "name": "StateChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "staker", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amountBurned", + "type": "uint256" + } + ], + "name": "ValidatorKickedFromNextEpoch", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "staker", + "type": "address" + } + ], + "name": "ValidatorRejoinedNextEpoch", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "reporter", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "validatorStakerAddress", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "reason", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "VotedToKickValidatorInNextEpoch", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "validatorStakerAddress", + "type": "address" + } + ], + "name": "adminKickValidatorInNextEpoch", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "staker", + "type": "address" + } + ], + "name": "adminRejoinValidator", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "validatorStakerAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amountToPenalize", + "type": "uint256" + } + ], + "name": "adminSlashValidator", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "advanceEpoch", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "config", + "outputs": [ + { + "internalType": "uint256", + "name": "tokenRewardPerTokenPerEpoch", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "complaintTolerance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "complaintIntervalSecs", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minimumValidatorCount", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "contractResolver", + "outputs": [ + { + "internalType": "contract ContractResolver", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "countOfCurrentValidatorsReadyForNextEpoch", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "countOfNextValidatorsReadyForNextEpoch", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "currentValidatorCountForConsensus", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "env", + "outputs": [ + { + "internalType": "enum ContractResolver.Env", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "epoch", + "outputs": [ + { + "internalType": "uint256", + "name": "epochLength", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "number", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "endTime", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "retries", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "timeout", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "exit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getKeyTypes", + "outputs": [ + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getKickedValidators", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getReward", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getStakingBalancesAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getTokenAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getValidatorsInCurrentEpoch", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getValidatorsInCurrentEpochLength", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getValidatorsInNextEpoch", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "addresses", + "type": "address[]" + } + ], + "name": "getValidatorsStructs", + "outputs": [ + { + "components": [ + { + "internalType": "uint32", + "name": "ip", + "type": "uint32" + }, + { + "internalType": "uint128", + "name": "ipv6", + "type": "uint128" + }, + { + "internalType": "uint32", + "name": "port", + "type": "uint32" + }, + { + "internalType": "address", + "name": "nodeAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "reward", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "senderPubKey", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "receiverPubKey", + "type": "uint256" + } + ], + "internalType": "struct Staking.Validator[]", + "name": "", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getValidatorsStructsInCurrentEpoch", + "outputs": [ + { + "components": [ + { + "internalType": "uint32", + "name": "ip", + "type": "uint32" + }, + { + "internalType": "uint128", + "name": "ipv6", + "type": "uint128" + }, + { + "internalType": "uint32", + "name": "port", + "type": "uint32" + }, + { + "internalType": "address", + "name": "nodeAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "reward", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "senderPubKey", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "receiverPubKey", + "type": "uint256" + } + ], + "internalType": "struct Staking.Validator[]", + "name": "", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getValidatorsStructsInNextEpoch", + "outputs": [ + { + "components": [ + { + "internalType": "uint32", + "name": "ip", + "type": "uint32" + }, + { + "internalType": "uint128", + "name": "ipv6", + "type": "uint128" + }, + { + "internalType": "uint32", + "name": "port", + "type": "uint32" + }, + { + "internalType": "address", + "name": "nodeAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "reward", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "senderPubKey", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "receiverPubKey", + "type": "uint256" + } + ], + "internalType": "struct Staking.Validator[]", + "name": "", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "epochNumber", + "type": "uint256" + }, + { + "internalType": "address", + "name": "validatorStakerAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "voterStakerAddress", + "type": "address" + } + ], + "name": "getVotingStatusToKickValidator", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "isActiveValidator", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "isActiveValidatorByNodeAddress", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "isReadyForNextEpoch", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "kickPenaltyPercentByReason", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "validatorStakerAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "reason", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "kickValidatorInNextEpoch", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "lockValidatorsForNextEpoch", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "nextValidatorCountForConsensus", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "nodeAddressToStakerAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pauseEpoch", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "readyForNextEpoch", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "ip", + "type": "uint32" + }, + { + "internalType": "uint128", + "name": "ipv6", + "type": "uint128" + }, + { + "internalType": "uint32", + "name": "port", + "type": "uint32" + }, + { + "internalType": "address", + "name": "nodeAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "senderPubKey", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "receiverPubKey", + "type": "uint256" + } + ], + "name": "requestToJoin", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "requestToLeave", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newTokenRewardPerTokenPerEpoch", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "newComplaintTolerance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "newComplaintIntervalSecs", + "type": "uint256" + }, + { + "internalType": "uint256[]", + "name": "newKeyTypes", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "newMinimumValidatorCount", + "type": "uint256" + } + ], + "name": "setConfig", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newResolverAddress", + "type": "address" + } + ], + "name": "setContractResolver", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newEpochEndTime", + "type": "uint256" + } + ], + "name": "setEpochEndTime", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newEpochLength", + "type": "uint256" + } + ], + "name": "setEpochLength", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "enum Staking.States", + "name": "newState", + "type": "uint8" + } + ], + "name": "setEpochState", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newEpochTimeout", + "type": "uint256" + } + ], + "name": "setEpochTimeout", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "ip", + "type": "uint32" + }, + { + "internalType": "uint128", + "name": "ipv6", + "type": "uint128" + }, + { + "internalType": "uint32", + "name": "port", + "type": "uint32" + }, + { + "internalType": "address", + "name": "nodeAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "senderPubKey", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "receiverPubKey", + "type": "uint256" + } + ], + "name": "setIpPortNodeAddressAndCommunicationPubKeys", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "reason", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "newKickPenaltyPercent", + "type": "uint256" + } + ], + "name": "setKickPenaltyPercent", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "stakerAddress", + "type": "address" + } + ], + "name": "shouldKickValidator", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "epochNumber", + "type": "uint256" + } + ], + "name": "signalReadyForNextEpoch", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "stake", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint32", + "name": "ip", + "type": "uint32" + }, + { + "internalType": "uint128", + "name": "ipv6", + "type": "uint128" + }, + { + "internalType": "uint32", + "name": "port", + "type": "uint32" + }, + { + "internalType": "address", + "name": "nodeAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "senderPubKey", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "receiverPubKey", + "type": "uint256" + } + ], + "name": "stakeAndJoin", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "state", + "outputs": [ + { + "internalType": "enum Staking.States", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalStaked", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "unlockValidatorsForNextEpoch", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "usedCommsKeys", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "validators", + "outputs": [ + { + "internalType": "uint32", + "name": "ip", + "type": "uint32" + }, + { + "internalType": "uint128", + "name": "ipv6", + "type": "uint128" + }, + { + "internalType": "uint32", + "name": "port", + "type": "uint32" + }, + { + "internalType": "address", + "name": "nodeAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "reward", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "senderPubKey", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "receiverPubKey", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "votesToKickValidatorsInNextEpoch", + "outputs": [ + { + "internalType": "uint256", + "name": "votes", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "withdraw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ] +} \ No newline at end of file diff --git a/tools/scripts/lit-contracts/Staking.sol/StakingData.mjs b/tools/scripts/lit-contracts/Staking.sol/StakingData.mjs new file mode 100644 index 0000000000..fb2b5dcd4b --- /dev/null +++ b/tools/scripts/lit-contracts/Staking.sol/StakingData.mjs @@ -0,0 +1,1672 @@ +export const StakingData = { + "date": "2023-09-12T16:59:07.000Z", + "address": "0x07A5bE9e0Aa724563e904B5e7AF37921e193f801", + "contractName": "Staking", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_resolver", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "_keyTypes", + "type": "uint256[]" + }, + { + "internalType": "enum ContractResolver.Env", + "name": "_env", + "type": "uint8" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "ActiveValidatorsCannotLeave", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "stakingAddress", + "type": "address" + } + ], + "name": "CannotRejoinUntilNextEpochBecauseKicked", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "senderPubKey", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "receiverPubKey", + "type": "uint256" + } + ], + "name": "CannotReuseCommsKeys", + "type": "error" + }, + { + "inputs": [], + "name": "CannotStakeZero", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "stakerAddress", + "type": "address" + } + ], + "name": "CannotVoteTwice", + "type": "error" + }, + { + "inputs": [], + "name": "CannotWithdrawZero", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "nodeAddress", + "type": "address" + } + ], + "name": "CouldNotMapNodeAddressToStakerAddress", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "enum Staking.States", + "name": "state", + "type": "uint8" + } + ], + "name": "MustBeInActiveOrUnlockedOrPausedState", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "enum Staking.States", + "name": "state", + "type": "uint8" + } + ], + "name": "MustBeInActiveOrUnlockedState", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "enum Staking.States", + "name": "state", + "type": "uint8" + } + ], + "name": "MustBeInNextValidatorSetLockedOrReadyForNextEpochState", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "enum Staking.States", + "name": "state", + "type": "uint8" + } + ], + "name": "MustBeInNextValidatorSetLockedState", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "enum Staking.States", + "name": "state", + "type": "uint8" + } + ], + "name": "MustBeInReadyForNextEpochState", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "stakerAddress", + "type": "address" + } + ], + "name": "MustBeValidatorInNextEpochToKick", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "currentTimestamp", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "epochEndTime", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "timeout", + "type": "uint256" + } + ], + "name": "NotEnoughTimeElapsedForTimeoutSinceLastEpoch", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "currentTimestamp", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "epochEndTime", + "type": "uint256" + } + ], + "name": "NotEnoughTimeElapsedSinceLastEpoch", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "validatorCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minimumValidatorCount", + "type": "uint256" + } + ], + "name": "NotEnoughValidatorsInNextEpoch", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "currentReadyValidatorCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "nextReadyValidatorCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minimumValidatorCountToBeReady", + "type": "uint256" + } + ], + "name": "NotEnoughValidatorsReadyForNextEpoch", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "currentEpochNumber", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "receivedEpochNumber", + "type": "uint256" + } + ], + "name": "SignaledReadyForWrongEpochNumber", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "stakerAddress", + "type": "address" + } + ], + "name": "StakerNotPermitted", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "yourBalance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "requestedWithdrawlAmount", + "type": "uint256" + } + ], + "name": "TryingToWithdrawMoreThanStaked", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "validator", + "type": "address" + }, + { + "internalType": "address[]", + "name": "validatorsInNextEpoch", + "type": "address[]" + } + ], + "name": "ValidatorIsNotInNextEpoch", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "newTokenRewardPerTokenPerEpoch", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newComplaintTolerance", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newComplaintIntervalSecs", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256[]", + "name": "newKeyTypes", + "type": "uint256[]" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newMinimumValidatorCount", + "type": "uint256" + } + ], + "name": "ConfigSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "newEpochEndTime", + "type": "uint256" + } + ], + "name": "EpochEndTimeSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "newEpochLength", + "type": "uint256" + } + ], + "name": "EpochLengthSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "newEpochTimeout", + "type": "uint256" + } + ], + "name": "EpochTimeoutSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "reason", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newKickPenaltyPercent", + "type": "uint256" + } + ], + "name": "KickPenaltyPercentSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "staker", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "epochNumber", + "type": "uint256" + } + ], + "name": "ReadyForNextEpoch", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Recovered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "staker", + "type": "address" + } + ], + "name": "RequestToJoin", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "staker", + "type": "address" + } + ], + "name": "RequestToLeave", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "newResolverContractAddress", + "type": "address" + } + ], + "name": "ResolverContractAddressSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "newDuration", + "type": "uint256" + } + ], + "name": "RewardsDurationUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "newStakingTokenAddress", + "type": "address" + } + ], + "name": "StakingTokenSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "enum Staking.States", + "name": "newState", + "type": "uint8" + } + ], + "name": "StateChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "staker", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amountBurned", + "type": "uint256" + } + ], + "name": "ValidatorKickedFromNextEpoch", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "staker", + "type": "address" + } + ], + "name": "ValidatorRejoinedNextEpoch", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "reporter", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "validatorStakerAddress", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "reason", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "VotedToKickValidatorInNextEpoch", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "validatorStakerAddress", + "type": "address" + } + ], + "name": "adminKickValidatorInNextEpoch", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "staker", + "type": "address" + } + ], + "name": "adminRejoinValidator", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "validatorStakerAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amountToPenalize", + "type": "uint256" + } + ], + "name": "adminSlashValidator", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "advanceEpoch", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "config", + "outputs": [ + { + "internalType": "uint256", + "name": "tokenRewardPerTokenPerEpoch", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "complaintTolerance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "complaintIntervalSecs", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minimumValidatorCount", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "contractResolver", + "outputs": [ + { + "internalType": "contract ContractResolver", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "countOfCurrentValidatorsReadyForNextEpoch", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "countOfNextValidatorsReadyForNextEpoch", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "currentValidatorCountForConsensus", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "env", + "outputs": [ + { + "internalType": "enum ContractResolver.Env", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "epoch", + "outputs": [ + { + "internalType": "uint256", + "name": "epochLength", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "number", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "endTime", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "retries", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "timeout", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "exit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getKeyTypes", + "outputs": [ + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getKickedValidators", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getReward", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getStakingBalancesAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getTokenAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getValidatorsInCurrentEpoch", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getValidatorsInCurrentEpochLength", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getValidatorsInNextEpoch", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "addresses", + "type": "address[]" + } + ], + "name": "getValidatorsStructs", + "outputs": [ + { + "components": [ + { + "internalType": "uint32", + "name": "ip", + "type": "uint32" + }, + { + "internalType": "uint128", + "name": "ipv6", + "type": "uint128" + }, + { + "internalType": "uint32", + "name": "port", + "type": "uint32" + }, + { + "internalType": "address", + "name": "nodeAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "reward", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "senderPubKey", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "receiverPubKey", + "type": "uint256" + } + ], + "internalType": "struct Staking.Validator[]", + "name": "", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getValidatorsStructsInCurrentEpoch", + "outputs": [ + { + "components": [ + { + "internalType": "uint32", + "name": "ip", + "type": "uint32" + }, + { + "internalType": "uint128", + "name": "ipv6", + "type": "uint128" + }, + { + "internalType": "uint32", + "name": "port", + "type": "uint32" + }, + { + "internalType": "address", + "name": "nodeAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "reward", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "senderPubKey", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "receiverPubKey", + "type": "uint256" + } + ], + "internalType": "struct Staking.Validator[]", + "name": "", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getValidatorsStructsInNextEpoch", + "outputs": [ + { + "components": [ + { + "internalType": "uint32", + "name": "ip", + "type": "uint32" + }, + { + "internalType": "uint128", + "name": "ipv6", + "type": "uint128" + }, + { + "internalType": "uint32", + "name": "port", + "type": "uint32" + }, + { + "internalType": "address", + "name": "nodeAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "reward", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "senderPubKey", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "receiverPubKey", + "type": "uint256" + } + ], + "internalType": "struct Staking.Validator[]", + "name": "", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "epochNumber", + "type": "uint256" + }, + { + "internalType": "address", + "name": "validatorStakerAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "voterStakerAddress", + "type": "address" + } + ], + "name": "getVotingStatusToKickValidator", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "isActiveValidator", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "isActiveValidatorByNodeAddress", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "isReadyForNextEpoch", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "kickPenaltyPercentByReason", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "validatorStakerAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "reason", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "kickValidatorInNextEpoch", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "lockValidatorsForNextEpoch", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "nextValidatorCountForConsensus", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "nodeAddressToStakerAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pauseEpoch", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "readyForNextEpoch", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "ip", + "type": "uint32" + }, + { + "internalType": "uint128", + "name": "ipv6", + "type": "uint128" + }, + { + "internalType": "uint32", + "name": "port", + "type": "uint32" + }, + { + "internalType": "address", + "name": "nodeAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "senderPubKey", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "receiverPubKey", + "type": "uint256" + } + ], + "name": "requestToJoin", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "requestToLeave", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newTokenRewardPerTokenPerEpoch", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "newComplaintTolerance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "newComplaintIntervalSecs", + "type": "uint256" + }, + { + "internalType": "uint256[]", + "name": "newKeyTypes", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "newMinimumValidatorCount", + "type": "uint256" + } + ], + "name": "setConfig", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newResolverAddress", + "type": "address" + } + ], + "name": "setContractResolver", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newEpochEndTime", + "type": "uint256" + } + ], + "name": "setEpochEndTime", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newEpochLength", + "type": "uint256" + } + ], + "name": "setEpochLength", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "enum Staking.States", + "name": "newState", + "type": "uint8" + } + ], + "name": "setEpochState", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newEpochTimeout", + "type": "uint256" + } + ], + "name": "setEpochTimeout", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "ip", + "type": "uint32" + }, + { + "internalType": "uint128", + "name": "ipv6", + "type": "uint128" + }, + { + "internalType": "uint32", + "name": "port", + "type": "uint32" + }, + { + "internalType": "address", + "name": "nodeAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "senderPubKey", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "receiverPubKey", + "type": "uint256" + } + ], + "name": "setIpPortNodeAddressAndCommunicationPubKeys", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "reason", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "newKickPenaltyPercent", + "type": "uint256" + } + ], + "name": "setKickPenaltyPercent", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "stakerAddress", + "type": "address" + } + ], + "name": "shouldKickValidator", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "epochNumber", + "type": "uint256" + } + ], + "name": "signalReadyForNextEpoch", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "stake", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint32", + "name": "ip", + "type": "uint32" + }, + { + "internalType": "uint128", + "name": "ipv6", + "type": "uint128" + }, + { + "internalType": "uint32", + "name": "port", + "type": "uint32" + }, + { + "internalType": "address", + "name": "nodeAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "senderPubKey", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "receiverPubKey", + "type": "uint256" + } + ], + "name": "stakeAndJoin", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "state", + "outputs": [ + { + "internalType": "enum Staking.States", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalStaked", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "unlockValidatorsForNextEpoch", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "usedCommsKeys", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "validators", + "outputs": [ + { + "internalType": "uint32", + "name": "ip", + "type": "uint32" + }, + { + "internalType": "uint128", + "name": "ipv6", + "type": "uint128" + }, + { + "internalType": "uint32", + "name": "port", + "type": "uint32" + }, + { + "internalType": "address", + "name": "nodeAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "reward", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "senderPubKey", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "receiverPubKey", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "votesToKickValidatorsInNextEpoch", + "outputs": [ + { + "internalType": "uint256", + "name": "votes", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "withdraw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ] +} \ No newline at end of file diff --git a/tools/scripts/lit-contracts/Staking.sol/StakingData.ts b/tools/scripts/lit-contracts/Staking.sol/StakingData.ts new file mode 100644 index 0000000000..fb2b5dcd4b --- /dev/null +++ b/tools/scripts/lit-contracts/Staking.sol/StakingData.ts @@ -0,0 +1,1672 @@ +export const StakingData = { + "date": "2023-09-12T16:59:07.000Z", + "address": "0x07A5bE9e0Aa724563e904B5e7AF37921e193f801", + "contractName": "Staking", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_resolver", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "_keyTypes", + "type": "uint256[]" + }, + { + "internalType": "enum ContractResolver.Env", + "name": "_env", + "type": "uint8" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "ActiveValidatorsCannotLeave", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "stakingAddress", + "type": "address" + } + ], + "name": "CannotRejoinUntilNextEpochBecauseKicked", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "senderPubKey", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "receiverPubKey", + "type": "uint256" + } + ], + "name": "CannotReuseCommsKeys", + "type": "error" + }, + { + "inputs": [], + "name": "CannotStakeZero", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "stakerAddress", + "type": "address" + } + ], + "name": "CannotVoteTwice", + "type": "error" + }, + { + "inputs": [], + "name": "CannotWithdrawZero", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "nodeAddress", + "type": "address" + } + ], + "name": "CouldNotMapNodeAddressToStakerAddress", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "enum Staking.States", + "name": "state", + "type": "uint8" + } + ], + "name": "MustBeInActiveOrUnlockedOrPausedState", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "enum Staking.States", + "name": "state", + "type": "uint8" + } + ], + "name": "MustBeInActiveOrUnlockedState", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "enum Staking.States", + "name": "state", + "type": "uint8" + } + ], + "name": "MustBeInNextValidatorSetLockedOrReadyForNextEpochState", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "enum Staking.States", + "name": "state", + "type": "uint8" + } + ], + "name": "MustBeInNextValidatorSetLockedState", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "enum Staking.States", + "name": "state", + "type": "uint8" + } + ], + "name": "MustBeInReadyForNextEpochState", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "stakerAddress", + "type": "address" + } + ], + "name": "MustBeValidatorInNextEpochToKick", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "currentTimestamp", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "epochEndTime", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "timeout", + "type": "uint256" + } + ], + "name": "NotEnoughTimeElapsedForTimeoutSinceLastEpoch", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "currentTimestamp", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "epochEndTime", + "type": "uint256" + } + ], + "name": "NotEnoughTimeElapsedSinceLastEpoch", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "validatorCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minimumValidatorCount", + "type": "uint256" + } + ], + "name": "NotEnoughValidatorsInNextEpoch", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "currentReadyValidatorCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "nextReadyValidatorCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minimumValidatorCountToBeReady", + "type": "uint256" + } + ], + "name": "NotEnoughValidatorsReadyForNextEpoch", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "currentEpochNumber", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "receivedEpochNumber", + "type": "uint256" + } + ], + "name": "SignaledReadyForWrongEpochNumber", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "stakerAddress", + "type": "address" + } + ], + "name": "StakerNotPermitted", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "yourBalance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "requestedWithdrawlAmount", + "type": "uint256" + } + ], + "name": "TryingToWithdrawMoreThanStaked", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "validator", + "type": "address" + }, + { + "internalType": "address[]", + "name": "validatorsInNextEpoch", + "type": "address[]" + } + ], + "name": "ValidatorIsNotInNextEpoch", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "newTokenRewardPerTokenPerEpoch", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newComplaintTolerance", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newComplaintIntervalSecs", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256[]", + "name": "newKeyTypes", + "type": "uint256[]" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newMinimumValidatorCount", + "type": "uint256" + } + ], + "name": "ConfigSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "newEpochEndTime", + "type": "uint256" + } + ], + "name": "EpochEndTimeSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "newEpochLength", + "type": "uint256" + } + ], + "name": "EpochLengthSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "newEpochTimeout", + "type": "uint256" + } + ], + "name": "EpochTimeoutSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "reason", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newKickPenaltyPercent", + "type": "uint256" + } + ], + "name": "KickPenaltyPercentSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "staker", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "epochNumber", + "type": "uint256" + } + ], + "name": "ReadyForNextEpoch", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Recovered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "staker", + "type": "address" + } + ], + "name": "RequestToJoin", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "staker", + "type": "address" + } + ], + "name": "RequestToLeave", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "newResolverContractAddress", + "type": "address" + } + ], + "name": "ResolverContractAddressSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "newDuration", + "type": "uint256" + } + ], + "name": "RewardsDurationUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "newStakingTokenAddress", + "type": "address" + } + ], + "name": "StakingTokenSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "enum Staking.States", + "name": "newState", + "type": "uint8" + } + ], + "name": "StateChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "staker", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amountBurned", + "type": "uint256" + } + ], + "name": "ValidatorKickedFromNextEpoch", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "staker", + "type": "address" + } + ], + "name": "ValidatorRejoinedNextEpoch", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "reporter", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "validatorStakerAddress", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "reason", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "VotedToKickValidatorInNextEpoch", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "validatorStakerAddress", + "type": "address" + } + ], + "name": "adminKickValidatorInNextEpoch", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "staker", + "type": "address" + } + ], + "name": "adminRejoinValidator", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "validatorStakerAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amountToPenalize", + "type": "uint256" + } + ], + "name": "adminSlashValidator", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "advanceEpoch", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "config", + "outputs": [ + { + "internalType": "uint256", + "name": "tokenRewardPerTokenPerEpoch", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "complaintTolerance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "complaintIntervalSecs", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minimumValidatorCount", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "contractResolver", + "outputs": [ + { + "internalType": "contract ContractResolver", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "countOfCurrentValidatorsReadyForNextEpoch", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "countOfNextValidatorsReadyForNextEpoch", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "currentValidatorCountForConsensus", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "env", + "outputs": [ + { + "internalType": "enum ContractResolver.Env", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "epoch", + "outputs": [ + { + "internalType": "uint256", + "name": "epochLength", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "number", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "endTime", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "retries", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "timeout", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "exit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getKeyTypes", + "outputs": [ + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getKickedValidators", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getReward", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getStakingBalancesAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getTokenAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getValidatorsInCurrentEpoch", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getValidatorsInCurrentEpochLength", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getValidatorsInNextEpoch", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "addresses", + "type": "address[]" + } + ], + "name": "getValidatorsStructs", + "outputs": [ + { + "components": [ + { + "internalType": "uint32", + "name": "ip", + "type": "uint32" + }, + { + "internalType": "uint128", + "name": "ipv6", + "type": "uint128" + }, + { + "internalType": "uint32", + "name": "port", + "type": "uint32" + }, + { + "internalType": "address", + "name": "nodeAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "reward", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "senderPubKey", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "receiverPubKey", + "type": "uint256" + } + ], + "internalType": "struct Staking.Validator[]", + "name": "", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getValidatorsStructsInCurrentEpoch", + "outputs": [ + { + "components": [ + { + "internalType": "uint32", + "name": "ip", + "type": "uint32" + }, + { + "internalType": "uint128", + "name": "ipv6", + "type": "uint128" + }, + { + "internalType": "uint32", + "name": "port", + "type": "uint32" + }, + { + "internalType": "address", + "name": "nodeAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "reward", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "senderPubKey", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "receiverPubKey", + "type": "uint256" + } + ], + "internalType": "struct Staking.Validator[]", + "name": "", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getValidatorsStructsInNextEpoch", + "outputs": [ + { + "components": [ + { + "internalType": "uint32", + "name": "ip", + "type": "uint32" + }, + { + "internalType": "uint128", + "name": "ipv6", + "type": "uint128" + }, + { + "internalType": "uint32", + "name": "port", + "type": "uint32" + }, + { + "internalType": "address", + "name": "nodeAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "reward", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "senderPubKey", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "receiverPubKey", + "type": "uint256" + } + ], + "internalType": "struct Staking.Validator[]", + "name": "", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "epochNumber", + "type": "uint256" + }, + { + "internalType": "address", + "name": "validatorStakerAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "voterStakerAddress", + "type": "address" + } + ], + "name": "getVotingStatusToKickValidator", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "isActiveValidator", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "isActiveValidatorByNodeAddress", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "isReadyForNextEpoch", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "kickPenaltyPercentByReason", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "validatorStakerAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "reason", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "kickValidatorInNextEpoch", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "lockValidatorsForNextEpoch", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "nextValidatorCountForConsensus", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "nodeAddressToStakerAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pauseEpoch", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "readyForNextEpoch", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "ip", + "type": "uint32" + }, + { + "internalType": "uint128", + "name": "ipv6", + "type": "uint128" + }, + { + "internalType": "uint32", + "name": "port", + "type": "uint32" + }, + { + "internalType": "address", + "name": "nodeAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "senderPubKey", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "receiverPubKey", + "type": "uint256" + } + ], + "name": "requestToJoin", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "requestToLeave", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newTokenRewardPerTokenPerEpoch", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "newComplaintTolerance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "newComplaintIntervalSecs", + "type": "uint256" + }, + { + "internalType": "uint256[]", + "name": "newKeyTypes", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "newMinimumValidatorCount", + "type": "uint256" + } + ], + "name": "setConfig", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newResolverAddress", + "type": "address" + } + ], + "name": "setContractResolver", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newEpochEndTime", + "type": "uint256" + } + ], + "name": "setEpochEndTime", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newEpochLength", + "type": "uint256" + } + ], + "name": "setEpochLength", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "enum Staking.States", + "name": "newState", + "type": "uint8" + } + ], + "name": "setEpochState", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newEpochTimeout", + "type": "uint256" + } + ], + "name": "setEpochTimeout", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "ip", + "type": "uint32" + }, + { + "internalType": "uint128", + "name": "ipv6", + "type": "uint128" + }, + { + "internalType": "uint32", + "name": "port", + "type": "uint32" + }, + { + "internalType": "address", + "name": "nodeAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "senderPubKey", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "receiverPubKey", + "type": "uint256" + } + ], + "name": "setIpPortNodeAddressAndCommunicationPubKeys", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "reason", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "newKickPenaltyPercent", + "type": "uint256" + } + ], + "name": "setKickPenaltyPercent", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "stakerAddress", + "type": "address" + } + ], + "name": "shouldKickValidator", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "epochNumber", + "type": "uint256" + } + ], + "name": "signalReadyForNextEpoch", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "stake", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint32", + "name": "ip", + "type": "uint32" + }, + { + "internalType": "uint128", + "name": "ipv6", + "type": "uint128" + }, + { + "internalType": "uint32", + "name": "port", + "type": "uint32" + }, + { + "internalType": "address", + "name": "nodeAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "senderPubKey", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "receiverPubKey", + "type": "uint256" + } + ], + "name": "stakeAndJoin", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "state", + "outputs": [ + { + "internalType": "enum Staking.States", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalStaked", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "unlockValidatorsForNextEpoch", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "usedCommsKeys", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "validators", + "outputs": [ + { + "internalType": "uint32", + "name": "ip", + "type": "uint32" + }, + { + "internalType": "uint128", + "name": "ipv6", + "type": "uint128" + }, + { + "internalType": "uint32", + "name": "port", + "type": "uint32" + }, + { + "internalType": "address", + "name": "nodeAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "reward", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "senderPubKey", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "receiverPubKey", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "votesToKickValidatorsInNextEpoch", + "outputs": [ + { + "internalType": "uint256", + "name": "votes", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "withdraw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ] +} \ No newline at end of file diff --git a/tools/scripts/lit-contracts/Staking.sol/common.ts b/tools/scripts/lit-contracts/Staking.sol/common.ts new file mode 100644 index 0000000000..2fc40c7fb1 --- /dev/null +++ b/tools/scripts/lit-contracts/Staking.sol/common.ts @@ -0,0 +1,44 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { Listener } from "@ethersproject/providers"; +import type { Event, EventFilter } from "ethers"; + +export interface TypedEvent< + TArgsArray extends Array = any, + TArgsObject = any +> extends Event { + args: TArgsArray & TArgsObject; +} + +export interface TypedEventFilter<_TEvent extends TypedEvent> + extends EventFilter {} + +export interface TypedListener { + (...listenerArg: [...__TypechainArgsArray, TEvent]): void; +} + +type __TypechainArgsArray = T extends TypedEvent ? U : never; + +export interface OnEvent { + ( + eventFilter: TypedEventFilter, + listener: TypedListener + ): TRes; + (eventName: string, listener: Listener): TRes; +} + +export type MinEthersFactory = { + deploy(...a: ARGS[]): Promise; +}; + +export type GetContractTypeFromFactory = F extends MinEthersFactory< + infer C, + any +> + ? C + : never; + +export type GetARGsTypeFromFactory = F extends MinEthersFactory + ? Parameters + : never; diff --git a/tools/scripts/lit-contracts/Staking.sol/factories/Staking__factory.ts b/tools/scripts/lit-contracts/Staking.sol/factories/Staking__factory.ts new file mode 100644 index 0000000000..7e0e236232 --- /dev/null +++ b/tools/scripts/lit-contracts/Staking.sol/factories/Staking__factory.ts @@ -0,0 +1,1688 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Signer, utils } from "ethers"; +import type { Provider } from "@ethersproject/providers"; +import type { Staking, StakingInterface } from "../Staking"; + +const _abi = [ + { + inputs: [ + { + internalType: "address", + name: "_resolver", + type: "address", + }, + { + internalType: "uint256[]", + name: "_keyTypes", + type: "uint256[]", + }, + { + internalType: "enum ContractResolver.Env", + name: "_env", + type: "uint8", + }, + ], + stateMutability: "nonpayable", + type: "constructor", + }, + { + inputs: [], + name: "ActiveValidatorsCannotLeave", + type: "error", + }, + { + inputs: [ + { + internalType: "address", + name: "stakingAddress", + type: "address", + }, + ], + name: "CannotRejoinUntilNextEpochBecauseKicked", + type: "error", + }, + { + inputs: [ + { + internalType: "uint256", + name: "senderPubKey", + type: "uint256", + }, + { + internalType: "uint256", + name: "receiverPubKey", + type: "uint256", + }, + ], + name: "CannotReuseCommsKeys", + type: "error", + }, + { + inputs: [], + name: "CannotStakeZero", + type: "error", + }, + { + inputs: [ + { + internalType: "address", + name: "stakerAddress", + type: "address", + }, + ], + name: "CannotVoteTwice", + type: "error", + }, + { + inputs: [], + name: "CannotWithdrawZero", + type: "error", + }, + { + inputs: [ + { + internalType: "address", + name: "nodeAddress", + type: "address", + }, + ], + name: "CouldNotMapNodeAddressToStakerAddress", + type: "error", + }, + { + inputs: [ + { + internalType: "enum Staking.States", + name: "state", + type: "uint8", + }, + ], + name: "MustBeInActiveOrUnlockedOrPausedState", + type: "error", + }, + { + inputs: [ + { + internalType: "enum Staking.States", + name: "state", + type: "uint8", + }, + ], + name: "MustBeInActiveOrUnlockedState", + type: "error", + }, + { + inputs: [ + { + internalType: "enum Staking.States", + name: "state", + type: "uint8", + }, + ], + name: "MustBeInNextValidatorSetLockedOrReadyForNextEpochState", + type: "error", + }, + { + inputs: [ + { + internalType: "enum Staking.States", + name: "state", + type: "uint8", + }, + ], + name: "MustBeInNextValidatorSetLockedState", + type: "error", + }, + { + inputs: [ + { + internalType: "enum Staking.States", + name: "state", + type: "uint8", + }, + ], + name: "MustBeInReadyForNextEpochState", + type: "error", + }, + { + inputs: [ + { + internalType: "address", + name: "stakerAddress", + type: "address", + }, + ], + name: "MustBeValidatorInNextEpochToKick", + type: "error", + }, + { + inputs: [ + { + internalType: "uint256", + name: "currentTimestamp", + type: "uint256", + }, + { + internalType: "uint256", + name: "epochEndTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "timeout", + type: "uint256", + }, + ], + name: "NotEnoughTimeElapsedForTimeoutSinceLastEpoch", + type: "error", + }, + { + inputs: [ + { + internalType: "uint256", + name: "currentTimestamp", + type: "uint256", + }, + { + internalType: "uint256", + name: "epochEndTime", + type: "uint256", + }, + ], + name: "NotEnoughTimeElapsedSinceLastEpoch", + type: "error", + }, + { + inputs: [ + { + internalType: "uint256", + name: "validatorCount", + type: "uint256", + }, + { + internalType: "uint256", + name: "minimumValidatorCount", + type: "uint256", + }, + ], + name: "NotEnoughValidatorsInNextEpoch", + type: "error", + }, + { + inputs: [ + { + internalType: "uint256", + name: "currentReadyValidatorCount", + type: "uint256", + }, + { + internalType: "uint256", + name: "nextReadyValidatorCount", + type: "uint256", + }, + { + internalType: "uint256", + name: "minimumValidatorCountToBeReady", + type: "uint256", + }, + ], + name: "NotEnoughValidatorsReadyForNextEpoch", + type: "error", + }, + { + inputs: [ + { + internalType: "uint256", + name: "currentEpochNumber", + type: "uint256", + }, + { + internalType: "uint256", + name: "receivedEpochNumber", + type: "uint256", + }, + ], + name: "SignaledReadyForWrongEpochNumber", + type: "error", + }, + { + inputs: [ + { + internalType: "address", + name: "stakerAddress", + type: "address", + }, + ], + name: "StakerNotPermitted", + type: "error", + }, + { + inputs: [ + { + internalType: "uint256", + name: "yourBalance", + type: "uint256", + }, + { + internalType: "uint256", + name: "requestedWithdrawlAmount", + type: "uint256", + }, + ], + name: "TryingToWithdrawMoreThanStaked", + type: "error", + }, + { + inputs: [ + { + internalType: "address", + name: "validator", + type: "address", + }, + { + internalType: "address[]", + name: "validatorsInNextEpoch", + type: "address[]", + }, + ], + name: "ValidatorIsNotInNextEpoch", + type: "error", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "newTokenRewardPerTokenPerEpoch", + type: "uint256", + }, + { + indexed: false, + internalType: "uint256", + name: "newComplaintTolerance", + type: "uint256", + }, + { + indexed: false, + internalType: "uint256", + name: "newComplaintIntervalSecs", + type: "uint256", + }, + { + indexed: false, + internalType: "uint256[]", + name: "newKeyTypes", + type: "uint256[]", + }, + { + indexed: false, + internalType: "uint256", + name: "newMinimumValidatorCount", + type: "uint256", + }, + ], + name: "ConfigSet", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "newEpochEndTime", + type: "uint256", + }, + ], + name: "EpochEndTimeSet", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "newEpochLength", + type: "uint256", + }, + ], + name: "EpochLengthSet", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "newEpochTimeout", + type: "uint256", + }, + ], + name: "EpochTimeoutSet", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "reason", + type: "uint256", + }, + { + indexed: false, + internalType: "uint256", + name: "newKickPenaltyPercent", + type: "uint256", + }, + ], + name: "KickPenaltyPercentSet", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "previousOwner", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "newOwner", + type: "address", + }, + ], + name: "OwnershipTransferred", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "staker", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "epochNumber", + type: "uint256", + }, + ], + name: "ReadyForNextEpoch", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "address", + name: "token", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "amount", + type: "uint256", + }, + ], + name: "Recovered", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "staker", + type: "address", + }, + ], + name: "RequestToJoin", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "staker", + type: "address", + }, + ], + name: "RequestToLeave", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "address", + name: "newResolverContractAddress", + type: "address", + }, + ], + name: "ResolverContractAddressSet", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "newDuration", + type: "uint256", + }, + ], + name: "RewardsDurationUpdated", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "address", + name: "newStakingTokenAddress", + type: "address", + }, + ], + name: "StakingTokenSet", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "enum Staking.States", + name: "newState", + type: "uint8", + }, + ], + name: "StateChanged", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "staker", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "amountBurned", + type: "uint256", + }, + ], + name: "ValidatorKickedFromNextEpoch", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "address", + name: "staker", + type: "address", + }, + ], + name: "ValidatorRejoinedNextEpoch", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "reporter", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "validatorStakerAddress", + type: "address", + }, + { + indexed: true, + internalType: "uint256", + name: "reason", + type: "uint256", + }, + { + indexed: false, + internalType: "bytes", + name: "data", + type: "bytes", + }, + ], + name: "VotedToKickValidatorInNextEpoch", + type: "event", + }, + { + inputs: [ + { + internalType: "address", + name: "validatorStakerAddress", + type: "address", + }, + ], + name: "adminKickValidatorInNextEpoch", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "staker", + type: "address", + }, + ], + name: "adminRejoinValidator", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "validatorStakerAddress", + type: "address", + }, + { + internalType: "uint256", + name: "amountToPenalize", + type: "uint256", + }, + ], + name: "adminSlashValidator", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "advanceEpoch", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "config", + outputs: [ + { + internalType: "uint256", + name: "tokenRewardPerTokenPerEpoch", + type: "uint256", + }, + { + internalType: "uint256", + name: "complaintTolerance", + type: "uint256", + }, + { + internalType: "uint256", + name: "complaintIntervalSecs", + type: "uint256", + }, + { + internalType: "uint256", + name: "minimumValidatorCount", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "contractResolver", + outputs: [ + { + internalType: "contract ContractResolver", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "countOfCurrentValidatorsReadyForNextEpoch", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "countOfNextValidatorsReadyForNextEpoch", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "currentValidatorCountForConsensus", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "env", + outputs: [ + { + internalType: "enum ContractResolver.Env", + name: "", + type: "uint8", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "epoch", + outputs: [ + { + internalType: "uint256", + name: "epochLength", + type: "uint256", + }, + { + internalType: "uint256", + name: "number", + type: "uint256", + }, + { + internalType: "uint256", + name: "endTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "retries", + type: "uint256", + }, + { + internalType: "uint256", + name: "timeout", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "exit", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "getKeyTypes", + outputs: [ + { + internalType: "uint256[]", + name: "", + type: "uint256[]", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "getKickedValidators", + outputs: [ + { + internalType: "address[]", + name: "", + type: "address[]", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "getReward", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "getStakingBalancesAddress", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "getTokenAddress", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "getValidatorsInCurrentEpoch", + outputs: [ + { + internalType: "address[]", + name: "", + type: "address[]", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "getValidatorsInCurrentEpochLength", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "getValidatorsInNextEpoch", + outputs: [ + { + internalType: "address[]", + name: "", + type: "address[]", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address[]", + name: "addresses", + type: "address[]", + }, + ], + name: "getValidatorsStructs", + outputs: [ + { + components: [ + { + internalType: "uint32", + name: "ip", + type: "uint32", + }, + { + internalType: "uint128", + name: "ipv6", + type: "uint128", + }, + { + internalType: "uint32", + name: "port", + type: "uint32", + }, + { + internalType: "address", + name: "nodeAddress", + type: "address", + }, + { + internalType: "uint256", + name: "reward", + type: "uint256", + }, + { + internalType: "uint256", + name: "senderPubKey", + type: "uint256", + }, + { + internalType: "uint256", + name: "receiverPubKey", + type: "uint256", + }, + ], + internalType: "struct Staking.Validator[]", + name: "", + type: "tuple[]", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "getValidatorsStructsInCurrentEpoch", + outputs: [ + { + components: [ + { + internalType: "uint32", + name: "ip", + type: "uint32", + }, + { + internalType: "uint128", + name: "ipv6", + type: "uint128", + }, + { + internalType: "uint32", + name: "port", + type: "uint32", + }, + { + internalType: "address", + name: "nodeAddress", + type: "address", + }, + { + internalType: "uint256", + name: "reward", + type: "uint256", + }, + { + internalType: "uint256", + name: "senderPubKey", + type: "uint256", + }, + { + internalType: "uint256", + name: "receiverPubKey", + type: "uint256", + }, + ], + internalType: "struct Staking.Validator[]", + name: "", + type: "tuple[]", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "getValidatorsStructsInNextEpoch", + outputs: [ + { + components: [ + { + internalType: "uint32", + name: "ip", + type: "uint32", + }, + { + internalType: "uint128", + name: "ipv6", + type: "uint128", + }, + { + internalType: "uint32", + name: "port", + type: "uint32", + }, + { + internalType: "address", + name: "nodeAddress", + type: "address", + }, + { + internalType: "uint256", + name: "reward", + type: "uint256", + }, + { + internalType: "uint256", + name: "senderPubKey", + type: "uint256", + }, + { + internalType: "uint256", + name: "receiverPubKey", + type: "uint256", + }, + ], + internalType: "struct Staking.Validator[]", + name: "", + type: "tuple[]", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "epochNumber", + type: "uint256", + }, + { + internalType: "address", + name: "validatorStakerAddress", + type: "address", + }, + { + internalType: "address", + name: "voterStakerAddress", + type: "address", + }, + ], + name: "getVotingStatusToKickValidator", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "account", + type: "address", + }, + ], + name: "isActiveValidator", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "account", + type: "address", + }, + ], + name: "isActiveValidatorByNodeAddress", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "isReadyForNextEpoch", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + name: "kickPenaltyPercentByReason", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "validatorStakerAddress", + type: "address", + }, + { + internalType: "uint256", + name: "reason", + type: "uint256", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + ], + name: "kickValidatorInNextEpoch", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "lockValidatorsForNextEpoch", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "nextValidatorCountForConsensus", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + name: "nodeAddressToStakerAddress", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "owner", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "pauseEpoch", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + name: "readyForNextEpoch", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "renounceOwnership", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint32", + name: "ip", + type: "uint32", + }, + { + internalType: "uint128", + name: "ipv6", + type: "uint128", + }, + { + internalType: "uint32", + name: "port", + type: "uint32", + }, + { + internalType: "address", + name: "nodeAddress", + type: "address", + }, + { + internalType: "uint256", + name: "senderPubKey", + type: "uint256", + }, + { + internalType: "uint256", + name: "receiverPubKey", + type: "uint256", + }, + ], + name: "requestToJoin", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "requestToLeave", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "newTokenRewardPerTokenPerEpoch", + type: "uint256", + }, + { + internalType: "uint256", + name: "newComplaintTolerance", + type: "uint256", + }, + { + internalType: "uint256", + name: "newComplaintIntervalSecs", + type: "uint256", + }, + { + internalType: "uint256[]", + name: "newKeyTypes", + type: "uint256[]", + }, + { + internalType: "uint256", + name: "newMinimumValidatorCount", + type: "uint256", + }, + ], + name: "setConfig", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "newResolverAddress", + type: "address", + }, + ], + name: "setContractResolver", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "newEpochEndTime", + type: "uint256", + }, + ], + name: "setEpochEndTime", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "newEpochLength", + type: "uint256", + }, + ], + name: "setEpochLength", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "enum Staking.States", + name: "newState", + type: "uint8", + }, + ], + name: "setEpochState", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "newEpochTimeout", + type: "uint256", + }, + ], + name: "setEpochTimeout", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint32", + name: "ip", + type: "uint32", + }, + { + internalType: "uint128", + name: "ipv6", + type: "uint128", + }, + { + internalType: "uint32", + name: "port", + type: "uint32", + }, + { + internalType: "address", + name: "nodeAddress", + type: "address", + }, + { + internalType: "uint256", + name: "senderPubKey", + type: "uint256", + }, + { + internalType: "uint256", + name: "receiverPubKey", + type: "uint256", + }, + ], + name: "setIpPortNodeAddressAndCommunicationPubKeys", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "reason", + type: "uint256", + }, + { + internalType: "uint256", + name: "newKickPenaltyPercent", + type: "uint256", + }, + ], + name: "setKickPenaltyPercent", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "stakerAddress", + type: "address", + }, + ], + name: "shouldKickValidator", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "epochNumber", + type: "uint256", + }, + ], + name: "signalReadyForNextEpoch", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "amount", + type: "uint256", + }, + ], + name: "stake", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "amount", + type: "uint256", + }, + { + internalType: "uint32", + name: "ip", + type: "uint32", + }, + { + internalType: "uint128", + name: "ipv6", + type: "uint128", + }, + { + internalType: "uint32", + name: "port", + type: "uint32", + }, + { + internalType: "address", + name: "nodeAddress", + type: "address", + }, + { + internalType: "uint256", + name: "senderPubKey", + type: "uint256", + }, + { + internalType: "uint256", + name: "receiverPubKey", + type: "uint256", + }, + ], + name: "stakeAndJoin", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "state", + outputs: [ + { + internalType: "enum Staking.States", + name: "", + type: "uint8", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "totalStaked", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "newOwner", + type: "address", + }, + ], + name: "transferOwnership", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "unlockValidatorsForNextEpoch", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + name: "usedCommsKeys", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + name: "validators", + outputs: [ + { + internalType: "uint32", + name: "ip", + type: "uint32", + }, + { + internalType: "uint128", + name: "ipv6", + type: "uint128", + }, + { + internalType: "uint32", + name: "port", + type: "uint32", + }, + { + internalType: "address", + name: "nodeAddress", + type: "address", + }, + { + internalType: "uint256", + name: "reward", + type: "uint256", + }, + { + internalType: "uint256", + name: "senderPubKey", + type: "uint256", + }, + { + internalType: "uint256", + name: "receiverPubKey", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + { + internalType: "address", + name: "", + type: "address", + }, + ], + name: "votesToKickValidatorsInNextEpoch", + outputs: [ + { + internalType: "uint256", + name: "votes", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "amount", + type: "uint256", + }, + ], + name: "withdraw", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, +] as const; + +export class Staking__factory { + static readonly abi = _abi; + static createInterface(): StakingInterface { + return new utils.Interface(_abi) as StakingInterface; + } + static connect( + address: string, + signerOrProvider: Signer | Provider + ): Staking { + return new Contract(address, _abi, signerOrProvider) as Staking; + } +} diff --git a/tools/scripts/lit-contracts/Staking.sol/factories/index.ts b/tools/scripts/lit-contracts/Staking.sol/factories/index.ts new file mode 100644 index 0000000000..ae2fbbb4f2 --- /dev/null +++ b/tools/scripts/lit-contracts/Staking.sol/factories/index.ts @@ -0,0 +1,4 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export { Staking__factory } from "./Staking__factory"; diff --git a/tools/scripts/lit-contracts/Staking.sol/index.js b/tools/scripts/lit-contracts/Staking.sol/index.js new file mode 100644 index 0000000000..60629b3076 --- /dev/null +++ b/tools/scripts/lit-contracts/Staking.sol/index.js @@ -0,0 +1,2 @@ +export * from "./StakingData.js"; +export * from "./StakingContract.js"; \ No newline at end of file diff --git a/tools/scripts/lit-contracts/Staking.sol/index.mjs b/tools/scripts/lit-contracts/Staking.sol/index.mjs new file mode 100644 index 0000000000..d9438c5769 --- /dev/null +++ b/tools/scripts/lit-contracts/Staking.sol/index.mjs @@ -0,0 +1,2 @@ +export * from "./StakingData.mjs"; +export * from "./StakingContract.mjs"; \ No newline at end of file diff --git a/tools/scripts/lit-contracts/Staking.sol/index.ts b/tools/scripts/lit-contracts/Staking.sol/index.ts new file mode 100644 index 0000000000..36fad9df91 --- /dev/null +++ b/tools/scripts/lit-contracts/Staking.sol/index.ts @@ -0,0 +1,3 @@ +export * from "./StakingData"; +export * from "./StakingContract"; +export * from "./Staking"; \ No newline at end of file diff --git a/tools/scripts/lit-contracts/types.ts b/tools/scripts/lit-contracts/types.ts new file mode 100644 index 0000000000..84755be0f6 --- /dev/null +++ b/tools/scripts/lit-contracts/types.ts @@ -0,0 +1,12 @@ +export * from "./Staking.sol/Staking.ts"; +export * from "./Multisender.sol/Multisender.ts"; +export * from "./LITToken.sol/LITToken.ts"; +export * from "./PubkeyRouter.sol/PubkeyRouter.ts"; +export * from "./PKPNFT.sol/PKPNFT.ts"; +export * from "./RateLimitNFT.sol/RateLimitNFT.ts"; +export * from "./PKPHelper.sol/PKPHelper.ts"; +export * from "./PKPPermissions.sol/PKPPermissions.ts"; +export * from "./Allowlist.sol/Allowlist.ts"; +export * from "./Resolver.sol/Resolver.ts"; +export * from "./DomainWaleltRegistry.sol/DomainWaleltRegistry.ts"; +export * from "./DomainWalletOracle.sol/DomainWalletOracle.ts"; \ No newline at end of file diff --git a/tools/scripts/types.ts b/tools/scripts/types.ts new file mode 100644 index 0000000000..84755be0f6 --- /dev/null +++ b/tools/scripts/types.ts @@ -0,0 +1,12 @@ +export * from "./Staking.sol/Staking.ts"; +export * from "./Multisender.sol/Multisender.ts"; +export * from "./LITToken.sol/LITToken.ts"; +export * from "./PubkeyRouter.sol/PubkeyRouter.ts"; +export * from "./PKPNFT.sol/PKPNFT.ts"; +export * from "./RateLimitNFT.sol/RateLimitNFT.ts"; +export * from "./PKPHelper.sol/PKPHelper.ts"; +export * from "./PKPPermissions.sol/PKPPermissions.ts"; +export * from "./Allowlist.sol/Allowlist.ts"; +export * from "./Resolver.sol/Resolver.ts"; +export * from "./DomainWaleltRegistry.sol/DomainWaleltRegistry.ts"; +export * from "./DomainWalletOracle.sol/DomainWalletOracle.ts"; \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index bf651f2d04..75d0cc7ca6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1934,6 +1934,14 @@ resolved "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== +"@getlit/contracts@^0.1.14": + version "0.1.14" + resolved "https://registry.yarnpkg.com/@getlit/contracts/-/contracts-0.1.14.tgz#a4ac14c6606af00122746f294e3f6e99c9307757" + integrity sha512-l2XdLtg0A8wwao5nCvGcQS9a1WWH4P+NbIvqgX7CpQ/tjNpaDOt0V7dsdDiNtCV1S5yJtgGtqZ7ZWUtQGVw9Hg== + dependencies: + "@typechain/ethers-v5" "^11.1.1" + typechain "^8.3.1" + "@hapi/hoek@^9.0.0": version "9.3.0" resolved "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz#8368869dcb735be2e7f5cb7647de78e167a251fb" @@ -5457,6 +5465,14 @@ resolved "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== +"@typechain/ethers-v5@^11.1.1": + version "11.1.1" + resolved "https://registry.yarnpkg.com/@typechain/ethers-v5/-/ethers-v5-11.1.1.tgz#23a358135a302140cf89a186592464dd6bbf1f98" + integrity sha512-D9WyUrCJ4Z5Gg8T00HWLpuqn1CqSDXlCiUOOpLaWoCbnZrE2jSIOUwR9blBZNo6LE5058e3niVu6xk205Et7tg== + dependencies: + lodash "^4.17.15" + ts-essentials "^7.0.1" + "@types/aria-query@^4.2.0": version "4.2.2" resolved "https://registry.npmjs.org/@types/aria-query/-/aria-query-4.2.2.tgz#ed4e0ad92306a704f9fb132a0cfcf77486dbe2bc" @@ -5765,9 +5781,9 @@ dependencies: "@types/node" "*" -"@types/prettier@^2.1.5": +"@types/prettier@^2.1.1", "@types/prettier@^2.1.5": version "2.7.3" - resolved "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz#3e51a17e291d01d17d3fc61422015a933af7a08f" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.3.tgz#3e51a17e291d01d17d3fc61422015a933af7a08f" integrity sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA== "@types/prop-types@*": @@ -7147,6 +7163,16 @@ arr-union@^3.1.0: resolved "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" integrity sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q== +array-back@^3.0.1, array-back@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/array-back/-/array-back-3.1.0.tgz#b8859d7a508871c9a7b2cf42f99428f65e96bfb0" + integrity sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q== + +array-back@^4.0.1, array-back@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/array-back/-/array-back-4.0.2.tgz#8004e999a6274586beeb27342168652fdb89fa1e" + integrity sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg== + array-buffer-byte-length@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" @@ -9180,7 +9206,7 @@ chalk@^3.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^5.0.1: +chalk@^5.0.1, chalk@^5.3.0: version "5.3.0" resolved "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== @@ -9670,6 +9696,26 @@ combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: dependencies: delayed-stream "~1.0.0" +command-line-args@^5.1.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/command-line-args/-/command-line-args-5.2.1.tgz#c44c32e437a57d7c51157696893c5909e9cec42e" + integrity sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg== + dependencies: + array-back "^3.1.0" + find-replace "^3.0.0" + lodash.camelcase "^4.3.0" + typical "^4.0.0" + +command-line-usage@^6.1.0: + version "6.1.3" + resolved "https://registry.yarnpkg.com/command-line-usage/-/command-line-usage-6.1.3.tgz#428fa5acde6a838779dfa30e44686f4b6761d957" + integrity sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw== + dependencies: + array-back "^4.0.2" + chalk "^2.4.2" + table-layout "^1.0.2" + typical "^5.2.0" + commander@5.1.0, commander@^5.1.0: version "5.1.0" resolved "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" @@ -10869,7 +10915,7 @@ deep-equal@~1.1.1: object-keys "^1.1.1" regexp.prototype.flags "^1.2.0" -deep-extend@^0.6.0: +deep-extend@^0.6.0, deep-extend@~0.6.0: version "0.6.0" resolved "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== @@ -13496,6 +13542,13 @@ find-config@^1.0.0: dependencies: user-home "^2.0.0" +find-replace@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-replace/-/find-replace-3.0.0.tgz#3e7e23d3b05167a76f770c9fbd5258b0def68c38" + integrity sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ== + dependencies: + array-back "^3.0.1" + find-up@6.3.0: version "6.3.0" resolved "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz#2abab3d3280b2dc7ac10199ef324c4e002c8c790" @@ -13775,6 +13828,15 @@ fs-extra@^4.0.2: jsonfile "^4.0.0" universalify "^0.1.0" +fs-extra@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" + integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + fs-extra@^8.1.0: version "8.1.0" resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" @@ -21959,6 +22021,11 @@ redeyed@~2.1.0: dependencies: esprima "~4.0.0" +reduce-flatten@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/reduce-flatten/-/reduce-flatten-2.0.0.tgz#734fd84e65f375d7ca4465c69798c25c9d10ae27" + integrity sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w== + reflect-metadata@^0.1.13: version "0.1.13" resolved "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08" @@ -23627,6 +23694,11 @@ strict-uri-encode@^2.0.0: resolved "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" integrity sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ== +string-format@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/string-format/-/string-format-2.0.0.tgz#f2df2e7097440d3b65de31b6d40d54c96eaffb9b" + integrity sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA== + string-hash@^1.1.1: version "1.1.3" resolved "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz#e8aafc0ac1855b4666929ed7dd1275df5d6c811b" @@ -24112,6 +24184,16 @@ synthetix@2.74.1: solidity-parser-antlr "^0.4.11" web3-utils "^1.2.2" +table-layout@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/table-layout/-/table-layout-1.0.2.tgz#c4038a1853b0136d63365a734b6931cf4fad4a04" + integrity sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A== + dependencies: + array-back "^4.0.1" + deep-extend "~0.6.0" + typical "^5.2.0" + wordwrapjs "^4.0.0" + table@^6.0.4, table@^6.0.9: version "6.8.1" resolved "https://registry.npmjs.org/table/-/table-6.8.1.tgz#ea2b71359fe03b017a5fbc296204471158080bdf" @@ -24558,6 +24640,21 @@ trim-right@^1.0.1: resolved "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" integrity sha512-WZGXGstmCWgeevgTL54hrCuw1dyMQIzWy7ZfqRJfSmJZBwklI15egmQytFP6bPidmw3M8d5yEowl1niq4vmqZw== +ts-command-line-args@^2.2.0: + version "2.5.1" + resolved "https://registry.yarnpkg.com/ts-command-line-args/-/ts-command-line-args-2.5.1.tgz#e64456b580d1d4f6d948824c274cf6fa5f45f7f0" + integrity sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw== + dependencies: + chalk "^4.1.0" + command-line-args "^5.1.1" + command-line-usage "^6.1.0" + string-format "^2.0.0" + +ts-essentials@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-7.0.3.tgz#686fd155a02133eedcc5362dc8b5056cde3e5a38" + integrity sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ== + ts-jest@27.1.4: version "27.1.4" resolved "https://registry.npmjs.org/ts-jest/-/ts-jest-27.1.4.tgz#84d42cf0f4e7157a52e7c64b1492c46330943e00" @@ -24748,6 +24845,22 @@ type@^2.7.2: resolved "https://registry.npmjs.org/type/-/type-2.7.2.tgz#2376a15a3a28b1efa0f5350dcf72d24df6ef98d0" integrity sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw== +typechain@^8.3.1: + version "8.3.1" + resolved "https://registry.yarnpkg.com/typechain/-/typechain-8.3.1.tgz#dccbc839b94877997536c356380eff7325395cfb" + integrity sha512-fA7clol2IP/56yq6vkMTR+4URF1nGjV82Wx6Rf09EsqD4tkzMAvEaqYxVFCavJm/1xaRga/oD55K+4FtuXwQOQ== + dependencies: + "@types/prettier" "^2.1.1" + debug "^4.3.1" + fs-extra "^7.0.0" + glob "7.1.7" + js-sha3 "^0.8.0" + lodash "^4.17.15" + mkdirp "^1.0.4" + prettier "^2.3.1" + ts-command-line-args "^2.2.0" + ts-essentials "^7.0.1" + typed-array-buffer@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz#18de3e7ed7974b0a729d3feecb94338d1472cd60" @@ -24829,6 +24942,16 @@ typescript@~4.7.2: resolved "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz#1a88596d1cf47d59507a1bcdfb5b9dfe4d488235" integrity sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ== +typical@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/typical/-/typical-4.0.0.tgz#cbeaff3b9d7ae1e2bbfaf5a4e6f11eccfde94fc4" + integrity sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw== + +typical@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/typical/-/typical-5.2.0.tgz#4daaac4f2b5315460804f0acf6cb69c52bb93066" + integrity sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg== + u2f-api@0.2.7: version "0.2.7" resolved "https://registry.npmjs.org/u2f-api/-/u2f-api-0.2.7.tgz#17bf196b242f6bf72353d9858e6a7566cc192720" @@ -26016,6 +26139,14 @@ wordwrap@^1.0.0: resolved "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== +wordwrapjs@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/wordwrapjs/-/wordwrapjs-4.0.1.tgz#d9790bccfb110a0fc7836b5ebce0937b37a8b98f" + integrity sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA== + dependencies: + reduce-flatten "^2.0.0" + typical "^5.2.0" + "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" From 2b11ea64f567cf13a222e55262aae7b3e82ba3a7 Mon Sep 17 00:00:00 2001 From: Ansonhkg Date: Wed, 13 Sep 2023 16:42:06 +0100 Subject: [PATCH 3/9] feat: add UNKNOWN_SIGNATURE_ERROR --- packages/constants/src/lib/errors.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/constants/src/lib/errors.ts b/packages/constants/src/lib/errors.ts index d65903167c..f7754fa74c 100644 --- a/packages/constants/src/lib/errors.ts +++ b/packages/constants/src/lib/errors.ts @@ -106,6 +106,11 @@ export const LIT_ERROR = { code: 'unknown_signature_type', kind: LitErrorKind.Validation, }, + UNKNOWN_SIGNATURE_ERROR: { + name: 'UnknownSignatureError', + code: 'unknown_signature_error', + kind: LitErrorKind.Validation, + }, PARAM_NULL_ERROR: { name: 'ParamNullError', code: 'param_null_error', From 805d41dd04791fd9a7538698a4e14ec0e7ef4aab Mon Sep 17 00:00:00 2001 From: Chris Cassano <1285652+glitch003@users.noreply.github.com> Date: Thu, 14 Sep 2023 01:08:09 -0700 Subject: [PATCH 4/9] Feature/easier local node testing (#215) * fix typescript errors with nodejs app * config and docs for testing against a local node * local testing works * restore cayenne contracts * add env var docs * cleanup --- README.md | 100 +++-- apps/html/index.html | 4 +- apps/nodejs/manual-test.ts | 370 +++++++++++++----- apps/react/src/app/app.tsx | 2 +- packages/contracts-sdk/fetch-contracts.mjs | 51 ++- .../contracts-sdk/lit-contracts.config.json | 7 +- .../contracts-sdk/src/abis/Allowlist.data.ts | 2 +- .../src/abis/ContractResolver.data.ts | 2 +- .../src/abis/Multisender.data.ts | 2 +- .../contracts-sdk/src/abis/PKPHelper.data.ts | 2 +- .../contracts-sdk/src/abis/PKPNFT.data.ts | 2 +- .../src/abis/PKPNFTMetadata.data.ts | 2 +- .../src/abis/PKPPermissions.data.ts | 2 +- .../src/abis/PubkeyRouter.data.ts | 2 +- .../src/abis/RateLimitNFT.data.ts | 2 +- .../contracts-sdk/src/abis/Staking.data.ts | 9 +- packages/contracts-sdk/src/abis/Staking.json | 7 - packages/contracts-sdk/src/abis/Staking.ts | 10 - .../src/abis/StakingBalances.data.ts | 2 +- .../contracts-sdk/src/deployed-contracts.json | 46 +-- .../src/lib/providers/BaseProvider.ts | 6 +- .../src/lib/lit-node-client-nodejs.ts | 92 +++-- tsconfig.base.json | 2 +- 23 files changed, 459 insertions(+), 267 deletions(-) diff --git a/README.md b/README.md index a01b3f8fc1..dcd2b144cb 100644 --- a/README.md +++ b/README.md @@ -67,39 +67,37 @@ For usage directly in the browser with a script tag -Package | Category | Version | Download ---- | --- | --- | --- -| [@lit-protocol/lit-node-client-nodejs](https://github.com/LIT-Protocol/js-sdk/tree/master/packages/lit-node-client-nodejs) | ![lit-node-client-nodejs](https://img.shields.io/badge/-nodejs-2E8B57 "lit-node-client-nodejs") | 3.0.0 | npm
Vanilla JS (UMD) -| [@lit-protocol/lit-node-client](https://github.com/LIT-Protocol/js-sdk/tree/master/packages/lit-node-client) | ![lit-node-client](https://img.shields.io/badge/-universal-8A6496 "lit-node-client") | 3.0.0 | npm
Vanilla JS (UMD) - +| Package | Category | Version | Download | +| -------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------- | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| [@lit-protocol/lit-node-client-nodejs](https://github.com/LIT-Protocol/js-sdk/tree/master/packages/lit-node-client-nodejs) | ![lit-node-client-nodejs](https://img.shields.io/badge/-nodejs-2E8B57 'lit-node-client-nodejs') | 3.0.0 | npm
Vanilla JS (UMD) | +| [@lit-protocol/lit-node-client](https://github.com/LIT-Protocol/js-sdk/tree/master/packages/lit-node-client) | ![lit-node-client](https://img.shields.io/badge/-universal-8A6496 'lit-node-client') | 3.0.0 | npm
Vanilla JS (UMD) | If you're a tech-savvy user and wish to utilize only specific submodules that our main module relies upon, you can find individual packages listed below. This way, you can import only the necessary packages that cater to your specific use case:: - -Package | Category | Version | Download ---- | --- | --- | --- -| [@lit-protocol/access-control-conditions](https://github.com/LIT-Protocol/js-sdk/tree/master/packages/access-control-conditions) | ![access-control-conditions](https://img.shields.io/badge/-universal-8A6496 "access-control-conditions") | 3.0.0 | npm
Vanilla JS (UMD) -| [@lit-protocol/auth-helpers](https://github.com/LIT-Protocol/js-sdk/tree/master/packages/auth-helpers) | ![auth-helpers](https://img.shields.io/badge/-universal-8A6496 "auth-helpers") | 3.0.0 | npm
Vanilla JS (UMD) -| [@lit-protocol/bls-sdk](https://github.com/LIT-Protocol/js-sdk/tree/master/packages/bls-sdk) | ![bls-sdk](https://img.shields.io/badge/-universal-8A6496 "bls-sdk") | 3.0.0 | npm
Vanilla JS (UMD) -| [@lit-protocol/constants](https://github.com/LIT-Protocol/js-sdk/tree/master/packages/constants) | ![constants](https://img.shields.io/badge/-universal-8A6496 "constants") | 3.0.0 | npm
Vanilla JS (UMD) -| [@lit-protocol/contracts-sdk](https://github.com/LIT-Protocol/js-sdk/tree/master/packages/contracts-sdk) | ![contracts-sdk](https://img.shields.io/badge/-universal-8A6496 "contracts-sdk") | 3.0.0 | npm
Vanilla JS (UMD) -| [@lit-protocol/core](https://github.com/LIT-Protocol/js-sdk/tree/master/packages/core) | ![core](https://img.shields.io/badge/-universal-8A6496 "core") | 3.0.0 | npm
Vanilla JS (UMD) -| [@lit-protocol/crypto](https://github.com/LIT-Protocol/js-sdk/tree/master/packages/crypto) | ![crypto](https://img.shields.io/badge/-universal-8A6496 "crypto") | 3.0.0 | npm
Vanilla JS (UMD) -| [@lit-protocol/ecdsa-sdk](https://github.com/LIT-Protocol/js-sdk/tree/master/packages/ecdsa-sdk) | ![ecdsa-sdk](https://img.shields.io/badge/-universal-8A6496 "ecdsa-sdk") | 3.0.0 | npm
Vanilla JS (UMD) -| [@lit-protocol/encryption](https://github.com/LIT-Protocol/js-sdk/tree/master/packages/encryption) | ![encryption](https://img.shields.io/badge/-universal-8A6496 "encryption") | 3.0.0 | npm
Vanilla JS (UMD) -| [@lit-protocol/lit-third-party-libs](https://github.com/LIT-Protocol/js-sdk/tree/master/packages/lit-third-party-libs) | ![lit-third-party-libs](https://img.shields.io/badge/-universal-8A6496 "lit-third-party-libs") | 3.0.0 | npm
Vanilla JS (UMD) -| [@lit-protocol/misc](https://github.com/LIT-Protocol/js-sdk/tree/master/packages/misc) | ![misc](https://img.shields.io/badge/-universal-8A6496 "misc") | 3.0.0 | npm
Vanilla JS (UMD) -| [@lit-protocol/nacl](https://github.com/LIT-Protocol/js-sdk/tree/master/packages/nacl) | ![nacl](https://img.shields.io/badge/-universal-8A6496 "nacl") | 3.0.0 | npm
Vanilla JS (UMD) -| [@lit-protocol/pkp-base](https://github.com/LIT-Protocol/js-sdk/tree/master/packages/pkp-base) | ![pkp-base](https://img.shields.io/badge/-universal-8A6496 "pkp-base") | 3.0.0 | npm
Vanilla JS (UMD) -| [@lit-protocol/pkp-client](https://github.com/LIT-Protocol/js-sdk/tree/master/packages/pkp-client) | ![pkp-client](https://img.shields.io/badge/-universal-8A6496 "pkp-client") | 3.0.0 | npm
Vanilla JS (UMD) -| [@lit-protocol/pkp-cosmos](https://github.com/LIT-Protocol/js-sdk/tree/master/packages/pkp-cosmos) | ![pkp-cosmos](https://img.shields.io/badge/-universal-8A6496 "pkp-cosmos") | 3.0.0 | npm
Vanilla JS (UMD) -| [@lit-protocol/pkp-ethers](https://github.com/LIT-Protocol/js-sdk/tree/master/packages/pkp-ethers) | ![pkp-ethers](https://img.shields.io/badge/-universal-8A6496 "pkp-ethers") | 3.0.0 | npm
Vanilla JS (UMD) -| [@lit-protocol/pkp-sui](https://github.com/LIT-Protocol/js-sdk/tree/master/packages/pkp-sui) | ![pkp-sui](https://img.shields.io/badge/-universal-8A6496 "pkp-sui") | 3.0.0 | npm
Vanilla JS (UMD) -| [@lit-protocol/pkp-walletconnect](https://github.com/LIT-Protocol/js-sdk/tree/master/packages/pkp-walletconnect) | ![pkp-walletconnect](https://img.shields.io/badge/-universal-8A6496 "pkp-walletconnect") | 3.0.0 | npm
Vanilla JS (UMD) -| [@lit-protocol/types](https://github.com/LIT-Protocol/js-sdk/tree/master/packages/types) | ![types](https://img.shields.io/badge/-universal-8A6496 "types") | 3.0.0 | npm
Vanilla JS (UMD) -| [@lit-protocol/uint8arrays](https://github.com/LIT-Protocol/js-sdk/tree/master/packages/uint8arrays) | ![uint8arrays](https://img.shields.io/badge/-universal-8A6496 "uint8arrays") | 3.0.0 | npm
Vanilla JS (UMD) -| [@lit-protocol/auth-browser](https://github.com/LIT-Protocol/js-sdk/tree/master/packages/auth-browser) | ![auth-browser](https://img.shields.io/badge/-browser-E98869 "auth-browser") | 3.0.0 | npm
Vanilla JS (UMD) -| [@lit-protocol/misc-browser](https://github.com/LIT-Protocol/js-sdk/tree/master/packages/misc-browser) | ![misc-browser](https://img.shields.io/badge/-browser-E98869 "misc-browser") | 3.0.0 | npm
Vanilla JS (UMD) +| Package | Category | Version | Download | +| -------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------- | ------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| [@lit-protocol/access-control-conditions](https://github.com/LIT-Protocol/js-sdk/tree/master/packages/access-control-conditions) | ![access-control-conditions](https://img.shields.io/badge/-universal-8A6496 'access-control-conditions') | 3.0.0 | npm
Vanilla JS (UMD) | +| [@lit-protocol/auth-helpers](https://github.com/LIT-Protocol/js-sdk/tree/master/packages/auth-helpers) | ![auth-helpers](https://img.shields.io/badge/-universal-8A6496 'auth-helpers') | 3.0.0 | npm
Vanilla JS (UMD) | +| [@lit-protocol/bls-sdk](https://github.com/LIT-Protocol/js-sdk/tree/master/packages/bls-sdk) | ![bls-sdk](https://img.shields.io/badge/-universal-8A6496 'bls-sdk') | 3.0.0 | npm
Vanilla JS (UMD) | +| [@lit-protocol/constants](https://github.com/LIT-Protocol/js-sdk/tree/master/packages/constants) | ![constants](https://img.shields.io/badge/-universal-8A6496 'constants') | 3.0.0 | npm
Vanilla JS (UMD) | +| [@lit-protocol/contracts-sdk](https://github.com/LIT-Protocol/js-sdk/tree/master/packages/contracts-sdk) | ![contracts-sdk](https://img.shields.io/badge/-universal-8A6496 'contracts-sdk') | 3.0.0 | npm
Vanilla JS (UMD) | +| [@lit-protocol/core](https://github.com/LIT-Protocol/js-sdk/tree/master/packages/core) | ![core](https://img.shields.io/badge/-universal-8A6496 'core') | 3.0.0 | npm
Vanilla JS (UMD) | +| [@lit-protocol/crypto](https://github.com/LIT-Protocol/js-sdk/tree/master/packages/crypto) | ![crypto](https://img.shields.io/badge/-universal-8A6496 'crypto') | 3.0.0 | npm
Vanilla JS (UMD) | +| [@lit-protocol/ecdsa-sdk](https://github.com/LIT-Protocol/js-sdk/tree/master/packages/ecdsa-sdk) | ![ecdsa-sdk](https://img.shields.io/badge/-universal-8A6496 'ecdsa-sdk') | 3.0.0 | npm
Vanilla JS (UMD) | +| [@lit-protocol/encryption](https://github.com/LIT-Protocol/js-sdk/tree/master/packages/encryption) | ![encryption](https://img.shields.io/badge/-universal-8A6496 'encryption') | 3.0.0 | npm
Vanilla JS (UMD) | +| [@lit-protocol/lit-third-party-libs](https://github.com/LIT-Protocol/js-sdk/tree/master/packages/lit-third-party-libs) | ![lit-third-party-libs](https://img.shields.io/badge/-universal-8A6496 'lit-third-party-libs') | 3.0.0 | npm
Vanilla JS (UMD) | +| [@lit-protocol/misc](https://github.com/LIT-Protocol/js-sdk/tree/master/packages/misc) | ![misc](https://img.shields.io/badge/-universal-8A6496 'misc') | 3.0.0 | npm
Vanilla JS (UMD) | +| [@lit-protocol/nacl](https://github.com/LIT-Protocol/js-sdk/tree/master/packages/nacl) | ![nacl](https://img.shields.io/badge/-universal-8A6496 'nacl') | 3.0.0 | npm
Vanilla JS (UMD) | +| [@lit-protocol/pkp-base](https://github.com/LIT-Protocol/js-sdk/tree/master/packages/pkp-base) | ![pkp-base](https://img.shields.io/badge/-universal-8A6496 'pkp-base') | 3.0.0 | npm
Vanilla JS (UMD) | +| [@lit-protocol/pkp-client](https://github.com/LIT-Protocol/js-sdk/tree/master/packages/pkp-client) | ![pkp-client](https://img.shields.io/badge/-universal-8A6496 'pkp-client') | 3.0.0 | npm
Vanilla JS (UMD) | +| [@lit-protocol/pkp-cosmos](https://github.com/LIT-Protocol/js-sdk/tree/master/packages/pkp-cosmos) | ![pkp-cosmos](https://img.shields.io/badge/-universal-8A6496 'pkp-cosmos') | 3.0.0 | npm
Vanilla JS (UMD) | +| [@lit-protocol/pkp-ethers](https://github.com/LIT-Protocol/js-sdk/tree/master/packages/pkp-ethers) | ![pkp-ethers](https://img.shields.io/badge/-universal-8A6496 'pkp-ethers') | 3.0.0 | npm
Vanilla JS (UMD) | +| [@lit-protocol/pkp-sui](https://github.com/LIT-Protocol/js-sdk/tree/master/packages/pkp-sui) | ![pkp-sui](https://img.shields.io/badge/-universal-8A6496 'pkp-sui') | 3.0.0 | npm
Vanilla JS (UMD) | +| [@lit-protocol/pkp-walletconnect](https://github.com/LIT-Protocol/js-sdk/tree/master/packages/pkp-walletconnect) | ![pkp-walletconnect](https://img.shields.io/badge/-universal-8A6496 'pkp-walletconnect') | 3.0.0 | npm
Vanilla JS (UMD) | +| [@lit-protocol/types](https://github.com/LIT-Protocol/js-sdk/tree/master/packages/types) | ![types](https://img.shields.io/badge/-universal-8A6496 'types') | 3.0.0 | npm
Vanilla JS (UMD) | +| [@lit-protocol/uint8arrays](https://github.com/LIT-Protocol/js-sdk/tree/master/packages/uint8arrays) | ![uint8arrays](https://img.shields.io/badge/-universal-8A6496 'uint8arrays') | 3.0.0 | npm
Vanilla JS (UMD) | +| [@lit-protocol/auth-browser](https://github.com/LIT-Protocol/js-sdk/tree/master/packages/auth-browser) | ![auth-browser](https://img.shields.io/badge/-browser-E98869 'auth-browser') | 3.0.0 | npm
Vanilla JS (UMD) | +| [@lit-protocol/misc-browser](https://github.com/LIT-Protocol/js-sdk/tree/master/packages/misc-browser) | ![misc-browser](https://img.shields.io/badge/-browser-E98869 'misc-browser') | 3.0.0 | npm
Vanilla JS (UMD) | @@ -130,7 +128,7 @@ http://docs.lit-js-sdk-v2.litprotocol.com/
- NX Console: https://nx.dev/core-features/integrate-with-editors -# Quick Start +# Quick Start The following commands will help you start developing with this repository. @@ -212,7 +210,6 @@ yarn delete:app yarn delete:package ``` - ## Building ```jsx @@ -247,13 +244,13 @@ Run `yarn bump` to bump the version. You must have at least nodejs v18 to do thi ### to npm -``` +```sh yarn publish:packages ``` ### clone & publish to npm -```jsx +```sh yarn tools --clone <(?) --publish> <(?) --remove-after> // eg @@ -262,7 +259,7 @@ yarn tools --clone lit-node-client @litprotocol/dev --publish --remove-after ## bump, build, test, gen docs, publish, git push -``` +```sh yarn bump yarn build yarn test:unit @@ -280,7 +277,7 @@ git push The following will serve the react testing app and launch the cypress e2e testing after -``` +```sh yarn test:e2e ``` @@ -318,6 +315,37 @@ yarn tools --test --e2e html yarn tools --test --e2e react ``` +## Testing with a Local Lit Node + +First, deploy your Lit Node Contracts, since the correct addresses will be pulled from the `../lit-assets/blockchain/contracts/deployed-lit-node-contracts-temp.json` file. + +Set these two env vars: + +```sh +export LIT_JS_SDK_LOCAL_NODE_DEV="true" +export LIT_JS_SDK_FUNDED_WALLET_PRIVATE_KEY="putAFundedPrivateKeyOnChronicleHere" +``` + +Run: + +```sh +yarn update:contracts-sdk --fetch +yarn update:contracts-sdk --gen +yarn build:packages +``` + +To run manual tests: + +```sh + yarn nx run nodejs:serve +``` + +## ENV Vars + +- LIT_JS_SDK_GITHUB_ACCESS_TOKEN - a github access token to get the contract ABIs from a private repo +- LIT_JS_SDK_LOCAL_NODE_DEV - set to true to use a local node +- LIT_JS_SDK_FUNDED_WALLET_PRIVATE_KEY - set to a funded wallet on Chronicle Testnet + ## Other Commands ### Interactive graph dependencies using NX diff --git a/apps/html/index.html b/apps/html/index.html index b99eea0d55..fd358c8e9d 100644 --- a/apps/html/index.html +++ b/apps/html/index.html @@ -1,4 +1,4 @@ - + @@ -62,7 +62,7 @@ - (HTML) THIS FILE IS AUTOMATICALLY GENERATED FROM tools/scripts/gen-html.mjs Wed, 13 Sep 2023 15:40:07 GMT + (HTML) THIS FILE IS AUTOMATICALLY GENERATED FROM tools/scripts/gen-html.mjs Thu, 14 Sep 2023 05:53:44 GMT diff --git a/apps/nodejs/manual-test.ts b/apps/nodejs/manual-test.ts index a6c1082cc7..6db6365b30 100644 --- a/apps/nodejs/manual-test.ts +++ b/apps/nodejs/manual-test.ts @@ -1,96 +1,98 @@ -import * as litNodeClient from '@lit-protocol/lit-node-client'; +import { LitContracts } from '@lit-protocol/contracts-sdk'; +import * as LitJsSdk from '@lit-protocol/lit-node-client'; // import { LitContracts } from '@lit-protocol/contracts-sdk'; -// import { ethers } from 'ethers'; - -// // *********************************************** -// // Configuration for this test -// // *********************************************** -// const TEST_FUNDED_PRIVATE_KEY = -// '3dfb4f70b15b6fccc786347aaea445f439a7f10fd10c55dd50cafc3d5a0abac1'; -// const PKP_PUBKEY = -// '0x0447972cdf33b1b0329c3ddeea661c023e6b251d8b1aeaa92da881cc6d0d1eff22c2cbd6a5fead8ba860064881cdaabd7176ca2cade0d50829460d729bd13514f3'; -// const CONTROLLER_AUTHSIG = { -// sig: '0x694a3ff6e16ab7d7189b7507df9b73ec118d1966abad7f0e3984df19991ddc2d558abca2fcc5b4acfb710d455c63ca2ad538f4d603d64bd93a1f124b119eac031b', -// derivedVia: 'web3.eth.personal.sign', -// signedMessage: -// 'demo-encrypt-decrypt-react.vercel.app wants you to sign in with your Ethereum account:\n0x1cD4147AF045AdCADe6eAC4883b9310FD286d95a\n\n\nURI: https://demo-encrypt-decrypt-react.vercel.app/\nVersion: 1\nChain ID: 1\nNonce: MrgYgnIW5yHCTKetV\nIssued At: 2022-12-14T02:29:48.420Z\nExpiration Time: 2022-12-21T02:29:48.401Z', -// address: '0x1cd4147af045adcade6eac4883b9310fd286d95a', -// }; - -// console.log( -// '------------------------------ litNodeClientTest ------------------------------' -// ); -// // globalThis.crypto = require('crypto').webcrypto; -// // globalThis.Blob = require('node:buffer').Blob; - -// // ================================== -// // Business Logic -// // ================================== -// const runLogic = async (contract: LitContracts) => { -// let mintCost; -// let tx; - -// await contract.connect(); - -// // ------------------------------------------------------ -// // only run this if it's a pkp wallet -// // ------------------------------------------------------ -// if ('rpcProvider' in contract.signer) { -// console.log("It's a PKP Wallet"); -// const pkpWallet = await setupPKP(); - -// mintCost = await contract.pkpNftContract.read.mintCost(); -// console.log('mintCost:', mintCost.toString()); - -// tx = await contract.pkpNftContract.write.populateTransaction.mintNext(2, { -// value: mintCost, -// }); -// console.log('tx:', tx); - -// const signedTx = await pkpWallet.signTransaction(tx); -// console.log('signedTx:', signedTx); - -// const sentTx = await pkpWallet.sendTransaction(signedTx as any); -// console.log('sentTx:', sentTx); - -// const res = await sentTx.wait(); -// console.log('res:', res); -// return; -// } - -// // ------------------------------------------- -// // regular minting process -// // ------------------------------------------- -// try { -// mintCost = await contract.pkpNftContract.read.mintCost(); -// console.log('mintCost:', mintCost.toString()); -// } catch (e) { -// console.error('Failed to get mint cost'); -// console.log(e); -// } -// try { -// tx = await contract.pkpNftContract.write.mintNext(2, { -// value: mintCost, -// }); -// console.log('tx:', tx); - -// const res = await tx.wait(); -// console.log('res:', res); -// } catch (e: any) { -// console.error('Failed to mintNext:', e.message); -// } -// // wait 1 second -// await new Promise((resolve) => setTimeout(resolve, 1000)); -// }; +import { ethers } from 'ethers'; +import { PKPEthersWallet } from '@lit-protocol/pkp-ethers'; +import { SiweMessage } from 'lit-siwe'; +import { LIT_EVM_CHAINS } from '@lit-protocol/constants'; + + + +// *********************************************** +// Configuration for this test +// *********************************************** +const TEST_FUNDED_PRIVATE_KEY = + process.env.LIT_JS_SDK_FUNDED_WALLET_PRIVATE_KEY; + +console.log( + '------------------------------ litNodeClientTest ------------------------------' +); +// globalThis.crypto = require('crypto').webcrypto; +// globalThis.Blob = require('node:buffer').Blob; + +// ================================== +// Business Logic +// ================================== +const runLogic = async (contract: LitContracts) => { + let mintCost; + let tx; + + await contract.connect(); + + // ------------------------------------------------------ + // only run this if it's a pkp wallet + // ------------------------------------------------------ + // if ('rpcProvider' in contract.signer) { + // console.log("It's a PKP Wallet"); + // const pkpWallet = await setupPKP(); + + // mintCost = await contract.pkpNftContract.read.mintCost(); + // console.log('mintCost:', mintCost.toString()); + + // tx = await contract.pkpNftContract.write.mintNext(2, { + // value: mintCost, + // }); + // console.log('tx:', tx); + + // const signedTx = await pkpWallet.signTransaction(tx); + // console.log('signedTx:', signedTx); + + // const sentTx = await pkpWallet.sendTransaction(signedTx as any); + // console.log('sentTx:', sentTx); + + // const res = await sentTx.wait(); + // console.log('res:', res); + // return; + // } + + // ------------------------------------------- + // regular minting process + // ------------------------------------------- + try { + mintCost = await contract.pkpNftContract.read.mintCost(); + console.log('mintCost:', mintCost.toString()); + } catch (e) { + console.error('Failed to get mint cost'); + console.log(e); + } + + let pkpPubkey; + try { + tx = await contract.pkpNftContract.write.mintNext(2, { + value: mintCost, + }); + console.log('tx:', tx); + + const res = await tx.wait(); + console.log('res:', res); + let pkpMintedEvent = res.events.find(event => event.event === "PKPMinted"); + console.log('pkpMintedEvent:', pkpMintedEvent); + pkpPubkey = pkpMintedEvent.args.pubkey; + } catch (e: any) { + console.error('Failed to mintNext:', e.message); + } + // wait 1 second + await new Promise((resolve) => setTimeout(resolve, 1000)); + return pkpPubkey; +}; -// // ============================= -// // PKP Setup -// // ============================= +// ============================= +// PKP Setup +// ============================= // const setupPKP = async () => { -// const pkpWallet = new PKPWallet({ +// const pkpWallet = new PKPEthersWallet({ // pkpPubKey: PKP_PUBKEY, // controllerAuthSig: CONTROLLER_AUTHSIG, -// provider: 'https://rpc-mumbai.maticvigil.com', // }); // await pkpWallet.init(); @@ -101,9 +103,9 @@ import * as litNodeClient from '@lit-protocol/lit-node-client'; // return pkpSigner; // }; -// // =========================================== -// // random private key test -// // =========================================== +// =========================================== +// random private key test +// =========================================== // const useRandomPrivateKey = async () => { // console.warn('\n\n1. Testing random private key\n\n\n'); // const litContracts = new LitContracts({ randomPrivatekey: true }); @@ -195,7 +197,7 @@ import * as litNodeClient from '@lit-protocol/lit-node-client'; // const privateKey = TEST_FUNDED_PRIVATE_KEY; // const provider = new ethers.providers.JsonRpcProvider( -// 'https://matic-mumbai.chainstacklabs.com' +// LIT_EVM_CHAINS['chronicleTestnet'].rpcUrls[0] // ); // const signer = new ethers.Wallet(privateKey, provider); @@ -203,27 +205,175 @@ import * as litNodeClient from '@lit-protocol/lit-node-client'; // await runLogic(litContracts); // }; -// // ========================================================================= -// // Enable/Disable the function you want to test manually -// // ========================================================================= -export const manualTest = async () => { - console.log('Manual Test Here!'); - const client = new litNodeClient.LitNodeClient({ +const pkpSign = async (client, pkpPubkey, authSig) => { + // try and sign something + let sig = await client.pkpSign({ + toSign: [104, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100], // hello world in Uint8Array + pubKey: pkpPubkey, + authSig, + }); + + // console.log("sig: ", sig); + + const recoveredPk = ethers.utils.recoverPublicKey("0x" + sig.dataSigned, sig.signature); + const addr = ethers.utils.computeAddress('0x' + sig.publicKey); + const recoveredAddr = ethers.utils.computeAddress(recoveredPk); + const claimedAddr = ethers.utils.computeAddress(pkpPubkey); + + const allGood = addr === recoveredAddr && addr === claimedAddr; + + console.log('all addresses match: ', allGood); + return allGood; +} + +const litActionSign = async(client, pkpPubkey, authSig) => { + console.log('testing sig with lit actions...'); + // this code will be run on the node + const litActionCode = ` + const go = async () => { + // this requests a signature share from the Lit Node + // the signature share will be automatically returned in the HTTP response from the node + // all the params (toSign, publicKey, sigName) are passed in from the LitJsSdk.executeJs() function + await Lit.Actions.signEcdsa({ toSign, publicKey , sigName }); + await Lit.Actions.signEcdsa({ toSign, publicKey , sigName: 'sig2' }); + }; + + go(); + `; + + const signatures = await client.executeJs({ + code: litActionCode, + authSig, + // all jsParams can be used anywhere in your litActionCode + jsParams: { + // this is the string "Hello World" for testing + toSign: [72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100], + publicKey: pkpPubkey, + sigName: "sig1", + }, + }); + // console.log("signatures: ", signatures); + const { sig1, sig2 } = signatures.signatures + const sigKeys = { + sig1: { + recovered: ethers.utils.computeAddress(ethers.utils.recoverPublicKey("0x" + sig1.dataSigned, sig1.signature)), + reported: ethers.utils.computeAddress('0x' + sig1.publicKey) + }, + sig2: { + recovered: ethers.utils.computeAddress(ethers.utils.recoverPublicKey("0x" + sig2.dataSigned, sig2.signature)), + reported: ethers.utils.computeAddress('0x' + sig2.publicKey) + }, + } + + // console.log(`sigKeys: ${JSON.stringify(sigKeys, null, 2)}`) + + const pkpAddr = ethers.utils.computeAddress(pkpPubkey); + // console.log('pkpAddr:', pkpAddr) + + + let allGood = sigKeys.sig1.recovered == sigKeys.sig1.reported && sigKeys.sig2.recovered == sigKeys.sig2.reported && sigKeys.sig1.recovered == sigKeys.sig2.recovered && sigKeys.sig1.recovered == pkpAddr; + console.log('all addresses match: ', allGood); + return allGood; + } + +const mintPkpAndSign = async () => { + let client; + if (process.env.LIT_JS_SDK_LOCAL_NODE_DEV === "true") { + // use local node + client = new LitJsSdk.LitNodeClient({ + litNetwork: 'custom', + "minNodeCount": 2, + "bootstrapUrls": [ + "http://localhost:7470", + "http://localhost:7471", + "http://localhost:7472", + ], + debug: false + }); + } else { + // use cayenne + client = new LitJsSdk.LitNodeClient({ + litNetwork: 'cayenne', + debug: false + }); + } + + await client.connect(); + + const litContracts = new LitContracts({ + privateKey: TEST_FUNDED_PRIVATE_KEY, + }); + const pkpPubkey = await runLogic(litContracts); + console.log('pkpPubkey:', pkpPubkey); + + const privateKey = TEST_FUNDED_PRIVATE_KEY; + const provider = new ethers.providers.JsonRpcProvider( + LIT_EVM_CHAINS['chronicleTestnet'].rpcUrls[0] + ); + const wallet = new ethers.Wallet(privateKey, provider); + const authSig = await getAuthSig(wallet); + + let startTime = Date.now(); + let allGood = true; + const testCount = 100; + for(let i = 0; i < testCount; i++){ + console.log(`testing ${i + 1} of ${testCount}`); + let result = await pkpSign(client, pkpPubkey, authSig); + if (!result) { + allGood = false; + } + } + console.log(`it took ${(Date.now() - startTime) / 1000}s to run ${testCount} tests`) + console.log('all tests were good', allGood); + // await litActionSign(client, pkpPubkey, authSig); +} + +const getAuthSig = async (wallet) => { + const address = wallet.address; + + // Craft the SIWE message + const domain = 'localhost'; + const origin = 'https://localhost/login'; + const statement = + 'This is a test statement. You can put anything you want here.'; + const siweMessage = new SiweMessage({ + domain, + address, + statement, + uri: origin, + version: '1', + chainId: 1, + }); + const messageToSign = siweMessage.prepareMessage(); + + // Sign the message and format the authSig + const signature = await wallet.signMessage(messageToSign); + + const authSig = { + sig: signature, + derivedVia: 'web3.eth.personal.sign', + signedMessage: messageToSign, + address: address, + }; + return authSig +} + +const testLitActionJsExecution = async () => { + const client = new LitJsSdk.LitNodeClient({ litNetwork: 'cayenne', }); await client.connect(); + // generate a random wallet using ethers + let wallet = ethers.Wallet.createRandom(); + console.log('Wallet Address:', wallet.address); + const address = wallet.address; + const authSig = await getAuthSig(wallet); + const res = await client.executeJs({ targetNodeRange: 1, - authSig: { - sig: '0x721a354498677a1024fb48a78e56c68fd11ad705565933dd9ac770501cecad8811e8591453e21ab50d2579c3d2fe7b0dcbcb1b6436c67e9c6263169c182f50bd1b', - derivedVia: 'web3.eth.personal.sign', - signedMessage: - 'demo-encrypt-decrypt-react.vercel.app wants you to sign in with your Ethereum account:\n0xEDA4f4A8AbCecB28bf1663df9257Ec6F188B8107\n\n\nURI: https://demo-encrypt-decrypt-react.vercel.app/\nVersion: 1\nChain ID: 1\nNonce: hwrDnUCFsiR10S2lX\nIssued At: 2023-01-25T14:26:44.497Z\nExpiration Time: 2023-02-01T14:26:44.480Z', - address: '0xeda4f4a8abcecb28bf1663df9257ec6f188b8107', - }, - + authSig, jsParams: {}, code: `(async() => { console.log("RUN TEST BABY!"); @@ -232,4 +382,12 @@ export const manualTest = async () => { }); console.log('res:', res); +} + +// // ========================================================================= +// // Enable/Disable the function you want to test manually +// // ========================================================================= +export const manualTest = async () => { + console.log('Manual Test Here!'); + await mintPkpAndSign(); }; diff --git a/apps/react/src/app/app.tsx b/apps/react/src/app/app.tsx index 031fb3118e..3d93b90320 100644 --- a/apps/react/src/app/app.tsx +++ b/apps/react/src/app/app.tsx @@ -1802,7 +1802,7 @@ pre { `, }} /> - (REACT) THIS FILE IS AUTOMATICALLY GENERATED FROM tools/scripts/gen-react.mjs Wed, 13 Sep 2023 15:40:07 GMT + (REACT) THIS FILE IS AUTOMATICALLY GENERATED FROM tools/scripts/gen-react.mjs Thu, 14 Sep 2023 05:53:45 GMT

diff --git a/packages/contracts-sdk/fetch-contracts.mjs b/packages/contracts-sdk/fetch-contracts.mjs index f0ff452390..63ecf5463e 100644 --- a/packages/contracts-sdk/fetch-contracts.mjs +++ b/packages/contracts-sdk/fetch-contracts.mjs @@ -103,15 +103,16 @@ export const asyncForEach = async (array, callback) => { */ export const getContractAddresses = async (LitConfig) => { // get deployed contract addresses - const contractAddresses = JSON.parse( - await fetch(LitConfig.contracts, { - headers: LitConfig.abis.isPrivate - ? { - Authorization: `token ${LitConfig.abis.token}`, - } - : {}, - }).then((res) => res.text()) - ); + let contractAddresses; + if (process.env.LIT_JS_SDK_LOCAL_NODE_DEV === 'true') { + // get contracts from local filesystem + contractAddresses = await readJsonFile(LitConfig.contractsLocal); + } else { + // get contracts from remote + contractAddresses = JSON.parse( + await fetch(LitConfig.contracts).then((res) => res.text()) + ); + } Object.entries(contractAddresses).forEach(([key, value]) => { if (key.includes('ContractAddress')) return; @@ -133,7 +134,8 @@ export const getContractAddresses = async (LitConfig) => { correctedName = correctedName.replace('Nft', 'NFT'); correctedName = correctedName.replace('Lit', 'LIT'); correctedName = correctedName.replace('Resolver', 'ContractResolver'); - if (correctedName == "HdKeyDeriver"){ // dont process the contract with name as it is internally used wihtin `PubkeyRouter` + if (correctedName == 'HdKeyDeriver') { + // dont process the contract with name as it is internally used wihtin `PubkeyRouter` return; } if (correctedName === 'ContractResolver') { @@ -142,7 +144,12 @@ export const getContractAddresses = async (LitConfig) => { // append .json // correctedName = correctedName - let abiPath = LitConfig.root + LitConfig.abis.dir + correctedName + '.json'; + let abiPath; + if (process.env.LIT_JS_SDK_LOCAL_NODE_DEV === 'true') { + abiPath = LitConfig.abis.dirLocal + correctedName + '.json'; + } else { + abiPath = LitConfig.root + LitConfig.abis.dir + correctedName + '.json'; + } contracts.push({ name: item[0], @@ -169,14 +176,20 @@ await asyncForEach(deployedContracts, async (contract) => { let json; try { - json = await fetch(contract.abiPath, { - headers: LitConfig.abis.isPrivate - ? { - Authorization: `token ${LitConfig.abis.token}`, - } - : {}, - }).then((res) => res.text()); - json = JSON.parse(json); + if (process.env.LIT_JS_SDK_LOCAL_NODE_DEV === 'true') { + // get from local filesystem + json = await readJsonFile(contract.abiPath); + } else { + // get from remote + json = await fetch(contract.abiPath, { + headers: LitConfig.abis.isPrivate + ? { + Authorization: `token ${process.env.LIT_JS_SDK_GITHUB_ACCESS_TOKEN}`, + } + : {}, + }).then((res) => res.text()); + json = JSON.parse(json); + } } catch (e) { redLog(`Failed to fetch ${contract.abiPath}`); } diff --git a/packages/contracts-sdk/lit-contracts.config.json b/packages/contracts-sdk/lit-contracts.config.json index fc3b7f86bb..d402e1b8bb 100644 --- a/packages/contracts-sdk/lit-contracts.config.json +++ b/packages/contracts-sdk/lit-contracts.config.json @@ -4,7 +4,8 @@ "abis": { "dir": "abis/", "ignoreProperties": ["metadata", "bytecode", "deployedBytecode"], - "token": "", - "isPrivate": true - } + "isPrivate": true, + "dirLocal": "../lit-assets/rust/lit-core/lit-blockchain/abis/" + }, + "contractsLocal": "../lit-assets/blockchain/contracts/deployed-lit-node-contracts-temp.json" } diff --git a/packages/contracts-sdk/src/abis/Allowlist.data.ts b/packages/contracts-sdk/src/abis/Allowlist.data.ts index ca6c61ca4f..1bfa7bf746 100644 --- a/packages/contracts-sdk/src/abis/Allowlist.data.ts +++ b/packages/contracts-sdk/src/abis/Allowlist.data.ts @@ -1,5 +1,5 @@ export const allowlist = { - "address": "0x01385531dF2397425acb2Dffd3fA5Fd76729504a", + "address": "0x9fb501502402Fe4A8CE44c8C39a5d63787ED653c", "abi": [ { "inputs": [], diff --git a/packages/contracts-sdk/src/abis/ContractResolver.data.ts b/packages/contracts-sdk/src/abis/ContractResolver.data.ts index bb34896e4a..4a4b1e3755 100644 --- a/packages/contracts-sdk/src/abis/ContractResolver.data.ts +++ b/packages/contracts-sdk/src/abis/ContractResolver.data.ts @@ -1,5 +1,5 @@ export const contractResolver = { - "address": "0x0bca885Cf322D0E478DC48Fb84b4f522144db9D7", + "address": "0x53Df74f2Ca020ab439002158e6De0A32b1AA66D1", "abi": [ { "inputs": [ diff --git a/packages/contracts-sdk/src/abis/Multisender.data.ts b/packages/contracts-sdk/src/abis/Multisender.data.ts index b1fc7b216a..fb4f0d4602 100644 --- a/packages/contracts-sdk/src/abis/Multisender.data.ts +++ b/packages/contracts-sdk/src/abis/Multisender.data.ts @@ -1,5 +1,5 @@ export const multisender = { - "address": "0x373195723448308d43a43989790C0b768Ef14853", + "address": "0xacAe3822240234d8Ebbb591787a2E2b6247Ce63e", "abi": [ { "anonymous": false, diff --git a/packages/contracts-sdk/src/abis/PKPHelper.data.ts b/packages/contracts-sdk/src/abis/PKPHelper.data.ts index 840a094d6a..38a296906c 100644 --- a/packages/contracts-sdk/src/abis/PKPHelper.data.ts +++ b/packages/contracts-sdk/src/abis/PKPHelper.data.ts @@ -1,5 +1,5 @@ export const pkpHelper = { - "address": "0xA8C519a051b85A2010C498145C698074782AB6DF", + "address": "0x0600cBB5dc983A970b165390Da00e699E5baeDD1", "abi": [ { "inputs": [ diff --git a/packages/contracts-sdk/src/abis/PKPNFT.data.ts b/packages/contracts-sdk/src/abis/PKPNFT.data.ts index 6cda8932e1..484a2c089e 100644 --- a/packages/contracts-sdk/src/abis/PKPNFT.data.ts +++ b/packages/contracts-sdk/src/abis/PKPNFT.data.ts @@ -1,5 +1,5 @@ export const pkpNft = { - "address": "0xBBaa35e9b4a38c8f639d25f49c529967Ffeb0C06", + "address": "0x0122829576DDd317c44364238f5DDe205d6da25F", "abi": [ { "inputs": [ diff --git a/packages/contracts-sdk/src/abis/PKPNFTMetadata.data.ts b/packages/contracts-sdk/src/abis/PKPNFTMetadata.data.ts index 834096c8cb..9479797b8b 100644 --- a/packages/contracts-sdk/src/abis/PKPNFTMetadata.data.ts +++ b/packages/contracts-sdk/src/abis/PKPNFTMetadata.data.ts @@ -1,5 +1,5 @@ export const pkpNftMetadata = { - "address": "0xa7F9bDf4fF1aEb9C1AB41E965610Df5699b09D68", + "address": "0xFB7eeE9859eA34D06962f4362FA7B4E294039B05", "abi": [ { "inputs": [ diff --git a/packages/contracts-sdk/src/abis/PKPPermissions.data.ts b/packages/contracts-sdk/src/abis/PKPPermissions.data.ts index 8344792ad5..cb8614285d 100644 --- a/packages/contracts-sdk/src/abis/PKPPermissions.data.ts +++ b/packages/contracts-sdk/src/abis/PKPPermissions.data.ts @@ -1,5 +1,5 @@ export const pkpPermissions = { - "address": "0x61Dc305F03cFF5Ba8f39D5F8F9BE2D3298e8aE38", + "address": "0x05A6d463c73adA7A0D3Af317Cd68271e5E34bCd4", "abi": [ { "inputs": [ diff --git a/packages/contracts-sdk/src/abis/PubkeyRouter.data.ts b/packages/contracts-sdk/src/abis/PubkeyRouter.data.ts index 83821d12ec..2a1972cf76 100644 --- a/packages/contracts-sdk/src/abis/PubkeyRouter.data.ts +++ b/packages/contracts-sdk/src/abis/PubkeyRouter.data.ts @@ -1,5 +1,5 @@ export const pubkeyRouter = { - "address": "0xb26b4DC365843cDaE996F526913D3D4F45343aE8", + "address": "0x9da98532bd3b7cDDA18ae34DFeCdeBBb75AC3F7D", "abi": [ { "inputs": [ diff --git a/packages/contracts-sdk/src/abis/RateLimitNFT.data.ts b/packages/contracts-sdk/src/abis/RateLimitNFT.data.ts index b4698b29a0..77e7d91070 100644 --- a/packages/contracts-sdk/src/abis/RateLimitNFT.data.ts +++ b/packages/contracts-sdk/src/abis/RateLimitNFT.data.ts @@ -1,5 +1,5 @@ export const rateLimitNft = { - "address": "0x8624EE1100B45DD3e55B7399446CbF01ab5Db333", + "address": "0x4B15DAC8f60fC2B5A691A13bD5eC26aaa0f50a0b", "abi": [ { "inputs": [], diff --git a/packages/contracts-sdk/src/abis/Staking.data.ts b/packages/contracts-sdk/src/abis/Staking.data.ts index 558f72ce28..084b7b1dd5 100644 --- a/packages/contracts-sdk/src/abis/Staking.data.ts +++ b/packages/contracts-sdk/src/abis/Staking.data.ts @@ -1,5 +1,5 @@ export const staking = { - "address": "0x07A5bE9e0Aa724563e904B5e7AF37921e193f801", + "address": "0x187e8770A9ad58a83b3A619ba9bb3629dA6E25B1", "abi": [ { "inputs": [ @@ -1195,13 +1195,6 @@ export const staking = { "stateMutability": "view", "type": "function" }, - { - "inputs": [], - "name": "pauseEpoch", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, { "inputs": [ { diff --git a/packages/contracts-sdk/src/abis/Staking.json b/packages/contracts-sdk/src/abis/Staking.json index b9e185facf..eeb99b6152 100644 --- a/packages/contracts-sdk/src/abis/Staking.json +++ b/packages/contracts-sdk/src/abis/Staking.json @@ -1193,13 +1193,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [], - "name": "pauseEpoch", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, { "inputs": [ { diff --git a/packages/contracts-sdk/src/abis/Staking.ts b/packages/contracts-sdk/src/abis/Staking.ts index 5443260f8e..2406bf4677 100755 --- a/packages/contracts-sdk/src/abis/Staking.ts +++ b/packages/contracts-sdk/src/abis/Staking.ts @@ -135,7 +135,6 @@ export type StakingMethodNames = | 'nextValidatorCountForConsensus' | 'nodeAddressToStakerAddress' | 'owner' - | 'pauseEpoch' | 'readyForNextEpoch' | 'renounceOwnership' | 'requestToJoin' @@ -608,15 +607,6 @@ export interface Staking { * Type: function */ owner(overrides?: ContractCallOverrides): Promise; - /** - * Payable: false - * Constant: false - * StateMutability: nonpayable - * Type: function - */ - pauseEpoch( - overrides?: ContractTransactionOverrides - ): Promise; /** * Payable: false * Constant: true diff --git a/packages/contracts-sdk/src/abis/StakingBalances.data.ts b/packages/contracts-sdk/src/abis/StakingBalances.data.ts index 5c93b5d5e3..6f6355dc70 100644 --- a/packages/contracts-sdk/src/abis/StakingBalances.data.ts +++ b/packages/contracts-sdk/src/abis/StakingBalances.data.ts @@ -1,5 +1,5 @@ export const stakingBalances = { - "address": "0xAB783F4B8ceD3f98Adc169d50F1063dD0517EEA8", + "address": "0x23Ab8F5cD37be7B6036a17fD75A842533d2D39d0", "abi": [ { "inputs": [ diff --git a/packages/contracts-sdk/src/deployed-contracts.json b/packages/contracts-sdk/src/deployed-contracts.json index 9ac2458a7b..bba63de850 100644 --- a/packages/contracts-sdk/src/deployed-contracts.json +++ b/packages/contracts-sdk/src/deployed-contracts.json @@ -3,84 +3,84 @@ "name": "stakingBalancesContractAddress", "correctedName": "StakingBalances", "exportName": "stakingBalances", - "abiPath": "https://raw.githubusercontent.com/LIT-Protocol/lit-assets/develop/rust/lit-core/lit-blockchain/abis/StakingBalances.json", - "address": "0xAB783F4B8ceD3f98Adc169d50F1063dD0517EEA8" + "abiPath": "../lit-assets/rust/lit-core/lit-blockchain/abis/StakingBalances.json", + "address": "0x23Ab8F5cD37be7B6036a17fD75A842533d2D39d0" }, { "name": "stakingContractAddress", "correctedName": "Staking", "exportName": "staking", - "abiPath": "https://raw.githubusercontent.com/LIT-Protocol/lit-assets/develop/rust/lit-core/lit-blockchain/abis/Staking.json", - "address": "0x07A5bE9e0Aa724563e904B5e7AF37921e193f801" + "abiPath": "../lit-assets/rust/lit-core/lit-blockchain/abis/Staking.json", + "address": "0x187e8770A9ad58a83b3A619ba9bb3629dA6E25B1" }, { "name": "multisenderContractAddress", "correctedName": "Multisender", "exportName": "multisender", - "abiPath": "https://raw.githubusercontent.com/LIT-Protocol/lit-assets/develop/rust/lit-core/lit-blockchain/abis/Multisender.json", - "address": "0x373195723448308d43a43989790C0b768Ef14853" + "abiPath": "../lit-assets/rust/lit-core/lit-blockchain/abis/Multisender.json", + "address": "0xacAe3822240234d8Ebbb591787a2E2b6247Ce63e" }, { "name": "litTokenContractAddress", "correctedName": "LITToken", "exportName": "litToken", - "abiPath": "https://raw.githubusercontent.com/LIT-Protocol/lit-assets/develop/rust/lit-core/lit-blockchain/abis/LITToken.json", + "abiPath": "../lit-assets/rust/lit-core/lit-blockchain/abis/LITToken.json", "address": "0x53695556f8a1a064EdFf91767f15652BbfaFaD04" }, { "name": "pubkeyRouterContractAddress", "correctedName": "PubkeyRouter", "exportName": "pubkeyRouter", - "abiPath": "https://raw.githubusercontent.com/LIT-Protocol/lit-assets/develop/rust/lit-core/lit-blockchain/abis/PubkeyRouter.json", - "address": "0xb26b4DC365843cDaE996F526913D3D4F45343aE8" + "abiPath": "../lit-assets/rust/lit-core/lit-blockchain/abis/PubkeyRouter.json", + "address": "0x9da98532bd3b7cDDA18ae34DFeCdeBBb75AC3F7D" }, { "name": "pkpNftContractAddress", "correctedName": "PKPNFT", "exportName": "pkpNft", - "abiPath": "https://raw.githubusercontent.com/LIT-Protocol/lit-assets/develop/rust/lit-core/lit-blockchain/abis/PKPNFT.json", - "address": "0xBBaa35e9b4a38c8f639d25f49c529967Ffeb0C06" + "abiPath": "../lit-assets/rust/lit-core/lit-blockchain/abis/PKPNFT.json", + "address": "0x0122829576DDd317c44364238f5DDe205d6da25F" }, { "name": "rateLimitNftContractAddress", "correctedName": "RateLimitNFT", "exportName": "rateLimitNft", - "abiPath": "https://raw.githubusercontent.com/LIT-Protocol/lit-assets/develop/rust/lit-core/lit-blockchain/abis/RateLimitNFT.json", - "address": "0x8624EE1100B45DD3e55B7399446CbF01ab5Db333" + "abiPath": "../lit-assets/rust/lit-core/lit-blockchain/abis/RateLimitNFT.json", + "address": "0x4B15DAC8f60fC2B5A691A13bD5eC26aaa0f50a0b" }, { "name": "pkpHelperContractAddress", "correctedName": "PKPHelper", "exportName": "pkpHelper", - "abiPath": "https://raw.githubusercontent.com/LIT-Protocol/lit-assets/develop/rust/lit-core/lit-blockchain/abis/PKPHelper.json", - "address": "0xA8C519a051b85A2010C498145C698074782AB6DF" + "abiPath": "../lit-assets/rust/lit-core/lit-blockchain/abis/PKPHelper.json", + "address": "0x0600cBB5dc983A970b165390Da00e699E5baeDD1" }, { "name": "pkpPermissionsContractAddress", "correctedName": "PKPPermissions", "exportName": "pkpPermissions", - "abiPath": "https://raw.githubusercontent.com/LIT-Protocol/lit-assets/develop/rust/lit-core/lit-blockchain/abis/PKPPermissions.json", - "address": "0x61Dc305F03cFF5Ba8f39D5F8F9BE2D3298e8aE38" + "abiPath": "../lit-assets/rust/lit-core/lit-blockchain/abis/PKPPermissions.json", + "address": "0x05A6d463c73adA7A0D3Af317Cd68271e5E34bCd4" }, { "name": "pkpNftMetadataContractAddress", "correctedName": "PKPNFTMetadata", "exportName": "pkpNftMetadata", - "abiPath": "https://raw.githubusercontent.com/LIT-Protocol/lit-assets/develop/rust/lit-core/lit-blockchain/abis/PKPNFTMetadata.json", - "address": "0xa7F9bDf4fF1aEb9C1AB41E965610Df5699b09D68" + "abiPath": "../lit-assets/rust/lit-core/lit-blockchain/abis/PKPNFTMetadata.json", + "address": "0xFB7eeE9859eA34D06962f4362FA7B4E294039B05" }, { "name": "allowlistContractAddress", "correctedName": "Allowlist", "exportName": "allowlist", - "abiPath": "https://raw.githubusercontent.com/LIT-Protocol/lit-assets/develop/rust/lit-core/lit-blockchain/abis/Allowlist.json", - "address": "0x01385531dF2397425acb2Dffd3fA5Fd76729504a" + "abiPath": "../lit-assets/rust/lit-core/lit-blockchain/abis/Allowlist.json", + "address": "0x9fb501502402Fe4A8CE44c8C39a5d63787ED653c" }, { "name": "resolverContractAddress", "correctedName": "ContractResolver", "exportName": "contractResolver", - "abiPath": "https://raw.githubusercontent.com/LIT-Protocol/lit-assets/develop/rust/lit-core/lit-blockchain/abis/ContractResolver.json", - "address": "0x0bca885Cf322D0E478DC48Fb84b4f522144db9D7" + "abiPath": "../lit-assets/rust/lit-core/lit-blockchain/abis/ContractResolver.json", + "address": "0x53Df74f2Ca020ab439002158e6De0A32b1AA66D1" } ] \ No newline at end of file diff --git a/packages/lit-auth-client/src/lib/providers/BaseProvider.ts b/packages/lit-auth-client/src/lib/providers/BaseProvider.ts index 113a62c439..6cf450875e 100644 --- a/packages/lit-auth-client/src/lib/providers/BaseProvider.ts +++ b/packages/lit-auth-client/src/lib/providers/BaseProvider.ts @@ -188,8 +188,8 @@ export abstract class BaseProvider { * @param claimRequest * @returns {Promise} - Response from the network for the claim */ - public async claimKeyId( - claimRequest: ClaimRequest + public async claimKeyId( + claimRequest: ClaimRequest ): Promise { if (!this.litNodeClient.ready) { await this.litNodeClient.connect().catch((err) => { @@ -197,7 +197,7 @@ export abstract class BaseProvider { }); } - const res = await this.litNodeClient.claimKeyId(claimRequest); + const res = await this.litNodeClient.claimKeyId(claimRequest); return res; } diff --git a/packages/lit-node-client-nodejs/src/lib/lit-node-client-nodejs.ts b/packages/lit-node-client-nodejs/src/lib/lit-node-client-nodejs.ts index 5154161d4e..d0161f73e8 100644 --- a/packages/lit-node-client-nodejs/src/lib/lit-node-client-nodejs.ts +++ b/packages/lit-node-client-nodejs/src/lib/lit-node-client-nodejs.ts @@ -798,7 +798,7 @@ export class LitNodeClientNodeJs extends LitCore { this.getLitActionRequestBody(params); // -- choose the right signature - let sigToPassToNode = this.getAuthSigOrSessionAuthSig({ + const sigToPassToNode = this.getAuthSigOrSessionAuthSig({ authSig, sessionSigs, url, @@ -807,7 +807,7 @@ export class LitNodeClientNodeJs extends LitCore { reqBody.authSig = sigToPassToNode; // this return { url: string, data: JsonRequest } - let singleNodePromise = this.getJsExecutionShares( + const singleNodePromise = this.getJsExecutionShares( url, reqBody, requestId @@ -816,10 +816,10 @@ export class LitNodeClientNodeJs extends LitCore { nodePromises.push(singleNodePromise); } - const handledPromise = await this.handleNodePromises( + const handledPromise = (await this.handleNodePromises( nodePromises, targetNodeRange - ); + )) as SuccessNodePromises | RejectedNodePromises; // -- handle response return handledPromise; @@ -827,28 +827,45 @@ export class LitNodeClientNodeJs extends LitCore { // ========== Shares Resolvers ========== _getFlattenShare = (share: any): SigShare => { - // flatten the signature object so that the properties of the signature are top level const flattenObj = Object.entries(share).map(([key, item]) => { - if (item === null || item === undefined) { return null; } const typedItem = item as SigShare; - const requiredShareProps = ['sigType', 'dataSigned', 'signatureShare', 'shareIndex', 'bigR', 'publicKey'] - - const requiredSessionSigsShareProps = [...requiredShareProps, 'siweMessage'] as const; - - const requiredSignatureShareProps = [...requiredShareProps, 'sigName'] as const; + const requiredShareProps = [ + 'sigType', + 'dataSigned', + 'signatureShare', + 'shareIndex', + 'bigR', + 'publicKey', + ]; + + const requiredSessionSigsShareProps = [ + ...requiredShareProps, + 'siweMessage', + ] as const; + + const requiredSignatureShareProps = [ + ...requiredShareProps, + 'sigName', + ] as const; const hasProps = (props: any) => { - return [...props].every(prop => typedItem[prop as keyof SigShare] !== undefined && typedItem[prop as keyof SigShare] !== null) - } - - if (hasProps(requiredSessionSigsShareProps) || hasProps(requiredSignatureShareProps)) { + return [...props].every( + (prop) => + typedItem[prop as keyof SigShare] !== undefined && + typedItem[prop as keyof SigShare] !== null + ); + }; + if ( + hasProps(requiredSessionSigsShareProps) || + hasProps(requiredSignatureShareProps) + ) { typedItem.signatureShare = typedItem.signatureShare.replaceAll('"', ''); typedItem.bigR = typedItem.bigR.replaceAll('"', ''); typedItem.publicKey = typedItem.publicKey.replaceAll('"', ''); @@ -861,14 +878,15 @@ export class LitNodeClientNodeJs extends LitCore { }); // removed all null values and should only have one item - const flattenShare = (flattenObj.filter(item => item !== null))[0] as SigShare; - + const flattenShare = flattenObj.filter( + (item) => item !== null + )[0] as SigShare; if (flattenShare === null || flattenShare === undefined) { - return share + return share; } return flattenShare; - } + }; /** * @@ -893,9 +911,8 @@ export class LitNodeClientNodeJs extends LitCore { shares.sort((a: any, b: any) => a.shareIndex - b.shareIndex); const sigShares: Array = shares.map((s: any) => { - const share = this._getFlattenShare(s); - console.log("XX share", share) + console.log('XX share', share); return { sigType: share.sigType, @@ -905,7 +922,7 @@ export class LitNodeClientNodeJs extends LitCore { publicKey: share.publicKey, dataSigned: share.dataSigned, siweMessage: share.siweMessage, - } + }; }); log('getSessionSignatures - sigShares', sigShares); @@ -940,10 +957,10 @@ export class LitNodeClientNodeJs extends LitCore { throwError({ message: 'siganture could not be combined', errorKind: LIT_ERROR.UNKNOWN_SIGNATURE_ERROR.kind, - errorCode: LIT_ERROR.UNKNOWN_SIGNATURE_ERROR.name + errorCode: LIT_ERROR.UNKNOWN_SIGNATURE_ERROR.name, }); } - + const encodedSig = joinSignature({ r: '0x' + signature.r, s: '0x' + signature.s, @@ -986,11 +1003,9 @@ export class LitNodeClientNodeJs extends LitCore { shares.sort((a: any, b: any) => a.shareIndex - b.shareIndex); const sigShares: Array = shares.map((s: any) => { - const share = this._getFlattenShare(s); - console.log("YY share", share) - return ({ + return { sigType: share.sigType, signatureShare: share.signatureShare, shareIndex: share.shareIndex, @@ -998,7 +1013,7 @@ export class LitNodeClientNodeJs extends LitCore { publicKey: share.publicKey, dataSigned: share.dataSigned, sigName: share.sigName ? share.sigName : 'sig', - }) + }; }); log('getSignatures - sigShares', sigShares); @@ -1033,7 +1048,7 @@ export class LitNodeClientNodeJs extends LitCore { throwError({ message: 'siganture could not be combined', errorKind: LIT_ERROR.UNKNOWN_SIGNATURE_ERROR.kind, - errorCode: LIT_ERROR.UNKNOWN_SIGNATURE_ERROR.name + errorCode: LIT_ERROR.UNKNOWN_SIGNATURE_ERROR.name, }); } @@ -1965,8 +1980,8 @@ export class LitNodeClientNodeJs extends LitCore { const sessionCapabilityObject = params.sessionCapabilityObject ? params.sessionCapabilityObject : this.generateSessionCapabilityObjectWithWildcards( - params.resourceAbilityRequests.map((r) => r.resource) - ); + params.resourceAbilityRequests.map((r) => r.resource) + ); let expiration = params.expiration || this.getExpiration(); // -- (TRY) to get the wallet signature @@ -2080,8 +2095,8 @@ export class LitNodeClientNodeJs extends LitCore { * @param {ClaimKeyRequest} params an Auth Method and {@link MintCallback} * @returns {Promise} */ - async claimKeyId( - params: ClaimRequest + async claimKeyId( + params: ClaimRequest ): Promise { if (!this.ready) { const message = @@ -2134,16 +2149,18 @@ export class LitNodeClientNodeJs extends LitCore { const pubkey: string = this.computeHDPubKey(derivedKeyId); log(`pubkey ${pubkey} derived from key id ${derivedKeyId}`); + const relayParams: ClaimRequest<'relay'> = + params as ClaimRequest<'relay'>; + let mintTx = ''; - if (params.mintCallback) { + if (params.mintCallback && 'signer' in params) { mintTx = await params.mintCallback({ derivedKeyId, authMethodType: params.authMethod.authMethodType, signatures: nodeSignatures, pubkey, signer: (params as ClaimRequest<'client'>).signer, - relayUrl: (params as ClaimRequest<'relay'>).relayUrl, - relayApiKey: (params as ClaimRequest<'relay'>).relayApiKey, + ...relayParams, }); } else { mintTx = await defaultMintClaimCallback({ @@ -2151,8 +2168,7 @@ export class LitNodeClientNodeJs extends LitCore { authMethodType: params.authMethod.authMethodType, signatures: nodeSignatures, pubkey, - relayUrl: (params as ClaimRequest<'relay'>).relayUrl, - relayApiKey: (params as ClaimRequest<'relay'>).relayApiKey, + ...relayParams, }); } diff --git a/tsconfig.base.json b/tsconfig.base.json index e9cc3cb256..d79d1c4238 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -10,7 +10,7 @@ "importHelpers": true, "target": "ES2020", "module": "ES2020", - "lib": ["ES2020", "dom"], + "lib": ["ES2020", "dom", "ES2021.String"], "skipLibCheck": true, "skipDefaultLibCheck": true, "baseUrl": ".", From c898b8d8dedd69fbfa882aeccfb861a19453efa8 Mon Sep 17 00:00:00 2001 From: Ansonhkg Date: Thu, 14 Sep 2023 09:18:06 +0100 Subject: [PATCH 5/9] feat: script to enable/disable nx build cache --- package.json | 6 ++++-- tools/scripts/endisable-cache.mjs | 31 +++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 2 deletions(-) create mode 100644 tools/scripts/endisable-cache.mjs diff --git a/package.json b/package.json index 7e40f6dd61..e98bb68fd6 100644 --- a/package.json +++ b/package.json @@ -56,7 +56,9 @@ "txServer": "node tx-handler-server.mjs", "prettier": "nx format:write --all", "delete:merged-branches": "git branch --merged | egrep -v '(^\\*|master|main|develop)' | xargs git branch -d", - "delete:no-merged-branches": "git branch --no-merged | egrep -v '(^\\*|master|main|develop)' | xargs git branch -d" + "delete:no-merged-branches": "git branch --no-merged | egrep -v '(^\\*|master|main|develop)' | xargs git branch -d", + "cache:enable": "node ./tools/scripts/endisable-cache.mjs --enable=true", + "cache:disable": "node ./tools/scripts/endisable-cache.mjs --enable=false" }, "private": true, "dependencies": { @@ -190,4 +192,4 @@ "workspaces": [ "packages/*" ] -} +} \ No newline at end of file diff --git a/tools/scripts/endisable-cache.mjs b/tools/scripts/endisable-cache.mjs new file mode 100644 index 0000000000..460c772e03 --- /dev/null +++ b/tools/scripts/endisable-cache.mjs @@ -0,0 +1,31 @@ +import fs from 'fs'; +import path from 'path'; + +/** + * This script enables or disables the cache in the nx.json file. + * Usage: node endisable-cache.mjs --enable=true + * --enable: Set to true to enable the cache, false to disable it. + */ + +const args = process.argv.slice(2); +const enableCache = + args.find((arg) => arg.startsWith('--enable'))?.split('=')[1] === 'true'; + +const nxConfigPath = path.join(process.cwd(), 'nx.json'); +const nxConfig = JSON.parse(fs.readFileSync(nxConfigPath, 'utf-8')); + +if (enableCache) { + nxConfig.tasksRunnerOptions.default.options = { + cacheableOperations: ['build'], + cacheableDirectories: ['node_modules'], + }; +} else { + delete nxConfig.tasksRunnerOptions.default.options; +} + +fs.writeFileSync(nxConfigPath, JSON.stringify(nxConfig, null, 2)); + +console.log('\nšŸ“ Available commands:'); +console.log('--enable=true: Enable the cache'); +console.log('--enable=false: Disable the cache'); +console.log('\n'); From e2f2649e43666a2b7f92ef8fb9912ab389c6d078 Mon Sep 17 00:00:00 2001 From: Ansonhkg Date: Thu, 14 Sep 2023 09:21:58 +0100 Subject: [PATCH 6/9] chore: update text --- tools/scripts/endisable-cache.mjs | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/tools/scripts/endisable-cache.mjs b/tools/scripts/endisable-cache.mjs index 460c772e03..a826f46619 100644 --- a/tools/scripts/endisable-cache.mjs +++ b/tools/scripts/endisable-cache.mjs @@ -1,5 +1,6 @@ import fs from 'fs'; import path from 'path'; +import { greenLog } from './utils.mjs'; /** * This script enables or disables the cache in the nx.json file. @@ -17,7 +18,7 @@ const nxConfig = JSON.parse(fs.readFileSync(nxConfigPath, 'utf-8')); if (enableCache) { nxConfig.tasksRunnerOptions.default.options = { cacheableOperations: ['build'], - cacheableDirectories: ['node_modules'], + // cacheableDirectories: ['node_modules'], }; } else { delete nxConfig.tasksRunnerOptions.default.options; @@ -25,7 +26,7 @@ if (enableCache) { fs.writeFileSync(nxConfigPath, JSON.stringify(nxConfig, null, 2)); -console.log('\nšŸ“ Available commands:'); -console.log('--enable=true: Enable the cache'); -console.log('--enable=false: Disable the cache'); -console.log('\n'); +greenLog('\nšŸ“ This script enables or disables the cache in the nx.json file.\n', true); +greenLog('--enable=true: Enable the cache', true); +greenLog('--enable=false: Disable the cache', true); + From fc18bacafc9a4587c37ad7ab6d34d14e09487549 Mon Sep 17 00:00:00 2001 From: Ansonhkg Date: Thu, 14 Sep 2023 10:44:08 +0100 Subject: [PATCH 7/9] feat: add bun test script --- package.json | 1 + tools/scripts/test-script.mjs | 82 +++++++++++++++++++++++++++++++++++ tools/scripts/utils.mjs | 11 +++++ 3 files changed, 94 insertions(+) create mode 100644 tools/scripts/test-script.mjs diff --git a/package.json b/package.json index e98bb68fd6..9a1872ec32 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,7 @@ "test:e2e": "yarn tools --test --e2e run-react-and-test", "test:unit": "yarn test:packages", "test:custom": "yarn tools --test --custom", + "test:file": "bun ./tools/scripts/test-script.mjs", "publish:packages": "yarn node ./tools/scripts/pub.mjs --prod", "publish:dev": "yarn node ./tools/scripts/pub.mjs --tag dev", "publish:test": "yarn node ./tools/scripts/pub.mjs --tag test", diff --git a/tools/scripts/test-script.mjs b/tools/scripts/test-script.mjs new file mode 100644 index 0000000000..d0b8f53c70 --- /dev/null +++ b/tools/scripts/test-script.mjs @@ -0,0 +1,82 @@ +import fs from 'fs'; +import path from 'path'; + +import { bunSpawn, greenLog, redLog } from './utils.mjs'; + +/** + * This script recursively looks for files in the directory ./packages that ends with .spec.ts or .test.ts. + * When run with node ./tools/scripts/test-scripts.mjs , it runs the script with command 'bun test ' + * + * Arguments can be provided in the format "--=" + * + * Example: node ./tools/scripts/test-scripts.mjs --dir=./packages --ext=.spec.ts,.test.ts + */ + +const args = process.argv.slice(2); +const TEST_DIR = + args.find((arg) => arg.startsWith('--dir'))?.split('=')[1] || './packages'; +const TEST_FILE_EXTENSIONS = args + .find((arg) => arg.startsWith('--ext')) + ?.split('=')[1] + ?.split(',') || ['.spec.ts', '.test.ts']; + +/** + * Recursively find test files in the given directory + * @param {string} dir - The directory to search in + * @param {string[]} exts - The file extensions to look for + * @returns {string[]} - The paths of the found test files + */ +function findTestFiles(dir, exts) { + let testFiles = []; + const files = fs.readdirSync(dir); + + for (const file of files) { + const filePath = path.join(dir, file); + const stat = fs.statSync(filePath); + + // Extract the extension from the file name considering the possibility of multiple dots in the file name + const fileExtension = '.' + file.split('.').slice(1).join('.'); + + if (stat.isDirectory()) { + testFiles = testFiles.concat(findTestFiles(filePath, exts)); + } else if (exts.includes(fileExtension)) { + testFiles.push(filePath); + } + } + + return testFiles; +} + +/** + * Run the test command for the given test file + * @param {string} testFile - The path of the test file + */ +function runTest(testFile) { + const command = `bun test ${testFile}`; + console.log('Running command: ', command); + bunSpawn(command, { stdout: 'inherit' }); +} + +const testFiles = findTestFiles(TEST_DIR, TEST_FILE_EXTENSIONS); + +greenLog(`${testFiles.length} test files found!`, true); + +const testName = process.argv[2]; + +if (testName) { + const matchingTestFiles = testFiles.filter((file) => { + return file.includes(testName); + }); + + if (!matchingTestFiles.length) { + console.error(`No test files matching "${testName}" found.`); + process.exit(1); + } + + for (const filePath of matchingTestFiles) { + runTest(filePath); + } +} else { + redLog('Please provide a test name. eg. bun test:file lit-node-client'); + process.exit(1); +} diff --git a/tools/scripts/utils.mjs b/tools/scripts/utils.mjs index 2263a90e49..72052a716a 100644 --- a/tools/scripts/utils.mjs +++ b/tools/scripts/utils.mjs @@ -162,6 +162,17 @@ export const spawnCommand = ( }); }; +export const bunSpawn = (commands, options = {}) => { + const defaultOptions = { stdout: 'inherit' }; + + let _commands = commands.split(' '); + + Bun.spawn(_commands, { + ...defaultOptions, + ...options, + }); +}; + export const spawnListener = (commands, callback, prefix = '', color = 31) => { let _commands = commands.split(' '); // let eventName = _commands.join('-'); From 1369be5cc37a9c5278c1ba1ac125cf3192c46b2e Mon Sep 17 00:00:00 2001 From: Ansonhkg Date: Thu, 14 Sep 2023 10:47:58 +0100 Subject: [PATCH 8/9] chore: make test exit --- tools/scripts/endisable-cache.mjs | 2 +- tools/scripts/test-script.mjs | 8 +++++--- tools/scripts/utils.mjs | 6 ++++-- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/tools/scripts/endisable-cache.mjs b/tools/scripts/endisable-cache.mjs index a826f46619..d0d304f6f4 100644 --- a/tools/scripts/endisable-cache.mjs +++ b/tools/scripts/endisable-cache.mjs @@ -29,4 +29,4 @@ fs.writeFileSync(nxConfigPath, JSON.stringify(nxConfig, null, 2)); greenLog('\nšŸ“ This script enables or disables the cache in the nx.json file.\n', true); greenLog('--enable=true: Enable the cache', true); greenLog('--enable=false: Disable the cache', true); - +process.exit(); \ No newline at end of file diff --git a/tools/scripts/test-script.mjs b/tools/scripts/test-script.mjs index d0b8f53c70..3b730222c7 100644 --- a/tools/scripts/test-script.mjs +++ b/tools/scripts/test-script.mjs @@ -51,10 +51,10 @@ function findTestFiles(dir, exts) { * Run the test command for the given test file * @param {string} testFile - The path of the test file */ -function runTest(testFile) { +async function runTest(testFile) { const command = `bun test ${testFile}`; console.log('Running command: ', command); - bunSpawn(command, { stdout: 'inherit' }); + await bunSpawn(command, { stdout: 'inherit' }); } const testFiles = findTestFiles(TEST_DIR, TEST_FILE_EXTENSIONS); @@ -74,9 +74,11 @@ if (testName) { } for (const filePath of matchingTestFiles) { - runTest(filePath); + await runTest(filePath); } } else { redLog('Please provide a test name. eg. bun test:file lit-node-client'); process.exit(1); } + +process.exit(0); \ No newline at end of file diff --git a/tools/scripts/utils.mjs b/tools/scripts/utils.mjs index 72052a716a..069f490600 100644 --- a/tools/scripts/utils.mjs +++ b/tools/scripts/utils.mjs @@ -162,15 +162,17 @@ export const spawnCommand = ( }); }; -export const bunSpawn = (commands, options = {}) => { +export const bunSpawn = async (commands, options = {}) => { const defaultOptions = { stdout: 'inherit' }; let _commands = commands.split(' '); - Bun.spawn(_commands, { + const proc = Bun.spawn(_commands, { ...defaultOptions, ...options, }); + + await proc.exited; }; export const spawnListener = (commands, callback, prefix = '', color = 31) => { From b83f15d03c05ad0479e1e63f31b775b0cdda56e5 Mon Sep 17 00:00:00 2001 From: Ansonhkg Date: Thu, 14 Sep 2023 10:48:21 +0100 Subject: [PATCH 9/9] chore: bun test lit node client --- .../src/lib/lit-node-client2.spec.ts | 70 +++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 packages/lit-node-client/src/lib/lit-node-client2.spec.ts diff --git a/packages/lit-node-client/src/lib/lit-node-client2.spec.ts b/packages/lit-node-client/src/lib/lit-node-client2.spec.ts new file mode 100644 index 0000000000..1d29d120a3 --- /dev/null +++ b/packages/lit-node-client/src/lib/lit-node-client2.spec.ts @@ -0,0 +1,70 @@ +import { LitNodeClient } from './lit-node-client'; +import * as LITCONFIG from 'lit.config.json'; + +let client: LitNodeClient; + +describe('Lit Actions', async () => { + client = new LitNodeClient({ + litNetwork: 'cayenne', + debug: true + }); + + await client.connect(); + + test('should be connected', async () => { + expect(client.ready).toBe(true); + }); + + test('lit action log should return hello world', async () => { + + const res = await client.executeJs({ + authSig: LITCONFIG.CONTROLLER_AUTHSIG, + code: `(async () => { + console.log('hello world') + })();`, + jsParams: { + publicKey: LITCONFIG.PKP_PUBKEY, + }, + }) + + expect(res.logs).toContain('hello world'); + }); + + it('lit action response should return json {hello: "world"}', async () => { + const res = await client.executeJs({ + authSig: LITCONFIG.CONTROLLER_AUTHSIG, + code: `(async () => { + LitActions.setResponse({ + response: JSON.stringify({hello: 'world'}) + }); + })();`, + jsParams: { + publicKey: LITCONFIG.PKP_PUBKEY, + }, + }) + expect(res.response).toEqual(JSON.stringify({ hello: 'world' })); + }); + + it('lit action should sign a message', async () => { + + const res = await client.executeJs({ + authSig: LITCONFIG.CONTROLLER_AUTHSIG, + code: `(async () => { + const sigShare = await LitActions.signEcdsa({ + toSign, + publicKey, + sigName + }); + })();`, + jsParams: { + // hello world in Uint8Array + toSign: [104, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100], + publicKey: LITCONFIG.PKP_PUBKEY, + sigName: 'hello-world-sig', + }, + }); + + expect(res).toBe(1); + + }); +});

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