mcpField
M
meshjs-cardano

meshjs-cardano

github.com/flux-point-studios開発838 回インストール5 週間前に更新
リポジトリ

meshjs-cardano について

meshjs-cardano は、TypeScript または JavaScript と MeshJS で Cardano dApp を開発するためのスキルです。ウォレット接続、トランザクション構築、スクリプト操作、安全対策を扱います。

主な機能

  1. 01CIP-30 ウォレット接続パターン
  2. 02ADA とトークンのトランザクション構築
  3. 03トランザクションのメタデータ設定
  4. 04Plutus スクリプト操作
  5. 05UTxO 照会と NFT 発行のガイダンス
  6. 06ウォレットの安全対策とネットワーク確認

活用シーン

  1. 01React dApp に CIP-30 ウォレットを接続
  2. 02ADA またはネイティブトークンの取引を構築
  3. 03Plutus スクリプトを操作
  4. 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 が利用可能か検証してください
  • 切断に適切に対処してください
  • 署名の前に確認を表示してください

参考資料

コメント