An 4800/tensorswap refactor (#553)

* (wip) initial model

* remove testing lines, add depends on comment

* handle more than  one sale per tx

* separate sol escrow from margin account

* use min_price as sale price for bid sales

* fix column name

* add model docs and tests

* add caveat for tensorswap sales amount description

* add business logic tests
This commit is contained in:
desmond-hui 2024-05-08 09:01:42 -07:00 committed by GitHub
parent 9db5cea171
commit c0d866b4fd
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 352 additions and 186 deletions

View File

@ -0,0 +1,19 @@
tx_id,index,inner_index,purchaser,seller,mint,sales_amount
zzvAhzMxDpJy99zcYms6vsjimT3XhQBf76s9AYA4XcYaEgRS2EmMDHY9uHrfz7372v85726Krz3kaKfYmLgnMFz,2,,HEsoAeQ6jgwiyPCL7A9mBjMf34qVAF96KYPNdxE68iY6,2w4HeHXEEVrpqpKUTZqVSCzCR5uWKK88pNY9pfqSW59R,BBMQUm1domLQUZr4gUm9Pd6EGLnuUu9hPX7bpD5dpqMT,0.468830396
4KnHxNCwtbvdnUP9xP6aUAGpEVVgZqVnGP8FzJAz3ghPhnSgUvm8DPVdwm5tE9d78ScBxFQNqzRotW5mr2bYL9P5,2,,2zzPrvMe843AJ15jwppiA25XRXXgM4ajH9ZnVLtPmvPb,8FQ73HFaXurdDEUC4UpTJw99hvpaCJUHiqaQwBGgujiD,AnBW1sLFStkdHXpyJAH49Gu2t4y4rRhDnEKcEAcps28W,0.852
2nrF2VHpLvYQKjtFWqTxoXtHNDEJEH2zi1xYeaDd2FprFYWY7wajcnbnQbPkhqwrhQkiKfYDgKc9mCDgWUzZwvrb,2,,CqA42zXaf5zXk7EW7jtCLfL2uH1efuB9GtTfjfJ2hzoq,BsBqiPgRgHPa8YgJ6wNgfP2GJsSgAsesXtaqqvVcGm79,Ek9ECbHYSW6QB9aUU6UsovP5d2Z7mfEBcdRrA5bt8thB,2.124395
p55mzFVcnhtVCi6sawH2pkSxkJa9SKMJkxn8TWUeE8tKjopo5vJkoh5qrQ9Ew8xN4kJ3YJtbt3uPUaF6wpsgGnZ,2,,9AK4UnGrgD9f7LUN4BWBP7sWHYZKtKrcskG1ZUupcYdk,UGN81iXDACqYgjmZyHacvQ5HvDHngrJGC65hMhrCp8T,DVTp4SpmS2FxuRuac91iGr3e8qDXVoZWPFi3DGB5ot6p,1.28877
3xwnYCxCeZNUu9sA1Rfb6HdDc73JqALfWVNgJq2YSwYrz5bxLTiCjiHTzPbuzLTnddojE3fyiRTq5xGhdMmer9wo,2,,2CSaG83rn8Ed3AEptRMP3G7fSKsZcYD85bNS3hNdLqhv,9Kae7VKAekWehphkEJR5sAqrjXYVUn7iV5hUxYuePHyZ,2ZF49XB7edqA6zv1eJGu7X1JNE7fnCUUhr1kY5h18Aqp,0.082206709
2TrRP357hzX7Ax1ViTuZFndRRUDMpswKs9dKpFvpu8EcXwH23JQyqXQSvCENX3EqoAcWUV9aFpN3HYHMtvSdEPQG,2,,EPmdnrwVzV8vx7wQc2koJNgKTiuJG679YekjdnVmhBAd,Ai1fatXJSdKTnS3Y7zYUrNsnTbga8EdYfYzxiX1nyD8e,H5WySnXWH3NC6STHjJpPobRSVZtXdULzXvD3amnLfPvo,2.41010735
c5iWkPRG58nw9RRgoe77ewYFRR99NS3XqsBAFurEZ5CUAYefiGMdvvhWLCoyd7Tv1NcCPDsVu3eQVJS9VyjY1Gh,2,,GTTUEQ9bjAL7RsEt6DxoogpWzW2STF7J2QdCTeQwvxK8,5hwJtfuFAVJMsVGkgk5k7UYh9o2hz1gDAtjXFKcpenGn,ENRbzzdUTTV1orqCPn9LS8rxYTBFuHp1vLNVffvWWqhW,3.80570739
2gy21b8QzZ2VXUvd7QCFiELhy7papBqQctHK9XLcvMVeTdJwAZqmmfE6WHQRYQntQmkuzi63b1XYTJf99WnoApDD,2,,7zuFEyLQFHkAjm3mAuxN42VenwF6fZcqM81mmR8sBnmY,47Pdr9CZ4EQNFotybGfCWeJLuXgA834hNYNwMCPg6Rod,28aVtHjJqtrzyxyh4tJo2iuBiXGdAaNmKUMfE7Di8s5g,3.080742348
svSAsA7hVRshe1qWPaJGD8SptQgZsb38Hn2iKo5W8wk8kp37brEXRkyKUPS34xmJXxRYQDgQhtxUXNCtsKKEwXv,2,,CigdaiGyEUQxtwdq2VBs17LHjG4j8jWVxwsNsiMZFT7b,EeS5k1f3uSosrK2UGXJonXvvCM9Gq6gPEupgksAR3HvS,Cak3Dgepvd81PEHiUR5rsf4uPr1YwE2MmMbzxgVG58DU,3.237759
4zb3F8A7suKVJc9bi6isX2Y99YemwUSVuALBkjVXAZUaFH6CybycJ6BCqdFe2R4okWo27o3k1h5hJNC9nbCHVQGn,2,,AQjdRzhNeZo6tC3K7z51fWnz271MRfkTDyseHbRhLAp5,877LQMWzPcGpHVmsHKeugNxAb6ktfQUybpp39THGtDfC,noM9uZPhxyZvigtekBP4UD8fg8WCESd6bx5r7VG5vLg,0.007992
3Q9fnZTxhXU8hKt21Q9DawgNAMRbXf5zuatNE8x27vpc2WGZhax8f5ALnZhGDswUHjgTbCNkjBFRQwkHPTfKrcA3,2,,38Bgu35eNPb6X4Sny9xtpqhtK8sJDu3N7BSNWiZeTqnG,AaUwZQGgVvSFPdVjCS9A7mBLTtEadjG7fysojP3dN6WF,EnRbGZeay7RzqDGiozGtcoAJyXKsyb1bbVawujiEtP8o,4.9054896
3PwcTmfb1jd2d6ouABkvfpw2p261zYyuMrkH9wozL8nKBVnQCBji1WUSy1LfZe4iegiWYiHA5ae3VK3ASbcUDjjo,2,,EqK1frbJx97oCLqejF9kxXTy7GtKKP7H2vb6giRUf5ov,7wY5H7eGUBf3z8dfGYvqE7efA2nCz9ZEJ4zxMn1ub64i,HYkBBbcVUD1eziYPULqBi4Vf9JEsWZfBBFbekaBvHWrR,3.797199
5vsPBQWgtwhqeQQUHVQhuCtWDtAu5sqQak1FkMj7ZkQbMz12m8XrgTQCYtD1paFKh1KqAakpf6hQV4APd94VihLN,2,,rtb9nAcGRJZrvi7gNebabuABnQFbBCLQBDobnExQorR,34HyeGxUwuCMAhXeCp3jJ4NKqiCZ1MMws92ckqVNDdAF,GujZhZKwT7aChatX2qAQVRh9uBU9NcTP8dc7ui9JzuHn,0.071005374
2munG4m9guSktDAp8QNt3WK1uVVD3BKV5zWqYuApjKjeiLDV9br6QwemQ1UeTHnfeF5CB7axL3K2kFbKUJpCAzHr,2,,CMNyyCXkAQ5cfFS2zQEg6YPzd8fpHvMFbbbmUfjoPp1s,GSzhhbDjMH5DCqPokGcgpzkasn676G8zv3MRSmjiiQPp,9MqyzA46r6nCSWxRPxq67TLwK44fPKbv5MP2sbxrgEaJ,3.85844768
2munG4m9guSktDAp8QNt3WK1uVVD3BKV5zWqYuApjKjeiLDV9br6QwemQ1UeTHnfeF5CB7axL3K2kFbKUJpCAzHr,3,,CRMh9ozJgpdawmBaCDvW8FKAiUL14J1g9VKsovB66AWE,CMNyyCXkAQ5cfFS2zQEg6YPzd8fpHvMFbbbmUfjoPp1s,9MqyzA46r6nCSWxRPxq67TLwK44fPKbv5MP2sbxrgEaJ,3.989840043
5PaqpRyNvDjPkRD8UeBKUC8SiwddLLtxZgPuDTngZXCZ2sZ7tDVHoXtqwDWWf9Jq4DVCytobc4o8h1mxNMD8hXzv,2,,7ZPzPYhmnXYWwMQ629CJEJCwpcsge6TKqaA6SmahzjBa,8H83F53ztRQvNDrSxiNGege4HCMxqQ7BKXBcpnPWQAcN,H4bbArKoYpVKmeBc3YAa5cpcEFaBcXVrwUR9N9toMaCD,2.831451429
5Ndp4DwJvVxiF6cEVtHvnzW749hjqKFdwYVYS4Bn2GHtc3qPGsk9AuowBhamqDkJaXNgiC3CaSDMK4k2a2pEchzJ,2,,AQYyCfb358cokJks8GBYrRhCE2smJNEFsj38V9N4y54R,FgVYBs7Qag74oSNgFozGH2zCXeWZKyff6KNyQBGVZsF2,2pE7mPLe1Fi1eM4MMSYByVEqcBnBEW3AvUqZu5rozpTZ,0.723530448
5Ndp4DwJvVxiF6cEVtHvnzW749hjqKFdwYVYS4Bn2GHtc3qPGsk9AuowBhamqDkJaXNgiC3CaSDMK4k2a2pEchzJ,3,,FgVYBs7Qag74oSNgFozGH2zCXeWZKyff6KNyQBGVZsF2,AQYyCfb358cokJks8GBYrRhCE2smJNEFsj38V9N4y54R,AMZJ5CaFHPeL3V1poFt14GvZwisJk7x7aRN69C3DNcRD,0.666161076
1 tx_id index inner_index purchaser seller mint sales_amount
2 zzvAhzMxDpJy99zcYms6vsjimT3XhQBf76s9AYA4XcYaEgRS2EmMDHY9uHrfz7372v85726Krz3kaKfYmLgnMFz 2 HEsoAeQ6jgwiyPCL7A9mBjMf34qVAF96KYPNdxE68iY6 2w4HeHXEEVrpqpKUTZqVSCzCR5uWKK88pNY9pfqSW59R BBMQUm1domLQUZr4gUm9Pd6EGLnuUu9hPX7bpD5dpqMT 0.468830396
3 4KnHxNCwtbvdnUP9xP6aUAGpEVVgZqVnGP8FzJAz3ghPhnSgUvm8DPVdwm5tE9d78ScBxFQNqzRotW5mr2bYL9P5 2 2zzPrvMe843AJ15jwppiA25XRXXgM4ajH9ZnVLtPmvPb 8FQ73HFaXurdDEUC4UpTJw99hvpaCJUHiqaQwBGgujiD AnBW1sLFStkdHXpyJAH49Gu2t4y4rRhDnEKcEAcps28W 0.852
4 2nrF2VHpLvYQKjtFWqTxoXtHNDEJEH2zi1xYeaDd2FprFYWY7wajcnbnQbPkhqwrhQkiKfYDgKc9mCDgWUzZwvrb 2 CqA42zXaf5zXk7EW7jtCLfL2uH1efuB9GtTfjfJ2hzoq BsBqiPgRgHPa8YgJ6wNgfP2GJsSgAsesXtaqqvVcGm79 Ek9ECbHYSW6QB9aUU6UsovP5d2Z7mfEBcdRrA5bt8thB 2.124395
5 p55mzFVcnhtVCi6sawH2pkSxkJa9SKMJkxn8TWUeE8tKjopo5vJkoh5qrQ9Ew8xN4kJ3YJtbt3uPUaF6wpsgGnZ 2 9AK4UnGrgD9f7LUN4BWBP7sWHYZKtKrcskG1ZUupcYdk UGN81iXDACqYgjmZyHacvQ5HvDHngrJGC65hMhrCp8T DVTp4SpmS2FxuRuac91iGr3e8qDXVoZWPFi3DGB5ot6p 1.28877
6 3xwnYCxCeZNUu9sA1Rfb6HdDc73JqALfWVNgJq2YSwYrz5bxLTiCjiHTzPbuzLTnddojE3fyiRTq5xGhdMmer9wo 2 2CSaG83rn8Ed3AEptRMP3G7fSKsZcYD85bNS3hNdLqhv 9Kae7VKAekWehphkEJR5sAqrjXYVUn7iV5hUxYuePHyZ 2ZF49XB7edqA6zv1eJGu7X1JNE7fnCUUhr1kY5h18Aqp 0.082206709
7 2TrRP357hzX7Ax1ViTuZFndRRUDMpswKs9dKpFvpu8EcXwH23JQyqXQSvCENX3EqoAcWUV9aFpN3HYHMtvSdEPQG 2 EPmdnrwVzV8vx7wQc2koJNgKTiuJG679YekjdnVmhBAd Ai1fatXJSdKTnS3Y7zYUrNsnTbga8EdYfYzxiX1nyD8e H5WySnXWH3NC6STHjJpPobRSVZtXdULzXvD3amnLfPvo 2.41010735
8 c5iWkPRG58nw9RRgoe77ewYFRR99NS3XqsBAFurEZ5CUAYefiGMdvvhWLCoyd7Tv1NcCPDsVu3eQVJS9VyjY1Gh 2 GTTUEQ9bjAL7RsEt6DxoogpWzW2STF7J2QdCTeQwvxK8 5hwJtfuFAVJMsVGkgk5k7UYh9o2hz1gDAtjXFKcpenGn ENRbzzdUTTV1orqCPn9LS8rxYTBFuHp1vLNVffvWWqhW 3.80570739
9 2gy21b8QzZ2VXUvd7QCFiELhy7papBqQctHK9XLcvMVeTdJwAZqmmfE6WHQRYQntQmkuzi63b1XYTJf99WnoApDD 2 7zuFEyLQFHkAjm3mAuxN42VenwF6fZcqM81mmR8sBnmY 47Pdr9CZ4EQNFotybGfCWeJLuXgA834hNYNwMCPg6Rod 28aVtHjJqtrzyxyh4tJo2iuBiXGdAaNmKUMfE7Di8s5g 3.080742348
10 svSAsA7hVRshe1qWPaJGD8SptQgZsb38Hn2iKo5W8wk8kp37brEXRkyKUPS34xmJXxRYQDgQhtxUXNCtsKKEwXv 2 CigdaiGyEUQxtwdq2VBs17LHjG4j8jWVxwsNsiMZFT7b EeS5k1f3uSosrK2UGXJonXvvCM9Gq6gPEupgksAR3HvS Cak3Dgepvd81PEHiUR5rsf4uPr1YwE2MmMbzxgVG58DU 3.237759
11 4zb3F8A7suKVJc9bi6isX2Y99YemwUSVuALBkjVXAZUaFH6CybycJ6BCqdFe2R4okWo27o3k1h5hJNC9nbCHVQGn 2 AQjdRzhNeZo6tC3K7z51fWnz271MRfkTDyseHbRhLAp5 877LQMWzPcGpHVmsHKeugNxAb6ktfQUybpp39THGtDfC noM9uZPhxyZvigtekBP4UD8fg8WCESd6bx5r7VG5vLg 0.007992
12 3Q9fnZTxhXU8hKt21Q9DawgNAMRbXf5zuatNE8x27vpc2WGZhax8f5ALnZhGDswUHjgTbCNkjBFRQwkHPTfKrcA3 2 38Bgu35eNPb6X4Sny9xtpqhtK8sJDu3N7BSNWiZeTqnG AaUwZQGgVvSFPdVjCS9A7mBLTtEadjG7fysojP3dN6WF EnRbGZeay7RzqDGiozGtcoAJyXKsyb1bbVawujiEtP8o 4.9054896
13 3PwcTmfb1jd2d6ouABkvfpw2p261zYyuMrkH9wozL8nKBVnQCBji1WUSy1LfZe4iegiWYiHA5ae3VK3ASbcUDjjo 2 EqK1frbJx97oCLqejF9kxXTy7GtKKP7H2vb6giRUf5ov 7wY5H7eGUBf3z8dfGYvqE7efA2nCz9ZEJ4zxMn1ub64i HYkBBbcVUD1eziYPULqBi4Vf9JEsWZfBBFbekaBvHWrR 3.797199
14 5vsPBQWgtwhqeQQUHVQhuCtWDtAu5sqQak1FkMj7ZkQbMz12m8XrgTQCYtD1paFKh1KqAakpf6hQV4APd94VihLN 2 rtb9nAcGRJZrvi7gNebabuABnQFbBCLQBDobnExQorR 34HyeGxUwuCMAhXeCp3jJ4NKqiCZ1MMws92ckqVNDdAF GujZhZKwT7aChatX2qAQVRh9uBU9NcTP8dc7ui9JzuHn 0.071005374
15 2munG4m9guSktDAp8QNt3WK1uVVD3BKV5zWqYuApjKjeiLDV9br6QwemQ1UeTHnfeF5CB7axL3K2kFbKUJpCAzHr 2 CMNyyCXkAQ5cfFS2zQEg6YPzd8fpHvMFbbbmUfjoPp1s GSzhhbDjMH5DCqPokGcgpzkasn676G8zv3MRSmjiiQPp 9MqyzA46r6nCSWxRPxq67TLwK44fPKbv5MP2sbxrgEaJ 3.85844768
16 2munG4m9guSktDAp8QNt3WK1uVVD3BKV5zWqYuApjKjeiLDV9br6QwemQ1UeTHnfeF5CB7axL3K2kFbKUJpCAzHr 3 CRMh9ozJgpdawmBaCDvW8FKAiUL14J1g9VKsovB66AWE CMNyyCXkAQ5cfFS2zQEg6YPzd8fpHvMFbbbmUfjoPp1s 9MqyzA46r6nCSWxRPxq67TLwK44fPKbv5MP2sbxrgEaJ 3.989840043
17 5PaqpRyNvDjPkRD8UeBKUC8SiwddLLtxZgPuDTngZXCZ2sZ7tDVHoXtqwDWWf9Jq4DVCytobc4o8h1mxNMD8hXzv 2 7ZPzPYhmnXYWwMQ629CJEJCwpcsge6TKqaA6SmahzjBa 8H83F53ztRQvNDrSxiNGege4HCMxqQ7BKXBcpnPWQAcN H4bbArKoYpVKmeBc3YAa5cpcEFaBcXVrwUR9N9toMaCD 2.831451429
18 5Ndp4DwJvVxiF6cEVtHvnzW749hjqKFdwYVYS4Bn2GHtc3qPGsk9AuowBhamqDkJaXNgiC3CaSDMK4k2a2pEchzJ 2 AQYyCfb358cokJks8GBYrRhCE2smJNEFsj38V9N4y54R FgVYBs7Qag74oSNgFozGH2zCXeWZKyff6KNyQBGVZsF2 2pE7mPLe1Fi1eM4MMSYByVEqcBnBEW3AvUqZu5rozpTZ 0.723530448
19 5Ndp4DwJvVxiF6cEVtHvnzW749hjqKFdwYVYS4Bn2GHtc3qPGsk9AuowBhamqDkJaXNgiC3CaSDMK4k2a2pEchzJ 3 FgVYBs7Qag74oSNgFozGH2zCXeWZKyff6KNyQBGVZsF2 AQYyCfb358cokJks8GBYrRhCE2smJNEFsj38V9N4y54R AMZJ5CaFHPeL3V1poFt14GvZwisJk7x7aRN69C3DNcRD 0.666161076

View File

@ -0,0 +1,5 @@
{% docs _invocation_id %}
Unique identifier for DBT job run that inserted/modified this record
{% enddocs %}

View File

@ -1,194 +1,266 @@
-- depends_on: {{ ref('silver__decoded_instructions_combined') }}
{{ config(
materialized = 'incremental',
unique_key = "CONCAT_WS('-', tx_id, mint, purchaser)",
incremental_strategy = 'delete+insert',
cluster_by = ['block_timestamp::DATE'],
incremental_predicates = ["dynamic_range_predicate", "block_timestamp::date"],
merge_exclude_columns = ["inserted_timestamp"],
unique_key = "nft_sales_tensorswap_id",
cluster_by = ['block_timestamp::DATE','_inserted_timestamp::DATE'],
tags = ['scheduled_non_core']
) }}
with pre_final as (
SELECT
block_id,
block_timestamp,
tx_id,
succeeded,
i.value:programId :: STRING AS program_id,
i.value:accounts[4] :: STRING AS mint,
i.value:accounts[8] :: STRING AS purchaser,
i.value:accounts[7] :: STRING AS seller,
MAX(ABS(post_balances[keys.index] - pre_balances[keys.index]) / POWER(10,9)) AS sales_amount,
_inserted_timestamp
FROM
{{ ref('silver__transactions') }}
INNER JOIN lateral flatten (input => instructions) i
INNER JOIN lateral flatten (input => account_keys) keys
WHERE
array_contains('Program log: Instruction: BuySingleListing'::VARIANT, log_messages)
AND i.value:programId = 'TSWAPaqyCSx2KABk68Shruf4rp7CxcNi8hAsbdwmHbN'
AND i.value:accounts[8] = signers[0]
{% if execute %}
{% set base_query %}
CREATE OR REPLACE temporary TABLE silver.nft_sales_tensorswap__intermediate_tmp AS
SELECT
block_timestamp,
block_id,
tx_id,
succeeded,
INDEX,
inner_index,
program_id,
event_type,
decoded_instruction,
_inserted_timestamp
FROM
{{ ref('silver__decoded_instructions_combined') }}
WHERE
program_id = 'TSWAPaqyCSx2KABk68Shruf4rp7CxcNi8hAsbdwmHbN'
AND event_type IN (
'wnsBuySingleListing',
'buyNftT22',
'buySingleListing',
'buyNft',
'buySingleListingT22',
'wnsBuyNft',
'sellNftTokenPool',
'sellNftTokenPoolT22',
'sellNftTradePoolT22',
'wnsSellNftTradePool',
'wnsSellNftTokenPool',
'sellNftTradePool'
)
AND succeeded
{% if is_incremental() %}
AND _inserted_timestamp >= (
SELECT
MAX(_inserted_timestamp)
FROM
{{ this }}
AND _inserted_timestamp >= (
SELECT
MAX(_inserted_timestamp) - INTERVAL '1 hour'
FROM
{{ this }}
)
{% else %}
AND block_timestamp :: date >= '2022-09-22'
AND _inserted_timestamp :: DATE >= '2023-11-15'
{% endif %}
GROUP BY
block_id,
block_timestamp,
tx_id,
succeeded,
i.value,
i.value:accounts[8],
i.value:accounts[7],
i.value:accounts[4],
_inserted_timestamp
{% endset %}
UNION
{% do run_query(base_query) %}
{% set between_stmts = fsc_utils.dynamic_range_predicate(
"silver.nft_sales_tensorswap__intermediate_tmp",
"block_timestamp::date"
) %}
{% endif %}
SELECT
block_id,
block_timestamp,
tx_id,
succeeded,
i.value:programId :: STRING AS program_id,
i.value:accounts[5] :: STRING AS mint,
i.value:accounts[11] :: STRING AS purchaser,
i.value:accounts[10] :: STRING AS seller,
MAX(ABS(post_balances[keys.index] - pre_balances[keys.index]) / POWER(10,9)) AS sales_amount,
_inserted_timestamp
FROM
{{ ref('silver__transactions') }}
INNER JOIN lateral flatten (input => instructions) i
INNER JOIN lateral flatten (input => account_keys) keys
WHERE
array_contains('Program log: Instruction: BuyNft'::VARIANT, log_messages)
AND i.value:programId = 'TSWAPaqyCSx2KABk68Shruf4rp7CxcNi8hAsbdwmHbN'
AND i.value:accounts[11] = signers[0]
{% if is_incremental() %}
AND _inserted_timestamp >= (
SELECT
MAX(_inserted_timestamp)
FROM
{{ this }}
)
{% else %}
AND block_timestamp :: date >= '2022-09-22'
{% endif %}
GROUP BY
block_id,
block_timestamp,
tx_id,
succeeded,
i.value,
i.value:accounts[11],
i.value:accounts[10],
i.value:accounts[5],
_inserted_timestamp
WITH decoded AS (
SELECT
block_timestamp,
block_id,
tx_id,
succeeded,
INDEX,
inner_index,
program_id,
event_type,
CASE
WHEN event_type IN (
'wnsBuySingleListing',
'buyNftT22',
'buySingleListing',
'buyNft',
'buySingleListingT22',
'wnsBuyNft'
) THEN silver.udf_get_account_pubkey_by_name(
'buyer',
decoded_instruction :accounts
)
WHEN event_type IN (
'sellNftTokenPool',
'sellNftTokenPoolT22',
'sellNftTradePoolT22',
'wnsSellNftTradePool',
'wnsSellNftTokenPool',
'sellNftTradePool'
) THEN silver.udf_get_account_pubkey_by_name(
'shared > owner',
decoded_instruction :accounts
)
END AS purchaser,
CASE
WHEN event_type IN (
'wnsBuySingleListing',
'buyNftT22',
'buySingleListing',
'buyNft',
'buySingleListingT22',
'wnsBuyNft'
) THEN silver.udf_get_account_pubkey_by_name(
'owner',
decoded_instruction :accounts
)
WHEN event_type IN (
'sellNftTokenPool',
'sellNftTokenPoolT22',
'sellNftTradePoolT22',
'wnsSellNftTradePool',
'wnsSellNftTokenPool',
'sellNftTradePool'
) THEN silver.udf_get_account_pubkey_by_name(
'shared > seller',
decoded_instruction :accounts
)
END AS seller,
CASE
WHEN event_type IN (
'wnsBuySingleListing',
'buyNftT22',
'buySingleListing',
'buyNft',
'buySingleListingT22',
'wnsBuyNft'
) THEN silver.udf_get_account_pubkey_by_name(
'nftMint',
decoded_instruction :accounts
)
WHEN event_type IN (
'sellNftTokenPool',
'sellNftTokenPoolT22',
'sellNftTradePoolT22',
'wnsSellNftTradePool',
'wnsSellNftTokenPool',
'sellNftTradePool'
) THEN silver.udf_get_account_pubkey_by_name(
'shared > nftMint',
decoded_instruction :accounts
)
END AS mint,
decoded_instruction:args:minPrice::int * pow(10,-9) AS min_price,
_inserted_timestamp
FROM
silver.nft_sales_tensorswap__intermediate_tmp
),
base_transfers AS (
SELECT
block_timestamp,
tx_id,
index,
tx_from,
mint,
amount
FROM
{{ ref('silver__transfers') }} t
WHERE
{{ between_stmts }}
),
buys AS (
SELECT
d.block_timestamp,
d.tx_id,
d.index,
SUM(
t.amount
) AS sales_amount
FROM
base_transfers t
JOIN decoded d
ON d.block_timestamp :: DATE = t.block_timestamp :: DATE
AND d.tx_id = t.tx_id
AND d.index = SPLIT_PART(
t.index,
'.',
1
)
AND d.purchaser = t.tx_from
WHERE
d.event_type IN (
'wnsBuySingleListing',
'buyNftT22',
'buySingleListing',
'buyNft',
'buySingleListingT22',
'wnsBuyNft'
)
AND t.mint = 'So11111111111111111111111111111111111111112'
UNION
SELECT
block_id,
block_timestamp,
tx_id,
succeeded,
i.value:programId :: STRING AS program_id,
i.value:accounts[6] :: STRING AS mint,
i.value:accounts[9] :: STRING AS purchaser,
i.value:accounts[10] :: STRING AS seller,
MAX(ABS(post_balances[keys.index] - pre_balances[keys.index]) / POWER(10,9)) AS sales_amount,
_inserted_timestamp
FROM
{{ ref('silver__transactions') }}
INNER JOIN lateral flatten (input => instructions) i
INNER JOIN lateral flatten (input => account_keys) keys
WHERE
array_contains('Program log: Instruction: SellNftTokenPool'::VARIANT, log_messages)
AND i.value:programId = 'TSWAPaqyCSx2KABk68Shruf4rp7CxcNi8hAsbdwmHbN'
AND i.value:accounts[10] = signers[0]
{% if is_incremental() %}
AND _inserted_timestamp >= (
SELECT
MAX(_inserted_timestamp)
FROM
{{ this }}
)
{% else %}
AND block_timestamp :: date >= '2022-09-22'
{% endif %}
GROUP BY
block_id,
block_timestamp,
tx_id,
succeeded,
i.value,
i.value:accounts[9],
i.value:accounts[10],
i.value:accounts[6],
_inserted_timestamp
UNION
SELECT
block_id,
block_timestamp,
tx_id,
succeeded,
i.value:programId :: STRING AS program_id,
i.value:accounts[6] :: STRING AS mint,
i.value:accounts[9] :: STRING AS purchaser,
i.value:accounts[10] :: STRING AS seller,
MAX(ABS(post_balances[keys.index] - pre_balances[keys.index]) / POWER(10,9)) AS sales_amount,
_inserted_timestamp
FROM
{{ ref('silver__transactions') }}
INNER JOIN lateral flatten (input => instructions) i
INNER JOIN lateral flatten (input => account_keys) keys
WHERE
array_contains('Program log: Instruction: SellNftTradePool'::VARIANT, log_messages)
AND i.value:programId = 'TSWAPaqyCSx2KABk68Shruf4rp7CxcNi8hAsbdwmHbN'
AND i.value:accounts[10] = signers[0]
{% if is_incremental() %}
AND _inserted_timestamp >= (
SELECT
MAX(_inserted_timestamp)
FROM
{{ this }}
)
{% else %}
AND block_timestamp :: date >= '2022-09-22'
{% endif %}
GROUP BY
block_id,
block_timestamp,
tx_id,
succeeded,
i.value,
i.value:accounts[9],
i.value:accounts[10],
i.value:accounts[6],
_inserted_timestamp
GROUP BY
1,2,3
),
sells AS (
SELECT
block_timestamp,
block_id,
tx_id,
succeeded,
index,
inner_index,
program_id,
purchaser,
seller,
mint,
min_price AS sales_amount,
_inserted_timestamp
FROM
decoded
WHERE
event_type IN (
'sellNftTokenPool',
'sellNftTokenPoolT22',
'sellNftTradePoolT22',
'wnsSellNftTradePool',
'wnsSellNftTokenPool',
'sellNftTradePool'
)
),
pre_final AS (
SELECT
block_timestamp,
block_id,
tx_id,
succeeded,
index,
inner_index,
program_id,
purchaser,
seller,
mint,
sales_amount,
_inserted_timestamp,
FROM
sells
UNION ALL
SELECT
d.block_timestamp,
d.block_id,
d.tx_id,
d.succeeded,
d.index,
d.inner_index,
d.program_id,
d.purchaser,
d.seller,
d.mint,
b.sales_amount,
d._inserted_timestamp,
FROM
decoded d
JOIN buys b
USING(block_timestamp, tx_id, index)
)
SELECT
block_id,
block_timestamp,
tx_id,
succeeded,
program_id,
mint,
purchaser,
seller,
sales_amount,
_inserted_timestamp,
{{ dbt_utils.generate_surrogate_key(
['tx_id','mint','purchaser']
) }} AS nft_sales_tensorswap_id,
*,
{{ dbt_utils.generate_surrogate_key(['tx_id','index','inner_index','mint']) }} AS nft_sales_tensorswap_id,
SYSDATE() AS inserted_timestamp,
SYSDATE() AS modified_timestamp,
'{{ invocation_id }}' AS _invocation_id
FROM
pre_final
FROM
pre_final

View File

@ -2,12 +2,33 @@ version: 2
models:
- name: silver__nft_sales_tensorswap
tests:
- dbt_utils.unique_combination_of_columns:
combination_of_columns:
- TX_ID
- MINT
- PURCHASER
- SELLER
- compare_model_subset:
name: silver__nft_sales_tensorswap_business_logic_test
compare_model: ref('testing__nft_sales_tensorswap')
compare_columns:
- tx_id
- index
- inner_index
- purchaser
- seller
- mint
- round(sales_amount,8)
model_condition: "where tx_id in ('zzvAhzMxDpJy99zcYms6vsjimT3XhQBf76s9AYA4XcYaEgRS2EmMDHY9uHrfz7372v85726Krz3kaKfYmLgnMFz',
'4KnHxNCwtbvdnUP9xP6aUAGpEVVgZqVnGP8FzJAz3ghPhnSgUvm8DPVdwm5tE9d78ScBxFQNqzRotW5mr2bYL9P5',
'2nrF2VHpLvYQKjtFWqTxoXtHNDEJEH2zi1xYeaDd2FprFYWY7wajcnbnQbPkhqwrhQkiKfYDgKc9mCDgWUzZwvrb',
'p55mzFVcnhtVCi6sawH2pkSxkJa9SKMJkxn8TWUeE8tKjopo5vJkoh5qrQ9Ew8xN4kJ3YJtbt3uPUaF6wpsgGnZ',
'3xwnYCxCeZNUu9sA1Rfb6HdDc73JqALfWVNgJq2YSwYrz5bxLTiCjiHTzPbuzLTnddojE3fyiRTq5xGhdMmer9wo',
'2TrRP357hzX7Ax1ViTuZFndRRUDMpswKs9dKpFvpu8EcXwH23JQyqXQSvCENX3EqoAcWUV9aFpN3HYHMtvSdEPQG',
'c5iWkPRG58nw9RRgoe77ewYFRR99NS3XqsBAFurEZ5CUAYefiGMdvvhWLCoyd7Tv1NcCPDsVu3eQVJS9VyjY1Gh',
'2gy21b8QzZ2VXUvd7QCFiELhy7papBqQctHK9XLcvMVeTdJwAZqmmfE6WHQRYQntQmkuzi63b1XYTJf99WnoApDD',
'svSAsA7hVRshe1qWPaJGD8SptQgZsb38Hn2iKo5W8wk8kp37brEXRkyKUPS34xmJXxRYQDgQhtxUXNCtsKKEwXv',
'4zb3F8A7suKVJc9bi6isX2Y99YemwUSVuALBkjVXAZUaFH6CybycJ6BCqdFe2R4okWo27o3k1h5hJNC9nbCHVQGn',
'3Q9fnZTxhXU8hKt21Q9DawgNAMRbXf5zuatNE8x27vpc2WGZhax8f5ALnZhGDswUHjgTbCNkjBFRQwkHPTfKrcA3',
'3PwcTmfb1jd2d6ouABkvfpw2p261zYyuMrkH9wozL8nKBVnQCBji1WUSy1LfZe4iegiWYiHA5ae3VK3ASbcUDjjo',
'5vsPBQWgtwhqeQQUHVQhuCtWDtAu5sqQak1FkMj7ZkQbMz12m8XrgTQCYtD1paFKh1KqAakpf6hQV4APd94VihLN',
'2munG4m9guSktDAp8QNt3WK1uVVD3BKV5zWqYuApjKjeiLDV9br6QwemQ1UeTHnfeF5CB7axL3K2kFbKUJpCAzHr',
'5PaqpRyNvDjPkRD8UeBKUC8SiwddLLtxZgPuDTngZXCZ2sZ7tDVHoXtqwDWWf9Jq4DVCytobc4o8h1mxNMD8hXzv',
'5Ndp4DwJvVxiF6cEVtHvnzW749hjqKFdwYVYS4Bn2GHtc3qPGsk9AuowBhamqDkJaXNgiC3CaSDMK4k2a2pEchzJ')"
columns:
- name: BLOCK_TIMESTAMP
description: "{{ doc('block_timestamp') }}"
@ -28,6 +49,12 @@ models:
description: "{{ doc('tx_succeeded') }}"
tests:
- not_null
- name: INDEX
description: "{{ doc('event_index') }}"
tests:
- not_null
- name: INNER_INDEX
description: "{{ doc('inner_index') }}"
- name: PROGRAM_ID
description: "{{ doc('program_id') }}"
tests:
@ -46,10 +73,30 @@ models:
- not_null:
where: succeeded = TRUE
- name: SALES_AMOUNT
description: "{{ doc('sales_amount') }}"
description: "{{ doc('sales_amount') }}. For bid side sales the amount is an estimation using `min_price`"
tests:
- not_null
- dbt_utils.expression_is_true:
expression: ">= 0"
- name: _INSERTED_TIMESTAMP
description: "{{ doc('_inserted_timestamp') }}"
tests:
- not_null
- not_null
- name: NFT_SALES_TENSORSWAP_ID
description: '{{ doc("pk") }}'
tests:
- unique
- name: INSERTED_TIMESTAMP
description: '{{ doc("inserted_timestamp") }}'
tests:
- not_null
- name: MODIFIED_TIMESTAMP
description: '{{ doc("modified_timestamp") }}'
tests:
- not_null
- name: _INVOCATION_ID
description: '{{ doc("_invocation_id") }}'
tests:
- not_null:
name: test_silver__not_null_nft_sales_tensorswap__invocation_id

View File

@ -71,6 +71,29 @@ models:
and _inserted_timestamp between current_date - 7 and current_timestamp() - INTERVAL '4 HOUR'
and block_timestamp::date <> '2022-07-04' /* upstream issue with missing inner instructions in events for some blocks in this date, remove this when it gets resolved */
to_condition: "_inserted_timestamp >= current_date - 7"
- dbt_utils.relationships_where:
name: dbt_utils_relationships_where_silver__decoded_instructions_combined_nft_sales_tensorswap_tx_id
to: ref('silver__nft_sales_tensorswap')
field: tx_id
from_condition: >
program_id = 'TSWAPaqyCSx2KABk68Shruf4rp7CxcNi8hAsbdwmHbN'
AND event_type IN (
'wnsBuySingleListing',
'buyNftT22',
'buySingleListing',
'buyNft',
'buySingleListingT22',
'wnsBuyNft',
'sellNftTokenPool',
'sellNftTokenPoolT22',
'sellNftTradePoolT22',
'wnsSellNftTradePool',
'wnsSellNftTokenPool',
'sellNftTradePool'
)
AND succeeded
AND _inserted_timestamp between current_date - 7 AND current_timestamp() - INTERVAL '4 HOUR'
to_condition: "_inserted_timestamp >= current_date - 7"
- name: SIGNERS
- name: SUCCEEDED
- name: INDEX