Loading...
Loading...
Compare original and translation side by side
/compose-doctor/compose-referencegoldsky login/auth-setup/secrets/compose-doctor/compose-referencegoldsky login/auth-setup/secretsBashBashcompose devcompose deploycompose logs -fcompose devcompose deploycompose logs -fcurl https://goldsky.com | sh
goldsky logincurl https://goldsky.com | sh
goldsky logingoldsky compose init <app-name> # scaffolds a Bitcoin-oracle example
cd <app-name>
goldsky compose dev # hot-reload local server on :4000
goldsky compose deploy # bundle + upload to cloud
goldsky compose status # expect RUNNING
goldsky compose logs -f # stream logsgoldsky compose init <app-name> # 初始化一个比特币预言机示例
cd <app-name>
goldsky compose dev # 在:4000端口启动热重载本地服务器
goldsky compose deploy # 打包并上传至云端
goldsky compose status # 预期状态为RUNNING
goldsky compose logs -f # 流式查看日志compose.yamlcompose.yamlundefinedundefined
```ts
// src/tasks/hourly-update.ts
import type { TaskContext } from "compose";
export async function main({ evm, env, logEvent }: TaskContext) {
const wallet = await evm.wallet({ name: "updater" });
const tx = await wallet.writeContract(
evm.chains.polygonAmoy,
env.ORACLE_ADDRESS,
"update(uint256)",
[BigInt(Date.now())],
{ confirmations: 3, onReorg: { action: { type: "replay" }, depth: 200 } },
);
await logEvent({ code: "updated", message: "ok", data: { hash: tx.hash } });
}
```ts
// src/tasks/hourly-update.ts
import type { TaskContext } from "compose";
export async function main({ evm, env, logEvent }: TaskContext) {
const wallet = await evm.wallet({ name: "updater" });
const tx = await wallet.writeContract(
evm.chains.polygonAmoy,
env.ORACLE_ADDRESS,
"update(uint256)",
[BigInt(Date.now())],
{ confirmations: 3, onReorg: { action: { type: "replay" }, depth: 200 } },
);
await logEvent({ code: "updated", message: "ok", data: { hash: tx.hash } });
}async function main(context, params?)compose.yamlasync function main(context, params?)compose.yaml| Type | Fires on | Key config |
|---|---|---|
| schedule | |
| HTTP POST to | |
| decoded log | |
| 类型 | 触发条件 | 关键配置 |
|---|---|---|
| 定时调度 | |
| 向 | |
| 解码后的日志 | |
{ env, fetch, callTask, logEvent, evm, collection }context.envsecrets/compose-reference{ env, fetch, callTask, logEvent, evm, collection }context.envsecrets/compose-referenceevm.wallet({ name: "updater" })compose dev --fork-chainsevm.wallet({ privateKey: env.MY_KEY, sponsorGas: true })evm.wallet({ name: "updater" })compose dev --fork-chainsevm.wallet({ privateKey: env.MY_KEY, sponsorGas: true })secrets:goldsky compose secret set --name X --value Ycompose secret sync.envcontext.envsecrets:goldsky compose secret set --name X --value Ycompose secret sync.envcontext.env/compose-reference/compose-referencehttps://app.goldsky.com/<project_id>/dashboard/compose/<app-name>https://app.goldsky.com/<project_id>/dashboard/compose/<app-name>onReorg: replayonReorg: replayundefinedundefined
```ts
// src/tasks/manual-fire.ts
import type { TaskContext } from "compose";
export async function main({ logEvent }: TaskContext, params: { amount: number }) {
await logEvent({ code: "fired", message: "manual", data: params });
return { ok: true, received: params.amount };
}curl -X POST -H "Authorization: Bearer $TOKEN" -d '{"amount": 42}' https://<app-url>/tasks/manual_fire
```ts
// src/tasks/manual-fire.ts
import type { TaskContext } from "compose";
export async function main({ logEvent }: TaskContext, params: { amount: number }) {
await logEvent({ code: "fired", message: "manual", data: params });
return { ok: true, received: params.amount };
}curl -X POST -H "Authorization: Bearer $TOKEN" -d '{"amount": 42}' https://<app-url>/tasks/manual_fire- name: on_transfer
path: src/tasks/on-transfer.ts
triggers:
- type: onchain_event
network: polygon_amoy
contract: "0xYourContract"
events:
- "Transfer(address,address,uint256)"import type { TaskContext } from "compose";
export async function main(
{ evm, logEvent }: TaskContext,
params: { log: { topics: string[]; data: string; address: string } },
) {
const decoded = await evm.decodeEventLog(
[{ type: "event", name: "Transfer", inputs: [/* ABI inputs */] }],
params.log,
);
await logEvent({ code: "transfer", message: "seen", data: decoded });
}- name: on_transfer
path: src/tasks/on-transfer.ts
triggers:
- type: onchain_event
network: polygon_amoy
contract: "0xYourContract"
events:
- "Transfer(address,address,uint256)"import type { TaskContext } from "compose";
export async function main(
{ evm, logEvent }: TaskContext,
params: { log: { topics: string[]; data: string; address: string } },
) {
const decoded = await evm.decodeEventLog(
[{ type: "event", name: "Transfer", inputs: [/* ABI输入 */] }],
params.log,
);
await logEvent({ code: "transfer", message: "seen", data: decoded });
}const wallet = await evm.wallet({ name: "my-oracle" }); // sponsorGas defaults TRUE
const tx = await wallet.writeContract(
evm.chains.base,
env.FEED_ADDRESS,
"setPrice(uint256)",
[1234n],
);const wallet = await evm.wallet({ name: "my-oracle" }); // sponsorGas默认开启
const tx = await wallet.writeContract(
evm.chains.base,
env.FEED_ADDRESS,
"setPrice(uint256)",
[1234n],
);const wallet = await evm.wallet({
privateKey: env.MY_KEY,
sponsorGas: true, // MUST opt in; defaults FALSE
});const wallet = await evm.wallet({
privateKey: env.MY_KEY,
sponsorGas: true, // 必须显式开启;默认关闭
});const runs = await collection<{ id: string; ts: number }>("runs");
await runs.setById("latest", { id: "latest", ts: Date.now() });
const recent = await runs.findOne({ ts: { $gt: Date.now() - 86_400_000 } });const runs = await collection<{ id: string; ts: number }>("runs");
await runs.setById("latest", { id: "latest", ts: Date.now() });
const recent = await runs.findOne({ ts: { $gt: Date.now() - 86_400_000 } });src/contracts/Oracle.jsongoldsky compose codegeninitdevdeployevm.contracts.Oracle/compose-referencesrc/contracts/Oracle.jsongoldsky compose codegeninitdevdeployevm.contracts.Oracle/compose-referencegoldsky project list 2>&1/auth-setupgoldsky project list 2>&1/auth-setuppolygonAmoybasesponsorGas: trueapi_versionstablepolygonAmoybasesponsorGas: trueapi_versionstablegoldsky compose init <name>goldsky compose init <name>compose.yamlsecrets:goldsky compose secret set --name X --value Y.envcompose secret syncgoldsky compose wallet create --name <name>wallet list.envenv.Xcompose.yamlsecrets:goldsky compose secret set --name X --value Y.envcompose secret syncgoldsky compose wallet create --name <name>wallet list.envenv.Xgoldsky compose dev--fork-chainsgoldsky compose callTask <name> '<json>'goldsky compose dev--fork-chainsgoldsky compose callTask <name> '<json>'goldsky compose deploygoldsky compose deploygoldsky compose status --json # expect .status == "RUNNING"
goldsky compose logs -f # expect app-specific log lineshttps://app.goldsky.com/<project_id>/dashboard/compose/<app-name>goldsky compose status --json # 预期.status == "RUNNING"
goldsky compose logs -f # 预期看到应用特定的日志行https://app.goldsky.com/<project_id>/dashboard/compose/<app-name>compose dev--fork-chainssponsorGas: true.envcompose secret synccompose deploy --sync-envapi_versionstablecompose dev--fork-chainssponsorGas: true.envcompose secret synccompose deploy --sync-envapi_versionstable/compose-doctor/compose-reference/auth-setupgoldsky login/secrets/compose-doctor/compose-reference/auth-setupgoldsky login/secrets