1- // Bob's EVM address is the implicit truncated AccountId32, NOT key-derived (don't call bind)
21import type { ApiPromise } from "@polkadot/api" ;
32import { ethers } from "ethers" ;
4- import { DEFAULT_FEE , DEFAULT_GAS , WS_URL } from "./constants" ;
3+ import { GIGAHDX_POOL , STHDX_EVM , DEFAULT_FEE , DEFAULT_GAS , WS_URL } from "./constants" ;
54import type { KeyringPair } from "./api" ;
65import { signAndWait , pad32 , uint32 } from "./utils" ;
76
8- const MAIN_POOL = "0x1b02E051683b5cfaC5929C25E84adb26ECf87B38" ;
9- const WETH_EVM = "0x000000000000000000000000000000010000028e" ; // asset 20 multicurrency precompile
7+ const SEL_SET_USE_RESERVE = "5a3b74b9" ; // setUserUseReserveAsCollateral(asset, bool)
108const BOB_EVM = "0x8eaf04151687736326c9fea17e25fc5287613693" ;
11- const MIN_COLLATERAL_BASE = 1_000_00000000n ; // $1k in AAVE base units (1e8)
12-
13- const SEL_SUPPLY = "617ba037" ; // supply(asset, amount, onBehalfOf, referralCode)
14- const SEL_GET_USER_ACCOUNT_DATA = "bf92857c" ; // getUserAccountData(user)
15- const SEL_APPROVE = "095ea7b3" ;
9+ const MIN_COLLATERAL_BASE = 1_000_00000000n ; // $1k in AAVE base units
10+ const SEL_GET_USER_ACCOUNT_DATA = "bf92857c" ;
11+ const STAKE_AMOUNT = 1_000_000n * 10n ** 12n ; // 1M HDX
1612
1713function httpRpcUrl ( ) : string {
1814 return WS_URL . replace ( / ^ w s / , "http" ) ;
1915}
2016
21- async function getMainCollateralBase ( ) : Promise < bigint > {
17+ async function getCollateralBase ( pool : string , evm : string ) : Promise < bigint > {
2218 const provider = new ethers . JsonRpcProvider ( httpRpcUrl ( ) ) ;
23- const data = "0x" + SEL_GET_USER_ACCOUNT_DATA + pad32 ( BOB_EVM ) ;
24- const result = await provider . call ( { to : MAIN_POOL , data } ) ;
19+ const data = "0x" + SEL_GET_USER_ACCOUNT_DATA + pad32 ( evm ) ;
20+ const result = await provider . call ( { to : pool , data } ) ;
2521 if ( ! result || result === "0x" ) return 0n ;
26- // returns (totalCollateralBase, totalDebtBase, availableBorrows, ...) — slot 0 = collateral
2722 return BigInt ( "0x" + result . slice ( 2 , 2 + 64 ) ) ;
2823}
2924
25+ // Mirrors Martin's e2e_provision_liq_account: gigaStake → stHDX collateral on GIGAHDX pool
3026export async function ensureLiquidator ( api : ApiPromise , bob : KeyringPair ) : Promise < void > {
31- const collateral = await getMainCollateralBase ( ) ;
27+ const collateral = await getCollateralBase ( GIGAHDX_POOL , BOB_EVM ) ;
3228 if ( collateral >= MIN_COLLATERAL_BASE ) return ;
3329
34- const supplyAmount = 10n * 10n ** 18n ;
30+ // Bind EVM (needed so AAVE's aToken credit maps back to Bob's substrate account)
31+ try {
32+ await signAndWait ( api , api . tx . evmAccounts . bindEvmAddress ( ) , bob , "bob.bindEvm" ) ;
33+ } catch ( e : any ) {
34+ if ( ! / A l r e a d y B o u n d / . test ( e . message ) ) throw e ;
35+ }
3536
36- const approveData = "0x" + SEL_APPROVE + pad32 ( MAIN_POOL ) + uint32 ( supplyAmount ) ;
37+ // gigaStake: locks HDX in wallet, mints stHDX to GIGAHDX pool, mints aToken to Bob
3738 await signAndWait (
3839 api ,
39- api . tx . evm . call (
40- BOB_EVM ,
41- WETH_EVM ,
42- approveData ,
43- 0 ,
44- DEFAULT_GAS . toString ( ) ,
45- DEFAULT_FEE . toString ( ) ,
46- null ,
47- null ,
48- [ ] ,
49- null
50- ) ,
40+ api . tx . gigaHdx . gigaStake ( STAKE_AMOUNT . toString ( ) ) ,
5141 bob ,
52- "bob.approve(WETH→MAIN) "
42+ "bob.gigaStake "
5343 ) ;
5444
55- const supplyData =
56- "0x" +
57- SEL_SUPPLY +
58- pad32 ( WETH_EVM ) +
59- uint32 ( supplyAmount ) +
60- pad32 ( BOB_EVM ) +
61- uint32 ( 0 ) ;
45+ // Enable stHDX as collateral on GIGAHDX pool so Bob can borrow HOLLAR against it
46+ const bobEvm = ( await api . query . evmAccounts . evmAddresses ( bob . address ) as any ) . unwrap ( ) . toHex ( ) ;
47+ const setUseData = "0x" + SEL_SET_USE_RESERVE + pad32 ( STHDX_EVM ) + uint32 ( 1 ) ;
6248 await signAndWait (
6349 api ,
6450 api . tx . evm . call (
65- BOB_EVM ,
66- MAIN_POOL ,
67- supplyData ,
51+ bobEvm ,
52+ GIGAHDX_POOL ,
53+ setUseData ,
6854 0 ,
6955 DEFAULT_GAS . toString ( ) ,
7056 DEFAULT_FEE . toString ( ) ,
@@ -74,6 +60,6 @@ export async function ensureLiquidator(api: ApiPromise, bob: KeyringPair): Promi
7460 null
7561 ) ,
7662 bob ,
77- "bob.supply(MAIN )"
63+ "bob.setUseAsCollateral(stHDX )"
7864 ) ;
7965}
0 commit comments