@veilo/sdk-core 0.4.0 → 0.6.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 +15 -0
- package/README.md +449 -1243
- package/accounts.d.ts +2 -0
- package/accounts.js +3 -0
- package/cloak.d.ts +2 -0
- package/cloak.js +3 -0
- package/config.d.ts +2 -2
- package/config.js +2 -3
- package/dist/cjs/accounts/admin.d.ts +84 -0
- package/dist/cjs/accounts/admin.js +208 -0
- package/dist/cjs/accounts/errors.d.ts +6 -0
- package/dist/cjs/accounts/errors.js +98 -0
- package/dist/cjs/accounts/index.d.ts +4 -0
- package/dist/cjs/accounts/index.js +20 -0
- package/dist/cjs/accounts/pdas.d.ts +23 -0
- package/dist/cjs/accounts/pdas.js +44 -0
- package/dist/cjs/accounts/queries.d.ts +41 -0
- package/dist/cjs/accounts/queries.js +95 -0
- package/dist/cjs/client.d.ts +2 -407
- package/dist/cjs/client.js +6 -938
- package/dist/cjs/cloak/client.d.ts +28 -0
- package/dist/cjs/cloak/client.js +68 -0
- package/dist/cjs/cloak/errors.d.ts +13 -0
- package/dist/cjs/cloak/errors.js +25 -0
- package/dist/cjs/cloak/helpers.d.ts +6 -0
- package/dist/cjs/cloak/helpers.js +35 -0
- package/dist/cjs/cloak/index.d.ts +6 -0
- package/dist/cjs/cloak/index.js +24 -0
- package/dist/cjs/cloak/polling.d.ts +7 -0
- package/dist/cjs/cloak/polling.js +66 -0
- package/dist/cjs/cloak/transport.d.ts +15 -0
- package/dist/cjs/cloak/transport.js +119 -0
- package/dist/cjs/cloak/types.d.ts +188 -0
- package/dist/cjs/cloak/types.js +5 -0
- package/dist/cjs/cloak.d.ts +1 -0
- package/dist/cjs/cloak.js +18 -0
- package/dist/cjs/compactNote.d.ts +21 -0
- package/dist/cjs/compactNote.js +31 -7
- package/dist/cjs/events/index.d.ts +6 -0
- package/dist/cjs/events/index.js +22 -0
- package/dist/cjs/events/parsing.d.ts +25 -0
- package/dist/cjs/events/parsing.js +158 -0
- package/dist/cjs/events/position.d.ts +26 -0
- package/dist/cjs/events/position.js +53 -0
- package/dist/cjs/events/recovery.d.ts +87 -0
- package/dist/cjs/events/recovery.js +281 -0
- package/dist/cjs/events/scanning.d.ts +35 -0
- package/dist/cjs/events/scanning.js +98 -0
- package/dist/cjs/events/tree.d.ts +27 -0
- package/dist/cjs/events/tree.js +63 -0
- package/dist/cjs/events/types.d.ts +39 -0
- package/dist/cjs/events.d.ts +1 -77
- package/dist/cjs/events.js +6 -154
- package/dist/cjs/identity/encoding.d.ts +9 -0
- package/dist/cjs/identity/encoding.js +85 -0
- package/dist/cjs/identity/index.d.ts +4 -0
- package/dist/cjs/identity/index.js +20 -0
- package/dist/cjs/identity/noteKey.d.ts +33 -0
- package/dist/cjs/identity/noteKey.js +97 -0
- package/dist/cjs/identity/spending.d.ts +18 -0
- package/dist/cjs/identity/spending.js +46 -0
- package/dist/cjs/identity/viewKey.d.ts +38 -0
- package/dist/cjs/identity/viewKey.js +105 -0
- package/dist/cjs/idl/index.d.ts +18 -0
- package/dist/cjs/idl/index.js +24 -0
- package/dist/cjs/idl/privacy_pool.json +9907 -9907
- package/dist/cjs/idl/privacy_pool_legacy.js +3307 -0
- package/dist/cjs/idl/privacy_pool_legacy.json +2302 -0
- package/dist/cjs/idl/privacy_pool_legacy2.d.ts +5 -0
- package/dist/cjs/idl/privacy_pool_legacy2.js +3397 -0
- package/dist/cjs/idl/privacy_pool_legacy2.json +2376 -0
- package/dist/cjs/index.d.ts +9 -3
- package/dist/cjs/index.js +15 -2
- package/dist/cjs/notes/amount.d.ts +2 -0
- package/dist/cjs/notes/amount.js +21 -0
- package/dist/cjs/notes/encryption.d.ts +41 -0
- package/dist/cjs/notes/encryption.js +75 -0
- package/dist/cjs/notes/index.d.ts +8 -0
- package/dist/cjs/notes/index.js +24 -0
- package/dist/cjs/notes/mailbox.d.ts +70 -0
- package/dist/cjs/notes/mailbox.js +164 -0
- package/dist/cjs/notes/model.d.ts +91 -0
- package/dist/cjs/notes/model.js +109 -0
- package/dist/cjs/notes/nullifier.d.ts +27 -0
- package/dist/cjs/notes/nullifier.js +45 -0
- package/dist/cjs/notes/recovery.d.ts +20 -0
- package/dist/cjs/notes/recovery.js +48 -0
- package/dist/cjs/notes/selection.d.ts +77 -0
- package/dist/cjs/notes/selection.js +193 -0
- package/dist/cjs/notes/spent.d.ts +60 -0
- package/dist/cjs/notes/spent.js +101 -0
- package/dist/cjs/perps/constants.d.ts +16 -0
- package/dist/cjs/perps/constants.js +52 -0
- package/dist/cjs/perps/index.d.ts +5 -0
- package/dist/cjs/perps/index.js +21 -0
- package/dist/cjs/perps/keys.d.ts +16 -0
- package/dist/cjs/perps/keys.js +43 -0
- package/dist/cjs/perps/pdas.d.ts +29 -0
- package/dist/cjs/perps/pdas.js +55 -0
- package/dist/cjs/perps/relayer.d.ts +9 -0
- package/dist/cjs/perps/relayer.js +35 -0
- package/dist/cjs/perps/types.d.ts +126 -0
- package/dist/cjs/perps/types.js +2 -0
- package/dist/cjs/positions/index.d.ts +4 -0
- package/dist/cjs/positions/index.js +20 -0
- package/dist/cjs/positions/keys.d.ts +29 -0
- package/dist/cjs/positions/keys.js +71 -0
- package/dist/cjs/positions/pdas.d.ts +15 -0
- package/dist/cjs/positions/pdas.js +54 -0
- package/dist/cjs/positions/relayer.d.ts +4 -0
- package/dist/cjs/positions/relayer.js +15 -0
- package/dist/cjs/positions/types.d.ts +97 -0
- package/dist/cjs/positions/types.js +2 -0
- package/dist/cjs/predictions/client.d.ts +41 -0
- package/dist/cjs/predictions/client.js +147 -0
- package/dist/cjs/predictions/index.d.ts +5 -0
- package/dist/cjs/predictions/index.js +21 -0
- package/dist/cjs/predictions/keys.d.ts +14 -0
- package/dist/cjs/predictions/keys.js +40 -0
- package/dist/cjs/predictions/pdas.d.ts +6 -0
- package/dist/cjs/predictions/pdas.js +13 -0
- package/dist/cjs/predictions/relayer.d.ts +3 -0
- package/dist/cjs/predictions/relayer.js +11 -0
- package/dist/cjs/predictions/types.d.ts +178 -0
- package/dist/cjs/predictions/types.js +2 -0
- package/dist/cjs/program.d.ts +2 -0
- package/dist/cjs/program.js +8 -7
- package/dist/cjs/proof.d.ts +1 -183
- package/dist/cjs/proof.js +16 -290
- package/dist/cjs/proofs/encoding.d.ts +17 -0
- package/dist/cjs/proofs/encoding.js +72 -0
- package/dist/cjs/proofs/formatting.d.ts +6 -0
- package/dist/cjs/proofs/formatting.js +34 -0
- package/dist/cjs/proofs/index.d.ts +5 -0
- package/dist/cjs/proofs/index.js +21 -0
- package/dist/cjs/proofs/swap.d.ts +87 -0
- package/dist/cjs/proofs/swap.js +144 -0
- package/dist/cjs/proofs/transaction.d.ts +28 -0
- package/dist/cjs/proofs/transaction.js +110 -0
- package/dist/cjs/proofs/types.d.ts +70 -0
- package/dist/cjs/proofs/types.js +2 -0
- package/dist/cjs/prover.d.ts +30 -4
- package/dist/cjs/prover.js +118 -49
- package/dist/cjs/relayer/api.d.ts +31 -0
- package/dist/cjs/relayer/api.js +86 -0
- package/dist/cjs/relayer/client.d.ts +73 -0
- package/dist/cjs/relayer/client.js +206 -0
- package/dist/cjs/relayer/crypto.d.ts +5 -0
- package/dist/cjs/relayer/crypto.js +26 -0
- package/dist/cjs/relayer/encoding.d.ts +2 -0
- package/dist/cjs/relayer/encoding.js +23 -0
- package/dist/cjs/relayer/errors.d.ts +7 -0
- package/dist/cjs/relayer/errors.js +17 -0
- package/dist/cjs/relayer/index.d.ts +6 -0
- package/dist/cjs/relayer/index.js +19 -0
- package/dist/cjs/relayer/internal-config.d.ts +36 -0
- package/dist/cjs/relayer/internal-config.js +9 -0
- package/dist/cjs/relayer/internal.d.ts +6 -0
- package/dist/cjs/relayer/internal.js +14 -0
- package/dist/cjs/relayer/transport.d.ts +19 -0
- package/dist/cjs/relayer/transport.js +68 -0
- package/dist/{src/relayer.d.ts → cjs/relayer/types.d.ts} +53 -96
- package/dist/cjs/relayer/types.js +5 -0
- package/dist/cjs/relayer.d.ts +1 -318
- package/dist/cjs/relayer.js +15 -254
- package/dist/cjs/shield/alt.js +8 -8
- package/dist/cjs/shield/errors.js +2 -2
- package/dist/cjs/shield/finalize.js +2 -2
- package/dist/cjs/shield/ix.d.ts +1 -1
- package/dist/cjs/shield/owner.js +9 -11
- package/dist/cjs/shield/ports.js +3 -3
- package/dist/cjs/shield/preflight.js +3 -3
- package/dist/cjs/shield/shield.js +20 -19
- package/dist/cjs/shield/types.d.ts +1 -1
- package/dist/cjs/transactions/deposit.d.ts +94 -0
- package/dist/cjs/transactions/deposit.js +234 -0
- package/dist/cjs/transactions/index.d.ts +7 -0
- package/dist/cjs/transactions/index.js +26 -0
- package/dist/cjs/transactions/swap.d.ts +71 -0
- package/dist/cjs/transactions/swap.js +184 -0
- package/dist/cjs/transactions/transact.d.ts +34 -0
- package/dist/cjs/transactions/transact.js +146 -0
- package/dist/cjs/transactions/transfer.d.ts +51 -0
- package/dist/cjs/transactions/transfer.js +106 -0
- package/dist/cjs/transactions/withdraw.d.ts +52 -0
- package/dist/cjs/transactions/withdraw.js +104 -0
- package/dist/cjs/utxo.d.ts +1 -235
- package/dist/cjs/utxo.js +15 -404
- package/dist/esm/accounts/admin.d.ts +84 -0
- package/dist/esm/accounts/admin.js +165 -0
- package/dist/esm/accounts/errors.d.ts +6 -0
- package/dist/esm/accounts/errors.js +95 -0
- package/dist/esm/accounts/index.d.ts +4 -0
- package/dist/esm/accounts/index.js +4 -0
- package/dist/esm/accounts/pdas.d.ts +23 -0
- package/dist/esm/accounts/pdas.js +38 -0
- package/dist/esm/accounts/queries.d.ts +41 -0
- package/dist/esm/accounts/queries.js +88 -0
- package/dist/esm/client.d.ts +2 -407
- package/dist/esm/client.js +3 -891
- package/dist/esm/cloak/client.d.ts +28 -0
- package/dist/esm/cloak/client.js +64 -0
- package/dist/esm/cloak/errors.d.ts +13 -0
- package/dist/esm/cloak/errors.js +21 -0
- package/dist/esm/cloak/helpers.d.ts +6 -0
- package/dist/esm/cloak/helpers.js +31 -0
- package/dist/esm/cloak/index.d.ts +6 -0
- package/dist/esm/cloak/index.js +6 -0
- package/dist/esm/cloak/polling.d.ts +7 -0
- package/dist/esm/cloak/polling.js +63 -0
- package/dist/esm/cloak/transport.d.ts +15 -0
- package/dist/esm/cloak/transport.js +115 -0
- package/dist/esm/cloak/types.d.ts +188 -0
- package/dist/esm/cloak/types.js +4 -0
- package/dist/esm/cloak.d.ts +1 -0
- package/dist/esm/cloak.js +2 -0
- package/dist/esm/compactNote.d.ts +21 -0
- package/dist/esm/compactNote.js +24 -1
- package/dist/esm/events/index.d.ts +6 -0
- package/dist/esm/events/index.js +6 -0
- package/dist/esm/events/parsing.d.ts +25 -0
- package/dist/esm/events/parsing.js +120 -0
- package/dist/esm/events/position.d.ts +26 -0
- package/dist/esm/events/position.js +48 -0
- package/dist/esm/events/recovery.d.ts +87 -0
- package/dist/esm/events/recovery.js +237 -0
- package/dist/esm/events/scanning.d.ts +35 -0
- package/dist/esm/events/scanning.js +92 -0
- package/dist/esm/events/tree.d.ts +27 -0
- package/dist/esm/events/tree.js +58 -0
- package/dist/esm/events/types.d.ts +39 -0
- package/dist/esm/events/types.js +1 -0
- package/dist/esm/events.d.ts +1 -77
- package/dist/esm/events.js +3 -129
- package/dist/esm/identity/encoding.d.ts +9 -0
- package/dist/esm/identity/encoding.js +75 -0
- package/dist/esm/identity/index.d.ts +4 -0
- package/dist/esm/identity/index.js +4 -0
- package/dist/esm/identity/noteKey.d.ts +33 -0
- package/dist/esm/identity/noteKey.js +91 -0
- package/dist/esm/identity/spending.d.ts +18 -0
- package/dist/esm/identity/spending.js +35 -0
- package/dist/esm/identity/viewKey.d.ts +38 -0
- package/dist/esm/identity/viewKey.js +96 -0
- package/dist/esm/idl/index.d.ts +18 -0
- package/dist/esm/idl/index.js +18 -0
- package/dist/esm/idl/privacy_pool.json +9907 -9907
- package/dist/esm/idl/privacy_pool_legacy.d.ts +5 -0
- package/dist/esm/idl/privacy_pool_legacy.js +3305 -0
- package/dist/esm/idl/privacy_pool_legacy.json +2302 -0
- package/dist/esm/idl/privacy_pool_legacy2.d.ts +5 -0
- package/dist/esm/idl/privacy_pool_legacy2.js +3395 -0
- package/dist/esm/idl/privacy_pool_legacy2.json +2376 -0
- package/dist/esm/index.d.ts +9 -3
- package/dist/esm/index.js +10 -3
- package/dist/esm/notes/amount.d.ts +2 -0
- package/dist/esm/notes/amount.js +18 -0
- package/dist/esm/notes/encryption.d.ts +41 -0
- package/dist/esm/notes/encryption.js +67 -0
- package/dist/esm/notes/index.d.ts +8 -0
- package/dist/esm/notes/index.js +8 -0
- package/dist/esm/notes/mailbox.d.ts +70 -0
- package/dist/esm/notes/mailbox.js +154 -0
- package/dist/esm/notes/model.d.ts +91 -0
- package/dist/esm/notes/model.js +99 -0
- package/dist/esm/notes/nullifier.d.ts +27 -0
- package/dist/esm/notes/nullifier.js +40 -0
- package/dist/esm/notes/recovery.d.ts +20 -0
- package/dist/esm/notes/recovery.js +45 -0
- package/dist/esm/notes/selection.d.ts +77 -0
- package/dist/esm/notes/selection.js +188 -0
- package/dist/esm/notes/spent.d.ts +60 -0
- package/dist/esm/notes/spent.js +96 -0
- package/dist/esm/perps/constants.d.ts +16 -0
- package/dist/esm/perps/constants.js +48 -0
- package/dist/esm/perps/index.d.ts +5 -0
- package/dist/esm/perps/index.js +5 -0
- package/dist/esm/perps/keys.d.ts +16 -0
- package/dist/esm/perps/keys.js +35 -0
- package/dist/esm/perps/pdas.d.ts +29 -0
- package/dist/esm/perps/pdas.js +47 -0
- package/dist/esm/perps/relayer.d.ts +9 -0
- package/dist/esm/perps/relayer.js +25 -0
- package/dist/esm/perps/types.d.ts +126 -0
- package/dist/esm/perps/types.js +1 -0
- package/dist/esm/positions/index.d.ts +4 -0
- package/dist/esm/positions/index.js +4 -0
- package/dist/esm/positions/keys.d.ts +29 -0
- package/dist/esm/positions/keys.js +65 -0
- package/dist/esm/positions/pdas.d.ts +15 -0
- package/dist/esm/positions/pdas.js +44 -0
- package/dist/esm/positions/relayer.d.ts +4 -0
- package/dist/esm/positions/relayer.js +10 -0
- package/dist/esm/positions/types.d.ts +97 -0
- package/dist/esm/positions/types.js +1 -0
- package/dist/esm/predictions/client.d.ts +41 -0
- package/dist/esm/predictions/client.js +141 -0
- package/dist/esm/predictions/index.d.ts +5 -0
- package/dist/esm/predictions/index.js +5 -0
- package/dist/esm/predictions/keys.d.ts +14 -0
- package/dist/esm/predictions/keys.js +33 -0
- package/dist/esm/predictions/pdas.d.ts +6 -0
- package/dist/esm/predictions/pdas.js +10 -0
- package/dist/esm/predictions/relayer.d.ts +3 -0
- package/dist/esm/predictions/relayer.js +7 -0
- package/dist/esm/predictions/types.d.ts +178 -0
- package/dist/esm/predictions/types.js +1 -0
- package/dist/esm/program.d.ts +2 -0
- package/dist/esm/program.js +4 -3
- package/dist/esm/proof.d.ts +1 -183
- package/dist/esm/proof.js +2 -281
- package/dist/esm/proofs/encoding.d.ts +17 -0
- package/dist/esm/proofs/encoding.js +68 -0
- package/dist/esm/proofs/formatting.d.ts +6 -0
- package/dist/esm/proofs/formatting.js +31 -0
- package/dist/esm/proofs/index.d.ts +5 -0
- package/dist/esm/proofs/index.js +5 -0
- package/dist/esm/proofs/swap.d.ts +87 -0
- package/dist/esm/proofs/swap.js +138 -0
- package/dist/esm/proofs/transaction.d.ts +28 -0
- package/dist/esm/proofs/transaction.js +105 -0
- package/dist/esm/proofs/types.d.ts +70 -0
- package/dist/esm/proofs/types.js +1 -0
- package/dist/esm/prover.d.ts +30 -4
- package/dist/esm/prover.js +115 -15
- package/dist/esm/relayer/api.d.ts +31 -0
- package/dist/esm/relayer/api.js +55 -0
- package/dist/esm/relayer/client.d.ts +73 -0
- package/dist/esm/relayer/client.js +199 -0
- package/dist/esm/relayer/crypto.d.ts +5 -0
- package/dist/esm/relayer/crypto.js +20 -0
- package/dist/esm/relayer/encoding.d.ts +2 -0
- package/dist/esm/relayer/encoding.js +19 -0
- package/dist/esm/relayer/errors.d.ts +7 -0
- package/dist/esm/relayer/errors.js +13 -0
- package/dist/esm/relayer/index.d.ts +6 -0
- package/dist/esm/relayer/index.js +3 -0
- package/dist/esm/relayer/internal-config.d.ts +36 -0
- package/dist/esm/relayer/internal-config.js +6 -0
- package/dist/esm/relayer/internal.d.ts +6 -0
- package/dist/esm/relayer/internal.js +10 -0
- package/dist/esm/relayer/transport.d.ts +19 -0
- package/dist/esm/relayer/transport.js +64 -0
- package/dist/esm/relayer/types.d.ts +275 -0
- package/dist/esm/relayer/types.js +4 -0
- package/dist/esm/relayer.d.ts +1 -318
- package/dist/esm/relayer.js +2 -249
- package/dist/esm/shield/alt.js +1 -1
- package/dist/esm/shield/errors.js +1 -1
- package/dist/esm/shield/finalize.js +1 -1
- package/dist/esm/shield/ix.d.ts +1 -1
- package/dist/esm/shield/owner.js +3 -5
- package/dist/esm/shield/ports.js +1 -1
- package/dist/esm/shield/preflight.js +1 -1
- package/dist/esm/shield/shield.js +4 -3
- package/dist/esm/shield/types.d.ts +1 -1
- package/dist/esm/transactions/deposit.d.ts +94 -0
- package/dist/esm/transactions/deposit.js +198 -0
- package/dist/esm/transactions/index.d.ts +7 -0
- package/dist/esm/transactions/index.js +7 -0
- package/dist/esm/transactions/swap.d.ts +71 -0
- package/dist/esm/transactions/swap.js +144 -0
- package/dist/esm/transactions/transact.d.ts +34 -0
- package/dist/esm/transactions/transact.js +110 -0
- package/dist/esm/transactions/transfer.d.ts +51 -0
- package/dist/esm/transactions/transfer.js +103 -0
- package/dist/esm/transactions/withdraw.d.ts +52 -0
- package/dist/esm/transactions/withdraw.js +101 -0
- package/dist/esm/utxo.d.ts +1 -235
- package/dist/esm/utxo.js +2 -382
- package/identity.d.ts +2 -0
- package/identity.js +3 -0
- package/idl.d.ts +2 -0
- package/idl.js +3 -0
- package/notes.d.ts +2 -0
- package/notes.js +3 -0
- package/package.json +131 -11
- package/perps.d.ts +2 -0
- package/perps.js +3 -0
- package/poseidon.d.ts +2 -2
- package/poseidon.js +2 -3
- package/positions.d.ts +2 -0
- package/positions.js +3 -0
- package/predictions.d.ts +2 -0
- package/predictions.js +3 -0
- package/proof.d.ts +2 -2
- package/proof.js +2 -3
- package/prover.d.ts +2 -2
- package/prover.js +2 -3
- package/relayer.d.ts +2 -0
- package/relayer.js +3 -0
- package/shield.d.ts +2 -2
- package/shield.js +2 -3
- package/transactions.d.ts +2 -0
- package/transactions.js +3 -0
- package/SHIELD_INTEGRATION.md +0 -143
- package/dist/src/client.d.ts +0 -407
- package/dist/src/client.js +0 -951
- package/dist/src/compactNote.d.ts +0 -107
- package/dist/src/compactNote.js +0 -167
- package/dist/src/config.d.ts +0 -82
- package/dist/src/config.js +0 -57
- package/dist/src/events.d.ts +0 -77
- package/dist/src/events.js +0 -167
- package/dist/src/idl/privacy_pool.js +0 -15218
- package/dist/src/index.d.ts +0 -16
- package/dist/src/index.js +0 -67
- package/dist/src/merkle.d.ts +0 -77
- package/dist/src/merkle.js +0 -156
- package/dist/src/poseidon.d.ts +0 -29
- package/dist/src/poseidon.js +0 -100
- package/dist/src/program.d.ts +0 -37
- package/dist/src/program.js +0 -61
- package/dist/src/proof.d.ts +0 -183
- package/dist/src/proof.js +0 -292
- package/dist/src/prover.d.ts +0 -54
- package/dist/src/prover.js +0 -112
- package/dist/src/random.d.ts +0 -16
- package/dist/src/random.js +0 -28
- package/dist/src/relayer.js +0 -257
- package/dist/src/retry.d.ts +0 -32
- package/dist/src/retry.js +0 -75
- package/dist/src/shield/alt.d.ts +0 -87
- package/dist/src/shield/alt.js +0 -194
- package/dist/src/shield/computeBudget.d.ts +0 -61
- package/dist/src/shield/computeBudget.js +0 -64
- package/dist/src/shield/errors.d.ts +0 -58
- package/dist/src/shield/errors.js +0 -121
- package/dist/src/shield/finalize.d.ts +0 -45
- package/dist/src/shield/finalize.js +0 -119
- package/dist/src/shield/index.d.ts +0 -35
- package/dist/src/shield/index.js +0 -68
- package/dist/src/shield/ix.d.ts +0 -54
- package/dist/src/shield/ix.js +0 -119
- package/dist/src/shield/owner.d.ts +0 -36
- package/dist/src/shield/owner.js +0 -126
- package/dist/src/shield/ports.d.ts +0 -43
- package/dist/src/shield/ports.js +0 -153
- package/dist/src/shield/preflight.d.ts +0 -30
- package/dist/src/shield/preflight.js +0 -154
- package/dist/src/shield/shield.d.ts +0 -68
- package/dist/src/shield/shield.js +0 -499
- package/dist/src/shield/types.d.ts +0 -202
- package/dist/src/utxo.d.ts +0 -235
- package/dist/src/utxo.js +0 -407
- package/dist/tests/compact-note.test.d.ts +0 -1
- package/dist/tests/compact-note.test.js +0 -173
- package/dist/tests/config.test.d.ts +0 -1
- package/dist/tests/config.test.js +0 -102
- package/dist/tests/edge-cases.test.d.ts +0 -1
- package/dist/tests/edge-cases.test.js +0 -220
- package/dist/tests/encryption.test.d.ts +0 -1
- package/dist/tests/encryption.test.js +0 -215
- package/dist/tests/events.test.d.ts +0 -1
- package/dist/tests/events.test.js +0 -78
- package/dist/tests/multi-tree.test.d.ts +0 -1
- package/dist/tests/multi-tree.test.js +0 -405
- package/dist/tests/pda.test.d.ts +0 -1
- package/dist/tests/pda.test.js +0 -229
- package/dist/tests/poseidon-builder-parity.test.d.ts +0 -1
- package/dist/tests/poseidon-builder-parity.test.js +0 -72
- package/dist/tests/poseidon.test.d.ts +0 -1
- package/dist/tests/poseidon.test.js +0 -142
- package/dist/tests/proof.test.d.ts +0 -1
- package/dist/tests/proof.test.js +0 -296
- package/dist/tests/relayer.test.d.ts +0 -1
- package/dist/tests/relayer.test.js +0 -271
- package/dist/tests/sdk.integration.test.d.ts +0 -1
- package/dist/tests/sdk.integration.test.js +0 -330
- package/dist/tests/shield-owner.test.d.ts +0 -1
- package/dist/tests/shield-owner.test.js +0 -89
- package/dist/tests/shield-preflight.test.d.ts +0 -1
- package/dist/tests/shield-preflight.test.js +0 -87
- package/dist/tests/shield-realproof.test.d.ts +0 -1
- package/dist/tests/shield-realproof.test.js +0 -272
- package/dist/tests/shield.test.d.ts +0 -1
- package/dist/tests/shield.test.js +0 -403
- package/dist/tests/utxo.test.d.ts +0 -1
- package/dist/tests/utxo.test.js +0 -140
- /package/dist/{src/shield → cjs/events}/types.js +0 -0
- /package/dist/{src/idl/privacy_pool.d.ts → cjs/idl/privacy_pool_legacy.d.ts} +0 -0
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { Idl, Program } from "@coral-xyz/anchor";
|
|
2
|
+
import type { PublicKey } from "@solana/web3.js";
|
|
3
|
+
import { MerkleTree } from "../merkle.js";
|
|
4
|
+
import type { CommitmentEvent } from "./types.js";
|
|
5
|
+
/** Rebuild a local Veilo tree from emitted, computed, and protected history. */
|
|
6
|
+
export declare function buildTreeFromEvents<T extends Idl>(params: {
|
|
7
|
+
program: Program<T>;
|
|
8
|
+
mintAddress: PublicKey;
|
|
9
|
+
treeId?: number;
|
|
10
|
+
depth?: number;
|
|
11
|
+
/** Eventless commitments recovered with the helpers in `events/recovery`. */
|
|
12
|
+
additionalEvents?: readonly CommitmentEvent[];
|
|
13
|
+
/** Includes the relayer's two protected historical repairs. Defaults to true. */
|
|
14
|
+
includeProtectedEvents?: boolean;
|
|
15
|
+
/** Reject missing or duplicate leaf indices instead of building a wrong root. */
|
|
16
|
+
strictLeafIndices?: boolean;
|
|
17
|
+
}): Promise<{
|
|
18
|
+
tree: MerkleTree;
|
|
19
|
+
events: CommitmentEvent[];
|
|
20
|
+
latestSignature?: string;
|
|
21
|
+
}>;
|
|
22
|
+
export declare function dedupeCommitmentEvents(events: readonly CommitmentEvent[]): CommitmentEvent[];
|
|
23
|
+
/** Build a Merkle tree from already-collected events in authoritative order. */
|
|
24
|
+
export declare function reconstructTreeFromCommitmentEvents(events: readonly CommitmentEvent[], options?: {
|
|
25
|
+
depth?: number;
|
|
26
|
+
strictLeafIndices?: boolean;
|
|
27
|
+
}): MerkleTree;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { MerkleTree } from "../merkle.js";
|
|
2
|
+
import { mergeProtectedCommitmentEvents } from "./recovery.js";
|
|
3
|
+
import { scanAllCommitmentEvents } from "./scanning.js";
|
|
4
|
+
/** Rebuild a local Veilo tree from emitted, computed, and protected history. */
|
|
5
|
+
export async function buildTreeFromEvents(params) {
|
|
6
|
+
const { program, mintAddress, treeId = 0, depth = 22, additionalEvents = [], includeProtectedEvents = true, strictLeafIndices = true, } = params;
|
|
7
|
+
const emitted = await scanAllCommitmentEvents({ program, mintAddress });
|
|
8
|
+
let treeEvents = dedupeCommitmentEvents([...emitted, ...additionalEvents])
|
|
9
|
+
.filter((event) => event.treeId === treeId && event.mintAddress.equals(mintAddress))
|
|
10
|
+
.sort((a, b) => a.leafIndex - b.leafIndex);
|
|
11
|
+
if (includeProtectedEvents) {
|
|
12
|
+
treeEvents = mergeProtectedCommitmentEvents(treeEvents, {
|
|
13
|
+
mintAddress,
|
|
14
|
+
treeId,
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
const tree = reconstructTreeFromCommitmentEvents(treeEvents, {
|
|
18
|
+
depth,
|
|
19
|
+
strictLeafIndices,
|
|
20
|
+
});
|
|
21
|
+
return {
|
|
22
|
+
tree,
|
|
23
|
+
events: treeEvents,
|
|
24
|
+
latestSignature: treeEvents[treeEvents.length - 1]?.txSignature,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
export function dedupeCommitmentEvents(events) {
|
|
28
|
+
const byCommitment = new Map();
|
|
29
|
+
for (const event of events) {
|
|
30
|
+
const key = Array.from(event.commitment, (value) => value.toString(16).padStart(2, "0")).join("");
|
|
31
|
+
const existing = byCommitment.get(key);
|
|
32
|
+
if (!existing || eventPriority(event) > eventPriority(existing)) {
|
|
33
|
+
byCommitment.set(key, event);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return [...byCommitment.values()];
|
|
37
|
+
}
|
|
38
|
+
function eventPriority(event) {
|
|
39
|
+
// Events created before `source` was added came from on-chain log scans and
|
|
40
|
+
// are therefore treated as authoritative emitted records.
|
|
41
|
+
if (event.source === "protected")
|
|
42
|
+
return 1;
|
|
43
|
+
if (event.source === "computed")
|
|
44
|
+
return 2;
|
|
45
|
+
return 3;
|
|
46
|
+
}
|
|
47
|
+
/** Build a Merkle tree from already-collected events in authoritative order. */
|
|
48
|
+
export function reconstructTreeFromCommitmentEvents(events, options = {}) {
|
|
49
|
+
const tree = new MerkleTree(options.depth ?? 22);
|
|
50
|
+
for (const event of [...events].sort((a, b) => a.leafIndex - b.leafIndex)) {
|
|
51
|
+
if ((options.strictLeafIndices ?? true) &&
|
|
52
|
+
event.leafIndex !== tree.nextIndex) {
|
|
53
|
+
throw new Error(`Commitment history gap: expected leaf ${tree.nextIndex}, got ${event.leafIndex}`);
|
|
54
|
+
}
|
|
55
|
+
tree.insert(event.commitment);
|
|
56
|
+
}
|
|
57
|
+
return tree;
|
|
58
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { PublicKey } from "@solana/web3.js";
|
|
2
|
+
import type { PrivacyPoolIdlVersion } from "../idl/index.js";
|
|
3
|
+
export type CommitmentEventSource = "emitted" | "computed" | "protected";
|
|
4
|
+
/**
|
|
5
|
+
* A commitment appended to a Veilo Merkle tree.
|
|
6
|
+
*
|
|
7
|
+
* Compact recovery fields are optional because they were added across two
|
|
8
|
+
* program upgrades. Historical events remain valid without them.
|
|
9
|
+
*/
|
|
10
|
+
export type CommitmentEvent = {
|
|
11
|
+
commitment: Uint8Array;
|
|
12
|
+
leafIndex: number;
|
|
13
|
+
newRoot: Uint8Array;
|
|
14
|
+
timestamp: number;
|
|
15
|
+
mintAddress: PublicKey;
|
|
16
|
+
treeId: number;
|
|
17
|
+
txSignature: string;
|
|
18
|
+
slot: number;
|
|
19
|
+
ephemeralPublicKey?: Uint8Array;
|
|
20
|
+
encryptedBlob?: Uint8Array;
|
|
21
|
+
viewTag?: number;
|
|
22
|
+
source?: CommitmentEventSource;
|
|
23
|
+
idlVersion?: PrivacyPoolIdlVersion;
|
|
24
|
+
};
|
|
25
|
+
/** On-chain event emitted when a private note is consumed. */
|
|
26
|
+
export type NullifierSpentEvent = {
|
|
27
|
+
nullifier: Uint8Array;
|
|
28
|
+
timestamp: number;
|
|
29
|
+
mintAddress: PublicKey;
|
|
30
|
+
treeId: number;
|
|
31
|
+
txSignature: string;
|
|
32
|
+
slot: number;
|
|
33
|
+
idlVersion?: PrivacyPoolIdlVersion;
|
|
34
|
+
};
|
|
35
|
+
export type ParsedVeiloEvent = {
|
|
36
|
+
name: string;
|
|
37
|
+
data: unknown;
|
|
38
|
+
idlVersion: PrivacyPoolIdlVersion;
|
|
39
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/dist/esm/events.d.ts
CHANGED
|
@@ -1,77 +1 @@
|
|
|
1
|
-
|
|
2
|
-
import { Program, Idl } from "@coral-xyz/anchor";
|
|
3
|
-
import { MerkleTree } from "./merkle.js";
|
|
4
|
-
/**
|
|
5
|
-
* On-chain CommitmentEvent emitted by `transact` and `transact_swap`.
|
|
6
|
-
* Mirrors the IDL CommitmentEvent struct.
|
|
7
|
-
*/
|
|
8
|
-
export type CommitmentEvent = {
|
|
9
|
-
commitment: Uint8Array;
|
|
10
|
-
leafIndex: number;
|
|
11
|
-
newRoot: Uint8Array;
|
|
12
|
-
timestamp: number;
|
|
13
|
-
mintAddress: PublicKey;
|
|
14
|
-
treeId: number;
|
|
15
|
-
txSignature: string;
|
|
16
|
-
slot: number;
|
|
17
|
-
};
|
|
18
|
-
/**
|
|
19
|
-
* On-chain NullifierSpent event emitted when a UTXO is consumed.
|
|
20
|
-
* Mirrors the IDL NullifierSpent struct.
|
|
21
|
-
*/
|
|
22
|
-
export type NullifierSpentEvent = {
|
|
23
|
-
nullifier: Uint8Array;
|
|
24
|
-
timestamp: number;
|
|
25
|
-
mintAddress: PublicKey;
|
|
26
|
-
treeId: number;
|
|
27
|
-
txSignature: string;
|
|
28
|
-
slot: number;
|
|
29
|
-
};
|
|
30
|
-
/**
|
|
31
|
-
* Fetch and parse CommitmentEvents for a program, optionally filtered by mint.
|
|
32
|
-
*
|
|
33
|
-
* @param program - Anchor program instance
|
|
34
|
-
* @param mintAddress - Filter to a specific pool; omit to get all pools
|
|
35
|
-
* @param before - Start paging before this signature (exclusive)
|
|
36
|
-
* @param until - Stop paging at this signature (exclusive)
|
|
37
|
-
* @param limit - Max signatures to fetch per page (default 1000)
|
|
38
|
-
*/
|
|
39
|
-
export declare function scanCommitmentEvents<T extends Idl>(params: {
|
|
40
|
-
program: Program<T>;
|
|
41
|
-
mintAddress?: PublicKey;
|
|
42
|
-
before?: string;
|
|
43
|
-
until?: string;
|
|
44
|
-
limit?: number;
|
|
45
|
-
}): Promise<CommitmentEvent[]>;
|
|
46
|
-
/**
|
|
47
|
-
* Fetch and parse NullifierSpent events for a program, optionally filtered by mint.
|
|
48
|
-
*/
|
|
49
|
-
export declare function scanNullifierEvents<T extends Idl>(params: {
|
|
50
|
-
program: Program<T>;
|
|
51
|
-
mintAddress?: PublicKey;
|
|
52
|
-
before?: string;
|
|
53
|
-
until?: string;
|
|
54
|
-
limit?: number;
|
|
55
|
-
}): Promise<NullifierSpentEvent[]>;
|
|
56
|
-
/**
|
|
57
|
-
* Rebuild a local MerkleTree from on-chain CommitmentEvents.
|
|
58
|
-
* Use this to get a valid inclusion proof for spending any UTXO.
|
|
59
|
-
*
|
|
60
|
-
* CommitmentEvents are sorted by (treeId, leafIndex) so the local tree
|
|
61
|
-
* matches the on-chain state exactly.
|
|
62
|
-
*
|
|
63
|
-
* @param program - Anchor program instance
|
|
64
|
-
* @param mintAddress - Pool to reconstruct
|
|
65
|
-
* @param treeId - Which tree to reconstruct (default 0)
|
|
66
|
-
* @param depth - Merkle tree depth (default 22, must match on-chain)
|
|
67
|
-
*/
|
|
68
|
-
export declare function buildTreeFromEvents<T extends Idl>(params: {
|
|
69
|
-
program: Program<T>;
|
|
70
|
-
mintAddress: PublicKey;
|
|
71
|
-
treeId?: number;
|
|
72
|
-
depth?: number;
|
|
73
|
-
}): Promise<{
|
|
74
|
-
tree: MerkleTree;
|
|
75
|
-
events: CommitmentEvent[];
|
|
76
|
-
latestSignature?: string;
|
|
77
|
-
}>;
|
|
1
|
+
export * from "./events/index.js";
|
package/dist/esm/events.js
CHANGED
|
@@ -1,129 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
// Event Scanning
|
|
5
|
-
// -----------------------------------------------------------------------------
|
|
6
|
-
/**
|
|
7
|
-
* Fetch and parse CommitmentEvents for a program, optionally filtered by mint.
|
|
8
|
-
*
|
|
9
|
-
* @param program - Anchor program instance
|
|
10
|
-
* @param mintAddress - Filter to a specific pool; omit to get all pools
|
|
11
|
-
* @param before - Start paging before this signature (exclusive)
|
|
12
|
-
* @param until - Stop paging at this signature (exclusive)
|
|
13
|
-
* @param limit - Max signatures to fetch per page (default 1000)
|
|
14
|
-
*/
|
|
15
|
-
export async function scanCommitmentEvents(params) {
|
|
16
|
-
const { program, mintAddress, before, until, limit = 1000 } = params;
|
|
17
|
-
const out = [];
|
|
18
|
-
const eventParser = new anchor.EventParser(program.programId, new anchor.BorshCoder(program.idl));
|
|
19
|
-
const sigs = await program.provider.connection.getSignaturesForAddress(program.programId, { before, until, limit });
|
|
20
|
-
for (const sigInfo of sigs) {
|
|
21
|
-
if (sigInfo.err)
|
|
22
|
-
continue;
|
|
23
|
-
const tx = await program.provider.connection.getTransaction(sigInfo.signature, { commitment: "confirmed", maxSupportedTransactionVersion: 0 });
|
|
24
|
-
if (!tx)
|
|
25
|
-
continue;
|
|
26
|
-
const events = Array.from(eventParser.parseLogs(tx.meta?.logMessages ?? []));
|
|
27
|
-
for (const ev of events) {
|
|
28
|
-
if (ev.name !== "commitmentEvent")
|
|
29
|
-
continue;
|
|
30
|
-
const d = ev.data;
|
|
31
|
-
const evMint = d.mintAddress;
|
|
32
|
-
if (mintAddress && !evMint.equals(mintAddress))
|
|
33
|
-
continue;
|
|
34
|
-
out.push({
|
|
35
|
-
commitment: new Uint8Array(d.commitment),
|
|
36
|
-
leafIndex: Number(d.leafIndex),
|
|
37
|
-
newRoot: new Uint8Array(d.newRoot),
|
|
38
|
-
timestamp: Number(d.timestamp),
|
|
39
|
-
mintAddress: evMint,
|
|
40
|
-
treeId: Number(d.treeId),
|
|
41
|
-
txSignature: sigInfo.signature,
|
|
42
|
-
slot: sigInfo.slot,
|
|
43
|
-
});
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
return out;
|
|
47
|
-
}
|
|
48
|
-
/**
|
|
49
|
-
* Fetch and parse NullifierSpent events for a program, optionally filtered by mint.
|
|
50
|
-
*/
|
|
51
|
-
export async function scanNullifierEvents(params) {
|
|
52
|
-
const { program, mintAddress, before, until, limit = 1000 } = params;
|
|
53
|
-
const out = [];
|
|
54
|
-
const eventParser = new anchor.EventParser(program.programId, new anchor.BorshCoder(program.idl));
|
|
55
|
-
const sigs = await program.provider.connection.getSignaturesForAddress(program.programId, { before, until, limit });
|
|
56
|
-
for (const sigInfo of sigs) {
|
|
57
|
-
if (sigInfo.err)
|
|
58
|
-
continue;
|
|
59
|
-
const tx = await program.provider.connection.getTransaction(sigInfo.signature, { commitment: "confirmed", maxSupportedTransactionVersion: 0 });
|
|
60
|
-
if (!tx)
|
|
61
|
-
continue;
|
|
62
|
-
const events = Array.from(eventParser.parseLogs(tx.meta?.logMessages ?? []));
|
|
63
|
-
for (const ev of events) {
|
|
64
|
-
if (ev.name !== "nullifierSpent")
|
|
65
|
-
continue;
|
|
66
|
-
const d = ev.data;
|
|
67
|
-
const evMint = d.mintAddress;
|
|
68
|
-
if (mintAddress && !evMint.equals(mintAddress))
|
|
69
|
-
continue;
|
|
70
|
-
out.push({
|
|
71
|
-
nullifier: new Uint8Array(d.nullifier),
|
|
72
|
-
timestamp: Number(d.timestamp),
|
|
73
|
-
mintAddress: evMint,
|
|
74
|
-
treeId: Number(d.treeId),
|
|
75
|
-
txSignature: sigInfo.signature,
|
|
76
|
-
slot: sigInfo.slot,
|
|
77
|
-
});
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
return out;
|
|
81
|
-
}
|
|
82
|
-
// -----------------------------------------------------------------------------
|
|
83
|
-
// Tree Reconstruction
|
|
84
|
-
// -----------------------------------------------------------------------------
|
|
85
|
-
/**
|
|
86
|
-
* Rebuild a local MerkleTree from on-chain CommitmentEvents.
|
|
87
|
-
* Use this to get a valid inclusion proof for spending any UTXO.
|
|
88
|
-
*
|
|
89
|
-
* CommitmentEvents are sorted by (treeId, leafIndex) so the local tree
|
|
90
|
-
* matches the on-chain state exactly.
|
|
91
|
-
*
|
|
92
|
-
* @param program - Anchor program instance
|
|
93
|
-
* @param mintAddress - Pool to reconstruct
|
|
94
|
-
* @param treeId - Which tree to reconstruct (default 0)
|
|
95
|
-
* @param depth - Merkle tree depth (default 22, must match on-chain)
|
|
96
|
-
*/
|
|
97
|
-
export async function buildTreeFromEvents(params) {
|
|
98
|
-
const { program, mintAddress, treeId = 0, depth = 22 } = params;
|
|
99
|
-
// Fetch all commitment events for this pool (page until no more results).
|
|
100
|
-
// Oldest-first so we insert leaves in the correct order.
|
|
101
|
-
const allEvents = [];
|
|
102
|
-
let before;
|
|
103
|
-
while (true) {
|
|
104
|
-
const page = await scanCommitmentEvents({
|
|
105
|
-
program,
|
|
106
|
-
mintAddress,
|
|
107
|
-
before,
|
|
108
|
-
limit: 1000,
|
|
109
|
-
});
|
|
110
|
-
if (page.length === 0)
|
|
111
|
-
break;
|
|
112
|
-
allEvents.push(...page);
|
|
113
|
-
before = page[page.length - 1].txSignature;
|
|
114
|
-
if (page.length < 1000)
|
|
115
|
-
break;
|
|
116
|
-
}
|
|
117
|
-
// Keep only events for this treeId, sort by leafIndex ascending
|
|
118
|
-
const treeEvents = allEvents
|
|
119
|
-
.filter((e) => e.treeId === treeId)
|
|
120
|
-
.sort((a, b) => a.leafIndex - b.leafIndex);
|
|
121
|
-
const tree = new MerkleTree(depth);
|
|
122
|
-
for (const ev of treeEvents) {
|
|
123
|
-
tree.insert(ev.commitment);
|
|
124
|
-
}
|
|
125
|
-
const latestSignature = treeEvents.length > 0
|
|
126
|
-
? treeEvents[treeEvents.length - 1].txSignature
|
|
127
|
-
: undefined;
|
|
128
|
-
return { tree, events: treeEvents, latestSignature };
|
|
129
|
-
}
|
|
1
|
+
// Backward-compatible entry point. Event parsing, scanning, and recovery live
|
|
2
|
+
// in focused modules under src/events.
|
|
3
|
+
export * from "./events/index.js";
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare function concatBytes(...parts: readonly Uint8Array[]): Uint8Array;
|
|
2
|
+
export declare function utf8(value: string): Uint8Array;
|
|
3
|
+
export declare function uint32Le(value: number, label?: string): Uint8Array;
|
|
4
|
+
export declare function uint64Le(value: bigint, label?: string): Uint8Array;
|
|
5
|
+
export declare function assertBytes(value: Uint8Array, length: number, label: string): void;
|
|
6
|
+
export declare function bytesToHex(bytes: Uint8Array): string;
|
|
7
|
+
export declare function hexToBytes(value: string, length?: number, label?: string): Uint8Array;
|
|
8
|
+
/** Encode bytes using the Bitcoin/Solana base58 alphabet. */
|
|
9
|
+
export declare function encodeBase58(bytes: Uint8Array): string;
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
const BASE58_ALPHABET = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
|
|
2
|
+
export function concatBytes(...parts) {
|
|
3
|
+
const output = new Uint8Array(parts.reduce((length, part) => length + part.length, 0));
|
|
4
|
+
let offset = 0;
|
|
5
|
+
for (const part of parts) {
|
|
6
|
+
output.set(part, offset);
|
|
7
|
+
offset += part.length;
|
|
8
|
+
}
|
|
9
|
+
return output;
|
|
10
|
+
}
|
|
11
|
+
export function utf8(value) {
|
|
12
|
+
return new TextEncoder().encode(value);
|
|
13
|
+
}
|
|
14
|
+
export function uint32Le(value, label = "value") {
|
|
15
|
+
if (!Number.isSafeInteger(value) || value < 0 || value > 4294967295) {
|
|
16
|
+
throw new RangeError(`${label} must be an unsigned 32-bit integer`);
|
|
17
|
+
}
|
|
18
|
+
const bytes = new Uint8Array(4);
|
|
19
|
+
new DataView(bytes.buffer).setUint32(0, value, true);
|
|
20
|
+
return bytes;
|
|
21
|
+
}
|
|
22
|
+
export function uint64Le(value, label = "value") {
|
|
23
|
+
if (value < 0n || value > 0xffffffffffffffffn) {
|
|
24
|
+
throw new RangeError(`${label} must be an unsigned 64-bit integer`);
|
|
25
|
+
}
|
|
26
|
+
const bytes = new Uint8Array(8);
|
|
27
|
+
new DataView(bytes.buffer).setBigUint64(0, value, true);
|
|
28
|
+
return bytes;
|
|
29
|
+
}
|
|
30
|
+
export function assertBytes(value, length, label) {
|
|
31
|
+
if (value.length !== length) {
|
|
32
|
+
throw new RangeError(`${label} must be ${length} bytes, got ${value.length}`);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
export function bytesToHex(bytes) {
|
|
36
|
+
return Array.from(bytes, (value) => value.toString(16).padStart(2, "0")).join("");
|
|
37
|
+
}
|
|
38
|
+
export function hexToBytes(value, length, label = "hex value") {
|
|
39
|
+
const clean = value.startsWith("0x") ? value.slice(2) : value;
|
|
40
|
+
if (!/^[0-9a-f]*$/i.test(clean) || clean.length % 2 !== 0) {
|
|
41
|
+
throw new TypeError(`${label} must be an even-length hexadecimal string`);
|
|
42
|
+
}
|
|
43
|
+
const bytes = Uint8Array.from({ length: clean.length / 2 }, (_, index) => Number.parseInt(clean.slice(index * 2, index * 2 + 2), 16));
|
|
44
|
+
if (length !== undefined)
|
|
45
|
+
assertBytes(bytes, length, label);
|
|
46
|
+
return bytes;
|
|
47
|
+
}
|
|
48
|
+
/** Encode bytes using the Bitcoin/Solana base58 alphabet. */
|
|
49
|
+
export function encodeBase58(bytes) {
|
|
50
|
+
if (bytes.length === 0)
|
|
51
|
+
return "";
|
|
52
|
+
let zeroes = 0;
|
|
53
|
+
while (zeroes < bytes.length && bytes[zeroes] === 0)
|
|
54
|
+
zeroes++;
|
|
55
|
+
if (zeroes === bytes.length)
|
|
56
|
+
return "1".repeat(zeroes);
|
|
57
|
+
const digits = [0];
|
|
58
|
+
for (let index = zeroes; index < bytes.length; index++) {
|
|
59
|
+
let carry = bytes[index];
|
|
60
|
+
for (let digit = 0; digit < digits.length; digit++) {
|
|
61
|
+
const value = digits[digit] * 256 + carry;
|
|
62
|
+
digits[digit] = value % 58;
|
|
63
|
+
carry = Math.floor(value / 58);
|
|
64
|
+
}
|
|
65
|
+
while (carry > 0) {
|
|
66
|
+
digits.push(carry % 58);
|
|
67
|
+
carry = Math.floor(carry / 58);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
let encoded = "1".repeat(zeroes);
|
|
71
|
+
for (let index = digits.length - 1; index >= 0; index--) {
|
|
72
|
+
encoded += BASE58_ALPHABET[digits[index]];
|
|
73
|
+
}
|
|
74
|
+
return encoded;
|
|
75
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/** Domain-separation label. Permanent — see the header. */
|
|
2
|
+
export declare const VEILO_NOTE_KEY_LABEL = "veilo_note_key_v1";
|
|
3
|
+
/** The note spending key plus the Poseidon public key derived from it. */
|
|
4
|
+
export interface NoteKeypair {
|
|
5
|
+
/** Raw 32-byte scalar, strictly below the BN254 Fr modulus. */
|
|
6
|
+
noteSecretKey: Uint8Array;
|
|
7
|
+
/** Hex form, matching how the relayer has always returned this key. */
|
|
8
|
+
noteSecretKeyHex: string;
|
|
9
|
+
/** Poseidon(noteSecretKey) — the note's committed owner. */
|
|
10
|
+
notePublicKey: bigint;
|
|
11
|
+
/** Decimal string form, as the relayer and note scanner expect it. */
|
|
12
|
+
notePublicKeyString: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Derive the note spending key from a spending-key root.
|
|
16
|
+
*
|
|
17
|
+
* @param spendingKey 32 bytes from `deriveSpendingKeyFromSignature` or a sibling
|
|
18
|
+
*/
|
|
19
|
+
export declare function deriveNoteKeyFromSpendingKey(spendingKey: Uint8Array): Uint8Array;
|
|
20
|
+
/**
|
|
21
|
+
* Derive the note spending key and its Poseidon public key.
|
|
22
|
+
*
|
|
23
|
+
* Call `initPoseidon()` once before this, as with `derivePositionKeys`.
|
|
24
|
+
*/
|
|
25
|
+
export declare function deriveNoteKeypairFromSpendingKey(spendingKey: Uint8Array): NoteKeypair;
|
|
26
|
+
/**
|
|
27
|
+
* One-shot derivation for a dapp holding only a wallet-standard `signMessage`.
|
|
28
|
+
*
|
|
29
|
+
* Prompts a single signature, then returns spend authority for the account.
|
|
30
|
+
* The signature is secret material: keep it in memory, never persist it, and
|
|
31
|
+
* never expose the result on a global.
|
|
32
|
+
*/
|
|
33
|
+
export declare function deriveNoteKeypairWithSigner(signMessage: (message: Uint8Array) => Promise<Uint8Array>, index?: number): Promise<NoteKeypair>;
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Derivation of the Veilo NOTE SPENDING KEY from a spending-key root.
|
|
3
|
+
*
|
|
4
|
+
* ⚠ BYTE-FOR-BYTE PORT — must agree with
|
|
5
|
+
* veilo-browser-extension/extension-ui/src/lib/veiloNoteKey.ts
|
|
6
|
+
* wallet-app/src/lib/veiloNoteKey.ts
|
|
7
|
+
* An account created in one client must be spendable from the others, so the
|
|
8
|
+
* label, the HMAC construction and the rejection rule are all load-bearing.
|
|
9
|
+
* `tests/identity-keys.test.ts` re-implements the client algorithm
|
|
10
|
+
* independently and asserts equality, plus pins a known-answer vector.
|
|
11
|
+
*
|
|
12
|
+
* WHAT THIS KEY IS
|
|
13
|
+
* ----------------
|
|
14
|
+
* `zk-circuits/keypair.circom` defines publicKey = Poseidon(privateKey), and
|
|
15
|
+
* `transaction.circom` constrains Poseidon(privateKey) === the note's committed
|
|
16
|
+
* owner before it will emit a proof, then derives the nullifier from the same
|
|
17
|
+
* key. This one scalar is both proof of ownership and spend authority; there is
|
|
18
|
+
* no second factor anywhere in the circuit. Treat it exactly as you would a
|
|
19
|
+
* wallet secret key.
|
|
20
|
+
*
|
|
21
|
+
* Derivation:
|
|
22
|
+
* spendingKey = deriveSpendingKeyFromSignature(sig) // ./spending.js
|
|
23
|
+
* veiloPrivateKey = rejectionSample(hmac_sha256(spendingKey, "veilo_note_key_v1|N"))
|
|
24
|
+
* veiloPublicKey = Poseidon(veiloPrivateKey)
|
|
25
|
+
*
|
|
26
|
+
* WHY REJECTION SAMPLING AND NOT `mod Fr`
|
|
27
|
+
* ---------------------------------------
|
|
28
|
+
* Reducing a 256-bit hash modulo Fr biases the low end of the range. Note that
|
|
29
|
+
* `derivePositionKeys` uses modular reduction; this key follows the stricter
|
|
30
|
+
* convention because it is a SPENDING key, matching how real note secrets are
|
|
31
|
+
* generated. About 0.3% of draws are retried.
|
|
32
|
+
*
|
|
33
|
+
* ⚠ THE LABEL IS PERMANENT. Once one note exists under "veilo_note_key_v1",
|
|
34
|
+
* changing the label or the sampling method makes that note unspendable
|
|
35
|
+
* forever. Version it, never edit it.
|
|
36
|
+
*
|
|
37
|
+
* ⚠ APPLIES TO `derived-v3` ACCOUNTS ONLY. Accounts whose relayer record has
|
|
38
|
+
* `veiloKeySource` absent or "legacy" have a SERVER-GENERATED note key that no
|
|
39
|
+
* derivation can reproduce — those clients must decrypt the key the relayer
|
|
40
|
+
* serves them. Check the account's key source before assuming this function
|
|
41
|
+
* yields a usable key.
|
|
42
|
+
*/
|
|
43
|
+
import { hmac } from "@noble/hashes/hmac";
|
|
44
|
+
import { sha256 } from "@noble/hashes/sha256";
|
|
45
|
+
import { BN254_FR_MODULUS, bytesToBigIntBE, poseidon1 } from "../poseidon.js";
|
|
46
|
+
import { assertBytes, bytesToHex, utf8 } from "./encoding.js";
|
|
47
|
+
import { deriveSpendingKeyWithSigner } from "./spending.js";
|
|
48
|
+
/** Domain-separation label. Permanent — see the header. */
|
|
49
|
+
export const VEILO_NOTE_KEY_LABEL = "veilo_note_key_v1";
|
|
50
|
+
/** Practically unreachable: 256 consecutive rejections is ~1e-640. */
|
|
51
|
+
const MAX_REJECTION_ROUNDS = 256;
|
|
52
|
+
/**
|
|
53
|
+
* Derive the note spending key from a spending-key root.
|
|
54
|
+
*
|
|
55
|
+
* @param spendingKey 32 bytes from `deriveSpendingKeyFromSignature` or a sibling
|
|
56
|
+
*/
|
|
57
|
+
export function deriveNoteKeyFromSpendingKey(spendingKey) {
|
|
58
|
+
assertBytes(spendingKey, 32, "spending key");
|
|
59
|
+
for (let counter = 0; counter < MAX_REJECTION_ROUNDS; counter++) {
|
|
60
|
+
const candidate = hmac(sha256, spendingKey, utf8(`${VEILO_NOTE_KEY_LABEL}|${counter}`));
|
|
61
|
+
if (bytesToBigIntBE(candidate) < BN254_FR_MODULUS)
|
|
62
|
+
return candidate;
|
|
63
|
+
}
|
|
64
|
+
// Reaching here means HMAC-SHA256 is broken, not that we were unlucky.
|
|
65
|
+
throw new Error(`Failed to derive a field element for "${VEILO_NOTE_KEY_LABEL}"`);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Derive the note spending key and its Poseidon public key.
|
|
69
|
+
*
|
|
70
|
+
* Call `initPoseidon()` once before this, as with `derivePositionKeys`.
|
|
71
|
+
*/
|
|
72
|
+
export function deriveNoteKeypairFromSpendingKey(spendingKey) {
|
|
73
|
+
const noteSecretKey = deriveNoteKeyFromSpendingKey(spendingKey);
|
|
74
|
+
const notePublicKey = poseidon1(bytesToBigIntBE(noteSecretKey));
|
|
75
|
+
return {
|
|
76
|
+
noteSecretKey,
|
|
77
|
+
noteSecretKeyHex: bytesToHex(noteSecretKey),
|
|
78
|
+
notePublicKey,
|
|
79
|
+
notePublicKeyString: notePublicKey.toString(),
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* One-shot derivation for a dapp holding only a wallet-standard `signMessage`.
|
|
84
|
+
*
|
|
85
|
+
* Prompts a single signature, then returns spend authority for the account.
|
|
86
|
+
* The signature is secret material: keep it in memory, never persist it, and
|
|
87
|
+
* never expose the result on a global.
|
|
88
|
+
*/
|
|
89
|
+
export async function deriveNoteKeypairWithSigner(signMessage, index = 0) {
|
|
90
|
+
return deriveNoteKeypairFromSpendingKey(await deriveSpendingKeyWithSigner(signMessage, index));
|
|
91
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Keypair } from "@solana/web3.js";
|
|
2
|
+
export declare const VEILO_SPENDING_KEY_DOMAIN = "veilo_spending_key_v1";
|
|
3
|
+
/** Exact message signed by Veilo clients to derive a spending-key root. */
|
|
4
|
+
export declare function getSpendingKeyMessage(index?: number): Uint8Array;
|
|
5
|
+
/** Convert the deterministic 64-byte wallet signature into a spending key. */
|
|
6
|
+
export declare function deriveSpendingKeyFromSignature(signature: Uint8Array): Uint8Array;
|
|
7
|
+
/**
|
|
8
|
+
* Wallet-standard-friendly spending-key derivation.
|
|
9
|
+
* The callback owns signing; the SDK never receives the wallet secret key.
|
|
10
|
+
*/
|
|
11
|
+
export declare function deriveSpendingKeyWithSigner(signMessage: (message: Uint8Array) => Promise<Uint8Array>, index?: number): Promise<Uint8Array>;
|
|
12
|
+
/**
|
|
13
|
+
* Keypair convenience matching the wallet-app and extension implementation.
|
|
14
|
+
* Keep the keypair on the user's device and never send it to a service.
|
|
15
|
+
*/
|
|
16
|
+
export declare function deriveSpendingKeyFromKeypair(keypair: Keypair, index?: number): Uint8Array;
|
|
17
|
+
/** Serialize an ephemeral claimant secret for an encrypted relayer request. */
|
|
18
|
+
export declare function encodeClaimantSecretKey(keypairOrSecret: Keypair | Uint8Array): string;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { sha256 } from "@noble/hashes/sha256";
|
|
2
|
+
import nacl from "tweetnacl";
|
|
3
|
+
import { assertBytes, concatBytes, encodeBase58, uint32Le, utf8, } from "./encoding.js";
|
|
4
|
+
export const VEILO_SPENDING_KEY_DOMAIN = "veilo_spending_key_v1";
|
|
5
|
+
/** Exact message signed by Veilo clients to derive a spending-key root. */
|
|
6
|
+
export function getSpendingKeyMessage(index = 0) {
|
|
7
|
+
return concatBytes(utf8(VEILO_SPENDING_KEY_DOMAIN), uint32Le(index, "spending-key index"));
|
|
8
|
+
}
|
|
9
|
+
/** Convert the deterministic 64-byte wallet signature into a spending key. */
|
|
10
|
+
export function deriveSpendingKeyFromSignature(signature) {
|
|
11
|
+
assertBytes(signature, 64, "spending-key signature");
|
|
12
|
+
return sha256(signature);
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Wallet-standard-friendly spending-key derivation.
|
|
16
|
+
* The callback owns signing; the SDK never receives the wallet secret key.
|
|
17
|
+
*/
|
|
18
|
+
export async function deriveSpendingKeyWithSigner(signMessage, index = 0) {
|
|
19
|
+
return deriveSpendingKeyFromSignature(await signMessage(getSpendingKeyMessage(index)));
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Keypair convenience matching the wallet-app and extension implementation.
|
|
23
|
+
* Keep the keypair on the user's device and never send it to a service.
|
|
24
|
+
*/
|
|
25
|
+
export function deriveSpendingKeyFromKeypair(keypair, index = 0) {
|
|
26
|
+
return deriveSpendingKeyFromSignature(nacl.sign.detached(getSpendingKeyMessage(index), keypair.secretKey));
|
|
27
|
+
}
|
|
28
|
+
/** Serialize an ephemeral claimant secret for an encrypted relayer request. */
|
|
29
|
+
export function encodeClaimantSecretKey(keypairOrSecret) {
|
|
30
|
+
const secret = keypairOrSecret instanceof Uint8Array
|
|
31
|
+
? keypairOrSecret
|
|
32
|
+
: keypairOrSecret.secretKey;
|
|
33
|
+
assertBytes(secret, 64, "claimant secret key");
|
|
34
|
+
return encodeBase58(secret);
|
|
35
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { CompactNoteCipher } from "../compactNote.js";
|
|
2
|
+
/** HKDF salt. Provisional — see the header. */
|
|
3
|
+
export declare const VEILO_VIEW_KEY_SALT = "veilo_view_v1";
|
|
4
|
+
/** HKDF info. Provisional — see the header. */
|
|
5
|
+
export declare const VEILO_VIEW_KEY_INFO = "x25519";
|
|
6
|
+
/** An X25519 keypair used only to decrypt notes. */
|
|
7
|
+
export interface ViewKeypair {
|
|
8
|
+
/** 32-byte clamped X25519 scalar. Secret: decrypts every note sent to it. */
|
|
9
|
+
viewSecretKey: Uint8Array;
|
|
10
|
+
/** 32-byte X25519 public key — the value senders encrypt to. */
|
|
11
|
+
viewPublicKey: Uint8Array;
|
|
12
|
+
}
|
|
13
|
+
/** Derive the view keypair from a spending-key root. */
|
|
14
|
+
export declare function deriveViewKeypairFromSpendingKey(spendingKey: Uint8Array): ViewKeypair;
|
|
15
|
+
/**
|
|
16
|
+
* One-shot derivation for a dapp holding only a wallet-standard `signMessage`.
|
|
17
|
+
*
|
|
18
|
+
* Uses the same signature as `deriveNoteKeypairWithSigner`, so a client that
|
|
19
|
+
* wants both prompts once and derives the spending key itself rather than
|
|
20
|
+
* calling both helpers.
|
|
21
|
+
*/
|
|
22
|
+
export declare function deriveViewKeypairWithSigner(signMessage: (message: Uint8Array) => Promise<Uint8Array>, index?: number): Promise<ViewKeypair>;
|
|
23
|
+
/**
|
|
24
|
+
* Scan one candidate cipher with a view key.
|
|
25
|
+
*
|
|
26
|
+
* Returns `null` both for a view-tag miss and for a blob that was not encrypted
|
|
27
|
+
* to this key — the expected outcome for nearly every candidate. The shared
|
|
28
|
+
* secret is computed once and reused for the tag check and the open, which is
|
|
29
|
+
* the cheapest correct order for a scan loop: the tag rejects ~255/256
|
|
30
|
+
* candidates for one scalar multiplication and one hash.
|
|
31
|
+
*
|
|
32
|
+
* ⚠ Only decrypts notes encrypted TO `viewPublicKey`. Notes sealed to a wallet
|
|
33
|
+
* Ed25519 key — every note written before the v2 format — will not open here.
|
|
34
|
+
*/
|
|
35
|
+
export declare function openCompactNoteWithViewKey(viewSecretKey: Uint8Array, cipher: CompactNoteCipher): {
|
|
36
|
+
blinding: Uint8Array;
|
|
37
|
+
amount: bigint;
|
|
38
|
+
} | null;
|