Dune SQLは、varbinaryをvarbinary型を使って表します。
varbinaryを操作しやすくするために、以下のヘルパー関数を提供しています。これらの関数は、この2種類の表現で動作します。これらはvarbinaryとのやり取りを簡略化し、自動的に0x
接頭辞を考慮してバイトインデックスを使用します。たとえば、varbinary_substringメソッドは文字インデックスではなくバイトでインデックスを取ります(varbinary長さの2倍)。
これらの関数を使用して、未デコードのイベントログやコールデータからデータを抽出できます。たとえば、uint256
を引数とする関数がある場合、varbinary_to_uint256
を使用してコールデータから値を抽出できます。コールデータの正しい部分を抽出するには、varbinary_substring
を使用するか、他のバイト配列操作関数を使用して正しい値を取得する必要があります。
select tx_hash,
data,
varbinary_substring(data,97,32) as fee,
varbinary_to_uint256(varbinary_substring(data,97,32)) as fee_uint256
from optimism.logs
where contract_address = 0xa1ace9ce6862e865937939005b1a6c5ac938a11f
and topic0 = 0xc9d5ada2ea384fe04826ecd1b258955ac73c3e2e20d755108eafde90bc5588d4
-- sample transaction hash
and tx_hash IN (0x3e3c558e7f723e3bb7de1d8f5f920ca206e3e878984296a2b8e6af2969003a19,
0xccfd2033adfb1fdd14fdfc047fe554ba7549e396abc6c559e9528a4259295b89)
varbinary変換関数は、varbinaryがサポートされているタイプのバイト数よりも大きい場合、最上位バイトがすべてゼロであってもオーバーフロー例外をスローします。左側のゼロバイトをトリムするためにvarbinary_ltrim
を使用することができます。
varbinary_to_integer(varbinary)
→ integer
2の補数で表される整数を表す長さ <= 4のビッグエンディアンのvarbinaryのINTEGER
値を返します。 varbinaryの長さが4未満の場合、ゼロバイトでパディングされます。
-- bytearrayを整数に変換[結果は1または0になります]
-- 1 = true, 0 = false
SELECT tx_hash,
varbinary_to_integer(varbinary_ltrim(varbinary_substring(data,1,32))) as isQuote_number,
CASE WHEN varbinary_to_integer(varbinary_ltrim(varbinary_substring(data,1,32))) = 1 THEN TRUE ELSE FALSE END AS isQuote
FROM arbitrum.logs
WHERE contract_address = 0xdaf4ffb05bfcb2c328c19135e3e74e1182c88283
AND topic0 = 0xf1bc206c8d659bf05edd19865dbae82643062168ec3970d9d7c5468f900487d9
LIMIT 10
varbinary_to_bigint(varbinary)
→ bigint
2の補数で表されるbigint
を表す長さ <= 8のビッグエンディアンのvarbinaryのBIGINT値を返します。 varbinaryの長さが8未満の場合、ゼロバイトでパディングされます。
-- bytearrayを整数に変換[結果は1または0になります]
-- 1 = true, 0 = false
SELECT tx_hash,
varbinary_to_bigint(varbinary_ltrim(varbinary_substring(data,1,32))) as isQuote_number,
CASE WHEN varbinary_to_bigint(varbinary_ltrim(varbinary_substring(data,1,32))) = 1 THEN TRUE ELSE FALSE END AS isQuote
FROM arbitrum.logs
WHERE contract_address = 0xdaf4ffb05bfcb2c328c19135e3e74e1182c88283
AND topic0 = 0xf1bc206c8d659bf05edd19865dbae82643062168ec3970d9d7c5468f900487d9
LIMIT 10
varbinary_to_decimal(varbinary)
→ decimal(38,0)
varbinaryを表す長さ <= 16のビッグエンディアンのvarbinaryのDECIMAL(38,0)
値を返します。 varbinaryの長さが16未満の場合、ゼロバイトでパディングされます。
-- rawテーブルを使用してusdcの送金額を取得する
-- 送金のtopic0 = 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef
-- usdcのcontract_address = 0xaf88d065e77c8cc2239327c5edb3a432268e5831
SELECT tx_hash,
data,
varbinary_to_decimal(varbinary_ltrim(data)) as data_decimal
FROM arbitrum.logs
WHERE topic0 = 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef
AND contract_address = 0xaf88d065e77c8cc2239327c5edb3a432268e5831
AND block_time >= NOW() - interval '1' day
LIMIT 50