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,257 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Functional OracleSet factory — frozen-object style.
|
|
3
|
+
*
|
|
4
|
+
* Creates a new `PriceOracle` ledger entry or updates an existing one,
|
|
5
|
+
* identified by `(Account, OracleDocumentID)`. Validation happens at
|
|
6
|
+
* construction; there is no way to construct an invalid tx.
|
|
7
|
+
*
|
|
8
|
+
* import { oracleSet } from 'xrplt/fp';
|
|
9
|
+
* const tx = oracleSet({
|
|
10
|
+
* Account,
|
|
11
|
+
* OracleDocumentID: 34,
|
|
12
|
+
* LastUpdateTime: 743609014,
|
|
13
|
+
* Provider: '70726F7669646572',
|
|
14
|
+
* AssetClass: '63757272656E6379',
|
|
15
|
+
* PriceDataSeries: [
|
|
16
|
+
* { PriceData: { BaseAsset: 'XRP', QuoteAsset: 'USD', AssetPrice: 740, Scale: 3 } },
|
|
17
|
+
* ],
|
|
18
|
+
* });
|
|
19
|
+
* const j = tx.toJSON();
|
|
20
|
+
* const tx2 = tx.with({ LastUpdateTime: 743700000 });
|
|
21
|
+
*
|
|
22
|
+
* Affected amendment: `PriceOracle` (XLS-47).
|
|
23
|
+
*
|
|
24
|
+
* @see https://xrpl.org/docs/references/protocol/transactions/types/oracleset
|
|
25
|
+
* @see https://github.com/XRPLF/XRPL-Standards/tree/master/XLS-0047-PriceOracles
|
|
26
|
+
*
|
|
27
|
+
* ## Divergences
|
|
28
|
+
*
|
|
29
|
+
* The factory enforces six preclaim guards the class API
|
|
30
|
+
* (`src/transactions/oracle-set.ts`) skips:
|
|
31
|
+
*
|
|
32
|
+
* 1. `PriceDataSeries` array length capped at 10 elements.
|
|
33
|
+
* Source: XLS-47 §"Transaction for creating or updating PriceOracle
|
|
34
|
+
* instance" failure conditions — "Transaction's `PriceDataSeries`
|
|
35
|
+
* array size is empty or exceeds ten when creating a new Oracle
|
|
36
|
+
* instance or Oracle's instance `PriceDataSeries` array size
|
|
37
|
+
* exceeds ten after updating". The class only checks
|
|
38
|
+
* `isArray(PriceDataSeries)` and accepts unbounded lengths.
|
|
39
|
+
*
|
|
40
|
+
* 2. Each `PriceDataSeries` element has exactly one key: `PriceData`.
|
|
41
|
+
* Source: XLS-47 example JSON wraps the inner object as
|
|
42
|
+
* `{ "PriceData": { ... } }`. xrpl.js 5.3.0 validateOracleSet()
|
|
43
|
+
* enforces `Object.keys(priceData).length !== 1`
|
|
44
|
+
* (`packages/xrpl/src/models/transactions/oracleSet.ts:122`).
|
|
45
|
+
*
|
|
46
|
+
* 3. `AssetPrice` and `Scale` inside `PriceData` must be BOTH present
|
|
47
|
+
* or BOTH omitted. The class does not check this coupling.
|
|
48
|
+
* Source: xrpl.js 5.3.0 validateOracleSet() lines 144-151
|
|
49
|
+
* (`packages/xrpl/src/models/transactions/oracleSet.ts:144`).
|
|
50
|
+
*
|
|
51
|
+
* 4. `Scale` is constrained to `[0, 10]` (integer).
|
|
52
|
+
* Source: xrpl.js 5.3.0 validateOracleSet() lines 183-187
|
|
53
|
+
* (`packages/xrpl/src/models/transactions/oracleSet.ts:183`).
|
|
54
|
+
* Note: XLS-47 README §"Transaction fields" claims valid range
|
|
55
|
+
* `{1-20}` but xrpl.js enforces `{0-10}` (uint8 internal type,
|
|
56
|
+
* practical chain limit). The factory follows xrpl.js.
|
|
57
|
+
*
|
|
58
|
+
* 5. `AssetPrice` is validated as either a number OR a hex string
|
|
59
|
+
* of 1-16 characters. The class accepts `Record<string, unknown>`
|
|
60
|
+
* for the array element with no inner checks.
|
|
61
|
+
* Source: xrpl.js 5.3.0 validateOracleSet() lines 155-176
|
|
62
|
+
* (`packages/xrpl/src/models/transactions/oracleSet.ts:155`).
|
|
63
|
+
*
|
|
64
|
+
* 6. `Provider` / `URI` / `AssetClass` byte limits (256 / 256 / 16)
|
|
65
|
+
* with hex-encoding and printable-ASCII range checks.
|
|
66
|
+
* Sources: XLS-47 §"PriceOracle Object" — "`Provider` ... string of
|
|
67
|
+
* up to 256 ASCII hex encoded characters (0x20-0x7E)"; "`URI` ...
|
|
68
|
+
* limited to 256 bytes"; "`AssetClass` ... string of up to sixteen
|
|
69
|
+
* ASCII hex encoded characters (0x20-0x7E)". The class accepts any
|
|
70
|
+
* string and does not enforce length or character range.
|
|
71
|
+
*
|
|
72
|
+
* ## Field name divergences from the class
|
|
73
|
+
*
|
|
74
|
+
* The class source (`src/transactions/oracle-set.ts`) declares two
|
|
75
|
+
* top-level fields — `AssetBase` and `AssetQuote` — that do NOT exist
|
|
76
|
+
* in either XLS-47 or xrpl.js 5.3.0. The spec/xrpl.js model puts those
|
|
77
|
+
* identifiers INSIDE each `PriceDataSeries[i].PriceData` element, named
|
|
78
|
+
* `BaseAsset` and `QuoteAsset`. The factory follows the spec; it does
|
|
79
|
+
* not surface `AssetBase` / `AssetQuote`. Source: XLS-47 §"PriceOracle
|
|
80
|
+
* Object" → `PriceData` subtable; xrpl.js 5.3.0 OracleSet interface
|
|
81
|
+
* (`packages/xrpl/src/models/transactions/oracleSet.ts:31`).
|
|
82
|
+
*
|
|
83
|
+
* Conversely, the class OMITS `AssetClass`, which is a required-on-
|
|
84
|
+
* create / optional-on-update spec field. The factory includes it.
|
|
85
|
+
* Source: XLS-47 §"Transaction fields for OracleSet" table;
|
|
86
|
+
* "The transaction fails if: ... `AssetClass` field length exceeds 16
|
|
87
|
+
* bytes".
|
|
88
|
+
*/
|
|
89
|
+
import { isArray, isHex, isNumber, isRecord, isString, } from '../../validation/helpers.js';
|
|
90
|
+
import { ValidationError } from '../../errors.js';
|
|
91
|
+
import { buildFrozenTx, mergeForWith, require } from '../shape.js';
|
|
92
|
+
// ─── Spec constants ──────────────────────────────────────────────────
|
|
93
|
+
/** XLS-47 §"Transaction fields for OracleSet" — "array of up to ten PriceData objects". */
|
|
94
|
+
const PRICE_DATA_SERIES_MAX_LENGTH = 10;
|
|
95
|
+
/** XLS-47 §"PriceOracle Object" — Provider up to 256 bytes. */
|
|
96
|
+
const MAX_PROVIDER_BYTES = 256;
|
|
97
|
+
/** XLS-47 §"PriceOracle Object" — URI limited to 256 bytes. */
|
|
98
|
+
const MAX_URI_BYTES = 256;
|
|
99
|
+
/** XLS-47 §"PriceOracle Object" — AssetClass up to 16 bytes. */
|
|
100
|
+
const MAX_ASSET_CLASS_BYTES = 16;
|
|
101
|
+
/** XLS-47 §"PriceOracle Object" — printable-ASCII range (0x20..0x7E). */
|
|
102
|
+
const PRINTABLE_ASCII_MIN = 0x20;
|
|
103
|
+
const PRINTABLE_ASCII_MAX = 0x7e;
|
|
104
|
+
/** xrpl.js 5.3.0 validateOracleSet() lines 178-187 — uint8 Scale. */
|
|
105
|
+
const SCALE_MIN = 0;
|
|
106
|
+
const SCALE_MAX = 10;
|
|
107
|
+
/** xrpl.js 5.3.0 validateOracleSet() lines 167-173 — AssetPrice hex length. */
|
|
108
|
+
const MINIMUM_ASSET_PRICE_LENGTH = 1;
|
|
109
|
+
const MAXIMUM_ASSET_PRICE_LENGTH = 16;
|
|
110
|
+
/** UINT32 max (XLS-47 §"Transaction fields" — internal type UINT32). */
|
|
111
|
+
const UINT32_MAX = 0xffffffff;
|
|
112
|
+
// ─── Helpers ─────────────────────────────────────────────────────────
|
|
113
|
+
/**
|
|
114
|
+
* Validate the "ASCII hex encoded" blob fields per XLS-47 §"PriceOracle
|
|
115
|
+
* Object": hex-encoded string whose decoded bytes are printable ASCII
|
|
116
|
+
* (0x20-0x7E) and whose decoded length is ≤ maxBytes.
|
|
117
|
+
*/
|
|
118
|
+
function validateAsciiHexBlob(field, value, maxBytes) {
|
|
119
|
+
if (!isString(value) || !isHex(value)) {
|
|
120
|
+
throw new ValidationError(`OracleSet: ${field} must be a hex-encoded string`);
|
|
121
|
+
}
|
|
122
|
+
if (value.length % 2 !== 0) {
|
|
123
|
+
throw new ValidationError(`OracleSet: ${field} must be a hex string with an even number of characters`);
|
|
124
|
+
}
|
|
125
|
+
const bytes = value.length / 2;
|
|
126
|
+
if (bytes > maxBytes) {
|
|
127
|
+
throw new ValidationError(`OracleSet: ${field} exceeds ${maxBytes} bytes (actual: ${bytes})`);
|
|
128
|
+
}
|
|
129
|
+
for (let i = 0; i < value.length; i += 2) {
|
|
130
|
+
const byte = parseInt(value.slice(i, i + 2), 16);
|
|
131
|
+
if (byte < PRINTABLE_ASCII_MIN || byte > PRINTABLE_ASCII_MAX) {
|
|
132
|
+
throw new ValidationError(`OracleSet: ${field} must decode to printable ASCII (0x${PRINTABLE_ASCII_MIN.toString(16)}-0x${PRINTABLE_ASCII_MAX.toString(16)})`);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Validate one `PriceDataSeries` element per XLS-47 and xrpl.js 5.3.0
|
|
138
|
+
* validateOracleSet() (`packages/xrpl/src/models/transactions/oracleSet.ts:91`).
|
|
139
|
+
*/
|
|
140
|
+
function validatePriceDataSeriesElement(value, index) {
|
|
141
|
+
if (!isRecord(value)) {
|
|
142
|
+
throw new ValidationError(`OracleSet: PriceDataSeries[${index}] must be an object`);
|
|
143
|
+
}
|
|
144
|
+
if (Object.keys(value).length !== 1) {
|
|
145
|
+
throw new ValidationError(`OracleSet: PriceDataSeries[${index}] must contain only a single "PriceData" key`);
|
|
146
|
+
}
|
|
147
|
+
const inner = value['PriceData'];
|
|
148
|
+
if (!isRecord(inner)) {
|
|
149
|
+
throw new ValidationError(`OracleSet: PriceDataSeries[${index}].PriceData must be an object`);
|
|
150
|
+
}
|
|
151
|
+
if (!isString(inner['BaseAsset'])) {
|
|
152
|
+
throw new ValidationError(`OracleSet: PriceDataSeries[${index}].PriceData.BaseAsset must be a string`);
|
|
153
|
+
}
|
|
154
|
+
if (!isString(inner['QuoteAsset'])) {
|
|
155
|
+
throw new ValidationError(`OracleSet: PriceDataSeries[${index}].PriceData.QuoteAsset must be a string`);
|
|
156
|
+
}
|
|
157
|
+
// AssetPrice and Scale must be paired (xrpl.js lines 144-151).
|
|
158
|
+
const hasPrice = 'AssetPrice' in inner && inner['AssetPrice'] !== undefined;
|
|
159
|
+
const hasScale = 'Scale' in inner && inner['Scale'] !== undefined;
|
|
160
|
+
if (hasPrice !== hasScale) {
|
|
161
|
+
throw new ValidationError(`OracleSet: PriceDataSeries[${index}].PriceData must have both AssetPrice and Scale if any are present`);
|
|
162
|
+
}
|
|
163
|
+
if (hasPrice) {
|
|
164
|
+
const assetPrice = inner['AssetPrice'];
|
|
165
|
+
if (isNumber(assetPrice)) {
|
|
166
|
+
// accept numbers as-is
|
|
167
|
+
}
|
|
168
|
+
else if (isString(assetPrice)) {
|
|
169
|
+
if (!isHex(assetPrice)) {
|
|
170
|
+
throw new ValidationError(`OracleSet: PriceDataSeries[${index}].PriceData.AssetPrice must be a valid hex string when provided as a string`);
|
|
171
|
+
}
|
|
172
|
+
if (assetPrice.length < MINIMUM_ASSET_PRICE_LENGTH ||
|
|
173
|
+
assetPrice.length > MAXIMUM_ASSET_PRICE_LENGTH) {
|
|
174
|
+
throw new ValidationError(`OracleSet: PriceDataSeries[${index}].PriceData.AssetPrice hex length must be between ${MINIMUM_ASSET_PRICE_LENGTH} and ${MAXIMUM_ASSET_PRICE_LENGTH} characters`);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
throw new ValidationError(`OracleSet: PriceDataSeries[${index}].PriceData.AssetPrice must be a number or a string`);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
if (hasScale) {
|
|
182
|
+
const scale = inner['Scale'];
|
|
183
|
+
if (!isNumber(scale) ||
|
|
184
|
+
!Number.isInteger(scale) ||
|
|
185
|
+
scale < SCALE_MIN ||
|
|
186
|
+
scale > SCALE_MAX) {
|
|
187
|
+
throw new ValidationError(`OracleSet: PriceDataSeries[${index}].PriceData.Scale must be an integer in [${SCALE_MIN}, ${SCALE_MAX}]`);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
// ─── Factory ─────────────────────────────────────────────────────────
|
|
192
|
+
export function oracleSet(props) {
|
|
193
|
+
// ── Account ── required, must be a non-empty string.
|
|
194
|
+
require(props.Account, 'OracleSet: Account is required', isString);
|
|
195
|
+
if (props.Account.length === 0) {
|
|
196
|
+
throw new ValidationError('OracleSet: Account is required');
|
|
197
|
+
}
|
|
198
|
+
// ── OracleDocumentID ── required, positive integer, UINT32.
|
|
199
|
+
if (!isNumber(props.OracleDocumentID) || !Number.isInteger(props.OracleDocumentID)) {
|
|
200
|
+
throw new ValidationError('OracleSet: OracleDocumentID must be an integer');
|
|
201
|
+
}
|
|
202
|
+
if (props.OracleDocumentID < 0 || props.OracleDocumentID > UINT32_MAX) {
|
|
203
|
+
throw new ValidationError(`OracleSet: OracleDocumentID must be in [0, ${UINT32_MAX}] (UINT32)`);
|
|
204
|
+
}
|
|
205
|
+
// ── LastUpdateTime ── required, positive integer, UINT32.
|
|
206
|
+
if (!isNumber(props.LastUpdateTime) || !Number.isInteger(props.LastUpdateTime)) {
|
|
207
|
+
throw new ValidationError('OracleSet: LastUpdateTime must be an integer');
|
|
208
|
+
}
|
|
209
|
+
if (props.LastUpdateTime < 0 || props.LastUpdateTime > UINT32_MAX) {
|
|
210
|
+
throw new ValidationError(`OracleSet: LastUpdateTime must be in [0, ${UINT32_MAX}] (UINT32)`);
|
|
211
|
+
}
|
|
212
|
+
// ── PriceDataSeries ── required, non-empty (per spec), ≤10 elements.
|
|
213
|
+
if (!isArray(props.PriceDataSeries)) {
|
|
214
|
+
throw new ValidationError('OracleSet: PriceDataSeries is required and must be an array');
|
|
215
|
+
}
|
|
216
|
+
if (props.PriceDataSeries.length === 0) {
|
|
217
|
+
throw new ValidationError('OracleSet: PriceDataSeries must contain at least one PriceData object');
|
|
218
|
+
}
|
|
219
|
+
if (props.PriceDataSeries.length > PRICE_DATA_SERIES_MAX_LENGTH) {
|
|
220
|
+
throw new ValidationError(`OracleSet: PriceDataSeries must have at most ${PRICE_DATA_SERIES_MAX_LENGTH} PriceData objects`);
|
|
221
|
+
}
|
|
222
|
+
for (let i = 0; i < props.PriceDataSeries.length; i++) {
|
|
223
|
+
validatePriceDataSeriesElement(props.PriceDataSeries[i], i);
|
|
224
|
+
}
|
|
225
|
+
// ── Provider ── hex-encoded printable ASCII, ≤256 bytes.
|
|
226
|
+
if (props.Provider !== undefined) {
|
|
227
|
+
validateAsciiHexBlob('Provider', props.Provider, MAX_PROVIDER_BYTES);
|
|
228
|
+
}
|
|
229
|
+
// ── URI ── hex-encoded, ≤256 bytes.
|
|
230
|
+
if (props.URI !== undefined) {
|
|
231
|
+
validateAsciiHexBlob('URI', props.URI, MAX_URI_BYTES);
|
|
232
|
+
}
|
|
233
|
+
// ── AssetClass ── hex-encoded printable ASCII, ≤16 bytes.
|
|
234
|
+
if (props.AssetClass !== undefined) {
|
|
235
|
+
validateAsciiHexBlob('AssetClass', props.AssetClass, MAX_ASSET_CLASS_BYTES);
|
|
236
|
+
}
|
|
237
|
+
return buildFrozenTx('OracleSet', props, {
|
|
238
|
+
validate() {
|
|
239
|
+
// Validated at construction.
|
|
240
|
+
},
|
|
241
|
+
toJSON() {
|
|
242
|
+
const json = {};
|
|
243
|
+
for (const k of Object.keys(this)) {
|
|
244
|
+
if (k === 'validate' || k === 'toJSON' || k === 'with')
|
|
245
|
+
continue;
|
|
246
|
+
const v = this[k];
|
|
247
|
+
if (v !== undefined)
|
|
248
|
+
json[k] = v;
|
|
249
|
+
}
|
|
250
|
+
return json;
|
|
251
|
+
},
|
|
252
|
+
with(overrides) {
|
|
253
|
+
return oracleSet(mergeForWith(this, overrides));
|
|
254
|
+
},
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
//# sourceMappingURL=oracle-set.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oracle-set.js","sourceRoot":"","sources":["../../../src/fp/factories/oracle-set.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Functional PaymentChannelClaim factory — frozen-object style.
|
|
3
|
+
*
|
|
4
|
+
* Claims XRP from a payment channel, adjusts the channel's expiration,
|
|
5
|
+
* or both. The transaction can be sent by the channel source, the
|
|
6
|
+
* channel destination, or any account when the channel has already
|
|
7
|
+
* expired. The destination must supply `Signature` + `PublicKey`; the
|
|
8
|
+
* source can omit them. Validation happens at construction; there is
|
|
9
|
+
* no way to construct an invalid tx.
|
|
10
|
+
*
|
|
11
|
+
* import { paymentChannelClaim } from 'xrplt/fp';
|
|
12
|
+
* const tx = paymentChannelClaim({ Account, Channel });
|
|
13
|
+
* const j = tx.toJSON();
|
|
14
|
+
* const tx2 = tx.with({ Balance: '2000000' });
|
|
15
|
+
*
|
|
16
|
+
* Affected amendments:
|
|
17
|
+
* - `PayChan` (base PaymentChannelClaim)
|
|
18
|
+
* - `Credentials` (CredentialIDs field for permissioned-domain auth)
|
|
19
|
+
* - `fixPayChanRecipientOwnerDir` (legacy channels with deleted
|
|
20
|
+
* destinations have relaxed delivery rules; runtime-only)
|
|
21
|
+
*
|
|
22
|
+
* @see https://xrpl.org/docs/references/protocol/transactions/types/paymentchannelclaim
|
|
23
|
+
* @see https://github.com/XRPLF/rippled/blob/develop/src/libxrpl/tx/transactors/payment_channel/PaymentChannelClaim.cpp
|
|
24
|
+
*
|
|
25
|
+
* ## Divergences
|
|
26
|
+
*
|
|
27
|
+
* Compared with `src/transactions/payment-channel-claim.ts`, this
|
|
28
|
+
* factory adds preclaim guards the class API skips:
|
|
29
|
+
*
|
|
30
|
+
* 1. **`Channel` must be a 64-character hex string (UInt256).**
|
|
31
|
+
* Source: xrpl.org `paymentchannelclaim.md` Fields table — "Channel
|
|
32
|
+
* | String - Hexadecimal | UInt256 | Yes". xrpl.js
|
|
33
|
+
* `validatePaymentChannelClaim`
|
|
34
|
+
* (`packages/xrpl/src/models/transactions/paymentChannelClaim.ts:164`)
|
|
35
|
+
* only checks `typeof tx.Channel === 'string'`. The class also
|
|
36
|
+
* only checks `isString`. The Channel ID is the SHA-512-half of
|
|
37
|
+
* (Account, Destination, Sequence) — i.e. the ledger object hash
|
|
38
|
+
* of the PayChannel entry — which is always a 64-char hex string.
|
|
39
|
+
*
|
|
40
|
+
* 2. **`Amount` and `Balance` must be strictly-positive XRP drops
|
|
41
|
+
* strings (XRP-only — no IOU/MPT object forms).**
|
|
42
|
+
* Source: xrpl.org `paymentchannelclaim.md` Fields table — both
|
|
43
|
+
* fields are documented as "XRP, in drops". xrpl.js
|
|
44
|
+
* `validatePaymentChannelClaim` only checks `typeof tx.Amount === 'string'`
|
|
45
|
+
* (no positive/sign guard). The class declares them as `Amount`
|
|
46
|
+
* (`string | IssuedCurrencyAmount | MPTAmount`) and runs them
|
|
47
|
+
* through `isAmount`, which accepts IOU/MPT objects and arbitrary
|
|
48
|
+
* numeric strings (including `'0'` and `'-1'`). The ledger rejects
|
|
49
|
+
* IOU/MPT forms outright (`temBAD_AMOUNT`) and a non-positive
|
|
50
|
+
* Balance would deliver nothing — this factory rejects both cases
|
|
51
|
+
* at construction.
|
|
52
|
+
*
|
|
53
|
+
* 3. **`PublicKey`, if provided, must be a hex string of 32 or 33
|
|
54
|
+
* bytes (Ed25519 or compressed secp256k1).**
|
|
55
|
+
* Source: xrpl.org `paymentchannelclaim.md` Fields table —
|
|
56
|
+
* "PublicKey | String - Hexadecimal | Blob". rippled's preflight
|
|
57
|
+
* uses `publicKeyType()` to gate this — same set of accepted
|
|
58
|
+
* lengths as `PaymentChannelCreate`. xrpl.js only checks
|
|
59
|
+
* `typeof tx.PublicKey === 'string'`; the class also only checks
|
|
60
|
+
* `isString`. A non-hex or wrong-length PublicKey makes signature
|
|
61
|
+
* verification fail with `temMALFORMED`.
|
|
62
|
+
*
|
|
63
|
+
* 4. **`Signature`, if provided, must be a hex string.**
|
|
64
|
+
* Source: xrpl.org `paymentchannelclaim.md` Fields table —
|
|
65
|
+
* "Signature | String - Hexadecimal | Blob". xrpl.js only checks
|
|
66
|
+
* `typeof tx.Signature === 'string'`; the class also only checks
|
|
67
|
+
* `isString`. Non-hex signature blobs fail signature verification
|
|
68
|
+
* with `temMALFORMED`.
|
|
69
|
+
*
|
|
70
|
+
* 5. **`CredentialIDs` field is supported (Credentials amendment).**
|
|
71
|
+
* Source: xrpl.js `PaymentChannelClaim` interface
|
|
72
|
+
* (`packages/xrpl/src/models/transactions/paymentChannelClaim.ts:141`)
|
|
73
|
+
* — "CredentialIDs?: string[] — Credentials associated with the
|
|
74
|
+
* sender of this transaction. The credentials included must not be
|
|
75
|
+
* expired." xrpl.org `paymentchannelclaim.md` Fields table also
|
|
76
|
+
* lists `CredentialIDs` as a `Vector256` field. The local class
|
|
77
|
+
* silently drops the field.
|
|
78
|
+
*
|
|
79
|
+
* 6. **`CredentialIDs` length must be in
|
|
80
|
+
* [1, MAX_AUTHORIZED_CREDENTIALS = 8], each entry must be a
|
|
81
|
+
* 64-character hex string, and duplicates are rejected.**
|
|
82
|
+
* Source: xrpl.js `validateCredentialsList`
|
|
83
|
+
* (`packages/xrpl/src/models/transactions/common.ts:1106–1148`)
|
|
84
|
+
* enforces empty-array reject, length cap, 64-char hex entries,
|
|
85
|
+
* and "Credentials cannot contain duplicate elements." The class
|
|
86
|
+
* does not model the field.
|
|
87
|
+
*
|
|
88
|
+
* 7. **`Account` must be a valid XRPL classic or X-address.**
|
|
89
|
+
* Source: protocol-level invariant — every transaction's `Account`
|
|
90
|
+
* field must be a parseable address. The class does not validate
|
|
91
|
+
* `Account` at all (its `super.validate()` delegates to
|
|
92
|
+
* `BaseTransaction.validate`, which performs no address format
|
|
93
|
+
* check).
|
|
94
|
+
*
|
|
95
|
+
* Preclaim checks that require ledger state (NOT locally checkable):
|
|
96
|
+
* - The `Channel` ledger object must exist (`tecNO_ENTRY`).
|
|
97
|
+
* - The sender's authorization (Signature/PublicKey) must verify
|
|
98
|
+
* against the channel's stored PublicKey and the claimed
|
|
99
|
+
* Amount (`temBAD_AUTH` / `temBAD_SIGNATURE`).
|
|
100
|
+
* - `Balance`, when delivering, must exceed channel's current
|
|
101
|
+
* `Balance` and must not exceed `Amount` (`temBAD_AMOUNT`).
|
|
102
|
+
* - The destination account must exist when this transaction
|
|
103
|
+
* delivers XRP (`tecNO_DST`, per XLS-0007 §3.1.3).
|
|
104
|
+
* - If the channel's `Expiration` or `CancelAfter` is older than the
|
|
105
|
+
* previous ledger's close time, the channel closes regardless of
|
|
106
|
+
* the transaction's contents.
|
|
107
|
+
*/
|
|
108
|
+
import type { PaymentChannelClaimFlagsInterface } from '../../types/flags.js';
|
|
109
|
+
export interface PaymentChannelClaimProps {
|
|
110
|
+
/** The unique address of the transaction sender. */
|
|
111
|
+
Account: string;
|
|
112
|
+
/** The unique ID of the payment channel (64-char hex / UInt256). */
|
|
113
|
+
Channel: string;
|
|
114
|
+
/**
|
|
115
|
+
* Total XRP authorized by the signature, in drops. Cumulative across
|
|
116
|
+
* the channel's lifetime. Required when delivering XRP; must match
|
|
117
|
+
* the signed message. Must be > 0.
|
|
118
|
+
*/
|
|
119
|
+
Amount?: string | undefined;
|
|
120
|
+
/**
|
|
121
|
+
* Total XRP delivered by the channel after this claim is processed,
|
|
122
|
+
* in drops. Required to deliver XRP; must be > 0 and strictly
|
|
123
|
+
* greater than the channel's current `Balance`.
|
|
124
|
+
*/
|
|
125
|
+
Balance?: string | undefined;
|
|
126
|
+
/**
|
|
127
|
+
* Public key used to verify `Signature` (32 or 33-byte hex). Must
|
|
128
|
+
* match the channel's stored `PublicKey`.
|
|
129
|
+
*/
|
|
130
|
+
PublicKey?: string | undefined;
|
|
131
|
+
/**
|
|
132
|
+
* Claim signature, hex-encoded. Required unless the sender is the
|
|
133
|
+
* channel's source address.
|
|
134
|
+
*/
|
|
135
|
+
Signature?: string | undefined;
|
|
136
|
+
/**
|
|
137
|
+
* Optional credentials authorizing this claim. Each entry is a
|
|
138
|
+
* 64-char hex ledger entry ID. Length must be in [1, 8].
|
|
139
|
+
*/
|
|
140
|
+
CredentialIDs?: string[] | undefined;
|
|
141
|
+
/** Bit-flags: 0, tfRenew (0x00010000), and/or tfClose (0x00020000). */
|
|
142
|
+
Flags?: number | PaymentChannelClaimFlagsInterface | undefined;
|
|
143
|
+
Fee?: string | undefined;
|
|
144
|
+
Sequence?: number | undefined;
|
|
145
|
+
}
|
|
146
|
+
export interface PaymentChannelClaim extends Readonly<PaymentChannelClaimProps> {
|
|
147
|
+
readonly TransactionType: 'PaymentChannelClaim';
|
|
148
|
+
validate(): void;
|
|
149
|
+
toJSON(): Record<string, unknown>;
|
|
150
|
+
with(overrides: Partial<PaymentChannelClaimProps>): PaymentChannelClaim;
|
|
151
|
+
}
|
|
152
|
+
export declare function paymentChannelClaim(props: PaymentChannelClaimProps): PaymentChannelClaim;
|
|
153
|
+
//# sourceMappingURL=payment-channel-claim.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"payment-channel-claim.d.ts","sourceRoot":"","sources":["../../../src/fp/factories/payment-channel-claim.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0GG;AACH,OAAO,KAAK,EAAE,iCAAiC,EAAE,MAAM,sBAAsB,CAAC;AA2B9E,MAAM,WAAW,wBAAwB;IACvC,oDAAoD;IACpD,OAAO,EAAE,MAAM,CAAC;IAChB,oEAAoE;IACpE,OAAO,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IACrC,uEAAuE;IACvE,KAAK,CAAC,EAAE,MAAM,GAAG,iCAAiC,GAAG,SAAS,CAAC;IAC/D,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC/B;AAED,MAAM,WAAW,mBACf,SAAQ,QAAQ,CAAC,wBAAwB,CAAC;IAC1C,QAAQ,CAAC,eAAe,EAAE,qBAAqB,CAAC;IAChD,QAAQ,IAAI,IAAI,CAAC;IACjB,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,IAAI,CACF,SAAS,EAAE,OAAO,CAAC,wBAAwB,CAAC,GAC3C,mBAAmB,CAAC;CACxB;AAoBD,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,wBAAwB,GAC9B,mBAAmB,CAoIrB"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { isAccount, isArray, isHex, isString, } from '../../validation/helpers.js';
|
|
2
|
+
import { ValidationError } from '../../errors.js';
|
|
3
|
+
import { buildFrozenTx, mergeForWith, require } from '../shape.js';
|
|
4
|
+
// ─── Spec constants ──────────────────────────────────────────────────
|
|
5
|
+
// HASH256 in hex is 64 characters. (xrpl.org paymentchannelclaim.md:
|
|
6
|
+
// "Channel | String - Hexadecimal | UInt256 | Yes".)
|
|
7
|
+
const HASH256_HEX_LENGTH = 64;
|
|
8
|
+
// Allowed public-key hex lengths — Ed25519 (32 bytes / 64 hex) or
|
|
9
|
+
// secp256k1 compressed (33 bytes / 66 hex). Same set as rippled's
|
|
10
|
+
// `publicKeyType()` accepts.
|
|
11
|
+
const ALLOWED_PUBLIC_KEY_HEX_LENGTHS = [64, 66];
|
|
12
|
+
// xrpl.js caps non-DomainSet credential arrays at 8 entries
|
|
13
|
+
// (`packages/xrpl/src/models/transactions/common.ts:28`).
|
|
14
|
+
const MAX_CREDENTIAL_IDS = 8;
|
|
15
|
+
// ─── Helpers ─────────────────────────────────────────────────────────
|
|
16
|
+
/**
|
|
17
|
+
* Validate a strictly-positive XRP drops string. Accepts canonical
|
|
18
|
+
* decimal-or-scientific mantissa form; rejects zero, negative, and
|
|
19
|
+
* non-numeric values. Used for `Amount` and `Balance` which are
|
|
20
|
+
* documented as "XRP, in drops" (XRP-only — no IOU/MPT forms).
|
|
21
|
+
*/
|
|
22
|
+
function isPositiveXrpDrops(value) {
|
|
23
|
+
if (!isString(value))
|
|
24
|
+
return false;
|
|
25
|
+
if (!/^[0-9]+(?:\.[0-9]+)?(?:[eE][+-]?[0-9]+)?$/u.test(value)) {
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
return parseFloat(value) > 0;
|
|
29
|
+
}
|
|
30
|
+
// ─── Factory ─────────────────────────────────────────────────────────
|
|
31
|
+
export function paymentChannelClaim(props) {
|
|
32
|
+
// ── Account ── required, must be a valid XRPL classic or X-address.
|
|
33
|
+
require(props.Account, 'PaymentChannelClaim: Account is required', isAccount);
|
|
34
|
+
// ── Channel ── required, 64-char hex (UInt256 — the ledger object
|
|
35
|
+
// hash of the PayChannel entry).
|
|
36
|
+
if (!isString(props.Channel) ||
|
|
37
|
+
!isHex(props.Channel) ||
|
|
38
|
+
props.Channel.length !== HASH256_HEX_LENGTH) {
|
|
39
|
+
throw new ValidationError('PaymentChannelClaim: Channel must be a 64-character hex string (UInt256, the PayChannel ledger object hash)');
|
|
40
|
+
}
|
|
41
|
+
// ── Amount ── optional, but if supplied must be a strictly-positive
|
|
42
|
+
// XRP drops string. Rejects IOU/MPT object forms (those would
|
|
43
|
+
// match the class's `isAmount` shape but the ledger is
|
|
44
|
+
// XRP-only for this tx).
|
|
45
|
+
if (props.Amount !== undefined && !isPositiveXrpDrops(props.Amount)) {
|
|
46
|
+
throw new ValidationError('PaymentChannelClaim: Amount must be a strictly-positive XRP drops string (temBAD_AMOUNT)');
|
|
47
|
+
}
|
|
48
|
+
// ── Balance ── optional, but if supplied must be a strictly-positive
|
|
49
|
+
// XRP drops string.
|
|
50
|
+
if (props.Balance !== undefined && !isPositiveXrpDrops(props.Balance)) {
|
|
51
|
+
throw new ValidationError('PaymentChannelClaim: Balance must be a strictly-positive XRP drops string (temBAD_AMOUNT)');
|
|
52
|
+
}
|
|
53
|
+
// ── PublicKey ── optional, but if supplied must be hex of 32 or
|
|
54
|
+
// 33 bytes (Ed25519 or compressed secp256k1). Matches rippled's
|
|
55
|
+
// `publicKeyType()` preflight check.
|
|
56
|
+
if (props.PublicKey !== undefined) {
|
|
57
|
+
if (!isString(props.PublicKey) || !isHex(props.PublicKey)) {
|
|
58
|
+
throw new ValidationError('PaymentChannelClaim: PublicKey must be a hex string');
|
|
59
|
+
}
|
|
60
|
+
if (!ALLOWED_PUBLIC_KEY_HEX_LENGTHS.includes(props.PublicKey.length)) {
|
|
61
|
+
throw new ValidationError(`PaymentChannelClaim: PublicKey hex must be 64 (Ed25519, 32 bytes) or 66 (secp256k1, 33 bytes) characters; got ${props.PublicKey.length} hex chars (temMALFORMED)`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// ── Signature ── optional, but if supplied must be a hex string.
|
|
65
|
+
if (props.Signature !== undefined) {
|
|
66
|
+
if (!isString(props.Signature) || !isHex(props.Signature)) {
|
|
67
|
+
throw new ValidationError('PaymentChannelClaim: Signature must be a hex string (temMALFORMED)');
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
// ── CredentialIDs ── optional array, but bounds + entry-shape
|
|
71
|
+
// enforced when present. Per xrpl.js: length in
|
|
72
|
+
// [1, MAX_AUTHORIZED_CREDENTIALS]; each entry a 64-char hex
|
|
73
|
+
// string; no duplicates.
|
|
74
|
+
if (props.CredentialIDs !== undefined) {
|
|
75
|
+
if (!isArray(props.CredentialIDs)) {
|
|
76
|
+
throw new ValidationError('PaymentChannelClaim: CredentialIDs must be an array of credential ID strings');
|
|
77
|
+
}
|
|
78
|
+
if (props.CredentialIDs.length === 0) {
|
|
79
|
+
throw new ValidationError('PaymentChannelClaim: CredentialIDs must not be an empty array');
|
|
80
|
+
}
|
|
81
|
+
if (props.CredentialIDs.length > MAX_CREDENTIAL_IDS) {
|
|
82
|
+
throw new ValidationError(`PaymentChannelClaim: CredentialIDs length cannot exceed ${MAX_CREDENTIAL_IDS} elements (actual: ${props.CredentialIDs.length})`);
|
|
83
|
+
}
|
|
84
|
+
const seen = new Set();
|
|
85
|
+
for (let i = 0; i < props.CredentialIDs.length; i++) {
|
|
86
|
+
const cid = props.CredentialIDs[i];
|
|
87
|
+
if (!isString(cid) ||
|
|
88
|
+
!isHex(cid) ||
|
|
89
|
+
cid.length !== HASH256_HEX_LENGTH) {
|
|
90
|
+
throw new ValidationError(`PaymentChannelClaim: CredentialIDs[${i}] must be a ${HASH256_HEX_LENGTH}-character hex string`);
|
|
91
|
+
}
|
|
92
|
+
if (seen.has(cid)) {
|
|
93
|
+
throw new ValidationError(`PaymentChannelClaim: CredentialIDs[${i}] is a duplicate of an earlier entry`);
|
|
94
|
+
}
|
|
95
|
+
seen.add(cid);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return buildFrozenTx('PaymentChannelClaim', props, {
|
|
99
|
+
validate() {
|
|
100
|
+
// Validated at construction.
|
|
101
|
+
},
|
|
102
|
+
toJSON() {
|
|
103
|
+
const json = {};
|
|
104
|
+
for (const k of Object.keys(this)) {
|
|
105
|
+
if (k === 'validate' || k === 'toJSON' || k === 'with')
|
|
106
|
+
continue;
|
|
107
|
+
const v = this[k];
|
|
108
|
+
if (v !== undefined)
|
|
109
|
+
json[k] = v;
|
|
110
|
+
}
|
|
111
|
+
return json;
|
|
112
|
+
},
|
|
113
|
+
with(overrides) {
|
|
114
|
+
return paymentChannelClaim(mergeForWith(this, overrides));
|
|
115
|
+
},
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=payment-channel-claim.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"payment-channel-claim.js","sourceRoot":"","sources":["../../../src/fp/factories/payment-channel-claim.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export interface PaymentChannelCreateProps {
|
|
2
|
+
/** The unique address of the transaction sender (becomes the channel owner). */
|
|
3
|
+
Account: string;
|
|
4
|
+
/** Amount of XRP, in drops, to set aside in the channel. Must be > 0. */
|
|
5
|
+
Amount: string;
|
|
6
|
+
/** The account that can receive XRP claims against this channel. */
|
|
7
|
+
Destination: string;
|
|
8
|
+
/** Seconds the source must wait before closing the channel. UInt32. */
|
|
9
|
+
SettleDelay: number;
|
|
10
|
+
/**
|
|
11
|
+
* 33-byte (secp256k1) or 32-byte (Ed25519) public key in hex.
|
|
12
|
+
*/
|
|
13
|
+
PublicKey: string;
|
|
14
|
+
/** Time (seconds since Ripple Epoch) when the channel expires. UInt32. */
|
|
15
|
+
CancelAfter?: number | undefined;
|
|
16
|
+
/** Arbitrary tag for the destination. UInt32. */
|
|
17
|
+
DestinationTag?: number | undefined;
|
|
18
|
+
/** Bit-flags for this transaction. PaymentChannelCreate has no defined flags. */
|
|
19
|
+
Flags?: number | undefined;
|
|
20
|
+
Fee?: string | undefined;
|
|
21
|
+
Sequence?: number | undefined;
|
|
22
|
+
}
|
|
23
|
+
export interface PaymentChannelCreate extends Readonly<PaymentChannelCreateProps> {
|
|
24
|
+
readonly TransactionType: 'PaymentChannelCreate';
|
|
25
|
+
validate(): void;
|
|
26
|
+
toJSON(): Record<string, unknown>;
|
|
27
|
+
with(overrides: Partial<PaymentChannelCreateProps>): PaymentChannelCreate;
|
|
28
|
+
}
|
|
29
|
+
export declare function paymentChannelCreate(props: PaymentChannelCreateProps): PaymentChannelCreate;
|
|
30
|
+
//# sourceMappingURL=payment-channel-create.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"payment-channel-create.d.ts","sourceRoot":"","sources":["../../../src/fp/factories/payment-channel-create.ts"],"names":[],"mappings":"AA0HA,MAAM,WAAW,yBAAyB;IACxC,gFAAgF;IAChF,OAAO,EAAE,MAAM,CAAC;IAChB,yEAAyE;IACzE,MAAM,EAAE,MAAM,CAAC;IACf,oEAAoE;IACpE,WAAW,EAAE,MAAM,CAAC;IACpB,uEAAuE;IACvE,WAAW,EAAE,MAAM,CAAC;IACpB;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;IAClB,0EAA0E;IAC1E,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,iDAAiD;IACjD,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,iFAAiF;IACjF,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC/B;AAED,MAAM,WAAW,oBACf,SAAQ,QAAQ,CAAC,yBAAyB,CAAC;IAC3C,QAAQ,CAAC,eAAe,EAAE,sBAAsB,CAAC;IACjD,QAAQ,IAAI,IAAI,CAAC;IACjB,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,IAAI,CACF,SAAS,EAAE,OAAO,CAAC,yBAAyB,CAAC,GAC5C,oBAAoB,CAAC;CACzB;AAID,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,yBAAyB,GAC/B,oBAAoB,CAgGtB"}
|