solana-models/macros/python/udfs.sql
tarikceric 2cc12c6960
An 2296/intermediate swaps tables 2 (#157)
* create testing data

* table w failed and successful txfers

* initial model

* create transfers2 and testing data

* add expected results

* testing additions

* check-in

* remove not-null requirement

* add business test cases, simplify, need acct owners

* wip

* clean tests and update model

* update model for edge cases

* fix expected test case

* check in

* logic for unordered swaps

* create single model for all dex swaps

* check in updates

* remove mint actions

* general model

* remove jup v4

* clean up

* update transfers2

* update name

* test that specific tx are excluded

* initial changes per pr comments

* add program_id

* Add base_events and combine union

* uncomment incremental logic

* move block_id filter to base_events

* remove flatten, map accounts directly to transfer to/from

* filter out non-swap actions and fix join logic

* remove raydium logic and rename

* remove raydium swap in test

* Include TRPY swaps

* update table config

* add program_id column to yml

* add additional test records

* updates per PR comments

* remove dependency of excluded tx test on csv

* remove unnecessary program_id

* remove orca dex references

* additional inner join logic

* query cleanup/formatting

* add test cases

* add back delegate mapping for saber + test cases

* An 2455/intermediate swaps raydium (#161)

* Intermediate swaps model for raydium

* add test cases, remove unnecessary filter and hook

* tweak event filters and join optimizations

* revisions per pr comments

* update excluded tx tests and remove csv dependency

* add token accts

* add test cases, round amts to 8 decimals

* use associated accts given in swap instruction

* handle multisig authorities

* add test case

Co-authored-by: Desmond Hui <desmond@flipsidecrypto.com>

* add udf to get swapper from multi signer txs

python udf for getting swapper if multiple signers

* use udf for getting multi signer swapper

* add more multi signer test cases

* add mappings and test cases for solrise initiated swaps

Co-authored-by: Desmond Hui <desmond@flipsidecrypto.com>
2022-12-05 08:28:14 -08:00

101 lines
2.8 KiB
PL/PgSQL

{% macro create_udf_ordered_signers(schema) %}
create or replace function {{ schema }}.udf_ordered_signers(accts array)
returns array
language python
runtime_version = '3.8'
handler = 'ordered_signers'
as
$$
def ordered_signers(accts) -> list:
signers = []
for v in accts:
if v["signer"]:
signers.append(v["pubkey"])
return signers
$$;
{% endmacro %}
{% macro create_udf_get_all_inner_instruction_events(schema) %}
create or replace function {{ schema }}.udf_get_all_inner_instruction_events(inner_instruction array)
returns array
language python
runtime_version = '3.8'
handler = 'get_all_inner_instruction_events'
as
$$
def get_all_inner_instruction_events(inner_instruction) -> list:
event_types = []
if inner_instruction:
for v in inner_instruction:
if type(v) is dict and v.get("parsed") and type(v["parsed"]) is dict and v["parsed"].get("type"):
event_types.append(v["parsed"]["type"])
else:
event_types.append(None)
return event_types
$$;
{% endmacro %}
{% macro create_udf_get_account_balances_index(schema) %}
create or replace function {{ schema }}.udf_get_account_balances_index(account string, account_keys array)
returns int
language python
runtime_version = '3.8'
handler = 'get_account_balances_index'
as
$$
def get_account_balances_index(account, account_keys) -> int:
for i,a in enumerate(account_keys):
if a and a.get("pubkey") == account:
return i
return None
$$;
{% endmacro %}
{% macro create_udf_get_all_inner_instruction_program_ids(schema) %}
create or replace function {{ schema }}.udf_get_all_inner_instruction_program_ids(inner_instruction variant)
returns array
language python
runtime_version = '3.8'
handler = 'get_all_inner_instruction_program_ids'
as
$$
def get_all_inner_instruction_program_ids(inner_instruction) -> list:
program_ids = []
if inner_instruction:
for v in inner_instruction.get('instructions',[]):
if type(v) is dict and v.get("programId"):
program_ids.append(v.get("programId"))
else:
program_ids.append(None)
return program_ids
$$;
{% endmacro %}
{% macro create_udf_get_multi_signers_swapper(schema) %}
create or replace function {{ schema }}.udf_get_multi_signers_swapper(tx_to array, tx_from array, signers array)
returns string
language python
runtime_version = '3.8'
handler = 'get_multi_signers_swapper'
as
$$
def get_multi_signers_swapper(tx_to, tx_from, signers):
lst = tx_to + tx_from
d = {}
for v in lst:
d[v] = d[v]+1 if d.get(v) else 1
cnts = sorted(d.items(), key = lambda x: x[1], reverse = True)
for v in cnts:
for signer in signers:
if v[0] == signer:
return signer
return signers[0]
$$;
{% endmacro %}