import {
createSdk,
normalizeTokens,
findTokenByChain,
createProviderForToken,
getSeedMessage,
preparePrivateSend,
submitPrivateSendAnnouncement,
} from "zerc20-client-sdk";
import { encodeFunctionData, erc20Abi, keccak256, toBytes } from "viem";
import { HttpAgent } from "@dfinity/agent";
// 1. 初期化
const sdk = createSdk();
const agent = await HttpAgent.create({ host: "https://icp-api.io" });
const client = sdk.createStealthClient({
agent,
storageCanisterId: "your-storage-canister-id",
keyManagerCanisterId: "your-key-manager-canister-id",
});
const tokensFile = await import("./tokens.json");
const { tokens } = normalizeTokens(tokensFile);
const entry = findTokenByChain(tokens, 42161n); // Arbitrum
// 2. ウォレット署名から seed を導出(32 バイトにハッシュ化)
const seedMsg = await getSeedMessage();
const signature = await walletClient.signMessage({ message: seedMsg });
const seedHex = keccak256(toBytes(signature));
// 3. プライベート送信を準備
const preparation = await preparePrivateSend({
client,
recipientAddress: "0xRecipient...",
recipientChainId: 42161n,
seedHex,
});
// 4. バーンアドレスに zERC20 を送金
const txHash = await walletClient.sendTransaction({
to: entry.tokenAddress,
data: encodeFunctionData({
abi: erc20Abi,
functionName: "transfer",
args: [preparation.burnAddress, 100_000_000n], // 100 zUSDC
}),
});
// 5. 暗号化アナウンスを送信
const result = await submitPrivateSendAnnouncement({
client,
preparation,
});
console.log("Announcement submitted:", result);