diff --git a/CODEOWNERS b/CODEOWNERS index 995b72daf4..a8b8b4036a 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -88,6 +88,7 @@ /modules/sdk-coin-rune/ @BitGo/ethalt-team /modules/sdk-coin-sgb/ @BitGo/ethalt-team /modules/sdk-coin-sol/ @BitGo/ethalt-team +/modules/sdk-coin-solayer/ @BitGo/ethalt-team /modules/sdk-coin-stx/ @BitGo/ethalt-team /modules/sdk-coin-stt/ @BitGo/ethalt-team /modules/sdk-coin-soneium/ @BitGo/ethalt-team diff --git a/Dockerfile b/Dockerfile index 5eef249584..6b7d28cb1b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -111,6 +111,7 @@ COPY --from=builder /tmp/bitgo/modules/sdk-coin-rune /var/modules/sdk-coin-rune/ COPY --from=builder /tmp/bitgo/modules/sdk-coin-sei /var/modules/sdk-coin-sei/ COPY --from=builder /tmp/bitgo/modules/sdk-coin-sgb /var/modules/sdk-coin-sgb/ COPY --from=builder /tmp/bitgo/modules/sdk-coin-sol /var/modules/sdk-coin-sol/ +COPY --from=builder /tmp/bitgo/modules/sdk-coin-solayer /var/modules/sdk-coin-solayer/ COPY --from=builder /tmp/bitgo/modules/sdk-coin-soneium /var/modules/sdk-coin-soneium/ COPY --from=builder /tmp/bitgo/modules/sdk-coin-starknet /var/modules/sdk-coin-starknet/ COPY --from=builder /tmp/bitgo/modules/sdk-coin-stt /var/modules/sdk-coin-stt/ @@ -215,6 +216,7 @@ cd /var/modules/sdk-coin-rune && yarn link && \ cd /var/modules/sdk-coin-sei && yarn link && \ cd /var/modules/sdk-coin-sgb && yarn link && \ cd /var/modules/sdk-coin-sol && yarn link && \ +cd /var/modules/sdk-coin-solayer && yarn link && \ cd /var/modules/sdk-coin-soneium && yarn link && \ cd /var/modules/sdk-coin-starknet && yarn link && \ cd /var/modules/sdk-coin-stt && yarn link && \ @@ -322,6 +324,7 @@ RUN cd /var/bitgo-express && \ yarn link @bitgo/sdk-coin-sei && \ yarn link @bitgo/sdk-coin-sgb && \ yarn link @bitgo/sdk-coin-sol && \ + yarn link @bitgo/sdk-coin-solayer && \ yarn link @bitgo/sdk-coin-soneium && \ yarn link @bitgo/sdk-coin-starknet && \ yarn link @bitgo/sdk-coin-stt && \ diff --git a/modules/account-lib/package.json b/modules/account-lib/package.json index 9fc8f07bc1..dfcf57eee1 100644 --- a/modules/account-lib/package.json +++ b/modules/account-lib/package.json @@ -72,6 +72,7 @@ "@bitgo/sdk-coin-sei": "^3.7.11", "@bitgo/sdk-coin-sgb": "^1.8.11", "@bitgo/sdk-coin-sol": "^7.20.1", + "@bitgo/sdk-coin-solayer": "^1.0.0", "@bitgo/sdk-coin-soneium": "^1.10.11", "@bitgo/sdk-coin-starknet": "^1.3.0", "@bitgo/sdk-coin-stt": "^1.6.11", diff --git a/modules/account-lib/src/index.ts b/modules/account-lib/src/index.ts index ed8c4c9b48..1ad318c4de 100644 --- a/modules/account-lib/src/index.ts +++ b/modules/account-lib/src/index.ts @@ -122,6 +122,9 @@ export { Asi }; import * as Sol from '@bitgo/sdk-coin-sol'; export { Sol }; +import * as Solayer from '@bitgo/sdk-coin-solayer'; +export { Solayer }; + import * as Ada from '@bitgo/sdk-coin-ada'; export { Ada }; diff --git a/modules/account-lib/tsconfig.json b/modules/account-lib/tsconfig.json index 997e0e42c3..fd20e7979d 100644 --- a/modules/account-lib/tsconfig.json +++ b/modules/account-lib/tsconfig.json @@ -112,6 +112,9 @@ { "path": "../sdk-coin-sol" }, + { + "path": "../sdk-coin-solayer" + }, { "path": "../sdk-coin-soneium" }, diff --git a/modules/bitgo/package.json b/modules/bitgo/package.json index 11a629d5ce..e7b8fc2708 100644 --- a/modules/bitgo/package.json +++ b/modules/bitgo/package.json @@ -106,6 +106,7 @@ "@bitgo/sdk-coin-sei": "^3.7.11", "@bitgo/sdk-coin-sgb": "^1.8.11", "@bitgo/sdk-coin-sol": "^7.20.1", + "@bitgo/sdk-coin-solayer": "^1.0.0", "@bitgo/sdk-coin-soneium": "^1.10.11", "@bitgo/sdk-coin-starknet": "^1.3.0", "@bitgo/sdk-coin-stt": "^1.6.11", diff --git a/modules/bitgo/src/v2/coinFactory.ts b/modules/bitgo/src/v2/coinFactory.ts index 0d62ba6566..d7d1ad8019 100644 --- a/modules/bitgo/src/v2/coinFactory.ts +++ b/modules/bitgo/src/v2/coinFactory.ts @@ -128,6 +128,7 @@ import { Sgb, Sip10Token, Sol, + Solayer, Soneium, SoneiumToken, Starknet, @@ -194,6 +195,7 @@ import { Tsgb, Tsei, Tsol, + Tsolayer, Tsoneium, Tstx, Tstt, @@ -746,6 +748,8 @@ export function getCoinConstructor(coinName: string): CoinConstructor | undefine return Sgb.createInstance; case 'sol': return Sol.createInstance; + case 'solayer': + return Solayer.createInstance; case 'soneium': return Soneium.createInstance; case 'starknet': @@ -878,6 +882,8 @@ export function getCoinConstructor(coinName: string): CoinConstructor | undefine return Tsei.createInstance; case 'tsol': return Tsol.createInstance; + case 'tsolayer': + return Tsolayer.createInstance; case 'tsoneium': return Tsoneium.createInstance; case 'tstarknet': diff --git a/modules/bitgo/src/v2/coins/index.ts b/modules/bitgo/src/v2/coins/index.ts index 13b82c2d46..c1869249f3 100644 --- a/modules/bitgo/src/v2/coins/index.ts +++ b/modules/bitgo/src/v2/coins/index.ts @@ -59,6 +59,7 @@ import { Soneium, Tsoneium, SoneiumToken } from '@bitgo/sdk-coin-soneium'; import { Tstt } from '@bitgo/sdk-coin-stt'; import { Sgb, Tsgb } from '@bitgo/sdk-coin-sgb'; import { Sol, Tsol } from '@bitgo/sdk-coin-sol'; +import { Solayer, Tsolayer } from '@bitgo/sdk-coin-solayer'; import { Starknet } from '@bitgo/sdk-coin-starknet'; import { Stx, Tstx, Sip10Token } from '@bitgo/sdk-coin-stx'; import { Sui, Tsui, SuiToken } from '@bitgo/sdk-coin-sui'; @@ -133,6 +134,7 @@ export { Rbtc, Trbtc }; export { Rune, Trune }; export { Sgb, Tsgb }; export { Sol, Tsol }; +export { Solayer, Tsolayer }; export { Soneium, Tsoneium, SoneiumToken }; export { Starknet }; export { Tstt }; diff --git a/modules/bitgo/tsconfig.json b/modules/bitgo/tsconfig.json index 26c3e3d8c2..11a77be97c 100644 --- a/modules/bitgo/tsconfig.json +++ b/modules/bitgo/tsconfig.json @@ -230,6 +230,9 @@ { "path": "../sdk-coin-sol" }, + { + "path": "../sdk-coin-solayer" + }, { "path": "../sdk-coin-starknet" }, diff --git a/modules/sdk-coin-solayer/.mocharc.yml b/modules/sdk-coin-solayer/.mocharc.yml new file mode 100644 index 0000000000..f499ec0a83 --- /dev/null +++ b/modules/sdk-coin-solayer/.mocharc.yml @@ -0,0 +1,8 @@ +require: 'tsx' +timeout: '60000' +reporter: 'min' +reporter-option: + - 'cdn=true' + - 'json=false' +exit: true +spec: ['test/unit/**/*.ts'] diff --git a/modules/sdk-coin-solayer/package.json b/modules/sdk-coin-solayer/package.json new file mode 100644 index 0000000000..f244741f1a --- /dev/null +++ b/modules/sdk-coin-solayer/package.json @@ -0,0 +1,71 @@ +{ + "name": "@bitgo/sdk-coin-solayer", + "version": "1.0.0", + "description": "BitGo SDK coin library for Solayer", + "main": "./dist/cjs/src/index.js", + "module": "./dist/esm/index.js", + "browser": "./dist/esm/index.js", + "types": "./dist/cjs/src/index.d.ts", + "exports": { + ".": { + "import": { + "types": "./dist/esm/index.d.ts", + "default": "./dist/esm/index.js" + }, + "require": { + "types": "./dist/cjs/src/index.d.ts", + "default": "./dist/cjs/src/index.js" + } + } + }, + "scripts": { + "build": "npm run build:cjs && npm run build:esm", + "build:cjs": "yarn tsc --build --incremental --verbose .", + "build:esm": "yarn tsc --project tsconfig.esm.json", + "fmt": "prettier --write .", + "check-fmt": "prettier --check '**/*.{ts,js,json}'", + "clean": "rm -rf ./dist", + "lint": "eslint --quiet .", + "prepare": "npm run build", + "test": "npm run coverage", + "coverage": "nyc -- npm run unit-test", + "unit-test": "mocha" + }, + "author": "BitGo SDK Team ", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "repository": { + "type": "git", + "url": "https://github.com/BitGo/BitGoJS.git", + "directory": "modules/sdk-coin-solayer" + }, + "lint-staged": { + "*.{js,ts}": [ + "yarn prettier --write", + "yarn eslint --fix" + ] + }, + "publishConfig": { + "access": "public" + }, + "nyc": { + "extension": [ + ".ts" + ] + }, + "dependencies": { + "@bitgo/sdk-coin-sol": "^7.20.1", + "@bitgo/sdk-core": "^37.3.0", + "@bitgo/statics": "^58.43.0" + }, + "devDependencies": { + "@bitgo/sdk-api": "^1.81.1", + "@bitgo/sdk-test": "^9.1.46" + }, + "files": [ + "dist/cjs", + "dist/esm" + ] +} diff --git a/modules/sdk-coin-solayer/src/index.ts b/modules/sdk-coin-solayer/src/index.ts new file mode 100644 index 0000000000..a60a0f1a56 --- /dev/null +++ b/modules/sdk-coin-solayer/src/index.ts @@ -0,0 +1,3 @@ +export { Solayer } from './solayer'; +export { Tsolayer } from './tsolayer'; +export { register } from './register'; diff --git a/modules/sdk-coin-solayer/src/lib/constants.ts b/modules/sdk-coin-solayer/src/lib/constants.ts new file mode 100644 index 0000000000..a7ef626801 --- /dev/null +++ b/modules/sdk-coin-solayer/src/lib/constants.ts @@ -0,0 +1,12 @@ +/** + * Solayer Chain Constants + * + * Solayer is an SVM-compatible blockchain with hardware-accelerated consensus. + * Uses the same transaction format as Solana but with its own network endpoints. + */ + +export const MAINNET_RPC_URL = 'https://mainnet-rpc.solayer.org'; +export const TESTNET_RPC_URL = 'https://devnet-rpc.solayer.org'; + +export const MAINNET_EXPLORER_URL = 'https://explorer.solayer.org/tx/'; +export const TESTNET_EXPLORER_URL = 'https://explorer.solayer.org/tx/?cluster=devnet'; diff --git a/modules/sdk-coin-solayer/src/register.ts b/modules/sdk-coin-solayer/src/register.ts new file mode 100644 index 0000000000..203484d77c --- /dev/null +++ b/modules/sdk-coin-solayer/src/register.ts @@ -0,0 +1,8 @@ +import { BitGoBase } from '@bitgo/sdk-core'; +import { Solayer } from './solayer'; +import { Tsolayer } from './tsolayer'; + +export const register = (sdk: BitGoBase): void => { + sdk.register('solayer', Solayer.createInstance); + sdk.register('tsolayer', Tsolayer.createInstance); +}; diff --git a/modules/sdk-coin-solayer/src/solayer.ts b/modules/sdk-coin-solayer/src/solayer.ts new file mode 100644 index 0000000000..7f0261a677 --- /dev/null +++ b/modules/sdk-coin-solayer/src/solayer.ts @@ -0,0 +1,36 @@ +import { BaseCoin, BitGoBase, Environments } from '@bitgo/sdk-core'; +import { Sol } from '@bitgo/sdk-coin-sol'; +import { BaseCoin as StaticsBaseCoin } from '@bitgo/statics'; + +export class Solayer extends Sol { + protected readonly _staticsCoin: Readonly; + + constructor(bitgo: BitGoBase, staticsCoin?: Readonly) { + super(bitgo, staticsCoin); + + if (!staticsCoin) { + throw new Error('missing required constructor parameter staticsCoin'); + } + + this._staticsCoin = staticsCoin; + } + + static createInstance(bitgo: BitGoBase, staticsCoin?: Readonly): BaseCoin { + return new Solayer(bitgo, staticsCoin); + } + + getChain(): string { + return this._staticsCoin.name; + } + + getFullName(): string { + return this._staticsCoin.fullName; + } + + /** + * Solayer uses its own RPC endpoints, not Solana's. + */ + protected getPublicNodeUrl(): string { + return Environments[this.bitgo.getEnv()].solayerNodeUrl; + } +} diff --git a/modules/sdk-coin-solayer/src/tsolayer.ts b/modules/sdk-coin-solayer/src/tsolayer.ts new file mode 100644 index 0000000000..219cb2606f --- /dev/null +++ b/modules/sdk-coin-solayer/src/tsolayer.ts @@ -0,0 +1,13 @@ +import { BaseCoin, BitGoBase } from '@bitgo/sdk-core'; +import { BaseCoin as StaticsBaseCoin } from '@bitgo/statics'; +import { Solayer } from './solayer'; + +export class Tsolayer extends Solayer { + constructor(bitgo: BitGoBase, staticsCoin?: Readonly) { + super(bitgo, staticsCoin); + } + + static createInstance(bitgo: BitGoBase, staticsCoin?: Readonly): BaseCoin { + return new Tsolayer(bitgo, staticsCoin); + } +} diff --git a/modules/sdk-coin-solayer/test/unit/solayer.ts b/modules/sdk-coin-solayer/test/unit/solayer.ts new file mode 100644 index 0000000000..b1014aee76 --- /dev/null +++ b/modules/sdk-coin-solayer/test/unit/solayer.ts @@ -0,0 +1,55 @@ +import { TestBitGo, TestBitGoAPI } from '@bitgo/sdk-test'; +import { BitGoAPI } from '@bitgo/sdk-api'; +import { Solayer, Tsolayer } from '../../src'; + +describe('Solayer:', function () { + let bitgo: TestBitGoAPI; + let solayer: Solayer; + let tsolayer: Tsolayer; + + before(function () { + bitgo = TestBitGo.decorate(BitGoAPI, { env: 'mock' }); + bitgo.safeRegister('solayer', Solayer.createInstance); + bitgo.safeRegister('tsolayer', Tsolayer.createInstance); + bitgo.initializeTestVars(); + solayer = bitgo.coin('solayer') as Solayer; + tsolayer = bitgo.coin('tsolayer') as Tsolayer; + }); + + describe('Basic Coin Properties', function () { + it('should return the correct coin name', function () { + solayer.getChain().should.equal('solayer'); + tsolayer.getChain().should.equal('tsolayer'); + }); + + it('should return the correct full name', function () { + solayer.getFullName().should.equal('Solayer'); + tsolayer.getFullName().should.equal('Testnet Solayer'); + }); + + it('should return the correct base factor', function () { + solayer.getBaseFactor().should.equal(1e9); + tsolayer.getBaseFactor().should.equal(1e9); + }); + + it('should support TSS', function () { + solayer.supportsTss().should.be.true(); + tsolayer.supportsTss().should.be.true(); + }); + + it('should use EdDSA MPC algorithm', function () { + solayer.getMPCAlgorithm().should.equal('eddsa'); + tsolayer.getMPCAlgorithm().should.equal('eddsa'); + }); + + it('should validate valid addresses', function () { + // Standard Solana base58 addresses work on Solayer + solayer.isValidAddress('5hr5fisPi6DXNuuRpm5XUbzpiEnmdyxXuBDTwzwZj5Pe').should.be.true(); + }); + + it('should reject invalid addresses', function () { + solayer.isValidAddress('invalid_address').should.be.false(); + solayer.isValidAddress('').should.be.false(); + }); + }); +}); diff --git a/modules/sdk-coin-solayer/tsconfig.esm.json b/modules/sdk-coin-solayer/tsconfig.esm.json new file mode 100644 index 0000000000..17f39ab0f3 --- /dev/null +++ b/modules/sdk-coin-solayer/tsconfig.esm.json @@ -0,0 +1,17 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./dist/esm", + "rootDir": "./src", + "module": "ES2020", + "target": "ES2020", + "moduleResolution": "bundler", + "lib": ["ES2020", "DOM"], + "declaration": true, + "declarationMap": true, + "skipLibCheck": true + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "test", "dist"], + "references": [] +} diff --git a/modules/sdk-coin-solayer/tsconfig.json b/modules/sdk-coin-solayer/tsconfig.json new file mode 100644 index 0000000000..545a4c1a24 --- /dev/null +++ b/modules/sdk-coin-solayer/tsconfig.json @@ -0,0 +1,29 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "./dist/cjs", + "rootDir": "./", + "strictPropertyInitialization": false, + "esModuleInterop": true, + "typeRoots": ["../../types", "./node_modules/@types", "../../node_modules/@types"] + }, + "include": ["src/**/*", "test/**/*"], + "exclude": ["node_modules"], + "references": [ + { + "path": "../sdk-api" + }, + { + "path": "../sdk-coin-sol" + }, + { + "path": "../sdk-core" + }, + { + "path": "../sdk-test" + }, + { + "path": "../statics" + } + ] +} diff --git a/modules/sdk-core/src/bitgo/environments.ts b/modules/sdk-core/src/bitgo/environments.ts index 4054ca010f..208ac4c114 100644 --- a/modules/sdk-core/src/bitgo/environments.ts +++ b/modules/sdk-core/src/bitgo/environments.ts @@ -38,6 +38,7 @@ interface EnvironmentTemplate { nearNodeUrls: string[]; solNodeUrl: string; solAlchemyNodeUrl: string; + solayerNodeUrl: string; adaNodeUrl: string; hashNodeUrl: string; injNodeUrl: string; @@ -183,6 +184,7 @@ const mainnetBase: EnvironmentTemplate = { nearNodeUrls: ['https://api.fastnear.com'], solNodeUrl: 'https://api.mainnet-beta.solana.com', solAlchemyNodeUrl: 'https://solana-mainnet.g.alchemy.com/v2', + solayerNodeUrl: 'https://mainnet-rpc.solayer.org', adaNodeUrl: 'https://api.koios.rest/api/v1', hashNodeUrl: 'https://api.provenance.io', injNodeUrl: 'https://sentry.lcd.injective.network', // reference https://docs.injective.network/develop/public-endpoints/ @@ -415,6 +417,7 @@ const testnetBase: EnvironmentTemplate = { nearNodeUrls: ['https://test.rpc.fastnear.com'], solNodeUrl: 'https://api.devnet.solana.com', solAlchemyNodeUrl: 'https://solana-devnet.g.alchemy.com/v2', + solayerNodeUrl: 'https://devnet-rpc.solayer.org', adaNodeUrl: 'https://preprod.koios.rest/api/v1', hashNodeUrl: 'https://api.test.provenance.io', injNodeUrl: 'https://testnet.sentry.lcd.injective.network', // COIN-1219 : reference https://docs.injective.network/develop/public-endpoints/#testnet diff --git a/modules/statics/src/allCoinsAndTokens.ts b/modules/statics/src/allCoinsAndTokens.ts index 496e258f6b..50db08d38b 100644 --- a/modules/statics/src/allCoinsAndTokens.ts +++ b/modules/statics/src/allCoinsAndTokens.ts @@ -120,6 +120,8 @@ import { SEI_FEATURES, SGB_FEATURES, SOL_FEATURES, + SOLAYER_FEATURES, + TSOLAYER_FEATURES, SONEIUM_FEATURES, STARKNET_FEATURES, STX_FEATURES, @@ -772,6 +774,28 @@ export const allCoinsAndTokens = [ TSOL_FEATURES, KeyCurve.Ed25519 ), + account( + '100c4f50-e4f1-448c-8db0-2fe4e2c8134a', + 'solayer', + 'Solayer', + Networks.main.solayer, + 9, + UnderlyingAsset.SOLAYER, + BaseUnit.SOLAYER, + SOLAYER_FEATURES, + KeyCurve.Ed25519 + ), + account( + '095a4797-4d6f-4d42-b110-25dbe99a30a5', + 'tsolayer', + 'Testnet Solayer', + Networks.test.solayer, + 9, + UnderlyingAsset.SOLAYER, + BaseUnit.SOLAYER, + TSOLAYER_FEATURES, + KeyCurve.Ed25519 + ), account( '8979b9a7-c2ea-4154-b4ae-4b905afe6c4a', 'sui', diff --git a/modules/statics/src/base.ts b/modules/statics/src/base.ts index 86cc9ebfb8..34eb2223ea 100644 --- a/modules/statics/src/base.ts +++ b/modules/statics/src/base.ts @@ -114,6 +114,7 @@ export enum CoinFamily { SEI = 'sei', SEIEVM = 'seievm', SOL = 'sol', + SOLAYER = 'solayer', SONIC = 'sonic', SONEIUM = 'soneium', STARKNET = 'starknet', @@ -697,6 +698,7 @@ export enum UnderlyingAsset { SEIEVM = 'seievm', SGB = 'sgb', SOL = 'sol', + SOLAYER = 'solayer', SOMI = 'somi', // Somnia Chain SONEIUM = 'soneium', SONIC = 'sonic', @@ -4051,6 +4053,7 @@ export enum BaseUnit { TASI = 'atestfet', CANTON = 'canton', KASPA = 'sompi', + SOLAYER = 'lamport', STARKNET = 'fri', USDC = 'usdc', } diff --git a/modules/statics/src/coinFeatures.ts b/modules/statics/src/coinFeatures.ts index 1a97ed34a3..9cdc4210ff 100644 --- a/modules/statics/src/coinFeatures.ts +++ b/modules/statics/src/coinFeatures.ts @@ -291,6 +291,17 @@ export const SOL_FEATURES = [ CoinFeature.CUSTODY_BULK_TRANSACTION, ]; export const TSOL_FEATURES = [...SOL_FEATURES, CoinFeature.BULK_TRANSACTION, CoinFeature.CUSTODY_BITGO_SINGAPORE]; +export const SOLAYER_FEATURES = [ + ...ACCOUNT_COIN_DEFAULT_FEATURES, + CoinFeature.TSS, + CoinFeature.TSS_COLD, + CoinFeature.REQUIRES_RESERVE, + CoinFeature.SUPPORTS_TOKENS, + CoinFeature.CUSTODY_BITGO_GERMANY, + CoinFeature.CUSTODY_BITGO_FRANKFURT, + CoinFeature.BULK_TRANSACTION, +]; +export const TSOLAYER_FEATURES = [...SOLAYER_FEATURES, CoinFeature.CUSTODY_BITGO_SINGAPORE]; export const SOL_TOKEN_FEATURES = [ ...ACCOUNT_COIN_DEFAULT_FEATURES, CoinFeature.TSS, diff --git a/modules/statics/src/coins/ofcCoins.ts b/modules/statics/src/coins/ofcCoins.ts index 4940fcf13f..6881d21a27 100644 --- a/modules/statics/src/coins/ofcCoins.ts +++ b/modules/statics/src/coins/ofcCoins.ts @@ -149,6 +149,15 @@ export const ofcCoins = [ ofc('7b79bc25-5497-4350-b961-4bbed2bea994', 'ofcsui', 'Sui', 9, UnderlyingAsset.SUI, CoinKind.CRYPTO), ofc('31bae66e-a135-42f9-b9d3-1623ab9c7ecc', 'ofctrx', 'Tron', 6, UnderlyingAsset.TRX, CoinKind.CRYPTO), ofc('dbbceebe-9096-4d7b-ae9e-31eb8a3dc5ca', 'ofcsol', 'Solana', 9, UnderlyingAsset.SOL, CoinKind.CRYPTO), + ofc('e6469c81-1efd-43f2-8d28-878361f73846', 'ofcsolayer', 'Solayer', 9, UnderlyingAsset.SOLAYER, CoinKind.CRYPTO), + tofc( + '362f5ee1-115a-4302-a841-bd335d95e39c', + 'ofctsolayer', + 'Testnet Solayer', + 9, + UnderlyingAsset.SOLAYER, + CoinKind.CRYPTO + ), ofc('07301a34-7e47-417e-a2cb-00ef609d59a1', 'ofcdoge', 'Dogecoin', 8, UnderlyingAsset.DOGE, CoinKind.CRYPTO), ofc('5beca519-4479-4878-8e8a-a910226438c0', 'ofcada', 'Cardano', 6, UnderlyingAsset.ADA, CoinKind.CRYPTO), ofc( diff --git a/modules/statics/src/networks.ts b/modules/statics/src/networks.ts index f0c0832196..23cdf0a696 100644 --- a/modules/statics/src/networks.ts +++ b/modules/statics/src/networks.ts @@ -948,6 +948,18 @@ class SolTestnet extends Testnet implements AccountNetwork { explorerUrl = 'https://explorer.solana.com/tx/?cluster=devnet'; } +class SolayerMainnet extends Mainnet implements AccountNetwork { + name = 'Solayer'; + family = CoinFamily.SOLAYER; + explorerUrl = 'https://explorer.solayer.org/tx/'; +} + +class SolayerTestnet extends Testnet implements AccountNetwork { + name = 'SolayerTestnet'; + family = CoinFamily.SOLAYER; + explorerUrl = 'https://explorer.solayer.org/tx/?cluster=devnet'; +} + class StarknetMainnet extends Mainnet implements AccountNetwork { name = 'Starknet'; family = CoinFamily.STARKNET; @@ -2921,6 +2933,7 @@ export const Networks = { seievm: Object.freeze(new SeiEvm()), sgb: Object.freeze(new Songbird()), sol: Object.freeze(new Sol()), + solayer: Object.freeze(new SolayerMainnet()), sonic: Object.freeze(new Sonic()), starknet: Object.freeze(new StarknetMainnet()), sui: Object.freeze(new Sui()), @@ -3052,6 +3065,7 @@ export const Networks = { sei: Object.freeze(new SeiTestnet()), seievm: Object.freeze(new SeiEvmTestnet()), sol: Object.freeze(new SolTestnet()), + solayer: Object.freeze(new SolayerTestnet()), starknet: Object.freeze(new StarknetTestnet()), sui: Object.freeze(new SuiTestnet()), near: Object.freeze(new NearTestnet()), diff --git a/modules/statics/test/unit/fixtures/expectedColdFeatures.ts b/modules/statics/test/unit/fixtures/expectedColdFeatures.ts index c4b6b9d763..dedb28d296 100644 --- a/modules/statics/test/unit/fixtures/expectedColdFeatures.ts +++ b/modules/statics/test/unit/fixtures/expectedColdFeatures.ts @@ -135,6 +135,7 @@ export const expectedColdFeatures = { 'sei', 'seievm', 'sol', + 'solayer', 'sonic', 'somi', 'starknet', @@ -223,6 +224,7 @@ export const expectedColdFeatures = { 'tsei', 'tsgb', 'tsol', + 'tsolayer', 'tstarknet', 'tstt', 'tsui', diff --git a/tsconfig.packages.json b/tsconfig.packages.json index 8145df7655..fe7e638b06 100644 --- a/tsconfig.packages.json +++ b/tsconfig.packages.json @@ -217,6 +217,9 @@ { "path": "./modules/sdk-coin-sol" }, + { + "path": "./modules/sdk-coin-solayer" + }, { "path": "./modules/sdk-coin-soneium" },