diff --git a/parser/go.mod b/parser/go.mod index 35e9e9e7b..d75165033 100644 --- a/parser/go.mod +++ b/parser/go.mod @@ -25,6 +25,8 @@ require ( ) require ( + github.com/algorand/go-algorand-sdk v1.23.0 // indirect + github.com/algorand/go-codec/codec v1.1.8 // indirect github.com/andybalholm/brotli v1.0.5 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.0.2 // indirect github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.28 // indirect @@ -38,20 +40,26 @@ require ( github.com/beorn7/perks v1.0.1 // indirect github.com/btcsuite/btcd/btcec/v2 v2.2.0 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect + github.com/cosmos/btcutil v1.0.5 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect github.com/ethereum/go-ethereum v1.10.21 // indirect github.com/gofiber/adaptor/v2 v2.1.31 // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/golang/snappy v0.0.4 // indirect github.com/google/uuid v1.3.0 // indirect + github.com/hashicorp/go-cleanhttp v0.5.0 // indirect + github.com/hashicorp/go-retryablehttp v0.5.1 // indirect github.com/holiman/uint256 v1.2.1 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/klauspost/compress v1.16.3 // indirect + github.com/konsorten/go-windows-terminal-sequences v1.0.3 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.19 // indirect github.com/mattn/go-runewidth v0.0.14 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe // indirect + github.com/mr-tron/base58 v1.2.0 // indirect + github.com/opsgenie/opsgenie-go-sdk-v2 v1.2.19 // indirect github.com/philhofer/fwd v1.1.2 // indirect github.com/prometheus/client_model v0.3.0 // indirect github.com/prometheus/common v0.42.0 // indirect @@ -60,6 +68,7 @@ require ( github.com/rogpeppe/go-internal v1.9.0 // indirect github.com/savsgio/dictpool v0.0.0-20221023140959-7bf2e61cea94 // indirect github.com/savsgio/gotils v0.0.0-20230208104028-c358bd845dee // indirect + github.com/sirupsen/logrus v1.6.0 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/tidwall/pretty v1.2.1 // indirect github.com/tinylib/msgp v1.1.8 // indirect diff --git a/parser/go.sum b/parser/go.sum index 484709d06..2f3af9059 100644 --- a/parser/go.sum +++ b/parser/go.sum @@ -38,6 +38,11 @@ github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuy github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/algorand/go-algorand-sdk v1.23.0 h1:wlEV6OgDVc/sLeF2y41bwNG/Lr8EoMnN87Ur8N2Gyyo= +github.com/algorand/go-algorand-sdk v1.23.0/go.mod h1:7i2peZBcE48kfoxNZnLA+mklKh812jBKvQ+t4bn0KBQ= +github.com/algorand/go-codec v1.1.8/go.mod h1:XhzVs6VVyWMLu6cApb9/192gBjGRVGm5cX5j203Heg4= +github.com/algorand/go-codec/codec v1.1.8 h1:lsFuhcOH2LiEhpBH3BVUUkdevVmwCRyvb7FCAAPeY6U= +github.com/algorand/go-codec/codec v1.1.8/go.mod h1:tQ3zAJ6ijTps6V+wp8KsGDnPC2uhHVC7ANyrtkIY0bA= github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/andybalholm/brotli v1.0.5 h1:8uQZIdzKmjc/iuPu7O2ioW48L81FgatrcpfFmiq/cCs= github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= @@ -89,6 +94,8 @@ github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5P github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cosmos/btcutil v1.0.5 h1:t+ZFcX77LpKtDBhjucvnOH8C2l2ioGsBNEQ3jef8xFk= +github.com/cosmos/btcutil v1.0.5/go.mod h1:IyB7iuqZMJlthe2tkIFL33xPyzbFYP0XVdS8P5lUPis= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= @@ -181,6 +188,10 @@ github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/hashicorp/go-cleanhttp v0.5.0 h1:wvCrVc9TjDls6+YGAF2hAifE1E5U1+b4tH6KdvN3Gig= +github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-retryablehttp v0.5.1 h1:Vsx5XKPqPs3M6sM4U4GWyUqFS8aBiL9U5gkgvpkg4SE= +github.com/hashicorp/go-retryablehttp v0.5.1/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/holiman/uint256 v1.2.1 h1:XRtyuda/zw2l+Bq/38n5XUoEF72aSOu/77Thd9pPp2o= @@ -208,6 +219,7 @@ github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHU github.com/klauspost/compress v1.16.3 h1:XuJt9zzcnaz6a16/OU53ZjWp/v7/42WcR5t2a0PcNQY= github.com/klauspost/compress v1.16.3/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= @@ -233,8 +245,12 @@ github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3Rllmb github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe h1:iruDEfMl2E6fbMZ9s0scYfZQ84/6SPL6zC8ACM2oIL0= github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= +github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o= +github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/opsgenie/opsgenie-go-sdk-v2 v1.2.19 h1:JernwK3Bgd5x+UJPV6S2LPYoBF+DFOYBoQ5JeJPVBNc= +github.com/opsgenie/opsgenie-go-sdk-v2 v1.2.19/go.mod h1:4OjcxgwdXzezqytxN534MooNmrxRD50geWZxTD7845s= github.com/philhofer/fwd v1.1.1/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= github.com/philhofer/fwd v1.1.2 h1:bnDivRJ1EWPjUIRXV5KfORO897HTbpFAQddBdE8t7Gw= github.com/philhofer/fwd v1.1.2/go.mod h1:qkPdfjR2SIEbspLqpe1tO4n5yICnr2DY7mqEx2tUTP0= @@ -289,6 +305,7 @@ github.com/sethvargo/go-envconfig v0.6.0 h1:GxxdoeiNpWgGiVEphNFNObgMYRN/ZvI2dN7r github.com/sethvargo/go-envconfig v0.6.0/go.mod h1:00S1FAhRUuTNJazWBWcJGvEHOM+NO6DhoRMAOX7FY5o= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/sirupsen/logrus v1.6.0 h1:UBcNElsrwanuuMsnGSlYmtmgbb23qDR5dG+6X6Oo89I= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= @@ -307,6 +324,7 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/test-go/testify v1.1.4 h1:Tf9lntrKUMHiXQ07qBScBTSA0dhYQlu83hswqelv1iE= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= @@ -336,6 +354,7 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.mongodb.org/mongo-driver v1.11.2 h1:+1v2rDQUWNcGW7/7E0Jvdz51V38XXxJfhzbV17aNHCw= go.mongodb.org/mongo-driver v1.11.2/go.mod h1:s7p5vEtfbeR1gYi6pnj3c3/urpbLv2T5Sfd6Rp2HBB8= @@ -395,6 +414,7 @@ golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -426,9 +446,11 @@ golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81R golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= @@ -497,6 +519,7 @@ golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -567,6 +590,7 @@ golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc golang.org/x/tools v0.0.0-20201022035929-9cf592e881e9/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.4.0/go.mod h1:UE5sM2OK9E/d67R0ANs2xJizIymRP5gJU295PvKXxjQ= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/parser/parser/model.go b/parser/parser/model.go index 598e04dc9..6a2d66f65 100644 --- a/parser/parser/model.go +++ b/parser/parser/model.go @@ -4,27 +4,31 @@ import ( "time" ) -// ParserMetadata represent a parser metadata. -type ParserMetadata struct { - AppIDs []string `json:"appIds"` - Amount *string `json:"amount"` - TokenChain *uint16 `json:"tokenChain"` - TokenAddress *string `json:"tokenAddress"` - ReceiverChain *uint16 `json:"receiverChain"` - ReceiverAddress *string `json:"receiverAddress"` - Fee *string `json:"fee"` +// StandardizedProperties represent a standardized properties. +type StandardizedProperties struct { + AppIds []string `json:"appIds"` + FromChain uint16 `json:"fromChain"` + FromAddress string `json:"fromAddress"` + ToChain uint16 `json:"toChain"` + ToAddress string `json:"toAddress"` + TokenChain uint16 `json:"tokenChain"` + TokenAddress string `json:"tokenAddress"` + Amount string `json:"amount"` + FeeAddress string `json:"feeAddress"` + FeeChain uint16 `json:"feeChain"` + Fee string `json:"fee"` } -// ParsedVaaUpdate representa a parsedVaa document. +// ParsedVaaUpdate represent a parsed vaa update. type ParsedVaaUpdate struct { - ID string `bson:"_id"` - EmitterChain uint16 `bson:"emitterChain"` - EmitterAddr string `bson:"emitterAddr"` - Sequence string `bson:"sequence"` - AppID string `bson:"appId"` - Result interface{} `bson:"result"` - MetadataRaw ParserMetadata `bson:"metadataRaw"` - Metadata ParserMetadata `bson:"metadata"` - UpdatedAt *time.Time `bson:"updatedAt"` - Timestamp time.Time `bson:"-"` + ID string `bson:"_id"` + EmitterChain uint16 `bson:"emitterChain"` + EmitterAddr string `bson:"emitterAddr"` + Sequence string `bson:"sequence"` + AppIDs []string `bson:"appIds"` + ParsedPayload interface{} `bson:"parsedPayload"` + RawStandardizedProperties StandardizedProperties `bson:"rawStandardizedProperties"` + StandardizedProperties StandardizedProperties `bson:"standardizedProperties"` + UpdatedAt *time.Time `bson:"updatedAt"` + Timestamp time.Time `bson:"-"` } diff --git a/parser/parser/parser.go b/parser/parser/parser.go index abb377ef3..ee15ecf65 100644 --- a/parser/parser/parser.go +++ b/parser/parser/parser.go @@ -105,28 +105,14 @@ func (c ParserVAAAPIClient) ParsePayload(chainID uint16, address, sequence strin } } -// ParseVaaStandardResponse represent a parse vaa payload and standard fields. -type ParseVaaStandardResponse struct { - ChainID uint16 `json:"chainId"` - EmitterAddress string `json:"address"` - Sequence string `json:"sequence"` - AppID string `json:"appId"` - Result interface{} `json:"result"` - Metadata ParserMetadata `json:"metadata"` +// ParseVaaWithStandarizedPropertiesdResponse represent a parse vaa response. +type ParseVaaWithStandarizedPropertiesdResponse struct { + ParsedPayload interface{} `json:"parsedPayload"` + StandardizedProperties StandardizedProperties `json:"standardizedProperties"` } -type ParserMetadata struct { - AppIDs []string `json:"appIds"` - Amount *string `json:"amount"` - TokenChain *uint16 `json:"tokenChain"` - TokenAddress *string `json:"tokenAddress"` - ReceiverChain *uint16 `json:"receiverChain"` - ReceiverAddress *string `json:"receiverAddress"` - Fee *string `json:"fee"` -} - -// ParseVaaWithMetadata invoke the endpoint to parse a VAA from the VAAParserAPI to get payload and metadata fields. -func (c *ParserVAAAPIClient) ParseVaaWithMetadata(vaa *sdk.VAA) (*ParseVaaStandardResponse, error) { +// ParseVaaWithStandarizedProperties invoke the endpoint to parse a VAA from the VAAParserAPI. +func (c *ParserVAAAPIClient) ParseVaaWithStandarizedProperties(vaa *sdk.VAA) (*ParseVaaWithStandarizedPropertiesdResponse, error) { endpointUrl := fmt.Sprintf("%s/vaas/parse", c.BaseURL) vaaBytes, err := vaa.Marshal() @@ -135,7 +121,7 @@ func (c *ParserVAAAPIClient) ParseVaaWithMetadata(vaa *sdk.VAA) (*ParseVaaStanda } body := base64.StdEncoding.EncodeToString(vaaBytes) - response, err := c.Client.Post(endpointUrl, "text/html", bytes.NewBuffer([]byte(body))) + response, err := c.Client.Post(endpointUrl, "text/plain", bytes.NewBuffer([]byte(body))) if err != nil { c.Logger.Error("error call parse vaa endpoint", zap.Error(err), zap.Uint16("chainID", uint16(vaa.EmitterChain)), zap.String("address", vaa.EmitterAddress.String()), zap.Uint64("sequence", vaa.Sequence)) @@ -145,7 +131,7 @@ func (c *ParserVAAAPIClient) ParseVaaWithMetadata(vaa *sdk.VAA) (*ParseVaaStanda switch response.StatusCode { case http.StatusCreated: - var parsedVAA ParseVaaStandardResponse + var parsedVAA ParseVaaWithStandarizedPropertiesdResponse json.NewDecoder(response.Body).Decode(&parsedVAA) return &parsedVAA, nil case http.StatusNotFound: diff --git a/parser/processor/processor.go b/parser/processor/processor.go index b71ed8fdf..35ea39d60 100644 --- a/parser/processor/processor.go +++ b/parser/processor/processor.go @@ -4,9 +4,12 @@ import ( "context" "errors" "fmt" + "math/big" + "strings" "time" "github.com/wormhole-foundation/wormhole-explorer/common/client/alert" + "github.com/wormhole-foundation/wormhole-explorer/common/domain" parserAlert "github.com/wormhole-foundation/wormhole-explorer/parser/internal/alert" "github.com/wormhole-foundation/wormhole-explorer/parser/internal/metrics" "github.com/wormhole-foundation/wormhole-explorer/parser/parser" @@ -45,7 +48,7 @@ func (p *Processor) Process(ctx context.Context, vaaBytes []byte) (*parser.Parse sequence := fmt.Sprintf("%d", vaa.Sequence) p.metrics.IncVaaPayloadParserRequestCount(chainID) - vaaParseResponse, err := p.parser.ParseVaaWithMetadata(vaa) + vaaParseResponse, err := p.parser.ParseVaaWithStandarizedProperties(vaa) if err != nil { // split metrics error not found and others errors. if errors.Is(err, parser.ErrNotFound) { @@ -78,21 +81,21 @@ func (p *Processor) Process(ctx context.Context, vaaBytes []byte) (*parser.Parse p.metrics.IncVaaPayloadParserSuccessCount(chainID) p.metrics.IncVaaParsed(chainID) - metadata := transformMetadata(vaaParseResponse.Metadata) + standardizedProperties := p.transformStandarizedProperties(vaa.MessageID(), vaaParseResponse.StandardizedProperties) // create ParsedVaaUpdate to upsert. now := time.Now() vaaParsed := parser.ParsedVaaUpdate{ - ID: vaa.MessageID(), - EmitterChain: chainID, - EmitterAddr: emitterAddress, - Sequence: sequence, - AppID: vaaParseResponse.AppID, - Result: vaaParseResponse.Result, - MetadataRaw: vaaParseResponse.Metadata, - Metadata: metadata, - Timestamp: vaa.Timestamp, - UpdatedAt: &now, + ID: vaa.MessageID(), + EmitterChain: chainID, + EmitterAddr: emitterAddress, + Sequence: sequence, + AppIDs: standardizedProperties.AppIds, + ParsedPayload: vaaParseResponse.ParsedPayload, + RawStandardizedProperties: vaaParseResponse.StandardizedProperties, + StandardizedProperties: standardizedProperties, + Timestamp: vaa.Timestamp, + UpdatedAt: &now, } err = p.repository.UpsertParsedVaa(ctx, vaaParsed) @@ -106,7 +109,7 @@ func (p *Processor) Process(ctx context.Context, vaaBytes []byte) (*parser.Parse "chainID": vaa.EmitterChain.String(), "emitterAddress": emitterAddress, "sequence": sequence, - "appID": vaaParseResponse.AppID, + "appIDs": strings.Join(standardizedProperties.AppIds, ", "), }, Error: err} p.alert.CreateAndSend(ctx, parserAlert.AlertKeyInsertParsedVaaError, alertContext) @@ -118,16 +121,71 @@ func (p *Processor) Process(ctx context.Context, vaaBytes []byte) (*parser.Parse return &vaaParsed, nil } -func transformMetadata(metadataRaw parser.ParserMetadata) parser.ParserMetadata { +// transformStandarizedProperties transform amount and fee amount. +func (p *Processor) transformStandarizedProperties(vaaID string, sp parser.StandardizedProperties) parser.StandardizedProperties { + // transform amount. + amount := p.transformAmount(sp.TokenChain, sp.TokenAddress, sp.Amount, vaaID) + // transform fee amount. + feeAmount := p.transformAmount(sp.FeeChain, sp.FeeAddress, sp.Fee, vaaID) + // create metadata. + metadata := createStandarizedProperties(sp, amount, feeAmount) + return metadata +} - metadata := parser.ParserMetadata{ - AppIDs: metadataRaw.AppIDs, - Amount: metadataRaw.Amount, // - TokenChain: metadataRaw.TokenChain, - TokenAddress: metadataRaw.TokenAddress, - ReceiverChain: metadataRaw.ReceiverChain, - ReceiverAddress: metadataRaw.ReceiverAddress, - Fee: metadataRaw.Fee, // +// transformAmount transform amount and fee amount. +func (p *Processor) transformAmount(chainID uint16, address, amount, vaaID string) string { + + if chainID == 0 || address == "" || amount == "" { + return amount + } + + // Get the token metadata + // + // This is complementary data about the token that is not present in the VAA itself. + tokenMeta, ok := domain.GetTokenByAddress(vaa.ChainID(chainID), address) + if !ok { + p.logger.Warn("Token metadata not found", + zap.String("vaaId", vaaID), + zap.String("tokenAddress", address), + zap.Uint16("tokenChain", chainID)) + return amount + } + + bigAmount := new(big.Int) + bigAmount, ok = bigAmount.SetString(amount, 10) + if !ok { + p.logger.Error("Cannot parse amount", + zap.String("vaaId", vaaID), + zap.String("amount", amount), + zap.String("tokenAddress", address), + zap.Uint16("tokenChain", chainID)) + return amount + } + + if tokenMeta.Decimals < 8 { + // factor = 10 ^ (8 - tokenMeta.Decimals) + var factor big.Int + factor.Exp(big.NewInt(10), big.NewInt(int64(8-tokenMeta.Decimals)), nil) + + bigAmount = bigAmount.Mul(bigAmount, &factor) + } + + return bigAmount.String() +} + +// createStandarizedProperties create a new StandardizedProperties with amount and fee amount transformed. +func createStandarizedProperties(m parser.StandardizedProperties, amount, feeAmount string) parser.StandardizedProperties { + return parser.StandardizedProperties{ + AppIds: m.AppIds, + FromChain: m.FromChain, + FromAddress: m.FromAddress, + ToChain: m.ToChain, + ToAddress: m.ToAddress, + TokenChain: m.TokenChain, + TokenAddress: m.TokenAddress, + Amount: amount, + FeeAddress: m.FeeAddress, + FeeChain: m.FeeChain, + Fee: feeAmount, } - return metadata }