import {
createSdk,
normalizeTokens,
findTokenByChain,
createProviderForToken,
getSeedMessage,
preparePrivateSend,
submitPrivateSendAnnouncement,
} from "zerc20-client-sdk";
import { createWalletClient, custom, encodeFunctionData, erc20Abi, keccak256, toBytes } from "viem";
import { arbitrum } from "viem/chains";
import { HttpAgent } from "@dfinity/agent";
// --- セットアップ ---
const sdk = createSdk();
const agent = await HttpAgent.create({ host: "https://icp-api.io" });
const stealthClient = sdk.createStealthClient({
agent,
storageCanisterId: "your-storage-canister-id",
keyManagerCanisterId: "your-key-manager-canister-id",
});
const walletClient = createWalletClient({
chain: arbitrum,
transport: custom(window.ethereum!),
});
// トークンを読み込む(自前の設定ファイルまたは組み込みの圧縮データから)
const tokensFile = await import("./tokens.json");
const { tokens } = normalizeTokens(tokensFile);
const entry = findTokenByChain(tokens, 42161n);
const publicClient = createProviderForToken(entry);
// --- ステップ1:Seed を導出 ---
const seedMsg = await getSeedMessage();
const [account] = await walletClient.getAddresses();
const signature = await walletClient.signMessage({
account,
message: seedMsg,
});
const seedHex = keccak256(toBytes(signature));
// --- ステップ2:準備 ---
const preparation = await preparePrivateSend({
client: stealthClient,
recipientAddress: "0xAbC123...def",
recipientChainId: 42161n,
seedHex,
});
// --- ステップ3:送金 ---
const txHash = await walletClient.sendTransaction({
account,
to: entry.tokenAddress,
data: encodeFunctionData({
abi: erc20Abi,
functionName: "transfer",
args: [preparation.burnAddress, 100_000_000n], // 100 zUSDC (6 decimals)
}),
});
await publicClient.waitForTransactionReceipt({ hash: txHash });
// --- ステップ4:アナウンスを送信 ---
const result = await submitPrivateSendAnnouncement({
client: stealthClient,
preparation,
});
console.log("Private send complete:", result);