DSLリファレンス
条件DSL(ドメイン固有言語)は、どのトークンを見つけるか、どの条件にマッチさせるかを表現する方法です。JSON形式で記述し、バリデーションされて安全なパラメータ化SQLにコンパイルされます。
概要
DSL条件は以下のプロパティを持つJSONオブジェクトです:
{
"target": "tokens", // 必須: クエリ対象(現在は "tokens" のみ)
"select": [...], // 任意: 返すフィールド
"joins": [...], // 任意: 結合する追加データ
"derived_joins": [...], // 任意: 取引から計算されるメトリクス
"where": {...}, // 任意: フィルター条件
"order_by": [...], // 任意: ソート順
"limit": 100 // 任意: 最大結果数(上限500)
}クエリ可能なデータ
tokens
基本トークンデータ: ミントアドレス、シンボル、メタデータURL、作成時刻、作成者、プラットフォームタイプ。
Example: tokens.symbol, tokens.mint_address
token_metrics
計算されたメトリクス: 価格、時価総額、ホルダー数、ATH値、卒業ステータス。
Example: token_metrics.holder_count, token_metrics.mc_lamports
trades
取引イベント。特定の取引が発生したかを確認するために 'exists' と共に使用。
Example: 大口買いのexistsチェック
derived
タイムウィンドウ内の取引から計算される集約値。
Example: derived.min_price_sol, derived.max_price_sol, derived.trade_count
利用可能なフィールド
トークンフィールド (tokens.*)
| フィールド | 型 | 説明 |
|---|---|---|
tokens.mint_address | string | ユニークなトークン識別子 |
tokens.symbol | string | トークンシンボル(例:PEPE) |
tokens.meta_url | string | メタデータURL |
tokens.created_timestamp | number | 作成時のUnixタイムスタンプ |
tokens.created_block | number | 作成時のブロック番号 |
tokens.creator_address | string | 作成者のウォレットアドレス |
tokens.bonding_curve_address | string | ボンディングカーブアドレス |
tokens.platform_type | string | プラットフォームタイプ |
トークンメトリクスフィールド (token_metrics.*)
joins: ["token_metrics"] が必要です。
| フィールド | 型 | 説明 |
|---|---|---|
token_metrics.price_lamports | number | lamports建ての現在価格 |
token_metrics.mc_lamports | number | lamports建ての時価総額 |
token_metrics.holder_count | number | ホルダー数 |
token_metrics.ath_price_lamports | number | 最高値価格 |
token_metrics.ath_mc_lamports | number | 最高値時価総額 |
token_metrics.ath_timestamp | number | ATH達成時刻 |
token_metrics.graduate_timestamp | number | 卒業時刻(未卒業はnull) |
token_metrics.updated_timestamp | number | 最終メトリクス更新 |
派生フィールド (derived.*)
derived_joins エントリが必要です。
| フィールド | 説明 |
|---|---|
derived.pct_range | 価格レンジ %(trade_price_range_1h から) |
derived.min_price_sol | SOL建て最小価格(trade_price_window から) |
derived.max_price_sol | SOL建て最大価格(trade_price_window から) |
derived.volume_sol | SOL建て取引量(trade_price_window から) |
derived.trade_count | 取引回数(trade_price_window から) |
取引フィールド (trades.*)
exists 条件内でのみ使用可能。
| フィールド | 型 | 説明 |
|---|---|---|
trades.side | string | "buy" または "sell" |
trades.sol_amount_lamports | number | lamports建て取引額 |
trades.token_amount | number | 取引されたトークン量 |
trades.price_lamports | number | 取引時の価格 |
trades.block_timestamp | number | 取引発生時刻 |
trades.wallet_address | string | トレーダーのウォレット |
Joins
通常のJoins
{
"target": "tokens",
"joins": ["token_metrics"]
}現在は token_metrics のみサポートされています。
Derived Joins
Derived joinsは取引データから集約値を計算します。on句は必須で、以下の通り正確に記述する必要があります:
価格レンジ(1時間)
直近1時間の価格レンジ割合を計算
{
"target": "tokens",
"derived_joins": [
{
"derived": "trade_price_range_1h",
"on": {
"left": "tokens.mint_address",
"right": "derived.mint_address"
}
}
]
}価格ウィンドウ
タイムウィンドウの最小/最大価格とボリュームを取得
{
"target": "tokens",
"derived_joins": [
{
"derived": "trade_price_window",
"window": "1h",
"on": {
"left": "tokens.mint_address",
"right": "derived.mint_address"
}
}
]
}利用可能なウィンドウ: 5m, 15m, 1h(デフォルト), 4h, 24h
Where 演算子
比較: cmp
フィールドをリテラル値と比較します。
ホルダー数の閾値
100人以上のホルダーを持つトークンを検索
{
"op": "cmp",
"cmp": ">=",
"left": {
"type": "field",
"field": "token_metrics.holder_count"
},
"right": 100
}比較演算子: <, <=, >, >=, =, !=
比較: cmp_field
2つのフィールドを直接比較します。
ATH以下の価格
現在価格がATH以下のトークンを検索
{
"op": "cmp_field",
"cmp": "<",
"left": {
"type": "field",
"field": "token_metrics.price_lamports"
},
"right": {
"type": "field",
"field": "token_metrics.ath_price_lamports"
}
}比較: cmp_scaled_field
フィールドを別のフィールドにスケールファクターを掛けた値と比較します。
ATHから70%下落
ATH時価総額の30%以下のトークンを検索
{
"op": "cmp_scaled_field",
"cmp": "<=",
"left": {
"type": "field",
"field": "token_metrics.mc_lamports"
},
"right": {
"type": "field",
"field": "token_metrics.ath_mc_lamports"
},
"scale": 0.3
}レンジ糖衣構文: min と max
一般的な >= と <= 比較のショートハンド。
最小時価総額
時価総額が最低1000 lamports
{
"op": "min",
"ref": {
"type": "field",
"field": "token_metrics.mc_lamports"
},
"value": 1000
}最大ホルダー数
ホルダー数が最大500
{
"op": "max",
"ref": {
"type": "field",
"field": "token_metrics.holder_count"
},
"value": 500
}文字列マッチング: ilike と like
大文字小文字を区別しないパターンマッチング。
シンボルに 'wif' を含む
シンボルのどこかに 'wif' を含むトークンを検索
{
"op": "ilike",
"ref": {
"type": "field",
"field": "tokens.symbol"
},
"pattern": "%wif%"
}パターン構文:
%は任意の文字列にマッチ_は任意の1文字にマッチ
NULLチェック: is_null と is_not_null
未卒業
まだ卒業していないトークンを検索
{
"op": "is_null",
"ref": {
"type": "field",
"field": "token_metrics.graduate_timestamp"
}
}卒業済み
卒業したトークンを検索
{
"op": "is_not_null",
"ref": {
"type": "field",
"field": "token_metrics.graduate_timestamp"
}
}時間比較: now_minus_seconds_cmp
タイムスタンプフィールドを「現在時刻 - X秒」と比較します。
直近2時間以内に作成
直近7200秒以内に作成されたトークンを検索
{
"op": "now_minus_seconds_cmp",
"ref": {
"type": "field",
"field": "tokens.created_timestamp"
},
"cmp": ">=",
"seconds": 7200
}存在チェック: exists
関連レコードがtradesに存在するかチェックします。
大口買い検出
直近30分以内に10 SOL以上の買いが1回以上あるトークンを検索
{
"op": "exists",
"source": "trades",
"join_on": {
"left": "tokens.mint_address",
"right": "trades.mint_address"
},
"where": {
"op": "and",
"args": [
{
"op": "cmp",
"cmp": "=",
"left": {
"type": "field",
"field": "trades.side"
},
"right": "buy"
},
{
"op": "cmp",
"cmp": ">=",
"left": {
"type": "field",
"field": "trades.sol_amount_lamports"
},
"right": 10000000000
},
{
"op": "now_minus_seconds_cmp",
"ref": {
"type": "field",
"field": "trades.block_timestamp"
},
"cmp": ">=",
"seconds": 1800
}
]
}
}論理演算子: and, or, not
複数の条件を組み合わせます。
複数条件
ホルダーが増加中の新規トークンを検索
{
"op": "and",
"args": [
{
"op": "now_minus_seconds_cmp",
"ref": {
"type": "field",
"field": "tokens.created_timestamp"
},
"cmp": ">=",
"seconds": 3600
},
{
"op": "cmp",
"cmp": ">=",
"left": {
"type": "field",
"field": "token_metrics.holder_count"
},
"right": 50
}
]
}完全な例
新規トークン発見
直近1時間以内に作成された、50人以上のホルダーを持つトークンを検索:
トラクションのある新規トークン
{
"target": "tokens",
"joins": [
"token_metrics"
],
"where": {
"op": "and",
"args": [
{
"op": "now_minus_seconds_cmp",
"ref": {
"type": "field",
"field": "tokens.created_timestamp"
},
"cmp": ">=",
"seconds": 3600
},
{
"op": "cmp",
"cmp": ">=",
"left": {
"type": "field",
"field": "token_metrics.holder_count"
},
"right": 50
}
]
},
"order_by": [
{
"field": "token_metrics.holder_count",
"dir": "desc"
}
],
"limit": 20
}レンジ相場検出
狭いレンジで取引されているトークンを検索(最大価格が最小価格の1.2倍以内):
レンジ相場のトークン
{
"target": "tokens",
"derived_joins": [
{
"derived": "trade_price_window",
"window": "1h",
"on": {
"left": "tokens.mint_address",
"right": "derived.mint_address"
}
}
],
"where": {
"op": "cmp_scaled_field",
"cmp": "<=",
"left": {
"type": "field",
"field": "derived.max_price_sol"
},
"right": {
"type": "field",
"field": "derived.min_price_sol"
},
"scale": 1.2
},
"limit": 50
}ATHからのディップ
ATHの30%まで下落した卒業済みトークンを検索:
ディップ買いの機会
{
"target": "tokens",
"joins": [
"token_metrics"
],
"where": {
"op": "and",
"args": [
{
"op": "is_not_null",
"ref": {
"type": "field",
"field": "token_metrics.graduate_timestamp"
}
},
{
"op": "cmp_scaled_field",
"cmp": "<=",
"left": {
"type": "field",
"field": "token_metrics.mc_lamports"
},
"right": {
"type": "field",
"field": "token_metrics.ath_mc_lamports"
},
"scale": 0.3
}
]
},
"limit": 100
}制限事項
| 項目 | 制限 |
|---|---|
| Target | "tokens" のみサポート |
| Joins | ["token_metrics"] のみ |
| Derived joins | 条件ごとに最大1つ |
| 結果 | 評価ごとに上限500件 |
| テーブル | 任意のテーブルはクエリ不可 |
セキュリティ
条件が安全な理由:
- バリデーション: すべてのフィールドと演算子がホワイトリストに対してチェックされます
- パラメータ化: すべての値は文字列連結ではなくSQLパラメータになります
- 生のSQLなし: JSONを書き、システムが安全にコンパイルします
評価動作の詳細は、仕組みをご覧ください。
