UNPKG

@hyperlane-xyz/sdk

Version:

The official SDK for the Hyperlane Network

283 lines 11.7 kB
/* eslint-disable no-console */ import { SigningCosmWasmClient, } from '@cosmjs/cosmwasm-stargate'; import { Secp256k1, keccak256 } from '@cosmjs/crypto'; import { DirectSecp256k1Wallet } from '@cosmjs/proto-signing'; import { GasPrice, SigningStargateClient } from '@cosmjs/stargate'; import { Tendermint37Client } from '@cosmjs/tendermint-rpc'; import { TestChainName, testCosmosChain } from '../../consts/testChains.js'; import { CosmWasmCoreAdapter } from '../../core/adapters/CosmWasmCoreAdapter.js'; import { CosmWasmMultisigAdapter } from '../../ism/adapters/CosmWasmMultisigAdapter.js'; import { MultiProtocolProvider } from '../../providers/MultiProtocolProvider.js'; const neutronAddresses = { mailbox: 'neutron1sjzzd4gwkggy6hrrs8kxxatexzcuz3jecsxm3wqgregkulzj8r7qlnuef4', validatorAnnounce: 'neutron17w4q6efzym3p4c6umyp4cjf2ustjtmwfqdhd7rt2fpcpk9fmjzsq0kj0f8', }; const multiProtocolProvider = MultiProtocolProvider.createTestMultiProtocolProvider(); const adapter = new CosmWasmCoreAdapter(testCosmosChain.name, multiProtocolProvider, neutronAddresses); export async function getSigningClient(pkey) { const wallet = await DirectSecp256k1Wallet.fromKey(Buffer.from(pkey, 'hex'), testCosmosChain.bech32Prefix); const [account] = await wallet.getAccounts(); const clientBase = await Tendermint37Client.connect(testCosmosChain.rpcUrls[0].http); const gasPrice = GasPrice.fromString('0.1untrn'); const wasm = await SigningCosmWasmClient.createWithSigner(clientBase, wallet, { gasPrice, }); const stargate = await SigningStargateClient.createWithSigner(clientBase, wallet, { gasPrice, }); const pubkey = Secp256k1.uncompressPubkey(account.pubkey); const ethaddr = keccak256(pubkey.slice(1)).slice(-20); return { wasm, stargate, signer: account.address, signer_addr: Buffer.from(ethaddr).toString('hex'), signer_pubkey: Buffer.from(account.pubkey).toString('hex'), }; } const initTransferOwner = (address, newOwner, key = 'ownable') => { return { contractAddress: address, msg: { [key]: { init_ownership_transfer: { next_owner: newOwner, }, }, }, }; }; const claimTransferOwner = (address, key = 'ownable') => { return { contractAddress: address, msg: { [key]: { claim_ownership: {}, }, }, }; }; const getOwner = async (provider, address) => { const ownableQuery = { ownable: { get_owner: {} }, }; const ownerResponse = await provider.queryContractSmart(address, ownableQuery); return ownerResponse.owner; }; export async function rotateHooks() { const desiredDefault = 'neutron1e5c2qqquc86rd3q77aj2wyht40z6z3q5pclaq040ue9f5f8yuf7qnpvkzk'; const desiredRequired = 'neutron19qjplhq7jsmk7haneafqxyyhltgllvvag8c4g7jkmxw6mvd4h8sq7rqh02'; const safe = await getSigningClient('2ac7230628b8b4a587c4005798184735471b9240fc57fc75d97824e1fb6b5409'); const tx = await safe.wasm.executeMultiple(safe.signer, [ adapter.setDefaultHook(desiredDefault), adapter.setRequiredHook(desiredRequired), ], 'auto'); console.log(tx); } export async function rotateAuth() { const safe = await getSigningClient('2ac7230628b8b4a587c4005798184735471b9240fc57fc75d97824e1fb6b5409'); const desiredOwner = 'neutron1fqf5mprg3f5hytvzp3t7spmsum6rjrw80mq8zgkc0h6rxga0dtzqws3uu7'; const addresses = [ 'neutron1sjzzd4gwkggy6hrrs8kxxatexzcuz3jecsxm3wqgregkulzj8r7qlnuef4', // mailbox 'neutron17w4q6efzym3p4c6umyp4cjf2ustjtmwfqdhd7rt2fpcpk9fmjzsq0kj0f8', // validator announce 'neutron1q75ky8reksqzh0lkhk9k3csvjwv74jjquahrj233xc7dvzz5fv4qtvw0qg', // multisig ISM 'neutron1e5c2qqquc86rd3q77aj2wyht40z6z3q5pclaq040ue9f5f8yuf7qnpvkzk', // merkle 'neutron19qjplhq7jsmk7haneafqxyyhltgllvvag8c4g7jkmxw6mvd4h8sq7rqh02', // pausable 'neutron1ch7x3xgpnj62weyes8vfada35zff6z59kt2psqhnx9gjnt2ttqdqtva3pa', // warp route ]; const transferInstructions = []; const claimInstructions = []; for (const address of addresses) { const info = await safe.wasm.getContract(address); console.log({ address, info }); try { await getOwner(safe.wasm, address); const transferInstruction = initTransferOwner(address, desiredOwner); transferInstructions.push(transferInstruction); const claimInstruction = claimTransferOwner(address); claimInstructions.push(claimInstruction); } catch (e) { if (e.message.includes('unknown variant `ownable`')) { console.log(`Skipping ${info.label} (${address}) because it is not ownable`); } else { throw e; } } // } console.log(JSON.stringify({ transferInstructions, claimInstructions })); // const tx = await safe.wasm.executeMultiple( // safe.signer, // transferInstructions, // 'auto', // ); // console.log(tx); // const claimTx = await safe.wasm.execute( // safe.signer, // address, // claimInstruction.msg, // 'auto', // ); // console.log(claimTx); const res = await safe.wasm.updateAdmin(safe.signer, address, desiredOwner, 'auto'); console.log(res); } } export async function summary() { const summary = {}; const provider = await adapter.getProvider(); const getOwner = async (address) => { const ownableQuery = { ownable: { get_owner: {} }, }; const ownerResponse = await provider.queryContractSmart(address, ownableQuery); return ownerResponse.owner; }; const owner = await getOwner(neutronAddresses.mailbox); const info = await provider.getContract(neutronAddresses.mailbox); const defaultHook = await adapter.defaultHook(); const requiredHook = await adapter.requiredHook(); const defaultIsm = await adapter.defaultIsm(); summary.mailbox = { owner, ...info, defaultHook, requiredHook, defaultIsm, }; const router = 'neutron1ch7x3xgpnj62weyes8vfada35zff6z59kt2psqhnx9gjnt2ttqdqtva3pa'; summary.warproute = { owner: await getOwner(router), ...(await provider.getContract(router)), }; summary.validatorAnnounce = { // owner: await getOwner(neutronAddresses.validatorAnnounce), ...(await provider.getContract(neutronAddresses.validatorAnnounce)), }; const defaultIsmContract = await provider.getContract(defaultIsm); if (defaultIsmContract.label === 'hpl_ism_multisig') { const multisigAdapter = new CosmWasmMultisigAdapter(testCosmosChain.name, multiProtocolProvider, { multisig: defaultIsm }); const multisigConfig = await multisigAdapter.getConfig(TestChainName.test1); const owner = await getOwner(defaultIsm); summary.defaultIsm = { ...multisigConfig, ...defaultIsmContract, owner, }; } const getMailbox = async (hook) => { const merkleMailboxQuery = { hook: { mailbox: {}, }, }; const merkleMailboxResponse = await provider.queryContractSmart(hook, merkleMailboxQuery); return merkleMailboxResponse.mailbox; }; const requiredHookContract = await provider.getContract(requiredHook); if (requiredHookContract.label === 'hpl_hook_pausable') { summary.requiredHook = { ...requiredHookContract, owner: await getOwner(requiredHook), mailbox: await getMailbox(requiredHook), }; } // else if (requiredHookContract.label === 'hpl_hook_aggregate') { // const aggregateHookQuery: AggregateQuery = { // aggregate_hook: { // hooks: {}, // }, // }; // const hooksResponse: HooksResponse = await provider.queryContractSmart( // requiredHook, // aggregateHookQuery, // ); // summary.requiredHook = { // ...requiredHookContract, // hooks: hooksResponse.hooks, // owner: await getOwner(requiredHook), // mailbox: await getMailbox(requiredHook), // }; const defaultHookContract = await provider.getContract(defaultHook); if (defaultHookContract.label === 'hpl_hook_merkle') { summary.defaultHook = defaultHookContract; } // for (const hook of hooksResponse.hooks) { // const hook = defaultHook; // const hookContract = await provider.getContract(hook); // if (hookContract.label === 'hpl_hook_merkle') { // // summary.requiredHook.merkleHook = { // summary.merkleHook = { // ...hookContract, // mailbox: await getMailbox(hook), // owner: await getOwner(hook), // }; // } // } else if (hookContract.label === 'hpl_igp') { // const igpAdapter = new CosmWasmIgpAdapter( // neutron.name, // multiProtocolProvider, // { igp: hook }, // ); // const oracles = await igpAdapter.getOracles(); // const defaultGas = await igpAdapter.defaultGas(); // const beneficiary = await igpAdapter.beneficiary(); // const mantaData = await igpAdapter.getOracleData(mantapacific.name); // const igpOracle = oracles[mantapacific.name]; // summary.requiredHook.igpHook = { // oracles, // mantaOracle: { // ...mantaData, // owner: await getOwner(igpOracle), // ...(await provider.getContract(igpOracle)), // }, // defaultGas, // beneficiary, // mailbox: await getMailbox(hook), // owner: await getOwner(hook), // ...hookContract, // }; // } // } // console.log(JSON.stringify(summary)); } export async function rotateValidators() { const multisigAdapter = new CosmWasmMultisigAdapter(testCosmosChain.name, multiProtocolProvider, { multisig: 'neutron1q75ky8reksqzh0lkhk9k3csvjwv74jjquahrj233xc7dvzz5fv4qtvw0qg', }); const instructions = await multisigAdapter.configureMultisig({ [TestChainName.test1]: { threshold: 5, validators: [ { address: '8e668c97ad76d0e28375275c41ece4972ab8a5bc', alias: 'hyperlane', }, { address: '521a3e6bf8d24809fde1c1fd3494a859a16f132c', alias: 'cosmosstation', }, { address: '25b9a0961c51e74fd83295293bc029131bf1e05a', alias: 'neutron (pablo)', }, { address: '14025fe092f5f8a401dd9819704d9072196d2125', alias: 'p2p' }, { address: 'a0ee95e280d46c14921e524b075d0c341e7ad1c8', alias: 'cosmos spaces', }, { address: 'cc9a0b6de7fe314bd99223687d784730a75bb957', alias: 'dsrv' }, { address: '42b6de2edbaa62c2ea2309ad85d20b3e37d38acf', alias: 'sg-1' }, ], }, }); console.log(JSON.stringify(instructions)); // const safe = await getSigningClient( // '2ac7230628b8b4a587c4005798184735471b9240fc57fc75d97824e1fb6b5409', // ); // const tx = await safe.wasm.executeMultiple(safe.signer, instructions, 'auto'); // console.log(tx); } // summary().catch(console.error); //# sourceMappingURL=CosmWasmTokenAdapter.test.js.map