├── .gitlab └── issue_templates │ ├── .gitkeep │ ├── Epic.md │ ├── Task.md │ ├── Feature.md │ └── Bug.md ├── packages ├── core │ ├── src │ │ ├── lib │ │ │ ├── components │ │ │ │ ├── qr │ │ │ │ │ ├── qr.component.scss │ │ │ │ │ ├── qr.component.html │ │ │ │ │ ├── qr.component.ts │ │ │ │ │ └── qr.component.spec.ts │ │ │ │ ├── iac-qr │ │ │ │ │ ├── iac-qr.component.scss │ │ │ │ │ ├── iac-qr.component.html │ │ │ │ │ └── iac-qr.component.spec.ts │ │ │ │ ├── qr-settings │ │ │ │ │ ├── qr-settings.component.scss │ │ │ │ │ ├── qr-settings.component.ts │ │ │ │ │ └── qr-settings.component.spec.ts │ │ │ │ ├── account-selection │ │ │ │ │ ├── account-selection.component.scss │ │ │ │ │ ├── account-selection.component.html │ │ │ │ │ └── account-selection.component.spec.ts │ │ │ │ ├── currency-symbol │ │ │ │ │ ├── currency-symbol.component.scss │ │ │ │ │ ├── currency-symbol.component.html │ │ │ │ │ ├── currency-symbol.types.ts │ │ │ │ │ └── currency-symbol.facade.ts │ │ │ │ ├── titled-text │ │ │ │ │ ├── titled-text.component.scss │ │ │ │ │ ├── titled-text.component.html │ │ │ │ │ ├── titled-text.component.ts │ │ │ │ │ └── titled-text.component.spec.ts │ │ │ │ ├── network-badge │ │ │ │ │ ├── network-badge.component.scss │ │ │ │ │ ├── network-badge.component.html │ │ │ │ │ ├── network-badge.component.ts │ │ │ │ │ └── network-badge.component.spec.ts │ │ │ │ ├── identicon │ │ │ │ │ ├── identicon.component.html │ │ │ │ │ ├── identicon.component.scss │ │ │ │ │ └── identicon.component.spec.ts │ │ │ │ ├── account-item │ │ │ │ │ ├── account-item.component.scss │ │ │ │ │ ├── account-item.component.ts │ │ │ │ │ ├── account-item.component.html │ │ │ │ │ └── account-item.component.spec.ts │ │ │ │ ├── titled-address │ │ │ │ │ ├── titled-address.component.scss │ │ │ │ │ ├── titled-address.component.html │ │ │ │ │ ├── titled-address.component.ts │ │ │ │ │ └── titled-address.component.spec.ts │ │ │ │ └── from-to │ │ │ │ │ ├── from-to.component.scss │ │ │ │ │ └── from-to.component.spec.ts │ │ │ ├── types │ │ │ │ ├── Either.ts │ │ │ │ ├── SupportedLanguage.ts │ │ │ │ ├── Token.ts │ │ │ │ ├── ui │ │ │ │ │ ├── UIAction.ts │ │ │ │ │ └── UIResource.ts │ │ │ │ └── ExternalAliasResolver.ts │ │ │ ├── pipes │ │ │ │ ├── wallet-filter │ │ │ │ │ └── wallet-filter.pipe.spec.ts │ │ │ │ └── pipes.module.ts │ │ │ ├── utils │ │ │ │ ├── protocol │ │ │ │ │ ├── protocol-identifier.ts │ │ │ │ │ └── protocol-network-identifier.ts │ │ │ │ ├── not-initialized.ts │ │ │ │ ├── airgap-transaction.ts │ │ │ │ └── array.ts │ │ │ ├── capacitor-plugins │ │ │ │ ├── definitions.ts │ │ │ │ └── injection-tokens.ts │ │ │ ├── config │ │ │ │ └── app-config.ts │ │ │ ├── services │ │ │ │ ├── uri │ │ │ │ │ └── uri.service.spec.ts │ │ │ │ ├── token │ │ │ │ │ └── token.service.spec.ts │ │ │ │ ├── image │ │ │ │ │ ├── image.service.spec.ts │ │ │ │ │ └── fetcher │ │ │ │ │ │ └── image-direct.fetcher.ts │ │ │ │ ├── address │ │ │ │ │ └── address.service.spec.ts │ │ │ │ ├── transaction │ │ │ │ │ └── transaction.service.spec.ts │ │ │ │ ├── language │ │ │ │ │ └── language.service.spec.ts │ │ │ │ ├── qr-scanner │ │ │ │ │ └── qr-scanner.service.spec.ts │ │ │ │ ├── storage │ │ │ │ │ ├── storage.service.spec.ts │ │ │ │ │ └── base.storage.ts │ │ │ │ ├── serializer │ │ │ │ │ └── serializer.service.spec.ts │ │ │ │ ├── iac │ │ │ │ │ ├── qr-generator.ts │ │ │ │ │ └── message-handler.ts │ │ │ │ ├── permissions │ │ │ │ │ └── permissions.service.spec.ts │ │ │ │ ├── protocol │ │ │ │ │ └── utils │ │ │ │ │ │ └── test.ts │ │ │ │ ├── filesystem │ │ │ │ │ └── filesystem.service.spec.ts │ │ │ │ └── qr │ │ │ │ │ └── qr-generators │ │ │ │ │ ├── serializer-v2-generator.spec.ts │ │ │ │ │ ├── xpub-generator.spec.ts │ │ │ │ │ └── serializer-v2-generator.ts │ │ │ └── airgap-angular-core.module.ts │ │ ├── assets │ │ │ ├── symbols │ │ │ │ ├── astr.png │ │ │ │ ├── btctz.png │ │ │ │ ├── doga.png │ │ │ │ ├── ethtz.png │ │ │ │ ├── quipu.png │ │ │ │ ├── wrap.png │ │ │ │ ├── wusdc.png │ │ │ │ ├── vib.svg │ │ │ │ ├── mtl.svg │ │ │ │ ├── salt.svg │ │ │ │ ├── bat.svg │ │ │ │ ├── storm.svg │ │ │ │ ├── lrc.svg │ │ │ │ ├── dgd.svg │ │ │ │ ├── mod.svg │ │ │ │ ├── r.svg │ │ │ │ ├── mkr.svg │ │ │ │ ├── icn.svg │ │ │ │ ├── drgn.svg │ │ │ │ ├── nio.svg │ │ │ │ ├── xchf.svg │ │ │ │ ├── cred.svg │ │ │ │ ├── lend.svg │ │ │ │ ├── lpt.svg │ │ │ │ ├── tnt.svg │ │ │ │ ├── icx.svg │ │ │ │ ├── eos.svg │ │ │ │ ├── bnt.svg │ │ │ │ ├── tbx.svg │ │ │ │ ├── theta.svg │ │ │ │ ├── utk.svg │ │ │ │ ├── auto.svg │ │ │ │ ├── dock.svg │ │ │ │ ├── wpr.svg │ │ │ │ ├── tkn.svg │ │ │ │ ├── xpa.svg │ │ │ │ ├── wings.svg │ │ │ │ ├── zil.svg │ │ │ │ ├── nuls.svg │ │ │ │ ├── adx.svg │ │ │ │ ├── neu.svg │ │ │ │ ├── snt.svg │ │ │ │ ├── gup.svg │ │ │ │ ├── bnb.svg │ │ │ │ ├── ppt.svg │ │ │ │ ├── eth.svg │ │ │ │ ├── fuel.svg │ │ │ │ ├── gbx.svg │ │ │ │ ├── iost.svg │ │ │ │ ├── wax.svg │ │ │ │ ├── req.svg │ │ │ │ ├── ong.svg │ │ │ │ ├── cvc.svg │ │ │ │ ├── rdn.svg │ │ │ │ ├── cnd.svg │ │ │ │ ├── ht.svg │ │ │ │ ├── taas.svg │ │ │ │ ├── gsc.svg │ │ │ │ ├── gvt.svg │ │ │ │ ├── cob.svg │ │ │ │ ├── dlt.svg │ │ │ │ ├── atm.svg │ │ │ │ ├── edo.svg │ │ │ │ ├── mth.svg │ │ │ │ ├── dcn.svg │ │ │ │ ├── pax.svg │ │ │ │ ├── usdt.svg │ │ │ │ ├── ctr.svg │ │ │ │ ├── elix.svg │ │ │ │ ├── nexo.svg │ │ │ │ ├── bcpt.svg │ │ │ │ ├── gusd.svg │ │ │ │ ├── poly.svg │ │ │ │ ├── btm.svg │ │ │ │ ├── pay.svg │ │ │ │ ├── dtr.svg │ │ │ │ ├── ngc.svg │ │ │ │ ├── tel.svg │ │ │ │ ├── npxs.svg │ │ │ │ ├── mco.svg │ │ │ │ ├── cdt.svg │ │ │ │ ├── qsp.svg │ │ │ │ ├── plr.svg │ │ │ │ ├── sphtx.svg │ │ │ │ ├── ksm.svg │ │ │ │ ├── plenty.svg │ │ │ │ ├── jnt.svg │ │ │ │ ├── sngls.svg │ │ │ │ ├── mda.svg │ │ │ │ ├── brd.svg │ │ │ │ ├── fsn.svg │ │ │ │ ├── ftc.svg │ │ │ │ ├── ctxc.svg │ │ │ │ ├── abt.svg │ │ │ │ ├── oax.svg │ │ │ │ ├── loom.svg │ │ │ │ ├── veri.svg │ │ │ │ ├── evx.svg │ │ │ │ ├── ary.svg │ │ │ │ ├── tau.svg │ │ │ │ ├── appc.svg │ │ │ │ ├── btc.svg │ │ │ │ ├── dat.svg │ │ │ │ ├── omg.svg │ │ │ │ ├── enj.svg │ │ │ │ ├── poe.svg │ │ │ │ ├── tomo.svg │ │ │ │ ├── tix.svg │ │ │ │ ├── ppp.svg │ │ │ │ ├── gno.svg │ │ │ │ ├── gto.svg │ │ │ │ ├── stq.svg │ │ │ │ ├── dew.svg │ │ │ │ ├── dnt.svg │ │ │ │ ├── ae.svg │ │ │ │ ├── ost.svg │ │ │ │ ├── cs.svg │ │ │ │ ├── data.svg │ │ │ │ ├── sub.svg │ │ │ │ ├── you.svg │ │ │ │ ├── deez.svg │ │ │ │ ├── generic-coin.svg │ │ │ │ ├── usdc.svg │ │ │ │ ├── bcbc.svg │ │ │ │ ├── aion.svg │ │ │ │ ├── xtz.svg │ │ │ │ ├── mcap.svg │ │ │ │ ├── ast.svg │ │ │ │ ├── dot.svg │ │ │ │ ├── hodl.svg │ │ │ │ ├── gnt.svg │ │ │ │ ├── crpt.svg │ │ │ │ ├── tusd.svg │ │ │ │ ├── san.svg │ │ │ │ ├── lun.svg │ │ │ │ ├── nas.svg │ │ │ │ ├── rhoc.svg │ │ │ │ ├── wtc.svg │ │ │ │ ├── elf.svg │ │ │ │ ├── soc.svg │ │ │ │ ├── bix.svg │ │ │ │ ├── sxtz.svg │ │ │ │ ├── yoyow.svg │ │ │ │ ├── tzbtc.svg │ │ │ │ ├── bnty.svg │ │ │ │ ├── mds.svg │ │ │ │ ├── agi.svg │ │ │ │ ├── zrx.svg │ │ │ │ ├── iotx.svg │ │ │ │ ├── ant.svg │ │ │ │ ├── arn.svg │ │ │ │ ├── dent.svg │ │ │ │ └── knc.svg │ │ │ ├── img │ │ │ │ └── identicon_placeholder.png │ │ │ └── i18n-common │ │ │ │ ├── zh-cn.json │ │ │ │ ├── es.json │ │ │ │ └── de.json │ │ └── typings │ │ │ ├── myetherwallet-blockies │ │ │ └── index.d.ts │ │ │ └── download__blockies │ │ │ └── index.d.ts │ ├── ng-package.json │ ├── .eslintrc.js │ ├── test │ │ ├── utils │ │ │ ├── unit-test-helper.ts │ │ │ ├── storage-mock.ts │ │ │ ├── translate-mock.ts │ │ │ ├── ionic-mocks.ts │ │ │ └── plugins-mock.ts │ │ └── test.ts │ ├── tsconfig.lib.prod.json │ ├── tsconfig.spec.json │ └── tsconfig.lib.json └── ngrx │ ├── ng-package.json │ ├── .eslintrc.js │ ├── test │ ├── utils │ │ ├── unit-test-helper.ts │ │ └── test-bed.ts │ └── test.ts │ ├── tsconfig.lib.prod.json │ ├── src │ ├── public-api.ts │ └── lib │ │ ├── components │ │ ├── currency-symbol │ │ │ └── currency-symbol.types.ts │ │ └── components.module.ts │ │ └── airgap-angular-ngrx.module.ts │ ├── tsconfig.spec.json │ ├── tsconfig.lib.json │ └── package-lock.json ├── .prettierrc ├── .eslintignore ├── lerna.json ├── .prettierignore ├── .editorconfig ├── npm-ci-publish.sh ├── .gitignore ├── npm-ci-publish-beta-only.sh ├── tsconfig.json └── .devcontainer └── devcontainer.json /.gitlab/issue_templates/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/lib/components/qr/qr.component.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/lib/components/iac-qr/iac-qr.component.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/lib/components/qr-settings/qr-settings.component.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/lib/components/account-selection/account-selection.component.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/lib/components/currency-symbol/currency-symbol.component.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/lib/types/Either.ts: -------------------------------------------------------------------------------- 1 | export type Either = [T, undefined] | [undefined, R] 2 | -------------------------------------------------------------------------------- /packages/core/src/lib/components/titled-text/titled-text.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: block; 3 | } 4 | -------------------------------------------------------------------------------- /packages/core/src/lib/types/SupportedLanguage.ts: -------------------------------------------------------------------------------- 1 | export type SupportedLanguage = 'en' | 'de' | 'es' | 'zh-cn' 2 | -------------------------------------------------------------------------------- /packages/core/src/lib/components/currency-symbol/currency-symbol.component.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/astr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/serverwentdown/airgap-angular-components/master/packages/core/src/assets/symbols/astr.png -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/btctz.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/serverwentdown/airgap-angular-components/master/packages/core/src/assets/symbols/btctz.png -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/doga.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/serverwentdown/airgap-angular-components/master/packages/core/src/assets/symbols/doga.png -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/ethtz.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/serverwentdown/airgap-angular-components/master/packages/core/src/assets/symbols/ethtz.png -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/quipu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/serverwentdown/airgap-angular-components/master/packages/core/src/assets/symbols/quipu.png -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/wrap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/serverwentdown/airgap-angular-components/master/packages/core/src/assets/symbols/wrap.png -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/wusdc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/serverwentdown/airgap-angular-components/master/packages/core/src/assets/symbols/wusdc.png -------------------------------------------------------------------------------- /packages/core/src/typings/myetherwallet-blockies/index.d.ts: -------------------------------------------------------------------------------- 1 | declare module 'myetherwallet-blockies' { 2 | export function toDataUrl(address: string): string 3 | } 4 | -------------------------------------------------------------------------------- /packages/core/src/lib/components/network-badge/network-badge.component.scss: -------------------------------------------------------------------------------- 1 | ion-item { 2 | --min-height: 0; 3 | } 4 | 5 | .badge__margin { 6 | margin: 0px 6px 0px 0px; 7 | } 8 | -------------------------------------------------------------------------------- /packages/core/src/assets/img/identicon_placeholder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/serverwentdown/airgap-angular-components/master/packages/core/src/assets/img/identicon_placeholder.png -------------------------------------------------------------------------------- /packages/core/src/lib/components/qr/qr.component.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "printWidth": 140, 3 | "trailingComma": "none", 4 | "singleQuote": true, 5 | "semi": false, 6 | "htmlWhitespaceSensitivity": "ignore", 7 | "endOfLine": "lf" 8 | } 9 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | .history 2 | .dockerignore 3 | .DS_Store 4 | .gitignore 5 | .nyc_output 6 | .prettierignore 7 | .prettierrc 8 | .eslintrc.js 9 | coverage 10 | dist 11 | node_modules 12 | **/*.js -------------------------------------------------------------------------------- /packages/ngrx/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "../../node_modules/ng-packagr/ng-package.schema.json", 3 | "dest": "./dist", 4 | "lib": { 5 | "entryFile": "src/public-api.ts" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /packages/core/src/lib/types/Token.ts: -------------------------------------------------------------------------------- 1 | export interface Token { 2 | symbol: string 3 | name: string 4 | marketSymbol: string 5 | identifier: string 6 | contractAddress: string 7 | decimals: number 8 | } 9 | -------------------------------------------------------------------------------- /packages/core/src/assets/i18n-common/zh-cn.json: -------------------------------------------------------------------------------- 1 | { 2 | "from-to.amount_label": "数量", 3 | "from-to.fee_label": "手续费", 4 | "from-to.time_label": "时间", 5 | "from-to.from_label": "从", 6 | "from-to.to_label": "到" 7 | } 8 | -------------------------------------------------------------------------------- /packages/core/src/assets/i18n-common/es.json: -------------------------------------------------------------------------------- 1 | { 2 | "from-to.amount_label": "Monto", 3 | "from-to.fee_label": "Cuota", 4 | "from-to.time_label": "Tiempo", 5 | "from-to.from_label": "De", 6 | "from-to.to_label": "A" 7 | } 8 | -------------------------------------------------------------------------------- /packages/core/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "../../node_modules/ng-packagr/ng-package.schema.json", 3 | "dest": "./dist", 4 | "lib": { 5 | "entryFile": "src/public-api.ts" 6 | }, 7 | "assets": ["src/assets"] 8 | } 9 | -------------------------------------------------------------------------------- /packages/core/src/lib/components/identicon/identicon.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /lerna.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.0.29", 3 | "packages": [ 4 | "packages/*" 5 | ], 6 | "command": { 7 | "publish": { 8 | "ignoreChanges": [ 9 | "*.sh", 10 | "*.md" 11 | ] 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/vib.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/lib/types/ui/UIAction.ts: -------------------------------------------------------------------------------- 1 | export enum UIActionStatus { 2 | PENDING = 'pending', 3 | HANDLED = 'handled' 4 | } 5 | 6 | export interface UIAction { 7 | id: string 8 | value: T 9 | status: UIActionStatus 10 | } 11 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/mtl.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/salt.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | extends: '../../.eslintrc.js', 3 | parserOptions: { 4 | project: ['./tsconfig.lib.json', './tsconfig.lib.prod.json', './tsconfig.spec.json'], 5 | sourceType: 'module', 6 | tsconfigRootDir: __dirname 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /packages/core/src/assets/i18n-common/de.json: -------------------------------------------------------------------------------- 1 | { 2 | "from-to.type_label": "Transaktionstyp", 3 | "from-to.amount_label": "Betrag", 4 | "from-to.fee_label": "Gebühr", 5 | "from-to.time_label": "Zeit", 6 | "from-to.from_label": "Von", 7 | "from-to.to_label": "Zu" 8 | } 9 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/bat.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/storm.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/ngrx/.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | extends: '../../.eslintrc.js', 3 | parserOptions: { 4 | project: ['./tsconfig.lib.json', './tsconfig.lib.prod.json', './tsconfig.spec.json'], 5 | sourceType: 'module', 6 | tsconfigRootDir: __dirname 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | # 2 | .history 3 | .dockerignore 4 | .DS_Store 5 | .gitignore 6 | .nyc_output 7 | .prettierignore 8 | .prettierrc 9 | coverage 10 | dist 11 | node_modules 12 | 13 | Dockerfile 14 | 15 | .editorconfig 16 | .eslintignore 17 | 18 | *.sh 19 | 20 | *.png 21 | *.svg -------------------------------------------------------------------------------- /packages/core/src/lib/types/ExternalAliasResolver.ts: -------------------------------------------------------------------------------- 1 | export interface ExternalAliasResolver { 2 | validateReceiver(receiver: string): Promise 3 | resolveAlias(alias: string): Promise 4 | getAlias(address: string): Promise 5 | } 6 | -------------------------------------------------------------------------------- /packages/core/test/utils/unit-test-helper.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable @typescript-eslint/no-explicit-any */ 2 | export const newSpy: (name: string, returnValue: any) => jasmine.Spy = (name: string, returnValue: any): jasmine.Spy => 3 | jasmine.createSpy(name).and.returnValue(returnValue) 4 | -------------------------------------------------------------------------------- /packages/ngrx/test/utils/unit-test-helper.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable @typescript-eslint/no-explicit-any */ 2 | export const newSpy: (name: string, returnValue: any) => jasmine.Spy = (name: string, returnValue: any): jasmine.Spy => 3 | jasmine.createSpy(name).and.returnValue(returnValue) 4 | -------------------------------------------------------------------------------- /packages/core/src/lib/types/ui/UIResource.ts: -------------------------------------------------------------------------------- 1 | export enum UIResourceStatus { 2 | IDLE = 'idle', 3 | SUCCESS = 'success', 4 | ERROR = 'error', 5 | LOADING = 'loading' 6 | } 7 | 8 | export interface UIResource { 9 | value: T | undefined 10 | status: UIResourceStatus 11 | } 12 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/lrc.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/lib/pipes/wallet-filter/wallet-filter.pipe.spec.ts: -------------------------------------------------------------------------------- 1 | import { WalletFilterPipe } from './wallet-filter.pipe' 2 | 3 | describe('WalletFilterPipe', () => { 4 | it('create an instance', () => { 5 | const pipe = new WalletFilterPipe() 6 | expect(pipe).toBeTruthy() 7 | }) 8 | }) 9 | -------------------------------------------------------------------------------- /packages/core/src/lib/utils/protocol/protocol-identifier.ts: -------------------------------------------------------------------------------- 1 | import { ProtocolSymbols, MainProtocolSymbols } from '@airgap/coinlib-core' 2 | 3 | export function getMainIdentifier(subIdentifier: ProtocolSymbols): MainProtocolSymbols { 4 | return subIdentifier.split('-')[0] as MainProtocolSymbols 5 | } 6 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/dgd.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/tsconfig.lib.prod.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "./tsconfig.lib.json", 4 | "compilerOptions": { 5 | "declarationMap": false 6 | }, 7 | "angularCompilerOptions": { 8 | "enableIvy": false 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /packages/ngrx/tsconfig.lib.prod.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "./tsconfig.lib.json", 4 | "compilerOptions": { 5 | "declarationMap": false 6 | }, 7 | "angularCompilerOptions": { 8 | "enableIvy": false 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/mod.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/lib/components/account-item/account-item.component.scss: -------------------------------------------------------------------------------- 1 | airgap-currency-symbol { 2 | position: absolute; 3 | left: 24px; 4 | top: 32px; 5 | height: 24px; 6 | width: 24px; 7 | } 8 | 9 | airgap-identicon, 10 | airgap-identicon img { 11 | height: 40px; 12 | width: 40px; 13 | } 14 | -------------------------------------------------------------------------------- /packages/core/src/typings/download__blockies/index.d.ts: -------------------------------------------------------------------------------- 1 | declare module '@download/blockies' { 2 | export function createIcon(opts: { 3 | seed?: string 4 | color?: string 5 | bgcolor?: string 6 | spotcolor?: string 7 | size?: number 8 | scale?: number 9 | }): HTMLCanvasElement 10 | } 11 | -------------------------------------------------------------------------------- /packages/ngrx/src/public-api.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Public API Surface of ngrx 3 | */ 4 | 5 | // NgRx module 6 | export * from './lib/airgap-angular-ngrx.module' 7 | 8 | // Base 9 | export * from './lib/base/base-ngrx.facade' 10 | 11 | // Components 12 | export * from './lib/components/currency-symbol/currency-symbol.facade' 13 | -------------------------------------------------------------------------------- /packages/core/src/lib/utils/not-initialized.ts: -------------------------------------------------------------------------------- 1 | export function createNotInitialized(name: string, details?: string): () => never { 2 | return () => { 3 | const error: string = [`${name} not initialized yet.`, details].filter((part: string | undefined) => part !== undefined).join(' ') 4 | throw new Error(error) 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/r.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/mkr.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/icn.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/drgn.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/lib/components/titled-text/titled-text.component.html: -------------------------------------------------------------------------------- 1 | {{ title | translate }} 2 |
3 | 4 | {{ text | translate }} 5 | 6 |
7 | -------------------------------------------------------------------------------- /packages/ngrx/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "../../tsconfig.json", 4 | "compilerOptions": { 5 | "outDir": "../../out-tsc/spec", 6 | "types": ["jasmine"] 7 | }, 8 | "files": ["test/test.ts"], 9 | "include": ["**/*.spec.ts", "**/*.d.ts"] 10 | } 11 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/nio.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/xchf.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/ngrx/src/lib/components/currency-symbol/currency-symbol.types.ts: -------------------------------------------------------------------------------- 1 | import { SymbolInput, SymbolType } from '@airgap/angular-core' 2 | 3 | export interface CurrencySymbolState { 4 | src: string 5 | fallbackType?: SymbolType 6 | 7 | input: SymbolInput | undefined 8 | fallbackInput: SymbolInput | undefined 9 | inputs: SymbolInput[] 10 | } 11 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/cred.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/lib/components/network-badge/network-badge.component.html: -------------------------------------------------------------------------------- 1 | 2 | {{ network.name }} 3 | {{ network.rpcUrl }} 4 | 5 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/lend.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/lib/components/titled-address/titled-address.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: block; 3 | } 4 | 5 | ion-avatar { 6 | width: 48px; 7 | height: 48px; 8 | airgap-identicon { 9 | width: 48px; 10 | height: 48px; 11 | } 12 | } 13 | 14 | .symbol--icon { 15 | position: absolute; 16 | height: 24px; 17 | width: 24px; 18 | right: 24px; 19 | top: 32px; 20 | } 21 | -------------------------------------------------------------------------------- /packages/core/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "../../tsconfig.json", 4 | "compilerOptions": { 5 | "outDir": "../../out-tsc/spec", 6 | "types": ["jasmine", "node"], 7 | "strict": false 8 | }, 9 | "files": ["test/test.ts"], 10 | "include": ["**/*.spec.ts", "**/*.d.ts", "test/**/*.ts"] 11 | } 12 | -------------------------------------------------------------------------------- /packages/core/src/lib/capacitor-plugins/definitions.ts: -------------------------------------------------------------------------------- 1 | import { registerPlugin } from '@capacitor/core' 2 | 3 | export type AndroidFlavor = 'playstore' | 'fdroid' 4 | 5 | export interface AppInfoPlugin { 6 | get(): Promise<{ appName: string; packageName: string; versionName: string; versionCode: number; productFlavor?: AndroidFlavor }> 7 | } 8 | 9 | export const AppInfo: AppInfoPlugin = registerPlugin('AppInfo') -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/lpt.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/tnt.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/lib/config/app-config.ts: -------------------------------------------------------------------------------- 1 | import { InjectionToken } from '@angular/core' 2 | 3 | export interface AppConfig { 4 | app: { 5 | name: string 6 | urlScheme: string 7 | universalLink: string 8 | } 9 | otherApp: { 10 | name: string 11 | urlScheme: string 12 | universalLink: string 13 | } 14 | } 15 | 16 | export const APP_CONFIG = new InjectionToken('AppConfig') 17 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/icx.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/eos.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/ngrx/src/lib/airgap-angular-ngrx.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core' 2 | import { StoreModule } from '@ngrx/store' 3 | import { ComponentsModule } from './components/components.module' 4 | 5 | @NgModule({ 6 | declarations: [], 7 | imports: [ 8 | StoreModule.forFeature('shared', {}), 9 | ComponentsModule 10 | ], 11 | exports: [ComponentsModule] 12 | }) 13 | export class AirGapAngularNgRxModule {} 14 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # EditorConfig helps developers define and maintain consistent coding styles between different editors and IDEs 2 | # editorconfig.org 3 | 4 | root = true 5 | 6 | [*] 7 | indent_style = space 8 | indent_size = 2 9 | 10 | # We recommend you to keep these unchanged 11 | end_of_line = lf 12 | charset = utf-8 13 | trim_trailing_whitespace = true 14 | insert_final_newline = true 15 | 16 | [*.md] 17 | trim_trailing_whitespace = false -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/bnt.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/tbx.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/lib/components/identicon/identicon.component.scss: -------------------------------------------------------------------------------- 1 | .identicon { 2 | overflow: hidden; 3 | box-shadow: inset #ffffff33 0 2px 2px, inset rgba(0, 0, 0, 0.3) 0 -1px 8px; 4 | } 5 | 6 | .identicon--placeholder { 7 | background-size: contain; 8 | } 9 | 10 | .identicon, 11 | .identicon--placeholder { 12 | border-radius: 50%; 13 | width: inherit; 14 | height: inherit; 15 | min-width: 40px; 16 | min-height: 40px; 17 | } 18 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/theta.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/ngrx/tsconfig.lib.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "../../tsconfig.json", 4 | "compilerOptions": { 5 | "baseUrl": "./", 6 | "declarationMap": true, 7 | "outDir": "./out-tsc/ngrx", 8 | "typeRoots": ["../../node_modules/@types", "node_modules/@types"] 9 | }, 10 | "include": ["src/**/*.ts"], 11 | "exclude": ["test/test.ts", "**/*.spec.ts"] 12 | } 13 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/utk.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/lib/components/account-item/account-item.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, Input } from '@angular/core' 2 | import { AirGapWallet } from '@airgap/coinlib-core' 3 | 4 | @Component({ 5 | selector: 'airgap-account-item', 6 | templateUrl: './account-item.component.html', 7 | styleUrls: ['./account-item.component.scss'] 8 | }) 9 | export class AccountItemComponent { 10 | @Input() 11 | public wallet: AirGapWallet | undefined 12 | } 13 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/auto.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/dock.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/wpr.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/lib/services/uri/uri.service.spec.ts: -------------------------------------------------------------------------------- 1 | import { TestBed } from '@angular/core/testing'; 2 | 3 | import { UriService } from './uri.service'; 4 | 5 | describe('UriService', () => { 6 | let service: UriService; 7 | 8 | beforeEach(() => { 9 | TestBed.configureTestingModule({}); 10 | service = TestBed.inject(UriService); 11 | }); 12 | 13 | it('should be created', () => { 14 | expect(service).toBeTruthy(); 15 | }); 16 | }); 17 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/tkn.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/lib/services/token/token.service.spec.ts: -------------------------------------------------------------------------------- 1 | import { TestBed } from '@angular/core/testing' 2 | 3 | import { TokenService } from './token.service' 4 | 5 | describe('TokenService', () => { 6 | let service: TokenService 7 | 8 | beforeEach(() => { 9 | TestBed.configureTestingModule({}) 10 | service = TestBed.inject(TokenService) 11 | }) 12 | 13 | it('should be created', () => { 14 | expect(service).toBeTruthy() 15 | }) 16 | }) 17 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/xpa.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/lib/services/image/image.service.spec.ts: -------------------------------------------------------------------------------- 1 | import { TestBed } from '@angular/core/testing'; 2 | 3 | import { ImageService } from './image.service'; 4 | 5 | describe('ImageService', () => { 6 | let service: ImageService; 7 | 8 | beforeEach(() => { 9 | TestBed.configureTestingModule({}); 10 | service = TestBed.inject(ImageService); 11 | }); 12 | 13 | it('should be created', () => { 14 | expect(service).toBeTruthy(); 15 | }); 16 | }); 17 | -------------------------------------------------------------------------------- /packages/core/src/lib/services/address/address.service.spec.ts: -------------------------------------------------------------------------------- 1 | import { TestBed } from '@angular/core/testing' 2 | 3 | import { AddressService } from './address.service' 4 | 5 | describe('ContactsService', () => { 6 | let service: AddressService 7 | 8 | beforeEach(() => { 9 | TestBed.configureTestingModule({}) 10 | service = TestBed.inject(AddressService) 11 | }) 12 | 13 | it('should be created', () => { 14 | expect(service).toBeTruthy() 15 | }) 16 | }) 17 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/wings.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/zil.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/nuls.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/lib/components/from-to/from-to.component.scss: -------------------------------------------------------------------------------- 1 | .from-to-line { 2 | border-left: 1px solid var(--ion-color-dark); 3 | height: 96px; 4 | } 5 | 6 | .rawdata--container { 7 | pre { 8 | background-color: var(--ion-color-grayLight); 9 | padding: 8px; 10 | } 11 | margin-bottom: 48px; 12 | } 13 | 14 | // .rawdata--container.ios { 15 | // margin-bottom: 48px; 16 | // } 17 | 18 | // .rawdata--container.md { 19 | // margin-bottom: var(--margin-bottom); 20 | // } 21 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/adx.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/neu.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/snt.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/gup.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/lib/services/transaction/transaction.service.spec.ts: -------------------------------------------------------------------------------- 1 | import { TestBed } from '@angular/core/testing' 2 | 3 | import { TransactionService } from './transaction.service' 4 | 5 | describe('TransactionService', () => { 6 | let service: TransactionService 7 | 8 | beforeEach(() => { 9 | TestBed.configureTestingModule({}) 10 | service = TestBed.inject(TransactionService) 11 | }) 12 | 13 | it('should be created', () => { 14 | expect(service).toBeTruthy() 15 | }) 16 | }) 17 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/bnb.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/ppt.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/lib/components/network-badge/network-badge.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, Input } from '@angular/core' 2 | import { ProtocolNetwork, NetworkType } from '@airgap/coinlib-core' 3 | 4 | @Component({ 5 | selector: 'airgap-network-badge', 6 | templateUrl: './network-badge.component.html', 7 | styleUrls: ['./network-badge.component.scss'] 8 | }) 9 | export class NetworkBadgeComponent { 10 | @Input() 11 | public network: ProtocolNetwork | undefined 12 | 13 | public networkType: typeof NetworkType = NetworkType 14 | } 15 | -------------------------------------------------------------------------------- /packages/core/src/lib/pipes/pipes.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core' 2 | import { AmountConverterPipe } from './amount-converter/amount-converter.pipe' 3 | import { FeeConverterPipe } from './fee-converter/fee-converter.pipe' 4 | import { WalletFilterPipe } from './wallet-filter/wallet-filter.pipe' 5 | 6 | @NgModule({ 7 | declarations: [AmountConverterPipe, FeeConverterPipe, WalletFilterPipe], 8 | imports: [], 9 | exports: [AmountConverterPipe, FeeConverterPipe, WalletFilterPipe] 10 | }) 11 | export class PipesModule {} 12 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/eth.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/fuel.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/gbx.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/iost.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/wax.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/req.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/ong.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/cvc.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/rdn.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/cnd.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/ht.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/taas.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/lib/components/titled-text/titled-text.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, Input } from '@angular/core' 2 | 3 | @Component({ 4 | selector: 'airgap-titled-text', 5 | templateUrl: './titled-text.component.html', 6 | styleUrls: ['./titled-text.component.scss'] 7 | }) 8 | export class TitledTextComponent { 9 | @Input() 10 | public title: string | undefined | null 11 | 12 | @Input() 13 | public text: string | undefined | null 14 | 15 | @Input() 16 | public selectable: boolean = false 17 | 18 | @Input() 19 | public capitalize: boolean = false 20 | } 21 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/gsc.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/gvt.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/cob.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/dlt.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/tsconfig.lib.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "../../tsconfig.json", 4 | "compilerOptions": { 5 | "baseUrl": "./", 6 | "declarationMap": true, 7 | "outDir": "./out-tsc/core", 8 | "typeRoots": ["../../node_modules/@types", "node_modules/@types", "src/typings"], 9 | "paths": { 10 | "rxjs": ["../../node_modules/rxjs"], 11 | "rxjs/*": ["../../node_modules/rxjs/*"] 12 | } 13 | }, 14 | "include": ["src/**/*.ts"], 15 | "exclude": ["src/test.ts", "**/*.spec.ts", "src/typings"] 16 | } 17 | -------------------------------------------------------------------------------- /packages/ngrx/src/lib/components/components.module.ts: -------------------------------------------------------------------------------- 1 | import { CommonModule } from '@angular/common' 2 | import { NgModule } from '@angular/core' 3 | import { IonicModule } from '@ionic/angular' 4 | import { TranslateModule } from '@ngx-translate/core' 5 | import { MomentModule } from 'ngx-moment' 6 | 7 | import { QRCodeModule } from 'angularx-qrcode' 8 | import { FormsModule } from '@angular/forms' 9 | 10 | @NgModule({ 11 | declarations: [], 12 | imports: [CommonModule, IonicModule, TranslateModule, MomentModule, QRCodeModule, FormsModule], 13 | exports: [] 14 | }) 15 | export class ComponentsModule {} 16 | -------------------------------------------------------------------------------- /npm-ci-publish.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | echo "//registry.npmjs.org/:_authToken=$NPM_AUTH_TOKEN" > .npmrc 3 | 4 | git update-index --assume-unchanged npm-ci-publish.sh 5 | git update-index --assume-unchanged npm-ci-publish-beta-only.sh 6 | 7 | git --no-pager diff 8 | 9 | VERSION=$(node -pe 'JSON.parse(process.argv[1]).version.indexOf("beta")' "$(cat lerna.json)") 10 | 11 | if [ "$VERSION" = "-1" ] 12 | then 13 | npx lerna publish from-package --contents dist --yes 14 | else 15 | echo "version is beta, using --dist-tag next" 16 | npx lerna publish from-package --contents dist --dist-tag next --yes 17 | fi 18 | 19 | rm .npmrc -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/atm.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/edo.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/mth.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/dcn.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/pax.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/lib/components/qr-settings/qr-settings.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core' 2 | import { SerializerService } from '../../services/serializer/serializer.service' 3 | 4 | @Component({ 5 | selector: 'airgap-qr-settings', 6 | templateUrl: './qr-settings.component.html', 7 | styleUrls: ['./qr-settings.component.scss'] 8 | }) 9 | export class QrSettingsComponent { 10 | constructor(public readonly serializerService: SerializerService) {} 11 | 12 | public resetSettings(): void { 13 | // eslint-disable-next-line no-console 14 | this.serializerService.resetSettings().catch(console.error) 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /packages/core/src/lib/services/language/language.service.spec.ts: -------------------------------------------------------------------------------- 1 | import { TestBed } from '@angular/core/testing' 2 | import { TestBedUtils } from '../../../../test/utils/test-bed' 3 | 4 | import { LanguageService } from './language.service' 5 | 6 | describe('LanguageService', () => { 7 | let service: LanguageService 8 | 9 | let testBedUtils: TestBedUtils 10 | 11 | beforeEach(() => { 12 | testBedUtils = new TestBedUtils() 13 | TestBed.configureTestingModule(testBedUtils.moduleDef({})) 14 | service = TestBed.inject(LanguageService) 15 | }) 16 | 17 | it('should be created', () => { 18 | expect(service).toBeTruthy() 19 | }) 20 | }) 21 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/usdt.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/lib/services/qr-scanner/qr-scanner.service.spec.ts: -------------------------------------------------------------------------------- 1 | import { TestBed } from '@angular/core/testing' 2 | import { TestBedUtils } from '../../../../test/utils/test-bed' 3 | 4 | import { QrScannerService } from './qr-scanner.service' 5 | 6 | describe('QrScannerService', () => { 7 | let service: QrScannerService 8 | 9 | let testBedUtils: TestBedUtils 10 | 11 | beforeEach(() => { 12 | testBedUtils = new TestBedUtils() 13 | TestBed.configureTestingModule(testBedUtils.moduleDef({})) 14 | service = TestBed.inject(QrScannerService) 15 | }) 16 | 17 | it('should be created', () => { 18 | expect(service).toBeTruthy() 19 | }) 20 | }) 21 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/ctr.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/elix.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/nexo.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/lib/services/storage/storage.service.spec.ts: -------------------------------------------------------------------------------- 1 | import { TestBed } from '@angular/core/testing' 2 | import { TestBedUtils } from '../../../../test/utils/test-bed' 3 | 4 | import { InternalStorageService } from './storage.service' 5 | 6 | describe('InternalStorageService', () => { 7 | let service: InternalStorageService 8 | 9 | let testBedUtils: TestBedUtils 10 | 11 | beforeEach(() => { 12 | testBedUtils = new TestBedUtils() 13 | TestBed.configureTestingModule(testBedUtils.moduleDef({})) 14 | service = TestBed.inject(InternalStorageService) 15 | }) 16 | 17 | it('should be created', () => { 18 | expect(service).toBeTruthy() 19 | }) 20 | }) 21 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/bcpt.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/gusd.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/poly.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/btm.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/pay.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/lib/components/titled-address/titled-address.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/dtr.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/ngc.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/tel.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Specifies intentionally untracked files to ignore when using Git 2 | # http://git-scm.com/docs/gitignore 3 | 4 | extension 5 | 6 | *~ 7 | *.sw[mnpcod] 8 | *.log 9 | *.tmp 10 | *.tmp.* 11 | log.txt 12 | *.sublime-project 13 | *.sublime-workspace 14 | .vscode/ 15 | npm-debug.log* 16 | 17 | .idea/ 18 | .gradle/ 19 | .sourcemaps/ 20 | .sass-cache/ 21 | .tmp/ 22 | .versions/ 23 | coverage/ 24 | dist/ 25 | node_modules/ 26 | tmp/ 27 | temp/ 28 | platforms/ 29 | plugins/ 30 | plugins/android.json 31 | plugins/ios.json 32 | www/ 33 | $RECYCLE.BIN/ 34 | e2e-reports/* 35 | 36 | .DS_Store 37 | Thumbs.db 38 | UserInterfaceState.xcuserstate 39 | 40 | .env 41 | 42 | screenshots/ 43 | reports/ 44 | 45 | .npmrc -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/npxs.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/mco.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/cdt.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/qsp.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/lib/components/titled-address/titled-address.component.ts: -------------------------------------------------------------------------------- 1 | import { ProtocolSymbols } from '@airgap/coinlib-core' 2 | import { Component, Input } from '@angular/core' 3 | 4 | @Component({ 5 | selector: 'airgap-titled-address', 6 | templateUrl: './titled-address.component.html', 7 | styleUrls: ['./titled-address.component.scss'] 8 | }) 9 | export class TitledAddressComponent { 10 | @Input() 11 | public title: string | undefined 12 | 13 | @Input() 14 | public address: string | undefined 15 | 16 | @Input() 17 | public symbol: string | undefined 18 | 19 | @Input() 20 | public protocolIdentifier: ProtocolSymbols | undefined 21 | 22 | @Input() 23 | public hasSymbol: boolean = false 24 | } 25 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/plr.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/sphtx.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/lib/components/account-item/account-item.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |

