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,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NanopaymentFlow — wallet-side orchestration helpers for nanopayment
|
|
3
|
+
* channels. The `NanopaymentPort` exposes the SDK's primitives one-for-one;
|
|
4
|
+
* this module composes them into the lifecycle a real consumer (LLM
|
|
5
|
+
* streaming UI, per-API-call paywall, bandwidth meter) actually drives:
|
|
6
|
+
*
|
|
7
|
+
* open → many sendNanopayment → autoFlush at threshold → close on done
|
|
8
|
+
*
|
|
9
|
+
* The orchestration is all wallet-side. The node holds the channel state,
|
|
10
|
+
* the SDK exposes RPCs, this module sequences them.
|
|
11
|
+
*/
|
|
12
|
+
const DEFAULT_OPTS = {
|
|
13
|
+
flushEvery: 100,
|
|
14
|
+
flushAtAmount: 0n, // disabled by default — count-only
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Stateful helper that owns one open channel. Counts payments + value, flushes
|
|
18
|
+
* on threshold, closes on `done()`. Designed to be created once at the start
|
|
19
|
+
* of a streaming session and discarded at the end.
|
|
20
|
+
*/
|
|
21
|
+
export class NanopaymentSession {
|
|
22
|
+
#port;
|
|
23
|
+
#channel;
|
|
24
|
+
#opts;
|
|
25
|
+
#unsettledCount = 0;
|
|
26
|
+
#unsettledAmount = 0n;
|
|
27
|
+
#totalPaid = 0n;
|
|
28
|
+
#closed = false;
|
|
29
|
+
constructor(port, channel, opts) {
|
|
30
|
+
this.#port = port;
|
|
31
|
+
this.#channel = channel;
|
|
32
|
+
this.#opts = opts;
|
|
33
|
+
}
|
|
34
|
+
/** Open a channel and return a session bound to it. */
|
|
35
|
+
static async open(port, req, opts = {}) {
|
|
36
|
+
const channel = await port.openChannel({
|
|
37
|
+
payer: req.payer,
|
|
38
|
+
payee: req.payee,
|
|
39
|
+
deposit: req.deposit,
|
|
40
|
+
...(req.asset !== undefined ? { asset: req.asset } : {}),
|
|
41
|
+
});
|
|
42
|
+
return new NanopaymentSession(port, channel, opts);
|
|
43
|
+
}
|
|
44
|
+
get channelId() {
|
|
45
|
+
return this.#channel.channelId;
|
|
46
|
+
}
|
|
47
|
+
get totalPaid() {
|
|
48
|
+
return this.#totalPaid;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Send a single off-chain payment. Returns the receipt. Auto-flushes
|
|
52
|
+
* when count or amount thresholds cross.
|
|
53
|
+
*/
|
|
54
|
+
async send(amount, memo) {
|
|
55
|
+
if (this.#closed) {
|
|
56
|
+
throw new Error('NanopaymentSession.send: session is closed');
|
|
57
|
+
}
|
|
58
|
+
const cap = this.#opts.sessionCap;
|
|
59
|
+
if (cap !== undefined && this.#totalPaid + amount > cap) {
|
|
60
|
+
throw new Error(`NanopaymentSession.send: amount ${amount} would exceed session cap ${cap} ` +
|
|
61
|
+
`(already paid ${this.#totalPaid})`);
|
|
62
|
+
}
|
|
63
|
+
const receipt = await this.#port.sendNanopayment({
|
|
64
|
+
channelId: this.#channel.channelId,
|
|
65
|
+
amount,
|
|
66
|
+
...(memo !== undefined ? { memo } : {}),
|
|
67
|
+
});
|
|
68
|
+
this.#unsettledCount += 1;
|
|
69
|
+
this.#unsettledAmount += amount;
|
|
70
|
+
this.#totalPaid += amount;
|
|
71
|
+
if (this.#shouldAutoFlush()) {
|
|
72
|
+
await this.flush();
|
|
73
|
+
}
|
|
74
|
+
return receipt;
|
|
75
|
+
}
|
|
76
|
+
/** Force an on-chain batch settlement. Resets unsettled counters. */
|
|
77
|
+
async flush() {
|
|
78
|
+
if (this.#unsettledCount === 0)
|
|
79
|
+
return;
|
|
80
|
+
await this.#port.flushBatch(this.#channel.channelId);
|
|
81
|
+
this.#unsettledCount = 0;
|
|
82
|
+
this.#unsettledAmount = 0n;
|
|
83
|
+
}
|
|
84
|
+
/** Close the channel. Idempotent; subsequent sends throw. */
|
|
85
|
+
async close() {
|
|
86
|
+
if (this.#closed)
|
|
87
|
+
return;
|
|
88
|
+
this.#closed = true;
|
|
89
|
+
if (this.#unsettledCount > 0) {
|
|
90
|
+
// Best-effort flush before close; if it fails, close still proceeds —
|
|
91
|
+
// the node settles anything outstanding from the channel state.
|
|
92
|
+
try {
|
|
93
|
+
await this.#port.flushBatch(this.#channel.channelId);
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
// swallow — close handles final state
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
await this.#port.closeChannel(this.#channel.channelId);
|
|
100
|
+
}
|
|
101
|
+
#shouldAutoFlush() {
|
|
102
|
+
const flushEvery = this.#opts.flushEvery ?? DEFAULT_OPTS.flushEvery;
|
|
103
|
+
if (flushEvery > 0 && this.#unsettledCount >= flushEvery)
|
|
104
|
+
return true;
|
|
105
|
+
const flushAtAmount = this.#opts.flushAtAmount ?? DEFAULT_OPTS.flushAtAmount;
|
|
106
|
+
if (flushAtAmount > 0n && this.#unsettledAmount >= flushAtAmount)
|
|
107
|
+
return true;
|
|
108
|
+
return false;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=nanopayment-flow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nanopayment-flow.js","sourceRoot":"","sources":["../../src/settlement/nanopayment-flow.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Canton Network MainNet surface — Tenzro hosts the validator; the user's
|
|
3
|
+
* canton-external party signs locally and the validator dispatches to the
|
|
4
|
+
* Global Synchronizer.
|
|
5
|
+
*
|
|
6
|
+
* Protocol shape (per DESIGN.md §4.5):
|
|
7
|
+
* - prepare → ask the validator's Interactive Submission Service for a
|
|
8
|
+
* `PreparedTransaction` proto + canonical hash.
|
|
9
|
+
* - sign → recompute the hash locally (SHA-256 with Canton hash purpose 11
|
|
10
|
+
* prefix, `HASHING_SCHEME_VERSION_V2`), constant-time-compare with the
|
|
11
|
+
* validator's hash, then sign that hash via the SigningDriver. The
|
|
12
|
+
* equality assertion is the wallet's only defence against a malicious
|
|
13
|
+
* validator — without it, signing the validator-supplied hash trusts
|
|
14
|
+
* the validator on what's being authorised.
|
|
15
|
+
* - submit → `executeSubmission` with the signed hash; the validator
|
|
16
|
+
* dispatches to the synchronizer.
|
|
17
|
+
* - watch → tail `tailCompletions` filtered to this command id.
|
|
18
|
+
*
|
|
19
|
+
* The PreparedTransaction proto's content-level decode (re-deriving the
|
|
20
|
+
* user-visible fields from the proto and comparing them to `intent`) is
|
|
21
|
+
* deferred — see DESIGN.md §11 open question #5. Hash equality alone is
|
|
22
|
+
* sufficient to bind signature → exact bytes; content decode is a defence
|
|
23
|
+
* against a validator that returns *valid* bytes for the *wrong* transaction.
|
|
24
|
+
* We accept that gap until the proto schema lands in the kernel.
|
|
25
|
+
*/
|
|
26
|
+
import type { CantonValidatorPort } from '../ports/canton/canton-validator.js';
|
|
27
|
+
import type { SurfaceKey, TdipDid } from '../types/identity.js';
|
|
28
|
+
import type { SigningDriver } from '../types/signing-driver.js';
|
|
29
|
+
import type { SurfaceModule } from '../types/surface-module.js';
|
|
30
|
+
export interface CantonExternalDeps {
|
|
31
|
+
readonly keyResolver: (did: TdipDid) => SurfaceKey | undefined;
|
|
32
|
+
readonly signingDriver: SigningDriver;
|
|
33
|
+
/**
|
|
34
|
+
* Validator port. The kernel owns the adapter wiring (typically
|
|
35
|
+
* `LedgerApiAdapter`) and threads it through here. The surface module
|
|
36
|
+
* never constructs the port itself — keeps test injection clean.
|
|
37
|
+
*/
|
|
38
|
+
readonly validatorPort: CantonValidatorPort;
|
|
39
|
+
/** User id to thread into completion filters (Canton needs `user_id`). */
|
|
40
|
+
readonly userId: string;
|
|
41
|
+
}
|
|
42
|
+
export declare function cantonExternalSurface(deps: CantonExternalDeps): SurfaceModule;
|
|
43
|
+
//# sourceMappingURL=canton-external.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canton-external.d.ts","sourceRoot":"","sources":["../../src/surfaces/canton-external.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,KAAK,EACV,mBAAmB,EAIpB,MAAM,qCAAqC,CAAC;AAG7C,OAAO,KAAK,EAAkB,UAAU,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAEhF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAoBhE,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,WAAW,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,UAAU,GAAG,SAAS,CAAC;IAC/D,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC;IACtC;;;;OAIG;IACH,QAAQ,CAAC,aAAa,EAAE,mBAAmB,CAAC;IAC5C,0EAA0E;IAC1E,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,kBAAkB,GAAG,aAAa,CAoJ7E"}
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Canton Network MainNet surface — Tenzro hosts the validator; the user's
|
|
3
|
+
* canton-external party signs locally and the validator dispatches to the
|
|
4
|
+
* Global Synchronizer.
|
|
5
|
+
*
|
|
6
|
+
* Protocol shape (per DESIGN.md §4.5):
|
|
7
|
+
* - prepare → ask the validator's Interactive Submission Service for a
|
|
8
|
+
* `PreparedTransaction` proto + canonical hash.
|
|
9
|
+
* - sign → recompute the hash locally (SHA-256 with Canton hash purpose 11
|
|
10
|
+
* prefix, `HASHING_SCHEME_VERSION_V2`), constant-time-compare with the
|
|
11
|
+
* validator's hash, then sign that hash via the SigningDriver. The
|
|
12
|
+
* equality assertion is the wallet's only defence against a malicious
|
|
13
|
+
* validator — without it, signing the validator-supplied hash trusts
|
|
14
|
+
* the validator on what's being authorised.
|
|
15
|
+
* - submit → `executeSubmission` with the signed hash; the validator
|
|
16
|
+
* dispatches to the synchronizer.
|
|
17
|
+
* - watch → tail `tailCompletions` filtered to this command id.
|
|
18
|
+
*
|
|
19
|
+
* The PreparedTransaction proto's content-level decode (re-deriving the
|
|
20
|
+
* user-visible fields from the proto and comparing them to `intent`) is
|
|
21
|
+
* deferred — see DESIGN.md §11 open question #5. Hash equality alone is
|
|
22
|
+
* sufficient to bind signature → exact bytes; content decode is a defence
|
|
23
|
+
* against a validator that returns *valid* bytes for the *wrong* transaction.
|
|
24
|
+
* We accept that gap until the proto schema lands in the kernel.
|
|
25
|
+
*/
|
|
26
|
+
import { bytesEqualConstantTime, preparedTransactionHash } from "../ports/canton/hash.js";
|
|
27
|
+
import { makeHandle } from "./util.js";
|
|
28
|
+
export function cantonExternalSurface(deps) {
|
|
29
|
+
const port = deps.validatorPort;
|
|
30
|
+
return {
|
|
31
|
+
name: 'canton-external',
|
|
32
|
+
memoSpec() {
|
|
33
|
+
// Canton's transfer description is a free-form text field, optional
|
|
34
|
+
// (the network credits without it), capped at 256 chars to keep the
|
|
35
|
+
// CC `Numeric 10` payload + description under the standard transfer-
|
|
36
|
+
// command size budget. Per DESIGN.md §11.9, this is the canonical
|
|
37
|
+
// example surfaces follow.
|
|
38
|
+
return {
|
|
39
|
+
kind: 'text',
|
|
40
|
+
required: false,
|
|
41
|
+
maxLength: 256,
|
|
42
|
+
label: 'Transfer description',
|
|
43
|
+
};
|
|
44
|
+
},
|
|
45
|
+
async prepare(intent) {
|
|
46
|
+
if (intent.kind !== 'send')
|
|
47
|
+
throw new Error(`unsupported: ${intent.kind}`);
|
|
48
|
+
if (intent.to.kind !== 'canton') {
|
|
49
|
+
throw new Error('canton-external requires a canton recipient');
|
|
50
|
+
}
|
|
51
|
+
const fromKey = deps.keyResolver(intent.from);
|
|
52
|
+
if (!fromKey || fromKey.surface !== 'canton-external') {
|
|
53
|
+
throw new Error(`no canton-external key for ${intent.from}`);
|
|
54
|
+
}
|
|
55
|
+
const trackingId = `tenzro-wallet-${Date.now()}`;
|
|
56
|
+
// Two-path routing: if the recipient has a TransferPreapproval, use the
|
|
57
|
+
// one-step `TransferPreapproval_Send` path (atomic, final on commit).
|
|
58
|
+
// Otherwise fall back to the Token Standard two-step (TransferOffer
|
|
59
|
+
// / accept). Tenzro pre-creates preapprovals during external-party
|
|
60
|
+
// onboarding, so the preapproval path is the common case — but the
|
|
61
|
+
// recipient may be a non-Tenzro Canton party.
|
|
62
|
+
const preapproval = await port.lookupPreapproval(intent.to.partyId);
|
|
63
|
+
const viaPreapproval = preapproval !== null;
|
|
64
|
+
const req = {
|
|
65
|
+
actAs: fromKey.partyId,
|
|
66
|
+
synchronizerId: fromKey.synchronizerId,
|
|
67
|
+
commandId: trackingId,
|
|
68
|
+
// Pinned package id per DESIGN.md §4.5.3. Post-2026-05-05 baseline:
|
|
69
|
+
// `splice-amulet 0.1.17` on the Tenzro validator.
|
|
70
|
+
packageIdSelectionPreference: 'splice-amulet:0.1.17',
|
|
71
|
+
commands: shapeAmuletTransfer({
|
|
72
|
+
from: fromKey.partyId,
|
|
73
|
+
to: intent.to.partyId,
|
|
74
|
+
amount: intent.amount,
|
|
75
|
+
assetSymbol: intent.asset.symbol,
|
|
76
|
+
memo: intent.memo,
|
|
77
|
+
viaPreapproval,
|
|
78
|
+
...(preapproval !== null ? { preapprovalContractId: preapproval.contractId } : {}),
|
|
79
|
+
}),
|
|
80
|
+
};
|
|
81
|
+
const prepared = await port.prepareSubmission(req);
|
|
82
|
+
assertHashingScheme(prepared);
|
|
83
|
+
const body = {
|
|
84
|
+
kind: 'canton-external-send',
|
|
85
|
+
fromParty: fromKey.partyId,
|
|
86
|
+
toParty: intent.to.partyId,
|
|
87
|
+
amount: intent.amount,
|
|
88
|
+
assetSymbol: intent.asset.symbol,
|
|
89
|
+
...(intent.memo !== undefined ? { description: intent.memo } : {}),
|
|
90
|
+
trackingId,
|
|
91
|
+
viaPreapproval,
|
|
92
|
+
synchronizerId: fromKey.synchronizerId,
|
|
93
|
+
preparedTransaction: prepared.preparedTransaction,
|
|
94
|
+
preparedTransactionHash: prepared.preparedTransactionHash,
|
|
95
|
+
};
|
|
96
|
+
return {
|
|
97
|
+
route: { kind: 'native', surface: 'canton-external' },
|
|
98
|
+
intent,
|
|
99
|
+
// Canton fees aren't paid in CC at the wallet level — they're SV
|
|
100
|
+
// reward economics under the hood. Display-only zero is fine here;
|
|
101
|
+
// the validator response carries the actual cost in CC if needed.
|
|
102
|
+
fees: [{ asset: intent.asset, amount: 0n, label: 'canton mainnet sync fee' }],
|
|
103
|
+
// Two-step (Token Standard) is held as `pending` on the receiver's
|
|
104
|
+
// side until acceptance; preapproval is atomic. Reflect the latency
|
|
105
|
+
// delta in `etaMs`.
|
|
106
|
+
etaMs: viaPreapproval ? 2000 : 8000,
|
|
107
|
+
reversibility: viaPreapproval ? 'final-on-submit' : 'reversible-until-confirmed',
|
|
108
|
+
warnings: [],
|
|
109
|
+
body,
|
|
110
|
+
};
|
|
111
|
+
},
|
|
112
|
+
async sign(prepared, _consent) {
|
|
113
|
+
const body = prepared.body;
|
|
114
|
+
const did = prepared.intent.from;
|
|
115
|
+
const key = deps.keyResolver(did);
|
|
116
|
+
if (!key || key.surface !== 'canton-external') {
|
|
117
|
+
throw new Error('missing canton-external key at sign time');
|
|
118
|
+
}
|
|
119
|
+
// Recompute the hash from the proto bytes the validator returned and
|
|
120
|
+
// assert it matches what the validator claims is the hash. Without
|
|
121
|
+
// this check the wallet trusts the validator on what it's signing —
|
|
122
|
+
// defeats external signing.
|
|
123
|
+
const recomputed = await preparedTransactionHash(body.preparedTransaction);
|
|
124
|
+
if (!bytesEqualConstantTime(recomputed, body.preparedTransactionHash)) {
|
|
125
|
+
throw new Error('canton-external: preparedTransactionHash mismatch — refusing to sign. ' +
|
|
126
|
+
'Either the validator is malicious or the proto bytes were corrupted in transit.');
|
|
127
|
+
}
|
|
128
|
+
const result = await deps.signingDriver.sign({
|
|
129
|
+
did,
|
|
130
|
+
surfaceKey: key,
|
|
131
|
+
scheme: 'ed25519',
|
|
132
|
+
// Sign the recomputed hash, not the validator-supplied one. They're
|
|
133
|
+
// equal by the assertion above; using the recomputed one removes the
|
|
134
|
+
// last byte of trust in the validator's response.
|
|
135
|
+
preimage: recomputed,
|
|
136
|
+
purpose: 'canton-external-send',
|
|
137
|
+
});
|
|
138
|
+
return { prepared, signatures: result.signatures, body };
|
|
139
|
+
},
|
|
140
|
+
async submit(signed) {
|
|
141
|
+
const body = signed.body;
|
|
142
|
+
const key = deps.keyResolver(signed.prepared.intent.from);
|
|
143
|
+
if (!key || key.surface !== 'canton-external') {
|
|
144
|
+
throw new Error('missing canton-external key at submit time');
|
|
145
|
+
}
|
|
146
|
+
const req = {
|
|
147
|
+
preparedTransaction: body.preparedTransaction,
|
|
148
|
+
partySignatures: shapePartySignatures(key, signed.signatures),
|
|
149
|
+
hashingSchemeVersion: 'HASHING_SCHEME_VERSION_V2',
|
|
150
|
+
submissionId: body.trackingId,
|
|
151
|
+
};
|
|
152
|
+
await port.executeSubmission(req);
|
|
153
|
+
// Canton has no tx hash equivalent until the completion arrives. The
|
|
154
|
+
// returned `updateId` becomes `TxHandle.hash` once `watch` observes
|
|
155
|
+
// the completion; for now hand back the trackingId so the consent UI
|
|
156
|
+
// has something to display.
|
|
157
|
+
return makeHandle('canton-external', signed.prepared.intent, body.trackingId);
|
|
158
|
+
},
|
|
159
|
+
watch(handle) {
|
|
160
|
+
return watchViaPort(handle, port, deps.userId);
|
|
161
|
+
},
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Translate a high-level transfer into Daml `Commands`. Hands the port a
|
|
166
|
+
* structured payload it can shape into the real Splice `Commands` proto;
|
|
167
|
+
* the kernel itself never sees the proto bytes. Two shapes by route:
|
|
168
|
+
* - viaPreapproval: `TransferPreapproval_Send` (one-step).
|
|
169
|
+
* - two-step: `AmuletRules_TransferOffer_Create` (recipient must accept).
|
|
170
|
+
*/
|
|
171
|
+
function shapeAmuletTransfer(args) {
|
|
172
|
+
if (args.viaPreapproval) {
|
|
173
|
+
return [
|
|
174
|
+
{
|
|
175
|
+
_intent: 'amulet-transfer-preapproval',
|
|
176
|
+
sender: args.from,
|
|
177
|
+
receiver: args.to,
|
|
178
|
+
amount: args.amount,
|
|
179
|
+
assetSymbol: args.assetSymbol,
|
|
180
|
+
...(args.memo !== undefined ? { description: args.memo } : {}),
|
|
181
|
+
preapprovalContractId: args.preapprovalContractId,
|
|
182
|
+
},
|
|
183
|
+
];
|
|
184
|
+
}
|
|
185
|
+
return [
|
|
186
|
+
{
|
|
187
|
+
_intent: 'amulet-transfer-offer',
|
|
188
|
+
sender: args.from,
|
|
189
|
+
receiver: args.to,
|
|
190
|
+
amount: args.amount,
|
|
191
|
+
assetSymbol: args.assetSymbol,
|
|
192
|
+
...(args.memo !== undefined ? { description: args.memo } : {}),
|
|
193
|
+
},
|
|
194
|
+
];
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Shape the SigningDriver's signature output as `partySignatures` for the
|
|
198
|
+
* Interactive Submission Service. Single-party, threshold = N: the
|
|
199
|
+
* SigningDriver returns N signatures (one per signing key) and we attach
|
|
200
|
+
* each to the corresponding `signingKeys[i]`. M-of-N over different parties
|
|
201
|
+
* is a separate flow (multi-party signing) handled outside this surface.
|
|
202
|
+
*/
|
|
203
|
+
function shapePartySignatures(key, signatures) {
|
|
204
|
+
if (signatures.length < key.threshold) {
|
|
205
|
+
throw new Error(`canton-external: need ${key.threshold} signatures, got ${signatures.length}`);
|
|
206
|
+
}
|
|
207
|
+
return signatures.slice(0, key.threshold).map((sig, i) => {
|
|
208
|
+
const sk = key.signingKeys[i];
|
|
209
|
+
if (!sk)
|
|
210
|
+
throw new Error(`canton-external: missing signing key at index ${i}`);
|
|
211
|
+
return {
|
|
212
|
+
party: key.partyId,
|
|
213
|
+
signature: sig,
|
|
214
|
+
scheme: sk.scheme,
|
|
215
|
+
// Canton's `Fingerprint` (`1220` + lowercase-hex SHA-256 of the public
|
|
216
|
+
// key) is the validator's lookup key into `PartyToKeyMapping`.
|
|
217
|
+
// Precomputed at provision time so the signing path stays sync.
|
|
218
|
+
signedBy: sk.fingerprint,
|
|
219
|
+
};
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
function assertHashingScheme(r) {
|
|
223
|
+
if (r.hashingSchemeVersion !== 'HASHING_SCHEME_VERSION_V2') {
|
|
224
|
+
throw new Error(`canton-external: unsupported hashing scheme ${r.hashingSchemeVersion}; ` +
|
|
225
|
+
`kernel only knows V2 (see DESIGN.md §11 open question #4)`);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Watch a Canton submission to completion. Tails `port.tailCompletions`
|
|
230
|
+
* filtered to the user's party + this command id, surfaces the single
|
|
231
|
+
* `executed | failed` finality event as a TxStatus stream.
|
|
232
|
+
*/
|
|
233
|
+
async function* watchViaPort(handle, port, userId) {
|
|
234
|
+
yield { handle, phase: 'created' };
|
|
235
|
+
yield { handle, phase: 'pending' };
|
|
236
|
+
// Watching against the port: Canton has no confirmation depth, so we
|
|
237
|
+
// surface a single `confirmed` event for `executed` and stop there.
|
|
238
|
+
for await (const c of port.tailCompletions({
|
|
239
|
+
userId,
|
|
240
|
+
actAs: [handle.surface],
|
|
241
|
+
})) {
|
|
242
|
+
if (c.commandId !== handle.hash)
|
|
243
|
+
continue; // hash carries the trackingId
|
|
244
|
+
yield {
|
|
245
|
+
handle: { ...handle, hash: c.updateId },
|
|
246
|
+
phase: c.status === 'executed' ? 'confirmed' : 'failed',
|
|
247
|
+
...(c.errorMessage !== undefined ? { reason: c.errorMessage } : {}),
|
|
248
|
+
};
|
|
249
|
+
return;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
//# sourceMappingURL=canton-external.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canton-external.js","sourceRoot":"","sources":["../../src/surfaces/canton-external.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Canton/Daml on the Tenzro-operated synchronizer.
|
|
3
|
+
*
|
|
4
|
+
* Same protocol as canton-external — Interactive Submission Service for
|
|
5
|
+
* prepare/execute, completion-stream for watch — different validator and
|
|
6
|
+
* different `synchronizerId`. Tenzro runs its own sequencer + mediator;
|
|
7
|
+
* participants hosted on Tenzro infra connect to it; the asset model is a
|
|
8
|
+
* Tenzro-local mirror of `Splice.Amulet` semantics, no Global Synchronizer
|
|
9
|
+
* governance hooks.
|
|
10
|
+
*
|
|
11
|
+
* The two surfaces stay separate because:
|
|
12
|
+
* - The recipient mapping is different (`canton-internal` parties live
|
|
13
|
+
* on the Tenzro synchronizer, not GSN).
|
|
14
|
+
* - The asset symbol set is local (no CC, no SV economics).
|
|
15
|
+
* - The validator port is configured with a different ledger base URL.
|
|
16
|
+
*
|
|
17
|
+
* The implementation mirrors canton-external.ts; the kernel can choose to
|
|
18
|
+
* factor the shared body out later if these stay 1:1, but keeping them
|
|
19
|
+
* separate now lets us evolve them independently as the Tenzro internal
|
|
20
|
+
* synchronizer's economics diverge from MainNet.
|
|
21
|
+
*/
|
|
22
|
+
import type { CantonValidatorPort } from '../ports/canton/canton-validator.js';
|
|
23
|
+
import type { SurfaceKey, TdipDid } from '../types/identity.js';
|
|
24
|
+
import type { SigningDriver } from '../types/signing-driver.js';
|
|
25
|
+
import type { SurfaceModule } from '../types/surface-module.js';
|
|
26
|
+
export interface CantonInternalDeps {
|
|
27
|
+
readonly keyResolver: (did: TdipDid) => SurfaceKey | undefined;
|
|
28
|
+
readonly signingDriver: SigningDriver;
|
|
29
|
+
/** Validator port, pointed at the Tenzro-operated synchronizer's validator. */
|
|
30
|
+
readonly validatorPort: CantonValidatorPort;
|
|
31
|
+
readonly userId: string;
|
|
32
|
+
}
|
|
33
|
+
export declare function cantonInternalSurface(deps: CantonInternalDeps): SurfaceModule;
|
|
34
|
+
//# sourceMappingURL=canton-internal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canton-internal.d.ts","sourceRoot":"","sources":["../../src/surfaces/canton-internal.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EACV,mBAAmB,EAIpB,MAAM,qCAAqC,CAAC;AAG7C,OAAO,KAAK,EAAkB,UAAU,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAEhF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAgBhE,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,WAAW,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,UAAU,GAAG,SAAS,CAAC;IAC/D,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC;IACtC,+EAA+E;IAC/E,QAAQ,CAAC,aAAa,EAAE,mBAAmB,CAAC;IAC5C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,kBAAkB,GAAG,aAAa,CA4G7E"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Canton/Daml on the Tenzro-operated synchronizer.
|
|
3
|
+
*
|
|
4
|
+
* Same protocol as canton-external — Interactive Submission Service for
|
|
5
|
+
* prepare/execute, completion-stream for watch — different validator and
|
|
6
|
+
* different `synchronizerId`. Tenzro runs its own sequencer + mediator;
|
|
7
|
+
* participants hosted on Tenzro infra connect to it; the asset model is a
|
|
8
|
+
* Tenzro-local mirror of `Splice.Amulet` semantics, no Global Synchronizer
|
|
9
|
+
* governance hooks.
|
|
10
|
+
*
|
|
11
|
+
* The two surfaces stay separate because:
|
|
12
|
+
* - The recipient mapping is different (`canton-internal` parties live
|
|
13
|
+
* on the Tenzro synchronizer, not GSN).
|
|
14
|
+
* - The asset symbol set is local (no CC, no SV economics).
|
|
15
|
+
* - The validator port is configured with a different ledger base URL.
|
|
16
|
+
*
|
|
17
|
+
* The implementation mirrors canton-external.ts; the kernel can choose to
|
|
18
|
+
* factor the shared body out later if these stay 1:1, but keeping them
|
|
19
|
+
* separate now lets us evolve them independently as the Tenzro internal
|
|
20
|
+
* synchronizer's economics diverge from MainNet.
|
|
21
|
+
*/
|
|
22
|
+
import { bytesEqualConstantTime, preparedTransactionHash } from "../ports/canton/hash.js";
|
|
23
|
+
import { makeHandle } from "./util.js";
|
|
24
|
+
export function cantonInternalSurface(deps) {
|
|
25
|
+
const port = deps.validatorPort;
|
|
26
|
+
return {
|
|
27
|
+
name: 'canton-internal',
|
|
28
|
+
async prepare(intent) {
|
|
29
|
+
if (intent.kind !== 'send')
|
|
30
|
+
throw new Error(`unsupported: ${intent.kind}`);
|
|
31
|
+
if (intent.to.kind !== 'canton') {
|
|
32
|
+
throw new Error('canton-internal requires a canton recipient');
|
|
33
|
+
}
|
|
34
|
+
const fromKey = deps.keyResolver(intent.from);
|
|
35
|
+
if (!fromKey || fromKey.surface !== 'canton-internal') {
|
|
36
|
+
throw new Error(`no canton-internal key for ${intent.from}`);
|
|
37
|
+
}
|
|
38
|
+
const trackingId = `tenzro-wallet-${Date.now()}`;
|
|
39
|
+
const req = {
|
|
40
|
+
actAs: fromKey.partyId,
|
|
41
|
+
synchronizerId: fromKey.synchronizerId,
|
|
42
|
+
commandId: trackingId,
|
|
43
|
+
// Tenzro-internal asset package. Aligned with the splice-amulet
|
|
44
|
+
// semantics but published under a Tenzro-specific package id so
|
|
45
|
+
// the two synchronizers' assets don't collide.
|
|
46
|
+
packageIdSelectionPreference: 'tenzro-amulet:0.1.0',
|
|
47
|
+
commands: [
|
|
48
|
+
{
|
|
49
|
+
_intent: 'tenzro-amulet-transfer',
|
|
50
|
+
sender: fromKey.partyId,
|
|
51
|
+
receiver: intent.to.partyId,
|
|
52
|
+
amount: intent.amount,
|
|
53
|
+
assetSymbol: intent.asset.symbol,
|
|
54
|
+
...(intent.memo !== undefined ? { description: intent.memo } : {}),
|
|
55
|
+
},
|
|
56
|
+
],
|
|
57
|
+
};
|
|
58
|
+
const prepared = await port.prepareSubmission(req);
|
|
59
|
+
assertHashingScheme(prepared);
|
|
60
|
+
const body = {
|
|
61
|
+
kind: 'canton-internal-send',
|
|
62
|
+
fromParty: fromKey.partyId,
|
|
63
|
+
toParty: intent.to.partyId,
|
|
64
|
+
amount: intent.amount,
|
|
65
|
+
assetSymbol: intent.asset.symbol,
|
|
66
|
+
...(intent.memo !== undefined ? { description: intent.memo } : {}),
|
|
67
|
+
trackingId,
|
|
68
|
+
synchronizerId: fromKey.synchronizerId,
|
|
69
|
+
preparedTransaction: prepared.preparedTransaction,
|
|
70
|
+
preparedTransactionHash: prepared.preparedTransactionHash,
|
|
71
|
+
};
|
|
72
|
+
return {
|
|
73
|
+
route: { kind: 'native', surface: 'canton-internal' },
|
|
74
|
+
intent,
|
|
75
|
+
// Tenzro-internal synchronizer charges a flat sync fee in the local
|
|
76
|
+
// asset; surface-level fee modelling tracks canton-external for now.
|
|
77
|
+
fees: [{ asset: intent.asset, amount: 0n, label: 'tenzro synchronizer fee' }],
|
|
78
|
+
etaMs: 1500,
|
|
79
|
+
reversibility: 'final-on-submit',
|
|
80
|
+
warnings: [],
|
|
81
|
+
body,
|
|
82
|
+
};
|
|
83
|
+
},
|
|
84
|
+
async sign(prepared, _consent) {
|
|
85
|
+
const body = prepared.body;
|
|
86
|
+
const did = prepared.intent.from;
|
|
87
|
+
const key = deps.keyResolver(did);
|
|
88
|
+
if (!key || key.surface !== 'canton-internal') {
|
|
89
|
+
throw new Error('missing canton-internal key at sign time');
|
|
90
|
+
}
|
|
91
|
+
const recomputed = await preparedTransactionHash(body.preparedTransaction);
|
|
92
|
+
if (!bytesEqualConstantTime(recomputed, body.preparedTransactionHash)) {
|
|
93
|
+
throw new Error('canton-internal: preparedTransactionHash mismatch — refusing to sign.');
|
|
94
|
+
}
|
|
95
|
+
const result = await deps.signingDriver.sign({
|
|
96
|
+
did,
|
|
97
|
+
surfaceKey: key,
|
|
98
|
+
scheme: 'ed25519',
|
|
99
|
+
preimage: recomputed,
|
|
100
|
+
purpose: 'canton-internal-send',
|
|
101
|
+
});
|
|
102
|
+
return { prepared, signatures: result.signatures, body };
|
|
103
|
+
},
|
|
104
|
+
async submit(signed) {
|
|
105
|
+
const body = signed.body;
|
|
106
|
+
const key = deps.keyResolver(signed.prepared.intent.from);
|
|
107
|
+
if (!key || key.surface !== 'canton-internal') {
|
|
108
|
+
throw new Error('missing canton-internal key at submit time');
|
|
109
|
+
}
|
|
110
|
+
const req = {
|
|
111
|
+
preparedTransaction: body.preparedTransaction,
|
|
112
|
+
partySignatures: shapePartySignatures(key, signed.signatures),
|
|
113
|
+
hashingSchemeVersion: 'HASHING_SCHEME_VERSION_V2',
|
|
114
|
+
submissionId: body.trackingId,
|
|
115
|
+
};
|
|
116
|
+
await port.executeSubmission(req);
|
|
117
|
+
return makeHandle('canton-internal', signed.prepared.intent, body.trackingId);
|
|
118
|
+
},
|
|
119
|
+
watch(handle) {
|
|
120
|
+
return watchViaPort(handle, port, deps.userId);
|
|
121
|
+
},
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
function shapePartySignatures(key, signatures) {
|
|
125
|
+
if (signatures.length < key.threshold) {
|
|
126
|
+
throw new Error(`canton-internal: need ${key.threshold} signatures, got ${signatures.length}`);
|
|
127
|
+
}
|
|
128
|
+
return signatures.slice(0, key.threshold).map((sig, i) => {
|
|
129
|
+
const sk = key.signingKeys[i];
|
|
130
|
+
if (!sk)
|
|
131
|
+
throw new Error(`canton-internal: missing signing key at index ${i}`);
|
|
132
|
+
return {
|
|
133
|
+
party: key.partyId,
|
|
134
|
+
signature: sig,
|
|
135
|
+
scheme: sk.scheme,
|
|
136
|
+
signedBy: sk.fingerprint,
|
|
137
|
+
};
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
function assertHashingScheme(r) {
|
|
141
|
+
if (r.hashingSchemeVersion !== 'HASHING_SCHEME_VERSION_V2') {
|
|
142
|
+
throw new Error(`canton-internal: unsupported hashing scheme ${r.hashingSchemeVersion}; ` +
|
|
143
|
+
`kernel only knows V2`);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
async function* watchViaPort(handle, port, userId) {
|
|
147
|
+
yield { handle, phase: 'created' };
|
|
148
|
+
yield { handle, phase: 'pending' };
|
|
149
|
+
for await (const c of port.tailCompletions({
|
|
150
|
+
userId,
|
|
151
|
+
actAs: [handle.surface],
|
|
152
|
+
})) {
|
|
153
|
+
if (c.commandId !== handle.hash)
|
|
154
|
+
continue;
|
|
155
|
+
yield {
|
|
156
|
+
handle: { ...handle, hash: c.updateId },
|
|
157
|
+
phase: c.status === 'executed' ? 'confirmed' : 'failed',
|
|
158
|
+
...(c.errorMessage !== undefined ? { reason: c.errorMessage } : {}),
|
|
159
|
+
};
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=canton-internal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canton-internal.js","sourceRoot":"","sources":["../../src/surfaces/canton-internal.ts"],"names":[],"mappings":"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"}
|