Securely store your Entity Secret. You will use it in this quickstart to create an Entity Secret Ciphertext. Safeguard it to prevent unauthorized access or use.
Developer-controlled wallets enable seamless user interactions with the Web3 ecosystem. It lets you manage wallet operations, such as asset transfers and smart contract actions, on the user's behalf. This simplifies blockchain use for end users.
Before you get started, ensure that you have:
Have a Developer Services account
Created your API key
(Optional) Install the applicable Server-side SDK (required if you register Entity Secret via SDK)
// Developer Controlled Wallets
npm install @circle-fin/developer-controlled-wallets --save
// User Controlled Wallets
npm install @circle-fin/user-controlled-wallets --save
// Contracts
npm install @circle-fin/smart-contract-platform --save
The Entity Secret is a randomly generated 32-byte key that secures developer-controlled wallets. It is hex-encoded, encrypted to ciphertext, and appended to API requests when creating wallets or performing transactions. For security, the ciphertext must be re-encrypted (rotated) when the API requires it. For more information, see Entity Secret Management.
Securely store your Entity Secret. You will use it in this quickstart to create an Entity Secret Ciphertext. Safeguard it to prevent unauthorized access or use.
The public key plays a crucial role in generating the Entity Secret Ciphertext.
Once you have the public key, you will use RSA to encrypt your Entity Secret and generate its ciphertext. Immediately after, you will transform this encrypted data into a Base64 format. The output ciphertext will be exactly 684 characters long.
You can register your Entity Secret in two ways: using the SDK or the Circle Console. The registration links your Entity Secret with your developer account.
You can use the Configurator Page in Developer Services Console to register your Entity Secret Ciphertext.

A recovery file will be generated during the registration of your Entity Secret. In the event that your Entity Secret is ever lost, the recovery file will act as your fallback, enabling you to regain access to your developer-controlled wallets. Ensure that you store this file securely and in a location that you can access readily if needed.
Note: If you use the SDK to register the Entity Secret, the function
downloads a recovery file named recovery*file*\<timestamp\>.dat. Additionally,
the function returns the content of the recovery file as a JSON response.
Welcome to a foundational step in utilizing our Developer Services: initiating your first API call to construct a WalletSet. We'll guide you through the process and clarify what a WalletSet entails within our platform.
A WalletSet within our ecosystem is a sophisticated grouping of wallets, securely tied together by a singular cryptographic key. Leveraging the Hierarchical Deterministic (HD) wallet technology, WalletSets offer an enhanced way to handle wallet management that spans multiple blockchain networks. This is particularly relevant for Ethereum Virtual Machine (EVM) compatible blockchains, where it is common for wallets on different networks to share the same address, thanks to the underlying technology.
As we approach the creation of your inaugural WalletSet, it's important to comprehend a critical aspect of our APIs: idempotency keys.
Idempotency is a fundamental concept which guarantees that an operation is repeatable without changing the outcome. This concept is extremely important in API requests to make sure that if a request is accidentally sent more than once, it doesn't result in duplicate operations.
Consider situations like an unstable internet connection leading to multiple unintentional request submissions, or a user who accidentally activates a command several times. Without idempotency, such events might cause numerous unwanted operations.
To prevent this, an idempotency key is used. Each request includes a distinct key that, when recognized by the server within a certain timeframe as a repeat submission, prevents the repeated processing of that request. This mechanism is crucial to preserving the integrity of your operations, ensuring that only intended actions are carried out.
Now that we've got the concept of idempotency covered, let's look at creating your WalletSet.
| Term | Definition |
|---|---|
| idempotencyKey | Think of this as a safety net. By using a unique UUID for every transaction request, you ensure no transaction is mistakenly processed more than once. It's a measure against unintended duplicates. |
| entitySecretCiphertext | Remember the encryption we discussed earlier? You'll need to provide this encrypted string for security and authorization. |
| name | The name for your new WalletSet. |
Let's create our first wallet set!
Ensure that your idempotency key is unique for every distinct request. Our APIs require the idempotency key to be of type uuidv4. Remember, its primary role is to ensure that the same request isn't processed more than once.
For a comprehensive overview of each transaction you execute with Circle's Web3 APIs, the Developer Services Console provides detailed access to API logs. By examining these logs, you gain valuable visibility into how your application interacts with Circle APIs, which can be pivotal for various aspects including troubleshooting, performance optimization, and security oversight by highlighting any abnormal activities. For detailed records of your API interactions, please refer to the API Logs section.
Within the scope of our Quickstart guide, the API log is indispensable for gaining insights into specific API calls and the objects that are created as a result. Think of the API log as a detailed record that allows you to retrieve the unique IDs of objects that have been generated, especially when these IDs are needed for subsequent API interactions. API logs are a crucial educational resource that simplify the debugging process and help you methodically comprehend the intricacies of the API's operations. Hence, the API log is not only instrumental in improving operational workflows but also serves as a valuable asset for your development projects.
Ah, the most exhilarating phase: shaping your very first developer-controlled wallet in the vastness of web3. With your prepped API key and Entity Secret Ciphertext, we're only a few steps away from crafting a masterpiece. Let's dive right in!
In web3, a wallet isn't just a storage mechanism for digital tokens or NFTs, but the very essence of user interactions on the blockchain. Essentially, it's a blend of a unique address and accompanying metadata stored on the blockchain.
For developer-controlled wallets:
Address
A unique identifier on a blockchain. Notably, while an address remains distinct, multiple wallets can have the same address across different EVM blockchains.
Custody Type
This signifies who controls the private key invocation — either the user or the developer. For our purpose, we're focusing on developer-controlled wallets, which are inherently more manageable and tailored for specific app requirements.
With that foundational knowledge, let's get to the hands-on part.
To create a wallet you use the following parameters:
| Term | Definition |
|---|---|
| idempotencyKey | Ensures that a request is executed only once, even if it's received multiple times. |
| entitySecretCiphertext | The encrypted form of your Entity Secret, ensuring robust security for your API requests. |
| walletSetId | The ID of the wallet set that you created in the preceding step. |
| blockchains | Specifies the blockchains on which the wallet should be manifested. |
| count | The number of wallets you aim to create. Note: The parameter should not exceed 20. |
| accountType | The type of account you want to create. For this guide, you will use SCA, which represents developer-controlled wallets. |
To ensure the best possible experience, the quickstart will automatically create and fund two wallets with testnet tokens. Each wallet will be funded with 10 USDC, allowing you to dive right into the Quickstart without delay. Rest assured, this amount will be sufficient for you to initiate your first transaction.
The funding process will only be completed if you use the Try it out panel. If you are following the quickstart using code snippets, you will need to first create your wallets, then fund them manually using the testnet faucet.
Note: Smart Contract Account wallets are not availabe for Solana Devnet. A similar workflow can be accomplished on Solana Devnet with EOA wallets and the Circle Gas Station.
And there you have it! By the end of this step, you'll have fully functional developer-controlled wallets, ready to shape web3 experiences.
Now that you have a wallet that contains some Testnet tokens, let's dive into initiating your first transaction. It's simpler than you might think, especially with our streamlined approach.
Cross-Blockchain Transfers: Tokens are native to specific blockchains, meaning they can't be sent directly across different chains. For instance, Ethereum tokens stay on the Ethereum network unless other mechanisms, like bridges, are used.
Before we can proceed, we need to determine the tokenId. You can do this by
retrieving the token balances for your wallet.
| Term | Definition |
|---|---|
| idempotencyKey | A unique string that ensures your transaction isn 't processed more than once even if sent multiple times. A critical measure to prevent duplicates. |
| amounts | Specify the amount of tokens you're transferring. |
| destinationAddress | The wallet address where you're sending the tokens. |
| entitySecretCiphertext | A crucial security layer, this encrypted string ensures only authorized transactions go through. |
| tokenId | This is the id we just extract from your wallet balance. It is the unique identifier for the specific token type you're moving. This id is unique. |
| walletId | Indicates the source of the transaction, i.e., from which wallet you're sending the tokens. |
The preceding parameters are just the essentials for initiating a transaction. The endpoint offers a richer, more detailed configuration to cater to a variety of transaction types. For a comprehensive list of the supported parameters, see the official documentation.
Blockchain transactions pose a challenge with gas fees. Gas fees are charges in blockchain networks, typically paid with native assets like Ether (ETH) on Ethereum. This complicates the user experience as it requires users to hold these assets. However, with Developer-Controlled smart contract wallets, you can sponsor gas fees, removing the need to possess native assets. The Gas Station acts as an intermediary, allowing you to cover fees for your users, improving their transaction experience. In testnet, the Gas Station is already setup for you, ready for testing. In the Production phase, you gain more control with spending limits and configuration options. Learn more here.
Once you've validated your transaction and everything checks out, you're all set. Transactions on the blockchain are immutable, meaning once they're validated, they cannot be reversed or altered. So, always double-check before sending!
After initiating a transaction through our API, you can look up the transaction hash on the Dev Controlled Wallets Transactions page for in the Developer Services Console. The transaction hash is a unique identifier for your transaction.
You can validate transactions in multiple ways:
This is the preferred method. It enables you to inspect the transaction state directly.
Make sure you're logged in to our Developer Services Console.
Open the Dev Controlled Wallets Transactions page.
You can see the state of your transaction directly in the table.

