ecash-agora 0.1.1-rc

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/ad.d.ts ADDED
@@ -0,0 +1,15 @@
1
+ import * as chronik from 'chronik-client';
2
+ import { OutPoint, TxInput } from 'ecash-lib';
3
+ import { AgoraOneshot } from './oneshot.js';
4
+ type ParsedAdVariant = {
5
+ type: 'ONESHOT';
6
+ params: AgoraOneshot;
7
+ };
8
+ export interface ParsedAd extends ParsedAdVariant {
9
+ outpoint: OutPoint;
10
+ txBuilderInput: TxInput;
11
+ spentBy: OutPoint | undefined;
12
+ }
13
+ export declare function parseAgoraTx(tx: chronik.Tx): ParsedAd | undefined;
14
+ export {};
15
+ //# sourceMappingURL=ad.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ad.d.ts","sourceRoot":"","sources":["../src/ad.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAEH,QAAQ,EAER,OAAO,EAOV,MAAM,WAAW,CAAC;AAEnB,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,KAAK,eAAe,GAAG;IACnB,IAAI,EAAE,SAAS,CAAC;IAChB,MAAM,EAAE,YAAY,CAAC;CACxB,CAAC;AAEF,MAAM,WAAW,QAAS,SAAQ,eAAe;IAC7C,QAAQ,EAAE,QAAQ,CAAC;IACnB,cAAc,EAAE,OAAO,CAAC;IACxB,OAAO,EAAE,QAAQ,GAAG,SAAS,CAAC;CACjC;AAED,wBAAgB,YAAY,CAAC,EAAE,EAAE,OAAO,CAAC,EAAE,GAAG,QAAQ,GAAG,SAAS,CAgFjE"}
package/dist/ad.js ADDED
@@ -0,0 +1,111 @@
1
+ // Copyright (c) 2024 The Bitcoin developers
2
+ // Distributed under the MIT software license, see the accompanying
3
+ // file COPYING or http://www.opensource.org/licenses/mit-license.php.
4
+ import { Script, bytesToStr, fromHex, isPushOp, shaRmd160, slpSend, toHex, } from 'ecash-lib';
5
+ import { AGORA_LOKAD_ID_STR } from './consts.js';
6
+ import { AgoraOneshot } from './oneshot.js';
7
+ export function parseAgoraTx(tx) {
8
+ if (tx.inputs.length === 0) {
9
+ return undefined;
10
+ }
11
+ if (tx.outputs.length < 2) {
12
+ return undefined;
13
+ }
14
+ if (tx.tokenEntries.length === 0) {
15
+ return undefined;
16
+ }
17
+ const adInput = tx.inputs[0];
18
+ const offerOutput = tx.outputs[1];
19
+ if (offerOutput.token === undefined) {
20
+ return undefined;
21
+ }
22
+ const tokenEntry = tx.tokenEntries[0];
23
+ let opreturnScript;
24
+ switch (tokenEntry.tokenType.protocol) {
25
+ case 'SLP':
26
+ opreturnScript = slpSend(tokenEntry.tokenId, tokenEntry.tokenType.number, [0, BigInt(offerOutput.token.amount)]);
27
+ break;
28
+ case 'ALP':
29
+ // ALP not implemented yet
30
+ return undefined;
31
+ }
32
+ const scriptSig = new Script(fromHex(adInput.inputScript));
33
+ const parsedAd = parseAdScriptSig(scriptSig);
34
+ if (parsedAd === undefined) {
35
+ return undefined;
36
+ }
37
+ let variant;
38
+ let expectedAgoraScript;
39
+ let expectedAgoraP2sh;
40
+ switch (parsedAd.covenantVariant) {
41
+ case AgoraOneshot.COVENANT_VARIANT: {
42
+ let agoraOneshot;
43
+ try {
44
+ agoraOneshot = AgoraOneshot.fromRedeemScript(parsedAd.redeemScript, opreturnScript);
45
+ }
46
+ catch (ex) {
47
+ return undefined;
48
+ }
49
+ variant = {
50
+ type: 'ONESHOT',
51
+ params: agoraOneshot,
52
+ };
53
+ expectedAgoraScript = agoraOneshot.script();
54
+ expectedAgoraP2sh = Script.p2sh(shaRmd160(expectedAgoraScript.bytecode));
55
+ break;
56
+ }
57
+ default:
58
+ return undefined;
59
+ }
60
+ if (offerOutput.outputScript !== toHex(expectedAgoraP2sh.bytecode)) {
61
+ return undefined;
62
+ }
63
+ const outpoint = {
64
+ txid: tx.txid,
65
+ outIdx: 1,
66
+ };
67
+ return {
68
+ ...variant,
69
+ outpoint,
70
+ txBuilderInput: {
71
+ prevOut: outpoint,
72
+ signData: {
73
+ value: offerOutput.value,
74
+ redeemScript: expectedAgoraScript,
75
+ },
76
+ },
77
+ spentBy: offerOutput.spentBy,
78
+ };
79
+ }
80
+ /**
81
+ * How many pushops we expect at least for an advertisement.
82
+ * There has to be at least a LOKAD ID, a covenant variant and a redeemScript.
83
+ **/
84
+ const MIN_NUM_SCRIPTSIG_PUSHOPS = 3;
85
+ function parseAdScriptSig(scriptSig) {
86
+ const ops = scriptSig.ops();
87
+ const pushdata = [];
88
+ let op;
89
+ while ((op = ops.next())) {
90
+ if (!isPushOp(op)) {
91
+ return undefined;
92
+ }
93
+ pushdata.push(op.data);
94
+ }
95
+ if (pushdata.length < MIN_NUM_SCRIPTSIG_PUSHOPS) {
96
+ return undefined;
97
+ }
98
+ const lokadId = pushdata[0];
99
+ if (bytesToStr(lokadId) != AGORA_LOKAD_ID_STR) {
100
+ return undefined;
101
+ }
102
+ const covenantVariant = bytesToStr(pushdata[1]);
103
+ const parsedPushdata = pushdata.slice(2, -1);
104
+ const redeemScript = new Script(pushdata[pushdata.length - 1]);
105
+ return {
106
+ covenantVariant,
107
+ pushdata: parsedPushdata,
108
+ redeemScript,
109
+ };
110
+ }
111
+ //# sourceMappingURL=ad.js.map
package/dist/ad.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ad.js","sourceRoot":"","sources":["../src/ad.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,178 @@
1
+ import { ChronikClient, Token } from 'chronik-client';
2
+ import { Ecc, OutPoint, Script, Tx, TxBuilderInput, TxInput } from 'ecash-lib';
3
+ import { AgoraOneshot } from './oneshot.js';
4
+ import { AgoraPartial } from './partial.js';
5
+ /** Offer variant, determines the Script used to enforce the offer */
6
+ export type AgoraOfferVariant = {
7
+ type: 'ONESHOT';
8
+ params: AgoraOneshot;
9
+ } | {
10
+ type: 'PARTIAL';
11
+ params: AgoraPartial;
12
+ };
13
+ /**
14
+ * Individual token offer on the Agora, i.e. one UTXO offering tokens.
15
+ *
16
+ * It can be used to accept or cancel the offer.
17
+ */
18
+ export declare class AgoraOffer {
19
+ variant: AgoraOfferVariant;
20
+ outpoint: OutPoint;
21
+ txBuilderInput: TxInput;
22
+ token: Token;
23
+ constructor(params: {
24
+ variant: AgoraOfferVariant;
25
+ outpoint: OutPoint;
26
+ txBuilderInput: TxInput;
27
+ token: Token;
28
+ });
29
+ /**
30
+ * Build a tx accepting this offer.
31
+ *
32
+ * Agora offers are UTXOs on the blockchain that can be accepted by anyone
33
+ * sending sufficient satoshis to a required output.
34
+ *
35
+ * `fuelInputs` has to provide enough sats for this offer to cover ask + tx fee.
36
+ * */
37
+ acceptTx(params: {
38
+ /** ECC object to sign signatures. */
39
+ ecc: Ecc;
40
+ /**
41
+ * Arbitrary secret key to sign the accept tx with. Recommended to set
42
+ * this to a random key. Must be paired with covenantSk.
43
+ **/
44
+ covenantSk: Uint8Array;
45
+ /**
46
+ * Arbitrary public key to sign the accept tx with, must be paired with
47
+ * covenantSk.
48
+ **/
49
+ covenantPk: Uint8Array;
50
+ /**
51
+ * Inputs fueling this tx to cover tx fee and asked sats for the
52
+ * enforced outputs. Must have signatory and input.signData set
53
+ * correctly. If it is set incorrectly, may fail silently and build an
54
+ * invalid tx, failing at broadcast.
55
+ *
56
+ * The free sats of these inputs must be at least askedSats + acceptFeeSats.
57
+ **/
58
+ fuelInputs: TxBuilderInput[];
59
+ /** Script to send the tokens and the leftover sats (if any) to. */
60
+ recipientScript: Script;
61
+ /** For partial offers: Number of accepted tokens */
62
+ acceptedTokens?: bigint;
63
+ /** Dust amount to use for the token output. */
64
+ dustAmount?: number;
65
+ /** Fee per kB to use when building the tx. */
66
+ feePerKb?: number;
67
+ }): Tx;
68
+ /**
69
+ * How many extra satoshis are required to fuel this offer so it can be
70
+ * broadcast on the network, excluding the asked sats.
71
+ * This should be displayed to the user as network fee.
72
+ * The total required input amount is askedSats + acceptFeeSats.
73
+ **/
74
+ acceptFeeSats(params: {
75
+ /** Script to send the tokens and the leftover sats (if any) to. */
76
+ recipientScript: Script;
77
+ /** Extra inputs */
78
+ extraInputs?: TxBuilderInput[];
79
+ /** Fee per kB to use when building the tx. */
80
+ feePerKb?: number;
81
+ acceptedTokens?: bigint;
82
+ }): bigint;
83
+ private _acceptTxBuilder;
84
+ /**
85
+ * Build a tx canceling the offer.
86
+ *
87
+ * An offer can only be cancelled using the secret key that created it.
88
+ *
89
+ * `fuelInputs` must cover the tx fee, you can calculate it with cancelFeeSats.
90
+ **/
91
+ cancelTx(params: {
92
+ /** ECC object to sign signatures. */
93
+ ecc: Ecc;
94
+ /**
95
+ * Cancel secret key of the offer, must be paired with the cancelPk of
96
+ * the offer.
97
+ **/
98
+ cancelSk: Uint8Array;
99
+ /**
100
+ * Inputs fueling this tx with sats. Must have signatory and
101
+ * input.signData set correctly. If it is set incorrectly, may fail
102
+ * silently and build an invalid tx, failing at broadcast.
103
+ *
104
+ * The free sats of these inputs must be at least cancelFeeSats.
105
+ **/
106
+ fuelInputs: TxBuilderInput[];
107
+ /** Script to send canceled tokens and the leftover sats (if any) to. */
108
+ recipientScript: Script;
109
+ /** Dust amount to use for the token output. */
110
+ dustAmount?: number;
111
+ /** Fee per kB to use when building the tx. */
112
+ feePerKb?: number;
113
+ }): Tx;
114
+ /**
115
+ * How many extra satoshis are required to fuel cancelling this offer,
116
+ * so the cancel tx can be broadcast on the network, excluding the asked
117
+ * sats and a dust amount to receive the tokens.
118
+ *
119
+ * extraInputs can be used to add an ad input so we have the correct
120
+ * estimate in case of a cancel + reoffer.
121
+ *
122
+ * This should be displayed to the user as cancellation network fee.
123
+ * The total required sats input amount is returned by this function.
124
+ **/
125
+ cancelFeeSats(params: {
126
+ /** Script to send the tokens and the leftover sats (if any) to. */
127
+ recipientScript: Script;
128
+ /** Extra inputs */
129
+ extraInputs?: TxBuilderInput[];
130
+ /** Fee per kB to use when building the tx. */
131
+ feePerKb?: number;
132
+ }): bigint;
133
+ private _cancelTxBuilder;
134
+ /**
135
+ * How many satoshis are asked to accept this offer, excluding tx fees.
136
+ * This is what should be displayed to the user as the price.
137
+ **/
138
+ askedSats(acceptedTokens?: bigint): bigint;
139
+ }
140
+ /**
141
+ * Enables access to Agora, via Chronik instances that have the "agora" plugin
142
+ * loaded.
143
+ *
144
+ * See agora.py.
145
+ **/
146
+ export declare class Agora {
147
+ private plugin;
148
+ private dustAmount;
149
+ /**
150
+ * Create an Agora instance. The provided Chronik instance must have the
151
+ * "agora" plugin loaded.
152
+ **/
153
+ constructor(chronik: ChronikClient, dustAmount?: number);
154
+ /**
155
+ * Query all the token IDs, fungible and non-fungible ones, that have active
156
+ * Agora offers.
157
+ **/
158
+ allOfferedTokenIds(): Promise<string[]>;
159
+ /** Query all fungible token IDs that have active Agora offers. */
160
+ offeredFungibleTokenIds(): Promise<string[]>;
161
+ /**
162
+ * Query all token IDs of groups of non-fungible tokens that have active
163
+ * Agora offers.
164
+ **/
165
+ offeredGroupTokenIds(): Promise<string[]>;
166
+ /** Query all active offers by token ID. */
167
+ activeOffersByTokenId(tokenId: string): Promise<AgoraOffer[]>;
168
+ /** Query all active offers by group token ID. */
169
+ activeOffersByGroupTokenId(groupTokenId: string): Promise<AgoraOffer[]>;
170
+ /** Query all active offers with the given cancel pubkey. */
171
+ activeOffersByPubKey(pubkeyHex: string): Promise<AgoraOffer[]>;
172
+ private _allTokenIdsByPrefix;
173
+ private _activeOffersByGroup;
174
+ private _parseOfferUtxo;
175
+ private _parseOneshotOfferUtxo;
176
+ private _parsePartialOfferUtxo;
177
+ }
178
+ //# sourceMappingURL=agora.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agora.d.ts","sourceRoot":"","sources":["../src/agora.ts"],"names":[],"mappings":"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"}