From 33b45c137c3f80d793486e18b9fb19d86665b891 Mon Sep 17 00:00:00 2001 From: Luis Covarrubias Date: Mon, 2 Feb 2026 12:20:35 -0800 Subject: [PATCH] feat: hemi test ticket: BG-0 --- modules/bitgo/src/v2/coinFactory.ts | 8 + modules/bitgo/src/v2/coins/index.ts | 2 + modules/sdk-coin-hemi/.eslintignore | 2 + modules/sdk-coin-hemi/.gitignore | 3 + modules/sdk-coin-hemi/.mocharc.yml | 8 + modules/sdk-coin-hemi/.npmignore | 10 + modules/sdk-coin-hemi/.prettierignore | 2 + modules/sdk-coin-hemi/.prettierrc.yml | 3 + modules/sdk-coin-hemi/README.md | 30 + .../bitgo-sdk-coin-hemi-1.0.0.tgz | Bin 0 -> 99427 bytes modules/sdk-coin-hemi/package.json | 56 ++ modules/sdk-coin-hemi/src/hemi.ts | 65 ++ modules/sdk-coin-hemi/src/index.ts | 4 + modules/sdk-coin-hemi/src/lib/index.ts | 4 + modules/sdk-coin-hemi/src/lib/resources.ts | 28 + .../src/lib/transactionBuilder.ts | 33 + .../sdk-coin-hemi/src/lib/transferBuilder.ts | 1 + modules/sdk-coin-hemi/src/lib/utils.ts | 21 + modules/sdk-coin-hemi/src/lib/walletUtil.ts | 612 ++++++++++++++++++ modules/sdk-coin-hemi/src/register.ts | 8 + modules/sdk-coin-hemi/src/themi.ts | 17 + .../sdk-coin-hemi/test/integration/index.ts | 11 + modules/sdk-coin-hemi/test/unit/index.ts | 82 +++ modules/sdk-coin-hemi/tsconfig.json | 26 + modules/statics/src/allCoinsAndTokens.ts | 21 + modules/statics/src/base.ts | 2 + modules/statics/src/coinFeatures.ts | 12 + modules/statics/src/networks.ts | 22 + 28 files changed, 1093 insertions(+) create mode 100644 modules/sdk-coin-hemi/.eslintignore create mode 100644 modules/sdk-coin-hemi/.gitignore create mode 100644 modules/sdk-coin-hemi/.mocharc.yml create mode 100644 modules/sdk-coin-hemi/.npmignore create mode 100644 modules/sdk-coin-hemi/.prettierignore create mode 100644 modules/sdk-coin-hemi/.prettierrc.yml create mode 100644 modules/sdk-coin-hemi/README.md create mode 100644 modules/sdk-coin-hemi/bitgo-sdk-coin-hemi-1.0.0.tgz create mode 100644 modules/sdk-coin-hemi/package.json create mode 100644 modules/sdk-coin-hemi/src/hemi.ts create mode 100644 modules/sdk-coin-hemi/src/index.ts create mode 100644 modules/sdk-coin-hemi/src/lib/index.ts create mode 100644 modules/sdk-coin-hemi/src/lib/resources.ts create mode 100644 modules/sdk-coin-hemi/src/lib/transactionBuilder.ts create mode 100644 modules/sdk-coin-hemi/src/lib/transferBuilder.ts create mode 100644 modules/sdk-coin-hemi/src/lib/utils.ts create mode 100644 modules/sdk-coin-hemi/src/lib/walletUtil.ts create mode 100644 modules/sdk-coin-hemi/src/register.ts create mode 100644 modules/sdk-coin-hemi/src/themi.ts create mode 100644 modules/sdk-coin-hemi/test/integration/index.ts create mode 100644 modules/sdk-coin-hemi/test/unit/index.ts create mode 100644 modules/sdk-coin-hemi/tsconfig.json diff --git a/modules/bitgo/src/v2/coinFactory.ts b/modules/bitgo/src/v2/coinFactory.ts index f48257905f..41c128c0e0 100644 --- a/modules/bitgo/src/v2/coinFactory.ts +++ b/modules/bitgo/src/v2/coinFactory.ts @@ -100,6 +100,7 @@ import { Gteth, Hash, Hbar, + Hemi, Hteth, Icp, Initia, @@ -179,6 +180,7 @@ import { TfiatUsd, Thash, Thbar, + Themi, Tia, Ticp, Tinitia, @@ -285,6 +287,7 @@ export function registerCoinConstructors(coinFactory: CoinFactory, coinMap: Coin coinFactory.register('gteth', Gteth.createInstance); coinFactory.register('hash', Hash.createInstance); coinFactory.register('hbar', Hbar.createInstance); + coinFactory.register('hemi', Hemi.createInstance); coinFactory.register('hteth', Hteth.createInstance); coinFactory.register('lnbtc', Lnbtc.createInstance); coinFactory.register('ltc', Ltc.createInstance); @@ -357,6 +360,7 @@ export function registerCoinConstructors(coinFactory: CoinFactory, coinMap: Coin coinFactory.register('tmon', Tmon.createInstance); coinFactory.register('thash', Thash.createInstance); coinFactory.register('thbar', Thbar.createInstance); + coinFactory.register('themi', Themi.createInstance); coinFactory.register('ticp', Ticp.createInstance); coinFactory.register('tinitia', Tinitia.createInstance); coinFactory.register('tinjective', Tinjective.createInstance); @@ -715,6 +719,8 @@ export function getCoinConstructor(coinName: string): CoinConstructor | undefine return Hash.createInstance; case 'hbar': return Hbar.createInstance; + case 'hemi': + return Hemi.createInstance; case 'hteth': return Hteth.createInstance; case 'lnbtc': @@ -859,6 +865,8 @@ export function getCoinConstructor(coinName: string): CoinConstructor | undefine return Thash.createInstance; case 'thbar': return Thbar.createInstance; + case 'themi': + return Themi.createInstance; case 'ticp': return Ticp.createInstance; case 'tinitia': diff --git a/modules/bitgo/src/v2/coins/index.ts b/modules/bitgo/src/v2/coins/index.ts index 606c54f97c..45c96ce5e9 100644 --- a/modules/bitgo/src/v2/coins/index.ts +++ b/modules/bitgo/src/v2/coins/index.ts @@ -38,6 +38,7 @@ import { Ethw } from '@bitgo/sdk-coin-ethw'; import { EthLikeCoin, TethLikeCoin } from '@bitgo/sdk-coin-ethlike'; import { Hash, Thash, HashToken } from '@bitgo/sdk-coin-hash'; import { Hbar, Thbar } from '@bitgo/sdk-coin-hbar'; +import { Hemi, Themi } from '@bitgo/sdk-coin-hemi'; import { Icp, Ticp } from '@bitgo/sdk-coin-icp'; import { Initia, Tinitia } from '@bitgo/sdk-coin-initia'; import { Injective, Tinjective } from '@bitgo/sdk-coin-injective'; @@ -115,6 +116,7 @@ export { Flr, Tflr, FlrToken }; export { Flrp }; export { Hash, Thash, HashToken }; export { Hbar, Thbar }; +export { Hemi, Themi }; export { Icp, Ticp }; export { Initia, Tinitia }; export { Iota }; diff --git a/modules/sdk-coin-hemi/.eslintignore b/modules/sdk-coin-hemi/.eslintignore new file mode 100644 index 0000000000..de4d1f007d --- /dev/null +++ b/modules/sdk-coin-hemi/.eslintignore @@ -0,0 +1,2 @@ +dist +node_modules diff --git a/modules/sdk-coin-hemi/.gitignore b/modules/sdk-coin-hemi/.gitignore new file mode 100644 index 0000000000..d62464f3e6 --- /dev/null +++ b/modules/sdk-coin-hemi/.gitignore @@ -0,0 +1,3 @@ +/dist +/node_modules +/.nyc_output diff --git a/modules/sdk-coin-hemi/.mocharc.yml b/modules/sdk-coin-hemi/.mocharc.yml new file mode 100644 index 0000000000..1cef946aa1 --- /dev/null +++ b/modules/sdk-coin-hemi/.mocharc.yml @@ -0,0 +1,8 @@ +require: 'tsx' +timeout: '120000' +reporter: 'min' +reporter-option: + - 'cdn=true' + - 'json=false' +exit: true +spec: ['test/unit/**/*.ts'] diff --git a/modules/sdk-coin-hemi/.npmignore b/modules/sdk-coin-hemi/.npmignore new file mode 100644 index 0000000000..85677ec29f --- /dev/null +++ b/modules/sdk-coin-hemi/.npmignore @@ -0,0 +1,10 @@ +**/*.ts +!**/*.d.ts +src +test +tsconfig.json +tslint.json +.gitignore +.eslintignore +.mocharc.yml +.prettierignore diff --git a/modules/sdk-coin-hemi/.prettierignore b/modules/sdk-coin-hemi/.prettierignore new file mode 100644 index 0000000000..de4d1f007d --- /dev/null +++ b/modules/sdk-coin-hemi/.prettierignore @@ -0,0 +1,2 @@ +dist +node_modules diff --git a/modules/sdk-coin-hemi/.prettierrc.yml b/modules/sdk-coin-hemi/.prettierrc.yml new file mode 100644 index 0000000000..5198f5e019 --- /dev/null +++ b/modules/sdk-coin-hemi/.prettierrc.yml @@ -0,0 +1,3 @@ +printWidth: 120 +singleQuote: true +trailingComma: es5 diff --git a/modules/sdk-coin-hemi/README.md b/modules/sdk-coin-hemi/README.md new file mode 100644 index 0000000000..bf66fd0da6 --- /dev/null +++ b/modules/sdk-coin-hemi/README.md @@ -0,0 +1,30 @@ +# BitGo sdk-coin-hemi + +SDK coins provide a modular approach to a monolithic architecture. This and all BitGoJS SDK coins allow developers to use only the coins needed for a given project. + +## Installation + +All coins are loaded traditionally through the `bitgo` package. If you are using coins individually, you will be accessing the coin via the `@bitgo/sdk-api` package. + +In your project install both `@bitgo/sdk-api` and `@bitgo/sdk-coin-hemi`. + +```shell +npm i @bitgo/sdk-api @bitgo/sdk-coin-hemi +``` + +Next, you will be able to initialize an instance of "bitgo" through `@bitgo/sdk-api` instead of `bitgo`. + +```javascript +import { BitGoAPI } from '@bitgo/sdk-api'; +import { Hemi } from '@bitgo/sdk-coin-hemi'; + +const sdk = new BitGoAPI(); + +sdk.register('hemi', Hemi.createInstance); +``` + +## Development + +Most of the coin implementations are derived from `@bitgo/sdk-core`, `@bitgo/statics`, and coin specific packages. These implementations are used to interact with the BitGo API and BitGo platform services. + +You will notice that the basic version of common class extensions have been provided to you and must be resolved before the package build will succeed. Upon initiation of a given SDK coin, you will need to verify that your coin has been included in the root `tsconfig.packages.json` and that the linting, formatting, and testing succeeds when run both within the coin and from the root of BitGoJS. diff --git a/modules/sdk-coin-hemi/bitgo-sdk-coin-hemi-1.0.0.tgz b/modules/sdk-coin-hemi/bitgo-sdk-coin-hemi-1.0.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..97d9584e1368c00db08a6d596457579b617f904c GIT binary patch literal 99427 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 br{Dkm{_ppHzyJIH`tN@LCaIlv0E7krNE81+ literal 0 HcmV?d00001 diff --git a/modules/sdk-coin-hemi/package.json b/modules/sdk-coin-hemi/package.json new file mode 100644 index 0000000000..4d3df4afae --- /dev/null +++ b/modules/sdk-coin-hemi/package.json @@ -0,0 +1,56 @@ +{ + "name": "@bitgo/sdk-coin-hemi", + "version": "1.0.0", + "description": "BitGo SDK coin library for Hemi Network", + "main": "./dist/src/index.js", + "types": "./dist/src/index.d.ts", + "scripts": { + "build": "yarn tsc --build --incremental --verbose .", + "fmt": "prettier --write .", + "check-fmt": "prettier --check '**/*.{ts,js,json}'", + "clean": "rm -r ./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 <25" + }, + "repository": { + "type": "git", + "url": "https://github.com/BitGo/BitGoJS.git", + "directory": "modules/sdk-coin-hemi" + }, + "lint-staged": { + "*.{js,ts}": [ + "yarn prettier --write", + "yarn eslint --fix" + ] + }, + "publishConfig": { + "access": "public" + }, + "nyc": { + "extension": [ + ".ts" + ] + }, + "dependencies": { + "@bitgo/sdk-core": "^36.30.0", + "@bitgo/statics": "^58.24.0", + "bignumber.js": "^9.1.1", + "@bitgo/sdk-lib-mpc": "^10.9.0", + "@bitgo/abstract-eth": "^24.20.0" + }, + "devDependencies": { + "@bitgo/sdk-api": "^1.73.4", + "@bitgo/sdk-test": "^9.1.25" + }, + "files": [ + "dist" + ] +} diff --git a/modules/sdk-coin-hemi/src/hemi.ts b/modules/sdk-coin-hemi/src/hemi.ts new file mode 100644 index 0000000000..b18d8b61a1 --- /dev/null +++ b/modules/sdk-coin-hemi/src/hemi.ts @@ -0,0 +1,65 @@ +/** + * @prettier + */ +import { BaseCoin, BitGoBase, MPCAlgorithm, MultisigType, multisigTypes } from '@bitgo/sdk-core'; +import { BaseCoin as StaticsBaseCoin, coins, ethGasConfigs } from '@bitgo/statics'; +import { AbstractEthLikeNewCoins, TransactionBuilder as EthLikeTransactionBuilder } from '@bitgo/abstract-eth'; + +import { TransactionBuilder } from './lib'; + +export class Hemi extends AbstractEthLikeNewCoins { + protected constructor(bitgo: BitGoBase, staticsCoin?: Readonly) { + super(bitgo, staticsCoin); + } + + static createInstance(bitgo: BitGoBase, staticsCoin?: Readonly): BaseCoin { + return new Hemi(bitgo, staticsCoin); + } + + protected getTransactionBuilder(): EthLikeTransactionBuilder { + return new TransactionBuilder(coins.get(this.getBaseChain())); + } + + /** @inheritDoc */ + supportsTss(): boolean { + return true; + } + + /** @inheritDoc */ + getMPCAlgorithm(): MPCAlgorithm { + return 'ecdsa'; + } + + /** @inheritDoc */ + supportsMessageSigning(): boolean { + return true; + } + + /** @inheritDoc */ + supportsSigningTypedData(): boolean { + return true; + } + + /** + * Check whether gas limit passed in by user are within our max and min bounds + * If they are not set, set them to the defaults + * @param {number} userGasLimit user defined gas limit + * @returns {number} the gas limit to use for this transaction + */ + setGasLimit(userGasLimit?: number): number { + if (!userGasLimit) { + return ethGasConfigs.defaultGasLimit; + } + const gasLimitMax = ethGasConfigs.maximumGasLimit; + const gasLimitMin = ethGasConfigs.newEthLikeCoinsMinGasLimit; + if (userGasLimit < gasLimitMin || userGasLimit > gasLimitMax) { + throw new Error(`Gas limit must be between ${gasLimitMin} and ${gasLimitMax}`); + } + return userGasLimit; + } + + /** @inheritDoc */ + getDefaultMultisigType(): MultisigType { + return multisigTypes.tss; + } +} diff --git a/modules/sdk-coin-hemi/src/index.ts b/modules/sdk-coin-hemi/src/index.ts new file mode 100644 index 0000000000..63609f811b --- /dev/null +++ b/modules/sdk-coin-hemi/src/index.ts @@ -0,0 +1,4 @@ +export { Hemi } from './hemi'; +export { Themi } from './themi'; +export { register } from './register'; +export * from './lib'; diff --git a/modules/sdk-coin-hemi/src/lib/index.ts b/modules/sdk-coin-hemi/src/lib/index.ts new file mode 100644 index 0000000000..2cc209164a --- /dev/null +++ b/modules/sdk-coin-hemi/src/lib/index.ts @@ -0,0 +1,4 @@ +export { TransactionBuilder } from './transactionBuilder'; +export { TransferBuilder } from './transferBuilder'; +export { getCommon } from './utils'; +export * from './walletUtil'; diff --git a/modules/sdk-coin-hemi/src/lib/resources.ts b/modules/sdk-coin-hemi/src/lib/resources.ts new file mode 100644 index 0000000000..7c50f1dfe9 --- /dev/null +++ b/modules/sdk-coin-hemi/src/lib/resources.ts @@ -0,0 +1,28 @@ +import EthereumCommon from '@ethereumjs/common'; +import { coins, EthereumNetwork } from '@bitgo/statics'; + +export const testnetCommon = EthereumCommon.custom( + { + name: 'hemi sepolia', + networkId: (coins.get('themi').network as EthereumNetwork).chainId, + chainId: (coins.get('themi').network as EthereumNetwork).chainId, + }, + { + baseChain: 'sepolia', + hardfork: 'london', + eips: [1559], + } +); + +export const mainnetCommon = EthereumCommon.custom( + { + name: 'hemi', + networkId: (coins.get('hemi').network as EthereumNetwork).chainId, + chainId: (coins.get('hemi').network as EthereumNetwork).chainId, + }, + { + baseChain: 'mainnet', + hardfork: 'london', + eips: [1559], + } +); diff --git a/modules/sdk-coin-hemi/src/lib/transactionBuilder.ts b/modules/sdk-coin-hemi/src/lib/transactionBuilder.ts new file mode 100644 index 0000000000..18e7f6e20f --- /dev/null +++ b/modules/sdk-coin-hemi/src/lib/transactionBuilder.ts @@ -0,0 +1,33 @@ +import { BaseCoin as CoinConfig } from '@bitgo/statics'; +import { BuildTransactionError, TransactionType } from '@bitgo/sdk-core'; +import { KeyPair, Transaction, TransactionBuilder as EthLikeTransactionBuilder } from '@bitgo/abstract-eth'; + +import { getCommon } from './utils'; +import { TransferBuilder } from './transferBuilder'; +import { walletSimpleByteCode } from './walletUtil'; + +export class TransactionBuilder extends EthLikeTransactionBuilder { + protected _transfer!: TransferBuilder; + + constructor(_coinConfig: Readonly) { + super(_coinConfig); + this._common = getCommon(this._coinConfig.network.type); + this.transaction = new Transaction(this._coinConfig, this._common); + this._walletSimpleByteCode = walletSimpleByteCode; + } + + /** @inheritdoc */ + transfer(data?: string): TransferBuilder { + if (this._type !== TransactionType.Send) { + throw new BuildTransactionError('Transfers can only be set for send transactions'); + } + if (!this._transfer) { + this._transfer = new TransferBuilder(data); + } + return this._transfer; + } + + publicKey(key: string): void { + this._sourceKeyPair = new KeyPair({ pub: key }); + } +} diff --git a/modules/sdk-coin-hemi/src/lib/transferBuilder.ts b/modules/sdk-coin-hemi/src/lib/transferBuilder.ts new file mode 100644 index 0000000000..7447c0cf3d --- /dev/null +++ b/modules/sdk-coin-hemi/src/lib/transferBuilder.ts @@ -0,0 +1 @@ +export { TransferBuilder } from '@bitgo/abstract-eth'; diff --git a/modules/sdk-coin-hemi/src/lib/utils.ts b/modules/sdk-coin-hemi/src/lib/utils.ts new file mode 100644 index 0000000000..dc81fa08f9 --- /dev/null +++ b/modules/sdk-coin-hemi/src/lib/utils.ts @@ -0,0 +1,21 @@ +import { NetworkType } from '@bitgo/statics'; +import EthereumCommon from '@ethereumjs/common'; +import { InvalidTransactionError } from '@bitgo/sdk-core'; +import { testnetCommon, mainnetCommon } from './resources'; + +const commons: Map = new Map([ + [NetworkType.MAINNET, mainnetCommon], + [NetworkType.TESTNET, testnetCommon], +]); + +/** + * @param {NetworkType} network either mainnet or testnet + * @returns {EthereumCommon} Ethereum common configuration object + */ +export function getCommon(network: NetworkType): EthereumCommon { + const common = commons.get(network); + if (!common) { + throw new InvalidTransactionError('Missing network common configuration'); + } + return common; +} diff --git a/modules/sdk-coin-hemi/src/lib/walletUtil.ts b/modules/sdk-coin-hemi/src/lib/walletUtil.ts new file mode 100644 index 0000000000..cd96c87dfe --- /dev/null +++ b/modules/sdk-coin-hemi/src/lib/walletUtil.ts @@ -0,0 +1,612 @@ +/* +The steps used to obtain the bytecode and ABI of the contract were: + +1. Go to: https://remix.ethereum.org/ +2. Copy the content of the contract OpethWalletSimple.sol into the IDE + The content of all the required contracts like Forwarder.sol and ERC20Interface.sol also need to be present to replicate the imports structure of OpethWalletSimple.sol +3. Compile the contract with the compiler version 0.8.20+commit.a1b79de6 and then get the generated bytecode and ABI + */ +export const walletSimpleByteCode = + '0x60806040525f60015f6101000a81548160ff0219169083151502179055505f6001806101000a81548160ff021916908315150217905550348015610041575f80fd5b506136aa8061004f5f395ff3fe608060405260043610610122575f3560e01c8063924677761161009f578063c137878411610063578063c137878414610475578063c6044c461461049d578063e6bd0aa4146104c5578063f23a6e61146104ed578063fc0f392d146105295761016b565b80639246777614610395578063a0b7967b146103bd578063abe3219c146103e7578063ad3ad70914610411578063bc197c81146104395761016b565b806334f94047116100e657806334f94047146102a557806339125215146102cd5780635a953d0a146102f5578063736c0d5b1461031d5780637df73e27146103595761016b565b806301ffc9a7146101b35780630dcd7a6c146101ef578063150b7a0214610217578063158ef93e146102535780632da034091461027d5761016b565b3661016b575f341115610169577f6e89d517057028190560dd200cf6bf792842861353d1173761dfa362e1c133f03334604051610160929190611be9565b60405180910390a15b005b5f3411156101b1577f6e89d517057028190560dd200cf6bf792842861353d1173761dfa362e1c133f033345f366040516101a89493929190611c6d565b60405180910390a15b005b3480156101be575f80fd5b506101d960048036038101906101d49190611d11565b61053f565b6040516101e69190611d56565b60405180910390f35b3480156101fa575f80fd5b5061021560048036038101906102109190611e24565b6105b8565b005b348015610222575f80fd5b5061023d60048036038101906102389190611fe8565b61065f565b60405161024a9190612077565b60405180910390f35b34801561025e575f80fd5b50610267610672565b6040516102749190611d56565b60405180910390f35b348015610288575f80fd5b506102a3600480360381019061029e91906120cb565b610683565b005b3480156102b0575f80fd5b506102cb60048036038101906102c6919061215e565b61073a565b005b3480156102d8575f80fd5b506102f360048036038101906102ee91906121cf565b6107f7565b005b348015610300575f80fd5b5061031b60048036038101906103169190612299565b610989565b005b348015610328575f80fd5b50610343600480360381019061033e91906122e9565b610a43565b6040516103509190611d56565b60405180910390f35b348015610364575f80fd5b5061037f600480360381019061037a91906122e9565b610a5f565b60405161038c9190611d56565b60405180910390f35b3480156103a0575f80fd5b506103bb60048036038101906103b6919061233e565b610ab0565b005b3480156103c8575f80fd5b506103d1610b67565b6040516103de919061237c565b60405180910390f35b3480156103f2575f80fd5b506103fb610bd4565b6040516104089190611d56565b60405180910390f35b34801561041c575f80fd5b50610437600480360381019061043291906123ea565b610be6565b005b348015610444575f80fd5b5061045f600480360381019061045a91906124c1565b610df2565b60405161046c9190612077565b60405180910390f35b348015610480575f80fd5b5061049b6004803603810190610496919061233e565b610e09565b005b3480156104a8575f80fd5b506104c360048036038101906104be9190612598565b610ec0565b005b3480156104d0575f80fd5b506104eb60048036038101906104e69190612299565b6110ac565b005b3480156104f8575f80fd5b50610513600480360381019061050e91906125e3565b611166565b6040516105209190612077565b60405180910390f35b348015610534575f80fd5b5061053d61117b565b005b5f7f4e2312e0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806105b157506105b082611215565b5b9050919050565b6105c133610a5f565b610600576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105f7906126d3565b60405180910390fd5b5f61060961127e565b8888888888604051602001610623969594939291906127c2565b6040516020818303038152906040528051906020012090506106498882858589896112bb565b5061065586898961147b565b5050505050505050565b5f63150b7a0260e01b9050949350505050565b60018054906101000a900460ff1681565b61068c33610a5f565b6106cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106c2906126d3565b60405180910390fd5b5f8290508073ffffffffffffffffffffffffffffffffffffffff16633ef13367836040518263ffffffff1660e01b8152600401610708919061282d565b5f604051808303815f87803b15801561071f575f80fd5b505af1158015610731573d5f803e3d5ffd5b50505050505050565b61074333610a5f565b610782576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610779906126d3565b60405180910390fd5b5f8490508073ffffffffffffffffffffffffffffffffffffffff1663c6a2dd248585856040518463ffffffff1660e01b81526004016107c3939291906128be565b5f604051808303815f87803b1580156107da575f80fd5b505af11580156107ec573d5f803e3d5ffd5b505050505050505050565b61080033610a5f565b61083f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610836906126d3565b60405180910390fd5b5f6108486115ab565b898989898989604051602001610864979695949392919061291c565b6040516020818303038152906040528051906020012090505f61088b8a8386868a8a6112bb565b90505f8a73ffffffffffffffffffffffffffffffffffffffff168a8a8a6040516108b6929190612985565b5f6040518083038185875af1925050503d805f81146108f0576040519150601f19603f3d011682016040523d82523d5f602084013e6108f5565b606091505b5050905080610939576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610930906129e7565b60405180910390fd5b7f59bed9ab5d78073465dd642a9e3e76dfdb7d53bcae9d09df7d0b8f5234d5a8063383858e8e8e8e6040516109749796959493929190612a1d565b60405180910390a15050505050505050505050565b61099233610a5f565b6109d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c8906126d3565b60405180910390fd5b5f8390508073ffffffffffffffffffffffffffffffffffffffff1663159e44d784846040518363ffffffff1660e01b8152600401610a10929190612a85565b5f604051808303815f87803b158015610a27575f80fd5b505af1158015610a39573d5f803e3d5ffd5b5050505050505050565b5f602052805f5260405f205f915054906101000a900460ff1681565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff169050919050565b610ab933610a5f565b610af8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aef906126d3565b60405180910390fd5b5f8290508073ffffffffffffffffffffffffffffffffffffffff16638acc01be836040518263ffffffff1660e01b8152600401610b359190611d56565b5f604051808303815f87803b158015610b4c575f80fd5b505af1158015610b5e573d5f803e3d5ffd5b50505050505050565b5f805f90505f5b600a811015610bc05781600282600a8110610b8c57610b8b612aac565b5b01541115610bad57600281600a8110610ba857610ba7612aac565b5b015491505b8080610bb890612b06565b915050610b6e565b50600181610bce9190612b4d565b91505090565b60015f9054906101000a900460ff1681565b610bef33610a5f565b610c2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c25906126d3565b60405180910390fd5b5f8888905003610c73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6a90612bca565b60405180910390fd5b858590508888905014610cbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb290612c32565b60405180910390fd5b6101008888905010610d02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf990612c9a565b60405180910390fd5b5f610d0b6115e8565b898989898989604051602001610d279796959493929190612dd3565b60405160208183030381529060405280519060200120905060015f9054906101000a900460ff1615610d8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8590612e73565b60405180910390fd5b5f610d9d5f8386868a8a6112bb565b9050610dab8a8a8a8a611625565b7fe4c9047a729726b729cf4fa62c95ef9a434bbaf206a7ea0c7c77515db1584022338284604051610dde93929190612e91565b60405180910390a150505050505050505050565b5f63bc197c8160e01b905098975050505050505050565b610e1233610a5f565b610e51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e48906126d3565b60405180910390fd5b5f8290508073ffffffffffffffffffffffffffffffffffffffff1663c59f9f19836040518263ffffffff1660e01b8152600401610e8e9190611d56565b5f604051808303815f87803b158015610ea5575f80fd5b505af1158015610eb7573d5f803e3d5ffd5b50505050505050565b60018054906101000a900460ff1615610f0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0590612f10565b60405180910390fd5b60038282905014610f54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4b90612f78565b60405180910390fd5b5f5b828290508160ff16101561108d575f73ffffffffffffffffffffffffffffffffffffffff1683838360ff16818110610f9157610f90612aac565b5b9050602002016020810190610fa691906122e9565b73ffffffffffffffffffffffffffffffffffffffff1603610ffc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff390612fe0565b60405180910390fd5b60015f8085858560ff1681811061101657611015612aac565b5b905060200201602081019061102b91906122e9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555080806110859061300a565b915050610f56565b5060018060016101000a81548160ff0219169083151502179055505050565b6110b533610a5f565b6110f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110eb906126d3565b60405180910390fd5b5f8390508073ffffffffffffffffffffffffffffffffffffffff16638972c17c84846040518363ffffffff1660e01b8152600401611133929190612a85565b5f604051808303815f87803b15801561114a575f80fd5b505af115801561115c573d5f803e3d5ffd5b5050505050505050565b5f63f23a6e6160e01b90509695505050505050565b61118433610a5f565b6111c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ba906126d3565b60405180910390fd5b6001805f6101000a81548160ff0219169083151502179055507f0909e8f76a4fd3e970f2eaef56c0ee6dfaf8b87c5b8d3f56ffce78e825a911573360405161120b919061282d565b60405180910390a1565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60606040518060400160405280600b81526020017f4f504554482d4552433230000000000000000000000000000000000000000000815250905090565b5f8061130a8787878080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f8201169050808301925050505050505061180c565b905060015f9054906101000a900460ff16158061132c575061132b88610a5f565b5b61136b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113629061307c565b60405180910390fd5b428410156113ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a5906130e4565b60405180910390fd5b6113b783611944565b6113c081610a5f565b6113ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f690612fe0565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361146d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114649061314c565b60405180910390fd5b809150509695505050505050565b5f808473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85856040516024016114ac929190612a85565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516114fa91906131a4565b5f604051808303815f865af19150503d805f8114611533576040519150601f19603f3d011682016040523d82523d5f602084013e611538565b606091505b509150915081801561156557505f8151148061156457508080602001905181019061156391906131ce565b5b5b6115a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159b90613269565b60405180910390fd5b5050505050565b60606040518060400160405280600581526020017f4f50455448000000000000000000000000000000000000000000000000000000815250905090565b60606040518060400160405280600b81526020017f4f504554482d4261746368000000000000000000000000000000000000000000815250905090565b5f5b848490508110156118055782828281811061164557611644612aac565b5b9050602002013547101561168e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611685906132d1565b60405180910390fd5b5f8585838181106116a2576116a1612aac565b5b90506020020160208101906116b791906122e9565b73ffffffffffffffffffffffffffffffffffffffff168484848181106116e0576116df612aac565b5b905060200201356040516116f39061330f565b5f6040518083038185875af1925050503d805f811461172d576040519150601f19603f3d011682016040523d82523d5f602084013e611732565b606091505b5050905080611776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176d9061336d565b60405180910390fd5b7fc42fa155158786a1dd6ccc3a785f35845467353c3cc700e0e31a79f90e22227d338787858181106117ab576117aa612aac565b5b90506020020160208101906117c091906122e9565b8686868181106117d3576117d2612aac565b5b905060200201356040516117e99392919061338b565b60405180910390a15080806117fd90612b06565b915050611627565b5050505050565b5f6041825114611851576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118489061340a565b60405180910390fd5b5f805f602085015192506040850151915060ff6041860151169050601b8160ff16101561188857601b816118859190613428565b90505b7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0825f1c11156118ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e4906134cc565b60405180910390fd5b6001868285856040515f815260200160405260405161190f94939291906134f9565b6020604051602081039080840390855afa15801561192f573d5f803e3d5ffd5b50505060206040510351935050505092915050565b61194d33610a5f565b61198c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611983906126d3565b60405180910390fd5b5f806002600a806020026040519081016040528092919082600a80156119c7576020028201915b8154815260200190600101908083116119b3575b505050505090505f5b600a811015611a7f57838282600a81106119ed576119ec612aac565b5b602002015103611a32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2990613586565b60405180910390fd5b8183600a8110611a4557611a44612aac565b5b60200201518282600a8110611a5d57611a5c612aac565b5b60200201511015611a6c578092505b8080611a7790612b06565b9150506119d0565b508082600a8110611a9357611a92612aac565b5b60200201518311611ad9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad0906135ee565b60405180910390fd5b6127108183600a8110611aef57611aee612aac565b5b6020020151611afe9190612b4d565b831115611b40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3790613656565b60405180910390fd5b82600283600a8110611b5557611b54612aac565b5b0181905550505050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611b8882611b5f565b9050919050565b611b9881611b7e565b82525050565b5f819050919050565b611bb081611b9e565b82525050565b5f82825260208201905092915050565b50565b5f611bd45f83611bb6565b9150611bdf82611bc6565b5f82019050919050565b5f606082019050611bfc5f830185611b8f565b611c096020830184611ba7565b8181036040830152611c1a81611bc9565b90509392505050565b828183375f83830152505050565b5f601f19601f8301169050919050565b5f611c4c8385611bb6565b9350611c59838584611c23565b611c6283611c31565b840190509392505050565b5f606082019050611c805f830187611b8f565b611c8d6020830186611ba7565b8181036040830152611ca0818486611c41565b905095945050505050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611cf081611cbc565b8114611cfa575f80fd5b50565b5f81359050611d0b81611ce7565b92915050565b5f60208284031215611d2657611d25611cb4565b5b5f611d3384828501611cfd565b91505092915050565b5f8115159050919050565b611d5081611d3c565b82525050565b5f602082019050611d695f830184611d47565b92915050565b611d7881611b7e565b8114611d82575f80fd5b50565b5f81359050611d9381611d6f565b92915050565b611da281611b9e565b8114611dac575f80fd5b50565b5f81359050611dbd81611d99565b92915050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f840112611de457611de3611dc3565b5b8235905067ffffffffffffffff811115611e0157611e00611dc7565b5b602083019150836001820283011115611e1d57611e1c611dcb565b5b9250929050565b5f805f805f805f60c0888a031215611e3f57611e3e611cb4565b5b5f611e4c8a828b01611d85565b9750506020611e5d8a828b01611daf565b9650506040611e6e8a828b01611d85565b9550506060611e7f8a828b01611daf565b9450506080611e908a828b01611daf565b93505060a088013567ffffffffffffffff811115611eb157611eb0611cb8565b5b611ebd8a828b01611dcf565b925092505092959891949750929550565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b611f0882611c31565b810181811067ffffffffffffffff82111715611f2757611f26611ed2565b5b80604052505050565b5f611f39611cab565b9050611f458282611eff565b919050565b5f67ffffffffffffffff821115611f6457611f63611ed2565b5b611f6d82611c31565b9050602081019050919050565b5f611f8c611f8784611f4a565b611f30565b905082815260208101848484011115611fa857611fa7611ece565b5b611fb3848285611c23565b509392505050565b5f82601f830112611fcf57611fce611dc3565b5b8135611fdf848260208601611f7a565b91505092915050565b5f805f806080858703121561200057611fff611cb4565b5b5f61200d87828801611d85565b945050602061201e87828801611d85565b935050604061202f87828801611daf565b925050606085013567ffffffffffffffff8111156120505761204f611cb8565b5b61205c87828801611fbb565b91505092959194509250565b61207181611cbc565b82525050565b5f60208201905061208a5f830184612068565b92915050565b5f61209a82611b5f565b9050919050565b6120aa81612090565b81146120b4575f80fd5b50565b5f813590506120c5816120a1565b92915050565b5f80604083850312156120e1576120e0611cb4565b5b5f6120ee858286016120b7565b92505060206120ff85828601611d85565b9150509250929050565b5f8083601f84011261211e5761211d611dc3565b5b8235905067ffffffffffffffff81111561213b5761213a611dc7565b5b60208301915083602082028301111561215757612156611dcb565b5b9250929050565b5f805f806060858703121561217657612175611cb4565b5b5f612183878288016120b7565b945050602061219487828801611d85565b935050604085013567ffffffffffffffff8111156121b5576121b4611cb8565b5b6121c187828801612109565b925092505092959194509250565b5f805f805f805f8060c0898b0312156121eb576121ea611cb4565b5b5f6121f88b828c01611d85565b98505060206122098b828c01611daf565b975050604089013567ffffffffffffffff81111561222a57612229611cb8565b5b6122368b828c01611dcf565b965096505060606122498b828c01611daf565b945050608061225a8b828c01611daf565b93505060a089013567ffffffffffffffff81111561227b5761227a611cb8565b5b6122878b828c01611dcf565b92509250509295985092959890939650565b5f805f606084860312156122b0576122af611cb4565b5b5f6122bd868287016120b7565b93505060206122ce86828701611d85565b92505060406122df86828701611daf565b9150509250925092565b5f602082840312156122fe576122fd611cb4565b5b5f61230b84828501611d85565b91505092915050565b61231d81611d3c565b8114612327575f80fd5b50565b5f8135905061233881612314565b92915050565b5f806040838503121561235457612353611cb4565b5b5f61236185828601611d85565b92505060206123728582860161232a565b9150509250929050565b5f60208201905061238f5f830184611ba7565b92915050565b5f8083601f8401126123aa576123a9611dc3565b5b8235905067ffffffffffffffff8111156123c7576123c6611dc7565b5b6020830191508360208202830111156123e3576123e2611dcb565b5b9250929050565b5f805f805f805f8060a0898b03121561240657612405611cb4565b5b5f89013567ffffffffffffffff81111561242357612422611cb8565b5b61242f8b828c01612395565b9850985050602089013567ffffffffffffffff81111561245257612451611cb8565b5b61245e8b828c01612109565b965096505060406124718b828c01611daf565b94505060606124828b828c01611daf565b935050608089013567ffffffffffffffff8111156124a3576124a2611cb8565b5b6124af8b828c01611dcf565b92509250509295985092959890939650565b5f805f805f805f8060a0898b0312156124dd576124dc611cb4565b5b5f6124ea8b828c01611d85565b98505060206124fb8b828c01611d85565b975050604089013567ffffffffffffffff81111561251c5761251b611cb8565b5b6125288b828c01612109565b9650965050606089013567ffffffffffffffff81111561254b5761254a611cb8565b5b6125578b828c01612109565b9450945050608089013567ffffffffffffffff81111561257a57612579611cb8565b5b6125868b828c01611dcf565b92509250509295985092959890939650565b5f80602083850312156125ae576125ad611cb4565b5b5f83013567ffffffffffffffff8111156125cb576125ca611cb8565b5b6125d785828601612395565b92509250509250929050565b5f805f805f8060a087890312156125fd576125fc611cb4565b5b5f61260a89828a01611d85565b965050602061261b89828a01611d85565b955050604061262c89828a01611daf565b945050606061263d89828a01611daf565b935050608087013567ffffffffffffffff81111561265e5761265d611cb8565b5b61266a89828a01611dcf565b92509250509295509295509295565b5f82825260208201905092915050565b7f4e6f6e2d7369676e657220696e206f6e6c795369676e6572206d6574686f64005f82015250565b5f6126bd601f83612679565b91506126c882612689565b602082019050919050565b5f6020820190508181035f8301526126ea816126b1565b9050919050565b5f81519050919050565b5f81905092915050565b5f5b83811015612722578082015181840152602081019050612707565b5f8484015250505050565b5f612737826126f1565b61274181856126fb565b9350612751818560208601612705565b80840191505092915050565b5f8160601b9050919050565b5f6127738261275d565b9050919050565b5f61278482612769565b9050919050565b61279c61279782611b7e565b61277a565b82525050565b5f819050919050565b6127bc6127b782611b9e565b6127a2565b82525050565b5f6127cd828961272d565b91506127d9828861278b565b6014820191506127e982876127ab565b6020820191506127f9828661278b565b60148201915061280982856127ab565b60208201915061281982846127ab565b602082019150819050979650505050505050565b5f6020820190506128405f830184611b8f565b92915050565b5f82825260208201905092915050565b5f80fd5b82818337505050565b5f61286e8385612846565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311156128a1576128a0612856565b5b6020830292506128b283858461285a565b82840190509392505050565b5f6040820190506128d15f830186611b8f565b81810360208301526128e4818486612863565b9050949350505050565b5f81905092915050565b5f61290383856128ee565b9350612910838584611c23565b82840190509392505050565b5f612927828a61272d565b9150612933828961278b565b60148201915061294382886127ab565b6020820191506129548286886128f8565b915061296082856127ab565b60208201915061297082846127ab565b60208201915081905098975050505050505050565b5f6129918284866128f8565b91508190509392505050565b7f43616c6c20657865637574696f6e206661696c656400000000000000000000005f82015250565b5f6129d1601583612679565b91506129dc8261299d565b602082019050919050565b5f6020820190508181035f8301526129fe816129c5565b9050919050565b5f819050919050565b612a1781612a05565b82525050565b5f60c082019050612a305f83018a611b8f565b612a3d6020830189611b8f565b612a4a6040830188612a0e565b612a576060830187611b8f565b612a646080830186611ba7565b81810360a0830152612a77818486611c41565b905098975050505050505050565b5f604082019050612a985f830185611b8f565b612aa56020830184611ba7565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f612b1082611b9e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612b4257612b41612ad9565b5b600182019050919050565b5f612b5782611b9e565b9150612b6283611b9e565b9250828201905080821115612b7a57612b79612ad9565b5b92915050565b7f4e6f7420656e6f75676820726563697069656e747300000000000000000000005f82015250565b5f612bb4601583612679565b9150612bbf82612b80565b602082019050919050565b5f6020820190508181035f830152612be181612ba8565b9050919050565b7f556e657175616c20726563697069656e747320616e642076616c7565730000005f82015250565b5f612c1c601d83612679565b9150612c2782612be8565b602082019050919050565b5f6020820190508181035f830152612c4981612c10565b9050919050565b7f546f6f206d616e7920726563697069656e74732c206d617820323535000000005f82015250565b5f612c84601c83612679565b9150612c8f82612c50565b602082019050919050565b5f6020820190508181035f830152612cb181612c78565b9050919050565b5f81905092915050565b5f819050919050565b612cd481611b7e565b82525050565b5f612ce58383612ccb565b60208301905092915050565b5f612cff6020840184611d85565b905092915050565b5f602082019050919050565b5f612d1e8385612cb8565b9350612d2982612cc2565b805f5b85811015612d6157612d3e8284612cf1565b612d488882612cda565b9750612d5383612d07565b925050600181019050612d2c565b5085925050509392505050565b5f81905092915050565b5f612d838385612d6e565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115612db657612db5612856565b5b602083029250612dc783858461285a565b82840190509392505050565b5f612dde828a61272d565b9150612deb82888a612d13565b9150612df8828688612d78565b9150612e0482856127ab565b602082019150612e1482846127ab565b60208201915081905098975050505050505050565b7f426174636820696e2073616665206d6f646500000000000000000000000000005f82015250565b5f612e5d601283612679565b9150612e6882612e29565b602082019050919050565b5f6020820190508181035f830152612e8a81612e51565b9050919050565b5f606082019050612ea45f830186611b8f565b612eb16020830185611b8f565b612ebe6040830184612a0e565b949350505050565b7f436f6e747261637420616c726561647920696e697469616c697a6564000000005f82015250565b5f612efa601c83612679565b9150612f0582612ec6565b602082019050919050565b5f6020820190508181035f830152612f2781612eee565b9050919050565b7f496e76616c6964206e756d626572206f66207369676e657273000000000000005f82015250565b5f612f62601983612679565b9150612f6d82612f2e565b602082019050919050565b5f6020820190508181035f830152612f8f81612f56565b9050919050565b7f496e76616c6964207369676e65720000000000000000000000000000000000005f82015250565b5f612fca600e83612679565b9150612fd582612f96565b602082019050919050565b5f6020820190508181035f830152612ff781612fbe565b9050919050565b5f60ff82169050919050565b5f61301482612ffe565b915060ff820361302757613026612ad9565b5b600182019050919050565b7f45787465726e616c207472616e7366657220696e2073616665206d6f646500005f82015250565b5f613066601e83612679565b915061307182613032565b602082019050919050565b5f6020820190508181035f8301526130938161305a565b9050919050565b7f5472616e73616374696f6e2065787069726564000000000000000000000000005f82015250565b5f6130ce601383612679565b91506130d98261309a565b602082019050919050565b5f6020820190508181035f8301526130fb816130c2565b9050919050565b7f5369676e6572732063616e6e6f7420626520657175616c0000000000000000005f82015250565b5f613136601783612679565b915061314182613102565b602082019050919050565b5f6020820190508181035f8301526131638161312a565b9050919050565b5f81519050919050565b5f61317e8261316a565b61318881856128ee565b9350613198818560208601612705565b80840191505092915050565b5f6131af8284613174565b915081905092915050565b5f815190506131c881612314565b92915050565b5f602082840312156131e3576131e2611cb4565b5b5f6131f0848285016131ba565b91505092915050565b7f5472616e7366657248656c7065723a3a736166655472616e736665723a2074725f8201527f616e73666572206661696c656400000000000000000000000000000000000000602082015250565b5f613253602d83612679565b915061325e826131f9565b604082019050919050565b5f6020820190508181035f83015261328081613247565b9050919050565b7f496e73756666696369656e742066756e647300000000000000000000000000005f82015250565b5f6132bb601283612679565b91506132c682613287565b602082019050919050565b5f6020820190508181035f8301526132e8816132af565b9050919050565b5f6132fa5f836128ee565b915061330582611bc6565b5f82019050919050565b5f613319826132ef565b9150819050919050565b7f43616c6c206661696c65640000000000000000000000000000000000000000005f82015250565b5f613357600b83612679565b915061336282613323565b602082019050919050565b5f6020820190508181035f8301526133848161334b565b9050919050565b5f60608201905061339e5f830186611b8f565b6133ab6020830185611b8f565b6133b86040830184611ba7565b949350505050565b7f496e76616c6964207369676e6174757265202d2077726f6e67206c656e6774685f82015250565b5f6133f4602083612679565b91506133ff826133c0565b602082019050919050565b5f6020820190508181035f830152613421816133e8565b9050919050565b5f61343282612ffe565b915061343d83612ffe565b9250828201905060ff81111561345657613455612ad9565b5b92915050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c5f8201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b5f6134b6602283612679565b91506134c18261345c565b604082019050919050565b5f6020820190508181035f8301526134e3816134aa565b9050919050565b6134f381612ffe565b82525050565b5f60808201905061350c5f830187612a0e565b61351960208301866134ea565b6135266040830185612a0e565b6135336060830184612a0e565b95945050505050565b7f53657175656e636520494420616c7265616479207573656400000000000000005f82015250565b5f613570601883612679565b915061357b8261353c565b602082019050919050565b5f6020820190508181035f83015261359d81613564565b9050919050565b7f53657175656e63652049442062656c6f772077696e646f7700000000000000005f82015250565b5f6135d8601883612679565b91506135e3826135a4565b602082019050919050565b5f6020820190508181035f830152613605816135cc565b9050919050565b7f53657175656e63652049442061626f7665206d6178696d756d000000000000005f82015250565b5f613640601983612679565b915061364b8261360c565b602082019050919050565b5f6020820190508181035f83015261366d81613634565b905091905056fea2646970667358221220352fb8295c03d20c2fa9c3132064e8e6f08bba7c3de60d897024de1f6eef56eb64736f6c63430008140033'; + +export const walletSimpleAbi = [ + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: 'address', + name: 'msgSender', + type: 'address', + }, + { + indexed: false, + internalType: 'address', + name: 'otherSigner', + type: 'address', + }, + { + indexed: false, + internalType: 'bytes32', + name: 'operation', + type: 'bytes32', + }, + ], + name: 'BatchTransacted', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: 'address', + name: 'sender', + type: 'address', + }, + { + indexed: false, + internalType: 'address', + name: 'recipient', + type: 'address', + }, + { + indexed: false, + internalType: 'uint256', + name: 'value', + type: 'uint256', + }, + ], + name: 'BatchTransfer', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: 'address', + name: 'from', + type: 'address', + }, + { + indexed: false, + internalType: 'uint256', + name: 'value', + type: 'uint256', + }, + { + indexed: false, + internalType: 'bytes', + name: 'data', + type: 'bytes', + }, + ], + name: 'Deposited', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: 'address', + name: 'msgSender', + type: 'address', + }, + ], + name: 'SafeModeActivated', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: 'address', + name: 'msgSender', + type: 'address', + }, + { + indexed: false, + internalType: 'address', + name: 'otherSigner', + type: 'address', + }, + { + indexed: false, + internalType: 'bytes32', + name: 'operation', + type: 'bytes32', + }, + { + indexed: false, + internalType: 'address', + name: 'toAddress', + type: 'address', + }, + { + indexed: false, + internalType: 'uint256', + name: 'value', + type: 'uint256', + }, + { + indexed: false, + internalType: 'bytes', + name: 'data', + type: 'bytes', + }, + ], + name: 'Transacted', + type: 'event', + }, + { + stateMutability: 'payable', + type: 'fallback', + }, + { + inputs: [], + name: 'activateSafeMode', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address payable', + name: 'forwarderAddress', + type: 'address', + }, + { + internalType: 'address', + name: 'tokenContractAddress', + type: 'address', + }, + { + internalType: 'uint256[]', + name: 'tokenIds', + type: 'uint256[]', + }, + ], + name: 'batchFlushERC1155ForwarderTokens', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address payable', + name: 'forwarderAddress', + type: 'address', + }, + { + internalType: 'address', + name: 'tokenContractAddress', + type: 'address', + }, + { + internalType: 'uint256', + name: 'tokenId', + type: 'uint256', + }, + ], + name: 'flushERC1155ForwarderTokens', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address payable', + name: 'forwarderAddress', + type: 'address', + }, + { + internalType: 'address', + name: 'tokenContractAddress', + type: 'address', + }, + { + internalType: 'uint256', + name: 'tokenId', + type: 'uint256', + }, + ], + name: 'flushERC721ForwarderTokens', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address payable', + name: 'forwarderAddress', + type: 'address', + }, + { + internalType: 'address', + name: 'tokenContractAddress', + type: 'address', + }, + ], + name: 'flushForwarderTokens', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [], + name: 'getNextSequenceId', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address[]', + name: 'allowedSigners', + type: 'address[]', + }, + ], + name: 'init', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [], + name: 'initialized', + outputs: [ + { + internalType: 'bool', + name: '', + type: 'bool', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: 'signer', + type: 'address', + }, + ], + name: 'isSigner', + outputs: [ + { + internalType: 'bool', + name: '', + type: 'bool', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: '_operator', + type: 'address', + }, + { + internalType: 'address', + name: '_from', + type: 'address', + }, + { + internalType: 'uint256[]', + name: 'ids', + type: 'uint256[]', + }, + { + internalType: 'uint256[]', + name: 'values', + type: 'uint256[]', + }, + { + internalType: 'bytes', + name: 'data', + type: 'bytes', + }, + ], + name: 'onERC1155BatchReceived', + outputs: [ + { + internalType: 'bytes4', + name: '', + type: 'bytes4', + }, + ], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: '_operator', + type: 'address', + }, + { + internalType: 'address', + name: '_from', + type: 'address', + }, + { + internalType: 'uint256', + name: 'id', + type: 'uint256', + }, + { + internalType: 'uint256', + name: 'value', + type: 'uint256', + }, + { + internalType: 'bytes', + name: 'data', + type: 'bytes', + }, + ], + name: 'onERC1155Received', + outputs: [ + { + internalType: 'bytes4', + name: '', + type: 'bytes4', + }, + ], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: '_operator', + type: 'address', + }, + { + internalType: 'address', + name: '_from', + type: 'address', + }, + { + internalType: 'uint256', + name: '_tokenId', + type: 'uint256', + }, + { + internalType: 'bytes', + name: '_data', + type: 'bytes', + }, + ], + name: 'onERC721Received', + outputs: [ + { + internalType: 'bytes4', + name: '', + type: 'bytes4', + }, + ], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [], + name: 'safeMode', + outputs: [ + { + internalType: 'bool', + name: '', + type: 'bool', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: 'toAddress', + type: 'address', + }, + { + internalType: 'uint256', + name: 'value', + type: 'uint256', + }, + { + internalType: 'bytes', + name: 'data', + type: 'bytes', + }, + { + internalType: 'uint256', + name: 'expireTime', + type: 'uint256', + }, + { + internalType: 'uint256', + name: 'sequenceId', + type: 'uint256', + }, + { + internalType: 'bytes', + name: 'signature', + type: 'bytes', + }, + ], + name: 'sendMultiSig', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address[]', + name: 'recipients', + type: 'address[]', + }, + { + internalType: 'uint256[]', + name: 'values', + type: 'uint256[]', + }, + { + internalType: 'uint256', + name: 'expireTime', + type: 'uint256', + }, + { + internalType: 'uint256', + name: 'sequenceId', + type: 'uint256', + }, + { + internalType: 'bytes', + name: 'signature', + type: 'bytes', + }, + ], + name: 'sendMultiSigBatch', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: 'toAddress', + type: 'address', + }, + { + internalType: 'uint256', + name: 'value', + type: 'uint256', + }, + { + internalType: 'address', + name: 'tokenContractAddress', + type: 'address', + }, + { + internalType: 'uint256', + name: 'expireTime', + type: 'uint256', + }, + { + internalType: 'uint256', + name: 'sequenceId', + type: 'uint256', + }, + { + internalType: 'bytes', + name: 'signature', + type: 'bytes', + }, + ], + name: 'sendMultiSigToken', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: 'forwarderAddress', + type: 'address', + }, + { + internalType: 'bool', + name: 'autoFlush', + type: 'bool', + }, + ], + name: 'setAutoFlush1155', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: 'forwarderAddress', + type: 'address', + }, + { + internalType: 'bool', + name: 'autoFlush', + type: 'bool', + }, + ], + name: 'setAutoFlush721', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: '', + type: 'address', + }, + ], + name: 'signers', + outputs: [ + { + internalType: 'bool', + name: '', + type: 'bool', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes4', + name: 'interfaceId', + type: 'bytes4', + }, + ], + name: 'supportsInterface', + outputs: [ + { + internalType: 'bool', + name: '', + type: 'bool', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + stateMutability: 'payable', + type: 'receive', + }, +]; diff --git a/modules/sdk-coin-hemi/src/register.ts b/modules/sdk-coin-hemi/src/register.ts new file mode 100644 index 0000000000..159a81cc0a --- /dev/null +++ b/modules/sdk-coin-hemi/src/register.ts @@ -0,0 +1,8 @@ +import { BitGoBase } from '@bitgo/sdk-core'; +import { Hemi } from './hemi'; +import { Themi } from './themi'; + +export const register = (sdk: BitGoBase): void => { + sdk.register('hemi', Hemi.createInstance); + sdk.register('themi', Themi.createInstance); +}; diff --git a/modules/sdk-coin-hemi/src/themi.ts b/modules/sdk-coin-hemi/src/themi.ts new file mode 100644 index 0000000000..12a6909951 --- /dev/null +++ b/modules/sdk-coin-hemi/src/themi.ts @@ -0,0 +1,17 @@ +/** + * Testnet Hemi + */ +import { BaseCoin, BitGoBase } from '@bitgo/sdk-core'; +import { BaseCoin as StaticsBaseCoin } from '@bitgo/statics'; + +import { Hemi } from './hemi'; + +export class Themi extends Hemi { + protected constructor(bitgo: BitGoBase, staticsCoin?: Readonly) { + super(bitgo, staticsCoin); + } + + static createInstance(bitgo: BitGoBase, staticsCoin?: Readonly): BaseCoin { + return new Themi(bitgo, staticsCoin); + } +} diff --git a/modules/sdk-coin-hemi/test/integration/index.ts b/modules/sdk-coin-hemi/test/integration/index.ts new file mode 100644 index 0000000000..ef1ecad08c --- /dev/null +++ b/modules/sdk-coin-hemi/test/integration/index.ts @@ -0,0 +1,11 @@ +/** + * Integration tests for Hemi Network + * + * These tests require a running Hemi Network node or testnet connection + * and are typically run separately from unit tests. + * + * TODO: Add integration tests + */ + +// Placeholder to ensure test file loads correctly +export {}; diff --git a/modules/sdk-coin-hemi/test/unit/index.ts b/modules/sdk-coin-hemi/test/unit/index.ts new file mode 100644 index 0000000000..46688a9563 --- /dev/null +++ b/modules/sdk-coin-hemi/test/unit/index.ts @@ -0,0 +1,82 @@ +import 'should'; +import { TestBitGo, TestBitGoAPI } from '@bitgo/sdk-test'; +import { BitGoAPI } from '@bitgo/sdk-api'; + +import { Hemi, Themi } from '../../src'; + +describe('Hemi', function () { + let bitgo: TestBitGoAPI; + + before(function () { + bitgo = TestBitGo.decorate(BitGoAPI, { env: 'test' }); + bitgo.safeRegister('hemi', Hemi.createInstance); + bitgo.safeRegister('themi', Themi.createInstance); + bitgo.initializeTestVars(); + }); + + describe('Basic Coin Info', function () { + it('should return the right info for hemi', function () { + const hemi = bitgo.coin('hemi'); + + hemi.should.be.an.instanceof(Hemi); + hemi.getChain().should.equal('hemi'); + hemi.getFamily().should.equal('hemi'); + hemi.getFullName().should.equal('Hemi Network'); + hemi.getBaseFactor().should.equal(1e18); + }); + + it('should return the right info for themi', function () { + const themi = bitgo.coin('themi'); + + themi.should.be.an.instanceof(Themi); + themi.getChain().should.equal('themi'); + themi.getFamily().should.equal('hemi'); + themi.getFullName().should.equal('Testnet Hemi Network'); + themi.getBaseFactor().should.equal(1e18); + }); + }); + + describe('TSS Support', function () { + it('should support TSS for hemi', function () { + const hemi = bitgo.coin('hemi'); + hemi.supportsTss().should.be.true(); + }); + + it('should support TSS for themi', function () { + const themi = bitgo.coin('themi'); + themi.supportsTss().should.be.true(); + }); + + it('should use ECDSA MPC algorithm', function () { + const hemi = bitgo.coin('hemi'); + hemi.getMPCAlgorithm().should.equal('ecdsa'); + }); + }); + + describe('Address Validation', function () { + it('should validate valid addresses', function () { + const hemi = bitgo.coin('hemi'); + hemi.isValidAddress('0x1234567890123456789012345678901234567890').should.be.true(); + hemi.isValidAddress('0xabcdef0123456789abcdef0123456789abcdef01').should.be.true(); + }); + + it('should reject invalid addresses', function () { + const hemi = bitgo.coin('hemi'); + hemi.isValidAddress('invalid').should.be.false(); + hemi.isValidAddress('0x123').should.be.false(); + hemi.isValidAddress('').should.be.false(); + }); + }); + + describe('Message and TypedData Signing', function () { + it('should support message signing', function () { + const hemi = bitgo.coin('hemi'); + hemi.supportsMessageSigning().should.be.true(); + }); + + it('should support signing typed data', function () { + const hemi = bitgo.coin('hemi'); + hemi.supportsSigningTypedData().should.be.true(); + }); + }); +}); diff --git a/modules/sdk-coin-hemi/tsconfig.json b/modules/sdk-coin-hemi/tsconfig.json new file mode 100644 index 0000000000..b967e45713 --- /dev/null +++ b/modules/sdk-coin-hemi/tsconfig.json @@ -0,0 +1,26 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "./dist", + "rootDir": "./", + "strictPropertyInitialization": false, + "esModuleInterop": true, + "typeRoots": ["../../types", "./node_modules/@types", "../../node_modules/@types"] + }, + "include": ["src/**/*", "test/**/*", "resources/**/*"], + "exclude": ["node_modules"], + "references": [ + { + "path": "../sdk-api" + }, + { + "path": "../sdk-core" + }, + { + "path": "../statics" + }, + { + "path": "../sdk-test" + } + ] +} diff --git a/modules/statics/src/allCoinsAndTokens.ts b/modules/statics/src/allCoinsAndTokens.ts index 3aee9a3e1a..4739af4ec1 100644 --- a/modules/statics/src/allCoinsAndTokens.ts +++ b/modules/statics/src/allCoinsAndTokens.ts @@ -101,6 +101,7 @@ import { FLR_FEATURES, GENERIC_TOKEN_FEATURES, HBAR_FEATURES, + HEMI_FEATURES, ICP_FEATURES, INJECTIVE_FEATURES, IOTA_FEATURES, @@ -1380,6 +1381,26 @@ export const allCoinsAndTokens = [ BaseUnit.ETH, OPETH_FEATURES ), + account( + '9f5e1c3a-4d7b-48e2-b6f0-a1c2d3e4f567', + 'hemi', + 'Hemi Network', + Networks.main.hemi, + 18, + UnderlyingAsset.HEMI, + BaseUnit.ETH, + HEMI_FEATURES + ), + account( + 'a1b2c3d4-5e6f-4890-abcd-ef1234567890', + 'themi', + 'Testnet Hemi Network', + Networks.test.hemi, + 18, + UnderlyingAsset.HEMI, + BaseUnit.ETH, + HEMI_FEATURES + ), account( '53b1e350-f907-45ec-abf7-11d132547055', 'zketh', diff --git a/modules/statics/src/base.ts b/modules/statics/src/base.ts index 56854a856b..7d67340c00 100644 --- a/modules/statics/src/base.ts +++ b/modules/statics/src/base.ts @@ -64,6 +64,7 @@ export enum CoinFamily { HASH = 'hash', // Provenance HBAR = 'hbar', HBAREVM = 'hbarevm', // Hedera EVM coin + HEMI = 'hemi', ICP = 'icp', INITIA = 'initia', INJECTIVE = 'injective', @@ -592,6 +593,7 @@ export enum UnderlyingAsset { HASH = 'hash', // Provenance HBAR = 'hbar', // Hedera main coin HBAREVM = 'hbarevm', // Hedera EVM coin + HEMI = 'hemi', ICP = 'icp', IP = 'ip', // Story Chain INITIA = 'initia', diff --git a/modules/statics/src/coinFeatures.ts b/modules/statics/src/coinFeatures.ts index 7edd3fa8d4..e6deafe56f 100644 --- a/modules/statics/src/coinFeatures.ts +++ b/modules/statics/src/coinFeatures.ts @@ -533,6 +533,18 @@ export const OPETH_FEATURES = [ CoinFeature.SHARED_EVM_MESSAGE_SIGNING, CoinFeature.STUCK_TRANSACTION_MANAGEMENT_TSS, ]; +export const HEMI_FEATURES = [ + ...ETH_FEATURES, + CoinFeature.TSS, + CoinFeature.TSS_COLD, + CoinFeature.MPCV2, + CoinFeature.MULTISIG_COLD, + CoinFeature.EVM_WALLET, + CoinFeature.USES_NON_PACKED_ENCODING_FOR_TXDATA, + CoinFeature.ETH_ROLLUP_CHAIN, + CoinFeature.EIP1559, + CoinFeature.SHARED_EVM_MESSAGE_SIGNING, +]; export const ZKETH_FEATURES = [ ...ETH_FEATURES, CoinFeature.MULTISIG_COLD, diff --git a/modules/statics/src/networks.ts b/modules/statics/src/networks.ts index 4d871edb69..d01dced38e 100644 --- a/modules/statics/src/networks.ts +++ b/modules/statics/src/networks.ts @@ -1354,6 +1354,26 @@ class OptimismTestnet extends Testnet implements EthereumNetwork { batcherContractAddress = '0xebe27913fcc7510eadf10643a8f86bf5492a9541'; } +class Hemi extends Mainnet implements EthereumNetwork { + name = 'Hemi'; + family = CoinFamily.HEMI; + explorerUrl = 'https://explorer.hemi.xyz/tx/'; + accountExplorerUrl = 'https://explorer.hemi.xyz/address/'; + chainId = 43111; + nativeCoinOperationHashPrefix = '43111'; + tokenOperationHashPrefix = '43111-ERC20'; +} + +class HemiTestnet extends Testnet implements EthereumNetwork { + name = 'HemiTestnet'; + family = CoinFamily.HEMI; + explorerUrl = 'https://testnet.explorer.hemi.xyz/tx/'; + accountExplorerUrl = 'https://testnet.explorer.hemi.xyz/address/'; + chainId = 743111; + nativeCoinOperationHashPrefix = '743111'; + tokenOperationHashPrefix = '743111-ERC20'; +} + class ZkSync extends Mainnet implements EthereumNetwork { name = 'ZkSync'; family = CoinFamily.ZKETH; @@ -2448,6 +2468,7 @@ export const Networks = { fantom: Object.freeze(new Fantom()), morph: Object.freeze(new Morph()), morpheth: Object.freeze(new MorphETH()), + hemi: Object.freeze(new Hemi()), optimism: Object.freeze(new Optimism()), osmo: Object.freeze(new Osmo()), rbtc: Object.freeze(new Rbtc()), @@ -2562,6 +2583,7 @@ export const Networks = { fantom: Object.freeze(new FantomTestnet()), morph: Object.freeze(new MorphTestnet()), morpheth: Object.freeze(new MorphETHTestnet()), + hemi: Object.freeze(new HemiTestnet()), optimism: Object.freeze(new OptimismTestnet()), osmo: Object.freeze(new OsmoTestnet()), rbtc: Object.freeze(new RbtcTestnet()),