Skip to content

Commit 1081869

Browse files
authored
Add USDC in xc-admin-cli (#604)
* Add USDC in xc-admin-cli * Improve comment
1 parent 16caff1 commit 1081869

File tree

3 files changed

+64
-0
lines changed

3 files changed

+64
-0
lines changed

governance/xc_admin/packages/xc_admin_cli/src/index.ts

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,12 @@ import {
3030
import { pythOracleProgram } from "@pythnetwork/client";
3131
import { Wallet } from "@coral-xyz/anchor/dist/cjs/provider";
3232
import { LedgerNodeWallet } from "./ledger";
33+
import {
34+
createTransferInstruction,
35+
getAssociatedTokenAddress,
36+
getMint,
37+
} from "@solana/spl-token";
38+
import { TOKEN_PROGRAM_ID } from "@coral-xyz/anchor/dist/cjs/utils/token";
3339

3440
export async function loadHotWalletOrLedger(
3541
wallet: string,
@@ -299,4 +305,59 @@ mutlisigCommand("approve", "Approve a transaction sitting in the multisig")
299305
await squad.approveTransaction(transaction);
300306
});
301307

308+
mutlisigCommand("propose-token-transfer", "Propose token transfer")
309+
.requiredOption("-a, --amount <number>", "amount in dollars")
310+
.requiredOption("-d, --destination <pubkey>", "destination address")
311+
.option(
312+
"-m --mint <pubkey>",
313+
"mint to transfer",
314+
"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v" // default value is solana mainnet USDC SPL
315+
)
316+
.action(async (options: any) => {
317+
const wallet = await loadHotWalletOrLedger(
318+
options.wallet,
319+
options.ledgerDerivationAccount,
320+
options.ledgerDerivationChange
321+
);
322+
323+
const cluster: PythCluster = options.cluster;
324+
const destination: PublicKey = new PublicKey(options.destination);
325+
const mint: PublicKey = new PublicKey(options.mint);
326+
const vault: PublicKey = new PublicKey(options.vault);
327+
const amount: number = options.amount;
328+
329+
const squad = SquadsMesh.endpoint(getPythClusterApiUrl(cluster), wallet);
330+
const msAccount = await squad.getMultisig(vault);
331+
const vaultAuthority = squad.getAuthorityPDA(
332+
msAccount.publicKey,
333+
msAccount.authorityIndex
334+
);
335+
336+
const mintAccount = await getMint(
337+
squad.connection,
338+
mint,
339+
undefined,
340+
TOKEN_PROGRAM_ID
341+
);
342+
const sourceTokenAccount = await getAssociatedTokenAddress(
343+
mint,
344+
vaultAuthority,
345+
true
346+
);
347+
const destinationTokenAccount = await getAssociatedTokenAddress(
348+
mint,
349+
destination
350+
);
351+
352+
const proposalInstruction: TransactionInstruction =
353+
createTransferInstruction(
354+
sourceTokenAccount,
355+
destinationTokenAccount,
356+
vaultAuthority,
357+
BigInt(amount) * BigInt(10) ** BigInt(mintAccount.decimals)
358+
);
359+
360+
await proposeInstructions(squad, vault, [proposalInstruction], false);
361+
});
362+
302363
program.parse();

governance/xc_admin/packages/xc_admin_frontend/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
"@coral-xyz/anchor": "^0.26.0",
1313
"@headlessui/react": "^1.7.7",
1414
"@pythnetwork/client": "^2.15.0",
15+
"@solana/spl-token": "^0.3.7",
1516
"@solana/wallet-adapter-base": "^0.9.20",
1617
"@solana/wallet-adapter-react": "^0.15.28",
1718
"@solana/wallet-adapter-react-ui": "^0.9.27",

package-lock.json

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)