@laceio/sdk 0.1.1 → 0.1.2-canary.0
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-CCjOn7NA.cjs} +42 -0
- package/dist/{TransactionBuilder-V6aLx4SV.js → TransactionBuilder-CIzdw18M.js} +1 -1
- 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 +16956 -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-CCjiakoy.cjs} +6 -6
- package/dist/{delegation-tx-builder-CGVqlaFE.js → delegation-tx-builder-DZFjHDS8.js} +5 -5
- package/dist/{deregistration-tx-builder-B-CrUyX6.js → deregistration-tx-builder-Bf6xAYp4.js} +5 -5
- package/dist/{deregistration-tx-builder-DZGwB4cz.cjs → deregistration-tx-builder-CQP35yex.cjs} +6 -6
- 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-BDbTDZmD.js → earn-rewards-tx-builder-Bsga3yFb.js} +5 -5
- package/dist/{earn-rewards-tx-builder-D5sUT5v8.cjs → earn-rewards-tx-builder-GuxofYns.cjs} +6 -6
- 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 +86273 -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 +37496 -10033
- 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-8v_n8boO.js +1177 -0
- 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-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-CuW7rHNA.js +3584 -0
- package/dist/{init-CFYsq82V.js → init-CyAY4Lzl.js} +1 -1
- package/dist/init-Cz0rz5fU.cjs +3585 -0
- 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-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-DrRdf5sZ.cjs +1176 -0
- 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-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-B1nDUWqy.js +995 -0
- package/dist/modules-cardano-BYeYHrRm.cjs +1108 -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-BpEMSti4.cjs → vote-delegation-tx-builder-BUg1S2Ep.cjs} +6 -6
- package/dist/{vote-delegation-tx-builder-CmKv6GoG.js → vote-delegation-tx-builder-C6FiS7zI.js} +5 -5
- 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,720 @@
|
|
|
1
|
+
import { d as fail, f as ok, i as isLowerCaseHex, n as hexToBytes, o as SUPPORTED_CUSTODY_CONTRACT_VERSIONS, r as isHash28Hex, t as bytesToHex, u as findCustodyLogic } from "./hex-mkXcV3pN.js";
|
|
2
|
+
import { n as custodyGrantAssetId, t as CUSTODY_SLOT_LIMIT } from "./tokens-Diw4MLRM.js";
|
|
3
|
+
import { Cardano, Serialization } from "@laceio/cardano/core";
|
|
4
|
+
//#region ../../packages/lib/cardano-custody/src/codecs/plutus-data.ts
|
|
5
|
+
/** Raised inside the decoders only; `decodeResult` turns it into a result. */
|
|
6
|
+
var MalformedData = class extends Error {
|
|
7
|
+
constructor(path, expected) {
|
|
8
|
+
super(`Expected ${expected} at ${path || "the root"}`);
|
|
9
|
+
this.path = path;
|
|
10
|
+
this.expected = expected;
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
/** Runs a throwing decoder and reports a shape mismatch as a typed failure. */
|
|
14
|
+
const decodeResult = (decode) => {
|
|
15
|
+
try {
|
|
16
|
+
return ok(decode());
|
|
17
|
+
} catch (error) {
|
|
18
|
+
if (error instanceof MalformedData) return fail({
|
|
19
|
+
code: "malformed-data",
|
|
20
|
+
path: error.path,
|
|
21
|
+
expected: error.expected
|
|
22
|
+
});
|
|
23
|
+
throw error;
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
const fieldPath = (path, field) => `${path}.${field}`;
|
|
27
|
+
const itemPath = (path, index) => `${path}[${index}]`;
|
|
28
|
+
/**
|
|
29
|
+
* A fresh constructor value. Encoders always build new data, never reuse
|
|
30
|
+
* decoded data: the `cbor` cache on decoded values wins over any edit.
|
|
31
|
+
*/
|
|
32
|
+
const constr = (index, fields = []) => ({
|
|
33
|
+
constructor: BigInt(index),
|
|
34
|
+
fields: { items: fields }
|
|
35
|
+
});
|
|
36
|
+
const list = (items) => ({ items });
|
|
37
|
+
const bytes = (hex) => hexToBytes(hex);
|
|
38
|
+
/** The constructor index of a value that must be a constructor. */
|
|
39
|
+
const expectConstrIndex = (data, path, what) => {
|
|
40
|
+
if (!Cardano.util.isConstrPlutusData(data)) throw new MalformedData(path, `${what} as a constructor`);
|
|
41
|
+
return data.constructor;
|
|
42
|
+
};
|
|
43
|
+
/** The fields of a constructor with exactly the given index and arity. */
|
|
44
|
+
const expectConstr = (data, { index, arity }, { path, what }) => {
|
|
45
|
+
if (!Cardano.util.isConstrPlutusData(data) || data.constructor !== BigInt(index) || data.fields.items.length !== arity) throw new MalformedData(path, `${what} as constructor ${index} with ${arity} fields`);
|
|
46
|
+
return data.fields.items;
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* The fields of a constructor with the given index and at least `minArity`
|
|
50
|
+
* fields, for a reader that relies only on a stable leading prefix.
|
|
51
|
+
*/
|
|
52
|
+
const expectConstrPrefix = (data, { index, minArity }, { path, what }) => {
|
|
53
|
+
if (!Cardano.util.isConstrPlutusData(data) || data.constructor !== BigInt(index) || data.fields.items.length < minArity) throw new MalformedData(path, `${what} as constructor ${index} with at least ${minArity} fields`);
|
|
54
|
+
return data.fields.items;
|
|
55
|
+
};
|
|
56
|
+
const expectBytes = (data, path, what) => {
|
|
57
|
+
if (!Cardano.util.isPlutusBoundedBytes(data)) throw new MalformedData(path, `${what} as bytes`);
|
|
58
|
+
return bytesToHex(data);
|
|
59
|
+
};
|
|
60
|
+
const expectInt = (data, path, what) => {
|
|
61
|
+
if (!Cardano.util.isPlutusBigInt(data)) throw new MalformedData(path, `${what} as an integer`);
|
|
62
|
+
return data;
|
|
63
|
+
};
|
|
64
|
+
const expectList = (data, path, what) => {
|
|
65
|
+
if (!Cardano.util.isPlutusList(data)) throw new MalformedData(path, `${what} as a list`);
|
|
66
|
+
return data.items;
|
|
67
|
+
};
|
|
68
|
+
/** Refuses a constructor index no alternative of a union claims. */
|
|
69
|
+
const unknownAlternative = (path, what, index) => {
|
|
70
|
+
throw new MalformedData(path, `${what}, not constructor ${index}`);
|
|
71
|
+
};
|
|
72
|
+
//#endregion
|
|
73
|
+
//#region ../../packages/lib/cardano-custody/src/codecs/recipient.ts
|
|
74
|
+
const credentialFrom = (credential) => ({
|
|
75
|
+
type: credential.type,
|
|
76
|
+
hash: credential.hash
|
|
77
|
+
});
|
|
78
|
+
/**
|
|
79
|
+
* The recipient form of a Shelley payment address. Base, enterprise and
|
|
80
|
+
* pointer addresses have one; reward and Byron addresses do not.
|
|
81
|
+
*/
|
|
82
|
+
const custodyRecipientFromAddress = (address) => {
|
|
83
|
+
const base = address.asBase();
|
|
84
|
+
if (base) return ok({
|
|
85
|
+
paymentCredential: credentialFrom(base.getPaymentCredential()),
|
|
86
|
+
stakeCredential: {
|
|
87
|
+
kind: "inline",
|
|
88
|
+
credential: credentialFrom(base.getStakeCredential())
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
const enterprise = address.asEnterprise();
|
|
92
|
+
if (enterprise) return ok({ paymentCredential: credentialFrom(enterprise.getPaymentCredential()) });
|
|
93
|
+
const pointer = address.asPointer();
|
|
94
|
+
if (pointer) {
|
|
95
|
+
const { slot, txIndex, certIndex } = pointer.getStakePointer();
|
|
96
|
+
return ok({
|
|
97
|
+
paymentCredential: credentialFrom(pointer.getPaymentCredential()),
|
|
98
|
+
stakeCredential: {
|
|
99
|
+
kind: "pointer",
|
|
100
|
+
slot,
|
|
101
|
+
transactionIndex: BigInt(txIndex),
|
|
102
|
+
certificateIndex: BigInt(certIndex)
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
return fail({
|
|
107
|
+
code: "unsupported-recipient-address",
|
|
108
|
+
addressType: address.getType()
|
|
109
|
+
});
|
|
110
|
+
};
|
|
111
|
+
const isPointerIndex = (value) => value >= 0n && value <= BigInt(Number.MAX_SAFE_INTEGER);
|
|
112
|
+
/**
|
|
113
|
+
* Whether a recipient names an address Cardano can encode: 28-byte credential
|
|
114
|
+
* hashes and, for a pointer, non-negative indices that fit a pointer address.
|
|
115
|
+
*/
|
|
116
|
+
const isRepresentableRecipient = (recipient) => {
|
|
117
|
+
if (!isHash28Hex(recipient.paymentCredential.hash)) return false;
|
|
118
|
+
const stake = recipient.stakeCredential;
|
|
119
|
+
if (!stake) return true;
|
|
120
|
+
if (stake.kind === "inline") return isHash28Hex(stake.credential.hash);
|
|
121
|
+
return stake.slot >= 0n && isPointerIndex(stake.transactionIndex) && isPointerIndex(stake.certificateIndex);
|
|
122
|
+
};
|
|
123
|
+
const toCardanoCredential = (credential) => ({
|
|
124
|
+
type: credential.type,
|
|
125
|
+
hash: credential.hash
|
|
126
|
+
});
|
|
127
|
+
/** The address of a recipient the caller has checked is representable. */
|
|
128
|
+
const addressOfRepresentableRecipient = (recipient, networkId) => {
|
|
129
|
+
const payment = toCardanoCredential(recipient.paymentCredential);
|
|
130
|
+
const stake = recipient.stakeCredential;
|
|
131
|
+
if (!stake) return Cardano.EnterpriseAddress.fromCredentials(networkId, payment).toAddress();
|
|
132
|
+
if (stake.kind === "inline") return Cardano.BaseAddress.fromCredentials(networkId, payment, toCardanoCredential(stake.credential)).toAddress();
|
|
133
|
+
return new Cardano.Address({
|
|
134
|
+
type: payment.type === Cardano.CredentialType.ScriptHash ? Cardano.AddressType.PointerScript : Cardano.AddressType.PointerKey,
|
|
135
|
+
networkId,
|
|
136
|
+
paymentPart: payment,
|
|
137
|
+
pointer: {
|
|
138
|
+
slot: stake.slot,
|
|
139
|
+
txIndex: Cardano.TxIndex(Number(stake.transactionIndex)),
|
|
140
|
+
certIndex: Cardano.CertIndex(Number(stake.certificateIndex))
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
};
|
|
144
|
+
/** The address a recipient stands for on the given network. */
|
|
145
|
+
const custodyRecipientToAddress = (recipient, networkId) => isRepresentableRecipient(recipient) ? ok(addressOfRepresentableRecipient(recipient, networkId)) : fail({
|
|
146
|
+
code: "unrepresentable-recipient",
|
|
147
|
+
recipient
|
|
148
|
+
});
|
|
149
|
+
/** A value two recipients share exactly when their Plutus data is equal. */
|
|
150
|
+
const recipientKey = (recipient) => {
|
|
151
|
+
const credentialKey = ({ type, hash }) => `${type}:${hash}`;
|
|
152
|
+
const stake = recipient.stakeCredential;
|
|
153
|
+
const stakeKey = !stake ? "none" : stake.kind === "inline" ? `inline:${credentialKey(stake.credential)}` : `pointer:${stake.slot}:${stake.transactionIndex}:${stake.certificateIndex}`;
|
|
154
|
+
return `${credentialKey(recipient.paymentCredential)}/${stakeKey}`;
|
|
155
|
+
};
|
|
156
|
+
const CREDENTIAL_CONSTRUCTOR = {
|
|
157
|
+
[Cardano.CredentialType.KeyHash]: 0,
|
|
158
|
+
[Cardano.CredentialType.ScriptHash]: 1
|
|
159
|
+
};
|
|
160
|
+
const encodeCredential = (credential) => constr(CREDENTIAL_CONSTRUCTOR[credential.type], [bytes(credential.hash)]);
|
|
161
|
+
const decodeCredential = (data, path) => {
|
|
162
|
+
const index = expectConstrIndex(data, path, "a credential");
|
|
163
|
+
const type = index === 0n ? Cardano.CredentialType.KeyHash : index === 1n ? Cardano.CredentialType.ScriptHash : unknownAlternative(path, "a key or script credential", index);
|
|
164
|
+
const [hash] = expectConstr(data, {
|
|
165
|
+
index: Number(index),
|
|
166
|
+
arity: 1
|
|
167
|
+
}, {
|
|
168
|
+
path,
|
|
169
|
+
what: "a credential"
|
|
170
|
+
});
|
|
171
|
+
return {
|
|
172
|
+
type,
|
|
173
|
+
hash: expectBytes(hash, fieldPath(path, "hash"), "a hash")
|
|
174
|
+
};
|
|
175
|
+
};
|
|
176
|
+
const encodeStakeCredential = (stake) => stake.kind === "inline" ? constr(0, [encodeCredential(stake.credential)]) : constr(1, [
|
|
177
|
+
stake.slot,
|
|
178
|
+
stake.transactionIndex,
|
|
179
|
+
stake.certificateIndex
|
|
180
|
+
]);
|
|
181
|
+
const decodeStakeCredential = (data, path) => {
|
|
182
|
+
const index = expectConstrIndex(data, path, "a stake credential");
|
|
183
|
+
if (index === 0n) {
|
|
184
|
+
const [credential] = expectConstr(data, {
|
|
185
|
+
index: 0,
|
|
186
|
+
arity: 1
|
|
187
|
+
}, {
|
|
188
|
+
path,
|
|
189
|
+
what: "an inline stake credential"
|
|
190
|
+
});
|
|
191
|
+
return {
|
|
192
|
+
kind: "inline",
|
|
193
|
+
credential: decodeCredential(credential, fieldPath(path, "credential"))
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
if (index !== 1n) return unknownAlternative(path, "an inline or pointer stake credential", index);
|
|
197
|
+
const [slot, transactionIndex, certificateIndex] = expectConstr(data, {
|
|
198
|
+
index: 1,
|
|
199
|
+
arity: 3
|
|
200
|
+
}, {
|
|
201
|
+
path,
|
|
202
|
+
what: "a stake pointer"
|
|
203
|
+
});
|
|
204
|
+
return {
|
|
205
|
+
kind: "pointer",
|
|
206
|
+
slot: expectInt(slot, fieldPath(path, "slot"), "a slot"),
|
|
207
|
+
transactionIndex: expectInt(transactionIndex, fieldPath(path, "transactionIndex"), "a transaction index"),
|
|
208
|
+
certificateIndex: expectInt(certificateIndex, fieldPath(path, "certificateIndex"), "a certificate index")
|
|
209
|
+
};
|
|
210
|
+
};
|
|
211
|
+
/** `Address { payment_credential, stake_credential: Option<StakeCredential> }`. */
|
|
212
|
+
const encodeRecipient = (recipient) => constr(0, [encodeCredential(recipient.paymentCredential), recipient.stakeCredential ? constr(0, [encodeStakeCredential(recipient.stakeCredential)]) : constr(1)]);
|
|
213
|
+
const decodeRecipient = (data, path) => {
|
|
214
|
+
const [payment, optionalStake] = expectConstr(data, {
|
|
215
|
+
index: 0,
|
|
216
|
+
arity: 2
|
|
217
|
+
}, {
|
|
218
|
+
path,
|
|
219
|
+
what: "an address"
|
|
220
|
+
});
|
|
221
|
+
const paymentCredential = decodeCredential(payment, fieldPath(path, "paymentCredential"));
|
|
222
|
+
const stakePath = fieldPath(path, "stakeCredential");
|
|
223
|
+
const option = expectConstrIndex(optionalStake, stakePath, "an option");
|
|
224
|
+
if (option === 1n) {
|
|
225
|
+
expectConstr(optionalStake, {
|
|
226
|
+
index: 1,
|
|
227
|
+
arity: 0
|
|
228
|
+
}, {
|
|
229
|
+
path: stakePath,
|
|
230
|
+
what: "None"
|
|
231
|
+
});
|
|
232
|
+
return { paymentCredential };
|
|
233
|
+
}
|
|
234
|
+
if (option !== 0n) return unknownAlternative(stakePath, "Some or None", option);
|
|
235
|
+
const [stake] = expectConstr(optionalStake, {
|
|
236
|
+
index: 0,
|
|
237
|
+
arity: 1
|
|
238
|
+
}, {
|
|
239
|
+
path: stakePath,
|
|
240
|
+
what: "Some"
|
|
241
|
+
});
|
|
242
|
+
return {
|
|
243
|
+
paymentCredential,
|
|
244
|
+
stakeCredential: decodeStakeCredential(stake, stakePath)
|
|
245
|
+
};
|
|
246
|
+
};
|
|
247
|
+
//#endregion
|
|
248
|
+
//#region ../../packages/lib/cardano-custody/src/codecs/account-state.ts
|
|
249
|
+
const encodeAsset = (asset) => constr(0, [bytes(asset.policyId), bytes(asset.assetName)]);
|
|
250
|
+
const decodeAsset = (data, path) => {
|
|
251
|
+
const [policyId, assetName] = expectConstr(data, {
|
|
252
|
+
index: 0,
|
|
253
|
+
arity: 2
|
|
254
|
+
}, {
|
|
255
|
+
path,
|
|
256
|
+
what: "an asset"
|
|
257
|
+
});
|
|
258
|
+
return {
|
|
259
|
+
policyId: expectBytes(policyId, fieldPath(path, "policyId"), "a policy id"),
|
|
260
|
+
assetName: expectBytes(assetName, fieldPath(path, "assetName"), "an asset name")
|
|
261
|
+
};
|
|
262
|
+
};
|
|
263
|
+
/** Fields in declaration order: the lovelace per call cap precedes the lovelace cap. */
|
|
264
|
+
const encodeScope = (scope) => constr(0, [
|
|
265
|
+
encodeAsset(scope.asset),
|
|
266
|
+
scope.perCallCap,
|
|
267
|
+
scope.cap,
|
|
268
|
+
scope.lovelacePerCallCap,
|
|
269
|
+
scope.lovelaceCap,
|
|
270
|
+
scope.expiresAt,
|
|
271
|
+
list(scope.recipients.map(encodeRecipient))
|
|
272
|
+
]);
|
|
273
|
+
const decodeScope = (data, path) => {
|
|
274
|
+
const [asset, perCallCap, cap, lovelacePerCallCap, lovelaceCap, expiresAt, recipients] = expectConstr(data, {
|
|
275
|
+
index: 0,
|
|
276
|
+
arity: 7
|
|
277
|
+
}, {
|
|
278
|
+
path,
|
|
279
|
+
what: "a scope"
|
|
280
|
+
});
|
|
281
|
+
const recipientsPath = fieldPath(path, "recipients");
|
|
282
|
+
return {
|
|
283
|
+
asset: decodeAsset(asset, fieldPath(path, "asset")),
|
|
284
|
+
perCallCap: expectInt(perCallCap, fieldPath(path, "perCallCap"), "a per call cap"),
|
|
285
|
+
cap: expectInt(cap, fieldPath(path, "cap"), "a cap"),
|
|
286
|
+
lovelacePerCallCap: expectInt(lovelacePerCallCap, fieldPath(path, "lovelacePerCallCap"), "a lovelace per call cap"),
|
|
287
|
+
lovelaceCap: expectInt(lovelaceCap, fieldPath(path, "lovelaceCap"), "a lovelace cap"),
|
|
288
|
+
expiresAt: expectInt(expiresAt, fieldPath(path, "expiresAt"), "an expiry"),
|
|
289
|
+
recipients: expectList(recipients, recipientsPath, "recipients").map((recipient, index) => decodeRecipient(recipient, itemPath(recipientsPath, index)))
|
|
290
|
+
};
|
|
291
|
+
};
|
|
292
|
+
/**
|
|
293
|
+
* The inline datum of a grant UTxO. Always fresh Plutus data, like the state
|
|
294
|
+
* encoder. Throws `InvalidStringError` for a key hash, asset or credential
|
|
295
|
+
* hash that is not hex of whole bytes.
|
|
296
|
+
*/
|
|
297
|
+
const encodeCustodyGrant = (grant) => constr(0, [
|
|
298
|
+
grant.slot,
|
|
299
|
+
bytes(grant.grantee),
|
|
300
|
+
grant.generation,
|
|
301
|
+
encodeScope(grant.scope)
|
|
302
|
+
]);
|
|
303
|
+
/**
|
|
304
|
+
* The grant a grant UTxO datum carries. Accepts exactly the shapes the
|
|
305
|
+
* logic's soft cast accepts and applies no authoring rule;
|
|
306
|
+
* `findCustodyGrantViolations` marks what Lace would not author.
|
|
307
|
+
*/
|
|
308
|
+
const decodeCustodyGrant = (data) => decodeResult(() => {
|
|
309
|
+
const [slot, grantee, generation, scope] = expectConstr(data, {
|
|
310
|
+
index: 0,
|
|
311
|
+
arity: 4
|
|
312
|
+
}, {
|
|
313
|
+
path: "",
|
|
314
|
+
what: "a grant"
|
|
315
|
+
});
|
|
316
|
+
return {
|
|
317
|
+
slot: expectInt(slot, "slot", "a slot"),
|
|
318
|
+
grantee: expectBytes(grantee, "grantee", "a grantee key hash"),
|
|
319
|
+
generation: expectInt(generation, "generation", "a generation"),
|
|
320
|
+
scope: decodeScope(scope, "scope")
|
|
321
|
+
};
|
|
322
|
+
});
|
|
323
|
+
/**
|
|
324
|
+
* The control UTxO datum for a state. Always fresh Plutus data, so edits made
|
|
325
|
+
* to a decoded state are never masked by the original encoding.
|
|
326
|
+
*
|
|
327
|
+
* Throws `InvalidStringError` for a logic or device key hash that is not hex
|
|
328
|
+
* of whole bytes, instead of writing other bytes than the state holds. A
|
|
329
|
+
* decoded state, and a state `findCustodyStateViolations` accepts, always
|
|
330
|
+
* encode.
|
|
331
|
+
*/
|
|
332
|
+
const encodeCustodyAccountState = (state) => constr(0, [
|
|
333
|
+
bytes(state.logic),
|
|
334
|
+
list(state.devices.map((device) => bytes(device))),
|
|
335
|
+
state.grantGeneration,
|
|
336
|
+
state.nextSlot,
|
|
337
|
+
list([...state.revoked]),
|
|
338
|
+
state.outstanding
|
|
339
|
+
]);
|
|
340
|
+
const decodeLogic = (data) => expectBytes(data, "logic", "a logic hash");
|
|
341
|
+
const decodeDevices = (data) => expectList(data, "devices", "devices").map((device, index) => expectBytes(device, itemPath("devices", index), "a device key hash"));
|
|
342
|
+
/**
|
|
343
|
+
* The state a control UTxO datum carries. Accepts exactly the shapes the
|
|
344
|
+
* logic's soft cast accepts: canonical constructor indices and exact
|
|
345
|
+
* field counts. It applies no authoring rule, so an on-chain device with an
|
|
346
|
+
* ill-sized hash still decodes; `findCustodyStateViolations` marks it.
|
|
347
|
+
*/
|
|
348
|
+
const decodeCustodyAccountState = (data) => decodeResult(() => {
|
|
349
|
+
const [logic, devices, grantGeneration, nextSlot, revoked, outstanding] = expectConstr(data, {
|
|
350
|
+
index: 0,
|
|
351
|
+
arity: 6
|
|
352
|
+
}, {
|
|
353
|
+
path: "",
|
|
354
|
+
what: "an account state"
|
|
355
|
+
});
|
|
356
|
+
return {
|
|
357
|
+
logic: decodeLogic(logic),
|
|
358
|
+
devices: decodeDevices(devices),
|
|
359
|
+
grantGeneration: expectInt(grantGeneration, "grantGeneration", "a grant generation"),
|
|
360
|
+
nextSlot: expectInt(nextSlot, "nextSlot", "a next slot"),
|
|
361
|
+
revoked: expectList(revoked, "revoked", "revoked slots").map((slot, index) => expectInt(slot, itemPath("revoked", index), "a revoked slot")),
|
|
362
|
+
outstanding: expectInt(outstanding, "outstanding", "an outstanding count")
|
|
363
|
+
};
|
|
364
|
+
});
|
|
365
|
+
/**
|
|
366
|
+
* The logic hash a control UTxO datum names in its first field, whatever the
|
|
367
|
+
* field count, as the proxy reads it.
|
|
368
|
+
*/
|
|
369
|
+
const decodeCustodyStateLogic = (data) => decodeResult(() => {
|
|
370
|
+
const [logic] = expectConstrPrefix(data, {
|
|
371
|
+
index: 0,
|
|
372
|
+
minArity: 1
|
|
373
|
+
}, {
|
|
374
|
+
path: "",
|
|
375
|
+
what: "an account state"
|
|
376
|
+
});
|
|
377
|
+
return decodeLogic(logic);
|
|
378
|
+
});
|
|
379
|
+
/**
|
|
380
|
+
* The device key hashes of a control UTxO datum, read from its second field
|
|
381
|
+
* whatever the field count, as the stake script reads them. The devices are
|
|
382
|
+
* only as trustworthy as the logic that admitted them, so a reader first
|
|
383
|
+
* checks the logic `decodeCustodyStateLogic` names.
|
|
384
|
+
*/
|
|
385
|
+
const decodeCustodyStateDevices = (data) => decodeResult(() => {
|
|
386
|
+
const [, devices] = expectConstrPrefix(data, {
|
|
387
|
+
index: 0,
|
|
388
|
+
minArity: 2
|
|
389
|
+
}, {
|
|
390
|
+
path: "",
|
|
391
|
+
what: "an account state"
|
|
392
|
+
});
|
|
393
|
+
return decodeDevices(devices);
|
|
394
|
+
});
|
|
395
|
+
const MAX_ASSET_NAME_BYTES = 32;
|
|
396
|
+
const POLICY_ID_BYTES = 28;
|
|
397
|
+
const CUSTODY_LOVELACE_ASSET = {
|
|
398
|
+
policyId: "",
|
|
399
|
+
assetName: ""
|
|
400
|
+
};
|
|
401
|
+
const isCustodyLovelaceAsset = (asset) => asset.policyId === "" && asset.assetName === "";
|
|
402
|
+
const isPolicyIdWellFormed = (policyId) => policyId === "" || isLowerCaseHex(policyId, POLICY_ID_BYTES);
|
|
403
|
+
const isAssetNameWellFormed = ({ policyId, assetName }) => isLowerCaseHex(assetName) && assetName.length <= MAX_ASSET_NAME_BYTES * 2 && (policyId !== "" || assetName === "");
|
|
404
|
+
const CAP_FIELDS = [
|
|
405
|
+
"perCallCap",
|
|
406
|
+
"cap",
|
|
407
|
+
"lovelacePerCallCap",
|
|
408
|
+
"lovelaceCap"
|
|
409
|
+
];
|
|
410
|
+
/** Every rule a grant breaks, in field order; empty for an authorable grant. */
|
|
411
|
+
const findCustodyGrantViolations = (grant) => {
|
|
412
|
+
const { slot, scope } = grant;
|
|
413
|
+
const violations = [];
|
|
414
|
+
if (slot < 0n || slot >= CUSTODY_SLOT_LIMIT) violations.push({
|
|
415
|
+
code: "slot-out-of-range",
|
|
416
|
+
slot
|
|
417
|
+
});
|
|
418
|
+
if (!isHash28Hex(grant.grantee)) violations.push({
|
|
419
|
+
code: "invalid-grantee-key-hash",
|
|
420
|
+
slot
|
|
421
|
+
});
|
|
422
|
+
if (grant.generation < 0n) violations.push({
|
|
423
|
+
code: "negative-generation",
|
|
424
|
+
slot
|
|
425
|
+
});
|
|
426
|
+
if (!isPolicyIdWellFormed(scope.asset.policyId)) violations.push({
|
|
427
|
+
code: "invalid-policy-id",
|
|
428
|
+
slot
|
|
429
|
+
});
|
|
430
|
+
if (!isAssetNameWellFormed(scope.asset)) violations.push({
|
|
431
|
+
code: "invalid-asset-name",
|
|
432
|
+
slot
|
|
433
|
+
});
|
|
434
|
+
for (const field of CAP_FIELDS) if (scope[field] < 0n) violations.push({
|
|
435
|
+
code: "negative-cap",
|
|
436
|
+
field,
|
|
437
|
+
slot
|
|
438
|
+
});
|
|
439
|
+
if (isCustodyLovelaceAsset(scope.asset) && (scope.lovelacePerCallCap !== 0n || scope.lovelaceCap !== 0n)) violations.push({
|
|
440
|
+
code: "lovelace-grant-lovelace-caps",
|
|
441
|
+
slot
|
|
442
|
+
});
|
|
443
|
+
if (scope.expiresAt <= 0n) violations.push({
|
|
444
|
+
code: "non-positive-expiry",
|
|
445
|
+
slot
|
|
446
|
+
});
|
|
447
|
+
if (scope.recipients.length > 8) violations.push({
|
|
448
|
+
code: "recipient-count",
|
|
449
|
+
count: scope.recipients.length,
|
|
450
|
+
slot
|
|
451
|
+
});
|
|
452
|
+
const seenRecipients = /* @__PURE__ */ new Set();
|
|
453
|
+
for (const [recipientIndex, recipient] of scope.recipients.entries()) {
|
|
454
|
+
if (!isRepresentableRecipient(recipient)) violations.push({
|
|
455
|
+
code: "unrepresentable-recipient",
|
|
456
|
+
recipientIndex,
|
|
457
|
+
slot
|
|
458
|
+
});
|
|
459
|
+
const key = recipientKey(recipient);
|
|
460
|
+
if (seenRecipients.has(key)) violations.push({
|
|
461
|
+
code: "duplicate-recipient",
|
|
462
|
+
recipientIndex,
|
|
463
|
+
slot
|
|
464
|
+
});
|
|
465
|
+
seenRecipients.add(key);
|
|
466
|
+
}
|
|
467
|
+
return violations;
|
|
468
|
+
};
|
|
469
|
+
/**
|
|
470
|
+
* Every rule a control state breaks: the contract's well-formedness bounds
|
|
471
|
+
* plus a 28-byte logic hash and 28-byte device key hashes. Apply it to every
|
|
472
|
+
* state Lace builds or approves. An on-chain state may hold an ill-sized
|
|
473
|
+
* device, which can never sign; its violation names it so a device can
|
|
474
|
+
* remove it.
|
|
475
|
+
*/
|
|
476
|
+
const findCustodyStateViolations = (state) => {
|
|
477
|
+
const violations = [];
|
|
478
|
+
if (!isHash28Hex(state.logic)) violations.push({
|
|
479
|
+
code: "invalid-logic-hash",
|
|
480
|
+
logic: state.logic
|
|
481
|
+
});
|
|
482
|
+
const deviceCount = state.devices.length;
|
|
483
|
+
if (deviceCount < 1 || deviceCount > 8) violations.push({
|
|
484
|
+
code: "device-count",
|
|
485
|
+
count: deviceCount
|
|
486
|
+
});
|
|
487
|
+
const seenDevices = /* @__PURE__ */ new Set();
|
|
488
|
+
for (const [deviceIndex, device] of state.devices.entries()) {
|
|
489
|
+
if (!isHash28Hex(device)) violations.push({
|
|
490
|
+
code: "invalid-device-key-hash",
|
|
491
|
+
device,
|
|
492
|
+
deviceIndex
|
|
493
|
+
});
|
|
494
|
+
if (seenDevices.has(device)) violations.push({
|
|
495
|
+
code: "duplicate-device",
|
|
496
|
+
device,
|
|
497
|
+
deviceIndex
|
|
498
|
+
});
|
|
499
|
+
seenDevices.add(device);
|
|
500
|
+
}
|
|
501
|
+
if (state.grantGeneration < 0n) violations.push({ code: "negative-grant-generation" });
|
|
502
|
+
if (state.nextSlot < 0n) violations.push({ code: "negative-next-slot" });
|
|
503
|
+
if (state.outstanding < 0n) violations.push({ code: "negative-outstanding" });
|
|
504
|
+
if (state.outstanding > BigInt(16)) violations.push({
|
|
505
|
+
code: "outstanding-count",
|
|
506
|
+
count: state.outstanding
|
|
507
|
+
});
|
|
508
|
+
if (state.revoked.length > 32) violations.push({
|
|
509
|
+
code: "revoked-count",
|
|
510
|
+
count: state.revoked.length
|
|
511
|
+
});
|
|
512
|
+
return violations;
|
|
513
|
+
};
|
|
514
|
+
/**
|
|
515
|
+
* Whether a grant can no longer be used at `now` (POSIX milliseconds): a
|
|
516
|
+
* spend's upper validity bound must not pass `expiresAt`, so a grant is
|
|
517
|
+
* expired from the instant it names. A non-finite `now` is a broken clock,
|
|
518
|
+
* which can never show a grant as usable, so it counts as expired.
|
|
519
|
+
*/
|
|
520
|
+
const isCustodyGrantExpired = (grant, now) => !Number.isFinite(now) || grant.scope.expiresAt <= BigInt(Math.floor(now));
|
|
521
|
+
/**
|
|
522
|
+
* Whether a grant is current against a control state, as the contract
|
|
523
|
+
* judges a spend: issued under the state's generation and not revoked by
|
|
524
|
+
* slot. Expiry is the validity range's business.
|
|
525
|
+
*/
|
|
526
|
+
const isCustodyGrantCurrent = (grant, state) => grant.generation === state.grantGeneration && !state.revoked.includes(grant.slot);
|
|
527
|
+
//#endregion
|
|
528
|
+
//#region ../../packages/lib/cardano-custody/src/analysis/value.ts
|
|
529
|
+
/** Hex length of a policy id: every asset class on chain has a 28-byte one. */
|
|
530
|
+
const POLICY_ID_HEX_LENGTH = 56;
|
|
531
|
+
const valueDeltaOf = (value) => addValueDeltas([{
|
|
532
|
+
lovelace: value.coins,
|
|
533
|
+
assets: new Map([...value.assets ?? /* @__PURE__ */ new Map()].map(([assetId, quantity]) => [assetId.toLowerCase(), quantity]))
|
|
534
|
+
}]);
|
|
535
|
+
/** The sum of deltas, with zero token quantities dropped. */
|
|
536
|
+
const addValueDeltas = (deltas) => {
|
|
537
|
+
let lovelace = 0n;
|
|
538
|
+
const assets = /* @__PURE__ */ new Map();
|
|
539
|
+
for (const delta of deltas) {
|
|
540
|
+
lovelace += delta.lovelace;
|
|
541
|
+
for (const [assetId, quantity] of delta.assets) {
|
|
542
|
+
const sum = (assets.get(assetId) ?? 0n) + quantity;
|
|
543
|
+
if (sum === 0n) assets.delete(assetId);
|
|
544
|
+
else assets.set(assetId, sum);
|
|
545
|
+
}
|
|
546
|
+
}
|
|
547
|
+
return {
|
|
548
|
+
lovelace,
|
|
549
|
+
assets
|
|
550
|
+
};
|
|
551
|
+
};
|
|
552
|
+
const negateValueDelta = (delta) => ({
|
|
553
|
+
lovelace: -delta.lovelace,
|
|
554
|
+
assets: new Map([...delta.assets].map(([assetId, quantity]) => [assetId, -quantity]))
|
|
555
|
+
});
|
|
556
|
+
/** The policy id of an asset id. */
|
|
557
|
+
const policyIdOf = (assetId) => assetId.slice(0, POLICY_ID_HEX_LENGTH);
|
|
558
|
+
/** The asset name of an asset id, as hex. */
|
|
559
|
+
const assetNameOf = (assetId) => assetId.slice(POLICY_ID_HEX_LENGTH);
|
|
560
|
+
/**
|
|
561
|
+
* Whether an asset id names an asset class. Compared by parts, so an asset
|
|
562
|
+
* whose policy id is not 28 bytes, which no value can hold, matches nothing.
|
|
563
|
+
*/
|
|
564
|
+
const isAssetIdOf = (assetId, asset) => asset.policyId.length === POLICY_ID_HEX_LENGTH && policyIdOf(assetId) === asset.policyId && assetNameOf(assetId) === asset.assetName;
|
|
565
|
+
/** The quantity of one asset class: `assets.quantity_of` of the contract. */
|
|
566
|
+
const quantityOfAsset = (delta, asset) => {
|
|
567
|
+
if (isCustodyLovelaceAsset(asset)) return delta.lovelace;
|
|
568
|
+
for (const [assetId, quantity] of delta.assets) if (isAssetIdOf(assetId, asset)) return quantity;
|
|
569
|
+
return 0n;
|
|
570
|
+
};
|
|
571
|
+
//#endregion
|
|
572
|
+
//#region ../../packages/lib/cardano-custody/src/analysis/outputs.ts
|
|
573
|
+
const OTHER = { kind: "other" };
|
|
574
|
+
/** Hex length of a stake script hash: the state NFT name and the prefix of every grant token name. */
|
|
575
|
+
const STAKE_SCRIPT_HASH_HEX_LENGTH = 56;
|
|
576
|
+
const versionOfPayment = (credential) => credential.type === Cardano.CredentialType.ScriptHash ? SUPPORTED_CUSTODY_CONTRACT_VERSIONS.find((version) => version.accountValidatorHash === credential.hash) : void 0;
|
|
577
|
+
/**
|
|
578
|
+
* Whether a script hash is a logic in the catalogue of a supported contract
|
|
579
|
+
* version: one whose rules Lace has reviewed.
|
|
580
|
+
*/
|
|
581
|
+
const isKnownCustodyLogic = (scriptHash) => SUPPORTED_CUSTODY_CONTRACT_VERSIONS.some((version) => findCustodyLogic(version, scriptHash).ok);
|
|
582
|
+
/**
|
|
583
|
+
* Classifies an address on any network against every supported custody
|
|
584
|
+
* contract version. It reads the address only: `account` does not prove
|
|
585
|
+
* that the stake script is a custody stake script or that the account
|
|
586
|
+
* exists.
|
|
587
|
+
*/
|
|
588
|
+
const classifyCustodyAddress = (address) => {
|
|
589
|
+
const base = address.asBase();
|
|
590
|
+
const payment = (base ?? address.asEnterprise() ?? address.asPointer())?.getPaymentCredential();
|
|
591
|
+
const contractVersion = payment && versionOfPayment(payment);
|
|
592
|
+
if (!contractVersion) return OTHER;
|
|
593
|
+
const stake = base?.getStakeCredential();
|
|
594
|
+
return stake?.type === Cardano.CredentialType.ScriptHash ? {
|
|
595
|
+
kind: "account",
|
|
596
|
+
contractVersion,
|
|
597
|
+
stakeScriptHash: stake.hash
|
|
598
|
+
} : {
|
|
599
|
+
kind: "unspendable",
|
|
600
|
+
contractVersion
|
|
601
|
+
};
|
|
602
|
+
};
|
|
603
|
+
/** A key equal for two addresses exactly when their Plutus data is equal. */
|
|
604
|
+
const plutusAddressKeyOf = (address) => {
|
|
605
|
+
const recipient = custodyRecipientFromAddress(address);
|
|
606
|
+
return recipient.ok ? recipientKey(recipient.value) : void 0;
|
|
607
|
+
};
|
|
608
|
+
const accountPlutusAddressKey = ({ accountValidatorHash, stakeScriptHash }) => recipientKey({
|
|
609
|
+
paymentCredential: {
|
|
610
|
+
type: Cardano.CredentialType.ScriptHash,
|
|
611
|
+
hash: accountValidatorHash
|
|
612
|
+
},
|
|
613
|
+
stakeCredential: {
|
|
614
|
+
kind: "inline",
|
|
615
|
+
credential: {
|
|
616
|
+
type: Cardano.CredentialType.ScriptHash,
|
|
617
|
+
hash: stakeScriptHash
|
|
618
|
+
}
|
|
619
|
+
}
|
|
620
|
+
});
|
|
621
|
+
const stakeCredentialOf = ({ stakeScriptHash }) => ({
|
|
622
|
+
type: Cardano.CredentialType.ScriptHash,
|
|
623
|
+
hash: stakeScriptHash
|
|
624
|
+
});
|
|
625
|
+
const accountAddressOf = (account, networkId) => Cardano.BaseAddress.fromCredentials(networkId, {
|
|
626
|
+
type: Cardano.CredentialType.ScriptHash,
|
|
627
|
+
hash: account.accountValidatorHash
|
|
628
|
+
}, stakeCredentialOf(account)).toAddress().toBech32();
|
|
629
|
+
const accountRewardAccountOf = (account, networkId) => Cardano.RewardAccount.fromCredential(stakeCredentialOf(account), networkId);
|
|
630
|
+
const stateNftAssetIdOf = ({ accountValidatorHash, stakeScriptHash }) => `${accountValidatorHash}${stakeScriptHash}`;
|
|
631
|
+
/**
|
|
632
|
+
* The asset id of the account's grant token for `slot`, or undefined for a
|
|
633
|
+
* slot no grant token name can carry, which the validator cannot name either.
|
|
634
|
+
*/
|
|
635
|
+
const grantAssetIdOf = (account, slot) => slot >= 0n && slot < CUSTODY_SLOT_LIMIT ? custodyGrantAssetId(account, slot) : void 0;
|
|
636
|
+
/**
|
|
637
|
+
* The output's datum as the script context sees it. A resolution that
|
|
638
|
+
* carries both an inline datum and its hash, as some providers report an
|
|
639
|
+
* inline datum, keeps the inline datum.
|
|
640
|
+
*/
|
|
641
|
+
const datumOf = (txOut) => {
|
|
642
|
+
if (txOut.datum !== void 0) return {
|
|
643
|
+
datumKind: "inline",
|
|
644
|
+
inlineDatum: txOut.datum
|
|
645
|
+
};
|
|
646
|
+
return {
|
|
647
|
+
datumKind: txOut.datumHash === void 0 ? "none" : "hash",
|
|
648
|
+
inlineDatum: void 0
|
|
649
|
+
};
|
|
650
|
+
};
|
|
651
|
+
const viewOfOutput = (txOut) => {
|
|
652
|
+
const address = Cardano.Address.fromString(txOut.address) ?? void 0;
|
|
653
|
+
return {
|
|
654
|
+
txOut,
|
|
655
|
+
address,
|
|
656
|
+
addressClass: address ? classifyCustodyAddress(address) : OTHER,
|
|
657
|
+
plutusAddressKey: address && plutusAddressKeyOf(address),
|
|
658
|
+
value: valueDeltaOf(txOut.value),
|
|
659
|
+
...datumOf(txOut),
|
|
660
|
+
hasReferenceScript: txOut.scriptReference !== void 0,
|
|
661
|
+
referenceScriptHash: txOut.scriptReference && Serialization.Script.fromCore(txOut.scriptReference).hash()
|
|
662
|
+
};
|
|
663
|
+
};
|
|
664
|
+
/** The account state an output carries as its inline datum, if it decodes. */
|
|
665
|
+
const decodedInlineState = (view) => {
|
|
666
|
+
if (view.inlineDatum === void 0) return void 0;
|
|
667
|
+
const decoded = decodeCustodyAccountState(view.inlineDatum);
|
|
668
|
+
return decoded.ok ? decoded.value : void 0;
|
|
669
|
+
};
|
|
670
|
+
/** The grant an output carries as its inline datum, if it decodes. */
|
|
671
|
+
const decodedInlineGrant = (view) => {
|
|
672
|
+
if (view.inlineDatum === void 0) return void 0;
|
|
673
|
+
const decoded = decodeCustodyGrant(view.inlineDatum);
|
|
674
|
+
return decoded.ok ? decoded.value : void 0;
|
|
675
|
+
};
|
|
676
|
+
/** Whether the output sits at the account address, compared as Plutus data. */
|
|
677
|
+
const isAtAccount = (view, account) => view.plutusAddressKey !== void 0 && view.plutusAddressKey === accountPlutusAddressKey(account);
|
|
678
|
+
/** `holds_state_nft`: exactly one of the account's state NFT. */
|
|
679
|
+
const holdsStateNft = (value, account) => value.assets.get(stateNftAssetIdOf(account)) === 1n;
|
|
680
|
+
/** `holds_only_lovelace_and_state_nft`: the state NFT and no other token. */
|
|
681
|
+
const holdsOnlyLovelaceAndStateNft = (value, account) => value.assets.size === 1 && holdsStateNft(value, account);
|
|
682
|
+
/** `holds_only_lovelace_and_grant_token`: one grant token of `slot` and no other token. */
|
|
683
|
+
const holdsOnlyLovelaceAndGrantToken = (value, account, slot) => {
|
|
684
|
+
const assetId = grantAssetIdOf(account, slot);
|
|
685
|
+
return assetId !== void 0 && value.assets.size === 1 && value.assets.get(assetId) === 1n;
|
|
686
|
+
};
|
|
687
|
+
/** `holds_no_account_token`: no token under the account validator policy, of any account. */
|
|
688
|
+
const holdsNoAccountToken = (value, accountValidatorHash) => ![...value.assets.keys()].some((assetId) => policyIdOf(assetId) === accountValidatorHash);
|
|
689
|
+
/** Whether a value holds a token of the account: its state NFT or one of its grant tokens. */
|
|
690
|
+
const holdsOwnAccountToken = (value, { accountValidatorHash, stakeScriptHash }) => [...value.assets.keys()].some((assetId) => policyIdOf(assetId) === accountValidatorHash && assetNameOf(assetId).startsWith(stakeScriptHash));
|
|
691
|
+
/** `holds_account_token`: at the account address, holding one of its account tokens. */
|
|
692
|
+
const holdsAccountToken = (view, account) => isAtAccount(view, account) && holdsOwnAccountToken(view.value, account);
|
|
693
|
+
/** `is_control_output`: at the account address, holding its state NFT. */
|
|
694
|
+
const isControlOutput = (view, account) => isAtAccount(view, account) && holdsStateNft(view.value, account);
|
|
695
|
+
/**
|
|
696
|
+
* Which kind of account UTxO an output at the account address is: the
|
|
697
|
+
* control UTxO holds the state NFT, a grant UTxO another token of the
|
|
698
|
+
* account, a reserve no account token and a datum, a fund neither.
|
|
699
|
+
*/
|
|
700
|
+
const accountUtxoKindOf = (view, account) => {
|
|
701
|
+
if (holdsStateNft(view.value, account)) return "control";
|
|
702
|
+
if (holdsOwnAccountToken(view.value, account)) return "grant";
|
|
703
|
+
return view.datumKind === "none" ? "fund" : "reserve";
|
|
704
|
+
};
|
|
705
|
+
/**
|
|
706
|
+
* Whether an output breaks `tokens_sit_at_their_own_addresses` for one of
|
|
707
|
+
* the account validators: every token under an account validator policy
|
|
708
|
+
* must be a single one at the account address its name's first 28 bytes
|
|
709
|
+
* name.
|
|
710
|
+
*/
|
|
711
|
+
const holdsMisplacedAccountToken = (view, accountValidatorHashes) => [...view.value.assets].some(([assetId, quantity]) => {
|
|
712
|
+
const accountValidatorHash = policyIdOf(assetId);
|
|
713
|
+
if (!accountValidatorHashes.includes(accountValidatorHash)) return false;
|
|
714
|
+
return quantity !== 1n || !isAtAccount(view, {
|
|
715
|
+
accountValidatorHash,
|
|
716
|
+
stakeScriptHash: assetNameOf(assetId).slice(0, STAKE_SCRIPT_HASH_HEX_LENGTH)
|
|
717
|
+
});
|
|
718
|
+
});
|
|
719
|
+
//#endregion
|
|
720
|
+
export { isCustodyLovelaceAsset as A, recipientKey as B, policyIdOf as C, findCustodyStateViolations as D, findCustodyGrantViolations as E, encodeCustodyAccountState as F, unknownAlternative as G, decodeResult as H, encodeCustodyGrant as I, addressOfRepresentableRecipient as L, decodeCustodyGrant as M, decodeCustodyStateDevices as N, isCustodyGrantCurrent as O, decodeCustodyStateLogic as P, custodyRecipientFromAddress as R, negateValueDelta as S, CUSTODY_LOVELACE_ASSET as T, expectConstr as U, constr as V, expectConstrIndex as W, stateNftAssetIdOf as _, classifyCustodyAddress as a, assetNameOf as b, grantAssetIdOf as c, holdsNoAccountToken as d, holdsOnlyLovelaceAndGrantToken as f, isKnownCustodyLogic as g, isControlOutput as h, accountUtxoKindOf as i, decodeCustodyAccountState as j, isCustodyGrantExpired as k, holdsAccountToken as l, isAtAccount as m, accountPlutusAddressKey as n, decodedInlineGrant as o, holdsOnlyLovelaceAndStateNft as p, accountRewardAccountOf as r, decodedInlineState as s, accountAddressOf as t, holdsMisplacedAccountToken as u, viewOfOutput as v, quantityOfAsset as w, isAssetIdOf as x, addValueDeltas as y, custodyRecipientToAddress as z };
|