From 516c6c92fc071daa1e3db36efc483f86d99c7999 Mon Sep 17 00:00:00 2001 From: ljankovic-txfusion Date: Fri, 9 May 2025 11:53:14 +0200 Subject: [PATCH 01/16] feat/starknet-generate-artifacts-test --- .changeset/thirty-apricots-bathe.md | 5 + starknet/.gitignore | 1 + starknet/.mocharc.json | 5 + starknet/eslint.config.mjs | 2 +- starknet/package.json | 4 +- .../tests/StarknetArtifactGenerator.test.ts | 286 ++++++++++++++++++ starknet/tests/Templates.test.ts | 68 +++++ starknet/tests/utils.ts | 76 +++++ yarn.lock | 1 + 9 files changed, 446 insertions(+), 2 deletions(-) create mode 100644 .changeset/thirty-apricots-bathe.md create mode 100644 starknet/.mocharc.json create mode 100644 starknet/tests/StarknetArtifactGenerator.test.ts create mode 100644 starknet/tests/Templates.test.ts create mode 100644 starknet/tests/utils.ts diff --git a/.changeset/thirty-apricots-bathe.md b/.changeset/thirty-apricots-bathe.md new file mode 100644 index 00000000000..90a7b9f5698 --- /dev/null +++ b/.changeset/thirty-apricots-bathe.md @@ -0,0 +1,5 @@ +--- +'@hyperlane-xyz/starknet-core': minor +--- + +Cairo artifact generation tests diff --git a/starknet/.gitignore b/starknet/.gitignore index 830b8da0b81..283f97a3b2c 100644 --- a/starknet/.gitignore +++ b/starknet/.gitignore @@ -1,3 +1,4 @@ .env dist release +tmp \ No newline at end of file diff --git a/starknet/.mocharc.json b/starknet/.mocharc.json new file mode 100644 index 00000000000..bae91eaf1fc --- /dev/null +++ b/starknet/.mocharc.json @@ -0,0 +1,5 @@ +{ + "extensions": ["ts"], + "spec": ["src/**/*.test.*"], + "node-option": ["experimental-specifier-resolution=node"] +} diff --git a/starknet/eslint.config.mjs b/starknet/eslint.config.mjs index dc3a8cf60fa..2623e2e62b0 100644 --- a/starknet/eslint.config.mjs +++ b/starknet/eslint.config.mjs @@ -10,6 +10,6 @@ export default [ }, }, { - ignores: ['scripts/**/*'], + ignores: ['scripts/**/*', 'tests/**/*'], }, ]; diff --git a/starknet/package.json b/starknet/package.json index 9a979e8ec01..24ea3d37507 100644 --- a/starknet/package.json +++ b/starknet/package.json @@ -11,7 +11,8 @@ "build": "tsc && yarn fetch-contracts && yarn generate-artifacts", "clean": "rm -rf ./dist ./release", "lint": "eslint -c ./eslint.config.mjs .", - "prettier": "prettier --write ./src ./package.json" + "prettier": "prettier --write ./src ./package.json", + "test": "mocha --require tsx 'tests/**/*.test.ts'" }, "exports": { ".": { @@ -40,6 +41,7 @@ "eslint-import-resolver-typescript": "^3.6.3", "eslint-plugin-import": "^2.31.0", "globby": "^14.1.0", + "mocha": "^10.2.0", "prettier": "^3.5.3", "tsx": "^4.19.1", "typescript": "5.3.3" diff --git a/starknet/tests/StarknetArtifactGenerator.test.ts b/starknet/tests/StarknetArtifactGenerator.test.ts new file mode 100644 index 00000000000..936f8bfc40a --- /dev/null +++ b/starknet/tests/StarknetArtifactGenerator.test.ts @@ -0,0 +1,286 @@ +import { assert, expect } from 'chai'; +import { promises as fs } from 'fs'; +import { afterEach, beforeEach, describe, it } from 'mocha'; +import { dirname, join } from 'path'; +import { fileURLToPath } from 'url'; + +import { StarknetArtifactGenerator } from '../scripts/StarknetArtifactGenerator.js'; +import { CONTRACT_SUFFIXES } from '../src/const.js'; +import { ContractClass, ContractType } from '../src/types.js'; + +import { createMockContractFiles, createMockSierraArtifact } from './utils.js'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = dirname(__filename); +const TMP_DIR = join(__dirname, './tmp'); +const TEST_RELEASE_DIR = join(TMP_DIR, 'release'); +const TEST_OUTPUT_DIR = join(TMP_DIR, 'dist/artifacts'); + +describe('StarknetArtifactGenerator', () => { + let generator: StarknetArtifactGenerator; + + beforeEach(async () => { + await Promise.all([ + fs.mkdir(TMP_DIR, { recursive: true }), + fs.mkdir(TEST_RELEASE_DIR, { recursive: true }), + fs.mkdir(TEST_OUTPUT_DIR, { recursive: true }), + ]); + + await createMockContractFiles(TEST_RELEASE_DIR); + + generator = new StarknetArtifactGenerator( + TEST_RELEASE_DIR, + TEST_OUTPUT_DIR, + ); + }); + + afterEach(async () => { + await fs.rm(TMP_DIR, { recursive: true, force: true }).catch(() => {}); + }); + + it('should correctly identify contract types from filenames', () => { + expect(generator.getContractTypeFromPath('token_MyToken.json')).to.equal( + ContractType.TOKEN, + ); + expect( + generator.getContractTypeFromPath('mocks_MockContract.json'), + ).to.equal(ContractType.MOCK); + expect( + generator.getContractTypeFromPath('contracts_IMailbox.json'), + ).to.equal(ContractType.CONTRACT); + // Defaults to CONTRACT for unknown prefixes + expect(generator.getContractTypeFromPath('random_name.json')).to.equal( + ContractType.CONTRACT, + ); + }); + + it('should create the output directory if it does not exist', async () => { + await fs.rm(TEST_OUTPUT_DIR, { recursive: true, force: true }); + await generator.createOutputDirectory(); + const stats = await fs.stat(TEST_OUTPUT_DIR); + expect(stats.isDirectory()).to.be.true; + }); + + it('should read and parse a valid Sierra artifact file', async () => { + const filePath = join( + TEST_RELEASE_DIR, + `contracts_Test${CONTRACT_SUFFIXES.SIERRA_JSON}`, + ); + const artifact = await generator.readArtifactFile(filePath); + expect(artifact).to.deep.include({ + contract_class_version: '0.1.0', + sierra_program: [], // Based on createMockSierraArtifact + }); + expect(artifact.abi).to.be.an('array'); + }); + + it('should generate JS content with expected properties for Sierra contracts', () => { + const artifact = createMockSierraArtifact(); + const jsContent = generator.generateJavaScriptContent( + 'TestContract', + artifact, + ContractClass.SIERRA, + ); + + const jsonMatch = jsContent.match(/^export const \w+ = (\{.*\});$/s); + assert(jsonMatch, 'Should find exported JSON object in JS content'); + + const parsedArtifact = JSON.parse(jsonMatch[1]); + expect(parsedArtifact).to.be.an('object'); + expect(parsedArtifact) + .to.have.property('sierra_program') + .that.is.an('array'); + expect(parsedArtifact) + .to.have.property('entry_points_by_type') + .deep.equal(artifact.entry_points_by_type); + expect(parsedArtifact).to.have.property('abi').that.is.an('array'); + // Check if a specific known item from the mock ABI exists + const hasTestFunction = parsedArtifact.abi.some( + (item: any) => item.name === 'test_function', + ); + expect(hasTestFunction, 'ABI should contain "test_function"').to.be.true; + }); + + it('should generate correct TypeScript declaration for Sierra contracts', () => { + const dtsContent = generator.generateDeclarationContent( + 'TestSierra', + true, // isSierra = true + ); + expect(dtsContent).to.include( + 'export declare const TestSierra: CompiledContract', + ); + }); + + it('should generate correct TypeScript declaration for CASM contracts', () => { + const dtsContent = generator.generateDeclarationContent( + 'TestCasm', + false, // isSierra = false + ); + expect(dtsContent).to.include( + 'export declare const TestCasm: CairoAssembly', + ); + }); + + it('should process a Sierra artifact file correctly, generating JS and DTS files', async () => { + const fileName = `contracts_Test${CONTRACT_SUFFIXES.SIERRA_JSON}`; + const filePath = join(TEST_RELEASE_DIR, fileName); + const artifact = await generator.readArtifactFile(filePath); // Read expected artifact data + + const processResult = await generator.processArtifact(filePath); + + // Verify the returned info object + expect(processResult).to.deep.equal({ + name: 'contracts_Test', + contractType: ContractType.CONTRACT, + contractClass: ContractClass.SIERRA, + }); + + const jsPath = join( + TEST_OUTPUT_DIR, + `contracts_Test.${ContractClass.SIERRA}.js`, + ); + const dtsPath = join( + TEST_OUTPUT_DIR, + `contracts_Test.${ContractClass.SIERRA}.d.ts`, + ); + await fs.access(jsPath); // Throws if file doesn't exist + await fs.access(dtsPath); // Throws if file doesn't exist + + const jsContent = await fs.readFile(jsPath, 'utf-8'); + const jsonMatch = jsContent.match(/^export const \w+ = (\{.*\});$/s); + assert(jsonMatch, 'Should find JSON object in generated JS file'); + const parsedJsArtifact = JSON.parse(jsonMatch[1]); + + expect(parsedJsArtifact).to.be.an('object'); + expect(parsedJsArtifact) + .to.have.property('sierra_program') + .that.is.an('array'); + expect(parsedJsArtifact).to.have.property( + 'contract_class_version', + artifact.contract_class_version, + ); + expect(parsedJsArtifact) + .to.have.property('entry_points_by_type') + .deep.equal(artifact.entry_points_by_type); + expect(parsedJsArtifact) + .to.have.property('abi') + .deep.equal( + typeof artifact.abi === 'string' + ? JSON.parse(artifact.abi) + : artifact.abi, + ); + + const dtsContent = await fs.readFile(dtsPath, 'utf-8'); + expect(dtsContent).to.include( + 'export declare const contracts_Test: CompiledContract', + ); + }); + + it('should process a standard set of artifacts, generate index files, and return correct summary', async () => { + // Assumes beforeEach creates: contracts_Test, token_HypERC20, mocks_MockContract (all Sierra) + const processedMap = await generator.generate(); + + expect(processedMap.size).to.equal(3); + expect(processedMap.get('contracts_Test')).to.deep.equal({ + type: ContractType.CONTRACT, + sierra: true, + casm: false, + }); + expect(processedMap.get('token_HypERC20')).to.deep.equal({ + type: ContractType.TOKEN, + sierra: true, + casm: false, + }); + expect(processedMap.get('mocks_MockContract')).to.deep.equal({ + type: ContractType.MOCK, + sierra: true, + casm: false, + }); + + const indexJsPath = join(TEST_OUTPUT_DIR, 'index.js'); + const indexDtsPath = join(TEST_OUTPUT_DIR, 'index.d.ts'); + await fs.access(indexJsPath); + await fs.access(indexDtsPath); + + // Check index file content (verify artifact paths are included) + const indexJsContent = await fs.readFile(indexJsPath, 'utf-8'); + + expect(indexJsContent).to.include( + `./contracts_Test.${ContractClass.SIERRA}.js`, + ); + expect(indexJsContent).to.include( + `./token_HypERC20.${ContractClass.SIERRA}.js`, + ); + expect(indexJsContent).to.include( + `./mocks_MockContract.${ContractClass.SIERRA}.js`, + ); + + // Check artifact file existence (spot check one) + const testSierraJsPath = join( + TEST_OUTPUT_DIR, + `contracts_Test.${ContractClass.SIERRA}.js`, + ); + await fs.access(testSierraJsPath); + }); + + it('should handle malformed artifact files gracefully during generation', async () => { + const malformedFilePath = join( + TEST_RELEASE_DIR, + `malformed${CONTRACT_SUFFIXES.SIERRA_JSON}`, + ); + await fs.writeFile(malformedFilePath, '{ this is not valid JSON }'); + + let errorThrown = false; + try { + await generator.generate(); // This should throw an error + } catch (error) { + errorThrown = true; + expect(error).to.be.instanceOf(Error); + } + // Expect generate() to throw when encountering invalid JSON + expect(errorThrown, 'Generator should throw an error for malformed JSON').to + .be.true; + }); + + it('should correctly process artifacts with unusual filenames during generation', async () => { + // Add a file with an unusual name that still fits the expected suffix pattern + const oddNamedFilePath = join( + TEST_RELEASE_DIR, + `unusual_prefix.contract_class.json`, // Uses SIERRA_JSON suffix + ); + await fs.writeFile( + oddNamedFilePath, + JSON.stringify(createMockSierraArtifact()), // Use valid content + ); + + const processedMap = await generator.generate(); + + // Expect 4 total artifacts now (3 standard + 1 unusual) + expect(processedMap.size).to.equal(4); + + expect(processedMap.has('unusual_prefix')).to.be.true; + const fileInfo = processedMap.get('unusual_prefix'); + expect(fileInfo).to.deep.equal({ + type: ContractType.CONTRACT, // Default type for unknown prefix + sierra: true, + casm: false, + }); + + const jsPath = join( + TEST_OUTPUT_DIR, + `unusual_prefix.${ContractClass.SIERRA}.js`, + ); + const dtsPath = join( + TEST_OUTPUT_DIR, + `unusual_prefix.${ContractClass.SIERRA}.d.ts`, + ); + await fs.access(jsPath); + await fs.access(dtsPath); + + const indexJsPath = join(TEST_OUTPUT_DIR, 'index.js'); + const indexJsContent = await fs.readFile(indexJsPath, 'utf-8'); + expect(indexJsContent).to.include( + `./unusual_prefix.${ContractClass.SIERRA}.js`, // Check path inclusion + ); + }); +}); diff --git a/starknet/tests/Templates.test.ts b/starknet/tests/Templates.test.ts new file mode 100644 index 00000000000..7346673a9b8 --- /dev/null +++ b/starknet/tests/Templates.test.ts @@ -0,0 +1,68 @@ +import { expect } from 'chai'; +import { describe, it } from 'mocha'; + +import { Templates } from '../scripts/Templates.js'; + +describe('Templates', () => { + it('should generate correct JS content for CompiledContract - Artifact', () => { + const name = 'TestContract'; + const artifact = { + abi: [{ name: 'test_func' }], + sierra_program: ['0x1', '0x2'], + contract_class_version: '0.1.0', + }; + const expectedOutput = `export const ${name} = ${JSON.stringify( + artifact, + )};`; + + const result = Templates.jsArtifact(name, artifact); + expect(result).to.equal(expectedOutput); + }); + + it('should generate correct DTS content for CompiledContract type', () => { + const name = 'SierraContract'; + const type = 'CompiledContract'; + const result = Templates.dtsArtifact(name, type); + + expect(result).to.include( + `import type { CompiledContract, CairoAssembly } from 'starknet';`, + ); + expect(result).to.include(`export declare const ${name}: ${type};`); + }); + + it('should generate correct JS index file content', () => { + const imports = `import { A as A_sierra } from './A.sierra.js';\nimport { B as B_sierra } from './B.sierra.js';`; + const contractExports = `A: { contract_class: A_sierra },`; + const tokenExports = `B: { contract_class: B_sierra },`; + const mockExports = ``; // Empty for this test + + const result = Templates.jsIndex( + imports, + [contractExports], + [tokenExports], + [mockExports], + ); + + // Check for the overall structure and interpolation + expect(result).to.include(imports); + expect(result).to.include('export const starknetContracts = {'); + expect(result).to.include('contracts: {'); + expect(result).to.include(contractExports); + expect(result).to.include('token: {'); + expect(result).to.include(tokenExports); + expect(result).to.include('mocks: {'); + expect(result).to.include(mockExports); // Should correctly interpolate empty string + expect(result).to.include('};'); // Closing brace + }); + + it('should generate correct DTS index file content', () => { + const result = Templates.dtsIndex(); + + expect(result).to.include( + `import type { CairoAssembly, CompiledContract } from 'starknet';`, + ); + expect(result).to.include( + 'export declare const starknetContracts: StarknetContracts;', + ); + }); +}); diff --git a/starknet/tests/utils.ts b/starknet/tests/utils.ts new file mode 100644 index 00000000000..e074f55ed9b --- /dev/null +++ b/starknet/tests/utils.ts @@ -0,0 +1,76 @@ +import { promises as fs } from 'fs'; +import { join } from 'path'; +import { CompiledContract } from 'starknet'; + +import { CONTRACT_SUFFIXES } from '../src/const.js'; +import { ContractType } from '../src/types.js'; + +const TEST_CONTRACTS = [ + { name: 'contracts_Test', type: ContractType.CONTRACT }, + { name: 'token_HypERC20', type: ContractType.TOKEN }, + { name: 'mocks_MockContract', type: ContractType.MOCK }, +]; + +export function createMockSierraArtifact(): CompiledContract { + return { + contract_class_version: '0.1.0', + entry_points_by_type: { + EXTERNAL: [ + { + selector: + '0x52580a92c73f4428f1a260c5d768ef462b25955307de00f99957df119865d', + function_idx: 11, + }, + ], + L1_HANDLER: [], + CONSTRUCTOR: [ + { + selector: + '0x28ffe4ff0f226a9107253e17a904099aa4f63a02a5621de0576e5aa71bc5194', + function_idx: 12, + }, + ], + }, + abi: [ + { + type: 'interface', + name: 'contracts::interfaces::IInterchainSecurityModule', + items: [ + { + type: 'function', + name: 'verify', + inputs: [ + { + name: '_metadata', + type: 'alexandria_bytes::bytes::Bytes', + }, + { + name: '_message', + type: 'contracts::libs::message::Message', + }, + ], + outputs: [{ type: 'core::bool' }], + state_mutability: 'view', + }, + ], + }, + { + type: 'function', + name: 'test_function', + inputs: [], + outputs: [{ type: 'felt' }], + }, + ], + sierra_program: [], + }; +} + +export async function createMockContractFiles(testReleaseDir: string) { + for (const contract of TEST_CONTRACTS) { + const filePath = join( + testReleaseDir, + `${contract.name}${CONTRACT_SUFFIXES.SIERRA_JSON}`, + ); + await fs.writeFile(filePath, JSON.stringify(createMockSierraArtifact())); + } +} diff --git a/yarn.lock b/yarn.lock index 54cc9492eae..4668e073eb7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7990,6 +7990,7 @@ __metadata: eslint-import-resolver-typescript: "npm:^3.6.3" eslint-plugin-import: "npm:^2.31.0" globby: "npm:^14.1.0" + mocha: "npm:^10.2.0" prettier: "npm:^3.5.3" starknet: "npm:^6.24.1" tsx: "npm:^4.19.1" From 69b4640a75c7b6772348a9dcccfc0c87b6699133 Mon Sep 17 00:00:00 2001 From: Paul Balaji <10051819+paulbalaji@users.noreply.github.com> Date: Fri, 16 May 2025 14:51:33 +0100 Subject: [PATCH 02/16] fix: disable suavetoliman + sonicsvmtestnet in infra (#6248) ### Description fix: disable suavetoliman + sonicsvmtestnet in infra ### Drive-by changes ### Related issues ### Backward compatibility ### Testing --- .../infra/config/environments/testnet4/agent.ts | 16 ++++++++-------- .../testnet4/aw-validators/hyperlane.json | 6 ------ .../config/environments/testnet4/funding.ts | 4 ++-- 3 files changed, 10 insertions(+), 16 deletions(-) diff --git a/typescript/infra/config/environments/testnet4/agent.ts b/typescript/infra/config/environments/testnet4/agent.ts index 600926f7215..ad13ea9a095 100644 --- a/typescript/infra/config/environments/testnet4/agent.ts +++ b/typescript/infra/config/environments/testnet4/agent.ts @@ -86,8 +86,8 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< soneiumtestnet: true, somniatestnet: true, sonicblaze: true, - sonicsvmtestnet: true, - suavetoliman: true, + sonicsvmtestnet: false, + suavetoliman: false, subtensortestnet: true, superpositiontestnet: true, unichaintestnet: true, @@ -134,8 +134,8 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< soneiumtestnet: true, somniatestnet: true, sonicblaze: true, - sonicsvmtestnet: true, - suavetoliman: true, + sonicsvmtestnet: false, + suavetoliman: false, subtensortestnet: true, superpositiontestnet: true, unichaintestnet: true, @@ -183,7 +183,7 @@ export const hyperlaneContextAgentChainConfig: AgentChainConfig< soneiumtestnet: true, sonicblaze: true, sonicsvmtestnet: false, - suavetoliman: true, + suavetoliman: false, subtensortestnet: true, superpositiontestnet: false, unichaintestnet: true, @@ -389,7 +389,7 @@ const hyperlane: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: '1363c76-20250507-120738', + tag: 'b98468d-20250516-114242', }, blacklist: [...releaseCandidateHelloworldMatchingList, ...relayBlacklist], gasPaymentEnforcement, @@ -413,7 +413,7 @@ const hyperlane: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: '1363c76-20250507-120738', + tag: 'b98468d-20250516-114242', }, resources: scraperResources, }, @@ -428,7 +428,7 @@ const releaseCandidate: RootAgentConfig = { rpcConsensusType: RpcConsensusType.Fallback, docker: { repo, - tag: 'd9e0b4b-20250425-145730', + tag: 'b98468d-20250516-114242', }, blacklist: relayBlacklist, gasPaymentEnforcement, diff --git a/typescript/infra/config/environments/testnet4/aw-validators/hyperlane.json b/typescript/infra/config/environments/testnet4/aw-validators/hyperlane.json index 516f5e78c31..4d8a5b38e2e 100644 --- a/typescript/infra/config/environments/testnet4/aw-validators/hyperlane.json +++ b/typescript/infra/config/environments/testnet4/aw-validators/hyperlane.json @@ -136,12 +136,6 @@ "sonicblaze": { "validators": ["0xe5b98110d0688691ea280edea9a4faa1e3617ba1"] }, - "sonicsvmtestnet": { - "validators": ["0x83d4ef35f170ec822a0eaadb22a0c40003d8de23"] - }, - "suavetoliman": { - "validators": ["0xf58f6e30aabba34e8dd7f79b3168507192e2cc9b"] - }, "subtensortestnet": { "validators": ["0xbe2cd57e9fd46b12107cfec7a2db61aa23edbe33"] }, diff --git a/typescript/infra/config/environments/testnet4/funding.ts b/typescript/infra/config/environments/testnet4/funding.ts index 17317a86706..3aba1b94f72 100644 --- a/typescript/infra/config/environments/testnet4/funding.ts +++ b/typescript/infra/config/environments/testnet4/funding.ts @@ -10,7 +10,7 @@ export const keyFunderConfig: KeyFunderConfig< > = { docker: { repo: 'gcr.io/abacus-labs-dev/hyperlane-monorepo', - tag: '2f5ddd8-20250506-163536', + tag: 'b98468d-20250516-114244', }, // We're currently using the same deployer key as testnet2. // To minimize nonce clobbering we offset the key funder cron @@ -24,7 +24,7 @@ export const keyFunderConfig: KeyFunderConfig< [Contexts.Hyperlane]: [Role.Relayer, Role.Kathy], [Contexts.ReleaseCandidate]: [Role.Relayer, Role.Kathy], }, - chainsToSkip: ['hyperliquidevmtestnet'], + chainsToSkip: ['hyperliquidevmtestnet', 'suavetoliman'], // desired balance config desiredBalancePerChain: { abstracttestnet: '0.1', From bc58283e62385e759d8fc56ab8cd6dc791061cd1 Mon Sep 17 00:00:00 2001 From: ljankovic-txfusion <131957285+ljankovic-txfusion@users.noreply.github.com> Date: Fri, 16 May 2025 15:53:53 +0200 Subject: [PATCH 03/16] feat: Starknet SDK logic integration [STARKNET-03] (#5838) ### Description 3nd Starknet PR [Diff with previous PR - feat: Starknet address utils #5851](https://github.com/txfusion/hyperlane-monorepo/pull/28/files) This PR introduces Starknet logic to enable token warping on the UI. ### Drive-by changes - Utilities for working with Hyperlane messaging on Starknet - Starknet testChain obj ### Related issues None ### Backward compatibility Yes ### Testing Manual testing of token warping using warp ui template --- .changeset/hip-papayas-kiss.md | 5 + typescript/sdk/package.json | 1 + typescript/sdk/src/app/MultiProtocolApp.ts | 9 + typescript/sdk/src/consts/testChains.ts | 19 ++ typescript/sdk/src/core/MultiProtocolCore.ts | 2 + .../src/core/adapters/StarknetCoreAdapter.ts | 127 ++++++++ typescript/sdk/src/index.ts | 14 + .../src/providers/MultiProtocolProvider.ts | 10 + typescript/sdk/src/providers/MultiProvider.ts | 2 +- typescript/sdk/src/providers/ProviderType.ts | 7 +- typescript/sdk/src/providers/rpcHealthTest.ts | 13 + .../src/providers/transactionFeeEstimators.ts | 21 ++ typescript/sdk/src/token/Token.ts | 17 + .../token/adapters/StarknetTokenAdapter.ts | 293 ++++++++++++++++++ typescript/sdk/src/utils/starknet.ts | 129 ++++++++ typescript/sdk/src/warp/WarpCore.ts | 5 + .../sdk/src/warp/test-warp-core-config.yaml | 8 + yarn.lock | 3 +- 18 files changed, 679 insertions(+), 6 deletions(-) create mode 100644 .changeset/hip-papayas-kiss.md create mode 100644 typescript/sdk/src/core/adapters/StarknetCoreAdapter.ts create mode 100644 typescript/sdk/src/token/adapters/StarknetTokenAdapter.ts create mode 100644 typescript/sdk/src/utils/starknet.ts diff --git a/.changeset/hip-papayas-kiss.md b/.changeset/hip-papayas-kiss.md new file mode 100644 index 00000000000..8ed6b86f2d6 --- /dev/null +++ b/.changeset/hip-papayas-kiss.md @@ -0,0 +1,5 @@ +--- +'@hyperlane-xyz/sdk': minor +--- + +feat: Starknet SDK logic integration diff --git a/typescript/sdk/package.json b/typescript/sdk/package.json index ed139458d3a..9ba90d65260 100644 --- a/typescript/sdk/package.json +++ b/typescript/sdk/package.json @@ -10,6 +10,7 @@ "@cosmjs/stargate": "^0.32.4", "@hyperlane-xyz/core": "7.1.5", "@hyperlane-xyz/cosmos-sdk": "12.6.0", + "@hyperlane-xyz/starknet-core": "1.0.0", "@hyperlane-xyz/utils": "12.6.0", "@safe-global/api-kit": "1.3.0", "@safe-global/protocol-kit": "1.3.0", diff --git a/typescript/sdk/src/app/MultiProtocolApp.ts b/typescript/sdk/src/app/MultiProtocolApp.ts index 8f2baa322e2..d5426971308 100644 --- a/typescript/sdk/src/app/MultiProtocolApp.ts +++ b/typescript/sdk/src/app/MultiProtocolApp.ts @@ -17,6 +17,7 @@ import { CosmJsWasmProvider, EthersV5Provider, SolanaWeb3Provider, + StarknetJsProvider, TypedProvider, } from '../providers/ProviderType.js'; import { ChainMap, ChainName } from '../types.js'; @@ -104,6 +105,14 @@ export class BaseSealevelAdapter extends BaseAppAdapter { } } +export class BaseStarknetAdapter extends BaseAppAdapter { + public readonly protocol: ProtocolType = ProtocolType.Starknet; + + public getProvider(): StarknetJsProvider['provider'] { + return this.multiProvider.getStarknetProvider(this.chainName); + } +} + /** * A version of HyperlaneApp that can support different * provider types across different protocol types. diff --git a/typescript/sdk/src/consts/testChains.ts b/typescript/sdk/src/consts/testChains.ts index a983e145fd2..b63e48ce490 100644 --- a/typescript/sdk/src/consts/testChains.ts +++ b/typescript/sdk/src/consts/testChains.ts @@ -143,6 +143,24 @@ export const testSealevelChain: ChainMetadata = { rpcUrls: [{ http: 'http://127.0.0.1:8899' }], }; +export const testStarknetChain: ChainMetadata = { + chainId: '0x534e5f5345504f4c4941', + domainId: 5854809, + name: 'starknetdevnet', + nativeToken: { + decimals: 18, + denom: '0x49D36570D4E46F48E99674BD3FCC84644DDD6B96F7C741B1562B82F9E004DC7', + name: 'Ether', + symbol: 'ETH', + }, + protocol: ProtocolType.Starknet, + rpcUrls: [ + { + http: 'http://127.0.0.1:5050', + }, + ], +}; + export const multiProtocolTestChainMetadata: ChainMap = { ...testChainMetadata, testcosmos: testCosmosChain, @@ -150,6 +168,7 @@ export const multiProtocolTestChainMetadata: ChainMap = { testxerc20: testXERC20, testvsxerc20: testVSXERC20, testxerc20lockbox: testXERC20Lockbox, + starknetdevnet: testStarknetChain, }; export const multiProtocolTestChains: Array = Object.keys( diff --git a/typescript/sdk/src/core/MultiProtocolCore.ts b/typescript/sdk/src/core/MultiProtocolCore.ts index f230d4c7b68..c5e5d31893e 100644 --- a/typescript/sdk/src/core/MultiProtocolCore.ts +++ b/typescript/sdk/src/core/MultiProtocolCore.ts @@ -9,6 +9,7 @@ import { CosmNativeCoreAdapter } from './adapters/CosmNativeCoreAdapter.js'; import { CosmWasmCoreAdapter } from './adapters/CosmWasmCoreAdapter.js'; import { EvmCoreAdapter } from './adapters/EvmCoreAdapter.js'; import { SealevelCoreAdapter } from './adapters/SealevelCoreAdapter.js'; +import { StarknetCoreAdapter } from './adapters/StarknetCoreAdapter.js'; import { ICoreAdapter } from './adapters/types.js'; import { CoreAddresses } from './contracts.js'; @@ -41,6 +42,7 @@ export class MultiProtocolCore extends MultiProtocolApp< if (protocol === ProtocolType.Sealevel) return SealevelCoreAdapter; if (protocol === ProtocolType.Cosmos) return CosmWasmCoreAdapter; if (protocol === ProtocolType.CosmosNative) return CosmNativeCoreAdapter; + if (protocol === ProtocolType.Starknet) return StarknetCoreAdapter; throw new Error(`No adapter for protocol ${protocol}`); } diff --git a/typescript/sdk/src/core/adapters/StarknetCoreAdapter.ts b/typescript/sdk/src/core/adapters/StarknetCoreAdapter.ts new file mode 100644 index 00000000000..f0dc96fbdf2 --- /dev/null +++ b/typescript/sdk/src/core/adapters/StarknetCoreAdapter.ts @@ -0,0 +1,127 @@ +import { + CallData, + InvokeTransactionReceiptResponse, + ParsedEvents, + events as eventsUtils, +} from 'starknet'; + +import { getCompiledContract } from '@hyperlane-xyz/starknet-core'; +import { Address, HexString, pollAsync } from '@hyperlane-xyz/utils'; + +import { BaseStarknetAdapter } from '../../app/MultiProtocolApp.js'; +import { MultiProtocolProvider } from '../../providers/MultiProtocolProvider.js'; +import { + ProviderType, + StarknetJsTransactionReceipt, +} from '../../providers/ProviderType.js'; +import { ChainName } from '../../types.js'; +import { + getStarknetMailboxContract, + parseStarknetDispatchEvents, +} from '../../utils/starknet.js'; + +import { ICoreAdapter } from './types.js'; + +export class StarknetCoreAdapter + extends BaseStarknetAdapter + implements ICoreAdapter +{ + constructor( + public readonly chainName: ChainName, + public readonly multiProvider: MultiProtocolProvider, + public readonly addresses: { mailbox: Address }, + ) { + super(chainName, multiProvider, addresses); + } + + extractMessageIds( + sourceTx: StarknetJsTransactionReceipt, + ): Array<{ messageId: string; destination: ChainName }> { + if (sourceTx.type !== ProviderType.Starknet) { + throw new Error( + `Unsupported provider type for StarknetCoreAdapter ${sourceTx.type}`, + ); + } + + let parsedEvents: ParsedEvents = []; + sourceTx.receipt.match({ + success: (txR) => { + const emittedEvents = + (txR as InvokeTransactionReceiptResponse).events?.map((event) => { + return { + block_hash: (txR as any).block_hash, + block_number: (txR as any).block_number, + transaction_hash: (txR as any).transaction_hash, + ...event, + }; + }) || []; + + if (emittedEvents.length === 0) return; + const mailboxAbi = getCompiledContract('mailbox').abi; + parsedEvents = eventsUtils.parseEvents( + emittedEvents, + eventsUtils.getAbiEvents(mailboxAbi), + CallData.getAbiStruct(mailboxAbi), + CallData.getAbiEnum(mailboxAbi), + ); + }, + _: () => { + throw Error('This transaction was not successful.'); + }, + }); + + if (!parsedEvents || parsedEvents.length === 0) return []; + + const messages = parseStarknetDispatchEvents( + parsedEvents, + (domain) => this.multiProvider.tryGetChainName(domain) ?? undefined, + ); + + return messages.map(({ id, parsed }) => ({ + messageId: id, + destination: this.multiProvider.getChainName(parsed.destination), + })); + } + + async waitForMessageProcessed( + messageId: HexString, + destination: ChainName, + delayMs = 5000, + maxAttempts = 60, + ): Promise { + const destAdapter = new StarknetCoreAdapter( + destination, + this.multiProvider, + { mailbox: this.addresses.mailbox }, + ); + + const mailboxContract = getStarknetMailboxContract( + destAdapter.addresses.mailbox, + destAdapter.getProvider(), + ); + + await pollAsync( + async () => { + const isDelivered = await mailboxContract.call('delivered', [ + messageId, + ]); + + if (!isDelivered) { + throw new Error( + `Message ${messageId} not yet delivered on ${destination}`, + ); + } + + this.logger.debug( + `Message ${messageId} confirmed delivered on ${destination}`, + ); + + return isDelivered; + }, + delayMs, + maxAttempts, + ); + + return true; + } +} diff --git a/typescript/sdk/src/index.ts b/typescript/sdk/src/index.ts index d9a029b2347..517aa926a63 100644 --- a/typescript/sdk/src/index.ts +++ b/typescript/sdk/src/index.ts @@ -60,6 +60,7 @@ export { export { CosmWasmCoreAdapter } from './core/adapters/CosmWasmCoreAdapter.js'; export { EvmCoreAdapter } from './core/adapters/EvmCoreAdapter.js'; export { SealevelCoreAdapter } from './core/adapters/SealevelCoreAdapter.js'; +export { StarknetCoreAdapter } from './core/adapters/StarknetCoreAdapter.js'; export { ICoreAdapter } from './core/adapters/types.js'; export { CoreAddresses, @@ -366,6 +367,10 @@ export { SolanaWeb3Provider, SolanaWeb3Transaction, SolanaWeb3TransactionReceipt, + StarknetJsContract, + StarknetJsProvider, + StarknetJsTransaction, + StarknetJsTransactionReceipt, TypedContract, TypedProvider, TypedTransaction, @@ -712,3 +717,12 @@ export { CCIPContractCache, } from './ccip/utils.js'; export { HyperlaneCCIPDeployer } from './ccip/HyperlaneCCIPDeployer.js'; + +export { + StarknetContractName, + getStarknetContract, + getStarknetHypERC20Contract, + getStarknetHypERC20CollateralContract, + getStarknetMailboxContract, + getStarknetEtherContract, +} from './utils/starknet.js'; diff --git a/typescript/sdk/src/providers/MultiProtocolProvider.ts b/typescript/sdk/src/providers/MultiProtocolProvider.ts index ffcecd9fe59..1e30cdf4714 100644 --- a/typescript/sdk/src/providers/MultiProtocolProvider.ts +++ b/typescript/sdk/src/providers/MultiProtocolProvider.ts @@ -25,6 +25,7 @@ import { ProviderMap, ProviderType, SolanaWeb3Provider, + StarknetJsProvider, TypedProvider, TypedTransaction, ViemProvider, @@ -215,6 +216,15 @@ export class MultiProtocolProvider< ); } + getStarknetProvider( + chainNameOrId: ChainNameOrId, + ): StarknetJsProvider['provider'] { + return this.getSpecificProvider( + chainNameOrId, + ProviderType.Starknet, + ); + } + setProvider( chainNameOrId: ChainNameOrId, provider: TypedProvider, diff --git a/typescript/sdk/src/providers/MultiProvider.ts b/typescript/sdk/src/providers/MultiProvider.ts index 7b5f923061f..9f9f8b0fe26 100644 --- a/typescript/sdk/src/providers/MultiProvider.ts +++ b/typescript/sdk/src/providers/MultiProvider.ts @@ -316,7 +316,7 @@ export class MultiProvider extends ChainMetadataManager { // setup contract factory const overrides = this.getTransactionOverrides(chainNameOrId); const signer = this.getSigner(chainNameOrId); - const contractFactory = await factory.connect(signer); + const contractFactory = factory.connect(signer); // estimate gas const deployTx = contractFactory.getDeployTransaction(...params); diff --git a/typescript/sdk/src/providers/ProviderType.ts b/typescript/sdk/src/providers/ProviderType.ts index 590d8a2e68f..80012225254 100644 --- a/typescript/sdk/src/providers/ProviderType.ts +++ b/typescript/sdk/src/providers/ProviderType.ts @@ -19,8 +19,7 @@ import { Contract as StarknetContract, Invocation as StarknetInvocation, Provider as StarknetProvider, - ReceiptTx as StarknetReceiptTx, - TransactionReceipt as StarknetTxReceipt, + GetTransactionReceiptResponse as StarknetTxReceipt, } from 'starknet'; import type { GetContractReturnType, @@ -356,9 +355,9 @@ export interface CosmJsNativeTransactionReceipt } export interface StarknetJsTransactionReceipt - extends TypedTransactionReceiptBase { + extends TypedTransactionReceiptBase { type: ProviderType.Starknet; - receipt: StarknetTxReceipt | StarknetReceiptTx; + receipt: StarknetTxReceipt; } export interface ZKSyncTransactionReceipt diff --git a/typescript/sdk/src/providers/rpcHealthTest.ts b/typescript/sdk/src/providers/rpcHealthTest.ts index 57b8e4579dc..459f918d9c3 100644 --- a/typescript/sdk/src/providers/rpcHealthTest.ts +++ b/typescript/sdk/src/providers/rpcHealthTest.ts @@ -10,6 +10,7 @@ import { EthersV5Provider, ProviderType, SolanaWeb3Provider, + StarknetJsProvider, } from './ProviderType.js'; import { protocolToDefaultProviderBuilder } from './providerBuilders.js'; @@ -30,6 +31,8 @@ export async function isRpcHealthy( provider.type === ProviderType.CosmJsNative ) return isCosmJsProviderHealthy(provider.provider, metadata); + else if (provider.type === ProviderType.Starknet) + return isStarknetJsProviderHealthy(provider.provider, metadata); else throw new Error( `Unsupported provider type ${provider.type}, new health check required`, @@ -88,3 +91,13 @@ export async function isCosmJsProviderHealthy( rootLogger.debug(`Block number is okay for ${metadata.name}`); return true; } + +export async function isStarknetJsProviderHealthy( + provider: StarknetJsProvider['provider'], + metadata: ChainMetadata, +): Promise { + const blockNumber = await provider.getBlockNumber(); + if (!blockNumber || blockNumber < 0) return false; + rootLogger.debug(`Block number is okay for ${metadata.name}`); + return true; +} diff --git a/typescript/sdk/src/providers/transactionFeeEstimators.ts b/typescript/sdk/src/providers/transactionFeeEstimators.ts index 56fa4885e74..2a96683142d 100644 --- a/typescript/sdk/src/providers/transactionFeeEstimators.ts +++ b/typescript/sdk/src/providers/transactionFeeEstimators.ts @@ -22,6 +22,8 @@ import { ProviderType, SolanaWeb3Provider, SolanaWeb3Transaction, + StarknetJsProvider, + StarknetJsTransaction, TypedProvider, TypedTransaction, ViemProvider, @@ -326,9 +328,28 @@ export function estimateTransactionFee({ sender, senderPubKey, }); + } else if ( + transaction.type === ProviderType.Starknet && + provider.type === ProviderType.Starknet + ) { + return estimateTransactionFeeStarknet({ transaction, provider, sender }); } else { throw new Error( `Unsupported transaction type ${transaction.type} or provider type ${provider.type} for gas estimation`, ); } } + +// Starknet does not support gas estimation without starknet account +// TODO: Figure out a way to inject starknet account +export async function estimateTransactionFeeStarknet({ + transaction: _transaction, + provider: _provider, + sender: _sender, +}: { + transaction: StarknetJsTransaction; + provider: StarknetJsProvider; + sender: Address; +}): Promise { + return { gasUnits: 0, gasPrice: 0, fee: 0 }; +} diff --git a/typescript/sdk/src/token/Token.ts b/typescript/sdk/src/token/Token.ts index a09be1b85aa..43edec5e820 100644 --- a/typescript/sdk/src/token/Token.ts +++ b/typescript/sdk/src/token/Token.ts @@ -65,6 +65,11 @@ import { SealevelNativeTokenAdapter, SealevelTokenAdapter, } from './adapters/SealevelTokenAdapter.js'; +import { + StarknetHypCollateralAdapter, + StarknetHypNativeAdapter, + StarknetHypSyntheticAdapter, +} from './adapters/StarknetTokenAdapter.js'; import { PROTOCOL_TO_DEFAULT_NATIVE_TOKEN } from './nativeTokenMetadata.js'; // Declaring the interface in addition to class allows @@ -296,6 +301,18 @@ export class Token implements IToken { return new CosmNativeHypSyntheticAdapter(chainName, multiProvider, { token: addressOrDenom, }); + } else if (standard === TokenStandard.StarknetHypNative) { + return new StarknetHypNativeAdapter(chainName, multiProvider, { + warpRouter: addressOrDenom, + }); + } else if (standard === TokenStandard.StarknetHypSynthetic) { + return new StarknetHypSyntheticAdapter(chainName, multiProvider, { + warpRouter: addressOrDenom, + }); + } else if (standard === TokenStandard.StarknetHypCollateral) { + return new StarknetHypCollateralAdapter(chainName, multiProvider, { + warpRouter: addressOrDenom, + }); } else { throw new Error(`No hyp adapter found for token standard: ${standard}`); } diff --git a/typescript/sdk/src/token/adapters/StarknetTokenAdapter.ts b/typescript/sdk/src/token/adapters/StarknetTokenAdapter.ts new file mode 100644 index 00000000000..177a96351a6 --- /dev/null +++ b/typescript/sdk/src/token/adapters/StarknetTokenAdapter.ts @@ -0,0 +1,293 @@ +import { BigNumber } from 'ethers'; +import { CairoOption, CairoOptionVariant, Call, Contract, num } from 'starknet'; + +import { + Address, + Domain, + Numberish, + ProtocolType, + assert, +} from '@hyperlane-xyz/utils'; + +import { BaseStarknetAdapter } from '../../app/MultiProtocolApp.js'; +import { MultiProtocolProvider } from '../../providers/MultiProtocolProvider.js'; +import { ChainName } from '../../types.js'; +import { + getStarknetEtherContract, + getStarknetHypERC20CollateralContract, + getStarknetHypERC20Contract, +} from '../../utils/starknet.js'; +import { PROTOCOL_TO_DEFAULT_NATIVE_TOKEN } from '../nativeTokenMetadata.js'; +import { TokenMetadata } from '../types.js'; + +import { + IHypTokenAdapter, + InterchainGasQuote, + TransferParams, + TransferRemoteParams, +} from './ITokenAdapter.js'; + +export class StarknetHypSyntheticAdapter + extends BaseStarknetAdapter + implements IHypTokenAdapter +{ + public readonly contract: Contract; + + constructor( + public readonly chainName: ChainName, + public readonly multiProvider: MultiProtocolProvider, + public readonly addresses: { warpRouter: Address }, + ) { + super(chainName, multiProvider, addresses); + this.contract = getStarknetHypERC20Contract( + addresses.warpRouter, + multiProvider.getStarknetProvider(chainName), + ); + } + + async getBalance(address: Address): Promise { + return this.contract.balanceOf(address); + } + + async getMetadata(_isNft?: boolean): Promise { + const [decimals, symbol, name] = await Promise.all([ + this.contract.decimals(), + this.contract.symbol(), + this.contract.name(), + ]); + return { decimals, symbol, name }; + } + + async isApproveRequired( + owner: Address, + spender: Address, + weiAmountOrId: Numberish, + ): Promise { + const allowance = await this.contract.allowance(owner, spender); + return BigNumber.from(allowance.toString()).lt( + BigNumber.from(weiAmountOrId), + ); + } + + async isRevokeApprovalRequired( + _owner: Address, + _spender: Address, + ): Promise { + return false; + } + + async populateApproveTx({ + weiAmountOrId, + recipient, + }: TransferParams): Promise { + return this.contract.populateTransaction.approve(recipient, weiAmountOrId); + } + + async populateTransferTx({ + weiAmountOrId, + recipient, + }: TransferParams): Promise { + return this.contract.populateTransaction.transfer(recipient, weiAmountOrId); + } + + async getTotalSupply(): Promise { + return undefined; + } + + async quoteTransferRemoteGas( + _destination: Domain, + ): Promise { + return { amount: 0n }; + } + + async populateTransferRemoteTx({ + weiAmountOrId, + destination, + recipient, + interchainGas, + }: TransferRemoteParams): Promise { + const nonOption = new CairoOption(CairoOptionVariant.None); + const transferTx = this.contract.populateTransaction.transfer_remote( + destination, + recipient, + BigInt(weiAmountOrId.toString()), + 0n, + nonOption, + nonOption, + ); + + return { + ...transferTx, + value: interchainGas?.amount + ? BigNumber.from(interchainGas.amount) + : BigNumber.from(0), + }; + } + + async getMinimumTransferAmount(_recipient: Address): Promise { + return 0n; + } + + async getDomains(): Promise { + return this.contract.domains(); + } + + async getRouterAddress(domain: Domain): Promise { + const routerAddresses = await this.contract.routers(domain); + return Buffer.from(routerAddresses); + } + + async getAllRouters(): Promise> { + const domains = await this.getDomains(); + const routers: Buffer[] = await Promise.all( + domains.map((d) => this.getRouterAddress(d)), + ); + return domains.map((d, i) => ({ domain: d, address: routers[i] })); + } + + async getBridgedSupply(): Promise { + return undefined; + } +} + +export class StarknetHypCollateralAdapter extends StarknetHypSyntheticAdapter { + public readonly collateralContract: Contract; + protected wrappedTokenAddress?: Address; + + constructor( + chainName: ChainName, + multiProvider: MultiProtocolProvider, + addresses: { warpRouter: Address }, + ) { + super(chainName, multiProvider, addresses); + this.collateralContract = getStarknetHypERC20CollateralContract( + addresses.warpRouter, + multiProvider.getStarknetProvider(chainName), + ); + } + + protected async getWrappedTokenAddress(): Promise
{ + if (!this.wrappedTokenAddress) { + this.wrappedTokenAddress = num.toHex64( + await this.collateralContract.get_wrapped_token(), + ); + } + return this.wrappedTokenAddress!; + } + + protected async getWrappedTokenAdapter(): Promise { + return new StarknetHypSyntheticAdapter(this.chainName, this.multiProvider, { + warpRouter: await this.getWrappedTokenAddress(), + }); + } + + async getBalance(address: Address): Promise { + const adapter = await this.getWrappedTokenAdapter(); + return adapter.getBalance(address); + } + + override getBridgedSupply(): Promise { + return this.getBalance(this.addresses.warpRouter); + } + + override async getMetadata(isNft?: boolean): Promise { + const adapter = await this.getWrappedTokenAdapter(); + return adapter.getMetadata(isNft); + } + + override async isApproveRequired( + owner: Address, + spender: Address, + weiAmountOrId: Numberish, + ): Promise { + const adapter = await this.getWrappedTokenAdapter(); + return adapter.isApproveRequired(owner, spender, weiAmountOrId); + } + + override async populateApproveTx(params: TransferParams): Promise { + const adapter = await this.getWrappedTokenAdapter(); + return adapter.populateApproveTx(params); + } + + override async populateTransferTx(params: TransferParams): Promise { + const adapter = await this.getWrappedTokenAdapter(); + return adapter.populateTransferTx(params); + } +} + +export class StarknetHypNativeAdapter extends StarknetHypSyntheticAdapter { + public readonly collateralContract: Contract; + public readonly nativeContract: Contract; + + constructor( + chainName: ChainName, + multiProvider: MultiProtocolProvider, + addresses: { warpRouter: Address }, + ) { + super(chainName, multiProvider, addresses); + this.collateralContract = getStarknetHypERC20CollateralContract( + addresses.warpRouter, + multiProvider.getStarknetProvider(chainName), + ); + const nativeAddress = + multiProvider.getChainMetadata(chainName)?.nativeToken?.denom; + const tokenAddress = + nativeAddress ?? + PROTOCOL_TO_DEFAULT_NATIVE_TOKEN[ProtocolType.Starknet]!.denom; + assert(tokenAddress, `Native address not found for chain ${chainName}`); + this.nativeContract = getStarknetEtherContract( + tokenAddress, + multiProvider.getStarknetProvider(chainName), + ); + } + + async getBalance(address: Address): Promise { + return this.nativeContract.balanceOf(address); + } + + async isApproveRequired( + owner: Address, + spender: Address, + weiAmountOrId: Numberish, + ): Promise { + const allowance = await this.nativeContract.allowance(owner, spender); + return BigNumber.from(allowance.toString()).lt( + BigNumber.from(weiAmountOrId), + ); + } + + async populateApproveTx({ + weiAmountOrId, + recipient, + }: TransferParams): Promise { + return this.nativeContract.populateTransaction.approve( + recipient, + weiAmountOrId, + ); + } + + async populateTransferRemoteTx({ + weiAmountOrId, + destination, + recipient, + interchainGas, + }: TransferRemoteParams): Promise { + const nonOption = new CairoOption(CairoOptionVariant.None); + const transferTx = + this.collateralContract.populateTransaction.transfer_remote( + destination, + recipient, + BigInt(weiAmountOrId.toString()), + BigInt(weiAmountOrId.toString()), + nonOption, + nonOption, + ); + + return { + ...transferTx, + value: interchainGas?.amount + ? BigNumber.from(interchainGas.amount) + : BigNumber.from(0), + }; + } +} diff --git a/typescript/sdk/src/utils/starknet.ts b/typescript/sdk/src/utils/starknet.ts new file mode 100644 index 00000000000..637e615accb --- /dev/null +++ b/typescript/sdk/src/utils/starknet.ts @@ -0,0 +1,129 @@ +import { utils } from 'ethers'; +import { + AccountInterface, + Contract, + ParsedEvent, + ParsedEvents, + ParsedStruct, + ProviderInterface, +} from 'starknet'; + +import { + ContractType, + getCompiledContract, +} from '@hyperlane-xyz/starknet-core'; + +import { DispatchedMessage } from '../core/types.js'; + +export enum StarknetContractName { + MAILBOX = 'mailbox', + HYP_ERC20 = 'HypErc20', + HYP_ERC20_COLLATERAL = 'HypErc20Collateral', + HYP_NATIVE = 'HypNative', + ETHER = 'Ether', + MERKLE_TREE_HOOK = 'merkle_tree_hook', + NOOP_ISM = 'noop_ism', + HOOK = 'hook', + PROTOCOL_FEE = 'protocol_fee', + VALIDATOR_ANNOUNCE = 'validator_announce', + MESSAGE_RECIPIENT = 'message_recipient', + DOMAIN_ROUTING_HOOK = 'domain_routing_hook', + FALLBACK_DOMAIN_ROUTING_HOOK = 'fallback_domain_routing_hook', + STATIC_AGGREGATION_HOOK = 'static_aggregation_hook', +} + +/** + * Creates a Starknet contract instance with the given parameters + */ +export function getStarknetContract( + contractName: string, + address: string, + providerOrAccount?: ProviderInterface | AccountInterface, + contractType: ContractType = ContractType.CONTRACT, +): Contract { + const { abi } = getCompiledContract(contractName, contractType); + return new Contract(abi, address, providerOrAccount); +} + +export function getStarknetMailboxContract( + address: string, + providerOrAccount?: ProviderInterface | AccountInterface, +): Contract { + return getStarknetContract( + StarknetContractName.MAILBOX, + address, + providerOrAccount, + ); +} + +export function getStarknetHypERC20Contract( + address: string, + providerOrAccount?: ProviderInterface | AccountInterface, +): Contract { + return getStarknetContract( + StarknetContractName.HYP_ERC20, + address, + providerOrAccount, + ContractType.TOKEN, + ); +} + +export function getStarknetHypERC20CollateralContract( + address: string, + providerOrAccount?: ProviderInterface | AccountInterface, +): Contract { + return getStarknetContract( + StarknetContractName.HYP_ERC20_COLLATERAL, + address, + providerOrAccount, + ContractType.TOKEN, + ); +} + +export function getStarknetEtherContract( + address: string, + providerOrAccount?: ProviderInterface | AccountInterface, +): Contract { + return getStarknetContract( + StarknetContractName.ETHER, + address, + providerOrAccount, + ContractType.TOKEN, + ); +} + +const DISPATCH_EVENT = 'contracts::mailbox::mailbox::Dispatch'; +const DISPATCH_ID_EVENT = 'contracts::mailbox::mailbox::DispatchId'; + +export function parseStarknetDispatchEvents( + parsedEvents: ParsedEvents, + chainNameResolver: (domain: number) => string | undefined, +): DispatchedMessage[] { + return parsedEvents + .filter((event: ParsedEvent) => DISPATCH_EVENT in event) + .map((dispatchEvent: ParsedEvent) => { + const message = dispatchEvent[DISPATCH_EVENT].message as ParsedStruct; + const originChain = chainNameResolver(Number(message.origin)); + const destinationChain = chainNameResolver(Number(message.destination)); + + return { + parsed: { + ...message, + originChain, + destinationChain, + }, + id: parseStarknetDispatchIdEvents(parsedEvents)[0], + message: message.raw, + } as DispatchedMessage; + }); +} + +export function parseStarknetDispatchIdEvents( + parsedEvents: ParsedEvents, +): string[] { + return parsedEvents + .filter((event: ParsedEvent) => DISPATCH_ID_EVENT in event) + .map((dispatchEvent: ParsedEvent) => + utils.hexlify(dispatchEvent[DISPATCH_ID_EVENT].id as bigint), + ); +} diff --git a/typescript/sdk/src/warp/WarpCore.ts b/typescript/sdk/src/warp/WarpCore.ts index 6617e6d89a2..208236cd358 100644 --- a/typescript/sdk/src/warp/WarpCore.ts +++ b/typescript/sdk/src/warp/WarpCore.ts @@ -227,6 +227,11 @@ export class WarpCore { interchainFee, }); + // Starknet does not support gas estimation without starknet account + if (originToken.protocol === ProtocolType.Starknet) { + return { gasUnits: 0n, gasPrice: 0n, fee: 0n }; + } + // Typically the transfers require a single transaction if (txs.length === 1) { try { diff --git a/typescript/sdk/src/warp/test-warp-core-config.yaml b/typescript/sdk/src/warp/test-warp-core-config.yaml index 3b1944f5e6d..4c551ebbd79 100644 --- a/typescript/sdk/src/warp/test-warp-core-config.yaml +++ b/typescript/sdk/src/warp/test-warp-core-config.yaml @@ -124,6 +124,14 @@ tokens: symbol: atom name: atom addressOrDenom: atom + - chainName: starknetdevnet + standard: StarknetHypSynthetic + decimals: 18 + symbol: ETH + name: Ether on starknet + addressOrDenom: '0x0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef' + connections: + - { token: ethereum|test1|0x1234567890123456789012345678901234567890 } options: interchainFeeConstants: diff --git a/yarn.lock b/yarn.lock index 9bc85b233ce..5b1406d5b24 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7934,6 +7934,7 @@ __metadata: "@eslint/js": "npm:^9.15.0" "@hyperlane-xyz/core": "npm:7.1.5" "@hyperlane-xyz/cosmos-sdk": "npm:12.6.0" + "@hyperlane-xyz/starknet-core": "npm:1.0.0" "@hyperlane-xyz/utils": "npm:12.6.0" "@nomiclabs/hardhat-ethers": "npm:^2.2.3" "@nomiclabs/hardhat-waffle": "npm:^2.0.6" @@ -7979,7 +7980,7 @@ __metadata: languageName: unknown linkType: soft -"@hyperlane-xyz/starknet-core@workspace:starknet": +"@hyperlane-xyz/starknet-core@npm:1.0.0, @hyperlane-xyz/starknet-core@workspace:starknet": version: 0.0.0-use.local resolution: "@hyperlane-xyz/starknet-core@workspace:starknet" dependencies: From 72b90f84edafec9d31c5a3deeda2a182f2329939 Mon Sep 17 00:00:00 2001 From: Troy Kessler <43882936+troykessler@users.noreply.github.com> Date: Fri, 16 May 2025 16:53:04 +0200 Subject: [PATCH 04/16] chore: add cosmos core module & reader (#6241) ### Description This PR implements and adds the Cosmos Native Core Reader and Module. Note that this is the fourth PR of https://github.com/hyperlane-xyz/hyperlane-monorepo/pull/6050 which is being split up in order to make it easier to review ### Drive-by changes - ### Related issues - ### Backward compatibility Yes ### Testing Manual Tests --- .changeset/better-carrots-tell.md | 5 + .../sdk/src/core/CosmosNativeCoreModule.ts | 469 ++++++++++++++++++ .../sdk/src/core/CosmosNativeCoreReader.ts | 51 ++ typescript/sdk/src/index.ts | 2 + 4 files changed, 527 insertions(+) create mode 100644 .changeset/better-carrots-tell.md create mode 100644 typescript/sdk/src/core/CosmosNativeCoreModule.ts create mode 100644 typescript/sdk/src/core/CosmosNativeCoreReader.ts diff --git a/.changeset/better-carrots-tell.md b/.changeset/better-carrots-tell.md new file mode 100644 index 00000000000..d0167a92cc3 --- /dev/null +++ b/.changeset/better-carrots-tell.md @@ -0,0 +1,5 @@ +--- +'@hyperlane-xyz/sdk': minor +--- + +add cosmos native core module & reader diff --git a/typescript/sdk/src/core/CosmosNativeCoreModule.ts b/typescript/sdk/src/core/CosmosNativeCoreModule.ts new file mode 100644 index 00000000000..9d724fc7ec2 --- /dev/null +++ b/typescript/sdk/src/core/CosmosNativeCoreModule.ts @@ -0,0 +1,469 @@ +import { + COSMOS_MODULE_MESSAGE_REGISTRY as R, + SigningHyperlaneModuleClient, +} from '@hyperlane-xyz/cosmos-sdk'; +import { DeployedCoreAddresses, HookConfig } from '@hyperlane-xyz/sdk'; +import { + Address, + ChainId, + Domain, + ProtocolType, + eqAddress, + rootLogger, +} from '@hyperlane-xyz/utils'; + +import { CosmosNativeHookModule } from '../hook/CosmosNativeHookModule.js'; +import { DerivedHookConfig, HookType } from '../hook/types.js'; +import { CosmosNativeIsmModule } from '../ism/CosmosNativeIsmModule.js'; +import { DerivedIsmConfig, IsmConfig, IsmType } from '../ism/types.js'; +import { MultiProvider } from '../providers/MultiProvider.js'; +import { AnnotatedCosmJsNativeTransaction } from '../providers/ProviderType.js'; +import { ChainName, ChainNameOrId } from '../types.js'; + +import { + HyperlaneModule, + HyperlaneModuleParams, +} from './AbstractHyperlaneModule.js'; +import { CosmosNativeCoreReader } from './CosmosNativeCoreReader.js'; +import { CoreConfig, CoreConfigSchema, DerivedCoreConfig } from './types.js'; + +export class CosmosNativeCoreModule extends HyperlaneModule< + ProtocolType.CosmosNative, + CoreConfig, + Record +> { + protected logger = rootLogger.child({ module: 'CosmosNativeCoreModule' }); + protected coreReader: CosmosNativeCoreReader; + + public readonly chainName: ChainName; + public readonly chainId: ChainId; + public readonly domainId: Domain; + + constructor( + protected readonly multiProvider: MultiProvider, + protected readonly signer: SigningHyperlaneModuleClient, + args: HyperlaneModuleParams>, + ) { + super(args); + + this.chainName = multiProvider.getChainName(args.chain); + this.chainId = multiProvider.getChainId(args.chain); + this.domainId = multiProvider.getDomainId(args.chain); + + this.coreReader = new CosmosNativeCoreReader(this.multiProvider, signer); + } + + /** + * Reads the core configuration from the mailbox address + * @returns The core config. + */ + public async read(): Promise { + return this.coreReader.deriveCoreConfig(this.args.addresses.mailbox); + } + + /** + * Deploys the Core contracts. + * @returns The created CosmosNativeCoreModule instance. + */ + public static async create(params: { + chain: ChainNameOrId; + config: CoreConfig; + multiProvider: MultiProvider; + signer: SigningHyperlaneModuleClient; + }): Promise { + const { chain, config, multiProvider, signer } = params; + const addresses = await CosmosNativeCoreModule.deploy({ + config, + multiProvider, + chain, + signer, + }); + + // Create CoreModule and deploy the Core contracts + const module = new CosmosNativeCoreModule(multiProvider, signer, { + addresses, + chain, + config, + }); + + return module; + } + + /** + * Deploys the core Hyperlane contracts. + * @returns The deployed core contract addresses. + */ + static async deploy(params: { + config: CoreConfig; + multiProvider: MultiProvider; + chain: ChainNameOrId; + signer: SigningHyperlaneModuleClient; + }): Promise { + const { config, multiProvider, chain, signer } = params; + + const chainName = multiProvider.getChainName(chain); + const domainId = multiProvider.getDomainId(chain); + + // 1. Deploy default ISM + const ismModule = await CosmosNativeIsmModule.create({ + chain: chainName, + config: config.defaultIsm, + addresses: { + deployedIsm: '', + mailbox: '', + }, + multiProvider, + signer, + }); + + const { deployedIsm: defaultIsm } = ismModule.serialize(); + + // 2. Deploy Mailbox with initial configuration + const { response: mailbox } = await signer.createMailbox({ + local_domain: domainId, + default_ism: defaultIsm, + default_hook: '', + required_hook: '', + }); + + // 3. Deploy default hook + const defaultHookModule = await CosmosNativeHookModule.create({ + chain: chainName, + config: config.defaultHook, + addresses: { + deployedHook: '', + mailbox: mailbox.id, + }, + multiProvider, + signer, + }); + + const { deployedHook: defaultHook } = defaultHookModule.serialize(); + + // 4. Deploy required hook + const requiredHookModule = await CosmosNativeHookModule.create({ + chain: chainName, + config: config.requiredHook, + addresses: { + deployedHook: '', + mailbox: mailbox.id, + }, + multiProvider, + signer, + }); + + const { deployedHook: requiredHook } = requiredHookModule.serialize(); + + // 5. Update the configuration with the newly created hooks + await signer.setMailbox({ + mailbox_id: mailbox.id, + default_ism: defaultIsm, + default_hook: defaultHook, + required_hook: requiredHook, + new_owner: config.owner || '', + }); + + const addresses: DeployedCoreAddresses = { + mailbox: mailbox.id, + staticMerkleRootMultisigIsmFactory: '', + proxyAdmin: '', + staticMerkleRootWeightedMultisigIsmFactory: '', + staticAggregationHookFactory: '', + staticAggregationIsmFactory: '', + staticMessageIdMultisigIsmFactory: '', + staticMessageIdWeightedMultisigIsmFactory: '', + validatorAnnounce: '', + testRecipient: '', + interchainAccountIsm: '', + interchainAccountRouter: '', + domainRoutingIsmFactory: '', + }; + + if (typeof config.defaultIsm !== 'string') { + switch (config.defaultIsm.type) { + case IsmType.MERKLE_ROOT_MULTISIG: { + addresses.staticMerkleRootMultisigIsmFactory = defaultIsm; + break; + } + case IsmType.MESSAGE_ID_MULTISIG: { + addresses.staticMessageIdMultisigIsmFactory = defaultIsm; + break; + } + case IsmType.ROUTING: { + addresses.domainRoutingIsmFactory = defaultIsm; + break; + } + } + } + + if (typeof config.defaultHook !== 'string') { + switch (config.defaultHook.type) { + case HookType.INTERCHAIN_GAS_PAYMASTER: { + addresses.interchainGasPaymaster = defaultHook; + break; + } + case HookType.MERKLE_TREE: { + addresses.merkleTreeHook = defaultHook; + break; + } + } + } + + if (typeof config.requiredHook !== 'string') { + switch (config.requiredHook.type) { + case HookType.INTERCHAIN_GAS_PAYMASTER: { + addresses.interchainGasPaymaster = requiredHook; + break; + } + case HookType.MERKLE_TREE: { + addresses.merkleTreeHook = requiredHook; + break; + } + } + } + + return addresses; + } + + /** + * Updates the core contracts with the provided configuration. + * + * @param expectedConfig - The configuration for the core contracts to be updated. + * @returns An array of Cosmos transactions that were executed to update the contract. + */ + public async update( + expectedConfig: CoreConfig, + ): Promise { + CoreConfigSchema.parse(expectedConfig); + const actualConfig = await this.read(); + + const transactions: AnnotatedCosmJsNativeTransaction[] = []; + transactions.push( + ...(await this.createDefaultIsmUpdateTxs(actualConfig, expectedConfig)), + ...(await this.createDefaultHookUpdateTxs(actualConfig, expectedConfig)), + ...(await this.createRequiredHookUpdateTxs(actualConfig, expectedConfig)), + ...this.createMailboxOwnerUpdateTxs(actualConfig, expectedConfig), + ); + + return transactions; + } + + private createMailboxOwnerUpdateTxs( + actualConfig: CoreConfig, + expectedConfig: CoreConfig, + ): AnnotatedCosmJsNativeTransaction[] { + if (eqAddress(actualConfig.owner, expectedConfig.owner)) { + return []; + } + + return [ + { + annotation: `Transferring ownership of Mailbox from ${actualConfig.owner} to ${expectedConfig.owner}`, + typeUrl: R.MsgSetMailbox.proto.type, + value: R.MsgSetMailbox.proto.converter.create({ + owner: actualConfig.owner, + mailbox_id: this.args.addresses.mailbox, + new_owner: expectedConfig.owner, + }), + }, + ]; + } + + /** + * Create a transaction to update an existing ISM config, or deploy a new ISM and return a tx to setDefaultIsm + * + * @param actualConfig - The on-chain router configuration, including the ISM configuration, and address. + * @param expectedConfig - The expected token router configuration, including the ISM configuration. + * @returns Transaction that need to be executed to update the ISM configuration. + */ + async createDefaultIsmUpdateTxs( + actualConfig: DerivedCoreConfig, + expectedConfig: CoreConfig, + ): Promise { + const updateTransactions: AnnotatedCosmJsNativeTransaction[] = []; + + const actualDefaultIsmConfig = actualConfig.defaultIsm as DerivedIsmConfig; + + // Try to update (may also deploy) Ism with the expected config + const { deployedIsm, ismUpdateTxs } = await this.deployOrUpdateIsm( + actualDefaultIsmConfig, + expectedConfig.defaultIsm, + ); + + if (ismUpdateTxs.length) { + updateTransactions.push(...ismUpdateTxs); + } + + const newIsmDeployed = actualDefaultIsmConfig.address !== deployedIsm; + if (newIsmDeployed) { + const { mailbox } = this.serialize(); + updateTransactions.push({ + annotation: `Updating default ISM of Mailbox from ${actualDefaultIsmConfig.address} to ${deployedIsm}`, + typeUrl: R.MsgSetMailbox.proto.type, + value: R.MsgSetMailbox.proto.converter.create({ + owner: actualConfig.owner, + mailbox_id: mailbox, + default_ism: deployedIsm, + }), + }); + } + + return updateTransactions; + } + + /** + * Updates or deploys the ISM using the provided configuration. + * + * @returns Object with deployedIsm address, and update Transactions + */ + public async deployOrUpdateIsm( + actualDefaultIsmConfig: DerivedIsmConfig, + expectDefaultIsmConfig: IsmConfig, + ): Promise<{ + deployedIsm: Address; + ismUpdateTxs: AnnotatedCosmJsNativeTransaction[]; + }> { + const { mailbox } = this.serialize(); + + const ismModule = new CosmosNativeIsmModule( + this.multiProvider, + { + addresses: { + mailbox: mailbox, + deployedIsm: actualDefaultIsmConfig.address, + }, + chain: this.chainName, + config: actualDefaultIsmConfig.address, + }, + this.signer, + ); + this.logger.info( + `Comparing target ISM config with ${this.args.chain} chain`, + ); + const ismUpdateTxs = await ismModule.update(expectDefaultIsmConfig); + const { deployedIsm } = ismModule.serialize(); + + return { deployedIsm, ismUpdateTxs }; + } + + /** + * Create a transaction to update an existing Hook config, or deploy a new Hook and return a tx to setDefaultHook + * + * @param actualConfig - The on-chain router configuration, including the Hook configuration, and address. + * @param expectedConfig - The expected token router configuration, including the Hook configuration. + * @returns Transaction that need to be executed to update the Hook configuration. + */ + async createDefaultHookUpdateTxs( + actualConfig: DerivedCoreConfig, + expectedConfig: CoreConfig, + ): Promise { + const updateTransactions: AnnotatedCosmJsNativeTransaction[] = []; + + const actualDefaultHookConfig = + actualConfig.defaultHook as DerivedHookConfig; + + // Try to update (may also deploy) Hook with the expected config + const { deployedHook, hookUpdateTxs } = await this.deployOrUpdateHook( + actualDefaultHookConfig, + expectedConfig.defaultHook, + ); + + if (hookUpdateTxs.length) { + updateTransactions.push(...hookUpdateTxs); + } + + const newHookDeployed = actualDefaultHookConfig.address !== deployedHook; + if (newHookDeployed) { + const { mailbox } = this.serialize(); + updateTransactions.push({ + annotation: `Updating default Hook of Mailbox from ${actualDefaultHookConfig.address} to ${deployedHook}`, + typeUrl: R.MsgSetMailbox.proto.type, + value: R.MsgSetMailbox.proto.converter.create({ + owner: actualConfig.owner, + mailbox_id: mailbox, + default_hook: deployedHook, + }), + }); + } + + return updateTransactions; + } + + /** + * Create a transaction to update an existing Hook config, or deploy a new Hook and return a tx to setRequiredHook + * + * @param actualConfig - The on-chain router configuration, including the Hook configuration, and address. + * @param expectedConfig - The expected token router configuration, including the Hook configuration. + * @returns Transaction that need to be executed to update the Hook configuration. + */ + async createRequiredHookUpdateTxs( + actualConfig: DerivedCoreConfig, + expectedConfig: CoreConfig, + ): Promise { + const updateTransactions: AnnotatedCosmJsNativeTransaction[] = []; + + const actualRequiredHookConfig = + actualConfig.requiredHook as DerivedHookConfig; + + // Try to update (may also deploy) Hook with the expected config + const { deployedHook, hookUpdateTxs } = await this.deployOrUpdateHook( + actualRequiredHookConfig, + expectedConfig.requiredHook, + ); + + if (hookUpdateTxs.length) { + updateTransactions.push(...hookUpdateTxs); + } + + const newHookDeployed = actualRequiredHookConfig.address !== deployedHook; + if (newHookDeployed) { + const { mailbox } = this.serialize(); + updateTransactions.push({ + annotation: `Updating required Hook of Mailbox from ${actualRequiredHookConfig.address} to ${deployedHook}`, + typeUrl: R.MsgSetMailbox.proto.type, + value: R.MsgSetMailbox.proto.converter.create({ + owner: actualConfig.owner, + mailbox_id: mailbox, + required_hook: deployedHook, + }), + }); + } + + return updateTransactions; + } + + /** + * Updates or deploys the Hook using the provided configuration. + * + * @returns Object with deployedHook address, and update Transactions + */ + public async deployOrUpdateHook( + actualHookConfig: DerivedHookConfig, + expectHookConfig: HookConfig, + ): Promise<{ + deployedHook: Address; + hookUpdateTxs: AnnotatedCosmJsNativeTransaction[]; + }> { + const { mailbox } = this.serialize(); + + const hookModule = new CosmosNativeHookModule( + this.multiProvider, + { + addresses: { + mailbox: mailbox, + deployedHook: actualHookConfig.address, + }, + chain: this.chainName, + config: actualHookConfig.address, + }, + this.signer, + ); + this.logger.info( + `Comparing target Hook config with ${this.args.chain} chain`, + ); + const hookUpdateTxs = await hookModule.update(expectHookConfig); + const { deployedHook } = hookModule.serialize(); + + return { deployedHook, hookUpdateTxs }; + } +} diff --git a/typescript/sdk/src/core/CosmosNativeCoreReader.ts b/typescript/sdk/src/core/CosmosNativeCoreReader.ts new file mode 100644 index 00000000000..681d5087418 --- /dev/null +++ b/typescript/sdk/src/core/CosmosNativeCoreReader.ts @@ -0,0 +1,51 @@ +import { + HyperlaneModuleClient, + SigningHyperlaneModuleClient, +} from '@hyperlane-xyz/cosmos-sdk'; +import { Address, rootLogger } from '@hyperlane-xyz/utils'; + +import { CosmosNativeHookReader } from '../hook/CosmosNativeHookReader.js'; +import { CosmosNativeIsmReader } from '../ism/CosmosNativeIsmReader.js'; +import { MultiProvider } from '../providers/MultiProvider.js'; + +import { DerivedCoreConfig } from './types.js'; + +export class CosmosNativeCoreReader { + protected readonly logger = rootLogger.child({ + module: 'CosmosNativeCoreReader', + }); + protected ismReader: CosmosNativeIsmReader; + protected hookReader: CosmosNativeHookReader; + + constructor( + protected readonly multiProvider: MultiProvider, + protected readonly signer: + | HyperlaneModuleClient + | SigningHyperlaneModuleClient, + ) { + this.ismReader = new CosmosNativeIsmReader(this.signer); + this.hookReader = new CosmosNativeHookReader( + this.multiProvider, + this.signer, + ); + } + + async deriveCoreConfig(mailboxAddress: Address): Promise { + const { mailbox } = await this.signer.query.core.Mailbox({ + id: mailboxAddress, + }); + + if (!mailbox) { + throw new Error(`Mailbox not found for address ${mailboxAddress}`); + } + + return { + owner: mailbox.owner, + defaultIsm: await this.ismReader.deriveIsmConfig(mailbox.default_ism), + defaultHook: await this.hookReader.deriveHookConfig(mailbox.default_hook), + requiredHook: await this.hookReader.deriveHookConfig( + mailbox.required_hook, + ), + }; + } +} diff --git a/typescript/sdk/src/index.ts b/typescript/sdk/src/index.ts index 517aa926a63..97f3e5d6d87 100644 --- a/typescript/sdk/src/index.ts +++ b/typescript/sdk/src/index.ts @@ -467,6 +467,8 @@ export { GcpValidator } from './gcp/validator.js'; export { EvmHookModule } from './hook/EvmHookModule.js'; export { CosmosNativeHookModule } from './hook/CosmosNativeHookModule.js'; export { CosmosNativeHookReader } from './hook/CosmosNativeHookReader.js'; +export { CosmosNativeCoreModule } from './core/CosmosNativeCoreModule.js'; +export { CosmosNativeCoreReader } from './core/CosmosNativeCoreReader.js'; export { DerivedIcaRouterConfig, DerivedIcaRouterConfigSchema, From bb47b67251391a2db229775969fabe272e4e17f0 Mon Sep 17 00:00:00 2001 From: Paul Balaji <10051819+paulbalaji@users.noreply.github.com> Date: Fri, 16 May 2025 16:05:34 +0100 Subject: [PATCH 05/16] feat: add apechain to solana igp (#6246) ### Description feat: add apechain to solana igp ### Drive-by changes - tidied up ordering of igp connected chains ### Related issues ### Backward compatibility ### Testing see the output file --- .../mainnet3/gas-oracle-configs.json | 24 ++++++++++++------- .../sealevel-helpers/print-gas-oracles.ts | 8 ++++--- 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/rust/sealevel/environments/mainnet3/gas-oracle-configs.json b/rust/sealevel/environments/mainnet3/gas-oracle-configs.json index 41edc7e89c9..7d948d81aab 100644 --- a/rust/sealevel/environments/mainnet3/gas-oracle-configs.json +++ b/rust/sealevel/environments/mainnet3/gas-oracle-configs.json @@ -32,6 +32,22 @@ }, "overhead": 333774 }, + "abstract": { + "oracleConfig": { + "tokenExchangeRate": "187056373229658428214", + "gasPrice": "193418836", + "tokenDecimals": 18 + }, + "overhead": 333774 + }, + "apechain": { + "oracleConfig": { + "tokenExchangeRate": "49999132185504026", + "gasPrice": "1280415238976", + "tokenDecimals": 18 + }, + "overhead": 166887 + }, "bsc": { "oracleConfig": { "tokenExchangeRate": "62110871980005554012", @@ -56,14 +72,6 @@ }, "overhead": 600000 }, - "abstract": { - "oracleConfig": { - "tokenExchangeRate": "187056373229658428214", - "gasPrice": "193418836", - "tokenDecimals": 18 - }, - "overhead": 333774 - }, "artela": { "oracleConfig": { "tokenExchangeRate": "152446195501249", diff --git a/typescript/infra/scripts/sealevel-helpers/print-gas-oracles.ts b/typescript/infra/scripts/sealevel-helpers/print-gas-oracles.ts index 1a6c46ba7a9..e36b8888da3 100644 --- a/typescript/infra/scripts/sealevel-helpers/print-gas-oracles.ts +++ b/typescript/infra/scripts/sealevel-helpers/print-gas-oracles.ts @@ -103,16 +103,18 @@ function getChainConnections( ['solanamainnet', 'everclear'], ['solanamainnet', 'infinityvmmainnet'], ['solanamainnet', 'sophon'], + ['solanamainnet', 'abstract'], + ['solanamainnet', 'apechain'], // for svmBNB routes solana<>bsc<>svmbnb<>soon ['solanamainnet', 'bsc'], ['svmbnb', 'solanamainnet'], ['svmbnb', 'bsc'], ['svmbnb', 'soon'], - ['sonicsvm', 'eclipsemainnet'], ['soon', 'solanamainnet'], ['soon', 'bsc'], - ['soon', 'eclipsemainnet'], - ['abstract', 'solanamainnet'], + // for eclipse routes + ['eclipsemainnet', 'sonicsvm'], + ['eclipsemainnet', 'soon'], // All warp routes ...Object.values(WarpRouteIds).map(getWarpChains), ]; From 03eebc3f838b5532bb43c71e26ebe61fd5366fa7 Mon Sep 17 00:00:00 2001 From: Jeff Date: Fri, 16 May 2025 11:53:09 -0400 Subject: [PATCH 06/16] =?UTF-8?q?feat:=20Make=20the=20validator's=20panic?= =?UTF-8?q?=20message=20scarier=20if=20there's=20a=20detecte=E2=80=A6=20(#?= =?UTF-8?q?5901)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit …d reorg ### Description - make errors more scary ### Related issues - fixes https://linear.app/hyperlane-xyz/issue/BACK-75/make-the-validators-panic-message-scarier-if-theres-a-detected-reorg ### Backward compatibility Yes ### Testing None --- rust/main/agents/validator/src/submit.rs | 6 ++++-- rust/main/hyperlane-base/src/settings/checkpoint_syncer.rs | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/rust/main/agents/validator/src/submit.rs b/rust/main/agents/validator/src/submit.rs index 6f7de570b76..9198cdcccfa 100644 --- a/rust/main/agents/validator/src/submit.rs +++ b/rust/main/agents/validator/src/submit.rs @@ -236,7 +236,7 @@ impl ValidatorSubmitter { "Incorrect tree root, something went wrong" ); - let mut panic_message = "Incorrect tree root, something went wrong.".to_owned(); + let mut panic_message = "Incorrect tree root. Most likely a reorg has occurred. Please reach out for help, this is a potentially serious error impacting signed messages. Do NOT forcefully resume operation of this validator. Keep it crashlooping or shut down until receive support.".to_owned(); if let Err(e) = self .checkpoint_syncer .write_reorg_status(&reorg_event) @@ -680,7 +680,9 @@ mod test { } #[tokio::test] - #[should_panic(expected = "Incorrect tree root, something went wrong.")] + #[should_panic( + expected = "Incorrect tree root. Most likely a reorg has occurred. Please reach out for help, this is a potentially serious error impacting signed messages. Do NOT forcefully resume operation of this validator. Keep it crashlooping or shut down until receive support." + )] async fn reorg_is_detected_and_persisted_to_checkpoint_storage() { let unix_timestamp = chrono::Utc::now().timestamp() as u64; let expected_reorg_period = 12; diff --git a/rust/main/hyperlane-base/src/settings/checkpoint_syncer.rs b/rust/main/hyperlane-base/src/settings/checkpoint_syncer.rs index bd1af317ef9..7542c4aa323 100644 --- a/rust/main/hyperlane-base/src/settings/checkpoint_syncer.rs +++ b/rust/main/hyperlane-base/src/settings/checkpoint_syncer.rs @@ -46,7 +46,7 @@ pub enum CheckpointSyncerConf { #[derive(Debug, thiserror::Error)] pub enum CheckpointSyncerBuildError { /// A reorg event has been detected in the checkpoint syncer when building it - #[error("A reorg event has been detected: {0:?}")] + #[error("Fatal: A reorg event has been detected. Please reach out for help, this is a potentially serious error impacting signed messages. Do NOT forcefully resume operation of this validator. Keep it crashlooping or shut down until receive support. {0:?}")] ReorgEvent(ReorgEvent), /// Error communicating with the chain #[error(transparent)] From 84f5b21f8b5052000f35e4ad589f93db92edb569 Mon Sep 17 00:00:00 2001 From: xeno097 Date: Fri, 16 May 2025 18:09:56 -0400 Subject: [PATCH 07/16] chore: updated registry rc to update docker images (#6252) ### Description updated registry rc commit ### Drive-by changes - No ### Related issues ### Backward compatibility Yes ### Testing None --- .registryrc | 2 +- rust/main/config/mainnet_config.json | 6 +++--- rust/main/config/testnet_config.json | 6 +++--- typescript/infra/src/warp/helm.ts | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.registryrc b/.registryrc index ce08f975f64..7a5ce92a9aa 100644 --- a/.registryrc +++ b/.registryrc @@ -1 +1 @@ -4d879c24b4bed89a770570dd7d54d3423edab496 +ea6268432101949d2f3b8d304b7aea9be841bf99 diff --git a/rust/main/config/mainnet_config.json b/rust/main/config/mainnet_config.json index 3edd7009417..01c315c42e4 100644 --- a/rust/main/config/mainnet_config.json +++ b/rust/main/config/mainnet_config.json @@ -8592,10 +8592,10 @@ "plume": { "blockExplorers": [ { - "apiUrl": "https://phoenix-explorer.plumenetwork.xyz/api", + "apiUrl": "https://explorer.plume.org/api", "family": "blockscout", "name": "Plume Explorer", - "url": "https://phoenix-explorer.plumenetwork.xyz" + "url": "https://explorer.plume.org" } ], "blocks": { @@ -8623,7 +8623,7 @@ "protocol": "ethereum", "rpcUrls": [ { - "http": "https://phoenix-rpc.plumenetwork.xyz" + "http": "https://rpc.plume.org" } ], "technicalStack": "arbitrumnitro", diff --git a/rust/main/config/testnet_config.json b/rust/main/config/testnet_config.json index 4e923a6b649..7da0d4c1486 100644 --- a/rust/main/config/testnet_config.json +++ b/rust/main/config/testnet_config.json @@ -2707,10 +2707,10 @@ "plumetestnet2": { "blockExplorers": [ { - "apiUrl": "https://testnet-explorer.plumenetwork.xyz/api", + "apiUrl": "https://testnet-explorer.plume.org/api", "family": "blockscout", "name": "Plume Explorer", - "url": "https://testnet-explorer.plumenetwork.xyz" + "url": "https://testnet-explorer.plume.org" } ], "blocks": { @@ -2739,7 +2739,7 @@ "protocol": "ethereum", "rpcUrls": [ { - "http": "https://testnet-rpc.plumenetwork.xyz" + "http": "https://testnet-rpc.plume.org" } ], "technicalStack": "arbitrumnitro", diff --git a/typescript/infra/src/warp/helm.ts b/typescript/infra/src/warp/helm.ts index 7d04a32b080..11786b95587 100644 --- a/typescript/infra/src/warp/helm.ts +++ b/typescript/infra/src/warp/helm.ts @@ -73,7 +73,7 @@ export class WarpRouteMonitorHelmManager extends HelmManager { return { image: { repository: 'gcr.io/abacus-labs-dev/hyperlane-monorepo', - tag: '5ad1aed-20250509-141037', + tag: 'a015285-20250516-204210', }, warpRouteId: this.warpRouteId, fullnameOverride: this.helmReleaseName, From 66dac254b404c0fe9d46c35d8230e670731ff6ad Mon Sep 17 00:00:00 2001 From: Paul Balaji <10051819+paulbalaji@users.noreply.github.com> Date: Sat, 17 May 2025 23:12:53 +0100 Subject: [PATCH 08/16] chore: default to only amd64 docker builds (#6256) ### Description chore: default to only amd64 docker builds - default agent/monorepo images are only for amd64 - this saves time, cost of each image build - if required for local runs, devs can manually trigger the workflow and say they want an arm64 build - allowing manual runs also means that you don't need to have a PR open just to trigger image builds anymore ### Drive-by changes ### Related issues ### Backward compatibility ### Testing --- .github/workflows/monorepo-docker.yml | 17 ++++++++++++++++- .github/workflows/rust-docker.yml | 16 +++++++++++++++- README.md | 20 ++++++++++++++++++++ 3 files changed, 51 insertions(+), 2 deletions(-) diff --git a/.github/workflows/monorepo-docker.yml b/.github/workflows/monorepo-docker.yml index 1eae7ae8ce5..36dad0dee26 100644 --- a/.github/workflows/monorepo-docker.yml +++ b/.github/workflows/monorepo-docker.yml @@ -13,6 +13,12 @@ on: - 'docker-entrypoint.sh' - '.dockerignore' - '.github/workflows/monorepo-docker.yml' + workflow_dispatch: + inputs: + include_arm64: + description: 'Include arm64 in the build' + required: false + default: 'false' concurrency: group: build-push-monorepo-${{ github.ref }} @@ -81,6 +87,15 @@ jobs: REGISTRY_VERSION=$(cat .registryrc) echo "REGISTRY_VERSION=$REGISTRY_VERSION" >> $GITHUB_ENV + - name: Determine platforms + id: determine-platforms + run: | + if [ "${{ github.event.inputs.include_arm64 }}" == "true" ]; then + echo "platforms=linux/amd64,linux/arm64" >> $GITHUB_OUTPUT + else + echo "platforms=linux/amd64" >> $GITHUB_OUTPUT + fi + - name: Build and push uses: depot/build-push-action@v1 with: @@ -92,4 +107,4 @@ jobs: labels: ${{ steps.meta.outputs.labels }} build-args: | REGISTRY_COMMIT=${{ env.REGISTRY_VERSION }} - platforms: linux/amd64,linux/arm64 + platforms: ${{ steps.determine-platforms.outputs.platforms }} diff --git a/.github/workflows/rust-docker.yml b/.github/workflows/rust-docker.yml index 588205ce283..24d3f3b3009 100644 --- a/.github/workflows/rust-docker.yml +++ b/.github/workflows/rust-docker.yml @@ -8,6 +8,12 @@ on: paths: - 'rust/**' - '.github/workflows/rust-docker.yml' + workflow_dispatch: + inputs: + include_arm64: + description: 'Include arm64 in the build' + required: false + default: 'false' concurrency: group: build-push-agents-${{ github.ref }} cancel-in-progress: true @@ -64,6 +70,14 @@ jobs: registry: gcr.io username: _json_key password: ${{ secrets.GCLOUD_SERVICE_KEY }} + - name: Determine platforms + id: determine-platforms + run: | + if [ "${{ github.event.inputs.include_arm64 }}" == "true" ]; then + echo "platforms=linux/amd64,linux/arm64" >> $GITHUB_OUTPUT + else + echo "platforms=linux/amd64" >> $GITHUB_OUTPUT + fi - name: Build and push uses: depot/build-push-action@v1 with: @@ -73,4 +87,4 @@ jobs: push: true tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} - platforms: linux/amd64,linux/arm64 + platforms: ${{ steps.determine-platforms.outputs.platforms }} diff --git a/README.md b/README.md index d2c8215e372..33b789b3939 100644 --- a/README.md +++ b/README.md @@ -119,3 +119,23 @@ See [`rust/README.md`](rust/README.md) We use [changesets](https://github.com/changesets/changesets) to release to NPM. You can use the `release` script in `package.json` to publish. For an alpha or beta version, follow the directions [here](https://github.com/changesets/changesets/blob/main/docs/prereleases.md). + +### Manually Triggering Docker Builds in CI + +To manually trigger Agent or Monorepo Docker builds in CI, you can use the workflows provided in the repository. Here are the steps to do so: + +1. **Navigate to the workflow:** + + - For agents, go to the [Rust Docker Workflow](https://github.com/hyperlane-xyz/hyperlane-monorepo/actions/workflows/rust-docker.yml). + - For the monorepo, go to the [Monorepo Docker Workflow](https://github.com/hyperlane-xyz/hyperlane-monorepo/actions/workflows/monorepo-docker.yml). + +2. **Trigger the workflow:** + + - On the workflow page, click on the "Run workflow" button. + - You may need to select a branch and decide whether to trigger builds for the `arm64` platform. + +3. **Wait for the build to complete:** + - Once triggered, monitor the progress of the build by opening the new workflow run. + - You may have to refresh the page for it to appear. + - Check the logs for any errors or issues during the build process. + - Wait for the `build-and-push-to-gcr` step to complete successfully before using the new image. From 2724559c1cf650191fd3cbc2068a54bac57e717f Mon Sep 17 00:00:00 2001 From: Troy Kessler <43882936+troykessler@users.noreply.github.com> Date: Mon, 19 May 2025 10:28:09 +0200 Subject: [PATCH 09/16] chore: add routing ism to cosmos-types and sdk (#6244) ### Description This PR adds the newly added Routing ISM of the Hyperlane Cosmos Module released in [v1.0.0](https://github.com/bcp-innovations/hyperlane-cosmos/releases/tag/v1.0.0) to the cosmos-types and cosmos-sdk package. Furthermore, e2e tests have been added to test the newly added transactions. Note that the majority of code changes are from the autogenerated code from the cosmos-types package. Only the changes in the cosmos-sdk package should be reviewed. ### Drive-by changes - ### Related issues - ### Backward compatibility Yes ### Testing E2E tests --- .changeset/sharp-doors-decide.md | 7 + typescript/cosmos-sdk/Dockerfile | 2 +- typescript/cosmos-sdk/compose.yaml | 2 +- .../cosmos-sdk/src/clients/signingClient.ts | 64 ++ .../hyperlane/interchain_security/messages.ts | 20 + .../hyperlane/interchain_security/query.ts | 6 +- typescript/cosmos-sdk/src/registry.ts | 60 ++ .../tests/1_interchain_security.e2e-test.ts | 130 +++ .../cosmos-sdk/src/tests/2_core.e2e-test.ts | 1 + .../src/tests/3_post_dispatch.e2e-test.ts | 1 + .../cosmos-sdk/src/tests/4_warp.e2e-test.ts | 2 + typescript/cosmos-types/src/index.ts | 2 + .../src/types/cosmos/base/v1beta1/coin.ts | 138 +++ .../core/interchain_security/v1/events.ts | 963 ++++++++++++++++++ .../core/interchain_security/v1/tx.ts | 760 ++++++++++++++ .../core/interchain_security/v1/types.ts | 196 ++++ .../hyperlane/core/post_dispatch/v1/events.ts | 607 ++++++++++- .../hyperlane/core/post_dispatch/v1/tx.ts | 21 +- .../src/types/hyperlane/core/v1/events.ts | 410 +++++++- .../src/types/hyperlane/core/v1/query.ts | 497 ++++++++- .../src/types/hyperlane/core/v1/tx.ts | 20 + .../src/types/hyperlane/warp/v1/events.ts | 934 ++++++++++++++++- .../src/types/hyperlane/warp/v1/tx.ts | 26 +- .../sdk/src/core/CosmosNativeCoreModule.ts | 1 + .../sdk/src/hook/CosmosNativeHookModule.ts | 4 +- 25 files changed, 4764 insertions(+), 110 deletions(-) create mode 100644 .changeset/sharp-doors-decide.md create mode 100644 typescript/cosmos-types/src/types/hyperlane/core/interchain_security/v1/events.ts diff --git a/.changeset/sharp-doors-decide.md b/.changeset/sharp-doors-decide.md new file mode 100644 index 00000000000..061ad6cf3e7 --- /dev/null +++ b/.changeset/sharp-doors-decide.md @@ -0,0 +1,7 @@ +--- +'@hyperlane-xyz/cosmos-types': minor +'@hyperlane-xyz/cosmos-sdk': minor +'@hyperlane-xyz/sdk': minor +--- + +add cosmos native routing ism cosmos-sdk and types diff --git a/typescript/cosmos-sdk/Dockerfile b/typescript/cosmos-sdk/Dockerfile index 9c880958796..3e0dddb0019 100644 --- a/typescript/cosmos-sdk/Dockerfile +++ b/typescript/cosmos-sdk/Dockerfile @@ -8,7 +8,7 @@ RUN apt update && apt upgrade -y \ && rm -rf /var/lib/apt/lists/* # Define a build argument for the branch name -ARG BRANCH_NAME=v1.0.0-beta0 +ARG BRANCH_NAME=v1.0.0 # install hypd from the specified branch RUN git clone --depth 1 --branch $BRANCH_NAME https://github.com/bcp-innovations/hyperlane-cosmos.git \ diff --git a/typescript/cosmos-sdk/compose.yaml b/typescript/cosmos-sdk/compose.yaml index 98efb10438c..77587d2bfb2 100644 --- a/typescript/cosmos-sdk/compose.yaml +++ b/typescript/cosmos-sdk/compose.yaml @@ -1,6 +1,6 @@ services: hyperlane-cosmos-simapp: - image: gcr.io/abacus-labs-dev/hyperlane-cosmos-simapp:v1.0.0-beta0 + image: gcr.io/abacus-labs-dev/hyperlane-cosmos-simapp:v1.0.0 ports: - 26657:26657 - 1317:1317 diff --git a/typescript/cosmos-sdk/src/clients/signingClient.ts b/typescript/cosmos-sdk/src/clients/signingClient.ts index 1b31f8953df..ab6f9ad1ed7 100644 --- a/typescript/cosmos-sdk/src/clients/signingClient.ts +++ b/typescript/cosmos-sdk/src/clients/signingClient.ts @@ -29,6 +29,10 @@ import { MsgCreateMerkleRootMultisigIsmEncodeObject, MsgCreateMessageIdMultisigIsmEncodeObject, MsgCreateNoopIsmEncodeObject, + MsgCreateRoutingIsmEncodeObject, + MsgRemoveRoutingIsmDomainEncodeObject, + MsgSetRoutingIsmDomainEncodeObject, + MsgUpdateRoutingIsmOwnerEncodeObject, } from '../hyperlane/interchain_security/messages.js'; import { setupInterchainSecurityExtension } from '../hyperlane/interchain_security/query.js'; import { @@ -261,6 +265,66 @@ export class SigningHyperlaneModuleClient extends SigningStargateClient { return this.submitTx(msg, options); } + public async createRoutingIsm( + value: Omit, + options?: TxOptions, + ): Promise> { + const msg: MsgCreateRoutingIsmEncodeObject = { + typeUrl: R.MsgCreateRoutingIsm.proto.type, + value: R.MsgCreateRoutingIsm.proto.converter.create({ + ...value, + creator: this.account.address, + }), + }; + + return this.submitTx(msg, options); + } + + public async setRoutingIsmDomain( + value: Omit, + options?: TxOptions, + ): Promise> { + const msg: MsgSetRoutingIsmDomainEncodeObject = { + typeUrl: R.MsgSetRoutingIsmDomain.proto.type, + value: R.MsgSetRoutingIsmDomain.proto.converter.create({ + ...value, + owner: this.account.address, + }), + }; + + return this.submitTx(msg, options); + } + + public async removeRoutingIsmDomain( + value: Omit, + options?: TxOptions, + ): Promise> { + const msg: MsgRemoveRoutingIsmDomainEncodeObject = { + typeUrl: R.MsgRemoveRoutingIsmDomain.proto.type, + value: R.MsgRemoveRoutingIsmDomain.proto.converter.create({ + ...value, + owner: this.account.address, + }), + }; + + return this.submitTx(msg, options); + } + + public async updateRoutingIsmOwner( + value: Omit, + options?: TxOptions, + ): Promise> { + const msg: MsgUpdateRoutingIsmOwnerEncodeObject = { + typeUrl: R.MsgUpdateRoutingIsmOwner.proto.type, + value: R.MsgUpdateRoutingIsmOwner.proto.converter.create({ + ...value, + owner: this.account.address, + }), + }; + + return this.submitTx(msg, options); + } + public async createIgp( value: Omit, options?: TxOptions, diff --git a/typescript/cosmos-sdk/src/hyperlane/interchain_security/messages.ts b/typescript/cosmos-sdk/src/hyperlane/interchain_security/messages.ts index 84fecc72b6f..3434e90ab38 100644 --- a/typescript/cosmos-sdk/src/hyperlane/interchain_security/messages.ts +++ b/typescript/cosmos-sdk/src/hyperlane/interchain_security/messages.ts @@ -25,3 +25,23 @@ export interface MsgAnnounceValidatorEncodeObject extends EncodeObject { readonly typeUrl: typeof R.MsgAnnounceValidator.proto.type; readonly value: Partial; } + +export interface MsgCreateRoutingIsmEncodeObject extends EncodeObject { + readonly typeUrl: typeof R.MsgCreateRoutingIsm.proto.type; + readonly value: Partial; +} + +export interface MsgSetRoutingIsmDomainEncodeObject extends EncodeObject { + readonly typeUrl: typeof R.MsgSetRoutingIsmDomain.proto.type; + readonly value: Partial; +} + +export interface MsgRemoveRoutingIsmDomainEncodeObject extends EncodeObject { + readonly typeUrl: typeof R.MsgRemoveRoutingIsmDomain.proto.type; + readonly value: Partial; +} + +export interface MsgUpdateRoutingIsmOwnerEncodeObject extends EncodeObject { + readonly typeUrl: typeof R.MsgUpdateRoutingIsmOwner.proto.type; + readonly value: Partial; +} diff --git a/typescript/cosmos-sdk/src/hyperlane/interchain_security/query.ts b/typescript/cosmos-sdk/src/hyperlane/interchain_security/query.ts index 83a30b6e836..2bc5ba901be 100644 --- a/typescript/cosmos-sdk/src/hyperlane/interchain_security/query.ts +++ b/typescript/cosmos-sdk/src/hyperlane/interchain_security/query.ts @@ -5,7 +5,8 @@ import { any, isQuery, isTypes, pagination } from '@hyperlane-xyz/cosmos-types'; type ISM = | isTypes.NoopISM | isTypes.MerkleRootMultisigISM - | isTypes.MessageIdMultisigISM; + | isTypes.MessageIdMultisigISM + | isTypes.RoutingISM; type QueryDecodedIsmResponse = { ism: T; @@ -20,6 +21,7 @@ export enum IsmTypes { NoopISM = '/hyperlane.core.interchain_security.v1.NoopISM', MerkleRootMultisigISM = '/hyperlane.core.interchain_security.v1.MerkleRootMultisigISM', MessageIdMultisigISM = '/hyperlane.core.interchain_security.v1.MessageIdMultisigISM', + RoutingISM = '/hyperlane.core.interchain_security.v1.RoutingISM', } export const decodeIsm = (ism: any.Any | undefined): ISM => { @@ -30,6 +32,8 @@ export const decodeIsm = (ism: any.Any | undefined): ISM => { return isTypes.MerkleRootMultisigISM.decode(ism.value); case IsmTypes.MessageIdMultisigISM: return isTypes.MessageIdMultisigISM.decode(ism.value); + case IsmTypes.RoutingISM: + return isTypes.RoutingISM.decode(ism.value); default: throw new Error(`can not decode ISM with type url ${ism?.type_url}`); } diff --git a/typescript/cosmos-sdk/src/registry.ts b/typescript/cosmos-sdk/src/registry.ts index 1ef25f71d9a..3b3316ef012 100644 --- a/typescript/cosmos-sdk/src/registry.ts +++ b/typescript/cosmos-sdk/src/registry.ts @@ -147,6 +147,66 @@ export const COSMOS_MODULE_MESSAGE_REGISTRY: CosmosModuleMessageRegistry = { converter: types.isTx.MsgAnnounceValidatorResponse, }, }, + MsgCreateRoutingIsm: { + proto: { + type: '/hyperlane.core.interchain_security.v1.MsgCreateRoutingIsm' as const, + converter: types.isTx.MsgCreateRoutingIsm, + }, + amino: { + type: 'hyperlane/v1/MsgCreateRoutingIsm' as const, + }, + }, + MsgCreateRoutingIsmResponse: { + proto: { + type: '/hyperlane.core.interchain_security.v1.MsgCreateRoutingIsmResponse' as const, + converter: types.isTx.MsgCreateRoutingIsmResponse, + }, + }, + MsgSetRoutingIsmDomain: { + proto: { + type: '/hyperlane.core.interchain_security.v1.MsgSetRoutingIsmDomain' as const, + converter: types.isTx.MsgSetRoutingIsmDomain, + }, + amino: { + type: 'hyperlane/v1/MsgSetRoutingIsmDomain' as const, + }, + }, + MsgSetRoutingIsmDomainResponse: { + proto: { + type: '/hyperlane.core.interchain_security.v1.MsgSetRoutingIsmDomainResponse' as const, + converter: types.isTx.MsgSetRoutingIsmDomainResponse, + }, + }, + MsgRemoveRoutingIsmDomain: { + proto: { + type: '/hyperlane.core.interchain_security.v1.MsgRemoveRoutingIsmDomain' as const, + converter: types.isTx.MsgRemoveRoutingIsmDomain, + }, + amino: { + type: 'hyperlane/v1/MsgRemoveRoutingIsmDomain' as const, + }, + }, + MsgRemoveRoutingIsmDomainResponse: { + proto: { + type: '/hyperlane.core.interchain_security.v1.MsgRemoveRoutingIsmDomainResponse' as const, + converter: types.isTx.MsgRemoveRoutingIsmDomainResponse, + }, + }, + MsgUpdateRoutingIsmOwner: { + proto: { + type: '/hyperlane.core.interchain_security.v1.MsgUpdateRoutingIsmOwner' as const, + converter: types.isTx.MsgUpdateRoutingIsmOwner, + }, + amino: { + type: 'hyperlane/v1/MsgUpdateRoutingIsmOwner' as const, + }, + }, + MsgUpdateRoutingIsmOwnerResponse: { + proto: { + type: '/hyperlane.core.interchain_security.v1.MsgUpdateRoutingIsmOwnerResponse' as const, + converter: types.isTx.MsgUpdateRoutingIsmOwnerResponse, + }, + }, // Post dispatch transactions MsgCreateIgp: { diff --git a/typescript/cosmos-sdk/src/tests/1_interchain_security.e2e-test.ts b/typescript/cosmos-sdk/src/tests/1_interchain_security.e2e-test.ts index 85a9d347cb3..841530d3319 100644 --- a/typescript/cosmos-sdk/src/tests/1_interchain_security.e2e-test.ts +++ b/typescript/cosmos-sdk/src/tests/1_interchain_security.e2e-test.ts @@ -4,6 +4,7 @@ import { step } from 'mocha-steps'; import { MerkleRootMultisigISM, MessageIdMultisigISM, + RoutingISM, } from '../../../cosmos-types/dist/types/hyperlane/core/interchain_security/v1/types.js'; import { bytes32ToAddress, @@ -157,4 +158,133 @@ describe('1. cosmos sdk interchain security e2e tests', async function () { expect(decodedIsm.ism.threshold).to.equal(threshold); expect(decodedIsm.ism.validators).deep.equal(validators); }); + + step('create new Routing ISM', async () => { + // ARRANGE + let isms = await signer.query.interchainSecurity.Isms({}); + expect(isms.isms).to.have.lengthOf(3); + + // ACT + const txResponse = await signer.createRoutingIsm({ + routes: [], + }); + + // ASSERT + expect(txResponse.code).to.equal(0); + + const routingIsm = txResponse.response; + + expect(routingIsm.id).to.be.not.empty; + expect(isValidAddressEvm(bytes32ToAddress(routingIsm.id))).to.be.true; + + isms = await signer.query.interchainSecurity.Isms({}); + expect(isms.isms).to.have.lengthOf(4); + + let ism = await signer.query.interchainSecurity.Ism({ + id: routingIsm.id, + }); + expect(ism.ism?.type_url).to.equal( + '/hyperlane.core.interchain_security.v1.RoutingISM', + ); + + let decodedIsm = await signer.query.interchainSecurity.DecodedIsm({ + id: routingIsm.id, + }); + + expect(decodedIsm.ism.id).to.equal(routingIsm.id); + expect(decodedIsm.ism.owner).to.equal(signer.account.address); + + expect((decodedIsm.ism as RoutingISM).routes).to.be.empty; + }); + + step('set Routing Ism domain', async () => { + // ARRANGE + let isms = await signer.query.interchainSecurity.DecodedIsms({}); + expect(isms.isms).to.have.lengthOf(4); + + const ism = isms.isms[isms.isms.length - 1]; + expect((ism as RoutingISM).routes).to.be.empty; + + // ACT + const txResponse = await signer.setRoutingIsmDomain({ + ism_id: ism.id, + route: { + ism: isms.isms[0].id, + domain: 1234, + }, + }); + + // ASSERT + expect(txResponse.code).to.equal(0); + + isms = await signer.query.interchainSecurity.DecodedIsms({}); + expect(isms.isms).to.have.lengthOf(4); + + let decodedIsm = await signer.query.interchainSecurity.DecodedIsm({ + id: ism.id, + }); + + expect((decodedIsm.ism as RoutingISM).routes).to.have.lengthOf(1); + expect((decodedIsm.ism as RoutingISM).routes[0]).to.deep.equal({ + ism: isms.isms[0].id, + domain: 1234, + }); + }); + + step('remove Routing Ism domain', async () => { + // ARRANGE + let isms = await signer.query.interchainSecurity.DecodedIsms({}); + expect(isms.isms).to.have.lengthOf(4); + + const ism = isms.isms[isms.isms.length - 1]; + expect((ism as RoutingISM).routes).to.have.lengthOf(1); + + // ACT + const txResponse = await signer.removeRoutingIsmDomain({ + ism_id: ism.id, + domain: 1234, + }); + + // ASSERT + expect(txResponse.code).to.equal(0); + + isms = await signer.query.interchainSecurity.DecodedIsms({}); + expect(isms.isms).to.have.lengthOf(4); + + let decodedIsm = await signer.query.interchainSecurity.DecodedIsm({ + id: ism.id, + }); + + expect((decodedIsm.ism as RoutingISM).routes).to.be.empty; + }); + + step('update Routing Ism owner', async () => { + // ARRANGE + let isms = await signer.query.interchainSecurity.DecodedIsms({}); + expect(isms.isms).to.have.lengthOf(4); + + const ism = isms.isms[isms.isms.length - 1]; + expect(ism.owner).to.equal(signer.account.address); + + const bobSigner = await createSigner('bob'); + + // ACT + const txResponse = await signer.updateRoutingIsmOwner({ + ism_id: ism.id, + new_owner: bobSigner.account.address, + renounce_ownership: false, + }); + + // ASSERT + expect(txResponse.code).to.equal(0); + + isms = await signer.query.interchainSecurity.DecodedIsms({}); + expect(isms.isms).to.have.lengthOf(4); + + let decodedIsm = await signer.query.interchainSecurity.DecodedIsm({ + id: ism.id, + }); + + expect(decodedIsm.ism.owner).to.equal(bobSigner.account.address); + }); }); diff --git a/typescript/cosmos-sdk/src/tests/2_core.e2e-test.ts b/typescript/cosmos-sdk/src/tests/2_core.e2e-test.ts index 5479d96edf4..1c345c7fd35 100644 --- a/typescript/cosmos-sdk/src/tests/2_core.e2e-test.ts +++ b/typescript/cosmos-sdk/src/tests/2_core.e2e-test.ts @@ -93,6 +93,7 @@ describe('2. cosmos sdk core e2e tests', async function () { default_hook: '', required_hook: '', new_owner: newOwner, + renounce_ownership: false, }); // ASSERT diff --git a/typescript/cosmos-sdk/src/tests/3_post_dispatch.e2e-test.ts b/typescript/cosmos-sdk/src/tests/3_post_dispatch.e2e-test.ts index f01365799f4..563388f357a 100644 --- a/typescript/cosmos-sdk/src/tests/3_post_dispatch.e2e-test.ts +++ b/typescript/cosmos-sdk/src/tests/3_post_dispatch.e2e-test.ts @@ -265,6 +265,7 @@ describe('3. cosmos sdk post dispatch e2e tests', async function () { const txResponse = await signer.setIgpOwner({ igp_id: igpBefore.id, new_owner: newOwner, + renounce_ownership: false, }); // ASSERT diff --git a/typescript/cosmos-sdk/src/tests/4_warp.e2e-test.ts b/typescript/cosmos-sdk/src/tests/4_warp.e2e-test.ts index aba04fa4579..aa68c6a8130 100644 --- a/typescript/cosmos-sdk/src/tests/4_warp.e2e-test.ts +++ b/typescript/cosmos-sdk/src/tests/4_warp.e2e-test.ts @@ -171,6 +171,7 @@ describe('4. cosmos sdk warp e2e tests', async function () { default_hook: igps.igps[0].id, required_hook: merkleTreeHooks.merkle_tree_hooks[0].id, new_owner: '', + renounce_ownership: false, }); expect(mailboxTxResponse.code).to.equal(0); @@ -311,6 +312,7 @@ describe('4. cosmos sdk warp e2e tests', async function () { token_id: tokenBefore.id, ism_id: '', new_owner: newOwner, + renounce_ownership: false, }); // ASSERT diff --git a/typescript/cosmos-types/src/index.ts b/typescript/cosmos-types/src/index.ts index 56788303764..1bea1793335 100644 --- a/typescript/cosmos-types/src/index.ts +++ b/typescript/cosmos-types/src/index.ts @@ -4,6 +4,7 @@ export * as coreQuery from './types/hyperlane/core/v1/query.js'; export * as coreTx from './types/hyperlane/core/v1/tx.js'; export * as coreTypes from './types/hyperlane/core/v1/types.js'; +export * as isEvents from './types/hyperlane/core/interchain_security/v1/events.js'; export * as isGenesis from './types/hyperlane/core/interchain_security/v1/genesis.js'; export * as isQuery from './types/hyperlane/core/interchain_security/v1/query.js'; export * as isTx from './types/hyperlane/core/interchain_security/v1/tx.js'; @@ -16,6 +17,7 @@ export * as pdTx from './types/hyperlane/core/post_dispatch/v1/tx.js'; export * as pdTypes from './types/hyperlane/core/post_dispatch/v1/types.js'; export * as warpEvents from './types/hyperlane/warp/v1/events.js'; +export * as warpGenesis from './types/hyperlane/warp/v1/genesis.js'; export * as warpQuery from './types/hyperlane/warp/v1/query.js'; export * as warpTx from './types/hyperlane/warp/v1/tx.js'; export * as warpTypes from './types/hyperlane/warp/v1/types.js'; diff --git a/typescript/cosmos-types/src/types/cosmos/base/v1beta1/coin.ts b/typescript/cosmos-types/src/types/cosmos/base/v1beta1/coin.ts index 19c271743fe..17d1a57d10c 100644 --- a/typescript/cosmos-types/src/types/cosmos/base/v1beta1/coin.ts +++ b/typescript/cosmos-types/src/types/cosmos/base/v1beta1/coin.ts @@ -30,6 +30,22 @@ export interface DecCoin { amount: string; } +/** + * IntProto defines a Protobuf wrapper around an Int object. + * Deprecated: Prefer to use math.Int directly. It supports binary Marshal and Unmarshal. + */ +export interface IntProto { + int: string; +} + +/** + * DecProto defines a Protobuf wrapper around a Dec object. + * Deprecated: Prefer to use math.LegacyDec directly. It supports binary Marshal and Unmarshal. + */ +export interface DecProto { + dec: string; +} + function createBaseCoin(): Coin { return { denom: '', amount: '' }; } @@ -183,6 +199,128 @@ export const DecCoin = { }, }; +function createBaseIntProto(): IntProto { + return { int: '' }; +} + +export const IntProto = { + encode( + message: IntProto, + writer: _m0.Writer = _m0.Writer.create(), + ): _m0.Writer { + if (message.int !== '') { + writer.uint32(10).string(message.int); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): IntProto { + const reader = + input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseIntProto(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.int = reader.string(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): IntProto { + return { int: isSet(object.int) ? globalThis.String(object.int) : '' }; + }, + + toJSON(message: IntProto): unknown { + const obj: any = {}; + if (message.int !== '') { + obj.int = message.int; + } + return obj; + }, + + create, I>>(base?: I): IntProto { + return IntProto.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): IntProto { + const message = createBaseIntProto(); + message.int = object.int ?? ''; + return message; + }, +}; + +function createBaseDecProto(): DecProto { + return { dec: '' }; +} + +export const DecProto = { + encode( + message: DecProto, + writer: _m0.Writer = _m0.Writer.create(), + ): _m0.Writer { + if (message.dec !== '') { + writer.uint32(10).string(message.dec); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): DecProto { + const reader = + input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseDecProto(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.dec = reader.string(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): DecProto { + return { dec: isSet(object.dec) ? globalThis.String(object.dec) : '' }; + }, + + toJSON(message: DecProto): unknown { + const obj: any = {}; + if (message.dec !== '') { + obj.dec = message.dec; + } + return obj; + }, + + create, I>>(base?: I): DecProto { + return DecProto.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): DecProto { + const message = createBaseDecProto(); + message.dec = object.dec ?? ''; + return message; + }, +}; + type Builtin = | Date | Function diff --git a/typescript/cosmos-types/src/types/hyperlane/core/interchain_security/v1/events.ts b/typescript/cosmos-types/src/types/hyperlane/core/interchain_security/v1/events.ts new file mode 100644 index 00000000000..8823acb314e --- /dev/null +++ b/typescript/cosmos-types/src/types/hyperlane/core/interchain_security/v1/events.ts @@ -0,0 +1,963 @@ +// Code generated by protoc-gen-ts_proto. DO NOT EDIT. +// versions: +// protoc-gen-ts_proto v1.181.2 +// protoc unknown +// source: hyperlane/core/interchain_security/v1/events.proto +/* eslint-disable */ +import _m0 from 'protobufjs/minimal.js'; + +export const protobufPackage = 'hyperlane.core.interchain_security.v1'; + +/** EventCreateNoopIsm ... */ +export interface EventCreateNoopIsm { + /** ism_id ... */ + ism_id: string; + /** owner ... */ + owner: string; +} + +/** EventCreateMerkleRootMultisigIsm ... */ +export interface EventCreateMerkleRootMultisigIsm { + ism_id: string; + owner: string; + validators: string[]; + threshold: number; +} + +/** EventCreateMessageIdMultisigIsm ... */ +export interface EventCreateMessageIdMultisigIsm { + ism_id: string; + owner: string; + validators: string[]; + threshold: number; +} + +/** EventCreateMessageIdMultisigIsm ... */ +export interface EventAnnounceStorageLocation { + mailbox_id: string; + sender: string; + validator: string; + storage_location: string; +} + +/** EventSetRoutingIsmDomain ... */ +export interface EventSetRoutingIsmDomain { + ism_id: string; + owner: string; + route_ism_id: string; + route_domain: number; +} + +/** EventRemoveRoutingIsmDomain ... */ +export interface EventRemoveRoutingIsmDomain { + ism_id: string; + owner: string; + route_domain: number; +} + +/** EventRemoveRoutingIsmDomain ... */ +export interface EventSetRoutingIsm { + ism_id: string; + owner: string; + new_owner: string; + renounce_ownership: boolean; +} + +/** EventCreateMessageIdMultisigIsm ... */ +export interface EventCreateRoutingIsm { + ism_id: string; + owner: string; +} + +function createBaseEventCreateNoopIsm(): EventCreateNoopIsm { + return { ism_id: '', owner: '' }; +} + +export const EventCreateNoopIsm = { + encode( + message: EventCreateNoopIsm, + writer: _m0.Writer = _m0.Writer.create(), + ): _m0.Writer { + if (message.ism_id !== '') { + writer.uint32(10).string(message.ism_id); + } + if (message.owner !== '') { + writer.uint32(18).string(message.owner); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): EventCreateNoopIsm { + const reader = + input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseEventCreateNoopIsm(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.ism_id = reader.string(); + continue; + case 2: + if (tag !== 18) { + break; + } + + message.owner = reader.string(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): EventCreateNoopIsm { + return { + ism_id: isSet(object.ism_id) ? globalThis.String(object.ism_id) : '', + owner: isSet(object.owner) ? globalThis.String(object.owner) : '', + }; + }, + + toJSON(message: EventCreateNoopIsm): unknown { + const obj: any = {}; + if (message.ism_id !== '') { + obj.ism_id = message.ism_id; + } + if (message.owner !== '') { + obj.owner = message.owner; + } + return obj; + }, + + create, I>>( + base?: I, + ): EventCreateNoopIsm { + return EventCreateNoopIsm.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>( + object: I, + ): EventCreateNoopIsm { + const message = createBaseEventCreateNoopIsm(); + message.ism_id = object.ism_id ?? ''; + message.owner = object.owner ?? ''; + return message; + }, +}; + +function createBaseEventCreateMerkleRootMultisigIsm(): EventCreateMerkleRootMultisigIsm { + return { ism_id: '', owner: '', validators: [], threshold: 0 }; +} + +export const EventCreateMerkleRootMultisigIsm = { + encode( + message: EventCreateMerkleRootMultisigIsm, + writer: _m0.Writer = _m0.Writer.create(), + ): _m0.Writer { + if (message.ism_id !== '') { + writer.uint32(10).string(message.ism_id); + } + if (message.owner !== '') { + writer.uint32(18).string(message.owner); + } + for (const v of message.validators) { + writer.uint32(26).string(v!); + } + if (message.threshold !== 0) { + writer.uint32(32).uint32(message.threshold); + } + return writer; + }, + + decode( + input: _m0.Reader | Uint8Array, + length?: number, + ): EventCreateMerkleRootMultisigIsm { + const reader = + input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseEventCreateMerkleRootMultisigIsm(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.ism_id = reader.string(); + continue; + case 2: + if (tag !== 18) { + break; + } + + message.owner = reader.string(); + continue; + case 3: + if (tag !== 26) { + break; + } + + message.validators.push(reader.string()); + continue; + case 4: + if (tag !== 32) { + break; + } + + message.threshold = reader.uint32(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): EventCreateMerkleRootMultisigIsm { + return { + ism_id: isSet(object.ism_id) ? globalThis.String(object.ism_id) : '', + owner: isSet(object.owner) ? globalThis.String(object.owner) : '', + validators: globalThis.Array.isArray(object?.validators) + ? object.validators.map((e: any) => globalThis.String(e)) + : [], + threshold: isSet(object.threshold) + ? globalThis.Number(object.threshold) + : 0, + }; + }, + + toJSON(message: EventCreateMerkleRootMultisigIsm): unknown { + const obj: any = {}; + if (message.ism_id !== '') { + obj.ism_id = message.ism_id; + } + if (message.owner !== '') { + obj.owner = message.owner; + } + if (message.validators?.length) { + obj.validators = message.validators; + } + if (message.threshold !== 0) { + obj.threshold = Math.round(message.threshold); + } + return obj; + }, + + create, I>>( + base?: I, + ): EventCreateMerkleRootMultisigIsm { + return EventCreateMerkleRootMultisigIsm.fromPartial(base ?? ({} as any)); + }, + fromPartial< + I extends Exact, I>, + >(object: I): EventCreateMerkleRootMultisigIsm { + const message = createBaseEventCreateMerkleRootMultisigIsm(); + message.ism_id = object.ism_id ?? ''; + message.owner = object.owner ?? ''; + message.validators = object.validators?.map((e) => e) || []; + message.threshold = object.threshold ?? 0; + return message; + }, +}; + +function createBaseEventCreateMessageIdMultisigIsm(): EventCreateMessageIdMultisigIsm { + return { ism_id: '', owner: '', validators: [], threshold: 0 }; +} + +export const EventCreateMessageIdMultisigIsm = { + encode( + message: EventCreateMessageIdMultisigIsm, + writer: _m0.Writer = _m0.Writer.create(), + ): _m0.Writer { + if (message.ism_id !== '') { + writer.uint32(10).string(message.ism_id); + } + if (message.owner !== '') { + writer.uint32(18).string(message.owner); + } + for (const v of message.validators) { + writer.uint32(26).string(v!); + } + if (message.threshold !== 0) { + writer.uint32(32).uint32(message.threshold); + } + return writer; + }, + + decode( + input: _m0.Reader | Uint8Array, + length?: number, + ): EventCreateMessageIdMultisigIsm { + const reader = + input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseEventCreateMessageIdMultisigIsm(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.ism_id = reader.string(); + continue; + case 2: + if (tag !== 18) { + break; + } + + message.owner = reader.string(); + continue; + case 3: + if (tag !== 26) { + break; + } + + message.validators.push(reader.string()); + continue; + case 4: + if (tag !== 32) { + break; + } + + message.threshold = reader.uint32(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): EventCreateMessageIdMultisigIsm { + return { + ism_id: isSet(object.ism_id) ? globalThis.String(object.ism_id) : '', + owner: isSet(object.owner) ? globalThis.String(object.owner) : '', + validators: globalThis.Array.isArray(object?.validators) + ? object.validators.map((e: any) => globalThis.String(e)) + : [], + threshold: isSet(object.threshold) + ? globalThis.Number(object.threshold) + : 0, + }; + }, + + toJSON(message: EventCreateMessageIdMultisigIsm): unknown { + const obj: any = {}; + if (message.ism_id !== '') { + obj.ism_id = message.ism_id; + } + if (message.owner !== '') { + obj.owner = message.owner; + } + if (message.validators?.length) { + obj.validators = message.validators; + } + if (message.threshold !== 0) { + obj.threshold = Math.round(message.threshold); + } + return obj; + }, + + create, I>>( + base?: I, + ): EventCreateMessageIdMultisigIsm { + return EventCreateMessageIdMultisigIsm.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>( + object: I, + ): EventCreateMessageIdMultisigIsm { + const message = createBaseEventCreateMessageIdMultisigIsm(); + message.ism_id = object.ism_id ?? ''; + message.owner = object.owner ?? ''; + message.validators = object.validators?.map((e) => e) || []; + message.threshold = object.threshold ?? 0; + return message; + }, +}; + +function createBaseEventAnnounceStorageLocation(): EventAnnounceStorageLocation { + return { mailbox_id: '', sender: '', validator: '', storage_location: '' }; +} + +export const EventAnnounceStorageLocation = { + encode( + message: EventAnnounceStorageLocation, + writer: _m0.Writer = _m0.Writer.create(), + ): _m0.Writer { + if (message.mailbox_id !== '') { + writer.uint32(10).string(message.mailbox_id); + } + if (message.sender !== '') { + writer.uint32(18).string(message.sender); + } + if (message.validator !== '') { + writer.uint32(26).string(message.validator); + } + if (message.storage_location !== '') { + writer.uint32(34).string(message.storage_location); + } + return writer; + }, + + decode( + input: _m0.Reader | Uint8Array, + length?: number, + ): EventAnnounceStorageLocation { + const reader = + input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseEventAnnounceStorageLocation(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.mailbox_id = reader.string(); + continue; + case 2: + if (tag !== 18) { + break; + } + + message.sender = reader.string(); + continue; + case 3: + if (tag !== 26) { + break; + } + + message.validator = reader.string(); + continue; + case 4: + if (tag !== 34) { + break; + } + + message.storage_location = reader.string(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): EventAnnounceStorageLocation { + return { + mailbox_id: isSet(object.mailbox_id) + ? globalThis.String(object.mailbox_id) + : '', + sender: isSet(object.sender) ? globalThis.String(object.sender) : '', + validator: isSet(object.validator) + ? globalThis.String(object.validator) + : '', + storage_location: isSet(object.storage_location) + ? globalThis.String(object.storage_location) + : '', + }; + }, + + toJSON(message: EventAnnounceStorageLocation): unknown { + const obj: any = {}; + if (message.mailbox_id !== '') { + obj.mailbox_id = message.mailbox_id; + } + if (message.sender !== '') { + obj.sender = message.sender; + } + if (message.validator !== '') { + obj.validator = message.validator; + } + if (message.storage_location !== '') { + obj.storage_location = message.storage_location; + } + return obj; + }, + + create, I>>( + base?: I, + ): EventAnnounceStorageLocation { + return EventAnnounceStorageLocation.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>( + object: I, + ): EventAnnounceStorageLocation { + const message = createBaseEventAnnounceStorageLocation(); + message.mailbox_id = object.mailbox_id ?? ''; + message.sender = object.sender ?? ''; + message.validator = object.validator ?? ''; + message.storage_location = object.storage_location ?? ''; + return message; + }, +}; + +function createBaseEventSetRoutingIsmDomain(): EventSetRoutingIsmDomain { + return { ism_id: '', owner: '', route_ism_id: '', route_domain: 0 }; +} + +export const EventSetRoutingIsmDomain = { + encode( + message: EventSetRoutingIsmDomain, + writer: _m0.Writer = _m0.Writer.create(), + ): _m0.Writer { + if (message.ism_id !== '') { + writer.uint32(10).string(message.ism_id); + } + if (message.owner !== '') { + writer.uint32(18).string(message.owner); + } + if (message.route_ism_id !== '') { + writer.uint32(26).string(message.route_ism_id); + } + if (message.route_domain !== 0) { + writer.uint32(32).uint32(message.route_domain); + } + return writer; + }, + + decode( + input: _m0.Reader | Uint8Array, + length?: number, + ): EventSetRoutingIsmDomain { + const reader = + input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseEventSetRoutingIsmDomain(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.ism_id = reader.string(); + continue; + case 2: + if (tag !== 18) { + break; + } + + message.owner = reader.string(); + continue; + case 3: + if (tag !== 26) { + break; + } + + message.route_ism_id = reader.string(); + continue; + case 4: + if (tag !== 32) { + break; + } + + message.route_domain = reader.uint32(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): EventSetRoutingIsmDomain { + return { + ism_id: isSet(object.ism_id) ? globalThis.String(object.ism_id) : '', + owner: isSet(object.owner) ? globalThis.String(object.owner) : '', + route_ism_id: isSet(object.route_ism_id) + ? globalThis.String(object.route_ism_id) + : '', + route_domain: isSet(object.route_domain) + ? globalThis.Number(object.route_domain) + : 0, + }; + }, + + toJSON(message: EventSetRoutingIsmDomain): unknown { + const obj: any = {}; + if (message.ism_id !== '') { + obj.ism_id = message.ism_id; + } + if (message.owner !== '') { + obj.owner = message.owner; + } + if (message.route_ism_id !== '') { + obj.route_ism_id = message.route_ism_id; + } + if (message.route_domain !== 0) { + obj.route_domain = Math.round(message.route_domain); + } + return obj; + }, + + create, I>>( + base?: I, + ): EventSetRoutingIsmDomain { + return EventSetRoutingIsmDomain.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>( + object: I, + ): EventSetRoutingIsmDomain { + const message = createBaseEventSetRoutingIsmDomain(); + message.ism_id = object.ism_id ?? ''; + message.owner = object.owner ?? ''; + message.route_ism_id = object.route_ism_id ?? ''; + message.route_domain = object.route_domain ?? 0; + return message; + }, +}; + +function createBaseEventRemoveRoutingIsmDomain(): EventRemoveRoutingIsmDomain { + return { ism_id: '', owner: '', route_domain: 0 }; +} + +export const EventRemoveRoutingIsmDomain = { + encode( + message: EventRemoveRoutingIsmDomain, + writer: _m0.Writer = _m0.Writer.create(), + ): _m0.Writer { + if (message.ism_id !== '') { + writer.uint32(10).string(message.ism_id); + } + if (message.owner !== '') { + writer.uint32(18).string(message.owner); + } + if (message.route_domain !== 0) { + writer.uint32(24).uint32(message.route_domain); + } + return writer; + }, + + decode( + input: _m0.Reader | Uint8Array, + length?: number, + ): EventRemoveRoutingIsmDomain { + const reader = + input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseEventRemoveRoutingIsmDomain(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.ism_id = reader.string(); + continue; + case 2: + if (tag !== 18) { + break; + } + + message.owner = reader.string(); + continue; + case 3: + if (tag !== 24) { + break; + } + + message.route_domain = reader.uint32(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): EventRemoveRoutingIsmDomain { + return { + ism_id: isSet(object.ism_id) ? globalThis.String(object.ism_id) : '', + owner: isSet(object.owner) ? globalThis.String(object.owner) : '', + route_domain: isSet(object.route_domain) + ? globalThis.Number(object.route_domain) + : 0, + }; + }, + + toJSON(message: EventRemoveRoutingIsmDomain): unknown { + const obj: any = {}; + if (message.ism_id !== '') { + obj.ism_id = message.ism_id; + } + if (message.owner !== '') { + obj.owner = message.owner; + } + if (message.route_domain !== 0) { + obj.route_domain = Math.round(message.route_domain); + } + return obj; + }, + + create, I>>( + base?: I, + ): EventRemoveRoutingIsmDomain { + return EventRemoveRoutingIsmDomain.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>( + object: I, + ): EventRemoveRoutingIsmDomain { + const message = createBaseEventRemoveRoutingIsmDomain(); + message.ism_id = object.ism_id ?? ''; + message.owner = object.owner ?? ''; + message.route_domain = object.route_domain ?? 0; + return message; + }, +}; + +function createBaseEventSetRoutingIsm(): EventSetRoutingIsm { + return { ism_id: '', owner: '', new_owner: '', renounce_ownership: false }; +} + +export const EventSetRoutingIsm = { + encode( + message: EventSetRoutingIsm, + writer: _m0.Writer = _m0.Writer.create(), + ): _m0.Writer { + if (message.ism_id !== '') { + writer.uint32(10).string(message.ism_id); + } + if (message.owner !== '') { + writer.uint32(18).string(message.owner); + } + if (message.new_owner !== '') { + writer.uint32(26).string(message.new_owner); + } + if (message.renounce_ownership !== false) { + writer.uint32(32).bool(message.renounce_ownership); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): EventSetRoutingIsm { + const reader = + input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseEventSetRoutingIsm(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.ism_id = reader.string(); + continue; + case 2: + if (tag !== 18) { + break; + } + + message.owner = reader.string(); + continue; + case 3: + if (tag !== 26) { + break; + } + + message.new_owner = reader.string(); + continue; + case 4: + if (tag !== 32) { + break; + } + + message.renounce_ownership = reader.bool(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): EventSetRoutingIsm { + return { + ism_id: isSet(object.ism_id) ? globalThis.String(object.ism_id) : '', + owner: isSet(object.owner) ? globalThis.String(object.owner) : '', + new_owner: isSet(object.new_owner) + ? globalThis.String(object.new_owner) + : '', + renounce_ownership: isSet(object.renounce_ownership) + ? globalThis.Boolean(object.renounce_ownership) + : false, + }; + }, + + toJSON(message: EventSetRoutingIsm): unknown { + const obj: any = {}; + if (message.ism_id !== '') { + obj.ism_id = message.ism_id; + } + if (message.owner !== '') { + obj.owner = message.owner; + } + if (message.new_owner !== '') { + obj.new_owner = message.new_owner; + } + if (message.renounce_ownership !== false) { + obj.renounce_ownership = message.renounce_ownership; + } + return obj; + }, + + create, I>>( + base?: I, + ): EventSetRoutingIsm { + return EventSetRoutingIsm.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>( + object: I, + ): EventSetRoutingIsm { + const message = createBaseEventSetRoutingIsm(); + message.ism_id = object.ism_id ?? ''; + message.owner = object.owner ?? ''; + message.new_owner = object.new_owner ?? ''; + message.renounce_ownership = object.renounce_ownership ?? false; + return message; + }, +}; + +function createBaseEventCreateRoutingIsm(): EventCreateRoutingIsm { + return { ism_id: '', owner: '' }; +} + +export const EventCreateRoutingIsm = { + encode( + message: EventCreateRoutingIsm, + writer: _m0.Writer = _m0.Writer.create(), + ): _m0.Writer { + if (message.ism_id !== '') { + writer.uint32(10).string(message.ism_id); + } + if (message.owner !== '') { + writer.uint32(18).string(message.owner); + } + return writer; + }, + + decode( + input: _m0.Reader | Uint8Array, + length?: number, + ): EventCreateRoutingIsm { + const reader = + input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseEventCreateRoutingIsm(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.ism_id = reader.string(); + continue; + case 2: + if (tag !== 18) { + break; + } + + message.owner = reader.string(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): EventCreateRoutingIsm { + return { + ism_id: isSet(object.ism_id) ? globalThis.String(object.ism_id) : '', + owner: isSet(object.owner) ? globalThis.String(object.owner) : '', + }; + }, + + toJSON(message: EventCreateRoutingIsm): unknown { + const obj: any = {}; + if (message.ism_id !== '') { + obj.ism_id = message.ism_id; + } + if (message.owner !== '') { + obj.owner = message.owner; + } + return obj; + }, + + create, I>>( + base?: I, + ): EventCreateRoutingIsm { + return EventCreateRoutingIsm.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>( + object: I, + ): EventCreateRoutingIsm { + const message = createBaseEventCreateRoutingIsm(); + message.ism_id = object.ism_id ?? ''; + message.owner = object.owner ?? ''; + return message; + }, +}; + +type Builtin = + | Date + | Function + | Uint8Array + | string + | number + | boolean + | undefined; + +export type DeepPartial = T extends Builtin + ? T + : T extends globalThis.Array + ? globalThis.Array> + : T extends ReadonlyArray + ? ReadonlyArray> + : T extends {} + ? { [K in keyof T]?: DeepPartial } + : Partial; + +type KeysOfUnion = T extends T ? keyof T : never; +export type Exact = P extends Builtin + ? P + : P & { [K in keyof P]: Exact } & { + [K in Exclude>]: never; + }; + +function isSet(value: any): boolean { + return value !== null && value !== undefined; +} diff --git a/typescript/cosmos-types/src/types/hyperlane/core/interchain_security/v1/tx.ts b/typescript/cosmos-types/src/types/hyperlane/core/interchain_security/v1/tx.ts index 73dd27dd984..40e3b67f048 100644 --- a/typescript/cosmos-types/src/types/hyperlane/core/interchain_security/v1/tx.ts +++ b/typescript/cosmos-types/src/types/hyperlane/core/interchain_security/v1/tx.ts @@ -6,6 +6,8 @@ /* eslint-disable */ import _m0 from 'protobufjs/minimal.js'; +import { Route } from './types.js'; + export const protobufPackage = 'hyperlane.core.interchain_security.v1'; /** MsgCreateMessageIdMultisigIsm ... */ @@ -72,6 +74,60 @@ export interface MsgAnnounceValidator { /** MsgAnnounceValidatorResponse ... */ export interface MsgAnnounceValidatorResponse {} +/** MsgCreateRoutingIsm ... */ +export interface MsgCreateRoutingIsm { + /** creator ... */ + creator: string; + /** routes ... */ + routes: Route[]; +} + +/** MsgCreateRoutingIsmResponse ... */ +export interface MsgCreateRoutingIsmResponse { + id: string; +} + +/** MsgSetRoutingIsmDomain ... */ +export interface MsgSetRoutingIsmDomain { + /** ism_id ... */ + ism_id: string; + /** route ... */ + route?: Route | undefined; + /** owner ... */ + owner: string; +} + +/** MsgSetRoutingIsmDomainResponse ... */ +export interface MsgSetRoutingIsmDomainResponse {} + +/** MsgRemoveRoutingIsmDomain ... */ +export interface MsgRemoveRoutingIsmDomain { + /** ism_id ... */ + ism_id: string; + /** domain ... */ + domain: number; + /** owner ... */ + owner: string; +} + +/** MsgRemoveRoutingIsmDomainResponse ... */ +export interface MsgRemoveRoutingIsmDomainResponse {} + +/** MsgUpdateRoutingIsmOwner ... */ +export interface MsgUpdateRoutingIsmOwner { + /** ism_id ... */ + ism_id: string; + /** owner ... */ + owner: string; + /** new owner */ + new_owner: string; + /** renounce_ownership */ + renounce_ownership: boolean; +} + +/** MsgUpdateRoutingIsmOwnerResponse ... */ +export interface MsgUpdateRoutingIsmOwnerResponse {} + function createBaseMsgCreateMessageIdMultisigIsm(): MsgCreateMessageIdMultisigIsm { return { creator: '', validators: [], threshold: 0 }; } @@ -753,6 +809,642 @@ export const MsgAnnounceValidatorResponse = { }, }; +function createBaseMsgCreateRoutingIsm(): MsgCreateRoutingIsm { + return { creator: '', routes: [] }; +} + +export const MsgCreateRoutingIsm = { + encode( + message: MsgCreateRoutingIsm, + writer: _m0.Writer = _m0.Writer.create(), + ): _m0.Writer { + if (message.creator !== '') { + writer.uint32(10).string(message.creator); + } + for (const v of message.routes) { + Route.encode(v!, writer.uint32(18).fork()).ldelim(); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): MsgCreateRoutingIsm { + const reader = + input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseMsgCreateRoutingIsm(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.creator = reader.string(); + continue; + case 2: + if (tag !== 18) { + break; + } + + message.routes.push(Route.decode(reader, reader.uint32())); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): MsgCreateRoutingIsm { + return { + creator: isSet(object.creator) ? globalThis.String(object.creator) : '', + routes: globalThis.Array.isArray(object?.routes) + ? object.routes.map((e: any) => Route.fromJSON(e)) + : [], + }; + }, + + toJSON(message: MsgCreateRoutingIsm): unknown { + const obj: any = {}; + if (message.creator !== '') { + obj.creator = message.creator; + } + if (message.routes?.length) { + obj.routes = message.routes.map((e) => Route.toJSON(e)); + } + return obj; + }, + + create, I>>( + base?: I, + ): MsgCreateRoutingIsm { + return MsgCreateRoutingIsm.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>( + object: I, + ): MsgCreateRoutingIsm { + const message = createBaseMsgCreateRoutingIsm(); + message.creator = object.creator ?? ''; + message.routes = object.routes?.map((e) => Route.fromPartial(e)) || []; + return message; + }, +}; + +function createBaseMsgCreateRoutingIsmResponse(): MsgCreateRoutingIsmResponse { + return { id: '' }; +} + +export const MsgCreateRoutingIsmResponse = { + encode( + message: MsgCreateRoutingIsmResponse, + writer: _m0.Writer = _m0.Writer.create(), + ): _m0.Writer { + if (message.id !== '') { + writer.uint32(10).string(message.id); + } + return writer; + }, + + decode( + input: _m0.Reader | Uint8Array, + length?: number, + ): MsgCreateRoutingIsmResponse { + const reader = + input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseMsgCreateRoutingIsmResponse(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.id = reader.string(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): MsgCreateRoutingIsmResponse { + return { id: isSet(object.id) ? globalThis.String(object.id) : '' }; + }, + + toJSON(message: MsgCreateRoutingIsmResponse): unknown { + const obj: any = {}; + if (message.id !== '') { + obj.id = message.id; + } + return obj; + }, + + create, I>>( + base?: I, + ): MsgCreateRoutingIsmResponse { + return MsgCreateRoutingIsmResponse.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>( + object: I, + ): MsgCreateRoutingIsmResponse { + const message = createBaseMsgCreateRoutingIsmResponse(); + message.id = object.id ?? ''; + return message; + }, +}; + +function createBaseMsgSetRoutingIsmDomain(): MsgSetRoutingIsmDomain { + return { ism_id: '', route: undefined, owner: '' }; +} + +export const MsgSetRoutingIsmDomain = { + encode( + message: MsgSetRoutingIsmDomain, + writer: _m0.Writer = _m0.Writer.create(), + ): _m0.Writer { + if (message.ism_id !== '') { + writer.uint32(10).string(message.ism_id); + } + if (message.route !== undefined) { + Route.encode(message.route, writer.uint32(18).fork()).ldelim(); + } + if (message.owner !== '') { + writer.uint32(26).string(message.owner); + } + return writer; + }, + + decode( + input: _m0.Reader | Uint8Array, + length?: number, + ): MsgSetRoutingIsmDomain { + const reader = + input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseMsgSetRoutingIsmDomain(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.ism_id = reader.string(); + continue; + case 2: + if (tag !== 18) { + break; + } + + message.route = Route.decode(reader, reader.uint32()); + continue; + case 3: + if (tag !== 26) { + break; + } + + message.owner = reader.string(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): MsgSetRoutingIsmDomain { + return { + ism_id: isSet(object.ism_id) ? globalThis.String(object.ism_id) : '', + route: isSet(object.route) ? Route.fromJSON(object.route) : undefined, + owner: isSet(object.owner) ? globalThis.String(object.owner) : '', + }; + }, + + toJSON(message: MsgSetRoutingIsmDomain): unknown { + const obj: any = {}; + if (message.ism_id !== '') { + obj.ism_id = message.ism_id; + } + if (message.route !== undefined) { + obj.route = Route.toJSON(message.route); + } + if (message.owner !== '') { + obj.owner = message.owner; + } + return obj; + }, + + create, I>>( + base?: I, + ): MsgSetRoutingIsmDomain { + return MsgSetRoutingIsmDomain.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>( + object: I, + ): MsgSetRoutingIsmDomain { + const message = createBaseMsgSetRoutingIsmDomain(); + message.ism_id = object.ism_id ?? ''; + message.route = + object.route !== undefined && object.route !== null + ? Route.fromPartial(object.route) + : undefined; + message.owner = object.owner ?? ''; + return message; + }, +}; + +function createBaseMsgSetRoutingIsmDomainResponse(): MsgSetRoutingIsmDomainResponse { + return {}; +} + +export const MsgSetRoutingIsmDomainResponse = { + encode( + _: MsgSetRoutingIsmDomainResponse, + writer: _m0.Writer = _m0.Writer.create(), + ): _m0.Writer { + return writer; + }, + + decode( + input: _m0.Reader | Uint8Array, + length?: number, + ): MsgSetRoutingIsmDomainResponse { + const reader = + input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseMsgSetRoutingIsmDomainResponse(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(_: any): MsgSetRoutingIsmDomainResponse { + return {}; + }, + + toJSON(_: MsgSetRoutingIsmDomainResponse): unknown { + const obj: any = {}; + return obj; + }, + + create, I>>( + base?: I, + ): MsgSetRoutingIsmDomainResponse { + return MsgSetRoutingIsmDomainResponse.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>( + _: I, + ): MsgSetRoutingIsmDomainResponse { + const message = createBaseMsgSetRoutingIsmDomainResponse(); + return message; + }, +}; + +function createBaseMsgRemoveRoutingIsmDomain(): MsgRemoveRoutingIsmDomain { + return { ism_id: '', domain: 0, owner: '' }; +} + +export const MsgRemoveRoutingIsmDomain = { + encode( + message: MsgRemoveRoutingIsmDomain, + writer: _m0.Writer = _m0.Writer.create(), + ): _m0.Writer { + if (message.ism_id !== '') { + writer.uint32(10).string(message.ism_id); + } + if (message.domain !== 0) { + writer.uint32(16).uint32(message.domain); + } + if (message.owner !== '') { + writer.uint32(26).string(message.owner); + } + return writer; + }, + + decode( + input: _m0.Reader | Uint8Array, + length?: number, + ): MsgRemoveRoutingIsmDomain { + const reader = + input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseMsgRemoveRoutingIsmDomain(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.ism_id = reader.string(); + continue; + case 2: + if (tag !== 16) { + break; + } + + message.domain = reader.uint32(); + continue; + case 3: + if (tag !== 26) { + break; + } + + message.owner = reader.string(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): MsgRemoveRoutingIsmDomain { + return { + ism_id: isSet(object.ism_id) ? globalThis.String(object.ism_id) : '', + domain: isSet(object.domain) ? globalThis.Number(object.domain) : 0, + owner: isSet(object.owner) ? globalThis.String(object.owner) : '', + }; + }, + + toJSON(message: MsgRemoveRoutingIsmDomain): unknown { + const obj: any = {}; + if (message.ism_id !== '') { + obj.ism_id = message.ism_id; + } + if (message.domain !== 0) { + obj.domain = Math.round(message.domain); + } + if (message.owner !== '') { + obj.owner = message.owner; + } + return obj; + }, + + create, I>>( + base?: I, + ): MsgRemoveRoutingIsmDomain { + return MsgRemoveRoutingIsmDomain.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>( + object: I, + ): MsgRemoveRoutingIsmDomain { + const message = createBaseMsgRemoveRoutingIsmDomain(); + message.ism_id = object.ism_id ?? ''; + message.domain = object.domain ?? 0; + message.owner = object.owner ?? ''; + return message; + }, +}; + +function createBaseMsgRemoveRoutingIsmDomainResponse(): MsgRemoveRoutingIsmDomainResponse { + return {}; +} + +export const MsgRemoveRoutingIsmDomainResponse = { + encode( + _: MsgRemoveRoutingIsmDomainResponse, + writer: _m0.Writer = _m0.Writer.create(), + ): _m0.Writer { + return writer; + }, + + decode( + input: _m0.Reader | Uint8Array, + length?: number, + ): MsgRemoveRoutingIsmDomainResponse { + const reader = + input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseMsgRemoveRoutingIsmDomainResponse(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(_: any): MsgRemoveRoutingIsmDomainResponse { + return {}; + }, + + toJSON(_: MsgRemoveRoutingIsmDomainResponse): unknown { + const obj: any = {}; + return obj; + }, + + create, I>>( + base?: I, + ): MsgRemoveRoutingIsmDomainResponse { + return MsgRemoveRoutingIsmDomainResponse.fromPartial(base ?? ({} as any)); + }, + fromPartial< + I extends Exact, I>, + >(_: I): MsgRemoveRoutingIsmDomainResponse { + const message = createBaseMsgRemoveRoutingIsmDomainResponse(); + return message; + }, +}; + +function createBaseMsgUpdateRoutingIsmOwner(): MsgUpdateRoutingIsmOwner { + return { ism_id: '', owner: '', new_owner: '', renounce_ownership: false }; +} + +export const MsgUpdateRoutingIsmOwner = { + encode( + message: MsgUpdateRoutingIsmOwner, + writer: _m0.Writer = _m0.Writer.create(), + ): _m0.Writer { + if (message.ism_id !== '') { + writer.uint32(10).string(message.ism_id); + } + if (message.owner !== '') { + writer.uint32(18).string(message.owner); + } + if (message.new_owner !== '') { + writer.uint32(26).string(message.new_owner); + } + if (message.renounce_ownership !== false) { + writer.uint32(32).bool(message.renounce_ownership); + } + return writer; + }, + + decode( + input: _m0.Reader | Uint8Array, + length?: number, + ): MsgUpdateRoutingIsmOwner { + const reader = + input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseMsgUpdateRoutingIsmOwner(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.ism_id = reader.string(); + continue; + case 2: + if (tag !== 18) { + break; + } + + message.owner = reader.string(); + continue; + case 3: + if (tag !== 26) { + break; + } + + message.new_owner = reader.string(); + continue; + case 4: + if (tag !== 32) { + break; + } + + message.renounce_ownership = reader.bool(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): MsgUpdateRoutingIsmOwner { + return { + ism_id: isSet(object.ism_id) ? globalThis.String(object.ism_id) : '', + owner: isSet(object.owner) ? globalThis.String(object.owner) : '', + new_owner: isSet(object.new_owner) + ? globalThis.String(object.new_owner) + : '', + renounce_ownership: isSet(object.renounce_ownership) + ? globalThis.Boolean(object.renounce_ownership) + : false, + }; + }, + + toJSON(message: MsgUpdateRoutingIsmOwner): unknown { + const obj: any = {}; + if (message.ism_id !== '') { + obj.ism_id = message.ism_id; + } + if (message.owner !== '') { + obj.owner = message.owner; + } + if (message.new_owner !== '') { + obj.new_owner = message.new_owner; + } + if (message.renounce_ownership !== false) { + obj.renounce_ownership = message.renounce_ownership; + } + return obj; + }, + + create, I>>( + base?: I, + ): MsgUpdateRoutingIsmOwner { + return MsgUpdateRoutingIsmOwner.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>( + object: I, + ): MsgUpdateRoutingIsmOwner { + const message = createBaseMsgUpdateRoutingIsmOwner(); + message.ism_id = object.ism_id ?? ''; + message.owner = object.owner ?? ''; + message.new_owner = object.new_owner ?? ''; + message.renounce_ownership = object.renounce_ownership ?? false; + return message; + }, +}; + +function createBaseMsgUpdateRoutingIsmOwnerResponse(): MsgUpdateRoutingIsmOwnerResponse { + return {}; +} + +export const MsgUpdateRoutingIsmOwnerResponse = { + encode( + _: MsgUpdateRoutingIsmOwnerResponse, + writer: _m0.Writer = _m0.Writer.create(), + ): _m0.Writer { + return writer; + }, + + decode( + input: _m0.Reader | Uint8Array, + length?: number, + ): MsgUpdateRoutingIsmOwnerResponse { + const reader = + input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseMsgUpdateRoutingIsmOwnerResponse(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(_: any): MsgUpdateRoutingIsmOwnerResponse { + return {}; + }, + + toJSON(_: MsgUpdateRoutingIsmOwnerResponse): unknown { + const obj: any = {}; + return obj; + }, + + create, I>>( + base?: I, + ): MsgUpdateRoutingIsmOwnerResponse { + return MsgUpdateRoutingIsmOwnerResponse.fromPartial(base ?? ({} as any)); + }, + fromPartial< + I extends Exact, I>, + >(_: I): MsgUpdateRoutingIsmOwnerResponse { + const message = createBaseMsgUpdateRoutingIsmOwnerResponse(); + return message; + }, +}; + /** Msg defines the module Msg service. */ export interface Msg { /** CreateMessageIdMultisigIsm ... */ @@ -765,6 +1457,22 @@ export interface Msg { ): Promise; /** CreateNoopIsm ... */ CreateNoopIsm(request: MsgCreateNoopIsm): Promise; + /** CreateRoutingIsm ... */ + CreateRoutingIsm( + request: MsgCreateRoutingIsm, + ): Promise; + /** SetRoutingIsmDomain ... */ + SetRoutingIsmDomain( + request: MsgSetRoutingIsmDomain, + ): Promise; + /** RemoveRoutingIsmDomain ... */ + RemoveRoutingIsmDomain( + request: MsgRemoveRoutingIsmDomain, + ): Promise; + /** UpdateRoutingIsmOwner ... */ + UpdateRoutingIsmOwner( + request: MsgUpdateRoutingIsmOwner, + ): Promise; /** AnnounceValidator ... */ AnnounceValidator( request: MsgAnnounceValidator, @@ -783,6 +1491,10 @@ export class MsgClientImpl implements Msg { this.CreateMerkleRootMultisigIsm = this.CreateMerkleRootMultisigIsm.bind(this); this.CreateNoopIsm = this.CreateNoopIsm.bind(this); + this.CreateRoutingIsm = this.CreateRoutingIsm.bind(this); + this.SetRoutingIsmDomain = this.SetRoutingIsmDomain.bind(this); + this.RemoveRoutingIsmDomain = this.RemoveRoutingIsmDomain.bind(this); + this.UpdateRoutingIsmOwner = this.UpdateRoutingIsmOwner.bind(this); this.AnnounceValidator = this.AnnounceValidator.bind(this); } CreateMessageIdMultisigIsm( @@ -821,6 +1533,54 @@ export class MsgClientImpl implements Msg { ); } + CreateRoutingIsm( + request: MsgCreateRoutingIsm, + ): Promise { + const data = MsgCreateRoutingIsm.encode(request).finish(); + const promise = this.rpc.request(this.service, 'CreateRoutingIsm', data); + return promise.then((data) => + MsgCreateRoutingIsmResponse.decode(_m0.Reader.create(data)), + ); + } + + SetRoutingIsmDomain( + request: MsgSetRoutingIsmDomain, + ): Promise { + const data = MsgSetRoutingIsmDomain.encode(request).finish(); + const promise = this.rpc.request(this.service, 'SetRoutingIsmDomain', data); + return promise.then((data) => + MsgSetRoutingIsmDomainResponse.decode(_m0.Reader.create(data)), + ); + } + + RemoveRoutingIsmDomain( + request: MsgRemoveRoutingIsmDomain, + ): Promise { + const data = MsgRemoveRoutingIsmDomain.encode(request).finish(); + const promise = this.rpc.request( + this.service, + 'RemoveRoutingIsmDomain', + data, + ); + return promise.then((data) => + MsgRemoveRoutingIsmDomainResponse.decode(_m0.Reader.create(data)), + ); + } + + UpdateRoutingIsmOwner( + request: MsgUpdateRoutingIsmOwner, + ): Promise { + const data = MsgUpdateRoutingIsmOwner.encode(request).finish(); + const promise = this.rpc.request( + this.service, + 'UpdateRoutingIsmOwner', + data, + ); + return promise.then((data) => + MsgUpdateRoutingIsmOwnerResponse.decode(_m0.Reader.create(data)), + ); + } + AnnounceValidator( request: MsgAnnounceValidator, ): Promise { diff --git a/typescript/cosmos-types/src/types/hyperlane/core/interchain_security/v1/types.ts b/typescript/cosmos-types/src/types/hyperlane/core/interchain_security/v1/types.ts index 29e8a944bad..7df644fd913 100644 --- a/typescript/cosmos-types/src/types/hyperlane/core/interchain_security/v1/types.ts +++ b/typescript/cosmos-types/src/types/hyperlane/core/interchain_security/v1/types.ts @@ -8,6 +8,30 @@ import _m0 from 'protobufjs/minimal.js'; export const protobufPackage = 'hyperlane.core.interchain_security.v1'; +/** Route */ +export interface Route { + /** ism ... */ + ism: string; + /** domain ... */ + domain: number; +} + +/** Routing ISM ... */ +export interface RoutingISM { + /** id ... */ + id: string; + /** owner ... */ + owner: string; + /** + * Routes associated with the Routing ISM. + * These are stored directly within the ISM to simplify the design, + * as the number of routes is expected to remain small. + * This approach avoids the added complexity of managing a separate + * collection. + */ + routes: Route[]; +} + /** MessageIdMultisigISM ... */ export interface MessageIdMultisigISM { /** id ... */ @@ -46,6 +70,178 @@ export interface NoopISM { owner: string; } +function createBaseRoute(): Route { + return { ism: '', domain: 0 }; +} + +export const Route = { + encode(message: Route, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.ism !== '') { + writer.uint32(10).string(message.ism); + } + if (message.domain !== 0) { + writer.uint32(16).uint32(message.domain); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): Route { + const reader = + input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseRoute(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.ism = reader.string(); + continue; + case 2: + if (tag !== 16) { + break; + } + + message.domain = reader.uint32(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): Route { + return { + ism: isSet(object.ism) ? globalThis.String(object.ism) : '', + domain: isSet(object.domain) ? globalThis.Number(object.domain) : 0, + }; + }, + + toJSON(message: Route): unknown { + const obj: any = {}; + if (message.ism !== '') { + obj.ism = message.ism; + } + if (message.domain !== 0) { + obj.domain = Math.round(message.domain); + } + return obj; + }, + + create, I>>(base?: I): Route { + return Route.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): Route { + const message = createBaseRoute(); + message.ism = object.ism ?? ''; + message.domain = object.domain ?? 0; + return message; + }, +}; + +function createBaseRoutingISM(): RoutingISM { + return { id: '', owner: '', routes: [] }; +} + +export const RoutingISM = { + encode( + message: RoutingISM, + writer: _m0.Writer = _m0.Writer.create(), + ): _m0.Writer { + if (message.id !== '') { + writer.uint32(10).string(message.id); + } + if (message.owner !== '') { + writer.uint32(18).string(message.owner); + } + for (const v of message.routes) { + Route.encode(v!, writer.uint32(26).fork()).ldelim(); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): RoutingISM { + const reader = + input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseRoutingISM(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.id = reader.string(); + continue; + case 2: + if (tag !== 18) { + break; + } + + message.owner = reader.string(); + continue; + case 3: + if (tag !== 26) { + break; + } + + message.routes.push(Route.decode(reader, reader.uint32())); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): RoutingISM { + return { + id: isSet(object.id) ? globalThis.String(object.id) : '', + owner: isSet(object.owner) ? globalThis.String(object.owner) : '', + routes: globalThis.Array.isArray(object?.routes) + ? object.routes.map((e: any) => Route.fromJSON(e)) + : [], + }; + }, + + toJSON(message: RoutingISM): unknown { + const obj: any = {}; + if (message.id !== '') { + obj.id = message.id; + } + if (message.owner !== '') { + obj.owner = message.owner; + } + if (message.routes?.length) { + obj.routes = message.routes.map((e) => Route.toJSON(e)); + } + return obj; + }, + + create, I>>(base?: I): RoutingISM { + return RoutingISM.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>( + object: I, + ): RoutingISM { + const message = createBaseRoutingISM(); + message.id = object.id ?? ''; + message.owner = object.owner ?? ''; + message.routes = object.routes?.map((e) => Route.fromPartial(e)) || []; + return message; + }, +}; + function createBaseMessageIdMultisigISM(): MessageIdMultisigISM { return { id: '', owner: '', validators: [], threshold: 0 }; } diff --git a/typescript/cosmos-types/src/types/hyperlane/core/post_dispatch/v1/events.ts b/typescript/cosmos-types/src/types/hyperlane/core/post_dispatch/v1/events.ts index 0e9a114f107..1d916674459 100644 --- a/typescript/cosmos-types/src/types/hyperlane/core/post_dispatch/v1/events.ts +++ b/typescript/cosmos-types/src/types/hyperlane/core/post_dispatch/v1/events.ts @@ -8,17 +8,17 @@ import _m0 from 'protobufjs/minimal.js'; export const protobufPackage = 'hyperlane.core.post_dispatch.v1'; -/** InsertedIntoTree ... */ +/** EventCreateMerkleTreeHook ... */ export interface EventCreateMerkleTreeHook { /** id ... */ - id: string; + merkle_tree_hook_id: string; /** mailbox_id ... */ mailbox_id: string; owner: string; } -/** InsertedIntoTree ... */ -export interface InsertedIntoTree { +/** EventInsertedIntoTree ... */ +export interface EventInsertedIntoTree { /** message_id ... */ message_id: string; /** index ... */ @@ -27,8 +27,8 @@ export interface InsertedIntoTree { merkle_tree_hook_id: string; } -/** GasPayment ... */ -export interface GasPayment { +/** EventGasPayment ... */ +export interface EventGasPayment { /** message_id ... */ message_id: string; /** destination ... */ @@ -41,16 +41,48 @@ export interface GasPayment { igp_id: string; } -/** InsertedIntoTree ... */ +/** EventCreateNoopHook ... */ export interface EventCreateNoopHook { /** id ... */ - id: string; + noop_hook_id: string; /** owner ... */ owner: string; } +/** EventCreateIgp ... */ +export interface EventCreateIgp { + igp_id: string; + owner: string; + denom: string; +} + +/** EventSetIgp ... */ +export interface EventSetIgp { + igp_id: string; + owner: string; + new_owner: string; + renounce_ownership: boolean; +} + +/** EventSetDestinationGasConfig ... */ +export interface EventSetDestinationGasConfig { + igp_id: string; + owner: string; + remote_domain: number; + gas_overhead: string; + gas_price: string; + token_exchange_rate: string; +} + +/** EventClaimIgp ... */ +export interface EventClaimIgp { + igp_id: string; + owner: string; + amount: string; +} + function createBaseEventCreateMerkleTreeHook(): EventCreateMerkleTreeHook { - return { id: '', mailbox_id: '', owner: '' }; + return { merkle_tree_hook_id: '', mailbox_id: '', owner: '' }; } export const EventCreateMerkleTreeHook = { @@ -58,8 +90,8 @@ export const EventCreateMerkleTreeHook = { message: EventCreateMerkleTreeHook, writer: _m0.Writer = _m0.Writer.create(), ): _m0.Writer { - if (message.id !== '') { - writer.uint32(10).string(message.id); + if (message.merkle_tree_hook_id !== '') { + writer.uint32(10).string(message.merkle_tree_hook_id); } if (message.mailbox_id !== '') { writer.uint32(18).string(message.mailbox_id); @@ -86,7 +118,7 @@ export const EventCreateMerkleTreeHook = { break; } - message.id = reader.string(); + message.merkle_tree_hook_id = reader.string(); continue; case 2: if (tag !== 18) { @@ -113,7 +145,9 @@ export const EventCreateMerkleTreeHook = { fromJSON(object: any): EventCreateMerkleTreeHook { return { - id: isSet(object.id) ? globalThis.String(object.id) : '', + merkle_tree_hook_id: isSet(object.merkle_tree_hook_id) + ? globalThis.String(object.merkle_tree_hook_id) + : '', mailbox_id: isSet(object.mailbox_id) ? globalThis.String(object.mailbox_id) : '', @@ -123,8 +157,8 @@ export const EventCreateMerkleTreeHook = { toJSON(message: EventCreateMerkleTreeHook): unknown { const obj: any = {}; - if (message.id !== '') { - obj.id = message.id; + if (message.merkle_tree_hook_id !== '') { + obj.merkle_tree_hook_id = message.merkle_tree_hook_id; } if (message.mailbox_id !== '') { obj.mailbox_id = message.mailbox_id; @@ -144,20 +178,20 @@ export const EventCreateMerkleTreeHook = { object: I, ): EventCreateMerkleTreeHook { const message = createBaseEventCreateMerkleTreeHook(); - message.id = object.id ?? ''; + message.merkle_tree_hook_id = object.merkle_tree_hook_id ?? ''; message.mailbox_id = object.mailbox_id ?? ''; message.owner = object.owner ?? ''; return message; }, }; -function createBaseInsertedIntoTree(): InsertedIntoTree { +function createBaseEventInsertedIntoTree(): EventInsertedIntoTree { return { message_id: '', index: 0, merkle_tree_hook_id: '' }; } -export const InsertedIntoTree = { +export const EventInsertedIntoTree = { encode( - message: InsertedIntoTree, + message: EventInsertedIntoTree, writer: _m0.Writer = _m0.Writer.create(), ): _m0.Writer { if (message.message_id !== '') { @@ -172,11 +206,14 @@ export const InsertedIntoTree = { return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): InsertedIntoTree { + decode( + input: _m0.Reader | Uint8Array, + length?: number, + ): EventInsertedIntoTree { const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseInsertedIntoTree(); + const message = createBaseEventInsertedIntoTree(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { @@ -210,7 +247,7 @@ export const InsertedIntoTree = { return message; }, - fromJSON(object: any): InsertedIntoTree { + fromJSON(object: any): EventInsertedIntoTree { return { message_id: isSet(object.message_id) ? globalThis.String(object.message_id) @@ -222,7 +259,7 @@ export const InsertedIntoTree = { }; }, - toJSON(message: InsertedIntoTree): unknown { + toJSON(message: EventInsertedIntoTree): unknown { const obj: any = {}; if (message.message_id !== '') { obj.message_id = message.message_id; @@ -236,15 +273,15 @@ export const InsertedIntoTree = { return obj; }, - create, I>>( + create, I>>( base?: I, - ): InsertedIntoTree { - return InsertedIntoTree.fromPartial(base ?? ({} as any)); + ): EventInsertedIntoTree { + return EventInsertedIntoTree.fromPartial(base ?? ({} as any)); }, - fromPartial, I>>( + fromPartial, I>>( object: I, - ): InsertedIntoTree { - const message = createBaseInsertedIntoTree(); + ): EventInsertedIntoTree { + const message = createBaseEventInsertedIntoTree(); message.message_id = object.message_id ?? ''; message.index = object.index ?? 0; message.merkle_tree_hook_id = object.merkle_tree_hook_id ?? ''; @@ -252,7 +289,7 @@ export const InsertedIntoTree = { }, }; -function createBaseGasPayment(): GasPayment { +function createBaseEventGasPayment(): EventGasPayment { return { message_id: '', destination: 0, @@ -262,9 +299,9 @@ function createBaseGasPayment(): GasPayment { }; } -export const GasPayment = { +export const EventGasPayment = { encode( - message: GasPayment, + message: EventGasPayment, writer: _m0.Writer = _m0.Writer.create(), ): _m0.Writer { if (message.message_id !== '') { @@ -285,11 +322,11 @@ export const GasPayment = { return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): GasPayment { + decode(input: _m0.Reader | Uint8Array, length?: number): EventGasPayment { const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseGasPayment(); + const message = createBaseEventGasPayment(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { @@ -337,7 +374,7 @@ export const GasPayment = { return message; }, - fromJSON(object: any): GasPayment { + fromJSON(object: any): EventGasPayment { return { message_id: isSet(object.message_id) ? globalThis.String(object.message_id) @@ -353,7 +390,7 @@ export const GasPayment = { }; }, - toJSON(message: GasPayment): unknown { + toJSON(message: EventGasPayment): unknown { const obj: any = {}; if (message.message_id !== '') { obj.message_id = message.message_id; @@ -373,13 +410,15 @@ export const GasPayment = { return obj; }, - create, I>>(base?: I): GasPayment { - return GasPayment.fromPartial(base ?? ({} as any)); + create, I>>( + base?: I, + ): EventGasPayment { + return EventGasPayment.fromPartial(base ?? ({} as any)); }, - fromPartial, I>>( + fromPartial, I>>( object: I, - ): GasPayment { - const message = createBaseGasPayment(); + ): EventGasPayment { + const message = createBaseEventGasPayment(); message.message_id = object.message_id ?? ''; message.destination = object.destination ?? 0; message.gas_amount = object.gas_amount ?? ''; @@ -390,7 +429,7 @@ export const GasPayment = { }; function createBaseEventCreateNoopHook(): EventCreateNoopHook { - return { id: '', owner: '' }; + return { noop_hook_id: '', owner: '' }; } export const EventCreateNoopHook = { @@ -398,8 +437,8 @@ export const EventCreateNoopHook = { message: EventCreateNoopHook, writer: _m0.Writer = _m0.Writer.create(), ): _m0.Writer { - if (message.id !== '') { - writer.uint32(10).string(message.id); + if (message.noop_hook_id !== '') { + writer.uint32(10).string(message.noop_hook_id); } if (message.owner !== '') { writer.uint32(18).string(message.owner); @@ -420,7 +459,7 @@ export const EventCreateNoopHook = { break; } - message.id = reader.string(); + message.noop_hook_id = reader.string(); continue; case 2: if (tag !== 18) { @@ -440,15 +479,17 @@ export const EventCreateNoopHook = { fromJSON(object: any): EventCreateNoopHook { return { - id: isSet(object.id) ? globalThis.String(object.id) : '', + noop_hook_id: isSet(object.noop_hook_id) + ? globalThis.String(object.noop_hook_id) + : '', owner: isSet(object.owner) ? globalThis.String(object.owner) : '', }; }, toJSON(message: EventCreateNoopHook): unknown { const obj: any = {}; - if (message.id !== '') { - obj.id = message.id; + if (message.noop_hook_id !== '') { + obj.noop_hook_id = message.noop_hook_id; } if (message.owner !== '') { obj.owner = message.owner; @@ -465,8 +506,476 @@ export const EventCreateNoopHook = { object: I, ): EventCreateNoopHook { const message = createBaseEventCreateNoopHook(); - message.id = object.id ?? ''; + message.noop_hook_id = object.noop_hook_id ?? ''; + message.owner = object.owner ?? ''; + return message; + }, +}; + +function createBaseEventCreateIgp(): EventCreateIgp { + return { igp_id: '', owner: '', denom: '' }; +} + +export const EventCreateIgp = { + encode( + message: EventCreateIgp, + writer: _m0.Writer = _m0.Writer.create(), + ): _m0.Writer { + if (message.igp_id !== '') { + writer.uint32(10).string(message.igp_id); + } + if (message.owner !== '') { + writer.uint32(18).string(message.owner); + } + if (message.denom !== '') { + writer.uint32(26).string(message.denom); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): EventCreateIgp { + const reader = + input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseEventCreateIgp(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.igp_id = reader.string(); + continue; + case 2: + if (tag !== 18) { + break; + } + + message.owner = reader.string(); + continue; + case 3: + if (tag !== 26) { + break; + } + + message.denom = reader.string(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): EventCreateIgp { + return { + igp_id: isSet(object.igp_id) ? globalThis.String(object.igp_id) : '', + owner: isSet(object.owner) ? globalThis.String(object.owner) : '', + denom: isSet(object.denom) ? globalThis.String(object.denom) : '', + }; + }, + + toJSON(message: EventCreateIgp): unknown { + const obj: any = {}; + if (message.igp_id !== '') { + obj.igp_id = message.igp_id; + } + if (message.owner !== '') { + obj.owner = message.owner; + } + if (message.denom !== '') { + obj.denom = message.denom; + } + return obj; + }, + + create, I>>( + base?: I, + ): EventCreateIgp { + return EventCreateIgp.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>( + object: I, + ): EventCreateIgp { + const message = createBaseEventCreateIgp(); + message.igp_id = object.igp_id ?? ''; + message.owner = object.owner ?? ''; + message.denom = object.denom ?? ''; + return message; + }, +}; + +function createBaseEventSetIgp(): EventSetIgp { + return { igp_id: '', owner: '', new_owner: '', renounce_ownership: false }; +} + +export const EventSetIgp = { + encode( + message: EventSetIgp, + writer: _m0.Writer = _m0.Writer.create(), + ): _m0.Writer { + if (message.igp_id !== '') { + writer.uint32(10).string(message.igp_id); + } + if (message.owner !== '') { + writer.uint32(18).string(message.owner); + } + if (message.new_owner !== '') { + writer.uint32(26).string(message.new_owner); + } + if (message.renounce_ownership !== false) { + writer.uint32(32).bool(message.renounce_ownership); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): EventSetIgp { + const reader = + input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseEventSetIgp(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.igp_id = reader.string(); + continue; + case 2: + if (tag !== 18) { + break; + } + + message.owner = reader.string(); + continue; + case 3: + if (tag !== 26) { + break; + } + + message.new_owner = reader.string(); + continue; + case 4: + if (tag !== 32) { + break; + } + + message.renounce_ownership = reader.bool(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): EventSetIgp { + return { + igp_id: isSet(object.igp_id) ? globalThis.String(object.igp_id) : '', + owner: isSet(object.owner) ? globalThis.String(object.owner) : '', + new_owner: isSet(object.new_owner) + ? globalThis.String(object.new_owner) + : '', + renounce_ownership: isSet(object.renounce_ownership) + ? globalThis.Boolean(object.renounce_ownership) + : false, + }; + }, + + toJSON(message: EventSetIgp): unknown { + const obj: any = {}; + if (message.igp_id !== '') { + obj.igp_id = message.igp_id; + } + if (message.owner !== '') { + obj.owner = message.owner; + } + if (message.new_owner !== '') { + obj.new_owner = message.new_owner; + } + if (message.renounce_ownership !== false) { + obj.renounce_ownership = message.renounce_ownership; + } + return obj; + }, + + create, I>>(base?: I): EventSetIgp { + return EventSetIgp.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>( + object: I, + ): EventSetIgp { + const message = createBaseEventSetIgp(); + message.igp_id = object.igp_id ?? ''; + message.owner = object.owner ?? ''; + message.new_owner = object.new_owner ?? ''; + message.renounce_ownership = object.renounce_ownership ?? false; + return message; + }, +}; + +function createBaseEventSetDestinationGasConfig(): EventSetDestinationGasConfig { + return { + igp_id: '', + owner: '', + remote_domain: 0, + gas_overhead: '', + gas_price: '', + token_exchange_rate: '', + }; +} + +export const EventSetDestinationGasConfig = { + encode( + message: EventSetDestinationGasConfig, + writer: _m0.Writer = _m0.Writer.create(), + ): _m0.Writer { + if (message.igp_id !== '') { + writer.uint32(10).string(message.igp_id); + } + if (message.owner !== '') { + writer.uint32(18).string(message.owner); + } + if (message.remote_domain !== 0) { + writer.uint32(32).uint32(message.remote_domain); + } + if (message.gas_overhead !== '') { + writer.uint32(42).string(message.gas_overhead); + } + if (message.gas_price !== '') { + writer.uint32(50).string(message.gas_price); + } + if (message.token_exchange_rate !== '') { + writer.uint32(58).string(message.token_exchange_rate); + } + return writer; + }, + + decode( + input: _m0.Reader | Uint8Array, + length?: number, + ): EventSetDestinationGasConfig { + const reader = + input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseEventSetDestinationGasConfig(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.igp_id = reader.string(); + continue; + case 2: + if (tag !== 18) { + break; + } + + message.owner = reader.string(); + continue; + case 4: + if (tag !== 32) { + break; + } + + message.remote_domain = reader.uint32(); + continue; + case 5: + if (tag !== 42) { + break; + } + + message.gas_overhead = reader.string(); + continue; + case 6: + if (tag !== 50) { + break; + } + + message.gas_price = reader.string(); + continue; + case 7: + if (tag !== 58) { + break; + } + + message.token_exchange_rate = reader.string(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): EventSetDestinationGasConfig { + return { + igp_id: isSet(object.igp_id) ? globalThis.String(object.igp_id) : '', + owner: isSet(object.owner) ? globalThis.String(object.owner) : '', + remote_domain: isSet(object.remote_domain) + ? globalThis.Number(object.remote_domain) + : 0, + gas_overhead: isSet(object.gas_overhead) + ? globalThis.String(object.gas_overhead) + : '', + gas_price: isSet(object.gas_price) + ? globalThis.String(object.gas_price) + : '', + token_exchange_rate: isSet(object.token_exchange_rate) + ? globalThis.String(object.token_exchange_rate) + : '', + }; + }, + + toJSON(message: EventSetDestinationGasConfig): unknown { + const obj: any = {}; + if (message.igp_id !== '') { + obj.igp_id = message.igp_id; + } + if (message.owner !== '') { + obj.owner = message.owner; + } + if (message.remote_domain !== 0) { + obj.remote_domain = Math.round(message.remote_domain); + } + if (message.gas_overhead !== '') { + obj.gas_overhead = message.gas_overhead; + } + if (message.gas_price !== '') { + obj.gas_price = message.gas_price; + } + if (message.token_exchange_rate !== '') { + obj.token_exchange_rate = message.token_exchange_rate; + } + return obj; + }, + + create, I>>( + base?: I, + ): EventSetDestinationGasConfig { + return EventSetDestinationGasConfig.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>( + object: I, + ): EventSetDestinationGasConfig { + const message = createBaseEventSetDestinationGasConfig(); + message.igp_id = object.igp_id ?? ''; + message.owner = object.owner ?? ''; + message.remote_domain = object.remote_domain ?? 0; + message.gas_overhead = object.gas_overhead ?? ''; + message.gas_price = object.gas_price ?? ''; + message.token_exchange_rate = object.token_exchange_rate ?? ''; + return message; + }, +}; + +function createBaseEventClaimIgp(): EventClaimIgp { + return { igp_id: '', owner: '', amount: '' }; +} + +export const EventClaimIgp = { + encode( + message: EventClaimIgp, + writer: _m0.Writer = _m0.Writer.create(), + ): _m0.Writer { + if (message.igp_id !== '') { + writer.uint32(10).string(message.igp_id); + } + if (message.owner !== '') { + writer.uint32(18).string(message.owner); + } + if (message.amount !== '') { + writer.uint32(26).string(message.amount); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): EventClaimIgp { + const reader = + input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseEventClaimIgp(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.igp_id = reader.string(); + continue; + case 2: + if (tag !== 18) { + break; + } + + message.owner = reader.string(); + continue; + case 3: + if (tag !== 26) { + break; + } + + message.amount = reader.string(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): EventClaimIgp { + return { + igp_id: isSet(object.igp_id) ? globalThis.String(object.igp_id) : '', + owner: isSet(object.owner) ? globalThis.String(object.owner) : '', + amount: isSet(object.amount) ? globalThis.String(object.amount) : '', + }; + }, + + toJSON(message: EventClaimIgp): unknown { + const obj: any = {}; + if (message.igp_id !== '') { + obj.igp_id = message.igp_id; + } + if (message.owner !== '') { + obj.owner = message.owner; + } + if (message.amount !== '') { + obj.amount = message.amount; + } + return obj; + }, + + create, I>>( + base?: I, + ): EventClaimIgp { + return EventClaimIgp.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>( + object: I, + ): EventClaimIgp { + const message = createBaseEventClaimIgp(); + message.igp_id = object.igp_id ?? ''; message.owner = object.owner ?? ''; + message.amount = object.amount ?? ''; return message; }, }; diff --git a/typescript/cosmos-types/src/types/hyperlane/core/post_dispatch/v1/tx.ts b/typescript/cosmos-types/src/types/hyperlane/core/post_dispatch/v1/tx.ts index 59008794b13..0ecb9b0bb1e 100644 --- a/typescript/cosmos-types/src/types/hyperlane/core/post_dispatch/v1/tx.ts +++ b/typescript/cosmos-types/src/types/hyperlane/core/post_dispatch/v1/tx.ts @@ -33,6 +33,8 @@ export interface MsgSetIgpOwner { igp_id: string; /** new_owner */ new_owner: string; + /** renounce_ownership */ + renounce_ownership: boolean; } /** MsgCreateIgpResponse ... */ @@ -255,7 +257,7 @@ export const MsgCreateIgpResponse = { }; function createBaseMsgSetIgpOwner(): MsgSetIgpOwner { - return { owner: '', igp_id: '', new_owner: '' }; + return { owner: '', igp_id: '', new_owner: '', renounce_ownership: false }; } export const MsgSetIgpOwner = { @@ -272,6 +274,9 @@ export const MsgSetIgpOwner = { if (message.new_owner !== '') { writer.uint32(26).string(message.new_owner); } + if (message.renounce_ownership !== false) { + writer.uint32(32).bool(message.renounce_ownership); + } return writer; }, @@ -304,6 +309,13 @@ export const MsgSetIgpOwner = { message.new_owner = reader.string(); continue; + case 4: + if (tag !== 32) { + break; + } + + message.renounce_ownership = reader.bool(); + continue; } if ((tag & 7) === 4 || tag === 0) { break; @@ -320,6 +332,9 @@ export const MsgSetIgpOwner = { new_owner: isSet(object.new_owner) ? globalThis.String(object.new_owner) : '', + renounce_ownership: isSet(object.renounce_ownership) + ? globalThis.Boolean(object.renounce_ownership) + : false, }; }, @@ -334,6 +349,9 @@ export const MsgSetIgpOwner = { if (message.new_owner !== '') { obj.new_owner = message.new_owner; } + if (message.renounce_ownership !== false) { + obj.renounce_ownership = message.renounce_ownership; + } return obj; }, @@ -349,6 +367,7 @@ export const MsgSetIgpOwner = { message.owner = object.owner ?? ''; message.igp_id = object.igp_id ?? ''; message.new_owner = object.new_owner ?? ''; + message.renounce_ownership = object.renounce_ownership ?? false; return message; }, }; diff --git a/typescript/cosmos-types/src/types/hyperlane/core/v1/events.ts b/typescript/cosmos-types/src/types/hyperlane/core/v1/events.ts index dccda5b49ec..978f3c567e9 100644 --- a/typescript/cosmos-types/src/types/hyperlane/core/v1/events.ts +++ b/typescript/cosmos-types/src/types/hyperlane/core/v1/events.ts @@ -8,8 +8,8 @@ import _m0 from 'protobufjs/minimal.js'; export const protobufPackage = 'hyperlane.core.v1'; -/** Dispatch ... */ -export interface Dispatch { +/** EventDispatch ... */ +export interface EventDispatch { /** origin_mailbox_id ... */ origin_mailbox_id: string; /** sender ... */ @@ -22,8 +22,8 @@ export interface Dispatch { message: string; } -/** Process ... */ -export interface Process { +/** EventProcess ... */ +export interface EventProcess { /** origin_mailbox_id ... */ origin_mailbox_id: string; /** origin ... */ @@ -38,7 +38,39 @@ export interface Process { message: string; } -function createBaseDispatch(): Dispatch { +/** EventCreateMailbox ... */ +export interface EventCreateMailbox { + /** mailbox_id ... */ + mailbox_id: string; + /** owner ... */ + owner: string; + /** default_ism ... */ + default_ism: string; + /** default_hook ... */ + default_hook: string; + /** required_hook ... */ + required_hook: string; + /** local_domain ... */ + local_domain: number; +} + +/** EventSetMailbox ... */ +export interface EventSetMailbox { + /** mailbox_id ... */ + mailbox_id: string; + /** owner ... */ + owner: string; + /** default_ism ... */ + default_ism: string; + /** default_hook ... */ + default_hook: string; + /** new_owner ... */ + new_owner: string; + /** renounce_ownership ... */ + renounce_ownership: boolean; +} + +function createBaseEventDispatch(): EventDispatch { return { origin_mailbox_id: '', sender: '', @@ -48,9 +80,9 @@ function createBaseDispatch(): Dispatch { }; } -export const Dispatch = { +export const EventDispatch = { encode( - message: Dispatch, + message: EventDispatch, writer: _m0.Writer = _m0.Writer.create(), ): _m0.Writer { if (message.origin_mailbox_id !== '') { @@ -71,11 +103,11 @@ export const Dispatch = { return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): Dispatch { + decode(input: _m0.Reader | Uint8Array, length?: number): EventDispatch { const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseDispatch(); + const message = createBaseEventDispatch(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { @@ -123,7 +155,7 @@ export const Dispatch = { return message; }, - fromJSON(object: any): Dispatch { + fromJSON(object: any): EventDispatch { return { origin_mailbox_id: isSet(object.origin_mailbox_id) ? globalThis.String(object.origin_mailbox_id) @@ -139,7 +171,7 @@ export const Dispatch = { }; }, - toJSON(message: Dispatch): unknown { + toJSON(message: EventDispatch): unknown { const obj: any = {}; if (message.origin_mailbox_id !== '') { obj.origin_mailbox_id = message.origin_mailbox_id; @@ -159,11 +191,15 @@ export const Dispatch = { return obj; }, - create, I>>(base?: I): Dispatch { - return Dispatch.fromPartial(base ?? ({} as any)); + create, I>>( + base?: I, + ): EventDispatch { + return EventDispatch.fromPartial(base ?? ({} as any)); }, - fromPartial, I>>(object: I): Dispatch { - const message = createBaseDispatch(); + fromPartial, I>>( + object: I, + ): EventDispatch { + const message = createBaseEventDispatch(); message.origin_mailbox_id = object.origin_mailbox_id ?? ''; message.sender = object.sender ?? ''; message.destination = object.destination ?? 0; @@ -173,7 +209,7 @@ export const Dispatch = { }, }; -function createBaseProcess(): Process { +function createBaseEventProcess(): EventProcess { return { origin_mailbox_id: '', origin: 0, @@ -184,9 +220,9 @@ function createBaseProcess(): Process { }; } -export const Process = { +export const EventProcess = { encode( - message: Process, + message: EventProcess, writer: _m0.Writer = _m0.Writer.create(), ): _m0.Writer { if (message.origin_mailbox_id !== '') { @@ -210,11 +246,11 @@ export const Process = { return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): Process { + decode(input: _m0.Reader | Uint8Array, length?: number): EventProcess { const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseProcess(); + const message = createBaseEventProcess(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { @@ -269,7 +305,7 @@ export const Process = { return message; }, - fromJSON(object: any): Process { + fromJSON(object: any): EventProcess { return { origin_mailbox_id: isSet(object.origin_mailbox_id) ? globalThis.String(object.origin_mailbox_id) @@ -286,7 +322,7 @@ export const Process = { }; }, - toJSON(message: Process): unknown { + toJSON(message: EventProcess): unknown { const obj: any = {}; if (message.origin_mailbox_id !== '') { obj.origin_mailbox_id = message.origin_mailbox_id; @@ -309,11 +345,15 @@ export const Process = { return obj; }, - create, I>>(base?: I): Process { - return Process.fromPartial(base ?? ({} as any)); + create, I>>( + base?: I, + ): EventProcess { + return EventProcess.fromPartial(base ?? ({} as any)); }, - fromPartial, I>>(object: I): Process { - const message = createBaseProcess(); + fromPartial, I>>( + object: I, + ): EventProcess { + const message = createBaseEventProcess(); message.origin_mailbox_id = object.origin_mailbox_id ?? ''; message.origin = object.origin ?? 0; message.sender = object.sender ?? ''; @@ -324,6 +364,324 @@ export const Process = { }, }; +function createBaseEventCreateMailbox(): EventCreateMailbox { + return { + mailbox_id: '', + owner: '', + default_ism: '', + default_hook: '', + required_hook: '', + local_domain: 0, + }; +} + +export const EventCreateMailbox = { + encode( + message: EventCreateMailbox, + writer: _m0.Writer = _m0.Writer.create(), + ): _m0.Writer { + if (message.mailbox_id !== '') { + writer.uint32(10).string(message.mailbox_id); + } + if (message.owner !== '') { + writer.uint32(18).string(message.owner); + } + if (message.default_ism !== '') { + writer.uint32(26).string(message.default_ism); + } + if (message.default_hook !== '') { + writer.uint32(34).string(message.default_hook); + } + if (message.required_hook !== '') { + writer.uint32(42).string(message.required_hook); + } + if (message.local_domain !== 0) { + writer.uint32(48).uint32(message.local_domain); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): EventCreateMailbox { + const reader = + input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseEventCreateMailbox(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.mailbox_id = reader.string(); + continue; + case 2: + if (tag !== 18) { + break; + } + + message.owner = reader.string(); + continue; + case 3: + if (tag !== 26) { + break; + } + + message.default_ism = reader.string(); + continue; + case 4: + if (tag !== 34) { + break; + } + + message.default_hook = reader.string(); + continue; + case 5: + if (tag !== 42) { + break; + } + + message.required_hook = reader.string(); + continue; + case 6: + if (tag !== 48) { + break; + } + + message.local_domain = reader.uint32(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): EventCreateMailbox { + return { + mailbox_id: isSet(object.mailbox_id) + ? globalThis.String(object.mailbox_id) + : '', + owner: isSet(object.owner) ? globalThis.String(object.owner) : '', + default_ism: isSet(object.default_ism) + ? globalThis.String(object.default_ism) + : '', + default_hook: isSet(object.default_hook) + ? globalThis.String(object.default_hook) + : '', + required_hook: isSet(object.required_hook) + ? globalThis.String(object.required_hook) + : '', + local_domain: isSet(object.local_domain) + ? globalThis.Number(object.local_domain) + : 0, + }; + }, + + toJSON(message: EventCreateMailbox): unknown { + const obj: any = {}; + if (message.mailbox_id !== '') { + obj.mailbox_id = message.mailbox_id; + } + if (message.owner !== '') { + obj.owner = message.owner; + } + if (message.default_ism !== '') { + obj.default_ism = message.default_ism; + } + if (message.default_hook !== '') { + obj.default_hook = message.default_hook; + } + if (message.required_hook !== '') { + obj.required_hook = message.required_hook; + } + if (message.local_domain !== 0) { + obj.local_domain = Math.round(message.local_domain); + } + return obj; + }, + + create, I>>( + base?: I, + ): EventCreateMailbox { + return EventCreateMailbox.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>( + object: I, + ): EventCreateMailbox { + const message = createBaseEventCreateMailbox(); + message.mailbox_id = object.mailbox_id ?? ''; + message.owner = object.owner ?? ''; + message.default_ism = object.default_ism ?? ''; + message.default_hook = object.default_hook ?? ''; + message.required_hook = object.required_hook ?? ''; + message.local_domain = object.local_domain ?? 0; + return message; + }, +}; + +function createBaseEventSetMailbox(): EventSetMailbox { + return { + mailbox_id: '', + owner: '', + default_ism: '', + default_hook: '', + new_owner: '', + renounce_ownership: false, + }; +} + +export const EventSetMailbox = { + encode( + message: EventSetMailbox, + writer: _m0.Writer = _m0.Writer.create(), + ): _m0.Writer { + if (message.mailbox_id !== '') { + writer.uint32(10).string(message.mailbox_id); + } + if (message.owner !== '') { + writer.uint32(18).string(message.owner); + } + if (message.default_ism !== '') { + writer.uint32(26).string(message.default_ism); + } + if (message.default_hook !== '') { + writer.uint32(34).string(message.default_hook); + } + if (message.new_owner !== '') { + writer.uint32(42).string(message.new_owner); + } + if (message.renounce_ownership !== false) { + writer.uint32(48).bool(message.renounce_ownership); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): EventSetMailbox { + const reader = + input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseEventSetMailbox(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.mailbox_id = reader.string(); + continue; + case 2: + if (tag !== 18) { + break; + } + + message.owner = reader.string(); + continue; + case 3: + if (tag !== 26) { + break; + } + + message.default_ism = reader.string(); + continue; + case 4: + if (tag !== 34) { + break; + } + + message.default_hook = reader.string(); + continue; + case 5: + if (tag !== 42) { + break; + } + + message.new_owner = reader.string(); + continue; + case 6: + if (tag !== 48) { + break; + } + + message.renounce_ownership = reader.bool(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): EventSetMailbox { + return { + mailbox_id: isSet(object.mailbox_id) + ? globalThis.String(object.mailbox_id) + : '', + owner: isSet(object.owner) ? globalThis.String(object.owner) : '', + default_ism: isSet(object.default_ism) + ? globalThis.String(object.default_ism) + : '', + default_hook: isSet(object.default_hook) + ? globalThis.String(object.default_hook) + : '', + new_owner: isSet(object.new_owner) + ? globalThis.String(object.new_owner) + : '', + renounce_ownership: isSet(object.renounce_ownership) + ? globalThis.Boolean(object.renounce_ownership) + : false, + }; + }, + + toJSON(message: EventSetMailbox): unknown { + const obj: any = {}; + if (message.mailbox_id !== '') { + obj.mailbox_id = message.mailbox_id; + } + if (message.owner !== '') { + obj.owner = message.owner; + } + if (message.default_ism !== '') { + obj.default_ism = message.default_ism; + } + if (message.default_hook !== '') { + obj.default_hook = message.default_hook; + } + if (message.new_owner !== '') { + obj.new_owner = message.new_owner; + } + if (message.renounce_ownership !== false) { + obj.renounce_ownership = message.renounce_ownership; + } + return obj; + }, + + create, I>>( + base?: I, + ): EventSetMailbox { + return EventSetMailbox.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>( + object: I, + ): EventSetMailbox { + const message = createBaseEventSetMailbox(); + message.mailbox_id = object.mailbox_id ?? ''; + message.owner = object.owner ?? ''; + message.default_ism = object.default_ism ?? ''; + message.default_hook = object.default_hook ?? ''; + message.new_owner = object.new_owner ?? ''; + message.renounce_ownership = object.renounce_ownership ?? false; + return message; + }, +}; + type Builtin = | Date | Function diff --git a/typescript/cosmos-types/src/types/hyperlane/core/v1/query.ts b/typescript/cosmos-types/src/types/hyperlane/core/v1/query.ts index 0c0868a9400..4c4df99ccb6 100644 --- a/typescript/cosmos-types/src/types/hyperlane/core/v1/query.ts +++ b/typescript/cosmos-types/src/types/hyperlane/core/v1/query.ts @@ -64,6 +64,7 @@ export interface QueryVerifyDryRunRequest { ism_id: string; message: string; metadata: string; + gas_limit: string; } /** QueryVerifyDryRunResponse ... */ @@ -71,6 +72,30 @@ export interface QueryVerifyDryRunResponse { verified: boolean; } +/** QueryRegisteredISMs ... */ +export interface QueryRegisteredISMs {} + +/** QueryRegisteredISMsResponse ... */ +export interface QueryRegisteredISMsResponse { + ids: number[]; +} + +/** QueryRegisteredHooks ... */ +export interface QueryRegisteredHooks {} + +/** QueryRegisteredHooksResponse ... */ +export interface QueryRegisteredHooksResponse { + ids: number[]; +} + +/** QueryRegisteredApps ... */ +export interface QueryRegisteredApps {} + +/** QueryRegisteredAppsResponse ... */ +export interface QueryRegisteredAppsResponse { + ids: number[]; +} + function createBaseQueryMailboxesRequest(): QueryMailboxesRequest { return { pagination: undefined }; } @@ -684,7 +709,7 @@ export const QueryRecipientIsmResponse = { }; function createBaseQueryVerifyDryRunRequest(): QueryVerifyDryRunRequest { - return { ism_id: '', message: '', metadata: '' }; + return { ism_id: '', message: '', metadata: '', gas_limit: '' }; } export const QueryVerifyDryRunRequest = { @@ -701,6 +726,9 @@ export const QueryVerifyDryRunRequest = { if (message.metadata !== '') { writer.uint32(26).string(message.metadata); } + if (message.gas_limit !== '') { + writer.uint32(34).string(message.gas_limit); + } return writer; }, @@ -736,6 +764,13 @@ export const QueryVerifyDryRunRequest = { message.metadata = reader.string(); continue; + case 4: + if (tag !== 34) { + break; + } + + message.gas_limit = reader.string(); + continue; } if ((tag & 7) === 4 || tag === 0) { break; @@ -752,6 +787,9 @@ export const QueryVerifyDryRunRequest = { metadata: isSet(object.metadata) ? globalThis.String(object.metadata) : '', + gas_limit: isSet(object.gas_limit) + ? globalThis.String(object.gas_limit) + : '', }; }, @@ -766,6 +804,9 @@ export const QueryVerifyDryRunRequest = { if (message.metadata !== '') { obj.metadata = message.metadata; } + if (message.gas_limit !== '') { + obj.gas_limit = message.gas_limit; + } return obj; }, @@ -781,6 +822,7 @@ export const QueryVerifyDryRunRequest = { message.ism_id = object.ism_id ?? ''; message.message = object.message ?? ''; message.metadata = object.metadata ?? ''; + message.gas_limit = object.gas_limit ?? ''; return message; }, }; @@ -857,6 +899,414 @@ export const QueryVerifyDryRunResponse = { }, }; +function createBaseQueryRegisteredISMs(): QueryRegisteredISMs { + return {}; +} + +export const QueryRegisteredISMs = { + encode( + _: QueryRegisteredISMs, + writer: _m0.Writer = _m0.Writer.create(), + ): _m0.Writer { + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): QueryRegisteredISMs { + const reader = + input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseQueryRegisteredISMs(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(_: any): QueryRegisteredISMs { + return {}; + }, + + toJSON(_: QueryRegisteredISMs): unknown { + const obj: any = {}; + return obj; + }, + + create, I>>( + base?: I, + ): QueryRegisteredISMs { + return QueryRegisteredISMs.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>( + _: I, + ): QueryRegisteredISMs { + const message = createBaseQueryRegisteredISMs(); + return message; + }, +}; + +function createBaseQueryRegisteredISMsResponse(): QueryRegisteredISMsResponse { + return { ids: [] }; +} + +export const QueryRegisteredISMsResponse = { + encode( + message: QueryRegisteredISMsResponse, + writer: _m0.Writer = _m0.Writer.create(), + ): _m0.Writer { + writer.uint32(10).fork(); + for (const v of message.ids) { + writer.uint32(v); + } + writer.ldelim(); + return writer; + }, + + decode( + input: _m0.Reader | Uint8Array, + length?: number, + ): QueryRegisteredISMsResponse { + const reader = + input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseQueryRegisteredISMsResponse(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag === 8) { + message.ids.push(reader.uint32()); + + continue; + } + + if (tag === 10) { + const end2 = reader.uint32() + reader.pos; + while (reader.pos < end2) { + message.ids.push(reader.uint32()); + } + + continue; + } + + break; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): QueryRegisteredISMsResponse { + return { + ids: globalThis.Array.isArray(object?.ids) + ? object.ids.map((e: any) => globalThis.Number(e)) + : [], + }; + }, + + toJSON(message: QueryRegisteredISMsResponse): unknown { + const obj: any = {}; + if (message.ids?.length) { + obj.ids = message.ids.map((e) => Math.round(e)); + } + return obj; + }, + + create, I>>( + base?: I, + ): QueryRegisteredISMsResponse { + return QueryRegisteredISMsResponse.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>( + object: I, + ): QueryRegisteredISMsResponse { + const message = createBaseQueryRegisteredISMsResponse(); + message.ids = object.ids?.map((e) => e) || []; + return message; + }, +}; + +function createBaseQueryRegisteredHooks(): QueryRegisteredHooks { + return {}; +} + +export const QueryRegisteredHooks = { + encode( + _: QueryRegisteredHooks, + writer: _m0.Writer = _m0.Writer.create(), + ): _m0.Writer { + return writer; + }, + + decode( + input: _m0.Reader | Uint8Array, + length?: number, + ): QueryRegisteredHooks { + const reader = + input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseQueryRegisteredHooks(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(_: any): QueryRegisteredHooks { + return {}; + }, + + toJSON(_: QueryRegisteredHooks): unknown { + const obj: any = {}; + return obj; + }, + + create, I>>( + base?: I, + ): QueryRegisteredHooks { + return QueryRegisteredHooks.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>( + _: I, + ): QueryRegisteredHooks { + const message = createBaseQueryRegisteredHooks(); + return message; + }, +}; + +function createBaseQueryRegisteredHooksResponse(): QueryRegisteredHooksResponse { + return { ids: [] }; +} + +export const QueryRegisteredHooksResponse = { + encode( + message: QueryRegisteredHooksResponse, + writer: _m0.Writer = _m0.Writer.create(), + ): _m0.Writer { + writer.uint32(10).fork(); + for (const v of message.ids) { + writer.uint32(v); + } + writer.ldelim(); + return writer; + }, + + decode( + input: _m0.Reader | Uint8Array, + length?: number, + ): QueryRegisteredHooksResponse { + const reader = + input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseQueryRegisteredHooksResponse(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag === 8) { + message.ids.push(reader.uint32()); + + continue; + } + + if (tag === 10) { + const end2 = reader.uint32() + reader.pos; + while (reader.pos < end2) { + message.ids.push(reader.uint32()); + } + + continue; + } + + break; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): QueryRegisteredHooksResponse { + return { + ids: globalThis.Array.isArray(object?.ids) + ? object.ids.map((e: any) => globalThis.Number(e)) + : [], + }; + }, + + toJSON(message: QueryRegisteredHooksResponse): unknown { + const obj: any = {}; + if (message.ids?.length) { + obj.ids = message.ids.map((e) => Math.round(e)); + } + return obj; + }, + + create, I>>( + base?: I, + ): QueryRegisteredHooksResponse { + return QueryRegisteredHooksResponse.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>( + object: I, + ): QueryRegisteredHooksResponse { + const message = createBaseQueryRegisteredHooksResponse(); + message.ids = object.ids?.map((e) => e) || []; + return message; + }, +}; + +function createBaseQueryRegisteredApps(): QueryRegisteredApps { + return {}; +} + +export const QueryRegisteredApps = { + encode( + _: QueryRegisteredApps, + writer: _m0.Writer = _m0.Writer.create(), + ): _m0.Writer { + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): QueryRegisteredApps { + const reader = + input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseQueryRegisteredApps(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(_: any): QueryRegisteredApps { + return {}; + }, + + toJSON(_: QueryRegisteredApps): unknown { + const obj: any = {}; + return obj; + }, + + create, I>>( + base?: I, + ): QueryRegisteredApps { + return QueryRegisteredApps.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>( + _: I, + ): QueryRegisteredApps { + const message = createBaseQueryRegisteredApps(); + return message; + }, +}; + +function createBaseQueryRegisteredAppsResponse(): QueryRegisteredAppsResponse { + return { ids: [] }; +} + +export const QueryRegisteredAppsResponse = { + encode( + message: QueryRegisteredAppsResponse, + writer: _m0.Writer = _m0.Writer.create(), + ): _m0.Writer { + writer.uint32(10).fork(); + for (const v of message.ids) { + writer.uint32(v); + } + writer.ldelim(); + return writer; + }, + + decode( + input: _m0.Reader | Uint8Array, + length?: number, + ): QueryRegisteredAppsResponse { + const reader = + input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseQueryRegisteredAppsResponse(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag === 8) { + message.ids.push(reader.uint32()); + + continue; + } + + if (tag === 10) { + const end2 = reader.uint32() + reader.pos; + while (reader.pos < end2) { + message.ids.push(reader.uint32()); + } + + continue; + } + + break; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): QueryRegisteredAppsResponse { + return { + ids: globalThis.Array.isArray(object?.ids) + ? object.ids.map((e: any) => globalThis.Number(e)) + : [], + }; + }, + + toJSON(message: QueryRegisteredAppsResponse): unknown { + const obj: any = {}; + if (message.ids?.length) { + obj.ids = message.ids.map((e) => Math.round(e)); + } + return obj; + }, + + create, I>>( + base?: I, + ): QueryRegisteredAppsResponse { + return QueryRegisteredAppsResponse.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>( + object: I, + ): QueryRegisteredAppsResponse { + const message = createBaseQueryRegisteredAppsResponse(); + message.ids = object.ids?.map((e) => e) || []; + return message; + }, +}; + /** Query defines the module Query service. */ export interface Query { /** Mailboxes ... */ @@ -879,6 +1329,18 @@ export interface Query { VerifyDryRun( request: QueryVerifyDryRunRequest, ): Promise; + /** RegisteredISMs ... */ + RegisteredISMs( + request: QueryRegisteredISMs, + ): Promise; + /** RegisteredHooks ... */ + RegisteredHooks( + request: QueryRegisteredHooks, + ): Promise; + /** RegisteredApps ... */ + RegisteredApps( + request: QueryRegisteredApps, + ): Promise; } export const QueryServiceName = 'hyperlane.core.v1.Query'; @@ -893,6 +1355,9 @@ export class QueryClientImpl implements Query { this.Delivered = this.Delivered.bind(this); this.RecipientIsm = this.RecipientIsm.bind(this); this.VerifyDryRun = this.VerifyDryRun.bind(this); + this.RegisteredISMs = this.RegisteredISMs.bind(this); + this.RegisteredHooks = this.RegisteredHooks.bind(this); + this.RegisteredApps = this.RegisteredApps.bind(this); } Mailboxes(request: QueryMailboxesRequest): Promise { const data = QueryMailboxesRequest.encode(request).finish(); @@ -937,6 +1402,36 @@ export class QueryClientImpl implements Query { QueryVerifyDryRunResponse.decode(_m0.Reader.create(data)), ); } + + RegisteredISMs( + request: QueryRegisteredISMs, + ): Promise { + const data = QueryRegisteredISMs.encode(request).finish(); + const promise = this.rpc.request(this.service, 'RegisteredISMs', data); + return promise.then((data) => + QueryRegisteredISMsResponse.decode(_m0.Reader.create(data)), + ); + } + + RegisteredHooks( + request: QueryRegisteredHooks, + ): Promise { + const data = QueryRegisteredHooks.encode(request).finish(); + const promise = this.rpc.request(this.service, 'RegisteredHooks', data); + return promise.then((data) => + QueryRegisteredHooksResponse.decode(_m0.Reader.create(data)), + ); + } + + RegisteredApps( + request: QueryRegisteredApps, + ): Promise { + const data = QueryRegisteredApps.encode(request).finish(); + const promise = this.rpc.request(this.service, 'RegisteredApps', data); + return promise.then((data) => + QueryRegisteredAppsResponse.decode(_m0.Reader.create(data)), + ); + } } interface Rpc { diff --git a/typescript/cosmos-types/src/types/hyperlane/core/v1/tx.ts b/typescript/cosmos-types/src/types/hyperlane/core/v1/tx.ts index 6a705b8f4e0..faca55890a8 100644 --- a/typescript/cosmos-types/src/types/hyperlane/core/v1/tx.ts +++ b/typescript/cosmos-types/src/types/hyperlane/core/v1/tx.ts @@ -40,6 +40,8 @@ export interface MsgSetMailbox { required_hook: string; /** new_owner ... */ new_owner: string; + /** renounce_ownership */ + renounce_ownership: boolean; } /** MsgSetMailboxResponse ... */ @@ -277,6 +279,7 @@ function createBaseMsgSetMailbox(): MsgSetMailbox { default_hook: '', required_hook: '', new_owner: '', + renounce_ownership: false, }; } @@ -303,6 +306,9 @@ export const MsgSetMailbox = { if (message.new_owner !== '') { writer.uint32(50).string(message.new_owner); } + if (message.renounce_ownership !== false) { + writer.uint32(56).bool(message.renounce_ownership); + } return writer; }, @@ -356,6 +362,13 @@ export const MsgSetMailbox = { message.new_owner = reader.string(); continue; + case 7: + if (tag !== 56) { + break; + } + + message.renounce_ownership = reader.bool(); + continue; } if ((tag & 7) === 4 || tag === 0) { break; @@ -383,6 +396,9 @@ export const MsgSetMailbox = { new_owner: isSet(object.new_owner) ? globalThis.String(object.new_owner) : '', + renounce_ownership: isSet(object.renounce_ownership) + ? globalThis.Boolean(object.renounce_ownership) + : false, }; }, @@ -406,6 +422,9 @@ export const MsgSetMailbox = { if (message.new_owner !== '') { obj.new_owner = message.new_owner; } + if (message.renounce_ownership !== false) { + obj.renounce_ownership = message.renounce_ownership; + } return obj; }, @@ -424,6 +443,7 @@ export const MsgSetMailbox = { message.default_hook = object.default_hook ?? ''; message.required_hook = object.required_hook ?? ''; message.new_owner = object.new_owner ?? ''; + message.renounce_ownership = object.renounce_ownership ?? false; return message; }, }; diff --git a/typescript/cosmos-types/src/types/hyperlane/warp/v1/events.ts b/typescript/cosmos-types/src/types/hyperlane/warp/v1/events.ts index 24a727f745d..4fc9c0d21a7 100644 --- a/typescript/cosmos-types/src/types/hyperlane/warp/v1/events.ts +++ b/typescript/cosmos-types/src/types/hyperlane/warp/v1/events.ts @@ -8,51 +8,770 @@ import _m0 from 'protobufjs/minimal.js'; export const protobufPackage = 'hyperlane.warp.v1'; -/** RemoteTransfer ... */ -export interface RemoteTransfer { +/** EventCreateSyntheticToken ... */ +export interface EventCreateSyntheticToken { + token_id: string; + owner: string; + origin_mailbox: string; + origin_denom: string; +} + +/** EventCreateCollateralToken ... */ +export interface EventCreateCollateralToken { + token_id: string; + owner: string; + origin_mailbox: string; + origin_denom: string; +} + +/** EventSetToken ... */ +export interface EventSetToken { + token_id: string; + owner: string; + ism_id: string; + new_owner: string; + renounce_ownership: boolean; +} + +/** EventEnrollRemoteRouter ... */ +export interface EventEnrollRemoteRouter { + token_id: string; + owner: string; + receiver_domain: number; + receiver_contract: string; + gas: string; +} + +/** EventUnrollRemoteRouter ... */ +export interface EventUnrollRemoteRouter { + token_id: string; + owner: string; + receiver_domain: number; +} + +/** EventSendRemoteTransfer ... */ +export interface EventSendRemoteTransfer { + token_id: string; + sender: string; destination_domain: number; - recipient_address: string; + recipient: string; + amount: string; +} + +/** EventReceiveRemoteTransfer ... */ +export interface EventReceiveRemoteTransfer { + token_id: string; + sender: string; + origin_domain: number; + recipient: string; + amount: string; +} + +function createBaseEventCreateSyntheticToken(): EventCreateSyntheticToken { + return { token_id: '', owner: '', origin_mailbox: '', origin_denom: '' }; +} + +export const EventCreateSyntheticToken = { + encode( + message: EventCreateSyntheticToken, + writer: _m0.Writer = _m0.Writer.create(), + ): _m0.Writer { + if (message.token_id !== '') { + writer.uint32(10).string(message.token_id); + } + if (message.owner !== '') { + writer.uint32(18).string(message.owner); + } + if (message.origin_mailbox !== '') { + writer.uint32(26).string(message.origin_mailbox); + } + if (message.origin_denom !== '') { + writer.uint32(34).string(message.origin_denom); + } + return writer; + }, + + decode( + input: _m0.Reader | Uint8Array, + length?: number, + ): EventCreateSyntheticToken { + const reader = + input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseEventCreateSyntheticToken(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.token_id = reader.string(); + continue; + case 2: + if (tag !== 18) { + break; + } + + message.owner = reader.string(); + continue; + case 3: + if (tag !== 26) { + break; + } + + message.origin_mailbox = reader.string(); + continue; + case 4: + if (tag !== 34) { + break; + } + + message.origin_denom = reader.string(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): EventCreateSyntheticToken { + return { + token_id: isSet(object.token_id) + ? globalThis.String(object.token_id) + : '', + owner: isSet(object.owner) ? globalThis.String(object.owner) : '', + origin_mailbox: isSet(object.origin_mailbox) + ? globalThis.String(object.origin_mailbox) + : '', + origin_denom: isSet(object.origin_denom) + ? globalThis.String(object.origin_denom) + : '', + }; + }, + + toJSON(message: EventCreateSyntheticToken): unknown { + const obj: any = {}; + if (message.token_id !== '') { + obj.token_id = message.token_id; + } + if (message.owner !== '') { + obj.owner = message.owner; + } + if (message.origin_mailbox !== '') { + obj.origin_mailbox = message.origin_mailbox; + } + if (message.origin_denom !== '') { + obj.origin_denom = message.origin_denom; + } + return obj; + }, + + create, I>>( + base?: I, + ): EventCreateSyntheticToken { + return EventCreateSyntheticToken.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>( + object: I, + ): EventCreateSyntheticToken { + const message = createBaseEventCreateSyntheticToken(); + message.token_id = object.token_id ?? ''; + message.owner = object.owner ?? ''; + message.origin_mailbox = object.origin_mailbox ?? ''; + message.origin_denom = object.origin_denom ?? ''; + return message; + }, +}; + +function createBaseEventCreateCollateralToken(): EventCreateCollateralToken { + return { token_id: '', owner: '', origin_mailbox: '', origin_denom: '' }; +} + +export const EventCreateCollateralToken = { + encode( + message: EventCreateCollateralToken, + writer: _m0.Writer = _m0.Writer.create(), + ): _m0.Writer { + if (message.token_id !== '') { + writer.uint32(10).string(message.token_id); + } + if (message.owner !== '') { + writer.uint32(18).string(message.owner); + } + if (message.origin_mailbox !== '') { + writer.uint32(26).string(message.origin_mailbox); + } + if (message.origin_denom !== '') { + writer.uint32(34).string(message.origin_denom); + } + return writer; + }, + + decode( + input: _m0.Reader | Uint8Array, + length?: number, + ): EventCreateCollateralToken { + const reader = + input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseEventCreateCollateralToken(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.token_id = reader.string(); + continue; + case 2: + if (tag !== 18) { + break; + } + + message.owner = reader.string(); + continue; + case 3: + if (tag !== 26) { + break; + } + + message.origin_mailbox = reader.string(); + continue; + case 4: + if (tag !== 34) { + break; + } + + message.origin_denom = reader.string(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): EventCreateCollateralToken { + return { + token_id: isSet(object.token_id) + ? globalThis.String(object.token_id) + : '', + owner: isSet(object.owner) ? globalThis.String(object.owner) : '', + origin_mailbox: isSet(object.origin_mailbox) + ? globalThis.String(object.origin_mailbox) + : '', + origin_denom: isSet(object.origin_denom) + ? globalThis.String(object.origin_denom) + : '', + }; + }, + + toJSON(message: EventCreateCollateralToken): unknown { + const obj: any = {}; + if (message.token_id !== '') { + obj.token_id = message.token_id; + } + if (message.owner !== '') { + obj.owner = message.owner; + } + if (message.origin_mailbox !== '') { + obj.origin_mailbox = message.origin_mailbox; + } + if (message.origin_denom !== '') { + obj.origin_denom = message.origin_denom; + } + return obj; + }, + + create, I>>( + base?: I, + ): EventCreateCollateralToken { + return EventCreateCollateralToken.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>( + object: I, + ): EventCreateCollateralToken { + const message = createBaseEventCreateCollateralToken(); + message.token_id = object.token_id ?? ''; + message.owner = object.owner ?? ''; + message.origin_mailbox = object.origin_mailbox ?? ''; + message.origin_denom = object.origin_denom ?? ''; + return message; + }, +}; + +function createBaseEventSetToken(): EventSetToken { + return { + token_id: '', + owner: '', + ism_id: '', + new_owner: '', + renounce_ownership: false, + }; } -function createBaseRemoteTransfer(): RemoteTransfer { - return { destination_domain: 0, recipient_address: '' }; +export const EventSetToken = { + encode( + message: EventSetToken, + writer: _m0.Writer = _m0.Writer.create(), + ): _m0.Writer { + if (message.token_id !== '') { + writer.uint32(10).string(message.token_id); + } + if (message.owner !== '') { + writer.uint32(18).string(message.owner); + } + if (message.ism_id !== '') { + writer.uint32(26).string(message.ism_id); + } + if (message.new_owner !== '') { + writer.uint32(34).string(message.new_owner); + } + if (message.renounce_ownership !== false) { + writer.uint32(40).bool(message.renounce_ownership); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): EventSetToken { + const reader = + input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseEventSetToken(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.token_id = reader.string(); + continue; + case 2: + if (tag !== 18) { + break; + } + + message.owner = reader.string(); + continue; + case 3: + if (tag !== 26) { + break; + } + + message.ism_id = reader.string(); + continue; + case 4: + if (tag !== 34) { + break; + } + + message.new_owner = reader.string(); + continue; + case 5: + if (tag !== 40) { + break; + } + + message.renounce_ownership = reader.bool(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): EventSetToken { + return { + token_id: isSet(object.token_id) + ? globalThis.String(object.token_id) + : '', + owner: isSet(object.owner) ? globalThis.String(object.owner) : '', + ism_id: isSet(object.ism_id) ? globalThis.String(object.ism_id) : '', + new_owner: isSet(object.new_owner) + ? globalThis.String(object.new_owner) + : '', + renounce_ownership: isSet(object.renounce_ownership) + ? globalThis.Boolean(object.renounce_ownership) + : false, + }; + }, + + toJSON(message: EventSetToken): unknown { + const obj: any = {}; + if (message.token_id !== '') { + obj.token_id = message.token_id; + } + if (message.owner !== '') { + obj.owner = message.owner; + } + if (message.ism_id !== '') { + obj.ism_id = message.ism_id; + } + if (message.new_owner !== '') { + obj.new_owner = message.new_owner; + } + if (message.renounce_ownership !== false) { + obj.renounce_ownership = message.renounce_ownership; + } + return obj; + }, + + create, I>>( + base?: I, + ): EventSetToken { + return EventSetToken.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>( + object: I, + ): EventSetToken { + const message = createBaseEventSetToken(); + message.token_id = object.token_id ?? ''; + message.owner = object.owner ?? ''; + message.ism_id = object.ism_id ?? ''; + message.new_owner = object.new_owner ?? ''; + message.renounce_ownership = object.renounce_ownership ?? false; + return message; + }, +}; + +function createBaseEventEnrollRemoteRouter(): EventEnrollRemoteRouter { + return { + token_id: '', + owner: '', + receiver_domain: 0, + receiver_contract: '', + gas: '', + }; } -export const RemoteTransfer = { +export const EventEnrollRemoteRouter = { encode( - message: RemoteTransfer, + message: EventEnrollRemoteRouter, writer: _m0.Writer = _m0.Writer.create(), ): _m0.Writer { + if (message.token_id !== '') { + writer.uint32(10).string(message.token_id); + } + if (message.owner !== '') { + writer.uint32(18).string(message.owner); + } + if (message.receiver_domain !== 0) { + writer.uint32(24).uint32(message.receiver_domain); + } + if (message.receiver_contract !== '') { + writer.uint32(34).string(message.receiver_contract); + } + if (message.gas !== '') { + writer.uint32(42).string(message.gas); + } + return writer; + }, + + decode( + input: _m0.Reader | Uint8Array, + length?: number, + ): EventEnrollRemoteRouter { + const reader = + input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseEventEnrollRemoteRouter(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.token_id = reader.string(); + continue; + case 2: + if (tag !== 18) { + break; + } + + message.owner = reader.string(); + continue; + case 3: + if (tag !== 24) { + break; + } + + message.receiver_domain = reader.uint32(); + continue; + case 4: + if (tag !== 34) { + break; + } + + message.receiver_contract = reader.string(); + continue; + case 5: + if (tag !== 42) { + break; + } + + message.gas = reader.string(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): EventEnrollRemoteRouter { + return { + token_id: isSet(object.token_id) + ? globalThis.String(object.token_id) + : '', + owner: isSet(object.owner) ? globalThis.String(object.owner) : '', + receiver_domain: isSet(object.receiver_domain) + ? globalThis.Number(object.receiver_domain) + : 0, + receiver_contract: isSet(object.receiver_contract) + ? globalThis.String(object.receiver_contract) + : '', + gas: isSet(object.gas) ? globalThis.String(object.gas) : '', + }; + }, + + toJSON(message: EventEnrollRemoteRouter): unknown { + const obj: any = {}; + if (message.token_id !== '') { + obj.token_id = message.token_id; + } + if (message.owner !== '') { + obj.owner = message.owner; + } + if (message.receiver_domain !== 0) { + obj.receiver_domain = Math.round(message.receiver_domain); + } + if (message.receiver_contract !== '') { + obj.receiver_contract = message.receiver_contract; + } + if (message.gas !== '') { + obj.gas = message.gas; + } + return obj; + }, + + create, I>>( + base?: I, + ): EventEnrollRemoteRouter { + return EventEnrollRemoteRouter.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>( + object: I, + ): EventEnrollRemoteRouter { + const message = createBaseEventEnrollRemoteRouter(); + message.token_id = object.token_id ?? ''; + message.owner = object.owner ?? ''; + message.receiver_domain = object.receiver_domain ?? 0; + message.receiver_contract = object.receiver_contract ?? ''; + message.gas = object.gas ?? ''; + return message; + }, +}; + +function createBaseEventUnrollRemoteRouter(): EventUnrollRemoteRouter { + return { token_id: '', owner: '', receiver_domain: 0 }; +} + +export const EventUnrollRemoteRouter = { + encode( + message: EventUnrollRemoteRouter, + writer: _m0.Writer = _m0.Writer.create(), + ): _m0.Writer { + if (message.token_id !== '') { + writer.uint32(10).string(message.token_id); + } + if (message.owner !== '') { + writer.uint32(18).string(message.owner); + } + if (message.receiver_domain !== 0) { + writer.uint32(24).uint32(message.receiver_domain); + } + return writer; + }, + + decode( + input: _m0.Reader | Uint8Array, + length?: number, + ): EventUnrollRemoteRouter { + const reader = + input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseEventUnrollRemoteRouter(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.token_id = reader.string(); + continue; + case 2: + if (tag !== 18) { + break; + } + + message.owner = reader.string(); + continue; + case 3: + if (tag !== 24) { + break; + } + + message.receiver_domain = reader.uint32(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): EventUnrollRemoteRouter { + return { + token_id: isSet(object.token_id) + ? globalThis.String(object.token_id) + : '', + owner: isSet(object.owner) ? globalThis.String(object.owner) : '', + receiver_domain: isSet(object.receiver_domain) + ? globalThis.Number(object.receiver_domain) + : 0, + }; + }, + + toJSON(message: EventUnrollRemoteRouter): unknown { + const obj: any = {}; + if (message.token_id !== '') { + obj.token_id = message.token_id; + } + if (message.owner !== '') { + obj.owner = message.owner; + } + if (message.receiver_domain !== 0) { + obj.receiver_domain = Math.round(message.receiver_domain); + } + return obj; + }, + + create, I>>( + base?: I, + ): EventUnrollRemoteRouter { + return EventUnrollRemoteRouter.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>( + object: I, + ): EventUnrollRemoteRouter { + const message = createBaseEventUnrollRemoteRouter(); + message.token_id = object.token_id ?? ''; + message.owner = object.owner ?? ''; + message.receiver_domain = object.receiver_domain ?? 0; + return message; + }, +}; + +function createBaseEventSendRemoteTransfer(): EventSendRemoteTransfer { + return { + token_id: '', + sender: '', + destination_domain: 0, + recipient: '', + amount: '', + }; +} + +export const EventSendRemoteTransfer = { + encode( + message: EventSendRemoteTransfer, + writer: _m0.Writer = _m0.Writer.create(), + ): _m0.Writer { + if (message.token_id !== '') { + writer.uint32(10).string(message.token_id); + } + if (message.sender !== '') { + writer.uint32(18).string(message.sender); + } if (message.destination_domain !== 0) { - writer.uint32(8).uint32(message.destination_domain); + writer.uint32(24).uint32(message.destination_domain); + } + if (message.recipient !== '') { + writer.uint32(34).string(message.recipient); } - if (message.recipient_address !== '') { - writer.uint32(18).string(message.recipient_address); + if (message.amount !== '') { + writer.uint32(42).string(message.amount); } return writer; }, - decode(input: _m0.Reader | Uint8Array, length?: number): RemoteTransfer { + decode( + input: _m0.Reader | Uint8Array, + length?: number, + ): EventSendRemoteTransfer { const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseRemoteTransfer(); + const message = createBaseEventSendRemoteTransfer(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { case 1: - if (tag !== 8) { + if (tag !== 10) { break; } - message.destination_domain = reader.uint32(); + message.token_id = reader.string(); continue; case 2: if (tag !== 18) { break; } - message.recipient_address = reader.string(); + message.sender = reader.string(); + continue; + case 3: + if (tag !== 24) { + break; + } + + message.destination_domain = reader.uint32(); + continue; + case 4: + if (tag !== 34) { + break; + } + + message.recipient = reader.string(); + continue; + case 5: + if (tag !== 42) { + break; + } + + message.amount = reader.string(); continue; } if ((tag & 7) === 4 || tag === 0) { @@ -63,39 +782,198 @@ export const RemoteTransfer = { return message; }, - fromJSON(object: any): RemoteTransfer { + fromJSON(object: any): EventSendRemoteTransfer { return { + token_id: isSet(object.token_id) + ? globalThis.String(object.token_id) + : '', + sender: isSet(object.sender) ? globalThis.String(object.sender) : '', destination_domain: isSet(object.destination_domain) ? globalThis.Number(object.destination_domain) : 0, - recipient_address: isSet(object.recipient_address) - ? globalThis.String(object.recipient_address) + recipient: isSet(object.recipient) + ? globalThis.String(object.recipient) : '', + amount: isSet(object.amount) ? globalThis.String(object.amount) : '', }; }, - toJSON(message: RemoteTransfer): unknown { + toJSON(message: EventSendRemoteTransfer): unknown { const obj: any = {}; + if (message.token_id !== '') { + obj.token_id = message.token_id; + } + if (message.sender !== '') { + obj.sender = message.sender; + } if (message.destination_domain !== 0) { obj.destination_domain = Math.round(message.destination_domain); } - if (message.recipient_address !== '') { - obj.recipient_address = message.recipient_address; + if (message.recipient !== '') { + obj.recipient = message.recipient; + } + if (message.amount !== '') { + obj.amount = message.amount; } return obj; }, - create, I>>( + create, I>>( base?: I, - ): RemoteTransfer { - return RemoteTransfer.fromPartial(base ?? ({} as any)); + ): EventSendRemoteTransfer { + return EventSendRemoteTransfer.fromPartial(base ?? ({} as any)); }, - fromPartial, I>>( + fromPartial, I>>( object: I, - ): RemoteTransfer { - const message = createBaseRemoteTransfer(); + ): EventSendRemoteTransfer { + const message = createBaseEventSendRemoteTransfer(); + message.token_id = object.token_id ?? ''; + message.sender = object.sender ?? ''; message.destination_domain = object.destination_domain ?? 0; - message.recipient_address = object.recipient_address ?? ''; + message.recipient = object.recipient ?? ''; + message.amount = object.amount ?? ''; + return message; + }, +}; + +function createBaseEventReceiveRemoteTransfer(): EventReceiveRemoteTransfer { + return { + token_id: '', + sender: '', + origin_domain: 0, + recipient: '', + amount: '', + }; +} + +export const EventReceiveRemoteTransfer = { + encode( + message: EventReceiveRemoteTransfer, + writer: _m0.Writer = _m0.Writer.create(), + ): _m0.Writer { + if (message.token_id !== '') { + writer.uint32(10).string(message.token_id); + } + if (message.sender !== '') { + writer.uint32(18).string(message.sender); + } + if (message.origin_domain !== 0) { + writer.uint32(24).uint32(message.origin_domain); + } + if (message.recipient !== '') { + writer.uint32(34).string(message.recipient); + } + if (message.amount !== '') { + writer.uint32(42).string(message.amount); + } + return writer; + }, + + decode( + input: _m0.Reader | Uint8Array, + length?: number, + ): EventReceiveRemoteTransfer { + const reader = + input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseEventReceiveRemoteTransfer(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.token_id = reader.string(); + continue; + case 2: + if (tag !== 18) { + break; + } + + message.sender = reader.string(); + continue; + case 3: + if (tag !== 24) { + break; + } + + message.origin_domain = reader.uint32(); + continue; + case 4: + if (tag !== 34) { + break; + } + + message.recipient = reader.string(); + continue; + case 5: + if (tag !== 42) { + break; + } + + message.amount = reader.string(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): EventReceiveRemoteTransfer { + return { + token_id: isSet(object.token_id) + ? globalThis.String(object.token_id) + : '', + sender: isSet(object.sender) ? globalThis.String(object.sender) : '', + origin_domain: isSet(object.origin_domain) + ? globalThis.Number(object.origin_domain) + : 0, + recipient: isSet(object.recipient) + ? globalThis.String(object.recipient) + : '', + amount: isSet(object.amount) ? globalThis.String(object.amount) : '', + }; + }, + + toJSON(message: EventReceiveRemoteTransfer): unknown { + const obj: any = {}; + if (message.token_id !== '') { + obj.token_id = message.token_id; + } + if (message.sender !== '') { + obj.sender = message.sender; + } + if (message.origin_domain !== 0) { + obj.origin_domain = Math.round(message.origin_domain); + } + if (message.recipient !== '') { + obj.recipient = message.recipient; + } + if (message.amount !== '') { + obj.amount = message.amount; + } + return obj; + }, + + create, I>>( + base?: I, + ): EventReceiveRemoteTransfer { + return EventReceiveRemoteTransfer.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>( + object: I, + ): EventReceiveRemoteTransfer { + const message = createBaseEventReceiveRemoteTransfer(); + message.token_id = object.token_id ?? ''; + message.sender = object.sender ?? ''; + message.origin_domain = object.origin_domain ?? 0; + message.recipient = object.recipient ?? ''; + message.amount = object.amount ?? ''; return message; }, }; diff --git a/typescript/cosmos-types/src/types/hyperlane/warp/v1/tx.ts b/typescript/cosmos-types/src/types/hyperlane/warp/v1/tx.ts index b2d5b74b974..b8711a60da1 100644 --- a/typescript/cosmos-types/src/types/hyperlane/warp/v1/tx.ts +++ b/typescript/cosmos-types/src/types/hyperlane/warp/v1/tx.ts @@ -44,6 +44,7 @@ export interface MsgSetToken { token_id: string; new_owner: string; ism_id: string; + renounce_ownership: boolean; } /** MsgSetTokenResponse ... */ @@ -418,7 +419,13 @@ export const MsgCreateSyntheticTokenResponse = { }; function createBaseMsgSetToken(): MsgSetToken { - return { owner: '', token_id: '', new_owner: '', ism_id: '' }; + return { + owner: '', + token_id: '', + new_owner: '', + ism_id: '', + renounce_ownership: false, + }; } export const MsgSetToken = { @@ -438,6 +445,9 @@ export const MsgSetToken = { if (message.ism_id !== '') { writer.uint32(34).string(message.ism_id); } + if (message.renounce_ownership !== false) { + writer.uint32(56).bool(message.renounce_ownership); + } return writer; }, @@ -477,6 +487,13 @@ export const MsgSetToken = { message.ism_id = reader.string(); continue; + case 7: + if (tag !== 56) { + break; + } + + message.renounce_ownership = reader.bool(); + continue; } if ((tag & 7) === 4 || tag === 0) { break; @@ -496,6 +513,9 @@ export const MsgSetToken = { ? globalThis.String(object.new_owner) : '', ism_id: isSet(object.ism_id) ? globalThis.String(object.ism_id) : '', + renounce_ownership: isSet(object.renounce_ownership) + ? globalThis.Boolean(object.renounce_ownership) + : false, }; }, @@ -513,6 +533,9 @@ export const MsgSetToken = { if (message.ism_id !== '') { obj.ism_id = message.ism_id; } + if (message.renounce_ownership !== false) { + obj.renounce_ownership = message.renounce_ownership; + } return obj; }, @@ -527,6 +550,7 @@ export const MsgSetToken = { message.token_id = object.token_id ?? ''; message.new_owner = object.new_owner ?? ''; message.ism_id = object.ism_id ?? ''; + message.renounce_ownership = object.renounce_ownership ?? false; return message; }, }; diff --git a/typescript/sdk/src/core/CosmosNativeCoreModule.ts b/typescript/sdk/src/core/CosmosNativeCoreModule.ts index 9d724fc7ec2..43b9fa7240e 100644 --- a/typescript/sdk/src/core/CosmosNativeCoreModule.ts +++ b/typescript/sdk/src/core/CosmosNativeCoreModule.ts @@ -161,6 +161,7 @@ export class CosmosNativeCoreModule extends HyperlaneModule< default_hook: defaultHook, required_hook: requiredHook, new_owner: config.owner || '', + renounce_ownership: !config.owner, // if owner is empty we renounce the ownership }); const addresses: DeployedCoreAddresses = { diff --git a/typescript/sdk/src/hook/CosmosNativeHookModule.ts b/typescript/sdk/src/hook/CosmosNativeHookModule.ts index 112e6a448b5..bc5949ad74c 100644 --- a/typescript/sdk/src/hook/CosmosNativeHookModule.ts +++ b/typescript/sdk/src/hook/CosmosNativeHookModule.ts @@ -8,6 +8,7 @@ import { ProtocolType, assert, deepEquals, + eqAddress, rootLogger, } from '@hyperlane-xyz/utils'; @@ -184,10 +185,11 @@ export class CosmosNativeHookModule extends HyperlaneModule< }); } - if (config.owner && this.signer.account.address !== config.owner) { + if (!eqAddress(this.signer.account.address, config.owner)) { await this.signer.setIgpOwner({ igp_id: igp.id, new_owner: config.owner, + renounce_ownership: !config.owner, // if owner is empty we renounce the ownership }); } From 1a7222b24af1d0549c2e6a2e3f2f5bf58b5faa3f Mon Sep 17 00:00:00 2001 From: ljankovic-txfusion <131957285+ljankovic-txfusion@users.noreply.github.com> Date: Mon, 19 May 2025 10:34:13 +0200 Subject: [PATCH 10/16] refactor: Compress Starknet logo in widgets (#5857) ### Description This PR compresses the size of Starknet logo ### Drive-by changes None ### Related issues None ### Backward compatibility Yes ### Testing None --- .changeset/dry-dots-sin.md | 5 +++ typescript/widgets/src/logos/Starknet.tsx | 50 ++++++++++------------- 2 files changed, 27 insertions(+), 28 deletions(-) create mode 100644 .changeset/dry-dots-sin.md diff --git a/.changeset/dry-dots-sin.md b/.changeset/dry-dots-sin.md new file mode 100644 index 00000000000..9d5a5335d98 --- /dev/null +++ b/.changeset/dry-dots-sin.md @@ -0,0 +1,5 @@ +--- +'@hyperlane-xyz/widgets': patch +--- + +Compress Starknet logo diff --git a/typescript/widgets/src/logos/Starknet.tsx b/typescript/widgets/src/logos/Starknet.tsx index ff7efda1c59..c3f1f46b0c8 100644 --- a/typescript/widgets/src/logos/Starknet.tsx +++ b/typescript/widgets/src/logos/Starknet.tsx @@ -9,35 +9,29 @@ function _StarknetLogo(props: SVGProps) { {...props} > - - - - + + + + + + ); } From e193176fef521d28f15f60e4140a2e219b719ac9 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 19 May 2025 09:33:59 +0000 Subject: [PATCH 11/16] Version Packages (#6237) This PR was opened by the [Changesets release](https://github.com/changesets/action) GitHub action. When you're ready to do a release, you can merge this and publish to npm yourself or [setup this action to publish automatically](https://github.com/changesets/action#with-publishing). If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated. # Releases ## @hyperlane-xyz/starknet-core@13.0.0 ### Major Changes - f8696c7: feat: Add Starknet contract ABI fetching and contract artifact generation ## @hyperlane-xyz/cosmos-sdk@13.0.0 ### Minor Changes - 2724559: add cosmos native routing ism cosmos-sdk and types ### Patch Changes - Updated dependencies [2724559] - @hyperlane-xyz/cosmos-types@13.0.0 ## @hyperlane-xyz/cosmos-types@13.0.0 ### Minor Changes - 2724559: add cosmos native routing ism cosmos-sdk and types ## @hyperlane-xyz/sdk@13.0.0 ### Minor Changes - 72b90f8: add cosmos native core module & reader - bc58283: feat: Starknet SDK logic integration - 2724559: add cosmos native routing ism cosmos-sdk and types ### Patch Changes - Updated dependencies [0de63e0] - Updated dependencies [f8696c7] - Updated dependencies [2724559] - @hyperlane-xyz/utils@13.0.0 - @hyperlane-xyz/starknet-core@13.0.0 - @hyperlane-xyz/cosmos-sdk@13.0.0 - @hyperlane-xyz/core@7.1.6 ## @hyperlane-xyz/utils@13.0.0 ### Minor Changes - 0de63e0: Add Starknet address and tx utils ## @hyperlane-xyz/core@7.1.6 ### Patch Changes - Updated dependencies [0de63e0] - @hyperlane-xyz/utils@13.0.0 ## @hyperlane-xyz/helloworld@13.0.0 ### Patch Changes - Updated dependencies [72b90f8] - Updated dependencies [bc58283] - Updated dependencies [2724559] - @hyperlane-xyz/sdk@13.0.0 - @hyperlane-xyz/core@7.1.6 ## @hyperlane-xyz/widgets@13.0.0 ### Patch Changes - 1a7222b: Compress Starknet logo - Updated dependencies [72b90f8] - Updated dependencies [bc58283] - Updated dependencies [0de63e0] - Updated dependencies [2724559] - @hyperlane-xyz/sdk@13.0.0 - @hyperlane-xyz/utils@13.0.0 - @hyperlane-xyz/cosmos-sdk@13.0.0 ## @hyperlane-xyz/cli@13.0.0 ## @hyperlane-xyz/infra@13.0.0 ### Patch Changes - Updated dependencies [72b90f8] - Updated dependencies [bc58283] - Updated dependencies [0de63e0] - Updated dependencies [2724559] - @hyperlane-xyz/sdk@13.0.0 - @hyperlane-xyz/utils@13.0.0 - @hyperlane-xyz/helloworld@13.0.0 ## @hyperlane-xyz/ccip-server@13.0.0 ## @hyperlane-xyz/github-proxy@13.0.0 --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .changeset/better-carrots-tell.md | 5 --- .changeset/dry-dots-sin.md | 5 --- .changeset/hip-papayas-kiss.md | 5 --- .changeset/metal-coats-remain.md | 5 --- .changeset/popular-trains-repair.md | 5 --- .changeset/sharp-doors-decide.md | 7 ---- solidity/CHANGELOG.md | 7 ++++ solidity/contracts/PackageVersioned.sol | 2 +- solidity/package.json | 4 +-- starknet/CHANGELOG.md | 7 ++++ starknet/package.json | 2 +- typescript/ccip-server/CHANGELOG.md | 2 ++ typescript/ccip-server/package.json | 2 +- typescript/cli/CHANGELOG.md | 2 ++ typescript/cli/package.json | 8 ++--- typescript/cli/src/version.ts | 2 +- typescript/cosmos-sdk/CHANGELOG.md | 11 ++++++ typescript/cosmos-sdk/package.json | 4 +-- typescript/cosmos-types/CHANGELOG.md | 6 ++++ typescript/cosmos-types/package.json | 2 +- typescript/github-proxy/CHANGELOG.md | 2 ++ typescript/github-proxy/package.json | 2 +- typescript/helloworld/CHANGELOG.md | 10 ++++++ typescript/helloworld/package.json | 6 ++-- typescript/infra/CHANGELOG.md | 12 +++++++ typescript/infra/package.json | 8 ++--- typescript/sdk/CHANGELOG.md | 18 ++++++++++ typescript/sdk/package.json | 10 +++--- typescript/utils/CHANGELOG.md | 6 ++++ typescript/utils/package.json | 2 +- typescript/widgets/CHANGELOG.md | 13 +++++++ typescript/widgets/package.json | 8 ++--- yarn.lock | 48 ++++++++++++------------- 33 files changed, 151 insertions(+), 87 deletions(-) delete mode 100644 .changeset/better-carrots-tell.md delete mode 100644 .changeset/dry-dots-sin.md delete mode 100644 .changeset/hip-papayas-kiss.md delete mode 100644 .changeset/metal-coats-remain.md delete mode 100644 .changeset/popular-trains-repair.md delete mode 100644 .changeset/sharp-doors-decide.md create mode 100644 starknet/CHANGELOG.md diff --git a/.changeset/better-carrots-tell.md b/.changeset/better-carrots-tell.md deleted file mode 100644 index d0167a92cc3..00000000000 --- a/.changeset/better-carrots-tell.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@hyperlane-xyz/sdk': minor ---- - -add cosmos native core module & reader diff --git a/.changeset/dry-dots-sin.md b/.changeset/dry-dots-sin.md deleted file mode 100644 index 9d5a5335d98..00000000000 --- a/.changeset/dry-dots-sin.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@hyperlane-xyz/widgets': patch ---- - -Compress Starknet logo diff --git a/.changeset/hip-papayas-kiss.md b/.changeset/hip-papayas-kiss.md deleted file mode 100644 index 8ed6b86f2d6..00000000000 --- a/.changeset/hip-papayas-kiss.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@hyperlane-xyz/sdk': minor ---- - -feat: Starknet SDK logic integration diff --git a/.changeset/metal-coats-remain.md b/.changeset/metal-coats-remain.md deleted file mode 100644 index bda7ba34165..00000000000 --- a/.changeset/metal-coats-remain.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@hyperlane-xyz/utils': minor ---- - -Add Starknet address and tx utils diff --git a/.changeset/popular-trains-repair.md b/.changeset/popular-trains-repair.md deleted file mode 100644 index d0cab3f6198..00000000000 --- a/.changeset/popular-trains-repair.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@hyperlane-xyz/starknet-core': major ---- - -feat: Add Starknet contract ABI fetching and contract artifact generation diff --git a/.changeset/sharp-doors-decide.md b/.changeset/sharp-doors-decide.md deleted file mode 100644 index 061ad6cf3e7..00000000000 --- a/.changeset/sharp-doors-decide.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@hyperlane-xyz/cosmos-types': minor -'@hyperlane-xyz/cosmos-sdk': minor -'@hyperlane-xyz/sdk': minor ---- - -add cosmos native routing ism cosmos-sdk and types diff --git a/solidity/CHANGELOG.md b/solidity/CHANGELOG.md index 08f0de83f5b..5f4245a751c 100644 --- a/solidity/CHANGELOG.md +++ b/solidity/CHANGELOG.md @@ -1,5 +1,12 @@ # @hyperlane-xyz/core +## 7.1.6 + +### Patch Changes + +- Updated dependencies [0de63e0] + - @hyperlane-xyz/utils@13.0.0 + ## 7.1.5 ### Patch Changes diff --git a/solidity/contracts/PackageVersioned.sol b/solidity/contracts/PackageVersioned.sol index fab433e1594..48a5c7e4470 100644 --- a/solidity/contracts/PackageVersioned.sol +++ b/solidity/contracts/PackageVersioned.sol @@ -7,5 +7,5 @@ pragma solidity >=0.6.11; **/ abstract contract PackageVersioned { // GENERATED CODE - DO NOT EDIT - string public constant PACKAGE_VERSION = "7.1.5"; + string public constant PACKAGE_VERSION = "7.1.6"; } diff --git a/solidity/package.json b/solidity/package.json index 7400be33fce..cfdd0f1d13b 100644 --- a/solidity/package.json +++ b/solidity/package.json @@ -1,12 +1,12 @@ { "name": "@hyperlane-xyz/core", "description": "Core solidity contracts for Hyperlane", - "version": "7.1.5", + "version": "7.1.6", "dependencies": { "@arbitrum/nitro-contracts": "^1.2.1", "@chainlink/contracts-ccip": "^1.5.0", "@eth-optimism/contracts": "^0.6.0", - "@hyperlane-xyz/utils": "12.6.0", + "@hyperlane-xyz/utils": "13.0.0", "@layerzerolabs/lz-evm-oapp-v2": "2.0.2", "@matterlabs/hardhat-zksync-solc": "1.2.5", "@matterlabs/hardhat-zksync-verify": "1.7.1", diff --git a/starknet/CHANGELOG.md b/starknet/CHANGELOG.md new file mode 100644 index 00000000000..1f9e594de39 --- /dev/null +++ b/starknet/CHANGELOG.md @@ -0,0 +1,7 @@ +# @hyperlane-xyz/starknet-core + +## 13.0.0 + +### Major Changes + +- f8696c7: feat: Add Starknet contract ABI fetching and contract artifact generation diff --git a/starknet/package.json b/starknet/package.json index 9a979e8ec01..5f0057fc3e5 100644 --- a/starknet/package.json +++ b/starknet/package.json @@ -1,7 +1,7 @@ { "name": "@hyperlane-xyz/starknet-core", "description": "Core cairo contracts for Hyperlane", - "version": "1.0.0", + "version": "13.0.0", "type": "module", "homepage": "https://www.hyperlane.xyz", "license": "Apache-2.0", diff --git a/typescript/ccip-server/CHANGELOG.md b/typescript/ccip-server/CHANGELOG.md index 061e999d1e6..c741fbeb823 100644 --- a/typescript/ccip-server/CHANGELOG.md +++ b/typescript/ccip-server/CHANGELOG.md @@ -1,5 +1,7 @@ # @hyperlane-xyz/ccip-server +## 13.0.0 + ## 12.6.0 ## 12.5.0 diff --git a/typescript/ccip-server/package.json b/typescript/ccip-server/package.json index ab5661e8ee0..a107357961e 100644 --- a/typescript/ccip-server/package.json +++ b/typescript/ccip-server/package.json @@ -1,6 +1,6 @@ { "name": "@hyperlane-xyz/ccip-server", - "version": "12.6.0", + "version": "13.0.0", "description": "CCIP server", "typings": "dist/index.d.ts", "typedocMain": "src/index.ts", diff --git a/typescript/cli/CHANGELOG.md b/typescript/cli/CHANGELOG.md index d5759fc53f7..4eebd557171 100644 --- a/typescript/cli/CHANGELOG.md +++ b/typescript/cli/CHANGELOG.md @@ -1,5 +1,7 @@ # @hyperlane-xyz/cli +## 13.0.0 + ## 12.6.0 ### Minor Changes diff --git a/typescript/cli/package.json b/typescript/cli/package.json index 7f0d71d5cee..082141c62d2 100644 --- a/typescript/cli/package.json +++ b/typescript/cli/package.json @@ -1,6 +1,6 @@ { "name": "@hyperlane-xyz/cli", - "version": "12.6.0", + "version": "13.0.0", "description": "A command-line utility for common Hyperlane operations", "devDependencies": { "@aws-sdk/client-kms": "^3.577.0", @@ -9,10 +9,10 @@ "@eslint/js": "^9.15.0", "@ethersproject/abi": "*", "@ethersproject/providers": "*", - "@hyperlane-xyz/cosmos-sdk": "12.6.0", + "@hyperlane-xyz/cosmos-sdk": "13.0.0", "@hyperlane-xyz/registry": "15.0.0", - "@hyperlane-xyz/sdk": "12.6.0", - "@hyperlane-xyz/utils": "12.6.0", + "@hyperlane-xyz/sdk": "13.0.0", + "@hyperlane-xyz/utils": "13.0.0", "@inquirer/core": "9.0.10", "@inquirer/figures": "1.0.5", "@inquirer/prompts": "3.3.2", diff --git a/typescript/cli/src/version.ts b/typescript/cli/src/version.ts index d3fb2e95e65..61a355df044 100644 --- a/typescript/cli/src/version.ts +++ b/typescript/cli/src/version.ts @@ -1 +1 @@ -export const VERSION = '12.6.0'; +export const VERSION = '13.0.0'; diff --git a/typescript/cosmos-sdk/CHANGELOG.md b/typescript/cosmos-sdk/CHANGELOG.md index f7d7a30ab09..4a9caaa5371 100644 --- a/typescript/cosmos-sdk/CHANGELOG.md +++ b/typescript/cosmos-sdk/CHANGELOG.md @@ -1,5 +1,16 @@ # @hyperlane-xyz/cosmos-sdk +## 13.0.0 + +### Minor Changes + +- 2724559: add cosmos native routing ism cosmos-sdk and types + +### Patch Changes + +- Updated dependencies [2724559] + - @hyperlane-xyz/cosmos-types@13.0.0 + ## 12.6.0 ### Minor Changes diff --git a/typescript/cosmos-sdk/package.json b/typescript/cosmos-sdk/package.json index 07f1af432a0..7f70f838ccb 100644 --- a/typescript/cosmos-sdk/package.json +++ b/typescript/cosmos-sdk/package.json @@ -1,6 +1,6 @@ { "name": "@hyperlane-xyz/cosmos-sdk", - "version": "12.6.0", + "version": "13.0.0", "description": "Hyperlane TypeScript SDK for the Cosmos Hyperlane SDK module", "type": "module", "exports": { @@ -46,6 +46,6 @@ }, "dependencies": { "@cosmjs/stargate": "^0.32.4", - "@hyperlane-xyz/cosmos-types": "12.6.0" + "@hyperlane-xyz/cosmos-types": "13.0.0" } } diff --git a/typescript/cosmos-types/CHANGELOG.md b/typescript/cosmos-types/CHANGELOG.md index df6e0515081..2596f93cb39 100644 --- a/typescript/cosmos-types/CHANGELOG.md +++ b/typescript/cosmos-types/CHANGELOG.md @@ -1,5 +1,11 @@ # @hyperlane-xyz/cosmos-types +## 13.0.0 + +### Minor Changes + +- 2724559: add cosmos native routing ism cosmos-sdk and types + ## 12.6.0 ## 12.5.0 diff --git a/typescript/cosmos-types/package.json b/typescript/cosmos-types/package.json index 7db3c37d3f3..69194422d7c 100644 --- a/typescript/cosmos-types/package.json +++ b/typescript/cosmos-types/package.json @@ -1,6 +1,6 @@ { "name": "@hyperlane-xyz/cosmos-types", - "version": "12.6.0", + "version": "13.0.0", "description": "Hyperlane TypeScript SDK types for the Cosmos Hyperlane SDK module", "type": "module", "exports": { diff --git a/typescript/github-proxy/CHANGELOG.md b/typescript/github-proxy/CHANGELOG.md index 24528718db5..1fd90a49a6c 100644 --- a/typescript/github-proxy/CHANGELOG.md +++ b/typescript/github-proxy/CHANGELOG.md @@ -1,5 +1,7 @@ # @hyperlane-xyz/github-proxy +## 13.0.0 + ## 12.6.0 ## 12.5.0 diff --git a/typescript/github-proxy/package.json b/typescript/github-proxy/package.json index 0c09010baad..45370ea57e5 100644 --- a/typescript/github-proxy/package.json +++ b/typescript/github-proxy/package.json @@ -1,7 +1,7 @@ { "name": "@hyperlane-xyz/github-proxy", "description": "Github proxy that adds the API key to requests", - "version": "12.6.0", + "version": "13.0.0", "private": true, "scripts": { "deploy": "wrangler deploy", diff --git a/typescript/helloworld/CHANGELOG.md b/typescript/helloworld/CHANGELOG.md index 6d79dd7b4fc..44ef18902b8 100644 --- a/typescript/helloworld/CHANGELOG.md +++ b/typescript/helloworld/CHANGELOG.md @@ -1,5 +1,15 @@ # @hyperlane-xyz/helloworld +## 13.0.0 + +### Patch Changes + +- Updated dependencies [72b90f8] +- Updated dependencies [bc58283] +- Updated dependencies [2724559] + - @hyperlane-xyz/sdk@13.0.0 + - @hyperlane-xyz/core@7.1.6 + ## 12.6.0 ### Minor Changes diff --git a/typescript/helloworld/package.json b/typescript/helloworld/package.json index b7f199ba0d8..78b8a25f8c2 100644 --- a/typescript/helloworld/package.json +++ b/typescript/helloworld/package.json @@ -1,11 +1,11 @@ { "name": "@hyperlane-xyz/helloworld", "description": "A basic skeleton of an Hyperlane app", - "version": "12.6.0", + "version": "13.0.0", "dependencies": { - "@hyperlane-xyz/core": "7.1.5", + "@hyperlane-xyz/core": "7.1.6", "@hyperlane-xyz/registry": "15.0.0", - "@hyperlane-xyz/sdk": "12.6.0", + "@hyperlane-xyz/sdk": "13.0.0", "@openzeppelin/contracts-upgradeable": "^4.9.3", "ethers": "^5.7.2" }, diff --git a/typescript/infra/CHANGELOG.md b/typescript/infra/CHANGELOG.md index bd0ebcd720b..ccf244fe7b8 100644 --- a/typescript/infra/CHANGELOG.md +++ b/typescript/infra/CHANGELOG.md @@ -1,5 +1,17 @@ # @hyperlane-xyz/infra +## 13.0.0 + +### Patch Changes + +- Updated dependencies [72b90f8] +- Updated dependencies [bc58283] +- Updated dependencies [0de63e0] +- Updated dependencies [2724559] + - @hyperlane-xyz/sdk@13.0.0 + - @hyperlane-xyz/utils@13.0.0 + - @hyperlane-xyz/helloworld@13.0.0 + ## 12.6.0 ### Minor Changes diff --git a/typescript/infra/package.json b/typescript/infra/package.json index 932ce8d4cd7..014a2aaffc3 100644 --- a/typescript/infra/package.json +++ b/typescript/infra/package.json @@ -1,7 +1,7 @@ { "name": "@hyperlane-xyz/infra", "description": "Infrastructure utilities for the Hyperlane Network", - "version": "12.6.0", + "version": "13.0.0", "dependencies": { "@arbitrum/sdk": "^4.0.0", "@aws-sdk/client-iam": "^3.74.0", @@ -13,10 +13,10 @@ "@ethersproject/hardware-wallets": "^5.7.0", "@ethersproject/providers": "*", "@google-cloud/secret-manager": "^5.5.0", - "@hyperlane-xyz/helloworld": "12.6.0", + "@hyperlane-xyz/helloworld": "13.0.0", "@hyperlane-xyz/registry": "15.0.0", - "@hyperlane-xyz/sdk": "12.6.0", - "@hyperlane-xyz/utils": "12.6.0", + "@hyperlane-xyz/sdk": "13.0.0", + "@hyperlane-xyz/utils": "13.0.0", "@inquirer/prompts": "3.3.2", "@nomiclabs/hardhat-etherscan": "^3.0.3", "@safe-global/api-kit": "1.3.0", diff --git a/typescript/sdk/CHANGELOG.md b/typescript/sdk/CHANGELOG.md index b4d385a5754..799a86c276e 100644 --- a/typescript/sdk/CHANGELOG.md +++ b/typescript/sdk/CHANGELOG.md @@ -1,5 +1,23 @@ # @hyperlane-xyz/sdk +## 13.0.0 + +### Minor Changes + +- 72b90f8: add cosmos native core module & reader +- bc58283: feat: Starknet SDK logic integration +- 2724559: add cosmos native routing ism cosmos-sdk and types + +### Patch Changes + +- Updated dependencies [0de63e0] +- Updated dependencies [f8696c7] +- Updated dependencies [2724559] + - @hyperlane-xyz/utils@13.0.0 + - @hyperlane-xyz/starknet-core@13.0.0 + - @hyperlane-xyz/cosmos-sdk@13.0.0 + - @hyperlane-xyz/core@7.1.6 + ## 12.6.0 ### Minor Changes diff --git a/typescript/sdk/package.json b/typescript/sdk/package.json index 9ba90d65260..094b9d0bb28 100644 --- a/typescript/sdk/package.json +++ b/typescript/sdk/package.json @@ -1,17 +1,17 @@ { "name": "@hyperlane-xyz/sdk", "description": "The official SDK for the Hyperlane Network", - "version": "12.6.0", + "version": "13.0.0", "dependencies": { "@arbitrum/sdk": "^4.0.0", "@aws-sdk/client-s3": "^3.577.0", "@chain-registry/types": "^0.50.122", "@cosmjs/cosmwasm-stargate": "^0.32.4", "@cosmjs/stargate": "^0.32.4", - "@hyperlane-xyz/core": "7.1.5", - "@hyperlane-xyz/cosmos-sdk": "12.6.0", - "@hyperlane-xyz/starknet-core": "1.0.0", - "@hyperlane-xyz/utils": "12.6.0", + "@hyperlane-xyz/core": "7.1.6", + "@hyperlane-xyz/cosmos-sdk": "13.0.0", + "@hyperlane-xyz/starknet-core": "13.0.0", + "@hyperlane-xyz/utils": "13.0.0", "@safe-global/api-kit": "1.3.0", "@safe-global/protocol-kit": "1.3.0", "@safe-global/safe-deployments": "1.37.23", diff --git a/typescript/utils/CHANGELOG.md b/typescript/utils/CHANGELOG.md index b111af6886f..930f4bc4ddc 100644 --- a/typescript/utils/CHANGELOG.md +++ b/typescript/utils/CHANGELOG.md @@ -1,5 +1,11 @@ # @hyperlane-xyz/utils +## 13.0.0 + +### Minor Changes + +- 0de63e0: Add Starknet address and tx utils + ## 12.6.0 ### Minor Changes diff --git a/typescript/utils/package.json b/typescript/utils/package.json index fbf537b863f..4826d74a9b6 100644 --- a/typescript/utils/package.json +++ b/typescript/utils/package.json @@ -1,7 +1,7 @@ { "name": "@hyperlane-xyz/utils", "description": "General utilities and types for the Hyperlane network", - "version": "12.6.0", + "version": "13.0.0", "dependencies": { "@cosmjs/encoding": "^0.32.4", "@solana/web3.js": "^1.95.4", diff --git a/typescript/widgets/CHANGELOG.md b/typescript/widgets/CHANGELOG.md index e6c17f07a0b..24260febc39 100644 --- a/typescript/widgets/CHANGELOG.md +++ b/typescript/widgets/CHANGELOG.md @@ -1,5 +1,18 @@ # @hyperlane-xyz/widgets +## 13.0.0 + +### Patch Changes + +- 1a7222b: Compress Starknet logo +- Updated dependencies [72b90f8] +- Updated dependencies [bc58283] +- Updated dependencies [0de63e0] +- Updated dependencies [2724559] + - @hyperlane-xyz/sdk@13.0.0 + - @hyperlane-xyz/utils@13.0.0 + - @hyperlane-xyz/cosmos-sdk@13.0.0 + ## 12.6.0 ### Minor Changes diff --git a/typescript/widgets/package.json b/typescript/widgets/package.json index 583d2c38ec4..92451008730 100644 --- a/typescript/widgets/package.json +++ b/typescript/widgets/package.json @@ -1,7 +1,7 @@ { "name": "@hyperlane-xyz/widgets", "description": "Common react components for Hyperlane projects", - "version": "12.6.0", + "version": "13.0.0", "peerDependencies": { "react": "^18", "react-dom": "^18" @@ -10,9 +10,9 @@ "@cosmjs/stargate": "^0.32.4", "@cosmos-kit/react": "^2.18.0", "@headlessui/react": "^2.1.8", - "@hyperlane-xyz/cosmos-sdk": "12.6.0", - "@hyperlane-xyz/sdk": "12.6.0", - "@hyperlane-xyz/utils": "12.6.0", + "@hyperlane-xyz/cosmos-sdk": "13.0.0", + "@hyperlane-xyz/sdk": "13.0.0", + "@hyperlane-xyz/utils": "13.0.0", "@interchain-ui/react": "^1.23.28", "@rainbow-me/rainbowkit": "^2.2.0", "@solana/wallet-adapter-react": "^0.15.32", diff --git a/yarn.lock b/yarn.lock index 5b1406d5b24..d85bf67574f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7645,10 +7645,10 @@ __metadata: "@eslint/js": "npm:^9.15.0" "@ethersproject/abi": "npm:*" "@ethersproject/providers": "npm:*" - "@hyperlane-xyz/cosmos-sdk": "npm:12.6.0" + "@hyperlane-xyz/cosmos-sdk": "npm:13.0.0" "@hyperlane-xyz/registry": "npm:15.0.0" - "@hyperlane-xyz/sdk": "npm:12.6.0" - "@hyperlane-xyz/utils": "npm:12.6.0" + "@hyperlane-xyz/sdk": "npm:13.0.0" + "@hyperlane-xyz/utils": "npm:13.0.0" "@inquirer/core": "npm:9.0.10" "@inquirer/figures": "npm:1.0.5" "@inquirer/prompts": "npm:3.3.2" @@ -7688,14 +7688,14 @@ __metadata: languageName: unknown linkType: soft -"@hyperlane-xyz/core@npm:7.1.5, @hyperlane-xyz/core@workspace:solidity": +"@hyperlane-xyz/core@npm:7.1.6, @hyperlane-xyz/core@workspace:solidity": version: 0.0.0-use.local resolution: "@hyperlane-xyz/core@workspace:solidity" dependencies: "@arbitrum/nitro-contracts": "npm:^1.2.1" "@chainlink/contracts-ccip": "npm:^1.5.0" "@eth-optimism/contracts": "npm:^0.6.0" - "@hyperlane-xyz/utils": "npm:12.6.0" + "@hyperlane-xyz/utils": "npm:13.0.0" "@layerzerolabs/lz-evm-oapp-v2": "npm:2.0.2" "@layerzerolabs/solidity-examples": "npm:^1.1.0" "@matterlabs/hardhat-zksync-solc": "npm:1.2.5" @@ -7735,13 +7735,13 @@ __metadata: languageName: unknown linkType: soft -"@hyperlane-xyz/cosmos-sdk@npm:12.6.0, @hyperlane-xyz/cosmos-sdk@workspace:typescript/cosmos-sdk": +"@hyperlane-xyz/cosmos-sdk@npm:13.0.0, @hyperlane-xyz/cosmos-sdk@workspace:typescript/cosmos-sdk": version: 0.0.0-use.local resolution: "@hyperlane-xyz/cosmos-sdk@workspace:typescript/cosmos-sdk" dependencies: "@cosmjs/stargate": "npm:^0.32.4" "@eslint/js": "npm:^9.15.0" - "@hyperlane-xyz/cosmos-types": "npm:12.6.0" + "@hyperlane-xyz/cosmos-types": "npm:13.0.0" "@types/mocha": "npm:^10.0.1" "@typescript-eslint/eslint-plugin": "npm:^8.1.6" "@typescript-eslint/parser": "npm:^8.1.6" @@ -7757,7 +7757,7 @@ __metadata: languageName: unknown linkType: soft -"@hyperlane-xyz/cosmos-types@npm:12.6.0, @hyperlane-xyz/cosmos-types@workspace:typescript/cosmos-types": +"@hyperlane-xyz/cosmos-types@npm:13.0.0, @hyperlane-xyz/cosmos-types@workspace:typescript/cosmos-types": version: 0.0.0-use.local resolution: "@hyperlane-xyz/cosmos-types@workspace:typescript/cosmos-types" dependencies: @@ -7791,14 +7791,14 @@ __metadata: languageName: unknown linkType: soft -"@hyperlane-xyz/helloworld@npm:12.6.0, @hyperlane-xyz/helloworld@workspace:typescript/helloworld": +"@hyperlane-xyz/helloworld@npm:13.0.0, @hyperlane-xyz/helloworld@workspace:typescript/helloworld": version: 0.0.0-use.local resolution: "@hyperlane-xyz/helloworld@workspace:typescript/helloworld" dependencies: "@eslint/js": "npm:^9.15.0" - "@hyperlane-xyz/core": "npm:7.1.5" + "@hyperlane-xyz/core": "npm:7.1.6" "@hyperlane-xyz/registry": "npm:15.0.0" - "@hyperlane-xyz/sdk": "npm:12.6.0" + "@hyperlane-xyz/sdk": "npm:13.0.0" "@nomiclabs/hardhat-ethers": "npm:^2.2.3" "@nomiclabs/hardhat-waffle": "npm:^2.0.6" "@openzeppelin/contracts-upgradeable": "npm:^4.9.3" @@ -7847,10 +7847,10 @@ __metadata: "@ethersproject/hardware-wallets": "npm:^5.7.0" "@ethersproject/providers": "npm:*" "@google-cloud/secret-manager": "npm:^5.5.0" - "@hyperlane-xyz/helloworld": "npm:12.6.0" + "@hyperlane-xyz/helloworld": "npm:13.0.0" "@hyperlane-xyz/registry": "npm:15.0.0" - "@hyperlane-xyz/sdk": "npm:12.6.0" - "@hyperlane-xyz/utils": "npm:12.6.0" + "@hyperlane-xyz/sdk": "npm:13.0.0" + "@hyperlane-xyz/utils": "npm:13.0.0" "@inquirer/prompts": "npm:3.3.2" "@nomiclabs/hardhat-ethers": "npm:^2.2.3" "@nomiclabs/hardhat-etherscan": "npm:^3.0.3" @@ -7922,7 +7922,7 @@ __metadata: languageName: node linkType: hard -"@hyperlane-xyz/sdk@npm:12.6.0, @hyperlane-xyz/sdk@workspace:typescript/sdk": +"@hyperlane-xyz/sdk@npm:13.0.0, @hyperlane-xyz/sdk@workspace:typescript/sdk": version: 0.0.0-use.local resolution: "@hyperlane-xyz/sdk@workspace:typescript/sdk" dependencies: @@ -7932,10 +7932,10 @@ __metadata: "@cosmjs/cosmwasm-stargate": "npm:^0.32.4" "@cosmjs/stargate": "npm:^0.32.4" "@eslint/js": "npm:^9.15.0" - "@hyperlane-xyz/core": "npm:7.1.5" - "@hyperlane-xyz/cosmos-sdk": "npm:12.6.0" - "@hyperlane-xyz/starknet-core": "npm:1.0.0" - "@hyperlane-xyz/utils": "npm:12.6.0" + "@hyperlane-xyz/core": "npm:7.1.6" + "@hyperlane-xyz/cosmos-sdk": "npm:13.0.0" + "@hyperlane-xyz/starknet-core": "npm:13.0.0" + "@hyperlane-xyz/utils": "npm:13.0.0" "@nomiclabs/hardhat-ethers": "npm:^2.2.3" "@nomiclabs/hardhat-waffle": "npm:^2.0.6" "@safe-global/api-kit": "npm:1.3.0" @@ -7980,7 +7980,7 @@ __metadata: languageName: unknown linkType: soft -"@hyperlane-xyz/starknet-core@npm:1.0.0, @hyperlane-xyz/starknet-core@workspace:starknet": +"@hyperlane-xyz/starknet-core@npm:13.0.0, @hyperlane-xyz/starknet-core@workspace:starknet": version: 0.0.0-use.local resolution: "@hyperlane-xyz/starknet-core@workspace:starknet" dependencies: @@ -7999,7 +7999,7 @@ __metadata: languageName: unknown linkType: soft -"@hyperlane-xyz/utils@npm:12.6.0, @hyperlane-xyz/utils@workspace:typescript/utils": +"@hyperlane-xyz/utils@npm:13.0.0, @hyperlane-xyz/utils@workspace:typescript/utils": version: 0.0.0-use.local resolution: "@hyperlane-xyz/utils@workspace:typescript/utils" dependencies: @@ -8042,10 +8042,10 @@ __metadata: "@emotion/styled": "npm:^11.13.0" "@eslint/js": "npm:^9.15.0" "@headlessui/react": "npm:^2.1.8" - "@hyperlane-xyz/cosmos-sdk": "npm:12.6.0" + "@hyperlane-xyz/cosmos-sdk": "npm:13.0.0" "@hyperlane-xyz/registry": "npm:15.0.0" - "@hyperlane-xyz/sdk": "npm:12.6.0" - "@hyperlane-xyz/utils": "npm:12.6.0" + "@hyperlane-xyz/sdk": "npm:13.0.0" + "@hyperlane-xyz/utils": "npm:13.0.0" "@interchain-ui/react": "npm:^1.23.28" "@rainbow-me/rainbowkit": "npm:^2.2.0" "@solana/wallet-adapter-react": "npm:^0.15.32" From 93155a47457cb6ffabdd6f26b8c5a85d120ef604 Mon Sep 17 00:00:00 2001 From: Paul Balaji <10051819+paulbalaji@users.noreply.github.com> Date: Mon, 19 May 2025 12:38:52 +0100 Subject: [PATCH 12/16] fix: special-case darwin in fetch-contracts-release.sh (#6266) ### Description fix: special-case mac in fetch-contracts-release ### Drive-by changes ### Related issues ### Backward compatibility ### Testing - ubuntu test is fine https://github.com/hyperlane-xyz/hyperlane-monorepo/actions/runs/15111483420/job/42471852313?pr=6266#step:4:13 - macos test is fine https://github.com/hyperlane-xyz/hyperlane-monorepo/actions/runs/15111483420/job/42471853847?pr=6266#step:4:13 - windows test is fine https://github.com/hyperlane-xyz/hyperlane-monorepo/actions/runs/15111483420/job/42471854670?pr=6266#step:4:13 --- starknet/scripts/fetch-contracts-release.sh | 34 ++++++++++++--------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/starknet/scripts/fetch-contracts-release.sh b/starknet/scripts/fetch-contracts-release.sh index d79af81ad3e..4fb1ffdf01f 100755 --- a/starknet/scripts/fetch-contracts-release.sh +++ b/starknet/scripts/fetch-contracts-release.sh @@ -25,7 +25,7 @@ log_success() { check_dependencies() { local -r required_tools=("curl" "jq" "unzip") - + for tool in "${required_tools[@]}"; do if ! command -v "$tool" &> /dev/null; then log_error "$tool is not installed" @@ -53,7 +53,7 @@ verify_version_exists() { get_release_info() { local version=$1 local release_info - + release_info=$(curl -sf "${GITHUB_RELEASES_API}/tags/${version}") || { log_error "Failed to fetch release information for version ${version}" exit 1 @@ -66,14 +66,14 @@ download_and_extract() { local download_url=$2 local base_url="${download_url%/*}" local filename="${download_url##*/}" - + if ! mkdir -p "$TARGET_DIR"; then log_error "Failed to create target directory" exit 1 fi log_success "Downloading version ${version} from ${download_url}" - + if ! curl -L "$download_url" -o "${TARGET_DIR}/release.zip"; then log_error "Download failed" exit 1 @@ -83,7 +83,7 @@ download_and_extract() { rm -f "${TARGET_DIR}/release.zip" exit 1 fi - + if ! unzip -o "${TARGET_DIR}/release.zip" -d "${TARGET_DIR}"; then log_error "Extraction failed" exit 1 @@ -96,11 +96,15 @@ verify_checksum() { local filename="$3" local checksum_filename checksum_filename="${filename%.zip}.CHECKSUM" - + local downloaded_checksum - downloaded_checksum="$(sha256sum "$file_path" | cut -d' ' -f1)" + if [[ "$OSTYPE" == "darwin"* ]]; then + downloaded_checksum="$(shasum -a 256 "$file_path" | cut -d' ' -f1)" + else + downloaded_checksum="$(sha256sum "$file_path" | cut -d' ' -f1)" + fi log_success "File checksum: ${downloaded_checksum}" - + local expected_checksum if ! expected_checksum="$(curl -sL "${base_url}/${checksum_filename}")"; then log_error "Failed to fetch checksum file" @@ -111,7 +115,7 @@ verify_checksum() { log_error "Checksum verification failed" return 1 fi - + return 0 } @@ -123,9 +127,9 @@ cleanup() { main() { trap cleanup EXIT - + check_dependencies - + # Skip if contracts already exist if check_if_contracts_exist; then exit 0 @@ -136,18 +140,18 @@ main() { local release_info release_info=$(get_release_info "$VERSION") - + local download_url download_url=$(echo "$release_info" | jq -r '.assets[] | select(.name | startswith("hyperlane-starknet") and endswith(".zip")) | .browser_download_url') - + if [[ -z "$download_url" ]]; then log_error "Could not find ZIP download URL for release" exit 1 fi - + # Process download and file checksum verification and extraction download_and_extract "$VERSION" "$download_url" - + log_success "Successfully downloaded and extracted version ${VERSION}" } From 82be0180b08697f43accbba910a6669fc5045689 Mon Sep 17 00:00:00 2001 From: Paul Balaji <10051819+paulbalaji@users.noreply.github.com> Date: Mon, 19 May 2025 12:39:17 +0100 Subject: [PATCH 13/16] chore: update print-latest-checkpoints to support all chains (#6254) ### Description chore: update print-latest-checkpoints to support all chains ### Drive-by changes ### Related issues ### Backward compatibility ### Testing tested with forma, which is not in the core supported chains list but we can read checkpoints for now! image --- .../validators/print-latest-checkpoints.ts | 42 +++++++++++++------ 1 file changed, 30 insertions(+), 12 deletions(-) diff --git a/typescript/infra/scripts/validators/print-latest-checkpoints.ts b/typescript/infra/scripts/validators/print-latest-checkpoints.ts index e9d06f1f38a..f0e54992582 100644 --- a/typescript/infra/scripts/validators/print-latest-checkpoints.ts +++ b/typescript/infra/scripts/validators/print-latest-checkpoints.ts @@ -13,9 +13,12 @@ import { rootLogger, } from '@hyperlane-xyz/utils'; +import { Contexts } from '../../config/contexts.js'; +import { getChainAddresses } from '../../config/registry.js'; +import { Role } from '../../src/roles.js'; import { isEthereumProtocolChain } from '../../src/utils/utils.js'; import { getArgs, withChainsRequired } from '../agent-utils.js'; -import { getHyperlaneCore } from '../core-utils.js'; +import { getEnvironmentConfig } from '../core-utils.js'; async function main() { configureRootLogger(LogFormat.Pretty, LogLevel.Info); @@ -53,19 +56,33 @@ async function main() { > > = {}; - // Manually add validator announce for OG Lumia chain deployment - const { core, multiProvider } = await getHyperlaneCore(environment); - const lumiaValidatorAnnounce = ValidatorAnnounce__factory.connect( - '0x989B7307d266151BE763935C856493D968b2affF', - multiProvider.getProvider('lumia'), + // Filter to only include target networks + const chainAddresses = Object.fromEntries( + Object.entries(getChainAddresses()).filter(([chain, _]) => + targetNetworks.includes(chain), + ), + ); + + // Get multiprovider for target networks + const envConfig = getEnvironmentConfig(environment); + const multiProvider = await envConfig.getMultiProvider( + Contexts.Hyperlane, + Role.Deployer, + true, + targetNetworks, ); await Promise.all( targetNetworks.map(async (chain) => { - const validatorAnnounce = - chain === 'lumia' - ? lumiaValidatorAnnounce - : core.getContracts(chain).validatorAnnounce; + if (chain === 'lumia') { + rootLogger.info('Skipping deprecated chain: lumia'); + return; + } + + const validatorAnnounce = ValidatorAnnounce__factory.connect( + chainAddresses[chain]['validatorAnnounce'], + multiProvider.getProvider(chain), + ); const announcedValidators = await validatorAnnounce.getAnnouncedValidators(); @@ -75,7 +92,7 @@ async function main() { ); const defaultIsmValidators = - defaultMultisigConfigs[chain].validators || []; + defaultMultisigConfigs[chain]?.validators || []; const findDefaultValidatorAlias = (address: Address): string => { const validator = defaultIsmValidators.find((v) => @@ -90,8 +107,9 @@ async function main() { const location = storageLocations[i][storageLocations[i].length - 1]; // Skip validators not in default ISM unless --all flag is set + // If it's not a core chain, then we'll want to check all announced validators const isDefaultIsmValidator = findDefaultValidatorAlias(validator); - if (!isDefaultIsmValidator && !all) { + if (defaultIsmValidators.length > 0 && !isDefaultIsmValidator && !all) { continue; } From 4f03dad8083d04de0aec5cf3a6b991cfc4e7e17b Mon Sep 17 00:00:00 2001 From: Paul Balaji <10051819+paulbalaji@users.noreply.github.com> Date: Mon, 19 May 2025 14:16:07 +0100 Subject: [PATCH 14/16] fix: add repository to starknet package.json (#6270) --- starknet/package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/starknet/package.json b/starknet/package.json index 5f0057fc3e5..eabd291c6bc 100644 --- a/starknet/package.json +++ b/starknet/package.json @@ -5,6 +5,7 @@ "type": "module", "homepage": "https://www.hyperlane.xyz", "license": "Apache-2.0", + "repository": "https://github.com/hyperlane-xyz/hyperlane-monorepo", "scripts": { "fetch-contracts": "./scripts/fetch-contracts-release.sh", "generate-artifacts": "tsx ./scripts/generate-artifacts.ts", From 736dc1935e426456fb27647cafad3cd92d1e574e Mon Sep 17 00:00:00 2001 From: Christopher Brumm <97845034+christopherbrumm@users.noreply.github.com> Date: Mon, 19 May 2025 16:44:18 +0200 Subject: [PATCH 15/16] chore: add `MIRAI/abstract-bsc-solanamainnet` (#6238) ### Description Add `MIRAI/abstract-bsc-solanamainnet` token config and program IDs. ### Drive-by changes N/A ### Backward compatibility Yes ### Testing N/A --------- Co-authored-by: xeno097 --- .../program-ids.json | 14 +++++++++++ .../token-config.json | 25 +++++++++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 rust/sealevel/environments/mainnet3/warp-routes/MIRAI-abstract-bsc-solanamainnet/program-ids.json create mode 100644 rust/sealevel/environments/mainnet3/warp-routes/MIRAI-abstract-bsc-solanamainnet/token-config.json diff --git a/rust/sealevel/environments/mainnet3/warp-routes/MIRAI-abstract-bsc-solanamainnet/program-ids.json b/rust/sealevel/environments/mainnet3/warp-routes/MIRAI-abstract-bsc-solanamainnet/program-ids.json new file mode 100644 index 00000000000..7218f048323 --- /dev/null +++ b/rust/sealevel/environments/mainnet3/warp-routes/MIRAI-abstract-bsc-solanamainnet/program-ids.json @@ -0,0 +1,14 @@ +{ + "solanamainnet": { + "hex": "0x1071f5fcc751c8ef4c77456b617b76e17375cddf8364fe417b403f74c43e5d7c", + "base58": "27CK2NMbkSTTddgbBDvujccpqNrfGztr9WggXusNmnD1" + }, + "bsc": { + "hex": "0x000000000000000000000000cb508877ffe5a085b2474641dd3b28f8bc22a57c", + "base58": "1111111111113qHaSkbVC6n27M5jBCfJURoVVszj" + }, + "abstract": { + "hex": "0x000000000000000000000000bcda9ae6a148bc4fb411979ffa883c9d1df08f43", + "base58": "1111111111113dbrwMrFnehbw2Yo2ZaCdnbEJBSz" + } +} \ No newline at end of file diff --git a/rust/sealevel/environments/mainnet3/warp-routes/MIRAI-abstract-bsc-solanamainnet/token-config.json b/rust/sealevel/environments/mainnet3/warp-routes/MIRAI-abstract-bsc-solanamainnet/token-config.json new file mode 100644 index 00000000000..be9da83949e --- /dev/null +++ b/rust/sealevel/environments/mainnet3/warp-routes/MIRAI-abstract-bsc-solanamainnet/token-config.json @@ -0,0 +1,25 @@ +{ + "abstract": { + "type": "synthetic", + "decimals": 6, + "name": "Project Mirai", + "symbol": "MIRAI", + "owner": "", + "foreignDeployment": "0xbCdA9Ae6A148Bc4fb411979fFA883c9D1DF08F43" + }, + "bsc": { + "type": "synthetic", + "decimals": 6, + "name": "Project Mirai", + "symbol": "MIRAI", + "owner": "", + "foreignDeployment": "0xcb508877ffe5a085B2474641dD3B28F8Bc22A57c" + }, + "solanamainnet": { + "type": "collateral", + "decimals": 6, + "interchainGasPaymaster": "AkeHBbE5JkwVppujCQQ6WuxsVsJtruBAjUo6fDCFp6fF", + "token": "5evN2exivZXJfLaA1KhHfiJKWfwH8znqyH36w1SFz89Y", + "owner": "GpYhR9WY1i2V2jE7amN4RsSNSfzu4JeMkPEeWrCprFPS" + } +} \ No newline at end of file From 8601b168fc63e9a4e2962979bf6ca51a496ffbc1 Mon Sep 17 00:00:00 2001 From: Lee <6251863+ltyu@users.noreply.github.com> Date: Mon, 19 May 2025 18:19:37 -0400 Subject: [PATCH 16/16] feat: subtensor USDC (#6277) ### Description This PR adds USDC to subtensor ### Testing checker --- .../program-ids.json | 18 +++++++++++ .../token-config.json | 31 +++++++++++++++++++ 2 files changed, 49 insertions(+) create mode 100644 rust/sealevel/environments/mainnet3/warp-routes/USDC-base-ethereum-solana-subtensor/program-ids.json create mode 100644 rust/sealevel/environments/mainnet3/warp-routes/USDC-base-ethereum-solana-subtensor/token-config.json diff --git a/rust/sealevel/environments/mainnet3/warp-routes/USDC-base-ethereum-solana-subtensor/program-ids.json b/rust/sealevel/environments/mainnet3/warp-routes/USDC-base-ethereum-solana-subtensor/program-ids.json new file mode 100644 index 00000000000..71ac4ba881c --- /dev/null +++ b/rust/sealevel/environments/mainnet3/warp-routes/USDC-base-ethereum-solana-subtensor/program-ids.json @@ -0,0 +1,18 @@ +{ + "base": { + "hex": "0x00000000000000000000000026af973a5b256f9b9bc0b1a3c566de1566568a87", + "base58": "111111111111YG4VUEpTecUfFXDssQfKUpCGdZG" + }, + "ethereum": { + "hex": "0x0000000000000000000000003c43c421f08e2a48889ea3f75a747b7a7a366a0b", + "base58": "111111111111qhNqRUzcpvPZ4XypQPtGsRtHjR4" + }, + "subtensor": { + "hex": "0x000000000000000000000000b833e8137fedf80de7e908dc6fea43a029142f20", + "base58": "1111111111113Zqsxh77mETmH4DKhM9r8bPJonHm" + }, + "solanamainnet": { + "hex": "0x03f0d1b0ebbc3caa2a101111e26b6ee3ac2a971ae2dc841f14eda9b3cb9cf5b7", + "base58": "GPCsiXvm9NaFjrxB6sThscap6akyvRgD5V6decCk25c" + } +} \ No newline at end of file diff --git a/rust/sealevel/environments/mainnet3/warp-routes/USDC-base-ethereum-solana-subtensor/token-config.json b/rust/sealevel/environments/mainnet3/warp-routes/USDC-base-ethereum-solana-subtensor/token-config.json new file mode 100644 index 00000000000..73d9472e270 --- /dev/null +++ b/rust/sealevel/environments/mainnet3/warp-routes/USDC-base-ethereum-solana-subtensor/token-config.json @@ -0,0 +1,31 @@ +{ + "solanamainnet": { + "type": "collateral", + "decimals": 6, + "owner": "BNGDJ1h9brgt6FFVd8No1TVAH48Fp44d7jkuydr1URwJ", + "name": "USD Coin", + "symbol": "USDC", + "token": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", + "interchainGasPaymaster": "AkeHBbE5JkwVppujCQQ6WuxsVsJtruBAjUo6fDCFp6fF", + "uri": "https://raw.githubusercontent.com/hyperlane-xyz/hyperlane-registry/63ae6c0a0415d480c00880e64ec8a9c3724b4e37/deployments/warp_routes/USDC/metadata.json" + }, + "base": { + "type": "collateral", + "decimals": 6, + "foreignDeployment": "0x26af973A5b256F9B9bc0B1A3c566de1566568a87", + "token": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913" + }, + "ethereum": { + "type": "collateral", + "decimals": 6, + "foreignDeployment": "0x3C43C421f08e2a48889eA3F75a747b7a7a366A0b", + "token": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48" + }, + "subtensor": { + "type": "synthetic", + "decimals": 6, + "name": "USD Coin", + "symbol": "USDC", + "foreignDeployment": "0xB833E8137FEDf80de7E908dc6fea43a029142F20" + } +} \ No newline at end of file