From b332105d639f9bd9f7b95916eaf299244f564c34 Mon Sep 17 00:00:00 2001 From: Iulian Pascalau Date: Tue, 8 Oct 2024 17:32:47 +0300 Subject: [PATCH] - new price-aggregator contract - adjusted e2e framework to send oracle price submissions in the same block --- .../framework/chainSimulatorWrapper.go | 39 ++++++++++++++---- .../relayers/slowTests/framework/interface.go | 3 ++ .../slowTests/framework/multiversxHandler.go | 17 ++++++-- .../multiversx-price-aggregator-sc.abi.json | 2 +- .../mvx/multiversx-price-aggregator-sc.wasm | Bin 19711 -> 19665 bytes 5 files changed, 47 insertions(+), 14 deletions(-) diff --git a/integrationTests/relayers/slowTests/framework/chainSimulatorWrapper.go b/integrationTests/relayers/slowTests/framework/chainSimulatorWrapper.go index 5e864877..9631467d 100644 --- a/integrationTests/relayers/slowTests/framework/chainSimulatorWrapper.go +++ b/integrationTests/relayers/slowTests/framework/chainSimulatorWrapper.go @@ -145,14 +145,14 @@ func (instance *chainSimulatorWrapper) DeploySC(ctx context.Context, wasmFilePat Version: 1, } - hash := instance.signAndSend(ctx, ownerSK, ftx) - txResult := instance.getTransactionResult(ctx, hash) + hash := instance.signAndSend(ctx, ownerSK, ftx, 1) + txResult := instance.GetTransactionResult(ctx, hash) return NewMvxAddressFromBech32(instance.TB, txResult.Logs.Events[0].Address), hash, txResult } // GetTransactionResult tries to get a transaction result. It may wait a few blocks -func (instance *chainSimulatorWrapper) getTransactionResult(ctx context.Context, hash string) *data.TransactionOnNetwork { +func (instance *chainSimulatorWrapper) GetTransactionResult(ctx context.Context, hash string) *data.TransactionOnNetwork { instance.GenerateBlocksUntilTxProcessed(ctx, hash) txResult, err := instance.proxyInstance.GetTransactionInfoWithResults(ctx, hash) @@ -170,6 +170,10 @@ func (instance *chainSimulatorWrapper) getTransactionResult(ctx context.Context, // GenerateBlocks calls the chain simulator generate block endpoint func (instance *chainSimulatorWrapper) GenerateBlocks(ctx context.Context, numBlocks int) { + if numBlocks <= 0 { + return + } + _, status, err := instance.clientWrapper.PostHTTP(ctx, fmt.Sprintf(generateBlocksEndpoint, numBlocks), nil) if err != nil || status != http.StatusOK { log.Error("error in chainSimulatorWrapper.GenerateBlocks", "error", err, "status", status) @@ -197,15 +201,33 @@ func (instance *chainSimulatorWrapper) GenerateBlocksUntilTxProcessed(ctx contex // ScCall will make the provided sc call func (instance *chainSimulatorWrapper) ScCall(ctx context.Context, senderSK []byte, contract *MvxAddress, value string, gasLimit uint64, function string, parameters []string) (string, *data.TransactionOnNetwork) { + return instance.SendTx(ctx, senderSK, contract, value, gasLimit, createTxData(function, parameters)) +} + +// ScCallWithoutGenerateBlocks will make the provided sc call and do not trigger the generate blocks command +func (instance *chainSimulatorWrapper) ScCallWithoutGenerateBlocks(ctx context.Context, senderSK []byte, contract *MvxAddress, value string, gasLimit uint64, function string, parameters []string) string { + return instance.SendTxWithoutGenerateBlocks(ctx, senderSK, contract, value, gasLimit, createTxData(function, parameters)) +} + +func createTxData(function string, parameters []string) []byte { params := []string{function} params = append(params, parameters...) txData := strings.Join(params, "@") - return instance.SendTx(ctx, senderSK, contract, value, gasLimit, []byte(txData)) + return []byte(txData) } // SendTx will build and send a transaction func (instance *chainSimulatorWrapper) SendTx(ctx context.Context, senderSK []byte, receiver *MvxAddress, value string, gasLimit uint64, dataField []byte) (string, *data.TransactionOnNetwork) { + hash := instance.SendTxWithoutGenerateBlocks(ctx, senderSK, receiver, value, gasLimit, dataField) + instance.GenerateBlocks(ctx, 1) + txResult := instance.GetTransactionResult(ctx, hash) + + return hash, txResult +} + +// SendTxWithoutGenerateBlocks will build and send a transaction and won't call the generate blocks command +func (instance *chainSimulatorWrapper) SendTxWithoutGenerateBlocks(ctx context.Context, senderSK []byte, receiver *MvxAddress, value string, gasLimit uint64, dataField []byte) string { networkConfig, err := instance.proxyInstance.GetNetworkConfig(ctx) require.Nil(instance, err) @@ -225,10 +247,9 @@ func (instance *chainSimulatorWrapper) SendTx(ctx context.Context, senderSK []by Version: 1, } - hash := instance.signAndSend(ctx, senderSK, ftx) - txResult := instance.getTransactionResult(ctx, hash) + hash := instance.signAndSend(ctx, senderSK, ftx, 0) - return hash, txResult + return hash } // FundWallets sends funds to the provided addresses @@ -300,7 +321,7 @@ func (instance *chainSimulatorWrapper) getNonce(ctx context.Context, bech32Addre return account.Nonce, nil } -func (instance *chainSimulatorWrapper) signAndSend(ctx context.Context, senderSK []byte, ftx *transaction.FrontendTransaction) string { +func (instance *chainSimulatorWrapper) signAndSend(ctx context.Context, senderSK []byte, ftx *transaction.FrontendTransaction, numBlocksToGenerate int) string { sig, err := computeTransactionSignature(senderSK, ftx) require.Nil(instance, err) @@ -309,7 +330,7 @@ func (instance *chainSimulatorWrapper) signAndSend(ctx context.Context, senderSK hash, err := instance.proxyInstance.SendTransaction(ctx, ftx) require.Nil(instance, err) - instance.GenerateBlocks(ctx, 1) + instance.GenerateBlocks(ctx, numBlocksToGenerate) return hash } diff --git a/integrationTests/relayers/slowTests/framework/interface.go b/integrationTests/relayers/slowTests/framework/interface.go index 04bb4d48..2e879ea4 100644 --- a/integrationTests/relayers/slowTests/framework/interface.go +++ b/integrationTests/relayers/slowTests/framework/interface.go @@ -33,12 +33,15 @@ type ChainSimulatorWrapper interface { GetNetworkAddress() string DeploySC(ctx context.Context, path string, ownerSK []byte, gasLimit uint64, extraParams []string) (*MvxAddress, string, *data.TransactionOnNetwork) ScCall(ctx context.Context, senderSK []byte, contract *MvxAddress, value string, gasLimit uint64, function string, parameters []string) (string, *data.TransactionOnNetwork) + ScCallWithoutGenerateBlocks(ctx context.Context, senderSK []byte, contract *MvxAddress, value string, gasLimit uint64, function string, parameters []string) string SendTx(ctx context.Context, senderSK []byte, receiver *MvxAddress, value string, gasLimit uint64, dataField []byte) (string, *data.TransactionOnNetwork) + SendTxWithoutGenerateBlocks(ctx context.Context, senderSK []byte, receiver *MvxAddress, value string, gasLimit uint64, dataField []byte) string FundWallets(ctx context.Context, wallets []string) GenerateBlocksUntilEpochReached(ctx context.Context, epoch uint32) GenerateBlocks(ctx context.Context, numBlocks int) GetESDTBalance(ctx context.Context, address *MvxAddress, token string) string GetBlockchainTimeStamp(ctx context.Context) uint64 + GetTransactionResult(ctx context.Context, hash string) *data.TransactionOnNetwork } // EthereumBlockchainClient defines the operations supported by the Ethereum client diff --git a/integrationTests/relayers/slowTests/framework/multiversxHandler.go b/integrationTests/relayers/slowTests/framework/multiversxHandler.go index 07d861ef..146ca6c2 100644 --- a/integrationTests/relayers/slowTests/framework/multiversxHandler.go +++ b/integrationTests/relayers/slowTests/framework/multiversxHandler.go @@ -810,18 +810,25 @@ func (handler *MultiversxHandler) getTokenNameFromResult(txResult data.Transacti // SubmitAggregatorBatch will submit the aggregator batch func (handler *MultiversxHandler) SubmitAggregatorBatch(ctx context.Context, params IssueTokenParams) { + txHashes := make([]string, 0, len(handler.OraclesKeys)) for _, key := range handler.OraclesKeys { - handler.submitAggregatorBatchForKey(ctx, key, params) + hash := handler.submitAggregatorBatchForKey(ctx, key, params) + txHashes = append(txHashes, hash) + } + + for _, hash := range txHashes { + txResult := handler.ChainSimulator.GetTransactionResult(ctx, hash) + log.Info("submit aggregator batch tx", "hash", hash, "status", txResult.Status) } } -func (handler *MultiversxHandler) submitAggregatorBatchForKey(ctx context.Context, key KeysHolder, params IssueTokenParams) { +func (handler *MultiversxHandler) submitAggregatorBatchForKey(ctx context.Context, key KeysHolder, params IssueTokenParams) string { timestamp := handler.ChainSimulator.GetBlockchainTimeStamp(ctx) require.Greater(handler, timestamp, uint64(0), "something went wrong and the chain simulator returned 0 for the current timestamp") timestampAsBigInt := big.NewInt(0).SetUint64(timestamp) - hash, txResult := handler.ChainSimulator.ScCall( + hash := handler.ChainSimulator.ScCallWithoutGenerateBlocks( ctx, key.MvxSk, handler.AggregatorAddress, @@ -835,7 +842,9 @@ func (handler *MultiversxHandler) submitAggregatorBatchForKey(ctx context.Contex hex.EncodeToString(feeInt.Bytes()), fmt.Sprintf("%02x", params.NumOfDecimalsChainSpecific)}) - log.Info("submit aggregator batch tx executed", "transaction hash", hash, "submitter", key.MvxAddress.Bech32(), "status", txResult.Status) + log.Info("submit aggregator batch tx sent", "transaction hash", hash, "submitter", key.MvxAddress.Bech32()) + + return hash } // CreateDepositsOnMultiversxForToken will send the deposit transactions on MultiversX returning how many tokens should be minted on Ethereum diff --git a/integrationTests/relayers/slowTests/testdata/contracts/mvx/multiversx-price-aggregator-sc.abi.json b/integrationTests/relayers/slowTests/testdata/contracts/mvx/multiversx-price-aggregator-sc.abi.json index 97906b85..ed796fed 100644 --- a/integrationTests/relayers/slowTests/testdata/contracts/mvx/multiversx-price-aggregator-sc.abi.json +++ b/integrationTests/relayers/slowTests/testdata/contracts/mvx/multiversx-price-aggregator-sc.abi.json @@ -10,7 +10,7 @@ "contractCrate": { "name": "multiversx-price-aggregator-sc", "version": "0.47.1", - "gitVersion": "v0.45.2.1-reproducible-375-gda17d9d" + "gitVersion": "v0.45.2.1-reproducible-378-ge72c201" }, "framework": { "name": "multiversx-sc", diff --git a/integrationTests/relayers/slowTests/testdata/contracts/mvx/multiversx-price-aggregator-sc.wasm b/integrationTests/relayers/slowTests/testdata/contracts/mvx/multiversx-price-aggregator-sc.wasm index 2c820924b9fd8ee5fbf2f0f3f308bf4332b58057..ac1668faabb95e76fcf9c70dedfdf1ae3e46a54d 100644 GIT binary patch delta 2036 zcmZWpTWl3o6rFwM%-qM^xjh(2YFqHkK+;QSc@%OBZG-pRSYp+fCZfScBBhkJ(--s= zqP0^E3H4DznP`HVkZ2+j0V$Wqm(dtMBpL(p5fYJLQVkz|puuSTP}iATqHJ`T z{vs#(jBTS#VJHAsH@w^L>=Zja^8K#Byyuy`Re6aX4u>& z(>6Kd++yhjH%)G*nMK?wUF8czM@tv&8~4-k=ymDQx#*HS&VD`=?eH##Upp)nno}zc zb({73e3c=&q&#~J#>lgWC07e95T^)Ep%|pH|Mp}6RS(^iy zk~Xs9_${WxoAuHn_B)7AQ&0~5!jKr+B4jw0W7E{?;&OG(2(Z3JL5`sT-40*P4pO7p zj_uElz)y+Ob*T;LQ!BT!|_t0%5!lh z)a@X&T@0|0O_k64Nxa08mN-Zma^SgQpL88RTb#*GO1A^iWUG#Fb;St894)5UaiSsW zyd-d{^U~_VY*M-62m!35nALgdvPp@<_$LaXsFtpmRpfX{(d1d>7TOW&_0zaTx-z?c z{|Ii>Wm#O7)D@JyPnR_$)AjUNViT8jMM2d0B)Vi4`&}}P^;kKnx@g2NLM;nNYh}pQ z`WOI>E}-`lfE~B@$VF$j*r-847$70AN0wj7RW7(kha6sv1UwmKZetGm^xf&1?TuzH z=9td2Ntk4w9Vm}{KpY5tOPnP!(dHVgfL%*%Y~uxGpgpcoVOkGXqC<5H&Dn~N2n-37 zFl8f12-nUtFo~;!gt(V5H3uv80nOX><%=p6Z3BcjmqW7e=r=kl35tavSdP`;y)cGL znWV!)X@SbR2gNm7HpUj0Q-+e#>ggBrn4O{tFA;Z4`!(||nNZa4JCDM*QJsxx28&vZ z-oi%WzYRfZq{swNMv-tt)MS{WK7Ki=mWeHfzU^MBXK9W>j#rpUYWGVPKs_S~SEGR`hi=my-2J;0Xu~I}JlVIW+$-^AGwkT!cCv>r;zH?W~ zNz73?ccpwimU2AjOj*i6SVNOzH(8um7TW^aiYt}154;nx?ojtRu@i%}#U}K$8Pv8! z*o6wFcw39%XhKl&^rn1^DSR)fvEPsfKMpEpCwK^#@0@@&rNZG4U3jU_O*7dNn)a zPh2*s_kr8&Okp74=0=Hm{1FZ(dP^Ax38{HVUAc3XTzL?oW_bY>>d{+pP4ahi3w zfJU-BtAsK0P;Pt=1aGLCK-wpKuCKy#qjy>wN;g_&iQb3?wzg0yI=OWN*6+8jEqClb z_#2%&TDU`JOTQOxCZb;-{$W$w&_w4z-yS(SzI(85bhK}HNOld64~=c_8|)q(>m1xC e`$py7k>No(*4r)jj*pFxbVpycRhIs4BlBNqpnTr| delta 2109 zcmZWqU1%Le6rMBtbN6QV-i*?g+C)3M4de!+ZBt324e?Gep;3_vrJyJ#CMC^HOl*>d zs_|}>su65$*q2sC1s|%|R+DS{(g#Hm6?}+44~l;k^3aEZMfxD3=y!G#6?~bQopa{Q zneTkx*)LAgUneOLgVT?Y5Q3hj4GVtx8bQ?o8CS&s#aK~QEIhC!7;xga8pmQlR;vru z>nK<}5fK%V3-mh`lk>8V{Nzu0+j`&HH!)in**DWOJ~=dY&*a3=KH(>KTU)94#+*eI zBv0Bc*B7L4ZI>+9vZZZ1vTmJiS@wFjPC8`QKC)McmTGUhKVC-{lIL_twd5`RntXab zxikDM{@IuLSXQ?Pb489tPLt4%rgnKZCebc;X~(R{iaJeLl*hEtq;AwsNv_Dq<+&Wy z@pMO&Q&YWm8D5%^vQU`q44^t&GU6yc+b1IfNR+5LQw}8vdH==^^ z1*()J65w>47I}m^tlilDR8*omb%sJ$*Qv7<=CXk59nSB2KFNW2oToI|r_zrH?3nk4 z)vTe4V}u{psZC)KXJSqVrafw00*35-l*db4?W!XbkgugKs&@$+MfIpI`cZw)d~r?} z?}t;q_dgDfSr!$wu;!Ud{e@}`^FXaN^v$`Wo++r~1nBbWDEs+wHrJ_R_*7-ppo?L> zAwSHk+d?->Xg4hTBOjL`mHIsgrf@NbwbHO;mJ#+^4lA_9;kZcYltz_^+8U7>()HLM z(muwMnNvfLh&g{3!Cahe1|Zu~I2dabBJxlKm`C*L;$gLeA%Yo@!7!||S30It`Ij6e zyciC6GQwOzRrvH;Ev?-h)_zpgZ_RzDKksJ8{vv^x}&qhOiOjXV? zzAU4F9~l^r8OM8#crPYVpuqEGtX&YBb1*i8m1FjDI3tYK?#P&0Lg@_6hF+R69bg@} z+A}m31$SYcLvT66(N!}_?_$GS+lZSLnW-MB05hUYsm4J1=KbeAvtHdQ__lvsn?slJ zggBR_@p$>UtUyaCuqABv7A(&DYZ>OiZbktpF&`cC8{l%G8}$&1c9tj97l^zQvsG1e zUi+D_zgZQwiaZXsE(+F!?V*l3SQGa5sjyR@AQLtqVQ5P7qD&n#>8&6wsI(-rP5`*Q zRE3E9xOy;*frh#TNp*tTF6ilMTfM?sxQ~OJQID$YAr|JRk1-GLW_1H3avG%1GwD$e zW_vD^R1SUN7^ReVRmW;f8!n)HeRcsZ;WG_^1Lnu3tq-uJ@31q9qLu(FC7WmLO6Uc` z7ry!GInRV#6LS@-BCpg3gc7k7ZHTHhB=aG%DrQo&|0hLN-lSQgx2T35D4YwlGKeCa zB4|Bj9=a-&srEBF(?*$gFA!R&L1y`3+Fig_i*=m1d$m~e6xOf0rkvztxJjTr_0XIe z085hZnnyNlKu^%($)3$M<=i*CtU9ke>0(CxT-?k=(np>A}!3 zmg)^{W2-*&E1_k(4EU~g>8aOAog=kLJA07S#b-U!$OjP(OcN%k0ID}BP0P_XKHkO? zz||()G`~Uy|