dop-wallet-v6 1.2.2 → 1.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/services/artifacts/__tests__/artifact-downloader.test.js.map +1 -1
- package/dist/services/artifacts/artifact-downloader.d.ts +1 -1
- package/dist/services/artifacts/artifact-downloader.js.map +1 -1
- package/dist/services/artifacts/artifact-hash.d.ts +1 -1
- package/dist/services/artifacts/artifact-hash.js.map +1 -1
- package/dist/services/artifacts/artifact-util.d.ts +1 -1
- package/dist/services/artifacts/artifact-util.js.map +1 -1
- package/dist/services/dop/core/__tests__/providers.test.js +2 -2
- package/dist/services/dop/core/__tests__/providers.test.js.map +1 -1
- package/dist/services/dop/core/artifacts.d.ts +2 -2
- package/dist/services/dop/core/artifacts.js.map +1 -1
- package/dist/services/dop/core/encrypts.d.ts +1 -1
- package/dist/services/dop/core/encrypts.js.map +1 -1
- package/dist/services/dop/core/engine.d.ts +1 -1
- package/dist/services/dop/core/engine.js.map +1 -1
- package/dist/services/dop/core/init.d.ts +2 -2
- package/dist/services/dop/core/init.js.map +1 -1
- package/dist/services/dop/core/load-provider.d.ts +1 -1
- package/dist/services/dop/core/load-provider.js.map +1 -1
- package/dist/services/dop/core/merkletree.d.ts +2 -2
- package/dist/services/dop/core/merkletree.js.map +1 -1
- package/dist/services/dop/core/prover.d.ts +1 -1
- package/dist/services/dop/core/prover.js.map +1 -1
- package/dist/services/dop/core/providers.d.ts +2 -2
- package/dist/services/dop/core/providers.js.map +1 -1
- package/dist/services/dop/dop-txids/__tests__/dop-txid-sync-graph-v2.test.js.map +1 -1
- package/dist/services/dop/dop-txids/blinded-commitments.d.ts +1 -1
- package/dist/services/dop/dop-txids/blinded-commitments.js.map +1 -1
- package/dist/services/dop/dop-txids/dop-txid-graph-type-formatters.d.ts +1 -1
- package/dist/services/dop/dop-txids/dop-txid-graph-type-formatters.js.map +1 -1
- package/dist/services/dop/dop-txids/dop-txid-merkletrees.d.ts +1 -1
- package/dist/services/dop/dop-txids/dop-txid-merkletrees.js.map +1 -1
- package/dist/services/dop/dop-txids/dop-txid-sync-graph-v2.d.ts +1 -1
- package/dist/services/dop/dop-txids/dop-txid-sync-graph-v2.js.map +1 -1
- package/dist/services/dop/dop-txids/graphql/index.js +1 -1
- package/dist/services/dop/dop-txids/graphql/index.js.map +1 -1
- package/dist/services/dop/history/transaction-history.d.ts +2 -2
- package/dist/services/dop/history/transaction-history.js.map +1 -1
- package/dist/services/dop/index.d.ts +1 -0
- package/dist/services/dop/index.js +1 -0
- package/dist/services/dop/index.js.map +1 -1
- package/dist/services/dop/process/extract-transaction-data.d.ts +1 -1
- package/dist/services/dop/process/extract-transaction-data.js.map +1 -1
- package/dist/services/dop/profile/__tests__/profile-manager.test.d.ts +1 -0
- package/dist/services/dop/profile/__tests__/profile-manager.test.js +170 -0
- package/dist/services/dop/profile/__tests__/profile-manager.test.js.map +1 -0
- package/dist/services/dop/profile/__tests__/selective-transparency.test.d.ts +1 -0
- package/dist/services/dop/profile/__tests__/selective-transparency.test.js +256 -0
- package/dist/services/dop/profile/__tests__/selective-transparency.test.js.map +1 -0
- package/dist/services/dop/profile/__tests__/storage.test.d.ts +1 -0
- package/dist/services/dop/profile/__tests__/storage.test.js +174 -0
- package/dist/services/dop/profile/__tests__/storage.test.js.map +1 -0
- package/dist/services/dop/profile/index.d.ts +3 -0
- package/dist/services/dop/profile/index.js +20 -0
- package/dist/services/dop/profile/index.js.map +1 -0
- package/dist/services/dop/profile/profile-manager.d.ts +32 -0
- package/dist/services/dop/profile/profile-manager.js +235 -0
- package/dist/services/dop/profile/profile-manager.js.map +1 -0
- package/dist/services/dop/profile/selective-transparency.d.ts +82 -0
- package/dist/services/dop/profile/selective-transparency.js +447 -0
- package/dist/services/dop/profile/selective-transparency.js.map +1 -0
- package/dist/services/dop/profile/storage.d.ts +27 -0
- package/dist/services/dop/profile/storage.js +648 -0
- package/dist/services/dop/profile/storage.js.map +1 -0
- package/dist/services/dop/profile/types.d.ts +106 -0
- package/dist/services/dop/profile/types.js +3 -0
- package/dist/services/dop/profile/types.js.map +1 -0
- package/dist/services/dop/profile/usage-example.d.ts +11 -0
- package/dist/services/dop/profile/usage-example.js +143 -0
- package/dist/services/dop/profile/usage-example.js.map +1 -0
- package/dist/services/dop/quick-sync/V2/__tests__/quick-sync-events-graph-v2.test.js.map +1 -1
- package/dist/services/dop/quick-sync/V2/graph-type-formatters-v2.d.ts +1 -1
- package/dist/services/dop/quick-sync/V2/graph-type-formatters-v2.js.map +1 -1
- package/dist/services/dop/quick-sync/V2/graphql/index.js +1 -1
- package/dist/services/dop/quick-sync/V2/graphql/index.js.map +1 -1
- package/dist/services/dop/quick-sync/V2/quick-sync-events-graph-v2.d.ts +1 -1
- package/dist/services/dop/quick-sync/V2/quick-sync-events-graph-v2.js.map +1 -1
- package/dist/services/dop/quick-sync/V3/__tests__/quick-sync-events-graph-v3.test.js.map +1 -1
- package/dist/services/dop/quick-sync/V3/graph-type-formatters-v3.d.ts +1 -1
- package/dist/services/dop/quick-sync/V3/graph-type-formatters-v3.js.map +1 -1
- package/dist/services/dop/quick-sync/V3/quick-sync-events-graph-v3.d.ts +1 -1
- package/dist/services/dop/quick-sync/V3/quick-sync-events-graph-v3.js.map +1 -1
- package/dist/services/dop/quick-sync/graph-query.d.ts +1 -1
- package/dist/services/dop/quick-sync/graph-query.js.map +1 -1
- package/dist/services/dop/quick-sync/quick-sync-events.d.ts +1 -1
- package/dist/services/dop/quick-sync/quick-sync-events.js.map +1 -1
- package/dist/services/dop/quick-sync/shared-formatters.d.ts +1 -1
- package/dist/services/dop/quick-sync/shared-formatters.js.map +1 -1
- package/dist/services/dop/util/__tests__/bytes-util.test.js +1 -1
- package/dist/services/dop/util/__tests__/bytes-util.test.js.map +1 -1
- package/dist/services/dop/util/bytes.d.ts +1 -1
- package/dist/services/dop/util/bytes.js.map +1 -1
- package/dist/services/dop/util/crypto.d.ts +2 -2
- package/dist/services/dop/util/crypto.js.map +1 -1
- package/dist/services/dop/wallets/__tests__/balances-live.test.js.map +1 -1
- package/dist/services/dop/wallets/__tests__/balances-update.test.js.map +1 -1
- package/dist/services/dop/wallets/__tests__/balances.test.js.map +1 -1
- package/dist/services/dop/wallets/__tests__/wallets.test.js.map +1 -1
- package/dist/services/dop/wallets/balance-update.d.ts +2 -2
- package/dist/services/dop/wallets/balance-update.js.map +1 -1
- package/dist/services/dop/wallets/balances.d.ts +1 -1
- package/dist/services/dop/wallets/balances.js.map +1 -1
- package/dist/services/dop/wallets/wallets.d.ts +2 -2
- package/dist/services/dop/wallets/wallets.js.map +1 -1
- package/dist/services/ethers/ethers-util.js.map +1 -1
- package/dist/services/transactions/__tests__/proof-cache.test.js.map +1 -1
- package/dist/services/transactions/__tests__/tx-cross-contract-calls.test.js +6 -6
- package/dist/services/transactions/__tests__/tx-cross-contract-calls.test.js.map +1 -1
- package/dist/services/transactions/__tests__/tx-encrypt-base-token.test.js.map +1 -1
- package/dist/services/transactions/__tests__/tx-gas-details.test.js.map +1 -1
- package/dist/services/transactions/__tests__/tx-notes.test.js.map +1 -1
- package/dist/services/transactions/__tests__/tx-transfer.test.js +9 -9
- package/dist/services/transactions/__tests__/tx-transfer.test.js.map +1 -1
- package/dist/services/transactions/proof-cache.d.ts +1 -1
- package/dist/services/transactions/proof-cache.js.map +1 -1
- package/dist/services/transactions/tx-cross-contract-calls.d.ts +2 -2
- package/dist/services/transactions/tx-cross-contract-calls.js.map +1 -1
- package/dist/services/transactions/tx-decrypt.d.ts +1 -1
- package/dist/services/transactions/tx-decrypt.js.map +1 -1
- package/dist/services/transactions/tx-encrypt-base-token.d.ts +1 -1
- package/dist/services/transactions/tx-encrypt-base-token.js.map +1 -1
- package/dist/services/transactions/tx-encrypt.d.ts +1 -1
- package/dist/services/transactions/tx-encrypt.js.map +1 -1
- package/dist/services/transactions/tx-gas-broadcaster-fee-estimator.d.ts +2 -2
- package/dist/services/transactions/tx-gas-broadcaster-fee-estimator.js.map +1 -1
- package/dist/services/transactions/tx-gas-details.d.ts +1 -1
- package/dist/services/transactions/tx-gas-details.js.map +1 -1
- package/dist/services/transactions/tx-generator.d.ts +2 -2
- package/dist/services/transactions/tx-generator.js.map +1 -1
- package/dist/services/transactions/tx-notes.d.ts +2 -2
- package/dist/services/transactions/tx-notes.js.map +1 -1
- package/dist/services/transactions/tx-nullifiers.d.ts +1 -1
- package/dist/services/transactions/tx-nullifiers.js.map +1 -1
- package/dist/services/transactions/tx-proof-decrypt.d.ts +1 -1
- package/dist/services/transactions/tx-proof-decrypt.js.map +1 -1
- package/dist/services/transactions/tx-proof-transfer.d.ts +1 -1
- package/dist/services/transactions/tx-proof-transfer.js.map +1 -1
- package/dist/services/transactions/tx-transfer.d.ts +1 -1
- package/dist/services/transactions/tx-transfer.js.map +1 -1
- package/dist/tests/helper.test.d.ts +1 -1
- package/dist/tests/helper.test.js.map +1 -1
- package/dist/tests/mocks.test.d.ts +2 -2
- package/dist/tests/mocks.test.js.map +1 -1
- package/dist/tests/poi/test-wallet-poi-requester.test.d.ts +2 -2
- package/dist/tests/poi/test-wallet-poi-requester.test.js.map +1 -1
- package/dist/tests/setup.test.d.ts +1 -1
- package/dist/tests/setup.test.js.map +1 -1
- package/dist/tests/stubs/engine-stubs.test.d.ts +1 -1
- package/dist/tests/stubs/engine-stubs.test.js.map +1 -1
- package/dist/utils/blocked-address.js.map +1 -1
- package/dist/utils/error.js.map +1 -1
- package/dist/utils/gas-price.d.ts +1 -1
- package/dist/utils/gas-price.js.map +1 -1
- package/package.json +13 -3
- package/postinstall.js +1 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Chain } from 'dop-engine-
|
|
2
|
-
import { TransactionHistoryItem, TransactionHistoryItemCategory } from 'dop-sharedmodels-
|
|
1
|
+
import { Chain } from 'dop-engine-v3';
|
|
2
|
+
import { TransactionHistoryItem, TransactionHistoryItemCategory } from 'dop-sharedmodels-v3';
|
|
3
3
|
export declare const categoryForTransactionHistoryItem: (historyItem: TransactionHistoryItem) => TransactionHistoryItemCategory;
|
|
4
4
|
export declare const getWalletTransactionHistory: (chain: Chain, dopWalletID: string, startingBlock: Optional<number>) => Promise<TransactionHistoryItem[]>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transaction-history.js","sourceRoot":"","sources":["../../../../src/services/dop/history/transaction-history.ts"],"names":[],"mappings":";;;AAAA,iDAWuB;AACvB,6DAY6B;AAC7B,yCAAqD;AACrD,gDAA8D;AAC9D,gDAAiD;AAEjD,MAAM,0CAA0C,GAAG,CACjD,aAAkC,EACV,EAAE;IAC1B,QAAQ,aAAa,EAAE;QACrB,KAAK,mCAAmB,CAAC,SAAS;YAChC,OAAO,4CAAsB,CAAC,SAAS,CAAC;QAC1C,KAAK,mCAAmB,CAAC,cAAc;YACrC,OAAO,4CAAsB,CAAC,cAAc,CAAC;QAC/C,KAAK,mCAAmB,CAAC,cAAc;YACrC,OAAO,4CAAsB,CAAC,cAAc,CAAC;QAC/C,KAAK,mCAAmB,CAAC,cAAc;YACrC,OAAO,4CAAsB,CAAC,cAAc,CAAC;QAC/C,KAAK,mCAAmB,CAAC,KAAK;YAC5B,OAAO,4CAAsB,CAAC,KAAK,CAAC;QACtC;YACA,OAAO,4CAAsB,CAAC,SAAS,CAAC;KACzC;IACD,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;AACtD,CAAC,CAAC;AAEF,MAAM,oDAAoD,GAAG,CAC3D,oCAA0E,EAC5C,EAAE;IAChC,OAAO;QACL,GAAG,6CAA6C,CAC9C,oCAAoC,CACrC;QACD,QAAQ,EAAE,oCAAoC,CAAC,QAAQ;QACvD,aAAa,EAAE,oCAAoC,CAAC,aAAa;QACjE,UAAU,EAAE,oCAAoC,CAAC,UAAU;QAC3D,aAAa,EAAE,0CAA0C,CACvD,oCAAoC,CAAC,aAAa,CACnD;KACF,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,0CAA0C,GAAG,CACjD,oCAA0E,EAC9C,EAAE;IAC9B,OAAO;QACL,GAAG,mCAAmC,CACpC,oCAAoC,CACrC;QACD,QAAQ,EAAE,oCAAoC,CAAC,QAAQ;QACvD,aAAa,EAAE,oCAAoC,CAAC,aAAa;QACjE,UAAU,EAAE,oCAAoC,CAAC,UAAU;QAC3D,aAAa,EAAE,0CAA0C,CACvD,oCAAoC,CAAC,aAAa,CACnD;KACF,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,qDAAqD,GAAG,CAC5D,6BAAoE,EACzC,EAAE;IAC7B,OAAO;QACL,GAAG,6CAA6C,CAC9C,6BAA6B,CAC9B;QACD,gBAAgB,EAAE,6BAA6B,CAAC,gBAAgB;QAChE,QAAQ,EAAE,6BAA6B,CAAC,QAAQ;QAChD,YAAY,EAAE,6BAA6B,CAAC,YAAY;KACzD,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,oDAAoD,GAAG,CAC3D,oCAA0E,EAC5C,EAAE;IAChC,OAAO;QACL,GAAG,qDAAqD,CACtD,oCAAoC,CACrC;QACD,UAAU,EAAE,oCAAoC,CAAC,UAAU;KAC5D,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,2CAA2C,GAAG,CAClD,qBAA4D,EACnC,EAAE;IAC3B,OAAO;QACL,GAAG,mCAAmC,CAAC,qBAAqB,CAAC;QAC7D,QAAQ,EAAE,qBAAqB,CAAC,QAAQ;QACxC,YAAY,EAAE,qBAAqB,CAAC,YAAY;QAChD,gBAAgB,EAAE,qBAAqB,CAAC,gBAAgB;KACzD,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,0CAA0C,GAAG,CACjD,qBAA2D,EAC/B,EAAE;IAC9B,OAAO;QACL,GAAG,2CAA2C,CAAC,qBAAqB,CAAC;QACrE,UAAU,EAAE,qBAAqB,CAAC,UAAU;KAC7C,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,6CAA6C,GAAG,CACpD,6BAA4D,EACrC,EAAE;IACzB,OAAO;QACL,YAAY,EAAE,IAAA,4BAAoB,EAChC,6BAA6B,CAAC,SAAS,CAAC,YAAY,CACrD,CAAC,WAAW,EAAE;QACf,MAAM,EAAE,6BAA6B,CAAC,MAAM;KAC7C,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,mCAAmC,GAAG,CAC1C,qBAAoD,EAC/B,EAAE;IACvB,OAAO;QACL,UAAU,EAAE,IAAA,4BAAoB,EAC9B,qBAAqB,CAAC,SAAS,CAAC,YAAY,CAC7C,CAAC,WAAW,EAAE;QACf,YAAY,EAAE,qBAAqB,CAAC,SAAS,CAAC,SAAkB;QAChE,UAAU,EAAE,qBAAqB,CAAC,SAAS,CAAC,UAAU;QACtD,MAAM,EAAE,qBAAqB,CAAC,MAAM;KACrC,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,WAAW,GAAG,CAAC,WAA0C,EAAE,EAAE;IACjE,OAAO,WAAW,CAAC,SAAS,CAAC,SAAS,KAAK,yBAAS,CAAC,KAAK,CAAC;AAC7D,CAAC,CAAC;AAEF,MAAM,SAAS,GAAG,CAAC,WAA0C,EAAE,EAAE;IAC/D,QAAQ,WAAW,CAAC,SAAS,CAAC,SAAS,EAAE;QACvC,KAAK,yBAAS,CAAC,KAAK;YAClB,OAAO,KAAK,CAAC;QACf,KAAK,yBAAS,CAAC,MAAM,CAAC;QACtB,KAAK,yBAAS,CAAC,OAAO;YACpB,OAAO,WAAW,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;KACzC;AACH,CAAC,CAAC;AAEF,MAAM,iCAAiC,GAAG,CACxC,mBAAmD,EAC1C,EAAE;IACX,OAAO,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC;AACvE,CAAC,CAAC;AAEK,MAAM,iCAAiC,GAAG,CAC/C,WAAmC,EACH,EAAE;IAClC,MAAM,eAAe,GAAG,WAAW,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,CAAC;IAClE,MAAM,cAAc,GAAG,WAAW,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAAC;IAChE,MAAM,cAAc,GAAG,WAAW,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAAC;IAChE,IAAI,eAAe,IAAI,cAAc,IAAI,cAAc,EAAE;QACvD,6CAA6C;QAC7C,OAAO,oDAA8B,CAAC,OAAO,CAAC;KAC/C;IAED,MAAM,iBAAiB,GAAG,WAAW,CAAC,oBAAoB,CAAC,MAAM,GAAG,CAAC,CAAC;IACtE,MAAM,gBAAgB,GAAG,WAAW,CAAC,mBAAmB,CAAC,MAAM,GAAG,CAAC,CAAC;IACpE,MAAM,gBAAgB,GAAG,WAAW,CAAC,mBAAmB,CAAC,MAAM,GAAG,CAAC,CAAC;IAEpE,IAAI,iBAAiB,IAAI,CAAC,gBAAgB,IAAI,CAAC,gBAAgB,EAAE;QAC/D,wBAAwB;QACxB,OAAO,oDAA8B,CAAC,kBAAkB,CAAC;KAC1D;IAED,IAAI,CAAC,iBAAiB,IAAI,gBAAgB,IAAI,CAAC,gBAAgB,EAAE;QAC/D,uBAAuB;QACvB,MAAM,aAAa,GAAG,iCAAiC,CACrD,WAAW,CAAC,mBAAmB,CAChC,CAAC;QACF,IAAI,aAAa,EAAE;YACjB,gEAAgE;YAChE,kEAAkE;YAClE,OAAO,oDAA8B,CAAC,aAAa,CAAC;SACrD;QACD,OAAO,oDAA8B,CAAC,qBAAqB,CAAC;KAC7D;IAED,IAAI,CAAC,iBAAiB,IAAI,CAAC,gBAAgB,IAAI,gBAAgB,EAAE;QAC/D,uBAAuB;QACvB,OAAO,oDAA8B,CAAC,aAAa,CAAC;KACrD;IAED,OAAO,oDAA8B,CAAC,OAAO,CAAC;AAChD,CAAC,CAAC;AAvCW,QAAA,iCAAiC,qCAuC5C;AAEF,MAAM,2BAA2B,GAAG,CAClC,kBAA6C,EACnB,EAAE;IAC5B,MAAM,yBAAyB,GAC7B,kBAAkB,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QACtC,WAAW,EAAE,YAAY,CAAC,WAAW;QACrC,IAAI,EAAE,yBAAS,CAAC,kBAAkB,CAAC,YAAY,CAAC,IAAI,EAAE,0BAAU,CAAC,QAAQ,EAAE,IAAI,CAAC;QAChF,WAAW,EAAE,YAAY,CAAC,WAAW;QACrC,SAAS,EAAE,YAAY,CAAC,SAAS;QACjC,oBAAoB,EAAE,YAAY,CAAC,oBAAoB;aACpD,MAAM,CAAC,WAAW,CAAC;aACnB,GAAG,CAAC,qDAAqD,CAAC;QAC7D,yBAAyB,EAAE,SAAS;QACpC,kBAAkB,EAAE,YAAY,CAAC,kBAAkB;aAChD,MAAM,CAAC,WAAW,CAAC;aACnB,GAAG,CAAC,6CAA6C,CAAC;QACrD,mBAAmB,EAAE,YAAY,CAAC,mBAAmB;aAClD,MAAM,CAAC,WAAW,CAAC;aACnB,GAAG,CAAC,oDAAoD,CAAC;QAC5D,mBAAmB,EAAE,YAAY,CAAC,mBAAmB;aAClD,MAAM,CAAC,WAAW,CAAC;aACnB,GAAG,CAAC,oDAAoD,CAAC;QAC5D,iBAAiB,EAAE,YAAY,CAAC,mBAAmB;aAChD,MAAM,CAAC,SAAS,CAAC;aACjB,GAAG,CAAC,0CAA0C,CAAC;QAClD,kBAAkB,EAAE,YAAY,CAAC,oBAAoB;aAClD,MAAM,CAAC,SAAS,CAAC;aACjB,GAAG,CAAC,2CAA2C,CAAC;QACnD,iBAAiB,EAAE,YAAY,CAAC,mBAAmB;aAChD,MAAM,CAAC,SAAS,CAAC;aACjB,GAAG,CAAC,0CAA0C,CAAC;QAClD,OAAO,EAAE,YAAY,CAAC,OAAO;QAC7B,QAAQ,EAAE,oDAA8B,CAAC,OAAO;KACjD,CAAC,CAAC,CAAC;IAEN,+CAA+C;IAC/C,OAAO,yBAAyB,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QACnD,GAAG,WAAW;QACd,QAAQ,EAAE,IAAA,yCAAiC,EAAC,WAAW,CAAC;KACzD,CAAC,CAAC,CAAC;AACN,CAAC,CAAC;AAEK,MAAM,2BAA2B,GAAG,KAAK,EAC9C,KAAY,EACZ,WAAmB,EACnB,aAA+B,EACI,EAAE;IACrC,IAAI;QACF,MAAM,MAAM,GAAG,IAAA,qBAAW,EAAC,WAAW,CAAC,CAAC;QACxC,MAAM,kBAAkB,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAC3D,KAAK,EACL,aAAa,CACd,CAAC;QACF,OAAO,2BAA2B,CAAC,kBAAkB,CAAC,CAAC;KACxD;IAAC,OAAO,GAAG,EAAE;QACZ,IAAA,8BAAsB,EAAC,mCAA2B,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC9D,MAAM,IAAI,KAAK,CAAC,gDAAgD,EAAE;YAChE,KAAK,EAAE,GAAG;SACX,CAAC,CAAC;KACJ;AACH,CAAC,CAAC;AAlBW,QAAA,2BAA2B,+BAkBtC","sourcesContent":["import {\n TransactionHistoryTransferTokenAmount,\n TransactionHistoryTokenAmount,\n TransactionHistoryEntry,\n Chain,\n TransactionHistoryReceiveTokenAmount,\n TokenType,\n ByteLength,\n ByteUtils,\n TransactionHistoryDecryptTokenAmount,\n WalletBalanceBucket,\n} from 'dop-engine-v5';\nimport {\n TransactionHistoryItem,\n DopHistoryERC20Amount,\n DopHistorySendERC20Amount,\n DopHistoryReceiveERC20Amount,\n DopHistorySendNFTAmount,\n DopHistoryNFTAmount,\n DopHistoryReceiveNFTAmount,\n DopHistoryDecryptERC20Amount,\n DopHistoryDecryptNFTAmount,\n TransactionHistoryItemCategory,\n DopWalletBalanceBucket,\n} from 'dop-sharedmodels-v5';\nimport { parseDopTokenAddress } from '../util/bytes';\nimport { reportAndSanitizeError } from '../../../utils/error';\nimport { walletForID } from '../wallets/wallets';\n\nconst getDopBalanceBucketFromEngineBalanceBucket = (\n balanceBucket: WalletBalanceBucket,\n): DopWalletBalanceBucket => {\n switch (balanceBucket) {\n case WalletBalanceBucket.Spendable:\n return DopWalletBalanceBucket.Spendable;\n case WalletBalanceBucket.EncryptBlocked:\n return DopWalletBalanceBucket.EncryptBlocked;\n case WalletBalanceBucket.EncryptPending:\n return DopWalletBalanceBucket.EncryptPending;\n case WalletBalanceBucket.ProofSubmitted:\n return DopWalletBalanceBucket.ProofSubmitted;\n case WalletBalanceBucket.Spent:\n return DopWalletBalanceBucket.Spent;\n default:\n return DopWalletBalanceBucket.Spendable;\n }\n throw new Error('Unrecognized WalletBalanceBucket');\n};\n\nconst transactionHistoryReceiveTokenAmountToDopERC20Amount = (\n transactionHistoryReceiveTokenAmount: TransactionHistoryReceiveTokenAmount,\n): DopHistoryReceiveERC20Amount => {\n return {\n ...transactionHistoryTokenAmountToDopERC20Amount(\n transactionHistoryReceiveTokenAmount,\n ),\n memoText: transactionHistoryReceiveTokenAmount.memoText,\n senderAddress: transactionHistoryReceiveTokenAmount.senderAddress,\n encryptFee: transactionHistoryReceiveTokenAmount.encryptFee,\n balanceBucket: getDopBalanceBucketFromEngineBalanceBucket(\n transactionHistoryReceiveTokenAmount.balanceBucket,\n ),\n };\n};\n\nconst transactionHistoryReceiveNFTToDopNFTAmount = (\n transactionHistoryReceiveTokenAmount: TransactionHistoryReceiveTokenAmount,\n): DopHistoryReceiveNFTAmount => {\n return {\n ...transactionHistoryNFTToDopNFTAmount(\n transactionHistoryReceiveTokenAmount,\n ),\n memoText: transactionHistoryReceiveTokenAmount.memoText,\n senderAddress: transactionHistoryReceiveTokenAmount.senderAddress,\n encryptFee: transactionHistoryReceiveTokenAmount.encryptFee,\n balanceBucket: getDopBalanceBucketFromEngineBalanceBucket(\n transactionHistoryReceiveTokenAmount.balanceBucket,\n ),\n };\n};\n\nconst transactionHistoryTransferTokenAmountToDopERC20Amount = (\n transactionHistoryTokenAmount: TransactionHistoryTransferTokenAmount,\n): DopHistorySendERC20Amount => {\n return {\n ...transactionHistoryTokenAmountToDopERC20Amount(\n transactionHistoryTokenAmount,\n ),\n recipientAddress: transactionHistoryTokenAmount.recipientAddress,\n memoText: transactionHistoryTokenAmount.memoText,\n walletSource: transactionHistoryTokenAmount.walletSource,\n };\n};\n\nconst transactionHistoryDecryptTokenAmountToDopERC20Amount = (\n transactionHistoryDecryptTokenAmount: TransactionHistoryDecryptTokenAmount,\n): DopHistoryDecryptERC20Amount => {\n return {\n ...transactionHistoryTransferTokenAmountToDopERC20Amount(\n transactionHistoryDecryptTokenAmount,\n ),\n decryptFee: transactionHistoryDecryptTokenAmount.decryptFee,\n };\n};\n\nconst transactionHistoryTransferNFTToDopNFTAmount = (\n transactionHistoryNFT: TransactionHistoryTransferTokenAmount,\n): DopHistorySendNFTAmount => {\n return {\n ...transactionHistoryNFTToDopNFTAmount(transactionHistoryNFT),\n memoText: transactionHistoryNFT.memoText,\n walletSource: transactionHistoryNFT.walletSource,\n recipientAddress: transactionHistoryNFT.recipientAddress,\n };\n};\n\nconst transactionHistoryDecryptNFTToDopNFTAmount = (\n transactionHistoryNFT: TransactionHistoryDecryptTokenAmount,\n): DopHistoryDecryptNFTAmount => {\n return {\n ...transactionHistoryTransferNFTToDopNFTAmount(transactionHistoryNFT),\n decryptFee: transactionHistoryNFT.decryptFee,\n };\n};\n\nconst transactionHistoryTokenAmountToDopERC20Amount = (\n transactionHistoryTokenAmount: TransactionHistoryTokenAmount,\n): DopHistoryERC20Amount => {\n return {\n tokenAddress: parseDopTokenAddress(\n transactionHistoryTokenAmount.tokenData.tokenAddress,\n ).toLowerCase(),\n amount: transactionHistoryTokenAmount.amount,\n };\n};\n\nconst transactionHistoryNFTToDopNFTAmount = (\n transactionHistoryNFT: TransactionHistoryTokenAmount,\n): DopHistoryNFTAmount => {\n return {\n nftAddress: parseDopTokenAddress(\n transactionHistoryNFT.tokenData.tokenAddress,\n ).toLowerCase(),\n nftTokenType: transactionHistoryNFT.tokenData.tokenType as 1 | 2,\n tokenSubID: transactionHistoryNFT.tokenData.tokenSubID,\n amount: transactionHistoryNFT.amount,\n };\n};\n\nconst filterERC20 = (tokenAmount: TransactionHistoryTokenAmount) => {\n return tokenAmount.tokenData.tokenType === TokenType.ERC20;\n};\n\nconst filterNFT = (tokenAmount: TransactionHistoryTokenAmount) => {\n switch (tokenAmount.tokenData.tokenType) {\n case TokenType.ERC20:\n return false;\n case TokenType.ERC721:\n case TokenType.ERC1155:\n return tokenAmount.amount > BigInt(0);\n }\n};\n\nconst receiveERC20AmountsHaveEncryptFee = (\n receiveERC20Amounts: DopHistoryReceiveERC20Amount[],\n): boolean => {\n return receiveERC20Amounts.find(amount => amount.encryptFee) != null;\n};\n\nexport const categoryForTransactionHistoryItem = (\n historyItem: TransactionHistoryItem,\n): TransactionHistoryItemCategory => {\n const hasTransferNFTs = historyItem.transferNFTAmounts.length > 0;\n const hasReceiveNFTs = historyItem.receiveNFTAmounts.length > 0;\n const hasDecryptNFTs = historyItem.decryptNFTAmounts.length > 0;\n if (hasTransferNFTs || hasReceiveNFTs || hasDecryptNFTs) {\n // Some kind of NFT Transfer. Unhandled case.\n return TransactionHistoryItemCategory.Unknown;\n }\n\n const hasTransferERC20s = historyItem.transferERC20Amounts.length > 0;\n const hasReceiveERC20s = historyItem.receiveERC20Amounts.length > 0;\n const hasDecryptERC20s = historyItem.decryptERC20Amounts.length > 0;\n\n if (hasTransferERC20s && !hasReceiveERC20s && !hasDecryptERC20s) {\n // Only transfer erc20s.\n return TransactionHistoryItemCategory.TransferSendERC20s;\n }\n\n if (!hasTransferERC20s && hasReceiveERC20s && !hasDecryptERC20s) {\n // Only receive erc20s.\n const hasEncryptFee = receiveERC20AmountsHaveEncryptFee(\n historyItem.receiveERC20Amounts,\n );\n if (hasEncryptFee) {\n // Note: Encrypt fees were added to contract events in Mar 2023.\n // Prior encrypts will show as TransferReceiveERC20s without fees.\n return TransactionHistoryItemCategory.EncryptERC20s;\n }\n return TransactionHistoryItemCategory.TransferReceiveERC20s;\n }\n\n if (!hasTransferERC20s && !hasReceiveERC20s && hasDecryptERC20s) {\n // Only decrypt erc20s.\n return TransactionHistoryItemCategory.DecryptERC20s;\n }\n\n return TransactionHistoryItemCategory.Unknown;\n};\n\nconst serializeTransactionHistory = (\n transactionHistory: TransactionHistoryEntry[],\n): TransactionHistoryItem[] => {\n const historyItemsUncategorized: TransactionHistoryItem[] =\n transactionHistory.map(historyEntry => ({\n txidVersion: historyEntry.txidVersion,\n txid: ByteUtils.formatToByteLength(historyEntry.txid, ByteLength.UINT_256, true),\n blockNumber: historyEntry.blockNumber,\n timestamp: historyEntry.timestamp,\n transferERC20Amounts: historyEntry.transferTokenAmounts\n .filter(filterERC20)\n .map(transactionHistoryTransferTokenAmountToDopERC20Amount),\n broadcasterFeeERC20Amount: undefined,\n changeERC20Amounts: historyEntry.changeTokenAmounts\n .filter(filterERC20)\n .map(transactionHistoryTokenAmountToDopERC20Amount),\n receiveERC20Amounts: historyEntry.receiveTokenAmounts\n .filter(filterERC20)\n .map(transactionHistoryReceiveTokenAmountToDopERC20Amount),\n decryptERC20Amounts: historyEntry.decryptTokenAmounts\n .filter(filterERC20)\n .map(transactionHistoryDecryptTokenAmountToDopERC20Amount),\n receiveNFTAmounts: historyEntry.receiveTokenAmounts\n .filter(filterNFT)\n .map(transactionHistoryReceiveNFTToDopNFTAmount),\n transferNFTAmounts: historyEntry.transferTokenAmounts\n .filter(filterNFT)\n .map(transactionHistoryTransferNFTToDopNFTAmount),\n decryptNFTAmounts: historyEntry.decryptTokenAmounts\n .filter(filterNFT)\n .map(transactionHistoryDecryptNFTToDopNFTAmount),\n version: historyEntry.version,\n category: TransactionHistoryItemCategory.Unknown,\n }));\n\n // Add category for items based on token types.\n return historyItemsUncategorized.map(historyItem => ({\n ...historyItem,\n category: categoryForTransactionHistoryItem(historyItem),\n }));\n};\n\nexport const getWalletTransactionHistory = async (\n chain: Chain,\n dopWalletID: string,\n startingBlock: Optional<number>,\n): Promise<TransactionHistoryItem[]> => {\n try {\n const wallet = walletForID(dopWalletID);\n const transactionHistory = await wallet.getTransactionHistory(\n chain,\n startingBlock,\n );\n return serializeTransactionHistory(transactionHistory);\n } catch (err) {\n reportAndSanitizeError(getWalletTransactionHistory.name, err);\n throw new Error('Could not load DOP wallet transaction history.', {\n cause: err,\n });\n }\n};"]}
|
|
1
|
+
{"version":3,"file":"transaction-history.js","sourceRoot":"","sources":["../../../../src/services/dop/history/transaction-history.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n TransactionHistoryTransferTokenAmount,\n TransactionHistoryTokenAmount,\n TransactionHistoryEntry,\n Chain,\n TransactionHistoryReceiveTokenAmount,\n TokenType,\n ByteLength,\n ByteUtils,\n TransactionHistoryDecryptTokenAmount,\n WalletBalanceBucket,\n} from 'dop-engine-v3';\nimport {\n TransactionHistoryItem,\n DopHistoryERC20Amount,\n DopHistorySendERC20Amount,\n DopHistoryReceiveERC20Amount,\n DopHistorySendNFTAmount,\n DopHistoryNFTAmount,\n DopHistoryReceiveNFTAmount,\n DopHistoryDecryptERC20Amount,\n DopHistoryDecryptNFTAmount,\n TransactionHistoryItemCategory,\n DopWalletBalanceBucket,\n} from 'dop-sharedmodels-v3';\nimport { parseDopTokenAddress } from '../util/bytes';\nimport { reportAndSanitizeError } from '../../../utils/error';\nimport { walletForID } from '../wallets/wallets';\n\nconst getDopBalanceBucketFromEngineBalanceBucket = (\n balanceBucket: WalletBalanceBucket,\n): DopWalletBalanceBucket => {\n switch (balanceBucket) {\n case WalletBalanceBucket.Spendable:\n return DopWalletBalanceBucket.Spendable;\n case WalletBalanceBucket.EncryptBlocked:\n return DopWalletBalanceBucket.EncryptBlocked;\n case WalletBalanceBucket.EncryptPending:\n return DopWalletBalanceBucket.EncryptPending;\n case WalletBalanceBucket.ProofSubmitted:\n return DopWalletBalanceBucket.ProofSubmitted;\n case WalletBalanceBucket.Spent:\n return DopWalletBalanceBucket.Spent;\n default:\n return DopWalletBalanceBucket.Spendable;\n }\n throw new Error('Unrecognized WalletBalanceBucket');\n};\n\nconst transactionHistoryReceiveTokenAmountToDopERC20Amount = (\n transactionHistoryReceiveTokenAmount: TransactionHistoryReceiveTokenAmount,\n): DopHistoryReceiveERC20Amount => {\n return {\n ...transactionHistoryTokenAmountToDopERC20Amount(\n transactionHistoryReceiveTokenAmount,\n ),\n memoText: transactionHistoryReceiveTokenAmount.memoText,\n senderAddress: transactionHistoryReceiveTokenAmount.senderAddress,\n encryptFee: transactionHistoryReceiveTokenAmount.encryptFee,\n balanceBucket: getDopBalanceBucketFromEngineBalanceBucket(\n transactionHistoryReceiveTokenAmount.balanceBucket,\n ),\n };\n};\n\nconst transactionHistoryReceiveNFTToDopNFTAmount = (\n transactionHistoryReceiveTokenAmount: TransactionHistoryReceiveTokenAmount,\n): DopHistoryReceiveNFTAmount => {\n return {\n ...transactionHistoryNFTToDopNFTAmount(\n transactionHistoryReceiveTokenAmount,\n ),\n memoText: transactionHistoryReceiveTokenAmount.memoText,\n senderAddress: transactionHistoryReceiveTokenAmount.senderAddress,\n encryptFee: transactionHistoryReceiveTokenAmount.encryptFee,\n balanceBucket: getDopBalanceBucketFromEngineBalanceBucket(\n transactionHistoryReceiveTokenAmount.balanceBucket,\n ),\n };\n};\n\nconst transactionHistoryTransferTokenAmountToDopERC20Amount = (\n transactionHistoryTokenAmount: TransactionHistoryTransferTokenAmount,\n): DopHistorySendERC20Amount => {\n return {\n ...transactionHistoryTokenAmountToDopERC20Amount(\n transactionHistoryTokenAmount,\n ),\n recipientAddress: transactionHistoryTokenAmount.recipientAddress,\n memoText: transactionHistoryTokenAmount.memoText,\n walletSource: transactionHistoryTokenAmount.walletSource,\n };\n};\n\nconst transactionHistoryDecryptTokenAmountToDopERC20Amount = (\n transactionHistoryDecryptTokenAmount: TransactionHistoryDecryptTokenAmount,\n): DopHistoryDecryptERC20Amount => {\n return {\n ...transactionHistoryTransferTokenAmountToDopERC20Amount(\n transactionHistoryDecryptTokenAmount,\n ),\n decryptFee: transactionHistoryDecryptTokenAmount.decryptFee,\n };\n};\n\nconst transactionHistoryTransferNFTToDopNFTAmount = (\n transactionHistoryNFT: TransactionHistoryTransferTokenAmount,\n): DopHistorySendNFTAmount => {\n return {\n ...transactionHistoryNFTToDopNFTAmount(transactionHistoryNFT),\n memoText: transactionHistoryNFT.memoText,\n walletSource: transactionHistoryNFT.walletSource,\n recipientAddress: transactionHistoryNFT.recipientAddress,\n };\n};\n\nconst transactionHistoryDecryptNFTToDopNFTAmount = (\n transactionHistoryNFT: TransactionHistoryDecryptTokenAmount,\n): DopHistoryDecryptNFTAmount => {\n return {\n ...transactionHistoryTransferNFTToDopNFTAmount(transactionHistoryNFT),\n decryptFee: transactionHistoryNFT.decryptFee,\n };\n};\n\nconst transactionHistoryTokenAmountToDopERC20Amount = (\n transactionHistoryTokenAmount: TransactionHistoryTokenAmount,\n): DopHistoryERC20Amount => {\n return {\n tokenAddress: parseDopTokenAddress(\n transactionHistoryTokenAmount.tokenData.tokenAddress,\n ).toLowerCase(),\n amount: transactionHistoryTokenAmount.amount,\n };\n};\n\nconst transactionHistoryNFTToDopNFTAmount = (\n transactionHistoryNFT: TransactionHistoryTokenAmount,\n): DopHistoryNFTAmount => {\n return {\n nftAddress: parseDopTokenAddress(\n transactionHistoryNFT.tokenData.tokenAddress,\n ).toLowerCase(),\n nftTokenType: transactionHistoryNFT.tokenData.tokenType as 1 | 2,\n tokenSubID: transactionHistoryNFT.tokenData.tokenSubID,\n amount: transactionHistoryNFT.amount,\n };\n};\n\nconst filterERC20 = (tokenAmount: TransactionHistoryTokenAmount) => {\n return tokenAmount.tokenData.tokenType === TokenType.ERC20;\n};\n\nconst filterNFT = (tokenAmount: TransactionHistoryTokenAmount) => {\n switch (tokenAmount.tokenData.tokenType) {\n case TokenType.ERC20:\n return false;\n case TokenType.ERC721:\n case TokenType.ERC1155:\n return tokenAmount.amount > BigInt(0);\n }\n};\n\nconst receiveERC20AmountsHaveEncryptFee = (\n receiveERC20Amounts: DopHistoryReceiveERC20Amount[],\n): boolean => {\n return receiveERC20Amounts.find(amount => amount.encryptFee) != null;\n};\n\nexport const categoryForTransactionHistoryItem = (\n historyItem: TransactionHistoryItem,\n): TransactionHistoryItemCategory => {\n const hasTransferNFTs = historyItem.transferNFTAmounts.length > 0;\n const hasReceiveNFTs = historyItem.receiveNFTAmounts.length > 0;\n const hasDecryptNFTs = historyItem.decryptNFTAmounts.length > 0;\n if (hasTransferNFTs || hasReceiveNFTs || hasDecryptNFTs) {\n // Some kind of NFT Transfer. Unhandled case.\n return TransactionHistoryItemCategory.Unknown;\n }\n\n const hasTransferERC20s = historyItem.transferERC20Amounts.length > 0;\n const hasReceiveERC20s = historyItem.receiveERC20Amounts.length > 0;\n const hasDecryptERC20s = historyItem.decryptERC20Amounts.length > 0;\n\n if (hasTransferERC20s && !hasReceiveERC20s && !hasDecryptERC20s) {\n // Only transfer erc20s.\n return TransactionHistoryItemCategory.TransferSendERC20s;\n }\n\n if (!hasTransferERC20s && hasReceiveERC20s && !hasDecryptERC20s) {\n // Only receive erc20s.\n const hasEncryptFee = receiveERC20AmountsHaveEncryptFee(\n historyItem.receiveERC20Amounts,\n );\n if (hasEncryptFee) {\n // Note: Encrypt fees were added to contract events in Mar 2023.\n // Prior encrypts will show as TransferReceiveERC20s without fees.\n return TransactionHistoryItemCategory.EncryptERC20s;\n }\n return TransactionHistoryItemCategory.TransferReceiveERC20s;\n }\n\n if (!hasTransferERC20s && !hasReceiveERC20s && hasDecryptERC20s) {\n // Only decrypt erc20s.\n return TransactionHistoryItemCategory.DecryptERC20s;\n }\n\n return TransactionHistoryItemCategory.Unknown;\n};\n\nconst serializeTransactionHistory = (\n transactionHistory: TransactionHistoryEntry[],\n): TransactionHistoryItem[] => {\n const historyItemsUncategorized: TransactionHistoryItem[] =\n transactionHistory.map(historyEntry => ({\n txidVersion: historyEntry.txidVersion,\n txid: ByteUtils.formatToByteLength(historyEntry.txid, ByteLength.UINT_256, true),\n blockNumber: historyEntry.blockNumber,\n timestamp: historyEntry.timestamp,\n transferERC20Amounts: historyEntry.transferTokenAmounts\n .filter(filterERC20)\n .map(transactionHistoryTransferTokenAmountToDopERC20Amount),\n broadcasterFeeERC20Amount: undefined,\n changeERC20Amounts: historyEntry.changeTokenAmounts\n .filter(filterERC20)\n .map(transactionHistoryTokenAmountToDopERC20Amount),\n receiveERC20Amounts: historyEntry.receiveTokenAmounts\n .filter(filterERC20)\n .map(transactionHistoryReceiveTokenAmountToDopERC20Amount),\n decryptERC20Amounts: historyEntry.decryptTokenAmounts\n .filter(filterERC20)\n .map(transactionHistoryDecryptTokenAmountToDopERC20Amount),\n receiveNFTAmounts: historyEntry.receiveTokenAmounts\n .filter(filterNFT)\n .map(transactionHistoryReceiveNFTToDopNFTAmount),\n transferNFTAmounts: historyEntry.transferTokenAmounts\n .filter(filterNFT)\n .map(transactionHistoryTransferNFTToDopNFTAmount),\n decryptNFTAmounts: historyEntry.decryptTokenAmounts\n .filter(filterNFT)\n .map(transactionHistoryDecryptNFTToDopNFTAmount),\n version: historyEntry.version,\n category: TransactionHistoryItemCategory.Unknown,\n }));\n\n // Add category for items based on token types.\n return historyItemsUncategorized.map(historyItem => ({\n ...historyItem,\n category: categoryForTransactionHistoryItem(historyItem),\n }));\n};\n\nexport const getWalletTransactionHistory = async (\n chain: Chain,\n dopWalletID: string,\n startingBlock: Optional<number>,\n): Promise<TransactionHistoryItem[]> => {\n try {\n const wallet = walletForID(dopWalletID);\n const transactionHistory = await wallet.getTransactionHistory(\n chain,\n startingBlock,\n );\n return serializeTransactionHistory(transactionHistory);\n } catch (err) {\n reportAndSanitizeError(getWalletTransactionHistory.name, err);\n throw new Error('Could not load DOP wallet transaction history.', {\n cause: err,\n });\n }\n};"]}
|
|
@@ -19,4 +19,5 @@ __exportStar(require("./util"), exports);
|
|
|
19
19
|
__exportStar(require("./dop-txids"), exports);
|
|
20
20
|
__exportStar(require("./wallets"), exports);
|
|
21
21
|
__exportStar(require("./process"), exports);
|
|
22
|
+
__exportStar(require("./profile"), exports);
|
|
22
23
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/services/dop/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,yCAAuB;AACvB,yCAAuB;AACvB,8CAA4B;AAC5B,4CAA0B;AAC1B,4CAA0B","sourcesContent":["export * from './core';\nexport * from './util';\nexport * from './dop-txids';\nexport * from './wallets';\nexport * from './process';\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/services/dop/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,yCAAuB;AACvB,yCAAuB;AACvB,8CAA4B;AAC5B,4CAA0B;AAC1B,4CAA0B;AAC1B,4CAA0B","sourcesContent":["export * from './core';\nexport * from './util';\nexport * from './dop-txids';\nexport * from './wallets';\nexport * from './process';\nexport * from './profile';\n"]}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { Network, TXIDVersion } from 'dop-sharedmodels-
|
|
1
|
+
import { Network, TXIDVersion } from 'dop-sharedmodels-v3';
|
|
2
2
|
import { ContractTransaction } from 'ethers';
|
|
3
3
|
export declare const extractFirstNoteERC20AmountMapFromTransactionRequest: (dopWalletID: string, txidVersion: TXIDVersion, network: Network, transactionRequest: ContractTransaction, useRelayAdapt: boolean) => Promise<MapType<bigint>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extract-transaction-data.js","sourceRoot":"","sources":["../../../../src/services/dop/process/extract-transaction-data.ts"],"names":[],"mappings":";;;AAAA,iDAA2D;AAG3D,gDAAiD;AAE1C,MAAM,oDAAoD,GAAG,CAClE,WAAmB,EACnB,WAAwB,EACxB,OAAgB,EAChB,kBAAuC,EACvC,aAAsB,EACI,EAAE;IAC5B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAE5B,IAAI,eAAuB,CAAC;IAC5B,IAAI,aAAa,EAAE;QACjB,eAAe,GAAG,0CAA0B,CAAC,qBAAqB,CAChE,WAAW,EACX,KAAK,CACN,CAAC,OAAO,CAAC;KACX;SAAM;QACL,eAAe,GAAG,0CAA0B,CAAC,WAAW,CACtD,WAAW,EACX,KAAK,CACN,CAAC,OAAO,CAAC;KACX;IAED,MAAM,MAAM,GAAG,IAAA,qBAAW,EAAC,WAAW,CAAC,CAAC;IACxC,OAAO,MAAM,CAAC,8BAA8B,CAC1C,WAAW,EACX,KAAK,EACL,kBAAkB,EAClB,aAAa,EACb,eAAe,CAChB,CAAC;AACJ,CAAC,CAAC;AA9BW,QAAA,oDAAoD,wDA8B/D","sourcesContent":["import { DopVersionedSmartContracts } from 'dop-engine-
|
|
1
|
+
{"version":3,"file":"extract-transaction-data.js","sourceRoot":"","sources":["../../../../src/services/dop/process/extract-transaction-data.ts"],"names":[],"mappings":";;;AAAA,iDAA2D;AAG3D,gDAAiD;AAE1C,MAAM,oDAAoD,GAAG,CAClE,WAAmB,EACnB,WAAwB,EACxB,OAAgB,EAChB,kBAAuC,EACvC,aAAsB,EACI,EAAE;IAC5B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAE5B,IAAI,eAAuB,CAAC;IAC5B,IAAI,aAAa,EAAE;QACjB,eAAe,GAAG,0CAA0B,CAAC,qBAAqB,CAChE,WAAW,EACX,KAAK,CACN,CAAC,OAAO,CAAC;KACX;SAAM;QACL,eAAe,GAAG,0CAA0B,CAAC,WAAW,CACtD,WAAW,EACX,KAAK,CACN,CAAC,OAAO,CAAC;KACX;IAED,MAAM,MAAM,GAAG,IAAA,qBAAW,EAAC,WAAW,CAAC,CAAC;IACxC,OAAO,MAAM,CAAC,8BAA8B,CAC1C,WAAW,EACX,KAAK,EACL,kBAAkB,EAClB,aAAa,EACb,eAAe,CAChB,CAAC;AACJ,CAAC,CAAC;AA9BW,QAAA,oDAAoD,wDA8B/D","sourcesContent":["import { DopVersionedSmartContracts } from 'dop-engine-v3';\nimport { Network, TXIDVersion } from 'dop-sharedmodels-v3';\nimport { ContractTransaction } from 'ethers';\nimport { walletForID } from '../wallets/wallets';\n\nexport const extractFirstNoteERC20AmountMapFromTransactionRequest = (\n dopWalletID: string,\n txidVersion: TXIDVersion,\n network: Network,\n transactionRequest: ContractTransaction,\n useRelayAdapt: boolean,\n): Promise<MapType<bigint>> => {\n const chain = network.chain;\n\n let contractAddress: string;\n if (useRelayAdapt) {\n contractAddress = DopVersionedSmartContracts.getRelayAdaptContract(\n txidVersion,\n chain,\n ).address;\n } else {\n contractAddress = DopVersionedSmartContracts.getVerifier(\n txidVersion,\n chain,\n ).address;\n }\n\n const wallet = walletForID(dopWalletID);\n return wallet.extractFirstNoteERC20AmountMap(\n txidVersion,\n chain,\n transactionRequest,\n useRelayAdapt,\n contractAddress,\n );\n};\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const chai_1 = __importDefault(require("chai"));
|
|
7
|
+
const chai_as_promised_1 = __importDefault(require("chai-as-promised"));
|
|
8
|
+
const leveldown_1 = __importDefault(require("leveldown"));
|
|
9
|
+
const profile_manager_1 = require("../profile-manager");
|
|
10
|
+
const storage_1 = require("../storage");
|
|
11
|
+
const fs_1 = require("fs");
|
|
12
|
+
chai_1.default.use(chai_as_promised_1.default);
|
|
13
|
+
const { expect } = chai_1.default;
|
|
14
|
+
describe('ProfileManager', () => {
|
|
15
|
+
let profileManager;
|
|
16
|
+
let testStorage;
|
|
17
|
+
let db;
|
|
18
|
+
const testDbPath = 'test-profile-manager-db';
|
|
19
|
+
const mockWalletId = 'test-wallet-id';
|
|
20
|
+
const mockProfileData = {
|
|
21
|
+
username: 'testuser',
|
|
22
|
+
bio: 'Test bio',
|
|
23
|
+
profilePicture: 'https://example.com/avatar.jpg',
|
|
24
|
+
socialLinks: {
|
|
25
|
+
twitter: 'https://twitter.com/testuser',
|
|
26
|
+
github: 'https://github.com/testuser',
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
beforeEach(async () => {
|
|
30
|
+
db = new leveldown_1.default(testDbPath);
|
|
31
|
+
await new Promise((resolve, reject) => {
|
|
32
|
+
db.open((err) => {
|
|
33
|
+
if (err)
|
|
34
|
+
reject(err);
|
|
35
|
+
else
|
|
36
|
+
resolve();
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
testStorage = new storage_1.ProfileStorage(db);
|
|
40
|
+
profileManager = new profile_manager_1.ProfileManager();
|
|
41
|
+
profileManager.setStorage(testStorage);
|
|
42
|
+
});
|
|
43
|
+
afterEach(async () => {
|
|
44
|
+
await new Promise((resolve, reject) => {
|
|
45
|
+
db.close((err) => {
|
|
46
|
+
if (err)
|
|
47
|
+
reject(err);
|
|
48
|
+
else
|
|
49
|
+
resolve();
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
try {
|
|
53
|
+
(0, fs_1.rmSync)(testDbPath, { recursive: true });
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
// Ignore cleanup errors
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
describe('profile management', () => {
|
|
60
|
+
it('should create a new profile', async () => {
|
|
61
|
+
const result = await profileManager.createProfile(mockWalletId, mockProfileData);
|
|
62
|
+
expect(result.id).to.equal(mockWalletId);
|
|
63
|
+
expect(result.username).to.equal(mockProfileData.username);
|
|
64
|
+
expect(result.bio).to.equal(mockProfileData.bio);
|
|
65
|
+
});
|
|
66
|
+
it('should get profile by wallet ID', async () => {
|
|
67
|
+
await profileManager.createProfile(mockWalletId, mockProfileData);
|
|
68
|
+
const result = await profileManager.getProfile(mockWalletId);
|
|
69
|
+
expect(result).to.not.be.undefined;
|
|
70
|
+
if (result) {
|
|
71
|
+
expect(result.id).to.equal(mockWalletId);
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
it('should return undefined for non-existent profile', async () => {
|
|
75
|
+
const result = await profileManager.getProfile('non-existent-id');
|
|
76
|
+
expect(result).to.be.undefined;
|
|
77
|
+
});
|
|
78
|
+
it('should update profile', async () => {
|
|
79
|
+
await profileManager.createProfile(mockWalletId, mockProfileData);
|
|
80
|
+
const updates = {
|
|
81
|
+
bio: 'Updated bio',
|
|
82
|
+
};
|
|
83
|
+
const result = await profileManager.updateProfile(mockWalletId, updates);
|
|
84
|
+
expect(result.bio).to.equal(updates.bio);
|
|
85
|
+
expect(result.username).to.equal(mockProfileData.username); // unchanged
|
|
86
|
+
});
|
|
87
|
+
it('should delete profile', async () => {
|
|
88
|
+
await profileManager.createProfile(mockWalletId, mockProfileData);
|
|
89
|
+
await profileManager.deleteProfile(mockWalletId);
|
|
90
|
+
const deletedProfile = await profileManager.getProfile(mockWalletId);
|
|
91
|
+
expect(deletedProfile).to.be.undefined;
|
|
92
|
+
});
|
|
93
|
+
it('should throw error when deleting non-existent profile', async () => {
|
|
94
|
+
await expect(profileManager.deleteProfile('non-existent-id'))
|
|
95
|
+
.to.be.rejectedWith('Profile not found');
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
describe('profile customization', () => {
|
|
99
|
+
it('should set profile customization', async () => {
|
|
100
|
+
// Create a profile first
|
|
101
|
+
await profileManager.createProfile(mockWalletId, mockProfileData);
|
|
102
|
+
const customization = {
|
|
103
|
+
theme: 'dark',
|
|
104
|
+
displayPreferences: {
|
|
105
|
+
currencyFormat: 'USD',
|
|
106
|
+
numberFormat: 'full',
|
|
107
|
+
dateFormat: 'MM/DD/YYYY',
|
|
108
|
+
timeFormat: '12h',
|
|
109
|
+
},
|
|
110
|
+
privacyAlerts: {
|
|
111
|
+
newViewingRequest: true,
|
|
112
|
+
profileUpdate: false,
|
|
113
|
+
assetVisibilityChange: true,
|
|
114
|
+
},
|
|
115
|
+
};
|
|
116
|
+
await profileManager.setCustomization(mockWalletId, customization);
|
|
117
|
+
const result = await profileManager.getCustomization(mockWalletId);
|
|
118
|
+
expect(result).to.deep.equal(customization);
|
|
119
|
+
});
|
|
120
|
+
it('should return undefined for non-existent customization', async () => {
|
|
121
|
+
const result = await profileManager.getCustomization('non-existent-id');
|
|
122
|
+
expect(result).to.be.undefined;
|
|
123
|
+
});
|
|
124
|
+
it('should throw error when setting customization for non-existent profile', async () => {
|
|
125
|
+
const customization = {
|
|
126
|
+
theme: 'dark',
|
|
127
|
+
displayPreferences: {
|
|
128
|
+
currencyFormat: 'USD',
|
|
129
|
+
numberFormat: 'full',
|
|
130
|
+
dateFormat: 'MM/DD/YYYY',
|
|
131
|
+
timeFormat: '12h',
|
|
132
|
+
},
|
|
133
|
+
privacyAlerts: {
|
|
134
|
+
newViewingRequest: true,
|
|
135
|
+
profileUpdate: false,
|
|
136
|
+
assetVisibilityChange: true,
|
|
137
|
+
},
|
|
138
|
+
};
|
|
139
|
+
await expect(profileManager.setCustomization('non-existent-id', customization))
|
|
140
|
+
.to.be.rejectedWith('Profile not found');
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
describe('validation', () => {
|
|
144
|
+
it('should throw error for invalid username', async () => {
|
|
145
|
+
const invalidProfile = {
|
|
146
|
+
...mockProfileData,
|
|
147
|
+
username: '', // empty username
|
|
148
|
+
};
|
|
149
|
+
await expect(profileManager.createProfile(mockWalletId, invalidProfile))
|
|
150
|
+
.to.be.rejectedWith('Invalid username');
|
|
151
|
+
});
|
|
152
|
+
it('should throw error for invalid bio', async () => {
|
|
153
|
+
const invalidProfile = {
|
|
154
|
+
...mockProfileData,
|
|
155
|
+
bio: 'a'.repeat(501), // too long
|
|
156
|
+
};
|
|
157
|
+
await expect(profileManager.createProfile(mockWalletId, invalidProfile))
|
|
158
|
+
.to.be.rejectedWith('Bio too long');
|
|
159
|
+
});
|
|
160
|
+
it('should throw error for invalid profile picture URL', async () => {
|
|
161
|
+
const invalidProfile = {
|
|
162
|
+
...mockProfileData,
|
|
163
|
+
profilePicture: 'not-a-url',
|
|
164
|
+
};
|
|
165
|
+
await expect(profileManager.createProfile(mockWalletId, invalidProfile))
|
|
166
|
+
.to.be.rejectedWith('Invalid profile picture URL');
|
|
167
|
+
});
|
|
168
|
+
});
|
|
169
|
+
});
|
|
170
|
+
//# sourceMappingURL=profile-manager.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile-manager.test.js","sourceRoot":"","sources":["../../../../../src/services/dop/profile/__tests__/profile-manager.test.ts"],"names":[],"mappings":"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","sourcesContent":["import chai from 'chai';\nimport chaiAsPromised from 'chai-as-promised';\nimport LevelDOWN from 'leveldown';\nimport { ProfileManager } from '../profile-manager';\nimport { UserProfile, ProfileCustomization } from '../types';\nimport { ProfileStorage } from '../storage';\nimport { rmSync } from 'fs';\nimport type { AbstractLevelDOWN } from 'abstract-leveldown';\n\nchai.use(chaiAsPromised);\nconst { expect } = chai;\n\ndescribe('ProfileManager', () => {\n let profileManager: ProfileManager;\n let testStorage: ProfileStorage;\n let db: AbstractLevelDOWN;\n const testDbPath = 'test-profile-manager-db';\n const mockWalletId = 'test-wallet-id';\n const mockProfileData: Partial<UserProfile> = {\n username: 'testuser',\n bio: 'Test bio',\n profilePicture: 'https://example.com/avatar.jpg',\n socialLinks: {\n twitter: 'https://twitter.com/testuser',\n github: 'https://github.com/testuser',\n },\n };\n\n beforeEach(async () => {\n db = new LevelDOWN(testDbPath);\n await new Promise<void>((resolve, reject) => {\n db.open((err) => {\n if (err) reject(err);\n else resolve();\n });\n });\n \n testStorage = new ProfileStorage(db);\n profileManager = new ProfileManager();\n profileManager.setStorage(testStorage);\n });\n\n afterEach(async () => {\n await new Promise<void>((resolve, reject) => {\n db.close((err) => {\n if (err) reject(err);\n else resolve();\n });\n });\n \n try {\n rmSync(testDbPath, { recursive: true });\n } catch (error) {\n // Ignore cleanup errors\n }\n });\n\n describe('profile management', () => {\n it('should create a new profile', async () => {\n const result = await profileManager.createProfile(mockWalletId, mockProfileData);\n expect(result.id).to.equal(mockWalletId);\n expect(result.username).to.equal(mockProfileData.username);\n expect(result.bio).to.equal(mockProfileData.bio);\n });\n\n it('should get profile by wallet ID', async () => {\n await profileManager.createProfile(mockWalletId, mockProfileData);\n const result = await profileManager.getProfile(mockWalletId);\n expect(result).to.not.be.undefined;\n if (result) {\n expect(result.id).to.equal(mockWalletId);\n }\n });\n\n it('should return undefined for non-existent profile', async () => {\n const result = await profileManager.getProfile('non-existent-id');\n expect(result).to.be.undefined;\n });\n\n it('should update profile', async () => {\n await profileManager.createProfile(mockWalletId, mockProfileData);\n const updates = {\n bio: 'Updated bio',\n };\n \n const result = await profileManager.updateProfile(mockWalletId, updates);\n expect(result.bio).to.equal(updates.bio);\n expect(result.username).to.equal(mockProfileData.username); // unchanged\n });\n\n it('should delete profile', async () => {\n await profileManager.createProfile(mockWalletId, mockProfileData);\n await profileManager.deleteProfile(mockWalletId);\n \n const deletedProfile = await profileManager.getProfile(mockWalletId);\n expect(deletedProfile).to.be.undefined;\n });\n\n it('should throw error when deleting non-existent profile', async () => {\n await expect(profileManager.deleteProfile('non-existent-id'))\n .to.be.rejectedWith('Profile not found');\n });\n });\n\n describe('profile customization', () => {\n it('should set profile customization', async () => {\n // Create a profile first\n await profileManager.createProfile(mockWalletId, mockProfileData);\n\n const customization: ProfileCustomization = {\n theme: 'dark',\n displayPreferences: {\n currencyFormat: 'USD',\n numberFormat: 'full',\n dateFormat: 'MM/DD/YYYY',\n timeFormat: '12h',\n },\n privacyAlerts: {\n newViewingRequest: true,\n profileUpdate: false,\n assetVisibilityChange: true,\n },\n };\n\n await profileManager.setCustomization(mockWalletId, customization);\n const result = await profileManager.getCustomization(mockWalletId);\n expect(result).to.deep.equal(customization);\n });\n\n it('should return undefined for non-existent customization', async () => {\n const result = await profileManager.getCustomization('non-existent-id');\n expect(result).to.be.undefined;\n });\n\n it('should throw error when setting customization for non-existent profile', async () => {\n const customization: ProfileCustomization = {\n theme: 'dark',\n displayPreferences: {\n currencyFormat: 'USD',\n numberFormat: 'full',\n dateFormat: 'MM/DD/YYYY',\n timeFormat: '12h',\n },\n privacyAlerts: {\n newViewingRequest: true,\n profileUpdate: false,\n assetVisibilityChange: true,\n },\n };\n\n await expect(profileManager.setCustomization('non-existent-id', customization))\n .to.be.rejectedWith('Profile not found');\n });\n });\n\n describe('validation', () => {\n it('should throw error for invalid username', async () => {\n const invalidProfile = {\n ...mockProfileData,\n username: '', // empty username\n };\n\n await expect(profileManager.createProfile(mockWalletId, invalidProfile))\n .to.be.rejectedWith('Invalid username');\n });\n\n it('should throw error for invalid bio', async () => {\n const invalidProfile = {\n ...mockProfileData,\n bio: 'a'.repeat(501), // too long\n };\n\n await expect(profileManager.createProfile(mockWalletId, invalidProfile))\n .to.be.rejectedWith('Bio too long');\n });\n\n it('should throw error for invalid profile picture URL', async () => {\n const invalidProfile = {\n ...mockProfileData,\n profilePicture: 'not-a-url',\n };\n\n await expect(profileManager.createProfile(mockWalletId, invalidProfile))\n .to.be.rejectedWith('Invalid profile picture URL');\n });\n });\n});\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
|
+
};
|
|
28
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
+
const chai_1 = __importDefault(require("chai"));
|
|
30
|
+
const chai_as_promised_1 = __importDefault(require("chai-as-promised"));
|
|
31
|
+
const sinon_1 = __importDefault(require("sinon"));
|
|
32
|
+
const leveldown_1 = __importDefault(require("leveldown"));
|
|
33
|
+
const selective_transparency_1 = require("../selective-transparency");
|
|
34
|
+
const wallets = __importStar(require("../../wallets/wallets"));
|
|
35
|
+
const storage_1 = require("../storage");
|
|
36
|
+
const fs_1 = require("fs");
|
|
37
|
+
chai_1.default.use(chai_as_promised_1.default);
|
|
38
|
+
const { expect } = chai_1.default;
|
|
39
|
+
describe('SelectiveTransparencyManager', () => {
|
|
40
|
+
let transparencyManager;
|
|
41
|
+
let testStorage;
|
|
42
|
+
let db;
|
|
43
|
+
const testDbPath = 'test-selective-transparency-db';
|
|
44
|
+
const mockWalletId = 'test-wallet-id';
|
|
45
|
+
const mockRequesterId = 'test-requester-id';
|
|
46
|
+
beforeEach(async () => {
|
|
47
|
+
db = new leveldown_1.default(testDbPath);
|
|
48
|
+
await new Promise((resolve, reject) => {
|
|
49
|
+
db.open((err) => {
|
|
50
|
+
if (err)
|
|
51
|
+
reject(err);
|
|
52
|
+
else
|
|
53
|
+
resolve();
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
testStorage = new storage_1.ProfileStorage(db);
|
|
57
|
+
transparencyManager = new selective_transparency_1.SelectiveTransparencyManager();
|
|
58
|
+
transparencyManager.setStorage(testStorage);
|
|
59
|
+
sinon_1.default.stub(wallets, 'walletForID').returns({});
|
|
60
|
+
});
|
|
61
|
+
afterEach(async () => {
|
|
62
|
+
sinon_1.default.restore();
|
|
63
|
+
await new Promise((resolve, reject) => {
|
|
64
|
+
db.close((err) => {
|
|
65
|
+
if (err)
|
|
66
|
+
reject(err);
|
|
67
|
+
else
|
|
68
|
+
resolve();
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
try {
|
|
72
|
+
(0, fs_1.rmSync)(testDbPath, { recursive: true });
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
// Ignore cleanup errors
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
describe('settings management', () => {
|
|
79
|
+
it('should create default settings', async () => {
|
|
80
|
+
const result = await transparencyManager.createDefaultSettings(mockWalletId);
|
|
81
|
+
expect(result.id).to.equal(mockWalletId);
|
|
82
|
+
expect(result.walletId).to.equal(mockWalletId);
|
|
83
|
+
expect(result.assetVisibility.showTokenBalances).to.be.true;
|
|
84
|
+
expect(result.assetVisibility.showNFTs).to.be.true;
|
|
85
|
+
expect(result.assetVisibility.showTransactionHistory).to.be.false;
|
|
86
|
+
});
|
|
87
|
+
it('should get settings', async () => {
|
|
88
|
+
await transparencyManager.createDefaultSettings(mockWalletId);
|
|
89
|
+
const result = await transparencyManager.getSettings(mockWalletId);
|
|
90
|
+
expect(result).to.not.be.undefined;
|
|
91
|
+
if (result) {
|
|
92
|
+
expect(result.walletId).to.equal(mockWalletId);
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
it('should update settings', async () => {
|
|
96
|
+
await transparencyManager.createDefaultSettings(mockWalletId);
|
|
97
|
+
const updates = {
|
|
98
|
+
assetVisibility: {
|
|
99
|
+
showTokenBalances: false,
|
|
100
|
+
showNFTs: true,
|
|
101
|
+
showTransactionHistory: true,
|
|
102
|
+
showAddresses: true,
|
|
103
|
+
},
|
|
104
|
+
};
|
|
105
|
+
const result = await transparencyManager.updateSettings(mockWalletId, updates);
|
|
106
|
+
expect(result.assetVisibility.showTokenBalances).to.be.false;
|
|
107
|
+
expect(result.assetVisibility.showTransactionHistory).to.be.true;
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
describe('token visibility management', () => {
|
|
111
|
+
beforeEach(async () => {
|
|
112
|
+
await transparencyManager.createDefaultSettings(mockWalletId);
|
|
113
|
+
});
|
|
114
|
+
it('should set token visibility', async () => {
|
|
115
|
+
const tokenAddress = '0x1234567890123456789012345678901234567890';
|
|
116
|
+
const visibility = {
|
|
117
|
+
isVisible: true,
|
|
118
|
+
showBalance: true,
|
|
119
|
+
showTransactions: false,
|
|
120
|
+
};
|
|
121
|
+
await transparencyManager.setTokenVisibility(mockWalletId, tokenAddress, visibility);
|
|
122
|
+
const result = await transparencyManager.getTokenVisibility(mockWalletId, tokenAddress);
|
|
123
|
+
expect(result).to.deep.equal(visibility);
|
|
124
|
+
});
|
|
125
|
+
it('should return default visibility for unknown token', async () => {
|
|
126
|
+
const tokenAddress = '0x1234567890123456789012345678901234567890';
|
|
127
|
+
const result = await transparencyManager.getTokenVisibility(mockWalletId, tokenAddress);
|
|
128
|
+
expect(result.isVisible).to.be.true; // default from settings
|
|
129
|
+
expect(result.showBalance).to.be.true;
|
|
130
|
+
expect(result.showTransactions).to.be.false;
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
describe('NFT visibility management', () => {
|
|
134
|
+
beforeEach(async () => {
|
|
135
|
+
await transparencyManager.createDefaultSettings(mockWalletId);
|
|
136
|
+
});
|
|
137
|
+
it('should set NFT visibility', async () => {
|
|
138
|
+
const nftAddress = '0x1234567890123456789012345678901234567890';
|
|
139
|
+
const visibility = {
|
|
140
|
+
isVisible: true,
|
|
141
|
+
showCollection: true,
|
|
142
|
+
showTransactions: false,
|
|
143
|
+
};
|
|
144
|
+
await transparencyManager.setNFTVisibility(mockWalletId, nftAddress, visibility);
|
|
145
|
+
const result = await transparencyManager.getNFTVisibility(mockWalletId, nftAddress);
|
|
146
|
+
expect(result).to.deep.equal(visibility);
|
|
147
|
+
});
|
|
148
|
+
it('should return default visibility for unknown NFT', async () => {
|
|
149
|
+
const nftAddress = '0x1234567890123456789012345678901234567890';
|
|
150
|
+
const result = await transparencyManager.getNFTVisibility(mockWalletId, nftAddress);
|
|
151
|
+
expect(result.isVisible).to.be.true; // default from settings
|
|
152
|
+
expect(result.showCollection).to.be.true;
|
|
153
|
+
expect(result.showTransactions).to.be.false;
|
|
154
|
+
});
|
|
155
|
+
});
|
|
156
|
+
describe('whitelist management', () => {
|
|
157
|
+
beforeEach(async () => {
|
|
158
|
+
await transparencyManager.createDefaultSettings(mockWalletId);
|
|
159
|
+
});
|
|
160
|
+
it('should add address to whitelist', async () => {
|
|
161
|
+
const address = '0x1234567890123456789012345678901234567890';
|
|
162
|
+
const permissions = {
|
|
163
|
+
viewBalances: true,
|
|
164
|
+
viewNFTs: true,
|
|
165
|
+
viewTransactions: false,
|
|
166
|
+
viewProfile: true,
|
|
167
|
+
};
|
|
168
|
+
await transparencyManager.addToWhitelist(mockWalletId, address, permissions);
|
|
169
|
+
const canViewBalances = await transparencyManager.checkWhitelistPermission(mockWalletId, address, 'viewBalances');
|
|
170
|
+
expect(canViewBalances).to.be.true;
|
|
171
|
+
const canViewTransactions = await transparencyManager.checkWhitelistPermission(mockWalletId, address, 'viewTransactions');
|
|
172
|
+
expect(canViewTransactions).to.be.false;
|
|
173
|
+
});
|
|
174
|
+
it('should remove address from whitelist', async () => {
|
|
175
|
+
const address = '0x1234567890123456789012345678901234567890';
|
|
176
|
+
const permissions = {
|
|
177
|
+
viewBalances: true,
|
|
178
|
+
viewNFTs: true,
|
|
179
|
+
viewTransactions: false,
|
|
180
|
+
viewProfile: true,
|
|
181
|
+
};
|
|
182
|
+
await transparencyManager.addToWhitelist(mockWalletId, address, permissions);
|
|
183
|
+
await transparencyManager.removeFromWhitelist(mockWalletId, address);
|
|
184
|
+
const canViewBalances = await transparencyManager.checkWhitelistPermission(mockWalletId, address, 'viewBalances');
|
|
185
|
+
expect(canViewBalances).to.be.false;
|
|
186
|
+
});
|
|
187
|
+
it('should return false for non-whitelisted address', async () => {
|
|
188
|
+
const address = '0x1234567890123456789012345678901234567890';
|
|
189
|
+
const canViewBalances = await transparencyManager.checkWhitelistPermission(mockWalletId, address, 'viewBalances');
|
|
190
|
+
expect(canViewBalances).to.be.false;
|
|
191
|
+
});
|
|
192
|
+
});
|
|
193
|
+
describe('viewing requests', () => {
|
|
194
|
+
beforeEach(async () => {
|
|
195
|
+
await transparencyManager.createDefaultSettings(mockWalletId);
|
|
196
|
+
});
|
|
197
|
+
it('should create viewing request', async () => {
|
|
198
|
+
const result = await transparencyManager.createViewingRequest(mockRequesterId, mockWalletId, 'balance', undefined, 'Can I see your balance?');
|
|
199
|
+
expect(result.requesterId).to.equal(mockRequesterId);
|
|
200
|
+
expect(result.walletId).to.equal(mockWalletId);
|
|
201
|
+
expect(result.requestType).to.equal('balance');
|
|
202
|
+
expect(result.message).to.equal('Can I see your balance?');
|
|
203
|
+
expect(result.status).to.equal('pending');
|
|
204
|
+
});
|
|
205
|
+
it('should approve viewing request', async () => {
|
|
206
|
+
const request = await transparencyManager.createViewingRequest(mockRequesterId, mockWalletId, 'balance');
|
|
207
|
+
const result = await transparencyManager.respondToViewingRequest(request.id, 'approved');
|
|
208
|
+
expect(result.status).to.equal('approved');
|
|
209
|
+
});
|
|
210
|
+
it('should reject viewing request', async () => {
|
|
211
|
+
const request = await transparencyManager.createViewingRequest(mockRequesterId, mockWalletId, 'balance');
|
|
212
|
+
const result = await transparencyManager.respondToViewingRequest(request.id, 'rejected');
|
|
213
|
+
expect(result.status).to.equal('rejected');
|
|
214
|
+
});
|
|
215
|
+
it('should get viewing requests for wallet', async () => {
|
|
216
|
+
await transparencyManager.createViewingRequest(mockRequesterId, mockWalletId, 'balance');
|
|
217
|
+
const results = await transparencyManager.getViewingRequests(mockWalletId);
|
|
218
|
+
expect(results.length).to.equal(1);
|
|
219
|
+
expect(results[0].walletId).to.equal(mockWalletId);
|
|
220
|
+
});
|
|
221
|
+
});
|
|
222
|
+
describe('visibility proofs', () => {
|
|
223
|
+
beforeEach(async () => {
|
|
224
|
+
await transparencyManager.createDefaultSettings(mockWalletId);
|
|
225
|
+
// Add requester to whitelist
|
|
226
|
+
await transparencyManager.addToWhitelist(mockWalletId, mockRequesterId, {
|
|
227
|
+
viewBalances: true,
|
|
228
|
+
viewNFTs: true,
|
|
229
|
+
viewTransactions: true,
|
|
230
|
+
viewProfile: true,
|
|
231
|
+
});
|
|
232
|
+
});
|
|
233
|
+
it('should generate visibility proof for authorized requester', async () => {
|
|
234
|
+
const result = await transparencyManager.generateVisibilityProof(mockWalletId, mockRequesterId, 'balance');
|
|
235
|
+
expect(result.walletId).to.equal(mockWalletId);
|
|
236
|
+
expect(result.requesterId).to.equal(mockRequesterId);
|
|
237
|
+
expect(result.proofType).to.equal('balance');
|
|
238
|
+
expect(result.isValid).to.be.true;
|
|
239
|
+
expect(result.proof).to.be.a('string');
|
|
240
|
+
});
|
|
241
|
+
it('should throw error for unauthorized requester', async () => {
|
|
242
|
+
const unauthorizedRequester = 'unauthorized-requester';
|
|
243
|
+
await expect(transparencyManager.generateVisibilityProof(mockWalletId, unauthorizedRequester, 'balance')).to.be.rejectedWith('Insufficient permissions');
|
|
244
|
+
});
|
|
245
|
+
it('should verify valid proof', async () => {
|
|
246
|
+
const proof = await transparencyManager.generateVisibilityProof(mockWalletId, mockRequesterId, 'balance');
|
|
247
|
+
const isValid = await transparencyManager.verifyVisibilityProof(proof.id);
|
|
248
|
+
expect(isValid).to.be.true;
|
|
249
|
+
});
|
|
250
|
+
it('should return false for non-existent proof', async () => {
|
|
251
|
+
const isValid = await transparencyManager.verifyVisibilityProof('non-existent-proof');
|
|
252
|
+
expect(isValid).to.be.false;
|
|
253
|
+
});
|
|
254
|
+
});
|
|
255
|
+
});
|
|
256
|
+
//# sourceMappingURL=selective-transparency.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selective-transparency.test.js","sourceRoot":"","sources":["../../../../../src/services/dop/profile/__tests__/selective-transparency.test.ts"],"names":[],"mappings":"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","sourcesContent":["import chai from 'chai';\nimport chaiAsPromised from 'chai-as-promised';\nimport Sinon from 'sinon';\nimport LevelDOWN from 'leveldown';\nimport { SelectiveTransparencyManager } from '../selective-transparency';\nimport * as wallets from '../../wallets/wallets';\nimport { ProfileStorage } from '../storage';\nimport { rmSync } from 'fs';\nimport type { AbstractLevelDOWN } from 'abstract-leveldown';\n\nchai.use(chaiAsPromised);\nconst { expect } = chai;\n\ndescribe('SelectiveTransparencyManager', () => {\n let transparencyManager: SelectiveTransparencyManager;\n let testStorage: ProfileStorage;\n let db: AbstractLevelDOWN;\n const testDbPath = 'test-selective-transparency-db';\n const mockWalletId = 'test-wallet-id';\n const mockRequesterId = 'test-requester-id';\n\n beforeEach(async () => {\n db = new LevelDOWN(testDbPath);\n await new Promise<void>((resolve, reject) => {\n db.open((err) => {\n if (err) reject(err);\n else resolve();\n });\n });\n \n testStorage = new ProfileStorage(db);\n transparencyManager = new SelectiveTransparencyManager();\n transparencyManager.setStorage(testStorage);\n Sinon.stub(wallets, 'walletForID').returns({} as any);\n });\n\n afterEach(async () => {\n Sinon.restore();\n await new Promise<void>((resolve, reject) => {\n db.close((err) => {\n if (err) reject(err);\n else resolve();\n });\n });\n \n try {\n rmSync(testDbPath, { recursive: true });\n } catch (error) {\n // Ignore cleanup errors\n }\n });\n\n describe('settings management', () => {\n it('should create default settings', async () => {\n const result = await transparencyManager.createDefaultSettings(mockWalletId);\n expect(result.id).to.equal(mockWalletId);\n expect(result.walletId).to.equal(mockWalletId);\n expect(result.assetVisibility.showTokenBalances).to.be.true;\n expect(result.assetVisibility.showNFTs).to.be.true;\n expect(result.assetVisibility.showTransactionHistory).to.be.false;\n });\n\n it('should get settings', async () => {\n await transparencyManager.createDefaultSettings(mockWalletId);\n const result = await transparencyManager.getSettings(mockWalletId);\n expect(result).to.not.be.undefined;\n if (result) {\n expect(result.walletId).to.equal(mockWalletId);\n }\n });\n\n it('should update settings', async () => {\n await transparencyManager.createDefaultSettings(mockWalletId);\n const updates = {\n assetVisibility: {\n showTokenBalances: false,\n showNFTs: true,\n showTransactionHistory: true,\n showAddresses: true,\n },\n };\n\n const result = await transparencyManager.updateSettings(mockWalletId, updates);\n expect(result.assetVisibility.showTokenBalances).to.be.false;\n expect(result.assetVisibility.showTransactionHistory).to.be.true;\n });\n });\n\n describe('token visibility management', () => {\n beforeEach(async () => {\n await transparencyManager.createDefaultSettings(mockWalletId);\n });\n\n it('should set token visibility', async () => {\n const tokenAddress = '0x1234567890123456789012345678901234567890';\n const visibility = {\n isVisible: true,\n showBalance: true,\n showTransactions: false,\n };\n\n await transparencyManager.setTokenVisibility(mockWalletId, tokenAddress, visibility);\n const result = await transparencyManager.getTokenVisibility(mockWalletId, tokenAddress);\n expect(result).to.deep.equal(visibility);\n });\n\n it('should return default visibility for unknown token', async () => {\n const tokenAddress = '0x1234567890123456789012345678901234567890';\n const result = await transparencyManager.getTokenVisibility(mockWalletId, tokenAddress);\n expect(result.isVisible).to.be.true; // default from settings\n expect(result.showBalance).to.be.true;\n expect(result.showTransactions).to.be.false;\n });\n });\n\n describe('NFT visibility management', () => {\n beforeEach(async () => {\n await transparencyManager.createDefaultSettings(mockWalletId);\n });\n\n it('should set NFT visibility', async () => {\n const nftAddress = '0x1234567890123456789012345678901234567890';\n const visibility = {\n isVisible: true,\n showCollection: true,\n showTransactions: false,\n };\n\n await transparencyManager.setNFTVisibility(mockWalletId, nftAddress, visibility);\n const result = await transparencyManager.getNFTVisibility(mockWalletId, nftAddress);\n expect(result).to.deep.equal(visibility);\n });\n\n it('should return default visibility for unknown NFT', async () => {\n const nftAddress = '0x1234567890123456789012345678901234567890';\n const result = await transparencyManager.getNFTVisibility(mockWalletId, nftAddress);\n expect(result.isVisible).to.be.true; // default from settings\n expect(result.showCollection).to.be.true;\n expect(result.showTransactions).to.be.false;\n });\n });\n\n describe('whitelist management', () => {\n beforeEach(async () => {\n await transparencyManager.createDefaultSettings(mockWalletId);\n });\n\n it('should add address to whitelist', async () => {\n const address = '0x1234567890123456789012345678901234567890';\n const permissions = {\n viewBalances: true,\n viewNFTs: true,\n viewTransactions: false,\n viewProfile: true,\n };\n\n await transparencyManager.addToWhitelist(mockWalletId, address, permissions);\n \n const canViewBalances = await transparencyManager.checkWhitelistPermission(\n mockWalletId,\n address,\n 'viewBalances'\n );\n expect(canViewBalances).to.be.true;\n\n const canViewTransactions = await transparencyManager.checkWhitelistPermission(\n mockWalletId,\n address,\n 'viewTransactions'\n );\n expect(canViewTransactions).to.be.false;\n });\n\n it('should remove address from whitelist', async () => {\n const address = '0x1234567890123456789012345678901234567890';\n const permissions = {\n viewBalances: true,\n viewNFTs: true,\n viewTransactions: false,\n viewProfile: true,\n };\n\n await transparencyManager.addToWhitelist(mockWalletId, address, permissions);\n await transparencyManager.removeFromWhitelist(mockWalletId, address);\n \n const canViewBalances = await transparencyManager.checkWhitelistPermission(\n mockWalletId,\n address,\n 'viewBalances'\n );\n expect(canViewBalances).to.be.false;\n });\n\n it('should return false for non-whitelisted address', async () => {\n const address = '0x1234567890123456789012345678901234567890';\n const canViewBalances = await transparencyManager.checkWhitelistPermission(\n mockWalletId,\n address,\n 'viewBalances'\n );\n expect(canViewBalances).to.be.false;\n });\n });\n\n describe('viewing requests', () => {\n beforeEach(async () => {\n await transparencyManager.createDefaultSettings(mockWalletId);\n });\n\n it('should create viewing request', async () => {\n const result = await transparencyManager.createViewingRequest(\n mockRequesterId,\n mockWalletId,\n 'balance',\n undefined,\n 'Can I see your balance?'\n );\n\n expect(result.requesterId).to.equal(mockRequesterId);\n expect(result.walletId).to.equal(mockWalletId);\n expect(result.requestType).to.equal('balance');\n expect(result.message).to.equal('Can I see your balance?');\n expect(result.status).to.equal('pending');\n });\n\n it('should approve viewing request', async () => {\n const request = await transparencyManager.createViewingRequest(\n mockRequesterId,\n mockWalletId,\n 'balance'\n );\n\n const result = await transparencyManager.respondToViewingRequest(request.id, 'approved');\n expect(result.status).to.equal('approved');\n });\n\n it('should reject viewing request', async () => {\n const request = await transparencyManager.createViewingRequest(\n mockRequesterId,\n mockWalletId,\n 'balance'\n );\n\n const result = await transparencyManager.respondToViewingRequest(request.id, 'rejected');\n expect(result.status).to.equal('rejected');\n });\n\n it('should get viewing requests for wallet', async () => {\n await transparencyManager.createViewingRequest(\n mockRequesterId,\n mockWalletId,\n 'balance'\n );\n\n const results = await transparencyManager.getViewingRequests(mockWalletId);\n expect(results.length).to.equal(1);\n expect(results[0].walletId).to.equal(mockWalletId);\n });\n });\n\n describe('visibility proofs', () => {\n beforeEach(async () => {\n await transparencyManager.createDefaultSettings(mockWalletId);\n // Add requester to whitelist\n await transparencyManager.addToWhitelist(mockWalletId, mockRequesterId, {\n viewBalances: true,\n viewNFTs: true,\n viewTransactions: true,\n viewProfile: true,\n });\n });\n\n it('should generate visibility proof for authorized requester', async () => {\n const result = await transparencyManager.generateVisibilityProof(\n mockWalletId,\n mockRequesterId,\n 'balance'\n );\n\n expect(result.walletId).to.equal(mockWalletId);\n expect(result.requesterId).to.equal(mockRequesterId);\n expect(result.proofType).to.equal('balance');\n expect(result.isValid).to.be.true;\n expect(result.proof).to.be.a('string');\n });\n\n it('should throw error for unauthorized requester', async () => {\n const unauthorizedRequester = 'unauthorized-requester';\n \n await expect(\n transparencyManager.generateVisibilityProof(\n mockWalletId,\n unauthorizedRequester,\n 'balance'\n )\n ).to.be.rejectedWith('Insufficient permissions');\n });\n\n it('should verify valid proof', async () => {\n const proof = await transparencyManager.generateVisibilityProof(\n mockWalletId,\n mockRequesterId,\n 'balance'\n );\n\n const isValid = await transparencyManager.verifyVisibilityProof(proof.id);\n expect(isValid).to.be.true;\n });\n\n it('should return false for non-existent proof', async () => {\n const isValid = await transparencyManager.verifyVisibilityProof('non-existent-proof');\n expect(isValid).to.be.false;\n });\n });\n});\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|