@laceio/sdk 0.1.1 → 0.1.2-canary.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{TransactionBuilder-DrB3NVTi.cjs → TransactionBuilder-X1H9Gze6.cjs} +64 -14
- package/dist/{TransactionBuilder-V6aLx4SV.js → TransactionBuilder-bp2aMDhg.js} +23 -15
- package/dist/{_polyfill-buffer-patch-BnPVerlG.cjs → _polyfill-buffer-patch-CM8X7JiY.cjs} +21 -2
- package/dist/_polyfill-buffer-patch-yNxN4d5E.js +1467 -0
- package/dist/_web-crypto-random-bytes-Bo-GTcRS.js +197 -0
- package/dist/acc-module-4iIUv6My.cjs +27654 -0
- package/dist/acc-module-Cmj8EsIb.js +27624 -0
- package/dist/account-BOQruszJ.js +6 -0
- package/dist/account-BUOj4pYJ.cjs +11 -0
- package/dist/account-call-7wnopBq0.cjs +5 -0
- package/dist/account-call-B9d_2Xwi.js +4 -0
- package/dist/account-call-Bd4Rpbvt.cjs +323 -0
- package/dist/account-call-C3CkDqEC.js +276 -0
- package/dist/account-guards-BtjTGxDZ.cjs +42 -0
- package/dist/account-guards-D9Lu5T3W.js +36 -0
- package/dist/account-tokens-DvkOFVON.js +16 -0
- package/dist/account-tokens-nwcvwLu4.cjs +21 -0
- package/dist/{activity-type.stable-BJEfeLxL.cjs → activity-type-Ch6ljxBy.cjs} +2 -1
- package/dist/{activity-type.stable-C76_hWd7.js → activity-type-GsJGWs-3.js} +2 -1
- package/dist/address-B9ntKL8K.js +13761 -0
- package/dist/address-BXp-mY8H.cjs +11270 -0
- package/dist/{address-book-address-validator-DIUolI-s.js → address-book-address-validator-0J9XAADH.js} +2 -2
- package/dist/address-book-address-validator-DK0dnsRS.cjs +41 -0
- package/dist/address-book-address-validator-Di_ywo8M.js +39 -0
- package/dist/{address-book-address-validator-DNwQGlOB.cjs → address-book-address-validator-Dte_YQ2L.cjs} +2 -2
- package/dist/artefact-loader-BWWYAD7E.cjs +183 -0
- package/dist/artefact-loader-Dik4HIfv.js +160 -0
- package/dist/auto-dismiss-failure-on-success-C-qoJuid.cjs +37 -0
- package/dist/auto-dismiss-failure-on-success-s8MGDEIu.js +31 -0
- package/dist/bip32-D6wd_QMn.cjs +3851 -0
- package/dist/bitcoin-data-provider-BYPSmuZS.js +21 -0
- package/dist/bitcoin-data-provider-w1oEDSU3.cjs +26 -0
- package/dist/bitcoin.cjs +45 -0
- package/dist/bitcoin.d.ts +29906 -1
- package/dist/bitcoin.js +20 -0
- package/dist/{blockfrost-tx-submit-provider-DPTrapz-.js → blockfrost-tx-submit-provider-CBWQ0wK9.js} +5 -157
- package/dist/{blockfrost-tx-submit-provider-BAIzV5o3.cjs → blockfrost-tx-submit-provider-CLNQ5ycR.cjs} +3 -167
- package/dist/bn-d3nSOIf7.cjs +2553 -0
- package/dist/browser-B1eMbDwh.js +7468 -0
- package/dist/bytes.vo-BB7_4JK6.js +23 -0
- package/dist/bytes.vo-BNRquqaO.cjs +34 -0
- package/dist/cardano-DfPwhwm-.js +3 -0
- package/dist/{cardano-network-id.vo-DSxrFk9S.cjs → cardano-network-id.vo-BEDPn6Li.cjs} +1 -1
- package/dist/{cardano-network-id.vo-CK1tNQDg.js → cardano-network-id.vo-Cfpvbod9.js} +1 -1
- package/dist/cardano.cjs +22 -18
- package/dist/cardano.d.ts +16962 -1716
- package/dist/cardano.js +16 -11
- package/dist/client-DXBLHk7K.cjs +808 -0
- package/dist/codecs-Cswkg7Tm.cjs +4051 -0
- package/dist/codecs-Dc1Krpbt.js +3903 -0
- package/dist/{const-C84qHkjp.js → const-BJfIK_G-.js} +4 -4
- package/dist/const-BhYOdznB.cjs +42 -0
- package/dist/const-BsnjG2_Q.cjs +32071 -0
- package/dist/const-CUnCl5U0.js +13 -0
- package/dist/{const-DXk2tFyv.js → const-CjmfjBP3.js} +1 -1
- package/dist/{const-BDEg2Trq.cjs → const-D-eZIS4n.cjs} +4 -4
- package/dist/const-D0CbQlo4.js +154 -0
- package/dist/{const-BY8B3_0_.cjs → const-iwzZEE_w.cjs} +1 -1
- package/dist/contract-1R86jhSw.js +171 -0
- package/dist/contract-MKLzYVkW.cjs +189 -0
- package/dist/create-add-accounts-Brqk84vF.js +102 -0
- package/dist/create-add-accounts-DzXIh7Ot.cjs +114 -0
- package/dist/{delegation-tx-builder-CRpLP6jH.cjs → delegation-tx-builder-Dof_0N_d.cjs} +6 -6
- package/dist/{delegation-tx-builder-CGVqlaFE.js → delegation-tx-builder-Dy3-2Auz.js} +5 -5
- package/dist/{deregistration-tx-builder-DZGwB4cz.cjs → deregistration-tx-builder-CcLwyFpj.cjs} +6 -6
- package/dist/{deregistration-tx-builder-B-CrUyX6.js → deregistration-tx-builder-QkWW_gWl.js} +5 -5
- package/dist/device-commitment-hex.vo-5wFtQvDS.js +26 -0
- package/dist/device-commitment-hex.vo-CT3RmAug.cjs +31 -0
- package/dist/device-readers-CUHYoYOH.js +145 -0
- package/dist/device-readers-CdxS2btd.cjs +168 -0
- package/dist/device-readers-D_JZeNL2.cjs +8 -0
- package/dist/device-readers-DwSNCGPP.js +4 -0
- package/dist/dist-BMi5ZjEq.cjs +43175 -0
- package/dist/dist-BtIq4XFn.cjs +535 -0
- package/dist/dist-C3SHC_Ho.cjs +1394 -0
- package/dist/dist-CykEjYEX.cjs +3814 -0
- package/dist/dist-Dcsxh3be.cjs +3452 -0
- package/dist/dist-DqJfSlTd.cjs +4413 -0
- package/dist/dist-nTZ70qj7.cjs +1306 -0
- package/dist/{earn-rewards-tx-builder-D5sUT5v8.cjs → earn-rewards-tx-builder-BP5JMIKS.cjs} +6 -6
- package/dist/{earn-rewards-tx-builder-BDbTDZmD.js → earn-rewards-tx-builder-Cku4BmNU.js} +5 -5
- package/dist/enc-key-circuits-B7BjgUL9.js +13 -0
- package/dist/enc-key-circuits-BLrZrBVI.cjs +24 -0
- package/dist/english-Byb9M0E_.cjs +2057 -0
- package/dist/envelopes-BGoO_v8m.js +1621 -0
- package/dist/envelopes-CH25R-DN.cjs +1722 -0
- package/dist/errors-BIftM8ZN.cjs +688 -0
- package/dist/errors-DSq5wUwt.js +466 -0
- package/dist/esm-HBSUQw3w.js +384 -0
- package/dist/esm-LZuaZjMf.cjs +389 -0
- package/dist/experimental.cjs +7349 -0
- package/dist/experimental.d.ts +86279 -0
- package/dist/experimental.js +7184 -0
- package/dist/gated-call-CDCVZIK-.cjs +5 -0
- package/dist/gated-call-D-tT7P_t.js +722 -0
- package/dist/gated-call-D_VT2quk.js +4 -0
- package/dist/gated-call-DgJm1Mi_.cjs +787 -0
- package/dist/grant-circuits-DswmW3nI.cjs +71 -0
- package/dist/grant-circuits-Jxb5y1HW.js +42 -0
- package/dist/grant-rules-By07_eDi.js +6824 -0
- package/dist/grant-rules-BzVTWXS7.cjs +7099 -0
- package/dist/grant-spend-B3Md9L0n.js +215 -0
- package/dist/grant-spend-oWmzRsjH.cjs +217 -0
- package/dist/grant-status-B2y49iIu.js +2688 -0
- package/dist/grant-status-DOr3t_u8.cjs +2820 -0
- package/dist/grants-2BZ-qEVQ.js +5 -0
- package/dist/grants-BPoLSiMt.cjs +18 -0
- package/dist/grants-BoI5uwSF.cjs +272 -0
- package/dist/grants-CtofFu-e.js +213 -0
- package/dist/{group-cardano-addresses-by-account-B533oVXR.cjs → group-cardano-addresses-by-account-Bp0g4wEY.cjs} +3 -39
- package/dist/{group-cardano-addresses-by-account-RHKoEskR.js → group-cardano-addresses-by-account-SR8MMrZf.js} +5 -35
- package/dist/{guarded-transaction-signer-Bxl6_XNd.cjs → guarded-transaction-signer-MFpPg98D.cjs} +17 -18
- package/dist/{guarded-transaction-signer-CpKLj8Kp.js → guarded-transaction-signer-P6Rp1faj.js} +8 -15
- package/dist/hex-D9ITYbwt.cjs +263 -0
- package/dist/hex-mkXcV3pN.js +191 -0
- package/dist/http-client-B3N-TMxu.cjs +167 -0
- package/dist/http-client-TRlhDZGh.js +155 -0
- package/dist/identity-BMLuufva.cjs +263 -0
- package/dist/identity-DII6f-h7.js +233 -0
- package/dist/in-memory-wallet-integration-B2xzxORj.cjs +20741 -0
- package/dist/in-memory-wallet-integration-CBRiPjLO.js +130 -0
- package/dist/in-memory-wallet-integration-CULUB5Tf.cjs +240 -0
- package/dist/{in-memory-wallet-integration-D-qn65Kx.js → in-memory-wallet-integration-ChIOirMW.js} +5 -2
- package/dist/{in-memory-wallet-integration-Croiuopx.js → in-memory-wallet-integration-CljprQQV.js} +7 -104
- package/dist/{in-memory-wallet-integration-DVh9sRXa.cjs → in-memory-wallet-integration-Cm6P8sk6.cjs} +3 -2
- package/dist/in-memory-wallet-integration-TM9bBphA.js +20738 -0
- package/dist/{in-memory-wallet-integration-CnLYeX4-.cjs → in-memory-wallet-integration-t9I00R_V.cjs} +17 -108
- package/dist/index.cjs +84 -47
- package/dist/index.d.ts +37505 -10036
- package/dist/index.js +52 -24
- package/dist/{init-CLHuAMB-.js → init-0zzs9aqU.js} +4 -4
- package/dist/{init-U8c9yHYx.cjs → init-5KcGcBb5.cjs} +1 -1
- package/dist/{init-CigestoM.js → init-B3-1ghyx.js} +2 -2
- package/dist/init-B8U3ABhS.cjs +107 -0
- package/dist/init-BJn-8_hf.js +141 -0
- package/dist/init-BPU3j8sT.cjs +6 -0
- package/dist/init-BRzH6xu-2.cjs +2797 -0
- package/dist/init-BmzfDaKL.js +1142 -0
- package/dist/{init-C-jErzp5.cjs → init-BopV9ed4.cjs} +2 -2
- package/dist/init-BpHTq2R5.js +105 -0
- package/dist/init-BpSITBfF.js +39 -0
- package/dist/{init-DX4WyB0R.cjs → init-BrdVzxei.cjs} +3 -3
- package/dist/{init-LfyMo-sS.cjs → init-BwkU0ruo.cjs} +2 -2
- package/dist/{init-CB__aLD7.cjs → init-C-G32J12.cjs} +2 -2
- package/dist/init-C00gw1zi.js +422 -0
- package/dist/{init-TkPq_Ny_.js → init-C2RgrfZe.js} +1 -1
- package/dist/init-C5mYyFTv.js +3584 -0
- package/dist/{init-DcYY6zMD.js → init-C8URA2OX.js} +1 -1
- package/dist/init-CDkRynJa.js +2796 -0
- package/dist/{init-Cg9XdAru.js → init-CNM5m7M2.js} +4 -4
- package/dist/init-CR7BfztQ.cjs +18 -0
- package/dist/{init-CSHwHnfg.cjs → init-CSDpdu0Q.cjs} +2 -2
- package/dist/{init-aJHl-7AO.js → init-CX0AMQUn.js} +2 -2
- package/dist/{init-FMGDET-9.js → init-CfTbSEKy.js} +259 -60
- package/dist/{init-CR6tpw1B.js → init-Cigr_tKx.js} +47 -43
- package/dist/init-Clu8pxwQ.cjs +1181 -0
- package/dist/{init-CFYsq82V.js → init-CyAY4Lzl.js} +1 -1
- package/dist/{init-BKhH6mVR.cjs → init-D6BxBs7e.cjs} +1 -1
- package/dist/init-D8OeObDF.cjs +1141 -0
- package/dist/init-D9g1HXYf.cjs +40 -0
- package/dist/{init-CNLGJJRx.js → init-DA7zmptx.js} +1 -1
- package/dist/{init-DkIc5nqF.cjs → init-DFMiP2ZH.cjs} +1 -1
- package/dist/{init-zSzCjoor.js → init-DFjT8YvT.js} +4 -4
- package/dist/init-DGjXwWs2.cjs +143 -0
- package/dist/init-DHrCbpkW.cjs +121 -0
- package/dist/init-DRzJR02G.cjs +3585 -0
- package/dist/{init-B64zCLxG.cjs → init-DUF4ar8P.cjs} +4 -4
- package/dist/init-DlqJuHhl.js +119 -0
- package/dist/{init-y2Ra0vZP.js → init-Dnsv155v.js} +3 -3
- package/dist/init-DuYENxci.js +17 -0
- package/dist/{init-D6DBUsD3.cjs → init-Dv3zKj0r.cjs} +4 -4
- package/dist/{init-BtzMZ7Pk.cjs → init-Dy-05ktr.cjs} +1 -1
- package/dist/{init-BsCBAGWf.cjs → init-EP0CUWNK.cjs} +2 -2
- package/dist/{init-BJVU54pI.cjs → init-EhzD7a8i.cjs} +1 -1
- package/dist/{init-w9GEs73W.js → init-Fw89ZmrR.js} +2 -2
- package/dist/init-GsT2AEa4.cjs +424 -0
- package/dist/{init-Rxohwpmu.js → init-NCjgwCZy.js} +2 -2
- package/dist/{init-DxUHsN53.cjs → init-NdhG_VrF.cjs} +6 -6
- package/dist/{init-DDdhguVC.js → init-SZ01tARX2.js} +2 -2
- package/dist/{init-BAJJzBza.js → init-Y3mkB4XS.js} +2 -2
- package/dist/init-c4l6r-o-.js +5 -0
- package/dist/{init-Dku4b2lG.js → init-kEfUTuG2.js} +1 -1
- package/dist/{init-C7IeJwQR.cjs → init-lzHt4Cli.cjs} +256 -59
- package/dist/init-qSEd_Spq.js +1182 -0
- package/dist/{init-anYu6XB7.cjs → init-rmt7-fQE.cjs} +2 -2
- package/dist/{init-C4Bkib9u.cjs → init-zU-_9Gsp.cjs} +67 -65
- package/dist/{is-retriable-error-BU0e3hVI.js → is-retriable-error-BUiVJDwH.js} +1 -1
- package/dist/{is-retriable-error-CeeuHqDa.cjs → is-retriable-error-Dpt860if.cjs} +1 -1
- package/dist/jubjub-authoriser-D7zDXu3V.js +86 -0
- package/dist/jubjub-authoriser-Dgu6o3Sv.cjs +87 -0
- package/dist/key-source-5oUBFiC7.cjs +583 -0
- package/dist/key-source-B08HukZg.js +2550 -0
- package/dist/keyDerivation-D3k9XyHg.js +4077 -0
- package/dist/keyDerivation-u0nBA93T.cjs +274 -0
- package/dist/{lace-context-CZcNHr4M.js → lace-context-BZciB9c7.js} +4 -4
- package/dist/{lace-context-fJTDghdp.cjs → lace-context-DgR6vLli.cjs} +4 -4
- package/dist/lib--iqvW4O_.js +2354 -0
- package/dist/lib-Yk6Upl5D.cjs +2359 -0
- package/dist/{libsodium-wrappers-UH0LaOUE.js → libsodium-wrappers-BhbOA8dQ.js} +3 -1647
- package/dist/midnight-account-id.vo-0x9X-r3l.cjs +10 -0
- package/dist/midnight-account-id.vo-DjCAGcqc.js +5 -0
- package/dist/midnight-engine-DpemplKO.js +5 -0
- package/dist/midnight-engine-xU1wotne.cjs +6 -0
- package/dist/midnight-wallet-DIsAlSn6.js +18 -0
- package/dist/midnight-wallet-XTZc2li7.cjs +24 -0
- package/dist/midnight.cjs +1408 -0
- package/dist/midnight.d.ts +28934 -0
- package/dist/midnight.js +1352 -0
- package/dist/modules-cardano-D9Gs2j60.cjs +1108 -0
- package/dist/modules-cardano-VIM8fKu-.js +995 -0
- package/dist/node-relay-DWe1U0w2.cjs +49 -0
- package/dist/node-relay-h4i5IlAQ.js +48 -0
- package/dist/outputs-Bd2yZVjx.js +720 -0
- package/dist/outputs-CJoQBIA2.cjs +990 -0
- package/dist/pbkdf2-CIW-oWrm.cjs +1337 -0
- package/dist/pending-operation-B0_P78Jo.cjs +26 -0
- package/dist/pending-operation-BIS6mpjB.js +21 -0
- package/dist/providers-FjhM47BH.cjs +388 -0
- package/dist/providers-WtiSuxFu.js +365 -0
- package/dist/redacted-BmE2aXqr.js +81 -0
- package/dist/redacted-CRZJLS3w.cjs +86 -0
- package/dist/{retry-config-DC5IMaH7.cjs → retry-config-BaCfVC1H.cjs} +1 -1
- package/dist/{retry-config-BcUmMS--.js → retry-config-Dmgt28wM.js} +1 -1
- package/dist/safe-buffer-B_vMqJWU.js +43 -0
- package/dist/safe-buffer-DYOwEfHB.cjs +48 -0
- package/dist/sdk-Cb-gZnS9.js +1241 -0
- package/dist/sdk-DffwmX8b.cjs +1439 -0
- package/dist/sdk-init-Bln9rFtn.js +4138 -0
- package/dist/sdk-init-CYViTJY_.cjs +3841 -0
- package/dist/{seam-cardano-CATqBEyK.js → seam-cardano-B_etH4F4.js} +1 -1
- package/dist/{bytes.vo-TgiwogWF.js → secret-box-DUR0ACYz.js} +3 -25
- package/dist/{bytes.vo-Ck5u40RA.cjs → secret-box-DrjLZuS1.cjs} +1 -35
- package/dist/send-proof-progress-C-ljq1x5.js +30 -0
- package/dist/send-proof-progress-vmsaSfbz.cjs +47 -0
- package/dist/side-effects-BnqYz7Nl.js +768 -0
- package/dist/side-effects-CngaeXi0.cjs +804 -0
- package/dist/sign-bitcoin-transaction-with-seed-D4z62-jV.js +147 -0
- package/dist/sign-bitcoin-transaction-with-seed-DsLYXnCY.cjs +158 -0
- package/dist/signer-3fk8lZtE.cjs +7 -0
- package/dist/signer-CsL28DrK.cjs +121 -0
- package/dist/signer-DGluibtn.js +92 -0
- package/dist/signer-RqB5pu3K.js +2 -0
- package/dist/signer-factory-BA7WFJVZ.js +282 -0
- package/dist/signer-factory-Cwd6o-lG.cjs +281 -0
- package/dist/{signer-factory-9URFliA5.js → signer-factory-DObB55D4.js} +6 -3
- package/dist/signer-factory-DhZiE03y.cjs +149 -0
- package/dist/{signer-factory-BWGUmnvm.cjs → signer-factory-Ds6G2AZk.cjs} +4 -3
- package/dist/signer-factory-hzSRaIw2.js +148 -0
- package/dist/{slice-CuHUaPZx.cjs → slice-7G2xxYKJ.cjs} +3 -3
- package/dist/{slice-DZmQJNV8.cjs → slice-B4CdYoPu.cjs} +2 -2
- package/dist/slice-BPNuHKfw.js +9091 -0
- package/dist/{slice-DGcNrbPR.cjs → slice-Bg6HEr3K.cjs} +4 -4
- package/dist/{slice-DtaO72qY.cjs → slice-Bs2aMERu.cjs} +3 -3
- package/dist/{slice-HeHCv3bl.cjs → slice-C34iOOUH.cjs} +7 -7
- package/dist/{slice-Do2R2CYW.cjs → slice-C9TT5KhY.cjs} +6 -6
- package/dist/{slice-eIwcwKHI.js → slice-CK07EBCo.js} +4 -4
- package/dist/{slice-CnyWevM9.js → slice-CU80pbiu.js} +3 -3
- package/dist/{slice-CobanYgn.js → slice-CwyYrh1H.js} +2 -2
- package/dist/slice-Czfp6t84.cjs +436 -0
- package/dist/{slice-d0p6-xj5.js → slice-D-9aPKG-.js} +6 -6
- package/dist/{slice-maaskdUn.js → slice-DBpJ2QGf.js} +6 -6
- package/dist/{slice-mxLQ_FeY.cjs → slice-DTZTiJle.cjs} +352 -39
- package/dist/{slice-zJ9XVYjZ.js → slice-Da426sf9.js} +1 -1
- package/dist/{slice-D11m2EKl.cjs → slice-DayJvMRD.cjs} +1 -1
- package/dist/slice-DnBWfA-k.cjs +9109 -0
- package/dist/{slice-oqm_r1cS.cjs → slice-DnG-yvpI.cjs} +2 -2
- package/dist/{slice-BNu73oBa.js → slice-DyNs7oWp.js} +2 -2
- package/dist/{slice-CB4SnzMm.js → slice-GwiiJRoq.js} +3 -3
- package/dist/slice-oWnc7YVD.js +412 -0
- package/dist/{slice-B2PhoWAg.js → slice-qt0uBExh.js} +325 -37
- package/dist/slice-t8Gzj55G2.cjs +106 -0
- package/dist/slice-t8Q1cHm-.js +88 -0
- package/dist/src-BDzYIksE.cjs +20637 -0
- package/dist/src-BFoefPv_.js +20755 -0
- package/dist/store-B1Lq3cEf.cjs +66 -0
- package/dist/store-DuBG8qh5.js +37 -0
- package/dist/submit-Bs77dPn_.cjs +413 -0
- package/dist/submit-DOv8Z0Vf.js +336 -0
- package/dist/submit-bitcoin-tx-D6oYgH5S.js +983 -0
- package/dist/submit-bitcoin-tx-goFuRL7K.cjs +1049 -0
- package/dist/{sync-operation-utils-BYXLO80m.js → sync-operation-utils-31iFLExW.js} +2 -38
- package/dist/{sync-operation-utils-SdPbwFoD.cjs → sync-operation-utils-COIZ66-I.cjs} +1 -67
- package/dist/token-id-mapper-Bnds3xKH.cjs +18 -0
- package/dist/{token-id-mapper-DsPAL6Nh.cjs → token-id-mapper-CVyQJUKY.cjs} +2 -2
- package/dist/token-id-mapper-CnKHQ8DV.js +16 -0
- package/dist/{token-id-mapper-B2ivlLv3.js → token-id-mapper-D29Ggv8h.js} +2 -2
- package/dist/tokens-Cevp7rdU.cjs +62 -0
- package/dist/tokens-Diw4MLRM.js +44 -0
- package/dist/types-B8uiJn-X.js +12 -0
- package/dist/types-BHC12eSa.js +33 -0
- package/dist/types-CJT6XF2c.js +10 -0
- package/dist/types-CLRUYpfe.cjs +23 -0
- package/dist/types-Cc3mC8u0.cjs +50 -0
- package/dist/types-DWbVZpnF.cjs +15 -0
- package/dist/unwrap-provider-result-BZSiwabU.js +32 -0
- package/dist/unwrap-provider-result-ZqfBsTkk.cjs +39 -0
- package/dist/{util-CGzqQ8IV.cjs → util-Bu4W5lF4.cjs} +1 -1
- package/dist/{util-BaLzwa32.js → util-Cp5cZkfK.js} +1 -1
- package/dist/{utils-o8aMjfln.js → utils-BfBEUvWA.js} +2 -2
- package/dist/utils-DFwzEvbv.js +65 -0
- package/dist/{utils-5JvjbqH3.cjs → utils-DsElZgCI.cjs} +7 -1
- package/dist/utils-IXxR-Djh.cjs +112 -0
- package/dist/v8Signatures-CO_Uloy7.cjs +71 -0
- package/dist/{vote-delegation-tx-builder-CmKv6GoG.js → vote-delegation-tx-builder-BsBSDmcX.js} +5 -5
- package/dist/{vote-delegation-tx-builder-BpEMSti4.cjs → vote-delegation-tx-builder-DSs8nybk.cjs} +6 -6
- package/dist/watch-CUEvcP-V.js +21997 -0
- package/dist/watch-DMF2s-II.cjs +52281 -0
- package/package.json +96 -4
- package/dist/account-guards.stable-B1DSSh9D.cjs +0 -10
- package/dist/account-guards.stable-JRQ5qx2V.js +0 -5
- package/dist/codecs-B7X9pAsK.cjs +0 -1945
- package/dist/codecs-CC1Xjntz.js +0 -1882
- package/dist/init-Bv53hpLM.js +0 -19
- package/dist/init-CRbjI7p1.js +0 -3494
- package/dist/init-DAna1KCg.cjs +0 -3495
- package/dist/init-DGe47B22.cjs +0 -364
- package/dist/init-DMtyvYfC.cjs +0 -21
- package/dist/init-TkPDD750.js +0 -363
- package/dist/modules-cardano-BDvuL4Xx.js +0 -5248
- package/dist/modules-cardano-D2G3De2P.cjs +0 -5432
- package/dist/slice-CGVHXHDt.cjs +0 -125
- package/dist/slice-DhvF7L6X.js +0 -107
- /package/dist/{account-id.vo-LvCBVn5r.cjs → account-id.vo-DwqFjK5u.cjs} +0 -0
- /package/dist/{account-id.vo-MYSI7YFm.js → account-id.vo-OPz2v-JZ.js} +0 -0
- /package/dist/{actions-DdGbj7c7.cjs → actions-B2BJ4RTy.cjs} +0 -0
- /package/dist/{actions-9QSQR-GB.js → actions-iLXdgL5Y.js} +0 -0
- /package/dist/{apply-vkey-witnesses-ClZbpk5w.js → apply-vkey-witnesses-BKx3lcs0.js} +0 -0
- /package/dist/{apply-vkey-witnesses-CLzVSWxl.cjs → apply-vkey-witnesses-ZnFS0jnJ.cjs} +0 -0
- /package/dist/{asyncoption-Cw07zPH7.js → asyncoption-CruEYOBI.js} +0 -0
- /package/dist/{asyncoption-DYoGuQfP.cjs → asyncoption-i0VbqVTq.cjs} +0 -0
- /package/dist/{bignum.vo-B0rK_PQ1.js → bignum.vo-CEXOIew0.js} +0 -0
- /package/dist/{bignum.vo-DsG3kNiZ.cjs → bignum.vo-hx2kuqlA.cjs} +0 -0
- /package/dist/{bip32ed25519-1ApqeAZk.cjs → bip32ed25519-B7Yat217.cjs} +0 -0
- /package/dist/{bip32ed25519-DetAdGwD.js → bip32ed25519-FQ8qvdcq.js} +0 -0
- /package/dist/{blake2b-DOEVc57D.js → blake2b-BiQTw3GC.js} +0 -0
- /package/dist/{blake2b-B9tftbvG.cjs → blake2b-DEeVUdKR.cjs} +0 -0
- /package/dist/{blockchain-network-id.vo-BXpZhvvQ.cjs → blockchain-network-id.vo-BAKEwGjG.cjs} +0 -0
- /package/dist/{blockchain-network-id.vo-DNRkuT5B.js → blockchain-network-id.vo-CiVykuqG.js} +0 -0
- /package/dist/{blockingWithLatestFrom-C5wp_uA-.js → blockingWithLatestFrom-Cd8c8EPG.js} +0 -0
- /package/dist/{blockingWithLatestFrom-DY8OPg0w.cjs → blockingWithLatestFrom-D8kBPBMX.cjs} +0 -0
- /package/dist/{cardano-network-id-to-network-type-CrZfUcyP.js → cardano-network-id-to-network-type-BWwzeEtM.js} +0 -0
- /package/dist/{cardano-network-id-to-network-type-BDTF-HmK.cjs → cardano-network-id-to-network-type-C0ufJOyE.cjs} +0 -0
- /package/dist/{cardano-tx-id.vo-BPhV-AmZ.cjs → cardano-tx-id.vo-TLjJZHCI.cjs} +0 -0
- /package/dist/{cardano-tx-id.vo-DF9NzZXk.js → cardano-tx-id.vo-eVnKuzlm.js} +0 -0
- /package/dist/{composite-signer-factory-_46QsNBz.js → composite-signer-factory-CR8YHA1y.js} +0 -0
- /package/dist/{composite-signer-factory-BpF1mIYA.cjs → composite-signer-factory-m5cVs9h_.cjs} +0 -0
- /package/dist/{error-CNIquqT5.cjs → error-Cb3EnD0u.cjs} +0 -0
- /package/dist/{error-BCp9NkPi.js → error-DIZOY2Lw.js} +0 -0
- /package/dist/{esm-browser-C93Q-EOI.js → esm-browser-MG97cre9.js} +0 -0
- /package/dist/{esm-browser-DTc9IK3D.cjs → esm-browser-bweqfBlL.cjs} +0 -0
- /package/dist/{feature-flag-key.vo-ofrB6ZVQ.js → feature-flag-key.vo-DN_-4-sG.js} +0 -0
- /package/dist/{feature-flag-key.vo-BPz-ZAp6.cjs → feature-flag-key.vo-RlfHL3hq.cjs} +0 -0
- /package/dist/{first-state-of-status-OROkXcRv.cjs → first-state-of-status-CbT7hPa4.cjs} +0 -0
- /package/dist/{first-state-of-status-DQnMT3ya.js → first-state-of-status-unPynOuM.js} +0 -0
- /package/dist/{init-Es3wHW7D.js → init-829HRYcz.js} +0 -0
- /package/dist/{init-CKipPE_c.js → init-A-VyGSNW2.js} +0 -0
- /package/dist/{init-DFQQ9dTW.cjs → init-Atisw4x2.cjs} +0 -0
- /package/dist/{init-C5CEZ1m0.cjs → init-BFcvPHL-.cjs} +0 -0
- /package/dist/{init-IAk_CkGa.cjs → init-BgNobbNq.cjs} +0 -0
- /package/dist/{init-cqN3uX2j.js → init-atCFur0v.js} +0 -0
- /package/dist/{is-redux-persist-state-CTn3WZVh.cjs → is-redux-persist-state-BCFnSm36.cjs} +0 -0
- /package/dist/{is-redux-persist-state-Cxcd0_bM.js → is-redux-persist-state-yBfq0h_E.js} +0 -0
- /package/dist/{key-value-store-8cMzeNyG.js → key-value-store--W3SrMaw.js} +0 -0
- /package/dist/{key-value-store-DUAepXQf.cjs → key-value-store-C2Xt5Emp.cjs} +0 -0
- /package/dist/{repo-slice-WxetRhMY.cjs → repo-slice-7X4AYYVm.cjs} +0 -0
- /package/dist/{repo-slice-DwyMhCR1.js → repo-slice-RxFm0zDZ.js} +0 -0
- /package/dist/{reselect-CRDqmQY9.cjs → reselect-Bd94u0K-.cjs} +0 -0
- /package/dist/{reselect-C06X06oX.js → reselect-CGoLzEPv.js} +0 -0
- /package/dist/{serializable-B8GahgE1.js → serializable-BHdKIgk3.js} +0 -0
- /package/dist/{serializable-CRdnFaLZ.cjs → serializable-BxHkoPdk.cjs} +0 -0
- /package/dist/{slice-D11FHQuQ.cjs → slice-BiRsDKOK.cjs} +0 -0
- /package/dist/{slice-Be7hj4Iy.js → slice-Bk0Sv05J.js} +0 -0
- /package/dist/{slice-FioKeHtA.cjs → slice-Dqw1ecum.cjs} +0 -0
- /package/dist/{slice-B87b52iM.js → slice-obCSLm1x.js} +0 -0
- /package/dist/{src-vq1wS9sZ.js → src-BlxEp6Mm.js} +0 -0
- /package/dist/{src-BTPIvlDI.cjs → src-Cqp0B2M_.cjs} +0 -0
- /package/dist/{time.vo-CQ8pSXz2.cjs → time.vo-D3wWRw9L.cjs} +0 -0
- /package/dist/{time.vo-DkYYGYp6.js → time.vo-tNheinXm.js} +0 -0
- /package/dist/{toEmpty-CgAl3097.js → toEmpty-8Zax1MPd.js} +0 -0
- /package/dist/{toEmpty-DAMmNB5r.cjs → toEmpty-CYAbupM4.cjs} +0 -0
- /package/dist/{token-id.vo-ClsroxHO.js → token-id.vo-Bvwhr3ZE.js} +0 -0
- /package/dist/{token-id.vo-BxG9TG0O.cjs → token-id.vo-DXv5uS9n.cjs} +0 -0
- /package/dist/{util-DxzlYNS5.js → util-C8a4fA9p.js} +0 -0
- /package/dist/{util-CmdAhheh.cjs → util-CzeB3hfa.cjs} +0 -0
- /package/dist/{util-selector-CcK-GAdE.js → util-selector-BSTsxgne.js} +0 -0
- /package/dist/{util-selector-BcAncU4L.cjs → util-selector-BWPH68_l.cjs} +0 -0
- /package/dist/{while-active-BpppWuCs.js → while-active-B0lWy_6l.js} +0 -0
- /package/dist/{while-active-Dhc2LwOm.cjs → while-active-Dsowp0Fi.cjs} +0 -0
|
@@ -0,0 +1,1142 @@
|
|
|
1
|
+
import { a as __toESM } from "./rolldown-runtime-OvD0k9op.js";
|
|
2
|
+
import "./_web-crypto-random-bytes-Bo-GTcRS.js";
|
|
3
|
+
import "./_polyfill-buffer-patch-yNxN4d5E.js";
|
|
4
|
+
import "./libsodium-wrappers-BhbOA8dQ.js";
|
|
5
|
+
import { t as Bip32Account$1 } from "./seam-cardano-B_etH4F4.js";
|
|
6
|
+
import { _ as CardanoRewardAccount, u as toContractAddress } from "./util-Cp5cZkfK.js";
|
|
7
|
+
import { s as Timestamp } from "./time.vo-tNheinXm.js";
|
|
8
|
+
import { t as BigNumber } from "./bignum.vo-CEXOIew0.js";
|
|
9
|
+
import { n as Ok, t as Err } from "./asyncoption-CruEYOBI.js";
|
|
10
|
+
import { t as TokenId } from "./token-id.vo-Bvwhr3ZE.js";
|
|
11
|
+
import { r as LOVELACE_TOKEN_ID } from "./const-BJfIK_G-.js";
|
|
12
|
+
import { n as getAdaTokenTickerByNetwork, t as cardanoNetworkMagicToNetworkType } from "./cardano-network-id-to-network-type-BWwzeEtM.js";
|
|
13
|
+
import { a as isNotFoundError, n as ProviderError$1, o as toProviderError, r as ProviderFailure$1 } from "./error-DIZOY2Lw.js";
|
|
14
|
+
import { n as buildUrl, t as HttpClient } from "./http-client-TRlhDZGh.js";
|
|
15
|
+
import { a as BlockfrostToCardanoSDK, i as BlockfrostNetworkInfoProvider, n as BlockfrostUtxoProvider, o as BlockfrostProvider, r as BlockfrostTxProvider, t as BlockfrostTxSubmitProvider } from "./blockfrost-tx-submit-provider-CBWQ0wK9.js";
|
|
16
|
+
import { t as require_lib } from "./lib--iqvW4O_.js";
|
|
17
|
+
import { AddressType, KeyRole } from "@laceio/cardano/key-management";
|
|
18
|
+
import { Hash28ByteBase16 } from "@laceio/cardano/crypto";
|
|
19
|
+
import { Asset, Cardano, ProviderError, ProviderFailure, Serialization } from "@laceio/cardano/core";
|
|
20
|
+
import { isNotNil } from "@laceio/cardano/util";
|
|
21
|
+
import { EMPTY, Observable, catchError, defer, distinct, expand, forkJoin, from, map, mergeMap, of, reduce, toArray } from "rxjs";
|
|
22
|
+
import omit from "lodash/omit.js";
|
|
23
|
+
import memoize from "lodash/memoize.js";
|
|
24
|
+
//#region ../../packages/lib/cardano-provider-core/src/provider/blockfrost-asset-provider.ts
|
|
25
|
+
var BlockfrostAssetProvider = class extends BlockfrostProvider {
|
|
26
|
+
constructor(client, logger) {
|
|
27
|
+
super(client, logger);
|
|
28
|
+
}
|
|
29
|
+
async getAsset({ assetId, extraData }) {
|
|
30
|
+
try {
|
|
31
|
+
const response = await this.request(`assets/${assetId.toString()}`);
|
|
32
|
+
const name = Cardano.AssetId.getAssetName(assetId);
|
|
33
|
+
const policyId = Cardano.PolicyId(response.policy_id);
|
|
34
|
+
const quantity = BigInt(response.quantity);
|
|
35
|
+
return {
|
|
36
|
+
assetId,
|
|
37
|
+
fingerprint: Cardano.AssetFingerprint(response.fingerprint),
|
|
38
|
+
name,
|
|
39
|
+
nftMetadata: extraData?.nftMetadata ? this.mapNftMetadata(response) : null,
|
|
40
|
+
policyId,
|
|
41
|
+
quantity,
|
|
42
|
+
supply: quantity,
|
|
43
|
+
tokenMetadata: extraData?.tokenMetadata ? this.mapTokenMetadata(assetId, response) : null
|
|
44
|
+
};
|
|
45
|
+
} catch (error) {
|
|
46
|
+
this.logger.error("getAsset failed", assetId, extraData);
|
|
47
|
+
throw toProviderError(error);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
mapNftMetadata(asset) {
|
|
51
|
+
const image = this.metadatumToString(asset.onchain_metadata?.image || asset.metadata?.logo);
|
|
52
|
+
const name = asset.onchain_metadata?.name || asset.metadata?.name;
|
|
53
|
+
if (!image || !name) return null;
|
|
54
|
+
try {
|
|
55
|
+
return {
|
|
56
|
+
description: this.metadatumToString(asset.onchain_metadata?.description || asset.metadata?.description),
|
|
57
|
+
files: Array.isArray(asset.onchain_metadata?.files) ? asset.onchain_metadata.files.map((file) => {
|
|
58
|
+
const mediaType = file.mediaType;
|
|
59
|
+
const fileName = file.name;
|
|
60
|
+
const source = this.metadatumToString(file.src);
|
|
61
|
+
if (!source || !mediaType) return null;
|
|
62
|
+
try {
|
|
63
|
+
return {
|
|
64
|
+
mediaType: Asset.MediaType(mediaType),
|
|
65
|
+
name: fileName,
|
|
66
|
+
otherProperties: this.mapFileMetadataOtherProperties(file),
|
|
67
|
+
src: Asset.Uri(source)
|
|
68
|
+
};
|
|
69
|
+
} catch (error) {
|
|
70
|
+
this.logger.warn("Failed to parse onchain_metadata file", file, error);
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
}).filter(isNotNil) : void 0,
|
|
74
|
+
image: Asset.Uri(image),
|
|
75
|
+
mediaType: asset.onchain_metadata?.mediaType ? Asset.ImageMediaType(asset.onchain_metadata.mediaType) : void 0,
|
|
76
|
+
name,
|
|
77
|
+
otherProperties: this.mapNftMetadataOtherProperties(asset.onchain_metadata),
|
|
78
|
+
version: this.mapNftMetadataVersion(asset.onchain_metadata)
|
|
79
|
+
};
|
|
80
|
+
} catch (error) {
|
|
81
|
+
this.logger.warn("Failed to parse nft metadata", asset, error);
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
asString = (metadatum) => typeof metadatum === "string" ? metadatum : void 0;
|
|
86
|
+
metadatumToString(metadatum) {
|
|
87
|
+
let stringMetadatum;
|
|
88
|
+
if (Array.isArray(metadatum)) stringMetadatum = metadatum.map((metadata) => this.asString(metadata)).filter(isNotNil).join("");
|
|
89
|
+
else stringMetadatum = this.asString(metadatum);
|
|
90
|
+
return stringMetadatum;
|
|
91
|
+
}
|
|
92
|
+
objToMetadatum(object) {
|
|
93
|
+
if (typeof object === "string") return object;
|
|
94
|
+
if (typeof object === "number") return BigInt(object);
|
|
95
|
+
if (typeof object === "object") {
|
|
96
|
+
if (object === null) return "";
|
|
97
|
+
if (Array.isArray(object)) return object.map((item) => this.objToMetadatum(item));
|
|
98
|
+
return new Map(Object.entries(object).map(([key, value]) => [key, this.objToMetadatum(value)]));
|
|
99
|
+
}
|
|
100
|
+
return "";
|
|
101
|
+
}
|
|
102
|
+
mapNftMetadataVersion(metadata) {
|
|
103
|
+
return typeof metadata?.version === "string" ? metadata.version : "1.0";
|
|
104
|
+
}
|
|
105
|
+
mapFileMetadataOtherProperties(metadata) {
|
|
106
|
+
return this.mapOtherProperties(metadata, [
|
|
107
|
+
"name",
|
|
108
|
+
"mediaType",
|
|
109
|
+
"src"
|
|
110
|
+
]);
|
|
111
|
+
}
|
|
112
|
+
mapNftMetadataOtherProperties(metadata) {
|
|
113
|
+
return this.mapOtherProperties(metadata, [
|
|
114
|
+
"name",
|
|
115
|
+
"image",
|
|
116
|
+
"description",
|
|
117
|
+
"mediaType",
|
|
118
|
+
"files",
|
|
119
|
+
"version"
|
|
120
|
+
]);
|
|
121
|
+
}
|
|
122
|
+
mapOtherProperties(metadata, mainProperties) {
|
|
123
|
+
if (!metadata) return;
|
|
124
|
+
const otherProperties = Object.entries(omit(metadata, mainProperties));
|
|
125
|
+
if (otherProperties.length === 0) return;
|
|
126
|
+
return new Map(otherProperties.map(([key, value]) => [key, this.objToMetadatum(value)]));
|
|
127
|
+
}
|
|
128
|
+
mapTokenMetadata(assetId, asset) {
|
|
129
|
+
return {
|
|
130
|
+
assetId,
|
|
131
|
+
decimals: asset.metadata?.decimals || void 0,
|
|
132
|
+
desc: this.metadatumToString(asset.metadata?.description || asset.onchain_metadata?.description),
|
|
133
|
+
icon: this.metadatumToString(asset.metadata?.logo || asset.onchain_metadata?.image),
|
|
134
|
+
name: asset.metadata?.name || asset.onchain_metadata?.name,
|
|
135
|
+
ticker: asset.metadata?.ticker || void 0,
|
|
136
|
+
url: asset.metadata?.url || void 0,
|
|
137
|
+
version: "1.0"
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
};
|
|
141
|
+
//#endregion
|
|
142
|
+
//#region ../../packages/lib/cardano-provider-core/src/provider/blockfrost-address-discovery.ts
|
|
143
|
+
/**
|
|
144
|
+
* How far we search for stake keys before concluding there are no more stake credentials.
|
|
145
|
+
*/
|
|
146
|
+
const STAKE_KEY_GAP = 5;
|
|
147
|
+
/**
|
|
148
|
+
* How far we search for payment addresses under a single stake key
|
|
149
|
+
* before concluding that no more addresses exist (or that they are “franken”).
|
|
150
|
+
*/
|
|
151
|
+
const PAYMENT_CREDENTIAL_GAP = 100;
|
|
152
|
+
/**
|
|
153
|
+
* Safety cap for thorough discovery. The thorough predicate continues past
|
|
154
|
+
* the gap when the Blockfrost-returned address set still has unmatched
|
|
155
|
+
* entries; this bound ensures the loop cannot run forever when an unmatched
|
|
156
|
+
* entry is structurally undiscoverable (true "franken" cases).
|
|
157
|
+
*/
|
|
158
|
+
const HARD_UPPER_BOUND = 1e4;
|
|
159
|
+
/**
|
|
160
|
+
* Fetch size for Blockfrost addresses per page.
|
|
161
|
+
*/
|
|
162
|
+
const BLOCKFROST_PAGE_SIZE = 100;
|
|
163
|
+
/**
|
|
164
|
+
* Derive the reward account (stake address) at a given stakeIndex.
|
|
165
|
+
*/
|
|
166
|
+
const deriveRewardAccount = async (account, stakeIndex) => {
|
|
167
|
+
return CardanoRewardAccount((await account.deriveAddress({
|
|
168
|
+
type: AddressType.External,
|
|
169
|
+
index: 0
|
|
170
|
+
}, stakeIndex)).rewardAccount);
|
|
171
|
+
};
|
|
172
|
+
/**
|
|
173
|
+
* Derive a payment address at a given (payment) index + address type (internal/external).
|
|
174
|
+
*/
|
|
175
|
+
const derivePaymentAddress = async (account, paymentIndex, stakeIndex, isInternal) => {
|
|
176
|
+
const type = isInternal ? AddressType.Internal : AddressType.External;
|
|
177
|
+
return account.deriveAddress({
|
|
178
|
+
type,
|
|
179
|
+
index: paymentIndex
|
|
180
|
+
}, stakeIndex);
|
|
181
|
+
};
|
|
182
|
+
const compareAddresses = (a, b) => {
|
|
183
|
+
const indexDiff = a.index - b.index;
|
|
184
|
+
if (indexDiff !== 0) return indexDiff;
|
|
185
|
+
if (a.stakeKeyDerivationPath && b.stakeKeyDerivationPath) return a.stakeKeyDerivationPath.index - b.stakeKeyDerivationPath.index;
|
|
186
|
+
return 0;
|
|
187
|
+
};
|
|
188
|
+
/**
|
|
189
|
+
* Example BlockfrostAddressDiscovery class that:
|
|
190
|
+
* - Paginates all addresses from each reward account
|
|
191
|
+
* - Derives addresses sequentially and checks if they match
|
|
192
|
+
* - Uses a gap-based approach for both stake keys AND payment addresses
|
|
193
|
+
* - Logs leftover addresses as unknown
|
|
194
|
+
*/
|
|
195
|
+
var BlockfrostAddressDiscovery = class extends BlockfrostProvider {
|
|
196
|
+
constructor(client, logger) {
|
|
197
|
+
super(client, logger);
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* @returns Observable that emits all discovered addresses one by one. Completes on first error.
|
|
201
|
+
*/
|
|
202
|
+
discover(manager, options = {}) {
|
|
203
|
+
const isThorough = options.thorough ?? false;
|
|
204
|
+
this.logger.debug(`Discovering addresses using Blockfrost (thorough=${isThorough})...`);
|
|
205
|
+
return forkJoin({
|
|
206
|
+
firstAddress: from(manager.deriveAddress({
|
|
207
|
+
index: 0,
|
|
208
|
+
type: AddressType.External
|
|
209
|
+
}, 0)),
|
|
210
|
+
discovered: this.#discoverAddresses(manager, isThorough).pipe(toArray())
|
|
211
|
+
}).pipe(mergeMap(({ firstAddress, discovered }) => from([firstAddress, ...discovered])), distinct(({ address }) => address), map(Ok), catchError((error) => of(Err(error instanceof ProviderError$1 ? error : new ProviderError$1(ProviderFailure$1.Unknown, error)))));
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Main discovery logic:
|
|
215
|
+
* 1. Stake key gap: we keep deriving stake keys until we have
|
|
216
|
+
* STAKE_KEY_GAP consecutive stake keys that yield zero discovered addresses.
|
|
217
|
+
* 2. Payment credential gap: for each stake key, we stop deriving
|
|
218
|
+
* payment addresses once we have PAYMENT_CREDENTIAL_GAP consecutive misses.
|
|
219
|
+
* In thorough mode, termination additionally requires the Blockfrost
|
|
220
|
+
* address set to be drained (bounded by HARD_UPPER_BOUND).
|
|
221
|
+
*/
|
|
222
|
+
#discoverAddresses(account, thorough) {
|
|
223
|
+
return new Observable((subscriber) => {
|
|
224
|
+
let isUnsubscribed = false;
|
|
225
|
+
(async () => {
|
|
226
|
+
let stakeIndex = 0;
|
|
227
|
+
let stakeGapCount = 0;
|
|
228
|
+
try {
|
|
229
|
+
while (stakeGapCount < STAKE_KEY_GAP) {
|
|
230
|
+
if (isUnsubscribed) break;
|
|
231
|
+
this.logger.debug(`Deriving reward account for stake index ${stakeIndex}...`);
|
|
232
|
+
const rewardAccount = await deriveRewardAccount(account, stakeIndex);
|
|
233
|
+
this.logger.debug(`Fetching addresses for stake credential ${rewardAccount}...`);
|
|
234
|
+
const allAddressesForStake = await this.#fetchAllAddressesForAccount(rewardAccount);
|
|
235
|
+
if (allAddressesForStake.length === 0) {
|
|
236
|
+
stakeGapCount++;
|
|
237
|
+
stakeIndex++;
|
|
238
|
+
continue;
|
|
239
|
+
}
|
|
240
|
+
stakeGapCount = 0;
|
|
241
|
+
const { discovered, unknown } = await this.#discoverAddressesForStakeKey(account, stakeIndex, allAddressesForStake, thorough);
|
|
242
|
+
for (const address of discovered.sort(compareAddresses)) subscriber.next(address);
|
|
243
|
+
if (unknown.length > 0) this.logger.warn(`The following addresses under stakeIndex ${stakeIndex} were not matched:`, unknown);
|
|
244
|
+
++stakeIndex;
|
|
245
|
+
}
|
|
246
|
+
subscriber.complete();
|
|
247
|
+
} catch (error) {
|
|
248
|
+
subscriber.error(error);
|
|
249
|
+
}
|
|
250
|
+
})();
|
|
251
|
+
return () => {
|
|
252
|
+
isUnsubscribed = true;
|
|
253
|
+
};
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Discover addresses under a single stake key.
|
|
258
|
+
*
|
|
259
|
+
* Standard mode (thorough=false): stop once we hit PAYMENT_CREDENTIAL_GAP
|
|
260
|
+
* consecutive misses. Matches the BIP-44 gap-limit convention.
|
|
261
|
+
*
|
|
262
|
+
* Thorough mode (thorough=true): also require the Blockfrost address set to
|
|
263
|
+
* be drained before stopping, so high-index entries past the gap can still
|
|
264
|
+
* be discovered. Bounded by HARD_UPPER_BOUND to guarantee termination when
|
|
265
|
+
* an entry is structurally undiscoverable.
|
|
266
|
+
*
|
|
267
|
+
* @returns Array of discovered (matched) addresses + leftover “unknown/franken” addresses
|
|
268
|
+
*/
|
|
269
|
+
async #discoverAddressesForStakeKey(account, stakeIndex, allAddressesForStake, thorough) {
|
|
270
|
+
const discovered = [];
|
|
271
|
+
const uniqueAddressesForStake = new Set(allAddressesForStake);
|
|
272
|
+
let gapCount = 0;
|
|
273
|
+
let paymentIndex = 0;
|
|
274
|
+
while (true) {
|
|
275
|
+
const hasHitGap = gapCount >= PAYMENT_CREDENTIAL_GAP;
|
|
276
|
+
if (thorough ? hasHitGap && uniqueAddressesForStake.size === 0 || paymentIndex >= HARD_UPPER_BOUND : hasHitGap) {
|
|
277
|
+
this.logger.debug(`Stopping payment discovery for stakeIndex ${stakeIndex} at paymentIndex ${paymentIndex} (gap=${gapCount}, remaining=${uniqueAddressesForStake.size}, thorough=${thorough}).`);
|
|
278
|
+
break;
|
|
279
|
+
}
|
|
280
|
+
const externalAddr = await derivePaymentAddress(account, paymentIndex, stakeIndex, false);
|
|
281
|
+
const hasExternalInSet = uniqueAddressesForStake.has(externalAddr.address);
|
|
282
|
+
const internalAddr = await derivePaymentAddress(account, paymentIndex, stakeIndex, true);
|
|
283
|
+
const hasInternalInSet = uniqueAddressesForStake.has(internalAddr.address);
|
|
284
|
+
if (hasExternalInSet) {
|
|
285
|
+
discovered.push({
|
|
286
|
+
...externalAddr,
|
|
287
|
+
stakeKeyDerivationPath: {
|
|
288
|
+
index: stakeIndex,
|
|
289
|
+
role: KeyRole.Stake
|
|
290
|
+
}
|
|
291
|
+
});
|
|
292
|
+
uniqueAddressesForStake.delete(externalAddr.address);
|
|
293
|
+
}
|
|
294
|
+
if (hasInternalInSet) {
|
|
295
|
+
discovered.push({
|
|
296
|
+
...internalAddr,
|
|
297
|
+
stakeKeyDerivationPath: {
|
|
298
|
+
index: stakeIndex,
|
|
299
|
+
role: KeyRole.Stake
|
|
300
|
+
}
|
|
301
|
+
});
|
|
302
|
+
uniqueAddressesForStake.delete(internalAddr.address);
|
|
303
|
+
}
|
|
304
|
+
if (!hasExternalInSet && !hasInternalInSet) gapCount++;
|
|
305
|
+
else gapCount = 0;
|
|
306
|
+
++paymentIndex;
|
|
307
|
+
}
|
|
308
|
+
return {
|
|
309
|
+
discovered,
|
|
310
|
+
unknown: [...uniqueAddressesForStake]
|
|
311
|
+
};
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* Fetch all addresses associated with a reward account from Blockfrost,
|
|
315
|
+
* handling pagination until the response has fewer than BLOCKFROST_PAGE_SIZE items.
|
|
316
|
+
*/
|
|
317
|
+
async #fetchAllAddressesForAccount(rewardAccount) {
|
|
318
|
+
const allAddresses = [];
|
|
319
|
+
let page = 1;
|
|
320
|
+
this.logger.debug(`Fetching addresses for stake ${rewardAccount} (paginated)...`);
|
|
321
|
+
while (true) try {
|
|
322
|
+
const response = await this.request(`accounts/${rewardAccount}/addresses?count=${BLOCKFROST_PAGE_SIZE}&page=${page}`);
|
|
323
|
+
if (!response || response.length === 0) break;
|
|
324
|
+
for (const entry of response) allAddresses.push(entry.address);
|
|
325
|
+
if (response.length < BLOCKFROST_PAGE_SIZE) break;
|
|
326
|
+
++page;
|
|
327
|
+
} catch (error) {
|
|
328
|
+
if (isNotFoundError(error)) {
|
|
329
|
+
this.logger.debug(`No addresses found for stake ${rewardAccount}. 404 from Blockfrost.`);
|
|
330
|
+
break;
|
|
331
|
+
}
|
|
332
|
+
this.logger.error(`Error fetching addresses for stake ${rewardAccount}:`, error);
|
|
333
|
+
throw error;
|
|
334
|
+
}
|
|
335
|
+
this.logger.debug(`Fetched ${allAddresses.length} addresses for stake ${rewardAccount}`);
|
|
336
|
+
return allAddresses;
|
|
337
|
+
}
|
|
338
|
+
};
|
|
339
|
+
//#endregion
|
|
340
|
+
//#region ../../packages/lib/cardano-provider-core/src/provider/blockfrost-tokens-provider.ts
|
|
341
|
+
const amountToRawToken = (amount) => ({
|
|
342
|
+
available: BigNumber(BigInt(amount.quantity)),
|
|
343
|
+
pending: BigNumber(0n),
|
|
344
|
+
tokenId: TokenId(amount.unit)
|
|
345
|
+
});
|
|
346
|
+
var BlockfrostTokensProvider = class extends BlockfrostProvider {
|
|
347
|
+
getTokens(props) {
|
|
348
|
+
return from(this.request(`addresses/${props.address}`).then(({ amount }) => Ok(amount.map(amountToRawToken))).catch((error) => {
|
|
349
|
+
if (isNotFoundError(error)) return Ok([]);
|
|
350
|
+
return Err(error);
|
|
351
|
+
}));
|
|
352
|
+
}
|
|
353
|
+
};
|
|
354
|
+
//#endregion
|
|
355
|
+
//#region ../../packages/lib/cardano-provider-core/src/provider/blockfrost-activity-provider.ts
|
|
356
|
+
/**
|
|
357
|
+
* Provider responsible for fetching transaction history and details.
|
|
358
|
+
*/
|
|
359
|
+
var BlockfrostActivityProvider = class extends BlockfrostProvider {
|
|
360
|
+
#txProvider;
|
|
361
|
+
constructor(client, logger, txProvider = new BlockfrostTxProvider(client, logger)) {
|
|
362
|
+
super(client, logger);
|
|
363
|
+
this.#txProvider = txProvider;
|
|
364
|
+
}
|
|
365
|
+
/**
|
|
366
|
+
* Fetches the transaction history for a Cardano address.
|
|
367
|
+
*
|
|
368
|
+
* @param address - Cardano payment address to fetch transaction history for
|
|
369
|
+
* @param numberOfItems - How many history items should be fetched (order: newer → older)
|
|
370
|
+
* @param startAtBlock - At which block (inclusive) should it start
|
|
371
|
+
* @param startAtIndex - At which index (inclusive) should it start
|
|
372
|
+
* @returns Observable with Result containing the history items or an error
|
|
373
|
+
*/
|
|
374
|
+
getAddressTransactionHistory({ address, numberOfItems, startAtBlock, startAtIndex, endAtBlock, endAtIndex, order = "desc" }) {
|
|
375
|
+
const fromIndexParameter = startAtIndex !== void 0 ? `:${startAtIndex}` : "";
|
|
376
|
+
const toIndexParameter = endAtIndex !== void 0 ? `:${endAtIndex}` : "";
|
|
377
|
+
const optionalFromParameter = startAtBlock !== void 0 ? `&to=${startAtBlock}${fromIndexParameter}` : "";
|
|
378
|
+
const optionalToParameter = endAtBlock !== void 0 ? `&from=${endAtBlock}${toIndexParameter}` : "";
|
|
379
|
+
return from(this.request(`addresses/${address}/transactions?count=${numberOfItems}&order=${order}${optionalFromParameter}${optionalToParameter}`)).pipe(map((addressTxHistory) => Ok(addressTxHistory.map((item) => ({
|
|
380
|
+
txId: Cardano.TransactionId(item.tx_hash),
|
|
381
|
+
txIndex: Cardano.TxIndex(item.tx_index),
|
|
382
|
+
blockNumber: Cardano.BlockNo(item.block_height),
|
|
383
|
+
blockTime: Timestamp(item.block_time * 1e3)
|
|
384
|
+
})))), catchError((error) => {
|
|
385
|
+
if (isNotFoundError(error)) return of(Ok([]));
|
|
386
|
+
return of(Err(error));
|
|
387
|
+
}));
|
|
388
|
+
}
|
|
389
|
+
/**
|
|
390
|
+
* Fetches transaction details, cbor and utxos to build a Cardano.HydratedTx
|
|
391
|
+
* which is returned inside a tuple together with the tx details which holds
|
|
392
|
+
* additional info not stored in the HydratedTx.
|
|
393
|
+
*
|
|
394
|
+
* @param txId - Cardano.TransactionId
|
|
395
|
+
*/
|
|
396
|
+
getTransactionDetails(txId) {
|
|
397
|
+
return forkJoin([
|
|
398
|
+
from(this.#txProvider.getTransaction(txId)),
|
|
399
|
+
this.#fetchTxFromCbor(txId),
|
|
400
|
+
this.#fetchUtxos(txId)
|
|
401
|
+
]).pipe(map(([txDetails, blockfrostTxCBOR, blockFrostUtxos]) => {
|
|
402
|
+
const { inputs, outputs, collaterals } = BlockfrostToCardanoSDK.transactionUtxos(blockFrostUtxos, blockfrostTxCBOR);
|
|
403
|
+
const inputSource = txDetails.valid_contract ? Cardano.InputSource.inputs : Cardano.InputSource.collaterals;
|
|
404
|
+
const body = {
|
|
405
|
+
...inputSource === Cardano.InputSource.collaterals ? {
|
|
406
|
+
collateralReturn: outputs.length > 0 ? outputs[0] : void 0,
|
|
407
|
+
collaterals: inputs,
|
|
408
|
+
fee: BigInt(0),
|
|
409
|
+
inputs: [],
|
|
410
|
+
outputs: [],
|
|
411
|
+
totalCollateral: blockfrostTxCBOR.body.fee
|
|
412
|
+
} : {
|
|
413
|
+
collateralReturn: blockfrostTxCBOR.body.collateralReturn ?? void 0,
|
|
414
|
+
collaterals,
|
|
415
|
+
fee: blockfrostTxCBOR.body.fee,
|
|
416
|
+
inputs,
|
|
417
|
+
outputs
|
|
418
|
+
},
|
|
419
|
+
certificates: blockfrostTxCBOR.body.certificates ?? [],
|
|
420
|
+
donation: blockfrostTxCBOR.body.donation,
|
|
421
|
+
mint: blockfrostTxCBOR.body.mint ? new Map([...blockfrostTxCBOR.body.mint].sort()) : void 0,
|
|
422
|
+
proposalProcedures: blockfrostTxCBOR.body.proposalProcedures,
|
|
423
|
+
validityInterval: blockfrostTxCBOR.body.validityInterval ? blockfrostTxCBOR.body.validityInterval : {
|
|
424
|
+
invalidBefore: void 0,
|
|
425
|
+
invalidHereafter: void 0
|
|
426
|
+
},
|
|
427
|
+
votingProcedures: blockfrostTxCBOR.body.votingProcedures,
|
|
428
|
+
withdrawals: blockfrostTxCBOR.body.withdrawals
|
|
429
|
+
};
|
|
430
|
+
return Ok({
|
|
431
|
+
auxiliaryData: blockfrostTxCBOR.auxiliaryData,
|
|
432
|
+
blockHeader: {
|
|
433
|
+
blockNo: Cardano.BlockNo(txDetails.block_height),
|
|
434
|
+
hash: Cardano.BlockId(txDetails.block),
|
|
435
|
+
slot: Cardano.Slot(txDetails.slot)
|
|
436
|
+
},
|
|
437
|
+
body,
|
|
438
|
+
id: txId,
|
|
439
|
+
index: txDetails.index,
|
|
440
|
+
inputSource,
|
|
441
|
+
txSize: 0,
|
|
442
|
+
witness: blockfrostTxCBOR.witness,
|
|
443
|
+
blockTime: txDetails.block_time
|
|
444
|
+
});
|
|
445
|
+
}), catchError((error) => of(Err(error))));
|
|
446
|
+
}
|
|
447
|
+
#fetchTxFromCbor(txId) {
|
|
448
|
+
return from(this.request(`txs/${txId}/cbor`)).pipe(map(({ cbor }) => Serialization.Transaction.fromCbor(Serialization.TxCBOR(cbor)).toCore()));
|
|
449
|
+
}
|
|
450
|
+
#fetchUtxos(txId) {
|
|
451
|
+
return from(this.request(`txs/${txId}/utxos`));
|
|
452
|
+
}
|
|
453
|
+
};
|
|
454
|
+
//#endregion
|
|
455
|
+
//#region ../../packages/lib/cardano-provider-core/src/provider/blockfrost-input-resolver-provider.ts
|
|
456
|
+
/**
|
|
457
|
+
* A resolver class to fetch and resolve transaction inputs using Blockfrost API.
|
|
458
|
+
*/
|
|
459
|
+
var BlockfrostInputResolverProvider = class extends BlockfrostProvider {
|
|
460
|
+
/**
|
|
461
|
+
* Constructs a new BlockfrostInputResolverProvider.
|
|
462
|
+
*
|
|
463
|
+
* @param client - The Blockfrost client instance to interact with the Blockfrost API.
|
|
464
|
+
* @param logger - The logger instance to log messages to.
|
|
465
|
+
*/
|
|
466
|
+
constructor(client, logger) {
|
|
467
|
+
super(client, logger);
|
|
468
|
+
}
|
|
469
|
+
/**
|
|
470
|
+
* Resolves a transaction input (`Cardano.TxIn`) to its corresponding output (`Cardano.TxOut`).
|
|
471
|
+
*
|
|
472
|
+
* @param input - The transaction input to resolve, including its transaction ID and index.
|
|
473
|
+
* @returns A promise that resolves to the corresponding `Cardano.TxOut` if found, or `null` if not.
|
|
474
|
+
*/
|
|
475
|
+
async resolveInput(input) {
|
|
476
|
+
this.logger.debug(`Resolving input ${input.txId}#${input.index}`);
|
|
477
|
+
const out = await this.fetchTxOut(input);
|
|
478
|
+
if (!out) return null;
|
|
479
|
+
return out;
|
|
480
|
+
}
|
|
481
|
+
/**
|
|
482
|
+
* Fetches and caches the transaction output (`Cardano.TxOut`) for a given transaction input (`Cardano.TxIn`).
|
|
483
|
+
*
|
|
484
|
+
* @param txIn - The transaction input to fetch and cache the output for.
|
|
485
|
+
* @returns A promise that resolves to the corresponding `Cardano.TxOut` if found, or `null` if not.
|
|
486
|
+
*/
|
|
487
|
+
async fetchTxOut(txIn) {
|
|
488
|
+
let response;
|
|
489
|
+
try {
|
|
490
|
+
response = await this.request(`txs/${txIn.txId}/utxos`);
|
|
491
|
+
} catch (error) {
|
|
492
|
+
this.logger.error(`Failed to fetch transaction ${txIn.txId}`, error);
|
|
493
|
+
if (isNotFoundError(error)) return null;
|
|
494
|
+
throw error;
|
|
495
|
+
}
|
|
496
|
+
for (const blockfrostUTxO of response.outputs) {
|
|
497
|
+
if (blockfrostUTxO.output_index !== txIn.index) continue;
|
|
498
|
+
const coreTxOut = BlockfrostToCardanoSDK.txOut(blockfrostUTxO);
|
|
499
|
+
this.logger.debug(`Resolved input ${txIn.txId}#${txIn.index} from Blockfrost`);
|
|
500
|
+
return coreTxOut;
|
|
501
|
+
}
|
|
502
|
+
this.logger.error(`Failed to resolve input ${txIn.txId}#${txIn.index}`);
|
|
503
|
+
return null;
|
|
504
|
+
}
|
|
505
|
+
};
|
|
506
|
+
//#endregion
|
|
507
|
+
//#region ../../packages/lib/cardano-provider-core/src/provider/blockfrost-stake-pool-provider.ts
|
|
508
|
+
var BlockfrostStakePoolProvider = class extends BlockfrostProvider {
|
|
509
|
+
constructor(client, logger) {
|
|
510
|
+
super(client, logger);
|
|
511
|
+
}
|
|
512
|
+
async getMetadata(poolId) {
|
|
513
|
+
try {
|
|
514
|
+
const metadata = await this.request(`pools/${poolId}/metadata`);
|
|
515
|
+
return Object.keys(metadata).length ? metadata : null;
|
|
516
|
+
} catch (error) {
|
|
517
|
+
if (error instanceof ProviderError$1) {
|
|
518
|
+
if (error.reason === ProviderFailure$1.NotFound) return null;
|
|
519
|
+
throw error;
|
|
520
|
+
}
|
|
521
|
+
throw toProviderError(error);
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
async getNetworkData() {
|
|
525
|
+
try {
|
|
526
|
+
const [genesis, params, network, retiring] = await Promise.all([
|
|
527
|
+
this.request("genesis"),
|
|
528
|
+
this.request("epochs/latest/parameters"),
|
|
529
|
+
this.request("network"),
|
|
530
|
+
this.paginatedRequests({
|
|
531
|
+
endpoint: "pools/retiring",
|
|
532
|
+
pageSize: 100
|
|
533
|
+
})
|
|
534
|
+
]);
|
|
535
|
+
return {
|
|
536
|
+
activeSlotsCoefficient: genesis.active_slots_coefficient,
|
|
537
|
+
desiredNumberOfPools: params.n_opt,
|
|
538
|
+
epochLength: genesis.epoch_length,
|
|
539
|
+
liveStake: Number(network.stake.live),
|
|
540
|
+
maxLovelaceSupply: Number(network.supply.max),
|
|
541
|
+
monetaryExpansion: params.rho,
|
|
542
|
+
poolInfluence: params.a0,
|
|
543
|
+
reserves: Number(network.supply.reserves),
|
|
544
|
+
retiringPools: retiring.map((pool) => pool.pool_id),
|
|
545
|
+
slotLength: genesis.slot_length,
|
|
546
|
+
timestamp: 0,
|
|
547
|
+
treasuryCut: params.tau
|
|
548
|
+
};
|
|
549
|
+
} catch (error) {
|
|
550
|
+
throw toProviderError(error);
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
async getStakePool(poolId) {
|
|
554
|
+
try {
|
|
555
|
+
return await this.request(`pools/${poolId}`);
|
|
556
|
+
} catch (error) {
|
|
557
|
+
if (error instanceof ProviderError$1) {
|
|
558
|
+
if (error.reason === ProviderFailure$1.NotFound) return null;
|
|
559
|
+
throw error;
|
|
560
|
+
}
|
|
561
|
+
throw toProviderError(error);
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
async getStakePools() {
|
|
565
|
+
try {
|
|
566
|
+
return await this.paginatedRequests({
|
|
567
|
+
endpoint: "pools/extended",
|
|
568
|
+
pageSize: 100
|
|
569
|
+
});
|
|
570
|
+
} catch (error) {
|
|
571
|
+
throw toProviderError(error);
|
|
572
|
+
}
|
|
573
|
+
}
|
|
574
|
+
};
|
|
575
|
+
//#endregion
|
|
576
|
+
//#region ../../packages/lib/cardano-provider-core/src/provider/blockfrost-rewards-provider.ts
|
|
577
|
+
/**
|
|
578
|
+
* Blockfrost returns 404 from the `accounts/*` endpoints for a stake address
|
|
579
|
+
* that has never appeared on-chain. That is a normal state for a fresh
|
|
580
|
+
* account, not an error: it means "never registered, nothing staked, no
|
|
581
|
+
* rewards".
|
|
582
|
+
*/
|
|
583
|
+
const NEVER_ACTIVE_REWARD_ACCOUNT_INFO = {
|
|
584
|
+
isActive: false,
|
|
585
|
+
isRegistered: false,
|
|
586
|
+
rewardsSum: BigNumber(0n),
|
|
587
|
+
withdrawableAmount: BigNumber(0n),
|
|
588
|
+
controlledAmount: BigNumber(0n)
|
|
589
|
+
};
|
|
590
|
+
var BlockfrostRewardsProvider = class extends BlockfrostProvider {
|
|
591
|
+
constructor(client, logger) {
|
|
592
|
+
super(client, logger);
|
|
593
|
+
}
|
|
594
|
+
/**
|
|
595
|
+
* Fetches the total rewards balance for a given reward account.
|
|
596
|
+
*
|
|
597
|
+
* @param rewardAccount - CardanoRewardAccount to fetch the balance for
|
|
598
|
+
* @param epochs - Optional range of epochs to filter the rewards
|
|
599
|
+
* @returns Observable with Result containing the rewards or an error
|
|
600
|
+
*/
|
|
601
|
+
getAccountRewards({ rewardAccount }) {
|
|
602
|
+
return defer(async () => this.paginatedRequests({
|
|
603
|
+
endpoint: `accounts/${rewardAccount}/rewards?order=desc`,
|
|
604
|
+
pageSize: 100
|
|
605
|
+
})).pipe(map((rewards) => Ok(rewards.map((reward) => ({
|
|
606
|
+
epoch: Cardano.EpochNo(reward.epoch),
|
|
607
|
+
rewards: BigNumber(BigInt(reward.amount)),
|
|
608
|
+
poolId: Cardano.PoolId(reward.pool_id)
|
|
609
|
+
})))), catchError((error) => {
|
|
610
|
+
if (isNotFoundError(error)) return of(Ok([]));
|
|
611
|
+
return of(Err(error));
|
|
612
|
+
}));
|
|
613
|
+
}
|
|
614
|
+
/**
|
|
615
|
+
* Fetches stake account information for a given reward account.
|
|
616
|
+
*
|
|
617
|
+
* @param rewardAccount - CardanoRewardAccount to fetch info for
|
|
618
|
+
* @returns Observable with Result containing RewardAccountInfo or an error
|
|
619
|
+
*/
|
|
620
|
+
getRewardAccountInfo({ rewardAccount }) {
|
|
621
|
+
return from(this.request(`accounts/${rewardAccount}`).then((account) => Ok({
|
|
622
|
+
isActive: account.active,
|
|
623
|
+
isRegistered: account.registered ?? account.active,
|
|
624
|
+
...account.pool_id && { poolId: Cardano.PoolId(account.pool_id) },
|
|
625
|
+
...account.drep_id && { drepId: account.drep_id },
|
|
626
|
+
rewardsSum: BigNumber(BigInt(account.rewards_sum)),
|
|
627
|
+
withdrawableAmount: BigNumber(BigInt(account.withdrawable_amount)),
|
|
628
|
+
controlledAmount: BigNumber(BigInt(account.controlled_amount))
|
|
629
|
+
})).catch((error) => {
|
|
630
|
+
if (isNotFoundError(error)) return Ok(NEVER_ACTIVE_REWARD_ACCOUNT_INFO);
|
|
631
|
+
return Err(error);
|
|
632
|
+
}));
|
|
633
|
+
}
|
|
634
|
+
};
|
|
635
|
+
//#endregion
|
|
636
|
+
//#region ../../packages/lib/cardano-provider-core/src/provider/blockfrost-delegations-provider.ts
|
|
637
|
+
var BlockfrostDelegationsProvider = class extends BlockfrostProvider {
|
|
638
|
+
constructor(client, logger) {
|
|
639
|
+
super(client, logger);
|
|
640
|
+
}
|
|
641
|
+
/**
|
|
642
|
+
* Fetches all delegation history for a given reward account.
|
|
643
|
+
*
|
|
644
|
+
* @param rewardAccount - CardanoRewardAccount to fetch the delegations for
|
|
645
|
+
* @returns Observable with Result containing all delegations or an error
|
|
646
|
+
*/
|
|
647
|
+
getAccountDelegations({ rewardAccount }) {
|
|
648
|
+
return from(this.paginatedRequests({
|
|
649
|
+
endpoint: `accounts/${rewardAccount}/delegations?order=desc`,
|
|
650
|
+
pageSize: 100
|
|
651
|
+
})).pipe(map((delegations) => Ok(delegations.map((delegation) => ({
|
|
652
|
+
activeEpoch: Cardano.EpochNo(delegation.active_epoch),
|
|
653
|
+
txHash: Cardano.TransactionId(delegation.tx_hash),
|
|
654
|
+
amount: BigNumber(BigInt(delegation.amount)),
|
|
655
|
+
poolId: Cardano.PoolId(delegation.pool_id)
|
|
656
|
+
})))), catchError((error) => of(Err(error))));
|
|
657
|
+
}
|
|
658
|
+
};
|
|
659
|
+
//#endregion
|
|
660
|
+
//#region ../../packages/lib/cardano-provider-core/src/provider/blockfrost-governance-provider.ts
|
|
661
|
+
const PAGE_SIZE = 100;
|
|
662
|
+
const jsonLdString = (value) => {
|
|
663
|
+
if (typeof value === "string") return value;
|
|
664
|
+
if (typeof value === "object" && value !== null && "@value" in value) {
|
|
665
|
+
const inner = value["@value"];
|
|
666
|
+
return typeof inner === "string" ? inner : void 0;
|
|
667
|
+
}
|
|
668
|
+
};
|
|
669
|
+
const getMetadataBody = (jsonMetadata) => {
|
|
670
|
+
if (typeof jsonMetadata !== "object" || jsonMetadata === null) return void 0;
|
|
671
|
+
const body = jsonMetadata.body;
|
|
672
|
+
if (typeof body !== "object" || body === null) return void 0;
|
|
673
|
+
return body;
|
|
674
|
+
};
|
|
675
|
+
const extractReferences = (references) => {
|
|
676
|
+
if (!Array.isArray(references)) return void 0;
|
|
677
|
+
const parsed = references.flatMap((reference) => {
|
|
678
|
+
if (typeof reference !== "object" || reference === null) return [];
|
|
679
|
+
const { uri, label } = reference;
|
|
680
|
+
const uriValue = jsonLdString(uri);
|
|
681
|
+
if (uriValue === void 0) return [];
|
|
682
|
+
const labelValue = jsonLdString(label);
|
|
683
|
+
return [{
|
|
684
|
+
uri: uriValue,
|
|
685
|
+
...labelValue !== void 0 && { label: labelValue }
|
|
686
|
+
}];
|
|
687
|
+
});
|
|
688
|
+
return parsed.length > 0 ? parsed : void 0;
|
|
689
|
+
};
|
|
690
|
+
const extractMetadata = (envelope, body) => {
|
|
691
|
+
const metadata = {};
|
|
692
|
+
if (typeof envelope?.url === "string") metadata.metadataUrl = envelope.url;
|
|
693
|
+
if (typeof envelope?.hash === "string") metadata.metadataHash = envelope.hash;
|
|
694
|
+
const assign = (key, value) => {
|
|
695
|
+
const parsed = jsonLdString(value);
|
|
696
|
+
if (parsed !== void 0) metadata[key] = parsed;
|
|
697
|
+
};
|
|
698
|
+
if (body) {
|
|
699
|
+
assign("imageUrl", (typeof body.image === "object" && body.image !== null ? body.image : void 0)?.contentUrl);
|
|
700
|
+
assign("bio", body.bio);
|
|
701
|
+
assign("email", body.email);
|
|
702
|
+
assign("objectives", body.objectives);
|
|
703
|
+
assign("motivations", body.motivations);
|
|
704
|
+
assign("qualifications", body.qualifications);
|
|
705
|
+
assign("paymentAddress", body.paymentAddress);
|
|
706
|
+
const references = extractReferences(body.references);
|
|
707
|
+
if (references) metadata.references = references;
|
|
708
|
+
}
|
|
709
|
+
return Object.keys(metadata).length > 0 ? metadata : void 0;
|
|
710
|
+
};
|
|
711
|
+
const toDRepSummary = (item) => {
|
|
712
|
+
const credential = {
|
|
713
|
+
hash: Hash28ByteBase16(item.hex.length === 58 ? item.hex.slice(2) : item.hex),
|
|
714
|
+
type: item.has_script ? Cardano.CredentialType.ScriptHash : Cardano.CredentialType.KeyHash
|
|
715
|
+
};
|
|
716
|
+
const body = getMetadataBody(item.metadata?.json_metadata);
|
|
717
|
+
return {
|
|
718
|
+
drepId: Cardano.DRepID(item.drep_id),
|
|
719
|
+
cip105DrepId: Cardano.DRepID.cip105FromCredential(credential),
|
|
720
|
+
hex: item.hex,
|
|
721
|
+
isActive: !item.retired && !item.expired,
|
|
722
|
+
retired: item.retired,
|
|
723
|
+
expired: item.expired,
|
|
724
|
+
amount: item.amount,
|
|
725
|
+
hasScript: item.has_script,
|
|
726
|
+
name: jsonLdString(body?.givenName),
|
|
727
|
+
metadata: extractMetadata(item.metadata, body)
|
|
728
|
+
};
|
|
729
|
+
};
|
|
730
|
+
var BlockfrostGovernanceProvider = class extends BlockfrostProvider {
|
|
731
|
+
constructor(client, logger) {
|
|
732
|
+
super(client, logger);
|
|
733
|
+
}
|
|
734
|
+
getDReps() {
|
|
735
|
+
const fetchPage = (page) => from(this.request(`governance/dreps?page=${page}&count=${PAGE_SIZE}`));
|
|
736
|
+
return fetchPage(1).pipe(expand((items, index) => items.length === PAGE_SIZE ? fetchPage(index + 2) : EMPTY), reduce((accumulated, items) => [...accumulated, ...items], []), map((all) => Ok(all.filter((d) => d.drep_id.startsWith("drep1")).map((item) => toDRepSummary(item)))), catchError((error) => of(Err(error))));
|
|
737
|
+
}
|
|
738
|
+
};
|
|
739
|
+
//#endregion
|
|
740
|
+
//#region ../../packages/lib/cardano-provider-core/src/provider/blockfrost-registrations-provider.ts
|
|
741
|
+
var BlockfrostRegistrationsProvider = class extends BlockfrostProvider {
|
|
742
|
+
constructor(client, logger) {
|
|
743
|
+
super(client, logger);
|
|
744
|
+
}
|
|
745
|
+
/**
|
|
746
|
+
* Fetches all registration history for a given reward account.
|
|
747
|
+
*
|
|
748
|
+
* @param rewardAccount - CardanoRewardAccount to fetch the registrations for
|
|
749
|
+
* @returns Observable with Result containing all registrations or an error
|
|
750
|
+
*/
|
|
751
|
+
getAccountRegistrations({ rewardAccount }) {
|
|
752
|
+
return from(this.paginatedRequests({
|
|
753
|
+
endpoint: `accounts/${rewardAccount}/registrations?order=desc`,
|
|
754
|
+
pageSize: 100
|
|
755
|
+
})).pipe(map((registrations) => Ok(registrations.map((registration) => ({
|
|
756
|
+
txHash: Cardano.TransactionId(registration.tx_hash),
|
|
757
|
+
action: registration.action
|
|
758
|
+
})))), catchError((error) => of(Err(error))));
|
|
759
|
+
}
|
|
760
|
+
};
|
|
761
|
+
//#endregion
|
|
762
|
+
//#region ../../packages/lib/cardano-provider-core/src/provider/blockfrost-withdrawals-provider.ts
|
|
763
|
+
var BlockfrostWithdrawalsProvider = class extends BlockfrostProvider {
|
|
764
|
+
constructor(client, logger) {
|
|
765
|
+
super(client, logger);
|
|
766
|
+
}
|
|
767
|
+
/**
|
|
768
|
+
* Fetches all withdrawal history for a given reward account.
|
|
769
|
+
*
|
|
770
|
+
* @param rewardAccount - CardanoRewardAccount to fetch the withdrawals for
|
|
771
|
+
* @returns Observable with Result containing all withdrawals or an error
|
|
772
|
+
*/
|
|
773
|
+
getAccountWithdrawals({ rewardAccount }) {
|
|
774
|
+
return from(this.paginatedRequests({
|
|
775
|
+
endpoint: `accounts/${rewardAccount}/withdrawals?order=desc`,
|
|
776
|
+
pageSize: 100
|
|
777
|
+
})).pipe(map((withdrawals) => Ok(withdrawals.map((withdrawal) => ({
|
|
778
|
+
txHash: Cardano.TransactionId(withdrawal.tx_hash),
|
|
779
|
+
amount: BigNumber(BigInt(withdrawal.amount))
|
|
780
|
+
})))), catchError((error) => of(Err(error))));
|
|
781
|
+
}
|
|
782
|
+
};
|
|
783
|
+
//#endregion
|
|
784
|
+
//#region ../../packages/lib/cardano-provider-core/src/provider/blockfrost-tx-evaluation-provider.ts
|
|
785
|
+
const REDEEMER_PURPOSE_BY_NAME = {
|
|
786
|
+
spend: Cardano.RedeemerPurpose.spend,
|
|
787
|
+
mint: Cardano.RedeemerPurpose.mint,
|
|
788
|
+
certificate: Cardano.RedeemerPurpose.certificate,
|
|
789
|
+
publish: Cardano.RedeemerPurpose.certificate,
|
|
790
|
+
withdrawal: Cardano.RedeemerPurpose.withdrawal,
|
|
791
|
+
withdraw: Cardano.RedeemerPurpose.withdrawal,
|
|
792
|
+
vote: Cardano.RedeemerPurpose.vote,
|
|
793
|
+
propose: Cardano.RedeemerPurpose.propose
|
|
794
|
+
};
|
|
795
|
+
const toExUnits = (budget) => {
|
|
796
|
+
if (typeof budget !== "object" || budget === null) return void 0;
|
|
797
|
+
const { memory, steps, cpu } = budget;
|
|
798
|
+
const stepsValue = typeof steps === "number" ? steps : typeof cpu === "number" ? cpu : void 0;
|
|
799
|
+
if (typeof memory !== "number" || stepsValue === void 0) return void 0;
|
|
800
|
+
return {
|
|
801
|
+
memory,
|
|
802
|
+
steps: stepsValue
|
|
803
|
+
};
|
|
804
|
+
};
|
|
805
|
+
/** `"<purpose>:<index>"` (v5) or a `{ purpose, index }` object (v6). */
|
|
806
|
+
const toRedeemerRef = (validator) => {
|
|
807
|
+
const { name, index } = typeof validator === "string" ? {
|
|
808
|
+
name: validator.split(":")[0],
|
|
809
|
+
index: Number(validator.split(":")[1] ?? "0")
|
|
810
|
+
} : {
|
|
811
|
+
name: validator?.purpose,
|
|
812
|
+
index: validator?.index ?? 0
|
|
813
|
+
};
|
|
814
|
+
const purpose = REDEEMER_PURPOSE_BY_NAME[name?.toLowerCase() ?? ""];
|
|
815
|
+
if (!purpose || !Number.isInteger(index)) return void 0;
|
|
816
|
+
return {
|
|
817
|
+
purpose,
|
|
818
|
+
index
|
|
819
|
+
};
|
|
820
|
+
};
|
|
821
|
+
const fromEvaluationResult = (evaluationResult) => Object.entries(evaluationResult).flatMap(([key, value]) => {
|
|
822
|
+
const ref = toRedeemerRef(key);
|
|
823
|
+
const budget = toExUnits(value);
|
|
824
|
+
return ref && budget ? [{
|
|
825
|
+
...ref,
|
|
826
|
+
budget
|
|
827
|
+
}] : [];
|
|
828
|
+
});
|
|
829
|
+
const fromEvaluationEntries = (entries) => entries.flatMap((entry) => {
|
|
830
|
+
const ref = toRedeemerRef(entry.validator);
|
|
831
|
+
const budget = toExUnits(entry.budget ?? entry.ex_units);
|
|
832
|
+
return ref && budget ? [{
|
|
833
|
+
...ref,
|
|
834
|
+
budget
|
|
835
|
+
}] : [];
|
|
836
|
+
});
|
|
837
|
+
/**
|
|
838
|
+
* An empty list only for a collection that was itself empty. A NON-EMPTY
|
|
839
|
+
* collection none of whose entries parsed is a dialect this parser does not
|
|
840
|
+
* know, not a transaction without redeemers — reporting it as `[]` would spend
|
|
841
|
+
* the contract's "no redeemers" answer on the drift this dual parser exists to
|
|
842
|
+
* surface.
|
|
843
|
+
*/
|
|
844
|
+
const parsedOrUnrecognised = (sourceCount, parsed) => sourceCount > 0 && parsed.length === 0 ? void 0 : parsed;
|
|
845
|
+
/**
|
|
846
|
+
* Both dialects, unwrapped from the optional `result` envelope. `undefined`
|
|
847
|
+
* distinguishes "this is not an evaluation" (a fault, an `EvaluationFailure`,
|
|
848
|
+
* an unknown shape, a known envelope carrying only unreadable entries) from a
|
|
849
|
+
* transaction that carries no redeemers, which legitimately evaluates to an
|
|
850
|
+
* empty list.
|
|
851
|
+
*/
|
|
852
|
+
const parseEvaluation = (data) => {
|
|
853
|
+
const body = typeof data === "object" && data !== null && "result" in data ? data.result : data;
|
|
854
|
+
if (Array.isArray(body)) {
|
|
855
|
+
const entries = body;
|
|
856
|
+
return parsedOrUnrecognised(entries.length, fromEvaluationEntries(entries));
|
|
857
|
+
}
|
|
858
|
+
if (typeof body === "object" && body !== null) {
|
|
859
|
+
const { EvaluationResult: evaluationResult } = body;
|
|
860
|
+
if (typeof evaluationResult === "object" && evaluationResult !== null) {
|
|
861
|
+
const result = evaluationResult;
|
|
862
|
+
return parsedOrUnrecognised(Object.keys(result).length, fromEvaluationResult(result));
|
|
863
|
+
}
|
|
864
|
+
}
|
|
865
|
+
};
|
|
866
|
+
/** Truncated so a multi-kilobyte script trace cannot flood the log or the error. */
|
|
867
|
+
const describeUnusableResponse = (data) => {
|
|
868
|
+
try {
|
|
869
|
+
return JSON.stringify(data)?.slice(0, 500) ?? "undefined";
|
|
870
|
+
} catch {
|
|
871
|
+
return String(data);
|
|
872
|
+
}
|
|
873
|
+
};
|
|
874
|
+
var BlockfrostTxEvaluationProvider = class extends BlockfrostProvider {
|
|
875
|
+
constructor(client, logger) {
|
|
876
|
+
super(client, logger);
|
|
877
|
+
}
|
|
878
|
+
/**
|
|
879
|
+
* Evaluate a transaction's per-redeemer execution units.
|
|
880
|
+
*
|
|
881
|
+
* @param tx - transaction CBOR (unsigned is fine)
|
|
882
|
+
* @returns Observable with the per-redeemer budgets, or an error when the
|
|
883
|
+
* network declined to evaluate (script failure, provider fault, HTTP error).
|
|
884
|
+
*/
|
|
885
|
+
evaluateTx({ tx }) {
|
|
886
|
+
return from(this.request("utils/txs/evaluate", {
|
|
887
|
+
body: tx,
|
|
888
|
+
headers: { "Content-Type": "application/cbor" },
|
|
889
|
+
method: "POST"
|
|
890
|
+
}).then((data) => {
|
|
891
|
+
const evaluated = parseEvaluation(data);
|
|
892
|
+
if (evaluated) return Ok(evaluated);
|
|
893
|
+
const detail = describeUnusableResponse(data);
|
|
894
|
+
this.logger.warn("evaluateTx: no evaluation in response", detail);
|
|
895
|
+
return Err(new ProviderError(ProviderFailure.InvalidResponse, void 0, detail));
|
|
896
|
+
}).catch((error) => Err(error)));
|
|
897
|
+
}
|
|
898
|
+
};
|
|
899
|
+
//#endregion
|
|
900
|
+
//#region ../../packages/lib/cardano-provider-core/src/util.ts
|
|
901
|
+
const serializeMetadatum = ((value, stringifyComposite = false) => {
|
|
902
|
+
if (typeof value === "string") return value;
|
|
903
|
+
if (typeof value === "bigint") return value.toString();
|
|
904
|
+
if (Array.isArray(value)) {
|
|
905
|
+
const serializedItems = value.map((item) => serializeMetadatum(item));
|
|
906
|
+
return stringifyComposite ? JSON.stringify(serializedItems) : serializedItems;
|
|
907
|
+
}
|
|
908
|
+
if (value instanceof Map) {
|
|
909
|
+
const serializedEntries = Object.fromEntries([...value.entries()].map(([key, nestedValue]) => [metadatumKeyToString(key), serializeMetadatum(nestedValue)]));
|
|
910
|
+
return stringifyComposite ? JSON.stringify(serializedEntries) : serializedEntries;
|
|
911
|
+
}
|
|
912
|
+
if (value instanceof Uint8Array) try {
|
|
913
|
+
return new TextDecoder("utf-8", { fatal: true }).decode(value);
|
|
914
|
+
} catch {
|
|
915
|
+
return `[Invalid UTF-8: ${value.length} bytes]`;
|
|
916
|
+
}
|
|
917
|
+
return String(value);
|
|
918
|
+
});
|
|
919
|
+
const metadatumKeyToString = (value) => serializeMetadatum(value, true);
|
|
920
|
+
const metadatumToSerializableValue = (value) => serializeMetadatum(value);
|
|
921
|
+
const mapToRecord = (map) => [...map?.entries() || []].map(([key, value]) => [key, metadatumToSerializableValue(value)]).reduce((result, [key, value]) => {
|
|
922
|
+
result[key] = value;
|
|
923
|
+
return result;
|
|
924
|
+
}, {});
|
|
925
|
+
const mergeDefinedProperties = (properties) => {
|
|
926
|
+
const definedProperties = properties.filter((property) => property[1] !== void 0);
|
|
927
|
+
if (definedProperties.length === 0) return;
|
|
928
|
+
return Object.fromEntries(definedProperties);
|
|
929
|
+
};
|
|
930
|
+
const toContractTokenMetadata = (assetInfo) => ({
|
|
931
|
+
blockchainSpecific: {
|
|
932
|
+
metadataSchemaVersion: 1,
|
|
933
|
+
updatedAt: Timestamp.now(),
|
|
934
|
+
policyId: assetInfo.policyId.toString(),
|
|
935
|
+
files: assetInfo.nftMetadata?.files?.map((file) => ({
|
|
936
|
+
mediaType: file.mediaType,
|
|
937
|
+
src: file.src,
|
|
938
|
+
name: file.name,
|
|
939
|
+
additionalProperties: mapToRecord(file.otherProperties)
|
|
940
|
+
}))
|
|
941
|
+
},
|
|
942
|
+
decimals: assetInfo.tokenMetadata?.decimals || 0,
|
|
943
|
+
additionalProperties: mergeDefinedProperties([["description", assetInfo.nftMetadata?.description], ...Object.entries(mapToRecord(assetInfo.nftMetadata?.otherProperties) ?? {})]),
|
|
944
|
+
image: assetInfo.nftMetadata?.image || assetInfo.tokenMetadata?.icon,
|
|
945
|
+
isNft: assetInfo.supply === 1n,
|
|
946
|
+
name: assetInfo.nftMetadata?.name || assetInfo.tokenMetadata?.name || assetInfo.fingerprint,
|
|
947
|
+
ticker: assetInfo.tokenMetadata?.ticker
|
|
948
|
+
});
|
|
949
|
+
/** Base lovelace metadata; ticker and image are set per-network in Blockfrost dependencies. */
|
|
950
|
+
const LOVELACE_METADATA = {
|
|
951
|
+
decimals: 6,
|
|
952
|
+
name: "Cardano",
|
|
953
|
+
ticker: "ADA",
|
|
954
|
+
blockchainSpecific: {
|
|
955
|
+
metadataSchemaVersion: 1,
|
|
956
|
+
updatedAt: Timestamp.now()
|
|
957
|
+
}
|
|
958
|
+
};
|
|
959
|
+
//#endregion
|
|
960
|
+
//#region ../../packages/lib/cardano-provider-core/src/blockfrost-config.ts
|
|
961
|
+
var import_lib = /* @__PURE__ */ __toESM(require_lib());
|
|
962
|
+
const computeBlockfrostConfigIdentifier = ({ clientConfig: { baseUrl, projectId } }) => `${baseUrl}-${projectId}`;
|
|
963
|
+
const getBlockfrostClient = memoize(({ clientConfig, rateLimiterConfig }) => {
|
|
964
|
+
const rateLimiter = new import_lib.default({
|
|
965
|
+
reservoir: rateLimiterConfig.size,
|
|
966
|
+
reservoirIncreaseAmount: rateLimiterConfig.increaseAmount,
|
|
967
|
+
reservoirIncreaseInterval: rateLimiterConfig.increaseInterval,
|
|
968
|
+
reservoirIncreaseMaximum: rateLimiterConfig.size
|
|
969
|
+
});
|
|
970
|
+
return new HttpClient({
|
|
971
|
+
baseUrl: buildUrl(["api", clientConfig.apiVersion], clientConfig.baseUrl),
|
|
972
|
+
requestInit: { headers: { ...clientConfig.projectId && { project_id: clientConfig.projectId } } }
|
|
973
|
+
}, { rateLimiter });
|
|
974
|
+
}, computeBlockfrostConfigIdentifier);
|
|
975
|
+
const Blockchains = {
|
|
976
|
+
Cardano: "data:image/png;base64,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",
|
|
977
|
+
Bitcoin: "data:image/png;base64,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"
|
|
978
|
+
};
|
|
979
|
+
//#endregion
|
|
980
|
+
//#region ../../packages/module/cardano-provider-blockfrost/src/store/dependencies.ts
|
|
981
|
+
const getNetworkInfoProvider = memoize((config, logger) => {
|
|
982
|
+
return new BlockfrostNetworkInfoProvider(getBlockfrostClient(config), logger);
|
|
983
|
+
}, computeBlockfrostConfigIdentifier);
|
|
984
|
+
const getAssetProvider = memoize((config, logger) => {
|
|
985
|
+
return new BlockfrostAssetProvider(getBlockfrostClient(config), logger);
|
|
986
|
+
}, computeBlockfrostConfigIdentifier);
|
|
987
|
+
const getAddressDiscoveryProvider = memoize((config, logger) => {
|
|
988
|
+
return new BlockfrostAddressDiscovery(getBlockfrostClient(config), logger);
|
|
989
|
+
}, computeBlockfrostConfigIdentifier);
|
|
990
|
+
const getInputResolverProvider = memoize((config, logger) => {
|
|
991
|
+
return new BlockfrostInputResolverProvider(getBlockfrostClient(config), logger);
|
|
992
|
+
}, computeBlockfrostConfigIdentifier);
|
|
993
|
+
const getTokensProvider = memoize((config, logger) => {
|
|
994
|
+
return new BlockfrostTokensProvider(getBlockfrostClient(config), logger);
|
|
995
|
+
}, computeBlockfrostConfigIdentifier);
|
|
996
|
+
const getAccountActivityProvider = memoize((config, logger) => {
|
|
997
|
+
return new BlockfrostActivityProvider(getBlockfrostClient(config), logger);
|
|
998
|
+
}, computeBlockfrostConfigIdentifier);
|
|
999
|
+
const getAccountRewardsProvider = memoize((config, logger) => {
|
|
1000
|
+
return new BlockfrostRewardsProvider(getBlockfrostClient(config), logger);
|
|
1001
|
+
}, computeBlockfrostConfigIdentifier);
|
|
1002
|
+
const getAccountDelegationsProvider = memoize((config, logger) => {
|
|
1003
|
+
return new BlockfrostDelegationsProvider(getBlockfrostClient(config), logger);
|
|
1004
|
+
}, computeBlockfrostConfigIdentifier);
|
|
1005
|
+
const getAccountRegistrationsProvider = memoize((config, logger) => {
|
|
1006
|
+
return new BlockfrostRegistrationsProvider(getBlockfrostClient(config), logger);
|
|
1007
|
+
}, computeBlockfrostConfigIdentifier);
|
|
1008
|
+
const getAccountWithdrawalsProvider = memoize((config, logger) => {
|
|
1009
|
+
return new BlockfrostWithdrawalsProvider(getBlockfrostClient(config), logger);
|
|
1010
|
+
}, computeBlockfrostConfigIdentifier);
|
|
1011
|
+
const getStakePoolProvider = memoize((config, logger) => {
|
|
1012
|
+
return new BlockfrostStakePoolProvider(getBlockfrostClient(config), logger);
|
|
1013
|
+
}, computeBlockfrostConfigIdentifier);
|
|
1014
|
+
const getUtxoProvider = memoize((config, logger) => {
|
|
1015
|
+
return new BlockfrostUtxoProvider(getBlockfrostClient(config), logger);
|
|
1016
|
+
}, computeBlockfrostConfigIdentifier);
|
|
1017
|
+
const getTxSubmitProvider = memoize((config, logger) => {
|
|
1018
|
+
return new BlockfrostTxSubmitProvider(getBlockfrostClient(config), logger);
|
|
1019
|
+
}, computeBlockfrostConfigIdentifier);
|
|
1020
|
+
const getTxEvaluationProvider = memoize((config, logger) => {
|
|
1021
|
+
return new BlockfrostTxEvaluationProvider(getBlockfrostClient(config), logger);
|
|
1022
|
+
}, computeBlockfrostConfigIdentifier);
|
|
1023
|
+
const getGovernanceProvider = memoize((config, logger) => {
|
|
1024
|
+
return new BlockfrostGovernanceProvider(getBlockfrostClient(config), logger);
|
|
1025
|
+
}, computeBlockfrostConfigIdentifier);
|
|
1026
|
+
const getBlockfrostConfig = (context, configs) => {
|
|
1027
|
+
const config = configs[context.chainId.networkMagic];
|
|
1028
|
+
if (!config) throw new Error(`Assertion failed: no blockfrost config found (${context.chainId.networkMagic}`);
|
|
1029
|
+
return config;
|
|
1030
|
+
};
|
|
1031
|
+
const initializeDependencies = async ({ runtime: { config: { cardanoProvider: { blockfrostConfigs } } }, loadModules }, { logger }) => {
|
|
1032
|
+
const bip32Ed25519 = (await loadModules("addons.bip32Ed25519"))[0];
|
|
1033
|
+
const dependencies = {
|
|
1034
|
+
blake2b: (await loadModules("addons.blake2b"))[0],
|
|
1035
|
+
bip32Ed25519
|
|
1036
|
+
};
|
|
1037
|
+
return {
|
|
1038
|
+
cardanoProvider: {
|
|
1039
|
+
getTip: (context) => {
|
|
1040
|
+
return from(getNetworkInfoProvider(getBlockfrostConfig(context, blockfrostConfigs), logger).ledgerTip().then(Ok).catch(Err));
|
|
1041
|
+
},
|
|
1042
|
+
getProtocolParameters: (context) => {
|
|
1043
|
+
const provider = getNetworkInfoProvider(getBlockfrostConfig(context, blockfrostConfigs), logger);
|
|
1044
|
+
return defer(async () => provider.protocolParameters().then(Ok).catch(Err));
|
|
1045
|
+
},
|
|
1046
|
+
getEraSummaries: (context) => {
|
|
1047
|
+
const provider = getNetworkInfoProvider(getBlockfrostConfig(context, blockfrostConfigs), logger);
|
|
1048
|
+
return defer(async () => provider.eraSummaries().then(Ok).catch(Err));
|
|
1049
|
+
},
|
|
1050
|
+
discoverAddresses: ({ xpub, accountIndex, thorough }, context) => {
|
|
1051
|
+
const provider = getAddressDiscoveryProvider(getBlockfrostConfig(context, blockfrostConfigs), logger);
|
|
1052
|
+
const account = new Bip32Account$1({
|
|
1053
|
+
extendedAccountPublicKey: xpub,
|
|
1054
|
+
chainId: context.chainId,
|
|
1055
|
+
accountIndex
|
|
1056
|
+
}, dependencies);
|
|
1057
|
+
return provider.discover(account, { thorough }).pipe(map((result) => result.map((address) => toContractAddress(address, context.chainId.networkMagic))));
|
|
1058
|
+
},
|
|
1059
|
+
getTokenMetadata: ({ tokenId }, context) => {
|
|
1060
|
+
if (tokenId === LOVELACE_TOKEN_ID) {
|
|
1061
|
+
const ticker = getAdaTokenTickerByNetwork(cardanoNetworkMagicToNetworkType(context.chainId.networkMagic));
|
|
1062
|
+
return of(Ok({
|
|
1063
|
+
...LOVELACE_METADATA,
|
|
1064
|
+
ticker,
|
|
1065
|
+
image: Blockchains.Cardano
|
|
1066
|
+
}));
|
|
1067
|
+
}
|
|
1068
|
+
const provider = getAssetProvider(getBlockfrostConfig(context, blockfrostConfigs), logger);
|
|
1069
|
+
const assetId = Cardano.AssetId(tokenId);
|
|
1070
|
+
return defer(async () => provider.getAsset({
|
|
1071
|
+
assetId,
|
|
1072
|
+
extraData: {
|
|
1073
|
+
nftMetadata: true,
|
|
1074
|
+
tokenMetadata: true
|
|
1075
|
+
}
|
|
1076
|
+
}).then((assetInfo) => Ok(toContractTokenMetadata(assetInfo))).catch(Err));
|
|
1077
|
+
},
|
|
1078
|
+
getTokens: (props, context) => {
|
|
1079
|
+
return getTokensProvider(getBlockfrostConfig(context, blockfrostConfigs), logger).getTokens(props);
|
|
1080
|
+
},
|
|
1081
|
+
getAccountRewards: (props, context) => {
|
|
1082
|
+
return getAccountRewardsProvider(getBlockfrostConfig(context, blockfrostConfigs), logger).getAccountRewards(props);
|
|
1083
|
+
},
|
|
1084
|
+
getAccountDelegations: (props, context) => {
|
|
1085
|
+
return getAccountDelegationsProvider(getBlockfrostConfig(context, blockfrostConfigs), logger).getAccountDelegations(props);
|
|
1086
|
+
},
|
|
1087
|
+
getAccountRegistrations: (props, context) => {
|
|
1088
|
+
return getAccountRegistrationsProvider(getBlockfrostConfig(context, blockfrostConfigs), logger).getAccountRegistrations(props);
|
|
1089
|
+
},
|
|
1090
|
+
getAccountWithdrawals: (props, context) => {
|
|
1091
|
+
return getAccountWithdrawalsProvider(getBlockfrostConfig(context, blockfrostConfigs), logger).getAccountWithdrawals(props);
|
|
1092
|
+
},
|
|
1093
|
+
getRewardAccountInfo: (props, context) => {
|
|
1094
|
+
return getAccountRewardsProvider(getBlockfrostConfig(context, blockfrostConfigs), logger).getRewardAccountInfo(props);
|
|
1095
|
+
},
|
|
1096
|
+
getAccountUtxos: (props, context) => {
|
|
1097
|
+
return getUtxoProvider(getBlockfrostConfig(context, blockfrostConfigs), logger).getAccountUtxos(props);
|
|
1098
|
+
},
|
|
1099
|
+
getUtxosAtAddress: (props, context) => {
|
|
1100
|
+
return getUtxoProvider(getBlockfrostConfig(context, blockfrostConfigs), logger).getUtxosAtAddress(props);
|
|
1101
|
+
},
|
|
1102
|
+
getAddressTransactionHistory: (props, context) => {
|
|
1103
|
+
return getAccountActivityProvider(getBlockfrostConfig(context, blockfrostConfigs), logger).getAddressTransactionHistory(props);
|
|
1104
|
+
},
|
|
1105
|
+
getTransactionDetails: (txId, context) => {
|
|
1106
|
+
return getAccountActivityProvider(getBlockfrostConfig(context, blockfrostConfigs), logger).getTransactionDetails(txId);
|
|
1107
|
+
},
|
|
1108
|
+
resolveInput: (txIn, context) => {
|
|
1109
|
+
const provider = getInputResolverProvider(getBlockfrostConfig(context, blockfrostConfigs), logger);
|
|
1110
|
+
return defer(async () => provider.resolveInput(txIn).then(Ok).catch(Err));
|
|
1111
|
+
},
|
|
1112
|
+
submitTx: (props, context) => {
|
|
1113
|
+
return from(getTxSubmitProvider(getBlockfrostConfig(context, blockfrostConfigs), logger).submitTx(props).then((id) => Ok(Cardano.TransactionId(id))).catch(Err));
|
|
1114
|
+
},
|
|
1115
|
+
evaluateTx: (props, context) => {
|
|
1116
|
+
return getTxEvaluationProvider(getBlockfrostConfig(context, blockfrostConfigs), logger).evaluateTx(props);
|
|
1117
|
+
},
|
|
1118
|
+
getDReps: (context) => {
|
|
1119
|
+
return getGovernanceProvider(getBlockfrostConfig(context, blockfrostConfigs), logger).getDReps();
|
|
1120
|
+
}
|
|
1121
|
+
},
|
|
1122
|
+
cardanoStakePoolsProvider: {
|
|
1123
|
+
getMetadata: (poolId, context) => {
|
|
1124
|
+
return from(getStakePoolProvider(getBlockfrostConfig(context, blockfrostConfigs), logger).getMetadata(poolId).then(Ok).catch(Err));
|
|
1125
|
+
},
|
|
1126
|
+
getNetworkData: (context) => {
|
|
1127
|
+
return from(getStakePoolProvider(getBlockfrostConfig(context, blockfrostConfigs), logger).getNetworkData().then(Ok).catch(Err));
|
|
1128
|
+
},
|
|
1129
|
+
getStakePool: (poolId, context) => {
|
|
1130
|
+
return from(getStakePoolProvider(getBlockfrostConfig(context, blockfrostConfigs), logger).getStakePool(poolId).then(Ok).catch(Err));
|
|
1131
|
+
},
|
|
1132
|
+
getStakePools: (context) => {
|
|
1133
|
+
return from(getStakePoolProvider(getBlockfrostConfig(context, blockfrostConfigs), logger).getStakePools().then(Ok).catch(Err));
|
|
1134
|
+
}
|
|
1135
|
+
}
|
|
1136
|
+
};
|
|
1137
|
+
};
|
|
1138
|
+
//#endregion
|
|
1139
|
+
//#region ../../packages/module/cardano-provider-blockfrost/src/store/init.ts
|
|
1140
|
+
const redux = async (props, dependencies) => ({ sideEffectDependencies: await initializeDependencies(props, dependencies) });
|
|
1141
|
+
//#endregion
|
|
1142
|
+
export { redux as default };
|