From 12071df5eb002c83a8a3f076d4b6a44e3d5bfbed Mon Sep 17 00:00:00 2001 From: Hugo Masclet Date: Fri, 2 Feb 2024 13:59:09 +0100 Subject: [PATCH 1/4] Delete outdated script and lsp-factory --- bun.lockb | Bin 333720 -> 304652 bytes package.json | 1 - universal-profile/create-up.ts | 47 ------------ universal-profile/update-profile-data.ts | 91 ----------------------- 4 files changed, 139 deletions(-) delete mode 100644 universal-profile/create-up.ts delete mode 100644 universal-profile/update-profile-data.ts diff --git a/bun.lockb b/bun.lockb index ed6afaac08a371aaa48ec10f546752e6595f626b..eaab7ca5cb4778ac4143291ebfbc10523655b1db 100755 GIT binary patch delta 46172 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 YjH3>xa2;?I+vY0dTxl2krr75FA73EH#{d8T delta 64170 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

-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 { - try { - // Upload our JSON file to IPFS - const lspFactory = new LSPFactory(RPC_ENDPOINT, { - deployKey: PRIVATE_KEY, - chainId: CHAIN_ID, - }); - const uploadResult = await lspFactory.UniversalProfile.uploadProfileData( - jsonFile.LSP3Profile, - ); - - const lsp3ProfileIPFSUrl = uploadResult.url; - - // Setup erc725.js - const schema = [ - { - name: 'LSP3Profile', - key: '0x5ef83ad9559033e6e941db7d7c495acdce616347d28e90c7ce47cbfcfcad3bc5', - keyType: 'Singleton', - valueContent: 'JSONURL', - valueType: 'bytes', - }, - ]; - - const erc725 = new ERC725(schema, UNIVERSAL_PROFILE_ADDRESS, provider, { - ipfsGateway: IPFS_GATEWAY, - }); - - // Encode the LSP3Profile data (to be written on our UP) - const encodedData = erc725.encodeData([ - { - keyName: 'LSP3Profile', - value: { - json: jsonFile, - url: lsp3ProfileIPFSUrl, - }, - }, - ]); - - // Load our EOA - const wallet = new ethers.Wallet(PRIVATE_KEY, provider); - console.log('EOA:', wallet.address); - - // Create instances of our Contracts - const universalProfileContract = new ethers.Contract( - UNIVERSAL_PROFILE_ADDRESS, - UniversalProfile.abi, - wallet, - ); - - const keyManagerAddress = await universalProfileContract.owner(); - const keyManagerContract = new ethers.Contract( - keyManagerAddress, - KeyManager.abi, - wallet, - ); - - // Set updated LSP3Profile metadata to our Universal Profile - - // encode the setData payload - const abiPayload = universalProfileContract.interface.encodeFunctionData( - 'setData', - [encodedData.keys, encodedData.values], - ); - - // Execute via the KeyManager, passing the UP payload - await keyManagerContract.execute(abiPayload, { gasLimit: 300000 }); - console.log('Profile data updated successfully.'); - } catch (error) { - console.error('Error:', error); - } -})(); From 55b6f31f36a3539af7712cc70373f8c54ac63191 Mon Sep 17 00:00:00 2001 From: Hugo Masclet Date: Fri, 2 Feb 2024 13:59:22 +0100 Subject: [PATCH 2/4] Add help messages in universal-profile scripts --- README.md | 3 +-- key-manager/set-permissions.ts | 2 +- universal-profile/extract-profile-data.ts | 3 +++ universal-profile/fetch-json-data.ts | 3 +++ universal-profile/get-controller-permissions.ts | 11 +++++++++-- universal-profile/get-data-keys.ts | 8 +++++++- 6 files changed, 24 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 99ca221..53d9f79 100644 --- a/README.md +++ b/README.md @@ -5,11 +5,11 @@ Convenient code snippets to interact with [LSP](https://docs.lukso.tech/standard ## Contents - [`universal-profile`](./universal-profile): Universal Profile related scripts +- [`digital-assets`](./digital-assets/): Digital assets (LSP7/8) scripts - [`interface-detection`](./interface-detection): Verify EIP165 Standard Compatibility - [`key-manager`](./key-manager): Permission Management of Controller Keys - [`metadata-detection`](./metadata-detection): Verify ERC725Y Storage Compatability - [`transfer-lyx`](./transfer-lyx): Coin Transfers for Backend and Extension -- [`digital-assets`](./digital-assets/): Digital assets (LSP7/8) scripts ### 📑 Smart contracts @@ -18,7 +18,6 @@ Convenient code snippets to interact with [LSP](https://docs.lukso.tech/standard ### LUKSO Libraries - [`@erc725/erc725.js`](https://docs.lukso.tech/tools/erc725js/getting-started) -- [`@lukso/lsp-factory.js`](https://docs.lukso.tech/tools/lsp-factoryjs/getting-started) - [`@lukso/lsp-smart-contracts`](https://docs.lukso.tech/tools/lsp-smart-contracts/getting-started) Please check the versions used in the [`package.json`](./package.json) diff --git a/key-manager/set-permissions.ts b/key-manager/set-permissions.ts index 6522f54..f750844 100644 --- a/key-manager/set-permissions.ts +++ b/key-manager/set-permissions.ts @@ -38,7 +38,7 @@ async function setPermission() { const permissionParams = [ bobPermissions, - 3, // 3 because UP owner + Universal Receiver Delegate permission have already been set by lsp-factory + 3, // 3 because UP owner + Universal Receiver Delegate permission have already been set on profile creation bobAddress, ]; diff --git a/universal-profile/extract-profile-data.ts b/universal-profile/extract-profile-data.ts index de75433..3ff5c4a 100644 --- a/universal-profile/extract-profile-data.ts +++ b/universal-profile/extract-profile-data.ts @@ -8,6 +8,9 @@ const RPC_ENDPOINT = 'https://rpc.testnet.lukso.gateway.fm'; const IPFS_GATEWAY = 'https://api.universalprofile.cloud/ipfs'; const SAMPLE_PROFILE_ADDRESS = '0x9139def55c73c12bcda9c44f12326686e3948634'; +// Note: You can debug any smart contract by using the ERC725 Tools +// https://erc725-inspect.lukso.tech/inspector?address=0x9139def55c73c12bcda9c44f12326686e3948634&network=testnet + // Parameters for ERC725 Instance const config = { ipfsGateway: IPFS_GATEWAY }; diff --git a/universal-profile/fetch-json-data.ts b/universal-profile/fetch-json-data.ts index 66befff..46731e7 100644 --- a/universal-profile/fetch-json-data.ts +++ b/universal-profile/fetch-json-data.ts @@ -11,6 +11,9 @@ const erc725js = new ERC725( }, ); +// 💡 Note: You can debug any smart contract by using the ERC725 Tools +// 👉 https://erc725-inspect.lukso.tech/inspector?address=0xEda145b45f76EDB44F112B0d46654044E7B8F319&network=testnet + // Download and verify the profile metadata JSON file const profileMetaData = await erc725js.fetchData('LSP3Profile'); console.log(JSON.stringify(profileMetaData, undefined, 2)); diff --git a/universal-profile/get-controller-permissions.ts b/universal-profile/get-controller-permissions.ts index ce9422d..a6934bf 100644 --- a/universal-profile/get-controller-permissions.ts +++ b/universal-profile/get-controller-permissions.ts @@ -1,12 +1,19 @@ import { ERC725 } from '@erc725/erc725.js'; import LSP6Schema from '@erc725/erc725.js/schemas/LSP6KeyManager.json'; -// Setup with sample address and testnet RPC -const myUniversalProfileAddress = '0xC26508178c4D7d3Ad43Dcb9F9bb1fab9ceeD58B5'; +const myUniversalProfileAddress = '0xEda145b45f76EDB44F112B0d46654044E7B8F319'; + +// 💡 Note: You can debug any smart contract by using the ERC725 Tools +// 👉 https://erc725-inspect.lukso.tech/inspector?address=0xEda145b45f76EDB44F112B0d46654044E7B8F319&network=testnet + +// https://docs.lukso.tech/networks/testnet/parameters const RPC_ENDPOINT = 'https://rpc.testnet.lukso.network'; const erc725 = new ERC725(LSP6Schema, myUniversalProfileAddress, RPC_ENDPOINT); +// 💡 You can debug permissions from ERC725 Tools +// 👉 https://erc725-inspect.lukso.tech/key-manager + async function getPermissionedAddresses() { // Get the list of addresses that have permissions on the Universal Profile const result = await erc725.getData('AddressPermissions[]'); diff --git a/universal-profile/get-data-keys.ts b/universal-profile/get-data-keys.ts index e184b9b..cf06a54 100644 --- a/universal-profile/get-data-keys.ts +++ b/universal-profile/get-data-keys.ts @@ -1,10 +1,16 @@ import { ERC725 } from '@erc725/erc725.js'; +// 💡 You can load the default schemas directly from @erc725.js +// https://docs.lukso.tech/tools/erc725js/schemas import lsp3ProfileSchema from '@erc725/erc725.js/schemas/LSP3ProfileMetadata.json'; +const myUniversalProfileAddress = '0x9139def55c73c12bcda9c44f12326686e3948634'; +// Note: You can debug any smart contract by using the ERC725 Tools +// https://erc725-inspect.lukso.tech/inspector?address=0x9139def55c73c12bcda9c44f12326686e3948634&network=testnet + // Initatiate erc725.js const erc725js = new ERC725( lsp3ProfileSchema, - '0x9139def55c73c12bcda9c44f12326686e3948634', // UP Contract Address + myUniversalProfileAddress, 'https://rpc.testnet.lukso.gateway.fm', { ipfsGateway: 'https://api.universalprofile.cloud/ipfs', From 502d6d31944f4c7ffbb03f417e0a235f908f3a5c Mon Sep 17 00:00:00 2001 From: Hugo Masclet Date: Fri, 2 Feb 2024 14:14:25 +0100 Subject: [PATCH 3/4] Update scripts --- metadata-detection/README.md | 4 +++ metadata-detection/digital-asset-check.ts | 38 ++++++++++------------- metadata-detection/profile-check.ts | 37 ++++++++++------------ metadata-detection/vault-check.ts | 36 ++++++++++----------- transfer-lyx/backend-lyx-transaction.ts | 5 ++- transfer-lyx/regular-lyx-transaction.ts | 3 ++ universal-profile/extract-profile-data.ts | 4 +-- 7 files changed, 63 insertions(+), 64 deletions(-) diff --git a/metadata-detection/README.md b/metadata-detection/README.md index 3111ed9..803f582 100644 --- a/metadata-detection/README.md +++ b/metadata-detection/README.md @@ -4,3 +4,7 @@ Before interacting with a smart contract, you might need to check if the contrac - https://docs.lukso.tech/standards/standard-detection - https://docs.lukso.tech/standards/tokens/LSP4-Digital-Asset-Metadata#supportedstandardslsp4digitalasset + +## Related guides + +- [Standard Detection - LUKSO Guides](https://docs.lukso.tech/learn/dapp-developer/standard-detection/#metadata-detection) diff --git a/metadata-detection/digital-asset-check.ts b/metadata-detection/digital-asset-check.ts index f01c8b4..aa4c357 100644 --- a/metadata-detection/digital-asset-check.ts +++ b/metadata-detection/digital-asset-check.ts @@ -1,33 +1,29 @@ import { ERC725 } from '@erc725/erc725.js'; import lsp4Schema from '@erc725/erc725.js/schemas/LSP4DigitalAsset.json'; +// 💡 Note: You can debug any smart contract by using the ERC725 Tools +// 👉 https://erc725-inspect.lukso.tech/inspector?address=0x86e817172b5c07f7036bf8aa46e2db9063743a83&network=mainnet +const assetContractAddress = '0x86e817172b5c07f7036bf8aa46e2db9063743a83'; + // Initatiate erc725.js const erc725js = new ERC725( lsp4Schema, - '0x6395b330F063F96579aA8F7b59f2584fb9b6c3a5', - 'https://rpc.testnet.lukso.gateway.fm', + assetContractAddress, + 'https://rpc.lukso.gateway.fm', {}, ); -// Fetch the supported storage standard -let isLSP4 = false; - // Verify if the standard is supported (value !== null) +// 📚 https://docs.lukso.tech/standards/tokens/LSP4-Digital-Asset-Metadata#supportedstandardslsp4digitalasset const data = await erc725js.getData('SupportedStandards:LSP4DigitalAsset'); -if (data.value !== null) { - isLSP4 = true; -} - -console.log(isLSP4); +const isLSP4 = data.value !== null; -/* -Supported schemas from erc725.js library: - -LSP1UniversalReceiverDelegate LSP3ProfileMetadata -LSP4DigitalAsset LSP5ReceivedAssets -LSP6KeyManager LSP8IdentifiableDigitalAsset -LSP9Vault LSP10ReceivedVaults -LSP12IssuedAssets LSP17ContractExtension - -All fetchable keys can be found within @erc725/erc725.js/schemas/[schema].json -*/ +if (isLSP4) { + console.log( + `✅ The contract: ${assetContractAddress} supports the LSP4DigitalAsset standard`, + ); +} else { + console.log( + `❌ The address: ${assetContractAddress} does not supports the LSP4DigitalAsset standard`, + ); +} diff --git a/metadata-detection/profile-check.ts b/metadata-detection/profile-check.ts index d2746af..11c8bdb 100644 --- a/metadata-detection/profile-check.ts +++ b/metadata-detection/profile-check.ts @@ -1,33 +1,30 @@ import { ERC725 } from '@erc725/erc725.js'; import lsp3ProfileSchema from '@erc725/erc725.js/schemas/LSP3ProfileMetadata.json'; +// 💡 Note: You can debug any smart contract by using the ERC725 Tools +// 👉 https://erc725-inspect.lukso.tech/inspector?address=0x9139def55c73c12bcda9c44f12326686e3948634&network=testnet + +const profileContractAddress = '0x9139def55c73c12bcda9c44f12326686e3948634'; + // Initatiate erc725.js const erc725js = new ERC725( lsp3ProfileSchema, - '0x9139def55c73c12bcda9c44f12326686e3948634', + profileContractAddress, 'https://rpc.testnet.lukso.gateway.fm', {}, ); -// Fetch the supported storage standard -let isLSP3 = false; - // Verify if the standard is supported (value !== null) +// 📚 https://docs.lukso.tech/standards/universal-profile/lsp3-profile-metadata/#supportedstandardslsp3profile const data = await erc725js.getData('SupportedStandards:LSP3Profile'); -if (data.value !== null) { - isLSP3 = true; -} +const isLSP3 = data.value !== null; -console.log(isLSP3); - -/* -Supported schemas from erc725.js library: - -LSP1UniversalReceiverDelegate LSP3ProfileMetadata -LSP4DigitalAsset LSP5ReceivedAssets -LSP6KeyManager LSP8IdentifiableDigitalAsset -LSP9Vault LSP10ReceivedVaults -LSP12IssuedAssets LSP17ContractExtension - -All fetchable keys can be found within @erc725/erc725.js/schemas/[schema].json -*/ +if (isLSP3) { + console.log( + `✅ The contract: ${profileContractAddress} supports the LSP3Profile standard`, + ); +} else { + console.log( + `❌ The address: ${profileContractAddress} does not supports the LSP3Profile standard`, + ); +} diff --git a/metadata-detection/vault-check.ts b/metadata-detection/vault-check.ts index 6fe36bb..893ce87 100644 --- a/metadata-detection/vault-check.ts +++ b/metadata-detection/vault-check.ts @@ -1,33 +1,29 @@ import { ERC725 } from '@erc725/erc725.js'; import lsp9VaultSchema from '@erc725/erc725.js/schemas/LSP9Vault.json'; +// 📚 https://docs.lukso.tech/learn/dapp-developer/standard-detection/#metadata-detection + +// TODO: this is an old vault and its interface ID is not correct +const vaultContractAddress = '0x9139def55c73c12bcda9c44f12326686e3948634'; + // Initatiate erc725.js const erc725js = new ERC725( lsp9VaultSchema, - '0x9139def55c73c12bcda9c44f12326686e3948634', + vaultContractAddress, 'https://rpc.testnet.lukso.gateway.fm', {}, ); -// Fetch the supported storage standard -let isLSP9 = false; - // Verify if the standard is supported (value !== null) const data = await erc725js.getData('SupportedStandards:LSP9Vault'); -if (data.value !== null) { - isLSP9 = true; -} +const isLSP9 = data.value !== null; -console.log(isLSP9); - -/* -Supported schemas from erc725.js library: - -LSP1UniversalReceiverDelegate LSP3ProfileMetadata -LSP4DigitalAsset LSP5ReceivedAssets -LSP6KeyManager LSP8IdentifiableDigitalAsset -LSP9Vault LSP10ReceivedVaults -LSP12IssuedAssets LSP17ContractExtension - -All fetchable keys can be found within @erc725/erc725.js/schemas/[schema].json -*/ +if (isLSP9) { + console.log( + `✅ The contract: ${vaultContractAddress} supports the LSP9Vault standard`, + ); +} else { + console.log( + `❌ The address: ${vaultContractAddress} does not supports the LSP9Vault standard`, + ); +} diff --git a/transfer-lyx/backend-lyx-transaction.ts b/transfer-lyx/backend-lyx-transaction.ts index 15b5280..edc376e 100644 --- a/transfer-lyx/backend-lyx-transaction.ts +++ b/transfer-lyx/backend-lyx-transaction.ts @@ -8,6 +8,9 @@ const provider = new ethers.JsonRpcProvider(RPC_ENDPOINT); // Get the controller key of the Universal Profile const controller = '0x...'; // Replace with the controller address +// 💡 Request LYXt from the faucet: +// 🚰 https://faucet.testnet.lukso.network/ + // Instantiate Universal Profile const userProfileAddress = '0x...'; // Replace with the user's profile address const myUniversalProfile = new ethers.Contract( @@ -23,7 +26,7 @@ const myUniversalProfile = new ethers.Contract( const transaction = await myUniversalProfile.execute( 0, // operation of type CALL '0x...', // recipient address including profiles and vaults - ethers.parseEther('3'), // amount in LYX, converting to wei + ethers.parseEther('0.5'), // amount in LYX, converting to wei '0x...', // contract calldata, empty for regular transfer { gasLimit: 300000, from: controller }, // gas limit of the transaction and sender address ); diff --git a/transfer-lyx/regular-lyx-transaction.ts b/transfer-lyx/regular-lyx-transaction.ts index b7b9478..5a2d17f 100644 --- a/transfer-lyx/regular-lyx-transaction.ts +++ b/transfer-lyx/regular-lyx-transaction.ts @@ -6,6 +6,9 @@ const provider = new ethers.BrowserProvider(window.ethereum); // https://docs.lukso.tech/learn/dapp-developer/transfer-lyx +// 💡 Request LYXt from the faucet: +// 🚰 https://faucet.testnet.lukso.network/ + try { // Request user accounts (connect to wallet) const accounts = await provider.send('eth_requestAccounts', []); diff --git a/universal-profile/extract-profile-data.ts b/universal-profile/extract-profile-data.ts index 3ff5c4a..1e89581 100644 --- a/universal-profile/extract-profile-data.ts +++ b/universal-profile/extract-profile-data.ts @@ -8,8 +8,8 @@ const RPC_ENDPOINT = 'https://rpc.testnet.lukso.gateway.fm'; const IPFS_GATEWAY = 'https://api.universalprofile.cloud/ipfs'; const SAMPLE_PROFILE_ADDRESS = '0x9139def55c73c12bcda9c44f12326686e3948634'; -// Note: You can debug any smart contract by using the ERC725 Tools -// https://erc725-inspect.lukso.tech/inspector?address=0x9139def55c73c12bcda9c44f12326686e3948634&network=testnet +// 💡 Note: You can debug any smart contract by using the ERC725 Tools +// 👉 https://erc725-inspect.lukso.tech/inspector?address=0x9139def55c73c12bcda9c44f12326686e3948634&network=testnet // Parameters for ERC725 Instance const config = { ipfsGateway: IPFS_GATEWAY }; From a9c1a40d5ee7aea282b138682c602afc4b1ce8f1 Mon Sep 17 00:00:00 2001 From: Hugo Masclet Date: Fri, 2 Feb 2024 14:29:27 +0100 Subject: [PATCH 4/4] Improve docs --- digital-assets/extract-asset-data.ts | 31 +++++--- interface-detection/erc165-interface-check.ts | 79 +++++++++++-------- 2 files changed, 64 insertions(+), 46 deletions(-) diff --git a/digital-assets/extract-asset-data.ts b/digital-assets/extract-asset-data.ts index 56b0d38..47089e4 100644 --- a/digital-assets/extract-asset-data.ts +++ b/digital-assets/extract-asset-data.ts @@ -1,12 +1,15 @@ import { ERC725 } from '@erc725/erc725.js'; import LSP4Schema from '@erc725/erc725.js/schemas/LSP4DigitalAsset.json'; -import 'isomorphic-fetch'; import { FetchDataOutput } from '@erc725/erc725.js/build/main/src/types/decodeData.js'; -// Static variables -const RPC_ENDPOINT = 'https://rpc.testnet.lukso.gateway.fm'; +// https://docs.lukso.tech/networks/mainnet/parameters +const RPC_ENDPOINT = 'https://rpc.lukso.gateway.fm'; const IPFS_GATEWAY = 'https://api.universalprofile.cloud/ipfs'; -const SAMPLE_ASSET_ADDRESS = '0x6395b330F063F96579aA8F7b59f2584fb9b6c3a5'; + +// 💡 Note: You can debug any smart contract by using the ERC725 Tools +// 👉 https://erc725-inspect.lukso.tech/inspector?address=0x61b083f1fb63ba2F064990f01B233B547ED4F5Cb&network=mainnet +const SAMPLE_ASSET_CONTRACT_ADDRESS = + '0x61b083f1fb63ba2F064990f01B233B547ED4F5Cb'; // Parameters for the ERC725 instance const config = { ipfsGateway: IPFS_GATEWAY }; @@ -43,16 +46,18 @@ async function fetchAssetData(address: string): Promise { /* * Read properties of an asset */ +// eslint-disable-next-line @typescript-eslint/no-unused-vars async function getAssetProperties(assetJSON: any) { - let assetImageData = []; - let iconImageData = []; + let assetImageData: any = []; + let iconImageData: any = []; + try { if (assetJSON.value.LSP4Metadata.images[0]) { assetImageData = assetJSON.value.LSP4Metadata.images; for (const i in assetImageData) { assetImageLinks.push([ i, - assetImageData[i].url.replace('ipfs://', IPFS_GATEWAY), + assetImageData[i][0].url.replace('ipfs://', IPFS_GATEWAY), ]); } console.log( @@ -100,8 +105,12 @@ async function getAssetProperties(assetJSON: any) { } // Debug -fetch(SAMPLE_ASSET_ADDRESS).then(async () => { - const assetData = await fetchAssetData(SAMPLE_ASSET_ADDRESS); + +const main = async () => { + const assetData = await fetchAssetData(SAMPLE_ASSET_CONTRACT_ADDRESS); console.log(JSON.stringify(assetData, undefined, 2)); - getAssetProperties(assetData); -}); + // TODO: this does not work + // getAssetProperties(assetData); +}; + +main(); diff --git a/interface-detection/erc165-interface-check.ts b/interface-detection/erc165-interface-check.ts index a83f823..a467651 100644 --- a/interface-detection/erc165-interface-check.ts +++ b/interface-detection/erc165-interface-check.ts @@ -4,18 +4,20 @@ import lsp4Schema from '@erc725/erc725.js/schemas/LSP4DigitalAsset.json'; import UniversalProfile from '@lukso/lsp-smart-contracts/artifacts/UniversalProfile.json'; import { INTERFACE_IDS } from '@lukso/lsp-smart-contracts'; -// https://docs.lukso.tech/contracts/interface-ids -// https://docs.lukso.tech/learn/dapp-developer/standard-detection - -// Asset Example -const myAsset = new ERC725( - lsp4Schema, - '0x6395b330F063F96579aA8F7b59f2584fb9b6c3a5', - 'https://rpc.testnet.lukso.gateway.fm', - { - ipfsGateway: 'https://api.universalprofile.cloud/ipfs', - }, -); +// 📚 https://docs.lukso.tech/contracts/interface-ids +// 📚 https://docs.lukso.tech/learn/dapp-developer/standard-detection + +// 💡 Note: You can debug any smart contract by using the ERC725 Tools +// 👉 https://erc725-inspect.lukso.tech/inspector?address=0x61b083f1fb63ba2F064990f01B233B547ED4F5Cb&network=mainnet +const SAMPLE_ASSET_CONTRACT_ADDRESS = + '0x61b083f1fb63ba2F064990f01B233B547ED4F5Cb'; + +// https://docs.lukso.tech/networks/mainnet/parameters +const RPC_URL = 'https://rpc.lukso.gateway.fm'; + +const myAsset = new ERC725(lsp4Schema, SAMPLE_ASSET_CONTRACT_ADDRESS, RPC_URL, { + ipfsGateway: 'https://api.universalprofile.cloud/ipfs', +}); const isLSP7 = await myAsset.supportsInterface(INTERFACE_IDS.LSP7DigitalAsset); @@ -23,39 +25,46 @@ const isLSP8 = await myAsset.supportsInterface( INTERFACE_IDS.LSP8IdentifiableDigitalAsset, ); -console.log(isLSP7, isLSP8); // true or false +if (isLSP7) { + console.log( + `✅ The contract: ${SAMPLE_ASSET_CONTRACT_ADDRESS} supports the LSP7 interface ID`, + ); +} +if (isLSP8) { + console.log( + `✅ The contract: ${SAMPLE_ASSET_CONTRACT_ADDRESS} supports the LSP8 interface ID`, + ); +} -// Profile Example -const provider = new ethers.JsonRpcProvider( - 'https://rpc.testnet.lukso.network', -); +const provider = new ethers.JsonRpcProvider(RPC_URL); + +// 💡 Note: You can debug any smart contract by using the ERC725 Tools +// 👉 https://erc725-inspect.lukso.tech/inspector?address=0xe65e927d0eccaaab6972170b489d3c1455955116&network=mainnet +const universalProfileContractAddress = + '0xe65e927d0eccaaab6972170b489d3c1455955116'; // Create an instance of the Universal Profile -const myProfile = new ethers.Contract( - '0x9139def55c73c12bcda9c44f12326686e3948634', +const myProfileContract = new ethers.Contract( + universalProfileContractAddress, UniversalProfile.abi, provider, ); -const isLSP0 = await myProfile.supportsInterface( +const isLSP0 = await myProfileContract.supportsInterface( INTERFACE_IDS.LSP0ERC725Account, ); -console.log(isLSP0); // true or false + +if (isLSP0) { + console.log( + `✅ The contract: ${universalProfileContractAddress} supports the LSP0ERC725Account interface ID`, + ); +} else { + console.log( + `❌ The address: ${universalProfileContractAddress} does not supports the LSP0ERC725Account interface ID`, + ); +} /* Supported interfaces from lsp-smart-contracts library: - -INTERFACE_IDS.ERC165 INTERFACE_IDS.ERC20 -INTERFACE_IDS.ERC223 INTERFACE_IDS.ERC721 -INTERFACE_IDS.ERC721Metadata INTERFACE_IDS.ERC725X -INTERFACE_IDS.ERC725Y INTERFACE_IDS.ERC777 -INTERFACE_IDS.ERC1155 - -INTERFACE_IDS.LSP0ERC725Account INTERFACE_IDS.LSP1UniversalReceiver -INTERFACE_IDS.LSP6KeyManager INTERFACE_IDS.LSP7DigitalAsset -INTERFACE_IDS.LSP8IdentifiableDigitalAsset INTERFACE_IDS.LSP9Vault -INTERFACE_IDS.LSP11BasicSocialRecovery INTERFACE_IDS.LSP14Ownable2Step -INTERFACE_IDS.LSP17Extendable INTERFACE_IDS.LSP17Extension -INTERFACE_IDS.LSP20CallVerification INTERFACE_IDS.LSP20CallVerifier -INTERFACE_IDS.LSP25ExecuteRelayCall +https://docs.lukso.tech/tools/lsp-smart-contracts/constants */