From 9492985c3955a43423727d58d66aac457f84f5a2 Mon Sep 17 00:00:00 2001 From: Gregory Hill Date: Wed, 2 Aug 2023 10:44:43 +0100 Subject: [PATCH] fix: get_transaction does not work for non-wallet txs Signed-off-by: Gregory Hill --- .gitignore | 3 +- bitcoin/src/iter.rs | 2 + bitcoin/src/lib.rs | 64 +++++++++++++------ bitcoin/src/light/mod.rs | 13 ++-- docker-compose.yml | 2 +- runtime/metadata-parachain-interlay.scale | Bin 277198 -> 285465 bytes runtime/metadata-parachain-kintsugi.scale | Bin 296702 -> 304969 bytes runtime/src/integration/bitcoin_simulator.rs | 7 +- vault/src/execution.rs | 63 +++++++++--------- vault/src/issue.rs | 2 +- vault/src/metrics.rs | 2 +- vault/src/replace.rs | 2 + 12 files changed, 97 insertions(+), 63 deletions(-) diff --git a/.gitignore b/.gitignore index 2ac0e9347..960e47fc9 100644 --- a/.gitignore +++ b/.gitignore @@ -12,4 +12,5 @@ args.txt vault-*-metadata kv *.wif -.idea/* \ No newline at end of file +.idea/* +*.db \ No newline at end of file diff --git a/bitcoin/src/iter.rs b/bitcoin/src/iter.rs index 7f50ca51a..81dba865e 100644 --- a/bitcoin/src/iter.rs +++ b/bitcoin/src/iter.rs @@ -233,6 +233,8 @@ mod tests { &self, txid: Txid, num_confirmations: u32, + block_hash: Option, + is_wallet: bool, ) -> Result; async fn create_and_send_transaction( &self, diff --git a/bitcoin/src/lib.rs b/bitcoin/src/lib.rs index cfc29f405..fe5148c30 100644 --- a/bitcoin/src/lib.rs +++ b/bitcoin/src/lib.rs @@ -36,8 +36,8 @@ pub use bitcoincore_rpc::{ Transaction, TxIn, TxOut, Txid, VarInt, WScriptHash, }, bitcoincore_rpc_json::{ - CreateRawTransactionInput, FundRawTransactionOptions, GetBlockchainInfoResult, GetTransactionResult, - GetTransactionResultDetailCategory, WalletTxInfo, + CreateRawTransactionInput, FundRawTransactionOptions, GetBlockchainInfoResult, GetRawTransactionResult, + GetTransactionResult, GetTransactionResultDetailCategory, WalletTxInfo, }, json::{self, AddressType, GetBlockResult}, jsonrpc::{self, error::RpcError, Error as JsonRpcError}, @@ -128,7 +128,6 @@ pub struct SatPerVbyte(pub u64); pub struct TransactionMetadata { pub txid: Txid, pub proof: RawTransactionProof, - pub block_height: u32, pub block_hash: BlockHash, pub fee: Option, } @@ -185,6 +184,8 @@ pub trait BitcoinCoreApi { &self, txid: Txid, num_confirmations: u32, + block_hash: Option, + is_wallet: bool, ) -> Result; async fn bump_fee(&self, txid: &Txid, address: Address, fee_rate: SatPerVbyte) -> Result; @@ -867,27 +868,47 @@ impl BitcoinCoreApi for BitcoinCore { /// # Arguments /// * `txid` - transaction ID /// * `num_confirmations` - how many confirmations we need to wait for + /// * `block_hash` - optional block hash async fn wait_for_transaction_metadata( &self, txid: Txid, num_confirmations: u32, + block_hash: Option, + is_wallet: bool, ) -> Result { - let (block_height, block_hash, fee) = retry(get_exponential_backoff(), || async { - Ok(match self.rpc.get_transaction(&txid, None) { - Ok(GetTransactionResult { - info: - WalletTxInfo { - confirmations, - blockhash: Some(hash), - blockheight: Some(height), - .. - }, - fee, - .. - }) if confirmations >= 0 && confirmations as u32 >= num_confirmations => Ok((height, hash, fee)), - Ok(_) => Err(Error::ConfirmationError), - Err(e) => Err(e.into()), - }?) + let (block_hash, fee) = retry(get_exponential_backoff(), || async { + if is_wallet { + Ok(match self.rpc.get_transaction(&txid, None) { + Ok(GetTransactionResult { + info: + WalletTxInfo { + confirmations, + blockhash: Some(hash), + .. + }, + fee, + .. + }) if confirmations >= 0 && confirmations as u32 >= num_confirmations => Ok((hash, fee)), + Ok(_) => Err(Error::ConfirmationError), + Err(e) => { + log::error!("{}", e); + Err(e.into()) + } + }?) + } else { + Ok(match self.rpc.get_raw_transaction_info(&txid, block_hash.as_ref()) { + Ok(GetRawTransactionResult { + confirmations: Some(num), + blockhash: Some(hash), + .. + }) if num >= num_confirmations => Ok((hash, None)), + Ok(_) => Err(Error::ConfirmationError), + Err(e) => { + log::error!("{}", e); + Err(e.into()) + } + }?) + } }) .await?; @@ -915,7 +936,6 @@ impl BitcoinCoreApi for BitcoinCore { Ok(TransactionMetadata { txid, proof, - block_height, block_hash, fee, }) @@ -1005,7 +1025,9 @@ impl BitcoinCoreApi for BitcoinCore { .create_and_send_transaction(address, sat, fee_rate, request_id) .await?; - Ok(self.wait_for_transaction_metadata(txid, num_confirmations).await?) + Ok(self + .wait_for_transaction_metadata(txid, num_confirmations, None, true) + .await?) } /// Create or load a wallet on Bitcoin Core. diff --git a/bitcoin/src/light/mod.rs b/bitcoin/src/light/mod.rs index b432a7467..e4a906649 100644 --- a/bitcoin/src/light/mod.rs +++ b/bitcoin/src/light/mod.rs @@ -225,15 +225,17 @@ impl BitcoinCoreApi for BitcoinLight { &self, txid: Txid, num_confirmations: u32, + _block_hash: Option, + _is_wallet: bool, ) -> Result { - let (block_height, block_hash, fee) = retry(get_exponential_backoff(), || async { + let (block_hash, fee) = retry(get_exponential_backoff(), || async { Ok(match self.electrs.get_tx_info(&txid).await { Ok(electrs::TxInfo { confirmations, - height, hash, fee, - }) if confirmations >= num_confirmations => Ok((height, hash, fee)), + .. + }) if confirmations >= num_confirmations => Ok((hash, fee)), Ok(_) => Err(BitcoinError::ConfirmationError), Err(_e) => Err(BitcoinError::ConnectionRefused), }?) @@ -262,7 +264,6 @@ impl BitcoinCoreApi for BitcoinLight { Ok(TransactionMetadata { txid, proof, - block_height, block_hash, fee: Some(fee), }) @@ -319,7 +320,9 @@ impl BitcoinCoreApi for BitcoinLight { .create_and_send_transaction(address, sat, fee_rate, request_id) .await?; - Ok(self.wait_for_transaction_metadata(txid, num_confirmations).await?) + Ok(self + .wait_for_transaction_metadata(txid, num_confirmations, None, true) + .await?) } async fn create_or_load_wallet(&self) -> Result<(), BitcoinError> { diff --git a/docker-compose.yml b/docker-compose.yml index d99f652ca..64589e9ac 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,7 +1,7 @@ version: "3.8" services: interbtc: - image: "interlayhq/interbtc:1.25.0-rc4" + image: "interlayhq/interbtc:1.25.0-rc5" command: - --rpc-external - --ws-external diff --git a/runtime/metadata-parachain-interlay.scale b/runtime/metadata-parachain-interlay.scale index 2ed1ce0d5ddb0c039d0bcc3cd31c2d6a2e22026b..de6e3559698196612fe4975dc8a54cf90080657a 100644 GIT binary patch delta 17676 zcmcJ14SbZvwfCHvXFo|`V-iRp!3`vk;1Ux^Fu{NcNsuVtUqTVXk~~RPve~d7LaG?( zTWYbT3XwaPtEl)ETeQ@orH|NR#g&7%0;_r3SM z{#Kqj^Ks_PnVB;)|1*=9&wIB2Aj1*VqyE9O+WoL(WmRW#!hou((Ui;)T7NS5!c+N>ysxp-llg&S%`TXqaAu!j|DZ>Kafw4M<()h zv$V#=vow}1s3XowzbzO~t(hO|iUxxERJNM2g=uANVSiBXbN=1))Q{6wzR{aj^Qp>n zEIP{)fzoPc>uch|&eg-$`y(2qLB=zjJc}k&PGXGJ#FOXTria@)Lu(kZ3KVMW^hctB zmO!*eqhdWt?BkRNM!`U5C*!Pd+D)r^&v0i=cQ_CXL<6_!&C#B2Jrd`wv9p}K%VLu% zuJu+dXP_7p8tU{xA4$;@`uLRSnzwPS-V%%Ity$!03x|T+h&(gOCzUaBMneNcZ*4T} z?~3?aqJdCXbB90DQHFe~ZRFF}2BOVj-5&{co##~C2y(tjF|=td$~Cw8qy7rYTdcR# z#Hyw;roB+t<0FQ#ie57+WeoY6x^DA#23l{31-rqrEKbh%ceU$~v!Owc1lqg& z=-zk=)0nRwGihNc)S&C#%*JZ!(RES1KGfM6h@f+soy|-{b)jooqBGT~V-DtP>a}XC z54B=alAxS9-7N^SA!lbN12m(O%fA6ZiI1*J$0J7F=PRKX zT7dl7BCUA9hFvnF(N0ELX){CZFhQN6_FO@Vz?8cqVJ0zwU^pXQHQT){A*+ugrFm9Y zv}%;+Z*2`@0uIc6?fZ3R&R#VfyqNvomAc;LZ81Bq)$5OX+hLWuyzzpi6>(nE{Q?lZBc)zU zRg-;K_lD!c$jT7P>VjQsN0YHcBgknx2}^`6yrX_x7d9GI6tOC%qbNm*58 ziKk)^T81`jS`VsbEFWWqmoY4^1@A0$6)EaIRwDW~zO$6OMBf|lyj=8+>93>er#kxIpxkm*qEayYnC7ggVAU$3f=%i3zjrg$^*#IE7+xp(b`Htu z`}n==sz$-mD5onF4*EMA1*wtf3w7&ZOyN*hGO93$S>ca{!aY_V)(CDx`~2_MP*dN7 z@8{#+AHAQK-6W`LPPZyqbCVuu?}%dAXzDxrei6+w^Ou~@qIrE&&kyJGk`naYb$%i( z>igmO8d}=-;rVe_x&&3km-YqGaG_@I(85=V5^-|Ncu(!KZ$8;pd!I_ucp%BXtgru*(ek0u zbj4GzU(DtddkQr1nCSD5%ggh{1yKfo(T{Q#^h7Y=H8x(*9=SJ@ZkCS`UCDz&o*F{8 z$P!NZ+G;_&th7ftjo>{oLd}Js0B4TY>AZZqzY}L zM*SAK+ezcKP050jTr^tSoXou6MJ3u6jSg9vr@3h~ZL`=Oazo`tWy2syyemom zbPyG3yOVsH(!h34vX&!hG=lc3_B6}u(`kfuHktH%IwbE`RrF}*HQH%aynis|^9!0R z8wx#68bU?+AkEccu2ZjqZZsSsNHZYF)1_RFh>LfWlaG)g;QOSC#G z8-0H;&Z;k)@}TAKWz(HthwNYC$4yQvWacpR!AV=959BZ!o;I*g?zb3>j&C-7-sHaa zl5O(&M738Y)`XOtiH&l;J+8AWuy0OD#}2tiJ~fQWX`Q^TfJPh699kxRAt*Fh)8ZIqD;BEh^EqJ`Mn}4qAl{ZBJ!4}oCCHAx;e2xCeHzL!h!Zc7wcx8 z#i0Oph}-4IMbu=oF}BgPAhLA~B-tdtHHOyn%|g!0&~KxUL-L z1M_{wM7k>82~SL(dkQ-j-!{qNnagz=R(uHY#60NRa*Z8U!_y=t zXzVBmVG5%LcKOnStd0B_2y&rWm^>Lbs=r2MWNnwP{S+=^=5#|u_)A=4Jy~7P;D-#;TDDV z=U)$UghfIF1)%aQ3c?hD%C{&8QvzzFNlk<><3U|%Q4pqFll^UUQ?Kd?{FEA1KL|*S zpxFyJMIm@h#i|@mruso(N+YOxLDI300gG%edWd@bXh1(1&eTzY6P$^ranL(v# zk=|>Dm7WC-9bkMx1&5eHrDu_029=V<6=qOrSY(<(rBIP=29-9&P&24hDTbLrrALut z29**;t{Kc%!Qp1G;5ro^VTP6NM4lN`iWB)}P-#t!G=tC@6IYr+^a|q#1gn-CJ7{dy z6h+o)3_t8;Fw|M2X3fxFcTjq6lZI*Gql%_hoDBd+Ob_Utt=Msyd2(cSfLi#hc!4be zT8B-iUjovPeQ zldwW{ZlzUV_M5GcF(yA&pB`D*htE2BgZgZc-T3g0nk;{pkCOZQD29wz-$yHGlX35T zbQi~B^tPm5Vwo^M+l*)bl@{7)yUcu$s%VEX^FbO%_^x>fYZ&d2JrC1${0x`RJWQit zu1`Kp_0FAWp=}V`C717{AJc9l{}Fm9jrJG^zDuJ8Eb*zmWarp1-0~9T{NVePrnYtI z23-UDy4s)-a)m)2E1ZYVHw>z#1M&rfDy}#M4b9TSt2*_$;ZUdzR!88BTbP8if6^CQWW7PWu`8dU20A5MpP|yc9ca$9PDnOG_X8ebRM^((Z*N{1h(=D! z?><9iqs}0Q5=kA5W&+n^r&ZlMh@Da2b;Qp8;D?l>c9}|N~;7Ck!jGQB5Q~p|Y~Pdh+DCv6Y>H7RE|! z@^&XL;p1(6zqz|uoejr`avRCI!92$p;)1YLE^`O-`BW)82lG;zBJUr}ebgvl7|bhZ zmb|DUE2VD;Z=z~>+Yo*;ueQmi263f)ZwSvt{&Wwom|SP0hG`4Ky1qb zwkTevJcBRGQYn17jo}AN=;FxaHy+O5Pq<-w=H~H*6fkz>@t-|2_qc>n8K_gdODS8N5W^Qp2ZM;YJ>`^}YMV zaCxzYJFKW|`R)vUZ6aLT#IK~FT+zhGCZcvU@jOI5)5PZ{qP#co*|g0F-N4I9zH}XL zfN}EF^6H7}Y#MMcbyQXg+h8N72N;=-_InnDg1W{wpru$e)kkxBHrm)mAIk%n<#izZV*W-}(cs;L%9aBw*-5T5gS@+1&20jAR4GnxG ztXH6ck8xE3z&q%avF!!k zO|DZa>9mcVmV;m9U!XHG@FFk5=bjgNJDrt(f05saPyI{0(bI2BdLdRS?~R-XlR4Wt z7f^B1ozo1Qs2P|T)}u=uCsiuffM?|M+$8ecVm>EyexRnr;Vh1hdKBzpf}>i}-+(0| z#r1H(M!u9Y8>Y&a6QtMQl{{P~OJll8|JV4e-V3$?&@Po>MWQ%zF2)j@mNOHFo|YbX zAYl5ea7q?T*SyB2xf80@MmXJ0GvY*Q7BaJxS5{)@oNHw%?*)~bM>!TgN21GBnnzh( z3Q$k_s;Cg%(2RrCXW}}QA7CI~4hABc){9lJAw_^XGZsfYI3{8#Y_rTAMg_&eNh-8F z6S1&vv(wxZ1`AA&1>#|}?3Y(!I7hdlkTrxEs_W`*XLC7Ic&@=cN!dbINp6u$;*ub?9;t19sWR9bD-5n zy(WYIZZG~9JJIKF=~ceEX84Yx8FnhJYfA2d3Bc00<}h99{ufl^D4dPQ}{UM%;m?E z(z2RWDZR~DS*n&VujCa$|Jq(PS3;_Z$}OF+V*}Hq26--@VotQnPpbci?&yt02PPHz zK9>^^Ve zgfg`R<+bJ16p6%ibG3m+RFl0)|4FHLVMie1#V-Og-02T1H<{lX)G_`s+O6Et0n8B! zO|Ds`IhLo+`&k8g0$l-&pZ|uodLsj4{r^H;39bA$wZ)zD;@av}i?dRf>5TkO6_#*# zTKTblr7q}DT44geEzPqyPPojlOVwJhy3s(Mh`%$MSO@;6hukGPT&Dk*hn&#vxOBvs zDx5H&Lvw>OrNEwgzCdq(`h0N)dk!qIMaqPi*cpB}XKbTDlhLl_skXCZWIAt9&= zH1O5-zTf2!mmht^UB*9NdIoK1GN$*c)SLsfdpmU!vyDWwsYa{Ao%+173YGqiS_5-m8g zQKPC$Kt}kfx2tNm*x3%dd|*0y=il67kWugqDimCMZ5Ih z19|7a&HqN69Kb|J8m(vfOT=vs1yVl9T@HEdUA~m3JEZR%Uoj{H0636e56gBK@*GbS zJQq1X;P>R`n<+=uvjQ`)9#h$h0bL^Z{*%}H#yfzxCD0n>HW}}@6sI|Y&FoPH$Co>d z=icWb;*}Qnk<}KjBW#Kl@Dr=ELWpQI*=K%+eN&uE<190)2ZiQYg%GjGid*Vn_@PZm zWXr8ozk}h&v@}(M>5jBKT=Q5Z-~EVZ8y7$1S5S7q%((st3tA;WuZ~xS>2u#ld;#Xl zTOaX#S?jC}08Xp`=#8Hv?xqBX&2r7hybjm{@ZLgs@?%~KASLY+zQnuDkyf}e+JcL6 zo&KKWogMQ^nz||Rit*)7c%OUz&GCy`^`StQIxWu)MR4U0*Rm#Rze&V-qiemvSR|^h z$*7w#ZGkX|Pc8l`VWq-IW!(`R*tg5Cy2Upj*sww3-vQbDW03ehfUPIeL^a`(!I^Y1 zi|=;y-O`+E%o{A8cMRHNHhLelxL1xGDi*uEtnXl_(7Fv3EcmObA`e@_;4|k1ByWGP(#lXD+!+N z7xF~`9XI}xFKz+`VWlncie)t7q=V+p*SkCYE&8VzpER?{KNX1Sm~K~%5~Jv}F?*DF zn>)@p(iE6rO6xcqC)S_lMe^MHe7JnDNW9AX9ewxqWXqaK!ewk7BmPd9dUqF#t(bZk z_e13yZ}1TlFFLFVNY0cAsMM3@u>l4lC+6@)2eaV|K+&1QTu!;6MAY+ir~Fxos8$OU zjT1w8hEwK_69M)8@;Gs=ia$6`m!Rky851qrDQ8?ImhoJt z+;x?h#Pgl<|1uW3^8_BKUZ-RCbwF2-k;_ z7Ny)NzfdNg;FV6G&v`Njw-b$t<>E2UtK+Si;_Um)#ynYDA^yPY;&F{8zoAWWDQ2Ze z(d0CNY5DU?G21;$3DV?b^PC3I>YMqpTbdRJdB3J%?GRDg~ zN!N-euzT2ht+>YejLBvj6yuFfhM($HzR8Kj&@42iMtm)Evomo3sF{J=u;{4G^7R^l z+Xx0Sg^6!-%Hf0gSoy$IQHa@haH_}}v&{)BxdRN%fA~%(!_VZ7lwGRA-A=Y!el%4C z#2%-!@5J3+dDnGfHegGLILi3&Ix$ZS+NUz^ce4FXr~KY@K;d2WVj`yDBlT#^L3yZN zTrCbH(lQ!EVdgkK#iwn$aF2M)2mspIGQ&HkUai zTrO*vq{H{8PFQNWa;Z#CU=S=FAr3ObW!><&`v%bl!w+9!MS8Z$%ENM9_{j-3igKPG z&$jkP@g-hhRZtYKpd_V&BC~=V$Wx*!069KhvS$HyGvS%yFLqw;0-l^NZ(kt3$SYm4 zW+6H+W1%SF)h4kqbBZck=VJJ&j;dgdE?IXIFEGw86n5fGF5}`N5w;DRWu})<36{lp zu!1de^*!_Rk;XTd2?z0|F1hDs*wN)KXSN?lSILF0OXC17^7|J6TXZ z*NSnwT0Ws;MtssLCPN*Qbx{UYuhK<5D5PuzWoDS&Ca%YndA3aqlY82P#|n>&NBv8? zn4G=NWSx`4Hkbjm0obTCmn~1Wi}LJEE~+y35^&no+=x>!`e&1TtQ`*kHvcEtwiu&3 zM8poSgzOSAOsn*eSPF>0J%m+ayL>&27W^)RF}Fir+l|jo`HOCGl{*19L`?cT*1JQi z#r1rL*`0D~SY+~@R``FZ@Gcde2Dae$TZ>hx9cR9_kXhk8_y=mD;%+D3>jE%7T;BdN zcgeT!5T|?hp}~B=i{XbcdBJwTbEz`&$7nx85E()Vmv5IQO z)*%!;>;hb?0$9LZsfHDJ%cl+NHq6yt{C`NPAXl)%E~mQ7YVt`i!4}a)waa2v*LtVT zoHJ)u^Ma-?G~&s^QIrvCvg0m?YXG9l3+pX9+`@%`Ue$N;#8edhxQiNq+fAyhiYGVt zdvUiY6-Gyv1b~{%qplyN!07QT3jIsXf}QN~%SiI+3RQi$8;Ct7b~(*0y|@f--8(05 zETXq6kH!Exa#_XFXM2F1NU1r?+`}mawyaX_y$d#V$+pAvd!K~;NqE4^)KKY-KhTJr z9pSa^ehwU@Ts!mv)cC~bzq@K3pxrBx;TPVpx? zxFp_TrQ-4z<(Wgj3M2lsnkDGVGwOTN#m=fPY(>BN9&oYquB6W_&QY#jAToQMwej;o zikC!Nm?RWF7_c5`l$Om6>zL7a>Jo`Y05ARq^mxo|m8To``_a2Tb$kfxZFo(SJU*!8 zu29sAZD?o>?!{~S$nA2u>T%u(1!e7ryk*`6mow%4L793EG7FEn)a7%9%X=b$FX{4j0I%}fs8?5dYt3ALPY^9nmf_mH@iM(Bg}SX= zDFv$%(6#kE057a&CSuGgtS1Ro*ZU)LmFo=eYg8*RV-W*&BT6YY8VY$KM`_}rj`fzs zrqv<Z)C#mRIRq;jfB$u|S{h0@~r^?1^uj7Uolt^rmlNEMee;xQcy2ax4i7zy>bS1=v#M;hnUF}GF-GdzCc zq_S&#=2$zZ&{_cs@#FDNT8)A?(Xq<(RrOdZ<41EZ$iM)t+sq_ zdEK3&n5VmC;7(D%v)%IRcZw^A=ens@Z)uJACr?fmQ_r!G?-0^QWVqF9IxJC>)N8s7 zTo4qsSXG=13_d{y&!ri1-LkY-=-#xO=_$o`+Y*lNW6f zK0YN*Jg`N0d7WEftFw5cTmEvLm|5_DP&teiYjT?xgi5xGG&*NY+A3btc#$v$OYsHH zON4Rjb`c;v(3HpjO^nUNYlVe5W#(#RJd^AhZs$`Rx|V=Kodb@*F)ki z%EF_EwT#BwdETOEpc8&IhOKAqPH`g;WVv~#SPAsl=-(;M30`eC{vw(M6?X}22S+?9^0Bk5ep37t2eXf# z6m>MusC`O2s^RqYX9F9G9p8POq*+K16jK#4ST{k- zmdg)foB8AJ=y75_pJzs9%Go~^o8yEjew8dZf?a>I%n?kUMXB{IH|v|PBF%=~byP^MI}Gp3 zpHW00wOnvO&Y`#;XDZ^(S40zr+Y7IVlF`+Um?H}l0{_uAjaE}y&2&Fr{dTnv=p^fy zI6*zeJI6%vr&O{owWA5IhC{!@HqJdX_X3vdy}-FE8B)=7mTJj<;`5X zT>)_?xK_a%oyHKMJw+}&PwGcHfVP)3Z7A_YPWeZh_6VSyuh_M7xDP7VI!4wmIXY>TIU=^FiC48uK&}{Movs zEG^ggO_p{{VbG5a)$YKJ(Xqp{jZ|&y8K(890WfyB_LdXxsxCsxy>i$HJi^>3*NxEX zfgT?mp{>M4w!%Ek!Er^{HxeaJ$tOo@YtWavxi zwI%rcaJ05kyXeFluYyADA#QWY=L@y>IKUyJNW0#d?aFuIX8bw19B;ei#4%bSFd(^f zjP_NpZliQC9`9OKTptU@I%AO~EkQ>6ZL|Z?3gB5hRx9OGT=FX_ zz7FurSgm8^0UPZ^_D0w8yd?`mtMsl2B?1hq$;4vq2S9z~+r`=xKFcM?m1vK`%_M(W zqJ4ueav3YfX%C1T*K);?Tdh7c23YTjr)CCqfG%oF!tkQ+5~N4oM^Uk+-H4m zG&W4s?jwZ|4Xe}&J%??y2QSkH#{P|!(1`AmwUe~bwrWSxMtpUW_Vv7g3qTyJni*If z3$&Wn9L@-WU8r^hW!W`awy1WjmNTx=X4p2k)>&c}$RAvz4Kov7xkd{huu;}jX*oI7 zj?GXvqhomBc8Lg`RXB!hk)x`$nJ`tMYTWWYE`L_7O~>p{pRDCi-{WelXwcU#SmW=W zAHttA2s1iqqf=1rURQfw{5>2c0?vwf4F1RhHp{pb&eyY3=WWXN<@XjhCjSrvv3=Y# z<1Kq(Hkp&K#SfEoSSe}@%H~s3d61`q(8y45U+UyF$*>$A9(*2GK1aSM1^&Z;tZT)s@QqKUtbdB7w+wcbS!C7T*5juQ5b>%H3tf eW+C%@SM6T!GbwAwjLrHJleOWtI`{e}_kRFzVIX7x delta 10652 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 A$^ZZW diff --git a/runtime/metadata-parachain-kintsugi.scale b/runtime/metadata-parachain-kintsugi.scale index 7ffb1859d12b7f450b47b103a7c6580d4f381202..e090ecd63ac0cc592c281a1799fc23e48269d7ff 100644 GIT binary patch delta 18408 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 r!&+0Sftd+bx7M^`+G diff --git a/runtime/src/integration/bitcoin_simulator.rs b/runtime/src/integration/bitcoin_simulator.rs index d36dcad39..96838c98f 100644 --- a/runtime/src/integration/bitcoin_simulator.rs +++ b/runtime/src/integration/bitcoin_simulator.rs @@ -284,7 +284,7 @@ impl MockBitcoinCore { .await?; let txid = self.send_transaction(&tx).await?; let metadata = self - .wait_for_transaction_metadata(txid, num_confirmations) + .wait_for_transaction_metadata(txid, num_confirmations, None, true) .await .unwrap(); Ok(metadata) @@ -454,6 +454,8 @@ impl BitcoinCoreApi for MockBitcoinCore { &self, txid: Txid, _num_confirmations: u32, + _block_hash: Option, + _is_wallet: bool, ) -> Result { let (block_height, block) = loop { // we have to be careful not to deadlock, so limit the scope of the lock @@ -480,7 +482,6 @@ impl BitcoinCoreApi for MockBitcoinCore { raw_coinbase_tx, }, txid, - block_height: block_height as u32, fee: None, }) } @@ -508,7 +509,7 @@ impl BitcoinCoreApi for MockBitcoinCore { .await .unwrap(); let metadata = self - .wait_for_transaction_metadata(txid, num_confirmations) + .wait_for_transaction_metadata(txid, num_confirmations, None, true) .await .unwrap(); Ok(metadata) diff --git a/vault/src/execution.rs b/vault/src/execution.rs index 2619714f4..f28abad1f 100644 --- a/vault/src/execution.rs +++ b/vault/src/execution.rs @@ -301,7 +301,8 @@ impl Request { } }); - let wait_for_transaction_metadata = btc_rpc.wait_for_transaction_metadata(txid, num_confirmations); + let wait_for_transaction_metadata = + btc_rpc.wait_for_transaction_metadata(txid, num_confirmations, None, true); futures::pin_mut!(subscription); let mut metadata_fut = wait_for_transaction_metadata; @@ -811,7 +812,7 @@ mod tests { async fn get_block(&self, hash: &BlockHash) -> Result; async fn get_block_header(&self, hash: &BlockHash) -> Result; async fn get_mempool_transactions<'a>(&'a self) -> Result> + Send + 'a>, BitcoinError>; - async fn wait_for_transaction_metadata(&self, txid: Txid, num_confirmations: u32) -> Result; + async fn wait_for_transaction_metadata(&self, txid: Txid, num_confirmations: u32, block_hash: Option, is_wallet: bool) -> Result; async fn create_and_send_transaction(&self, address: Address, sat: u64, fee_rate: SatPerVbyte, request_id: Option) -> Result; async fn send_to_address(&self, address: Address, sat: u64, request_id: Option, fee_rate: SatPerVbyte, num_confirmations: u32) -> Result; async fn create_or_load_wallet(&self) -> Result<(), BitcoinError>; @@ -923,20 +924,21 @@ mod tests { mock_bitcoin .expect_create_and_send_transaction() .returning(|_, _, _, _| Ok(Txid::all_zeros())); - mock_bitcoin.expect_wait_for_transaction_metadata().returning(|_, _| { - Ok(TransactionMetadata { - txid: Txid::all_zeros(), - proof: RawTransactionProof { - coinbase_tx_proof: vec![], - raw_coinbase_tx: vec![], - raw_user_tx: vec![], - user_tx_proof: vec![], - }, - block_height: 0, - block_hash: BlockHash::all_zeros(), - fee: None, - }) - }); + mock_bitcoin + .expect_wait_for_transaction_metadata() + .returning(|_, _, _, _| { + Ok(TransactionMetadata { + txid: Txid::all_zeros(), + proof: RawTransactionProof { + coinbase_tx_proof: vec![], + raw_coinbase_tx: vec![], + raw_user_tx: vec![], + user_tx_proof: vec![], + }, + block_hash: BlockHash::all_zeros(), + fee: None, + }) + }); mock_bitcoin.expect_list_transactions().returning(|_| Ok(vec![])); mock_bitcoin.expect_get_balance().returning(|_| Ok(Amount::ZERO)); let btc_rpc: DynBitcoinCoreApi = Arc::new(mock_bitcoin); @@ -1058,20 +1060,21 @@ mod tests { mock_bitcoin .expect_create_and_send_transaction() .returning(|_, _, _, _| Ok(Txid::all_zeros())); - mock_bitcoin.expect_wait_for_transaction_metadata().returning(|_, _| { - Ok(TransactionMetadata { - txid: Txid::all_zeros(), - proof: RawTransactionProof { - coinbase_tx_proof: vec![], - raw_coinbase_tx: vec![], - raw_user_tx: vec![], - user_tx_proof: vec![], - }, - block_height: 0, - block_hash: BlockHash::all_zeros(), - fee: None, - }) - }); + mock_bitcoin + .expect_wait_for_transaction_metadata() + .returning(|_, _, _, _| { + Ok(TransactionMetadata { + txid: Txid::all_zeros(), + proof: RawTransactionProof { + coinbase_tx_proof: vec![], + raw_coinbase_tx: vec![], + raw_user_tx: vec![], + user_tx_proof: vec![], + }, + block_hash: BlockHash::all_zeros(), + fee: None, + }) + }); mock_bitcoin.expect_get_balance().returning(|_| Ok(Amount::ZERO)); let btc_rpc: DynBitcoinCoreApi = Arc::new(mock_bitcoin); diff --git a/vault/src/issue.rs b/vault/src/issue.rs index e8b063461..c36a1e324 100644 --- a/vault/src/issue.rs +++ b/vault/src/issue.rs @@ -297,7 +297,7 @@ async fn process_transaction_and_execute_issue( } let tx_metadata = bitcoin_core - .wait_for_transaction_metadata(transaction.txid(), num_confirmations) + .wait_for_transaction_metadata(transaction.txid(), num_confirmations, Some(block_hash), false) .await?; tracing::info!( diff --git a/vault/src/metrics.rs b/vault/src/metrics.rs index a227e103c..c528fe8e0 100644 --- a/vault/src/metrics.rs +++ b/vault/src/metrics.rs @@ -790,7 +790,7 @@ mod tests { async fn get_block(&self, hash: &BlockHash) -> Result; async fn get_block_header(&self, hash: &BlockHash) -> Result; async fn get_mempool_transactions<'a>(&'a self) -> Result> + Send + 'a>, BitcoinError>; - async fn wait_for_transaction_metadata(&self, txid: Txid, num_confirmations: u32) -> Result; + async fn wait_for_transaction_metadata(&self, txid: Txid, num_confirmations: u32, block_hash: Option, is_wallet: bool) -> Result; async fn create_and_send_transaction(&self, address: Address, sat: u64, fee_rate: SatPerVbyte, request_id: Option) -> Result; async fn send_to_address(&self, address: Address, sat: u64, request_id: Option, fee_rate: SatPerVbyte, num_confirmations: u32) -> Result; async fn create_or_load_wallet(&self) -> Result<(), BitcoinError>; diff --git a/vault/src/replace.rs b/vault/src/replace.rs index b5ee4d0ae..5534df1d5 100644 --- a/vault/src/replace.rs +++ b/vault/src/replace.rs @@ -264,6 +264,8 @@ mod tests { &self, txid: Txid, num_confirmations: u32, + block_hash: Option, + is_wallet: bool, ) -> Result; async fn create_and_send_transaction( &self,