Simulando Transacciones
Simular transacciones te permite previsualizar el costo y el efecto de enviar una transacción sin pagar comisiones. Puedes usar esto para estimar comisiones, probar una transacción o verificar cuál podría ser el resultado.
Para simular una transacción, debes pasar una transacción y qué cuenta será el firmante:
import { Account, Aptos, AptosConfig, Network,} from "@aptos-labs/ts-sdk";
async function example() { let sender = Account.generate(); let receiver = Account.generate();
// 0. Configura el cliente y las cuentas de prueba const config = new AptosConfig({ network: Network.DEVNET }); const aptos = new Aptos(config);
await aptos.fundAccount({ accountAddress: sender.accountAddress, amount: 100_000_000, });
// 1. Construye la transacción para previsualizar su impacto const transaction = await aptos.transaction.build.simple({ sender: sender.accountAddress, data: { // Todas las transacciones en Aptos se implementan vía contratos inteligentes. function: "0x1::aptos_account::transfer", functionArguments: [receiver.accountAddress, 100], }, });
// 2. Simula para ver qué pasaría si ejecutamos esta transacción const [userTransactionResponse] = await aptos.transaction.simulate.simple({ signerPublicKey: sender.publicKey, transaction, }); console.log(userTransactionResponse)
// Si la comisión se ve bien, ¡continúa con la firma! // ...}
example();
Esto producirá la misma salida que si la transacción fuera enviada.
El parámetro signerPublicKey
en aptos.transaction.simulate.simple
se usa para verificar la clave de autenticación del firmante durante la simulación de la transacción. Este parámetro es opcional, y la simulación omitirá la verificación de la clave de autenticación si se omite. Por ejemplo, abajo:
// 2. Simula para ver qué pasaría si ejecutamos esta transacción, omitiendo la verificación de la clave de autenticaciónconst [userTransactionResponse] = await aptos.transaction.simulate.simple({ transaction,});
Example Output
{ version: '9534925', hash: '0xea50b6fbea39ad1ba015d11cda0e7478334669c34830bc3df067a260d680893c', state_change_hash: '0x0000000000000000000000000000000000000000000000000000000000000000', event_root_hash: '0x0000000000000000000000000000000000000000000000000000000000000000', state_checkpoint_hash: null, gas_used: '9', success: true, vm_status: 'Executed successfully', accumulator_root_hash: '0x0000000000000000000000000000000000000000000000000000000000000000', changes: [ { address: '0x811d5a94ccb597fa2a4f7872a3c678867cff94130d9378c39304c1354ef54abe', state_key_hash: '0x09adecee8779b64d05847488e2dbec6679c0c9e2fe618caf0793472ba3a7e4ab', data: [Object], type: 'write_resource' }, { address: '0x811d5a94ccb597fa2a4f7872a3c678867cff94130d9378c39304c1354ef54abe', state_key_hash: '0x0c70ede5412277b81d9f8d99369930ed5d56ad65862e3e878ad22dd5500833d0', data: [Object], type: 'write_resource' }, { address: '0xf40c314051890d16ba0a2ba427e003a83e730956fdeccf6c8eebc893a229ddc1', state_key_hash: '0x503f9cffb248036da24e18875f3dce72bb33d1d3ef5cfdbdb2fb3411cd718f4f', data: [Object], type: 'write_resource' }, { state_key_hash: '0x6e4b28d40f98a106a65163530924c0dcb40c1349d3aa915d108b4d6cfc1ddb19', handle: '0x1b854694ae746cdbd8d44186ca4929b2b337df21d1c74633be19b2710552fdca', key: '0x0619dc29a0aac8fa146714058e8dd6d2d0f3bdf5f6331907bf91f3acd81e6935', value: '0x708f579f62cb01000100000000000000', data: null, type: 'write_table_item' } ], sender: '0x811d5a94ccb597fa2a4f7872a3c678867cff94130d9378c39304c1354ef54abe', sequence_number: '0', max_gas_amount: '200000', gas_unit_price: '100', expiration_timestamp_secs: '1718983701', payload: { function: '0x1::aptos_account::transfer', type_arguments: [], arguments: [ '0xf40c314051890d16ba0a2ba427e003a83e730956fdeccf6c8eebc893a229ddc1', '100' ], type: 'entry_function_payload' }, signature: { public_key: '0x966b6b9aa8feb58ee1b911235dea1f185b9169de56303d18bb59937066881e44', signature: '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', type: 'ed25519_signature' }, events: [ { guid: [Object], sequence_number: '0', type: '0x1::coin::CoinWithdraw', data: [Object] }, { guid: [Object], sequence_number: '0', type: '0x1::coin::WithdrawEvent', data: [Object] }, { guid: [Object], sequence_number: '0', type: '0x1::coin::CoinDeposit', data: [Object] }, { guid: [Object], sequence_number: '1', type: '0x1::coin::DepositEvent', data: [Object] }, { guid: [Object], sequence_number: '0', type: '0x1::transaction_fee::FeeStatement', data: [Object] } ], timestamp: '1718983681460047'}
Mira aquí para ver el ejemplo completo de cómo construir, simular y enviar una transacción.
Simulando transacciones más avanzadas
Sección titulada «Simulando transacciones más avanzadas»También puedes aprender a simular transacciones más avanzadas consultando las siguientes guías:
- Transacciones patrocinadas
- Transacciones de múltiples agentes
- Transacciones Multisig V2: Consulta la siguiente sección para más detalles.
Simulando Multisig (v2) On-Chain Transactions
Sección titulada «Simulando Multisig (v2) On-Chain Transactions»Para transacciones multisig, hay dos tipos de simulación:
- Simulación del objetivo de la carga antes de que se envíe en la cadena, ignorando el estado de votación.
- Simulación de la transacción multisig en la cadena aprobada antes de la ejecución para verificar la salida y la estimación de gas.
Para realizar el primer tipo, puedes simular el objetivo de la carga como una transacción patrocinada con la cuenta multisig como remitente, y establece el pagador de tarifas en 0x0
para omitir el pago de la tarifa de gas durante la simulación. Por ejemplo:
// Genera una transacción bruta con la dirección multisig como remitente,// la carga de función proporcionada, y 0x0 como la dirección del pagador de tarifas.const transactionToSimulate = await aptos.transaction.build.simple({ sender: multisigAddress, data: { function: "0x1::aptos_account::transfer", functionArguments: [recipient.accountAddress, 1_000_000], }, withFeePayer: true,});
// Simula la transacción, omitiendo la verificación de la clave pública/autenticación tanto para el remitente como para el pagador de tarifas.const [simulateMultisigTx] = await aptos.transaction.simulate.simple({ transaction: transactionToSimulate,});
Esta configuración te permite previsualizar el resultado del objetivo de la carga antes de enviarlo en la cadena. Aquí, signerPublicKey
se omite para omitir la verificación de la clave de autenticación para el remitente, ya que la cuenta multisig no tiene una clave pública. Además, feePayerAddress
se establece en 0x0
por defecto, y feePayerPublicKey
se omite para omitir el pago de la tarifa de gas durante la simulación. Cuando esta carga se ejecuta posteriormente después de la envío y la aprobación, el propietario que ejecuta la transacción cubrirá la tarifa de gas.
Para la segunda simulación de tipo, donde la transacción de carga multisig en la cadena se simula para validación final y estimación de gas, usa el siguiente enfoque:
const transactionPayload: TransactionPayloadMultiSig = await generateTransactionPayload({ multisigAddress, function: "0x1::aptos_account::transfer", functionArguments: [recipient.accountAddress, 1_000_000], aptosConfig: config,});
const rawTransaction = await generateRawTransaction({ aptosConfig: config, sender: owner.accountAddress, payload: transactionPayload,});
const [simulateMultisigTx] = await aptos.transaction.simulate.simple({ signerPublicKey: owner.publicKey, transaction: new SimpleTransaction(rawTransaction),});
Nota: signerPublicKey
es opcional y se puede omitir si deseas omitir la verificación de la clave de autenticación para el remitente durante la simulación.
Para el código fuente completo, consulta el Ejemplo Multisig V2.