xrpjson 0.1.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/LICENSE +21 -0
- package/README.md +183 -0
- package/dist/errors.d.ts +20 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +27 -0
- package/dist/errors.js.map +1 -0
- package/dist/fp/factories/account-delete.d.ts +33 -0
- package/dist/fp/factories/account-delete.d.ts.map +1 -0
- package/dist/fp/factories/account-delete.js +138 -0
- package/dist/fp/factories/account-delete.js.map +1 -0
- package/dist/fp/factories/account-set.d.ts +31 -0
- package/dist/fp/factories/account-set.d.ts.map +1 -0
- package/dist/fp/factories/account-set.js +44 -0
- package/dist/fp/factories/account-set.js.map +1 -0
- package/dist/fp/factories/amm-bid.d.ts +134 -0
- package/dist/fp/factories/amm-bid.d.ts.map +1 -0
- package/dist/fp/factories/amm-bid.js +82 -0
- package/dist/fp/factories/amm-bid.js.map +1 -0
- package/dist/fp/factories/amm-clawback.d.ts +166 -0
- package/dist/fp/factories/amm-clawback.d.ts.map +1 -0
- package/dist/fp/factories/amm-clawback.js +143 -0
- package/dist/fp/factories/amm-clawback.js.map +1 -0
- package/dist/fp/factories/amm-create.d.ts +91 -0
- package/dist/fp/factories/amm-create.d.ts.map +1 -0
- package/dist/fp/factories/amm-create.js +140 -0
- package/dist/fp/factories/amm-create.js.map +1 -0
- package/dist/fp/factories/amm-delete.d.ts +84 -0
- package/dist/fp/factories/amm-delete.d.ts.map +1 -0
- package/dist/fp/factories/amm-delete.js +36 -0
- package/dist/fp/factories/amm-delete.js.map +1 -0
- package/dist/fp/factories/amm-deposit.d.ts +109 -0
- package/dist/fp/factories/amm-deposit.d.ts.map +1 -0
- package/dist/fp/factories/amm-deposit.js +68 -0
- package/dist/fp/factories/amm-deposit.js.map +1 -0
- package/dist/fp/factories/amm-vote.d.ts +87 -0
- package/dist/fp/factories/amm-vote.d.ts.map +1 -0
- package/dist/fp/factories/amm-vote.js +53 -0
- package/dist/fp/factories/amm-vote.js.map +1 -0
- package/dist/fp/factories/amm-withdraw.d.ts +131 -0
- package/dist/fp/factories/amm-withdraw.d.ts.map +1 -0
- package/dist/fp/factories/amm-withdraw.js +147 -0
- package/dist/fp/factories/amm-withdraw.js.map +1 -0
- package/dist/fp/factories/batch.d.ts +133 -0
- package/dist/fp/factories/batch.d.ts.map +1 -0
- package/dist/fp/factories/batch.js +264 -0
- package/dist/fp/factories/batch.js.map +1 -0
- package/dist/fp/factories/check-cancel.d.ts +22 -0
- package/dist/fp/factories/check-cancel.d.ts.map +1 -0
- package/dist/fp/factories/check-cancel.js +119 -0
- package/dist/fp/factories/check-cancel.js.map +1 -0
- package/dist/fp/factories/check-cash.d.ts +84 -0
- package/dist/fp/factories/check-cash.d.ts.map +1 -0
- package/dist/fp/factories/check-cash.js +95 -0
- package/dist/fp/factories/check-cash.js.map +1 -0
- package/dist/fp/factories/check-create.d.ts +82 -0
- package/dist/fp/factories/check-create.d.ts.map +1 -0
- package/dist/fp/factories/check-create.js +101 -0
- package/dist/fp/factories/check-create.js.map +1 -0
- package/dist/fp/factories/clawback.d.ts +160 -0
- package/dist/fp/factories/clawback.d.ts.map +1 -0
- package/dist/fp/factories/clawback.js +111 -0
- package/dist/fp/factories/clawback.js.map +1 -0
- package/dist/fp/factories/confidential-mpt-clawback.d.ts +24 -0
- package/dist/fp/factories/confidential-mpt-clawback.d.ts.map +1 -0
- package/dist/fp/factories/confidential-mpt-clawback.js +200 -0
- package/dist/fp/factories/confidential-mpt-clawback.js.map +1 -0
- package/dist/fp/factories/confidential-mpt-convert-back.d.ts +32 -0
- package/dist/fp/factories/confidential-mpt-convert-back.d.ts.map +1 -0
- package/dist/fp/factories/confidential-mpt-convert-back.js +203 -0
- package/dist/fp/factories/confidential-mpt-convert-back.js.map +1 -0
- package/dist/fp/factories/confidential-mpt-convert.d.ts +32 -0
- package/dist/fp/factories/confidential-mpt-convert.d.ts.map +1 -0
- package/dist/fp/factories/confidential-mpt-convert.js +209 -0
- package/dist/fp/factories/confidential-mpt-convert.js.map +1 -0
- package/dist/fp/factories/confidential-mpt-merge-inbox.d.ts +18 -0
- package/dist/fp/factories/confidential-mpt-merge-inbox.d.ts.map +1 -0
- package/dist/fp/factories/confidential-mpt-merge-inbox.js +130 -0
- package/dist/fp/factories/confidential-mpt-merge-inbox.js.map +1 -0
- package/dist/fp/factories/confidential-mpt-send.d.ts +38 -0
- package/dist/fp/factories/confidential-mpt-send.d.ts.map +1 -0
- package/dist/fp/factories/confidential-mpt-send.js +254 -0
- package/dist/fp/factories/confidential-mpt-send.js.map +1 -0
- package/dist/fp/factories/credential-accept.d.ts +23 -0
- package/dist/fp/factories/credential-accept.d.ts.map +1 -0
- package/dist/fp/factories/credential-accept.js +135 -0
- package/dist/fp/factories/credential-accept.js.map +1 -0
- package/dist/fp/factories/credential-create.d.ts +24 -0
- package/dist/fp/factories/credential-create.d.ts.map +1 -0
- package/dist/fp/factories/credential-create.js +204 -0
- package/dist/fp/factories/credential-create.js.map +1 -0
- package/dist/fp/factories/credential-delete.d.ts +33 -0
- package/dist/fp/factories/credential-delete.d.ts.map +1 -0
- package/dist/fp/factories/credential-delete.js +167 -0
- package/dist/fp/factories/credential-delete.js.map +1 -0
- package/dist/fp/factories/delegate-set.d.ts +52 -0
- package/dist/fp/factories/delegate-set.d.ts.map +1 -0
- package/dist/fp/factories/delegate-set.js +190 -0
- package/dist/fp/factories/delegate-set.js.map +1 -0
- package/dist/fp/factories/deposit-preauth.d.ts +183 -0
- package/dist/fp/factories/deposit-preauth.d.ts.map +1 -0
- package/dist/fp/factories/deposit-preauth.js +159 -0
- package/dist/fp/factories/deposit-preauth.js.map +1 -0
- package/dist/fp/factories/did-delete.d.ts +22 -0
- package/dist/fp/factories/did-delete.d.ts.map +1 -0
- package/dist/fp/factories/did-delete.js +126 -0
- package/dist/fp/factories/did-delete.js.map +1 -0
- package/dist/fp/factories/did-set.d.ts +68 -0
- package/dist/fp/factories/did-set.d.ts.map +1 -0
- package/dist/fp/factories/did-set.js +178 -0
- package/dist/fp/factories/did-set.js.map +1 -0
- package/dist/fp/factories/escrow-cancel.d.ts +28 -0
- package/dist/fp/factories/escrow-cancel.d.ts.map +1 -0
- package/dist/fp/factories/escrow-cancel.js +127 -0
- package/dist/fp/factories/escrow-cancel.js.map +1 -0
- package/dist/fp/factories/escrow-create.d.ts +103 -0
- package/dist/fp/factories/escrow-create.d.ts.map +1 -0
- package/dist/fp/factories/escrow-create.js +133 -0
- package/dist/fp/factories/escrow-create.js.map +1 -0
- package/dist/fp/factories/escrow-finish.d.ts +39 -0
- package/dist/fp/factories/escrow-finish.d.ts.map +1 -0
- package/dist/fp/factories/escrow-finish.js +173 -0
- package/dist/fp/factories/escrow-finish.js.map +1 -0
- package/dist/fp/factories/ledger-state-fix.d.ts +31 -0
- package/dist/fp/factories/ledger-state-fix.d.ts.map +1 -0
- package/dist/fp/factories/ledger-state-fix.js +163 -0
- package/dist/fp/factories/ledger-state-fix.js.map +1 -0
- package/dist/fp/factories/loan-broker-cover-clawback.d.ts +106 -0
- package/dist/fp/factories/loan-broker-cover-clawback.d.ts.map +1 -0
- package/dist/fp/factories/loan-broker-cover-clawback.js +122 -0
- package/dist/fp/factories/loan-broker-cover-clawback.js.map +1 -0
- package/dist/fp/factories/loan-broker-cover-deposit.d.ts +65 -0
- package/dist/fp/factories/loan-broker-cover-deposit.d.ts.map +1 -0
- package/dist/fp/factories/loan-broker-cover-deposit.js +81 -0
- package/dist/fp/factories/loan-broker-cover-deposit.js.map +1 -0
- package/dist/fp/factories/loan-broker-cover-withdraw.d.ts +96 -0
- package/dist/fp/factories/loan-broker-cover-withdraw.d.ts.map +1 -0
- package/dist/fp/factories/loan-broker-cover-withdraw.js +116 -0
- package/dist/fp/factories/loan-broker-cover-withdraw.js.map +1 -0
- package/dist/fp/factories/loan-broker-delete.d.ts +20 -0
- package/dist/fp/factories/loan-broker-delete.d.ts.map +1 -0
- package/dist/fp/factories/loan-broker-delete.js +94 -0
- package/dist/fp/factories/loan-broker-delete.js.map +1 -0
- package/dist/fp/factories/loan-broker-set.d.ts +108 -0
- package/dist/fp/factories/loan-broker-set.d.ts.map +1 -0
- package/dist/fp/factories/loan-broker-set.js +133 -0
- package/dist/fp/factories/loan-broker-set.js.map +1 -0
- package/dist/fp/factories/loan-delete.d.ts +18 -0
- package/dist/fp/factories/loan-delete.d.ts.map +1 -0
- package/dist/fp/factories/loan-delete.js +95 -0
- package/dist/fp/factories/loan-delete.js.map +1 -0
- package/dist/fp/factories/loan-manage.d.ts +72 -0
- package/dist/fp/factories/loan-manage.d.ts.map +1 -0
- package/dist/fp/factories/loan-manage.js +79 -0
- package/dist/fp/factories/loan-manage.js.map +1 -0
- package/dist/fp/factories/loan-pay.d.ts +70 -0
- package/dist/fp/factories/loan-pay.d.ts.map +1 -0
- package/dist/fp/factories/loan-pay.js +115 -0
- package/dist/fp/factories/loan-pay.js.map +1 -0
- package/dist/fp/factories/loan-set.d.ts +67 -0
- package/dist/fp/factories/loan-set.d.ts.map +1 -0
- package/dist/fp/factories/loan-set.js +102 -0
- package/dist/fp/factories/loan-set.js.map +1 -0
- package/dist/fp/factories/mptoken-authorize.d.ts +83 -0
- package/dist/fp/factories/mptoken-authorize.d.ts.map +1 -0
- package/dist/fp/factories/mptoken-authorize.js +63 -0
- package/dist/fp/factories/mptoken-authorize.js.map +1 -0
- package/dist/fp/factories/mptoken-issuance-create.d.ts +71 -0
- package/dist/fp/factories/mptoken-issuance-create.d.ts.map +1 -0
- package/dist/fp/factories/mptoken-issuance-create.js +135 -0
- package/dist/fp/factories/mptoken-issuance-create.js.map +1 -0
- package/dist/fp/factories/mptoken-issuance-destroy.d.ts +32 -0
- package/dist/fp/factories/mptoken-issuance-destroy.d.ts.map +1 -0
- package/dist/fp/factories/mptoken-issuance-destroy.js +105 -0
- package/dist/fp/factories/mptoken-issuance-destroy.js.map +1 -0
- package/dist/fp/factories/mptoken-issuance-set.d.ts +196 -0
- package/dist/fp/factories/mptoken-issuance-set.d.ts.map +1 -0
- package/dist/fp/factories/mptoken-issuance-set.js +333 -0
- package/dist/fp/factories/mptoken-issuance-set.js.map +1 -0
- package/dist/fp/factories/nftoken-accept-offer.d.ts +108 -0
- package/dist/fp/factories/nftoken-accept-offer.d.ts.map +1 -0
- package/dist/fp/factories/nftoken-accept-offer.js +105 -0
- package/dist/fp/factories/nftoken-accept-offer.js.map +1 -0
- package/dist/fp/factories/nftoken-burn.d.ts +27 -0
- package/dist/fp/factories/nftoken-burn.d.ts.map +1 -0
- package/dist/fp/factories/nftoken-burn.js +125 -0
- package/dist/fp/factories/nftoken-burn.js.map +1 -0
- package/dist/fp/factories/nftoken-cancel-offer.d.ts +19 -0
- package/dist/fp/factories/nftoken-cancel-offer.d.ts.map +1 -0
- package/dist/fp/factories/nftoken-cancel-offer.js +143 -0
- package/dist/fp/factories/nftoken-cancel-offer.js.map +1 -0
- package/dist/fp/factories/nftoken-create-offer.d.ts +159 -0
- package/dist/fp/factories/nftoken-create-offer.d.ts.map +1 -0
- package/dist/fp/factories/nftoken-create-offer.js +212 -0
- package/dist/fp/factories/nftoken-create-offer.js.map +1 -0
- package/dist/fp/factories/nftoken-mint.d.ts +155 -0
- package/dist/fp/factories/nftoken-mint.d.ts.map +1 -0
- package/dist/fp/factories/nftoken-mint.js +165 -0
- package/dist/fp/factories/nftoken-mint.js.map +1 -0
- package/dist/fp/factories/nftoken-modify.d.ts +28 -0
- package/dist/fp/factories/nftoken-modify.d.ts.map +1 -0
- package/dist/fp/factories/nftoken-modify.js +209 -0
- package/dist/fp/factories/nftoken-modify.js.map +1 -0
- package/dist/fp/factories/offer-cancel.d.ts +21 -0
- package/dist/fp/factories/offer-cancel.d.ts.map +1 -0
- package/dist/fp/factories/offer-cancel.js +99 -0
- package/dist/fp/factories/offer-cancel.js.map +1 -0
- package/dist/fp/factories/offer-create.d.ts +125 -0
- package/dist/fp/factories/offer-create.d.ts.map +1 -0
- package/dist/fp/factories/offer-create.js +230 -0
- package/dist/fp/factories/offer-create.js.map +1 -0
- package/dist/fp/factories/oracle-delete.d.ts +21 -0
- package/dist/fp/factories/oracle-delete.d.ts.map +1 -0
- package/dist/fp/factories/oracle-delete.js +101 -0
- package/dist/fp/factories/oracle-delete.js.map +1 -0
- package/dist/fp/factories/oracle-set.d.ts +40 -0
- package/dist/fp/factories/oracle-set.d.ts.map +1 -0
- package/dist/fp/factories/oracle-set.js +257 -0
- package/dist/fp/factories/oracle-set.js.map +1 -0
- package/dist/fp/factories/payment-channel-claim.d.ts +153 -0
- package/dist/fp/factories/payment-channel-claim.d.ts.map +1 -0
- package/dist/fp/factories/payment-channel-claim.js +118 -0
- package/dist/fp/factories/payment-channel-claim.js.map +1 -0
- package/dist/fp/factories/payment-channel-create.d.ts +30 -0
- package/dist/fp/factories/payment-channel-create.d.ts.map +1 -0
- package/dist/fp/factories/payment-channel-create.js +172 -0
- package/dist/fp/factories/payment-channel-create.js.map +1 -0
- package/dist/fp/factories/payment-channel-fund.d.ts +25 -0
- package/dist/fp/factories/payment-channel-fund.d.ts.map +1 -0
- package/dist/fp/factories/payment-channel-fund.js +142 -0
- package/dist/fp/factories/payment-channel-fund.js.map +1 -0
- package/dist/fp/factories/payment.d.ts +65 -0
- package/dist/fp/factories/payment.d.ts.map +1 -0
- package/dist/fp/factories/payment.js +48 -0
- package/dist/fp/factories/payment.js.map +1 -0
- package/dist/fp/factories/permissioned-domain-delete.d.ts +18 -0
- package/dist/fp/factories/permissioned-domain-delete.d.ts.map +1 -0
- package/dist/fp/factories/permissioned-domain-delete.js +88 -0
- package/dist/fp/factories/permissioned-domain-delete.js.map +1 -0
- package/dist/fp/factories/permissioned-domain-set.d.ts +118 -0
- package/dist/fp/factories/permissioned-domain-set.d.ts.map +1 -0
- package/dist/fp/factories/permissioned-domain-set.js +100 -0
- package/dist/fp/factories/permissioned-domain-set.js.map +1 -0
- package/dist/fp/factories/set-regular-key.d.ts +30 -0
- package/dist/fp/factories/set-regular-key.d.ts.map +1 -0
- package/dist/fp/factories/set-regular-key.js +81 -0
- package/dist/fp/factories/set-regular-key.js.map +1 -0
- package/dist/fp/factories/signer-list-set.d.ts +61 -0
- package/dist/fp/factories/signer-list-set.d.ts.map +1 -0
- package/dist/fp/factories/signer-list-set.js +250 -0
- package/dist/fp/factories/signer-list-set.js.map +1 -0
- package/dist/fp/factories/sponsorship-set.d.ts +148 -0
- package/dist/fp/factories/sponsorship-set.d.ts.map +1 -0
- package/dist/fp/factories/sponsorship-set.js +201 -0
- package/dist/fp/factories/sponsorship-set.js.map +1 -0
- package/dist/fp/factories/sponsorship-transfer.d.ts +173 -0
- package/dist/fp/factories/sponsorship-transfer.d.ts.map +1 -0
- package/dist/fp/factories/sponsorship-transfer.js +195 -0
- package/dist/fp/factories/sponsorship-transfer.js.map +1 -0
- package/dist/fp/factories/ticket-create.d.ts +20 -0
- package/dist/fp/factories/ticket-create.d.ts.map +1 -0
- package/dist/fp/factories/ticket-create.js +120 -0
- package/dist/fp/factories/ticket-create.js.map +1 -0
- package/dist/fp/factories/trust-set.d.ts +100 -0
- package/dist/fp/factories/trust-set.d.ts.map +1 -0
- package/dist/fp/factories/trust-set.js +111 -0
- package/dist/fp/factories/trust-set.js.map +1 -0
- package/dist/fp/factories/vault-clawback.d.ts +83 -0
- package/dist/fp/factories/vault-clawback.d.ts.map +1 -0
- package/dist/fp/factories/vault-clawback.js +91 -0
- package/dist/fp/factories/vault-clawback.js.map +1 -0
- package/dist/fp/factories/vault-create.d.ts +51 -0
- package/dist/fp/factories/vault-create.d.ts.map +1 -0
- package/dist/fp/factories/vault-create.js +141 -0
- package/dist/fp/factories/vault-create.js.map +1 -0
- package/dist/fp/factories/vault-delete.d.ts +20 -0
- package/dist/fp/factories/vault-delete.d.ts.map +1 -0
- package/dist/fp/factories/vault-delete.js +103 -0
- package/dist/fp/factories/vault-delete.js.map +1 -0
- package/dist/fp/factories/vault-deposit.d.ts +56 -0
- package/dist/fp/factories/vault-deposit.d.ts.map +1 -0
- package/dist/fp/factories/vault-deposit.js +85 -0
- package/dist/fp/factories/vault-deposit.js.map +1 -0
- package/dist/fp/factories/vault-set.d.ts +32 -0
- package/dist/fp/factories/vault-set.d.ts.map +1 -0
- package/dist/fp/factories/vault-set.js +135 -0
- package/dist/fp/factories/vault-set.js.map +1 -0
- package/dist/fp/factories/vault-withdraw.d.ts +82 -0
- package/dist/fp/factories/vault-withdraw.d.ts.map +1 -0
- package/dist/fp/factories/vault-withdraw.js +122 -0
- package/dist/fp/factories/vault-withdraw.js.map +1 -0
- package/dist/fp/factories/xchain-account-create-commit.d.ts +180 -0
- package/dist/fp/factories/xchain-account-create-commit.d.ts.map +1 -0
- package/dist/fp/factories/xchain-account-create-commit.js +99 -0
- package/dist/fp/factories/xchain-account-create-commit.js.map +1 -0
- package/dist/fp/factories/xchain-add-account-create-attestation.d.ts +213 -0
- package/dist/fp/factories/xchain-add-account-create-attestation.d.ts.map +1 -0
- package/dist/fp/factories/xchain-add-account-create-attestation.js +95 -0
- package/dist/fp/factories/xchain-add-account-create-attestation.js.map +1 -0
- package/dist/fp/factories/xchain-add-claim-attestation.d.ts +206 -0
- package/dist/fp/factories/xchain-add-claim-attestation.d.ts.map +1 -0
- package/dist/fp/factories/xchain-add-claim-attestation.js +97 -0
- package/dist/fp/factories/xchain-add-claim-attestation.js.map +1 -0
- package/dist/fp/factories/xchain-claim.d.ts +187 -0
- package/dist/fp/factories/xchain-claim.d.ts.map +1 -0
- package/dist/fp/factories/xchain-claim.js +140 -0
- package/dist/fp/factories/xchain-claim.js.map +1 -0
- package/dist/fp/factories/xchain-commit.d.ts +168 -0
- package/dist/fp/factories/xchain-commit.d.ts.map +1 -0
- package/dist/fp/factories/xchain-commit.js +137 -0
- package/dist/fp/factories/xchain-commit.js.map +1 -0
- package/dist/fp/factories/xchain-create-bridge.d.ts +206 -0
- package/dist/fp/factories/xchain-create-bridge.d.ts.map +1 -0
- package/dist/fp/factories/xchain-create-bridge.js +100 -0
- package/dist/fp/factories/xchain-create-bridge.js.map +1 -0
- package/dist/fp/factories/xchain-create-claim-id.d.ts +199 -0
- package/dist/fp/factories/xchain-create-claim-id.d.ts.map +1 -0
- package/dist/fp/factories/xchain-create-claim-id.js +78 -0
- package/dist/fp/factories/xchain-create-claim-id.js.map +1 -0
- package/dist/fp/factories/xchain-modify-bridge.d.ts +198 -0
- package/dist/fp/factories/xchain-modify-bridge.d.ts.map +1 -0
- package/dist/fp/factories/xchain-modify-bridge.js +102 -0
- package/dist/fp/factories/xchain-modify-bridge.js.map +1 -0
- package/dist/fp/index.d.ts +124 -0
- package/dist/fp/index.d.ts.map +1 -0
- package/dist/fp/index.js +152 -0
- package/dist/fp/index.js.map +1 -0
- package/dist/fp/shape.d.ts +34 -0
- package/dist/fp/shape.d.ts.map +1 -0
- package/dist/fp/shape.js +80 -0
- package/dist/fp/shape.js.map +1 -0
- package/dist/types/amounts.d.ts +49 -0
- package/dist/types/amounts.d.ts.map +1 -0
- package/dist/types/amounts.js +8 -0
- package/dist/types/amounts.js.map +1 -0
- package/dist/types/base.d.ts +103 -0
- package/dist/types/base.d.ts.map +1 -0
- package/dist/types/base.js +2 -0
- package/dist/types/base.js.map +1 -0
- package/dist/types/common.d.ts +163 -0
- package/dist/types/common.d.ts.map +1 -0
- package/dist/types/common.js +5 -0
- package/dist/types/common.js.map +1 -0
- package/dist/types/flags.d.ts +317 -0
- package/dist/types/flags.d.ts.map +1 -0
- package/dist/types/flags.js +253 -0
- package/dist/types/flags.js.map +1 -0
- package/dist/types/index.d.ts +10 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/transaction-types.d.ts +7 -0
- package/dist/types/transaction-types.d.ts.map +1 -0
- package/dist/types/transaction-types.js +2 -0
- package/dist/types/transaction-types.js.map +1 -0
- package/dist/validation/base.d.ts +8 -0
- package/dist/validation/base.d.ts.map +1 -0
- package/dist/validation/base.js +79 -0
- package/dist/validation/base.js.map +1 -0
- package/dist/validation/helpers.d.ts +42 -0
- package/dist/validation/helpers.d.ts.map +1 -0
- package/dist/validation/helpers.js +154 -0
- package/dist/validation/helpers.js.map +1 -0
- package/dist/validation/index.d.ts +3 -0
- package/dist/validation/index.d.ts.map +1 -0
- package/dist/validation/index.js +3 -0
- package/dist/validation/index.js.map +1 -0
- package/package.json +67 -0
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Functional SignerListSet factory — frozen-object style.
|
|
3
|
+
*
|
|
4
|
+
* Create, replace, or remove a list of signers that can be used to
|
|
5
|
+
* multi-sign transactions on the ledger.
|
|
6
|
+
*
|
|
7
|
+
* import { signerListSet } from 'xrplt/fp';
|
|
8
|
+
* const tx = signerListSet({
|
|
9
|
+
* Account,
|
|
10
|
+
* SignerQuorum: 3,
|
|
11
|
+
* SignerEntries: [
|
|
12
|
+
* { SignerEntry: { Account: SIGNER_A, SignerWeight: 2 } },
|
|
13
|
+
* { SignerEntry: { Account: SIGNER_B, SignerWeight: 1 } },
|
|
14
|
+
* ],
|
|
15
|
+
* });
|
|
16
|
+
* const j = tx.toJSON();
|
|
17
|
+
* const tx2 = tx.with({ Fee: '12', Sequence: 42 });
|
|
18
|
+
*
|
|
19
|
+
* To **delete** a signer list, omit `SignerEntries` and pass
|
|
20
|
+
* `SignerQuorum: 0`. xrpl.org: "To delete a signer list, you must set
|
|
21
|
+
* `SignerQuorum` to `0` _and_ omit the `SignerEntries` field.
|
|
22
|
+
* Otherwise, the transaction fails with the error `temMALFORMED`."
|
|
23
|
+
*
|
|
24
|
+
* @see https://xrpl.org/docs/references/protocol/transactions/types/signerlistset
|
|
25
|
+
* @see https://xrpl.org/docs/references/protocol/ledger-data/ledger-entry-types/signerlist
|
|
26
|
+
* @see xrpl.js `validateSignerListSet` — packages/xrpl/src/models/transactions/signerListSet.ts
|
|
27
|
+
*
|
|
28
|
+
* ## Divergences
|
|
29
|
+
*
|
|
30
|
+
* The factory implements the canonical XRPL SignerListSet shape from
|
|
31
|
+
* xrpl.org + rippled + xrpl.js, which is a strict superset of the
|
|
32
|
+
* current class API at `src/transactions/signer-list-set.ts`. The class
|
|
33
|
+
* is a thin skeleton — it only checks `SignerQuorum` is a number and
|
|
34
|
+
* that `SignerEntries` (when present) is an array of `SignerEntry`
|
|
35
|
+
* objects. It does NOT enforce any of the ledger-level guardrails
|
|
36
|
+
* below, so malformed transactions currently sail through class
|
|
37
|
+
* validation and only fail at the ledger with `temMALFORMED` /
|
|
38
|
+
* `temBAD_QUORUM` / `temBAD_SIGNER` / `temBAD_WEIGHT`. Concretely:
|
|
39
|
+
*
|
|
40
|
+
* 1. **`SignerEntries` is required when `SignerQuorum > 0`.**
|
|
41
|
+
* xrpl.js `validateSignerListSet.ts:53-62` short-circuits on
|
|
42
|
+
* `tx.SignerQuorum === 0`, but for any non-zero quorum it then
|
|
43
|
+
* runs `validateRequiredField(tx, 'SignerEntries', isArray)` and
|
|
44
|
+
* rejects an empty array with `'SignerListSet: need at least 1
|
|
45
|
+
* member in SignerEntries'`. xrpl.org
|
|
46
|
+
* (`docs/.../signerlistset.md` Fields table) says the list "must
|
|
47
|
+
* have at least 1 member and no more than 32 members". The class
|
|
48
|
+
* does not enforce either rule.
|
|
49
|
+
*
|
|
50
|
+
* 2. **`SignerEntries` cap is 32 members.** xrpl.js throws
|
|
51
|
+
* `'SignerListSet: maximum of 32 members allowed in
|
|
52
|
+
* SignerEntries'` when `tx.SignerEntries.length > MAX_SIGNERS =
|
|
53
|
+
* 32` (xrpl.js `signerListSet.ts:64-68`). rippled enforces the
|
|
54
|
+
* same cap via `temMALFORMED`. The class does not check length.
|
|
55
|
+
*
|
|
56
|
+
* 3. **`SignerWeight` must be a positive integer.**
|
|
57
|
+
* xrpl.js does not check the SignerWeight value itself, but the
|
|
58
|
+
* rippled `SignerListSet` preflight raises `temBAD_WEIGHT` when
|
|
59
|
+
* any `SignerWeight` is zero or negative
|
|
60
|
+
* (`xrpl-dev-portal/.../tem-codes.md`: "The SignerListSet
|
|
61
|
+
* transaction includes a SignerWeight that is invalid, for
|
|
62
|
+
* example a zero or negative value."). The factory rejects
|
|
63
|
+
* non-integer, zero, and negative weights at construction.
|
|
64
|
+
* The class only checks `isNumber(entry['SignerWeight'])`, which
|
|
65
|
+
* accepts `-1` and `0`.
|
|
66
|
+
*
|
|
67
|
+
* 4. **`SignerQuorum` must be in `[1, sum(SignerWeights)]`.**
|
|
68
|
+
* xrpl.org (`signerlistset.md`): "The `SignerQuorum` must be
|
|
69
|
+
* greater than 0 but less than or equal to the sum of the
|
|
70
|
+
* `SignerWeight` values in the list. Otherwise, the transaction
|
|
71
|
+
* fails with the error `temMALFORMED`." rippled raises
|
|
72
|
+
* `temBAD_QUORUM` (tem-codes.md: "Either the value is not greater
|
|
73
|
+
* than zero, or it is more than the sum of all signers in the
|
|
74
|
+
* list."). The factory rejects `SignerQuorum > sumWeight` at
|
|
75
|
+
* construction. Note: the SignerQuorum === 0 deletion path is
|
|
76
|
+
* still permitted when `SignerEntries` is omitted — that is
|
|
77
|
+
* explicitly allowed by rippled (see #1 above).
|
|
78
|
+
*
|
|
79
|
+
* 5. **Each `SignerEntry.Account` must be a valid XRPL address.**
|
|
80
|
+
* The class accepts any string (`isString(entry['Account'])`),
|
|
81
|
+
* which lets malformed addresses through. rippled rejects with
|
|
82
|
+
* `temMALFORMED` ("...malformed address..."). The factory runs
|
|
83
|
+
* `isAccount()` per entry.
|
|
84
|
+
*
|
|
85
|
+
* 6. **No duplicate `SignerEntry.Account` values.** xrpl.org
|
|
86
|
+
* (`signerlistset.md`): "No address may appear more than once in
|
|
87
|
+
* the list". rippled raises `temBAD_SIGNER` (tem-codes.md:
|
|
88
|
+
* "there may be duplicate entries..."). The factory enforces
|
|
89
|
+
* uniqueness via a `Set` and rejects duplicates. The class does
|
|
90
|
+
* not check.
|
|
91
|
+
*
|
|
92
|
+
* 7. **`SignerEntry.Account` must not equal the sending `Account`.**
|
|
93
|
+
* xrpl.org (`signerlistset.md`): "nor may the `Account`
|
|
94
|
+
* submitting the transaction appear in the list". rippled raises
|
|
95
|
+
* `temBAD_SIGNER`. The factory rejects the sending account as
|
|
96
|
+
* one of its own signers at construction. The class does not
|
|
97
|
+
* check.
|
|
98
|
+
*
|
|
99
|
+
* 8. **`WalletLocator`, when present, must be a 256-bit (32-byte)
|
|
100
|
+
* hex string.** xrpl.js enforces `HEX_WALLET_LOCATOR_REGEX =
|
|
101
|
+
* /^[0-9A-Fa-f]{64}$/u` (xrpl.js `signerListSet.ts:39, 78-86`)
|
|
102
|
+
* and rejects non-hex or wrong-length values. The factory mirrors
|
|
103
|
+
* this regex.
|
|
104
|
+
*
|
|
105
|
+
* 9. **`Account` is validated as a classic/X-address via
|
|
106
|
+
* `isAccount`, not just as a non-empty string.** The class
|
|
107
|
+
* delegates `Account` to the base class's
|
|
108
|
+
* `validateBaseTransaction`, which only requires
|
|
109
|
+
* `typeof Account === 'string'` (`src/validation/base.ts:36-42`).
|
|
110
|
+
* The factory is consistent with all other fp factories.
|
|
111
|
+
*/
|
|
112
|
+
import { isAccount, isNumber, isString } from '../../validation/helpers.js';
|
|
113
|
+
import { ValidationError } from '../../errors.js';
|
|
114
|
+
import { buildFrozenTx, mergeForWith, require } from '../shape.js';
|
|
115
|
+
// ─── Spec constants ──────────────────────────────────────────────────
|
|
116
|
+
/**
|
|
117
|
+
* Maximum number of `SignerEntry` entries in a single SignerListSet
|
|
118
|
+
* transaction. Mirrors xrpl.js `MAX_SIGNERS`.
|
|
119
|
+
*
|
|
120
|
+
* @see xrpl.js `signerListSet.ts:37`
|
|
121
|
+
* @see rippled `SignerListSet` preflight
|
|
122
|
+
*/
|
|
123
|
+
const MAX_SIGNERS = 32;
|
|
124
|
+
/**
|
|
125
|
+
* `WalletLocator` is a 256-bit (32-byte) hex value. Mirrors xrpl.js
|
|
126
|
+
* `HEX_WALLET_LOCATOR_REGEX`.
|
|
127
|
+
*
|
|
128
|
+
* @see xrpl.js `signerListSet.ts:39`
|
|
129
|
+
*/
|
|
130
|
+
const HEX_WALLET_LOCATOR_REGEX = /^[0-9A-Fa-f]{64}$/u;
|
|
131
|
+
// ─── Factory ─────────────────────────────────────────────────────────
|
|
132
|
+
export function signerListSet(props) {
|
|
133
|
+
// ── Account ── required, must be a valid XRPL classic or X-address.
|
|
134
|
+
require(props.Account, 'SignerListSet: missing or invalid Account', isAccount);
|
|
135
|
+
// ── SignerQuorum ── required, must be a number. Range and zero-
|
|
136
|
+
// branch handling come after we've decided whether the tx is a
|
|
137
|
+
// create/replace (Signers present) or a delete (Quorum === 0).
|
|
138
|
+
require(props.SignerQuorum, 'SignerListSet: missing or invalid SignerQuorum', isNumber);
|
|
139
|
+
// ── Deletion path: SignerQuorum === 0 must NOT have SignerEntries.
|
|
140
|
+
// xrpl.org: "To delete a signer list, you must set SignerQuorum
|
|
141
|
+
// to 0 AND omit the SignerEntries field. Otherwise, the
|
|
142
|
+
// transaction fails with the error temMALFORMED."
|
|
143
|
+
if (props.SignerQuorum === 0) {
|
|
144
|
+
if (props.SignerEntries !== undefined && props.SignerEntries.length > 0) {
|
|
145
|
+
throw new ValidationError('SignerListSet: SignerQuorum must be > 0 when SignerEntries are present');
|
|
146
|
+
}
|
|
147
|
+
// Deletion path is otherwise complete — no SignerEntries validation.
|
|
148
|
+
return buildFrozenTx('SignerListSet', props, {
|
|
149
|
+
validate() {
|
|
150
|
+
// Validated at construction.
|
|
151
|
+
},
|
|
152
|
+
toJSON() {
|
|
153
|
+
const json = {};
|
|
154
|
+
for (const k of Object.keys(this)) {
|
|
155
|
+
if (k === 'validate' || k === 'toJSON' || k === 'with')
|
|
156
|
+
continue;
|
|
157
|
+
const v = this[k];
|
|
158
|
+
if (v !== undefined)
|
|
159
|
+
json[k] = v;
|
|
160
|
+
}
|
|
161
|
+
return json;
|
|
162
|
+
},
|
|
163
|
+
with(overrides) {
|
|
164
|
+
return signerListSet(mergeForWith(this, overrides));
|
|
165
|
+
},
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
// ── Non-zero quorum: SignerEntries is required.
|
|
169
|
+
if (!Array.isArray(props.SignerEntries)) {
|
|
170
|
+
throw new ValidationError('SignerListSet: missing or invalid SignerEntries (array required when SignerQuorum > 0)');
|
|
171
|
+
}
|
|
172
|
+
if (props.SignerEntries.length === 0) {
|
|
173
|
+
throw new ValidationError('SignerListSet: need at least 1 member in SignerEntries');
|
|
174
|
+
}
|
|
175
|
+
if (props.SignerEntries.length > MAX_SIGNERS) {
|
|
176
|
+
throw new ValidationError(`SignerListSet: maximum of ${MAX_SIGNERS} members allowed in SignerEntries (actual: ${props.SignerEntries.length})`);
|
|
177
|
+
}
|
|
178
|
+
// ── SignerEntries ── shape, weight range, account format,
|
|
179
|
+
// uniqueness, owner-not-in-list.
|
|
180
|
+
let weightSum = 0;
|
|
181
|
+
const seenAccounts = new Set();
|
|
182
|
+
for (let i = 0; i < props.SignerEntries.length; i++) {
|
|
183
|
+
const entry = props.SignerEntries[i];
|
|
184
|
+
if (entry === null || typeof entry !== 'object' || Array.isArray(entry)) {
|
|
185
|
+
throw new ValidationError(`SignerListSet: SignerEntries[${i}] must be an object with a SignerEntry field`);
|
|
186
|
+
}
|
|
187
|
+
const inner = entry['SignerEntry'];
|
|
188
|
+
if (inner === null ||
|
|
189
|
+
typeof inner !== 'object' ||
|
|
190
|
+
Array.isArray(inner)) {
|
|
191
|
+
throw new ValidationError(`SignerListSet: SignerEntries[${i}].SignerEntry must be an object`);
|
|
192
|
+
}
|
|
193
|
+
const acc = inner['Account'];
|
|
194
|
+
if (!isAccount(acc)) {
|
|
195
|
+
throw new ValidationError(`SignerListSet: SignerEntries[${i}].SignerEntry.Account must be a valid XRPL address`);
|
|
196
|
+
}
|
|
197
|
+
// ── Owner-in-list guard ── rippled temBAD_SIGNER.
|
|
198
|
+
if (acc === props.Account) {
|
|
199
|
+
throw new ValidationError(`SignerListSet: SignerEntries[${i}].SignerEntry.Account must not equal the sending Account (temBAD_SIGNER)`);
|
|
200
|
+
}
|
|
201
|
+
// ── Duplicate-account guard ── rippled temBAD_SIGNER.
|
|
202
|
+
if (seenAccounts.has(acc)) {
|
|
203
|
+
throw new ValidationError(`SignerListSet: duplicate signer Account in SignerEntries (${acc}) (temBAD_SIGNER)`);
|
|
204
|
+
}
|
|
205
|
+
seenAccounts.add(acc);
|
|
206
|
+
const weight = inner['SignerWeight'];
|
|
207
|
+
if (!isNumber(weight) ||
|
|
208
|
+
!Number.isInteger(weight) ||
|
|
209
|
+
weight < 1) {
|
|
210
|
+
throw new ValidationError(`SignerListSet: SignerEntries[${i}].SignerEntry.SignerWeight must be a positive integer (temBAD_WEIGHT)`);
|
|
211
|
+
}
|
|
212
|
+
weightSum += weight;
|
|
213
|
+
// ── WalletLocator ── optional, must be 64-char hex if present.
|
|
214
|
+
const locator = inner['WalletLocator'];
|
|
215
|
+
if (locator !== undefined) {
|
|
216
|
+
if (!isString(locator) ||
|
|
217
|
+
!HEX_WALLET_LOCATOR_REGEX.test(locator)) {
|
|
218
|
+
throw new ValidationError(`SignerListSet: SignerEntries[${i}].SignerEntry.WalletLocator must be a 256-bit (32-byte) hexadecimal value`);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
// ── SignerQuorum cap: 1 <= Quorum <= sum(SignerWeights).
|
|
223
|
+
// xrpl.org "must be greater than 0 but less than or equal to
|
|
224
|
+
// the sum of the SignerWeight values in the list. Otherwise,
|
|
225
|
+
// the transaction fails with temMALFORMED." (mirrored by
|
|
226
|
+
// rippled's temBAD_QUORUM).
|
|
227
|
+
if (props.SignerQuorum > weightSum) {
|
|
228
|
+
throw new ValidationError(`SignerListSet: SignerQuorum (${props.SignerQuorum}) must not exceed the sum of SignerWeights (${weightSum}) (temBAD_QUORUM)`);
|
|
229
|
+
}
|
|
230
|
+
return buildFrozenTx('SignerListSet', props, {
|
|
231
|
+
validate() {
|
|
232
|
+
// Validated at construction.
|
|
233
|
+
},
|
|
234
|
+
toJSON() {
|
|
235
|
+
const json = {};
|
|
236
|
+
for (const k of Object.keys(this)) {
|
|
237
|
+
if (k === 'validate' || k === 'toJSON' || k === 'with')
|
|
238
|
+
continue;
|
|
239
|
+
const v = this[k];
|
|
240
|
+
if (v !== undefined)
|
|
241
|
+
json[k] = v;
|
|
242
|
+
}
|
|
243
|
+
return json;
|
|
244
|
+
},
|
|
245
|
+
with(overrides) {
|
|
246
|
+
return signerListSet(mergeForWith(this, overrides));
|
|
247
|
+
},
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
//# sourceMappingURL=signer-list-set.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signer-list-set.js","sourceRoot":"","sources":["../../../src/fp/factories/signer-list-set.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Functional SponsorshipSet factory — frozen-object style.
|
|
3
|
+
*
|
|
4
|
+
* Creates, updates, or deletes a `Sponsorship` ledger entry that defines a
|
|
5
|
+
* fee-and-reserve sponsorship relationship between two accounts. Validation
|
|
6
|
+
* happens at construction; there is no way to construct an invalid tx.
|
|
7
|
+
*
|
|
8
|
+
* import { sponsorshipSet } from 'xrplt/fp';
|
|
9
|
+
* // Create (sponsor allocates a 5-reserve budget to the sponsee)
|
|
10
|
+
* const tx = sponsorshipSet({
|
|
11
|
+
* Account: SPONSOR,
|
|
12
|
+
* Sponsee: SPONSEE,
|
|
13
|
+
* RemainingOwnerCountDelta: 5,
|
|
14
|
+
* FeeAmountDelta: '1000000',
|
|
15
|
+
* });
|
|
16
|
+
* // Sponsee deletes via CounterpartySponsor (only valid with tfDeleteObject)
|
|
17
|
+
* const tx2 = sponsorshipSet({
|
|
18
|
+
* Account: SPONSEE,
|
|
19
|
+
* CounterpartySponsor: SPONSOR,
|
|
20
|
+
* Flags: SponsorshipSetFlags.tfDeleteObject,
|
|
21
|
+
* });
|
|
22
|
+
* const j = tx.toJSON();
|
|
23
|
+
* const tx3 = tx.with({ MaxFee: '1000' });
|
|
24
|
+
*
|
|
25
|
+
* Affected amendments:
|
|
26
|
+
* - `Sponsor` (base SponsorshipSet)
|
|
27
|
+
*
|
|
28
|
+
* @see https://xrpl.org/docs/references/protocol/transactions/types/sponsorshipset
|
|
29
|
+
* @see xrpl.js `validateSponsorshipSet`
|
|
30
|
+
* (`~/.mavis/docs.local/xrpl.js/repo/packages/xrpl/src/models/transactions/sponsorshipSet.ts`)
|
|
31
|
+
*
|
|
32
|
+
* ## Divergences
|
|
33
|
+
*
|
|
34
|
+
* The factory enforces six preclaim rules that the class API
|
|
35
|
+
* (`src/transactions/sponsorship-set.ts`) skips. Each one is mandated by
|
|
36
|
+
* the Sponsor amendment / `validateSponsorshipSet`.
|
|
37
|
+
*
|
|
38
|
+
* 1. `CounterpartySponsor` may only be supplied with `tfDeleteObject`.
|
|
39
|
+
* Source: xrpl-dev-portal `sponsorshipset.md` Error Cases table —
|
|
40
|
+
* `temMALFORMED`: "Both `CounterpartySponsor` and `Sponsee` are
|
|
41
|
+
* specified." and the in-C++ preflight (`SponsorshipSet.cpp`) which
|
|
42
|
+
* enforces "`CounterpartySponsor` implies tfDeleteObject".
|
|
43
|
+
* xrpl.js `validateSponsorshipSet` (lines 304–308) enforces this; the
|
|
44
|
+
* class does not.
|
|
45
|
+
*
|
|
46
|
+
* 2. With `tfDeleteObject`, none of `FeeAmountDelta`, `MaxFee`, or
|
|
47
|
+
* `RemainingOwnerCountDelta` may be supplied.
|
|
48
|
+
* Source: xrpl-dev-portal `sponsorshipset.md` Error Cases table —
|
|
49
|
+
* `temMALFORMED`: "The `tfDeleteObject` flag is enabled and
|
|
50
|
+
* `FeeAmountDelta`, `MaxFee`, or `RemainingOwnerCountDelta` is
|
|
51
|
+
* specified."
|
|
52
|
+
* xrpl.js `validateSponsorshipSet` (lines 310–326) enforces this; the
|
|
53
|
+
* class does not.
|
|
54
|
+
*
|
|
55
|
+
* 3. `Account` must not equal `Sponsee` (and must not equal
|
|
56
|
+
* `CounterpartySponsor`).
|
|
57
|
+
* Source: xrpl-dev-portal `sponsorshipset.md` Error Cases table —
|
|
58
|
+
* `temMALFORMED`: "The sponsor and sponsee are the same account."
|
|
59
|
+
* xrpl.js `validateSponsorshipSet` (lines 244–248 and 266–273)
|
|
60
|
+
* enforces both via `areAddressesEqual`; the class does not.
|
|
61
|
+
*
|
|
62
|
+
* 4. `FeeAmountDelta` must be a strictly canonical signed integer string
|
|
63
|
+
* (no leading zeros beyond "0" itself; no whitespace; no scientific
|
|
64
|
+
* notation; no decimals). `-0` and `007` and `1.5` are all rejected.
|
|
65
|
+
* Source: xrpl.js `SIGNED_INTEGER_SANITY_CHECK` regex
|
|
66
|
+
* `^-?(?:0|[1-9][0-9]*)$/u` (`sponsorshipSet.ts` line 19). The class
|
|
67
|
+
* only checks `isString(FeeAmountDelta)`.
|
|
68
|
+
*
|
|
69
|
+
* 5. `MaxFee` must be a strictly canonical non-negative integer string
|
|
70
|
+
* (no leading zeros, no whitespace, no scientific notation, no
|
|
71
|
+
* decimals).
|
|
72
|
+
* Source: xrpl.js `INTEGER_SANITY_CHECK` regex
|
|
73
|
+
* `^(?:0|[1-9][0-9]*)$/u` (used at `sponsorshipSet.ts` line 358) and
|
|
74
|
+
* xrpl-dev-portal `sponsorshipset.md` Error Cases table —
|
|
75
|
+
* `temBAD_AMOUNT`: "`MaxFee` is negative or not denominated in XRP."
|
|
76
|
+
* The class only checks `isString(MaxFee)`.
|
|
77
|
+
*
|
|
78
|
+
* 6. `RemainingOwnerCountDelta` must be an integer in `[INT32_MIN,
|
|
79
|
+
* INT32_MAX]` (no fractional values, no overflow). A value of `0` is
|
|
80
|
+
* rejected.
|
|
81
|
+
* Source: xrpl-dev-portal `sponsorshipset.md` Error Cases table —
|
|
82
|
+
* `temINVALID`: "`RemainingOwnerCountDelta` value is zero" and
|
|
83
|
+
* `tecLIMIT_EXCEEDED`: "`Sponsorship.RemainingOwnerCount` exceeds
|
|
84
|
+
* the maximum value of an unsigned 32-bit integer." The class only
|
|
85
|
+
* checks `typeof === 'number'` and `=== 0`.
|
|
86
|
+
*
|
|
87
|
+
* 7. When not deleting, at least one of `FeeAmountDelta`,
|
|
88
|
+
* `RemainingOwnerCountDelta`, `MaxFee`, or a `RequireSignFor*` flag
|
|
89
|
+
* must be supplied.
|
|
90
|
+
* Source: xrpl.js `validateSponsorshipSet` (lines 398–408) and the
|
|
91
|
+
* xrpl-dev-portal sponsorshipset spec ("A sponsorship entry must keep
|
|
92
|
+
* at least some fee budget or reserve budget. … the transaction
|
|
93
|
+
* fails"). The class does not check this; passing only `Sponsee` (or
|
|
94
|
+
* only `CounterpartySponsor` plus `tfDeleteObject`) would be
|
|
95
|
+
* accepted locally and rejected by the ledger with `temMALFORMED` /
|
|
96
|
+
* `temEMPTY_DEST`.
|
|
97
|
+
*
|
|
98
|
+
* Note: the factory is the **only** place that validates
|
|
99
|
+
* `Sponsee`/`CounterpartySponsor` against `Account` for the
|
|
100
|
+
* "sponsee cannot create or modify" rule. The class lets you build a tx
|
|
101
|
+
* with `Account = sponsee`, `Sponsee = sponsor` and no delete flag, which
|
|
102
|
+
* the ledger will reject with `temMALFORMED`. The factory catches that at
|
|
103
|
+
* construction time by combining checks 1 and 3.
|
|
104
|
+
*/
|
|
105
|
+
import type { SponsorshipSetFlagsInterface } from '../../types/flags.js';
|
|
106
|
+
export interface SponsorshipSetProps {
|
|
107
|
+
/** The unique address of the transaction sender (must be the sponsor). */
|
|
108
|
+
Account: string;
|
|
109
|
+
/** The sponsee to sponsor. If present, Account is the sponsor. */
|
|
110
|
+
Sponsee?: string | undefined;
|
|
111
|
+
/**
|
|
112
|
+
* The sponsor's address. Identifies the sponsor when the sponsee
|
|
113
|
+
* (`Account`) is submitting the transaction. Only valid together with
|
|
114
|
+
* `tfDeleteObject`; the sponsee cannot create or modify a Sponsorship,
|
|
115
|
+
* only delete one.
|
|
116
|
+
*/
|
|
117
|
+
CounterpartySponsor?: string | undefined;
|
|
118
|
+
/**
|
|
119
|
+
* A signed delta (in drops of XRP) to apply to the sponsorship's fee
|
|
120
|
+
* allocation. Positive tops up the budget the sponsee can draw on for
|
|
121
|
+
* transaction fees; negative draws it down. Must not be zero.
|
|
122
|
+
*/
|
|
123
|
+
FeeAmountDelta?: string | undefined;
|
|
124
|
+
/**
|
|
125
|
+
* The maximum fee (in drops of XRP) the sponsor is willing to pay per
|
|
126
|
+
* transaction on behalf of the sponsee. Replaces (not adds to) the
|
|
127
|
+
* current value. Must be a non-negative integer string of drops.
|
|
128
|
+
*/
|
|
129
|
+
MaxFee?: string | undefined;
|
|
130
|
+
/**
|
|
131
|
+
* A signed delta to apply to `Sponsorship.RemainingOwnerCount` (the
|
|
132
|
+
* number of reserve units the sponsor agrees to cover). Positive to
|
|
133
|
+
* add coverage, negative to reduce it. Must be a non-zero integer.
|
|
134
|
+
*/
|
|
135
|
+
RemainingOwnerCountDelta?: number | undefined;
|
|
136
|
+
/** Bit-flags for this transaction. */
|
|
137
|
+
Flags?: number | SponsorshipSetFlagsInterface | undefined;
|
|
138
|
+
Fee?: string | undefined;
|
|
139
|
+
Sequence?: number | undefined;
|
|
140
|
+
}
|
|
141
|
+
export interface SponsorshipSet extends Readonly<SponsorshipSetProps> {
|
|
142
|
+
readonly TransactionType: 'SponsorshipSet';
|
|
143
|
+
validate(): void;
|
|
144
|
+
toJSON(): Record<string, unknown>;
|
|
145
|
+
with(overrides: Partial<SponsorshipSetProps>): SponsorshipSet;
|
|
146
|
+
}
|
|
147
|
+
export declare function sponsorshipSet(props: SponsorshipSetProps): SponsorshipSet;
|
|
148
|
+
//# sourceMappingURL=sponsorship-set.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sponsorship-set.d.ts","sourceRoot":"","sources":["../../../src/fp/factories/sponsorship-set.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuGG;AACH,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,sBAAsB,CAAC;AA6BzE,MAAM,WAAW,mBAAmB;IAClC,0EAA0E;IAC1E,OAAO,EAAE,MAAM,CAAC;IAChB,kEAAkE;IAClE,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B;;;;;OAKG;IACH,mBAAmB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzC;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B;;;;OAIG;IACH,wBAAwB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9C,sCAAsC;IACtC,KAAK,CAAC,EAAE,MAAM,GAAG,4BAA4B,GAAG,SAAS,CAAC;IAC1D,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC/B;AAED,MAAM,WAAW,cAAe,SAAQ,QAAQ,CAAC,mBAAmB,CAAC;IACnE,QAAQ,CAAC,eAAe,EAAE,gBAAgB,CAAC;IAC3C,QAAQ,IAAI,IAAI,CAAC;IACjB,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,mBAAmB,CAAC,GAAG,cAAc,CAAC;CAC/D;AAiED,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,cAAc,CAyMzE"}
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import { SponsorshipSetFlags } from '../../types/flags.js';
|
|
2
|
+
import { isAccount, isRecord, isString } from '../../validation/helpers.js';
|
|
3
|
+
import { ValidationError } from '../../errors.js';
|
|
4
|
+
import { buildFrozenTx, mergeForWith, require } from '../shape.js';
|
|
5
|
+
// ─── Spec constants ──────────────────────────────────────────────────
|
|
6
|
+
// Matches an optionally negative, canonical integer string (no whitespace,
|
|
7
|
+
// scientific notation, decimals, or leading zeros other than "0" itself).
|
|
8
|
+
// Mirrors xrpl.js `SIGNED_INTEGER_SANITY_CHECK`.
|
|
9
|
+
const SIGNED_INTEGER_SANITY_CHECK = /^-?(?:0|[1-9][0-9]*)$/u;
|
|
10
|
+
// Matches a non-negative canonical integer string.
|
|
11
|
+
const INTEGER_SANITY_CHECK = /^(?:0|[1-9][0-9]*)$/u;
|
|
12
|
+
// INT32 range per the SponsorshipSet spec (`tecLIMIT_EXCEEDED`).
|
|
13
|
+
const INT32_MIN = -2_147_483_648;
|
|
14
|
+
const INT32_MAX = 2_147_483_647;
|
|
15
|
+
// Bitmask covering every "modify" flag (RequireSignFor* set/clear). These
|
|
16
|
+
// conflict with tfDeleteObject per the spec (`temINVALID_FLAG`).
|
|
17
|
+
const SPONSORSHIP_SET_MODIFY_FLAGS = SponsorshipSetFlags.tfSponsorshipSetRequireSignForFee |
|
|
18
|
+
SponsorshipSetFlags.tfSponsorshipClearRequireSignForFee |
|
|
19
|
+
SponsorshipSetFlags.tfSponsorshipSetRequireSignForReserve |
|
|
20
|
+
SponsorshipSetFlags.tfSponsorshipClearRequireSignForReserve;
|
|
21
|
+
// ─── Helpers ─────────────────────────────────────────────────────────
|
|
22
|
+
/**
|
|
23
|
+
* Extract flag booleans from a transaction's `Flags` field, handling both
|
|
24
|
+
* the numeric bitmask form and the boolean-map form. Mirrors
|
|
25
|
+
* xrpl.js `getSponsorshipSetFlags` (sponsorshipSet.ts lines 156–209) but
|
|
26
|
+
* without the `isDelete` decision (we return it directly).
|
|
27
|
+
*/
|
|
28
|
+
function getFlags(rawFlags) {
|
|
29
|
+
let flagsValue = 0;
|
|
30
|
+
let hasModifyFlag = false;
|
|
31
|
+
let hasFeeSignConflict = false;
|
|
32
|
+
let hasReserveSignConflict = false;
|
|
33
|
+
if (typeof rawFlags === 'number') {
|
|
34
|
+
flagsValue = rawFlags;
|
|
35
|
+
hasModifyFlag = (rawFlags & SPONSORSHIP_SET_MODIFY_FLAGS) !== 0;
|
|
36
|
+
hasFeeSignConflict =
|
|
37
|
+
(rawFlags &
|
|
38
|
+
SponsorshipSetFlags.tfSponsorshipSetRequireSignForFee) !==
|
|
39
|
+
0 &&
|
|
40
|
+
(rawFlags &
|
|
41
|
+
SponsorshipSetFlags.tfSponsorshipClearRequireSignForFee) !== 0;
|
|
42
|
+
hasReserveSignConflict =
|
|
43
|
+
(rawFlags &
|
|
44
|
+
SponsorshipSetFlags.tfSponsorshipSetRequireSignForReserve) !==
|
|
45
|
+
0 &&
|
|
46
|
+
(rawFlags &
|
|
47
|
+
SponsorshipSetFlags.tfSponsorshipClearRequireSignForReserve) !==
|
|
48
|
+
0;
|
|
49
|
+
}
|
|
50
|
+
else if (isRecord(rawFlags)) {
|
|
51
|
+
if (rawFlags['tfDeleteObject'] === true) {
|
|
52
|
+
flagsValue = SponsorshipSetFlags.tfDeleteObject;
|
|
53
|
+
}
|
|
54
|
+
hasModifyFlag = Boolean(rawFlags['tfSponsorshipSetRequireSignForFee'] ||
|
|
55
|
+
rawFlags['tfSponsorshipClearRequireSignForFee'] ||
|
|
56
|
+
rawFlags['tfSponsorshipSetRequireSignForReserve'] ||
|
|
57
|
+
rawFlags['tfSponsorshipClearRequireSignForReserve']);
|
|
58
|
+
hasFeeSignConflict = Boolean(rawFlags['tfSponsorshipSetRequireSignForFee'] === true &&
|
|
59
|
+
rawFlags['tfSponsorshipClearRequireSignForFee'] === true);
|
|
60
|
+
hasReserveSignConflict = Boolean(rawFlags['tfSponsorshipSetRequireSignForReserve'] === true &&
|
|
61
|
+
rawFlags['tfSponsorshipClearRequireSignForReserve'] === true);
|
|
62
|
+
}
|
|
63
|
+
const isDelete = (flagsValue & SponsorshipSetFlags.tfDeleteObject) !== 0;
|
|
64
|
+
return { isDelete, hasModifyFlag, hasFeeSignConflict, hasReserveSignConflict };
|
|
65
|
+
}
|
|
66
|
+
// ─── Factory ─────────────────────────────────────────────────────────
|
|
67
|
+
export function sponsorshipSet(props) {
|
|
68
|
+
// ── Account ── required, must be a valid XRPL classic or X-address.
|
|
69
|
+
require(props.Account, 'SponsorshipSet: Account is required', isAccount);
|
|
70
|
+
// ── Sponsee / CounterpartySponsor ── exactly one of the two must
|
|
71
|
+
// be present.
|
|
72
|
+
const hasSponsee = props.Sponsee !== undefined;
|
|
73
|
+
const hasCounterpartySponsor = props.CounterpartySponsor !== undefined;
|
|
74
|
+
if (!hasSponsee && !hasCounterpartySponsor) {
|
|
75
|
+
throw new ValidationError('SponsorshipSet: must specify either Sponsee or CounterpartySponsor');
|
|
76
|
+
}
|
|
77
|
+
if (hasSponsee && hasCounterpartySponsor) {
|
|
78
|
+
throw new ValidationError('SponsorshipSet: cannot specify both Sponsee and CounterpartySponsor');
|
|
79
|
+
}
|
|
80
|
+
// ── Sponsee ── string + valid account + identity check vs Account.
|
|
81
|
+
if (hasSponsee) {
|
|
82
|
+
if (!isString(props.Sponsee)) {
|
|
83
|
+
throw new ValidationError('SponsorshipSet: Sponsee must be a string');
|
|
84
|
+
}
|
|
85
|
+
if (props.Sponsee === props.Account) {
|
|
86
|
+
throw new ValidationError('SponsorshipSet: Account and Sponsee cannot be the same');
|
|
87
|
+
}
|
|
88
|
+
if (!isAccount(props.Sponsee)) {
|
|
89
|
+
throw new ValidationError('SponsorshipSet: Sponsee must be a valid account address');
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// ── CounterpartySponsor ── string + valid account + identity check.
|
|
93
|
+
if (hasCounterpartySponsor) {
|
|
94
|
+
if (!isString(props.CounterpartySponsor)) {
|
|
95
|
+
throw new ValidationError('SponsorshipSet: CounterpartySponsor must be a string');
|
|
96
|
+
}
|
|
97
|
+
if (props.CounterpartySponsor === props.Account) {
|
|
98
|
+
throw new ValidationError('SponsorshipSet: Account and CounterpartySponsor cannot be the same');
|
|
99
|
+
}
|
|
100
|
+
if (!isAccount(props.CounterpartySponsor)) {
|
|
101
|
+
throw new ValidationError('SponsorshipSet: CounterpartySponsor must be a valid account address');
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
const { isDelete, hasModifyFlag, hasFeeSignConflict, hasReserveSignConflict, } = getFlags(props.Flags);
|
|
105
|
+
// ── Flag pair conflicts ── both Set+Clear on the same RequireSignFor*
|
|
106
|
+
// dimension are invalid (`temINVALID_FLAG`).
|
|
107
|
+
if (hasFeeSignConflict) {
|
|
108
|
+
throw new ValidationError('SponsorshipSet: cannot set both tfSponsorshipSetRequireSignForFee and tfSponsorshipClearRequireSignForFee');
|
|
109
|
+
}
|
|
110
|
+
if (hasReserveSignConflict) {
|
|
111
|
+
throw new ValidationError('SponsorshipSet: cannot set both tfSponsorshipSetRequireSignForReserve and tfSponsorshipClearRequireSignForReserve');
|
|
112
|
+
}
|
|
113
|
+
// ── Sponsee-only-create-or-modify rule ── a sponsee cannot
|
|
114
|
+
// create/modify a Sponsorship, only delete one. So
|
|
115
|
+
// CounterpartySponsor is only valid with tfDeleteObject.
|
|
116
|
+
if (hasCounterpartySponsor && !isDelete) {
|
|
117
|
+
throw new ValidationError('SponsorshipSet: CounterpartySponsor can only be used with tfDeleteObject (only the sponsor can create or modify a Sponsorship)');
|
|
118
|
+
}
|
|
119
|
+
// ── tfDeleteObject constraints ── no modify flags, no data deltas.
|
|
120
|
+
if (isDelete) {
|
|
121
|
+
if (hasModifyFlag) {
|
|
122
|
+
throw new ValidationError('SponsorshipSet: cannot set RequireSignForFee/RequireSignForReserve flags together with tfDeleteObject');
|
|
123
|
+
}
|
|
124
|
+
if (props.FeeAmountDelta !== undefined ||
|
|
125
|
+
props.RemainingOwnerCountDelta !== undefined ||
|
|
126
|
+
props.MaxFee !== undefined) {
|
|
127
|
+
throw new ValidationError('SponsorshipSet: cannot include FeeAmountDelta, RemainingOwnerCountDelta, or MaxFee together with tfDeleteObject');
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
// ── FeeAmountDelta ── signed delta, strict integer string, non-zero.
|
|
131
|
+
if (props.FeeAmountDelta !== undefined) {
|
|
132
|
+
if (!isString(props.FeeAmountDelta)) {
|
|
133
|
+
throw new ValidationError('SponsorshipSet: FeeAmountDelta must be a string');
|
|
134
|
+
}
|
|
135
|
+
if (!SIGNED_INTEGER_SANITY_CHECK.test(props.FeeAmountDelta)) {
|
|
136
|
+
throw new ValidationError('SponsorshipSet: FeeAmountDelta must be a numeric string');
|
|
137
|
+
}
|
|
138
|
+
// BigInt so "-0" parses to 0n and is caught here.
|
|
139
|
+
if (BigInt(props.FeeAmountDelta) === BigInt(0)) {
|
|
140
|
+
throw new ValidationError('SponsorshipSet: FeeAmountDelta must not be zero');
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
// ── MaxFee ── unsigned, strict non-negative integer string.
|
|
144
|
+
if (props.MaxFee !== undefined) {
|
|
145
|
+
if (!isString(props.MaxFee)) {
|
|
146
|
+
throw new ValidationError('SponsorshipSet: MaxFee must be a string');
|
|
147
|
+
}
|
|
148
|
+
if (!INTEGER_SANITY_CHECK.test(props.MaxFee)) {
|
|
149
|
+
throw new ValidationError('SponsorshipSet: MaxFee must be a non-negative numeric string');
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
// ── RemainingOwnerCountDelta ── integer, non-zero, INT32 range.
|
|
153
|
+
if (props.RemainingOwnerCountDelta !== undefined) {
|
|
154
|
+
if (typeof props.RemainingOwnerCountDelta !== 'number') {
|
|
155
|
+
throw new ValidationError('SponsorshipSet: RemainingOwnerCountDelta must be a number');
|
|
156
|
+
}
|
|
157
|
+
if (!Number.isInteger(props.RemainingOwnerCountDelta)) {
|
|
158
|
+
throw new ValidationError('SponsorshipSet: RemainingOwnerCountDelta must be an integer');
|
|
159
|
+
}
|
|
160
|
+
if (props.RemainingOwnerCountDelta === 0) {
|
|
161
|
+
throw new ValidationError('SponsorshipSet: RemainingOwnerCountDelta must not be zero');
|
|
162
|
+
}
|
|
163
|
+
if (props.RemainingOwnerCountDelta > INT32_MAX ||
|
|
164
|
+
props.RemainingOwnerCountDelta < INT32_MIN) {
|
|
165
|
+
throw new ValidationError(`SponsorshipSet: RemainingOwnerCountDelta must be between ${INT32_MIN} and ${INT32_MAX}`);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
// ── At-least-one-mutable-field rule (when not deleting) ──
|
|
169
|
+
// "A sponsorship entry must keep at least some fee budget or
|
|
170
|
+
// reserve budget." (xrpl-dev-portal `sponsorshipset.md`).
|
|
171
|
+
// This matches xrpl.js `validateSponsorshipSet` (lines 398–408) and
|
|
172
|
+
// is the canonical preclaim check; the class skips it.
|
|
173
|
+
if (!isDelete) {
|
|
174
|
+
if (props.FeeAmountDelta === undefined &&
|
|
175
|
+
props.RemainingOwnerCountDelta === undefined &&
|
|
176
|
+
props.MaxFee === undefined &&
|
|
177
|
+
!hasModifyFlag) {
|
|
178
|
+
throw new ValidationError('SponsorshipSet: must specify at least one of FeeAmountDelta, RemainingOwnerCountDelta, MaxFee, or a RequireSignFor flag');
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
return buildFrozenTx('SponsorshipSet', props, {
|
|
182
|
+
validate() {
|
|
183
|
+
// Validated at construction.
|
|
184
|
+
},
|
|
185
|
+
toJSON() {
|
|
186
|
+
const json = {};
|
|
187
|
+
for (const k of Object.keys(this)) {
|
|
188
|
+
if (k === 'validate' || k === 'toJSON' || k === 'with')
|
|
189
|
+
continue;
|
|
190
|
+
const v = this[k];
|
|
191
|
+
if (v !== undefined)
|
|
192
|
+
json[k] = v;
|
|
193
|
+
}
|
|
194
|
+
return json;
|
|
195
|
+
},
|
|
196
|
+
with(overrides) {
|
|
197
|
+
return sponsorshipSet(mergeForWith(this, overrides));
|
|
198
|
+
},
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
//# sourceMappingURL=sponsorship-set.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sponsorship-set.js","sourceRoot":"","sources":["../../../src/fp/factories/sponsorship-set.ts"],"names":[],"mappings":"AAyGA,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAC5E,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEnE,wEAAwE;AAExE,2EAA2E;AAC3E,0EAA0E;AAC1E,iDAAiD;AACjD,MAAM,2BAA2B,GAAG,wBAAwB,CAAC;AAC7D,mDAAmD;AACnD,MAAM,oBAAoB,GAAG,sBAAsB,CAAC;AAEpD,iEAAiE;AACjE,MAAM,SAAS,GAAG,CAAC,aAAa,CAAC;AACjC,MAAM,SAAS,GAAG,aAAa,CAAC;AAEhC,0EAA0E;AAC1E,iEAAiE;AACjE,MAAM,4BAA4B,GAChC,mBAAmB,CAAC,iCAAiC;IACrD,mBAAmB,CAAC,mCAAmC;IACvD,mBAAmB,CAAC,qCAAqC;IACzD,mBAAmB,CAAC,uCAAuC,CAAC;AA+C9D,wEAAwE;AAExE;;;;;GAKG;AACH,SAAS,QAAQ,CACf,QAAiB;IAOjB,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,aAAa,GAAG,KAAK,CAAC;IAC1B,IAAI,kBAAkB,GAAG,KAAK,CAAC;IAC/B,IAAI,sBAAsB,GAAG,KAAK,CAAC;IAEnC,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACjC,UAAU,GAAG,QAAQ,CAAC;QACtB,aAAa,GAAG,CAAC,QAAQ,GAAG,4BAA4B,CAAC,KAAK,CAAC,CAAC;QAChE,kBAAkB;YAChB,CAAC,QAAQ;gBACP,mBAAmB,CAAC,iCAAiC,CAAC;gBACtD,CAAC;gBACH,CAAC,QAAQ;oBACP,mBAAmB,CAAC,mCAAmC,CAAC,KAAK,CAAC,CAAC;QACnE,sBAAsB;YACpB,CAAC,QAAQ;gBACP,mBAAmB,CAAC,qCAAqC,CAAC;gBAC1D,CAAC;gBACH,CAAC,QAAQ;oBACP,mBAAmB,CAAC,uCAAuC,CAAC;oBAC5D,CAAC,CAAC;IACR,CAAC;SAAM,IAAI,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9B,IAAI,QAAQ,CAAC,gBAAgB,CAAC,KAAK,IAAI,EAAE,CAAC;YACxC,UAAU,GAAG,mBAAmB,CAAC,cAAc,CAAC;QAClD,CAAC;QACD,aAAa,GAAG,OAAO,CACrB,QAAQ,CAAC,mCAAmC,CAAC;YAC3C,QAAQ,CAAC,qCAAqC,CAAC;YAC/C,QAAQ,CAAC,uCAAuC,CAAC;YACjD,QAAQ,CAAC,yCAAyC,CAAC,CACtD,CAAC;QACF,kBAAkB,GAAG,OAAO,CAC1B,QAAQ,CAAC,mCAAmC,CAAC,KAAK,IAAI;YACpD,QAAQ,CAAC,qCAAqC,CAAC,KAAK,IAAI,CAC3D,CAAC;QACF,sBAAsB,GAAG,OAAO,CAC9B,QAAQ,CAAC,uCAAuC,CAAC,KAAK,IAAI;YACxD,QAAQ,CAAC,yCAAyC,CAAC,KAAK,IAAI,CAC/D,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,CAAC,UAAU,GAAG,mBAAmB,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IACzE,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,CAAC;AACjF,CAAC;AAED,wEAAwE;AAExE,MAAM,UAAU,cAAc,CAAC,KAA0B;IACvD,qEAAqE;IACrE,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,qCAAqC,EAAE,SAAS,CAAC,CAAC;IAEzE,kEAAkE;IAClE,iBAAiB;IACjB,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,KAAK,SAAS,CAAC;IAC/C,MAAM,sBAAsB,GAAG,KAAK,CAAC,mBAAmB,KAAK,SAAS,CAAC;IAEvE,IAAI,CAAC,UAAU,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAC3C,MAAM,IAAI,eAAe,CACvB,oEAAoE,CACrE,CAAC;IACJ,CAAC;IACD,IAAI,UAAU,IAAI,sBAAsB,EAAE,CAAC;QACzC,MAAM,IAAI,eAAe,CACvB,qEAAqE,CACtE,CAAC;IACJ,CAAC;IAED,oEAAoE;IACpE,IAAI,UAAU,EAAE,CAAC;QACf,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,eAAe,CAAC,0CAA0C,CAAC,CAAC;QACxE,CAAC;QACD,IAAI,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC;YACpC,MAAM,IAAI,eAAe,CACvB,wDAAwD,CACzD,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YAC9B,MAAM,IAAI,eAAe,CACvB,yDAAyD,CAC1D,CAAC;QACJ,CAAC;IACH,CAAC;IAED,qEAAqE;IACrE,IAAI,sBAAsB,EAAE,CAAC;QAC3B,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,mBAAmB,CAAC,EAAE,CAAC;YACzC,MAAM,IAAI,eAAe,CACvB,sDAAsD,CACvD,CAAC;QACJ,CAAC;QACD,IAAI,KAAK,CAAC,mBAAmB,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC;YAChD,MAAM,IAAI,eAAe,CACvB,oEAAoE,CACrE,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,mBAAmB,CAAC,EAAE,CAAC;YAC1C,MAAM,IAAI,eAAe,CACvB,qEAAqE,CACtE,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,EACJ,QAAQ,EACR,aAAa,EACb,kBAAkB,EAClB,sBAAsB,GACvB,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAE1B,uEAAuE;IACvE,gDAAgD;IAChD,IAAI,kBAAkB,EAAE,CAAC;QACvB,MAAM,IAAI,eAAe,CACvB,2GAA2G,CAC5G,CAAC;IACJ,CAAC;IACD,IAAI,sBAAsB,EAAE,CAAC;QAC3B,MAAM,IAAI,eAAe,CACvB,mHAAmH,CACpH,CAAC;IACJ,CAAC;IAED,4DAA4D;IAC5D,sDAAsD;IACtD,4DAA4D;IAC5D,IAAI,sBAAsB,IAAI,CAAC,QAAQ,EAAE,CAAC;QACxC,MAAM,IAAI,eAAe,CACvB,gIAAgI,CACjI,CAAC;IACJ,CAAC;IAED,oEAAoE;IACpE,IAAI,QAAQ,EAAE,CAAC;QACb,IAAI,aAAa,EAAE,CAAC;YAClB,MAAM,IAAI,eAAe,CACvB,uGAAuG,CACxG,CAAC;QACJ,CAAC;QACD,IACE,KAAK,CAAC,cAAc,KAAK,SAAS;YAClC,KAAK,CAAC,wBAAwB,KAAK,SAAS;YAC5C,KAAK,CAAC,MAAM,KAAK,SAAS,EAC1B,CAAC;YACD,MAAM,IAAI,eAAe,CACvB,iHAAiH,CAClH,CAAC;QACJ,CAAC;IACH,CAAC;IAED,sEAAsE;IACtE,IAAI,KAAK,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;QACvC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC;YACpC,MAAM,IAAI,eAAe,CACvB,iDAAiD,CAClD,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC;YAC5D,MAAM,IAAI,eAAe,CACvB,yDAAyD,CAC1D,CAAC;QACJ,CAAC;QACD,kDAAkD;QAClD,IAAI,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/C,MAAM,IAAI,eAAe,CACvB,iDAAiD,CAClD,CAAC;QACJ,CAAC;IACH,CAAC;IAED,6DAA6D;IAC7D,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC/B,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,eAAe,CAAC,yCAAyC,CAAC,CAAC;QACvE,CAAC;QACD,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;YAC7C,MAAM,IAAI,eAAe,CACvB,8DAA8D,CAC/D,CAAC;QACJ,CAAC;IACH,CAAC;IAED,iEAAiE;IACjE,IAAI,KAAK,CAAC,wBAAwB,KAAK,SAAS,EAAE,CAAC;QACjD,IAAI,OAAO,KAAK,CAAC,wBAAwB,KAAK,QAAQ,EAAE,CAAC;YACvD,MAAM,IAAI,eAAe,CACvB,2DAA2D,CAC5D,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,wBAAwB,CAAC,EAAE,CAAC;YACtD,MAAM,IAAI,eAAe,CACvB,6DAA6D,CAC9D,CAAC;QACJ,CAAC;QACD,IAAI,KAAK,CAAC,wBAAwB,KAAK,CAAC,EAAE,CAAC;YACzC,MAAM,IAAI,eAAe,CACvB,2DAA2D,CAC5D,CAAC;QACJ,CAAC;QACD,IACE,KAAK,CAAC,wBAAwB,GAAG,SAAS;YAC1C,KAAK,CAAC,wBAAwB,GAAG,SAAS,EAC1C,CAAC;YACD,MAAM,IAAI,eAAe,CACvB,4DAA4D,SAAS,QAAQ,SAAS,EAAE,CACzF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,4DAA4D;IAC5D,gEAAgE;IAChE,6DAA6D;IAC7D,uEAAuE;IACvE,0DAA0D;IAC1D,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,IACE,KAAK,CAAC,cAAc,KAAK,SAAS;YAClC,KAAK,CAAC,wBAAwB,KAAK,SAAS;YAC5C,KAAK,CAAC,MAAM,KAAK,SAAS;YAC1B,CAAC,aAAa,EACd,CAAC;YACD,MAAM,IAAI,eAAe,CACvB,yHAAyH,CAC1H,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,aAAa,CAClB,gBAAgB,EAChB,KAAK,EACL;QACE,QAAQ;YACN,6BAA6B;QAC/B,CAAC;QACD,MAAM;YACJ,MAAM,IAAI,GAA4B,EAAE,CAAC;YACzC,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBAClC,IAAI,CAAC,KAAK,UAAU,IAAI,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,MAAM;oBAAE,SAAS;gBACjE,MAAM,CAAC,GAAI,IAA2C,CAAC,CAAC,CAAC,CAAC;gBAC1D,IAAI,CAAC,KAAK,SAAS;oBAAE,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YACnC,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,CAAuB,SAAuC;YAChE,OAAO,cAAc,CAAC,YAAY,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC;QACvD,CAAC;KACF,CACF,CAAC;AACJ,CAAC"}
|