For more details about your transaction, click on the relevant line in the transaction details.
By using the transaction hash or wallet id, you can view the transaction state on a blockchain explorer.
Depending on the blockchain your token resides on, select a suitable explorer:
On the explorer's main page, there's a search bar. Paste your transaction hash or wallet id there and search. You can find the transactionHash or the wallet id in your list of transactions.
Whether you provide a wallet ID or transaction hash, details regarding your wallet and the associated transactions will be visible. This includes particularities of each transaction such as the number of confirmations and the gas used, letting you verify that all aligns with your expectations.

Established your Entity Secret
You took the initiative to generate and secure your unique Entity Secret, ensuring that your interactions remain encrypted and safe.
Created your first Developer Controlled Wallet
By setting up your wallet, you now possess a powerful tool that allows you to engage with web3 networks with full autonomy.
Got Testnet tokens via faucets
You've effectively tapped into the Faucets, filling your wallets with Testnet tokens, a crucial step for practical, risk-free experimentation on Testnet.
Initiated a blockchain transaction & validated it
Not only did you initiate a blockchain transaction, but you also took the proactive step of validating it using blockchain explorers, assuring transparency and trust in every move.
Your journey with us doesn't stop here. There's so much more to discover und dive into:
Engage, Build, Share! Dive into our forums, share your feedback, and keep an eye out for exciting challenges and hackathons. Your unique perspective and skills are valuable, and we're eager to see the innovations you'll introduce to our growing ecosystem.
Before you embark further on your journey, we'd love to hear from you. Your feedback shapes the future of our platform and helps us provide a better experience for all developers.
What did you love about the process? Was there something you wish was different? Every insight, no matter how small, matters to us.
Thank you for your trust, dedication, and enthusiasm. Here's to the next chapter in your web3 journey and the marvelous innovations you'll bring forth.
Happy Building! 🚀
Next: Explore more Quickstarts