Use count
to specify the number of wallets to create, up to a maximum of 200
per API request.
This tutorial walks you through creating a developer-controlled wallet to sign transactions on Solana.
Before you begin:
When
creating a developer-controlled wallet,
pass SOL-DEVNET
or SOL
in the blockchains
field. This wallet can be used
to sign transactions.
The following example code shows how to create a wallet using the Circle Developer SDK.
const response = await circleDeveloperSdk.createWallets({
accountType: "EOA",
blockchains: ["SOLANA-DEVNET"],
count: 2,
walletSetId: "<wallet-set-id>",
});
Use count
to specify the number of wallets to create, up to a maximum of 200
per API request.
For Solana, you can sign a raw transaction using the API or SDK.
The following example code shows how to prepare a raw transaction for swapping tokens on Jupiter. Note that this code is purely for example purposes only.
// Get quote for swapping SOL to USDC with input 0.01 SOL and 0.5% slippage
const quoteResponse = await (
await fetch(
"https://quote-api.jup.ag/v6/quote?inputMint=So11111111111111111111111111111111111111112&outputMint=EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v&amount=10000000&slippageBps=50",
)
).json();
// Get serialized transactions for the swap
const { swapTransaction } = await (
await fetch("https://quote-api.jup.ag/v6/swap", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({
// quoteResponse from /quote API
quoteResponse,
// User public key to be used for the swap
userPublicKey: "FILL-YOUR-WALLET-ADDRESS",
// Auto wrap and unwrap SOL. Default is true
wrapAndUnwrapSol: true,
}),
})
).json();
The following example code shows how to sign the raw transaction.
const response = await circleDeveloperSdk.signTransaction({
walletId: "FILL-YOUR-SOL-WALLET-ID",
rawTransaction: swapTransaction,
});
The raw transaction must be provided as a Base64 encoded string. Ensure that it is properly encoded before submission.
The following example code shows how you can encode a raw transaction to a Base64 encoded string in JavaScript.
const web3 = require("@solana/web3.js");
const {
initiateDeveloperControlledWalletsClient,
} = require("@circle-fin/developer-controlled-wallets");
const circleDeveloperSdk = initiateDeveloperControlledWalletsClient({
baseUrl: "https://api.circle.com",
apiKey: "YOUR-API-KEY",
entitySecret: "YOUR-ENTITY-SECRET", // Make sure to enter the entity secret from the step above.
});
async function transferNativeToken() {
const connection = new web3.Connection(
web3.clusterApiUrl("devnet"),
"confirmed",
);
// Amount to send (in SOL)
const amount = 0.1;
// Convert SOL to lamports
const lamports = web3.LAMPORTS_PER_SOL * amount;
const fromPubKey = new web3.PublicKey("YOUR-WALLET-ADDRESS");
const toPubKey = new web3.PublicKey("DESTINATION-WALLET-ADDRESS");
// Create a transfer instruction
const instruction = web3.SystemProgram.transfer({
fromPubkey: fromPubKey,
toPubkey: toPubKey,
lamports: lamports,
});
// Get the latest blockhash
const { blockhash } = await connection.getLatestBlockhash();
// Create the transaction
const transaction = new web3.Transaction().add(instruction);
// Set the recent blockhash and the paying account
transaction.recentBlockhash = blockhash;
transaction.feePayer = fromPubKey;
// Serialize the transaction
const rawTransaction = transaction.serialize({
requireAllSignatures: false,
verifySignatures: false,
});
// // sign the transaction
const response = await circleDeveloperSdk.signTransaction({
walletId: "YOUR-WALLET-ADDRESS-WALLET-ID",
memo: "TEST-SIGN-RAW-TX",
rawTransaction: rawTransaction.toString("base64"),
});
const rawTransactionBuf = Buffer.from(
response.data.signedTransaction,
"base64",
);
const txid = await connection.sendRawTransaction(rawTransactionBuf, {
skipPreflight: false,
maxRetries: 2,
});
console.log(`txid:${txid}`);
await connection.confirmTransaction(txid);
console.log(`https://solscan.io/tx/${txid}`);
}
transferNativeToken();