@pushchain/core 5.1.18 → 6.0.1
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/package.json +1 -1
- package/src/lib/constants/abi/cea.evm.d.ts +52 -0
- package/src/lib/constants/abi/cea.evm.js +66 -1
- package/src/lib/constants/abi/prc20.evm.d.ts +117 -11
- package/src/lib/constants/abi/prc20.evm.js +38 -11
- package/src/lib/constants/abi/uea.evm.js +41 -0
- package/src/lib/constants/abi/universalGatewayPC.evm.d.ts +118 -2
- package/src/lib/constants/abi/universalGatewayPC.evm.js +41 -2
- package/src/lib/constants/abi/universalGatewayV0.json +1 -1
- package/src/lib/constants/chain.d.ts +2 -0
- package/src/lib/constants/chain.js +18 -14
- package/src/lib/constants/index.d.ts +1 -1
- package/src/lib/constants/tokens.d.ts +10 -1
- package/src/lib/constants/tokens.js +5 -2
- package/src/lib/formatters.d.ts +6 -0
- package/src/lib/formatters.js +14 -0
- package/src/lib/index.d.ts +2 -0
- package/src/lib/index.js +7 -1
- package/src/lib/orchestrator/internals/cascade.d.ts +3 -1
- package/src/lib/orchestrator/internals/cascade.js +189 -103
- package/src/lib/orchestrator/internals/errors.js +1 -1
- package/src/lib/orchestrator/internals/execute-funds-only.js +3 -2
- package/src/lib/orchestrator/internals/execute-funds-payload.js +2 -1
- package/src/lib/orchestrator/internals/execute-standard.js +4 -4
- package/src/lib/orchestrator/internals/gas-calculator.d.ts +1 -0
- package/src/lib/orchestrator/internals/gas-calculator.js +13 -11
- package/src/lib/orchestrator/internals/helpers.js +2 -0
- package/src/lib/orchestrator/internals/inbound-tracker.js +4 -2
- package/src/lib/orchestrator/internals/outbound-sync.js +73 -60
- package/src/lib/orchestrator/internals/pc-usd-oracle.d.ts +1 -1
- package/src/lib/orchestrator/internals/pc-usd-oracle.js +4 -3
- package/src/lib/orchestrator/internals/preflight.d.ts +8 -5
- package/src/lib/orchestrator/internals/preflight.js +35 -21
- package/src/lib/orchestrator/internals/push-chain-tx.js +5 -1
- package/src/lib/orchestrator/internals/route-handlers.js +175 -202
- package/src/lib/orchestrator/internals/signing.js +7 -2
- package/src/lib/orchestrator/internals/svm-helpers.js +3 -3
- package/src/lib/orchestrator/internals/svm-rent.d.ts +42 -9
- package/src/lib/orchestrator/internals/svm-rent.js +157 -14
- package/src/lib/orchestrator/internals/tx-transformer.js +5 -2
- package/src/lib/orchestrator/max-pc-for-gas.d.ts +60 -0
- package/src/lib/orchestrator/max-pc-for-gas.js +66 -0
- package/src/lib/orchestrator/orchestrator.d.ts +6 -6
- package/src/lib/orchestrator/orchestrator.js +10 -3
- package/src/lib/orchestrator/orchestrator.types.d.ts +48 -10
- package/src/lib/orchestrator/payload-builders.d.ts +7 -6
- package/src/lib/orchestrator/payload-builders.js +19 -7
- package/src/lib/progress-hook/progress-hook.js +59 -27
- package/src/lib/progress-hook/progress-hook.types.d.ts +3 -3
- package/src/lib/progress-hook/progress-hook.types.js +4 -2
- package/src/lib/push-chain/push-chain.d.ts +10 -4
- package/src/lib/push-chain/push-chain.js +2 -2
- package/src/lib/universal-tx-detector/events.d.ts +3 -1
- package/src/lib/universal-tx-detector/events.js +3 -1
- package/src/lib/universal-tx-detector/svm-events.d.ts +1 -1
- package/src/lib/universal-tx-detector/svm-events.js +1 -1
- package/src/lib/utils.js +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{ "address": "CFVSincHYbETh2k7w6u1ENEkjbSLtveRCEBupKidw2VS", "metadata": { "name": "universal_gateway", "version": "0.1.0", "spec": "0.1.0", "description": "Universal Gateway for Solana - Cross-chain bridge and transaction router" }, "instructions": [{ "name": "finalize_universal_tx", "docs": ["@notice Unified outbound entrypoint: withdraw (mode 1) or execute (mode 2)", "@param instruction_id 1=withdraw (vault\u2192CEA\u2192recipient), 2=execute (vault\u2192CEA\u2192CPI)"], "discriminator": [222, 91, 238, 150, 75, 216, 2, 80], "accounts": [{ "name": "caller", "writable": true, "signer": true }, { "name": "config", "pda": { "seeds": [{ "kind": "const", "value": [99, 111, 110, 102, 105, 103] }] } }, { "name": "vault_sol", "docs": ["Vault SOL PDA - holds all bridged SOL"], "writable": true, "pda": { "seeds": [{ "kind": "const", "value": [118, 97, 117, 108, 116] }] } }, { "name": "cea_authority", "docs": ["CEA (Chain Executor Account) - persistent identity per Push Chain user", "This PDA represents the user on Solana and can sign for target programs", "Auto-created by Solana on first transfer, persists across transactions"], "writable": true, "pda": { "seeds": [{ "kind": "const", "value": [112, 117, 115, 104, 95, 105, 100, 101, 110, 116, 105, 116, 121] }, { "kind": "arg", "path": "push_account" }] } }, { "name": "tss_pda", "writable": true, "pda": { "seeds": [{ "kind": "const", "value": [116, 115, 115, 112, 100, 97, 95, 118, 50] }] } }, { "name": "executed_sub_tx", "docs": ["Executed transaction tracker (replay protection)", "Relayer pays for this account creation and gets reimbursed via gas_fee"], "writable": true, "pda": { "seeds": [{ "kind": "const", "value": [101, 120, 101, 99, 117, 116, 101, 100, 95, 115, 117, 98, 95, 116, 120] }, { "kind": "arg", "path": "sub_tx_id" }] } }, { "name": "system_program", "address": "11111111111111111111111111111111" }, { "name": "destination_program", "docs": ["Pass system program id for withdraw, it's ignored"] }, { "name": "recipient", "writable": true, "optional": true }, { "name": "vault_ata", "docs": ["Vault ATA for this mint \u2014 always initialized (deposit path guarantees existence)"], "writable": true, "optional": true }, { "name": "cea_ata", "writable": true, "optional": true }, { "name": "mint", "optional": true }, { "name": "token_program", "optional": true, "address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" }, { "name": "rent", "optional": true, "address": "SysvarRent111111111111111111111111111111111" }, { "name": "associated_token_program", "optional": true, "address": "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" }, { "name": "recipient_ata", "writable": true, "optional": true }, { "name": "rate_limit_config", "optional": true, "pda": { "seeds": [{ "kind": "const", "value": [114, 97, 116, 101, 95, 108, 105, 109, 105, 116, 95, 99, 111, 110, 102, 105, 103] }] } }, { "name": "token_rate_limit", "docs": ["Token-specific rate limit state (CEA withdrawal path only)"], "writable": true, "optional": true }], "args": [{ "name": "instruction_id", "type": "u8" }, { "name": "sub_tx_id", "type": { "array": ["u8", 32] } }, { "name": "universal_tx_id", "type": { "array": ["u8", 32] } }, { "name": "amount", "type": "u64" }, { "name": "push_account", "type": { "array": ["u8", 20] } }, { "name": "writable_flags", "type": "bytes" }, { "name": "ix_data", "type": "bytes" }, { "name": "gas_fee", "type": "u64" }, { "name": "signature", "type": { "array": ["u8", 64] } }, { "name": "recovery_id", "type": "u8" }, { "name": "message_hash", "type": { "array": ["u8", 32] } }] }, { "name": "get_sol_price", "docs": ["@notice View function for SOL price (locker-compatible)"], "discriminator": [230, 145, 206, 175, 43, 184, 97, 110], "accounts": [{ "name": "price_update" }], "args": [], "returns": { "defined": { "name": "PriceData" } } }, { "name": "init_tss", "discriminator": [47, 31, 100, 111, 115, 2, 22, 208], "accounts": [{ "name": "tss_pda", "writable": true, "pda": { "seeds": [{ "kind": "const", "value": [116, 115, 115, 112, 100, 97, 95, 118, 50] }] } }, { "name": "config", "pda": { "seeds": [{ "kind": "const", "value": [99, 111, 110, 102, 105, 103] }] } }, { "name": "authority", "writable": true, "signer": true }, { "name": "system_program", "address": "11111111111111111111111111111111" }], "args": [{ "name": "tss_eth_address", "type": { "array": ["u8", 20] } }, { "name": "chain_id", "type": "string" }] }, { "name": "initialize", "docs": ["@notice Initialize the gateway"], "discriminator": [175, 175, 109, 31, 13, 152, 155, 237], "accounts": [{ "name": "config", "writable": true, "pda": { "seeds": [{ "kind": "const", "value": [99, 111, 110, 102, 105, 103] }] } }, { "name": "vault", "writable": true, "pda": { "seeds": [{ "kind": "const", "value": [118, 97, 117, 108, 116] }] } }, { "name": "admin", "writable": true, "signer": true }, { "name": "system_program", "address": "11111111111111111111111111111111" }], "args": [{ "name": "admin", "type": "pubkey" }, { "name": "pauser", "type": "pubkey" }, { "name": "tss", "type": "pubkey" }, { "name": "min_cap_usd", "type": "u128" }, { "name": "max_cap_usd", "type": "u128" }, { "name": "pyth_price_feed", "type": "pubkey" }] }, { "name": "pause", "docs": ["@notice Pause the gateway"], "discriminator": [211, 22, 221, 251, 74, 121, 193, 47], "accounts": [{ "name": "config", "writable": true, "pda": { "seeds": [{ "kind": "const", "value": [99, 111, 110, 102, 105, 103] }] } }, { "name": "pauser", "signer": true }], "args": [] }, { "name": "rescue_funds", "docs": ["@notice TSS-verified emergency rescue of locked funds from vault.", "SOL path: token_mint = None. SPL path: token_mint = Some.", "Replay-protected via ExecutedSubTx PDA"], "discriminator": [238, 204, 8, 81, 89, 43, 193, 103], "accounts": [{ "name": "config", "pda": { "seeds": [{ "kind": "const", "value": [99, 111, 110, 102, 105, 103] }] } }, { "name": "vault", "writable": true, "pda": { "seeds": [{ "kind": "const", "value": [118, 97, 117, 108, 116] }] } }, { "name": "fee_vault", "docs": ["Fee vault \u2014 relayer gas reimbursement source."], "writable": true, "pda": { "seeds": [{ "kind": "const", "value": [102, 101, 101, 95, 118, 97, 117, 108, 116] }] } }, { "name": "tss_pda", "writable": true, "pda": { "seeds": [{ "kind": "const", "value": [116, 115, 115, 112, 100, 97, 95, 118, 50] }] } }, { "name": "recipient", "docs": ["recipient_token_account.owner and used as the canonical identity in the TSS message."], "writable": true }, { "name": "executed_sub_tx", "docs": ["Replay protection (EVM parity: isExecuted[subTxId])."], "writable": true, "pda": { "seeds": [{ "kind": "const", "value": [101, 120, 101, 99, 117, 116, 101, 100, 95, 115, 117, 98, 95, 116, 120] }, { "kind": "arg", "path": "sub_tx_id" }] } }, { "name": "caller", "docs": ["The caller/relayer \u2014 pays transaction fees, receives gas_fee reimbursement."], "writable": true, "signer": true }, { "name": "system_program", "address": "11111111111111111111111111111111" }, { "name": "token_vault", "docs": ["Vault ATA for this mint \u2014 holds bridged SPL tokens."], "writable": true, "optional": true }, { "name": "recipient_token_account", "docs": ["Recipient token account \u2014 must be owned by recipient and match token_mint."], "writable": true, "optional": true }, { "name": "token_mint", "optional": true }, { "name": "token_program", "optional": true, "address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" }], "args": [{ "name": "sub_tx_id", "type": { "array": ["u8", 32] } }, { "name": "universal_tx_id", "type": { "array": ["u8", 32] } }, { "name": "amount", "type": "u64" }, { "name": "gas_fee", "type": "u64" }, { "name": "signature", "type": { "array": ["u8", 64] } }, { "name": "recovery_id", "type": "u8" }, { "name": "message_hash", "type": { "array": ["u8", 32] } }] }, { "name": "revert_universal_tx", "docs": ["@notice TSS-verified unified revert (SOL and SPL) \u2014 EVM parity: `revertUniversalTx`.", "SOL path: token_mint = None. SPL path: token_mint = Some."], "discriminator": [124, 49, 81, 233, 23, 147, 82, 122], "accounts": [{ "name": "config", "pda": { "seeds": [{ "kind": "const", "value": [99, 111, 110, 102, 105, 103] }] } }, { "name": "vault", "writable": true, "pda": { "seeds": [{ "kind": "const", "value": [118, 97, 117, 108, 116] }] } }, { "name": "fee_vault", "docs": ["Fee vault \u2014 relayer gas reimbursement source."], "writable": true, "pda": { "seeds": [{ "kind": "const", "value": [102, 101, 101, 95, 118, 97, 117, 108, 116] }] } }, { "name": "tss_pda", "writable": true, "pda": { "seeds": [{ "kind": "const", "value": [116, 115, 115, 112, 100, 97, 95, 118, 50] }] } }, { "name": "recipient", "docs": ["recipient_token_account.owner and used as canonical identity in TSS message."], "writable": true }, { "name": "executed_sub_tx", "docs": ["Replay protection (EVM parity: isExecuted[subTxId])."], "writable": true, "pda": { "seeds": [{ "kind": "const", "value": [101, 120, 101, 99, 117, 116, 101, 100, 95, 115, 117, 98, 95, 116, 120] }, { "kind": "arg", "path": "sub_tx_id" }] } }, { "name": "caller", "docs": ["The caller/relayer \u2014 pays transaction fees, receives gas_fee reimbursement."], "writable": true, "signer": true }, { "name": "system_program", "address": "11111111111111111111111111111111" }, { "name": "token_vault", "docs": ["Vault ATA for this mint \u2014 holds bridged SPL tokens."], "writable": true, "optional": true }, { "name": "recipient_token_account", "docs": ["Recipient token account \u2014 must be owned by recipient and match token_mint."], "writable": true, "optional": true }, { "name": "token_mint", "optional": true }, { "name": "token_program", "optional": true, "address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" }], "args": [{ "name": "sub_tx_id", "type": { "array": ["u8", 32] } }, { "name": "universal_tx_id", "type": { "array": ["u8", 32] } }, { "name": "amount", "type": "u64" }, { "name": "revert_instruction", "type": { "defined": { "name": "RevertInstructions" } } }, { "name": "gas_fee", "type": "u64" }, { "name": "signature", "type": { "array": ["u8", 64] } }, { "name": "recovery_id", "type": "u8" }, { "name": "message_hash", "type": { "array": ["u8", 32] } }] }, { "name": "send_universal_tx", "docs": ["@notice Universal transaction entrypoint with internal routing (EVM parity).", "@dev Native amount parameter mirrors `msg.value` on EVM chains.", "All routing (gas / funds / batching) is handled inside the deposit module."], "discriminator": [145, 19, 164, 55, 165, 220, 23, 97], "accounts": [{ "name": "config", "pda": { "seeds": [{ "kind": "const", "value": [99, 111, 110, 102, 105, 103] }] } }, { "name": "vault", "writable": true, "pda": { "seeds": [{ "kind": "const", "value": [118, 97, 117, 108, 116] }] } }, { "name": "fee_vault", "docs": ["Fee vault: receives the flat protocol fee per inbound tx.", "Separate from bridge vault to preserve the 1:1 bridge invariant."], "writable": true, "pda": { "seeds": [{ "kind": "const", "value": [102, 101, 101, 95, 118, 97, 117, 108, 116] }] } }, { "name": "user_token_account", "docs": ["Only required for SPL token routes; can be omitted (pass null) on native SOL routes."], "writable": true, "optional": true }, { "name": "gateway_token_account", "docs": ["Only required for SPL token routes; can be omitted (pass null) on native SOL routes."], "writable": true, "optional": true }, { "name": "user", "writable": true, "signer": true }, { "name": "price_update" }, { "name": "rate_limit_config", "docs": ["Rate limit config - REQUIRED for universal entrypoint"], "writable": true, "pda": { "seeds": [{ "kind": "const", "value": [114, 97, 116, 101, 95, 108, 105, 109, 105, 116, 95, 99, 111, 110, 102, 105, 103] }] } }, { "name": "token_rate_limit", "docs": ["Token rate limit - REQUIRED for universal entrypoint", "NOTE: For native SOL, use Pubkey::default() as the token_mint when deriving this PDA"], "writable": true }, { "name": "token_program", "address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" }, { "name": "system_program", "address": "11111111111111111111111111111111" }], "args": [{ "name": "req", "type": { "defined": { "name": "UniversalTxRequest" } } }, { "name": "native_amount", "type": "u64" }] }, { "name": "set_authorities", "docs": ["@notice Update admin and/or pauser authority."], "discriminator": [124, 254, 44, 240, 197, 70, 190, 107], "accounts": [{ "name": "config", "writable": true, "pda": { "seeds": [{ "kind": "const", "value": [99, 111, 110, 102, 105, 103] }] } }, { "name": "admin", "signer": true }], "args": [{ "name": "new_admin", "type": { "option": "pubkey" } }, { "name": "new_pauser", "type": { "option": "pubkey" } }] }, { "name": "set_block_usd_cap", "docs": ["@notice Set block-based USD cap for rate limiting"], "discriminator": [205, 253, 33, 164, 220, 216, 42, 50], "accounts": [{ "name": "config", "writable": true, "pda": { "seeds": [{ "kind": "const", "value": [99, 111, 110, 102, 105, 103] }] } }, { "name": "rate_limit_config", "writable": true, "pda": { "seeds": [{ "kind": "const", "value": [114, 97, 116, 101, 95, 108, 105, 109, 105, 116, 95, 99, 111, 110, 102, 105, 103] }] } }, { "name": "admin", "writable": true, "signer": true }, { "name": "system_program", "address": "11111111111111111111111111111111" }], "args": [{ "name": "block_usd_cap", "type": "u128" }] }, { "name": "set_caps_usd", "docs": ["@notice Set USD caps"], "discriminator": [136, 160, 17, 54, 239, 108, 125, 129], "accounts": [{ "name": "config", "writable": true, "pda": { "seeds": [{ "kind": "const", "value": [99, 111, 110, 102, 105, 103] }] } }, { "name": "admin", "signer": true }], "args": [{ "name": "min_cap", "type": "u128" }, { "name": "max_cap", "type": "u128" }] }, { "name": "set_protocol_fee", "docs": ["@notice Set flat protocol fee (lamports) for inbound send_universal_tx.", "Not gated by `!config.paused` so the admin can disable fees during an emergency pause."], "discriminator": [173, 239, 83, 242, 136, 43, 144, 217], "accounts": [{ "name": "config", "pda": { "seeds": [{ "kind": "const", "value": [99, 111, 110, 102, 105, 103] }] } }, { "name": "fee_vault", "writable": true, "pda": { "seeds": [{ "kind": "const", "value": [102, 101, 101, 95, 118, 97, 117, 108, 116] }] } }, { "name": "admin", "writable": true, "signer": true }, { "name": "system_program", "address": "11111111111111111111111111111111" }], "args": [{ "name": "fee_lamports", "type": "u64" }] }, { "name": "set_pyth_confidence_threshold", "docs": ["@notice Set Pyth confidence threshold"], "discriminator": [213, 69, 242, 123, 122, 165, 125, 21], "accounts": [{ "name": "config", "writable": true, "pda": { "seeds": [{ "kind": "const", "value": [99, 111, 110, 102, 105, 103] }] } }, { "name": "admin", "signer": true }], "args": [{ "name": "threshold", "type": "u64" }] }, { "name": "set_pyth_price_feed", "docs": ["@notice Set Pyth price feed"], "discriminator": [202, 185, 109, 150, 255, 130, 210, 208], "accounts": [{ "name": "config", "writable": true, "pda": { "seeds": [{ "kind": "const", "value": [99, 111, 110, 102, 105, 103] }] } }, { "name": "admin", "signer": true }], "args": [{ "name": "price_feed", "type": "pubkey" }] }, { "name": "set_token_rate_limit", "docs": ["@notice Set token-specific rate limit threshold"], "discriminator": [67, 225, 226, 248, 119, 98, 18, 68], "accounts": [{ "name": "config", "writable": true, "pda": { "seeds": [{ "kind": "const", "value": [99, 111, 110, 102, 105, 103] }] } }, { "name": "token_rate_limit", "writable": true, "pda": { "seeds": [{ "kind": "const", "value": [114, 97, 116, 101, 95, 108, 105, 109, 105, 116] }, { "kind": "account", "path": "token_mint" }] } }, { "name": "token_mint" }, { "name": "admin", "writable": true, "signer": true }, { "name": "system_program", "address": "11111111111111111111111111111111" }], "args": [{ "name": "limit_threshold", "type": "u128" }] }, { "name": "unpause", "docs": ["@notice Unpause the gateway"], "discriminator": [169, 144, 4, 38, 10, 141, 188, 255], "accounts": [{ "name": "config", "writable": true, "pda": { "seeds": [{ "kind": "const", "value": [99, 111, 110, 102, 105, 103] }] } }, { "name": "pauser", "signer": true }], "args": [] }, { "name": "update_epoch_duration", "docs": ["@notice Update epoch duration for rate limiting"], "discriminator": [145, 173, 2, 249, 226, 157, 29, 104], "accounts": [{ "name": "config", "writable": true, "pda": { "seeds": [{ "kind": "const", "value": [99, 111, 110, 102, 105, 103] }] } }, { "name": "rate_limit_config", "writable": true, "pda": { "seeds": [{ "kind": "const", "value": [114, 97, 116, 101, 95, 108, 105, 109, 105, 116, 95, 99, 111, 110, 102, 105, 103] }] } }, { "name": "admin", "writable": true, "signer": true }, { "name": "system_program", "address": "11111111111111111111111111111111" }], "args": [{ "name": "epoch_duration_sec", "type": "u64" }] }, { "name": "update_tss", "discriminator": [227, 136, 3, 242, 177, 168, 10, 160], "accounts": [{ "name": "tss_pda", "writable": true, "pda": { "seeds": [{ "kind": "const", "value": [116, 115, 115, 112, 100, 97, 95, 118, 50] }] } }, { "name": "config", "pda": { "seeds": [{ "kind": "const", "value": [99, 111, 110, 102, 105, 103] }] } }, { "name": "authority", "signer": true }], "args": [{ "name": "tss_eth_address", "type": { "array": ["u8", 20] } }, { "name": "chain_id", "type": "string" }] }], "accounts": [{ "name": "Config", "discriminator": [155, 12, 170, 224, 30, 250, 204, 130] }, { "name": "ExecutedSubTx", "discriminator": [221, 204, 118, 83, 194, 194, 141, 237] }, { "name": "FeeVault", "discriminator": [192, 178, 69, 232, 58, 149, 157, 132] }, { "name": "PriceUpdateV2", "discriminator": [34, 241, 35, 99, 157, 126, 244, 205] }, { "name": "RateLimitConfig", "discriminator": [172, 233, 8, 17, 15, 174, 216, 176] }, { "name": "TokenRateLimit", "discriminator": [129, 99, 70, 230, 57, 181, 132, 97] }, { "name": "TssPda", "discriminator": [121, 138, 162, 251, 127, 95, 238, 135] }], "events": [{ "name": "BlockUsdCapUpdated", "discriminator": [69, 44, 151, 48, 36, 74, 176, 194] }, { "name": "CapsUpdated", "discriminator": [147, 181, 117, 249, 72, 147, 156, 255] }, { "name": "EpochDurationUpdated", "discriminator": [167, 122, 82, 178, 133, 191, 19, 129] }, { "name": "FundsRescued", "discriminator": [159, 37, 6, 93, 98, 122, 176, 210] }, { "name": "ProtocolFeeCollected", "discriminator": [149, 0, 167, 154, 105, 146, 209, 134] }, { "name": "ProtocolFeeReimbursed", "discriminator": [109, 145, 191, 216, 237, 169, 121, 222] }, { "name": "ProtocolFeeUpdated", "discriminator": [172, 56, 83, 113, 219, 69, 69, 105] }, { "name": "RevertUniversalTx", "discriminator": [249, 74, 39, 203, 149, 54, 48, 186] }, { "name": "TokenRateLimitUpdated", "discriminator": [73, 75, 54, 189, 59, 130, 39, 59] }, { "name": "UniversalTx", "discriminator": [108, 154, 216, 41, 181, 234, 29, 124] }, { "name": "UniversalTxFinalized", "discriminator": [179, 64, 150, 112, 117, 140, 156, 37] }], "errors": [{ "code": 6000, "name": "Unauthorized", "msg": "Unauthorized access" }, { "code": 6001, "name": "InvalidAmount", "msg": "Invalid amount" }, { "code": 6002, "name": "InvalidRecipient", "msg": "Invalid recipient" }, { "code": 6003, "name": "BelowMinCap", "msg": "Amount below minimum cap" }, { "code": 6004, "name": "AboveMaxCap", "msg": "Amount above maximum cap" }, { "code": 6005, "name": "ZeroAddress", "msg": "Zero address not allowed" }, { "code": 6006, "name": "InvalidCapRange", "msg": "Invalid cap range" }, { "code": 6007, "name": "InvalidPrice", "msg": "Invalid price data" }, { "code": 6008, "name": "InvalidOwner", "msg": "Invalid owner" }, { "code": 6009, "name": "Paused", "msg": "Contract is paused" }, { "code": 6010, "name": "InvalidInput", "msg": "Invalid input" }, { "code": 6011, "name": "InvalidTxType", "msg": "Invalid transaction type" }, { "code": 6012, "name": "InvalidMint", "msg": "Invalid mint" }, { "code": 6013, "name": "InsufficientBalance", "msg": "Insufficient balance" }, { "code": 6014, "name": "InvalidToken", "msg": "Invalid token" }, { "code": 6015, "name": "BlockUsdCapExceeded", "msg": "Block USD cap exceeded" }, { "code": 6016, "name": "RateLimitExceeded", "msg": "Rate limit exceeded" }, { "code": 6017, "name": "InvalidAccount", "msg": "Invalid account" }, { "code": 6018, "name": "NotSupported", "msg": "Token not supported" }, { "code": 6019, "name": "MessageHashMismatch", "msg": "Message hash mismatch" }, { "code": 6020, "name": "TssAuthFailed", "msg": "TSS authentication failed" }, { "code": 6021, "name": "AccountListLengthMismatch", "msg": "Account list length mismatch" }, { "code": 6022, "name": "AccountPubkeyMismatch", "msg": "Account pubkey mismatch" }, { "code": 6023, "name": "AccountWritableFlagMismatch", "msg": "Account writable flag mismatch" }, { "code": 6024, "name": "UnexpectedOuterSigner", "msg": "Unexpected outer signer in remaining accounts" }, { "code": 6025, "name": "InvalidProgram", "msg": "Destination program is not executable" }, { "code": 6026, "name": "InvalidInstruction", "msg": "Invalid instruction" }, { "code": 6027, "name": "InsufficientProtocolFee", "msg": "Insufficient protocol fee" }, { "code": 6028, "name": "InsufficientFeePool", "msg": "Fee vault has insufficient balance to reimburse relayer" }], "types": [{ "name": "BlockUsdCapUpdated", "type": { "kind": "struct", "fields": [{ "name": "block_usd_cap", "type": "u128" }] } }, { "name": "CapsUpdated", "type": { "kind": "struct", "fields": [{ "name": "min_cap_usd", "type": "u128" }, { "name": "max_cap_usd", "type": "u128" }] } }, { "name": "Config", "docs": ["Gateway configuration state (authorities, caps, oracle).", "PDA: `[b\"config\"]`. Holds USD caps (8 decimals) for gas-route deposits and oracle config."], "type": { "kind": "struct", "fields": [{ "name": "admin", "type": "pubkey" }, { "name": "tss_address", "docs": ["Legacy field \u2014 reserved for account layout compatibility.", "Cannot be removed without a migration because it is part of the deployed on-chain layout."], "type": "pubkey" }, { "name": "pauser", "type": "pubkey" }, { "name": "min_cap_universal_tx_usd", "type": "u128" }, { "name": "max_cap_universal_tx_usd", "type": "u128" }, { "name": "paused", "type": "bool" }, { "name": "bump", "type": "u8" }, { "name": "vault_bump", "type": "u8" }, { "name": "pyth_price_feed", "type": "pubkey" }, { "name": "pyth_confidence_threshold", "type": "u64" }] } }, { "name": "EpochDurationUpdated", "type": { "kind": "struct", "fields": [{ "name": "epoch_duration_sec", "type": "u64" }] } }, { "name": "EpochUsage", "docs": ["Epoch usage tracking for rate limiting (matching EVM EpochUsage struct)"], "type": { "kind": "struct", "fields": [{ "name": "epoch", "type": "u64" }, { "name": "used", "type": "u128" }] } }, { "name": "ExecutedSubTx", "docs": ["Executed transaction tracker (parity with EVM `isExecuted[subTxID]` mapping).", "PDA: `[b\"executed_sub_tx\", sub_tx_id]`.", "Account existence = transaction executed (replay protection via `init` constraint)."], "type": { "kind": "struct", "fields": [] } }, { "name": "FeeVault", "docs": ["Fee vault: holds protocol fee lamports and the per-tx fee config.", "PDA: `[b\"fee_vault\"]`.", "Lamports above rent-exempt minimum = spendable relayer reimbursement pool.", "Vault (bridge funds) is never touched by fee logic \u2014 1:1 invariant is structurally enforced."], "type": { "kind": "struct", "fields": [{ "name": "protocol_fee_lamports", "type": "u64" }, { "name": "bump", "type": "u8" }] } }, { "name": "FundsRescued", "docs": ["Emitted when locked funds are rescued back to recipient via TSS-verified rescue instruction."], "type": { "kind": "struct", "fields": [{ "name": "sub_tx_id", "type": { "array": ["u8", 32] } }, { "name": "universal_tx_id", "type": { "array": ["u8", 32] } }, { "name": "token", "type": "pubkey" }, { "name": "amount", "type": "u64" }, { "name": "revert_instruction", "type": { "defined": { "name": "RevertInstructions" } } }] } }, { "name": "PriceData", "type": { "kind": "struct", "fields": [{ "name": "price", "type": "i64" }, { "name": "exponent", "type": "i32" }, { "name": "publish_time", "type": "i64" }, { "name": "confidence", "type": "u64" }] } }, { "name": "PriceFeedMessage", "repr": { "kind": "c" }, "type": { "kind": "struct", "fields": [{ "name": "feed_id", "docs": ["`FeedId` but avoid the type alias because of compatibility issues with Anchor's `idl-build` feature."], "type": { "array": ["u8", 32] } }, { "name": "price", "type": "i64" }, { "name": "conf", "type": "u64" }, { "name": "exponent", "type": "i32" }, { "name": "publish_time", "docs": ["The timestamp of this price update in seconds"], "type": "i64" }, { "name": "prev_publish_time", "docs": ["The timestamp of the previous price update. This field is intended to allow users to", "identify the single unique price update for any moment in time:", "for any time t, the unique update is the one such that prev_publish_time < t <= publish_time.", "", "Note that there may not be such an update while we are migrating to the new message-sending logic,", "as some price updates on pythnet may not be sent to other chains (because the message-sending", "logic may not have triggered). We can solve this problem by making the message-sending mandatory", "(which we can do once publishers have migrated over).", "", "Additionally, this field may be equal to publish_time if the message is sent on a slot where", "where the aggregation was unsuccesful. This problem will go away once all publishers have", "migrated over to a recent version of pyth-agent."], "type": "i64" }, { "name": "ema_price", "type": "i64" }, { "name": "ema_conf", "type": "u64" }] } }, { "name": "PriceUpdateV2", "docs": ["A price update account. This account is used by the Pyth Receiver program to store a verified price update from a Pyth price feed.", "It contains:", "- `write_authority`: The write authority for this account. This authority can close this account to reclaim rent or update the account to contain a different price update.", "- `verification_level`: The [`VerificationLevel`] of this price update. This represents how many Wormhole guardian signatures have been verified for this price update.", "- `price_message`: The actual price update.", "- `posted_slot`: The slot at which this price update was posted."], "type": { "kind": "struct", "fields": [{ "name": "write_authority", "type": "pubkey" }, { "name": "verification_level", "type": { "defined": { "name": "VerificationLevel" } } }, { "name": "price_message", "type": { "defined": { "name": "PriceFeedMessage" } } }, { "name": "posted_slot", "type": "u64" }] } }, { "name": "ProtocolFeeCollected", "type": { "kind": "struct", "fields": [{ "name": "payer", "type": "pubkey" }, { "name": "amount_lamports", "type": "u64" }, { "name": "native_amount_before", "type": "u64" }, { "name": "native_amount_after", "type": "u64" }] } }, { "name": "ProtocolFeeReimbursed", "type": { "kind": "struct", "fields": [{ "name": "sub_tx_id", "type": { "array": ["u8", 32] } }, { "name": "relayer", "type": "pubkey" }, { "name": "amount_lamports", "type": "u64" }] } }, { "name": "ProtocolFeeUpdated", "type": { "kind": "struct", "fields": [{ "name": "new_fee_lamports", "type": "u64" }] } }, { "name": "RateLimitConfig", "docs": ["Rate limiting configuration (separate account for backward compatibility)", "PDA: `[b\"rate_limit_config\"]`. Stores global rate limiting settings."], "type": { "kind": "struct", "fields": [{ "name": "block_usd_cap", "type": "u128" }, { "name": "epoch_duration_sec", "type": "u64" }, { "name": "last_slot", "type": "u64" }, { "name": "consumed_usd_in_block", "type": "u128" }, { "name": "bump", "type": "u8" }] } }, { "name": "RevertInstructions", "docs": ["Revert instructions for failed transactions (parity with EVM `RevertInstructions`)."], "type": { "kind": "struct", "fields": [{ "name": "revert_recipient", "type": "pubkey" }, { "name": "revert_msg", "type": "bytes" }] } }, { "name": "RevertUniversalTx", "docs": ["Revert withdraw event (parity with EVM `RevertUniversalTx`)."], "type": { "kind": "struct", "fields": [{ "name": "sub_tx_id", "type": { "array": ["u8", 32] } }, { "name": "universal_tx_id", "type": { "array": ["u8", 32] } }, { "name": "revert_recipient", "type": "pubkey" }, { "name": "token", "type": "pubkey" }, { "name": "amount", "type": "u64" }, { "name": "revert_instruction", "type": { "defined": { "name": "RevertInstructions" } } }] } }, { "name": "TokenRateLimit", "docs": ["Token-specific rate limiting state (matching EVM implementation)", "PDA: `[b\"rate_limit\", token_mint]`. Tracks epoch-based usage per token."], "type": { "kind": "struct", "fields": [{ "name": "token_mint", "type": "pubkey" }, { "name": "limit_threshold", "type": "u128" }, { "name": "epoch_usage", "type": { "defined": { "name": "EpochUsage" } } }, { "name": "bump", "type": "u8" }] } }, { "name": "TokenRateLimitUpdated", "type": { "kind": "struct", "fields": [{ "name": "token_mint", "type": "pubkey" }, { "name": "limit_threshold", "type": "u128" }] } }, { "name": "TssPda", "docs": ["TSS state PDA for ECDSA verification (Ethereum-style secp256k1).", "Stores 20-byte ETH address and chain id (Solana cluster pubkey as String)."], "type": { "kind": "struct", "fields": [{ "name": "tss_eth_address", "type": { "array": ["u8", 20] } }, { "name": "chain_id", "type": "string" }, { "name": "authority", "docs": ["Legacy field \u2014 set at init_tss but no longer used for authorization.", "update_tss now checks config.admin. Kept for account layout compatibility."], "type": "pubkey" }, { "name": "bump", "type": "u8" }] } }, { "name": "TxType", "docs": ["Transaction types matching the EVM Universal Gateway `TX_TYPE`.", "Kept 1:1 for relayer/event parity with the EVM implementation."], "type": { "kind": "enum", "variants": [{ "name": "Gas" }, { "name": "GasAndPayload" }, { "name": "Funds" }, { "name": "FundsAndPayload" }] } }, { "name": "UniversalTx", "docs": ["Universal transaction event (parity with EVM V0 `UniversalTx`).", "Single event for both gas funding and funds movement."], "type": { "kind": "struct", "fields": [{ "name": "sender", "type": "pubkey" }, { "name": "recipient", "type": { "array": ["u8", 20] } }, { "name": "token", "type": "pubkey" }, { "name": "amount", "type": "u64" }, { "name": "payload", "type": "bytes" }, { "name": "revert_recipient", "type": "pubkey" }, { "name": "tx_type", "type": { "defined": { "name": "TxType" } } }, { "name": "signature_data", "type": "bytes" }, { "name": "from_cea", "type": "bool" }] } }, { "name": "UniversalTxFinalized", "docs": ["Execute event (parity with EVM `UniversalTxFinalized`)."], "type": { "kind": "struct", "fields": [{ "name": "sub_tx_id", "type": { "array": ["u8", 32] } }, { "name": "universal_tx_id", "type": { "array": ["u8", 32] } }, { "name": "push_account", "type": { "array": ["u8", 20] } }, { "name": "target", "type": "pubkey" }, { "name": "token", "type": "pubkey" }, { "name": "amount", "type": "u64" }, { "name": "payload", "type": "bytes" }] } }, { "name": "UniversalTxRequest", "docs": ["Universal transaction request (parity with EVM `UniversalTxRequest`)."], "type": { "kind": "struct", "fields": [{ "name": "recipient", "type": { "array": ["u8", 20] } }, { "name": "token", "type": "pubkey" }, { "name": "amount", "type": "u64" }, { "name": "payload", "type": "bytes" }, { "name": "revert_recipient", "type": "pubkey" }, { "name": "signature_data", "type": "bytes" }] } }, { "name": "VerificationLevel", "docs": ["Pyth price updates are bridged to all blockchains via Wormhole.", "Using the price updates on another chain requires verifying the signatures of the Wormhole guardians.", "The usual process is to check the signatures for two thirds of the total number of guardians, but this can be cumbersome on Solana because of the transaction size limits,", "so we also allow for partial verification.", "", "This enum represents how much a price update has been verified:", "- If `Full`, we have verified the signatures for two thirds of the current guardians.", "- If `Partial`, only `num_signatures` guardian signatures have been checked.", "", "# Warning", "Using partially verified price updates is dangerous, as it lowers the threshold of guardians that need to collude to produce a malicious price update."], "type": { "kind": "enum", "variants": [{ "name": "Partial", "fields": [{ "name": "num_signatures", "type": "u8" }] }, { "name": "Full" }] } }] }
|
|
1
|
+
{ "address": "CFVSincHYbETh2k7w6u1ENEkjbSLtveRCEBupKidw2VS", "metadata": { "name": "universal_gateway", "version": "0.1.0", "spec": "0.1.0", "description": "Universal Gateway for Solana - Cross-chain bridge and transaction router" }, "instructions": [{ "name": "finalize_universal_tx", "docs": ["@notice Unified outbound entrypoint: withdraw (mode 1) or execute (mode 2)", "@param instruction_id 1=withdraw (vault→CEA→recipient), 2=execute (vault→CEA→CPI)"], "discriminator": [222, 91, 238, 150, 75, 216, 2, 80], "accounts": [{ "name": "caller", "writable": true, "signer": true }, { "name": "config", "pda": { "seeds": [{ "kind": "const", "value": [99, 111, 110, 102, 105, 103] }] } }, { "name": "vault_sol", "docs": ["Vault SOL PDA - holds all bridged SOL"], "writable": true, "pda": { "seeds": [{ "kind": "const", "value": [118, 97, 117, 108, 116] }] } }, { "name": "cea_authority", "docs": ["CEA (Chain Executor Account) - persistent identity per Push Chain user", "This PDA represents the user on Solana and can sign for target programs", "Auto-created by Solana on first transfer, persists across transactions"], "writable": true, "pda": { "seeds": [{ "kind": "const", "value": [112, 117, 115, 104, 95, 105, 100, 101, 110, 116, 105, 116, 121] }, { "kind": "arg", "path": "push_account" }] } }, { "name": "tss_pda", "writable": true, "pda": { "seeds": [{ "kind": "const", "value": [116, 115, 115, 112, 100, 97, 95, 118, 50] }] } }, { "name": "executed_sub_tx", "docs": ["Executed transaction tracker (replay protection)", "Relayer pays for this account creation and gets reimbursed via gas_fee"], "writable": true, "pda": { "seeds": [{ "kind": "const", "value": [101, 120, 101, 99, 117, 116, 101, 100, 95, 115, 117, 98, 95, 116, 120] }, { "kind": "arg", "path": "sub_tx_id" }] } }, { "name": "system_program", "address": "11111111111111111111111111111111" }, { "name": "destination_program", "docs": ["Pass system program id for withdraw, it's ignored"] }, { "name": "recipient", "writable": true, "optional": true }, { "name": "vault_ata", "docs": ["Vault ATA for this mint — always initialized (deposit path guarantees existence)"], "writable": true, "optional": true }, { "name": "cea_ata", "writable": true, "optional": true }, { "name": "mint", "optional": true }, { "name": "token_program", "optional": true, "address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" }, { "name": "rent", "optional": true, "address": "SysvarRent111111111111111111111111111111111" }, { "name": "associated_token_program", "optional": true, "address": "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" }, { "name": "recipient_ata", "writable": true, "optional": true }, { "name": "rate_limit_config", "optional": true, "pda": { "seeds": [{ "kind": "const", "value": [114, 97, 116, 101, 95, 108, 105, 109, 105, 116, 95, 99, 111, 110, 102, 105, 103] }] } }, { "name": "token_rate_limit", "docs": ["Token-specific rate limit state (CEA withdrawal path only)"], "writable": true, "optional": true }], "args": [{ "name": "instruction_id", "type": "u8" }, { "name": "sub_tx_id", "type": { "array": ["u8", 32] } }, { "name": "universal_tx_id", "type": { "array": ["u8", 32] } }, { "name": "amount", "type": "u64" }, { "name": "push_account", "type": { "array": ["u8", 20] } }, { "name": "writable_flags", "type": "bytes" }, { "name": "ix_data", "type": "bytes" }, { "name": "gas_fee", "type": "u64" }, { "name": "signature", "type": { "array": ["u8", 64] } }, { "name": "recovery_id", "type": "u8" }, { "name": "message_hash", "type": { "array": ["u8", 32] } }] }, { "name": "get_sol_price", "docs": ["@notice View function for SOL price (locker-compatible)"], "discriminator": [230, 145, 206, 175, 43, 184, 97, 110], "accounts": [{ "name": "price_update" }], "args": [], "returns": { "defined": { "name": "PriceData" } } }, { "name": "init_tss", "discriminator": [47, 31, 100, 111, 115, 2, 22, 208], "accounts": [{ "name": "tss_pda", "writable": true, "pda": { "seeds": [{ "kind": "const", "value": [116, 115, 115, 112, 100, 97, 95, 118, 50] }] } }, { "name": "config", "pda": { "seeds": [{ "kind": "const", "value": [99, 111, 110, 102, 105, 103] }] } }, { "name": "authority", "writable": true, "signer": true }, { "name": "system_program", "address": "11111111111111111111111111111111" }], "args": [{ "name": "tss_eth_address", "type": { "array": ["u8", 20] } }, { "name": "chain_id", "type": "string" }] }, { "name": "initialize", "docs": ["@notice Initialize the gateway"], "discriminator": [175, 175, 109, 31, 13, 152, 155, 237], "accounts": [{ "name": "config", "writable": true, "pda": { "seeds": [{ "kind": "const", "value": [99, 111, 110, 102, 105, 103] }] } }, { "name": "vault", "writable": true, "pda": { "seeds": [{ "kind": "const", "value": [118, 97, 117, 108, 116] }] } }, { "name": "admin", "writable": true, "signer": true }, { "name": "system_program", "address": "11111111111111111111111111111111" }], "args": [{ "name": "admin", "type": "pubkey" }, { "name": "pauser", "type": "pubkey" }, { "name": "tss", "type": "pubkey" }, { "name": "min_cap_usd", "type": "u128" }, { "name": "max_cap_usd", "type": "u128" }, { "name": "pyth_price_feed", "type": "pubkey" }] }, { "name": "pause", "docs": ["@notice Pause the gateway"], "discriminator": [211, 22, 221, 251, 74, 121, 193, 47], "accounts": [{ "name": "config", "writable": true, "pda": { "seeds": [{ "kind": "const", "value": [99, 111, 110, 102, 105, 103] }] } }, { "name": "pauser", "signer": true }], "args": [] }, { "name": "rescue_funds", "docs": ["@notice TSS-verified emergency rescue of locked funds from vault.", "SOL path: token_mint = None. SPL path: token_mint = Some.", "Replay-protected via ExecutedSubTx PDA"], "discriminator": [238, 204, 8, 81, 89, 43, 193, 103], "accounts": [{ "name": "config", "pda": { "seeds": [{ "kind": "const", "value": [99, 111, 110, 102, 105, 103] }] } }, { "name": "vault", "writable": true, "pda": { "seeds": [{ "kind": "const", "value": [118, 97, 117, 108, 116] }] } }, { "name": "fee_vault", "docs": ["Fee vault — relayer gas reimbursement source."], "writable": true, "pda": { "seeds": [{ "kind": "const", "value": [102, 101, 101, 95, 118, 97, 117, 108, 116] }] } }, { "name": "tss_pda", "writable": true, "pda": { "seeds": [{ "kind": "const", "value": [116, 115, 115, 112, 100, 97, 95, 118, 50] }] } }, { "name": "recipient", "docs": ["recipient_token_account.owner and used as the canonical identity in the TSS message."], "writable": true }, { "name": "executed_sub_tx", "docs": ["Replay protection (EVM parity: isExecuted[subTxId])."], "writable": true, "pda": { "seeds": [{ "kind": "const", "value": [101, 120, 101, 99, 117, 116, 101, 100, 95, 115, 117, 98, 95, 116, 120] }, { "kind": "arg", "path": "sub_tx_id" }] } }, { "name": "caller", "docs": ["The caller/relayer — pays transaction fees, receives gas_fee reimbursement."], "writable": true, "signer": true }, { "name": "system_program", "address": "11111111111111111111111111111111" }, { "name": "token_vault", "docs": ["Vault ATA for this mint — holds bridged SPL tokens."], "writable": true, "optional": true }, { "name": "recipient_token_account", "docs": ["Recipient token account — must be owned by recipient and match token_mint."], "writable": true, "optional": true }, { "name": "token_mint", "optional": true }, { "name": "token_program", "optional": true, "address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" }], "args": [{ "name": "sub_tx_id", "type": { "array": ["u8", 32] } }, { "name": "universal_tx_id", "type": { "array": ["u8", 32] } }, { "name": "amount", "type": "u64" }, { "name": "gas_fee", "type": "u64" }, { "name": "signature", "type": { "array": ["u8", 64] } }, { "name": "recovery_id", "type": "u8" }, { "name": "message_hash", "type": { "array": ["u8", 32] } }] }, { "name": "revert_universal_tx", "docs": ["@notice TSS-verified unified revert (SOL and SPL) — EVM parity: `revertUniversalTx`.", "SOL path: token_mint = None. SPL path: token_mint = Some."], "discriminator": [124, 49, 81, 233, 23, 147, 82, 122], "accounts": [{ "name": "config", "pda": { "seeds": [{ "kind": "const", "value": [99, 111, 110, 102, 105, 103] }] } }, { "name": "vault", "writable": true, "pda": { "seeds": [{ "kind": "const", "value": [118, 97, 117, 108, 116] }] } }, { "name": "fee_vault", "docs": ["Fee vault — relayer gas reimbursement source."], "writable": true, "pda": { "seeds": [{ "kind": "const", "value": [102, 101, 101, 95, 118, 97, 117, 108, 116] }] } }, { "name": "tss_pda", "writable": true, "pda": { "seeds": [{ "kind": "const", "value": [116, 115, 115, 112, 100, 97, 95, 118, 50] }] } }, { "name": "recipient", "docs": ["recipient_token_account.owner and used as canonical identity in TSS message."], "writable": true }, { "name": "executed_sub_tx", "docs": ["Replay protection (EVM parity: isExecuted[subTxId])."], "writable": true, "pda": { "seeds": [{ "kind": "const", "value": [101, 120, 101, 99, 117, 116, 101, 100, 95, 115, 117, 98, 95, 116, 120] }, { "kind": "arg", "path": "sub_tx_id" }] } }, { "name": "caller", "docs": ["The caller/relayer — pays transaction fees, receives gas_fee reimbursement."], "writable": true, "signer": true }, { "name": "system_program", "address": "11111111111111111111111111111111" }, { "name": "token_vault", "docs": ["Vault ATA for this mint — holds bridged SPL tokens."], "writable": true, "optional": true }, { "name": "recipient_token_account", "docs": ["Recipient token account — must be owned by recipient and match token_mint."], "writable": true, "optional": true }, { "name": "token_mint", "optional": true }, { "name": "token_program", "optional": true, "address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" }], "args": [{ "name": "sub_tx_id", "type": { "array": ["u8", 32] } }, { "name": "universal_tx_id", "type": { "array": ["u8", 32] } }, { "name": "amount", "type": "u64" }, { "name": "revert_instruction", "type": { "defined": { "name": "RevertInstructions" } } }, { "name": "gas_fee", "type": "u64" }, { "name": "signature", "type": { "array": ["u8", 64] } }, { "name": "recovery_id", "type": "u8" }, { "name": "message_hash", "type": { "array": ["u8", 32] } }] }, { "name": "send_universal_tx", "docs": ["@notice Universal transaction entrypoint with internal routing (EVM parity).", "@dev Native amount parameter mirrors `msg.value` on EVM chains.", "All routing (gas / funds / batching) is handled inside the deposit module."], "discriminator": [145, 19, 164, 55, 165, 220, 23, 97], "accounts": [{ "name": "config", "pda": { "seeds": [{ "kind": "const", "value": [99, 111, 110, 102, 105, 103] }] } }, { "name": "vault", "writable": true, "pda": { "seeds": [{ "kind": "const", "value": [118, 97, 117, 108, 116] }] } }, { "name": "fee_vault", "docs": ["Fee vault: receives the flat protocol fee per inbound tx.", "Separate from bridge vault to preserve the 1:1 bridge invariant."], "writable": true, "pda": { "seeds": [{ "kind": "const", "value": [102, 101, 101, 95, 118, 97, 117, 108, 116] }] } }, { "name": "user_token_account", "docs": ["Only required for SPL token routes; can be omitted (pass null) on native SOL routes."], "writable": true, "optional": true }, { "name": "gateway_token_account", "docs": ["Only required for SPL token routes; can be omitted (pass null) on native SOL routes."], "writable": true, "optional": true }, { "name": "user", "writable": true, "signer": true }, { "name": "price_update" }, { "name": "rate_limit_config", "docs": ["Rate limit config - REQUIRED for universal entrypoint"], "writable": true, "pda": { "seeds": [{ "kind": "const", "value": [114, 97, 116, 101, 95, 108, 105, 109, 105, 116, 95, 99, 111, 110, 102, 105, 103] }] } }, { "name": "token_rate_limit", "docs": ["Token rate limit - REQUIRED for universal entrypoint", "NOTE: For native SOL, use Pubkey::default() as the token_mint when deriving this PDA"], "writable": true }, { "name": "token_program", "address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" }, { "name": "system_program", "address": "11111111111111111111111111111111" }], "args": [{ "name": "req", "type": { "defined": { "name": "UniversalTxRequest" } } }, { "name": "native_amount", "type": "u64" }] }, { "name": "set_authorities", "docs": ["@notice Update admin and/or pauser authority."], "discriminator": [124, 254, 44, 240, 197, 70, 190, 107], "accounts": [{ "name": "config", "writable": true, "pda": { "seeds": [{ "kind": "const", "value": [99, 111, 110, 102, 105, 103] }] } }, { "name": "admin", "signer": true }], "args": [{ "name": "new_admin", "type": { "option": "pubkey" } }, { "name": "new_pauser", "type": { "option": "pubkey" } }] }, { "name": "set_block_usd_cap", "docs": ["@notice Set block-based USD cap for rate limiting"], "discriminator": [205, 253, 33, 164, 220, 216, 42, 50], "accounts": [{ "name": "config", "writable": true, "pda": { "seeds": [{ "kind": "const", "value": [99, 111, 110, 102, 105, 103] }] } }, { "name": "rate_limit_config", "writable": true, "pda": { "seeds": [{ "kind": "const", "value": [114, 97, 116, 101, 95, 108, 105, 109, 105, 116, 95, 99, 111, 110, 102, 105, 103] }] } }, { "name": "admin", "writable": true, "signer": true }, { "name": "system_program", "address": "11111111111111111111111111111111" }], "args": [{ "name": "block_usd_cap", "type": "u128" }] }, { "name": "set_caps_usd", "docs": ["@notice Set USD caps"], "discriminator": [136, 160, 17, 54, 239, 108, 125, 129], "accounts": [{ "name": "config", "writable": true, "pda": { "seeds": [{ "kind": "const", "value": [99, 111, 110, 102, 105, 103] }] } }, { "name": "admin", "signer": true }], "args": [{ "name": "min_cap", "type": "u128" }, { "name": "max_cap", "type": "u128" }] }, { "name": "set_protocol_fee", "docs": ["@notice Set flat protocol fee (lamports) for inbound send_universal_tx.", "Not gated by `!config.paused` so the admin can disable fees during an emergency pause."], "discriminator": [173, 239, 83, 242, 136, 43, 144, 217], "accounts": [{ "name": "config", "pda": { "seeds": [{ "kind": "const", "value": [99, 111, 110, 102, 105, 103] }] } }, { "name": "fee_vault", "writable": true, "pda": { "seeds": [{ "kind": "const", "value": [102, 101, 101, 95, 118, 97, 117, 108, 116] }] } }, { "name": "admin", "writable": true, "signer": true }, { "name": "system_program", "address": "11111111111111111111111111111111" }], "args": [{ "name": "fee_lamports", "type": "u64" }] }, { "name": "set_pyth_confidence_threshold", "docs": ["@notice Set Pyth confidence threshold"], "discriminator": [213, 69, 242, 123, 122, 165, 125, 21], "accounts": [{ "name": "config", "writable": true, "pda": { "seeds": [{ "kind": "const", "value": [99, 111, 110, 102, 105, 103] }] } }, { "name": "admin", "signer": true }], "args": [{ "name": "threshold", "type": "u64" }] }, { "name": "set_pyth_price_feed", "docs": ["@notice Set Pyth price feed"], "discriminator": [202, 185, 109, 150, 255, 130, 210, 208], "accounts": [{ "name": "config", "writable": true, "pda": { "seeds": [{ "kind": "const", "value": [99, 111, 110, 102, 105, 103] }] } }, { "name": "admin", "signer": true }], "args": [{ "name": "price_feed", "type": "pubkey" }] }, { "name": "set_token_rate_limit", "docs": ["@notice Set token-specific rate limit threshold"], "discriminator": [67, 225, 226, 248, 119, 98, 18, 68], "accounts": [{ "name": "config", "writable": true, "pda": { "seeds": [{ "kind": "const", "value": [99, 111, 110, 102, 105, 103] }] } }, { "name": "token_rate_limit", "writable": true, "pda": { "seeds": [{ "kind": "const", "value": [114, 97, 116, 101, 95, 108, 105, 109, 105, 116] }, { "kind": "account", "path": "token_mint" }] } }, { "name": "token_mint" }, { "name": "admin", "writable": true, "signer": true }, { "name": "system_program", "address": "11111111111111111111111111111111" }], "args": [{ "name": "limit_threshold", "type": "u128" }] }, { "name": "unpause", "docs": ["@notice Unpause the gateway"], "discriminator": [169, 144, 4, 38, 10, 141, 188, 255], "accounts": [{ "name": "config", "writable": true, "pda": { "seeds": [{ "kind": "const", "value": [99, 111, 110, 102, 105, 103] }] } }, { "name": "pauser", "signer": true }], "args": [] }, { "name": "update_epoch_duration", "docs": ["@notice Update epoch duration for rate limiting"], "discriminator": [145, 173, 2, 249, 226, 157, 29, 104], "accounts": [{ "name": "config", "writable": true, "pda": { "seeds": [{ "kind": "const", "value": [99, 111, 110, 102, 105, 103] }] } }, { "name": "rate_limit_config", "writable": true, "pda": { "seeds": [{ "kind": "const", "value": [114, 97, 116, 101, 95, 108, 105, 109, 105, 116, 95, 99, 111, 110, 102, 105, 103] }] } }, { "name": "admin", "writable": true, "signer": true }, { "name": "system_program", "address": "11111111111111111111111111111111" }], "args": [{ "name": "epoch_duration_sec", "type": "u64" }] }, { "name": "update_tss", "discriminator": [227, 136, 3, 242, 177, 168, 10, 160], "accounts": [{ "name": "tss_pda", "writable": true, "pda": { "seeds": [{ "kind": "const", "value": [116, 115, 115, 112, 100, 97, 95, 118, 50] }] } }, { "name": "config", "pda": { "seeds": [{ "kind": "const", "value": [99, 111, 110, 102, 105, 103] }] } }, { "name": "authority", "signer": true }], "args": [{ "name": "tss_eth_address", "type": { "array": ["u8", 20] } }, { "name": "chain_id", "type": "string" }] }], "accounts": [{ "name": "Config", "discriminator": [155, 12, 170, 224, 30, 250, 204, 130] }, { "name": "ExecutedSubTx", "discriminator": [221, 204, 118, 83, 194, 194, 141, 237] }, { "name": "FeeVault", "discriminator": [192, 178, 69, 232, 58, 149, 157, 132] }, { "name": "PriceUpdateV2", "discriminator": [34, 241, 35, 99, 157, 126, 244, 205] }, { "name": "RateLimitConfig", "discriminator": [172, 233, 8, 17, 15, 174, 216, 176] }, { "name": "TokenRateLimit", "discriminator": [129, 99, 70, 230, 57, 181, 132, 97] }, { "name": "TssPda", "discriminator": [121, 138, 162, 251, 127, 95, 238, 135] }], "events": [{ "name": "BlockUsdCapUpdated", "discriminator": [69, 44, 151, 48, 36, 74, 176, 194] }, { "name": "CapsUpdated", "discriminator": [147, 181, 117, 249, 72, 147, 156, 255] }, { "name": "EpochDurationUpdated", "discriminator": [167, 122, 82, 178, 133, 191, 19, 129] }, { "name": "FundsRescued", "discriminator": [159, 37, 6, 93, 98, 122, 176, 210] }, { "name": "OperatorChanged", "discriminator": [231, 79, 62, 226, 190, 139, 176, 51] }, { "name": "ProtocolFeeCollected", "discriminator": [149, 0, 167, 154, 105, 146, 209, 134] }, { "name": "ProtocolFeeReimbursed", "discriminator": [109, 145, 191, 216, 237, 169, 121, 222] }, { "name": "ProtocolFeeUpdated", "discriminator": [172, 56, 83, 113, 219, 69, 69, 105] }, { "name": "RevertUniversalTx", "discriminator": [249, 74, 39, 203, 149, 54, 48, 186] }, { "name": "TokenRateLimitUpdated", "discriminator": [73, 75, 54, 189, 59, 130, 39, 59] }, { "name": "UniversalTx", "discriminator": [108, 154, 216, 41, 181, 234, 29, 124] }, { "name": "UniversalTxFinalized", "discriminator": [179, 64, 150, 112, 117, 140, 156, 37] }], "errors": [{ "code": 6000, "name": "Unauthorized", "msg": "Unauthorized access" }, { "code": 6001, "name": "InvalidAmount", "msg": "Invalid amount" }, { "code": 6002, "name": "InvalidRecipient", "msg": "Invalid recipient" }, { "code": 6003, "name": "BelowMinCap", "msg": "Amount below minimum cap" }, { "code": 6004, "name": "AboveMaxCap", "msg": "Amount above maximum cap" }, { "code": 6005, "name": "ZeroAddress", "msg": "Zero address not allowed" }, { "code": 6006, "name": "InvalidCapRange", "msg": "Invalid cap range" }, { "code": 6007, "name": "InvalidPrice", "msg": "Invalid price data" }, { "code": 6008, "name": "InvalidOwner", "msg": "Invalid owner" }, { "code": 6009, "name": "Paused", "msg": "Contract is paused" }, { "code": 6010, "name": "InvalidInput", "msg": "Invalid input" }, { "code": 6011, "name": "InvalidTxType", "msg": "Invalid transaction type" }, { "code": 6012, "name": "InvalidMint", "msg": "Invalid mint" }, { "code": 6013, "name": "InsufficientBalance", "msg": "Insufficient balance" }, { "code": 6014, "name": "InvalidToken", "msg": "Invalid token" }, { "code": 6015, "name": "BlockUsdCapExceeded", "msg": "Block USD cap exceeded" }, { "code": 6016, "name": "RateLimitExceeded", "msg": "Rate limit exceeded" }, { "code": 6017, "name": "InvalidAccount", "msg": "Invalid account" }, { "code": 6018, "name": "NotSupported", "msg": "Token not supported" }, { "code": 6019, "name": "MessageHashMismatch", "msg": "Message hash mismatch" }, { "code": 6020, "name": "TssAuthFailed", "msg": "TSS authentication failed" }, { "code": 6021, "name": "AccountListLengthMismatch", "msg": "Account list length mismatch" }, { "code": 6022, "name": "AccountPubkeyMismatch", "msg": "Account pubkey mismatch" }, { "code": 6023, "name": "AccountWritableFlagMismatch", "msg": "Account writable flag mismatch" }, { "code": 6024, "name": "UnexpectedOuterSigner", "msg": "Unexpected outer signer in remaining accounts" }, { "code": 6025, "name": "InvalidProgram", "msg": "Destination program is not executable" }, { "code": 6026, "name": "InvalidInstruction", "msg": "Invalid instruction" }, { "code": 6027, "name": "InsufficientInboundFee", "msg": "Insufficient inbound fee" }, { "code": 6028, "name": "InsufficientFeePool", "msg": "Fee vault has insufficient balance to reimburse relayer" }, { "code": 6029, "name": "InsufficientGasBudget", "msg": "gas_fee is below the minimum required gas_used for this finalize" }], "types": [{ "name": "BlockUsdCapUpdated", "type": { "kind": "struct", "fields": [{ "name": "block_usd_cap", "type": "u128" }] } }, { "name": "CapsUpdated", "type": { "kind": "struct", "fields": [{ "name": "min_cap_usd", "type": "u128" }, { "name": "max_cap_usd", "type": "u128" }] } }, { "name": "Config", "docs": ["Gateway configuration state (authorities, caps, oracle).", "PDA: `[b\"config\"]`. Holds USD caps (8 decimals) for gas-route deposits and oracle config."], "type": { "kind": "struct", "fields": [{ "name": "admin", "type": "pubkey" }, { "name": "operator", "docs": ["Operator authority (reusing legacy slot to preserve deployed account layout).", "This field previously held an unused legacy value (`tss_address`)."], "type": "pubkey" }, { "name": "pauser", "type": "pubkey" }, { "name": "min_cap_universal_tx_usd", "type": "u128" }, { "name": "max_cap_universal_tx_usd", "type": "u128" }, { "name": "paused", "type": "bool" }, { "name": "bump", "type": "u8" }, { "name": "vault_bump", "type": "u8" }, { "name": "pyth_price_feed", "type": "pubkey" }, { "name": "pyth_confidence_threshold", "type": "u64" }, { "name": "pending_admin", "type": "pubkey" }, { "name": "pending_pauser", "type": "pubkey" }, { "name": "pyth_max_age_seconds", "docs": ["Maximum allowed age for Pyth price updates (seconds). Admin-configurable.", "Default: 60. Applies to inbound gas-route USD cap enforcement only."], "type": "u64" }] } }, { "name": "EpochDurationUpdated", "type": { "kind": "struct", "fields": [{ "name": "epoch_duration_sec", "type": "u64" }] } }, { "name": "EpochUsage", "docs": ["Epoch usage tracking for rate limiting (matching EVM EpochUsage struct)"], "type": { "kind": "struct", "fields": [{ "name": "epoch", "type": "u64" }, { "name": "used", "type": "u128" }] } }, { "name": "ExecutedSubTx", "docs": ["Executed transaction tracker (parity with EVM `isExecuted[subTxID]` mapping).", "PDA: `[b\"executed_sub_tx\", sub_tx_id]`.", "Account existence = transaction executed (replay protection via `init` constraint)."], "type": { "kind": "struct", "fields": [] } }, { "name": "FeeVault", "docs": ["Fee vault: holds inbound protocol fees and relayer reimbursement config.", "PDA: `[b\"fee_vault\"]`.", "Vault bridge funds are never touched by fee logic."], "type": { "kind": "struct", "fields": [{ "name": "inbound_fee_lamports", "type": "u64" }, { "name": "bump", "type": "u8" }] } }, { "name": "FundsRescued", "docs": ["Emitted when locked funds are rescued back to recipient via TSS-verified rescue instruction."], "type": { "kind": "struct", "fields": [{ "name": "sub_tx_id", "type": { "array": ["u8", 32] } }, { "name": "universal_tx_id", "type": { "array": ["u8", 32] } }, { "name": "token", "type": "pubkey" }, { "name": "amount", "type": "u64" }, { "name": "revert_instruction", "type": { "defined": { "name": "RevertInstructions" } } }] } }, { "name": "PriceData", "type": { "kind": "struct", "fields": [{ "name": "price", "type": "i64" }, { "name": "exponent", "type": "i32" }, { "name": "publish_time", "type": "i64" }, { "name": "confidence", "type": "u64" }] } }, { "name": "PriceFeedMessage", "repr": { "kind": "c" }, "type": { "kind": "struct", "fields": [{ "name": "feed_id", "docs": ["`FeedId` but avoid the type alias because of compatibility issues with Anchor's `idl-build` feature."], "type": { "array": ["u8", 32] } }, { "name": "price", "type": "i64" }, { "name": "conf", "type": "u64" }, { "name": "exponent", "type": "i32" }, { "name": "publish_time", "docs": ["The timestamp of this price update in seconds"], "type": "i64" }, { "name": "prev_publish_time", "docs": ["The timestamp of the previous price update. This field is intended to allow users to", "identify the single unique price update for any moment in time:", "for any time t, the unique update is the one such that prev_publish_time < t <= publish_time.", "", "Note that there may not be such an update while we are migrating to the new message-sending logic,", "as some price updates on pythnet may not be sent to other chains (because the message-sending", "logic may not have triggered). We can solve this problem by making the message-sending mandatory", "(which we can do once publishers have migrated over).", "", "Additionally, this field may be equal to publish_time if the message is sent on a slot where", "where the aggregation was unsuccesful. This problem will go away once all publishers have", "migrated over to a recent version of pyth-agent."], "type": "i64" }, { "name": "ema_price", "type": "i64" }, { "name": "ema_conf", "type": "u64" }] } }, { "name": "PriceUpdateV2", "docs": ["A price update account. This account is used by the Pyth Receiver program to store a verified price update from a Pyth price feed.", "It contains:", "- `write_authority`: The write authority for this account. This authority can close this account to reclaim rent or update the account to contain a different price update.", "- `verification_level`: The [`VerificationLevel`] of this price update. This represents how many Wormhole guardian signatures have been verified for this price update.", "- `price_message`: The actual price update.", "- `posted_slot`: The slot at which this price update was posted."], "type": { "kind": "struct", "fields": [{ "name": "write_authority", "type": "pubkey" }, { "name": "verification_level", "type": { "defined": { "name": "VerificationLevel" } } }, { "name": "price_message", "type": { "defined": { "name": "PriceFeedMessage" } } }, { "name": "posted_slot", "type": "u64" }] } }, { "name": "ProtocolFeeCollected", "type": { "kind": "struct", "fields": [{ "name": "payer", "type": "pubkey" }, { "name": "amount_lamports", "type": "u64" }, { "name": "native_amount_before", "type": "u64" }, { "name": "native_amount_after", "type": "u64" }] } }, { "name": "ProtocolFeeReimbursed", "type": { "kind": "struct", "fields": [{ "name": "sub_tx_id", "type": { "array": ["u8", 32] } }, { "name": "relayer", "type": "pubkey" }, { "name": "amount_lamports", "type": "u64" }] } }, { "name": "ProtocolFeeUpdated", "type": { "kind": "struct", "fields": [{ "name": "new_fee_lamports", "type": "u64" }] } }, { "name": "RateLimitConfig", "docs": ["Rate limiting configuration (separate account for backward compatibility)", "PDA: `[b\"rate_limit_config\"]`. Stores global rate limiting settings."], "type": { "kind": "struct", "fields": [{ "name": "block_usd_cap", "type": "u128" }, { "name": "epoch_duration_sec", "type": "u64" }, { "name": "last_slot", "type": "u64" }, { "name": "consumed_usd_in_block", "type": "u128" }, { "name": "bump", "type": "u8" }] } }, { "name": "RevertInstructions", "docs": ["Revert instructions for failed transactions (parity with EVM `RevertInstructions`)."], "type": { "kind": "struct", "fields": [{ "name": "revert_recipient", "type": "pubkey" }, { "name": "revert_msg", "type": "bytes" }] } }, { "name": "RevertUniversalTx", "docs": ["Revert withdraw event (parity with EVM `RevertUniversalTx`)."], "type": { "kind": "struct", "fields": [{ "name": "sub_tx_id", "type": { "array": ["u8", 32] } }, { "name": "universal_tx_id", "type": { "array": ["u8", 32] } }, { "name": "revert_recipient", "type": "pubkey" }, { "name": "token", "type": "pubkey" }, { "name": "amount", "type": "u64" }, { "name": "revert_instruction", "type": { "defined": { "name": "RevertInstructions" } } }] } }, { "name": "TokenRateLimit", "docs": ["Token-specific rate limiting state (matching EVM implementation)", "PDA: `[b\"rate_limit\", token_mint]`. Tracks epoch-based usage per token."], "type": { "kind": "struct", "fields": [{ "name": "token_mint", "type": "pubkey" }, { "name": "limit_threshold", "type": "u128" }, { "name": "epoch_usage", "type": { "defined": { "name": "EpochUsage" } } }, { "name": "bump", "type": "u8" }] } }, { "name": "TokenRateLimitUpdated", "type": { "kind": "struct", "fields": [{ "name": "token_mint", "type": "pubkey" }, { "name": "limit_threshold", "type": "u128" }] } }, { "name": "TssPda", "docs": ["TSS state PDA for ECDSA verification (Ethereum-style secp256k1).", "Stores 20-byte ETH address and chain id (Solana cluster pubkey as String)."], "type": { "kind": "struct", "fields": [{ "name": "tss_eth_address", "type": { "array": ["u8", 20] } }, { "name": "chain_id", "type": "string" }, { "name": "bump", "type": "u8" }] } }, { "name": "TxType", "docs": ["Transaction types matching the EVM Universal Gateway `TX_TYPE`.", "Kept 1:1 for relayer/event parity with the EVM implementation."], "type": { "kind": "enum", "variants": [{ "name": "Gas" }, { "name": "GasAndPayload" }, { "name": "Funds" }, { "name": "FundsAndPayload" }] } }, { "name": "UniversalTx", "docs": ["Universal transaction event (parity with EVM V0 `UniversalTx`).", "Single event for both gas funding and funds movement."], "type": { "kind": "struct", "fields": [{ "name": "sender", "type": "pubkey" }, { "name": "recipient", "type": { "array": ["u8", 20] } }, { "name": "token", "type": "pubkey" }, { "name": "amount", "type": "u64" }, { "name": "payload", "type": "bytes" }, { "name": "revert_recipient", "type": "pubkey" }, { "name": "tx_type", "type": { "defined": { "name": "TxType" } } }, { "name": "signature_data", "type": "bytes" }, { "name": "from_cea", "type": "bool" }] } }, { "name": "UniversalTxFinalized", "docs": ["Execute event (parity with EVM `UniversalTxFinalized`)."], "type": { "kind": "struct", "fields": [{ "name": "sub_tx_id", "type": { "array": ["u8", 32] } }, { "name": "universal_tx_id", "type": { "array": ["u8", 32] } }, { "name": "gas_fee", "type": "u64" }, { "name": "gas_used", "type": "u64" }, { "name": "gas_to_refund", "type": "u64" }, { "name": "ata_created", "type": "bool" }, { "name": "push_account", "type": { "array": ["u8", 20] } }, { "name": "target", "type": "pubkey" }, { "name": "token", "type": "pubkey" }, { "name": "amount", "type": "u64" }, { "name": "payload", "type": "bytes" }] } }, { "name": "UniversalTxRequest", "docs": ["Universal transaction request (parity with EVM `UniversalTxRequest`)."], "type": { "kind": "struct", "fields": [{ "name": "recipient", "type": { "array": ["u8", 20] } }, { "name": "token", "type": "pubkey" }, { "name": "amount", "type": "u64" }, { "name": "payload", "type": "bytes" }, { "name": "revert_recipient", "type": "pubkey" }, { "name": "signature_data", "type": "bytes" }] } }, { "name": "VerificationLevel", "docs": ["Pyth price updates are bridged to all blockchains via Wormhole.", "Using the price updates on another chain requires verifying the signatures of the Wormhole guardians.", "The usual process is to check the signatures for two thirds of the total number of guardians, but this can be cumbersome on Solana because of the transaction size limits,", "so we also allow for partial verification.", "", "This enum represents how much a price update has been verified:", "- If `Full`, we have verified the signatures for two thirds of the current guardians.", "- If `Partial`, only `num_signatures` guardian signatures have been checked.", "", "# Warning", "Using partially verified price updates is dangerous, as it lowers the threshold of guardians that need to collude to produce a malicious price update."], "type": { "kind": "enum", "variants": [{ "name": "Partial", "fields": [{ "name": "num_signatures", "type": "u8" }] }, { "name": "Full" }] } }, { "name": "OperatorChanged", "type": { "kind": "struct", "fields": [{ "name": "old_operator", "type": "pubkey" }, { "name": "new_operator", "type": "pubkey" }] } }] }
|
|
@@ -37,6 +37,8 @@ export declare const SYNTHETIC_PUSH_ERC20: Record<PUSH_NETWORK, {
|
|
|
37
37
|
USDT_SOL: `0x${string}`;
|
|
38
38
|
USDC_SOL: `0x${string}`;
|
|
39
39
|
USDT_BNB: `0x${string}`;
|
|
40
|
+
USDC_BSC: `0x${string}`;
|
|
41
|
+
/** @deprecated Use USDC_BSC instead. */
|
|
40
42
|
USDC_BNB: `0x${string}`;
|
|
41
43
|
USDT_BASE: `0x${string}`;
|
|
42
44
|
USDC_BASE: `0x${string}`;
|
|
@@ -56,15 +56,16 @@ exports.SYNTHETIC_PUSH_ERC20 = {
|
|
|
56
56
|
pETH_BASE: '0xc7007af2B24D4eb963fc9633B0c66e1d2D90Fc21',
|
|
57
57
|
pBNB: '0x7a9082dA308f3fa005beA7dB0d203b3b86664E36',
|
|
58
58
|
pSOL: '0x5D525Df2bD99a6e7ec58b76aF2fd95F39874EBed',
|
|
59
|
-
USDT_ETH: '
|
|
59
|
+
USDT_ETH: '0x0f97A213207703923F5f0C613C9827f7C9A0f96B',
|
|
60
60
|
USDC_ETH: '0x7A58048036206bB898008b5bBDA85697DB1e5d66',
|
|
61
|
-
USDT_ARB: '
|
|
61
|
+
USDT_ARB: '0xFE6E9DF2BbC9ce05D98b83B1365df6DcA9951891',
|
|
62
62
|
USDC_ARB: '0x1091cCBA2FF8d2A131AE4B35e34cf3308C48572C',
|
|
63
63
|
USDT_SOL: '0x4f1A3D22d170a2F4Bddb37845a962322e24f4e34',
|
|
64
64
|
USDC_SOL: '0x04B8F634ABC7C879763F623e0f0550a4b5c4426F',
|
|
65
|
-
USDT_BNB: '
|
|
66
|
-
|
|
67
|
-
|
|
65
|
+
USDT_BNB: '0x731aF1Da5365259d27528557EE4aFBA4baC90ef2',
|
|
66
|
+
USDC_BSC: '0x120EBf25Dad7D6a09Ad2316f23f9Be95DBb90639',
|
|
67
|
+
USDC_BNB: '0x120EBf25Dad7D6a09Ad2316f23f9Be95DBb90639',
|
|
68
|
+
USDT_BASE: '0x148823809B853e1db187BC09A9ac909BC42F971a',
|
|
68
69
|
USDC_BASE: '0xD7C6cA1e2c0CE260BE0c0AD39C1540de460e3Be1',
|
|
69
70
|
WETH_ETH: '0x0d0dF7E8807430A81104EA84d926139816eC7586',
|
|
70
71
|
stETH_ETH: '0xaf89E805949c628ebde3262e91dc4ab9eA12668E',
|
|
@@ -76,15 +77,16 @@ exports.SYNTHETIC_PUSH_ERC20 = {
|
|
|
76
77
|
pETH_BASE: '0xc7007af2B24D4eb963fc9633B0c66e1d2D90Fc21',
|
|
77
78
|
pBNB: '0x7a9082dA308f3fa005beA7dB0d203b3b86664E36',
|
|
78
79
|
pSOL: '0x5D525Df2bD99a6e7ec58b76aF2fd95F39874EBed',
|
|
79
|
-
USDT_ETH: '
|
|
80
|
+
USDT_ETH: '0x0f97A213207703923F5f0C613C9827f7C9A0f96B',
|
|
80
81
|
USDC_ETH: '0x7A58048036206bB898008b5bBDA85697DB1e5d66',
|
|
81
|
-
USDT_ARB: '
|
|
82
|
+
USDT_ARB: '0xFE6E9DF2BbC9ce05D98b83B1365df6DcA9951891',
|
|
82
83
|
USDC_ARB: '0x1091cCBA2FF8d2A131AE4B35e34cf3308C48572C',
|
|
83
84
|
USDT_SOL: '0x4f1A3D22d170a2F4Bddb37845a962322e24f4e34',
|
|
84
85
|
USDC_SOL: '0x04B8F634ABC7C879763F623e0f0550a4b5c4426F',
|
|
85
|
-
USDT_BNB: '
|
|
86
|
-
|
|
87
|
-
|
|
86
|
+
USDT_BNB: '0x731aF1Da5365259d27528557EE4aFBA4baC90ef2',
|
|
87
|
+
USDC_BSC: '0x120EBf25Dad7D6a09Ad2316f23f9Be95DBb90639',
|
|
88
|
+
USDC_BNB: '0x120EBf25Dad7D6a09Ad2316f23f9Be95DBb90639',
|
|
89
|
+
USDT_BASE: '0x148823809B853e1db187BC09A9ac909BC42F971a',
|
|
88
90
|
USDC_BASE: '0xD7C6cA1e2c0CE260BE0c0AD39C1540de460e3Be1',
|
|
89
91
|
WETH_ETH: '0x0d0dF7E8807430A81104EA84d926139816eC7586',
|
|
90
92
|
stETH_ETH: '0xaf89E805949c628ebde3262e91dc4ab9eA12668E',
|
|
@@ -103,6 +105,7 @@ exports.SYNTHETIC_PUSH_ERC20 = {
|
|
|
103
105
|
USDT_SOL: '0xTBD',
|
|
104
106
|
USDC_SOL: '0xTBD',
|
|
105
107
|
USDT_BNB: '0xTBD',
|
|
108
|
+
USDC_BSC: '0xTBD',
|
|
106
109
|
USDC_BNB: '0xTBD',
|
|
107
110
|
USDT_BASE: '0xTBD',
|
|
108
111
|
USDC_BASE: '0xTBD',
|
|
@@ -123,6 +126,7 @@ exports.SYNTHETIC_PUSH_ERC20 = {
|
|
|
123
126
|
USDT_SOL: '0xTBD',
|
|
124
127
|
USDC_SOL: '0xTBD',
|
|
125
128
|
USDT_BNB: '0xTBD',
|
|
129
|
+
USDC_BSC: '0xTBD',
|
|
126
130
|
USDC_BNB: '0xTBD',
|
|
127
131
|
USDT_BASE: '0xTBD',
|
|
128
132
|
USDC_BASE: '0xTBD',
|
|
@@ -384,10 +388,10 @@ exports.VAULT_ADDRESSES = {
|
|
|
384
388
|
* Factories deploy and manage Chain Executor Accounts
|
|
385
389
|
*/
|
|
386
390
|
exports.CEA_FACTORY_ADDRESSES = {
|
|
387
|
-
[enums_1.CHAIN.ETHEREUM_SEPOLIA]: '
|
|
388
|
-
[enums_1.CHAIN.BNB_TESTNET]: '
|
|
389
|
-
[enums_1.CHAIN.ARBITRUM_SEPOLIA]: '
|
|
390
|
-
[enums_1.CHAIN.BASE_SEPOLIA]: '
|
|
391
|
+
[enums_1.CHAIN.ETHEREUM_SEPOLIA]: '0x5E191fbBe22F8866C5e4250557664fCE760e8870',
|
|
392
|
+
[enums_1.CHAIN.BNB_TESTNET]: '0x3f1B16e0B072d472951C4563d29d3da6a3EE3Ce8',
|
|
393
|
+
[enums_1.CHAIN.ARBITRUM_SEPOLIA]: '0x65572FFa81c230360a8a53C1682C7f0Ee321E5E7',
|
|
394
|
+
[enums_1.CHAIN.BASE_SEPOLIA]: '0x7e8CeeDA043ED1460540616103dD57581a66C856',
|
|
391
395
|
};
|
|
392
396
|
/**
|
|
393
397
|
* Block explorer URLs for each chain
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { CHAIN, LIBRARY, PUSH_NETWORK } from './enums';
|
|
2
2
|
import { TypedDataDomain, TypedData } from '../universal/signer/signer.types';
|
|
3
|
-
export type { MoveableToken, PayableToken, PushChainMoveableToken, ChainSuffixAccessor, PushChainMoveableTokenAccessor, MoveableTokenConstantsMap, PayableTokenConstantsMap, } from './tokens';
|
|
3
|
+
export type { MoveableToken, PayableToken, PushChainMoveableToken, ChainSuffixAccessor, UsdcChainSuffixAccessor, PushChainMoveableTokenAccessor, MoveableTokenConstantsMap, PayableTokenConstantsMap, } from './tokens';
|
|
4
4
|
export declare const CONSTANTS: {
|
|
5
5
|
PUSH_NETWORK: typeof PUSH_NETWORK;
|
|
6
6
|
CHAIN: typeof CHAIN;
|
|
@@ -76,6 +76,15 @@ export interface ChainSuffixAccessor {
|
|
|
76
76
|
readonly bnb: PushChainMoveableToken;
|
|
77
77
|
readonly sol: PushChainMoveableToken;
|
|
78
78
|
}
|
|
79
|
+
export interface UsdcChainSuffixAccessor {
|
|
80
|
+
readonly eth: PushChainMoveableToken;
|
|
81
|
+
readonly arb: PushChainMoveableToken;
|
|
82
|
+
readonly base: PushChainMoveableToken;
|
|
83
|
+
readonly bsc: PushChainMoveableToken;
|
|
84
|
+
/** @deprecated Use `bsc` instead. */
|
|
85
|
+
readonly bnb: PushChainMoveableToken;
|
|
86
|
+
readonly sol: PushChainMoveableToken;
|
|
87
|
+
}
|
|
79
88
|
export interface PushChainMoveableTokenAccessor {
|
|
80
89
|
readonly pEth: PushChainMoveableToken;
|
|
81
90
|
readonly pEthArb: PushChainMoveableToken;
|
|
@@ -86,7 +95,7 @@ export interface PushChainMoveableTokenAccessor {
|
|
|
86
95
|
readonly pStEth: PushChainMoveableToken;
|
|
87
96
|
readonly pDai: PushChainMoveableToken;
|
|
88
97
|
readonly USDT: ChainSuffixAccessor;
|
|
89
|
-
readonly USDC:
|
|
98
|
+
readonly USDC: UsdcChainSuffixAccessor;
|
|
90
99
|
}
|
|
91
100
|
export type MoveableTokenConstantsMap = {
|
|
92
101
|
ETHEREUM_SEPOLIA: MoveableTokenAccessor;
|
|
@@ -270,7 +270,7 @@ function buildPushChainMoveableTokenList() {
|
|
|
270
270
|
mk('USDC', 6, s.USDC_ETH, enums_1.CHAIN.ETHEREUM_SEPOLIA),
|
|
271
271
|
mk('USDC', 6, s.USDC_ARB, enums_1.CHAIN.ARBITRUM_SEPOLIA),
|
|
272
272
|
mk('USDC', 6, s.USDC_BASE, enums_1.CHAIN.BASE_SEPOLIA),
|
|
273
|
-
mk('USDC', 6, s.
|
|
273
|
+
mk('USDC', 6, s.USDC_BSC, enums_1.CHAIN.BNB_TESTNET),
|
|
274
274
|
mk('USDC', 6, s.USDC_SOL, enums_1.CHAIN.SOLANA_DEVNET),
|
|
275
275
|
mk('WETH', 18, s.WETH_ETH, enums_1.CHAIN.ETHEREUM_SEPOLIA),
|
|
276
276
|
mk('stETH', 18, s.stETH_ETH, enums_1.CHAIN.ETHEREUM_SEPOLIA),
|
|
@@ -342,6 +342,7 @@ exports.PAYABLE_TOKENS = {
|
|
|
342
342
|
[enums_1.CHAIN.BNB_TESTNET]: [
|
|
343
343
|
makeToken(enums_1.CHAIN.BNB_TESTNET, 'BNB'),
|
|
344
344
|
makeToken(enums_1.CHAIN.BNB_TESTNET, 'USDT'),
|
|
345
|
+
makeToken(enums_1.CHAIN.BNB_TESTNET, 'USDC'),
|
|
345
346
|
],
|
|
346
347
|
[enums_1.CHAIN.SOLANA_DEVNET]: [
|
|
347
348
|
makeToken(enums_1.CHAIN.SOLANA_DEVNET, 'SOL'),
|
|
@@ -364,6 +365,7 @@ function buildPushChainMoveableTokenAccessor() {
|
|
|
364
365
|
sourceChain,
|
|
365
366
|
prc20Address: address,
|
|
366
367
|
});
|
|
368
|
+
const usdcBsc = mk('USDC', 6, s.USDC_BSC, enums_1.CHAIN.BNB_TESTNET);
|
|
367
369
|
return {
|
|
368
370
|
pEth: mk('pETH', 18, s.pETH, enums_1.CHAIN.ETHEREUM_SEPOLIA),
|
|
369
371
|
pEthArb: mk('pETH_ARB', 18, s.pETH_ARB, enums_1.CHAIN.ARBITRUM_SEPOLIA),
|
|
@@ -384,7 +386,8 @@ function buildPushChainMoveableTokenAccessor() {
|
|
|
384
386
|
eth: mk('USDC', 6, s.USDC_ETH, enums_1.CHAIN.ETHEREUM_SEPOLIA),
|
|
385
387
|
arb: mk('USDC', 6, s.USDC_ARB, enums_1.CHAIN.ARBITRUM_SEPOLIA),
|
|
386
388
|
base: mk('USDC', 6, s.USDC_BASE, enums_1.CHAIN.BASE_SEPOLIA),
|
|
387
|
-
|
|
389
|
+
bsc: usdcBsc,
|
|
390
|
+
bnb: usdcBsc,
|
|
388
391
|
sol: mk('USDC', 6, s.USDC_SOL, enums_1.CHAIN.SOLANA_DEVNET),
|
|
389
392
|
},
|
|
390
393
|
};
|
package/src/lib/formatters.d.ts
CHANGED
|
@@ -1 +1,7 @@
|
|
|
1
1
|
export declare function formatPc(valueWei: bigint, precision?: number): string;
|
|
2
|
+
/**
|
|
3
|
+
* Push Chain EVM/RPC insufficient-funds errors surface native balances as raw
|
|
4
|
+
* wei, usually in the form "have <wei> want <wei>". Preserve the raw value for
|
|
5
|
+
* debugging but prefix it with the human PC amount users can reason about.
|
|
6
|
+
*/
|
|
7
|
+
export declare function normalizePcInsufficientFundsError(message: string): string;
|
package/src/lib/formatters.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.formatPc = formatPc;
|
|
4
|
+
exports.normalizePcInsufficientFundsError = normalizePcInsufficientFundsError;
|
|
4
5
|
const PC_DECIMALS = 18;
|
|
5
6
|
function formatTokenUnits(value, decimals, precision) {
|
|
6
7
|
if (!Number.isInteger(decimals) || decimals < 0) {
|
|
@@ -29,4 +30,17 @@ function formatTokenUnits(value, decimals, precision) {
|
|
|
29
30
|
function formatPc(valueWei, precision) {
|
|
30
31
|
return `${formatTokenUnits(valueWei, PC_DECIMALS, precision)} PC`;
|
|
31
32
|
}
|
|
33
|
+
/**
|
|
34
|
+
* Push Chain EVM/RPC insufficient-funds errors surface native balances as raw
|
|
35
|
+
* wei, usually in the form "have <wei> want <wei>". Preserve the raw value for
|
|
36
|
+
* debugging but prefix it with the human PC amount users can reason about.
|
|
37
|
+
*/
|
|
38
|
+
function normalizePcInsufficientFundsError(message) {
|
|
39
|
+
if (!/insufficient funds for gas \* price \+ value/i.test(message)) {
|
|
40
|
+
return message;
|
|
41
|
+
}
|
|
42
|
+
return message
|
|
43
|
+
.replace(/\bhave\s+([0-9]+)(?=\s+want\b)/gi, (_match, value) => `have ${formatPc(BigInt(value))} (${value} wei)`)
|
|
44
|
+
.replace(/\bwant\s+([0-9]+)(?![\d.]|\s*(?:wei|PC))/gi, (_match, value) => `want ${formatPc(BigInt(value))} (${value} wei)`);
|
|
45
|
+
}
|
|
32
46
|
//# sourceMappingURL=formatters.js.map
|
package/src/lib/index.d.ts
CHANGED
|
@@ -4,6 +4,8 @@ export type { UniversalSigner, UniversalAccount, UniversalSignerSkeleton, Derive
|
|
|
4
4
|
export type { ChainTarget, ChainSource, UniversalTo, TransactionRouteType, UniversalExecuteParams, UniversalOutboundTxRequest, PreparedUniversalTx, CascadedTxResponse, CascadeHopInfo, CascadeTrackOptions, CascadeProgressEvent, CascadeCompletionResult, MultiChainTxResponse, OutboundTxDetails, WaitForOutboundOptions, SvmGatewayAccountMeta, SvmExecutePayloadFields, AccountStatus, UEAStatus, RescueFundsParams, } from './orchestrator/orchestrator.types';
|
|
5
5
|
export { parseUEAVersion } from './orchestrator/orchestrator.types';
|
|
6
6
|
export { TransactionRoute, detectRoute, isChainTarget } from './orchestrator/route-detector';
|
|
7
|
+
export { DEFAULT_MAX_PC_FOR_GAS_BUFFER_BPS, MAX_PC_FOR_GAS_BUFFER_BPS_LIMIT, quoteMaxPCForGasCap, quoteMaxPCForGasCapFromNativeValue, } from './orchestrator/max-pc-for-gas';
|
|
8
|
+
export type { MaxPCForGasCapInput, MaxPCForGasCapFromNativeValueInput, MaxPCForGasCapQuote, } from './orchestrator/max-pc-for-gas';
|
|
7
9
|
export { getCEAAddress, getPushAccountForCEA, isCEA, chainSupportsCEA, chainSupportsOutbound, getCEAFactoryAddress, getAllCEAAddresses, } from './orchestrator/cea-utils';
|
|
8
10
|
export { encodeSvmExecutePayload, isSvmChain, isValidSolanaHexAddress, buildMigrationPayload, buildErc20WithdrawalMulticall, } from './orchestrator/payload-builders';
|
|
9
11
|
export { PushChain };
|
package/src/lib/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.PushChain = exports.buildErc20WithdrawalMulticall = exports.buildMigrationPayload = exports.isValidSolanaHexAddress = exports.isSvmChain = exports.encodeSvmExecutePayload = exports.getAllCEAAddresses = exports.getCEAFactoryAddress = exports.chainSupportsOutbound = exports.chainSupportsCEA = exports.isCEA = exports.getPushAccountForCEA = exports.getCEAAddress = exports.isChainTarget = exports.detectRoute = exports.TransactionRoute = exports.parseUEAVersion = void 0;
|
|
3
|
+
exports.PushChain = exports.buildErc20WithdrawalMulticall = exports.buildMigrationPayload = exports.isValidSolanaHexAddress = exports.isSvmChain = exports.encodeSvmExecutePayload = exports.getAllCEAAddresses = exports.getCEAFactoryAddress = exports.chainSupportsOutbound = exports.chainSupportsCEA = exports.isCEA = exports.getPushAccountForCEA = exports.getCEAAddress = exports.quoteMaxPCForGasCapFromNativeValue = exports.quoteMaxPCForGasCap = exports.MAX_PC_FOR_GAS_BUFFER_BPS_LIMIT = exports.DEFAULT_MAX_PC_FOR_GAS_BUFFER_BPS = exports.isChainTarget = exports.detectRoute = exports.TransactionRoute = exports.parseUEAVersion = void 0;
|
|
4
4
|
const push_chain_1 = require("./push-chain/push-chain");
|
|
5
5
|
Object.defineProperty(exports, "PushChain", { enumerable: true, get: function () { return push_chain_1.PushChain; } });
|
|
6
6
|
// UEA version utility
|
|
@@ -11,6 +11,12 @@ var route_detector_1 = require("./orchestrator/route-detector");
|
|
|
11
11
|
Object.defineProperty(exports, "TransactionRoute", { enumerable: true, get: function () { return route_detector_1.TransactionRoute; } });
|
|
12
12
|
Object.defineProperty(exports, "detectRoute", { enumerable: true, get: function () { return route_detector_1.detectRoute; } });
|
|
13
13
|
Object.defineProperty(exports, "isChainTarget", { enumerable: true, get: function () { return route_detector_1.isChainTarget; } });
|
|
14
|
+
// Outbound gas cap helpers
|
|
15
|
+
var max_pc_for_gas_1 = require("./orchestrator/max-pc-for-gas");
|
|
16
|
+
Object.defineProperty(exports, "DEFAULT_MAX_PC_FOR_GAS_BUFFER_BPS", { enumerable: true, get: function () { return max_pc_for_gas_1.DEFAULT_MAX_PC_FOR_GAS_BUFFER_BPS; } });
|
|
17
|
+
Object.defineProperty(exports, "MAX_PC_FOR_GAS_BUFFER_BPS_LIMIT", { enumerable: true, get: function () { return max_pc_for_gas_1.MAX_PC_FOR_GAS_BUFFER_BPS_LIMIT; } });
|
|
18
|
+
Object.defineProperty(exports, "quoteMaxPCForGasCap", { enumerable: true, get: function () { return max_pc_for_gas_1.quoteMaxPCForGasCap; } });
|
|
19
|
+
Object.defineProperty(exports, "quoteMaxPCForGasCapFromNativeValue", { enumerable: true, get: function () { return max_pc_for_gas_1.quoteMaxPCForGasCapFromNativeValue; } });
|
|
14
20
|
// CEA utilities
|
|
15
21
|
var cea_utils_1 = require("./orchestrator/cea-utils");
|
|
16
22
|
Object.defineProperty(exports, "getCEAAddress", { enumerable: true, get: function () { return cea_utils_1.getCEAAddress; } });
|
|
@@ -41,7 +41,9 @@ export interface ComposeCascadeResult {
|
|
|
41
41
|
multicalls: MultiCall[];
|
|
42
42
|
requiredNativeValue: bigint;
|
|
43
43
|
}
|
|
44
|
-
export declare function composeCascadeDetailed(ctx: OrchestratorContext, segments: CascadeSegment[], ueaAddress: `0x${string}`, ueaBalance?: bigint, ueaNonce?: bigint
|
|
44
|
+
export declare function composeCascadeDetailed(ctx: OrchestratorContext, segments: CascadeSegment[], ueaAddress: `0x${string}`, ueaBalance?: bigint, ueaNonce?: bigint, options?: {
|
|
45
|
+
enforceGasCheck?: boolean;
|
|
46
|
+
}): Promise<ComposeCascadeResult>;
|
|
45
47
|
export declare function composeCascade(ctx: OrchestratorContext, segments: CascadeSegment[], ueaAddress: `0x${string}`, ueaBalance?: bigint, ueaNonce?: bigint): Promise<MultiCall[]>;
|
|
46
48
|
export declare function createCascadedBuilder(ctx: OrchestratorContext, preparedTxs: PreparedUniversalTx[], callbacks: CascadeCallbacks, defaultEventHook?: (event: import('../../progress-hook/progress-hook.types').ProgressEvent) => void): {
|
|
47
49
|
send: () => Promise<CascadedTxResponse>;
|