diff --git a/CODEOWNERS b/CODEOWNERS index d20525a8a0..fc467634c3 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -48,6 +48,7 @@ /modules/abstract-substrate/ @BitGo/ethalt-team /modules/sdk-coin-ada/ @BitGo/ethalt-team /modules/sdk-coin-algo/ @BitGo/ethalt-team +/modules/sdk-coin-apecoin/ @BitGo/ethalt-team /modules/sdk-coin-apt/ @Bitgo/ethalt-team /modules/sdk-coin-arbeth/ @BitGo/ethalt-team /modules/sdk-coin-atom/ @BitGo/ethalt-team diff --git a/Dockerfile b/Dockerfile index 07f0f6f767..1489549289 100644 --- a/Dockerfile +++ b/Dockerfile @@ -58,6 +58,7 @@ COPY --from=builder /tmp/bitgo/modules/utxo-core /var/modules/utxo-core/ COPY --from=builder /tmp/bitgo/modules/account-lib /var/modules/account-lib/ COPY --from=builder /tmp/bitgo/modules/sdk-coin-algo /var/modules/sdk-coin-algo/ COPY --from=builder /tmp/bitgo/modules/sdk-coin-apt /var/modules/sdk-coin-apt/ +COPY --from=builder /tmp/bitgo/modules/sdk-coin-apecoin /var/modules/sdk-coin-apecoin/ COPY --from=builder /tmp/bitgo/modules/sdk-coin-arbeth /var/modules/sdk-coin-arbeth/ COPY --from=builder /tmp/bitgo/modules/abstract-eth /var/modules/abstract-eth/ COPY --from=builder /tmp/bitgo/modules/sdk-coin-atom /var/modules/sdk-coin-atom/ @@ -151,6 +152,7 @@ cd /var/modules/utxo-core && yarn link && \ cd /var/modules/account-lib && yarn link && \ cd /var/modules/sdk-coin-algo && yarn link && \ cd /var/modules/sdk-coin-apt && yarn link && \ +cd /var/modules/sdk-coin-apecoin && yarn link && \ cd /var/modules/sdk-coin-arbeth && yarn link && \ cd /var/modules/abstract-eth && yarn link && \ cd /var/modules/sdk-coin-atom && yarn link && \ @@ -247,6 +249,7 @@ RUN cd /var/bitgo-express && \ yarn link @bitgo/account-lib && \ yarn link @bitgo/sdk-coin-algo && \ yarn link @bitgo/sdk-coin-apt && \ + yarn link @bitgo/sdk-coin-apecoin && \ yarn link @bitgo/sdk-coin-arbeth && \ yarn link @bitgo/abstract-eth && \ yarn link @bitgo/sdk-coin-atom && \ diff --git a/modules/account-lib/src/index.ts b/modules/account-lib/src/index.ts index f628837d19..5f20478766 100644 --- a/modules/account-lib/src/index.ts +++ b/modules/account-lib/src/index.ts @@ -161,6 +161,9 @@ export { Coredao }; import * as Apt from '@bitgo/sdk-coin-apt'; export { Apt }; +import * as Apecoin from '@bitgo/sdk-coin-apecoin'; +export { Apecoin }; + import * as Tao from '@bitgo/sdk-coin-tao'; export { Tao }; @@ -262,6 +265,8 @@ const coinBuilderMap = { toas: Oas.TransactionBuilder, coredao: Coredao.TransactionBuilder, tcoredao: Coredao.TransactionBuilder, + apecoin: Apecoin.TransactionBuilder, + tapecoin: Apecoin.TransactionBuilder, apt: Apt.TransactionBuilder, tapt: Apt.TransactionBuilder, tao: Tao.TransactionBuilderFactory, diff --git a/modules/account-lib/tsconfig.json b/modules/account-lib/tsconfig.json index dd58f93c74..fa9e310dc3 100644 --- a/modules/account-lib/tsconfig.json +++ b/modules/account-lib/tsconfig.json @@ -10,6 +10,9 @@ "include": ["src/**/*", "test/**/*", "resources/**/*"], "exclude": ["node_modules"], "references": [ + { + "path": "../sdk-coin-apecoin" + }, { "path": "../sdk-coin-algo" }, diff --git a/modules/bitgo/package.json b/modules/bitgo/package.json index d7227854fd..f0cc10d467 100644 --- a/modules/bitgo/package.json +++ b/modules/bitgo/package.json @@ -51,6 +51,7 @@ "@bitgo/sdk-api": "^1.63.3", "@bitgo/sdk-coin-ada": "^4.10.0", "@bitgo/sdk-coin-algo": "^2.2.0", + "@bitgo/sdk-coin-apecoin": "^1.0.0", "@bitgo/sdk-coin-apt": "^2.3.0", "@bitgo/sdk-coin-arbeth": "^21.5.6", "@bitgo/sdk-coin-atom": "^13.4.14", diff --git a/modules/bitgo/src/v2/coinFactory.ts b/modules/bitgo/src/v2/coinFactory.ts index 431c8bf2f7..4d04675d0d 100644 --- a/modules/bitgo/src/v2/coinFactory.ts +++ b/modules/bitgo/src/v2/coinFactory.ts @@ -13,6 +13,7 @@ import { CoinMap, coins, getFormattedTokens } from '@bitgo/statics'; import { Ada, Algo, + Apecoin, Apt, AptToken, Arbeth, @@ -95,6 +96,7 @@ import { Ton, Tada, Talgo, + Tapecoin, Tapt, Tarbeth, Tatom, @@ -186,6 +188,7 @@ import { export function registerCoinConstructors(coinFactory: CoinFactory, coinMap: CoinMap = coins): void { coinFactory.register('ada', Ada.createInstance); coinFactory.register('algo', Algo.createInstance); + coinFactory.register('apecoin', Apecoin.createInstance); coinFactory.register('apt', Apt.createInstance); coinFactory.register('arbeth', Arbeth.createInstance); coinFactory.register('atom', Atom.createInstance); @@ -254,6 +257,7 @@ export function registerCoinConstructors(coinFactory: CoinFactory, coinMap: Coin coinFactory.register('tia', Tia.createInstance); coinFactory.register('ton', Ton.createInstance); coinFactory.register('talgo', Talgo.createInstance); + coinFactory.register('tapecoin', Tapecoin.createInstance); coinFactory.register('tapt', Tapt.createInstance); coinFactory.register('tarbeth', Tarbeth.createInstance); coinFactory.register('tada', Tada.createInstance); diff --git a/modules/bitgo/src/v2/coins/index.ts b/modules/bitgo/src/v2/coins/index.ts index bf559d3375..2e8d268cd3 100644 --- a/modules/bitgo/src/v2/coins/index.ts +++ b/modules/bitgo/src/v2/coins/index.ts @@ -2,6 +2,7 @@ import { AbstractUtxoCoin } from '@bitgo/abstract-utxo'; import { AbstractLightningCoin } from '@bitgo/abstract-lightning'; import { Ada, Tada } from '@bitgo/sdk-coin-ada'; import { Algo, AlgoToken, Talgo } from '@bitgo/sdk-coin-algo'; +import { Apecoin, Tapecoin } from '@bitgo/sdk-coin-apecoin'; import { Apt, Tapt, AptToken } from '@bitgo/sdk-coin-apt'; import { Arbeth, Tarbeth, ArbethToken } from '@bitgo/sdk-coin-arbeth'; import { Atom, Tatom } from '@bitgo/sdk-coin-atom'; @@ -73,6 +74,7 @@ import { Zketh, Tzketh, ZkethToken } from '@bitgo/sdk-coin-zketh'; export { AbstractUtxoCoin }; export { AbstractLightningCoin }; export { Algo, AlgoToken, Talgo }; +export { Apecoin, Tapecoin }; export { Apt, Tapt, AptToken }; export { Arbeth, Tarbeth, ArbethToken }; export { Ada, Tada }; diff --git a/modules/bitgo/tsconfig.json b/modules/bitgo/tsconfig.json index b06b9e70b1..77b93fda89 100644 --- a/modules/bitgo/tsconfig.json +++ b/modules/bitgo/tsconfig.json @@ -65,6 +65,12 @@ { "path": "../sdk-coin-algo" }, + { + "path": "../sdk-coin-apecoin" + }, + { + "path": "../sdk-coin-apecoin" + }, { "path": "../sdk-coin-apt" }, @@ -237,10 +243,10 @@ "path": "../sdk-coin-wemix" }, { - "path": "../sdk-coin-xlm" + "path": "../sdk-coin-xdc" }, { - "path": "../sdk-coin-xdc" + "path": "../sdk-coin-xlm" }, { "path": "../sdk-coin-xrp" diff --git a/modules/sdk-coin-apecoin/.eslintignore b/modules/sdk-coin-apecoin/.eslintignore new file mode 100644 index 0000000000..190f83e0df --- /dev/null +++ b/modules/sdk-coin-apecoin/.eslintignore @@ -0,0 +1,5 @@ +node_modules +.idea +public +dist + diff --git a/modules/sdk-coin-apecoin/.gitignore b/modules/sdk-coin-apecoin/.gitignore new file mode 100644 index 0000000000..67ccce4c64 --- /dev/null +++ b/modules/sdk-coin-apecoin/.gitignore @@ -0,0 +1,3 @@ +node_modules/ +.idea/ +dist/ diff --git a/modules/sdk-coin-apecoin/.mocharc.yml b/modules/sdk-coin-apecoin/.mocharc.yml new file mode 100644 index 0000000000..95814796d1 --- /dev/null +++ b/modules/sdk-coin-apecoin/.mocharc.yml @@ -0,0 +1,8 @@ +require: 'ts-node/register' +timeout: '60000' +reporter: 'min' +reporter-option: + - 'cdn=true' + - 'json=false' +exit: true +spec: ['test/unit/**/*.ts'] diff --git a/modules/sdk-coin-apecoin/.npmignore b/modules/sdk-coin-apecoin/.npmignore new file mode 100644 index 0000000000..d5fb3a098c --- /dev/null +++ b/modules/sdk-coin-apecoin/.npmignore @@ -0,0 +1,14 @@ +!dist/ +dist/test/ +dist/tsconfig.tsbuildinfo +.idea/ +.prettierrc.yml +tsconfig.json +src/ +test/ +scripts/ +.nyc_output +CODEOWNERS +node_modules/ +.prettierignore +.mocharc.js diff --git a/modules/sdk-coin-apecoin/.prettierignore b/modules/sdk-coin-apecoin/.prettierignore new file mode 100644 index 0000000000..3a11d6af29 --- /dev/null +++ b/modules/sdk-coin-apecoin/.prettierignore @@ -0,0 +1,2 @@ +.nyc_output/ +dist/ diff --git a/modules/sdk-coin-apecoin/.prettierrc.yml b/modules/sdk-coin-apecoin/.prettierrc.yml new file mode 100644 index 0000000000..7c3d8dd32a --- /dev/null +++ b/modules/sdk-coin-apecoin/.prettierrc.yml @@ -0,0 +1,3 @@ +printWidth: 120 +singleQuote: true +trailingComma: 'es5' diff --git a/modules/sdk-coin-apecoin/README.md b/modules/sdk-coin-apecoin/README.md new file mode 100644 index 0000000000..5767b9718f --- /dev/null +++ b/modules/sdk-coin-apecoin/README.md @@ -0,0 +1,30 @@ +# BitGo sdk-coin-apecoin + +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-apecoin`. + +```shell +npm i @bitgo/sdk-api @bitgo/sdk-coin-apecoin +``` + +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 { Apecoin } from '@bitgo/sdk-coin-apecoin'; + +const sdk = new BitGoAPI(); + +sdk.register('apecoin', Apecoin.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-apecoin/package.json b/modules/sdk-coin-apecoin/package.json new file mode 100644 index 0000000000..fccc5eb54a --- /dev/null +++ b/modules/sdk-coin-apecoin/package.json @@ -0,0 +1,51 @@ +{ + "name": "@bitgo/sdk-coin-apecoin", + "version": "1.0.0", + "description": "BitGo SDK coin library for Apecoin", + "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 .", + "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": ">=18 <23" + }, + "repository": { + "type": "git", + "url": "https://github.com/BitGo/BitGoJS.git", + "directory": "modules/sdk-coin-apecoin" + }, + "lint-staged": { + "*.{js,ts}": [ + "yarn prettier --write", + "yarn eslint --fix" + ] + }, + "publishConfig": { + "access": "public" + }, + "nyc": { + "extension": [ + ".ts" + ] + }, + "dependencies": { + "@bitgo/abstract-eth": "^24.4.0", + "@bitgo/sdk-core": "^35.1.0", + "@bitgo/statics": "^54.1.0" + }, + "devDependencies": { + "@bitgo/sdk-api": "^1.63.3", + "@bitgo/sdk-test": "^8.0.88" + } +} diff --git a/modules/sdk-coin-apecoin/src/apecoin.ts b/modules/sdk-coin-apecoin/src/apecoin.ts new file mode 100644 index 0000000000..323e4ee76e --- /dev/null +++ b/modules/sdk-coin-apecoin/src/apecoin.ts @@ -0,0 +1,46 @@ +/** + * @prettier + */ +import { BaseCoin, BitGoBase, MPCAlgorithm, MultisigType, multisigTypes } from '@bitgo/sdk-core'; +import { BaseCoin as StaticsBaseCoin, coins } from '@bitgo/statics'; +import { + AbstractEthLikeNewCoins, + TransactionBuilder as EthLikeTransactionBuilder, + UnsignedSweepTxMPCv2, + RecoverOptions, + OfflineVaultTxInfo, +} from '@bitgo/abstract-eth'; +import { TransactionBuilder } from './lib'; + +export class Apecoin extends AbstractEthLikeNewCoins { + protected constructor(bitgo: BitGoBase, staticsCoin?: Readonly) { + super(bitgo, staticsCoin); + } + + static createInstance(bitgo: BitGoBase, staticsCoin?: Readonly): BaseCoin { + return new Apecoin(bitgo, staticsCoin); + } + + protected getTransactionBuilder(): EthLikeTransactionBuilder { + return new TransactionBuilder(coins.get(this.getBaseChain())); + } + + /** @inheritDoc */ + supportsTss(): boolean { + return true; + } + + /** inherited doc */ + getDefaultMultisigType(): MultisigType { + return multisigTypes.tss; + } + + /** @inheritDoc */ + getMPCAlgorithm(): MPCAlgorithm { + return 'ecdsa'; + } + + protected async buildUnsignedSweepTxnTSS(params: RecoverOptions): Promise { + return this.buildUnsignedSweepTxnMPCv2(params); + } +} diff --git a/modules/sdk-coin-apecoin/src/index.ts b/modules/sdk-coin-apecoin/src/index.ts new file mode 100644 index 0000000000..f23b205376 --- /dev/null +++ b/modules/sdk-coin-apecoin/src/index.ts @@ -0,0 +1,3 @@ +export * from './lib'; +export * from './apecoin'; +export * from './tapecoin'; diff --git a/modules/sdk-coin-apecoin/src/lib/index.ts b/modules/sdk-coin-apecoin/src/lib/index.ts new file mode 100644 index 0000000000..20f9e761a1 --- /dev/null +++ b/modules/sdk-coin-apecoin/src/lib/index.ts @@ -0,0 +1,6 @@ +import * as Utils from './utils'; + +export { TransactionBuilder } from './transactionBuilder'; +export { TransferBuilder } from './transferBuilder'; +export { Transaction, KeyPair } from '@bitgo/abstract-eth'; +export { Utils }; diff --git a/modules/sdk-coin-apecoin/src/lib/resources.ts b/modules/sdk-coin-apecoin/src/lib/resources.ts new file mode 100644 index 0000000000..47751fd231 --- /dev/null +++ b/modules/sdk-coin-apecoin/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: 'tapecoin testnet', + networkId: (coins.get('tapecoin').network as EthereumNetwork).chainId, + chainId: (coins.get('tapecoin').network as EthereumNetwork).chainId, + }, + { + baseChain: 'sepolia', + hardfork: 'london', + eips: [1559], + } +); + +export const mainnetCommon = EthereumCommon.custom( + { + name: 'apecoin mainnet', + networkId: (coins.get('apecoin').network as EthereumNetwork).chainId, + chainId: (coins.get('apecoin').network as EthereumNetwork).chainId, + }, + { + baseChain: 'mainnet', + hardfork: 'london', + eips: [1559], + } +); diff --git a/modules/sdk-coin-apecoin/src/lib/transactionBuilder.ts b/modules/sdk-coin-apecoin/src/lib/transactionBuilder.ts new file mode 100644 index 0000000000..2e6d6ea8d2 --- /dev/null +++ b/modules/sdk-coin-apecoin/src/lib/transactionBuilder.ts @@ -0,0 +1,36 @@ +import { BaseCoin as CoinConfig } from '@bitgo/statics'; +import { BuildTransactionError, TransactionType } from '@bitgo/sdk-core'; +import { TransactionBuilder as AbstractTransactionBuilder, Transaction } from '@bitgo/abstract-eth'; +import { getCommon } from './utils'; +import { TransferBuilder } from './transferBuilder'; + +export class TransactionBuilder extends AbstractTransactionBuilder { + protected _transfer: TransferBuilder; + private _signatures: any; + + constructor(_coinConfig: Readonly) { + super(_coinConfig); + this._common = getCommon(this._coinConfig.network.type); + this.transaction = new Transaction(this._coinConfig, this._common); + } + + /** @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; + } + + addSignature(publicKey, signature) { + this._signatures = []; + this._signatures.push({ publicKey, signature }); + } + + protected getContractData(addresses: string[]): string { + throw new Error('Method not implemented.'); + } +} diff --git a/modules/sdk-coin-apecoin/src/lib/transferBuilder.ts b/modules/sdk-coin-apecoin/src/lib/transferBuilder.ts new file mode 100644 index 0000000000..7447c0cf3d --- /dev/null +++ b/modules/sdk-coin-apecoin/src/lib/transferBuilder.ts @@ -0,0 +1 @@ +export { TransferBuilder } from '@bitgo/abstract-eth'; diff --git a/modules/sdk-coin-apecoin/src/lib/utils.ts b/modules/sdk-coin-apecoin/src/lib/utils.ts new file mode 100644 index 0000000000..dc81fa08f9 --- /dev/null +++ b/modules/sdk-coin-apecoin/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-apecoin/src/register.ts b/modules/sdk-coin-apecoin/src/register.ts new file mode 100644 index 0000000000..1ee6ea7d66 --- /dev/null +++ b/modules/sdk-coin-apecoin/src/register.ts @@ -0,0 +1,8 @@ +import { BitGoBase } from '@bitgo/sdk-core'; +import { Apecoin } from './apecoin'; +import { Tapecoin } from './tapecoin'; + +export const register = (sdk: BitGoBase): void => { + sdk.register('apecoin', Apecoin.createInstance); + sdk.register('tapecoin', Tapecoin.createInstance); +}; diff --git a/modules/sdk-coin-apecoin/src/tapecoin.ts b/modules/sdk-coin-apecoin/src/tapecoin.ts new file mode 100644 index 0000000000..00f233c269 --- /dev/null +++ b/modules/sdk-coin-apecoin/src/tapecoin.ts @@ -0,0 +1,18 @@ +/** + * Testnet Apecoin + * + * @format + */ +import { BaseCoin, BitGoBase } from '@bitgo/sdk-core'; +import { BaseCoin as StaticsBaseCoin } from '@bitgo/statics'; +import { Apecoin } from './apecoin'; + +export class Tapecoin extends Apecoin { + protected constructor(bitgo: BitGoBase, staticsCoin?: Readonly) { + super(bitgo, staticsCoin); + } + + static createInstance(bitgo: BitGoBase, staticsCoin?: Readonly): BaseCoin { + return new Tapecoin(bitgo, staticsCoin); + } +} diff --git a/modules/sdk-coin-apecoin/test/integration/index.ts b/modules/sdk-coin-apecoin/test/integration/index.ts new file mode 100644 index 0000000000..e69de29bb2 diff --git a/modules/sdk-coin-apecoin/test/unit/apechain.ts b/modules/sdk-coin-apecoin/test/unit/apechain.ts new file mode 100644 index 0000000000..75b1729204 --- /dev/null +++ b/modules/sdk-coin-apecoin/test/unit/apechain.ts @@ -0,0 +1,40 @@ +import { TestBitGo, TestBitGoAPI } from '@bitgo/sdk-test'; +import { BitGoAPI } from '@bitgo/sdk-api'; + +import { Apecoin, Tapecoin } from '../../src/index'; + +const bitgo: TestBitGoAPI = TestBitGo.decorate(BitGoAPI, { env: 'test' }); + +describe('APECHAIN chain', function () { + before(function () { + bitgo.safeRegister('apecoin', Apecoin.createInstance); + bitgo.safeRegister('tapecoin', Tapecoin.createInstance); + bitgo.initializeTestVars(); + }); + + describe('Basic Coin Info', function () { + it('should return the right info for apecoin', function () { + const apechain = bitgo.coin('apecoin'); + + apechain.should.be.an.instanceof(Apecoin); + apechain.getChain().should.equal('apecoin'); + apechain.getFamily().should.equal('apecoin'); + apechain.getFullName().should.equal('apecoin'); + apechain.getBaseFactor().should.equal(1e18); + apechain.supportsTss().should.equal(true); + apechain.allowsAccountConsolidations().should.equal(false); + }); + + it('should return the right info for toas', function () { + const tapecoin = bitgo.coin('tapecoin'); + + tapecoin.should.be.an.instanceof(Tapecoin); + tapecoin.getChain().should.equal('tapecoin'); + tapecoin.getFamily().should.equal('tapecoin'); + tapecoin.getFullName().should.equal('Testnet Apecoin'); + tapecoin.getBaseFactor().should.equal(1e18); + tapecoin.supportsTss().should.equal(true); + tapecoin.allowsAccountConsolidations().should.equal(false); + }); + }); +}); diff --git a/modules/sdk-coin-apecoin/test/unit/getBuilder.ts b/modules/sdk-coin-apecoin/test/unit/getBuilder.ts new file mode 100644 index 0000000000..261b490989 --- /dev/null +++ b/modules/sdk-coin-apecoin/test/unit/getBuilder.ts @@ -0,0 +1,6 @@ +import { TransactionBuilder } from '../../src'; +import { coins } from '@bitgo/statics'; + +export const getBuilder = (coin: string): TransactionBuilder => { + return new TransactionBuilder(coins.get(coin)); +}; diff --git a/modules/sdk-coin-apecoin/test/unit/transactionBuilder/send.ts b/modules/sdk-coin-apecoin/test/unit/transactionBuilder/send.ts new file mode 100644 index 0000000000..e72bbe86e4 --- /dev/null +++ b/modules/sdk-coin-apecoin/test/unit/transactionBuilder/send.ts @@ -0,0 +1,16 @@ +import { getBuilder } from '../getBuilder'; +import should from 'should'; + +describe('Apecoin Transfer Builder', () => { + describe('Build from TxHex', function () { + it('Should successfully build from txHex', async function () { + const txBuilder = getBuilder('tapecoin'); + const txHex = + '0x02f86482249c010102825208944943dd2a2494e3ea5937954cb836692a047695b50180c001a0d3538b0f4f39bdbfa76becc187985c04ee0a01d0bc686a3c004b5f9f5a9a4fa5a036e4917be05a8ac0eb8639187ce746d7c47f74f04213118ba57873ec23ae1c2b'; + txBuilder.from(txHex); + const parsedTx = await txBuilder.build(); + + should.exist(parsedTx.toJson()); + }); + }); +}); diff --git a/modules/sdk-coin-apecoin/test/unit/utils.ts b/modules/sdk-coin-apecoin/test/unit/utils.ts new file mode 100644 index 0000000000..2e453d8324 --- /dev/null +++ b/modules/sdk-coin-apecoin/test/unit/utils.ts @@ -0,0 +1,29 @@ +import assert from 'assert'; +import should from 'should'; +import { NetworkType } from '@bitgo/statics'; +import { getCommon } from '../../src/lib/utils'; + +describe('Network Common Configuration', () => { + it('getCommon for ApeChain mainnet', () => { + const common = getCommon(NetworkType.MAINNET); + should.equal(common.chainName(), 'Ape Chain'); + should.equal(common.hardfork(), 'london'); + should.equal(common.chainIdBN().toString(), '33139'); + should.equal(common.networkIdBN().toString(), '33139'); + }); + + it('getCommon for ApeChain testnet', () => { + const common = getCommon(NetworkType.TESTNET); + should.equal(common.chainName(), 'Ape Chain Testnet'); + should.equal(common.hardfork(), 'london'); + should.equal(common.chainIdBN().toString(), '33111'); + should.equal(common.networkIdBN().toString(), '33111'); + }); + + it('getCommon for invalid network', () => { + assert.throws( + () => getCommon('invalidNetwork' as NetworkType), + (e: any) => e.message === 'Missing network common configuration' + ); + }); +}); diff --git a/modules/sdk-coin-apecoin/tsconfig.json b/modules/sdk-coin-apecoin/tsconfig.json new file mode 100644 index 0000000000..9e7dd3fe95 --- /dev/null +++ b/modules/sdk-coin-apecoin/tsconfig.json @@ -0,0 +1,29 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "./dist", + "rootDir": "./", + "strictPropertyInitialization": false, + "esModuleInterop": true, + "typeRoots": ["../../types", "./node_modules/@types", "../../node_modules/@types"] + }, + "include": ["src/**/*", "test/**/*"], + "exclude": ["node_modules"], + "references": [ + { + "path": "../abstract-eth", + }, + { + "path": "../sdk-api" + }, + { + "path": "../sdk-core" + }, + { + "path": "../statics" + }, + { + "path": "../sdk-test" + } + ] +} diff --git a/modules/sdk-core/src/bitgo/environments.ts b/modules/sdk-core/src/bitgo/environments.ts index f39d2d8fe9..a327d808b8 100644 --- a/modules/sdk-core/src/bitgo/environments.ts +++ b/modules/sdk-core/src/bitgo/environments.ts @@ -19,6 +19,8 @@ interface EnvironmentTemplate { bscscanBaseUrl?: string; bscscanApiToken?: string; polygonscanApiToken?: string; + apecoinExplorerApiToken?: string; + apecoinExplorerBaseUrl?: string; arbiscanBaseUrl?: string; arbiscanApiToken?: string; oasExplorerApiToken?: string; diff --git a/tsconfig.packages.json b/tsconfig.packages.json index 997e5ef65b..5f6c4cd2fc 100644 --- a/tsconfig.packages.json +++ b/tsconfig.packages.json @@ -43,6 +43,9 @@ { "path": "./modules/sdk-coin-algo" }, + { + "path": "./modules/sdk-coin-apecoin" + }, { "path": "./modules/sdk-coin-apt" }, @@ -155,10 +158,10 @@ "path": "./modules/sdk-coin-ltc" }, { - "path": "./modules/sdk-coin-mon" + "path": "./modules/sdk-coin-mantra" }, { - "path": "./modules/sdk-coin-mantra" + "path": "./modules/sdk-coin-mon" }, { "path": "./modules/sdk-coin-near" @@ -166,9 +169,6 @@ { "path": "./modules/sdk-coin-oas" }, - { - "path": "./modules/sdk-coin-sgb" - }, { "path": "./modules/sdk-coin-opeth" }, @@ -190,17 +190,20 @@ { "path": "./modules/sdk-coin-sei" }, + { + "path": "./modules/sdk-coin-sgb" + }, { "path": "./modules/sdk-coin-sol" }, { - "path": "./modules/sdk-coin-stx" + "path": "./modules/sdk-coin-soneium" }, { "path": "./modules/sdk-coin-stt" }, { - "path": "./modules/sdk-coin-soneium" + "path": "./modules/sdk-coin-stx" }, { "path": "./modules/sdk-coin-sui"