react-native-pirate-wallet 0.2.1
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/LICENSE-MIT +21 -0
- package/README.md +537 -0
- package/android/build.gradle +82 -0
- package/android/consumer-rules.pro +1 -0
- package/android/src/main/AndroidManifest.xml +1 -0
- package/android/src/main/java/com/pirate/wallet/reactnative/PirateWalletReactNativeModule.kt +96 -0
- package/android/src/main/java/com/pirate/wallet/reactnative/PirateWalletReactNativePackage.kt +14 -0
- package/ios/PirateWalletReactNative.m +172 -0
- package/ios/PirateWalletReactNative.swift +40 -0
- package/package.json +64 -0
- package/react-native-pirate-wallet.podspec +19 -0
- package/react-native.config.js +10 -0
- package/scripts/assemble-ios-framework.js +124 -0
- package/scripts/resolve-android-packages.js +75 -0
- package/scripts/verify-package.js +128 -0
- package/src/index.d.ts +245 -0
- package/src/index.js +876 -0
- package/test/smoke.js +220 -0
package/test/smoke.js
ADDED
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
const assert = require('assert')
|
|
2
|
+
const {
|
|
3
|
+
PirateWalletSdk
|
|
4
|
+
} = require('../src/index.js')
|
|
5
|
+
|
|
6
|
+
function ok(result) {
|
|
7
|
+
const envelope = { ok: true }
|
|
8
|
+
if (result !== undefined) {
|
|
9
|
+
envelope.result = result === null ? null : result
|
|
10
|
+
}
|
|
11
|
+
return JSON.stringify(envelope)
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
function createMockNativeModule() {
|
|
15
|
+
const calls = []
|
|
16
|
+
|
|
17
|
+
return {
|
|
18
|
+
calls,
|
|
19
|
+
async configureAccountStorage(accountId, passphrase, storagePath) {
|
|
20
|
+
assert.strictEqual(accountId, 'edge-account-a')
|
|
21
|
+
assert.strictEqual(passphrase, 'EdgeAccountSecretPassphrase123!')
|
|
22
|
+
assert.strictEqual(storagePath, '/tmp/pirate-wallet/edge-account-a')
|
|
23
|
+
calls.push('configure_wallet_storage')
|
|
24
|
+
return ok(null)
|
|
25
|
+
},
|
|
26
|
+
async invoke(requestJson) {
|
|
27
|
+
const request = JSON.parse(requestJson)
|
|
28
|
+
calls.push(request.method)
|
|
29
|
+
switch (request.method) {
|
|
30
|
+
case 'get_build_info':
|
|
31
|
+
return ok({
|
|
32
|
+
version: '1.2.3',
|
|
33
|
+
git_commit: 'abc1234',
|
|
34
|
+
build_date: '2026-03-20',
|
|
35
|
+
rust_version: '1.86.0',
|
|
36
|
+
target_triple: 'react-native-smoke'
|
|
37
|
+
})
|
|
38
|
+
case 'list_wallets':
|
|
39
|
+
return ok([
|
|
40
|
+
{
|
|
41
|
+
id: 'wallet-1',
|
|
42
|
+
name: 'Primary',
|
|
43
|
+
created_at: 1710000000,
|
|
44
|
+
watch_only: false,
|
|
45
|
+
birthday_height: 345678,
|
|
46
|
+
network_type: 'mainnet'
|
|
47
|
+
}
|
|
48
|
+
])
|
|
49
|
+
case 'get_active_wallet':
|
|
50
|
+
return ok('wallet-1')
|
|
51
|
+
case 'get_balance':
|
|
52
|
+
return ok({ total: '1000', spendable: '900', pending: '100' })
|
|
53
|
+
case 'format_amount':
|
|
54
|
+
assert.strictEqual(request.arrrtoshis, '9007199254740993')
|
|
55
|
+
return ok('90071992.54740993')
|
|
56
|
+
case 'parse_amount':
|
|
57
|
+
return ok('9007199254740993')
|
|
58
|
+
case 'build_tx':
|
|
59
|
+
assert.strictEqual(request.outputs[0].amount, '9007199254740993')
|
|
60
|
+
assert.strictEqual(request.fee_opt, '1000')
|
|
61
|
+
return ok({
|
|
62
|
+
id: 'pending-1',
|
|
63
|
+
outputs: request.outputs,
|
|
64
|
+
total_amount: '9007199254740993',
|
|
65
|
+
fee: '1000',
|
|
66
|
+
change: '0',
|
|
67
|
+
input_total: '9007199254741993',
|
|
68
|
+
num_inputs: 1,
|
|
69
|
+
expiry_height: 123456,
|
|
70
|
+
created_at: 1710000001
|
|
71
|
+
})
|
|
72
|
+
case 'sign_tx':
|
|
73
|
+
assert.strictEqual(request.pending.total_amount, '9007199254740993')
|
|
74
|
+
assert.strictEqual(request.pending.totalAmount, undefined)
|
|
75
|
+
assert.strictEqual(request.pending.input_total, '9007199254741993')
|
|
76
|
+
return ok({
|
|
77
|
+
txid: 'tx-1',
|
|
78
|
+
raw: [1, 2, 3],
|
|
79
|
+
size: 3
|
|
80
|
+
})
|
|
81
|
+
case 'broadcast_tx':
|
|
82
|
+
assert.strictEqual(request.signed.txid, 'tx-1')
|
|
83
|
+
return ok('tx-1')
|
|
84
|
+
case 'sync_status':
|
|
85
|
+
return ok({
|
|
86
|
+
local_height: 120,
|
|
87
|
+
target_height: 240,
|
|
88
|
+
percent: 50,
|
|
89
|
+
eta: 120,
|
|
90
|
+
stage: 'Notes',
|
|
91
|
+
last_checkpoint: 96,
|
|
92
|
+
blocks_per_second: 4.5,
|
|
93
|
+
notes_decrypted: 42,
|
|
94
|
+
last_batch_ms: 900
|
|
95
|
+
})
|
|
96
|
+
case 'list_transactions':
|
|
97
|
+
return ok([])
|
|
98
|
+
case 'start_sync':
|
|
99
|
+
case 'cancel_sync':
|
|
100
|
+
return ok(null)
|
|
101
|
+
case 'list_key_groups':
|
|
102
|
+
return ok([
|
|
103
|
+
{
|
|
104
|
+
id: 7,
|
|
105
|
+
label: 'Imported bundle',
|
|
106
|
+
key_type: 'ImportedSpending',
|
|
107
|
+
spendable: true,
|
|
108
|
+
has_sapling: true,
|
|
109
|
+
has_ironwood: true,
|
|
110
|
+
birthday_height: 2345678,
|
|
111
|
+
created_at: 1710000999
|
|
112
|
+
}
|
|
113
|
+
])
|
|
114
|
+
case 'export_key_group_keys':
|
|
115
|
+
return ok({
|
|
116
|
+
key_id: 7,
|
|
117
|
+
sapling_viewing_key: 'zxviewsapling',
|
|
118
|
+
ironwood_viewing_key: 'uviewironwood',
|
|
119
|
+
sapling_spending_key: 'secret-sapling',
|
|
120
|
+
ironwood_spending_key: 'secret-ironwood'
|
|
121
|
+
})
|
|
122
|
+
case 'import_spending_key':
|
|
123
|
+
return ok(11)
|
|
124
|
+
case 'export_seed_raw':
|
|
125
|
+
return ok('alpha beta gamma')
|
|
126
|
+
case 'export_ironwood_payment_disclosure':
|
|
127
|
+
assert.strictEqual(request.wallet_id, 'wallet-1')
|
|
128
|
+
assert.strictEqual(request.txid, 'ironwood-tx')
|
|
129
|
+
assert.strictEqual(request.action_index, 2)
|
|
130
|
+
return ok('idisctest1ironwoodproof')
|
|
131
|
+
default:
|
|
132
|
+
throw new Error(`Unexpected method in smoke test: ${request.method}`)
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
async function main() {
|
|
139
|
+
const nativeModule = createMockNativeModule()
|
|
140
|
+
const sdk = new PirateWalletSdk(nativeModule)
|
|
141
|
+
|
|
142
|
+
await sdk.configureAccountStorage({
|
|
143
|
+
accountId: 'edge-account-a',
|
|
144
|
+
passphrase: 'EdgeAccountSecretPassphrase123!',
|
|
145
|
+
storagePath: '/tmp/pirate-wallet/edge-account-a'
|
|
146
|
+
})
|
|
147
|
+
|
|
148
|
+
const buildInfo = await sdk.buildInfo()
|
|
149
|
+
assert.strictEqual(buildInfo.version, '1.2.3')
|
|
150
|
+
|
|
151
|
+
const wallets = await sdk.listWallets()
|
|
152
|
+
assert.strictEqual(wallets.length, 1)
|
|
153
|
+
assert.strictEqual(wallets[0].id, 'wallet-1')
|
|
154
|
+
|
|
155
|
+
const activeWallet = await sdk.getActiveWallet()
|
|
156
|
+
assert.strictEqual(activeWallet.id, 'wallet-1')
|
|
157
|
+
|
|
158
|
+
const latestBirthdayHeight = await sdk.getLatestBirthdayHeight('wallet-1')
|
|
159
|
+
assert.strictEqual(latestBirthdayHeight, 345678)
|
|
160
|
+
|
|
161
|
+
const groups = await sdk.advancedKeyManagement.listKeyGroups('wallet-1')
|
|
162
|
+
assert.strictEqual(groups.length, 1)
|
|
163
|
+
|
|
164
|
+
const keyExport = await sdk.advancedKeyManagement.exportKeyGroupKeys('wallet-1', 7)
|
|
165
|
+
assert.strictEqual(keyExport.saplingSpendingKey, 'secret-sapling')
|
|
166
|
+
|
|
167
|
+
const importedKeyId = await sdk.advancedKeyManagement.importSpendingKey(
|
|
168
|
+
'wallet-1',
|
|
169
|
+
2345678,
|
|
170
|
+
'secret-sapling',
|
|
171
|
+
'secret-ironwood'
|
|
172
|
+
)
|
|
173
|
+
assert.strictEqual(importedKeyId, 11)
|
|
174
|
+
|
|
175
|
+
const seedWords = await sdk.advancedKeyManagement.exportSeed('wallet-1')
|
|
176
|
+
assert.strictEqual(seedWords, 'alpha beta gamma')
|
|
177
|
+
|
|
178
|
+
const disclosure = await sdk.exportIronwoodPaymentDisclosure(
|
|
179
|
+
'wallet-1',
|
|
180
|
+
'ironwood-tx',
|
|
181
|
+
2
|
|
182
|
+
)
|
|
183
|
+
assert.strictEqual(disclosure, 'idisctest1ironwoodproof')
|
|
184
|
+
|
|
185
|
+
const formatted = await sdk.formatAmount(9007199254740993n)
|
|
186
|
+
assert.strictEqual(formatted, '90071992.54740993')
|
|
187
|
+
|
|
188
|
+
const parsed = await sdk.parseAmount('90071992.54740993')
|
|
189
|
+
assert.strictEqual(parsed, '9007199254740993')
|
|
190
|
+
|
|
191
|
+
const pending = await sdk.buildTransaction(
|
|
192
|
+
'wallet-1',
|
|
193
|
+
{ addr: 'zs1receiver', amount: '9007199254740993' },
|
|
194
|
+
1000
|
|
195
|
+
)
|
|
196
|
+
assert.strictEqual(pending.totalAmount, '9007199254740993')
|
|
197
|
+
assert.strictEqual(pending.outputs[0].amount, '9007199254740993')
|
|
198
|
+
|
|
199
|
+
const signed = await sdk.signTransaction('wallet-1', pending)
|
|
200
|
+
const txid = await sdk.broadcastTransaction(signed)
|
|
201
|
+
assert.strictEqual(txid, 'tx-1')
|
|
202
|
+
|
|
203
|
+
const synchronizer = sdk.createSynchronizer('wallet-1')
|
|
204
|
+
const snapshot = await synchronizer.refresh()
|
|
205
|
+
assert.strictEqual(snapshot.walletId, 'wallet-1')
|
|
206
|
+
assert.strictEqual(snapshot.status, 'SYNCING')
|
|
207
|
+
assert.strictEqual(snapshot.progressPercent, 50)
|
|
208
|
+
assert.strictEqual(snapshot.latestBirthdayHeight, 345678)
|
|
209
|
+
assert.strictEqual(snapshot.balance.total, '1000')
|
|
210
|
+
|
|
211
|
+
await synchronizer.start()
|
|
212
|
+
await synchronizer.close()
|
|
213
|
+
assert(nativeModule.calls.includes('start_sync'))
|
|
214
|
+
assert(nativeModule.calls.includes('cancel_sync'))
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
main().catch(error => {
|
|
218
|
+
console.error(error)
|
|
219
|
+
process.exit(1)
|
|
220
|
+
})
|