meshjs-cardano について
meshjs-cardano は、TypeScript または JavaScript と MeshJS で Cardano dApp を開発するためのスキルです。ウォレット接続、トランザクション構築、スクリプト操作、安全対策を扱います。
主な機能
- 01CIP-30 ウォレット接続パターン
- 02ADA とトークンのトランザクション構築
- 03トランザクションのメタデータ設定
- 04Plutus スクリプト操作
- 05UTxO 照会と NFT 発行のガイダンス
- 06ウォレットの安全対策とネットワーク確認
活用シーン
- 01React dApp に CIP-30 ウォレットを接続
- 02ADA またはネイティブトークンの取引を構築
- 03Plutus スクリプトを操作
- 04アドレスの UTxO 照会や NFT 発行を計画
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ flux-point-studios/ cardano-agent-skills --skill meshjs-cardanoインストール後、Claude Code で/meshjs-cardanoを入力して読み込まれたか確認します。
同梱ファイルreference/meshjs-patterns.md
詳細
meshjs-cardano
使用する場面
- MeshJS(TypeScript/JavaScript)を使った Cardano dApp の構築
- CIP-30 ウォレットコネクターの統合
- ブラウザーまたは Node.js でのトランザクション構築
運用ルール(必ず遵守)
- MeshJS のバージョンと環境(Next.js、Vite、Node)を確認してください
- シードフレーズや秘密鍵を決して要求しないでください
- ウォレットの切断に適切に対処してください
- メインネットの前に preprod でテストしてください
セットアップ
インストール
npm install @meshsdk/core @meshsdk/react
# or
yarn add @meshsdk/core @meshsdk/react
プロバイダーのセットアップ
import { BlockfrostProvider } from '@meshsdk/core';
const provider = new BlockfrostProvider('<PROJECT_ID>');
// or for preprod:
const provider = new BlockfrostProvider('<PROJECT_ID>', 'preprod');
ウォレット接続(React)
import { CardanoWallet, useWallet } from '@meshsdk/react';
function App() {
const { connected, wallet } = useWallet();
return (
<div>
<CardanoWallet />
{connected && <p>Connected!</p>}
</div>
);
}
トランザクションの構築
シンプルな ADA の送金
import { Transaction } from '@meshsdk/core';
const tx = new Transaction({ initiator: wallet })
.sendLovelace(
'addr_test1qz...',
'5000000' // 5 ADA
);
const unsignedTx = await tx.build();
const signedTx = await wallet.signTx(unsignedTx);
const txHash = await wallet.submitTx(signedTx);
ネイティブトークンを使用する場合
const tx = new Transaction({ initiator: wallet })
.sendAssets(
'addr_test1qz...',
[
{ unit: 'lovelace', quantity: '2000000' },
{ unit: '<policy_id><asset_name_hex>', quantity: '1' }
]
);
メタデータを使用する場合
const tx = new Transaction({ initiator: wallet })
.sendLovelace('addr_test1qz...', '1000000')
.setMetadata(674, { msg: ['Hello from MeshJS'] });
スクリプトとのやり取り
スクリプトで資金をロックする
import { Data } from '@meshsdk/core';
const datum: Data = {
alternative: 0,
fields: [wallet.getPaymentAddress()]
};
const tx = new Transaction({ initiator: wallet })
.sendLovelace(
{
address: scriptAddress,
datum: { inline: datum }
},
'5000000'
);
スクリプトから資金を使用する
const tx = new Transaction({ initiator: wallet })
.redeemValue({
value: scriptUtxo,
script: plutusScript,
datum: datum,
redeemer: { data: { alternative: 0, fields: [] } }
})
.sendLovelace(recipientAddress, '4500000')
.setCollateral([collateralUtxo]);
例
例:NFT のミント
ユーザーのリクエスト:「MeshJS で NFT をミントする」
応答:
import { ForgeScript, Transaction } from '@meshsdk/core';
// Create minting script (time-locked)
const { pubKeyHash } = wallet.getPaymentAddress();
const forgingScript = ForgeScript.withOneSignature(pubKeyHash);
const assetMetadata = {
name: 'My NFT',
image: 'ipfs://...',
mediaType: 'image/png'
};
const tx = new Transaction({ initiator: wallet })
.mintAsset(
forgingScript,
{
assetName: 'MyNFT',
assetQuantity: '1',
metadata: assetMetadata,
label: '721',
recipient: wallet.getPaymentAddress()
}
);
const unsignedTx = await tx.build();
const signedTx = await wallet.signTx(unsignedTx);
const txHash = await wallet.submitTx(signedTx);
console.log('Minted:', txHash);
例:UTxO の照会
import { BlockfrostProvider } from '@meshsdk/core';
const provider = new BlockfrostProvider('<PROJECT_ID>');
// Get UTxOs for address
const utxos = await provider.fetchAddressUTxOs(address);
// Get UTxOs at script address
const scriptUtxos = await provider.fetchAddressUTxOs(scriptAddress);
// Filter by asset
const nftUtxos = utxos.filter(utxo =>
utxo.output.amount.some(a => a.unit.includes(policyId))
);
よくあるパターン
エラー処理
try {
const txHash = await wallet.submitTx(signedTx);
console.log('Success:', txHash);
} catch (error) {
if (error.message.includes('UTxO')) {
console.log('UTxO issue - refresh and retry');
} else if (error.message.includes('collateral')) {
console.log('Need ADA-only UTxO for collateral');
}
}
ウォレット状態の管理
const { connected, connecting, disconnect, wallet, name } = useWallet();
// Check connection before operations
if (!connected) {
throw new Error('Wallet not connected');
}
// Get network
const network = await wallet.getNetworkId();
// 0 = testnet, 1 = mainnet
安全性/鍵の取り扱い
- シードフレーズを決して要求しないでください
- CIP-30 API が利用可能か検証してください
- 切断に適切に対処してください
- 署名の前に確認を表示してください
参考資料
shared/PRINCIPLES.md- MeshJS のドキュメント
- CIP-30 Wallet API
コメント
Markdown 対応