Skip to content

Commit

Permalink
Merge branch 'develop'
Browse files Browse the repository at this point in the history
  • Loading branch information
sebastianmontero committed Feb 28, 2024
2 parents b3779f0 + 4649584 commit 125f3aa
Show file tree
Hide file tree
Showing 8 changed files with 46 additions and 23 deletions.
2 changes: 1 addition & 1 deletion package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@smontero/smartvaults-js-client",
"version": "0.0.59",
"version": "0.0.60",
"description": "SmartVaults javascript client",
"main": "dist/index.js",
"types": "dist/index.d.ts",
Expand Down
6 changes: 3 additions & 3 deletions src/SmartVaults.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1311,7 +1311,7 @@ describe('SmartVaults', () => {
const suggestedPaymentPeriod = await smartVaults.getSuggestedPaymentPeriod(policy, keyAgentPaymentProposal1.signer_descriptor)
const oneYear = TimeUtil.fromYearsToSeconds(1)
const start = TimeUtil.toSeconds(policy.createdAt.getTime())
const expected = { start: start, end: start + oneYear }
const expected = { from: start, to: start + oneYear }
expect(suggestedPaymentPeriod).toEqual(expected)
})

Expand Down Expand Up @@ -1340,14 +1340,14 @@ describe('SmartVaults', () => {
const oneYear = TimeUtil.fromYearsToSeconds(1)
const oneDay = TimeUtil.fromDaysToSeconds(1)
const start = TimeUtil.toSeconds(completedKeyAgentPaymentProposal1.completion_date.getTime()) + oneDay
const expected = { start, end: start + oneYear }
const expected = { from: start, to: start + oneYear }
expect(suggestedPaymentPeriod).toEqual(expected)
});

it('getSuggestedPaymentAmount works', async () => {
const policy = (await smartVaults.getPoliciesById([keyAgentPaymentProposal1.policy_id])).get(keyAgentPaymentProposal1.policy_id)!
const suggestedPaymentAmount = await smartVaults.getSuggestedPaymentAmount(signerOffering1, PaymentType.YearlyCost, policy, keyAgentPaymentProposal1.signer_descriptor)
expect(suggestedPaymentAmount).toEqual(signerOffering1.yearly_cost!.amount)
expect(suggestedPaymentAmount).toEqual(signerOffering1.yearly_cost!.amount + 1)
});

