Skip to content

Commit

Permalink
fix!: separate wallet into User, Bridge, and Internal
Browse files Browse the repository at this point in the history
  • Loading branch information
michaelfig committed Nov 19, 2020
1 parent eea0e01 commit a4a5571
Show file tree
Hide file tree
Showing 6 changed files with 319 additions and 311 deletions.
7 changes: 4 additions & 3 deletions packages/dapp-svelte-wallet/api/deploy.js
Original file line number Diff line number Diff line change
Expand Up @@ -64,14 +64,15 @@ export default async function deployWallet(
const issuerToPetname = new Map();
const issuerToPursePetnameP = new Map();
const wallet = await E(walletVat).getWallet();
const walletInternals = E(wallet).getInternals();
await Promise.all(
paymentInfo.map(async ({ issuerPetname, issuer }) => {
// Create some issuer petnames.
if (issuerToPetname.has(issuer)) {
return issuerToPetname.get(issuer);
}
issuerToPetname.set(issuer, issuerPetname);
await E(wallet).addIssuer(issuerPetname, issuer);
await E(walletInternals).addIssuer(issuerPetname, issuer);
return issuerToPetname.get(issuer);
}),
);
Expand Down Expand Up @@ -109,7 +110,7 @@ export default async function deployWallet(
if (!issuerToPursePetnameP.has(issuer)) {
issuerToPursePetnameP.set(
issuer,
E(wallet)
E(walletInternals)
.makeEmptyPurse(issuerPetname, pursePetname)
.then(
_ => pursePetname,
Expand All @@ -120,7 +121,7 @@ export default async function deployWallet(
pursePetname = await issuerToPursePetnameP.get(issuer);

// Deposit payment.
await E(wallet).deposit(pursePetname, payment);
await E(walletInternals).deposit(pursePetname, payment);
}),
);

Expand Down
80 changes: 80 additions & 0 deletions packages/dapp-svelte-wallet/api/src/internal-types.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
/**
* @typedef {Object} PursesAddedState
* @property {Purse} purse
* @property {Brand} brand
* @property {PurseActions} actions
*/

/**
* @typedef {PursesJSONState & PursesAddedState} PursesFullState
*/

/**
* @typedef {Object} PurseActions
* @property {(receiverP: ERef<{ receive: (payment: Payment) => void }>, valueToSend: Value) => Promise<void>} send
* @property {(payment: Payment) => Promise<Value>} receive
* @property {(payment: Payment, amount: Amount=) => Promise<Value>} deposit
*/

/**
* @typedef {Object} BrandRecord
* @property {Brand} brand
* @property {Issuer} issuer
* @property {string} issuerBoardId
* @property {AmountMath} amountMath
*/

/**
* @typedef {Object} Contact
* @property {string=} depositBoardId
*/

/**
* @typedef {Object} DappRecord
* @property {Promise<void>=} approvalP
* @property {Petname} suggestedPetname
* @property {Petname} petname
* @property {boolean} enable
* @property {string} origin
* @property {DappActions} actions
*/

/**
* @typedef {Object} DappActions
* @property {(petname: Petname) => DappActions} setPetname
* @property {() => DappActions} enable
* @property {(reason: any) => DappActions} disable
*/

/**
* @template T
* @typedef {Object} Mapping
* @property {(petname: Petname) => string} implode
* @property {(str: string) => Petname} explode
* @property {WeakStore<T, Petname>} valToPetname
* @property {WeakStore<T, string[][]>} valToPaths
* @property {Store<Petname, T>} petnameToVal
* @property {(petname: Petname, val: T) => void} addPetname
* @property {(path: string[], val: T) => void} addPath
* @property {(petname: Petname, val: T) => void} renamePetname
* @property {(petname: Petname) => void} deletePetname
* @property {(petname: Petname, val: T) => void} suggestPetname
* @property {string} kind
*/

/**
* @typedef {Object} PaymentRecord
* @property {Issuer=} issuer
* @property {Payment} payment
* @property {Brand} brand
* @property {'pending'|'deposited'|undefined} status
* @property {PaymentActions} actions
* @property {Amount=} lastAmount
* @property {Amount=} depositedAmount
* @property {string=} issuerBoardId
*
* @typedef {Object} PaymentActions
* @property {(purseOrPetname: (Purse | Petname)=) => Promise<Value>} deposit
* @property {() => Promise<boolean>} refresh
* @property {() => Promise<boolean>} getAmountOf
*/
2 changes: 2 additions & 0 deletions packages/dapp-svelte-wallet/api/src/lib-wallet.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ import { makeDehydrator } from './lib-dehydrate';

import '@agoric/store/exported';
import '@agoric/zoe/exported';

import './internal-types';
import './types';

// does nothing
Expand Down
112 changes: 35 additions & 77 deletions packages/dapp-svelte-wallet/api/src/types.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,83 +22,41 @@
* @property {any} currentAmountSlots
* @property {any} currentAmount
*/
/**
* @typedef {Object} PursesAddedState
* @property {Purse} purse
* @property {Brand} brand
* @property {PurseActions} actions
*/

/**
* @typedef {PursesJSONState & PursesAddedState} PursesFullState
*/

/**
* @typedef {Object} PurseActions
* @property {(receiverP: ERef<{ receive: (payment: Payment) => void }>, valueToSend: Value) => Promise<void>} send
* @property {(payment: Payment) => Promise<Value>} receive
* @property {(payment: Payment, amount: Amount=) => Promise<Value>} deposit
*/

/**
* @typedef {Object} BrandRecord
* @property {Brand} brand
* @property {Issuer} issuer
* @property {string} issuerBoardId
* @property {AmountMath} amountMath
*/

/**
* @typedef {Object} Contact
* @property {string=} depositBoardId
*/

/**
* @typedef {Object} DappRecord
* @property {Promise<void>=} approvalP
* @property {Petname} suggestedPetname
* @property {Petname} petname
* @property {boolean} enable
* @property {string} origin
* @property {DappActions} actions
*/

/**
* @typedef {Object} DappActions
* @property {(petname: Petname) => DappActions} setPetname
* @property {() => DappActions} enable
* @property {(reason: any) => DappActions} disable
*/

/**
* @template T
* @typedef {Object} Mapping
* @property {(petname: Petname) => string} implode
* @property {(str: string) => Petname} explode
* @property {WeakStore<T, Petname>} valToPetname
* @property {WeakStore<T, string[][]>} valToPaths
* @property {Store<Petname, T>} petnameToVal
* @property {(petname: Petname, val: T) => void} addPetname
* @property {(path: string[], val: T) => void} addPath
* @property {(petname: Petname, val: T) => void} renamePetname
* @property {(petname: Petname) => void} deletePetname
* @property {(petname: Petname, val: T) => void} suggestPetname
* @property {string} kind
*/

/**
* @typedef {Object} PaymentRecord
* @property {Issuer=} issuer
* @property {Payment} payment
* @property {Brand} brand
* @property {'pending'|'deposited'|undefined} status
* @property {PaymentActions} actions
* @property {Amount=} lastAmount
* @property {Amount=} depositedAmount
* @property {string=} issuerBoardId
*
* @typedef {Object} PaymentActions
* @property {(purseOrPetname: (Purse | Petname)=) => Promise<Value>} deposit
* @property {() => Promise<boolean>} refresh
* @property {() => Promise<boolean>} getAmountOf
* @typedef {Object} WalletBridge The wallet methods available within the
* context of a Dapp.
* @property {(offer: OfferState) => Promise<void>} addOffer
* @property {(brandBoardId: string) => Promise<string>} getDepositFacetId
* @property {() => Promise<Notifier<Array<[string, PursesJSONState]>>>}
* getPursesNotifier
* @property {() => Promise<Notifier<Array<[string, OfferJSONState]>>>}
* getOfferNotifier
* @property {(petname: Petname, issuerBoardId: string) => Promise<void>}
* suggestIssuer
* @property {(petname: Petname, installationBoardId: string) => Promise<void>}
* suggestInstallation
* @property {(petname: Petname, instanceBoardId: string) => Promise<void>}
* suggestInstance
*/

/**
* @typedef {Object} WalletTodo
* @property {(offer: OfferState, invitation: ERef<Payment>) => Promise<string>}
* addOfferInvitation add an invitation to the specified offer
*/

/**
* @typedef {Object} WalletUser the presence exposed as `local.wallet` (or
* `home.wallet`)
* @property {() => Promise<WalletBridge>} getAnonymousBridge return the wallet
* bridge not bound to a given Dapp
* @property {() => Promise<any>} getInternals return the specialized backend
* for the wallet UI frontend
* @property {(brandBoardId: string) => Promise<string>} getDepositFacetId
* @property {() => Promise<Array<[Petname, Issuer]>>} getIssuers
* @property {(petname: Petname) => Issuer} getIssuer
* @property {() => Promise<Array<[Petname, Purse]>>} getPurses
* @property {(petname: Petname) => Purse} getPurse
* @property {(payment: ERef<Payment>) => Promise<void>} addPayment
*/
Loading

0 comments on commit a4a5571

Please sign in to comment.