diff --git a/tests/src/batchWithdraw.test.js b/tests/src/batchWithdraw.test.js index a9fa560..2a33f93 100644 --- a/tests/src/batchWithdraw.test.js +++ b/tests/src/batchWithdraw.test.js @@ -15,7 +15,7 @@ import { ledgerService } from '@ledgerhq/hw-app-eth'; const contractAddr = '0x1e68238ce926dec62b3fbc99ab06eb1d85ce0270'; const pluginName = 'Kiln'; -const abi_path = `../cal/abis/${contractAddr}.json`; +const abi_path = `../cal/ethereum/abis/${contractAddr}.json`; const abi = require(abi_path); nano_models.forEach(function (model) { diff --git a/tests/src/batchWithdrawCL.test.js b/tests/src/batchWithdrawCL.test.js index 91094bb..ed161fb 100644 --- a/tests/src/batchWithdrawCL.test.js +++ b/tests/src/batchWithdrawCL.test.js @@ -15,7 +15,7 @@ import { ledgerService } from '@ledgerhq/hw-app-eth'; const contractAddr = '0x1e68238ce926dec62b3fbc99ab06eb1d85ce0270'; const pluginName = 'Kiln'; -const abi_path = `../cal/abis/${contractAddr}.json`; +const abi_path = `../cal/ethereum/abis/${contractAddr}.json`; const abi = require(abi_path); nano_models.forEach(function (model) { diff --git a/tests/src/batchWithdrawEL.test.js b/tests/src/batchWithdrawEL.test.js index 1e68bec..cdeb7ff 100644 --- a/tests/src/batchWithdrawEL.test.js +++ b/tests/src/batchWithdrawEL.test.js @@ -15,7 +15,7 @@ import { ledgerService } from '@ledgerhq/hw-app-eth'; const contractAddr = '0x1e68238ce926dec62b3fbc99ab06eb1d85ce0270'; const pluginName = 'Kiln'; -const abi_path = `../cal/abis/${contractAddr}.json`; +const abi_path = `../cal/ethereum/abis/${contractAddr}.json`; const abi = require(abi_path); nano_models.forEach(function (model) { diff --git a/tests/src/claim.v2.test.js b/tests/src/claim.v2.test.js index d284671..ee0fa3b 100644 --- a/tests/src/claim.v2.test.js +++ b/tests/src/claim.v2.test.js @@ -8,7 +8,7 @@ import { ledgerService } from '@ledgerhq/hw-app-eth'; const contractAddr = '0x8d6fd650500f82c7d978a440348e5a9b886943bf'; const pluginName = 'Kiln'; -const abi_path = `../cal/abis/${contractAddr}.json`; +const abi_path = `../cal/ethereum/abis/${contractAddr}.json`; const abi = require(abi_path); nano_models.forEach(function (model) { diff --git a/tests/src/deposit.test.js b/tests/src/deposit.test.js index 348ac3b..2703353 100644 --- a/tests/src/deposit.test.js +++ b/tests/src/deposit.test.js @@ -16,7 +16,7 @@ import { ledgerService } from '@ledgerhq/hw-app-eth'; const contractAddr = '0x1e68238ce926dec62b3fbc99ab06eb1d85ce0270'; const pluginName = 'Kiln'; -const abi_path = `../cal/abis/${contractAddr}.json`; +const abi_path = `../cal/ethereum/abis/${contractAddr}.json`; const abi = require(abi_path); nano_models.forEach(function (model) { diff --git a/tests/src/eigenlayer/lrCompleteQueuedWithdrawals.test.js b/tests/src/eigenlayer/lrCompleteQueuedWithdrawals.test.js new file mode 100644 index 0000000..6c863bb --- /dev/null +++ b/tests/src/eigenlayer/lrCompleteQueuedWithdrawals.test.js @@ -0,0 +1,383 @@ +import 'core-js/stable'; +import 'regenerator-runtime/runtime'; +import { + waitForAppScreen, + zemu, + genericTx, + nano_models, +} from '../test.fixture'; +import { ethers } from 'ethers'; +import { parseEther } from 'ethers/lib/utils'; +import { ledgerService } from '@ledgerhq/hw-app-eth'; + +const contractAddr = '0x858646372cc42e1a627fce94aa7a7033e7cf075a'; // strategy manager + +const abi_path = `../cal/ethereum/abis/${contractAddr}.json`; +const abi = require(abi_path); + +nano_models.forEach(function (model) { + test( + '[Nano ' + model.letter + '] LR Complete Queued Withdrawals 2', + zemu(model, async (sim, eth) => { + const contract = new ethers.Contract(contractAddr, abi); + // + // struct Withdrawal { + // address staker; + // address delegatedTo; + // address withdrawer; + // uint256 nonce; + // uint32 startBlock; + // address[] strategies; + // uint256[] shares; + // } + // + // function completeQueuedWithdrawals( + // Withdrawal[] calldata withdrawals, + // address[][] calldata tokens, + // uint256[] calldata middlewareTimesIndexes, + // bool[] calldata receiveAsTokens + // ) external + // + const { data } = + await contract.populateTransaction.completeQueuedWithdrawals( + [ + { + staker: '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045', + delegatedTo: '0x1f8C8b1d78d01bCc42ebdd34Fae60181bD697662', + withdrawer: '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045', + nonce: 0, + startBlock: 0, + strategies: [ + '0x54945180dB7943c0ed0FEE7EdaB2Bd24620256bc', // cbETH + '0x93c4b944D05dfe6df7645A86cd2206016c51564D', // stETH + ], + shares: [parseEther('0.1'), parseEther('0.2')], + }, + { + staker: '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045', + delegatedTo: '0x1f8C8b1d78d01bCc42ebdd34Fae60181bD697662', + withdrawer: '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045', + nonce: 1, + startBlock: 1, + strategies: [ + '0x54945180dB7943c0ed0FEE7EdaB2Bd24620256bc', // cbETH + '0x93c4b944D05dfe6df7645A86cd2206016c51564D', // stETH + ], + shares: [parseEther('2'), parseEther('3')], + }, + ], + [ + [ + '0xBe9895146f7AF43049ca1c1AE358B0541Ea49704', // cbETH + '0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84', // stETH + ], + [ + '0xBe9895146f7AF43049ca1c1AE358B0541Ea49704', // cbETH + '0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84', // stETH + ], + ], + [0, 0], + [false, false] + ); + + let unsignedTx = genericTx; + + unsignedTx.to = contractAddr; + unsignedTx.data = data; + unsignedTx.value = parseEther('0'); + + const serializedTx = ethers.utils + .serializeTransaction(unsignedTx) + .slice(2); + const resolution = await ledgerService.resolveTransaction( + serializedTx, + eth.loadConfig, + { + externalPlugins: true, + } + ); + const tx = eth.signTransaction("44'/60'/0'/0", serializedTx, resolution); + const right_clicks = model.letter === 'S' ? 12 : 9; + + await waitForAppScreen(sim); + await sim.navigateAndCompareSnapshots( + '.', + model.name + '_lrCompleteQueuedWithdrawals', + [right_clicks, 0] + ); + await tx; + }), + 30000 + ); + + test( + '[Nano ' + model.letter + '] LR Complete Queued Withdrawals Redelegate 1', + zemu(model, async (sim, eth) => { + const contract = new ethers.Contract(contractAddr, abi); + // + // struct Withdrawal { + // address staker; + // address delegatedTo; + // address withdrawer; + // uint256 nonce; + // uint32 startBlock; + // address[] strategies; + // uint256[] shares; + // } + // + // function completeQueuedWithdrawals( + // Withdrawal[] calldata withdrawals, + // address[][] calldata tokens, + // uint256[] calldata middlewareTimesIndexes, + // bool[] calldata receiveAsTokens + // ) external + // + const { data } = + await contract.populateTransaction.completeQueuedWithdrawals( + [ + { + staker: '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045', + delegatedTo: '0x1f8C8b1d78d01bCc42ebdd34Fae60181bD697662', + withdrawer: '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045', + nonce: 0, + startBlock: 0, + strategies: [ + '0x54945180dB7943c0ed0FEE7EdaB2Bd24620256bc', // cbETH + ], + shares: [parseEther('0.1')], + }, + ], + [ + [ + '0xBe9895146f7AF43049ca1c1AE358B0541Ea49704', // cbETH + ], + ], + [0], + [false] + ); + + let unsignedTx = genericTx; + + unsignedTx.to = contractAddr; + unsignedTx.data = data; + unsignedTx.value = parseEther('0'); + + const serializedTx = ethers.utils + .serializeTransaction(unsignedTx) + .slice(2); + const resolution = await ledgerService.resolveTransaction( + serializedTx, + eth.loadConfig, + { + externalPlugins: true, + } + ); + const tx = eth.signTransaction("44'/60'/0'/0", serializedTx, resolution); + const right_clicks = model.letter === 'S' ? 9 : 6; + + await waitForAppScreen(sim); + await sim.navigateAndCompareSnapshots( + '.', + model.name + '_lrCompleteQueuedWithdrawals_redelegate_1', + [right_clicks, 0] + ); + await tx; + }), + 30000 + ); + + test( + '[Nano ' + model.letter + '] LR Complete Queued Withdrawals 1', + zemu(model, async (sim, eth) => { + const contract = new ethers.Contract(contractAddr, abi); + // + // struct Withdrawal { + // address staker; + // address delegatedTo; + // address withdrawer; + // uint256 nonce; + // uint32 startBlock; + // address[] strategies; + // uint256[] shares; + // } + // + // function completeQueuedWithdrawals( + // Withdrawal[] calldata withdrawals, + // address[][] calldata tokens, + // uint256[] calldata middlewareTimesIndexes, + // bool[] calldata receiveAsTokens + // ) external + // + const { data } = + await contract.populateTransaction.completeQueuedWithdrawals( + [ + { + staker: '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045', + delegatedTo: '0x1f8C8b1d78d01bCc42ebdd34Fae60181bD697662', + withdrawer: '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045', + nonce: 0, + startBlock: 0, + strategies: [ + '0x54945180dB7943c0ed0FEE7EdaB2Bd24620256bc', // cbETH + ], + shares: [parseEther('0.1')], + }, + ], + [ + [ + '0xBe9895146f7AF43049ca1c1AE358B0541Ea49704', // cbETH + ], + ], + [0], + [true] + ); + + let unsignedTx = genericTx; + + unsignedTx.to = contractAddr; + unsignedTx.data = data; + unsignedTx.value = parseEther('0'); + + const serializedTx = ethers.utils + .serializeTransaction(unsignedTx) + .slice(2); + const resolution = await ledgerService.resolveTransaction( + serializedTx, + eth.loadConfig, + { + externalPlugins: true, + } + ); + const tx = eth.signTransaction("44'/60'/0'/0", serializedTx, resolution); + const right_clicks = model.letter === 'S' ? 9 : 6; + + await waitForAppScreen(sim); + await sim.navigateAndCompareSnapshots( + '.', + model.name + '_lrCompleteQueuedWithdrawals_1', + [right_clicks, 0] + ); + await tx; + }), + 30000 + ); + + test( + '[Nano ' + model.letter + '] LR Complete Queued Withdrawals 8', + zemu(model, async (sim, eth) => { + const contract = new ethers.Contract(contractAddr, abi); + // + // struct Withdrawal { + // address staker; + // address delegatedTo; + // address withdrawer; + // uint256 nonce; + // uint32 startBlock; + // address[] strategies; + // uint256[] shares; + // } + // + // function completeQueuedWithdrawals( + // Withdrawal[] calldata withdrawals, + // address[][] calldata tokens, + // uint256[] calldata middlewareTimesIndexes, + // bool[] calldata receiveAsTokens + // ) external + // + const { data } = + await contract.populateTransaction.completeQueuedWithdrawals( + [ + { + staker: '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045', + delegatedTo: '0x1f8C8b1d78d01bCc42ebdd34Fae60181bD697662', + withdrawer: '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045', + nonce: 0, + startBlock: 0, + strategies: [ + '0x54945180dB7943c0ed0FEE7EdaB2Bd24620256bc', // cbETH + '0x93c4b944D05dfe6df7645A86cd2206016c51564D', // stETH + '0x57ba429517c3473B6d34CA9aCd56c0e735b94c02', // osETH + '0x7CA911E83dabf90C90dD3De5411a10F1A6112184', // wBETH + ], + shares: [ + parseEther('0.1'), + parseEther('0.2'), + parseEther('0.3'), + parseEther('0.4'), + ], + }, + { + staker: '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045', + delegatedTo: '0x1f8C8b1d78d01bCc42ebdd34Fae60181bD697662', + withdrawer: '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045', + nonce: 1, + startBlock: 1, + strategies: [ + '0x54945180dB7943c0ed0FEE7EdaB2Bd24620256bc', // cbETH + '0x93c4b944D05dfe6df7645A86cd2206016c51564D', // stETH + '0xae78736Cd615f374D3085123A210448E74Fc6393', // UNKNOWN + ], + shares: [parseEther('2'), parseEther('3'), parseEther('4')], + }, + { + staker: '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045', + delegatedTo: '0x1f8C8b1d78d01bCc42ebdd34Fae60181bD697662', + withdrawer: '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045', + nonce: 2, + startBlock: 1, + strategies: [ + '0xa4C637e0F704745D182e4D38cAb7E7485321d059', // OETH + ], + shares: [parseEther('17')], + }, + ], + [ + [ + '0xBe9895146f7AF43049ca1c1AE358B0541Ea49704', // cbETH + '0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84', // stETH + '0xf1C9acDc66974dFB6dEcB12aA385b9cD01190E38', // osETH + '0xa2E3356610840701BDf5611a53974510Ae27E2e1', // wBETH + ], + [ + '0xBe9895146f7AF43049ca1c1AE358B0541Ea49704', // cbETH + '0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84', // stETH + '0xae78736Cd615f374D3085123A210448E74Fc6393', // rETH + ], + [ + '0x856c4Efb76C1D1AE02e20CEB03A2A6a08b0b8dC3', // OETH + ], + ], + [0, 0, 1], + [false, true, true] + ); + + let unsignedTx = genericTx; + + unsignedTx.to = contractAddr; + unsignedTx.data = data; + unsignedTx.value = parseEther('0'); + + const serializedTx = ethers.utils + .serializeTransaction(unsignedTx) + .slice(2); + const resolution = await ledgerService.resolveTransaction( + serializedTx, + eth.loadConfig, + { + externalPlugins: true, + } + ); + const tx = eth.signTransaction("44'/60'/0'/0", serializedTx, resolution); + const right_clicks = model.letter === 'S' ? 16 : 13; + + await waitForAppScreen(sim); + await sim.navigateAndCompareSnapshots( + '.', + model.name + '_lrCompleteQueuedWithdrawals_8', + [right_clicks, 0] + ); + await tx; + }), + 30000 + ); +}); diff --git a/tests/src/eigenlayer/lrDelegateTo.test.js b/tests/src/eigenlayer/lrDelegateTo.test.js new file mode 100644 index 0000000..60deffb --- /dev/null +++ b/tests/src/eigenlayer/lrDelegateTo.test.js @@ -0,0 +1,110 @@ +import 'core-js/stable'; +import 'regenerator-runtime/runtime'; +import { + waitForAppScreen, + kilnJSON, + zemu, + genericTx, + nano_models, + SPECULOS_ADDRESS, + txFromEtherscan, +} from '../test.fixture'; +import { ethers } from 'ethers'; +import { parseEther, parseUnits } from 'ethers/lib/utils'; +import { ledgerService } from '@ledgerhq/hw-app-eth'; + +const contractAddr = '0x39053d51b77dc0d36036fc1fcc8cb819df8ef37a'; // delegation manager + +const pluginName = 'Kiln'; +const abi_path = `../cal/ethereum/abis/${contractAddr}.json`; +const abi = require(abi_path); + +nano_models.forEach(function (model) { + test( + '[Nano ' + model.letter + '] LR Delegate To - is Kiln', + zemu(model, async (sim, eth) => { + const contract = new ethers.Contract(contractAddr, abi); + + const { data } = await contract.populateTransaction.delegateTo( + '0x1f8C8b1d78d01bCc42ebdd34Fae60181bD697662', // kiln operator + { + signature: '0x1111111111111111', + expiry: 42424242, + }, + ethers.utils.formatBytes32String('salt') + ); + + let unsignedTx = genericTx; + + unsignedTx.to = contractAddr; + unsignedTx.data = data; + unsignedTx.value = parseEther('0'); + + const serializedTx = ethers.utils + .serializeTransaction(unsignedTx) + .slice(2); + const resolution = await ledgerService.resolveTransaction( + serializedTx, + eth.loadConfig, + { + externalPlugins: true, + } + ); + const tx = eth.signTransaction("44'/60'/0'/0", serializedTx, resolution); + const right_clicks = model.letter === 'S' ? 5 : 5; + + await waitForAppScreen(sim); + await sim.navigateAndCompareSnapshots( + '.', + model.name + '_delegate_to_is_kiln', + [right_clicks, 0] + ); + await tx; + }), + 30000 + ); + + test( + '[Nano ' + model.letter + '] LR Delegate To - is NOT Kiln', + zemu(model, async (sim, eth) => { + const contract = new ethers.Contract(contractAddr, abi); + + const { data } = await contract.populateTransaction.delegateTo( + '0x645a845f80576a25f1b412330a108780f6c4573d', // not kiln operator + { + signature: '0x1111111111111111', + expiry: 42424242424242, + }, + ethers.utils.formatBytes32String('salt') + ); + + let unsignedTx = genericTx; + + unsignedTx.to = contractAddr; + unsignedTx.data = data; + unsignedTx.value = parseEther('0'); + + const serializedTx = ethers.utils + .serializeTransaction(unsignedTx) + .slice(2); + const resolution = await ledgerService.resolveTransaction( + serializedTx, + eth.loadConfig, + { + externalPlugins: true, + } + ); + const tx = eth.signTransaction("44'/60'/0'/0", serializedTx, resolution); + const right_clicks = model.letter === 'S' ? 7 : 5; + + await waitForAppScreen(sim); + await sim.navigateAndCompareSnapshots( + '.', + model.name + '_delegate_to_is_not_kiln', + [right_clicks, 0] + ); + await tx; + }), + 30000 + ); +}); diff --git a/tests/src/eigenlayer/lrDepositIntoStrategy.test.js b/tests/src/eigenlayer/lrDepositIntoStrategy.test.js new file mode 100644 index 0000000..b2a6b2c --- /dev/null +++ b/tests/src/eigenlayer/lrDepositIntoStrategy.test.js @@ -0,0 +1,143 @@ +import 'core-js/stable'; +import 'regenerator-runtime/runtime'; +import { + waitForAppScreen, + kilnJSON, + zemu, + genericTx, + nano_models, + SPECULOS_ADDRESS, + txFromEtherscan, +} from '../test.fixture'; +import { ethers } from 'ethers'; +import { parseEther, parseUnits } from 'ethers/lib/utils'; +import { ledgerService } from '@ledgerhq/hw-app-eth'; + +const contractAddr = '0x858646372cc42e1a627fce94aa7a7033e7cf075a'; // strategy manager + +const pluginName = 'Kiln'; +const abi_path = `../cal/ethereum/abis/${contractAddr}.json`; +const abi = require(abi_path); +const right_clicks = 6; + +nano_models.forEach(function (model) { + test( + '[Nano ' + model.letter + '] LR Deposit Into Strategy Normal', + zemu(model, async (sim, eth) => { + const contract = new ethers.Contract(contractAddr, abi); + + const { data } = await contract.populateTransaction.depositIntoStrategy( + '0x9d7eD45EE2E8FC5482fa2428f15C971e6369011d', // ETHx strat + '0xA35b1B31Ce002FBF2058D22F30f95D405200A15b', // ETHx erc20 + '420000000000000' + ); + + let unsignedTx = genericTx; + + unsignedTx.to = contractAddr; + unsignedTx.data = data; + unsignedTx.value = parseEther('0'); + + const serializedTx = ethers.utils + .serializeTransaction(unsignedTx) + .slice(2); + const resolution = await ledgerService.resolveTransaction( + serializedTx, + eth.loadConfig, + { + externalPlugins: true, + } + ); + const tx = eth.signTransaction("44'/60'/0'/0", serializedTx, resolution); + + await waitForAppScreen(sim); + await sim.navigateAndCompareSnapshots( + '.', + model.name + '_lrDepositIntoStrategyNormal', + [right_clicks, 0] + ); + await tx; + }), + 30000 + ); + + test( + '[Nano ' + model.letter + '] Deposit Into Strategy Unknown strategy', + zemu(model, async (sim, eth) => { + const contract = new ethers.Contract(contractAddr, abi); + + const { data } = await contract.populateTransaction.depositIntoStrategy( + '0x1e68238ce926dec62b3fbc99ab06eb1d85ce0270', // unknown strat + '0xac3E018457B222d93114458476f3E3416Abbe38F', // sfrxETH erc20 + '420000000000000' + ); + + let unsignedTx = genericTx; + + unsignedTx.to = contractAddr; + unsignedTx.data = data; + unsignedTx.value = parseEther('0'); + + const serializedTx = ethers.utils + .serializeTransaction(unsignedTx) + .slice(2); + const resolution = await ledgerService.resolveTransaction( + serializedTx, + eth.loadConfig, + { + externalPlugins: true, + } + ); + const tx = eth.signTransaction("44'/60'/0'/0", serializedTx, resolution); + + await waitForAppScreen(sim); + await sim.navigateAndCompareSnapshots( + '.', + model.name + '_lrDepositIntoStrategyUnknownStrategy', + [right_clicks, 0] + ); + await tx; + }), + 30000 + ); + + test( + '[Nano ' + model.letter + '] Deposit Into Strategy Unknown erc20', + zemu(model, async (sim, eth) => { + const contract = new ethers.Contract(contractAddr, abi); + + const { data } = await contract.populateTransaction.depositIntoStrategy( + '0x298aFB19A105D59E74658C4C334Ff360BadE6dd2', // mETH strategy + '0x1e68238ce926dec62b3fbc99ab06eb1d85ce0270', // unknown erc20 + '420000000000000' + ); + + let unsignedTx = genericTx; + + unsignedTx.to = contractAddr; + unsignedTx.data = data; + unsignedTx.value = parseEther('0'); + + const serializedTx = ethers.utils + .serializeTransaction(unsignedTx) + .slice(2); + const resolution = await ledgerService.resolveTransaction( + serializedTx, + eth.loadConfig, + { + externalPlugins: true, + } + ); + const tx = eth.signTransaction("44'/60'/0'/0", serializedTx, resolution); + + await waitForAppScreen(sim); + await sim.navigateAndCompareSnapshots( + '.', + model.name + '_lrDepositIntoStrategyUnknownERC20', + [right_clicks, 0] + ); + await tx; + }), + 30000 + ); +}); diff --git a/tests/src/eigenlayer/lrQueueWithdrawals.test.js b/tests/src/eigenlayer/lrQueueWithdrawals.test.js new file mode 100644 index 0000000..aba811c --- /dev/null +++ b/tests/src/eigenlayer/lrQueueWithdrawals.test.js @@ -0,0 +1,176 @@ +import 'core-js/stable'; +import 'regenerator-runtime/runtime'; +import { + waitForAppScreen, + zemu, + genericTx, + nano_models, +} from '../test.fixture'; +import { ethers } from 'ethers'; +import { parseEther } from 'ethers/lib/utils'; +import { ledgerService } from '@ledgerhq/hw-app-eth'; + +const contractAddr = '0x858646372cc42e1a627fce94aa7a7033e7cf075a'; // strategy manager + +const abi_path = `../cal/ethereum/abis/${contractAddr}.json`; +const abi = require(abi_path); + +nano_models.forEach(function (model) { + test( + '[Nano ' + model.letter + '] LR Queue Withdrawals 1-2 dimension', + zemu(model, async (sim, eth) => { + const contract = new ethers.Contract(contractAddr, abi); + + const { data } = await contract.populateTransaction.queueWithdrawals([ + { + strategies: [ + '0x54945180dB7943c0ed0FEE7EdaB2Bd24620256bc', // cbETH + '0x13760F50a9d7377e4F20CB8CF9e4c26586c658ff', // ankrETH + ], + shares: [parseEther('0.1'), parseEther('0.2')], + withdrawer: '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045', + }, + ]); + + let unsignedTx = genericTx; + + unsignedTx.to = contractAddr; + unsignedTx.data = data; + unsignedTx.value = parseEther('0'); + + const serializedTx = ethers.utils + .serializeTransaction(unsignedTx) + .slice(2); + const resolution = await ledgerService.resolveTransaction( + serializedTx, + eth.loadConfig, + { + externalPlugins: true, + } + ); + const tx = eth.signTransaction("44'/60'/0'/0", serializedTx, resolution); + const right_clicks = model.letter === 'S' ? 9 : 7; + + await waitForAppScreen(sim); + await sim.navigateAndCompareSnapshots( + '.', + model.name + '_lrQueueWithdrawals_1_2_dimension', + [right_clicks, 0] + ); + await tx; + }), + 10000 + ); + + test( + '[Nano ' + model.letter + '] LR Queue Withdrawals 2-3 dimension', + zemu(model, async (sim, eth) => { + const contract = new ethers.Contract(contractAddr, abi); + + const { data } = await contract.populateTransaction.queueWithdrawals([ + { + strategies: [ + '0x54945180dB7943c0ed0FEE7EdaB2Bd24620256bc', // cbETH + '0x13760F50a9d7377e4F20CB8CF9e4c26586c658ff', // ankrETH + '0x57ba429517c3473B6d34CA9aCd56c0e735b94c02', // osETH + ], + shares: [parseEther('0.1'), parseEther('0.2'), parseEther('0.3')], + withdrawer: '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045', + }, + { + strategies: [ + '0x298aFB19A105D59E74658C4C334Ff360BadE6dd2', // mETH + '0x54945180dB7943c0ed0FEE7EdaB2Bd24620256bc', // cbETH + '0xa4C637e0F704745D182e4D38cAb7E7485321d059', // OETH + ], + shares: [parseEther('0.5'), parseEther('0.1'), parseEther('0.2')], + withdrawer: '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045', + }, + ]); + + let unsignedTx = genericTx; + + unsignedTx.to = contractAddr; + unsignedTx.data = data; + unsignedTx.value = parseEther('0'); + + const serializedTx = ethers.utils + .serializeTransaction(unsignedTx) + .slice(2); + const resolution = await ledgerService.resolveTransaction( + serializedTx, + eth.loadConfig, + { + externalPlugins: true, + } + ); + const tx = eth.signTransaction("44'/60'/0'/0", serializedTx, resolution); + const right_clicks = model.letter === 'S' ? 13 : 11; + + await waitForAppScreen(sim); + await sim.navigateAndCompareSnapshots( + '.', + model.name + '_lrQueueWithdrawals_2_3_dimension', + [right_clicks, 0] + ); + await tx; + }), + 10000 + ); + + test( + '[Nano ' + model.letter + '] LR Queue Withdrawals unknown strategy', + zemu(model, async (sim, eth) => { + const contract = new ethers.Contract(contractAddr, abi); + + const { data } = await contract.populateTransaction.queueWithdrawals([ + { + strategies: [ + '0x54945180dB7943c0ed0FEE7EdaB2Bd24620256bc', // cbETH + '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045', // unkwown strategy + '0x57ba429517c3473B6d34CA9aCd56c0e735b94c02', // osETH + ], + shares: [parseEther('0.1'), parseEther('0.2'), parseEther('0.3')], + withdrawer: '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045', + }, + { + strategies: [ + '0x298aFB19A105D59E74658C4C334Ff360BadE6dd2', // mETH + '0xa4C637e0F704745D182e4D38cAb7E7485321d059', // OETH + '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045', // unkwown strategy + ], + shares: [parseEther('0.5'), parseEther('0.1'), parseEther('0.2')], + withdrawer: '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045', + }, + ]); + + let unsignedTx = genericTx; + + unsignedTx.to = contractAddr; + unsignedTx.data = data; + unsignedTx.value = parseEther('0'); + + const serializedTx = ethers.utils + .serializeTransaction(unsignedTx) + .slice(2); + const resolution = await ledgerService.resolveTransaction( + serializedTx, + eth.loadConfig, + { + externalPlugins: true, + } + ); + const tx = eth.signTransaction("44'/60'/0'/0", serializedTx, resolution); + const right_clicks = model.letter === 'S' ? 13 : 11; + + await waitForAppScreen(sim); + await sim.navigateAndCompareSnapshots( + '.', + model.name + '_lrQueueWithdrawals_2_3_dimension_with_unknowns', + [right_clicks, 0] + ); + await tx; + }), + 10000 + ); +}); diff --git a/tests/src/eigenlayer/lrUndelegate.test.js b/tests/src/eigenlayer/lrUndelegate.test.js new file mode 100644 index 0000000..6f4c2fa --- /dev/null +++ b/tests/src/eigenlayer/lrUndelegate.test.js @@ -0,0 +1,61 @@ +import 'core-js/stable'; +import 'regenerator-runtime/runtime'; +import { + waitForAppScreen, + kilnJSON, + zemu, + genericTx, + nano_models, + SPECULOS_ADDRESS, + txFromEtherscan, +} from '../test.fixture'; +import { ethers } from 'ethers'; +import { parseEther, parseUnits } from 'ethers/lib/utils'; +import { ledgerService } from '@ledgerhq/hw-app-eth'; + +const contractAddr = '0x39053d51b77dc0d36036fc1fcc8cb819df8ef37a'; // delegation manager + +const pluginName = 'Kiln'; +const abi_path = `../cal/ethereum/abis/${contractAddr}.json`; +const abi = require(abi_path); + +nano_models.forEach(function (model) { + test( + '[Nano ' + model.letter + '] LR Undelegate', + zemu(model, async (sim, eth) => { + const contract = new ethers.Contract(contractAddr, abi); + + const { data } = await contract.populateTransaction.undelegate( + '0x645a845f80576a25f1b412330a108780f6c4573d' + ); + + let unsignedTx = genericTx; + + unsignedTx.to = contractAddr; + unsignedTx.data = data; + unsignedTx.value = parseEther('0'); + + const serializedTx = ethers.utils + .serializeTransaction(unsignedTx) + .slice(2); + const resolution = await ledgerService.resolveTransaction( + serializedTx, + eth.loadConfig, + { + externalPlugins: true, + } + ); + const tx = eth.signTransaction("44'/60'/0'/0", serializedTx, resolution); + const right_clicks = model.letter === 'S' ? 4 : 4; + + await waitForAppScreen(sim); + await sim.navigateAndCompareSnapshots( + '.', + model.name + '_lr_undelegate', + [right_clicks, 0] + ); + await tx; + }), + 30000 + ); +}); diff --git a/tests/src/lrCompleteQueuedWithdrawals.test.js b/tests/src/lrCompleteQueuedWithdrawals.test.js index 1e10128..2cef670 100644 --- a/tests/src/lrCompleteQueuedWithdrawals.test.js +++ b/tests/src/lrCompleteQueuedWithdrawals.test.js @@ -7,7 +7,7 @@ import { ledgerService } from '@ledgerhq/hw-app-eth'; const contractAddr = '0x858646372cc42e1a627fce94aa7a7033e7cf075a'; // strategy manager -const abi_path = `../cal/abis/${contractAddr}.json`; +const abi_path = `../cal/ethereum/abis/${contractAddr}.json`; const abi = require(abi_path); nano_models.forEach(function (model) { diff --git a/tests/src/lrDelegateTo.test.js b/tests/src/lrDelegateTo.test.js index 4fb91bc..49e1be8 100644 --- a/tests/src/lrDelegateTo.test.js +++ b/tests/src/lrDelegateTo.test.js @@ -16,7 +16,7 @@ import { ledgerService } from '@ledgerhq/hw-app-eth'; const contractAddr = '0x39053d51b77dc0d36036fc1fcc8cb819df8ef37a'; // delegation manager const pluginName = 'Kiln'; -const abi_path = `../cal/abis/${contractAddr}.json`; +const abi_path = `../cal/ethereum/abis/${contractAddr}.json`; const abi = require(abi_path); nano_models.forEach(function (model) { diff --git a/tests/src/lrDepositIntoStrategy.test.js b/tests/src/lrDepositIntoStrategy.test.js index 3491634..4af870d 100644 --- a/tests/src/lrDepositIntoStrategy.test.js +++ b/tests/src/lrDepositIntoStrategy.test.js @@ -16,7 +16,7 @@ import { ledgerService } from '@ledgerhq/hw-app-eth'; const contractAddr = '0x858646372cc42e1a627fce94aa7a7033e7cf075a'; // strategy manager const pluginName = 'Kiln'; -const abi_path = `../cal/abis/${contractAddr}.json`; +const abi_path = `../cal/ethereum/abis/${contractAddr}.json`; const abi = require(abi_path); const right_clicks = 6; diff --git a/tests/src/lrQueueWithdrawals.test.js b/tests/src/lrQueueWithdrawals.test.js index 5391986..f20dca5 100644 --- a/tests/src/lrQueueWithdrawals.test.js +++ b/tests/src/lrQueueWithdrawals.test.js @@ -7,7 +7,7 @@ import { ledgerService } from '@ledgerhq/hw-app-eth'; const contractAddr = '0x858646372cc42e1a627fce94aa7a7033e7cf075a'; // strategy manager -const abi_path = `../cal/abis/${contractAddr}.json`; +const abi_path = `../cal/ethereum/abis/${contractAddr}.json`; const abi = require(abi_path); nano_models.forEach(function (model) { diff --git a/tests/src/lrUndelegate.test.js b/tests/src/lrUndelegate.test.js index 18bdda8..9d54777 100644 --- a/tests/src/lrUndelegate.test.js +++ b/tests/src/lrUndelegate.test.js @@ -16,7 +16,7 @@ import { ledgerService } from '@ledgerhq/hw-app-eth'; const contractAddr = '0x39053d51b77dc0d36036fc1fcc8cb819df8ef37a'; // delegation manager const pluginName = 'Kiln'; -const abi_path = `../cal/abis/${contractAddr}.json`; +const abi_path = `../cal/ethereum/abis/${contractAddr}.json`; const abi = require(abi_path); nano_models.forEach(function (model) { diff --git a/tests/src/multiClaim.v2.test.js b/tests/src/multiClaim.v2.test.js index 0faab39..439d357 100644 --- a/tests/src/multiClaim.v2.test.js +++ b/tests/src/multiClaim.v2.test.js @@ -8,7 +8,7 @@ import { ledgerService } from '@ledgerhq/hw-app-eth'; const contractAddr = '0x5db5235b5c7e247488784986e58019fffd98fda4'; const pluginName = 'Kiln'; -const abi_path = `../cal/abis/${contractAddr}.json`; +const abi_path = `../cal/ethereum/abis/${contractAddr}.json`; const abi = require(abi_path); nano_models.forEach(function (model) { diff --git a/tests/src/ocv1/batchWithdraw.test.js b/tests/src/ocv1/batchWithdraw.test.js new file mode 100644 index 0000000..709f64f --- /dev/null +++ b/tests/src/ocv1/batchWithdraw.test.js @@ -0,0 +1,65 @@ +import 'core-js/stable'; +import 'regenerator-runtime/runtime'; +import { + waitForAppScreen, + zemu, + genericTx, + nano_models, + SPECULOS_ADDRESS, + txFromEtherscan, +} from '../test.fixture'; +import { ethers } from 'ethers'; +import { parseEther, parseUnits } from 'ethers/lib/utils'; +import { ledgerService } from '@ledgerhq/hw-app-eth'; + +const contractAddr = '0x1e68238ce926dec62b3fbc99ab06eb1d85ce0270'; + +const pluginName = 'Kiln'; +const abi_path = `../cal/ethereum/abis/${contractAddr}.json`; +const abi = require(abi_path); + +nano_models.forEach(function (model) { + test( + '[Nano ' + model.letter + '] BatchWithdraw', + zemu(model, async (sim, eth) => { + const contract = new ethers.Contract(contractAddr, abi); + + const pubkeys = + '0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb'; + + const { data } = await contract.populateTransaction.batchWithdraw( + pubkeys + ); + + let unsignedTx = genericTx; + + unsignedTx.value = 0; + unsignedTx.to = contractAddr; + unsignedTx.data = data; + + const serializedTx = ethers.utils + .serializeTransaction(unsignedTx) + .slice(2); + const resolution = await ledgerService.resolveTransaction( + serializedTx, + eth.loadConfig, + { + externalPlugins: true, + } + ); + const tx = eth.signTransaction("44'/60'/0'/0", serializedTx, resolution); + const right_clicks = 4; + + await waitForAppScreen(sim); + + await sim.navigateAndCompareSnapshots( + '.', + model.name + '_batchWithdraw', + [right_clicks, 0] + ); + + await tx; + }), + 10000 + ); +}); diff --git a/tests/src/ocv1/batchWithdrawCL.test.js b/tests/src/ocv1/batchWithdrawCL.test.js new file mode 100644 index 0000000..ddb706f --- /dev/null +++ b/tests/src/ocv1/batchWithdrawCL.test.js @@ -0,0 +1,65 @@ +import 'core-js/stable'; +import 'regenerator-runtime/runtime'; +import { + waitForAppScreen, + zemu, + genericTx, + nano_models, + SPECULOS_ADDRESS, + txFromEtherscan, +} from '../test.fixture'; +import { ethers } from 'ethers'; +import { parseEther, parseUnits } from 'ethers/lib/utils'; +import { ledgerService } from '@ledgerhq/hw-app-eth'; + +const contractAddr = '0x1e68238ce926dec62b3fbc99ab06eb1d85ce0270'; + +const pluginName = 'Kiln'; +const abi_path = `../cal/ethereum/abis/${contractAddr}.json`; +const abi = require(abi_path); + +nano_models.forEach(function (model) { + test( + '[Nano ' + model.letter + '] BatchWithdrawCL', + zemu(model, async (sim, eth) => { + const contract = new ethers.Contract(contractAddr, abi); + + const pubkeys = + '0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb'; + + const { data } = await contract.populateTransaction.batchWithdrawCLFee( + pubkeys + ); + + let unsignedTx = genericTx; + + unsignedTx.value = 0; + unsignedTx.to = contractAddr; + unsignedTx.data = data; + + const serializedTx = ethers.utils + .serializeTransaction(unsignedTx) + .slice(2); + const resolution = await ledgerService.resolveTransaction( + serializedTx, + eth.loadConfig, + { + externalPlugins: true, + } + ); + const tx = eth.signTransaction("44'/60'/0'/0", serializedTx, resolution); + const right_clicks = 4; + + await waitForAppScreen(sim); + + await sim.navigateAndCompareSnapshots( + '.', + model.name + '_batchWithdrawCL', + [right_clicks, 0] + ); + + await tx; + }), + 10000 + ); +}); diff --git a/tests/src/ocv1/batchWithdrawEL.test.js b/tests/src/ocv1/batchWithdrawEL.test.js new file mode 100644 index 0000000..3a822b9 --- /dev/null +++ b/tests/src/ocv1/batchWithdrawEL.test.js @@ -0,0 +1,65 @@ +import 'core-js/stable'; +import 'regenerator-runtime/runtime'; +import { + waitForAppScreen, + zemu, + genericTx, + nano_models, + SPECULOS_ADDRESS, + txFromEtherscan, +} from '../test.fixture'; +import { ethers } from 'ethers'; +import { parseEther, parseUnits } from 'ethers/lib/utils'; +import { ledgerService } from '@ledgerhq/hw-app-eth'; + +const contractAddr = '0x1e68238ce926dec62b3fbc99ab06eb1d85ce0270'; + +const pluginName = 'Kiln'; +const abi_path = `../cal/ethereum/abis/${contractAddr}.json`; +const abi = require(abi_path); + +nano_models.forEach(function (model) { + test( + '[Nano ' + model.letter + '] BatchWithdrawEL', + zemu(model, async (sim, eth) => { + const contract = new ethers.Contract(contractAddr, abi); + + const pubkeys = + '0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb'; + + const { data } = await contract.populateTransaction.batchWithdrawELFee( + pubkeys + ); + + let unsignedTx = genericTx; + + unsignedTx.value = 0; + unsignedTx.to = contractAddr; + unsignedTx.data = data; + + const serializedTx = ethers.utils + .serializeTransaction(unsignedTx) + .slice(2); + const resolution = await ledgerService.resolveTransaction( + serializedTx, + eth.loadConfig, + { + externalPlugins: true, + } + ); + const tx = eth.signTransaction("44'/60'/0'/0", serializedTx, resolution); + const right_clicks = 4; + + await waitForAppScreen(sim); + + await sim.navigateAndCompareSnapshots( + '.', + model.name + '_batchWithdrawEL', + [right_clicks, 0] + ); + + await tx; + }), + 15000 + ); +}); diff --git a/tests/src/ocv1/deposit.test.js b/tests/src/ocv1/deposit.test.js new file mode 100644 index 0000000..f534926 --- /dev/null +++ b/tests/src/ocv1/deposit.test.js @@ -0,0 +1,58 @@ +import 'core-js/stable'; +import 'regenerator-runtime/runtime'; +import { + waitForAppScreen, + kilnJSON, + zemu, + genericTx, + nano_models, + SPECULOS_ADDRESS, + txFromEtherscan, +} from '../test.fixture'; +import { ethers } from 'ethers'; +import { parseEther, parseUnits } from 'ethers/lib/utils'; +import { ledgerService } from '@ledgerhq/hw-app-eth'; + +const contractAddr = '0x1e68238ce926dec62b3fbc99ab06eb1d85ce0270'; + +const pluginName = 'Kiln'; +const abi_path = `../cal/ethereum/abis/${contractAddr}.json`; +const abi = require(abi_path); + +nano_models.forEach(function (model) { + test( + '[Nano ' + model.letter + '] Stake Eth', + zemu(model, async (sim, eth) => { + const contract = new ethers.Contract(contractAddr, abi); + + const { data } = await contract.populateTransaction.deposit(); + + let unsignedTx = genericTx; + + unsignedTx.to = contractAddr; + unsignedTx.data = data; + unsignedTx.value = parseEther('32'); + + const serializedTx = ethers.utils + .serializeTransaction(unsignedTx) + .slice(2); + const resolution = await ledgerService.resolveTransaction( + serializedTx, + eth.loadConfig, + { + externalPlugins: true, + } + ); + const tx = eth.signTransaction("44'/60'/0'/0", serializedTx, resolution); + const right_clicks = 4; + + await waitForAppScreen(sim); + await sim.navigateAndCompareSnapshots('.', model.name + '_deposit', [ + right_clicks, + 0, + ]); + await tx; + }), + 30000 + ); +}); diff --git a/tests/src/ocv1/requestExit.test.js b/tests/src/ocv1/requestExit.test.js new file mode 100644 index 0000000..6da3e76 --- /dev/null +++ b/tests/src/ocv1/requestExit.test.js @@ -0,0 +1,65 @@ +import 'core-js/stable'; +import 'regenerator-runtime/runtime'; +import { + waitForAppScreen, + zemu, + genericTx, + nano_models, + SPECULOS_ADDRESS, + txFromEtherscan, +} from '../test.fixture'; +import { ethers } from 'ethers'; +import { parseEther, parseUnits } from 'ethers/lib/utils'; +import { ledgerService } from '@ledgerhq/hw-app-eth'; + +const contractAddr = '0x1e68238ce926dec62b3fbc99ab06eb1d85ce0270'; + +const pluginName = 'Kiln'; +const abi_path = `../cal/ethereum/abis/${contractAddr}.json`; +const abi = require(abi_path); + +nano_models.forEach(function (model) { + test( + '[Nano ' + model.letter + '] RequestValidatorsExit', + zemu(model, async (sim, eth) => { + const contract = new ethers.Contract(contractAddr, abi); + + const pubkeys = + '0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb'; + + const { data } = await contract.populateTransaction.requestValidatorsExit( + pubkeys + ); + + let unsignedTx = genericTx; + + unsignedTx.value = 0; + unsignedTx.to = contractAddr; + unsignedTx.data = data; + + const serializedTx = ethers.utils + .serializeTransaction(unsignedTx) + .slice(2); + const resolution = await ledgerService.resolveTransaction( + serializedTx, + eth.loadConfig, + { + externalPlugins: true, + } + ); + const tx = eth.signTransaction("44'/60'/0'/0", serializedTx, resolution); + const right_clicks = 4; + + await waitForAppScreen(sim); + + await sim.navigateAndCompareSnapshots( + '.', + model.name + '_requestValidatorsExit', + [right_clicks, 0] + ); + + await tx; + }), + 15000 + ); +}); diff --git a/tests/src/ocv1/withdraw.test.js b/tests/src/ocv1/withdraw.test.js new file mode 100644 index 0000000..e32448f --- /dev/null +++ b/tests/src/ocv1/withdraw.test.js @@ -0,0 +1,66 @@ +import 'core-js/stable'; +import 'regenerator-runtime/runtime'; +import { + waitForAppScreen, + zemu, + genericTx, + nano_models, + SPECULOS_ADDRESS, + txFromEtherscan, +} from '../test.fixture'; +import { ethers } from 'ethers'; +import { parseEther, parseUnits } from 'ethers/lib/utils'; +import { ledgerService } from '@ledgerhq/hw-app-eth'; + +const contractAddr = '0x1e68238ce926dec62b3fbc99ab06eb1d85ce0270'; + +const pluginName = 'Kiln'; +const abi_path = `../cal/ethereum/abis/${contractAddr}.json`; +const abi = require(abi_path); + +nano_models.forEach(function (model) { + test( + '[Nano ' + model.letter + '] Withdraw', + zemu(model, async (sim, eth) => { + const contract = new ethers.Contract(contractAddr, abi); + + const validatorAddress = + '0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'; + + const { data } = await contract.populateTransaction.withdraw( + validatorAddress + ); + + let unsignedTx = genericTx; + + unsignedTx.value = 0; + unsignedTx.to = contractAddr; + unsignedTx.data = data; + + const serializedTx = ethers.utils + .serializeTransaction(unsignedTx) + .slice(2); + console.log(eth.loadConfig); + const resolution = await ledgerService.resolveTransaction( + serializedTx, + eth.loadConfig, + { + externalPlugins: true, + } + ); + console.log(resolution); + const tx = eth.signTransaction("44'/60'/0'/0", serializedTx, resolution); + const right_clicks = 4; + + await waitForAppScreen(sim); + + await sim.navigateAndCompareSnapshots('.', model.name + '_withdraw', [ + right_clicks, + 0, + ]); + + await tx; + }), + 10000 + ); +}); diff --git a/tests/src/ocv1/withdrawCL.test.js b/tests/src/ocv1/withdrawCL.test.js new file mode 100644 index 0000000..3680b4f --- /dev/null +++ b/tests/src/ocv1/withdrawCL.test.js @@ -0,0 +1,64 @@ +import 'core-js/stable'; +import 'regenerator-runtime/runtime'; +import { + waitForAppScreen, + zemu, + genericTx, + nano_models, + SPECULOS_ADDRESS, + txFromEtherscan, +} from '../test.fixture'; +import { ethers } from 'ethers'; +import { parseEther, parseUnits } from 'ethers/lib/utils'; +import { ledgerService } from '@ledgerhq/hw-app-eth'; + +const contractAddr = '0x1e68238ce926dec62b3fbc99ab06eb1d85ce0270'; + +const pluginName = 'Kiln'; +const abi_path = `../cal/ethereum/abis/${contractAddr}.json`; +const abi = require(abi_path); + +nano_models.forEach(function (model) { + test( + '[Nano ' + model.letter + '] Withdraw CL', + zemu(model, async (sim, eth) => { + const contract = new ethers.Contract(contractAddr, abi); + + const validatorAddress = + '0x8905410ae09a0b89d6af7296e2d0ae19adb672744f600d8da9b6293259641aa6e316bee60936cc1459b3f8697343d0f0'; + + const { data } = await contract.populateTransaction.withdrawCLFee( + validatorAddress + ); + + let unsignedTx = genericTx; + + unsignedTx.value = 0; + unsignedTx.to = contractAddr; + unsignedTx.data = data; + + const serializedTx = ethers.utils + .serializeTransaction(unsignedTx) + .slice(2); + const resolution = await ledgerService.resolveTransaction( + serializedTx, + eth.loadConfig, + { + externalPlugins: true, + } + ); + const tx = eth.signTransaction("44'/60'/0'/0", serializedTx, resolution); + const right_clicks = 4; + + await waitForAppScreen(sim); + + await sim.navigateAndCompareSnapshots('.', model.name + '_withdrawCL', [ + right_clicks, + 0, + ]); + + await tx; + }), + 10000 + ); +}); diff --git a/tests/src/ocv1/withdrawEL.test.js b/tests/src/ocv1/withdrawEL.test.js new file mode 100644 index 0000000..90365e7 --- /dev/null +++ b/tests/src/ocv1/withdrawEL.test.js @@ -0,0 +1,64 @@ +import 'core-js/stable'; +import 'regenerator-runtime/runtime'; +import { + waitForAppScreen, + zemu, + genericTx, + nano_models, + SPECULOS_ADDRESS, + txFromEtherscan, +} from '../test.fixture'; +import { ethers } from 'ethers'; +import { parseEther, parseUnits } from 'ethers/lib/utils'; +import { ledgerService } from '@ledgerhq/hw-app-eth'; + +const contractAddr = '0x1e68238ce926dec62b3fbc99ab06eb1d85ce0270'; + +const pluginName = 'Kiln'; +const abi_path = `../cal/ethereum/abis/${contractAddr}.json`; +const abi = require(abi_path); + +nano_models.forEach(function (model) { + test( + '[Nano ' + model.letter + '] Withdraw EL', + zemu(model, async (sim, eth) => { + const contract = new ethers.Contract(contractAddr, abi); + + const validatorAddress = + '0x8905410ae09a0b89d6af7296e2d0ae19adb672744f600d8da9b6293259641aa6e316bee60936cc1459b3f8697343d0f0'; + + const { data } = await contract.populateTransaction.withdrawELFee( + validatorAddress + ); + + let unsignedTx = genericTx; + + unsignedTx.value = 0; + unsignedTx.to = contractAddr; + unsignedTx.data = data; + + const serializedTx = ethers.utils + .serializeTransaction(unsignedTx) + .slice(2); + const resolution = await ledgerService.resolveTransaction( + serializedTx, + eth.loadConfig, + { + externalPlugins: true, + } + ); + const tx = eth.signTransaction("44'/60'/0'/0", serializedTx, resolution); + const right_clicks = 4; + + await waitForAppScreen(sim); + + await sim.navigateAndCompareSnapshots('.', model.name + '_withdrawEL', [ + right_clicks, + 0, + ]); + + await tx; + }), + 15000 + ); +}); diff --git a/tests/src/ocv2/claim.v2.test.js b/tests/src/ocv2/claim.v2.test.js new file mode 100644 index 0000000..d6e1f3c --- /dev/null +++ b/tests/src/ocv2/claim.v2.test.js @@ -0,0 +1,59 @@ +import 'core-js/stable'; +import 'regenerator-runtime/runtime'; +import { + waitForAppScreen, + zemu, + genericTx, + nano_models, +} from '../test.fixture'; +import { ethers } from 'ethers'; +import { parseEther } from 'ethers/lib/utils'; +import { ledgerService } from '@ledgerhq/hw-app-eth'; + +const contractAddr = '0x8d6fd650500f82c7d978a440348e5a9b886943bf'; + +const pluginName = 'Kiln'; +const abi_path = `../cal/ethereum/abis/${contractAddr}.json`; +const abi = require(abi_path); + +nano_models.forEach(function (model) { + test( + '[Nano ' + model.letter + '] Claim V2 Eth', + zemu(model, async (sim, eth) => { + const contract = new ethers.Contract(contractAddr, abi); + + const { data } = await contract.populateTransaction.claim( + [150, 2], + [0, 1], + 132 + ); + + let unsignedTx = genericTx; + + unsignedTx.to = contractAddr; + unsignedTx.data = data; + unsignedTx.value = parseEther('0'); + + const serializedTx = ethers.utils + .serializeTransaction(unsignedTx) + .slice(2); + const resolution = await ledgerService.resolveTransaction( + serializedTx, + eth.loadConfig, + { + externalPlugins: true, + } + ); + const tx = eth.signTransaction("44'/60'/0'/0", serializedTx, resolution); + const right_clicks = 4; + + await waitForAppScreen(sim); + await sim.navigateAndCompareSnapshots('.', model.name + '_claimv2', [ + right_clicks, + 0, + ]); + await tx; + }), + 30000 + ); +}); diff --git a/tests/src/ocv2/multiClaim.v2.test.js b/tests/src/ocv2/multiClaim.v2.test.js new file mode 100644 index 0000000..cee7627 --- /dev/null +++ b/tests/src/ocv2/multiClaim.v2.test.js @@ -0,0 +1,65 @@ +import 'core-js/stable'; +import 'regenerator-runtime/runtime'; +import { + waitForAppScreen, + zemu, + genericTx, + nano_models, +} from '../test.fixture'; +import { ethers } from 'ethers'; +import { parseEther } from 'ethers/lib/utils'; +import { ledgerService } from '@ledgerhq/hw-app-eth'; + +const contractAddr = '0x5db5235b5c7e247488784986e58019fffd98fda4'; + +const pluginName = 'Kiln'; +const abi_path = `../cal/ethereum/abis/${contractAddr}.json`; +const abi = require(abi_path); + +nano_models.forEach(function (model) { + test( + '[Nano ' + model.letter + '] MultiClaim V2 Eth', + zemu(model, async (sim, eth) => { + const contract = new ethers.Contract(contractAddr, abi); + + const { data } = await contract.populateTransaction.multiClaim( + ['0x5db5235b5c7e247488784986e58019fffd98fda4'], + [ + [42, 47], + [150, 2], + ], + [ + [0, 1], + [0, 1], + ] + ); + + let unsignedTx = genericTx; + + unsignedTx.to = contractAddr; + unsignedTx.data = data; + unsignedTx.value = parseEther('0'); + + const serializedTx = ethers.utils + .serializeTransaction(unsignedTx) + .slice(2); + const resolution = await ledgerService.resolveTransaction( + serializedTx, + eth.loadConfig, + { + externalPlugins: true, + } + ); + const tx = eth.signTransaction("44'/60'/0'/0", serializedTx, resolution); + const right_clicks = 4; + + await waitForAppScreen(sim); + await sim.navigateAndCompareSnapshots('.', model.name + '_multiClaimv2', [ + right_clicks, + 0, + ]); + await tx; + }), + 30000 + ); +}); diff --git a/tests/src/ocv2/requestExit.v2.test.js b/tests/src/ocv2/requestExit.v2.test.js new file mode 100644 index 0000000..ef828d0 --- /dev/null +++ b/tests/src/ocv2/requestExit.v2.test.js @@ -0,0 +1,56 @@ +import 'core-js/stable'; +import 'regenerator-runtime/runtime'; +import { + waitForAppScreen, + zemu, + genericTx, + nano_models, +} from '../test.fixture'; +import { ethers } from 'ethers'; +import { parseEther } from 'ethers/lib/utils'; +import { ledgerService } from '@ledgerhq/hw-app-eth'; + +const contractAddr = '0x5db5235b5c7e247488784986e58019fffd98fda4'; + +const pluginName = 'Kiln'; +const abi_path = `../cal/ethereum/abis/${contractAddr}.json`; +const abi = require(abi_path); + +nano_models.forEach(function (model) { + test( + '[Nano ' + model.letter + '] RequestExit V2 Eth', + zemu(model, async (sim, eth) => { + const contract = new ethers.Contract(contractAddr, abi); + + const { data } = await contract.populateTransaction.requestExit(42); + + let unsignedTx = genericTx; + + unsignedTx.to = contractAddr; + unsignedTx.data = data; + unsignedTx.value = parseEther('0'); + + const serializedTx = ethers.utils + .serializeTransaction(unsignedTx) + .slice(2); + const resolution = await ledgerService.resolveTransaction( + serializedTx, + eth.loadConfig, + { + externalPlugins: true, + } + ); + const tx = eth.signTransaction("44'/60'/0'/0", serializedTx, resolution); + const right_clicks = 4; + + await waitForAppScreen(sim); + await sim.navigateAndCompareSnapshots( + '.', + model.name + '_requestExitv2', + [right_clicks, 0] + ); + await tx; + }), + 30000 + ); +}); diff --git a/tests/src/ocv2/stake.v2.test.js b/tests/src/ocv2/stake.v2.test.js new file mode 100644 index 0000000..5935c63 --- /dev/null +++ b/tests/src/ocv2/stake.v2.test.js @@ -0,0 +1,58 @@ +import 'core-js/stable'; +import 'regenerator-runtime/runtime'; +import { + waitForAppScreen, + kilnJSON, + zemu, + genericTx, + nano_models, + SPECULOS_ADDRESS, + txFromEtherscan, +} from '../test.fixture'; +import { ethers } from 'ethers'; +import { parseEther, parseUnits } from 'ethers/lib/utils'; +import { ledgerService } from '@ledgerhq/hw-app-eth'; + +const contractAddr = '0x5db5235b5c7e247488784986e58019fffd98fda4'; + +const pluginName = 'Kiln'; +const abi_path = `../cal/ethereum/abis/${contractAddr}.json`; +const abi = require(abi_path); + +nano_models.forEach(function (model) { + test( + '[Nano ' + model.letter + '] Stake V2 Eth', + zemu(model, async (sim, eth) => { + const contract = new ethers.Contract(contractAddr, abi); + + const { data } = await contract.populateTransaction.stake(); + + let unsignedTx = genericTx; + + unsignedTx.to = contractAddr; + unsignedTx.data = data; + unsignedTx.value = parseEther('1'); + + const serializedTx = ethers.utils + .serializeTransaction(unsignedTx) + .slice(2); + const resolution = await ledgerService.resolveTransaction( + serializedTx, + eth.loadConfig, + { + externalPlugins: true, + } + ); + const tx = eth.signTransaction("44'/60'/0'/0", serializedTx, resolution); + const right_clicks = 4; + + await waitForAppScreen(sim); + await sim.navigateAndCompareSnapshots('.', model.name + '_stakev2', [ + right_clicks, + 0, + ]); + await tx; + }), + 30000 + ); +}); diff --git a/tests/src/requestExit.test.js b/tests/src/requestExit.test.js index 4b1ad9c..3ea3502 100644 --- a/tests/src/requestExit.test.js +++ b/tests/src/requestExit.test.js @@ -15,7 +15,7 @@ import { ledgerService } from '@ledgerhq/hw-app-eth'; const contractAddr = '0x1e68238ce926dec62b3fbc99ab06eb1d85ce0270'; const pluginName = 'Kiln'; -const abi_path = `../cal/abis/${contractAddr}.json`; +const abi_path = `../cal/ethereum/abis/${contractAddr}.json`; const abi = require(abi_path); nano_models.forEach(function (model) { diff --git a/tests/src/requestExit.v2.test.js b/tests/src/requestExit.v2.test.js index 6d75922..bec8fdd 100644 --- a/tests/src/requestExit.v2.test.js +++ b/tests/src/requestExit.v2.test.js @@ -8,7 +8,7 @@ import { ledgerService } from '@ledgerhq/hw-app-eth'; const contractAddr = '0x5db5235b5c7e247488784986e58019fffd98fda4'; const pluginName = 'Kiln'; -const abi_path = `../cal/abis/${contractAddr}.json`; +const abi_path = `../cal/ethereum/abis/${contractAddr}.json`; const abi = require(abi_path); nano_models.forEach(function (model) { diff --git a/tests/src/stake.v2.test.js b/tests/src/stake.v2.test.js index 86465b8..95164ef 100644 --- a/tests/src/stake.v2.test.js +++ b/tests/src/stake.v2.test.js @@ -16,7 +16,7 @@ import { ledgerService } from '@ledgerhq/hw-app-eth'; const contractAddr = '0x5db5235b5c7e247488784986e58019fffd98fda4'; const pluginName = 'Kiln'; -const abi_path = `../cal/abis/${contractAddr}.json`; +const abi_path = `../cal/ethereum/abis/${contractAddr}.json`; const abi = require(abi_path); nano_models.forEach(function (model) { diff --git a/tests/src/withdraw.test.js b/tests/src/withdraw.test.js index f7b6576..411fcd1 100644 --- a/tests/src/withdraw.test.js +++ b/tests/src/withdraw.test.js @@ -15,7 +15,7 @@ import { ledgerService } from '@ledgerhq/hw-app-eth'; const contractAddr = '0x1e68238ce926dec62b3fbc99ab06eb1d85ce0270'; const pluginName = 'Kiln'; -const abi_path = `../cal/abis/${contractAddr}.json`; +const abi_path = `../cal/ethereum/abis/${contractAddr}.json`; const abi = require(abi_path); nano_models.forEach(function (model) { diff --git a/tests/src/withdrawCL.test.js b/tests/src/withdrawCL.test.js index b770f9e..7bbf080 100644 --- a/tests/src/withdrawCL.test.js +++ b/tests/src/withdrawCL.test.js @@ -15,7 +15,7 @@ import { ledgerService } from '@ledgerhq/hw-app-eth'; const contractAddr = '0x1e68238ce926dec62b3fbc99ab06eb1d85ce0270'; const pluginName = 'Kiln'; -const abi_path = `../cal/abis/${contractAddr}.json`; +const abi_path = `../cal/ethereum/abis/${contractAddr}.json`; const abi = require(abi_path); nano_models.forEach(function (model) { diff --git a/tests/src/withdrawEL.test.js b/tests/src/withdrawEL.test.js index 9a0de19..1b5fc5d 100644 --- a/tests/src/withdrawEL.test.js +++ b/tests/src/withdrawEL.test.js @@ -15,7 +15,7 @@ import { ledgerService } from '@ledgerhq/hw-app-eth'; const contractAddr = '0x1e68238ce926dec62b3fbc99ab06eb1d85ce0270'; const pluginName = 'Kiln'; -const abi_path = `../cal/abis/${contractAddr}.json`; +const abi_path = `../cal/ethereum/abis/${contractAddr}.json`; const abi = require(abi_path); nano_models.forEach(function (model) {