Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CODEOWNERS
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@
/modules/sdk-coin-hbar/ @BitGo/ethalt-team
/modules/sdk-coin-icp/ @BitGo/ethalt-team
/modules/sdk-coin-initia/ @BitGo/ethalt-team
/modules/sdk-coin-iota/ @BitGo/ethalt-team
/modules/sdk-coin-mon/ @BitGo/ethalt-team
/modules/sdk-coin-mantra/ @BitGo/ethalt-team
/modules/sdk-coin-near/ @BitGo/ethalt-team
Expand Down
3 changes: 3 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,7 @@ COPY --from=builder /tmp/bitgo/modules/sdk-coin-hbar /var/modules/sdk-coin-hbar/
COPY --from=builder /tmp/bitgo/modules/sdk-coin-icp /var/modules/sdk-coin-icp/
COPY --from=builder /tmp/bitgo/modules/sdk-coin-initia /var/modules/sdk-coin-initia/
COPY --from=builder /tmp/bitgo/modules/sdk-coin-injective /var/modules/sdk-coin-injective/
COPY --from=builder /tmp/bitgo/modules/sdk-coin-iota /var/modules/sdk-coin-iota/
COPY --from=builder /tmp/bitgo/modules/sdk-coin-islm /var/modules/sdk-coin-islm/
COPY --from=builder /tmp/bitgo/modules/sdk-coin-mantra /var/modules/sdk-coin-mantra/
COPY --from=builder /tmp/bitgo/modules/sdk-coin-mon /var/modules/sdk-coin-mon/
Expand Down Expand Up @@ -183,6 +184,7 @@ cd /var/modules/sdk-coin-hbar && yarn link && \
cd /var/modules/sdk-coin-icp && yarn link && \
cd /var/modules/sdk-coin-initia && yarn link && \
cd /var/modules/sdk-coin-injective && yarn link && \
cd /var/modules/sdk-coin-iota && yarn link && \
cd /var/modules/sdk-coin-islm && yarn link && \
cd /var/modules/sdk-coin-mantra && yarn link && \
cd /var/modules/sdk-coin-mon && yarn link && \
Expand Down Expand Up @@ -282,6 +284,7 @@ RUN cd /var/bitgo-express && \
yarn link @bitgo/sdk-coin-icp && \
yarn link @bitgo/sdk-coin-initia && \
yarn link @bitgo/sdk-coin-injective && \
yarn link @bitgo/sdk-coin-iota && \
yarn link @bitgo/sdk-coin-islm && \
yarn link @bitgo/sdk-coin-mantra && \
yarn link @bitgo/sdk-coin-mon && \
Expand Down
1 change: 1 addition & 0 deletions modules/bitgo/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,7 @@
"@bitgo/sdk-coin-icp": "^1.18.0",
"@bitgo/sdk-coin-initia": "^2.3.0",
"@bitgo/sdk-coin-injective": "^3.3.0",
"@bitgo/sdk-coin-iota": "^1.0.0",
"@bitgo/sdk-coin-islm": "^2.3.0",
"@bitgo/sdk-coin-lnbtc": "^1.4.0",
"@bitgo/sdk-coin-ltc": "^3.3.0",
Expand Down
3 changes: 3 additions & 0 deletions modules/bitgo/src/v2/coinFactory.ts
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,7 @@ import {
Icp,
Initia,
Injective,
Iota,
Islm,
Lnbtc,
Ltc,
Expand Down Expand Up @@ -270,6 +271,7 @@ export function registerCoinConstructors(coinFactory: CoinFactory, coinMap: Coin
coinFactory.register('icp', Icp.createInstance);
coinFactory.register('initia', Initia.createInstance);
coinFactory.register('injective', Injective.createInstance);
coinFactory.register('iota', Iota.createInstance);
coinFactory.register('islm', Islm.createInstance);
coinFactory.register('near', Near.createInstance);
coinFactory.register('oas', Oas.createInstance);
Expand Down Expand Up @@ -333,6 +335,7 @@ export function registerCoinConstructors(coinFactory: CoinFactory, coinMap: Coin
coinFactory.register('ticp', Ticp.createInstance);
coinFactory.register('tinitia', Tinitia.createInstance);
coinFactory.register('tinjective', Tinjective.createInstance);
coinFactory.register('tiota', Iota.createInstance);
coinFactory.register('tislm', Tislm.createInstance);
coinFactory.register('tlnbtc', Tlnbtc.createInstance);
coinFactory.register('tltc', Tltc.createInstance);
Expand Down
2 changes: 2 additions & 0 deletions modules/bitgo/src/v2/coins/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ import { Hbar, Thbar } from '@bitgo/sdk-coin-hbar';
import { Icp, Ticp } from '@bitgo/sdk-coin-icp';
import { Initia, Tinitia } from '@bitgo/sdk-coin-initia';
import { Injective, Tinjective } from '@bitgo/sdk-coin-injective';
import { Iota } from '@bitgo/sdk-coin-iota';
import { Islm, Tislm } from '@bitgo/sdk-coin-islm';
import { Lnbtc, Tlnbtc } from '@bitgo/sdk-coin-lnbtc';
import { Ltc, Tltc } from '@bitgo/sdk-coin-ltc';
Expand Down Expand Up @@ -112,6 +113,7 @@ export { Hash, Thash, HashToken };
export { Hbar, Thbar };
export { Icp, Ticp };
export { Initia, Tinitia };
export { Iota };
export { Lnbtc, Tlnbtc };
export { Ltc, Tltc };
export { Mantra, Tmantra };
Expand Down
2 changes: 2 additions & 0 deletions modules/bitgo/test/browser/browser.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,8 @@ describe('Coins', () => {
AptToken: 1,
Icp: 1,
Ticp: 1,
Iota: 1,
Tiota: 1,
Sip10Token: 1,
SoneiumToken: 1,
Polyx: 1,
Expand Down
3 changes: 3 additions & 0 deletions modules/bitgo/tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,9 @@
{
"path": "../sdk-coin-injective"
},
{
"path": "../sdk-coin-iota"
},
{
"path": "../sdk-coin-islm"
},
Expand Down
5 changes: 5 additions & 0 deletions modules/sdk-coin-iota/.eslintignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
node_modules
.idea
public
dist

3 changes: 3 additions & 0 deletions modules/sdk-coin-iota/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
node_modules/
.idea/
dist/
8 changes: 8 additions & 0 deletions modules/sdk-coin-iota/.mocharc.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
require: 'tsx'
timeout: '60000'
reporter: 'min'
reporter-option:
- 'cdn=true'
- 'json=false'
exit: true
spec: ['test/unit/**/*.ts']
14 changes: 14 additions & 0 deletions modules/sdk-coin-iota/.npmignore
Original file line number Diff line number Diff line change
@@ -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
2 changes: 2 additions & 0 deletions modules/sdk-coin-iota/.prettierignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
.nyc_output/
dist/
3 changes: 3 additions & 0 deletions modules/sdk-coin-iota/.prettierrc.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
printWidth: 120
singleQuote: true
trailingComma: 'es5'
Empty file.
39 changes: 39 additions & 0 deletions modules/sdk-coin-iota/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
# BitGo SDK Coin Implementation for IOTA

SDK coins provide a modular approach to a monolithic architecture. This package provides the BitGo SDK implementation for the IOTA cryptocurrency.

## 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-iota`.

```
npm install @bitgo/sdk-api && npm install @bitgo/sdk-coin-iota
```

## Usage

```typescript
import { BitGoAPI } from '@bitgo/sdk-api';
import { Iota } from '@bitgo/sdk-coin-iota';

// Register the coin with BitGo SDK
const sdk = new BitGoAPI();
sdk.register('iota', Iota.createInstance);

// Now you can create an IOTA instance
const iota = sdk.coin('iota');
```

## Features

- Key pair generation and management
- Address validation
- Transaction building and signing
- TSS (Threshold Signature Scheme) support
- Support for IOTA tokens

## Documentation

For detailed API documentation, see the [BitGo API reference](https://app.bitgo.com/docs/).
51 changes: 51 additions & 0 deletions modules/sdk-coin-iota/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
{
"name": "@bitgo/sdk-coin-iota",
"version": "1.0.0",
"description": "BitGo SDK coin library for IOTA coin",
"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 <sdkteam@bitgo.com>",
"license": "MIT",
"engines": {
"node": ">=18 <23"
},
"repository": {
"type": "git",
"url": "https://github.com/BitGo/BitGoJS.git",
"directory": "modules/sdk-coin-iota"
},
"lint-staged": {
"*.{js,ts}": [
"yarn prettier --write",
"yarn eslint --fix"
]
},
"publishConfig": {
"access": "public"
},
"nyc": {
"extension": [
".ts"
]
},
"dependencies": {
"@bitgo/sdk-core": "^36.5.0",
"@bitgo/statics": "^57.5.0",
"bignumber.js": "^9.1.2"
},
"devDependencies": {
"@bitgo/sdk-api": "^1.67.0",
"@bitgo/sdk-test": "^9.0.5"
}
}
3 changes: 3 additions & 0 deletions modules/sdk-coin-iota/src/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export * from './lib';
export * from './register';
export * from './iota';
127 changes: 127 additions & 0 deletions modules/sdk-coin-iota/src/iota.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
import {
AuditDecryptedKeyParams,
BaseCoin,
BitGoBase,
KeyPair as KeyPairInterface,
ParseTransactionOptions,
ParsedTransaction,
SignTransactionOptions,
SignedTransaction,
VerifyAddressOptions,
VerifyTransactionOptions,
} from '@bitgo/sdk-core';
import { BaseCoin as StaticsBaseCoin, CoinFamily } from '@bitgo/statics';
import utils from './lib/utils';

export class Iota extends BaseCoin {
protected readonly _staticsCoin: Readonly<StaticsBaseCoin>;

protected constructor(bitgo: BitGoBase, staticsCoin?: Readonly<StaticsBaseCoin>) {
super(bitgo);

if (!staticsCoin) {
throw new Error('missing required constructor parameter staticsCoin');
}

this._staticsCoin = staticsCoin;
}

static createInstance(bitgo: BitGoBase, staticsCoin?: Readonly<StaticsBaseCoin>): BaseCoin {
return new Iota(bitgo, staticsCoin);
}

getBaseFactor(): string | number {
return Math.pow(10, this._staticsCoin.decimalPlaces);
}

getChain() {
return this._staticsCoin.name;
}

getFamily(): CoinFamily {
return this._staticsCoin.family;
}

getFullName() {
return this._staticsCoin.fullName;
}

/**
* Check if an address is valid
* @param address the address to be validated
* @returns true if the address is valid
*/
isValidAddress(address: string): boolean {
// IOTA addresses are 64-character hex strings
return utils.isValidAddress(address);
}

/**
* Verifies that a transaction prebuild complies with the original intention
* @param params
*/
async verifyTransaction(params: VerifyTransactionOptions): Promise<boolean> {
// TODO: Add IOTA-specific transaction verification logic
return true;
}

/**
* Check if an address belongs to a wallet
* @param params
*/
async isWalletAddress(params: VerifyAddressOptions): Promise<boolean> {
return this.isValidAddress(params.address);
}

/**
* Parse a transaction
* @param params
*/
async parseTransaction(params: ParseTransactionOptions): Promise<ParsedTransaction> {
// TODO: Add IOTA-specific transaction parsing logic
return {};
}

/**
* Generate a key pair
* @param seed Optional seed to generate key pair from
*/
generateKeyPair(seed?: Uint8Array): KeyPairInterface {
// For now we're just returning an empty implementation as the KeyPair class needs to be implemented
// In a real implementation, we would use the KeyPair class properly
return {
pub: '',
prv: '',
};
}

/**
* Check if a public key is valid
* @param pub Public key to check
*/
isValidPub(pub: string): boolean {
// TODO: Implement proper IOTA public key validation
return pub.length > 0;
}

/**
* Sign a transaction
* @param params
*/
async signTransaction(params: SignTransactionOptions): Promise<SignedTransaction> {
// TODO: Add IOTA-specific transaction signing logic
return {
halfSigned: {
txHex: '',
},
};
}

/**
* Audit a decrypted private key to ensure it's valid
* @param params
*/
auditDecryptedKey(params: AuditDecryptedKeyParams): void {
// TODO: Implement IOTA-specific key validation logic
}
}
11 changes: 11 additions & 0 deletions modules/sdk-coin-iota/src/lib/constants.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
export const IOTA_ADDRESS_LENGTH = 64;
export const IOTA_TRANSACTION_ID_LENGTH = 64;
export const IOTA_BLOCK_ID_LENGTH = 64;
export const IOTA_SIGNATURE_LENGTH = 128;
export const ADDRESS_BYTES_LENGTH = 32;
export const AMOUNT_BYTES_LENGTH = 8;
export const SECONDS_PER_WEEK = 7 * 24 * 60 * 60; // 1 week in seconds

// Define IOTA specific function paths
export const IOTA_TRANSFER_FUNCTION = '0x0::coin::transfer';
export const IOTA_BATCH_TRANSFER_FUNCTION = '0x1::coin_batch::transfer';
6 changes: 6 additions & 0 deletions modules/sdk-coin-iota/src/lib/iface.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
/**
* The transaction data returned from the toJson() function of a transaction
*/
export interface TxData {
id: string;
}
9 changes: 9 additions & 0 deletions modules/sdk-coin-iota/src/lib/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import * as Utils from './utils';
import * as Interface from './iface';

export { KeyPair } from './keyPair';
export { Transaction } from './transaction';
export { TransactionBuilder } from './transactionBuilder';
export { TransferBuilder } from './transferBuilder';
export { TransactionBuilderFactory } from './transactionBuilderFactory';
export { Interface, Utils };
Loading