diff --git a/apps/remix-ide/src/app.ts b/apps/remix-ide/src/app.ts index 72c7c42f49f..4cfd1c06854 100644 --- a/apps/remix-ide/src/app.ts +++ b/apps/remix-ide/src/app.ts @@ -109,8 +109,8 @@ import Filepanel from './app/panels/file-panel' import Editor from './app/editor/editor' import Terminal from './app/panels/terminal' import TabProxy from './app/panels/tab-proxy.js' -import { Plugin } from '@remixproject/engine' import BottomBarPanel from './app/components/bottom-bar-panel' +import { Circles } from './app/plugins/circles' const _paq = (window._paq = window._paq || []) @@ -403,6 +403,8 @@ class AppComponent { const walletConnect = new WalletConnect() + const circles = new Circles() + this.engine.register([ permissionHandler, this.layout, @@ -459,7 +461,8 @@ class AppComponent { scriptRunnerUI, remixAI, remixAiAssistant, - walletConnect + walletConnect, + circles ]) //---- fs plugin @@ -736,7 +739,7 @@ class AppComponent { }) // activate solidity plugin - this.appManager.activatePlugin(['solidity', 'udapp', 'deploy-libraries', 'link-libraries', 'openzeppelin-proxy', 'scriptRunnerBridge']) + this.appManager.activatePlugin(['solidity', 'udapp', 'deploy-libraries', 'link-libraries', 'openzeppelin-proxy', 'scriptRunnerBridge', 'circles']) if (isElectron()){ this.appManager.activatePlugin(['desktopHost']) diff --git a/apps/remix-ide/src/app/plugins/circles.ts b/apps/remix-ide/src/app/plugins/circles.ts new file mode 100644 index 00000000000..692a056db14 --- /dev/null +++ b/apps/remix-ide/src/app/plugins/circles.ts @@ -0,0 +1,57 @@ +'use strict' +import { Plugin } from '@remixproject/engine' +import { Sdk } from '@circles-sdk/sdk' +import { BrowserProviderContractRunner } from "@circles-sdk/adapter-ethers" +import { BrowserProvider } from 'ethers' +import { GitHubUser } from '@remix-api' + +const _paq = window._paq = window._paq || [] + +const profile = { + name: 'circles', + description: 'circles UBI', + methods: ['initSdk', 'deleteProfile'], + events: [], + version: '1.0.0' +} + +const CIRLCES_KEY = 'CIRLCES_KEY' + +export class Circles extends Plugin { + constructor() { + super(profile) + } + + onActivation(): void {} + + public async initSdk (user: GitHubUser) { + try { + if (!user) { + this.call('terminal', 'log', { type: 'error', value: 'please log in with github before initiating a circles profile'}) + return + } + const adapter = new BrowserProviderContractRunner() + const web3 = await this.call('blockchain', 'web3') + console.log('web3', web3); + // (adapter as any).provider = new BrowserProvider(web3.currentProvider) + await adapter.init(); + const sdk = new Sdk(adapter) + + if (!localStorage.getItem(CIRLCES_KEY)) { + this.call('terminal', 'log', { type: 'log', value: `creating Circles profile...${user.login}`}) + const profileData = { name: user.login, description: '' } + const receipt = await sdk.createOrUpdateProfile(profileData) + localStorage.setItem(CIRLCES_KEY, JSON.stringify(receipt)) + } + this.call('terminal', 'log', { type: 'log', value: 'Circles profile:'}) + this.call('terminal', 'log', { type: 'log', value: localStorage.getItem(CIRLCES_KEY)}) + } catch (e) { + console.error(e) + this.call('terminal', 'log', { type: 'error', value: e.message}) + } + } + + public deleteProfile () { + localStorage.removeItem(CIRLCES_KEY) + } +} \ No newline at end of file diff --git a/apps/remix-ide/src/app/plugins/templates-selection/templates.ts b/apps/remix-ide/src/app/plugins/templates-selection/templates.ts index 760c1ce51e2..669e09fa059 100644 --- a/apps/remix-ide/src/app/plugins/templates-selection/templates.ts +++ b/apps/remix-ide/src/app/plugins/templates-selection/templates.ts @@ -406,6 +406,12 @@ export const templates = (intl: any, plugin: any): TemplateGroup[] => { }, ], }, + { + name: "About Circles", + items: [ + { value: "circles", tagList: [], displayName: 'About Circles', description: 'Templates for interacting with the Cicles Sdk' } + ] + }, { name: 'GitHub Actions', items: [ diff --git a/apps/remix-ide/src/remixEngine.js b/apps/remix-ide/src/remixEngine.js index ba26ef02470..4192e6cef89 100644 --- a/apps/remix-ide/src/remixEngine.js +++ b/apps/remix-ide/src/remixEngine.js @@ -32,6 +32,7 @@ export class RemixEngine extends Engine { if (name === 'contentImport') return { queueTimeout: 60000 * 3 } if (name === 'circom') return { queueTimeout: 60000 * 4 } if (name === 'noir-compiler') return { queueTimeout: 60000 * 4 } + if (name === 'circles') return { queueTimeout: 60000 * 4 } return { queueTimeout: 10000 } } diff --git a/libs/remix-ui/workspace/src/lib/utils/constants.ts b/libs/remix-ui/workspace/src/lib/utils/constants.ts index 631aca1b5c6..ed4f960e835 100644 --- a/libs/remix-ui/workspace/src/lib/utils/constants.ts +++ b/libs/remix-ui/workspace/src/lib/utils/constants.ts @@ -20,6 +20,7 @@ export const TEMPLATE_NAMES = { 'uniswapV4HookBookMultiSigSwapHook': 'Uniswap V4 HookBook MultiSigSwapHook', 'accountAbstraction': 'Account Abstraction Template', 'introToEIP7702': 'Intro to EIP-7702', + 'circles': 'About Circles' } export const TEMPLATE_METADATA: Record = { diff --git a/libs/remix-ws-templates/src/index.ts b/libs/remix-ws-templates/src/index.ts index 92902c0ef31..c58fc8802d8 100644 --- a/libs/remix-ws-templates/src/index.ts +++ b/libs/remix-ws-templates/src/index.ts @@ -13,6 +13,7 @@ export { default as hashchecker } from './templates/hashchecker' export { default as rln } from './templates/rln' export { default as multNr } from './templates/multiplierNoir' export { default as stealthDropNr } from './templates/stealthdropNoir' +export { default as circles } from './templates/circles' export { contractDeployerScripts } from './script-templates/contract-deployer' export { etherscanScripts } from './script-templates/etherscan' diff --git a/libs/remix-ws-templates/src/templates/circles/.prettierrc b/libs/remix-ws-templates/src/templates/circles/.prettierrc new file mode 100644 index 00000000000..ea6cfd4a9c6 --- /dev/null +++ b/libs/remix-ws-templates/src/templates/circles/.prettierrc @@ -0,0 +1,44 @@ +{ + "overrides": [ + { + "files": "*.sol", + "options": { + "printWidth": 80, + "tabWidth": 4, + "useTabs": false, + "singleQuote": false, + "bracketSpacing": false + } + }, + { + "files": "*.yml", + "options": { + } + }, + { + "files": "*.yaml", + "options": { + } + }, + { + "files": "*.toml", + "options": { + } + }, + { + "files": "*.json", + "options": { + } + }, + { + "files": "*.js", + "options": { + } + }, + { + "files": "*.ts", + "options": { + } + } + ] +} \ No newline at end of file diff --git a/libs/remix-ws-templates/src/templates/circles/README.md b/libs/remix-ws-templates/src/templates/circles/README.md new file mode 100644 index 00000000000..9cb9ec016b3 --- /dev/null +++ b/libs/remix-ws-templates/src/templates/circles/README.md @@ -0,0 +1,40 @@ + +### Circles + +This template introduces the usage of the Circles sdk. + +## create-group.ts + +This script creates a new group on the Circles platform using the Circles SDK. It initializes the SDK with a BrowserProviderContractRunner, +defines the group profile, sets up the base group options, creates the group profile CID, creates the base group, +waits for transaction confirmation, extracts the group address from the transaction receipt, and retrieves the group's avatar. + +## group-creation-tx.ts + +This script retrieves and logs information about a group created on the Circles platform using the Circles SDK. +It initializes the SDK with a BrowserProviderContractRunner, fetches a transaction receipt, +extracts the group address from the transaction logs, and then retrieves and logs the group's avatar +and its trust relations. + +## invite-to-group.ts + +This script invites a user to a group on the Circles platform using the Circles SDK. It initializes the SDK with a BrowserProviderContractRunner, +fetches a transaction receipt, extracts the group address from the transaction logs, retrieves the group's avatar, +and then checks if the user is already trusted by the group and trusts the user. + +## pathfinder.ts + +This script finds a path between two addresses on the Circles platform using the CirclesRpc. It initializes the CirclesRpc with the provided URL, +and then calls the 'circlesV2_findPath' method with the source address, target address, and value. + +## set-owner.ts + +This script sets the owner of a group on the Circles platform using the Circles SDK. It initializes the SDK with a BrowserProviderContractRunner, +fetches a transaction receipt, extracts the group address from the transaction logs, retrieves the group's avatar, +and then sets the owner of the group. + +## user.ts + +This script retrieves and logs information about a user's avatar on the Circles platform using the Circles SDK. +It initializes the SDK with a BrowserProviderContractRunner, retrieves the avatar information, +and then logs the mintable amount and the avatar information. diff --git a/libs/remix-ws-templates/src/templates/circles/index.ts b/libs/remix-ws-templates/src/templates/circles/index.ts new file mode 100644 index 00000000000..573acc690fe --- /dev/null +++ b/libs/remix-ws-templates/src/templates/circles/index.ts @@ -0,0 +1,20 @@ +export default async () => { + return { + // @ts-ignore + 'scripts/group-creation-tx.ts': (await import('!!raw-loader!./scripts/group-creation-tx.ts')).default, + // @ts-ignore + 'scripts/create-group.ts': (await import('!!raw-loader!./scripts/create-group.ts')).default, + // @ts-ignore + 'scripts/invite-to-group.ts': (await import('!!raw-loader!./scripts/invite-to-group.ts')).default, + // @ts-ignore + 'scripts/pathfinder.ts': (await import('!!raw-loader!./scripts/pathfinder.ts')).default, + // @ts-ignore + 'scripts/set-owner.ts': (await import('!!raw-loader!./scripts/set-owner.ts')).default, + // @ts-ignore + 'scripts/user.ts': (await import('!!raw-loader!./scripts/user.ts')).default, + // @ts-ignore + '.prettierrc.json': (await import('raw-loader!./.prettierrc')).default, + // @ts-ignore + 'README.md': (await import('raw-loader!./README.md')).default + } +} \ No newline at end of file diff --git a/libs/remix-ws-templates/src/templates/circles/scripts/create-group.ts b/libs/remix-ws-templates/src/templates/circles/scripts/create-group.ts new file mode 100644 index 00000000000..4154c431c2b --- /dev/null +++ b/libs/remix-ws-templates/src/templates/circles/scripts/create-group.ts @@ -0,0 +1,62 @@ +import { Sdk } from '@circles-sdk/sdk' +import { BrowserProviderContractRunner } from "@circles-sdk/adapter-ethers" +import { cidV0ToUint8Array } from '@circles-sdk/utils' +import { ethers } from 'ethers' + +(window as any).ethereum = web3Provider + +const run = async () => { + // Initialize the SDK + const adapter = new BrowserProviderContractRunner(); + await adapter.init(); + const sdk = new Sdk(adapter) + const sender = await (new ethers.BrowserProvider(web3Provider)).getSigner() + + // Define the group profile (symbol is required) + const groupProfile = { + name: '', + symbol: '', + description: '', + imageUrl: '', // optional, can be uploaded via SDK + previewImageUrl: '', // optional, used for previews + } + + // Define base group setup options + const circlesGroupOwner = '' + const groupOwner = circlesGroupOwner + const serviceAddress = sender.address // Replace with actual service address + const feeCollection = circlesGroupOwner // Replace with actual treasury address + const initialConditions = [] + + // Step 1: Create the group profile (CID will be returned) + const profileCID = await sdk.profiles.create(groupProfile) + if (!profileCID) throw new Error('Failed to create profile CID') + + // Step 2: Create the base group using the factory + console.log('group owner will be', sender) + const tx = await sdk.baseGroupFactory.createBaseGroup( + groupOwner, // Usually wallet address of the sender + serviceAddress, + feeCollection, + initialConditions, + groupProfile.name, + groupProfile.symbol, + cidV0ToUint8Array(profileCID), // Convert CID to bytes + ) + + // Wait for transaction confirmation + const receipt = await tx.wait() + + console.log('receipt', receipt) + + // Step 3: Extract the group address from emitted events + const groupAddress = ethers.stripZerosLeft(receipt.logs[15].topics[1]) + + // Step 4: Get the avatar for the created group + const baseGroupAvatar = await sdk.getAvatar(groupAddress.toLowerCase()) + + console.log('Base group created at:', groupAddress) + console.log('Group avatar:', baseGroupAvatar) +} + +run().catch(console.error).then(console.log) \ No newline at end of file diff --git a/libs/remix-ws-templates/src/templates/circles/scripts/group-creation-tx.ts b/libs/remix-ws-templates/src/templates/circles/scripts/group-creation-tx.ts new file mode 100644 index 00000000000..31ecff0c0ec --- /dev/null +++ b/libs/remix-ws-templates/src/templates/circles/scripts/group-creation-tx.ts @@ -0,0 +1,25 @@ +import { ethers } from 'ethers' +import { Sdk } from '@circles-sdk/sdk' +import { BrowserProviderContractRunner } from "@circles-sdk/adapter-ethers" + +const run = async () => { + // Initialize the SDK + const adapter = new BrowserProviderContractRunner(); + await adapter.init(); + const sdk = new Sdk(adapter) + + const txHash = '' // transaction which registered the group. + + const provider = new ethers.BrowserProvider(web3Provider) + const receipt = await provider.getTransactionReceipt(txHash) + const groupAddress = ethers.stripZerosLeft(receipt.logs[15].topics[1]) + + console.log('group address', groupAddress) + const baseGroupAvatar = await sdk.getAvatar(groupAddress.toLowerCase()) + + console.log('group avatar', baseGroupAvatar) + console.log('owner is', await baseGroupAvatar.owner()) + console.log('trust relations are', await baseGroupAvatar.getTrustRelations()) +} + +run().then(console.log).catch(console.error) \ No newline at end of file diff --git a/libs/remix-ws-templates/src/templates/circles/scripts/invite-to-group.ts b/libs/remix-ws-templates/src/templates/circles/scripts/invite-to-group.ts new file mode 100644 index 00000000000..5102035ef3c --- /dev/null +++ b/libs/remix-ws-templates/src/templates/circles/scripts/invite-to-group.ts @@ -0,0 +1,33 @@ +import { ethers } from 'ethers' +import { Sdk } from '@circles-sdk/sdk' +import { BrowserProviderContractRunner } from "@circles-sdk/adapter-ethers" + +(window as any).ethereum = web3Provider + +const run = async () => { + // Initialize the SDK + const adapter = new BrowserProviderContractRunner(); + await adapter.init(); + const sdk = new Sdk(adapter) + + const user = '' + const txHash = '' // transaction which registered the group. + + const provider = new ethers.BrowserProvider(web3Provider) + const receipt = await provider.getTransactionReceipt(txHash) + const groupAddress = ethers.stripZerosLeft(receipt.logs[15].topics[1]) + + console.log('group address', groupAddress) + const baseGroupAvatar = await sdk.getAvatar(groupAddress.toLowerCase()) + + console.log('group avatar', baseGroupAvatar) + + console.log('owner', await baseGroupAvatar.owner()) + console.log('service', await baseGroupAvatar.service()) + + console.log(await baseGroupAvatar.isTrustedBy(user)) + + console.log(await baseGroupAvatar.trust(user)) +} + +run().then(console.log).catch(console.error) \ No newline at end of file diff --git a/libs/remix-ws-templates/src/templates/circles/scripts/pathfinder.ts b/libs/remix-ws-templates/src/templates/circles/scripts/pathfinder.ts new file mode 100644 index 00000000000..a5a17278ff5 --- /dev/null +++ b/libs/remix-ws-templates/src/templates/circles/scripts/pathfinder.ts @@ -0,0 +1,32 @@ +import { CirclesRpc } from '@circles-sdk/data'; + +(window as any).ethereum = web3Provider + +const chainConfig = { + pathfinderUrl: 'https://pathfinder.aboutcircles.com', + circlesRpcUrl: 'https://rpc.aboutcircles.com', + v1HubAddress: '0xdbf22d4e8962db3b2f1d9ff55be728a887e47710', + v2HubAddress: '0x2066CDA98F98397185483aaB26A89445addD6740', + migrationAddress: '0x2A545B54bb456A0189EbC53ed7090BfFc4a6Af94' +}; + +const sourceAddress = '' +const targetAddress = '' +const value = '1000000000000000000' +/* +{"jsonrpc":"2.0","id":0,"method":"circlesV2_findPath","params":[{"Source":"0xf7f307601497eAD8217543Fc9B350Ae6DA5fB5eF","Sink":"0x3765c1633eA9dDaD819B1b7d9A27B1E117f789a2","TargetFlow":"1000000000000000000"}]} +*/ +const run = async () => { + try { + const res = await new CirclesRpc(chainConfig.circlesRpcUrl).call('circlesV2_findPath', [{ + Source: sourceAddress, + Sink: targetAddress, + TargetFlow: value + }]) + console.log(res.result) + } catch (e) { + console.error(e) + } +} + +run().catch(console.error).then(console.log) diff --git a/libs/remix-ws-templates/src/templates/circles/scripts/set-owner.ts b/libs/remix-ws-templates/src/templates/circles/scripts/set-owner.ts new file mode 100644 index 00000000000..3ce5a82e705 --- /dev/null +++ b/libs/remix-ws-templates/src/templates/circles/scripts/set-owner.ts @@ -0,0 +1,26 @@ +import { ethers } from 'ethers' +import { Sdk } from '@circles-sdk/sdk' +import { BrowserProviderContractRunner } from "@circles-sdk/adapter-ethers" + +const run = async () => { + // Initialize the SDK + const adapter = new BrowserProviderContractRunner(); + await adapter.init(); + const sdk = new Sdk(adapter) + + const owner = '' + const txHash = '' // transaction which registered the group. + + const provider = new ethers.BrowserProvider(web3Provider) + const receipt = await provider.getTransactionReceipt(txHash) + const groupAddress = ethers.stripZerosLeft(receipt.logs[15].topics[1]) + + console.log('group address', groupAddress) + const baseGroupAvatar = await sdk.getAvatar(groupAddress.toLowerCase()) + + console.log('group avatar', baseGroupAvatar) + console.log('owner is', await baseGroupAvatar.owner()) + console.log(await baseGroupAvatar.setOwner(owner)) +} + +run().then(console.log).catch(console.error) \ No newline at end of file diff --git a/libs/remix-ws-templates/src/templates/circles/scripts/user.ts b/libs/remix-ws-templates/src/templates/circles/scripts/user.ts new file mode 100644 index 00000000000..c91b1c3b543 --- /dev/null +++ b/libs/remix-ws-templates/src/templates/circles/scripts/user.ts @@ -0,0 +1,24 @@ +import { Sdk } from '@circles-sdk/sdk'; +import { BrowserProviderContractRunner } from "@circles-sdk/adapter-ethers" + +(window as any).ethereum = web3Provider + +const run = async () => { + try { + const adapter = new BrowserProviderContractRunner(); + await adapter.init(); + + const avatarAddress = '' + + const sdk = new Sdk (adapter); + const avatar = await sdk.getAvatar(avatarAddress) + console.log(await avatar.getMintableAmount()) + + const avatarInfo = await sdk.data.getAvatarInfo(avatarAddress); + console.log(avatarInfo) + } catch (e) { + console.error(e) + } +} + +run().catch(console.error).then(console.log) \ No newline at end of file diff --git a/package.json b/package.json index 7a3e5928f95..221a2140e50 100644 --- a/package.json +++ b/package.json @@ -91,6 +91,7 @@ "@apollo/client": "^3.9.5", "@babel/plugin-proposal-class-properties": "^7.16.0", "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", + "@circles-sdk/sdk": "^0.29.1", "@erebos/bzz-node": "^0.13.0", "@ethereumjs/block": "^10.0.0", "@ethereumjs/blockchain": "^10.0.0", diff --git a/yarn.lock b/yarn.lock index 65b4e838fc7..8c7cc2a890c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2270,6 +2270,80 @@ "@chainsafe/persistent-merkle-tree" "^0.4.2" case "^1.6.3" +"@circles-sdk/abi-v1@0.29.1": + version "0.29.1" + resolved "https://registry.yarnpkg.com/@circles-sdk/abi-v1/-/abi-v1-0.29.1.tgz#3d3a32e6fe7d47eec5793a9a0f331eb3c9022e7b" + integrity sha512-A/sbCbWR44Do3JEIWftv61IGzzHpwiwqIiNJ0uMOIZVLoLNEjarDf0OV+nrBMcA1EIJPqJrnmkzEDUyFICONIg== + dependencies: + ethers "^6.13.2" + +"@circles-sdk/abi-v2@0.29.1": + version "0.29.1" + resolved "https://registry.yarnpkg.com/@circles-sdk/abi-v2/-/abi-v2-0.29.1.tgz#96efeb53dc0b1cebbeef8d3f8d81c5598d6efc4d" + integrity sha512-1HcXSEb09yi6YpvKxaIHrqJT0XxZwVZQuFtLK7J2f+fMfGJHB3RfiF3ZtKWw5nu8bcRmgW6gVSEHjwb0oZ7qSw== + dependencies: + ethers "^6.13.2" + +"@circles-sdk/adapter-ethers@0.29.1": + version "0.29.1" + resolved "https://registry.yarnpkg.com/@circles-sdk/adapter-ethers/-/adapter-ethers-0.29.1.tgz#53508fcfcf5ac9d908e5148ee61003b7d426f1e4" + integrity sha512-+OUcPmO32VAEbaqKofltPynyMiPlJBvoi4f/bx690RYWeZU8BFvm8Mh5M09f2McyUVnZQSt5KSqCsv5dSbnCEw== + dependencies: + "@circles-sdk/adapter" "0.29.1" + "@circles-sdk/utils" "0.29.1" + ethers "^6.13.2" + +"@circles-sdk/adapter@0.29.1": + version "0.29.1" + resolved "https://registry.yarnpkg.com/@circles-sdk/adapter/-/adapter-0.29.1.tgz#3773a433b85070a29d6e47fa425ede3d53e48081" + integrity sha512-qQhZc7MuQ2p/CIYMjOeQAqc9PY9VVfncnQlFEpJe4K/8jyP9hma+TUkbhJnbr6GCjJRuu34DnZemU5R8p40VZg== + +"@circles-sdk/data@0.29.1": + version "0.29.1" + resolved "https://registry.yarnpkg.com/@circles-sdk/data/-/data-0.29.1.tgz#269c54d53c0b172555439d622fe31bddaa607891" + integrity sha512-8R06yPjqM8d4VVOlxLVIkw7CFpSNxIIU3pXKsXsfpfCFldgVabZC+wNmkakPzvyK/+sJmuqCn40CHYeugxT8hA== + dependencies: + "@circles-sdk/utils" "0.29.1" + +"@circles-sdk/pathfinder@0.29.1": + version "0.29.1" + resolved "https://registry.yarnpkg.com/@circles-sdk/pathfinder/-/pathfinder-0.29.1.tgz#bc5ad76fceb4f812832427f10e1d26d176cfc168" + integrity sha512-MpSARRDawzRL8QHRL15TK9Fi+eFOClbGYEay8ekICq2SbbC5/tD7pksT/Tw8N+l8uaxx79FKwpFYls2fv/Rr8g== + dependencies: + "@circles-sdk/abi-v2" "0.29.1" + "@circles-sdk/data" "0.29.1" + "@circles-sdk/utils" "0.29.1" + ethers "^6.13.2" + +"@circles-sdk/profiles@0.29.1": + version "0.29.1" + resolved "https://registry.yarnpkg.com/@circles-sdk/profiles/-/profiles-0.29.1.tgz#f276316bb39ac2fec99dd86b85f90d195dee7911" + integrity sha512-Vkra0/P0goZ+sax99iFFMhOIAaGk8emheNxDPN8y68md+j1B9EDZeAJoVbjd5mYP01TEoup7gZimlXPuw9qxtw== + dependencies: + "@circles-sdk/utils" "0.29.1" + +"@circles-sdk/sdk@^0.29.1": + version "0.29.1" + resolved "https://registry.yarnpkg.com/@circles-sdk/sdk/-/sdk-0.29.1.tgz#2e96e38c10304c8fb3df75fc612c5c75f9c7cad5" + integrity sha512-2LbaDrg3HEwiaUsMr2vWm2TDCcnF/29hG2u9Q4w0DDs694XQ/PiMMwArGu/O4CapWPKLcQ94+Nc6YUGptXMTbA== + dependencies: + "@circles-sdk/abi-v1" "0.29.1" + "@circles-sdk/abi-v2" "0.29.1" + "@circles-sdk/adapter-ethers" "0.29.1" + "@circles-sdk/data" "0.29.1" + "@circles-sdk/pathfinder" "0.29.1" + "@circles-sdk/profiles" "0.29.1" + ethers "^6.13.2" + multihashes "^4.0.3" + +"@circles-sdk/utils@0.29.1": + version "0.29.1" + resolved "https://registry.yarnpkg.com/@circles-sdk/utils/-/utils-0.29.1.tgz#029c508c2a1736fa0ddd2db6a4f0884727652e2b" + integrity sha512-3yvYStD7c2KeXc0zNujClRWunE9W56doY5rHXp7F6zRyEZeJ8CjOiHFJHB+ZSY4eI7Btpwn0saYasZxhBJTL/g== + dependencies: + bignumber.js "^9.1.2" + ethers "^6.13.2" + "@coinbase/wallet-sdk@4.3.0": version "4.3.0" resolved "https://registry.yarnpkg.com/@coinbase/wallet-sdk/-/wallet-sdk-4.3.0.tgz#03b8fce92ac2b3b7cf132f64d6008ac081569b4e" @@ -10440,6 +10514,11 @@ bignumber.js@^9.0.0: resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.0.1.tgz#8d7ba124c882bfd8e43260c67475518d0689e4e5" integrity sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA== +bignumber.js@^9.1.2: + version "9.3.1" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.3.1.tgz#759c5aaddf2ffdc4f154f7b493e1c8770f88c4d7" + integrity sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ== + binary-extensions@^1.0.0: version "1.13.1" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" @@ -15171,6 +15250,19 @@ ethers@^5.7.1, ethers@^5.7.2: "@ethersproject/web" "5.7.1" "@ethersproject/wordlists" "5.7.0" +ethers@^6.13.2: + version "6.15.0" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-6.15.0.tgz#2980f2a3baf0509749b7e21f8692fa8a8349c0e3" + integrity sha512-Kf/3ZW54L4UT0pZtsY/rf+EkBU7Qi5nnhonjUb8yTXcxH3cdcWrV2cRyk0Xk/4jK6OoHhxxZHriyhje20If2hQ== + dependencies: + "@adraffy/ens-normalize" "1.10.1" + "@noble/curves" "1.2.0" + "@noble/hashes" "1.3.2" + "@types/node" "22.7.5" + aes-js "4.0.0-beta.5" + tslib "2.7.0" + ws "8.17.1" + ethers@^6.14.0: version "6.14.0" resolved "https://registry.yarnpkg.com/ethers/-/ethers-6.14.0.tgz#b80eca3b60fc97da53f73b77629ce7392568eae0" @@ -22847,7 +22939,7 @@ multihashes@^3.0.1: uint8arrays "^2.0.5" varint "^6.0.0" -multihashes@^4.0.1: +multihashes@^4.0.1, multihashes@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/multihashes/-/multihashes-4.0.3.tgz#426610539cd2551edbf533adeac4c06b3b90fb05" integrity sha512-0AhMH7Iu95XjDLxIeuCOOE4t9+vQZsACyKZ9Fxw2pcsRmlX4iCn1mby0hS0bb+nQOVpdQYWPpnyusw4da5RPhA==