compose-bitcoin-oracle について
compose-bitcoin-oracleは、ユーザー自身のGoldskyアカウントにビットコイン価格オラクルのサンプルをデプロイするスキルです。CoinGeckoから定期取得した価格をPriceOracleコントラクトに書き込み、Composeのコレクションに保存します。
主な機能
- 01bitcoin-oracleサンプルの作成
- 02CoinGecko価格の定期取得
- 03PriceOracleコントラクトへの価格書き込み
- 04コレクションへの価格履歴保存
- 05共有または独自コントラクトへの対応
活用シーン
- 01BTC/USDオラクルの定期実行
- 02後から参照する価格履歴の記録
- 03共有デモコントラクトを使ったオラクル構築
MCP 対応
Compose上でアプリを設定・デプロイする手順を案内します。アプリはCompose管理のウォレットでPriceOracleコントラクトに書き込み、Composeのコレクションに価格履歴を保存します。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ goldsky-io/ goldsky-agent --skill compose-bitcoin-oracleインストール後、Claude Code で/compose-bitcoin-oracleを入力して読み込まれたか確認します。
詳細
ビルド:Compose bitcoin-oracle
ユーザー自身の Goldsky アカウントで、bitcoin-oracle のサンプルを立ち上げます。cron タスクが CoinGecko から BTC/USD の価格を取得し、Compose が管理するウォレットを介して、PriceOracle コントラクトに (timestamp, price * 100) を 2 つの bytes32 値として書き込みます。また、過去の価格をクエリできるように、Compose の collection に価格を追加します。
このテンプレートで提供するのは、bitcoin-oracle アプリ固有の内容(動作とソース)のみです。推奨される方法では、Base Sepolia 上の共有型で完全に無許可の PriceOracle を使用するため、ユーザーがデプロイする必要はなく、Compose のスマートウォレットが自動作成され、ガス代もスポンサーされます。
ステップ 0a — まず基本スキルを読み込む
何よりも先に — 回答する、質問する、ファイルをひな形から作成する、deployComposeApp を呼び出す前に、このテンプレートが依存する 2 つの基本スキルを読み込んでください。
Skill(compose)— 常時参照する Compose ガイドです。基本ルール(ユーザーに代わってアプリについて決めつけない。不明な点があれば質問する)と、一般的なビルドのガイダンスが記載されています。Skill(compose-reference)— マニフェスト、フィールド、API のリファレンスです。compose.yamlまたはタスクファイルを書く前に参照してください。
このテンプレートでは、それらのルールとリファレンスを意図的に省略しています。正しくビルドするために必須であり、ここでは繰り返し記載していません。両方を読み込むまで先に進まないでください。
モードの判定
利用できるツールに応じて、モードを選択してください。
-
deployComposeAppツールを利用できます(Goldsky ウェブアプリのチャットボット)— こちらがアプリ内での推奨フローです。goldskyのターミナルコマンドやcliCommandカードは出力しないでください。また、Step 0b、degit、forge、goldsky compose deployは使用しないでください。まず2〜3文で簡潔に説明し、その後askUserで質問してください(推奨オプションにはrecommendedIndexを設定してください)。- アプリ名 — 何よりも先に質問してください:「アプリ名は何にしますか?(
bitcoin-oracleをおすすめします)」。後から変更するのは困難です。名前は名前付きウォレットのスコープとなり、すべてのdeployContractの CREATE2 ソルトにも使われるため、ウォレットやコントラクトに関する作業を始める前に確定する必要があります。迷っている場合は既定のbitcoin-oracleを使い、選んだ名前を足場ファイルのcompose.yamlにトップレベルのname:として設定してください。 - コントラクト — 勝手に決めず、必ず明示的に質問してください:「ご自身の
PriceOracleコントラクトをお持ちですか?それとも、すぐに始められるよう Base Sepolia の共有デモオラクルを使いますか?」オプションは 「Base Sepolia の共有デモオラクルを使う(おすすめ — デプロイ不要)」 と 「自分のコントラクトを使います」 です。共有オプションを選んだ場合、ORACLE_CONTRACTはbaseSepolia上の ハードコードされた アドレス0x53deB3fF6E6e82A3b5E96f14E185e3Fe66BF5113です。一字一句そのままコピーし、デモ専用であり、本番環境では使えないことを説明してください。独自コントラクトを使う場合は、コントラクトアドレスとチェーンを貼り付けるよう依頼し、貼り付けられた内容をそのまま使用してください。ユーザーのPriceOracleでは Compose ウォレットによる書き込みが可能である必要があります。 - 更新頻度(1分ごと、
* * * * *を推奨)。
Compose のスマートウォレットは実行時に自動作成され、ガス代もスポンサーされます。ユーザーにウォレットの作成や資金の入金を指示しないでください。質問後、ファイルをメモリ上で足場作成してください(
degitは使用しないでください)。作成するファイルは、選択したスケジュールで実行する単一の cron タスクを定義するcompose.yaml、Step 3 の ABI をそのまま記述したsrc/contracts/PriceOracle.json、CoinGecko から BTC/USD を取得し、ガス代をスポンサーされたスマートウォレット経由でevm.contracts.PriceOracle.write(toBytes32(timestamp), toBytes32(Math.round(price*100)))を呼び出し、価格をbitcoin_pricesコレクションに追記するsrc/tasks/bitcoin-oracle.tsです。ORACLE_CONTRACTはタスクファイルの先頭にある ハードコードされたconstであり、環境変数ではありません(この例ではインラインに記述します。/composeではマニフェストのenv:も使用できます。どちらでも構いませんが、通常のアドレスをsecrets:に入れないでください)。ファイルを出力する前に、マニフェストの形式とサンドボックスのインポート規則について/compose-referenceに従ってください(/composeのゴールデンルールに従い、マニフェストを記憶だけで合成しないでください)。その後、同じターン内にdeployComposeAppを呼び出してください。先にユーザーの確認を求めたり、goldskyコマンドを出力したりしないでください。このモードでは、以下の Step 0〜8 は無視してください。これらは CLI/ローカル環境での手順です。 - アプリ名 — 何よりも先に質問してください:「アプリ名は何にしますか?(
-
Bashを利用できます(ローカル CLI/コーディングエージェント): 以下の手順を直接実行し、出力を解析して後続のコマンドに使用してください。 -
どちらも利用できません(純粋なリファレンス形式の質疑応答): アプリの機能を説明してください。手順を追ったサポートが必要な場合は、Bash を使ってローカルで実行するために
npx skills add goldsky-io/goldsky-agentを案内してください。
必須事項
- Base Sepolia 上の共有オラクル(
0x53deB3fF6E6e82A3b5E96f14E185e3Fe66BF5113)は完全にパーミッションレスで、誰でも書き込めます。 スタートガイドやデモのみを目的として用意されています。ユーザーには、プロダクション環境では絶対に使用してはならないことを文章で伝えてください。Base Sepolia 上にのみ存在します。 goldsky compose deployContract、goldsky compose deploy、git push、gh repo createを実行する前に、必ず正確なコマンドを提示し、明示的な確認を得てください。- 独自デプロイの手順に限ります: コントラクトの書き込み権限を持つアドレスは Compose ウォレットでなければなりません。そうでない場合、すべての
write()がリバートします。共有オラクルを使う手順には書き込み権限の制限がないため、これは該当しません。 - サンプルに含まれているのは ABI である
src/contracts/PriceOracle.jsonのみで、Solidity のソースコードはありません。 新規にデプロイする場合は、このスキルの参照コントラクトを使用してください。ABI はそのまま記述してください。手順 3 を参照してください。 src/lib/utils.tsには手を加えないでください。toBytes32は、コントラクトが値を保存する方法と連動しています。
以下の手順 0~8 は、Bash/ローカル CLI で実行する手順です。
deployComposeAppツールが利用可能な場合(Web アプリのチャットボット)は、この手順には従わず、上記のモード判定にあるデプロイツールのフローを使用してください。
手順 0b — サンプルをスキャフォールドする
bitcoin-oracle のサンプルだけを新しいディレクトリに取り込みます(Git 履歴なし)。
npx -y degit goldsky-io/documentation-examples/compose/bitcoin-oracle#6abe62878cb92f2569538ba9572b049ed5949a01 bitcoin-oracle
cd bitcoin-oracle
npx degit を利用できない場合は、スパースクローンに切り替えます。
git clone --filter=blob:none --sparse https://github.com/goldsky-io/documentation-examples.git
cd documentation-examples && git checkout 6abe62878cb92f2569538ba9572b049ed5949a01 && git sparse-checkout set compose/bitcoin-oracle && cd compose/bitcoin-oracle
ユーザーがすでにサンプルをクローンしている場合は、この手順を省略して、そのディレクトリに cd してください。
事前確認
goldsky compose --version の出力が compose CLI is not installed の場合は、goldsky compose install を実行してから再確認してください(stable チャネルでは冪等です)。
バージョン(compose 0.8.1)。 goldsky compose --version を実行すると、goldsky compose 0.8.1 と表示されます。バージョンが 0.8.1 より古い場合、または deployContract/writeContract が不明なコマンドの場合は、独自デプロイの手順(手順 3 の分岐 B)は動作しません。ユーザーに代わって goldsky compose update を実行することを提案し、--version を再確認してください。(分岐 A — 共有オラクル — では compose deploy だけが必要なため、古い CLI でも問題ありません。)
goldsky CLI、認証、deno の確認は、Compose の標準的な事前確認です。/compose と /auth-setup を参照してください。Bitcoin-oracle 固有の情報:独自デプロイの手順(手順 3、分岐 B)では goldsky compose deployContract を使用します。これはコンパイラーを同梱しているため、Foundry は必要ありません。
手順 1 — 設定
/compose の基本ルールに従い、推測できないことだけを質問します。最初にアプリ名を尋ねてください。
- 「アプリ名は何にしますか?(
bitcoin-oracleを提案)」 — ウォレット(手順 2)やコントラクト(手順 3)の手順に入る前に、最初に尋ねてください。アプリ名は後から変更するのが難しく、名前付きウォレットのスコープとなり、各deployContractの CREATE2 ソルトにも使われるため、今決める必要があります。ユーザーが特に希望を示さない場合はデフォルトのbitcoin-oracleを使い、compose.yamlのトップレベルにあるname:に設定してください。 - 「どのチェーンを使いますか?」 — すぐに使える完全にパーミッションレスな共有オラクルがあり、デプロイも不要なため、**Base Sepolia(推奨)**を選びます。その他の選択肢(Base、Arbitrum、Polygon Amoy など)では、独自のオラクルをデプロイする必要があります。TS では camelCase 形式(
baseSepolia)を使用してください。 - 「PriceOracle コントラクトはどうしますか?」(チェーンの直後に尋ねます)— 次の 2 つの選択肢があります。
- Base Sepolia の共有オラクルを再利用する(推奨) — デプロイは不要です。
0x53deB3fF6E6e82A3b5E96f14E185e3Fe66BF5113を設定します(アドレスは文章で伝え、選択肢のラベルには記載しないでください)。デモやスタートガイド専用であり、プロダクション環境では使用できません。 - 独自にデプロイする — 手順 3 の分岐 B を参照してください。(Base Sepolia 以外のチェーンでは必須です。)
- Base Sepolia の共有オラクルを再利用する(推奨) — デプロイは不要です。
- 「cron はどのくらいの頻度で実行しますか?」 — 毎分(推奨、
* * * * *)、5 分ごと(*/5 * * * *)、または毎時から選びます。compose.yamlのcronトリガー配下にあるexpression:に設定してください。
ステップ 2 — ウォレット
- **共有オラクルのパス(推奨):**何もする必要はありません。Compose スマートウォレットは実行時に自動作成され、Base Sepolia でガス代が全額スポンサーされます。ウォレットを作成したり、資金を入金したりするようユーザーに案内しないでください。
- **独自デプロイのパス(ブランチ B):**デプロイより先に、ステップ 3 のブランチ B の順序におけるステップ(1)としてウォレットを作成し、そのアドレスを
$COMPOSE_WALLETとして取得します。名前付きウォレットbitcoin-oracle-walletは、src/tasks/bitcoin-oracle.tsのevm.wallet({ name: "bitcoin-oracle-wallet" })に対応します。
ステップ 3 — コントラクト
ブランチ A — 共有オラクルを再利用する(推奨)。 Base Sepolia 上の $CONTRACT_ADDRESS = 0x53deB3fF6E6e82A3b5E96f14E185e3Fe66BF5113 です。デプロイも、書き込み権限の付与も不要です。ただし、「デプロイするものがない」ことは、接続設定も不要という意味ではありません。スキャフォールドには古いデフォルト設定(Polygon Amoy と別のオラクルアドレス)が含まれているため、ブランチ A でもステップ 4 の接続設定は必須です。ステップ 4 に進んでください。
ブランチ B — 独自にデプロイする。 ブランチ B では順序が固定されています。ウォレットを作成 → コントラクトをデプロイ → コード生成 → 接続設定(ステップ 4)→ アプリをデプロイ(ステップ 7)。以下のステップ(1)~(5)を順番に実行してください。deployContract はコンパイル済みの ABI 全体を src/contracts/PriceOracle.json に書き込むため、手動で確認する必要はありません。以下の JSON はタスクで実際に使用するサブセットで、write、2 つの読み取り専用ゲッター、PriceUpdated イベントが含まれます(コンパイル出力には、コンストラクター、writer、setWriter、OnlyWriter も含まれます)。アプリ内/スキャフォールドへのインライン記述のパスでは、このサブセットでコード生成に十分です。ABI フィールドを決してでっち上げないでください。
[{"inputs":[{"internalType":"bytes32","name":"timestamp","type":"bytes32"},{"internalType":"bytes32","name":"price","type":"bytes32"}],"name":"write","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"latestTimestamp","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestPrice","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"timestamp","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"price","type":"bytes32"}],"name":"PriceUpdated","type":"event"}]
(1)ウォレットを作成する(デプロイ前に実行できます)。アドレスを $COMPOSE_WALLET として取得します。これは src/tasks/bitcoin-oracle.ts の evm.wallet({ name: "bitcoin-oracle-wallet" }) に対応します。
COMPOSE_WALLET=$(goldsky compose wallet create bitcoin-oracle-wallet --json | jq -r .address)
⚠
wallet create --env localは使用しないでください。これは、クラウドの実行環境が署名に使用しない LOCAL tevm ウォレットです。これを使用すると、トラブルシューティングの以下のセクションでは診断できない、機能しないオラクルが作成されます。デフォルトの(クラウド)ウォレットを使用してください。
(2)ソースを書き込み、その後コントラクトをデプロイします。 mkdir -p contracts を実行し、以下の Solidity の参照コードを contracts/PriceOracle.sol に書き込みます。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
contract PriceOracle {
address public writer;
bytes32 public latestTimestamp;
bytes32 public latestPrice;
event PriceUpdated(bytes32 indexed timestamp, bytes32 price);
error OnlyWriter();
constructor(address _writer) { writer = _writer; }
function setWriter(address newWriter) external {
if (msg.sender != writer) revert OnlyWriter();
writer = newWriter;
}
function write(bytes32 timestamp, bytes32 price) external {
if (msg.sender != writer) revert OnlyWriter();
latestTimestamp = timestamp;
latestPrice = price;
emit PriceUpdated(timestamp, price);
}
}
次に、Compose ウォレット経由でデプロイします。deployContract は CLI 内でコンパイルし、ガス代がスポンサーされている Compose ウォレットで署名された CREATE2 プロキシ経由でデプロイするため、Base/Base Sepolia では資金を入金した EOA も RPC URL も不要です。すべての deployContract/writeContract にはプロジェクト API キーが必要です。認証には、シェルで一度 GOLDSKY_API_TOKEN=<project API key> をエクスポートする方法(推奨:キーが argv やシェル履歴に残りません)、コマンドごとに -t "$GOLDSKY_PROJECT_KEY" を渡す方法、または有効な goldsky login セッションを使う方法があります。優先順位は --token > GOLDSKY_API_TOKEN > ~/.goldsky/auth_token です。ダッシュボードの Settings > API Keys でキーを作成してください。コンストラクターの引数で、ステップ 1 で作成したウォレットを書き込み元として許可します。
ADDR=$(goldsky compose deployContract contracts/PriceOracle.sol \
--chain-id <CHAIN_ID> \
--constructor-args $COMPOSE_WALLET \
--wallet bitcoin-oracle-wallet \
--json | jq -r .address)
チェーン ID:baseSepolia → 84532、base → 8453、polygonAmoy → 80002、polygon → 137、arbitrum → 42161、optimism → 10。ABI は src/contracts/PriceOracle.json に自動保存されます。--json を指定すると ASCII アートが抑制されます。失敗時、コマンドは stderr に {"error":true,"code":"...","message":"..."} を出力して 1 で終了するため、取得内容が空の場合は stderr を確認してください。CONTRACT_ADDRESS=$ADDR を設定します。
Base 以外のチェーン(forge フォールバック)。 deployContract はクラウドの Alchemy bundler 経由で実行されます。このバンドラーは Ethereum、Sepolia、Polygon、Polygon Amoy、Arbitrum、Arbitrum Sepolia、Optimism、Optimism Sepolia、Base、Base Sepolia(チェーン ID 1、11155111、137、80002、42161、421614、10、11155420、8453、84532)に対応しています。この一覧にないチェーンでは、No Alchemy bundler URL for chain <id> というエラーでデプロイに失敗するため、その場合は forge create によるフォールバックを使用してください。複数プロバイダーへの対応状況は FOU-991 で追跡されています。forge の経路でも書き込みを行うのは引き続き $COMPOSE_WALLET なので、タスクコードに変更はありません。後で ABI のみを抽出してください(コマンドの下にある注記を参照)。秘密鍵をユーザーに尋ねないでください。使い捨ての資金付き EOA を生成することを提案してください。モデルが読み取らない chmod-600 のファイルに直接生成し、アドレスのみを表示します。
cast wallet new --json > /tmp/k.json
umask 077 && printf 'FUNDED_EOA_KEY=%s\n' "$(jq -r '.[0].private_key' /tmp/k.json)" > .eoa.env
cast wallet address "$(jq -r '.[0].private_key' /tmp/k.json)" # the ONLY thing ever printed
shred -u /tmp/k.json
選択したチェーンに対応するフォーセットをユーザーに案内し、デプロイ前に cast balance <address> --rpc-url <RPC> で資金を確認することを提案してください。ユーザーが断った場合は、代わりに自分の資金付きウォレットでデプロイする方法があることを明確に伝えてください。
source .eoa.env # provides FUNDED_EOA_KEY; keep this in the SAME shell invocation as the command
forge create contracts/PriceOracle.sol:PriceOracle \
--rpc-url <RPC_URL> \
--private-key "$FUNDED_EOA_KEY" \
--broadcast \
--constructor-args $COMPOSE_WALLET
--broadcast は必須です(forge ≥1.0 はデフォルトでドライランを行うため、成功したように見えても何もデプロイされません)。また、--constructor-args は必ず最後のフラグにしてください。これは可変長引数を取るため、--rpc-url / --private-key より前に置くと、forge がそれらを取り込んで localhost に接続してしまいます。デプロイされたアドレスは Deployed to: の行に表示されます。これを $CONTRACT_ADDRESS として取得してください。その後、ABI のみを抽出します({abi, bytecode, ...} 全体を渡すと、コード生成が何も表示せずに失敗します)。
jq .abi out/PriceOracle.sol/PriceOracle.json > src/contracts/PriceOracle.json
(3)コード生成を実行します。 deployContract が上記の ABI を保存しています(forge の経路では jq .abi による抽出結果が保存されています)。codegen はタスクでインポートする型付きの evm.contracts.PriceOracle クラスを生成します(CLI 自身の成功メッセージにもそのように表示されます)。
goldsky compose codegen
(4)アドレスとチェーンをタスクに設定します(ステップ 4)。(5)アプリをデプロイします(ステップ 7)。デプロイは再デプロイではなく、1 回だけです。ウォレットの作成とコントラクトのデプロイを先に済ませているため、この操作で設定済みのタスクが稼働します。
どちらの方法(deployContract または forge create によるフォールバック)でも、書き込みを許可するのはコンストラクター引数の $COMPOSE_WALLET なので、ほかに必要な作業はありません。(既存の PriceOracle 互換コントラクトをすでに所有している場合は、所有者 EOA から setWriter($COMPOSE_WALLET) を実行して Compose ウォレットに書き込み権限を付与し、そのコントラクトのアドレスを使用してください。)
ステップ 4 — コントラクトアドレスとチェーンをタスクに設定する
src/tasks/bitcoin-oracle.ts を編集します。検索用の目印を使用してください。
- 冒頭付近にある
const ORACLE_CONTRACT = "0x..."を見つけ、アドレスを$CONTRACT_ADDRESSに置き換えます。 new evm.contracts.PriceOracle(...)の呼び出し内にあるevm.chains.*の参照を見つけ、evm.chains.<chosen chain in camelCase>に設定します(例:baseSepolia)。- 別のチェーンを設定した場合は、まだ「Polygon Amoy」と書かれている古いスキャフォールドのコメントブロックも更新し、ファイル内のコメントと一致させます。
ユーザーが cron の実行間隔を変更した場合は、compose.yaml の cron トリガーにある expression: を編集します。
compose.yamlのトップレベルのname:を、ステップ 1 で選択したアプリ名に設定します。degit のスキャフォールドに別のデフォルト値が設定されている場合があります。compose deployと CREATE2 のソルトが一致するよう、上書きしてください。
ステップ 5 — ガス代(自分でデプロイする場合。スポンサー対象外のチェーンのみ)
Compose で管理されるウォレットは、スポンサー対象チェーン(Base、Base Sepolia、Polygon、Polygon Amoy など)では、デフォルトで sponsorGas: true に設定されています。これらのチェーンではウォレットへの資金補充は不要なため、このステップはスキップしてください。スポンサー対象外のチェーンでは、ネイティブガストークンを $COMPOSE_WALLET に送金してください(テストネットではフォーセットを利用するか、メインネットでは cron の実行頻度に応じた予算を確保してください。毎分の書き込みは 1 日あたり約 1,440 件のトランザクションになります)。この ランタイム のタスクガススポンサーは、クラウドの デプロイ パスで deployContract / writeContract が利用するものより、はるかに多くのチェーンを対象としている点に注意してください。このパスは、Ethereum、Sepolia、Polygon、Polygon Amoy、Arbitrum、Arbitrum Sepolia、Optimism、Optimism Sepolia、Base、Base Sepolia(チェーン ID は 1、11155111、137、80002、42161、421614、10、11155420、8453、84532)をカバーするクラウドの Alchemy バンドラーを経由します。この一覧にないチェーンでは、No Alchemy bundler URL for chain <id> が表示されてデプロイに失敗するため、そこで forge create による代替手順を使用してください(ステップ 3)。複数プロバイダーの対応状況は FOU-991 で追跡しています。その後、ランタイムのスポンサー機能(または資金を補充したウォレット)で cron の書き込みを実行します。
ステップ 6 — オプション:新しい GitHub リポジトリに公開する
git init
git add .
if git ls-files --cached | grep -qiE '(keypair\.json|\.env|private[._-]?key|\.pem|id_rsa)'; then
echo "⚠ Secret-shaped file is staged — remove it before committing. Aborting publish."
else
git commit -m "Initial commit: Compose bitcoin-oracle"
gh repo create <user's repo name> --<public|private> --source=. --push
fi
ステップ 7 — Goldsky にデプロイする
goldsky compose deploy
ブランチ A(共有オラクル)では、これが最初で唯一のデプロイです。ブランチ B でも、これが唯一のデプロイです。ウォレットの作成とコントラクトのデプロイは先に行っているため(ステップ 3)、この 1 回のデプロイで接続済みのタスクが稼働します。
ステップ 8 — スモークテスト
ログをストリーミングし、次の cron が実行されるまで待ちます(最大 1 分)。
goldsky compose logs -f
-f / --follow はライブストリームを出力するため、次の cron の実行を確認できます。goldsky compose logs のみを実行した場合は、直近 100 行(--tail のデフォルトは 100 行)を一度だけ出力して終了します。
実行履歴も確認してください(エージェントは非対話型で実行されるため、ライブストリームを監視するより runs のほうが確実です)。
goldsky compose runs --task bitcoin_oracle --since 5m --json
正常な出力は、success: true と、0x で始まるトランザクションハッシュである oracleHash を含む戻り値のペイロードが、リトライなしで設定した頻度どおりに繰り返されることです。
オンチェーンでも確認してください(Base Sepolia エクスプローラー:https://sepolia.basescan.org/address/$CONTRACT_ADDRESS#events)。cron の実行ごとに PriceUpdated イベントが表示され、latestPrice() / latestTimestamp() が最新の bytes32 値を返すことを確認してください。
トラブルシューティング
compose.yamlまたはソースファイルを編集しても、再デプロイ後に反映されません。 ローカルの.compose/バンドルキャッシュが古くなっています。rm -rf .compose/を実行して、再デプロイしてください。- cron を実行するたびに変更が元に戻ります(自分でデプロイする場合のみ)。 Compose ウォレットが書き込み権限を持つアドレスとして許可されていません。
setWriter($COMPOSE_WALLET)を再実行するか(自分のコントラクトのブランチ A)、deployContractのコンストラクター引数を再確認してください。(共有オラクルには書き込み制限がないため、そちらではこれが原因になることはありません。) insufficient funds for gas。 自分でデプロイする場合に、スポンサーのないチェーンでのみ発生します。$COMPOSE_WALLETに資金を入れてください。- CoinGecko の 429 エラー/レート制限。 デフォルトの再試行設定(3 回の試行、バックオフ)で、一時的なレート制限に対処できます。継続する場合は、cron の実行頻度を下げるか、有料 API に切り替えてください。
- タスクは実行されますが、オンチェーンにイベントがありません。
evm.chains.*の参照先が、コントラクトのあるチェーンと一致していることを確認してください。誤ったチェーンのウォレットが署名したトランザクションは、対象のチェーンには現れません。 error: Unknown command "deployContract". Did you mean command "deploy"?(またはwriteContractの場合)。 原因:CLI が古すぎます(0.8.1 より前)。対処法:goldsky compose updateを実行してから、goldsky compose --versionを再確認してください。This contract has already been deployed with this app(deployContractの再実行時)。 CREATE2 はコントラクト、コンストラクター引数、アプリ名の組み合わせで重複を検出するため、同一の再実行はトランザクション送信前に拒否され、--jsonの出力にdeployBlockは含まれません。再実行してもブロックを取得できません。対処法:コンストラクター引数を変更する、ソースを変更する、または別のアプリ名を使う。新しい名前は、大文字・小文字だけ、または-と_の違いだけではいけません。名前は正規化されるため(小文字に変換し、[-_]+を-に変換)、my-app、My_App、my__appは重複し、デプロイは 409 を返します。PriceOracle はコンストラクター引数を取るため、コンストラクター引数を変更する方法を優先してください。⚠ アプリ名を変更すると、今後のすべてのデプロイアドレスが変わり、compose deployで指定するアプリ名と競合します。意図した変更でない限り、避けてください。
してはいけないこと
src/lib/utils.tsのtoBytes32ヘルパーは変更しないでください。コントラクトはpriceをbytes32として読み取り、この例では 100 倍(セント単位)にスケーリングしています。どちらかを変更すると、保存値が気付かないうちに壊れます。- 共有の Base Sepolia オラクルを本番環境の対象として使用しないでください。誰でも書き込み可能です。
PriceOracleの ABI を独自に作らないでください。ステップ 3 の ABI を使用してください(そこにある JSON はタスクが扱う部分のみで、deployContractは完全版を書き込みます)。
関連情報
/compose— Compose アプリをゼロから新規作成またはカスタマイズする方法、または Compose の説明。/compose-reference— マニフェスト、CLI、TaskContext API、ウォレット、ガス代のスポンサー、コード生成。/compose-doctor— 壊れた Compose アプリを診断して修正します。/auth-setup—goldsky loginの手順。