@@ -8,8 +8,11 @@ export const make = (strategies: AbiStore['strategies']) =>
88 Effect . gen ( function * ( ) {
99 const sql = yield * SqlClient . SqlClient
1010
11+ const table = sql ( 'loop_decoder_contract_abi__' )
12+
13+ // TODO; add timestamp to the table
1114 yield * sql `
12- CREATE TABLE IF NOT EXISTS contractAbi (
15+ CREATE TABLE IF NOT EXISTS ${ table } (
1316 type TEXT NOT NULL,
1417 address TEXT,
1518 event TEXT,
@@ -18,7 +21,10 @@ export const make = (strategies: AbiStore['strategies']) =>
1821 abi TEXT,
1922 status TEXT NOT NULL
2023 )
21- ` . pipe ( Effect . catchAll ( ( ) => Effect . dieMessage ( 'Failed to create contractAbi table' ) ) )
24+ ` . pipe (
25+ Effect . tapError ( Effect . logError ) ,
26+ Effect . catchAll ( ( ) => Effect . dieMessage ( 'Failed to create contractAbi table' ) ) ,
27+ )
2228
2329 return AbiStore . of ( {
2430 strategies,
@@ -28,33 +34,70 @@ export const make = (strategies: AbiStore['strategies']) =>
2834 if ( value . status === 'success' && value . result . type === 'address' ) {
2935 const result = value . result
3036 yield * sql `
31- INSERT INTO contractAbi (type, address, chain, abi, status)
32- VALUES (${ result . type } , ${ normalizedAddress } , ${ result . chainID } , ${ result . abi } , "success")
37+ INSERT INTO ${ table }
38+ ${ sql . insert ( [
39+ {
40+ type : result . type ,
41+ address : normalizedAddress ,
42+ chain : key . chainID ,
43+ abi : result . abi ,
44+ status : 'success' ,
45+ } ,
46+ ] ) }
3347 `
3448 } else if ( value . status === 'success' ) {
3549 const result = value . result
3650 yield * sql `
37- INSERT INTO contractAbi (type, event, signature, abi, status)
38- VALUES (${ result . type } , ${ 'event' in result ? result . event : null } , ${
39- 'signature' in result ? result . signature : null
40- } , ${ result . abi } , "success")
51+ INSERT INTO ${ table }
52+ ${ sql . insert ( [
53+ {
54+ type : result . type ,
55+ event : 'event' in result ? result . event : null ,
56+ signature : 'signature' in result ? result . signature : null ,
57+ abi : result . abi ,
58+ status : 'success' ,
59+ } ,
60+ ] ) }
4161 `
4262 } else {
4363 yield * sql `
44- INSERT INTO contractAbi (type, address, chain, status)
45- VALUES ("address", ${ normalizedAddress } , ${ key . chainID } , "not-found")
64+ INSERT INTO ${ table }
65+ ${ sql . insert ( [
66+ {
67+ type : 'address' ,
68+ address : normalizedAddress ,
69+ chain : key . chainID ,
70+ status : 'not-found' ,
71+ } ,
72+ ] ) }
4673 `
4774 }
48- } ) . pipe ( Effect . catchAll ( ( ) => Effect . succeed ( null ) ) ) ,
75+ } ) . pipe (
76+ Effect . tapError ( Effect . logError ) ,
77+ Effect . catchAll ( ( ) => {
78+ return Effect . succeed ( null )
79+ } ) ,
80+ ) ,
4981
5082 get : ( { address, signature, event, chainID } ) =>
5183 Effect . gen ( function * ( ) {
52- const items = yield * sql `
53- SELECT * FROM contractAbi
54- WHERE (address = ${ address . toLowerCase ( ) } AND chain = ${ chainID } AND type = "address")
55- ${ signature ? `OR (signature = ${ signature } AND type = "func")` : '' }
56- ${ event ? `OR (event = ${ event } AND type = "event")` : '' }
57- ` . pipe ( Effect . catchAll ( ( ) => Effect . succeed ( [ ] ) ) )
84+ const addressQuery = sql . and ( [
85+ sql `address = ${ address . toLowerCase ( ) } ` ,
86+ sql `chain = ${ chainID } ` ,
87+ sql `type = 'address'` ,
88+ ] )
89+
90+ const signatureQuery = signature ? sql . and ( [ sql `signature = ${ signature } ` , sql `type = 'func'` ] ) : undefined
91+ const eventQuery = event ? sql . and ( [ sql `event = ${ event } ` , sql `type = 'event'` ] ) : undefined
92+ const query =
93+ signature == null && event == null
94+ ? addressQuery
95+ : sql . or ( [ addressQuery , signatureQuery , eventQuery ] . filter ( Boolean ) )
96+
97+ const items = yield * sql ` SELECT * FROM ${ table } WHERE ${ query } ` . pipe (
98+ Effect . tapError ( Effect . logError ) ,
99+ Effect . catchAll ( ( ) => Effect . succeed ( [ ] ) ) ,
100+ )
58101
59102 const item =
60103 items . find ( ( item ) => {
0 commit comments