@opaquecash/stealth-chain-solana 0.2.0
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/README.md +69 -0
- package/dist/adapter.d.ts +76 -0
- package/dist/adapter.d.ts.map +1 -0
- package/dist/adapter.js +114 -0
- package/dist/adapter.js.map +1 -0
- package/dist/announcer.d.ts +92 -0
- package/dist/announcer.d.ts.map +1 -0
- package/dist/announcer.js +164 -0
- package/dist/announcer.js.map +1 -0
- package/dist/bytes.d.ts +35 -0
- package/dist/bytes.d.ts.map +1 -0
- package/dist/bytes.js +78 -0
- package/dist/bytes.js.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -0
- package/dist/ons.d.ts +122 -0
- package/dist/ons.d.ts.map +1 -0
- package/dist/ons.js +167 -0
- package/dist/ons.js.map +1 -0
- package/dist/programs.d.ts +60 -0
- package/dist/programs.d.ts.map +1 -0
- package/dist/programs.js +69 -0
- package/dist/programs.js.map +1 -0
- package/dist/registry.d.ts +39 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +69 -0
- package/dist/registry.js.map +1 -0
- package/dist/relay.d.ts +71 -0
- package/dist/relay.d.ts.map +1 -0
- package/dist/relay.js +102 -0
- package/dist/relay.js.map +1 -0
- package/dist/sns.d.ts +16 -0
- package/dist/sns.d.ts.map +1 -0
- package/dist/sns.js +38 -0
- package/dist/sns.js.map +1 -0
- package/dist/stealth.d.ts +22 -0
- package/dist/stealth.d.ts.map +1 -0
- package/dist/stealth.js +38 -0
- package/dist/stealth.js.map +1 -0
- package/dist/sweep.d.ts +41 -0
- package/dist/sweep.d.ts.map +1 -0
- package/dist/sweep.js +76 -0
- package/dist/sweep.js.map +1 -0
- package/dist/uab-receiver.d.ts +57 -0
- package/dist/uab-receiver.d.ts.map +1 -0
- package/dist/uab-receiver.js +121 -0
- package/dist/uab-receiver.js.map +1 -0
- package/idl/stealth_announcer.json +460 -0
- package/package.json +42 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uab-receiver.d.ts","sourceRoot":"","sources":["../src/uab-receiver.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AACvE,OAAO,KAAK,EAAE,YAAY,EAAO,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAKL,KAAK,UAAU,EAChB,MAAM,0BAA0B,CAAC;AASlC,gFAAgF;AAChF,MAAM,WAAW,kCAAkC;IACjD,4DAA4D;IAC5D,WAAW,EAAE,MAAM,CAAC;IACpB,sEAAsE;IACtE,aAAa,EAAE,UAAU,CAAC;IAC1B,oDAAoD;IACpD,QAAQ,EAAE,MAAM,CAAC;IACjB,yCAAyC;IACzC,OAAO,EAAE,UAAU,CAAC;CACrB;AAmBD;;;;GAIG;AACH,wBAAgB,qCAAqC,CACnD,IAAI,EAAE,UAAU,GACf,kCAAkC,GAAG,IAAI,CAoB3C;AAED,uFAAuF;AACvF,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,kCAAkC,EACzC,UAAU,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,GACpD,YAAY,CAcd;AAED;;;;GAIG;AACH,wBAAgB,gCAAgC,CAC9C,IAAI,EAAE,MAAM,EAAE,EACd,UAAU,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,GACpD,YAAY,EAAE,CAWhB;AAED;;;;GAIG;AACH,wBAAsB,iCAAiC,CACrD,UAAU,EAAE,UAAU,EACtB,MAAM,EAAE;IACN,oBAAoB,EAAE,SAAS,CAAC;IAChC,kFAAkF;IAClF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kEAAkE;IAClE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gDAAgD;IAChD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,QAAQ,CAAC;CACvB,GACA,OAAO,CAAC,YAAY,EAAE,CAAC,CAyBzB"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Read Ethereum-originated announcements mirrored on Solana by the `uab-receiver`
|
|
3
|
+
* program. The program verifies a posted Wormhole VAA and re-emits the canonical
|
|
4
|
+
* 96-byte payload as a `CrossChainAnnouncement` Anchor event; this module decodes
|
|
5
|
+
* those events into the same chain-neutral {@link Announcement} shape as native
|
|
6
|
+
* announcer logs, so the universal scan loop needs no special casing.
|
|
7
|
+
*/
|
|
8
|
+
import { decodeUabPayload, uabPayloadToMetadata, uabStealthAddressEvm, UAB_PAYLOAD_LENGTH, } from "@opaquecash/stealth-core";
|
|
9
|
+
import { ByteReader, bytesToHex } from "./bytes.js";
|
|
10
|
+
import { CROSS_CHAIN_ANNOUNCEMENT_EVENT_DISCRIMINATOR, SCHEME_ID_SECP256K1, } from "./programs.js";
|
|
11
|
+
const PROGRAM_DATA_PREFIX = "Program data: ";
|
|
12
|
+
function discriminatorMatches(data, disc) {
|
|
13
|
+
if (data.length < disc.length)
|
|
14
|
+
return false;
|
|
15
|
+
for (let i = 0; i < disc.length; i++)
|
|
16
|
+
if (data[i] !== disc[i])
|
|
17
|
+
return false;
|
|
18
|
+
return true;
|
|
19
|
+
}
|
|
20
|
+
function base64ToBytes(b64) {
|
|
21
|
+
if (typeof atob === "function") {
|
|
22
|
+
const bin = atob(b64);
|
|
23
|
+
const out = new Uint8Array(bin.length);
|
|
24
|
+
for (let i = 0; i < bin.length; i++)
|
|
25
|
+
out[i] = bin.charCodeAt(i);
|
|
26
|
+
return out;
|
|
27
|
+
}
|
|
28
|
+
// Node fallback.
|
|
29
|
+
return new Uint8Array(Buffer.from(b64, "base64"));
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Decode a single `CrossChainAnnouncement` event payload (the bytes after the
|
|
33
|
+
* `Program data: ` base64 decode). Returns `null` when the discriminator does not
|
|
34
|
+
* match or the buffer is malformed.
|
|
35
|
+
*/
|
|
36
|
+
export function decodeCrossChainAnnouncementEventData(data) {
|
|
37
|
+
if (!discriminatorMatches(data, CROSS_CHAIN_ANNOUNCEMENT_EVENT_DISCRIMINATOR)) {
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
try {
|
|
41
|
+
const r = new ByteReader(data, CROSS_CHAIN_ANNOUNCEMENT_EVENT_DISCRIMINATOR.length);
|
|
42
|
+
const sourceChain = r.readU16();
|
|
43
|
+
const sourceEmitter = r.readBytes(32);
|
|
44
|
+
const sequence = r.readU64();
|
|
45
|
+
const payloadBytes = r.readVecU8();
|
|
46
|
+
if (payloadBytes.length !== UAB_PAYLOAD_LENGTH)
|
|
47
|
+
return null;
|
|
48
|
+
return {
|
|
49
|
+
sourceChain,
|
|
50
|
+
sourceEmitter,
|
|
51
|
+
sequence,
|
|
52
|
+
payload: decodeUabPayload(payloadBytes),
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/** Map a decoded cross-chain event to the chain-neutral {@link Announcement} shape. */
|
|
60
|
+
export function crossChainEventToAnnouncement(event, provenance = {}) {
|
|
61
|
+
const p = event.payload;
|
|
62
|
+
return {
|
|
63
|
+
// The scanner matches the 20-byte EVM-style identifier on both chains (CSAP §2.3).
|
|
64
|
+
stealthAddress: ("0x" + bytesToHex(uabStealthAddressEvm(p))),
|
|
65
|
+
ephemeralPubKey: p.ephemeralPubKey,
|
|
66
|
+
viewTag: p.viewTag,
|
|
67
|
+
metadata: uabPayloadToMetadata(p),
|
|
68
|
+
// The announcement's origin chain, NOT Solana — callers can distinguish
|
|
69
|
+
// relayed announcements from native ones by comparing against the adapter's id.
|
|
70
|
+
chainId: p.sourceChainId,
|
|
71
|
+
txHash: provenance.txHash,
|
|
72
|
+
cursor: provenance.cursor,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Decode every `CrossChainAnnouncement` event in a transaction's log messages.
|
|
77
|
+
* Non-matching `Program data:` lines are skipped, as are payloads whose scheme id
|
|
78
|
+
* is not secp256k1 (scheme 1).
|
|
79
|
+
*/
|
|
80
|
+
export function decodeCrossChainAnnouncementLogs(logs, provenance = {}) {
|
|
81
|
+
const out = [];
|
|
82
|
+
for (const log of logs) {
|
|
83
|
+
if (!log.startsWith(PROGRAM_DATA_PREFIX))
|
|
84
|
+
continue;
|
|
85
|
+
const data = base64ToBytes(log.slice(PROGRAM_DATA_PREFIX.length));
|
|
86
|
+
const event = decodeCrossChainAnnouncementEventData(data);
|
|
87
|
+
if (!event)
|
|
88
|
+
continue;
|
|
89
|
+
if (BigInt(event.payload.schemeId) !== SCHEME_ID_SECP256K1)
|
|
90
|
+
continue;
|
|
91
|
+
out.push(crossChainEventToAnnouncement(event, provenance));
|
|
92
|
+
}
|
|
93
|
+
return out;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Fetch historical cross-chain announcements by walking recent signatures for the
|
|
97
|
+
* `uab-receiver` program and decoding each transaction's logs. Returns chain-neutral
|
|
98
|
+
* {@link Announcement}s (with the *origin* chain id) in signature order (newest first).
|
|
99
|
+
*/
|
|
100
|
+
export async function fetchCrossChainAnnouncementsRange(connection, params) {
|
|
101
|
+
const commitment = params.commitment ?? "confirmed";
|
|
102
|
+
const signatures = await connection.getSignaturesForAddress(params.uabReceiverProgramId, { limit: params.limit ?? 1000, before: params.before, until: params.until }, commitment);
|
|
103
|
+
const out = [];
|
|
104
|
+
for (const sig of signatures) {
|
|
105
|
+
if (sig.err)
|
|
106
|
+
continue;
|
|
107
|
+
const tx = await connection.getTransaction(sig.signature, {
|
|
108
|
+
commitment,
|
|
109
|
+
maxSupportedTransactionVersion: 0,
|
|
110
|
+
});
|
|
111
|
+
const logs = tx?.meta?.logMessages;
|
|
112
|
+
if (!logs)
|
|
113
|
+
continue;
|
|
114
|
+
out.push(...decodeCrossChainAnnouncementLogs(logs, {
|
|
115
|
+
txHash: sig.signature,
|
|
116
|
+
cursor: BigInt(sig.slot),
|
|
117
|
+
}));
|
|
118
|
+
}
|
|
119
|
+
return out;
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=uab-receiver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uab-receiver.js","sourceRoot":"","sources":["../src/uab-receiver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,460 @@
|
|
|
1
|
+
{
|
|
2
|
+
"address": "HGFn2fH7bVQ5cSuiG52NjzN9m11YrB3FZUfoN9b9A5jf",
|
|
3
|
+
"metadata": {
|
|
4
|
+
"name": "stealth_announcer",
|
|
5
|
+
"version": "0.1.0",
|
|
6
|
+
"spec": "0.1.0",
|
|
7
|
+
"description": "Stealth Address Announcer for Opaque Protocol on Solana"
|
|
8
|
+
},
|
|
9
|
+
"docs": [
|
|
10
|
+
"Stealth Address Announcer — emits Announcement events when something is sent",
|
|
11
|
+
"to a stealth address. Equivalent to ERC-5564 on Ethereum.",
|
|
12
|
+
"One deployment per cluster so scanners can subscribe to a single log source.",
|
|
13
|
+
"",
|
|
14
|
+
"schemeId 1 = secp256k1 with view tags. metadata[0] = view tag byte;",
|
|
15
|
+
"remaining bytes can carry encrypted payment IDs or attestation data."
|
|
16
|
+
],
|
|
17
|
+
"instructions": [
|
|
18
|
+
{
|
|
19
|
+
"name": "announce",
|
|
20
|
+
"docs": [
|
|
21
|
+
"Emit an announcement so the recipient's scanner can detect the transfer.",
|
|
22
|
+
"",
|
|
23
|
+
"* `scheme_id` — Stealth scheme (1 = secp256k1).",
|
|
24
|
+
"* `stealth_address` — The one-time stealth address (as 20-byte Ethereum-compatible",
|
|
25
|
+
"address or 32-byte Solana pubkey, stored as bytes for cross-chain flexibility).",
|
|
26
|
+
"* `ephemeral_pub_key` — Compressed secp256k1 ephemeral public key (33 bytes).",
|
|
27
|
+
"* `metadata` — First byte MUST be the view tag; rest is optional."
|
|
28
|
+
],
|
|
29
|
+
"discriminator": [
|
|
30
|
+
7,
|
|
31
|
+
30,
|
|
32
|
+
100,
|
|
33
|
+
250,
|
|
34
|
+
110,
|
|
35
|
+
253,
|
|
36
|
+
3,
|
|
37
|
+
149
|
|
38
|
+
],
|
|
39
|
+
"accounts": [
|
|
40
|
+
{
|
|
41
|
+
"name": "caller",
|
|
42
|
+
"writable": true,
|
|
43
|
+
"signer": true
|
|
44
|
+
}
|
|
45
|
+
],
|
|
46
|
+
"args": [
|
|
47
|
+
{
|
|
48
|
+
"name": "scheme_id",
|
|
49
|
+
"type": "u64"
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
"name": "stealth_address",
|
|
53
|
+
"type": "bytes"
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
"name": "ephemeral_pub_key",
|
|
57
|
+
"type": "bytes"
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
"name": "metadata",
|
|
61
|
+
"type": "bytes"
|
|
62
|
+
}
|
|
63
|
+
]
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
"name": "announce_with_log",
|
|
67
|
+
"docs": [
|
|
68
|
+
"Announce with an on-chain log record for indexing.",
|
|
69
|
+
"Creates a small PDA so indexers can use getProgramAccounts queries",
|
|
70
|
+
"in addition to parsing transaction logs.",
|
|
71
|
+
"",
|
|
72
|
+
"`log_id` — unique 32-byte id for this log PDA (e.g. random bytes or a hash of payload + nonce)."
|
|
73
|
+
],
|
|
74
|
+
"discriminator": [
|
|
75
|
+
6,
|
|
76
|
+
56,
|
|
77
|
+
231,
|
|
78
|
+
53,
|
|
79
|
+
83,
|
|
80
|
+
33,
|
|
81
|
+
135,
|
|
82
|
+
17
|
|
83
|
+
],
|
|
84
|
+
"accounts": [
|
|
85
|
+
{
|
|
86
|
+
"name": "announcement_log",
|
|
87
|
+
"writable": true,
|
|
88
|
+
"pda": {
|
|
89
|
+
"seeds": [
|
|
90
|
+
{
|
|
91
|
+
"kind": "const",
|
|
92
|
+
"value": [
|
|
93
|
+
97,
|
|
94
|
+
110,
|
|
95
|
+
110,
|
|
96
|
+
111,
|
|
97
|
+
117,
|
|
98
|
+
110,
|
|
99
|
+
99,
|
|
100
|
+
101,
|
|
101
|
+
109,
|
|
102
|
+
101,
|
|
103
|
+
110,
|
|
104
|
+
116
|
|
105
|
+
]
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
"kind": "account",
|
|
109
|
+
"path": "caller"
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
"kind": "arg",
|
|
113
|
+
"path": "log_id"
|
|
114
|
+
}
|
|
115
|
+
]
|
|
116
|
+
}
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
"name": "caller",
|
|
120
|
+
"writable": true,
|
|
121
|
+
"signer": true
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
"name": "system_program",
|
|
125
|
+
"address": "11111111111111111111111111111111"
|
|
126
|
+
}
|
|
127
|
+
],
|
|
128
|
+
"args": [
|
|
129
|
+
{
|
|
130
|
+
"name": "scheme_id",
|
|
131
|
+
"type": "u64"
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
"name": "stealth_address",
|
|
135
|
+
"type": "bytes"
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
"name": "ephemeral_pub_key",
|
|
139
|
+
"type": "bytes"
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
"name": "metadata",
|
|
143
|
+
"type": "bytes"
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
"name": "log_id",
|
|
147
|
+
"type": {
|
|
148
|
+
"array": [
|
|
149
|
+
"u8",
|
|
150
|
+
32
|
|
151
|
+
]
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
]
|
|
155
|
+
},
|
|
156
|
+
{
|
|
157
|
+
"name": "announce_with_relay",
|
|
158
|
+
"docs": [
|
|
159
|
+
"Announce locally AND relay the announcement cross-chain via Wormhole.",
|
|
160
|
+
"",
|
|
161
|
+
"Emits the standard `Announcement` (so Solana scanners still see it) and publishes the",
|
|
162
|
+
"96-byte cross-chain payload (spec/payload-format.md) through the Wormhole Core Contract.",
|
|
163
|
+
"`batch_id` is the Wormhole nonce; `wormhole_fee` is the current `messageFee` (0 on",
|
|
164
|
+
"devnet) transferred to the fee collector before posting."
|
|
165
|
+
],
|
|
166
|
+
"discriminator": [
|
|
167
|
+
3,
|
|
168
|
+
242,
|
|
169
|
+
201,
|
|
170
|
+
249,
|
|
171
|
+
200,
|
|
172
|
+
171,
|
|
173
|
+
146,
|
|
174
|
+
79
|
|
175
|
+
],
|
|
176
|
+
"accounts": [
|
|
177
|
+
{
|
|
178
|
+
"name": "caller",
|
|
179
|
+
"writable": true,
|
|
180
|
+
"signer": true
|
|
181
|
+
},
|
|
182
|
+
{
|
|
183
|
+
"name": "wormhole_emitter",
|
|
184
|
+
"pda": {
|
|
185
|
+
"seeds": [
|
|
186
|
+
{
|
|
187
|
+
"kind": "const",
|
|
188
|
+
"value": [
|
|
189
|
+
101,
|
|
190
|
+
109,
|
|
191
|
+
105,
|
|
192
|
+
116,
|
|
193
|
+
116,
|
|
194
|
+
101,
|
|
195
|
+
114
|
|
196
|
+
]
|
|
197
|
+
}
|
|
198
|
+
]
|
|
199
|
+
}
|
|
200
|
+
},
|
|
201
|
+
{
|
|
202
|
+
"name": "wormhole_config",
|
|
203
|
+
"writable": true,
|
|
204
|
+
"pda": {
|
|
205
|
+
"seeds": [
|
|
206
|
+
{
|
|
207
|
+
"kind": "const",
|
|
208
|
+
"value": [
|
|
209
|
+
66,
|
|
210
|
+
114,
|
|
211
|
+
105,
|
|
212
|
+
100,
|
|
213
|
+
103,
|
|
214
|
+
101
|
|
215
|
+
]
|
|
216
|
+
}
|
|
217
|
+
],
|
|
218
|
+
"program": {
|
|
219
|
+
"kind": "account",
|
|
220
|
+
"path": "wormhole_program"
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
},
|
|
224
|
+
{
|
|
225
|
+
"name": "wormhole_fee_collector",
|
|
226
|
+
"writable": true,
|
|
227
|
+
"pda": {
|
|
228
|
+
"seeds": [
|
|
229
|
+
{
|
|
230
|
+
"kind": "const",
|
|
231
|
+
"value": [
|
|
232
|
+
102,
|
|
233
|
+
101,
|
|
234
|
+
101,
|
|
235
|
+
95,
|
|
236
|
+
99,
|
|
237
|
+
111,
|
|
238
|
+
108,
|
|
239
|
+
108,
|
|
240
|
+
101,
|
|
241
|
+
99,
|
|
242
|
+
116,
|
|
243
|
+
111,
|
|
244
|
+
114
|
|
245
|
+
]
|
|
246
|
+
}
|
|
247
|
+
],
|
|
248
|
+
"program": {
|
|
249
|
+
"kind": "account",
|
|
250
|
+
"path": "wormhole_program"
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
},
|
|
254
|
+
{
|
|
255
|
+
"name": "wormhole_sequence",
|
|
256
|
+
"writable": true,
|
|
257
|
+
"pda": {
|
|
258
|
+
"seeds": [
|
|
259
|
+
{
|
|
260
|
+
"kind": "const",
|
|
261
|
+
"value": [
|
|
262
|
+
83,
|
|
263
|
+
101,
|
|
264
|
+
113,
|
|
265
|
+
117,
|
|
266
|
+
101,
|
|
267
|
+
110,
|
|
268
|
+
99,
|
|
269
|
+
101
|
|
270
|
+
]
|
|
271
|
+
},
|
|
272
|
+
{
|
|
273
|
+
"kind": "account",
|
|
274
|
+
"path": "wormhole_emitter"
|
|
275
|
+
}
|
|
276
|
+
],
|
|
277
|
+
"program": {
|
|
278
|
+
"kind": "account",
|
|
279
|
+
"path": "wormhole_program"
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
},
|
|
283
|
+
{
|
|
284
|
+
"name": "wormhole_message",
|
|
285
|
+
"writable": true,
|
|
286
|
+
"signer": true
|
|
287
|
+
},
|
|
288
|
+
{
|
|
289
|
+
"name": "wormhole_program",
|
|
290
|
+
"address": "3u8hJUVTA4jH1wYAyUur7FFZVQ8H635K3tSHHF4ssjQ5"
|
|
291
|
+
},
|
|
292
|
+
{
|
|
293
|
+
"name": "clock",
|
|
294
|
+
"address": "SysvarC1ock11111111111111111111111111111111"
|
|
295
|
+
},
|
|
296
|
+
{
|
|
297
|
+
"name": "rent",
|
|
298
|
+
"address": "SysvarRent111111111111111111111111111111111"
|
|
299
|
+
},
|
|
300
|
+
{
|
|
301
|
+
"name": "system_program",
|
|
302
|
+
"address": "11111111111111111111111111111111"
|
|
303
|
+
}
|
|
304
|
+
],
|
|
305
|
+
"args": [
|
|
306
|
+
{
|
|
307
|
+
"name": "scheme_id",
|
|
308
|
+
"type": "u64"
|
|
309
|
+
},
|
|
310
|
+
{
|
|
311
|
+
"name": "stealth_address",
|
|
312
|
+
"type": "bytes"
|
|
313
|
+
},
|
|
314
|
+
{
|
|
315
|
+
"name": "ephemeral_pub_key",
|
|
316
|
+
"type": "bytes"
|
|
317
|
+
},
|
|
318
|
+
{
|
|
319
|
+
"name": "metadata",
|
|
320
|
+
"type": "bytes"
|
|
321
|
+
},
|
|
322
|
+
{
|
|
323
|
+
"name": "batch_id",
|
|
324
|
+
"type": "u32"
|
|
325
|
+
},
|
|
326
|
+
{
|
|
327
|
+
"name": "wormhole_fee",
|
|
328
|
+
"type": "u64"
|
|
329
|
+
}
|
|
330
|
+
]
|
|
331
|
+
}
|
|
332
|
+
],
|
|
333
|
+
"accounts": [
|
|
334
|
+
{
|
|
335
|
+
"name": "AnnouncementLog",
|
|
336
|
+
"discriminator": [
|
|
337
|
+
176,
|
|
338
|
+
179,
|
|
339
|
+
30,
|
|
340
|
+
81,
|
|
341
|
+
93,
|
|
342
|
+
152,
|
|
343
|
+
35,
|
|
344
|
+
230
|
|
345
|
+
]
|
|
346
|
+
}
|
|
347
|
+
],
|
|
348
|
+
"events": [
|
|
349
|
+
{
|
|
350
|
+
"name": "Announcement",
|
|
351
|
+
"discriminator": [
|
|
352
|
+
7,
|
|
353
|
+
44,
|
|
354
|
+
132,
|
|
355
|
+
71,
|
|
356
|
+
104,
|
|
357
|
+
35,
|
|
358
|
+
168,
|
|
359
|
+
60
|
|
360
|
+
]
|
|
361
|
+
}
|
|
362
|
+
],
|
|
363
|
+
"errors": [
|
|
364
|
+
{
|
|
365
|
+
"code": 6000,
|
|
366
|
+
"name": "InvalidEphemeralKey",
|
|
367
|
+
"msg": "Ephemeral public key must be exactly 33 bytes (compressed secp256k1)"
|
|
368
|
+
},
|
|
369
|
+
{
|
|
370
|
+
"code": 6001,
|
|
371
|
+
"name": "MetadataMissingViewTag",
|
|
372
|
+
"msg": "Metadata must contain at least the view tag byte"
|
|
373
|
+
},
|
|
374
|
+
{
|
|
375
|
+
"code": 6002,
|
|
376
|
+
"name": "InvalidStealthAddress",
|
|
377
|
+
"msg": "Stealth address must be 1..=32 bytes"
|
|
378
|
+
},
|
|
379
|
+
{
|
|
380
|
+
"code": 6003,
|
|
381
|
+
"name": "MetadataTooLong",
|
|
382
|
+
"msg": "Metadata exceeds the 24-byte cross-chain payload budget"
|
|
383
|
+
}
|
|
384
|
+
],
|
|
385
|
+
"types": [
|
|
386
|
+
{
|
|
387
|
+
"name": "Announcement",
|
|
388
|
+
"type": {
|
|
389
|
+
"kind": "struct",
|
|
390
|
+
"fields": [
|
|
391
|
+
{
|
|
392
|
+
"name": "scheme_id",
|
|
393
|
+
"type": "u64"
|
|
394
|
+
},
|
|
395
|
+
{
|
|
396
|
+
"name": "stealth_address",
|
|
397
|
+
"type": "bytes"
|
|
398
|
+
},
|
|
399
|
+
{
|
|
400
|
+
"name": "caller",
|
|
401
|
+
"type": "pubkey"
|
|
402
|
+
},
|
|
403
|
+
{
|
|
404
|
+
"name": "ephemeral_pub_key",
|
|
405
|
+
"type": "bytes"
|
|
406
|
+
},
|
|
407
|
+
{
|
|
408
|
+
"name": "metadata",
|
|
409
|
+
"type": "bytes"
|
|
410
|
+
}
|
|
411
|
+
]
|
|
412
|
+
}
|
|
413
|
+
},
|
|
414
|
+
{
|
|
415
|
+
"name": "AnnouncementLog",
|
|
416
|
+
"type": {
|
|
417
|
+
"kind": "struct",
|
|
418
|
+
"fields": [
|
|
419
|
+
{
|
|
420
|
+
"name": "scheme_id",
|
|
421
|
+
"type": "u64"
|
|
422
|
+
},
|
|
423
|
+
{
|
|
424
|
+
"name": "stealth_address",
|
|
425
|
+
"type": "bytes"
|
|
426
|
+
},
|
|
427
|
+
{
|
|
428
|
+
"name": "caller",
|
|
429
|
+
"type": "pubkey"
|
|
430
|
+
},
|
|
431
|
+
{
|
|
432
|
+
"name": "ephemeral_pub_key",
|
|
433
|
+
"type": "bytes"
|
|
434
|
+
},
|
|
435
|
+
{
|
|
436
|
+
"name": "metadata",
|
|
437
|
+
"type": "bytes"
|
|
438
|
+
},
|
|
439
|
+
{
|
|
440
|
+
"name": "slot",
|
|
441
|
+
"type": "u64"
|
|
442
|
+
},
|
|
443
|
+
{
|
|
444
|
+
"name": "log_id",
|
|
445
|
+
"type": {
|
|
446
|
+
"array": [
|
|
447
|
+
"u8",
|
|
448
|
+
32
|
|
449
|
+
]
|
|
450
|
+
}
|
|
451
|
+
},
|
|
452
|
+
{
|
|
453
|
+
"name": "bump",
|
|
454
|
+
"type": "u8"
|
|
455
|
+
}
|
|
456
|
+
]
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
]
|
|
460
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@opaquecash/stealth-chain-solana",
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "Solana (web3.js) integration for the Opaque stealth registry and announcer: program IDs, PDA derivation, instruction builders, announcement scanning, and the SolanaAdapter",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.js"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"dist",
|
|
16
|
+
"idl"
|
|
17
|
+
],
|
|
18
|
+
"scripts": {
|
|
19
|
+
"build": "tsc -p tsconfig.json",
|
|
20
|
+
"clean": "rm -rf dist"
|
|
21
|
+
},
|
|
22
|
+
"dependencies": {
|
|
23
|
+
"@bonfida/spl-name-service": "^3.0.23",
|
|
24
|
+
"@noble/curves": "^1.6.0",
|
|
25
|
+
"@noble/hashes": "^1.5.0",
|
|
26
|
+
"@opaquecash/adapter": "0.2.0",
|
|
27
|
+
"@opaquecash/deployments": "0.2.0",
|
|
28
|
+
"@opaquecash/stealth-core": "0.2.0",
|
|
29
|
+
"@solana/web3.js": "^1.98.4"
|
|
30
|
+
},
|
|
31
|
+
"sideEffects": false,
|
|
32
|
+
"license": "Apache-2.0",
|
|
33
|
+
"repository": {
|
|
34
|
+
"type": "git",
|
|
35
|
+
"url": "git+https://github.com/opaquecash/sdk.git",
|
|
36
|
+
"directory": "packages/stealth-chain-solana"
|
|
37
|
+
},
|
|
38
|
+
"homepage": "https://docs.opaque.cash",
|
|
39
|
+
"publishConfig": {
|
|
40
|
+
"access": "public"
|
|
41
|
+
}
|
|
42
|
+
}
|