tenzro-wallet 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 +201 -0
- package/README.md +128 -0
- package/dist/balance/aggregator.d.ts +16 -0
- package/dist/balance/aggregator.d.ts.map +1 -0
- package/dist/balance/aggregator.js +73 -0
- package/dist/balance/aggregator.js.map +1 -0
- package/dist/balance/index.d.ts +3 -0
- package/dist/balance/index.d.ts.map +1 -0
- package/dist/balance/index.js +2 -0
- package/dist/balance/index.js.map +1 -0
- package/dist/consent/index.d.ts +3 -0
- package/dist/consent/index.d.ts.map +1 -0
- package/dist/consent/index.js +2 -0
- package/dist/consent/index.js.map +1 -0
- package/dist/consent/policy.d.ts +27 -0
- package/dist/consent/policy.d.ts.map +1 -0
- package/dist/consent/policy.js +121 -0
- package/dist/consent/policy.js.map +1 -0
- package/dist/crypto/eip1559.d.ts +53 -0
- package/dist/crypto/eip1559.d.ts.map +1 -0
- package/dist/crypto/eip1559.js +79 -0
- package/dist/crypto/eip1559.js.map +1 -0
- package/dist/crypto/keccak256.d.ts +20 -0
- package/dist/crypto/keccak256.d.ts.map +1 -0
- package/dist/crypto/keccak256.js +167 -0
- package/dist/crypto/keccak256.js.map +1 -0
- package/dist/crypto/rlp.d.ts +30 -0
- package/dist/crypto/rlp.d.ts.map +1 -0
- package/dist/crypto/rlp.js +165 -0
- package/dist/crypto/rlp.js.map +1 -0
- package/dist/crypto/sha256.d.ts +14 -0
- package/dist/crypto/sha256.d.ts.map +1 -0
- package/dist/crypto/sha256.js +33 -0
- package/dist/crypto/sha256.js.map +1 -0
- package/dist/crypto/solana.d.ts +86 -0
- package/dist/crypto/solana.d.ts.map +1 -0
- package/dist/crypto/solana.js +218 -0
- package/dist/crypto/solana.js.map +1 -0
- package/dist/custody/frost/backend.d.ts +59 -0
- package/dist/custody/frost/backend.d.ts.map +1 -0
- package/dist/custody/frost/backend.js +83 -0
- package/dist/custody/frost/backend.js.map +1 -0
- package/dist/custody/frost/coordinator.d.ts +148 -0
- package/dist/custody/frost/coordinator.d.ts.map +1 -0
- package/dist/custody/frost/coordinator.js +58 -0
- package/dist/custody/frost/coordinator.js.map +1 -0
- package/dist/custody/frost/ed25519-driver.d.ts +30 -0
- package/dist/custody/frost/ed25519-driver.d.ts.map +1 -0
- package/dist/custody/frost/ed25519-driver.js +76 -0
- package/dist/custody/frost/ed25519-driver.js.map +1 -0
- package/dist/custody/frost/http-adapter.d.ts +77 -0
- package/dist/custody/frost/http-adapter.d.ts.map +1 -0
- package/dist/custody/frost/http-adapter.js +168 -0
- package/dist/custody/frost/http-adapter.js.map +1 -0
- package/dist/custody/frost/hybrid-driver.d.ts +37 -0
- package/dist/custody/frost/hybrid-driver.d.ts.map +1 -0
- package/dist/custody/frost/hybrid-driver.js +60 -0
- package/dist/custody/frost/hybrid-driver.js.map +1 -0
- package/dist/custody/frost/index.d.ts +12 -0
- package/dist/custody/frost/index.d.ts.map +1 -0
- package/dist/custody/frost/index.js +6 -0
- package/dist/custody/frost/index.js.map +1 -0
- package/dist/custody/frost/secp256k1-driver.d.ts +26 -0
- package/dist/custody/frost/secp256k1-driver.d.ts.map +1 -0
- package/dist/custody/frost/secp256k1-driver.js +78 -0
- package/dist/custody/frost/secp256k1-driver.js.map +1 -0
- package/dist/custody/index.d.ts +9 -0
- package/dist/custody/index.d.ts.map +1 -0
- package/dist/custody/index.js +11 -0
- package/dist/custody/index.js.map +1 -0
- package/dist/custody/internal-mpc.d.ts +14 -0
- package/dist/custody/internal-mpc.d.ts.map +1 -0
- package/dist/custody/internal-mpc.js +40 -0
- package/dist/custody/internal-mpc.js.map +1 -0
- package/dist/custody/mldsa/coordinator.d.ts +63 -0
- package/dist/custody/mldsa/coordinator.d.ts.map +1 -0
- package/dist/custody/mldsa/coordinator.js +44 -0
- package/dist/custody/mldsa/coordinator.js.map +1 -0
- package/dist/custody/mldsa/driver.d.ts +23 -0
- package/dist/custody/mldsa/driver.d.ts.map +1 -0
- package/dist/custody/mldsa/driver.js +43 -0
- package/dist/custody/mldsa/driver.js.map +1 -0
- package/dist/custody/mldsa/http-adapter.d.ts +59 -0
- package/dist/custody/mldsa/http-adapter.d.ts.map +1 -0
- package/dist/custody/mldsa/http-adapter.js +103 -0
- package/dist/custody/mldsa/http-adapter.js.map +1 -0
- package/dist/custody/mldsa/index.d.ts +7 -0
- package/dist/custody/mldsa/index.d.ts.map +1 -0
- package/dist/custody/mldsa/index.js +4 -0
- package/dist/custody/mldsa/index.js.map +1 -0
- package/dist/custody/pairing/http-adapter.d.ts +40 -0
- package/dist/custody/pairing/http-adapter.d.ts.map +1 -0
- package/dist/custody/pairing/http-adapter.js +113 -0
- package/dist/custody/pairing/http-adapter.js.map +1 -0
- package/dist/custody/pairing/index.d.ts +10 -0
- package/dist/custody/pairing/index.d.ts.map +1 -0
- package/dist/custody/pairing/index.js +8 -0
- package/dist/custody/pairing/index.js.map +1 -0
- package/dist/custody/pairing/port.d.ts +121 -0
- package/dist/custody/pairing/port.d.ts.map +1 -0
- package/dist/custody/pairing/port.js +40 -0
- package/dist/custody/pairing/port.js.map +1 -0
- package/dist/custody/passkey-share/http-adapter.d.ts +77 -0
- package/dist/custody/passkey-share/http-adapter.d.ts.map +1 -0
- package/dist/custody/passkey-share/http-adapter.js +125 -0
- package/dist/custody/passkey-share/http-adapter.js.map +1 -0
- package/dist/custody/passkey-share/index.d.ts +7 -0
- package/dist/custody/passkey-share/index.d.ts.map +1 -0
- package/dist/custody/passkey-share/index.js +4 -0
- package/dist/custody/passkey-share/index.js.map +1 -0
- package/dist/custody/passkey-share/unwrapper.d.ts +174 -0
- package/dist/custody/passkey-share/unwrapper.d.ts.map +1 -0
- package/dist/custody/passkey-share/unwrapper.js +132 -0
- package/dist/custody/passkey-share/unwrapper.js.map +1 -0
- package/dist/custody/passkey-share/webauthn-adapter.d.ts +112 -0
- package/dist/custody/passkey-share/webauthn-adapter.d.ts.map +1 -0
- package/dist/custody/passkey-share/webauthn-adapter.js +150 -0
- package/dist/custody/passkey-share/webauthn-adapter.js.map +1 -0
- package/dist/custody/surface-key-id.d.ts +15 -0
- package/dist/custody/surface-key-id.d.ts.map +1 -0
- package/dist/custody/surface-key-id.js +25 -0
- package/dist/custody/surface-key-id.js.map +1 -0
- package/dist/dapp/eip6963.d.ts +64 -0
- package/dist/dapp/eip6963.d.ts.map +1 -0
- package/dist/dapp/eip6963.js +55 -0
- package/dist/dapp/eip6963.js.map +1 -0
- package/dist/dapp/index.d.ts +21 -0
- package/dist/dapp/index.d.ts.map +1 -0
- package/dist/dapp/index.js +24 -0
- package/dist/dapp/index.js.map +1 -0
- package/dist/identity/delegate-set.d.ts +57 -0
- package/dist/identity/delegate-set.d.ts.map +1 -0
- package/dist/identity/delegate-set.js +85 -0
- package/dist/identity/delegate-set.js.map +1 -0
- package/dist/identity/did.d.ts +17 -0
- package/dist/identity/did.d.ts.map +1 -0
- package/dist/identity/did.js +60 -0
- package/dist/identity/did.js.map +1 -0
- package/dist/identity/index.d.ts +14 -0
- package/dist/identity/index.d.ts.map +1 -0
- package/dist/identity/index.js +8 -0
- package/dist/identity/index.js.map +1 -0
- package/dist/identity/provision.d.ts +13 -0
- package/dist/identity/provision.d.ts.map +1 -0
- package/dist/identity/provision.js +151 -0
- package/dist/identity/provision.js.map +1 -0
- package/dist/identity/provisioning-http-adapter.d.ts +81 -0
- package/dist/identity/provisioning-http-adapter.d.ts.map +1 -0
- package/dist/identity/provisioning-http-adapter.js +114 -0
- package/dist/identity/provisioning-http-adapter.js.map +1 -0
- package/dist/identity/recovery-http-adapter.d.ts +83 -0
- package/dist/identity/recovery-http-adapter.d.ts.map +1 -0
- package/dist/identity/recovery-http-adapter.js +139 -0
- package/dist/identity/recovery-http-adapter.js.map +1 -0
- package/dist/identity/wallet-new.d.ts +132 -0
- package/dist/identity/wallet-new.d.ts.map +1 -0
- package/dist/identity/wallet-new.js +94 -0
- package/dist/identity/wallet-new.js.map +1 -0
- package/dist/identity/wallet-recover.d.ts +116 -0
- package/dist/identity/wallet-recover.d.ts.map +1 -0
- package/dist/identity/wallet-recover.js +95 -0
- package/dist/identity/wallet-recover.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/kernel.d.ts +119 -0
- package/dist/kernel.d.ts.map +1 -0
- package/dist/kernel.js +144 -0
- package/dist/kernel.js.map +1 -0
- package/dist/ports/adapters/tenzro-identity-adapter.d.ts +44 -0
- package/dist/ports/adapters/tenzro-identity-adapter.d.ts.map +1 -0
- package/dist/ports/adapters/tenzro-identity-adapter.js +60 -0
- package/dist/ports/adapters/tenzro-identity-adapter.js.map +1 -0
- package/dist/ports/adapters/tenzro-sdk-adapter.d.ts +86 -0
- package/dist/ports/adapters/tenzro-sdk-adapter.d.ts.map +1 -0
- package/dist/ports/adapters/tenzro-sdk-adapter.js +100 -0
- package/dist/ports/adapters/tenzro-sdk-adapter.js.map +1 -0
- package/dist/ports/agent/acp.d.ts +66 -0
- package/dist/ports/agent/acp.d.ts.map +1 -0
- package/dist/ports/agent/acp.js +27 -0
- package/dist/ports/agent/acp.js.map +1 -0
- package/dist/ports/agent/adapters/acp-adapter.d.ts +67 -0
- package/dist/ports/agent/adapters/acp-adapter.d.ts.map +1 -0
- package/dist/ports/agent/adapters/acp-adapter.js +70 -0
- package/dist/ports/agent/adapters/acp-adapter.js.map +1 -0
- package/dist/ports/agent/adapters/agent-bond-adapter.d.ts +31 -0
- package/dist/ports/agent/adapters/agent-bond-adapter.d.ts.map +1 -0
- package/dist/ports/agent/adapters/agent-bond-adapter.js +82 -0
- package/dist/ports/agent/adapters/agent-bond-adapter.js.map +1 -0
- package/dist/ports/agent/adapters/agent-payment-adapter.d.ts +66 -0
- package/dist/ports/agent/adapters/agent-payment-adapter.d.ts.map +1 -0
- package/dist/ports/agent/adapters/agent-payment-adapter.js +75 -0
- package/dist/ports/agent/adapters/agent-payment-adapter.js.map +1 -0
- package/dist/ports/agent/adapters/ap2-adapter.d.ts +28 -0
- package/dist/ports/agent/adapters/ap2-adapter.d.ts.map +1 -0
- package/dist/ports/agent/adapters/ap2-adapter.js +97 -0
- package/dist/ports/agent/adapters/ap2-adapter.js.map +1 -0
- package/dist/ports/agent/adapters/auth-approval-adapter.d.ts +26 -0
- package/dist/ports/agent/adapters/auth-approval-adapter.d.ts.map +1 -0
- package/dist/ports/agent/adapters/auth-approval-adapter.js +37 -0
- package/dist/ports/agent/adapters/auth-approval-adapter.js.map +1 -0
- package/dist/ports/agent/adapters/erc7802-adapter.d.ts +30 -0
- package/dist/ports/agent/adapters/erc7802-adapter.d.ts.map +1 -0
- package/dist/ports/agent/adapters/erc7802-adapter.js +60 -0
- package/dist/ports/agent/adapters/erc7802-adapter.js.map +1 -0
- package/dist/ports/agent/adapters/erc8004-adapter.d.ts +54 -0
- package/dist/ports/agent/adapters/erc8004-adapter.d.ts.map +1 -0
- package/dist/ports/agent/adapters/erc8004-adapter.js +53 -0
- package/dist/ports/agent/adapters/erc8004-adapter.js.map +1 -0
- package/dist/ports/agent/adapters/escrow-adapter.d.ts +33 -0
- package/dist/ports/agent/adapters/escrow-adapter.d.ts.map +1 -0
- package/dist/ports/agent/adapters/escrow-adapter.js +109 -0
- package/dist/ports/agent/adapters/escrow-adapter.js.map +1 -0
- package/dist/ports/agent/adapters/fee-estimator-adapter.d.ts +31 -0
- package/dist/ports/agent/adapters/fee-estimator-adapter.d.ts.map +1 -0
- package/dist/ports/agent/adapters/fee-estimator-adapter.js +103 -0
- package/dist/ports/agent/adapters/fee-estimator-adapter.js.map +1 -0
- package/dist/ports/agent/adapters/htlc-escrow-adapter.d.ts +68 -0
- package/dist/ports/agent/adapters/htlc-escrow-adapter.d.ts.map +1 -0
- package/dist/ports/agent/adapters/htlc-escrow-adapter.js +131 -0
- package/dist/ports/agent/adapters/htlc-escrow-adapter.js.map +1 -0
- package/dist/ports/agent/adapters/insurance-adapter.d.ts +32 -0
- package/dist/ports/agent/adapters/insurance-adapter.d.ts.map +1 -0
- package/dist/ports/agent/adapters/insurance-adapter.js +103 -0
- package/dist/ports/agent/adapters/insurance-adapter.js.map +1 -0
- package/dist/ports/agent/adapters/lifecycle-adapter.d.ts +26 -0
- package/dist/ports/agent/adapters/lifecycle-adapter.d.ts.map +1 -0
- package/dist/ports/agent/adapters/lifecycle-adapter.js +136 -0
- package/dist/ports/agent/adapters/lifecycle-adapter.js.map +1 -0
- package/dist/ports/agent/adapters/nanopayment-adapter.d.ts +62 -0
- package/dist/ports/agent/adapters/nanopayment-adapter.d.ts.map +1 -0
- package/dist/ports/agent/adapters/nanopayment-adapter.js +76 -0
- package/dist/ports/agent/adapters/nanopayment-adapter.js.map +1 -0
- package/dist/ports/agent/adapters/payment-rails-adapter.d.ts +67 -0
- package/dist/ports/agent/adapters/payment-rails-adapter.d.ts.map +1 -0
- package/dist/ports/agent/adapters/payment-rails-adapter.js +108 -0
- package/dist/ports/agent/adapters/payment-rails-adapter.js.map +1 -0
- package/dist/ports/agent/adapters/principal-chain-adapter.d.ts +23 -0
- package/dist/ports/agent/adapters/principal-chain-adapter.d.ts.map +1 -0
- package/dist/ports/agent/adapters/principal-chain-adapter.js +156 -0
- package/dist/ports/agent/adapters/principal-chain-adapter.js.map +1 -0
- package/dist/ports/agent/adapters/session-key-adapter.d.ts +45 -0
- package/dist/ports/agent/adapters/session-key-adapter.d.ts.map +1 -0
- package/dist/ports/agent/adapters/session-key-adapter.js +80 -0
- package/dist/ports/agent/adapters/session-key-adapter.js.map +1 -0
- package/dist/ports/agent/adapters/tee-attestation-adapter.d.ts +32 -0
- package/dist/ports/agent/adapters/tee-attestation-adapter.d.ts.map +1 -0
- package/dist/ports/agent/adapters/tee-attestation-adapter.js +38 -0
- package/dist/ports/agent/adapters/tee-attestation-adapter.js.map +1 -0
- package/dist/ports/agent/agent-bond.d.ts +80 -0
- package/dist/ports/agent/agent-bond.d.ts.map +1 -0
- package/dist/ports/agent/agent-bond.js +23 -0
- package/dist/ports/agent/agent-bond.js.map +1 -0
- package/dist/ports/agent/agent-payment.d.ts +72 -0
- package/dist/ports/agent/agent-payment.d.ts.map +1 -0
- package/dist/ports/agent/agent-payment.js +17 -0
- package/dist/ports/agent/agent-payment.js.map +1 -0
- package/dist/ports/agent/ap2.d.ts +104 -0
- package/dist/ports/agent/ap2.d.ts.map +1 -0
- package/dist/ports/agent/ap2.js +22 -0
- package/dist/ports/agent/ap2.js.map +1 -0
- package/dist/ports/agent/auth-approval.d.ts +40 -0
- package/dist/ports/agent/auth-approval.d.ts.map +1 -0
- package/dist/ports/agent/auth-approval.js +23 -0
- package/dist/ports/agent/auth-approval.js.map +1 -0
- package/dist/ports/agent/erc7802.d.ts +94 -0
- package/dist/ports/agent/erc7802.d.ts.map +1 -0
- package/dist/ports/agent/erc7802.js +30 -0
- package/dist/ports/agent/erc7802.js.map +1 -0
- package/dist/ports/agent/erc8004.d.ts +57 -0
- package/dist/ports/agent/erc8004.d.ts.map +1 -0
- package/dist/ports/agent/erc8004.js +20 -0
- package/dist/ports/agent/erc8004.js.map +1 -0
- package/dist/ports/agent/escrow.d.ts +74 -0
- package/dist/ports/agent/escrow.d.ts.map +1 -0
- package/dist/ports/agent/escrow.js +18 -0
- package/dist/ports/agent/escrow.js.map +1 -0
- package/dist/ports/agent/fee-estimator.d.ts +71 -0
- package/dist/ports/agent/fee-estimator.d.ts.map +1 -0
- package/dist/ports/agent/fee-estimator.js +21 -0
- package/dist/ports/agent/fee-estimator.js.map +1 -0
- package/dist/ports/agent/htlc-escrow.d.ts +94 -0
- package/dist/ports/agent/htlc-escrow.d.ts.map +1 -0
- package/dist/ports/agent/htlc-escrow.js +25 -0
- package/dist/ports/agent/htlc-escrow.js.map +1 -0
- package/dist/ports/agent/index.d.ts +58 -0
- package/dist/ports/agent/index.d.ts.map +1 -0
- package/dist/ports/agent/index.js +24 -0
- package/dist/ports/agent/index.js.map +1 -0
- package/dist/ports/agent/insurance.d.ts +65 -0
- package/dist/ports/agent/insurance.d.ts.map +1 -0
- package/dist/ports/agent/insurance.js +18 -0
- package/dist/ports/agent/insurance.js.map +1 -0
- package/dist/ports/agent/lifecycle.d.ts +69 -0
- package/dist/ports/agent/lifecycle.d.ts.map +1 -0
- package/dist/ports/agent/lifecycle.js +17 -0
- package/dist/ports/agent/lifecycle.js.map +1 -0
- package/dist/ports/agent/nanopayment.d.ts +72 -0
- package/dist/ports/agent/nanopayment.d.ts.map +1 -0
- package/dist/ports/agent/nanopayment.js +16 -0
- package/dist/ports/agent/nanopayment.js.map +1 -0
- package/dist/ports/agent/payment-rails.d.ts +140 -0
- package/dist/ports/agent/payment-rails.d.ts.map +1 -0
- package/dist/ports/agent/payment-rails.js +25 -0
- package/dist/ports/agent/payment-rails.js.map +1 -0
- package/dist/ports/agent/principal-chain.d.ts +95 -0
- package/dist/ports/agent/principal-chain.d.ts.map +1 -0
- package/dist/ports/agent/principal-chain.js +16 -0
- package/dist/ports/agent/principal-chain.js.map +1 -0
- package/dist/ports/agent/session-key.d.ts +94 -0
- package/dist/ports/agent/session-key.d.ts.map +1 -0
- package/dist/ports/agent/session-key.js +31 -0
- package/dist/ports/agent/session-key.js.map +1 -0
- package/dist/ports/agent/tee-attestation.d.ts +51 -0
- package/dist/ports/agent/tee-attestation.d.ts.map +1 -0
- package/dist/ports/agent/tee-attestation.js +28 -0
- package/dist/ports/agent/tee-attestation.js.map +1 -0
- package/dist/ports/bridge/adapters/bridge-adapter-base.d.ts +47 -0
- package/dist/ports/bridge/adapters/bridge-adapter-base.d.ts.map +1 -0
- package/dist/ports/bridge/adapters/bridge-adapter-base.js +144 -0
- package/dist/ports/bridge/adapters/bridge-adapter-base.js.map +1 -0
- package/dist/ports/bridge/adapters/canton-bridge-adapter.d.ts +30 -0
- package/dist/ports/bridge/adapters/canton-bridge-adapter.d.ts.map +1 -0
- package/dist/ports/bridge/adapters/canton-bridge-adapter.js +31 -0
- package/dist/ports/bridge/adapters/canton-bridge-adapter.js.map +1 -0
- package/dist/ports/bridge/adapters/ccip-adapter.d.ts +30 -0
- package/dist/ports/bridge/adapters/ccip-adapter.d.ts.map +1 -0
- package/dist/ports/bridge/adapters/ccip-adapter.js +31 -0
- package/dist/ports/bridge/adapters/ccip-adapter.js.map +1 -0
- package/dist/ports/bridge/adapters/debridge-adapter.d.ts +27 -0
- package/dist/ports/bridge/adapters/debridge-adapter.d.ts.map +1 -0
- package/dist/ports/bridge/adapters/debridge-adapter.js +28 -0
- package/dist/ports/bridge/adapters/debridge-adapter.js.map +1 -0
- package/dist/ports/bridge/adapters/layerzero-adapter.d.ts +30 -0
- package/dist/ports/bridge/adapters/layerzero-adapter.d.ts.map +1 -0
- package/dist/ports/bridge/adapters/layerzero-adapter.js +31 -0
- package/dist/ports/bridge/adapters/layerzero-adapter.js.map +1 -0
- package/dist/ports/bridge/adapters/lifi-adapter.d.ts +48 -0
- package/dist/ports/bridge/adapters/lifi-adapter.d.ts.map +1 -0
- package/dist/ports/bridge/adapters/lifi-adapter.js +49 -0
- package/dist/ports/bridge/adapters/lifi-adapter.js.map +1 -0
- package/dist/ports/bridge/adapters/wormhole-adapter.d.ts +26 -0
- package/dist/ports/bridge/adapters/wormhole-adapter.d.ts.map +1 -0
- package/dist/ports/bridge/adapters/wormhole-adapter.js +27 -0
- package/dist/ports/bridge/adapters/wormhole-adapter.js.map +1 -0
- package/dist/ports/bridge/bridge.d.ts +123 -0
- package/dist/ports/bridge/bridge.d.ts.map +1 -0
- package/dist/ports/bridge/bridge.js +20 -0
- package/dist/ports/bridge/bridge.js.map +1 -0
- package/dist/ports/bridge/index.d.ts +13 -0
- package/dist/ports/bridge/index.d.ts.map +1 -0
- package/dist/ports/bridge/index.js +11 -0
- package/dist/ports/bridge/index.js.map +1 -0
- package/dist/ports/canton/adapters/ledger-api-adapter.d.ts +52 -0
- package/dist/ports/canton/adapters/ledger-api-adapter.d.ts.map +1 -0
- package/dist/ports/canton/adapters/ledger-api-adapter.js +232 -0
- package/dist/ports/canton/adapters/ledger-api-adapter.js.map +1 -0
- package/dist/ports/canton/canton-identity.d.ts +60 -0
- package/dist/ports/canton/canton-identity.d.ts.map +1 -0
- package/dist/ports/canton/canton-identity.js +28 -0
- package/dist/ports/canton/canton-identity.js.map +1 -0
- package/dist/ports/canton/canton-validator.d.ts +182 -0
- package/dist/ports/canton/canton-validator.d.ts.map +1 -0
- package/dist/ports/canton/canton-validator.js +39 -0
- package/dist/ports/canton/canton-validator.js.map +1 -0
- package/dist/ports/canton/fingerprint.d.ts +24 -0
- package/dist/ports/canton/fingerprint.d.ts.map +1 -0
- package/dist/ports/canton/fingerprint.js +31 -0
- package/dist/ports/canton/fingerprint.js.map +1 -0
- package/dist/ports/canton/hash.d.ts +37 -0
- package/dist/ports/canton/hash.d.ts.map +1 -0
- package/dist/ports/canton/hash.js +68 -0
- package/dist/ports/canton/hash.js.map +1 -0
- package/dist/ports/canton/http.d.ts +64 -0
- package/dist/ports/canton/http.d.ts.map +1 -0
- package/dist/ports/canton/http.js +177 -0
- package/dist/ports/canton/http.js.map +1 -0
- package/dist/ports/cross-vm.d.ts +79 -0
- package/dist/ports/cross-vm.d.ts.map +1 -0
- package/dist/ports/cross-vm.js +81 -0
- package/dist/ports/cross-vm.js.map +1 -0
- package/dist/ports/index.d.ts +18 -0
- package/dist/ports/index.d.ts.map +1 -0
- package/dist/ports/index.js +11 -0
- package/dist/ports/index.js.map +1 -0
- package/dist/ports/tenzro-identity.d.ts +29 -0
- package/dist/ports/tenzro-identity.d.ts.map +1 -0
- package/dist/ports/tenzro-identity.js +19 -0
- package/dist/ports/tenzro-identity.js.map +1 -0
- package/dist/ports/tenzro-rpc.d.ts +79 -0
- package/dist/ports/tenzro-rpc.d.ts.map +1 -0
- package/dist/ports/tenzro-rpc.js +21 -0
- package/dist/ports/tenzro-rpc.js.map +1 -0
- package/dist/router/index.d.ts +3 -0
- package/dist/router/index.d.ts.map +1 -0
- package/dist/router/index.js +2 -0
- package/dist/router/index.js.map +1 -0
- package/dist/router/route.d.ts +17 -0
- package/dist/router/route.d.ts.map +1 -0
- package/dist/router/route.js +78 -0
- package/dist/router/route.js.map +1 -0
- package/dist/settlement/nanopayment-flow.d.ts +48 -0
- package/dist/settlement/nanopayment-flow.d.ts.map +1 -0
- package/dist/settlement/nanopayment-flow.js +111 -0
- package/dist/settlement/nanopayment-flow.js.map +1 -0
- package/dist/surfaces/canton-external.d.ts +43 -0
- package/dist/surfaces/canton-external.d.ts.map +1 -0
- package/dist/surfaces/canton-external.js +252 -0
- package/dist/surfaces/canton-external.js.map +1 -0
- package/dist/surfaces/canton-internal.d.ts +34 -0
- package/dist/surfaces/canton-internal.d.ts.map +1 -0
- package/dist/surfaces/canton-internal.js +163 -0
- package/dist/surfaces/canton-internal.js.map +1 -0
- package/dist/surfaces/canton-onboarding.d.ts +64 -0
- package/dist/surfaces/canton-onboarding.d.ts.map +1 -0
- package/dist/surfaces/canton-onboarding.js +113 -0
- package/dist/surfaces/canton-onboarding.js.map +1 -0
- package/dist/surfaces/evm-on-tenzro.d.ts +29 -0
- package/dist/surfaces/evm-on-tenzro.d.ts.map +1 -0
- package/dist/surfaces/evm-on-tenzro.js +226 -0
- package/dist/surfaces/evm-on-tenzro.js.map +1 -0
- package/dist/surfaces/index.d.ts +13 -0
- package/dist/surfaces/index.d.ts.map +1 -0
- package/dist/surfaces/index.js +7 -0
- package/dist/surfaces/index.js.map +1 -0
- package/dist/surfaces/svm-on-tenzro.d.ts +24 -0
- package/dist/surfaces/svm-on-tenzro.d.ts.map +1 -0
- package/dist/surfaces/svm-on-tenzro.js +238 -0
- package/dist/surfaces/svm-on-tenzro.js.map +1 -0
- package/dist/surfaces/tenzro-native.d.ts +45 -0
- package/dist/surfaces/tenzro-native.d.ts.map +1 -0
- package/dist/surfaces/tenzro-native.js +299 -0
- package/dist/surfaces/tenzro-native.js.map +1 -0
- package/dist/surfaces/util.d.ts +18 -0
- package/dist/surfaces/util.d.ts.map +1 -0
- package/dist/surfaces/util.js +36 -0
- package/dist/surfaces/util.js.map +1 -0
- package/dist/types/asset.d.ts +43 -0
- package/dist/types/asset.d.ts.map +1 -0
- package/dist/types/asset.js +13 -0
- package/dist/types/asset.js.map +1 -0
- package/dist/types/consent.d.ts +46 -0
- package/dist/types/consent.d.ts.map +1 -0
- package/dist/types/consent.js +18 -0
- package/dist/types/consent.js.map +1 -0
- package/dist/types/identity.d.ts +115 -0
- package/dist/types/identity.d.ts.map +1 -0
- package/dist/types/identity.js +12 -0
- package/dist/types/identity.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 +3 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/intent.d.ts +132 -0
- package/dist/types/intent.d.ts.map +1 -0
- package/dist/types/intent.js +8 -0
- package/dist/types/intent.js.map +1 -0
- package/dist/types/signing-driver.d.ts +48 -0
- package/dist/types/signing-driver.d.ts.map +1 -0
- package/dist/types/signing-driver.js +9 -0
- package/dist/types/signing-driver.js.map +1 -0
- package/dist/types/surface-module.d.ts +38 -0
- package/dist/types/surface-module.d.ts.map +1 -0
- package/dist/types/surface-module.js +19 -0
- package/dist/types/surface-module.js.map +1 -0
- package/dist/types/surface.d.ts +17 -0
- package/dist/types/surface.d.ts.map +1 -0
- package/dist/types/surface.js +28 -0
- package/dist/types/surface.js.map +1 -0
- package/package.json +84 -0
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal Solana wire-format primitives.
|
|
3
|
+
*
|
|
4
|
+
* What's here, and why:
|
|
5
|
+
* - **compact-array length encoding** ("short_vec"): base-128 varint with
|
|
6
|
+
* high-bit continuation. Used for the count prefix on Solana arrays
|
|
7
|
+
* (signatures, account keys, instructions, instruction data, etc.).
|
|
8
|
+
* - **base58** (Bitcoin alphabet): Solana pubkeys, addresses, and tx
|
|
9
|
+
* signatures all serialise as base58. We need both directions because
|
|
10
|
+
* `SurfaceKey.address` for the SVM surface stores the base58 form.
|
|
11
|
+
* - **legacy compiled-message** + **transaction** serialisation: the byte
|
|
12
|
+
* layout `solana-validator` accepts on `sendTransaction`.
|
|
13
|
+
*
|
|
14
|
+
* Why not @solana/web3.js: it pulls in Buffer + Node crypto polyfills, and
|
|
15
|
+
* we need a pure-JS, browser-clean kernel package. The slice we use here is
|
|
16
|
+
* a few hundred lines; vendoring is cheaper than the dep tree.
|
|
17
|
+
*
|
|
18
|
+
* Scope deliberately narrow: legacy message (not Message-v0 with address
|
|
19
|
+
* lookup tables — that's an M5+ optimisation when we have a working
|
|
20
|
+
* pointer flow first). The Tenzro precompile's SVM-side trigger is a single
|
|
21
|
+
* system-program-style instruction, which legacy messages handle fine.
|
|
22
|
+
*
|
|
23
|
+
* Refs:
|
|
24
|
+
* - https://docs.solana.com/developing/programming-model/transactions
|
|
25
|
+
* - https://docs.solana.com/developing/clients/jsonrpc-api#sendtransaction
|
|
26
|
+
* - https://github.com/solana-labs/solana/blob/master/sdk/program/src/short_vec.rs
|
|
27
|
+
*/
|
|
28
|
+
/**
|
|
29
|
+
* Encode an unsigned integer as Solana short_vec (1–3 bytes for values up to
|
|
30
|
+
* 2^21 - 1, sufficient for any tx field count).
|
|
31
|
+
*/
|
|
32
|
+
export declare function compactArrayLength(n: number): Uint8Array;
|
|
33
|
+
/** Decode a short_vec length from `buf` starting at `off`. */
|
|
34
|
+
export declare function readCompactArrayLength(buf: Uint8Array, off: number): {
|
|
35
|
+
value: number;
|
|
36
|
+
consumed: number;
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* Encode bytes to base58. Leading zeros become leading '1's per the Bitcoin
|
|
40
|
+
* convention used by Solana.
|
|
41
|
+
*/
|
|
42
|
+
export declare function base58Encode(bytes: Uint8Array): string;
|
|
43
|
+
/** Decode a base58 string to bytes. */
|
|
44
|
+
export declare function base58Decode(s: string): Uint8Array;
|
|
45
|
+
export interface CompiledInstruction {
|
|
46
|
+
/** Index into accountKeys identifying the program to invoke. */
|
|
47
|
+
readonly programIdIndex: number;
|
|
48
|
+
/** Indices into accountKeys identifying the accounts the instruction touches. */
|
|
49
|
+
readonly accountKeyIndices: readonly number[];
|
|
50
|
+
/** Instruction data bytes (program-specific). */
|
|
51
|
+
readonly data: Uint8Array;
|
|
52
|
+
}
|
|
53
|
+
export interface CompiledMessage {
|
|
54
|
+
readonly numRequiredSignatures: number;
|
|
55
|
+
readonly numReadonlySignedAccounts: number;
|
|
56
|
+
readonly numReadonlyUnsignedAccounts: number;
|
|
57
|
+
/** 32-byte pubkeys, signers first then read-only signers, then writable
|
|
58
|
+
* non-signers, then read-only non-signers — as produced by the Solana
|
|
59
|
+
* message compiler. */
|
|
60
|
+
readonly accountKeys: readonly Uint8Array[];
|
|
61
|
+
readonly recentBlockhash: Uint8Array;
|
|
62
|
+
readonly instructions: readonly CompiledInstruction[];
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Serialise a CompiledMessage to its on-the-wire bytes (legacy format).
|
|
66
|
+
*
|
|
67
|
+
* Layout:
|
|
68
|
+
* header (3 bytes)
|
|
69
|
+
* compact-array(account-keys, each 32 bytes)
|
|
70
|
+
* recent_blockhash (32 bytes)
|
|
71
|
+
* compact-array(instructions)
|
|
72
|
+
* each instruction:
|
|
73
|
+
* u8 program_id_index
|
|
74
|
+
* compact-array(account_indices, u8 each)
|
|
75
|
+
* compact-array(data, u8 each)
|
|
76
|
+
*/
|
|
77
|
+
export declare function serializeCompiledMessage(msg: CompiledMessage): Uint8Array;
|
|
78
|
+
/**
|
|
79
|
+
* Build the wire-format signed transaction:
|
|
80
|
+
* compact-array(signatures, each 64 bytes) || message_bytes
|
|
81
|
+
*
|
|
82
|
+
* Signature count must equal `message.numRequiredSignatures`. Solana clients
|
|
83
|
+
* reject mismatches.
|
|
84
|
+
*/
|
|
85
|
+
export declare function serializeTransaction(message: CompiledMessage, signatures: readonly Uint8Array[]): Uint8Array;
|
|
86
|
+
//# sourceMappingURL=solana.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"solana.d.ts","sourceRoot":"","sources":["../../src/crypto/solana.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAIH;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,MAAM,GAAG,UAAU,CAiBxD;AAED,8DAA8D;AAC9D,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,UAAU,EACf,GAAG,EAAE,MAAM,GACV;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAYrC;AAaD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAyBtD;AAED,uCAAuC;AACvC,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,UAAU,CA2BlD;AAID,MAAM,WAAW,mBAAmB;IAClC,gEAAgE;IAChE,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,iFAAiF;IACjF,QAAQ,CAAC,iBAAiB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9C,iDAAiD;IACjD,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;CAC3B;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;IACvC,QAAQ,CAAC,yBAAyB,EAAE,MAAM,CAAC;IAC3C,QAAQ,CAAC,2BAA2B,EAAE,MAAM,CAAC;IAC7C;;4BAEwB;IACxB,QAAQ,CAAC,WAAW,EAAE,SAAS,UAAU,EAAE,CAAC;IAC5C,QAAQ,CAAC,eAAe,EAAE,UAAU,CAAC;IACrC,QAAQ,CAAC,YAAY,EAAE,SAAS,mBAAmB,EAAE,CAAC;CACvD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,eAAe,GAAG,UAAU,CA+BzE;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,eAAe,EACxB,UAAU,EAAE,SAAS,UAAU,EAAE,GAChC,UAAU,CAcZ"}
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal Solana wire-format primitives.
|
|
3
|
+
*
|
|
4
|
+
* What's here, and why:
|
|
5
|
+
* - **compact-array length encoding** ("short_vec"): base-128 varint with
|
|
6
|
+
* high-bit continuation. Used for the count prefix on Solana arrays
|
|
7
|
+
* (signatures, account keys, instructions, instruction data, etc.).
|
|
8
|
+
* - **base58** (Bitcoin alphabet): Solana pubkeys, addresses, and tx
|
|
9
|
+
* signatures all serialise as base58. We need both directions because
|
|
10
|
+
* `SurfaceKey.address` for the SVM surface stores the base58 form.
|
|
11
|
+
* - **legacy compiled-message** + **transaction** serialisation: the byte
|
|
12
|
+
* layout `solana-validator` accepts on `sendTransaction`.
|
|
13
|
+
*
|
|
14
|
+
* Why not @solana/web3.js: it pulls in Buffer + Node crypto polyfills, and
|
|
15
|
+
* we need a pure-JS, browser-clean kernel package. The slice we use here is
|
|
16
|
+
* a few hundred lines; vendoring is cheaper than the dep tree.
|
|
17
|
+
*
|
|
18
|
+
* Scope deliberately narrow: legacy message (not Message-v0 with address
|
|
19
|
+
* lookup tables — that's an M5+ optimisation when we have a working
|
|
20
|
+
* pointer flow first). The Tenzro precompile's SVM-side trigger is a single
|
|
21
|
+
* system-program-style instruction, which legacy messages handle fine.
|
|
22
|
+
*
|
|
23
|
+
* Refs:
|
|
24
|
+
* - https://docs.solana.com/developing/programming-model/transactions
|
|
25
|
+
* - https://docs.solana.com/developing/clients/jsonrpc-api#sendtransaction
|
|
26
|
+
* - https://github.com/solana-labs/solana/blob/master/sdk/program/src/short_vec.rs
|
|
27
|
+
*/
|
|
28
|
+
// ──────────────────────────── compact-array ────────────────────────────
|
|
29
|
+
/**
|
|
30
|
+
* Encode an unsigned integer as Solana short_vec (1–3 bytes for values up to
|
|
31
|
+
* 2^21 - 1, sufficient for any tx field count).
|
|
32
|
+
*/
|
|
33
|
+
export function compactArrayLength(n) {
|
|
34
|
+
if (!Number.isInteger(n) || n < 0) {
|
|
35
|
+
throw new Error(`compact-array length must be a non-negative integer, got ${n}`);
|
|
36
|
+
}
|
|
37
|
+
const bytes = [];
|
|
38
|
+
let v = n;
|
|
39
|
+
while (true) {
|
|
40
|
+
let b = v & 0x7f;
|
|
41
|
+
v >>>= 7;
|
|
42
|
+
if (v === 0) {
|
|
43
|
+
bytes.push(b);
|
|
44
|
+
break;
|
|
45
|
+
}
|
|
46
|
+
b |= 0x80;
|
|
47
|
+
bytes.push(b);
|
|
48
|
+
}
|
|
49
|
+
return new Uint8Array(bytes);
|
|
50
|
+
}
|
|
51
|
+
/** Decode a short_vec length from `buf` starting at `off`. */
|
|
52
|
+
export function readCompactArrayLength(buf, off) {
|
|
53
|
+
let value = 0;
|
|
54
|
+
let consumed = 0;
|
|
55
|
+
for (let shift = 0;; shift += 7) {
|
|
56
|
+
const b = buf[off + consumed];
|
|
57
|
+
if (b === undefined)
|
|
58
|
+
throw new Error('short_vec: short read');
|
|
59
|
+
consumed += 1;
|
|
60
|
+
value |= (b & 0x7f) << shift;
|
|
61
|
+
if ((b & 0x80) === 0)
|
|
62
|
+
break;
|
|
63
|
+
if (consumed > 3)
|
|
64
|
+
throw new Error('short_vec: overlong');
|
|
65
|
+
}
|
|
66
|
+
return { value, consumed };
|
|
67
|
+
}
|
|
68
|
+
// ─────────────────────────────── base58 ───────────────────────────────
|
|
69
|
+
const B58_ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';
|
|
70
|
+
const B58_INDEX = (() => {
|
|
71
|
+
const idx = new Array(128).fill(-1);
|
|
72
|
+
for (let i = 0; i < B58_ALPHABET.length; i++) {
|
|
73
|
+
idx[B58_ALPHABET.charCodeAt(i)] = i;
|
|
74
|
+
}
|
|
75
|
+
return idx;
|
|
76
|
+
})();
|
|
77
|
+
/**
|
|
78
|
+
* Encode bytes to base58. Leading zeros become leading '1's per the Bitcoin
|
|
79
|
+
* convention used by Solana.
|
|
80
|
+
*/
|
|
81
|
+
export function base58Encode(bytes) {
|
|
82
|
+
if (bytes.length === 0)
|
|
83
|
+
return '';
|
|
84
|
+
// Count leading zeros.
|
|
85
|
+
let zeros = 0;
|
|
86
|
+
while (zeros < bytes.length && bytes[zeros] === 0)
|
|
87
|
+
zeros++;
|
|
88
|
+
// Convert big-endian bytes to a base-58 array.
|
|
89
|
+
const size = ((bytes.length - zeros) * 138) / 100 + 1; // log(256)/log(58) ≈ 1.366
|
|
90
|
+
const b58 = new Uint8Array(Math.ceil(size));
|
|
91
|
+
let length = 0;
|
|
92
|
+
for (let i = zeros; i < bytes.length; i++) {
|
|
93
|
+
let carry = bytes[i];
|
|
94
|
+
let j = 0;
|
|
95
|
+
for (let k = b58.length - 1; (carry !== 0 || j < length) && k >= 0; k--, j++) {
|
|
96
|
+
carry += 256 * b58[k];
|
|
97
|
+
b58[k] = carry % 58;
|
|
98
|
+
carry = (carry / 58) | 0;
|
|
99
|
+
}
|
|
100
|
+
length = j;
|
|
101
|
+
}
|
|
102
|
+
// Skip leading zeros in the result.
|
|
103
|
+
let it = b58.length - length;
|
|
104
|
+
while (it < b58.length && b58[it] === 0)
|
|
105
|
+
it++;
|
|
106
|
+
let out = '1'.repeat(zeros);
|
|
107
|
+
for (; it < b58.length; it++)
|
|
108
|
+
out += B58_ALPHABET[b58[it]];
|
|
109
|
+
return out;
|
|
110
|
+
}
|
|
111
|
+
/** Decode a base58 string to bytes. */
|
|
112
|
+
export function base58Decode(s) {
|
|
113
|
+
if (s.length === 0)
|
|
114
|
+
return new Uint8Array(0);
|
|
115
|
+
let zeros = 0;
|
|
116
|
+
while (zeros < s.length && s[zeros] === '1')
|
|
117
|
+
zeros++;
|
|
118
|
+
const size = ((s.length - zeros) * 733) / 1000 + 1; // log(58)/log(256) ≈ 0.733
|
|
119
|
+
const b256 = new Uint8Array(Math.ceil(size));
|
|
120
|
+
let length = 0;
|
|
121
|
+
for (let i = zeros; i < s.length; i++) {
|
|
122
|
+
const code = s.charCodeAt(i);
|
|
123
|
+
const digit = code < 128 ? (B58_INDEX[code] ?? -1) : -1;
|
|
124
|
+
if (digit < 0)
|
|
125
|
+
throw new Error(`base58: invalid character at ${i}`);
|
|
126
|
+
let carry = digit;
|
|
127
|
+
let j = 0;
|
|
128
|
+
for (let k = b256.length - 1; (carry !== 0 || j < length) && k >= 0; k--, j++) {
|
|
129
|
+
carry += 58 * b256[k];
|
|
130
|
+
b256[k] = carry & 0xff;
|
|
131
|
+
carry >>>= 8;
|
|
132
|
+
}
|
|
133
|
+
length = j;
|
|
134
|
+
}
|
|
135
|
+
let it = b256.length - length;
|
|
136
|
+
while (it < b256.length && b256[it] === 0)
|
|
137
|
+
it++;
|
|
138
|
+
const out = new Uint8Array(zeros + (b256.length - it));
|
|
139
|
+
// leading zeros stay zero (Uint8Array is zero-init), copy the tail
|
|
140
|
+
let dst = zeros;
|
|
141
|
+
for (; it < b256.length; it++, dst++)
|
|
142
|
+
out[dst] = b256[it];
|
|
143
|
+
return out;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Serialise a CompiledMessage to its on-the-wire bytes (legacy format).
|
|
147
|
+
*
|
|
148
|
+
* Layout:
|
|
149
|
+
* header (3 bytes)
|
|
150
|
+
* compact-array(account-keys, each 32 bytes)
|
|
151
|
+
* recent_blockhash (32 bytes)
|
|
152
|
+
* compact-array(instructions)
|
|
153
|
+
* each instruction:
|
|
154
|
+
* u8 program_id_index
|
|
155
|
+
* compact-array(account_indices, u8 each)
|
|
156
|
+
* compact-array(data, u8 each)
|
|
157
|
+
*/
|
|
158
|
+
export function serializeCompiledMessage(msg) {
|
|
159
|
+
const parts = [];
|
|
160
|
+
parts.push(new Uint8Array([
|
|
161
|
+
msg.numRequiredSignatures,
|
|
162
|
+
msg.numReadonlySignedAccounts,
|
|
163
|
+
msg.numReadonlyUnsignedAccounts,
|
|
164
|
+
]));
|
|
165
|
+
parts.push(compactArrayLength(msg.accountKeys.length));
|
|
166
|
+
for (const k of msg.accountKeys) {
|
|
167
|
+
if (k.length !== 32)
|
|
168
|
+
throw new Error(`account key must be 32 bytes, got ${k.length}`);
|
|
169
|
+
parts.push(k);
|
|
170
|
+
}
|
|
171
|
+
if (msg.recentBlockhash.length !== 32) {
|
|
172
|
+
throw new Error('recent_blockhash must be 32 bytes');
|
|
173
|
+
}
|
|
174
|
+
parts.push(msg.recentBlockhash);
|
|
175
|
+
parts.push(compactArrayLength(msg.instructions.length));
|
|
176
|
+
for (const ix of msg.instructions) {
|
|
177
|
+
parts.push(new Uint8Array([ix.programIdIndex]));
|
|
178
|
+
parts.push(compactArrayLength(ix.accountKeyIndices.length));
|
|
179
|
+
parts.push(new Uint8Array(ix.accountKeyIndices));
|
|
180
|
+
parts.push(compactArrayLength(ix.data.length));
|
|
181
|
+
parts.push(ix.data);
|
|
182
|
+
}
|
|
183
|
+
return concat(parts);
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Build the wire-format signed transaction:
|
|
187
|
+
* compact-array(signatures, each 64 bytes) || message_bytes
|
|
188
|
+
*
|
|
189
|
+
* Signature count must equal `message.numRequiredSignatures`. Solana clients
|
|
190
|
+
* reject mismatches.
|
|
191
|
+
*/
|
|
192
|
+
export function serializeTransaction(message, signatures) {
|
|
193
|
+
if (signatures.length !== message.numRequiredSignatures) {
|
|
194
|
+
throw new Error(`expected ${message.numRequiredSignatures} signatures, got ${signatures.length}`);
|
|
195
|
+
}
|
|
196
|
+
const messageBytes = serializeCompiledMessage(message);
|
|
197
|
+
const parts = [compactArrayLength(signatures.length)];
|
|
198
|
+
for (const s of signatures) {
|
|
199
|
+
if (s.length !== 64)
|
|
200
|
+
throw new Error(`Ed25519 sig must be 64 bytes, got ${s.length}`);
|
|
201
|
+
parts.push(s);
|
|
202
|
+
}
|
|
203
|
+
parts.push(messageBytes);
|
|
204
|
+
return concat(parts);
|
|
205
|
+
}
|
|
206
|
+
function concat(parts) {
|
|
207
|
+
let total = 0;
|
|
208
|
+
for (const p of parts)
|
|
209
|
+
total += p.length;
|
|
210
|
+
const out = new Uint8Array(total);
|
|
211
|
+
let off = 0;
|
|
212
|
+
for (const p of parts) {
|
|
213
|
+
out.set(p, off);
|
|
214
|
+
off += p.length;
|
|
215
|
+
}
|
|
216
|
+
return out;
|
|
217
|
+
}
|
|
218
|
+
//# sourceMappingURL=solana.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"solana.js","sourceRoot":"","sources":["../../src/crypto/solana.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,0EAA0E;AAE1E;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,CAAS;IAC1C,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,EAAE,CAAC,CAAC;IACnF,CAAC;IACD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,IAAI,EAAE,CAAC;QACZ,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;QACjB,CAAC,MAAM,CAAC,CAAC;QACT,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACZ,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACd,MAAM;QACR,CAAC;QACD,CAAC,IAAI,IAAI,CAAC;QACV,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAChB,CAAC;IACD,OAAO,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,sBAAsB,CACpC,GAAe,EACf,GAAW;IAEX,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,KAAK,IAAI,KAAK,GAAG,CAAC,GAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QACjC,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,QAAQ,CAAC,CAAC;QAC9B,IAAI,CAAC,KAAK,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAC9D,QAAQ,IAAI,CAAC,CAAC;QACd,KAAK,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,KAAK,CAAC;QAC7B,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC;YAAE,MAAM;QAC5B,IAAI,QAAQ,GAAG,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;IAC3D,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;AAC7B,CAAC;AAED,yEAAyE;AAEzE,MAAM,YAAY,GAAG,4DAA4D,CAAC;AAClF,MAAM,SAAS,GAAa,CAAC,GAAG,EAAE;IAChC,MAAM,GAAG,GAAG,IAAI,KAAK,CAAS,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7C,GAAG,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACtC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC,CAAC,EAAE,CAAC;AAEL;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,KAAiB;IAC5C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAClC,uBAAuB;IACvB,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,OAAO,KAAK,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC;QAAE,KAAK,EAAE,CAAC;IAC3D,+CAA+C;IAC/C,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,2BAA2B;IAClF,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5C,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1C,IAAI,KAAK,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;QACtB,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,KAAK,IAAI,CAAC,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7E,KAAK,IAAI,GAAG,GAAG,GAAG,CAAC,CAAC,CAAE,CAAC;YACvB,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,EAAE,CAAC;YACpB,KAAK,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;QAC3B,CAAC;QACD,MAAM,GAAG,CAAC,CAAC;IACb,CAAC;IACD,oCAAoC;IACpC,IAAI,EAAE,GAAG,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC;IAC7B,OAAO,EAAE,GAAG,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC;QAAE,EAAE,EAAE,CAAC;IAC9C,IAAI,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC5B,OAAO,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,EAAE,EAAE;QAAE,GAAG,IAAI,YAAY,CAAC,GAAG,CAAC,EAAE,CAAE,CAAC,CAAC;IAC5D,OAAO,GAAG,CAAC;AACb,CAAC;AAED,uCAAuC;AACvC,MAAM,UAAU,YAAY,CAAC,CAAS;IACpC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;IAC7C,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,OAAO,KAAK,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,GAAG;QAAE,KAAK,EAAE,CAAC;IACrD,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,2BAA2B;IAC/E,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7C,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAC7B,MAAM,KAAK,GAAG,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACxD,IAAI,KAAK,GAAG,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,EAAE,CAAC,CAAC;QACpE,IAAI,KAAK,GAAG,KAAK,CAAC;QAClB,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;YAC9E,KAAK,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;YACvB,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,IAAI,CAAC;YACvB,KAAK,MAAM,CAAC,CAAC;QACf,CAAC;QACD,MAAM,GAAG,CAAC,CAAC;IACb,CAAC;IACD,IAAI,EAAE,GAAG,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IAC9B,OAAO,EAAE,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC;QAAE,EAAE,EAAE,CAAC;IAChD,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC;IACvD,mEAAmE;IACnE,IAAI,GAAG,GAAG,KAAK,CAAC;IAChB,OAAO,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE;QAAE,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,CAAE,CAAC;IAC3D,OAAO,GAAG,CAAC;AACb,CAAC;AAyBD;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,wBAAwB,CAAC,GAAoB;IAC3D,MAAM,KAAK,GAAiB,EAAE,CAAC;IAC/B,KAAK,CAAC,IAAI,CACR,IAAI,UAAU,CAAC;QACb,GAAG,CAAC,qBAAqB;QACzB,GAAG,CAAC,yBAAyB;QAC7B,GAAG,CAAC,2BAA2B;KAChC,CAAC,CACH,CAAC;IAEF,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC;IACvD,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC;QAChC,IAAI,CAAC,CAAC,MAAM,KAAK,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QACtF,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAChB,CAAC;IAED,IAAI,GAAG,CAAC,eAAe,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACvD,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAEhC,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;IACxD,KAAK,MAAM,EAAE,IAAI,GAAG,CAAC,YAAY,EAAE,CAAC;QAClC,KAAK,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;QAChD,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC;QAC5D,KAAK,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC;QACjD,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QAC/C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC;IAED,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAClC,OAAwB,EACxB,UAAiC;IAEjC,IAAI,UAAU,CAAC,MAAM,KAAK,OAAO,CAAC,qBAAqB,EAAE,CAAC;QACxD,MAAM,IAAI,KAAK,CACb,YAAY,OAAO,CAAC,qBAAqB,oBAAoB,UAAU,CAAC,MAAM,EAAE,CACjF,CAAC;IACJ,CAAC;IACD,MAAM,YAAY,GAAG,wBAAwB,CAAC,OAAO,CAAC,CAAC;IACvD,MAAM,KAAK,GAAiB,CAAC,kBAAkB,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;IACpE,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3B,IAAI,CAAC,CAAC,MAAM,KAAK,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QACtF,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAChB,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACzB,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC;AAED,SAAS,MAAM,CAAC,KAA4B;IAC1C,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,CAAC,IAAI,KAAK;QAAE,KAAK,IAAI,CAAC,CAAC,MAAM,CAAC;IACzC,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC;IAClC,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAChB,GAAG,IAAI,CAAC,CAAC,MAAM,CAAC;IAClB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FrostBackend — device-side FROST round computation.
|
|
3
|
+
*
|
|
4
|
+
* The wallet kernel does not bundle a FROST library. The choice (per
|
|
5
|
+
* 2026 audit landscape — NCC Group's October 2023 review of the
|
|
6
|
+
* Zcash Foundation `frost` crates is the only completed audit of a
|
|
7
|
+
* pure-Rust FROST implementation that covers both Ed25519 (RFC 9591)
|
|
8
|
+
* and secp256k1) is to wrap the ZF crates as WebAssembly via
|
|
9
|
+
* `wasm-bindgen` and inject the resulting binding through the
|
|
10
|
+
* `FrostBackend` port at host-app construction time. The kernel only
|
|
11
|
+
* needs the port surface defined alongside the unwrapper:
|
|
12
|
+
*
|
|
13
|
+
* ```ts
|
|
14
|
+
* import type { FrostBackend } from '../passkey-share/unwrapper.js';
|
|
15
|
+
* ```
|
|
16
|
+
*
|
|
17
|
+
* Two reference backends ship in this file:
|
|
18
|
+
*
|
|
19
|
+
* - `frostBackendUnavailable()` — a typed-throw stub. Used until the
|
|
20
|
+
* host app links a real binding. Throwing here (instead of letting
|
|
21
|
+
* the FROST drivers fail mid-round with "undefined is not callable")
|
|
22
|
+
* keeps the failure mode legible.
|
|
23
|
+
*
|
|
24
|
+
* - `composeFrostBackend(...)` — small dispatch helper for hosts that
|
|
25
|
+
* ship two distinct WASM bundles per scheme. The Ed25519 bundle and
|
|
26
|
+
* secp256k1 bundle are independent crates upstream
|
|
27
|
+
* (`frost-ed25519`, `frost-secp256k1`), so most hosts will load them
|
|
28
|
+
* separately and join them at this seam.
|
|
29
|
+
*
|
|
30
|
+
* Browser-clean: no Node-specific globals, no DOM dependencies. The
|
|
31
|
+
* eventual WASM binding sits behind dynamic `import()` so SSR / Node
|
|
32
|
+
* tests that don't exercise FROST never touch the WASM module.
|
|
33
|
+
*/
|
|
34
|
+
import type { FrostBackend, ShareUnwrapRequest } from '../passkey-share/unwrapper.js';
|
|
35
|
+
import type { FrostScheme } from './coordinator.js';
|
|
36
|
+
export declare class FrostBackendUnavailable extends Error {
|
|
37
|
+
readonly scheme: FrostScheme | undefined;
|
|
38
|
+
constructor(scheme: FrostScheme | undefined);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Default backend that fails loudly. Wire a real FROST library in via
|
|
42
|
+
* `composeFrostBackend()` (or your own implementation) before any
|
|
43
|
+
* signing flow runs.
|
|
44
|
+
*/
|
|
45
|
+
export declare function frostBackendUnavailable(): FrostBackend;
|
|
46
|
+
/**
|
|
47
|
+
* Compose per-scheme backends into a single `FrostBackend`. Lets hosts
|
|
48
|
+
* load WASM bundles lazily (e.g. dynamic `import()` per curve) and join
|
|
49
|
+
* them here without the kernel learning about loaders.
|
|
50
|
+
*
|
|
51
|
+
* Either backend may be omitted; calls into a missing scheme throw
|
|
52
|
+
* `FrostBackendUnavailable`.
|
|
53
|
+
*/
|
|
54
|
+
export declare function composeFrostBackend(parts: {
|
|
55
|
+
readonly ed25519?: FrostBackend;
|
|
56
|
+
readonly secp256k1?: FrostBackend;
|
|
57
|
+
}): FrostBackend;
|
|
58
|
+
export type { FrostBackend, ShareUnwrapRequest };
|
|
59
|
+
//# sourceMappingURL=backend.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../../../src/custody/frost/backend.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACtF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD,qBAAa,uBAAwB,SAAQ,KAAK;IACpC,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS;gBAA/B,MAAM,EAAE,WAAW,GAAG,SAAS;CAQrD;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,IAAI,YAAY,CAkBtD;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE;IACzC,QAAQ,CAAC,OAAO,CAAC,EAAE,YAAY,CAAC;IAChC,QAAQ,CAAC,SAAS,CAAC,EAAE,YAAY,CAAC;CACnC,GAAG,YAAY,CAcf;AAID,YAAY,EAAE,YAAY,EAAE,kBAAkB,EAAE,CAAC"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FrostBackend — device-side FROST round computation.
|
|
3
|
+
*
|
|
4
|
+
* The wallet kernel does not bundle a FROST library. The choice (per
|
|
5
|
+
* 2026 audit landscape — NCC Group's October 2023 review of the
|
|
6
|
+
* Zcash Foundation `frost` crates is the only completed audit of a
|
|
7
|
+
* pure-Rust FROST implementation that covers both Ed25519 (RFC 9591)
|
|
8
|
+
* and secp256k1) is to wrap the ZF crates as WebAssembly via
|
|
9
|
+
* `wasm-bindgen` and inject the resulting binding through the
|
|
10
|
+
* `FrostBackend` port at host-app construction time. The kernel only
|
|
11
|
+
* needs the port surface defined alongside the unwrapper:
|
|
12
|
+
*
|
|
13
|
+
* ```ts
|
|
14
|
+
* import type { FrostBackend } from '../passkey-share/unwrapper.ts';
|
|
15
|
+
* ```
|
|
16
|
+
*
|
|
17
|
+
* Two reference backends ship in this file:
|
|
18
|
+
*
|
|
19
|
+
* - `frostBackendUnavailable()` — a typed-throw stub. Used until the
|
|
20
|
+
* host app links a real binding. Throwing here (instead of letting
|
|
21
|
+
* the FROST drivers fail mid-round with "undefined is not callable")
|
|
22
|
+
* keeps the failure mode legible.
|
|
23
|
+
*
|
|
24
|
+
* - `composeFrostBackend(...)` — small dispatch helper for hosts that
|
|
25
|
+
* ship two distinct WASM bundles per scheme. The Ed25519 bundle and
|
|
26
|
+
* secp256k1 bundle are independent crates upstream
|
|
27
|
+
* (`frost-ed25519`, `frost-secp256k1`), so most hosts will load them
|
|
28
|
+
* separately and join them at this seam.
|
|
29
|
+
*
|
|
30
|
+
* Browser-clean: no Node-specific globals, no DOM dependencies. The
|
|
31
|
+
* eventual WASM binding sits behind dynamic `import()` so SSR / Node
|
|
32
|
+
* tests that don't exercise FROST never touch the WASM module.
|
|
33
|
+
*/
|
|
34
|
+
export class FrostBackendUnavailable extends Error {
|
|
35
|
+
scheme;
|
|
36
|
+
constructor(scheme) {
|
|
37
|
+
super(`FROST backend not configured${scheme ? ` for ${scheme}` : ''}: ` +
|
|
38
|
+
'host app must inject a real FrostBackend (e.g. WASM-wrapped ' +
|
|
39
|
+
'frost-ed25519 / frost-secp256k1) before signing.');
|
|
40
|
+
this.scheme = scheme;
|
|
41
|
+
this.name = 'FrostBackendUnavailable';
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Default backend that fails loudly. Wire a real FROST library in via
|
|
46
|
+
* `composeFrostBackend()` (or your own implementation) before any
|
|
47
|
+
* signing flow runs.
|
|
48
|
+
*/
|
|
49
|
+
export function frostBackendUnavailable() {
|
|
50
|
+
return {
|
|
51
|
+
async commit({ scheme }) {
|
|
52
|
+
throw new FrostBackendUnavailable(scheme);
|
|
53
|
+
},
|
|
54
|
+
async respond({ scheme, }) {
|
|
55
|
+
throw new FrostBackendUnavailable(scheme);
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Compose per-scheme backends into a single `FrostBackend`. Lets hosts
|
|
61
|
+
* load WASM bundles lazily (e.g. dynamic `import()` per curve) and join
|
|
62
|
+
* them here without the kernel learning about loaders.
|
|
63
|
+
*
|
|
64
|
+
* Either backend may be omitted; calls into a missing scheme throw
|
|
65
|
+
* `FrostBackendUnavailable`.
|
|
66
|
+
*/
|
|
67
|
+
export function composeFrostBackend(parts) {
|
|
68
|
+
function pick(scheme) {
|
|
69
|
+
const got = scheme === 'ed25519' ? parts.ed25519 : parts.secp256k1;
|
|
70
|
+
if (!got)
|
|
71
|
+
throw new FrostBackendUnavailable(scheme);
|
|
72
|
+
return got;
|
|
73
|
+
}
|
|
74
|
+
return {
|
|
75
|
+
async commit(args) {
|
|
76
|
+
return pick(args.scheme).commit(args);
|
|
77
|
+
},
|
|
78
|
+
async respond(args) {
|
|
79
|
+
return pick(args.scheme).respond(args);
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=backend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backend.js","sourceRoot":"","sources":["../../../src/custody/frost/backend.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAKH,MAAM,OAAO,uBAAwB,SAAQ,KAAK;IAC3B;IAArB,YAAqB,MAA+B;QAClD,KAAK,CACH,+BAA+B,MAAM,CAAC,CAAC,CAAC,QAAQ,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI;YAC/D,8DAA8D;YAC9D,kDAAkD,CACrD,CAAC;QALiB,WAAM,GAAN,MAAM,CAAyB;QAMlD,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC;IACxC,CAAC;CACF;AAED;;;;GAIG;AACH,MAAM,UAAU,uBAAuB;IACrC,OAAO;QACL,KAAK,CAAC,MAAM,CAAC,EAAE,MAAM,EAA8C;YACjE,MAAM,IAAI,uBAAuB,CAAC,MAAM,CAAC,CAAC;QAC5C,CAAC;QACD,KAAK,CAAC,OAAO,CAAC,EACZ,MAAM,GAQP;YACC,MAAM,IAAI,uBAAuB,CAAC,MAAM,CAAC,CAAC;QAC5C,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAGnC;IACC,SAAS,IAAI,CAAC,MAAmB;QAC/B,MAAM,GAAG,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC;QACnE,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,uBAAuB,CAAC,MAAM,CAAC,CAAC;QACpD,OAAO,GAAG,CAAC;IACb,CAAC;IACD,OAAO;QACL,KAAK,CAAC,MAAM,CAAC,IAAI;YACf,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACxC,CAAC;QACD,KAAK,CAAC,OAAO,CAAC,IAAI;YAChB,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACzC,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FrostCoordinator — wallet-side view of the FROST round-coordination
|
|
3
|
+
* protocol the node hosts at `/wallet/frost/*`. Specified in DESIGN.md
|
|
4
|
+
* §4.3.4 + §11. Wraps two parallel curves:
|
|
5
|
+
*
|
|
6
|
+
* - FROST-Ed25519 (RFC 9591) → driver id `frost-ed25519`
|
|
7
|
+
* - FROST-secp256k1 (taproot-ready) → driver id `frost-secp256k1`
|
|
8
|
+
*
|
|
9
|
+
* Both curves use the same 3-round flow. The wallet device holds one
|
|
10
|
+
* secret share (passkey-bound, unwrapped per signing). The node-TEE
|
|
11
|
+
* holds the second share. A 2-of-2 quorum signs; for 2-of-3 (post-
|
|
12
|
+
* pairing) any two of {device A, device B, node-TEE} can co-sign.
|
|
13
|
+
*
|
|
14
|
+
* Tenzro endpoints (Tenzro implements; wallet kernel only consumes):
|
|
15
|
+
*
|
|
16
|
+
* 1. `start({did, scheme, preimage, surfaceKey, purpose?})`
|
|
17
|
+
* → `POST /wallet/frost/{scheme}/start`
|
|
18
|
+
* Response: `{sessionId, expiresAt, participants[]}` where
|
|
19
|
+
* `participants` is the list of co-signer identifiers (passkey
|
|
20
|
+
* cred-ids + `node-tee`) the node will round-coordinate against.
|
|
21
|
+
*
|
|
22
|
+
* 2. `commit({sessionId, deviceCommitment})`
|
|
23
|
+
* → `POST /wallet/frost/{scheme}/commit`
|
|
24
|
+
* Round 1: device submits its hiding/binding commitments
|
|
25
|
+
* (`(D_i, E_i)` per RFC 9591 §4.1). Response: `{state}`. The node
|
|
26
|
+
* blocks the response until enough commitments are in or
|
|
27
|
+
* `state === 'aborted'`.
|
|
28
|
+
*
|
|
29
|
+
* 3. `awaitChallenge({sessionId})`
|
|
30
|
+
* → `POST /wallet/frost/{scheme}/await-challenge`
|
|
31
|
+
* Round 2: device long-polls for the aggregated commitment +
|
|
32
|
+
* Lagrange-coefficient bundle the node assembled from all
|
|
33
|
+
* participants. Response: `{groupCommitment, signerSet, lambda}`.
|
|
34
|
+
*
|
|
35
|
+
* 4. `respond({sessionId, deviceShare})`
|
|
36
|
+
* → `POST /wallet/frost/{scheme}/respond`
|
|
37
|
+
* Round 3: device submits its signature share `z_i`. Response:
|
|
38
|
+
* `{state}`. Successful responses commit the share into the round.
|
|
39
|
+
*
|
|
40
|
+
* 5. `finalize({sessionId})`
|
|
41
|
+
* → `POST /wallet/frost/{scheme}/finalize`
|
|
42
|
+
* Device polls for the aggregated signature. Response:
|
|
43
|
+
* `{signature}`. Once aggregated, the round is destroyed and
|
|
44
|
+
* cannot be replayed.
|
|
45
|
+
*
|
|
46
|
+
* 6. `abort({sessionId, reason?})`
|
|
47
|
+
* → `POST /wallet/frost/{scheme}/abort`
|
|
48
|
+
* Idempotent. Used when the user cancels mid-round.
|
|
49
|
+
*
|
|
50
|
+
* The port is intentionally agnostic about how device shares are
|
|
51
|
+
* unwrapped — that's the passkey-quorum custody layer. The coordinator
|
|
52
|
+
* only carries opaque commitment / share bytes that the device-side
|
|
53
|
+
* FROST library produced.
|
|
54
|
+
*
|
|
55
|
+
* Browser-clean: `fetch` only. No Node-specific globals.
|
|
56
|
+
*/
|
|
57
|
+
export type FrostScheme = 'ed25519' | 'secp256k1';
|
|
58
|
+
export type FrostSessionState = 'pending' | 'committed' | 'responded' | 'finalized' | 'aborted' | 'expired';
|
|
59
|
+
/**
|
|
60
|
+
* Identifier of a single FROST participant. The node maps these to
|
|
61
|
+
* passkey credential ids / `node-tee`. The device only needs them to
|
|
62
|
+
* verify the `signerSet` returned in round 2 includes itself.
|
|
63
|
+
*/
|
|
64
|
+
export type FrostParticipantId = string;
|
|
65
|
+
export interface FrostStartRequest {
|
|
66
|
+
/** TDIP DID whose surface key is being signed for. */
|
|
67
|
+
readonly did: string;
|
|
68
|
+
/** Stable id of the surface key (matches `SurfaceKey.keyId`). */
|
|
69
|
+
readonly surfaceKey: string;
|
|
70
|
+
readonly scheme: FrostScheme;
|
|
71
|
+
/** Canonical preimage bytes — surface module canonicalised. */
|
|
72
|
+
readonly preimage: Uint8Array;
|
|
73
|
+
/** Optional context tag for the audit log. */
|
|
74
|
+
readonly purpose?: string;
|
|
75
|
+
}
|
|
76
|
+
export interface FrostStartResult {
|
|
77
|
+
readonly sessionId: string;
|
|
78
|
+
/** Unix-ms timestamp when this session is dropped. */
|
|
79
|
+
readonly expiresAt: number;
|
|
80
|
+
/** Set of co-signers the node will coordinate. Includes this device. */
|
|
81
|
+
readonly participants: readonly FrostParticipantId[];
|
|
82
|
+
}
|
|
83
|
+
export interface FrostCommitRequest {
|
|
84
|
+
readonly sessionId: string;
|
|
85
|
+
/** RFC 9591 commitment bundle `(D_i, E_i)` produced device-side,
|
|
86
|
+
* serialized as opaque bytes. The node only forwards/aggregates. */
|
|
87
|
+
readonly deviceCommitment: Uint8Array;
|
|
88
|
+
}
|
|
89
|
+
export interface FrostCommitResult {
|
|
90
|
+
readonly sessionId: string;
|
|
91
|
+
readonly state: FrostSessionState;
|
|
92
|
+
}
|
|
93
|
+
export interface FrostChallenge {
|
|
94
|
+
readonly sessionId: string;
|
|
95
|
+
readonly state: FrostSessionState;
|
|
96
|
+
/** Aggregated group commitment `R = Σ D_i + ρ_i·E_i`, opaque bytes. */
|
|
97
|
+
readonly groupCommitment: Uint8Array;
|
|
98
|
+
/** Final signer set chosen for this round (subset of `participants`). */
|
|
99
|
+
readonly signerSet: readonly FrostParticipantId[];
|
|
100
|
+
/** Lagrange coefficient λ_i for *this device*, encoded as scalar bytes
|
|
101
|
+
* (curve-dependent: 32 bytes for Ed25519, 32 bytes for secp256k1). */
|
|
102
|
+
readonly lambda: Uint8Array;
|
|
103
|
+
}
|
|
104
|
+
export interface FrostRespondRequest {
|
|
105
|
+
readonly sessionId: string;
|
|
106
|
+
/** Device's signature share `z_i`, opaque bytes. */
|
|
107
|
+
readonly deviceShare: Uint8Array;
|
|
108
|
+
}
|
|
109
|
+
export interface FrostRespondResult {
|
|
110
|
+
readonly sessionId: string;
|
|
111
|
+
readonly state: FrostSessionState;
|
|
112
|
+
}
|
|
113
|
+
export interface FrostFinalizeResult {
|
|
114
|
+
readonly sessionId: string;
|
|
115
|
+
readonly state: FrostSessionState;
|
|
116
|
+
/** Aggregated signature, wire-format. 64 bytes for Ed25519, 64-65 for
|
|
117
|
+
* secp256k1 (sans recovery byte; surface module appends `v` if
|
|
118
|
+
* needed by recomputing it). Set when `state === 'finalized'`. */
|
|
119
|
+
readonly signature?: Uint8Array;
|
|
120
|
+
}
|
|
121
|
+
export interface FrostCoordinator {
|
|
122
|
+
start(req: FrostStartRequest): Promise<FrostStartResult>;
|
|
123
|
+
commit(req: FrostCommitRequest): Promise<FrostCommitResult>;
|
|
124
|
+
awaitChallenge(sessionId: string): Promise<FrostChallenge>;
|
|
125
|
+
respond(req: FrostRespondRequest): Promise<FrostRespondResult>;
|
|
126
|
+
finalize(sessionId: string): Promise<FrostFinalizeResult>;
|
|
127
|
+
abort(sessionId: string, reason?: string): Promise<void>;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Device-side share-holder. Produced by the passkey-unwrap layer; the
|
|
131
|
+
* FROST drivers don't care how the share was obtained, only that the
|
|
132
|
+
* holder can produce a commitment and a response on demand.
|
|
133
|
+
*/
|
|
134
|
+
export interface FrostDeviceShareHolder {
|
|
135
|
+
readonly scheme: FrostScheme;
|
|
136
|
+
/** Round 1 — produce `(D_i, E_i)` commitment bytes. */
|
|
137
|
+
commit(): Promise<Uint8Array>;
|
|
138
|
+
/** Round 3 — produce `z_i` from the round-2 challenge bundle. */
|
|
139
|
+
respond(args: {
|
|
140
|
+
readonly preimage: Uint8Array;
|
|
141
|
+
readonly groupCommitment: Uint8Array;
|
|
142
|
+
readonly signerSet: readonly FrostParticipantId[];
|
|
143
|
+
readonly lambda: Uint8Array;
|
|
144
|
+
}): Promise<Uint8Array>;
|
|
145
|
+
/** Best-effort wipe of any in-memory secret material. */
|
|
146
|
+
dispose?(): void;
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=coordinator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coordinator.d.ts","sourceRoot":"","sources":["../../../src/custody/frost/coordinator.ts"],"names":[],"mappings":"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"}
|