9 | {{ wallet.protocol.name }} 10 | {{ wallet.protocol.symbol }} 11 |

12 |

{{ wallet.receivingPublicAddress }}

13 |
14 |
15 |
16 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/ksm.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/lib/components/iac-qr/iac-qr.component.html: -------------------------------------------------------------------------------- 1 | 10 | 11 |

{{ qrError }}

12 | 13 | 14 | 15 | 16 | {{ availableQRType }} 17 | 18 | 19 | 20 | 21 |

{{ numberOfParts }} QR codes

22 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/plenty.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/jnt.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/sngls.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/mda.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/brd.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/fsn.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/lib/services/serializer/serializer.service.spec.ts: -------------------------------------------------------------------------------- 1 | import { TestBed } from '@angular/core/testing' 2 | import { Storage } from '@ionic/storage' 3 | import { StorageMock } from '../../../../test/utils/storage-mock' 4 | import { TestBedUtils } from '../../../../test/utils/test-bed' 5 | 6 | import { SerializerService } from './serializer.service' 7 | 8 | describe('SerializerService', () => { 9 | let service: SerializerService 10 | let testBedUtils: TestBedUtils 11 | 12 | beforeEach(() => { 13 | testBedUtils = new TestBedUtils() 14 | 15 | TestBed.configureTestingModule(testBedUtils.moduleDef({ providers: [{ provide: Storage, useValue: StorageMock }] })) 16 | service = TestBed.inject(SerializerService) 17 | }) 18 | 19 | it('should be created', () => { 20 | expect(service).toBeTruthy() 21 | }) 22 | }) 23 | -------------------------------------------------------------------------------- /packages/core/src/lib/services/iac/qr-generator.ts: -------------------------------------------------------------------------------- 1 | import { IACMessageDefinitionObjectV3 } from '@airgap/coinlib-core' 2 | import { serializedDataToUrlString } from '../../utils/utils' 3 | 4 | export abstract class IACQrGenerator { 5 | abstract create(data: IACMessageDefinitionObjectV3[], multiFragmentLength?: number, singleFragmentLength?: number): Promise 6 | abstract nextPart(): Promise // handle complete 7 | abstract getSingle(prefix: string): Promise 8 | abstract getNumberOfParts(): Promise 9 | 10 | protected async prefixSingle(data: string, prefix: string, parameter: string): Promise { 11 | return serializedDataToUrlString(data, `${prefix}://`, parameter) 12 | } 13 | 14 | public static async canHandle(_data: IACMessageDefinitionObjectV3[]): Promise { 15 | return true 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/ftc.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gitlab/issue_templates/Epic.md: -------------------------------------------------------------------------------- 1 | 9 | 10 | ## Summary 11 | 12 | 13 | 14 | 15 | ## Which issues need to be completed 16 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | /label ~2141 ~"proj::airgap" 27 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/ctxc.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/abt.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/oax.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/loom.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/lib/services/permissions/permissions.service.spec.ts: -------------------------------------------------------------------------------- 1 | import { TestBed } from '@angular/core/testing' 2 | import { Diagnostic } from '@ionic-native/diagnostic/ngx' 3 | import { TestBedUtils } from '../../../../test/utils/test-bed' 4 | 5 | import { PermissionsPluginMock } from '../../../../test/utils/plugins-mock' 6 | import { PermissionsService } from './permissions.service' 7 | 8 | describe('PermissionsService', () => { 9 | let service: PermissionsService 10 | 11 | let testBedUtils: TestBedUtils 12 | 13 | beforeEach(() => { 14 | testBedUtils = new TestBedUtils() 15 | 16 | TestBed.configureTestingModule( 17 | testBedUtils.moduleDef({ 18 | providers: [Diagnostic] 19 | }) 20 | ) 21 | service = TestBed.inject(PermissionsService) 22 | }) 23 | 24 | it('should be created', () => { 25 | expect(service).toBeTruthy() 26 | }) 27 | }) 28 | -------------------------------------------------------------------------------- /packages/core/test/test.ts: -------------------------------------------------------------------------------- 1 | // This file is required by karma.conf.js and loads recursively all the .spec and framework files 2 | 3 | import 'zone.js/dist/zone' 4 | import 'zone.js/dist/zone-testing' 5 | import { getTestBed } from '@angular/core/testing' 6 | import { BrowserDynamicTestingModule, platformBrowserDynamicTesting } from '@angular/platform-browser-dynamic/testing' 7 | 8 | declare const require: { 9 | context( 10 | path: string, 11 | deep?: boolean, 12 | filter?: RegExp 13 | ): { 14 | keys(): string[] 15 | (id: string): T 16 | } 17 | } 18 | 19 | // First, initialize the Angular testing environment. 20 | getTestBed().initTestEnvironment(BrowserDynamicTestingModule, platformBrowserDynamicTesting()) 21 | // Then we find all the tests. 22 | const context = require.context('../', true, /\.spec\.ts$/) 23 | // And load the modules. 24 | context.keys().map(context) 25 | -------------------------------------------------------------------------------- /packages/core/src/lib/utils/airgap-transaction.ts: -------------------------------------------------------------------------------- 1 | import { IAirGapTransaction } from '@airgap/coinlib-core' 2 | import BigNumber from 'bignumber.js' 3 | 4 | import { flattened } from './array' 5 | 6 | export function flattenAirGapTxAddresses(airGapTxs: IAirGapTransaction[], field: keyof Pick): string[] { 7 | return flattened(airGapTxs.map((tx: IAirGapTransaction) => tx[field])) 8 | } 9 | 10 | export function sumAirGapTxValues(airGapTxs: IAirGapTransaction[], field: keyof Pick): string { 11 | return airGapTxs 12 | .reduce((sum: BigNumber, next: IAirGapTransaction) => { 13 | let nextValue: BigNumber = new BigNumber(next[field]) 14 | if (nextValue.isNaN()) { 15 | nextValue = new BigNumber(0) 16 | } 17 | 18 | return sum.plus(nextValue) 19 | }, new BigNumber(0)) 20 | .toFixed() 21 | } 22 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/veri.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/evx.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/ary.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/tau.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/ngrx/test/test.ts: -------------------------------------------------------------------------------- 1 | // // This file is required by karma.conf.js and loads recursively all the .spec and framework files 2 | 3 | // import 'zone.js/dist/zone' 4 | // import 'zone.js/dist/zone-testing' 5 | // import { getTestBed } from '@angular/core/testing' 6 | // import { BrowserDynamicTestingModule, platformBrowserDynamicTesting } from '@angular/platform-browser-dynamic/testing' 7 | 8 | // declare const require: { 9 | // context( 10 | // path: string, 11 | // deep?: boolean, 12 | // filter?: RegExp 13 | // ): { 14 | // keys(): string[] 15 | // (id: string): T 16 | // } 17 | // } 18 | 19 | // // First, initialize the Angular testing environment. 20 | // getTestBed().initTestEnvironment(BrowserDynamicTestingModule, platformBrowserDynamicTesting()) 21 | // // Then we find all the tests. 22 | // const context = require.context('./', true, /\.spec\.ts$/) 23 | // // And load the modules. 24 | // context.keys().map(context) 25 | -------------------------------------------------------------------------------- /packages/core/src/lib/components/identicon/identicon.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing' 2 | 3 | import { TestBedUtils } from '../../../../test/utils/test-bed' 4 | import { IdenticonComponent } from './identicon.component' 5 | 6 | describe('IdenticonComponent', () => { 7 | let component: IdenticonComponent 8 | let fixture: ComponentFixture 9 | 10 | let testBedUtils: TestBedUtils 11 | 12 | beforeEach( 13 | waitForAsync(async () => { 14 | testBedUtils = new TestBedUtils() 15 | await TestBed.configureTestingModule(testBedUtils.moduleDef({})).compileComponents() 16 | }) 17 | ) 18 | 19 | beforeEach(() => { 20 | fixture = TestBed.createComponent(IdenticonComponent) 21 | component = fixture.componentInstance 22 | fixture.detectChanges() 23 | }) 24 | 25 | it('should create', () => { 26 | expect(component).toBeTruthy() 27 | }) 28 | }) 29 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/appc.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/btc.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/dat.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/omg.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/lib/components/titled-text/titled-text.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing' 2 | 3 | import { TestBedUtils } from '../../../../test/utils/test-bed' 4 | import { TitledTextComponent } from './titled-text.component' 5 | 6 | describe('TitledTextComponent', () => { 7 | let component: TitledTextComponent 8 | let fixture: ComponentFixture 9 | 10 | let testBedUtils: TestBedUtils 11 | 12 | beforeEach( 13 | waitForAsync(async () => { 14 | testBedUtils = new TestBedUtils() 15 | await TestBed.configureTestingModule(testBedUtils.moduleDef({})).compileComponents() 16 | }) 17 | ) 18 | 19 | beforeEach(() => { 20 | fixture = TestBed.createComponent(TitledTextComponent) 21 | component = fixture.componentInstance 22 | fixture.detectChanges() 23 | }) 24 | 25 | it('should create', () => { 26 | expect(component).toBeTruthy() 27 | }) 28 | }) 29 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/enj.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/poe.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/tomo.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/lib/services/image/fetcher/image-direct.fetcher.ts: -------------------------------------------------------------------------------- 1 | import { RawData } from '@airgap/coinlib-core/utils/remote-data/RemoteData' 2 | import { RemoteDataFactory } from '@airgap/coinlib-core/utils/remote-data/RemoteDataFactory' 3 | import { UriService } from '../../uri/uri.service' 4 | import { ImageFetcher } from '../image.service' 5 | 6 | export class ImageDirectFetcher implements ImageFetcher { 7 | private readonly remoteDataFactory: RemoteDataFactory 8 | 9 | constructor(private readonly uriService: UriService) { 10 | this.remoteDataFactory = new RemoteDataFactory() 11 | } 12 | 13 | public async fetch(uri: string): Promise { 14 | const remoteData = this.remoteDataFactory.create(uri, {}) 15 | const rawData: RawData | undefined = await remoteData?.getRaw() 16 | if (!rawData) { 17 | return undefined 18 | } 19 | 20 | return this.uriService.data(rawData.bytes.toString('base64'), rawData.contentType, true) 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /packages/core/src/lib/utils/protocol/protocol-network-identifier.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable @typescript-eslint/unified-signatures */ 2 | import { ICoinProtocol, ProtocolNetwork, ProtocolSymbols } from '@airgap/coinlib-core' 3 | 4 | export function getProtocolAndNetworkIdentifier(protocol: ICoinProtocol): string 5 | export function getProtocolAndNetworkIdentifier(protocolIdentifier: ProtocolSymbols, network: ProtocolNetwork | string): string 6 | export function getProtocolAndNetworkIdentifier(protocol: ICoinProtocol | ProtocolSymbols, network?: ProtocolNetwork | string): string { 7 | const protocolIdentifier: string = typeof protocol === 'string' ? protocol : protocol.identifier 8 | const networkIdentifier: string | undefined = 9 | typeof protocol !== 'string' ? protocol.options.network.identifier : typeof network === 'string' ? network : network?.identifier 10 | 11 | return networkIdentifier !== undefined ? `${protocolIdentifier}:${networkIdentifier}` : protocolIdentifier 12 | } 13 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/tix.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/lib/components/network-badge/network-badge.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing' 2 | 3 | import { TestBedUtils } from '../../../../test/utils/test-bed' 4 | import { NetworkBadgeComponent } from './network-badge.component' 5 | 6 | describe('NetworkBadgeComponent', () => { 7 | let component: NetworkBadgeComponent 8 | let fixture: ComponentFixture 9 | 10 | let testBedUtils: TestBedUtils 11 | 12 | beforeEach( 13 | waitForAsync(async () => { 14 | testBedUtils = new TestBedUtils() 15 | await TestBed.configureTestingModule(testBedUtils.moduleDef({})).compileComponents() 16 | }) 17 | ) 18 | 19 | beforeEach(() => { 20 | fixture = TestBed.createComponent(NetworkBadgeComponent) 21 | component = fixture.componentInstance 22 | fixture.detectChanges() 23 | }) 24 | 25 | it('should create', () => { 26 | expect(component).toBeTruthy() 27 | }) 28 | }) 29 | -------------------------------------------------------------------------------- /packages/core/src/lib/components/qr/qr.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, Input } from '@angular/core' 2 | 3 | import { QRCodeErrorCorrectionLevel } from 'angularx-qrcode' 4 | import { ClipboardService } from '../../services/clipboard/clipboard.service' 5 | 6 | @Component({ 7 | selector: 'airgap-qr', 8 | templateUrl: './qr.component.html', 9 | styleUrls: ['./qr.component.scss'] 10 | }) 11 | export class QrComponent { 12 | @Input() 13 | public level: keyof typeof QRCodeErrorCorrectionLevel = 'L' 14 | 15 | @Input() 16 | public size: number = 300 17 | 18 | @Input() 19 | public margin: number = 1 20 | 21 | @Input() 22 | public qrdata: string = '' 23 | 24 | @Input() disableClipboard: boolean = false 25 | 26 | constructor(private readonly clipboardService: ClipboardService) {} 27 | 28 | public async copyToClipboard(): Promise { 29 | if (!this.disableClipboard) { 30 | await this.clipboardService.copyAndShowToast(this.qrdata) 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /packages/core/src/lib/components/titled-address/titled-address.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing' 2 | 3 | import { TestBedUtils } from '../../../../test/utils/test-bed' 4 | import { TitledAddressComponent } from './titled-address.component' 5 | 6 | describe('TitledAddressComponent', () => { 7 | let component: TitledAddressComponent 8 | let fixture: ComponentFixture 9 | 10 | let testBedUtils: TestBedUtils 11 | 12 | beforeEach( 13 | waitForAsync(async () => { 14 | testBedUtils = new TestBedUtils() 15 | await TestBed.configureTestingModule(testBedUtils.moduleDef({})).compileComponents() 16 | }) 17 | ) 18 | 19 | beforeEach(() => { 20 | fixture = TestBed.createComponent(TitledAddressComponent) 21 | component = fixture.componentInstance 22 | fixture.detectChanges() 23 | }) 24 | 25 | it('should create', () => { 26 | expect(component).toBeTruthy() 27 | }) 28 | }) 29 | -------------------------------------------------------------------------------- /packages/core/src/lib/services/protocol/utils/test.ts: -------------------------------------------------------------------------------- 1 | import { ICoinSubProtocol, ICoinProtocol, ProtocolSymbols } from '@airgap/coinlib-core' 2 | import { SubProtocolsMap } from '../store/sub/sub-protocol-store.service' 3 | 4 | export function getIdentifiers(protocols: ICoinProtocol[]): ProtocolSymbols[] { 5 | return protocols.map((protocol: ICoinProtocol) => protocol.identifier) 6 | } 7 | 8 | export function getSubIdentifiers(subProtocols: [ICoinProtocol, ICoinSubProtocol][] | SubProtocolsMap): ProtocolSymbols[] { 9 | return Array.isArray(subProtocols) 10 | ? subProtocols.map((pair: [ICoinProtocol, ICoinSubProtocol]) => pair[1].identifier) 11 | : (Object.values(subProtocols) 12 | .map((values) => Object.values(values).map((protocol: ICoinSubProtocol | undefined) => protocol?.identifier)) 13 | .reduce((flatten, toFlatten) => flatten.concat(toFlatten), []) 14 | .filter((identifier: ProtocolSymbols | undefined) => identifier !== undefined) as ProtocolSymbols[]) 15 | } 16 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/ppp.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/gno.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/gto.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/lib/components/account-selection/account-selection.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | {{ title }} 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |

16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /npm-ci-publish-beta-only.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | echo "//registry.npmjs.org/:_authToken=$NPM_AUTH_TOKEN" > .npmrc 3 | 4 | git update-index --assume-unchanged npm-ci-publish.sh 5 | git update-index --assume-unchanged npm-ci-publish-beta-only.sh 6 | 7 | git update-index --assume-unchanged package.json 8 | git update-index --assume-unchanged package-lock.json 9 | 10 | git update-index --assume-unchanged packages/core/package.json 11 | git update-index --assume-unchanged packages/core/package-lock.json 12 | 13 | git update-index --assume-unchanged packages/ngrx/package.json 14 | git update-index --assume-unchanged packages/ngrx/package-lock.json 15 | 16 | git --no-pager diff 17 | 18 | VERSION=$(node -pe 'JSON.parse(process.argv[1]).version.indexOf("beta")' "$(cat lerna.json)") 19 | 20 | if [ "$VERSION" = "-1" ] 21 | then 22 | echo "cannot publish non-beta version" 23 | else 24 | echo "version is beta, using --dist-tag next" 25 | npx lerna publish from-package --contents dist --dist-tag next --yes 26 | fi 27 | 28 | rm .npmrc 29 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/stq.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/test/utils/storage-mock.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ 2 | /* eslint-disable @typescript-eslint/no-explicit-any */ 3 | export class StorageMock { 4 | private readonly data: any = {} 5 | 6 | public create(): Promise { 7 | return Promise.resolve() 8 | } 9 | 10 | public defineDriver(): Promise { 11 | return Promise.resolve() 12 | } 13 | 14 | public get(key: string): Promise { 15 | return new Promise((resolve, _reject) => { 16 | resolve(this.data[key]) 17 | }) 18 | } 19 | 20 | public set(key: string, value: any): Promise { 21 | return new Promise((resolve, _reject) => { 22 | this.data[key] = value 23 | resolve() 24 | }) 25 | } 26 | 27 | public remove(key: string): Promise { 28 | return new Promise((resolve, _reject) => { 29 | delete this.data[key] 30 | resolve() 31 | }) 32 | } 33 | 34 | public ready(): Promise { 35 | return Promise.resolve() 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/dew.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/dnt.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/ae.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 9 | 10 | 11 | 13 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/ost.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/cs.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/lib/components/account-item/account-item.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing' 2 | 3 | import { TestBedUtils } from '../../../../test/utils/test-bed' 4 | import { AccountItemComponent } from './account-item.component' 5 | 6 | describe('AccountItemComponent', () => { 7 | let component: AccountItemComponent 8 | let fixture: ComponentFixture 9 | 10 | let testBedUtils: TestBedUtils 11 | 12 | beforeEach( 13 | waitForAsync(async () => { 14 | testBedUtils = new TestBedUtils() 15 | await TestBed.configureTestingModule( 16 | testBedUtils.moduleDef({ 17 | declarations: [] 18 | }) 19 | ).compileComponents() 20 | }) 21 | ) 22 | 23 | beforeEach(() => { 24 | fixture = TestBed.createComponent(AccountItemComponent) 25 | component = fixture.componentInstance 26 | fixture.detectChanges() 27 | }) 28 | 29 | it('should create', () => { 30 | expect(component).toBeTruthy() 31 | }) 32 | }) 33 | -------------------------------------------------------------------------------- /packages/core/test/utils/translate-mock.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable @typescript-eslint/no-explicit-any */ 2 | import { EventEmitter } from '@angular/core' 3 | import { Observable, of } from 'rxjs' 4 | 5 | interface TranslationObject { 6 | [key: string]: string 7 | } 8 | 9 | export class TranslateMock { 10 | public onLangChange: EventEmitter = new EventEmitter() 11 | public onTranslationChange: EventEmitter = new EventEmitter() 12 | public onDefaultLangChange: EventEmitter = new EventEmitter() 13 | 14 | private readonly data: TranslationObject = { 15 | source: 'translated' 16 | } 17 | 18 | public get(keys: string[] | string = []): Observable { 19 | const translated: TranslationObject = {} 20 | const newKeys = Array.isArray(keys) ? keys : [keys] 21 | 22 | // eslint-disable-next-line no-console 23 | console.log('translating keys', newKeys) 24 | 25 | newKeys.forEach((key) => { 26 | translated[key] = this.data[key] ?? key 27 | }) 28 | 29 | return of(translated) 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/data.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/sub.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/you.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/deez.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/lib/services/filesystem/filesystem.service.spec.ts: -------------------------------------------------------------------------------- 1 | import { TestBed } from '@angular/core/testing'; 2 | import { FilesystemPluginMock } from '../../../../test/utils/plugins-mock' 3 | import { TestBedUtils } from '../../../../test/utils/test-bed' 4 | import { FILESYSTEM_PLUGIN } from '../../capacitor-plugins/injection-tokens' 5 | 6 | import { FilesystemService } from './filesystem.service'; 7 | 8 | describe('FilesystemService', () => { 9 | let service: FilesystemService; 10 | let testBedUtils: TestBedUtils 11 | 12 | let filesystemPluginMock: FilesystemPluginMock 13 | 14 | beforeEach(() => { 15 | testBedUtils = new TestBedUtils() 16 | filesystemPluginMock = new FilesystemPluginMock() 17 | TestBed.configureTestingModule( 18 | testBedUtils.moduleDef({ 19 | providers: [{ provide: FILESYSTEM_PLUGIN, useValue: filesystemPluginMock }] 20 | }) 21 | ); 22 | service = TestBed.inject(FilesystemService); 23 | }); 24 | 25 | it('should be created', () => { 26 | expect(service).toBeTruthy(); 27 | }); 28 | }); 29 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/generic-coin.svg: -------------------------------------------------------------------------------- 1 | generic-coin -------------------------------------------------------------------------------- /packages/core/src/lib/components/account-selection/account-selection.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing' 2 | 3 | import { TestBedUtils } from '../../../../test/utils/test-bed' 4 | import { AccountSelectionComponent } from './account-selection.component' 5 | 6 | describe('AccountSelectionComponent', () => { 7 | let component: AccountSelectionComponent 8 | let fixture: ComponentFixture 9 | 10 | let testBedUtils: TestBedUtils 11 | 12 | beforeEach( 13 | waitForAsync(async () => { 14 | testBedUtils = new TestBedUtils() 15 | await TestBed.configureTestingModule( 16 | testBedUtils.moduleDef({ 17 | declarations: [] 18 | }) 19 | ).compileComponents() 20 | }) 21 | ) 22 | 23 | beforeEach(() => { 24 | fixture = TestBed.createComponent(AccountSelectionComponent) 25 | component = fixture.componentInstance 26 | fixture.detectChanges() 27 | }) 28 | 29 | it('should create', () => { 30 | expect(component).toBeTruthy() 31 | }) 32 | }) 33 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/usdc.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/bcbc.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/lib/components/qr-settings/qr-settings.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing' 2 | import { UrlSerializer } from '@angular/router' 3 | 4 | import { TestBedUtils } from '../../../../test/utils/test-bed' 5 | import { QrSettingsComponent } from './qr-settings.component' 6 | 7 | describe('QrSettingsComponent', () => { 8 | let component: QrSettingsComponent 9 | let fixture: ComponentFixture 10 | 11 | let testBedUtils: TestBedUtils 12 | 13 | beforeEach( 14 | waitForAsync(async () => { 15 | testBedUtils = new TestBedUtils() 16 | await TestBed.configureTestingModule( 17 | testBedUtils.moduleDef({ 18 | providers: [UrlSerializer] 19 | }) 20 | ).compileComponents() 21 | }) 22 | ) 23 | 24 | beforeEach(() => { 25 | fixture = TestBed.createComponent(QrSettingsComponent) 26 | component = fixture.componentInstance 27 | fixture.detectChanges() 28 | }) 29 | 30 | it('should create', () => { 31 | expect(component).toBeTruthy() 32 | }) 33 | }) 34 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compileOnSave": false, 3 | "compilerOptions": { 4 | "sourceMap": true, 5 | "declaration": true, 6 | "module": "es2020", 7 | "moduleResolution": "node", 8 | "emitDecoratorMetadata": true, 9 | "experimentalDecorators": true, 10 | "importHelpers": true, 11 | "downlevelIteration": true, // To enable [].entries() 12 | "target": "es5", 13 | "lib": ["es2018", "dom"], 14 | "skipLibCheck": true, 15 | /* Strict Type-Checking Options */ 16 | "strict": false /* Enable all strict type-checking options. */, 17 | "skipDefaultLibCheck": true 18 | }, 19 | "angularCompilerOptions": { 20 | "enableIvy": false, 21 | "strictInjectionParameters": true, 22 | "fullTemplateTypeCheck": true, 23 | "strictTemplates": true, 24 | "strictInputAccessModifiers": true, 25 | "strictMetadataEmit": false, 26 | }, 27 | "paths": { 28 | "core": ["packages/core/dist"], 29 | "ngrx": ["packages/ngrx/dist"], 30 | "@airgap/angular-core": ["packages/core/dist"], 31 | "@airgap/angular-ngrx": ["packages/ngrx/dist"] 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/aion.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/xtz.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /packages/core/src/lib/services/storage/base.storage.ts: -------------------------------------------------------------------------------- 1 | import { Storage } from '@ionic/storage' 2 | 3 | export class BaseStorage> { 4 | constructor( 5 | protected readonly storage: Storage, 6 | protected readonly defaultValues: { [key in SettingsKey]: SettingsKeyReturnType[key] } 7 | ) {} 8 | 9 | public async get(key: K): Promise { 10 | await this.storage.ready() 11 | const value: SettingsKeyReturnType[K] = (await this.storage.get(key)) || this.defaultValues[key] 12 | 13 | return value 14 | } 15 | 16 | public async set(key: K, value: SettingsKeyReturnType[K]): Promise { 17 | await this.storage.ready() 18 | 19 | return this.storage.set(key, value) 20 | } 21 | 22 | public async delete(key: K): Promise { 23 | try { 24 | await this.storage.ready() 25 | await this.storage.remove(key) 26 | 27 | return true 28 | } catch (error) { 29 | return false 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /.gitlab/issue_templates/Task.md: -------------------------------------------------------------------------------- 1 | 8 | 9 | ## Summary 10 | 11 | 12 | 13 | 14 | ## What steps need to be done? 15 | 16 | 17 | 18 | 19 | ## Relevant Mockups, Screenshots and/or links 20 | 21 | 22 | 23 | 24 | ## Additional information 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | /estimate 33 | 34 | 35 | 36 | 37 | /label ~"type::task" ~"proj::airgap" 38 | 39 | 40 | -------------------------------------------------------------------------------- /packages/core/src/lib/capacitor-plugins/injection-tokens.ts: -------------------------------------------------------------------------------- 1 | import { InjectionToken } from '@angular/core' 2 | import { AppPlugin } from '@capacitor/app' 3 | import { AppLauncherPlugin } from '@capacitor/app-launcher' 4 | import { ClipboardPlugin } from '@capacitor/clipboard' 5 | import { FilesystemPlugin } from '@capacitor/filesystem' 6 | import { SplashScreenPlugin } from '@capacitor/splash-screen' 7 | import { StatusBarPlugin } from '@capacitor/status-bar' 8 | 9 | import { AppInfoPlugin } from './definitions' 10 | 11 | export const APP_PLUGIN = new InjectionToken('AppPlugin') 12 | export const APP_INFO_PLUGIN = new InjectionToken('AppInfoPlugin') 13 | export const APP_LAUNCHER_PLUGIN = new InjectionToken('AppLauncherPlugin') 14 | export const CLIPBOARD_PLUGIN = new InjectionToken('ClipboardPlugin') 15 | export const FILESYSTEM_PLUGIN = new InjectionToken('FilesystemPlugin') 16 | export const SPLASH_SCREEN_PLUGIN = new InjectionToken('SplashScreenPlugin') 17 | export const STATUS_BAR_PLUGIN = new InjectionToken('StatusBarPlugin') 18 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/mcap.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/ast.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/lib/components/currency-symbol/currency-symbol.types.ts: -------------------------------------------------------------------------------- 1 | export interface SymbolInput { 2 | value: string 3 | caseSensitive: boolean 4 | } 5 | 6 | interface BaseSymbolType { 7 | kind: T 8 | } 9 | 10 | type BaseSymbolValue = BaseSymbolType 11 | 12 | export type DefaultSymbolType = BaseSymbolType<'default'> 13 | export type DefaultSymbolValue = BaseSymbolValue<'default'> & DefaultSymbolType 14 | 15 | export interface AssetSymbolType extends BaseSymbolType<'asset'> { 16 | symbolInput: SymbolInput 17 | extension: 'svg' | 'png' 18 | } 19 | export type AssetSymbolValue = BaseSymbolValue<'asset'> & AssetSymbolType 20 | 21 | export interface LazySymbolType extends BaseSymbolType<'lazy'> { 22 | symbolInput: SymbolInput 23 | } 24 | export interface LazySymbolValue extends BaseSymbolValue<'lazy'>, LazySymbolType { 25 | url?: string 26 | } 27 | 28 | export type SymbolType = DefaultSymbolType | AssetSymbolType | LazySymbolType 29 | export type SymbolValue = DefaultSymbolValue | AssetSymbolValue | LazySymbolValue 30 | 31 | export interface SymbolSrc { 32 | value: SymbolValue 33 | fallbackType?: SymbolType 34 | } 35 | -------------------------------------------------------------------------------- /packages/core/src/lib/utils/array.ts: -------------------------------------------------------------------------------- 1 | import { Either } from '../types/Either' 2 | 3 | export function duplicatesRemoved(array: T[]): T[] { 4 | return array.filter((item: T, index: number, arr: T[]) => arr.indexOf(item) === index) 5 | } 6 | 7 | export function partition(array: T[], isValid: (element: T) => boolean): [T[], T[]] { 8 | const pass: T[] = [] 9 | const fail: T[] = [] 10 | array.forEach((element: T) => { 11 | if (isValid(element)) { 12 | pass.push(element) 13 | } else { 14 | fail.push(element) 15 | } 16 | }) 17 | 18 | return [pass, fail] 19 | } 20 | 21 | export function flattened(array: T[][]): T[] { 22 | return array.reduce((output: T[], next: T[]) => output.concat(next), []) 23 | } 24 | 25 | export function merged(array: Either[]): [T[], R[]] { 26 | return array.reduce( 27 | (output: [T[], R[]], next: Either) => { 28 | const [t, r]: Either = next 29 | if (t !== undefined) { 30 | output[0].push(t) 31 | } 32 | 33 | if (r !== undefined) { 34 | output[1].push(r) 35 | } 36 | 37 | return output 38 | }, 39 | [[], []] 40 | ) 41 | } 42 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/dot.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/hodl.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/gnt.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/lib/components/from-to/from-to.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing' 2 | import { ClipboardMock } from '../../../../test/utils/plugins-mock' 3 | 4 | import { TestBedUtils } from '../../../../test/utils/test-bed' 5 | import { CLIPBOARD_PLUGIN } from '../../capacitor-plugins/injection-tokens' 6 | import { FromToComponent } from './from-to.component' 7 | 8 | describe('FromToComponent', () => { 9 | let component: FromToComponent 10 | let fixture: ComponentFixture 11 | 12 | let testBedUtils: TestBedUtils 13 | 14 | beforeEach( 15 | waitForAsync(async () => { 16 | testBedUtils = new TestBedUtils() 17 | await TestBed.configureTestingModule(testBedUtils.moduleDef({ 18 | providers: [{ provide: CLIPBOARD_PLUGIN, useValue: new ClipboardMock() }] 19 | })).compileComponents() 20 | }) 21 | ) 22 | 23 | beforeEach(() => { 24 | fixture = TestBed.createComponent(FromToComponent) 25 | component = fixture.componentInstance 26 | fixture.detectChanges() 27 | }) 28 | 29 | it('should create', () => { 30 | expect(component).toBeTruthy() 31 | }) 32 | }) 33 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/crpt.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/tusd.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/test/utils/ionic-mocks.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable max-classes-per-file */ 2 | export class AlertControllerMock { 3 | public create: jasmine.Spy = jasmine.createSpy('create').and.returnValue( 4 | Promise.resolve({ 5 | present: jasmine.createSpy('present').and.returnValue(Promise.resolve()), 6 | onDidDismiss: jasmine.createSpy('onDidDismiss').and.returnValue(Promise.resolve()) 7 | }) 8 | ) 9 | public dismiss: jasmine.Spy = jasmine.createSpy('dismiss').and.returnValue(Promise.resolve()) 10 | } 11 | 12 | export class LoadingControllerMock { 13 | public create: jasmine.Spy = jasmine.createSpy('create').and.returnValue( 14 | Promise.resolve({ 15 | present: jasmine.createSpy('present').and.returnValue(Promise.resolve()), 16 | onDidDismiss: jasmine.createSpy('dismiss').and.returnValue(Promise.resolve()) 17 | }) 18 | ) 19 | } 20 | 21 | export class ToastControllerMock { 22 | public create: jasmine.Spy = jasmine.createSpy('create').and.returnValue( 23 | Promise.resolve({ 24 | present: jasmine.createSpy('present').and.returnValue(Promise.resolve()), 25 | onDidDismiss: jasmine.createSpy('dismiss').and.returnValue(Promise.resolve()) 26 | }) 27 | ) 28 | } 29 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/san.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/lun.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/nas.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/rhoc.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/wtc.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/lib/services/iac/message-handler.ts: -------------------------------------------------------------------------------- 1 | export enum IACMessageTransport { 2 | QR_SCANNER = 'QR_SCANNER', 3 | DEEPLINK = 'DEEPLINK', 4 | PASTE = 'CLIPBOARD' 5 | } 6 | export enum IACHandlerStatus { 7 | SUCCESS = 0, 8 | PARTIAL = 1, 9 | UNSUPPORTED = 2 10 | } 11 | 12 | export interface IACContext { 13 | requestId?: string 14 | derivationPath?: string 15 | sourceFingerprint?: string 16 | } 17 | 18 | export interface IACMessageWrapper { 19 | result: T 20 | data: string 21 | // TODO: Instead of this, create an internal message for every protocol/message that can contain additional data, which is not in the serializer messages. 22 | context?: IACContext 23 | } 24 | 25 | export abstract class IACMessageHandler { 26 | abstract name: string 27 | 28 | abstract canHandle(data: string): Promise 29 | 30 | abstract receive(data: string): Promise // internally store 31 | 32 | abstract handleComplete(): Promise> // handle complete 33 | 34 | abstract getProgress(): Promise 35 | 36 | abstract getResult(): Promise | undefined> 37 | 38 | abstract getDataSingle(): Promise 39 | 40 | abstract reset(): Promise 41 | } 42 | -------------------------------------------------------------------------------- /.gitlab/issue_templates/Feature.md: -------------------------------------------------------------------------------- 1 | 8 | 9 | ## Summary 10 | 11 | 12 | 13 | 14 | ## What is the expected behavior? 15 | 16 | 17 | 18 | 19 | ## Relevant Mockups, Screenshots and/or links 20 | 21 | 22 | 23 | 24 | ## Possible fixes / approach 25 | 26 | 27 | 28 | 29 | ## Additional information 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | /estimate 38 | 39 | 40 | 41 | 42 | /label ~"type::feature" ~"proj::airgap" 43 | 44 | -------------------------------------------------------------------------------- /packages/core/src/lib/components/qr/qr.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing' 2 | 3 | import { TestBedUtils } from '../../../../test/utils/test-bed' 4 | import { ClipboardMock } from '../../../../test/utils/plugins-mock' 5 | import { CLIPBOARD_PLUGIN } from '../../capacitor-plugins/injection-tokens' 6 | import { QrComponent } from './qr.component' 7 | 8 | describe('QrComponent', () => { 9 | let component: QrComponent 10 | let fixture: ComponentFixture 11 | 12 | let testBedUtils: TestBedUtils 13 | 14 | let clipboardPluginMock: ClipboardMock 15 | 16 | beforeEach( 17 | waitForAsync(async () => { 18 | testBedUtils = new TestBedUtils() 19 | clipboardPluginMock = new ClipboardMock() 20 | 21 | await TestBed.configureTestingModule( 22 | testBedUtils.moduleDef({ 23 | providers: [{ provide: CLIPBOARD_PLUGIN, useValue: clipboardPluginMock }] 24 | }) 25 | ).compileComponents() 26 | }) 27 | ) 28 | 29 | beforeEach(() => { 30 | fixture = TestBed.createComponent(QrComponent) 31 | component = fixture.componentInstance 32 | fixture.detectChanges() 33 | }) 34 | 35 | it('should create', () => { 36 | expect(component).toBeTruthy() 37 | }) 38 | }) 39 | -------------------------------------------------------------------------------- /packages/core/src/lib/services/qr/qr-generators/serializer-v2-generator.spec.ts: -------------------------------------------------------------------------------- 1 | import { IACMessageDefinitionObjectV3, IACMessageType, MainProtocolSymbols } from '@airgap/coinlib-core' 2 | import { SerializerV2Generator } from './serializer-v2-generator' 3 | 4 | describe('SerializerV2Generator', () => { 5 | let generator: SerializerV2Generator 6 | 7 | beforeEach(() => { 8 | generator = new SerializerV2Generator() 9 | }) 10 | 11 | it('should create', () => { 12 | expect(generator).toBeTruthy() 13 | }) 14 | 15 | it('should generate a serialized QR string from IACMessageDefinitionObjectV3', async () => { 16 | const data: IACMessageDefinitionObjectV3 = { 17 | id: 79370700, 18 | protocol: MainProtocolSymbols.XTZ, 19 | type: IACMessageType.AccountShareResponse, 20 | payload: { 21 | publicKey: '9430c2ac8fe1403c6cbbee3a98b19f3f3bbdd89d0659b3eb6e4106a5cbe41351', 22 | isExtendedPublicKey: false, 23 | derivationPath: 'm/44h/1729h/0h/0h', 24 | masterFingerprint: '558f6baa', 25 | isActive: true, 26 | groupId: '558f6baa', 27 | groupLabel: 'JGD' 28 | } 29 | } 30 | 31 | await generator.create([data], 300, 150) 32 | const part = await generator.nextPart() 33 | expect(part).toBeDefined() 34 | }) 35 | }) 36 | -------------------------------------------------------------------------------- /packages/core/src/lib/components/iac-qr/iac-qr.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing' 2 | 3 | import { TestBedUtils } from '../../../../test/utils/test-bed' 4 | import { ClipboardMock } from '../../../../test/utils/plugins-mock' 5 | import { CLIPBOARD_PLUGIN } from '../../capacitor-plugins/injection-tokens' 6 | import { IACQrComponent } from './iac-qr.component' 7 | 8 | describe('QrComponent', () => { 9 | let component: IACQrComponent 10 | let fixture: ComponentFixture 11 | 12 | let testBedUtils: TestBedUtils 13 | 14 | let clipboardPluginMock: ClipboardMock 15 | 16 | beforeEach( 17 | waitForAsync(async () => { 18 | testBedUtils = new TestBedUtils() 19 | clipboardPluginMock = new ClipboardMock() 20 | 21 | await TestBed.configureTestingModule( 22 | testBedUtils.moduleDef({ 23 | providers: [{ provide: CLIPBOARD_PLUGIN, useValue: clipboardPluginMock }] 24 | }) 25 | ).compileComponents() 26 | }) 27 | ) 28 | 29 | beforeEach(() => { 30 | fixture = TestBed.createComponent(IACQrComponent) 31 | component = fixture.componentInstance 32 | fixture.detectChanges() 33 | }) 34 | 35 | it('should create', () => { 36 | expect(component).toBeTruthy() 37 | }) 38 | }) 39 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/elf.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/soc.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.devcontainer/devcontainer.json: -------------------------------------------------------------------------------- 1 | // For format details, see https://aka.ms/vscode-remote/devcontainer.json or this file's README at: 2 | // https://github.com/microsoft/vscode-dev-containers/tree/v0.134.1/containers/typescript-node 3 | { 4 | "name": "Node.js 14 & TypeScript", 5 | "build": { 6 | "dockerfile": "Dockerfile", 7 | // Update 'VARIANT' to pick a Node version: 10, 12, 14 8 | "args": { "VARIANT": "14" } 9 | }, 10 | // 11 | // Set *default* container specific settings.json values on container create. 12 | "settings": { 13 | "terminal.integrated.shell.linux": "/bin/zsh" 14 | }, 15 | // 16 | // Add the IDs of extensions you want installed when the container is created. 17 | "extensions": [ 18 | "dbaeumer.vscode-eslint", 19 | "ms-vscode.vscode-typescript-tslint-plugin", 20 | "angular.ng-template", 21 | "esbenp.prettier-vscode", 22 | "eamodio.gitlens" 23 | ] 24 | // 25 | // Use 'forwardPorts' to make a list of ports inside the container available locally. 26 | // "forwardPorts": [], 27 | // 28 | // Use 'postCreateCommand' to run commands after the container is created. 29 | // "postCreateCommand": "yarn install", 30 | // 31 | // Uncomment to connect as a non-root user. See https://aka.ms/vscode-remote/containers/non-root. 32 | // "remoteUser": "node" 33 | } 34 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/bix.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/sxtz.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/yoyow.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/tzbtc.svg: -------------------------------------------------------------------------------- 1 | tzbtc_logo_single_white_bg 2 | -------------------------------------------------------------------------------- /.gitlab/issue_templates/Bug.md: -------------------------------------------------------------------------------- 1 | 8 | 9 | ## Summary 10 | 11 | 12 | 13 | ## Steps to reproduce 14 | 15 | 16 | ## What is the current _bug_ behavior? 17 | 18 | 19 | ## What is the expected _correct_ behavior? 20 | 21 | 22 | ## Relevant logs, screenshots and/or links 23 | 25 | 26 | ## Possible fixes / approach 27 | 28 | 29 | ## Additional information 30 | 31 | 32 | ---- 33 | 34 | /estimate 35 | 36 | 37 | /label ~"type::bug" ~"proj::airgap" 38 | 39 | 40 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/bnty.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/lib/airgap-angular-core.module.ts: -------------------------------------------------------------------------------- 1 | import { Injector, ModuleWithProviders, NgModule } from '@angular/core' 2 | import { TranslateModule } from '@ngx-translate/core' 3 | 4 | import { ComponentsModule } from './components/components.module' 5 | import { PipesModule } from './pipes/pipes.module' 6 | import { AmountConverterPipe } from './pipes/amount-converter/amount-converter.pipe' 7 | import { CurrencySymbolFacade } from './components/currency-symbol/currency-symbol.facade' 8 | 9 | export interface AirGapAngularCoreModuleConfig { 10 | factories?: { 11 | currencySymbolFacade?: (injector: Injector) => CurrencySymbolFacade 12 | } 13 | } 14 | 15 | @NgModule({ 16 | declarations: [], 17 | imports: [ 18 | TranslateModule.forChild({ 19 | extend: true, 20 | isolate: false 21 | }), 22 | ComponentsModule, 23 | PipesModule 24 | ], 25 | exports: [ComponentsModule, PipesModule], 26 | providers: [AmountConverterPipe] 27 | }) 28 | export class AirGapAngularCoreModule { 29 | public static factories: AirGapAngularCoreModuleConfig['factories'] = {} 30 | 31 | public static forRoot(config: AirGapAngularCoreModuleConfig = {}): ModuleWithProviders { 32 | AirGapAngularCoreModule.factories = config?.factories ?? {} 33 | 34 | return { 35 | ngModule: AirGapAngularCoreModule 36 | } 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /packages/core/src/lib/components/currency-symbol/currency-symbol.facade.ts: -------------------------------------------------------------------------------- 1 | import { ProtocolSymbols } from '@airgap/coinlib-core' 2 | import { InjectionToken, Injector } from '@angular/core' 3 | import { Observable } from 'rxjs' 4 | 5 | import { AirGapAngularCoreModule } from '../../airgap-angular-core.module' 6 | import { BaseFacade } from '../../base/base.facade' 7 | 8 | export const DEFAULT_CURRENCY_SYMBOL_URL = './assets/symbols/generic-coin.svg' 9 | 10 | export const CURRENCY_SYMBOL_FACADE = new InjectionToken('CurrencySymbolFacade') 11 | export type CurrencySymbolFacade = ICurrencySymbolFacade & T 12 | export interface ICurrencySymbolFacade { 13 | readonly symbolSrc$: Observable 14 | 15 | initWithSymbol(symbol: string | undefined, protocolIdentifier: ProtocolSymbols | undefined): void 16 | onSymbolChanged(symbol: string | undefined, protocolIdentifier: ProtocolSymbols | undefined): void 17 | onError(symbol: string | undefined, protocolIdentifier: ProtocolSymbols | undefined, src?: string): void 18 | } 19 | 20 | export const currencySymbolFacade = (injector: Injector): CurrencySymbolFacade => { 21 | const factory = AirGapAngularCoreModule.factories?.currencySymbolFacade 22 | if (!factory) { 23 | throw new Error('Factory for `CurrencySymbolFacade` not found.') 24 | } 25 | 26 | return factory(injector) 27 | } 28 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/mds.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/lib/services/qr/qr-generators/xpub-generator.spec.ts: -------------------------------------------------------------------------------- 1 | import { IACMessageDefinitionObjectV3, IACMessageType, MainProtocolSymbols } from '@airgap/coinlib-core' 2 | import { XPubGenerator } from './xpub-generator' 3 | 4 | describe('XPubGenerator', () => { 5 | let generator: XPubGenerator 6 | 7 | beforeEach(() => { 8 | generator = new XPubGenerator() 9 | }) 10 | 11 | it('should create', () => { 12 | expect(generator).toBeTruthy() 13 | }) 14 | 15 | it('should generate an xPub message', async () => { 16 | const data: IACMessageDefinitionObjectV3 = { 17 | id: 79370700, 18 | protocol: MainProtocolSymbols.BTC_SEGWIT, 19 | type: IACMessageType.AccountShareResponse, 20 | payload: { 21 | publicKey: 'zpub6s1D4v39zP2hNjAtAFRZ7J59W8tK9txcqgSM1STVQHq2AyUoM3eyXqCfXbweMCT5c69EQCz4rMgZQeMyKWfCvfeQVLCGQeCsGVdWkmQ3D4F', 22 | isExtendedPublicKey: true, 23 | derivationPath: "m/84'/0'/0'/0/1", 24 | masterFingerprint: '6f01ffc8', 25 | isActive: true, 26 | groupId: '6f01ffc8', 27 | groupLabel: 'Test' 28 | } 29 | } 30 | 31 | await generator.create([data], 300, 150) 32 | const part = await generator.nextPart() 33 | console.log('part', part) 34 | expect(part).toBe('zpub6s1D4v39zP2hNjAtAFRZ7J59W8tK9txcqgSM1STVQHq2AyUoM3eyXqCfXbweMCT5c69EQCz4rMgZQeMyKWfCvfeQVLCGQeCsGVdWkmQ3D4F') 35 | }) 36 | }) 37 | -------------------------------------------------------------------------------- /packages/ngrx/test/utils/test-bed.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable @typescript-eslint/no-explicit-any */ 2 | import { TestModuleMetadata } from '@angular/core/testing' 3 | import { CommonModule } from '@angular/common' 4 | import { IonicModule } from '@ionic/angular' 5 | import { TranslateFakeLoader, TranslateLoader, TranslateModule } from '@ngx-translate/core' 6 | 7 | import { QRCodeModule } from 'angularx-qrcode' 8 | import { Storage } from '@ionic/storage' 9 | 10 | import { ComponentsModule } from '../../src/lib/components/components.module' 11 | 12 | export class TestBedUtils { 13 | public moduleDef(moduleMedatada: TestModuleMetadata, useIonicOnlyTestBed: boolean = false): TestModuleMetadata { 14 | const mandatoryDeclarations: any[] = [] 15 | const mandatoryImports: any[] = [ 16 | CommonModule, 17 | IonicModule, 18 | ComponentsModule, 19 | TranslateModule.forRoot({ 20 | loader: { provide: TranslateLoader, useClass: TranslateFakeLoader } 21 | }), 22 | QRCodeModule 23 | ] 24 | const mandatoryProviders: any[] = [] 25 | 26 | moduleMedatada.declarations = [...(moduleMedatada.declarations ?? []), ...mandatoryDeclarations] 27 | moduleMedatada.imports = [...(moduleMedatada.imports ?? []), ...mandatoryImports] 28 | moduleMedatada.providers = [...(moduleMedatada.providers ?? []), ...mandatoryProviders] 29 | 30 | return moduleMedatada 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/agi.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/zrx.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/lib/services/qr/qr-generators/serializer-v2-generator.ts: -------------------------------------------------------------------------------- 1 | import { IACMessageDefinitionObject, IACMessageDefinitionObjectV3, Serializer } from '@airgap/coinlib-core' 2 | import { IACQrGenerator } from '../../iac/qr-generator' 3 | import { convertV3ToV2 } from '../../serializer/serializer.service' 4 | 5 | const serializer = new Serializer() 6 | export class SerializerV2Generator extends IACQrGenerator { 7 | private counter: number = 0 8 | private parts: string[] = [] 9 | 10 | private data: IACMessageDefinitionObject[] = [] 11 | 12 | constructor() { 13 | super() 14 | } 15 | 16 | public async create(data: IACMessageDefinitionObjectV3[], multiFragmentLength: number, singleFragmentLength: number): Promise { 17 | this.counter = 0 18 | this.data = await convertV3ToV2(data) 19 | 20 | this.parts = await serializer.serialize(this.data, singleFragmentLength, multiFragmentLength) 21 | } 22 | 23 | public async nextPart(): Promise { 24 | const next = this.parts[this.counter % this.parts.length] 25 | this.counter += 1 26 | return next 27 | } 28 | 29 | public async getSingle(prefix: string): Promise { 30 | const part = this.parts.length === 1 ? this.parts[0] : (await serializer.serialize(this.data))[0] 31 | return this.prefixSingle(part, prefix, 'd') 32 | } 33 | 34 | public async getNumberOfParts(): Promise { 35 | return this.parts.length 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/iotx.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/ant.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/arn.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/dent.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/core/test/utils/plugins-mock.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable max-classes-per-file */ 2 | import { newSpy } from './unit-test-helper' 3 | 4 | export class AppMock { 5 | public addListener = newSpy('addListener', {}) 6 | public openUrl = newSpy('openUrl', Promise.resolve()) 7 | } 8 | 9 | export class AppInfoMock { 10 | public get: jasmine.Spy = newSpy( 11 | 'set', 12 | Promise.resolve({ 13 | appName: 'AirGap.UnitTest', 14 | packageName: 'AirGap', 15 | versionName: '0.0.0', 16 | versionCode: 0 17 | }) 18 | ) 19 | } 20 | 21 | export class ClipboardMock { 22 | public read: jasmine.Spy = newSpy('read', Promise.resolve({ value: 'text-from-clipboard' })) 23 | public write: jasmine.Spy = newSpy('write', Promise.resolve()) 24 | } 25 | 26 | export class AppLauncherPluginMock { 27 | public openUrl: jasmine.Spy = newSpy('openUrl', Promise.resolve()) 28 | } 29 | 30 | export class PermissionsPluginMock { 31 | public query: jasmine.Spy = newSpy('query', Promise.resolve({ value: true })) 32 | } 33 | 34 | export class FilesystemPluginMock { 35 | public readFile: jasmine.Spy = newSpy('readFile', Promise.resolve({ data: 'text-from-filesystem' })) 36 | public writeFile: jasmine.Spy = newSpy('writeFile', Promise.resolve()) 37 | public readdir: jasmine.Spy = newSpy('readdir', Promise.resolve({ files: [] })) 38 | } 39 | 40 | export class InternalStorageServiceMock { 41 | public set: jasmine.Spy = newSpy('set', Promise.resolve({})) 42 | } 43 | -------------------------------------------------------------------------------- /packages/ngrx/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@airgap/angular-ngrx", 3 | "version": "0.0.29", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "@airgap/angular-ngrx", 9 | "version": "0.0.29", 10 | "dependencies": { 11 | "tslib": "^2.2.0" 12 | }, 13 | "peerDependencies": { 14 | "@airgap/angular-core": "^0.0.28", 15 | "@airgap/coinlib-core": "^0.13.3", 16 | "@angular/common": "^11.2.9", 17 | "@angular/core": "^11.2.9", 18 | "@angular/platform-browser": "^11.2.9", 19 | "@angular/platform-browser-dynamic": "^11.2.9", 20 | "@ionic/core": "^5.6.4", 21 | "@ngrx/component": "^11.1.1", 22 | "@ngrx/component-store": "^11.1.1", 23 | "@ngrx/store": "^11.1.0", 24 | "rxjs": "^6.6.7", 25 | "zone.js": "^0.11.4" 26 | } 27 | }, 28 | "node_modules/tslib": { 29 | "version": "2.3.1", 30 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", 31 | "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" 32 | } 33 | }, 34 | "dependencies": { 35 | "tslib": { 36 | "version": "2.3.1", 37 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", 38 | "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /packages/core/src/assets/symbols/knc.svg: -------------------------------------------------------------------------------- 1 | --------------------------------------------------------------------------------