@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,281 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.PROTECTED_COMMITMENT_EVENT = exports.PROTECTED_COMMITMENT_EVENTS = void 0;
|
|
37
|
+
exports.getProtectedCommitmentEvents = getProtectedCommitmentEvents;
|
|
38
|
+
exports.getAllProtectedCommitmentEvents = getAllProtectedCommitmentEvents;
|
|
39
|
+
exports.mergeProtectedCommitmentEvents = mergeProtectedCommitmentEvents;
|
|
40
|
+
exports.resolveCommitmentEvents = resolveCommitmentEvents;
|
|
41
|
+
exports.decodeEventlessOpenPositionCommitments = decodeEventlessOpenPositionCommitments;
|
|
42
|
+
exports.getPositionPda = getPositionPda;
|
|
43
|
+
exports.readPositionLeafIndex = readPositionLeafIndex;
|
|
44
|
+
exports.recoverEventlessOpenPositionEvents = recoverEventlessOpenPositionEvents;
|
|
45
|
+
const anchor = __importStar(require("@coral-xyz/anchor"));
|
|
46
|
+
const web3_js_1 = require("@solana/web3.js");
|
|
47
|
+
const index_js_1 = require("../idl/index.js");
|
|
48
|
+
const parsing_js_1 = require("./parsing.js");
|
|
49
|
+
/**
|
|
50
|
+
* Historical leaves repaired manually in the relayer.
|
|
51
|
+
*
|
|
52
|
+
* The deployed `open_position` instruction appended these commitments without
|
|
53
|
+
* emitting CommitmentEvent. They must be retained when rebuilding history.
|
|
54
|
+
* Values are copied byte-for-byte from relayer-server/src/db/service.ts.
|
|
55
|
+
*/
|
|
56
|
+
exports.PROTECTED_COMMITMENT_EVENTS = [
|
|
57
|
+
{
|
|
58
|
+
leafIndex: 3738,
|
|
59
|
+
commitmentHex: "0c7850c9360e041ceeba27297e0fd49fa6a224a651c2fff8c56b22c70a319a94",
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
leafIndex: 4,
|
|
63
|
+
commitmentHex: "15e182d12e044ef2a469ccda88d903304a4e3e69f72765a29e4e6df9c206b0bf",
|
|
64
|
+
mintAddressHex: "e272b88fb18eaf1994acb885bdba76820c567c3467300f0cd320a0c15ebf9d2f",
|
|
65
|
+
onChainTreeId: 0,
|
|
66
|
+
},
|
|
67
|
+
];
|
|
68
|
+
/** @deprecated Use PROTECTED_COMMITMENT_EVENTS. */
|
|
69
|
+
exports.PROTECTED_COMMITMENT_EVENT = exports.PROTECTED_COMMITMENT_EVENTS[0];
|
|
70
|
+
/** Return protected records as normal SDK events for a particular tree. */
|
|
71
|
+
function getProtectedCommitmentEvents(params) {
|
|
72
|
+
const { mintAddress, treeId = 0 } = params;
|
|
73
|
+
const mintHex = bytesToHex(mintAddress.toBytes());
|
|
74
|
+
return getAllProtectedCommitmentEvents().filter((event) => bytesToHex(event.mintAddress.toBytes()) === mintHex &&
|
|
75
|
+
event.treeId === treeId);
|
|
76
|
+
}
|
|
77
|
+
/** Return every protected leaf, including the global position-tree repair. */
|
|
78
|
+
function getAllProtectedCommitmentEvents() {
|
|
79
|
+
return exports.PROTECTED_COMMITMENT_EVENTS.map((record) => {
|
|
80
|
+
const mintBytes = "mintAddressHex" in record
|
|
81
|
+
? hexToBytes(record.mintAddressHex)
|
|
82
|
+
: web3_js_1.PublicKey.default.toBytes();
|
|
83
|
+
return {
|
|
84
|
+
commitment: hexToBytes(record.commitmentHex),
|
|
85
|
+
leafIndex: record.leafIndex,
|
|
86
|
+
newRoot: new Uint8Array(32),
|
|
87
|
+
timestamp: 0,
|
|
88
|
+
mintAddress: new web3_js_1.PublicKey(mintBytes),
|
|
89
|
+
treeId: "onChainTreeId" in record ? record.onChainTreeId : 0,
|
|
90
|
+
txSignature: "protected-backfill",
|
|
91
|
+
slot: 0,
|
|
92
|
+
source: "protected",
|
|
93
|
+
};
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Add the protected historical leaves without duplicating records already read
|
|
98
|
+
* from an indexer. A conflicting commitment at a protected index is rejected.
|
|
99
|
+
*/
|
|
100
|
+
function mergeProtectedCommitmentEvents(events, params) {
|
|
101
|
+
const merged = [...events];
|
|
102
|
+
for (const protectedEvent of getProtectedCommitmentEvents(params)) {
|
|
103
|
+
const sameCommitment = merged.find((event) => bytesEqual(event.commitment, protectedEvent.commitment));
|
|
104
|
+
if (sameCommitment)
|
|
105
|
+
continue;
|
|
106
|
+
const atIndex = merged.find((event) => event.treeId === protectedEvent.treeId &&
|
|
107
|
+
event.leafIndex === protectedEvent.leafIndex);
|
|
108
|
+
if (atIndex) {
|
|
109
|
+
throw new Error(`Protected commitment conflicts with leaf ${protectedEvent.leafIndex}`);
|
|
110
|
+
}
|
|
111
|
+
merged.push(protectedEvent);
|
|
112
|
+
}
|
|
113
|
+
return merged.sort((a, b) => a.leafIndex - b.leafIndex);
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Insert expected commitments and prefer authoritative emitted metadata when it
|
|
117
|
+
* exists. Missing events are computed from the local tree exactly like the
|
|
118
|
+
* relayer's `insertAndPersistCommitments` fallback.
|
|
119
|
+
*
|
|
120
|
+
* This function mutates `tree`.
|
|
121
|
+
*/
|
|
122
|
+
function resolveCommitmentEvents(params) {
|
|
123
|
+
const { commitments, tree, logMessages, programId, mintAddress, treeId, txSignature, slot, timestamp = 0, requireAllInLogs = false, } = params;
|
|
124
|
+
const emitted = (0, parsing_js_1.parseCommitmentEventsFromLogs)({
|
|
125
|
+
logMessages,
|
|
126
|
+
programId,
|
|
127
|
+
txSignature,
|
|
128
|
+
slot,
|
|
129
|
+
});
|
|
130
|
+
const emittedByCommitment = new Map(emitted.map((event) => [bytesToHex(event.commitment), event]));
|
|
131
|
+
if (requireAllInLogs) {
|
|
132
|
+
const missing = commitments.filter((commitment) => !emittedByCommitment.has(bytesToHex(commitment)));
|
|
133
|
+
if (missing.length > 0) {
|
|
134
|
+
throw new Error(`Missing ${missing.length}/${commitments.length} commitment event(s) in transaction logs`);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return commitments.map((commitment) => {
|
|
138
|
+
const { index, root } = tree.insert(commitment);
|
|
139
|
+
return (emittedByCommitment.get(bytesToHex(commitment)) ?? {
|
|
140
|
+
commitment: new Uint8Array(commitment),
|
|
141
|
+
leafIndex: index,
|
|
142
|
+
newRoot: new Uint8Array(root),
|
|
143
|
+
timestamp,
|
|
144
|
+
mintAddress,
|
|
145
|
+
treeId,
|
|
146
|
+
txSignature,
|
|
147
|
+
slot,
|
|
148
|
+
source: "computed",
|
|
149
|
+
});
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
/** Decode the two commitments hidden in a current `open_position` instruction. */
|
|
153
|
+
function decodeEventlessOpenPositionCommitments(instructionData) {
|
|
154
|
+
const coder = new anchor.BorshInstructionCoder(index_js_1.PRIVACY_POOL_CURRENT_IDL);
|
|
155
|
+
let decoded;
|
|
156
|
+
try {
|
|
157
|
+
decoded = coder.decode(Buffer.from(instructionData));
|
|
158
|
+
}
|
|
159
|
+
catch {
|
|
160
|
+
return null;
|
|
161
|
+
}
|
|
162
|
+
if (!decoded || !/open_?position/i.test(decoded.name))
|
|
163
|
+
return null;
|
|
164
|
+
const data = decoded.data;
|
|
165
|
+
return {
|
|
166
|
+
sourceMint: toPublicKey(field(data, "sourceMint", "source_mint")),
|
|
167
|
+
sourceTreeId: toSafeNumber(field(data, "sourceTreeId", "source_tree_id") ?? 0, "sourceTreeId"),
|
|
168
|
+
sourceCommitment: toBytes(field(data, "outputCommitment0", "output_commitment_0"), 32, "outputCommitment0"),
|
|
169
|
+
positionMint: toPublicKey(field(data, "destMint", "dest_mint")),
|
|
170
|
+
positionTreeId: toSafeNumber(field(data, "positionTreeId", "position_tree_id") ?? 0, "positionTreeId"),
|
|
171
|
+
positionCommitment: toBytes(field(data, "outputCommitment1", "output_commitment_1"), 32, "outputCommitment1"),
|
|
172
|
+
positionPdaKey: toBytes(field(data, "positionPdaKey", "position_pda_key"), 32, "positionPdaKey"),
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
function getPositionPda(programId, positionPdaKey) {
|
|
176
|
+
return web3_js_1.PublicKey.findProgramAddressSync([new TextEncoder().encode("position_pda_v1"), positionPdaKey], programId)[0];
|
|
177
|
+
}
|
|
178
|
+
/** Read PositionPDA.leaf_index at the same byte offset used by the relayer. */
|
|
179
|
+
function readPositionLeafIndex(accountData) {
|
|
180
|
+
if (accountData.length < 57) {
|
|
181
|
+
throw new Error(`PositionPDA data is too short: ${accountData.length} bytes`);
|
|
182
|
+
}
|
|
183
|
+
const expected = getPositionPdaDiscriminator();
|
|
184
|
+
if (!bytesEqual(accountData.slice(0, 8), expected)) {
|
|
185
|
+
throw new Error("PositionPDA discriminator mismatch");
|
|
186
|
+
}
|
|
187
|
+
const leafIndex = new DataView(accountData.buffer, accountData.byteOffset, accountData.byteLength).getBigUint64(49, true);
|
|
188
|
+
if (leafIndex > BigInt(Number.MAX_SAFE_INTEGER)) {
|
|
189
|
+
throw new Error("PositionPDA leaf index exceeds JavaScript's safe integer range");
|
|
190
|
+
}
|
|
191
|
+
return Number(leafIndex);
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Recover the two events omitted by the deployed `open_position` instruction.
|
|
195
|
+
* The source tree must already contain every earlier source-mint commitment.
|
|
196
|
+
* This function inserts the source commitment into that tree.
|
|
197
|
+
*/
|
|
198
|
+
async function recoverEventlessOpenPositionEvents(params) {
|
|
199
|
+
const decoded = decodeEventlessOpenPositionCommitments(params.instructionData);
|
|
200
|
+
if (!decoded)
|
|
201
|
+
return [];
|
|
202
|
+
const positionPda = getPositionPda(params.programId, decoded.positionPdaKey);
|
|
203
|
+
const account = (await params.connection.getAccountInfo(positionPda));
|
|
204
|
+
if (account && !account.owner.equals(params.programId)) {
|
|
205
|
+
throw new Error("PositionPDA is not owned by the Veilo program");
|
|
206
|
+
}
|
|
207
|
+
const positionLeafIndex = account
|
|
208
|
+
? readPositionLeafIndex(new Uint8Array(account.data))
|
|
209
|
+
: undefined;
|
|
210
|
+
const { index, root } = params.sourceTree.insert(decoded.sourceCommitment);
|
|
211
|
+
const sourceEvent = {
|
|
212
|
+
commitment: decoded.sourceCommitment,
|
|
213
|
+
leafIndex: index,
|
|
214
|
+
newRoot: new Uint8Array(root),
|
|
215
|
+
timestamp: params.timestamp ?? 0,
|
|
216
|
+
mintAddress: decoded.sourceMint,
|
|
217
|
+
treeId: decoded.sourceTreeId,
|
|
218
|
+
txSignature: params.txSignature,
|
|
219
|
+
slot: params.slot,
|
|
220
|
+
source: "computed",
|
|
221
|
+
};
|
|
222
|
+
if (positionLeafIndex === undefined)
|
|
223
|
+
return [sourceEvent];
|
|
224
|
+
return [
|
|
225
|
+
sourceEvent,
|
|
226
|
+
{
|
|
227
|
+
commitment: decoded.positionCommitment,
|
|
228
|
+
leafIndex: positionLeafIndex,
|
|
229
|
+
newRoot: new Uint8Array(32),
|
|
230
|
+
timestamp: params.timestamp ?? 0,
|
|
231
|
+
mintAddress: decoded.positionMint,
|
|
232
|
+
treeId: decoded.positionTreeId,
|
|
233
|
+
txSignature: params.txSignature,
|
|
234
|
+
slot: params.slot,
|
|
235
|
+
source: "computed",
|
|
236
|
+
},
|
|
237
|
+
];
|
|
238
|
+
}
|
|
239
|
+
function getPositionPdaDiscriminator() {
|
|
240
|
+
const account = (index_js_1.PRIVACY_POOL_CURRENT_IDL.accounts ?? []).find((entry) => entry.name === "PositionPDA");
|
|
241
|
+
if (!account?.discriminator) {
|
|
242
|
+
throw new Error("Current IDL does not define PositionPDA");
|
|
243
|
+
}
|
|
244
|
+
return new Uint8Array(account.discriminator);
|
|
245
|
+
}
|
|
246
|
+
function field(data, camel, snake) {
|
|
247
|
+
return data[camel] ?? data[snake];
|
|
248
|
+
}
|
|
249
|
+
function toPublicKey(value) {
|
|
250
|
+
if (value instanceof web3_js_1.PublicKey)
|
|
251
|
+
return value;
|
|
252
|
+
return new web3_js_1.PublicKey(value);
|
|
253
|
+
}
|
|
254
|
+
function toBytes(value, length, label) {
|
|
255
|
+
const bytes = new Uint8Array(value);
|
|
256
|
+
if (bytes.length !== length) {
|
|
257
|
+
throw new Error(`${label} must be ${length} bytes, got ${bytes.length}`);
|
|
258
|
+
}
|
|
259
|
+
return bytes;
|
|
260
|
+
}
|
|
261
|
+
function toSafeNumber(value, label) {
|
|
262
|
+
const number = typeof value === "number" ? value : Number(value);
|
|
263
|
+
if (!Number.isSafeInteger(number)) {
|
|
264
|
+
throw new Error(`${label} is outside JavaScript's safe integer range`);
|
|
265
|
+
}
|
|
266
|
+
return number;
|
|
267
|
+
}
|
|
268
|
+
function hexToBytes(hex) {
|
|
269
|
+
if (!/^[0-9a-f]{64}$/i.test(hex)) {
|
|
270
|
+
throw new Error("Commitment hex must contain exactly 32 bytes");
|
|
271
|
+
}
|
|
272
|
+
return Uint8Array.from({ length: 32 }, (_, index) => Number.parseInt(hex.slice(index * 2, index * 2 + 2), 16));
|
|
273
|
+
}
|
|
274
|
+
function bytesToHex(bytes) {
|
|
275
|
+
return Array.from(bytes, (value) => value.toString(16).padStart(2, "0")).join("");
|
|
276
|
+
}
|
|
277
|
+
function bytesEqual(a, b) {
|
|
278
|
+
if (a.length !== b.length)
|
|
279
|
+
return false;
|
|
280
|
+
return a.every((value, index) => value === b[index]);
|
|
281
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { Idl, Program } from "@coral-xyz/anchor";
|
|
2
|
+
import type { PublicKey } from "@solana/web3.js";
|
|
3
|
+
import type { CommitmentEvent, NullifierSpentEvent } from "./types.js";
|
|
4
|
+
export type EventScanPage<T> = {
|
|
5
|
+
events: T[];
|
|
6
|
+
/** Oldest signature examined, even when it emitted no matching event. */
|
|
7
|
+
nextBefore?: string;
|
|
8
|
+
scannedSignatures: number;
|
|
9
|
+
};
|
|
10
|
+
export type EventScanParams<T extends Idl> = {
|
|
11
|
+
program: Program<T>;
|
|
12
|
+
mintAddress?: PublicKey;
|
|
13
|
+
before?: string;
|
|
14
|
+
until?: string;
|
|
15
|
+
/** Number of program signatures to inspect. Maximum 1,000. */
|
|
16
|
+
limit?: number;
|
|
17
|
+
};
|
|
18
|
+
/** Scan one RPC page and retain a correct pagination cursor. */
|
|
19
|
+
export declare function scanCommitmentEventPage<T extends Idl>(params: EventScanParams<T>): Promise<EventScanPage<CommitmentEvent>>;
|
|
20
|
+
/**
|
|
21
|
+
* Scan a single page of CommitmentEvents.
|
|
22
|
+
*
|
|
23
|
+
* Use `scanAllCommitmentEvents` when reconstructing a complete historical tree.
|
|
24
|
+
*/
|
|
25
|
+
export declare function scanCommitmentEvents<T extends Idl>(params: EventScanParams<T>): Promise<CommitmentEvent[]>;
|
|
26
|
+
/** Scan all historical pages without using event count as the RPC cursor. */
|
|
27
|
+
export declare function scanAllCommitmentEvents<T extends Idl>(params: {
|
|
28
|
+
program: Program<T>;
|
|
29
|
+
mintAddress?: PublicKey;
|
|
30
|
+
before?: string;
|
|
31
|
+
until?: string;
|
|
32
|
+
pageSize?: number;
|
|
33
|
+
}): Promise<CommitmentEvent[]>;
|
|
34
|
+
/** Scan one RPC page of NullifierSpent events using all historical IDLs. */
|
|
35
|
+
export declare function scanNullifierEvents<T extends Idl>(params: EventScanParams<T>): Promise<NullifierSpentEvent[]>;
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.scanCommitmentEventPage = scanCommitmentEventPage;
|
|
4
|
+
exports.scanCommitmentEvents = scanCommitmentEvents;
|
|
5
|
+
exports.scanAllCommitmentEvents = scanAllCommitmentEvents;
|
|
6
|
+
exports.scanNullifierEvents = scanNullifierEvents;
|
|
7
|
+
const parsing_js_1 = require("./parsing.js");
|
|
8
|
+
/** Scan one RPC page and retain a correct pagination cursor. */
|
|
9
|
+
async function scanCommitmentEventPage(params) {
|
|
10
|
+
const { program, mintAddress, before, until, limit = 1000 } = params;
|
|
11
|
+
assertPageSize(limit);
|
|
12
|
+
const signatures = await program.provider.connection.getSignaturesForAddress(program.programId, { before, until, limit });
|
|
13
|
+
const events = [];
|
|
14
|
+
for (const signature of signatures) {
|
|
15
|
+
if (signature.err)
|
|
16
|
+
continue;
|
|
17
|
+
const tx = await program.provider.connection.getTransaction(signature.signature, { commitment: "confirmed", maxSupportedTransactionVersion: 0 });
|
|
18
|
+
if (!tx)
|
|
19
|
+
continue;
|
|
20
|
+
for (const event of (0, parsing_js_1.parseCommitmentEventsFromLogs)({
|
|
21
|
+
logMessages: tx.meta?.logMessages,
|
|
22
|
+
programId: program.programId,
|
|
23
|
+
txSignature: signature.signature,
|
|
24
|
+
slot: signature.slot,
|
|
25
|
+
})) {
|
|
26
|
+
if (!mintAddress || event.mintAddress.equals(mintAddress)) {
|
|
27
|
+
events.push(event);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return {
|
|
32
|
+
events,
|
|
33
|
+
nextBefore: signatures[signatures.length - 1]?.signature,
|
|
34
|
+
scannedSignatures: signatures.length,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Scan a single page of CommitmentEvents.
|
|
39
|
+
*
|
|
40
|
+
* Use `scanAllCommitmentEvents` when reconstructing a complete historical tree.
|
|
41
|
+
*/
|
|
42
|
+
async function scanCommitmentEvents(params) {
|
|
43
|
+
return (await scanCommitmentEventPage(params)).events;
|
|
44
|
+
}
|
|
45
|
+
/** Scan all historical pages without using event count as the RPC cursor. */
|
|
46
|
+
async function scanAllCommitmentEvents(params) {
|
|
47
|
+
const { program, mintAddress, until, pageSize = 1000 } = params;
|
|
48
|
+
assertPageSize(pageSize);
|
|
49
|
+
const events = [];
|
|
50
|
+
let before = params.before;
|
|
51
|
+
while (true) {
|
|
52
|
+
const page = await scanCommitmentEventPage({
|
|
53
|
+
program,
|
|
54
|
+
mintAddress,
|
|
55
|
+
before,
|
|
56
|
+
until,
|
|
57
|
+
limit: pageSize,
|
|
58
|
+
});
|
|
59
|
+
events.push(...page.events);
|
|
60
|
+
if (page.scannedSignatures < pageSize || !page.nextBefore)
|
|
61
|
+
break;
|
|
62
|
+
if (page.nextBefore === before) {
|
|
63
|
+
throw new Error("Commitment event pagination cursor did not advance");
|
|
64
|
+
}
|
|
65
|
+
before = page.nextBefore;
|
|
66
|
+
}
|
|
67
|
+
return events;
|
|
68
|
+
}
|
|
69
|
+
/** Scan one RPC page of NullifierSpent events using all historical IDLs. */
|
|
70
|
+
async function scanNullifierEvents(params) {
|
|
71
|
+
const { program, mintAddress, before, until, limit = 1000 } = params;
|
|
72
|
+
assertPageSize(limit);
|
|
73
|
+
const signatures = await program.provider.connection.getSignaturesForAddress(program.programId, { before, until, limit });
|
|
74
|
+
const events = [];
|
|
75
|
+
for (const signature of signatures) {
|
|
76
|
+
if (signature.err)
|
|
77
|
+
continue;
|
|
78
|
+
const tx = await program.provider.connection.getTransaction(signature.signature, { commitment: "confirmed", maxSupportedTransactionVersion: 0 });
|
|
79
|
+
if (!tx)
|
|
80
|
+
continue;
|
|
81
|
+
for (const event of (0, parsing_js_1.parseNullifierEventsFromLogs)({
|
|
82
|
+
logMessages: tx.meta?.logMessages,
|
|
83
|
+
programId: program.programId,
|
|
84
|
+
txSignature: signature.signature,
|
|
85
|
+
slot: signature.slot,
|
|
86
|
+
})) {
|
|
87
|
+
if (!mintAddress || event.mintAddress.equals(mintAddress)) {
|
|
88
|
+
events.push(event);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return events;
|
|
93
|
+
}
|
|
94
|
+
function assertPageSize(value) {
|
|
95
|
+
if (!Number.isInteger(value) || value < 1 || value > 1000) {
|
|
96
|
+
throw new RangeError(`Event scan page size must be an integer from 1 to 1000, got ${value}`);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
@@ -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,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.buildTreeFromEvents = buildTreeFromEvents;
|
|
4
|
+
exports.dedupeCommitmentEvents = dedupeCommitmentEvents;
|
|
5
|
+
exports.reconstructTreeFromCommitmentEvents = reconstructTreeFromCommitmentEvents;
|
|
6
|
+
const merkle_js_1 = require("../merkle.js");
|
|
7
|
+
const recovery_js_1 = require("./recovery.js");
|
|
8
|
+
const scanning_js_1 = require("./scanning.js");
|
|
9
|
+
/** Rebuild a local Veilo tree from emitted, computed, and protected history. */
|
|
10
|
+
async function buildTreeFromEvents(params) {
|
|
11
|
+
const { program, mintAddress, treeId = 0, depth = 22, additionalEvents = [], includeProtectedEvents = true, strictLeafIndices = true, } = params;
|
|
12
|
+
const emitted = await (0, scanning_js_1.scanAllCommitmentEvents)({ program, mintAddress });
|
|
13
|
+
let treeEvents = dedupeCommitmentEvents([...emitted, ...additionalEvents])
|
|
14
|
+
.filter((event) => event.treeId === treeId && event.mintAddress.equals(mintAddress))
|
|
15
|
+
.sort((a, b) => a.leafIndex - b.leafIndex);
|
|
16
|
+
if (includeProtectedEvents) {
|
|
17
|
+
treeEvents = (0, recovery_js_1.mergeProtectedCommitmentEvents)(treeEvents, {
|
|
18
|
+
mintAddress,
|
|
19
|
+
treeId,
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
const tree = reconstructTreeFromCommitmentEvents(treeEvents, {
|
|
23
|
+
depth,
|
|
24
|
+
strictLeafIndices,
|
|
25
|
+
});
|
|
26
|
+
return {
|
|
27
|
+
tree,
|
|
28
|
+
events: treeEvents,
|
|
29
|
+
latestSignature: treeEvents[treeEvents.length - 1]?.txSignature,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
function dedupeCommitmentEvents(events) {
|
|
33
|
+
const byCommitment = new Map();
|
|
34
|
+
for (const event of events) {
|
|
35
|
+
const key = Array.from(event.commitment, (value) => value.toString(16).padStart(2, "0")).join("");
|
|
36
|
+
const existing = byCommitment.get(key);
|
|
37
|
+
if (!existing || eventPriority(event) > eventPriority(existing)) {
|
|
38
|
+
byCommitment.set(key, event);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return [...byCommitment.values()];
|
|
42
|
+
}
|
|
43
|
+
function eventPriority(event) {
|
|
44
|
+
// Events created before `source` was added came from on-chain log scans and
|
|
45
|
+
// are therefore treated as authoritative emitted records.
|
|
46
|
+
if (event.source === "protected")
|
|
47
|
+
return 1;
|
|
48
|
+
if (event.source === "computed")
|
|
49
|
+
return 2;
|
|
50
|
+
return 3;
|
|
51
|
+
}
|
|
52
|
+
/** Build a Merkle tree from already-collected events in authoritative order. */
|
|
53
|
+
function reconstructTreeFromCommitmentEvents(events, options = {}) {
|
|
54
|
+
const tree = new merkle_js_1.MerkleTree(options.depth ?? 22);
|
|
55
|
+
for (const event of [...events].sort((a, b) => a.leafIndex - b.leafIndex)) {
|
|
56
|
+
if ((options.strictLeafIndices ?? true) &&
|
|
57
|
+
event.leafIndex !== tree.nextIndex) {
|
|
58
|
+
throw new Error(`Commitment history gap: expected leaf ${tree.nextIndex}, got ${event.leafIndex}`);
|
|
59
|
+
}
|
|
60
|
+
tree.insert(event.commitment);
|
|
61
|
+
}
|
|
62
|
+
return tree;
|
|
63
|
+
}
|
|
@@ -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
|
+
};
|
package/dist/cjs/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";
|