From eade1a21db58e7d18b5a170b4103c6af9efe3067 Mon Sep 17 00:00:00 2001 From: Christopher Scott Date: Sun, 28 Apr 2024 16:52:57 -0500 Subject: [PATCH 01/26] update --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index feb70484..70bb6f6c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { - "name": "@scrow/sdk", - "version": "0.10.9", + "name": "@bitescrow/sdk", + "version": "0.11.0", "description": "Development SDK for the BitEscrow API.", "author": "Christopher Scott", "license": "MIT", From 3ebdad55105974a3069b34cae84674d414c918d5 Mon Sep 17 00:00:00 2001 From: Christopher Scott Date: Sun, 28 Apr 2024 16:53:39 -0500 Subject: [PATCH 02/26] update --- src/core/lib/witness.ts | 11 ++++++----- src/core/schema/witness.ts | 4 +++- src/core/types/witness.ts | 13 ++++++++----- 3 files changed, 17 insertions(+), 11 deletions(-) diff --git a/src/core/lib/witness.ts b/src/core/lib/witness.ts index 742c3769..4f7e2396 100644 --- a/src/core/lib/witness.ts +++ b/src/core/lib/witness.ts @@ -23,7 +23,7 @@ export function create_witness ( pubkeys : string | string[], template : WitnessTemplate ) : WitnessData { - const { args = [], action, method, path, stamp = now() } = template + const { args = [], action, content = '', method, path, stamp = now() } = template const keys = (Array.isArray(pubkeys)) ? pubkeys : [ pubkeys ] const query = { method, action, path, includes: keys } @@ -35,7 +35,7 @@ export function create_witness ( const prog_id = pdata.prog_id const vmid = config.vmid - const tmpl = { ...template, args, prog_id, stamp, vmid } + const tmpl = { ...template, args, content, prog_id, stamp, vmid } const wid = get_witness_id(tmpl) return sort_record({ ...tmpl, sigs: [], wid }) } @@ -75,10 +75,11 @@ export function create_receipt ( receipt_at = now() ) : WitnessReceipt { const server_pk = signer.pubkey + const vm_closed = data.closed const vm_hash = data.head const vm_output = data.output const vm_step = data.step - const preimg = { ...witness, receipt_at, server_pk, vm_hash, vm_output, vm_step } + const preimg = { ...witness, receipt_at, server_pk, vm_closed, vm_hash, vm_output, vm_step } const receipt_id = get_receipt_id(preimg) const server_sig = signer.sign(receipt_id) return sort_record({ ...preimg, receipt_id, server_sig }) @@ -91,9 +92,9 @@ export function create_receipt ( export function get_witness_id ( preimg : WitnessPreImage ) { - const { action, args, method, path, prog_id, stamp, vmid } = preimg + const { action, args, content, method, path, prog_id, stamp, vmid } = preimg const argstr = JSON.stringify(args) - return Buff.json([ action, argstr, method, path, prog_id, stamp, vmid ]).digest.hex + return Buff.json([ action, argstr, content, method, path, prog_id, stamp, vmid ]).digest.hex } export function get_receipt_id ( diff --git a/src/core/schema/witness.ts b/src/core/schema/witness.ts index b3809e61..e51a7f36 100644 --- a/src/core/schema/witness.ts +++ b/src/core/schema/witness.ts @@ -1,11 +1,12 @@ import { z } from 'zod' import base from './base.js' -const { hash, hex, label, literal, num, signature, stamp, str } = base +const { bool, hash, hex, label, literal, num, signature, stamp, str } = base const data = z.object({ args : literal.array(), action : str, + content : str, method : str, path : label, prog_id : hash, @@ -20,6 +21,7 @@ const receipt = data.extend({ receipt_id : hash, server_pk : hash, server_sig : signature, + vm_closed : bool, vm_hash : hash, vm_output : str.nullable(), vm_step : num diff --git a/src/core/types/witness.ts b/src/core/types/witness.ts index de4b8c25..381739bc 100644 --- a/src/core/types/witness.ts +++ b/src/core/types/witness.ts @@ -1,16 +1,18 @@ import { Literal } from './base.js' export interface WitnessTemplate { - action : string - args ?: Literal[] - method : string - path : string - stamp ?: number + action : string + args ?: Literal[] + content ?: string + method : string + path : string + stamp ?: number } export interface WitnessPreImage { action : string args : Literal[] + content : string method : string path : string prog_id : string @@ -26,6 +28,7 @@ export interface WitnessData extends WitnessPreImage { export interface ReceiptPreImage extends WitnessData { receipt_at : number server_pk : string + vm_closed : boolean vm_hash : string vm_output : string | null vm_step : number From 1126dbe840420afc9c53f7baf56f32d7b6be8354 Mon Sep 17 00:00:00 2001 From: Christopher Scott Date: Tue, 30 Apr 2024 05:10:56 -0500 Subject: [PATCH 03/26] update --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 70bb6f6c..451ccb26 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { - "name": "@bitescrow/sdk", - "version": "0.11.0", + "name": "@scrow/sdk", + "version": "0.12.0", "description": "Development SDK for the BitEscrow API.", "author": "Christopher Scott", "license": "MIT", From e1a1684e7e610e93db06abcd6f6470a91b9afd61 Mon Sep 17 00:00:00 2001 From: Christopher Scott Date: Tue, 30 Apr 2024 12:41:30 -0500 Subject: [PATCH 04/26] v0.12.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 451ccb26..335b955d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@scrow/sdk", - "version": "0.12.0", + "version": "0.12.1", "description": "Development SDK for the BitEscrow API.", "author": "Christopher Scott", "license": "MIT", From 992bf931bd03f8727793665f73a48e89944447d8 Mon Sep 17 00:00:00 2001 From: Christopher Scott Date: Tue, 30 Apr 2024 12:41:32 -0500 Subject: [PATCH 05/26] update --- demo/09_settle_contract.ts | 5 +++-- src/client/api/signer/wallet.ts | 8 ++++---- src/client/lib/enrollment.ts | 18 +++++++----------- src/client/lib/session.ts | 24 ++++++++++++++++-------- src/client/schema.ts | 31 +++++++++++++++---------------- src/client/types.ts | 15 ++++++++++----- 6 files changed, 55 insertions(+), 46 deletions(-) diff --git a/demo/09_settle_contract.ts b/demo/09_settle_contract.ts index ca978b6e..04bcd898 100644 --- a/demo/09_settle_contract.ts +++ b/demo/09_settle_contract.ts @@ -54,9 +54,10 @@ if (DEMO_MODE) { /** ========== [ Review Settlement ] ========== **/ // Assert that a settled contract exists. -assert.exists(res.data.contract, 'settled contract was not returned') +const settled_res = await client.contract.read(active_contract.cid) +if (!settled_res.ok) throw new Error(res.error) // Unpack the settled contract from the response. -const settled_contract = res.data.contract +const settled_contract = settled_res.data.contract if (DEMO_MODE) { print_banner('settled contract') diff --git a/src/client/api/signer/wallet.ts b/src/client/api/signer/wallet.ts index 35ded845..59449f9b 100644 --- a/src/client/api/signer/wallet.ts +++ b/src/client/api/signer/wallet.ts @@ -1,3 +1,4 @@ +import { AddressConfig } from '@cmdcode/signer' import { EscrowSigner } from '../../class/signer.js' export function has_address_api (esigner : EscrowSigner) { @@ -11,10 +12,9 @@ export function has_address_api (esigner : EscrowSigner) { } export function new_address_api (esigner : EscrowSigner) { - return (account : number) => { - const format = 'p2tr' - const network = esigner.network - const config = { format, network } + return (account : number, config : AddressConfig = {}) => { + config.format = config.format ?? 'p2tr' + config.network = esigner.network return esigner._wallet.get_account(account).new_address(config) } } diff --git a/src/client/lib/enrollment.ts b/src/client/lib/enrollment.ts index cf6faaf1..8e4f41b1 100644 --- a/src/client/lib/enrollment.ts +++ b/src/client/lib/enrollment.ts @@ -13,10 +13,10 @@ import { const GET_ROLE_DEFAULTS = () => { return { - min_num : 1, - max_num : 1, - paths : [], - programs : [] + moderator : false, + paths : [], + programs : [], + seats : 1 } } @@ -174,7 +174,7 @@ export function has_open_roles ( const policy = roles.find(e => e.id === policy_id) assert.ok(policy !== undefined, 'role does not exists for policy id: ' + policy_id) const slots = members.filter(e => e.pid === policy_id) - return slots.length < policy.max_num + return slots.length < policy.seats } export function has_full_roles ( @@ -183,12 +183,8 @@ export function has_full_roles ( ) { const tab = tabulate_slots(members, roles) return roles.every(e => { - const { id, min_num, max_num } = e + const { id, seats } = e const count = tab.get(id) - return ( - count !== undefined && - count >= min_num && - count <= max_num - ) + return (count !== undefined && count === seats) }) } diff --git a/src/client/lib/session.ts b/src/client/lib/session.ts index 6abf9b73..ddff5f6c 100644 --- a/src/client/lib/session.ts +++ b/src/client/lib/session.ts @@ -3,19 +3,20 @@ import { assert } from '@/core/util/index.js' import { create_proposal, - endorse_proposal + endorse_proposal, + get_path_total, + get_pay_total } from '@/core/lib/proposal.js' import { ContractRequest, - ProposalTemplate, SignerAPI } from '@/core/types/index.js' import { - RoleTemplate, DraftSession, - CredentialData + CredentialData, + DraftTemplate } from '../types.js' import ClientSchema from '../schema.js' @@ -38,14 +39,13 @@ import { } from './enrollment.js' export function create_session ( - proposal : ProposalTemplate, - roles : RoleTemplate[] + template : DraftTemplate ) : DraftSession { + const { proposal, roles } = template return { members : [], proposal : create_proposal(proposal), - roles : roles.map(e => create_role_policy(e)), - terms : [] + roles : roles.map(e => create_role_policy(e)) } } @@ -95,6 +95,14 @@ export function endorse_session ( return ClientSchema.session.parse({ ...session, members }) } +export function tabualte_session (session : DraftSession) { + const { paths, payments } = session.proposal + const path_totals = get_path_total(paths) + const pay_total = get_pay_total(payments) + const path_max = path_totals.sort((a, b) => a[1] - b[1]).pop() + return { path_totals, pay_total, path_max } +} + export function verify_session ( session : DraftSession ) { diff --git a/src/client/schema.ts b/src/client/schema.ts index dd7f6eec..2a68cb80 100644 --- a/src/client/schema.ts +++ b/src/client/schema.ts @@ -4,7 +4,7 @@ import prop from '@/core/schema/proposal.js' import serv from '@/core/schema/server.js' import vm from '@/core/schema/vm.js' -const { hash, hex, label, network, num, str } = base +const { bool, hash, hex, label, network, num, str } = base const signer_config = z.object({ machine : vm.api, @@ -31,29 +31,28 @@ const mship = cred.extend({ const path = z.tuple([ label, num ]) const role = z.object({ - title : label, - min_num : num.optional(), - max_num : num.optional(), - paths : path.array().optional(), - payment : num.optional(), - programs : prop.programs.optional() + title : label, + moderator : bool.optional(), + paths : path.array().optional(), + payment : num.optional(), + programs : prop.programs.optional(), + seats : num.optional() }) const policy = z.object({ - id : hash, - title : label, - min_num : num, - max_num : num, - paths : path.array(), - payment : num.optional(), - programs : prop.programs + id : hash, + title : label, + moderator : bool, + paths : path.array(), + payment : num.optional(), + programs : prop.programs, + seats : num }) const session = z.object({ members : mship.array(), proposal : prop.data, - roles : policy.array(), - terms : str.array() + roles : policy.array() }) export default { client_config, cred, mship, path, policy, role, session, signer_config } diff --git a/src/client/types.ts b/src/client/types.ts index dc463e80..0f74e5bd 100644 --- a/src/client/types.ts +++ b/src/client/types.ts @@ -6,6 +6,7 @@ import { Network, ProgramEntry, ProposalData, + ProposalTemplate, ServerPolicy, VirtualMachineAPI } from '@/core/types/index.js' @@ -42,21 +43,21 @@ export interface FetchConfig { export interface RoleTemplate { title : string id ?: string - min_num ?: number - max_num ?: number + moderator ?: boolean paths ?: [ string, number ][] payment ?: number programs ?: ProgramEntry[] + seats ?: number } export interface RolePolicy { id : string title : string - min_num : number - max_num : number + moderator : boolean paths : [ string, number ][] payment ?: number programs : ProgramEntry[] + seats : number } export interface CredentialConfig { @@ -74,11 +75,15 @@ export interface MemberData extends CredentialData { sig ?: string } +export interface DraftTemplate { + proposal : ProposalTemplate + roles : RoleTemplate[] +} + export interface DraftSession { proposal : ProposalData members : MemberData[] roles : RolePolicy[] - terms : string[] } export interface WalletAPI { From 2b1ce999fae3cbac42576ecde0795dabecf542c3 Mon Sep 17 00:00:00 2001 From: Christopher Scott Date: Tue, 30 Apr 2024 14:13:36 -0500 Subject: [PATCH 06/26] update --- src/client/lib/enrollment.ts | 27 +++++++++++++++++++++++++++ src/client/lib/session.ts | 33 +++++++++++++++++++++++++++++---- src/client/types.ts | 7 ++++++- 3 files changed, 62 insertions(+), 5 deletions(-) diff --git a/src/client/lib/enrollment.ts b/src/client/lib/enrollment.ts index 8e4f41b1..54c570a1 100644 --- a/src/client/lib/enrollment.ts +++ b/src/client/lib/enrollment.ts @@ -45,6 +45,33 @@ export function get_role_policy ( return policy } +export function get_role_paths_totals ( + roles : Array +) { + const path_totals = new Map() + + for (const { paths } of roles) { + if (paths !== undefined) { + paths.forEach(([ label, value ]) => { + const curr = path_totals.get(label) ?? 0 + path_totals.set(label, curr + value) + }) + } + } + + return path_totals +} + +export function get_role_payment_totals ( + roles : Array +) { + let bal = 0 + for (const role of roles) { + bal += role.payment ?? 0 + } + return bal +} + export function add_member_data ( cred : CredentialData, policy : RolePolicy, diff --git a/src/client/lib/session.ts b/src/client/lib/session.ts index ddff5f6c..8aea974a 100644 --- a/src/client/lib/session.ts +++ b/src/client/lib/session.ts @@ -32,6 +32,8 @@ import { import { add_member_data, create_role_policy, + get_role_paths_totals, + get_role_payment_totals, get_role_policy, has_open_roles, rem_member_data, @@ -97,10 +99,33 @@ export function endorse_session ( export function tabualte_session (session : DraftSession) { const { paths, payments } = session.proposal - const path_totals = get_path_total(paths) - const pay_total = get_pay_total(payments) - const path_max = path_totals.sort((a, b) => a[1] - b[1]).pop() - return { path_totals, pay_total, path_max } + const prop_path_totals = get_path_total(paths) + const prop_pay_total = get_pay_total(payments) + const role_path_totals = get_role_paths_totals(session.roles) + const role_pay_total = get_role_payment_totals(session.roles) + const path_totals = new Map(role_path_totals) + + prop_path_totals.forEach(([ path, value ]) => { + const curr = path_totals.get(path) ?? 0 + path_totals.set(path, curr + value) + }) + + const path_values = [ ...path_totals.values() ] + const path_max_value = path_values.sort((a, b) => a - b).pop() + + return { + path_totals, + path_max_value, + pay_total : prop_pay_total + role_pay_total, + proposal : { + paths : prop_path_totals, + payments : prop_path_totals + }, + roles : { + paths : [ ...role_path_totals.entries() ], + payments : role_pay_total + } + } } export function verify_session ( diff --git a/src/client/types.ts b/src/client/types.ts index 0f74e5bd..bd6b3932 100644 --- a/src/client/types.ts +++ b/src/client/types.ts @@ -40,11 +40,16 @@ export interface FetchConfig { token ?: string } +export type PathTemplate = [ + path : string, + amount : number +] + export interface RoleTemplate { title : string id ?: string moderator ?: boolean - paths ?: [ string, number ][] + paths ?: PathTemplate[] payment ?: number programs ?: ProgramEntry[] seats ?: number From 22a86e58bd80c9ea49f259e8ad632550afbe78d4 Mon Sep 17 00:00:00 2001 From: Christopher Scott Date: Tue, 30 Apr 2024 14:17:39 -0500 Subject: [PATCH 07/26] v0.12.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 335b955d..1d7d0265 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@scrow/sdk", - "version": "0.12.1", + "version": "0.12.2", "description": "Development SDK for the BitEscrow API.", "author": "Christopher Scott", "license": "MIT", From 2db17faa834addf58deb38c5b409b548bcaf2263 Mon Sep 17 00:00:00 2001 From: Christopher Scott Date: Tue, 30 Apr 2024 14:25:52 -0500 Subject: [PATCH 08/26] update --- src/client/lib/session.ts | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/client/lib/session.ts b/src/client/lib/session.ts index 8aea974a..b7dbe2b1 100644 --- a/src/client/lib/session.ts +++ b/src/client/lib/session.ts @@ -159,13 +159,14 @@ export function decode_session (session_str : string) : DraftSession { } export const DraftUtil = { - create : create_session, - decode : decode_session, - encode : encode_session, - endorse : endorse_session, - join : join_session, - leave : leave_session, - publish : publish_session, - reset : reset_session, - verify : verify_session + create : create_session, + decode : decode_session, + encode : encode_session, + endorse : endorse_session, + join : join_session, + leave : leave_session, + publish : publish_session, + reset : reset_session, + tabulate : tabualte_session, + verify : verify_session } From 087183b7091f68c3939043be26ef7594f9dde662 Mon Sep 17 00:00:00 2001 From: Christopher Scott Date: Tue, 30 Apr 2024 14:28:32 -0500 Subject: [PATCH 09/26] v0.12.3 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1d7d0265..694e270d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@scrow/sdk", - "version": "0.12.2", + "version": "0.12.3", "description": "Development SDK for the BitEscrow API.", "author": "Christopher Scott", "license": "MIT", From d5d7613fdde07b987c98465d8849d56046bbfe4a Mon Sep 17 00:00:00 2001 From: Christopher Scott Date: Tue, 30 Apr 2024 14:39:42 -0500 Subject: [PATCH 10/26] update --- src/client/lib/session.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/client/lib/session.ts b/src/client/lib/session.ts index b7dbe2b1..f8f049f6 100644 --- a/src/client/lib/session.ts +++ b/src/client/lib/session.ts @@ -114,10 +114,10 @@ export function tabualte_session (session : DraftSession) { const path_max_value = path_values.sort((a, b) => a - b).pop() return { - path_totals, path_max_value, - pay_total : prop_pay_total + role_pay_total, - proposal : { + path_totals : [ ...path_totals.entries() ], + pay_total : prop_pay_total + role_pay_total, + proposal : { paths : prop_path_totals, payments : prop_path_totals }, From e94afd1d0f94011e10d704943c47fb5a96ffa4f3 Mon Sep 17 00:00:00 2001 From: Christopher Scott Date: Tue, 30 Apr 2024 14:40:29 -0500 Subject: [PATCH 11/26] v0.12.4 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 694e270d..1bb733a4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@scrow/sdk", - "version": "0.12.3", + "version": "0.12.4", "description": "Development SDK for the BitEscrow API.", "author": "Christopher Scott", "license": "MIT", From 5d3d3c02d63f6ee4bfd841fbadb43b03cd0c117e Mon Sep 17 00:00:00 2001 From: Christopher Scott Date: Tue, 30 Apr 2024 15:27:30 -0500 Subject: [PATCH 12/26] update --- src/client/api/signer/wallet.ts | 9 +++++++++ src/client/types.ts | 1 + 2 files changed, 10 insertions(+) diff --git a/src/client/api/signer/wallet.ts b/src/client/api/signer/wallet.ts index 59449f9b..44ba768c 100644 --- a/src/client/api/signer/wallet.ts +++ b/src/client/api/signer/wallet.ts @@ -11,6 +11,14 @@ export function has_address_api (esigner : EscrowSigner) { } } +export function get_address_api (esigner : EscrowSigner) { + return (account : number, config : AddressConfig = {}) => { + config.format = config.format ?? 'p2tr' + config.network = esigner.network + return esigner._wallet.get_account(account).get_address(config) + } +} + export function new_address_api (esigner : EscrowSigner) { return (account : number, config : AddressConfig = {}) => { config.format = config.format ?? 'p2tr' @@ -22,6 +30,7 @@ export function new_address_api (esigner : EscrowSigner) { export default function (esigner : EscrowSigner) { return { has : has_address_api(esigner), + get : get_address_api(esigner), new : new_address_api(esigner) } } diff --git a/src/client/types.ts b/src/client/types.ts index bd6b3932..0bfb1ca2 100644 --- a/src/client/types.ts +++ b/src/client/types.ts @@ -96,5 +96,6 @@ export interface WalletAPI { has_account : (extkey : string) => boolean get_account : (id : Bytes) => WalletAPI has_address : (addr : string, limit ?: number) => boolean + get_address : (options ?: AddressConfig) => string new_address : (options ?: AddressConfig) => string } From ef8d34d8ead05a007a792e4f3dc56a948a576587 Mon Sep 17 00:00:00 2001 From: Christopher Scott Date: Tue, 30 Apr 2024 15:28:12 -0500 Subject: [PATCH 13/26] v0.12.5 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1bb733a4..508a9bf2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@scrow/sdk", - "version": "0.12.4", + "version": "0.12.5", "description": "Development SDK for the BitEscrow API.", "author": "Christopher Scott", "license": "MIT", From 980ab5072a9ab92a17087012739d0e47c5672a8e Mon Sep 17 00:00:00 2001 From: Christopher Scott Date: Tue, 30 Apr 2024 15:36:48 -0500 Subject: [PATCH 14/26] v0.12.6 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 508a9bf2..9058bc68 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@scrow/sdk", - "version": "0.12.5", + "version": "0.12.6", "description": "Development SDK for the BitEscrow API.", "author": "Christopher Scott", "license": "MIT", From 253be7cbe175b81b89c1f60d59b4fdb3e3501284 Mon Sep 17 00:00:00 2001 From: Christopher Scott Date: Tue, 30 Apr 2024 16:42:45 -0500 Subject: [PATCH 15/26] v0.12.7 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9058bc68..119b1365 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@scrow/sdk", - "version": "0.12.6", + "version": "0.12.7", "description": "Development SDK for the BitEscrow API.", "author": "Christopher Scott", "license": "MIT", From 890eb920c2e1d597dbd416379c7e35a160d6207b Mon Sep 17 00:00:00 2001 From: Christopher Scott Date: Tue, 30 Apr 2024 16:49:18 -0500 Subject: [PATCH 16/26] v0.12.8 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 119b1365..922c300d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@scrow/sdk", - "version": "0.12.7", + "version": "0.12.8", "description": "Development SDK for the BitEscrow API.", "author": "Christopher Scott", "license": "MIT", From d09de91c5d3e4b0ff55323c9a58eecb4aa674071 Mon Sep 17 00:00:00 2001 From: Christopher Scott Date: Wed, 1 May 2024 00:25:53 -0500 Subject: [PATCH 17/26] v0.12.9 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 922c300d..d1b9fff3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@scrow/sdk", - "version": "0.12.8", + "version": "0.12.9", "description": "Development SDK for the BitEscrow API.", "author": "Christopher Scott", "license": "MIT", From c29e8df239c51d720e5ff03918fec0275325d57e Mon Sep 17 00:00:00 2001 From: Christopher Scott Date: Wed, 1 May 2024 00:26:36 -0500 Subject: [PATCH 18/26] update --- demo/04_finish_proposal.ts | 2 +- src/client/class/signer.ts | 8 +------ src/client/lib/enrollment.ts | 2 +- src/client/lib/session.ts | 46 ++++++++++++++++++++++-------------- 4 files changed, 31 insertions(+), 27 deletions(-) diff --git a/demo/04_finish_proposal.ts b/demo/04_finish_proposal.ts index 8b60e4a3..aff81ad3 100644 --- a/demo/04_finish_proposal.ts +++ b/demo/04_finish_proposal.ts @@ -10,7 +10,7 @@ const DEMO_MODE = process.env.VERBOSE === 'true' const [ a_signer, b_signer, c_signer ] = signers // Define our negotiation session. -let draft = DraftUtil.create(proposal, roles), +let draft = DraftUtil.create({ proposal, roles }), seats = draft.roles.map(e => e.id) // For each member, add their info to the proposal. diff --git a/src/client/class/signer.ts b/src/client/class/signer.ts index 19a6e322..373f6ba2 100644 --- a/src/client/class/signer.ts +++ b/src/client/class/signer.ts @@ -118,22 +118,16 @@ export class EscrowSigner { return this._config.server_pk } - get wallet () { - return { - has : this._wallet.has_address - } - } - get xpub () { return this._wallet.xpub } account = account_api(this) - address = wallet_api(this) contract = contract_api(this) deposit = deposit_api(this) draft = draft_api(this) vm = vmachine_api(this) + wallet = wallet_api(this) witness = witness_api(this) backup (password : string) { diff --git a/src/client/lib/enrollment.ts b/src/client/lib/enrollment.ts index 54c570a1..4a251f0c 100644 --- a/src/client/lib/enrollment.ts +++ b/src/client/lib/enrollment.ts @@ -59,7 +59,7 @@ export function get_role_paths_totals ( } } - return path_totals + return [ ...path_totals ] } export function get_role_payment_totals ( diff --git a/src/client/lib/session.ts b/src/client/lib/session.ts index f8f049f6..d6727745 100644 --- a/src/client/lib/session.ts +++ b/src/client/lib/session.ts @@ -99,31 +99,41 @@ export function endorse_session ( export function tabualte_session (session : DraftSession) { const { paths, payments } = session.proposal - const prop_path_totals = get_path_total(paths) - const prop_pay_total = get_pay_total(payments) - const role_path_totals = get_role_paths_totals(session.roles) - const role_pay_total = get_role_payment_totals(session.roles) - const path_totals = new Map(role_path_totals) - - prop_path_totals.forEach(([ path, value ]) => { - const curr = path_totals.get(path) ?? 0 - path_totals.set(path, curr + value) + const prop_path_tabs = get_path_total(paths) + const prop_path_total = prop_path_tabs.reduce((p, c) => p + c[1], 0) + const prop_pay_total = get_pay_total(payments) + const role_path_tabs = get_role_paths_totals(session.roles) + const role_path_total = role_path_tabs.reduce((p, c) => p + c[1], 0) + const role_pay_total = get_role_payment_totals(session.roles) + const path_map = new Map(role_path_tabs) + const path_total = prop_path_total + role_path_total + const pay_total = prop_pay_total + role_pay_total + + prop_path_tabs.forEach(([ path, value ]) => { + const curr = path_map.get(path) ?? 0 + path_map.set(path, curr + value) }) - const path_values = [ ...path_totals.values() ] - const path_max_value = path_values.sort((a, b) => a - b).pop() + const path_values = [ ...path_map.values() ] + const max_value = path_values + .sort((a, b) => a - b) + .pop() ?? 0 return { - path_max_value, - path_totals : [ ...path_totals.entries() ], - pay_total : prop_pay_total + role_pay_total, + max_value, + path_total, + pay_total, + total_value : path_total + pay_total, + path_tabs : [ ...path_map.entries() ], proposal : { - paths : prop_path_totals, - payments : prop_path_totals + path_tabs : prop_path_tabs, + path_total : prop_path_total, + pay_total : prop_pay_total }, roles : { - paths : [ ...role_path_totals.entries() ], - payments : role_pay_total + path_tabs : [ ...role_path_tabs.entries() ], + path_total : role_path_total, + pay_total : role_pay_total } } } From 928b6b4c03f9f9ac90fc509daca85dc54d86e93f Mon Sep 17 00:00:00 2001 From: Christopher Scott Date: Wed, 1 May 2024 00:37:39 -0500 Subject: [PATCH 19/26] v0.12.10 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d1b9fff3..e1156732 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@scrow/sdk", - "version": "0.12.9", + "version": "0.12.10", "description": "Development SDK for the BitEscrow API.", "author": "Christopher Scott", "license": "MIT", From 56d2e7fdbbfed40741e753d94c2ff45cbf7f33b8 Mon Sep 17 00:00:00 2001 From: Christopher Scott Date: Wed, 1 May 2024 01:43:03 -0500 Subject: [PATCH 20/26] v0.12.11 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e1156732..53ce51a9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@scrow/sdk", - "version": "0.12.10", + "version": "0.12.11", "description": "Development SDK for the BitEscrow API.", "author": "Christopher Scott", "license": "MIT", From f74f270db5dbd3306b80e133a21507191dbfeaad Mon Sep 17 00:00:00 2001 From: Christopher Scott Date: Wed, 1 May 2024 01:55:51 -0500 Subject: [PATCH 21/26] v0.12.12 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 53ce51a9..a358c196 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@scrow/sdk", - "version": "0.12.11", + "version": "0.12.12", "description": "Development SDK for the BitEscrow API.", "author": "Christopher Scott", "license": "MIT", From 71f1aa791bcb00d56139857792877642541cd551 Mon Sep 17 00:00:00 2001 From: Christopher Scott Date: Wed, 1 May 2024 02:06:14 -0500 Subject: [PATCH 22/26] v0.12.13 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a358c196..f8b1eaab 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@scrow/sdk", - "version": "0.12.12", + "version": "0.12.13", "description": "Development SDK for the BitEscrow API.", "author": "Christopher Scott", "license": "MIT", From 4e0ce8744743e139f42f6e555d3a206e618bc7ef Mon Sep 17 00:00:00 2001 From: Christopher Scott Date: Wed, 1 May 2024 17:05:26 -0500 Subject: [PATCH 23/26] update --- demo/vm/eval.ts | 10 ++--- demo/vm/fundraiser.json | 12 ++++++ src/client/api/signer/draft.ts | 9 +++- src/client/lib/membership.ts | 22 +++------- src/client/lib/session.ts | 78 +++++++++++++++------------------- src/client/schema.ts | 3 +- src/client/types.ts | 4 +- 7 files changed, 68 insertions(+), 70 deletions(-) create mode 100644 demo/vm/fundraiser.json diff --git a/demo/vm/eval.ts b/demo/vm/eval.ts index 156d8a0d..09b490dc 100644 --- a/demo/vm/eval.ts +++ b/demo/vm/eval.ts @@ -1,7 +1,7 @@ import { now } from '@scrow/sdk/util' import { print_banner, VMUtil } from '@scrow/test' -import vector from './vector2.json' assert { type: 'json' } +import vector from './fundraiser.json' assert { type: 'json' } const active_at = now() const engine = 'cvm' @@ -10,13 +10,13 @@ const vmid = '00'.repeat(32) // Unpack the mock vector. const { duration, members, pathnames, programs, schedule, statements } = vector // Set the closing date. -const closes_at = active_at + duration +const expires_at = active_at + duration // Find and replace aliases with their relevant pubkeys. -const progs = VMUtil.resolve_aliases(members, programs) +const progs = VMUtil.resolve_aliases(members, programs) // Configure the init state of the vm. -const config = VMUtil.get_config({ active_at, closes_at, engine, pathnames, programs : progs, schedule, vmid }) +const config = VMUtil.get_config({ active_at, expires_at, engine, pathnames, programs : progs, schedule, vmid }) // Run VM with witness and final timestamp. -const vm_state = VMUtil.run_vm_vectors(config, duration, statements) +const vm_state = VMUtil.run_vm_vectors(config, duration, statements) print_banner('vm state') console.dir(vm_state, { depth: null }) diff --git a/demo/vm/fundraiser.json b/demo/vm/fundraiser.json new file mode 100644 index 00000000..cf39af6d --- /dev/null +++ b/demo/vm/fundraiser.json @@ -0,0 +1,12 @@ +{ + "comment" : "Basic payout, immediate execution", + "duration" : 9999, + "members" : [], + "pathnames" : [ "payout", "return" ], + "programs" : [], + "schedule" : [ + [ 0, "close", "payout" ], + [ 1000, "close", "return" ] + ], + "statements" : [] +} diff --git a/src/client/api/signer/draft.ts b/src/client/api/signer/draft.ts index 5e9062ea..b6ddf395 100644 --- a/src/client/api/signer/draft.ts +++ b/src/client/api/signer/draft.ts @@ -16,6 +16,7 @@ import { join_session, leave_session } from '../../lib/session.js' +import { get_proposal_id, verify_endorsement } from '@/core/lib/proposal.js' export function join_session_api (esigner : EscrowSigner) { return ( @@ -70,11 +71,15 @@ export function has_role_api (esigner : EscrowSigner) { } export function has_signature_api (esigner : EscrowSigner) { + const pub = esigner.pubkey return ( session : DraftSession ) : boolean => { - const mship = claim_membership(session.members, esigner._signer) - return mship?.sig !== undefined + const sig = session.sigs.find(e => e.slice(0, 64) === pub) + if (sig === undefined) return false + const prop_id = get_proposal_id(session.proposal) + verify_endorsement(prop_id, sig) + return true } } diff --git a/src/client/lib/membership.ts b/src/client/lib/membership.ts index 0d43d427..268c7f07 100644 --- a/src/client/lib/membership.ts +++ b/src/client/lib/membership.ts @@ -56,20 +56,10 @@ export function has_membership ( return exists !== undefined } -export function has_full_endorsement (members : MemberData[]) { - return members.every(e => typeof e.sig === 'string') -} - -export function get_signatures (members : MemberData[]) { - return members.map(mship => { - assert.exists(mship.sig) - return mship.sig - }) -} - -export function clear_signatures (members : MemberData[]) { - return members.map(mship => { - mship.sig = undefined - return mship - }) +export function has_endorsements ( + members : MemberData[], + signatures : string[] +) { + const pubkeys = signatures.map(e => e.slice(0, 64)) + return members.every(e => pubkeys.includes(e.pub)) } diff --git a/src/client/lib/session.ts b/src/client/lib/session.ts index d6727745..b7f891df 100644 --- a/src/client/lib/session.ts +++ b/src/client/lib/session.ts @@ -1,5 +1,6 @@ -import { Buff } from '@cmdcode/buff' -import { assert } from '@/core/util/index.js' +import { Buff } from '@cmdcode/buff' +import { assert } from '@/core/util/index.js' +import { has_membership } from './membership.js' import { create_proposal, @@ -21,14 +22,6 @@ import { import ClientSchema from '../schema.js' -import { - claim_membership, - clear_signatures, - get_signatures, - has_membership, - update_membership -} from './membership.js' - import { add_member_data, create_role_policy, @@ -47,7 +40,8 @@ export function create_session ( return { members : [], proposal : create_proposal(proposal), - roles : roles.map(e => create_role_policy(e)) + roles : roles.map(e => create_role_policy(e)), + sigs : [] } } @@ -82,56 +76,53 @@ export function leave_session ( } export function reset_session (session : DraftSession) { - const members = clear_signatures(session.members) - return ClientSchema.session.parse({ ...session, members }) + return ClientSchema.session.parse({ ...session, sigs: [] }) } export function endorse_session ( session : DraftSession, signer : SignerAPI ) : DraftSession { - const mship = claim_membership(session.members, signer) - assert.ok(mship !== null, 'signer is not a member of the session') - const sig = endorse_proposal(session.proposal, signer) - const members = update_membership(session.members, { ...mship, sig }) - return ClientSchema.session.parse({ ...session, members }) + const sig = endorse_proposal(session.proposal, signer) + const sigs = [ ...session.sigs, sig ] + return ClientSchema.session.parse({ ...session, sigs }) } export function tabualte_session (session : DraftSession) { const { paths, payments } = session.proposal - const prop_path_tabs = get_path_total(paths) - const prop_path_total = prop_path_tabs.reduce((p, c) => p + c[1], 0) - const prop_pay_total = get_pay_total(payments) - const role_path_tabs = get_role_paths_totals(session.roles) - const role_path_total = role_path_tabs.reduce((p, c) => p + c[1], 0) - const role_pay_total = get_role_payment_totals(session.roles) - const path_map = new Map(role_path_tabs) - const path_total = prop_path_total + role_path_total - const pay_total = prop_pay_total + role_pay_total - - prop_path_tabs.forEach(([ path, value ]) => { - const curr = path_map.get(path) ?? 0 - path_map.set(path, curr + value) - }) + const prop_path_tabs = get_path_total(paths) + const prop_pay_total = get_pay_total(payments) + const role_path_tabs = get_role_paths_totals(session.roles) + const role_pay_total = get_role_payment_totals(session.roles) - const path_values = [ ...path_map.values() ] - const max_value = path_values + const prop_path_total = prop_path_tabs + .map(e => e[1]) + .sort((a, b) => a - b) + .at(-1) ?? 0 + const role_path_total = role_path_tabs + .map(e => e[1]) .sort((a, b) => a - b) - .pop() ?? 0 + .at(-1) ?? 0 + + const total_tabs = new Map(prop_path_tabs) + + for (const [ label, value ] of role_path_tabs) { + const curr = total_tabs.get(label) ?? 0 + total_tabs.set(label, curr + value) + } + + const proj_paths = [ ...total_tabs.entries() ] + .sort((a, b) => b[1] - a[1]) return { - max_value, - path_total, - pay_total, - total_value : path_total + pay_total, - path_tabs : [ ...path_map.entries() ], - proposal : { + proj_paths, + proposal : { path_tabs : prop_path_tabs, path_total : prop_path_total, pay_total : prop_pay_total }, roles : { - path_tabs : [ ...role_path_tabs.entries() ], + path_tabs : role_path_tabs, path_total : role_path_total, pay_total : role_pay_total } @@ -152,8 +143,7 @@ export function verify_session ( export function publish_session ( session : DraftSession ) : ContractRequest { - const { proposal } = session - const signatures = get_signatures(session.members) + const { proposal, sigs: signatures } = session return { proposal, signatures } } diff --git a/src/client/schema.ts b/src/client/schema.ts index 2a68cb80..c39ebbf5 100644 --- a/src/client/schema.ts +++ b/src/client/schema.ts @@ -52,7 +52,8 @@ const policy = z.object({ const session = z.object({ members : mship.array(), proposal : prop.data, - roles : policy.array() + roles : policy.array(), + sigs : hex.array() }) export default { client_config, cred, mship, path, policy, role, session, signer_config } diff --git a/src/client/types.ts b/src/client/types.ts index 0bfb1ca2..d1ce3b24 100644 --- a/src/client/types.ts +++ b/src/client/types.ts @@ -76,8 +76,7 @@ export interface CredentialData { } export interface MemberData extends CredentialData { - pid : string - sig ?: string + pid : string } export interface DraftTemplate { @@ -89,6 +88,7 @@ export interface DraftSession { proposal : ProposalData members : MemberData[] roles : RolePolicy[] + sigs : string[] } export interface WalletAPI { From 8a51e0b52b00feeaf5d1a1ae77a0e6c6bd776c27 Mon Sep 17 00:00:00 2001 From: Christopher Scott Date: Wed, 1 May 2024 17:08:52 -0500 Subject: [PATCH 24/26] v0.12.14 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f8b1eaab..55c2844c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@scrow/sdk", - "version": "0.12.13", + "version": "0.12.14", "description": "Development SDK for the BitEscrow API.", "author": "Christopher Scott", "license": "MIT", From 03d3e27dd92fa36b6e1922f1451ecdb9d655e182 Mon Sep 17 00:00:00 2001 From: Christopher Scott Date: Wed, 1 May 2024 17:15:15 -0500 Subject: [PATCH 25/26] v0.12.15 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 55c2844c..b2456673 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@scrow/sdk", - "version": "0.12.14", + "version": "0.12.15", "description": "Development SDK for the BitEscrow API.", "author": "Christopher Scott", "license": "MIT", From 5beb0316b549876eb99b7cda1abb1088d140239d Mon Sep 17 00:00:00 2001 From: Christopher Scott Date: Wed, 8 May 2024 14:00:40 -0500 Subject: [PATCH 26/26] update --- src/client/api/signer/draft.ts | 12 +++++++----- src/client/lib/enrollment.ts | 1 - 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/client/api/signer/draft.ts b/src/client/api/signer/draft.ts index b6ddf395..54cbcf60 100644 --- a/src/client/api/signer/draft.ts +++ b/src/client/api/signer/draft.ts @@ -1,6 +1,11 @@ import { verify_proposal } from '@/core/validation/proposal.js' import { EscrowSigner } from '../../class/signer.js' +import { + get_proposal_id, + verify_endorsement +} from '@/core/lib/proposal.js' + import { CredentialConfig, DraftSession @@ -16,7 +21,6 @@ import { join_session, leave_session } from '../../lib/session.js' -import { get_proposal_id, verify_endorsement } from '@/core/lib/proposal.js' export function join_session_api (esigner : EscrowSigner) { return ( @@ -71,10 +75,8 @@ export function has_role_api (esigner : EscrowSigner) { } export function has_signature_api (esigner : EscrowSigner) { - const pub = esigner.pubkey - return ( - session : DraftSession - ) : boolean => { + return (session : DraftSession) : boolean => { + const pub = esigner.pubkey const sig = session.sigs.find(e => e.slice(0, 64) === pub) if (sig === undefined) return false const prop_id = get_proposal_id(session.proposal) diff --git a/src/client/lib/enrollment.ts b/src/client/lib/enrollment.ts index 4a251f0c..6c062181 100644 --- a/src/client/lib/enrollment.ts +++ b/src/client/lib/enrollment.ts @@ -155,7 +155,6 @@ export function verify_member_data ( const rdata = get_enrollment(cred, proposal) const rpaths = rdata.paths.map(e => e.toString()) const rprogs = programs.map(e => e.toString()) - console.log('pay:', payment, rdata.payment) if ( typeof payment === 'number' && payment > 0 &&