diff --git a/CHANGELOG.md b/CHANGELOG.md index 236cd19d1..7822abf4b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,8 @@ All notable changes to this project will be documented in this file. Dates are d Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). +<<<<<<< feat/update-session-keys +======= #### [v3.0.6](https://github.com/nevermined-io/sdk-js/compare/v3.0.6-rc2...v3.0.6) > 14 May 2024 @@ -25,6 +27,7 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). - feat: revert to permissionless v6 [`e860516`](https://github.com/nevermined-io/sdk-js/commit/e860516b2d35b8fce7414e5782f00d89ca230b67) +>>>>>>> main #### [v3.0.6-rc0](https://github.com/nevermined-io/sdk-js/compare/v3.0.5...v3.0.6-rc0) > 14 May 2024 diff --git a/integration/external/Zerodev.test.ts b/integration/external/Zerodev.test.ts index 70b783d6b..7ea6ee5c2 100644 --- a/integration/external/Zerodev.test.ts +++ b/integration/external/Zerodev.test.ts @@ -1,10 +1,10 @@ // TODO: Enable when ZeroDev is ready // import { verifyMessage } from '@ambire/signature-validator' -// import { assert } from 'chai' +import { assert } from 'chai' // import { ethers } from 'ethers' // import * as fs from 'fs' // import { decodeJwt } from 'jose' -import { createPublicClient, http } from 'viem' +import { createPublicClient, http, parseAbi } from 'viem' import { arbitrumSepolia } from 'viem/chains' import { // AssetAttributes, @@ -15,19 +15,20 @@ import { // NFTAttributes, Nevermined, // NeverminedNFT1155Type, - // NvmAccount, + NvmAccount, // PublishMetadataOptions, // ServiceAttributes, // SubscriptionType, - // makeRandomWallet, + makeRandomWallet, } from '../../src' // import { DDO } from '../../src/ddo' import { // createKernelClient, - // createSessionKey, + createSessionKey, getSessionKey, } from '../../src/nevermined/utils/BlockchainViemUtils' import { config } from '../config' +import { toECDSASigner } from '@zerodev/permissions/signers' // import { getMetadata } from '../utils' describe('Nevermined sdk with zerodev', () => { @@ -277,59 +278,72 @@ describe('Nevermined sdk with zerodev', () => { describe('Test zerodev sessionKeys', () => { // let kernelClient: any // TODO: KernelAccountClient - // const contractAddress = '0x93605C644181f3dD03A37228528649A76822Fcf1' as '0x{string}' // DIDRegistry address + const contractAddress = '0x93605C644181f3dD03A37228528649A76822Fcf1' as '0x{string}' // DIDRegistry address - // const owner = makeRandomWallet() + const owner = makeRandomWallet() it('should generate a session key', async () => { - // const permissions = [ - // { - // target: contractAddress, - // abi: parseAbi([ - // 'function registerMintableDID(bytes32 _didSeed, address _nftContractAddress, bytes32 _checksum, address[] memory _providers, string memory _url, uint256 _cap, uint256 _royalties, bool _mint, bytes32 _activityId, string memory _nftMetadata, string memory _immutableUrl) public', - // ]), - // functionName: 'registerMintableDID', - // }, - // { - // target: contractAddress, - // abi: parseAbi([ - // 'function registerMintableDID(bytes32 _didSeed,address _nftContractAddress,bytes32 _checksum,address[] memory _providers,string memory _url,uint256 _cap,uint256 _royalties,bytes32 _activityId,string memory _nftMetadata,string memory _immutableUrl) public', - // ]), - // functionName: 'registerMintableDID', - // }, - // { - // target: '0x75faf114eafb1BDbe2F0316DF893fd58CE46AA4d' as `0x${string}`, - // abi: parseAbi([ - // 'function approve(address spender, uint256 amount) external returns (bool)', - // ]), - // functionName: 'approve', - // }, - // { - // target: '0x1c52ed414EDd1bCC20Ea670d42289e8bFC03C095', - // abi: parseAbi([ - // 'function createAgreementAndPayEscrow(bytes32 _id, bytes32 _did, bytes32[] _conditionIds, uint256[] _timeLocks, uint256[] _timeOuts, address _accessConsumer, uint256 _idx, address _rewardAddress, address _tokenAddress, uint256[] _amounts, address[] _receivers) public', - // ]), - // functionName: 'createAgreementAndPayEscrow', - // }, - // { - // target: '0x75faf114eafb1BDbe2F0316DF893fd58CE46AA4d' as `0x${string}`, - // abi: parseAbi(['function transfer(address to, uint amount) returns (bool)']), - // functionName: 'transfer', - // }, - // ] - // const sessionKey = await createSessionKey(owner, publicClient, permissions) - // assert.isDefined(sessionKey) - const sessionKey = - 'eyJzZXNzaW9uS2V5UGFyYW1zIjp7InBheW1hc3RlciI6IjB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSIsInZhbGlkQWZ0ZXIiOjAsInZhbGlkVW50aWwiOjAsInBlcm1pc3Npb25zIjpbeyJ0YXJnZXQiOiIweDkzNjA1QzY0NDE4MWYzZEQwM0EzNzIyODUyODY0OUE3NjgyMkZjZjEiLCJhYmkiOlt7Im5hbWUiOiJyZWdpc3Rlck1pbnRhYmxlRElEIiwidHlwZSI6ImZ1bmN0aW9uIiwic3RhdGVNdXRhYmlsaXR5Ijoibm9ucGF5YWJsZSIsImlucHV0cyI6W3sidHlwZSI6ImJ5dGVzMzIiLCJuYW1lIjoiX2RpZFNlZWQifSx7InR5cGUiOiJhZGRyZXNzIiwibmFtZSI6Il9uZnRDb250cmFjdEFkZHJlc3MifSx7InR5cGUiOiJieXRlczMyIiwibmFtZSI6Il9jaGVja3N1bSJ9LHsidHlwZSI6ImFkZHJlc3NbXSIsIm5hbWUiOiJfcHJvdmlkZXJzIn0seyJ0eXBlIjoic3RyaW5nIiwibmFtZSI6Il91cmwifSx7InR5cGUiOiJ1aW50MjU2IiwibmFtZSI6Il9jYXAifSx7InR5cGUiOiJ1aW50MjU2IiwibmFtZSI6Il9yb3lhbHRpZXMifSx7InR5cGUiOiJib29sIiwibmFtZSI6Il9taW50In0seyJ0eXBlIjoiYnl0ZXMzMiIsIm5hbWUiOiJfYWN0aXZpdHlJZCJ9LHsidHlwZSI6InN0cmluZyIsIm5hbWUiOiJfbmZ0TWV0YWRhdGEifSx7InR5cGUiOiJzdHJpbmciLCJuYW1lIjoiX2ltbXV0YWJsZVVybCJ9XSwib3V0cHV0cyI6W119XSwiZnVuY3Rpb25OYW1lIjoicmVnaXN0ZXJNaW50YWJsZURJRCIsInZhbHVlTGltaXQiOiIwIiwic2lnIjoiMHhjZmZlMWViMyIsInJ1bGVzIjpbXSwiaW5kZXgiOjAsImV4ZWN1dGlvblJ1bGUiOnsidmFsaWRBZnRlciI6MCwiaW50ZXJ2YWwiOjAsInJ1bnMiOjB9LCJvcGVyYXRpb24iOjB9LHsidGFyZ2V0IjoiMHg5MzYwNUM2NDQxODFmM2REMDNBMzcyMjg1Mjg2NDlBNzY4MjJGY2YxIiwiYWJpIjpbeyJuYW1lIjoicmVnaXN0ZXJNaW50YWJsZURJRCIsInR5cGUiOiJmdW5jdGlvbiIsInN0YXRlTXV0YWJpbGl0eSI6Im5vbnBheWFibGUiLCJpbnB1dHMiOlt7InR5cGUiOiJieXRlczMyIiwibmFtZSI6Il9kaWRTZWVkIn0seyJ0eXBlIjoiYWRkcmVzcyIsIm5hbWUiOiJfbmZ0Q29udHJhY3RBZGRyZXNzIn0seyJ0eXBlIjoiYnl0ZXMzMiIsIm5hbWUiOiJfY2hlY2tzdW0ifSx7InR5cGUiOiJhZGRyZXNzW10iLCJuYW1lIjoiX3Byb3ZpZGVycyJ9LHsidHlwZSI6InN0cmluZyIsIm5hbWUiOiJfdXJsIn0seyJ0eXBlIjoidWludDI1NiIsIm5hbWUiOiJfY2FwIn0seyJ0eXBlIjoidWludDI1NiIsIm5hbWUiOiJfcm95YWx0aWVzIn0seyJ0eXBlIjoiYnl0ZXMzMiIsIm5hbWUiOiJfYWN0aXZpdHlJZCJ9LHsidHlwZSI6InN0cmluZyIsIm5hbWUiOiJfbmZ0TWV0YWRhdGEifSx7InR5cGUiOiJzdHJpbmciLCJuYW1lIjoiX2ltbXV0YWJsZVVybCJ9XSwib3V0cHV0cyI6W119XSwiZnVuY3Rpb25OYW1lIjoicmVnaXN0ZXJNaW50YWJsZURJRCIsInZhbHVlTGltaXQiOiIwIiwic2lnIjoiMHgzYmQwMmM0MSIsInJ1bGVzIjpbXSwiaW5kZXgiOjEsImV4ZWN1dGlvblJ1bGUiOnsidmFsaWRBZnRlciI6MCwiaW50ZXJ2YWwiOjAsInJ1bnMiOjB9LCJvcGVyYXRpb24iOjB9LHsidGFyZ2V0IjoiMHg3NWZhZjExNGVhZmIxQkRiZTJGMDMxNkRGODkzZmQ1OENFNDZBQTRkIiwiYWJpIjpbeyJuYW1lIjoiYXBwcm92ZSIsInR5cGUiOiJmdW5jdGlvbiIsInN0YXRlTXV0YWJpbGl0eSI6Im5vbnBheWFibGUiLCJpbnB1dHMiOlt7InR5cGUiOiJhZGRyZXNzIiwibmFtZSI6InNwZW5kZXIifSx7InR5cGUiOiJ1aW50MjU2IiwibmFtZSI6ImFtb3VudCJ9XSwib3V0cHV0cyI6W3sidHlwZSI6ImJvb2wifV19XSwiZnVuY3Rpb25OYW1lIjoiYXBwcm92ZSIsInZhbHVlTGltaXQiOiIwIiwic2lnIjoiMHgwOTVlYTdiMyIsInJ1bGVzIjpbXSwiaW5kZXgiOjIsImV4ZWN1dGlvblJ1bGUiOnsidmFsaWRBZnRlciI6MCwiaW50ZXJ2YWwiOjAsInJ1bnMiOjB9LCJvcGVyYXRpb24iOjB9LHsidGFyZ2V0IjoiMHgxYzUyZWQ0MTRFRGQxYkNDMjBFYTY3MGQ0MjI4OWU4YkZDMDNDMDk1IiwiYWJpIjpbeyJuYW1lIjoiY3JlYXRlQWdyZWVtZW50QW5kUGF5RXNjcm93IiwidHlwZSI6ImZ1bmN0aW9uIiwic3RhdGVNdXRhYmlsaXR5Ijoibm9ucGF5YWJsZSIsImlucHV0cyI6W3sidHlwZSI6ImJ5dGVzMzIiLCJuYW1lIjoiX2lkIn0seyJ0eXBlIjoiYnl0ZXMzMiIsIm5hbWUiOiJfZGlkIn0seyJ0eXBlIjoiYnl0ZXMzMltdIiwibmFtZSI6Il9jb25kaXRpb25JZHMifSx7InR5cGUiOiJ1aW50MjU2W10iLCJuYW1lIjoiX3RpbWVMb2NrcyJ9LHsidHlwZSI6InVpbnQyNTZbXSIsIm5hbWUiOiJfdGltZU91dHMifSx7InR5cGUiOiJhZGRyZXNzIiwibmFtZSI6Il9hY2Nlc3NDb25zdW1lciJ9LHsidHlwZSI6InVpbnQyNTYiLCJuYW1lIjoiX2lkeCJ9LHsidHlwZSI6ImFkZHJlc3MiLCJuYW1lIjoiX3Jld2FyZEFkZHJlc3MifSx7InR5cGUiOiJhZGRyZXNzIiwibmFtZSI6Il90b2tlbkFkZHJlc3MifSx7InR5cGUiOiJ1aW50MjU2W10iLCJuYW1lIjoiX2Ftb3VudHMifSx7InR5cGUiOiJhZGRyZXNzW10iLCJuYW1lIjoiX3JlY2VpdmVycyJ9XSwib3V0cHV0cyI6W119XSwiZnVuY3Rpb25OYW1lIjoiY3JlYXRlQWdyZWVtZW50QW5kUGF5RXNjcm93IiwidmFsdWVMaW1pdCI6IjAiLCJzaWciOiIweGY4ZmUxMDcwIiwicnVsZXMiOltdLCJpbmRleCI6MywiZXhlY3V0aW9uUnVsZSI6eyJ2YWxpZEFmdGVyIjowLCJpbnRlcnZhbCI6MCwicnVucyI6MH0sIm9wZXJhdGlvbiI6MH1dfSwiYWN0aW9uIjp7InNlbGVjdG9yIjoiMHg1MTk0NTQ0NyIsImFkZHJlc3MiOiIweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAifSwidmFsaWRpdHlEYXRhIjp7InZhbGlkQWZ0ZXIiOjAsInZhbGlkVW50aWwiOjB9LCJhY2NvdW50UGFyYW1zIjp7ImluaXRDb2RlIjoiMHgiLCJhY2NvdW50QWRkcmVzcyI6IjB4NGZlM2U3ZDQyZkE4M2JlNEU4Y0YwMzQ1MUFjM0YyNTk4MGE3M2ZGNiJ9LCJlbmFibGVTaWduYXR1cmUiOiIweGI4NzYxYjAwOTVlZWFhOTBjODMwODRiMDI4N2E3YTk1MTllYWM5NzVjN2MyMGE4ZDljNzg4ZWQxNDdmM2U0ODQ3MjgyYjhhNjA5NjE5OWQ3YTI1ZGQ4MzJlZTU2ZjM3ZmUxMjBmOWMyMzYyMmYxYWQwNTBkODM4NDE2NWZkMTc4MWMiLCJwcml2YXRlS2V5IjoiMHg5MTNlZDFkZGZiOWIzZDMyNjFhZTYyYWZhMzE1MzI5MDk2OGFiYzcyYTBkMjJhMDZhNzFjNWM4NzlhZjQ5ZGM3In0=' - - const deserializedSessionKey = await getSessionKey(sessionKey, PROJECT_ID, publicClient) + const permissions = [ + { + target: contractAddress, + abi: parseAbi([ + 'function registerMintableDID(bytes32 _didSeed, address _nftContractAddress, bytes32 _checksum, address[] memory _providers, string memory _url, uint256 _cap, uint256 _royalties, bool _mint, bytes32 _activityId, string memory _nftMetadata, string memory _immutableUrl) public', + ]), + functionName: 'registerMintableDID', + }, + { + target: contractAddress, + abi: parseAbi([ + 'function registerMintableDID(bytes32 _didSeed,address _nftContractAddress,bytes32 _checksum,address[] memory _providers,string memory _url,uint256 _cap,uint256 _royalties,bytes32 _activityId,string memory _nftMetadata,string memory _immutableUrl) public', + ]), + functionName: 'registerMintableDID', + }, + { + target: '0x75faf114eafb1BDbe2F0316DF893fd58CE46AA4d' as `0x${string}`, + abi: parseAbi([ + 'function approve(address spender, uint256 amount) external returns (bool)', + ]), + functionName: 'approve', + }, + { + target: '0x1c52ed414EDd1bCC20Ea670d42289e8bFC03C095', + abi: parseAbi([ + 'function createAgreementAndPayEscrow(bytes32 _id, bytes32 _did, bytes32[] _conditionIds, uint256[] _timeLocks, uint256[] _timeOuts, address _accessConsumer, uint256 _idx, address _rewardAddress, address _tokenAddress, uint256[] _amounts, address[] _receivers) public', + ]), + functionName: 'createAgreementAndPayEscrow', + }, + { + target: '0x75faf114eafb1BDbe2F0316DF893fd58CE46AA4d' as `0x${string}`, + abi: parseAbi(['function transfer(address to, uint amount) returns (bool)']), + functionName: 'transfer', + }, + ] // Login to the marketplace - // const acc = NvmAccount.fromAccount(owner) - // const clientAssertion = await nevermined.utils.jwt.generateClientAssertion(deserializedSessionKey) - // const marketplaceAuthToken = await nevermined.services.marketplace.login(clientAssertion) - // console.log('marketplaceAuthToken', marketplaceAuthToken) + const acc = NvmAccount.fromAccount(owner) + const clientAssertion = await nevermined.utils.jwt.generateClientAssertion(acc) + const marketplaceAuthToken = await nevermined.services.marketplace.login(clientAssertion) + console.log('marketplaceAuthToken', marketplaceAuthToken) + + console.log(acc.getAddress()) + + const sessionKey = await createSessionKey(owner, publicClient, permissions) + console.log(sessionKey) + assert.isDefined(sessionKey) + + const sessionKeySigner = await toECDSASigner({ + signer: owner, + }) + + const deserializedSessionKey = await getSessionKey( + sessionKey, + PROJECT_ID, + publicClient, + sessionKeySigner, + ) + console.log(deserializedSessionKey) const account = deserializedSessionKey + console.log(account) // REGISTRATION OF AN ASSET //================================================================================================ @@ -387,7 +401,7 @@ describe('Nevermined sdk with zerodev', () => { // const nftAttributes = NFTAttributes.getCreditsSubscriptionInstance({ // metadata, // services, - // providers: ['0x046d0698926aFa3ab6D6591f03063488F3Fb4327'], + // providers: ['0x5838B5512cF9f12FE9f2beccB20eb47211F9B0bc'], // nftContractAddress: subscriptionNFT.address, // preMint: false, // royaltyAttributes: undefined, @@ -401,31 +415,32 @@ describe('Nevermined sdk with zerodev', () => { // ORDER OF AN ASSET //================================================================================================ - // const subscriptionDid = - // 'did:nv:d69d06bedc777963700b3392c494fbfb980d5bb94990252d41403927132837e5' - // const agreementId = await nevermined.nfts1155.order(subscriptionDid, 1n, account) - // console.log(agreementId) - // const subscriptionOwner = await nevermined.assets.owner(subscriptionDid) - // console.log('claiming to@', subscriptionOwner) - // const claim = await nevermined.nfts1155.claim( - // agreementId, - // subscriptionOwner, - // account.getId(), - // undefined, - // subscriptionDid, - // undefined, - // ) - // console.log(claim) + const subscriptionDid = + 'did:nv:6d6b448eeeb2072717614016269bff28d035e4191783d7335f067b5218c79d64' + const agreementId = await nevermined.nfts1155.order(subscriptionDid, 10n, account) + console.log(agreementId) + const subscriptionOwner = await nevermined.assets.owner(subscriptionDid) + console.log('claiming to@', subscriptionOwner) + const claim = await nevermined.nfts1155.claim( + agreementId, + subscriptionOwner, + account.getId(), + undefined, + subscriptionDid, + undefined, + ) + console.log(claim) // DOWNLOAD OF AN ASSET - const fileDid = 'did:nv:d65e2726b37510d231a86183d0de5d9281830381b579315c64e1eea7ee3e416f' - const download = await nevermined.nfts1155.access( - fileDid, - account, - '/tmp/nevermined/sdk-js', - -1, - ) - console.log(download) + //================================================================================================ + // const fileDid = 'did:nv:d65e2726b37510d231a86183d0de5d9281830381b579315c64e1eea7ee3e416f' + // const download = await nevermined.nfts1155.access( + // fileDid, + // account, + // '/tmp/nevermined/sdk-js', + // -1, + // ) + // console.log(download) }) }) }) diff --git a/package.json b/package.json index 887e1f513..ed896dfd1 100644 --- a/package.json +++ b/package.json @@ -54,24 +54,24 @@ "@apollo/client": "^3.7.16", "@turnkey/viem": "0.4.16", "@zerodev/ecdsa-validator": "5.2.3", - "@zerodev/sdk": "5.2.11", - "@zerodev/session-key": "^5.3.0", + "@zerodev/permissions": "5.2.6", + "@zerodev/sdk": "5.2.12", "assert": "^2.0.0", "cross-fetch": "^4.0.0", "crypto-browserify": "^3.12.0", "deprecated-decorator": "^0.1.6", + "eccrypto": "1.1.6", + "fflate": "0.8.2", "form-data": "^4.0.0", "graphql": "^16.7.1", "https-browserify": "^1.0.0", "jose": "^4.11.2", - "fflate": "0.8.2", - "eccrypto": "1.1.6", "js-file-download": "^0.4.12", "lodash": "^4.17.21", "node-fetch": "^2.6.1", "os-browserify": "^0.3.0", "path-browserify": "^1.0.1", - "permissionless": "^0.1.22", + "permissionless": "0.1.28", "pluralize": "^8.0.0", "save-file": "^2.3.1", "stream-browserify": "^3.0.0", @@ -84,9 +84,9 @@ "peerDependencies": { "@alchemy/aa-core": "3.12.1", "@zerodev/ecdsa-validator": "^5.2.3", + "@zerodev/permissions": "5.2.7-alpha-1", "@zerodev/sdk": "^5.2.11", - "@zerodev/session-key": "^5.3.0", - "permissionless": "^0.1.26", + "permissionless": "0.1.28", "viem": "2.9.31" }, "devDependencies": { diff --git a/src/keeper/contracts/ContractBase.ts b/src/keeper/contracts/ContractBase.ts index 81f232526..d1181f38e 100644 --- a/src/keeper/contracts/ContractBase.ts +++ b/src/keeper/contracts/ContractBase.ts @@ -1,4 +1,10 @@ -import { Account, TransactionReceipt, encodeFunctionData, parseEventLogs } from 'viem' +import { + Account, + PrivateKeyAccount, + TransactionReceipt, + encodeFunctionData, + parseEventLogs, +} from 'viem' import { Instantiable, InstantiableConfig } from '../../Instantiable.abstract' import { jsonReplacer } from '../../common/helpers' import { KeeperError } from '../../errors/NeverminedErrors' @@ -301,20 +307,20 @@ export abstract class ContractBase extends Instantiable { private async localAccountSend( name: string, - from: Account | `0x${string}`, + from: PrivateKeyAccount | Account | `0x${string}`, args: any[], txparams: any, progress: ((data: any) => void) | undefined, ) { const functionInputs = getInputsOfFunctionFormatted(this.contract.abi, name, args) // Uncomment to debug contract calls - if (name === 'XXXXX') { - const functionSignature = getSignatureOfFunction(this.contract.abi, name, args) - console.debug(`Making contract call ....: ${name} - ${from}`) - console.debug(`With args`, args) - console.debug(`And signature - ${JSON.stringify(functionSignature, jsonReplacer)}`) - console.debug('And amount: ', txparams.value) - } + // if (name === 'XXXXX') { + const functionSignature = getSignatureOfFunction(this.contract.abi, name, args) + console.debug(`Making contract call ....: ${name} - ${from}`) + console.debug(`With args`, args) + console.debug(`And signature - ${JSON.stringify(functionSignature, jsonReplacer)}`) + console.debug('And amount: ', txparams.value) + // } const { gasLimit, value } = txparams // make the call diff --git a/src/models/NvmAccount.ts b/src/models/NvmAccount.ts index aaed4ea0e..50f4e6804 100644 --- a/src/models/NvmAccount.ts +++ b/src/models/NvmAccount.ts @@ -14,7 +14,7 @@ export class NvmAccount { public babySecret?: string private accountSigner?: Account | PrivateKeyAccount private kernelClient?: KernelAccountClient< - '0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789', + '0x0000000071727De22E5E9d8BAf0edAc6f37da032', Transport, Chain, any @@ -55,7 +55,7 @@ export class NvmAccount { */ static async fromZeroDevSigner( kernelClient: KernelAccountClient< - '0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789', + '0x0000000071727De22E5E9d8BAf0edAc6f37da032', Transport, Chain, any @@ -70,7 +70,7 @@ export class NvmAccount { static fromZeroDevSessionKey( kernelClient: KernelAccountClient< - '0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789', + '0x0000000071727De22E5E9d8BAf0edAc6f37da032', Transport, Chain, any diff --git a/src/nevermined/resources/AppNetworks.ts b/src/nevermined/resources/AppNetworks.ts index e29e058ee..521826921 100644 --- a/src/nevermined/resources/AppNetworks.ts +++ b/src/nevermined/resources/AppNetworks.ts @@ -29,7 +29,7 @@ export class AppDeploymentStaging extends NeverminedAppOptions { marketplaceUri = 'https://marketplace-api.staging.nevermined.app' graphHttpUri = 'https://api.thegraph.com/subgraphs/name/nevermined-io/public' neverminedNodeUri = 'https://node.staging.nevermined.app' - neverminedNodeAddress = '0x046d0698926aFa3ab6D6591f03063488F3Fb4327' + neverminedNodeAddress = '0x5838B5512cF9f12FE9f2beccB20eb47211F9B0bc' verbose = true gasMultiplier = 0 gasPriceMultiplier = 0 @@ -45,7 +45,7 @@ export class AppDeploymentTesting extends NeverminedAppOptions { marketplaceUri = 'https://marketplace-api.testing.nevermined.app' graphHttpUri = 'https://api.thegraph.com/subgraphs/name/nevermined-io/public' neverminedNodeUri = 'https://node.testing.nevermined.app' - neverminedNodeAddress = '0x046d0698926aFa3ab6D6591f03063488F3Fb4327' + neverminedNodeAddress = '0x5838B5512cF9f12FE9f2beccB20eb47211F9B0bc' verbose = true gasMultiplier = 0 gasPriceMultiplier = 0 diff --git a/src/nevermined/utils/BlockchainViemUtils.ts b/src/nevermined/utils/BlockchainViemUtils.ts index ed6417498..98491e1c5 100644 --- a/src/nevermined/utils/BlockchainViemUtils.ts +++ b/src/nevermined/utils/BlockchainViemUtils.ts @@ -1,17 +1,20 @@ import { signerToEcdsaValidator } from '@zerodev/ecdsa-validator' +import { + ModularSigner, + deserializePermissionAccount, + serializePermissionAccount, + toPermissionValidator, +} from '@zerodev/permissions' +import { toCallPolicy } from '@zerodev/permissions/policies' +import { toECDSASigner } from '@zerodev/permissions/signers' import { SponsorUserOperationParameters, + addressToEmptyAccount, createKernelAccount, createKernelAccountClient, createZeroDevPaymasterClient, } from '@zerodev/sdk' -import { - deserializeSessionKeyAccount, - oneAddress, - serializeSessionKeyAccount, - signerToSessionKeyValidator, -} from '@zerodev/session-key' -import { ENTRYPOINT_ADDRESS_V06 } from 'permissionless' +import { ENTRYPOINT_ADDRESS_V07 } from 'permissionless' import { EntryPoint } from 'permissionless/types' import { Abi, @@ -38,13 +41,7 @@ import { parseEther as viemParseEther, parseUnits as viemParseUnits, } from 'viem' -import { - english, - generateMnemonic, - generatePrivateKey, - mnemonicToAccount, - privateKeyToAccount, -} from 'viem/accounts' +import { english, generateMnemonic, mnemonicToAccount } from 'viem/accounts' import { Instantiable, InstantiableConfig, Web3Clients } from '../../Instantiable.abstract' import { _sleep } from '../../common/helpers' import { KeeperError } from '../../errors/NeverminedErrors' @@ -390,19 +387,19 @@ export async function createKernelClient(signer: any, chainId: number, zeroDevPr const ecdsaValidator = await signerToEcdsaValidator(publicClient, { signer, - entryPoint: ENTRYPOINT_ADDRESS_V06, + entryPoint: ENTRYPOINT_ADDRESS_V07, }) const account = await createKernelAccount(publicClient, { plugins: { sudo: ecdsaValidator, }, - entryPoint: ENTRYPOINT_ADDRESS_V06, + entryPoint: ENTRYPOINT_ADDRESS_V07, }) return createKernelAccountClient({ account, - entryPoint: ENTRYPOINT_ADDRESS_V06, + entryPoint: ENTRYPOINT_ADDRESS_V07, chain: getChain(chainId), bundlerTransport: http(`https://rpc.zerodev.app/api/v2/bundler/${zeroDevProjectId}`), middleware: { @@ -410,13 +407,13 @@ export async function createKernelClient(signer: any, chainId: number, zeroDevPr const paymasterClient = createZeroDevPaymasterClient({ chain: getChain(chainId), transport: http(`https://rpc.zerodev.app/api/v2/paymaster/${zeroDevProjectId}`), - entryPoint: ENTRYPOINT_ADDRESS_V06, + entryPoint: ENTRYPOINT_ADDRESS_V07, }) const _userOperation = userOperation as SponsorUserOperationParameters['userOperation'] return paymasterClient.sponsorUserOperation({ userOperation: _userOperation, - entryPoint: ENTRYPOINT_ADDRESS_V06, + entryPoint: ENTRYPOINT_ADDRESS_V07, }) }, }, @@ -424,51 +421,74 @@ export async function createKernelClient(signer: any, chainId: number, zeroDevPr } export async function createSessionKey(signer: any, publicClient: any, permissions: any[]) { + console.log('signer', signer) const ecdsaValidator = await signerToEcdsaValidator(publicClient, { - entryPoint: ENTRYPOINT_ADDRESS_V06, + entryPoint: ENTRYPOINT_ADDRESS_V07, signer, }) - const sessionPrivateKey = generatePrivateKey() - const sessionKeySigner = privateKeyToAccount(sessionPrivateKey) - - const sessionKeyValidator = await signerToSessionKeyValidator(publicClient, { - entryPoint: ENTRYPOINT_ADDRESS_V06, - signer: sessionKeySigner, - validatorData: { - paymaster: oneAddress, - validAfter: 0, - validUntil: 0, - permissions, - }, + // const sessionPrivateKey = generatePrivateKey() + // const masterAccount = privateKeyToAccount(sessionPrivateKey) + + // const sessionKeySigner = await toECDSASigner({ + // signer: masterAccount, + // }) + const emptyAccount = addressToEmptyAccount(signer.address) + console.log('emptyAccount', emptyAccount) + const emptySessionKeySigner = await toECDSASigner({ signer: emptyAccount }) + console.log('emptySessionKeySigner', emptySessionKeySigner) + + // const sessionKeyValidator = await signerToSessionKeyValidator(publicClient, { + // entryPoint: ENTRYPOINT_ADDRESS_V07, + // signer: sessionKeySigner, + // validatorData: { + // paymaster: oneAddress, + // validAfter: 0, + // validUntil: 0, + // permissions, + // }, + // }) + + const callPolicy = toCallPolicy({ + permissions: permissions, }) + + const permissionPlugin = await toPermissionValidator(publicClient, { + entryPoint: ENTRYPOINT_ADDRESS_V07, + signer: emptySessionKeySigner, + policies: [callPolicy], + }) + const sessionKeyAccount = await createKernelAccount(publicClient, { - entryPoint: ENTRYPOINT_ADDRESS_V06, + entryPoint: ENTRYPOINT_ADDRESS_V07, plugins: { sudo: ecdsaValidator, - regular: sessionKeyValidator, + regular: permissionPlugin, }, }) - return serializeSessionKeyAccount(sessionKeyAccount, sessionPrivateKey) + + return serializePermissionAccount(sessionKeyAccount) } export async function getSessionKey( serializedSessionKey: string, zeroDevProjectId: string, publicClient: any, + sessionKeySigner: ModularSigner, ) { const chainId = await publicClient.getChainId() - const sessionKeyAccount = await deserializeSessionKeyAccount( + const sessionKeyAccount = await deserializePermissionAccount( publicClient, - ENTRYPOINT_ADDRESS_V06, + ENTRYPOINT_ADDRESS_V07, serializedSessionKey, + sessionKeySigner, ) const kernelPaymaster = createZeroDevPaymasterClient({ - entryPoint: ENTRYPOINT_ADDRESS_V06, + entryPoint: ENTRYPOINT_ADDRESS_V07, chain: getChain(chainId), transport: http(`https://rpc.zerodev.app/api/v2/paymaster/${zeroDevProjectId}`), }) const kernelClient = createKernelAccountClient({ - entryPoint: ENTRYPOINT_ADDRESS_V06, + entryPoint: ENTRYPOINT_ADDRESS_V07, account: sessionKeyAccount, chain: getChain(chainId), bundlerTransport: http(`https://rpc.zerodev.app/api/v2/bundler/${zeroDevProjectId}`), diff --git a/src/permissionless.d.ts b/src/permissionless.d.ts index 36f8087fb..ff4d0c2d1 100644 --- a/src/permissionless.d.ts +++ b/src/permissionless.d.ts @@ -7,8 +7,16 @@ declare module 'permissionless/accounts' { // eslint-disable-next-line @typescript-eslint/no-unused-vars TAddress extends Address = Address, > {} + export class SignTransactionNotSupportedBySmartAccount extends BaseError {} } -declare module 'permissionless/types' { - export type EntryPoint = string +export type EntryPoint = string + +declare module '@zerodev/permissions/signers' { + export function toECDSASigner< + // eslint-disable-next-line @typescript-eslint/no-unused-vars + TSource extends string = 'custom', + // eslint-disable-next-line @typescript-eslint/no-unused-vars + TAddress extends Address = Address, + >({ signer }) } diff --git a/tsconfig.json b/tsconfig.json index 68e87ac3a..c6de7bfdd 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -52,7 +52,8 @@ "typeRoots": ["node_modules/@types"], "paths": { "@/": ["./src/"], - "permissionless/*": ["src/permissionless.d.ts"] + "permissionless/*": ["src/permissionless.d.ts"], + "@zerodev/permissions/signers": ["src/permissionless.d.ts"] } }, "include": ["src/**/*"], diff --git a/yarn.lock b/yarn.lock index b98dfb604..563a4d99b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1709,6 +1709,18 @@ "@noble/hashes" "~1.3.2" "@scure/base" "~1.1.4" +"@simplewebauthn/browser@^9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@simplewebauthn/browser/-/browser-9.0.1.tgz#46a12c2bcefcb199f7fcb6a7e883531cd6efde17" + integrity sha512-wD2WpbkaEP4170s13/HUxPcAV5y4ZXaKo1TfNklS5zDefPinIgXOpgz1kpEvobAsaLPa2KeH7AKKX/od1mrBJw== + dependencies: + "@simplewebauthn/types" "^9.0.1" + +"@simplewebauthn/types@^9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@simplewebauthn/types/-/types-9.0.1.tgz#3a68d50e63d8821cf2067de3324c68d5e8120d0c" + integrity sha512-tGSRP1QvsAvsJmnOlRQyw/mvK9gnPtjEc5fg2+m8n+QUa+D7rvrKkOYyfpy42GTs90X3RDOnqJgfHt+qO67/+w== + "@sinclair/typebox@^0.27.8": version "0.27.8" resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" @@ -2587,19 +2599,20 @@ resolved "https://registry.yarnpkg.com/@zerodev/ecdsa-validator/-/ecdsa-validator-5.2.3.tgz#19f55620c2254df53677662ce0715172675f28ed" integrity sha512-zeJjYhOW5EWK6XnctPt3iVnrqmrHfb81p/fJKaY4yQnL2ZYPrH37ZgtY1z5COETPCDTm65+jPfc1Zn/dziyAXQ== -"@zerodev/sdk@5.2.11": - version "5.2.11" - resolved "https://registry.yarnpkg.com/@zerodev/sdk/-/sdk-5.2.11.tgz#56841b9416889f0fb1fd9beb461f6c6d6a6c802e" - integrity sha512-42wl3vW+CPQTghOnAlVAwEiT7Aa+cb89EztY5NCX03jGHj64D38ZIRytZkIu4pleGGFHL7B29af6RYzGJPO0NQ== +"@zerodev/permissions@5.2.6": + version "5.2.6" + resolved "https://registry.yarnpkg.com/@zerodev/permissions/-/permissions-5.2.6.tgz#3b2d458dd796f67f430ce5efbdf504b993112f4f" + integrity sha512-y+Vr7wyhuL3g9//doJ9eEqNkh+zLFsf62sP3q9/SjgRZTvkXxw1Hn5iBJ7mxhHPj5tRxQCzWLojKQAOu731Iig== dependencies: - semver "^7.6.0" + "@simplewebauthn/browser" "^9.0.1" + merkletreejs "^0.3.11" -"@zerodev/session-key@^5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@zerodev/session-key/-/session-key-5.3.0.tgz#d347134a359d06ec03f6bb8378345d5d2d3f4c22" - integrity sha512-HZAFuhUiiG2bx8fqBW1LujH7Rn8zdbraipOoFXh55tDTyA3GX6M4RgiqzZPRoHMYfCYImE6ETBj0a97PjsBRHQ== +"@zerodev/sdk@5.2.12": + version "5.2.12" + resolved "https://registry.yarnpkg.com/@zerodev/sdk/-/sdk-5.2.12.tgz#e3b3bcefe2fbe8ceae3ac3341e32a9d45aa9509a" + integrity sha512-UvEITrmHKsWZMTUVyG3nKqLEjEmApyMx/rzbQZUeVWTKWiGGNJNd30UHG3mWe0jppahVduODagOzdkLrHdidpQ== dependencies: - merkletreejs "^0.3.11" + semver "^7.6.0" JSONStream@^1.3.5: version "1.3.5" @@ -9039,10 +9052,10 @@ pbkdf2@^3.0.17, pbkdf2@^3.0.3, pbkdf2@^3.1.2: safe-buffer "^5.0.1" sha.js "^2.4.8" -permissionless@^0.1.22: - version "0.1.22" - resolved "https://registry.yarnpkg.com/permissionless/-/permissionless-0.1.22.tgz#9668b8719a6d819677fb479731a09fc15a99595a" - integrity sha512-C+1l3dkYKOicCilPXLbm5JfnLOKK+Efprg69SG+WRsNjuXHi4zSdQgex/7lF5hh4WvcaWRRMm1NCA523XlwCJw== +permissionless@0.1.28: + version "0.1.28" + resolved "https://registry.yarnpkg.com/permissionless/-/permissionless-0.1.28.tgz#3609b7ee431866eb45821707593651991da65355" + integrity sha512-JjE4IofN2B1pqB4L7g/9G325pKXCGuPHfpc390jtVvk4CjnIIVQN1NwO97eb+bAYty+1aoBgYsw6ezxH1WmgWA== picocolors@^1.0.0: version "1.0.0"