it('deleteSignerOfferings works', async () => {
Expand Down
3 changes: 2 additions & 1 deletion src/SmartVaults.ts
Original file line number Diff line number Diff line change
Expand Up @@ -820,17 +820,18 @@ export class SmartVaults {
let paymentAmount: number = 0;
period = period || await this.getSuggestedPaymentPeriod(policy, signerDescriptor);
const years = TimeUtil.fromSecondsToYears(period.to - period.from);
if (years <= 0) throw new Error('Invalid period');
switch (paymentType) {
case PaymentType.PerSignature:
price = offering.cost_per_signature!;
paymentAmount = Math.ceil(await this.fromPriceToSats(price))
break;
case PaymentType.YearlyCost:
if (years <= 0) throw new Error('Invalid period');
price = offering.yearly_cost!;
paymentAmount = Math.ceil(await this.fromPriceToSats(price) * years);
break;
case PaymentType.YearlyCostBasisPoints:
if (years <= 0) throw new Error('Invalid period');
price = offering.yearly_cost_basis_points!;
const currentBalance = await policy.getBalance();
paymentAmount = Math.ceil(CurrencyUtil.fromBasisPointsToDecimal(price) * currentBalance.totalBalance() * years);
Expand Down
36 changes: 27 additions & 9 deletions src/models/PublishedPolicy.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import { DirectPrivateKeyAuthenticator } from '@smontero/nostr-ual'
import { Keys, Store } from '../service'
import { fromNostrDate } from '../util'
import { SmartVaults } from '../SmartVaults'
import { LabeledUtxo } from '../types'

describe('PublishedPolicy', () => {
let policyContent: Policy
Expand Down Expand Up @@ -512,15 +513,26 @@ describe('PublishedPolicy', () => {

describe('Augmented transaction details', () => {

let date1 = new Date("2023-07-13T20:11:49.000Z")
let date2 = new Date("2023-07-14T20:11:50.000Z")
let date3 = new Date("2023-07-15T20:11:50.000Z")
const trxMetadata1 = { transactionMetadata: { data: {}, text: 'transactionMetadata1' }, transactionMetadataId: 'id1' }
const trxMetadata2 = { transactionMetadata: { data: {}, text: 'transactionMetadata2' }, transactionMetadataId: 'id2' }
const trxMetadata3 = { transactionMetadata: { data: {}, text: 'transactionMetadata3' }, transactionMetadataId: 'id3' }
let trx1 = { txid: "txid1", date: date1, sent: 0, received: 50000, net: 50000, fee: 5000, transactionMetadata: trxMetadata1.transactionMetadata, transactionMetadataId: trxMetadata1.transactionMetadataId, transactionMetadataText: trxMetadata1.transactionMetadata.text, confirmation_time: { height: 2441712, timestamp: 1689279109, confirmedAt: date1 } }
let trx2 = { txid: "txid2", date: date2, sent: 0, received: 100000, net: 100000, fee: 2000, transactionMetadata: trxMetadata2.transactionMetadata, transactionMetadataId: trxMetadata2.transactionMetadataId, transactionMetadataText: trxMetadata2.transactionMetadata.text, confirmation_time: { height: 2441712, timestamp: 1689365510, confirmedAt: date2 } }
let trx3 = { txid: "txid3", date: date3, sent: 140000, received: 0, net: -150000, fee: 6000, transactionMetadata: trxMetadata3.transactionMetadata, transactionMetadataId: trxMetadata3.transactionMetadataId, transactionMetadataText: trxMetadata3.transactionMetadata.text, confirmation_time: { height: 2441712, timestamp: 1689451910, confirmedAt: date3 } }
let date1;
let date2;
let date3;
let trxMetadata1;
let trxMetadata2;
let trxMetadata3;
let trx1;
let trx2;
let trx3;
beforeAll(() => {
date1 = new Date("2023-07-13T20:11:49.000Z")
date2 = new Date("2023-07-14T20:11:50.000Z")
date3 = new Date("2023-07-15T20:11:50.000Z")
trxMetadata1 = { transactionMetadata: { data: {}, text: 'transactionMetadata1' }, transactionMetadataId: 'id1', policy_id: policy2.id }
trxMetadata2 = { transactionMetadata: { data: {}, text: 'transactionMetadata2' }, transactionMetadataId: 'id2', policy_id: policy2.id }
trxMetadata3 = { transactionMetadata: { data: {}, text: 'transactionMetadata3' }, transactionMetadataId: 'id3', policy_id: policy2.id }
trx1 = { txid: "txid1", date: date1, sent: 0, received: 50000, net: 50000, fee: 5000, transactionMetadata: trxMetadata1.transactionMetadata, transactionMetadataId: trxMetadata1.transactionMetadataId, transactionMetadataText: trxMetadata1.transactionMetadata.text, confirmation_time: { height: 2441712, timestamp: 1689279109, confirmedAt: date1 } }
trx2 = { txid: "txid2", date: date2, sent: 0, received: 100000, net: 100000, fee: 2000, transactionMetadata: trxMetadata2.transactionMetadata, transactionMetadataId: trxMetadata2.transactionMetadataId, transactionMetadataText: trxMetadata2.transactionMetadata.text, confirmation_time: { height: 2441712, timestamp: 1689365510, confirmedAt: date2 } }
trx3 = { txid: "txid3", date: date3, sent: 140000, received: 0, net: -150000, fee: 6000, transactionMetadata: trxMetadata3.transactionMetadata, transactionMetadataId: trxMetadata3.transactionMetadataId, transactionMetadataText: trxMetadata3.transactionMetadata.text, confirmation_time: { height: 2441712, timestamp: 1689451910, confirmedAt: date3 } }
})

it('getAugmentedTransactions using SpecID should generate correct details', async () => {

Expand All @@ -539,6 +551,7 @@ describe('PublishedPolicy', () => {

getAugmentedTransactionsSpyon.mockResolvedValueOnce(([trx1, trx2, trx3]))

jest.spyOn(policy2, 'getLabeledUtxos').mockResolvedValue([] as Array<LabeledUtxo>)
const expected: AugmentedTransactionDetails[] = [
{ ...trx1, type: "RECEIVE", costBasis: 22, associatedCostBasis: "N/A", proceeds: 0, capitalGainsLoses: 0, netFiatAtConfirmation: 20, feeFiatAtConfirmation: 2, btcExchangeRateAtConfirmation: 40000 },
{ ...trx2, type: "RECEIVE", costBasis: 61.2, associatedCostBasis: "N/A", proceeds: 0, capitalGainsLoses: 0, netFiatAtConfirmation: 60, feeFiatAtConfirmation: 1.2, btcExchangeRateAtConfirmation: 60000 },
Expand Down Expand Up @@ -579,6 +592,7 @@ describe('PublishedPolicy', () => {
.mockReturnValueOnce(trxMetadata2)
.mockReturnValueOnce(trxMetadata3)

jest.spyOn(policy2, 'getLabeledUtxos').mockResolvedValue([] as Array<LabeledUtxo>)
const expected: AugmentedTransactionDetails[] = [
{ ...trx1, type: "RECEIVE", costBasis: 22, associatedCostBasis: "N/A", proceeds: 0, capitalGainsLoses: 0, netFiatAtConfirmation: 20, feeFiatAtConfirmation: 2, btcExchangeRateAtConfirmation: 40000 },
{ ...trx2, type: "RECEIVE", costBasis: 61.2, associatedCostBasis: "N/A", proceeds: 0, capitalGainsLoses: 0, netFiatAtConfirmation: 60, feeFiatAtConfirmation: 1.2, btcExchangeRateAtConfirmation: 60000 },
Expand Down Expand Up @@ -608,6 +622,7 @@ describe('PublishedPolicy', () => {

getAugmentedTransactionsSpyon.mockResolvedValueOnce(([trx1, trx2, trx3]))

jest.spyOn(policy2, 'getLabeledUtxos').mockResolvedValue([] as Array<LabeledUtxo>)
const expected: AugmentedTransactionDetails[] = [
{ ...trx1, type: "RECEIVE", costBasis: 22, associatedCostBasis: "N/A", proceeds: 0, capitalGainsLoses: 0, netFiatAtConfirmation: 20, feeFiatAtConfirmation: 2, btcExchangeRateAtConfirmation: 40000 },
{ ...trx2, type: "RECEIVE", costBasis: 61.2, associatedCostBasis: "N/A", proceeds: 0, capitalGainsLoses: 0, netFiatAtConfirmation: 60, feeFiatAtConfirmation: 1.2, btcExchangeRateAtConfirmation: 60000 },
Expand Down Expand Up @@ -637,6 +652,7 @@ describe('PublishedPolicy', () => {

getAugmentedTransactionsSpyon.mockResolvedValueOnce(([trx1, trx2, trx3]))

jest.spyOn(policy2, 'getLabeledUtxos').mockResolvedValue([] as Array<LabeledUtxo>)
const expected: AugmentedTransactionDetails[] = [
{ ...trx1, type: "RECEIVE", costBasis: 22, associatedCostBasis: "N/A", proceeds: 0, capitalGainsLoses: 0, netFiatAtConfirmation: 20, feeFiatAtConfirmation: 2, btcExchangeRateAtConfirmation: 40000 },
{ ...trx2, type: "RECEIVE", costBasis: 61.2, associatedCostBasis: "N/A", proceeds: 0, capitalGainsLoses: 0, netFiatAtConfirmation: 60, feeFiatAtConfirmation: 1.2, btcExchangeRateAtConfirmation: 60000 },
Expand Down Expand Up @@ -667,6 +683,7 @@ describe('PublishedPolicy', () => {

getAugmentedTransactionsSpyon.mockResolvedValueOnce(([trx1, trx2, trx3]))

jest.spyOn(policy2, 'getLabeledUtxos').mockResolvedValue([] as Array<LabeledUtxo>)
const expected: AugmentedTransactionDetails[] = [
{ ...trx1, type: "RECEIVE", costBasis: 50, associatedCostBasis: "N/A", proceeds: 0, capitalGainsLoses: 0, netFiatAtConfirmation: 20, feeFiatAtConfirmation: 2, btcExchangeRateAtConfirmation: 40000 },
{ ...trx2, type: "RECEIVE", costBasis: 100, associatedCostBasis: "N/A", proceeds: 0, capitalGainsLoses: 0, netFiatAtConfirmation: 60, feeFiatAtConfirmation: 1.2, btcExchangeRateAtConfirmation: 60000 },
Expand Down Expand Up @@ -694,6 +711,7 @@ describe('PublishedPolicy', () => {

getAugmentedTransactionsSpyon.mockResolvedValueOnce(([trx1, trx2, trx3]))

jest.spyOn(policy2, 'getLabeledUtxos').mockResolvedValue([] as Array<LabeledUtxo>)
const expected: AugmentedTransactionDetails[] = [
{ ...trx1, type: "RECEIVE", costBasis: 22, associatedCostBasis: "N/A", proceeds: 0, capitalGainsLoses: 0, netFiatAtConfirmation: 20, feeFiatAtConfirmation: 2, btcExchangeRateAtConfirmation: 40000 },
{ ...trx2, type: "RECEIVE", costBasis: 61.2, associatedCostBasis: "N/A", proceeds: 0, capitalGainsLoses: 0, netFiatAtConfirmation: 60, feeFiatAtConfirmation: 1.2, btcExchangeRateAtConfirmation: 60000 },
Expand Down
8 changes: 6 additions & 2 deletions src/models/PublishedPolicy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -334,9 +334,11 @@ export class PublishedPolicy {

async getAugmentedTransactions(includeFiatAccountingValues?: IncludeFiatAccountingValuesPayload): Promise<Array<AugmentedTransactionDetails>> {
let trxs: Array<BasicTrxDetails> = [];
let utxos: Array<LabeledUtxo> = [];
try {
[trxs] = await Promise.all([
[trxs, utxos] = await Promise.all([
this.getTrxs(),
this.getLabeledUtxos(),
this.getTransactionMetadataByPolicyId(this.id, {})
]);
} catch (error) {
Expand All @@ -346,7 +348,9 @@ export class PublishedPolicy {
const indexKey = "txId";

const maybeAugmentedTrxs: Array<AugmentedTransactionDetails> = trxs.map(trx => {
const transactionMetadata: PublishedTransactionMetadata | undefined = this.transactionMetadataStore.get(trx.txid, indexKey);
const maybeMetadataSetOnAnotherVault: PublishedTransactionMetadata | undefined = this.transactionMetadataStore.get(trx.txid, indexKey)
const maybeMetadataSetOnThisVault: PublishedTransactionMetadata | undefined = maybeMetadataSetOnAnotherVault?.policy_id === this.id ? maybeMetadataSetOnAnotherVault : this.transactionMetadataStore.get(utxos.find(utxo => utxo.utxo.outpoint.split(':')[0] === trx.txid)?.labelId || '', 'transactionMetadataId');
const transactionMetadata: PublishedTransactionMetadata | undefined = maybeMetadataSetOnThisVault || maybeMetadataSetOnAnotherVault;
if (transactionMetadata) {
const AugmentedTrxDetails: AugmentedTransactionDetails = { ...trx, transactionMetadata: transactionMetadata.transactionMetadata, transactionMetadataText: transactionMetadata.transactionMetadata.text, transactionMetadataId: transactionMetadata.transactionMetadataId };
return AugmentedTrxDetails;
Expand Down
6 changes: 3 additions & 3 deletions src/service/Store.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ export class Store {
const keyValues = this.indexMap[indexName].map(indexKey => obj[indexKey])
const key = keyValues.join('-')
const map = this.indexes.get(indexName)
if (!map) throw new Error('Invalid index key')
if (!map) throw new Error(`Invalid index key: ${indexName}`)

let innerMap = map.get(obj[indexName])
if (!innerMap) {
Expand Down Expand Up @@ -125,10 +125,10 @@ export class Store {
private getIndex(indexKey?: string): Map<string, any> {
indexKey = indexKey ?? this.indexes.keys().next().value
if (!indexKey) {
throw new Error('Invalid index key')
throw new Error(`Invalid index key: ${indexKey}`)
}
if (!this.indexes.has(indexKey)) {
throw new Error('Invalid index key')
throw new Error(`Invalid index key: ${indexKey}`)
}
return this.indexes.get(indexKey)!
}
Expand Down
6 changes: 3 additions & 3 deletions src/util/BitcoinExchangeRate.ts
Original file line number Diff line number Diff line change
Expand Up @@ -92,9 +92,9 @@ export class BitcoinExchangeRate {
} else {
exchangeRate = await this.fetchBitcoinExchangeRate(currency);
}
const amount = Math.ceil( CurrencyUtil.fromBitcoinToSats(price.amount / exchangeRate));
return amount;

const amount = Math.ceil(CurrencyUtil.fromBitcoinToSats(price.amount / exchangeRate));
return amount;
}

private async updateExchangeRate(): Promise<void> {
Expand Down

0 comments on commit 125f3aa

Please sign in to comment.