hpw-convert-eip681 0.4.0 → 0.6.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 +147 -11
- package/errors.d.ts +34 -0
- package/hpw_convert_eip681.d.ts +45 -0
- package/hpw_convert_eip681.js +1 -1
- package/hpw_convert_eip681_bg.js +82 -2
- package/hpw_convert_eip681_bg.wasm +0 -0
- package/package.json +4 -3
package/README.md
CHANGED
|
@@ -5,24 +5,27 @@
|
|
|
5
5
|

|
|
6
6
|

|
|
7
7
|
|
|
8
|
-
日本におけるとある中央集権的なステーブルコイン決済QRコード(HashPort Wallet形式の決済リンク)のURL
|
|
8
|
+
日本におけるとある中央集権的なステーブルコイン決済QRコード(HashPort Wallet形式の決済リンク)のURLと、EIP-681(ERC-681)形式の支払いURIとを**相互に変換する**[Rust製ライブラリ](https://crates.io/crates/hpw-convert-eip681)です。[WebAssembly版(npm)](https://www.npmjs.com/package/hpw-convert-eip681)も同梱しています。
|
|
9
|
+
|
|
10
|
+
- **HashPort Wallet決済リンク → EIP-681**: 決済リンクを解析し、EIP-681形式の支払いURIや送金先アドレス・金額に変換します。
|
|
11
|
+
- **EIP-681 → HashPort Wallet決済リンク**: EIP-681形式のJPYC送金URIを解析し、HashPort Wallet形式の決済リンクを生成します([後述](#逆方向-eip-681--hashport-wallet決済リンク)の注意事項を必ずお読みください)。
|
|
9
12
|
|
|
10
13
|
## 免責事項 / 非公式ツールについて
|
|
11
14
|
|
|
12
|
-
|
|
15
|
+
**本プロジェクトは個人による無保証の非公式(unofficial)ツールです。**
|
|
13
16
|
|
|
14
17
|
本ライブラリの目的は、あくまで相互運用性(interoperability)の確保です。
|
|
15
18
|
|
|
16
|
-
実装は純粋なクライアントサイドの文字列・URL解析のみを行い、**外部のサーバーへ一切ネットワークリクエストを送信しません。** 入力として受け取ったURL
|
|
19
|
+
実装は純粋なクライアントサイドの文字列・URL解析のみを行い、**外部のサーバーへ一切ネットワークリクエストを送信しません。** 入力として受け取ったURL・URI文字列をその場でパースし、もう一方の形式の文字列やアドレス・金額に変換して返すだけです。
|
|
17
20
|
|
|
18
21
|
## 対応範囲
|
|
19
22
|
|
|
20
|
-
|
|
23
|
+
現時点では以下のみに対応しています(他のチェーン・通貨は今後の対応も未定です)。両方向の変換で対応範囲は同じです:
|
|
21
24
|
|
|
22
25
|
- 通貨: **JPYC** のみ
|
|
23
26
|
- チェーン: 下表の4チェーン
|
|
24
27
|
|
|
25
|
-
HashPort Walletの `master_currency_id`
|
|
28
|
+
HashPort Walletの `master_currency_id` は通貨単体ではなく「通貨×チェーン」の組ごとに振られているため、この値からチェーンも決定します(逆方向ではEIP-681のchain idから `master_currency_id` を決定します)。
|
|
26
29
|
|
|
27
30
|
| `master_currency_id` | 通貨 | チェーン | chain id |
|
|
28
31
|
| --- | --- | --- | --- |
|
|
@@ -31,9 +34,9 @@ HashPort Walletの `master_currency_id` は通貨単体ではなく「通貨×
|
|
|
31
34
|
| `490` | JPYC | Ethereum | `1` |
|
|
32
35
|
| `712` | JPYC | Kaia | `8217` |
|
|
33
36
|
|
|
34
|
-
JPYCのコントラクトアドレスは全チェーン共通(`0xE7C3D8C9a439feDe00D2600032D5dB0Be71C3c29`)のため、EIP-681
|
|
37
|
+
JPYCのコントラクトアドレスは全チェーン共通(`0xE7C3D8C9a439feDe00D2600032D5dB0Be71C3c29`)のため、EIP-681側でチェーンごとに変わるのは `@<chain id>` の部分のみです。
|
|
35
38
|
|
|
36
|
-
対応外のURL・チェーン・通貨は `ParseError` (もしくはJS側のタグ付きエラー)として明示的に拒否されます。
|
|
39
|
+
対応外のURL・URI・チェーン・通貨は `ParseError` (もしくはJS側のタグ付きエラー)として明示的に拒否されます。
|
|
37
40
|
|
|
38
41
|
## 対象とするURL形式
|
|
39
42
|
|
|
@@ -58,6 +61,57 @@ ethereum:<JPYCコントラクトアドレス>@<chain id>/transfer?address=<to>&u
|
|
|
58
61
|
取りうる値の全体像が未確認のため、真偽値等には決め打ちしていません。
|
|
59
62
|
パラメータが存在しない場合は `None`(JS側では `undefined`)です。
|
|
60
63
|
|
|
64
|
+
順方向は寛容なパースですが、`to` がゼロアドレス、またはJPYCコントラクト自身の
|
|
65
|
+
場合は `UnsafeRecipient` として拒否します(送金が失敗するか資金が永久に失われる
|
|
66
|
+
だけで、正当な用途がないため)。
|
|
67
|
+
|
|
68
|
+
## 逆方向: EIP-681 → HashPort Wallet決済リンク
|
|
69
|
+
|
|
70
|
+
> **注意:** 生成した決済リンクが意味を持つのは、**送金先アドレスがHashPort Wallet側で受け取り先として設定済みである場合に限られます。** 本ライブラリはネットワークアクセスを一切行わないため、そのアドレスがHashPort Walletに登録されているかどうかを確認できません。生成されるのはあくまで「HashPort Walletが生成するリンクと同じ形式の文字列」であり、HashPort Wallet側がそのリンクを受け付けることや、支払いが正しく行われることは保証されません。
|
|
71
|
+
|
|
72
|
+
### 受け付ける入力
|
|
73
|
+
|
|
74
|
+
```
|
|
75
|
+
ethereum:[pay-]<JPYCコントラクトアドレス>@<chain id>/transfer?address=<to>[&uint256=<amount>]
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
- `uint256` は省略可能です(省略時は金額未指定のリンクになります)。EIP-681の数値表記に従い、`1000` のような整数のほか `2.014e18` のような指数表記も受け付けます(結果が1以上の整数かつ `uint256` に収まる場合のみ。金額を指定しない場合は `uint256=0` ではなく `uint256` 自体を省略してください)。
|
|
79
|
+
- ガス関連のヒント(`gas`・`gasLimit`・`gasPrice`)は、支払い内容を変えないため受け付けたうえで無視します。
|
|
80
|
+
- EIP-681のURIはHashPortリンクの `to_name`・`type` に相当する情報を持たないため、これらは別途指定します(Rustでは `ParsedLink` の `to_name`・`link_type` フィールドを設定、JSでは `parseEip681` の第2・第3引数)。
|
|
81
|
+
|
|
82
|
+
### 拒否される入力
|
|
83
|
+
|
|
84
|
+
順方向(HashPort Wallet決済リンク → EIP-681)のパースは寛容(lenient)ですが、逆方向は生成されるリンクが送金先・金額・チェーンを決めるものであるため、**解釈が割れうる入力はすべてエラーにする厳格(strict)な方針**を取っています。
|
|
85
|
+
|
|
86
|
+
| 入力 | エラー | 理由 |
|
|
87
|
+
| --- | --- | --- |
|
|
88
|
+
| chain id の省略(`ethereum:<contract>/transfer?...`) | `MissingParam` | EIP-681では「ウォレットの現在のネットワーク」を意味するが、メインネット等に決め打ちすると別チェーンで支払わせる危険があるため |
|
|
89
|
+
| 非対応のchain id、先頭ゼロ付きのchain id(`@0137`) | `UnsupportedChain` / `InvalidEip681` | 対応表にないチェーンは変換できない。先頭ゼロは8進と誤読されうるため |
|
|
90
|
+
| JPYC以外のコントラクト | `UnsupportedContract` | 非対応の通貨 |
|
|
91
|
+
| `transfer` 以外の関数(`approve` 等)、関数呼び出しなし | `UnsupportedFunction` | ERC-20の送金以外は表現できない |
|
|
92
|
+
| `address=` の欠落 | `MissingParam`(クエリが `?` のみで空の場合は `InvalidEip681`) | 受取人は `address=` でのみ指定する(`to=` 等の他のキーは下記の未知のパラメータとして扱う) |
|
|
93
|
+
| 同じパラメータの重複(`address=...&address=...`) | `DuplicateParam` | 先勝ち・後勝ちがウォレットごとに異なり、曖昧さが攻撃面になるため(順方向は後勝ち) |
|
|
94
|
+
| `value=` やその他の未知のパラメータ | `UnsupportedParam` | `value` はネイティブ通貨の同時送金を意味し、黙って捨てると支払いの意味が変わるため |
|
|
95
|
+
| ENS名(`example.eth`)、`0x` のないアドレス | `InvalidAddress` | ENSの名前解決にはネットワークアクセスが必要なため |
|
|
96
|
+
| 大文字小文字が混在しているのにEIP-55チェックサムが合わないアドレス | `InvalidAddress` | 打ち間違いの兆候であるため(すべて小文字・すべて大文字は受け付ける) |
|
|
97
|
+
| ゼロアドレス、JPYCコントラクト自身を受取人にする | `UnsafeRecipient` | 送金が失敗するか資金が永久に失われるだけで正当な用途がないため(順方向・`to_hashport_link()` でも拒否) |
|
|
98
|
+
| 負数、整数にならない値(`1.5`)、`uint256` に収まらない値、16進(`0x10`)、空 | `InvalidAmount` | 金額として一意に解釈できないため |
|
|
99
|
+
| 値0(`0`、`0e5`、`.0` 等) | `InvalidAmount` | 0の送金でもチェーン上では成功して `Transfer` イベントが出るため、入金と誤認されうる(金額未指定なら `uint256` を省略する)。順方向の `amount=0x0` は受け付ける |
|
|
100
|
+
| 整数部・指数部の先頭ゼロ(`01`、`007`、`1e018`) | `InvalidAmount` | chain id と同様、8進と誤読されうるため(`0.5e1` のような単独の `0` は可) |
|
|
101
|
+
| 前後の空白・制御文字・非ASCII文字、フラグメント(`#`)、不正なパーセントエンコード | `InvalidEip681` | コピペ由来の混入物やホモグリフ等を黙って受け入れないため |
|
|
102
|
+
|
|
103
|
+
### 出力形式
|
|
104
|
+
|
|
105
|
+
```
|
|
106
|
+
https://link.expo2025-wallet.com/pay?to=<address>&master_currency_id=<id>&amount=<hex>&to_name=<label>&type=<type>
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
- パラメータの順序・表記はHashPort Walletが実際に生成するリンクに合わせています。
|
|
110
|
+
- `to` はEIP-55チェックサム表記です。
|
|
111
|
+
- `amount` は `0x` + 小文字16進64桁のゼロ埋めです(例: 100 JPYC = `0x0000000000000000000000000000000000000000000000056bc75e2d63100000`)。
|
|
112
|
+
- `to_name`・`type` はRFC 3986の非予約文字(`A-Z a-z 0-9 - . _ ~`)以外をすべてパーセントエンコードします。空白は `+` ではなく必ず `%20` になります。`&` や `=` も必ずエンコードされるため、`to_name` の内容が他のパラメータを注入・改変することはありません。
|
|
113
|
+
- `amount`・`to_name`・`type` が `None`(JS側では未指定)の場合はパラメータ自体を省略し、空文字の場合は `to_name=` のように値が空のパラメータとして出力します。
|
|
114
|
+
|
|
61
115
|
## インストール
|
|
62
116
|
|
|
63
117
|
### Rust (`core`)
|
|
@@ -76,6 +130,8 @@ npm install hpw-convert-eip681
|
|
|
76
130
|
|
|
77
131
|
### Rust
|
|
78
132
|
|
|
133
|
+
#### HashPort Wallet決済リンク → EIP-681
|
|
134
|
+
|
|
79
135
|
```rust
|
|
80
136
|
use hpw_convert_eip681::{is_supported, parse};
|
|
81
137
|
|
|
@@ -93,7 +149,7 @@ fn main() {
|
|
|
93
149
|
|
|
94
150
|
// EIP-681形式のURIを取得する
|
|
95
151
|
println!("{}", link.to_eip681());
|
|
96
|
-
// => ethereum:0xE7C3D8C9a439feDe00D2600032D5dB0Be71C3c29@137/transfer?address=
|
|
152
|
+
// => ethereum:0xE7C3D8C9a439feDe00D2600032D5dB0Be71C3c29@137/transfer?address=0x1234567890123456789012345678901234567890&uint256=1000
|
|
97
153
|
|
|
98
154
|
// アドレスと金額を個別に取得する(amountは元URLに無いこともあるため Option<U256>)
|
|
99
155
|
println!("to: {}", link.address());
|
|
@@ -111,10 +167,37 @@ fn main() {
|
|
|
111
167
|
}
|
|
112
168
|
```
|
|
113
169
|
|
|
170
|
+
#### EIP-681 → HashPort Wallet決済リンク
|
|
171
|
+
|
|
172
|
+
```rust
|
|
173
|
+
use hpw_convert_eip681::{parse_eip681, ParseError};
|
|
174
|
+
|
|
175
|
+
fn main() -> Result<(), ParseError> {
|
|
176
|
+
// 100 JPYC(= 100 × 10^18 = 1e20)をPolygon上で送金するURI
|
|
177
|
+
let uri = "ethereum:0xE7C3D8C9a439feDe00D2600032D5dB0Be71C3c29@137/transfer?address=0x1234567890123456789012345678901234567890&uint256=1e20";
|
|
178
|
+
|
|
179
|
+
// パースする(to_name / link_type は常に None)
|
|
180
|
+
let mut link = parse_eip681(uri)?;
|
|
181
|
+
|
|
182
|
+
// 必要であれば表示ラベル等を設定する
|
|
183
|
+
link.to_name = Some("Coffee Shop".to_string());
|
|
184
|
+
|
|
185
|
+
// HashPort Wallet決済リンクを生成する
|
|
186
|
+
println!("{}", link.to_hashport_link()?);
|
|
187
|
+
// => https://link.expo2025-wallet.com/pay?to=0x1234567890123456789012345678901234567890&master_currency_id=487&amount=0x0000000000000000000000000000000000000000000000056bc75e2d63100000&to_name=Coffee%20Shop
|
|
188
|
+
|
|
189
|
+
Ok(())
|
|
190
|
+
}
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
`ParsedLink` は両方向の変換で共通の中間表現なので、`parse` の結果から `to_hashport_link()` を、`parse_eip681` の結果から `to_eip681()` を呼ぶこともできます。
|
|
194
|
+
|
|
114
195
|
### JavaScript / TypeScript
|
|
115
196
|
|
|
197
|
+
#### HashPort Wallet決済リンク → EIP-681
|
|
198
|
+
|
|
116
199
|
```ts
|
|
117
|
-
import { isSupported, parseHashportLink
|
|
200
|
+
import { isSupported, parseHashportLink } from "hpw-convert-eip681";
|
|
118
201
|
|
|
119
202
|
const url =
|
|
120
203
|
"https://link.expo2025-wallet.com/pay?to=0x1234567890123456789012345678901234567890&master_currency_id=487&amount=0x3e8&to_name=Coffee%20Shop";
|
|
@@ -130,7 +213,7 @@ try {
|
|
|
130
213
|
|
|
131
214
|
// EIP-681形式のURIを取得する
|
|
132
215
|
console.log(link.toEip681());
|
|
133
|
-
// => ethereum:0xE7C3D8C9a439feDe00D2600032D5dB0Be71C3c29@137/transfer?address=
|
|
216
|
+
// => ethereum:0xE7C3D8C9a439feDe00D2600032D5dB0Be71C3c29@137/transfer?address=0x1234567890123456789012345678901234567890&uint256=1000
|
|
134
217
|
|
|
135
218
|
// アドレスと金額を個別に取得する(amountは元URLに無い場合 undefined になる)
|
|
136
219
|
console.log(link.to, link.amount, link.amountHex);
|
|
@@ -142,9 +225,62 @@ try {
|
|
|
142
225
|
}
|
|
143
226
|
```
|
|
144
227
|
|
|
228
|
+
#### EIP-681 → HashPort Wallet決済リンク
|
|
229
|
+
|
|
230
|
+
```ts
|
|
231
|
+
import { isSupportedEip681, parseEip681 } from "hpw-convert-eip681";
|
|
232
|
+
|
|
233
|
+
// 100 JPYC(= 100 × 10^18 = 1e20)をPolygon上で送金するURI
|
|
234
|
+
const uri =
|
|
235
|
+
"ethereum:0xE7C3D8C9a439feDe00D2600032D5dB0Be71C3c29@137/transfer?address=0x1234567890123456789012345678901234567890&uint256=1e20";
|
|
236
|
+
|
|
237
|
+
// 対応しているURIかどうかを事前に確認する
|
|
238
|
+
if (!isSupportedEip681(uri)) {
|
|
239
|
+
throw new Error("unsupported URI");
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
try {
|
|
243
|
+
// 第2・第3引数で to_name / type を指定できる(省略時はパラメータ自体を出力しない)
|
|
244
|
+
const link = parseEip681(uri, "Coffee Shop");
|
|
245
|
+
|
|
246
|
+
// HashPort Wallet決済リンクを生成する(失敗時は { kind: "...", ... } 形式のエラーをthrow)
|
|
247
|
+
console.log(link.toHashportLink());
|
|
248
|
+
// => https://link.expo2025-wallet.com/pay?to=0x1234567890123456789012345678901234567890&master_currency_id=487&amount=0x0000000000000000000000000000000000000000000000056bc75e2d63100000&to_name=Coffee%20Shop
|
|
249
|
+
} catch (err) {
|
|
250
|
+
console.error(err.kind, err);
|
|
251
|
+
}
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
## エラー
|
|
255
|
+
|
|
256
|
+
失敗時はRustでは `ParseError` が返り、JSでは `{ kind: "<バリアント名>", ... }` 形式の値がthrowされます。TypeScriptでは、このthrowされる値の型を `HpwParseError` としてインポートできます。
|
|
257
|
+
|
|
258
|
+
```ts
|
|
259
|
+
import { parseEip681, type HpwParseError } from "hpw-convert-eip681";
|
|
260
|
+
|
|
261
|
+
try {
|
|
262
|
+
parseEip681(uri);
|
|
263
|
+
} catch (err) {
|
|
264
|
+
const e = err as HpwParseError;
|
|
265
|
+
if (e.kind === "UnsupportedChain") console.error(e.chain_id);
|
|
266
|
+
}
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
| バリアント | 主な発生箇所 |
|
|
270
|
+
| --- | --- |
|
|
271
|
+
| `InvalidUrl` / `UnsupportedHost` | 順方向: URLとして不正、ホストが `link.expo2025-wallet.com` でない |
|
|
272
|
+
| `UnsupportedCurrency` | 順方向: 非対応の `master_currency_id` |
|
|
273
|
+
| `MissingParam` | 必須パラメータ(順方向の `to`・`master_currency_id`、逆方向の chain id・`address`)がない |
|
|
274
|
+
| `InvalidAddress` / `InvalidAmount` | 両方向: アドレス・金額が不正 |
|
|
275
|
+
| `UnsafeRecipient` | 両方向と `to_hashport_link()`: 受取人がゼロアドレス、または対応トークンのコントラクト自身。JSでは `{ kind: "UnsafeRecipient", reason: "zero_address" \| "token_contract" }`(Rustでは `UnsafeRecipientReason`) |
|
|
276
|
+
| `InvalidEip681` | 逆方向: EIP-681 URIとして構文的に不正 |
|
|
277
|
+
| `UnsupportedContract` / `UnsupportedChain` / `UnsupportedFunction` / `UnsupportedParam` / `DuplicateParam` | 逆方向: [拒否される入力](#拒否される入力)を参照(`UnsupportedChain` は `to_hashport_link()` でも発生しうる) |
|
|
278
|
+
|
|
279
|
+
`ParseError` は `#[non_exhaustive]` です。今後バリアントが追加されても互換性を壊さないよう、Rustで `match` する場合はワイルドカードアーム(`_ => ...`)が必要です。
|
|
280
|
+
|
|
145
281
|
## チェックサム検証(オプション)
|
|
146
282
|
|
|
147
|
-
`parse` / `parseHashportLink` はアドレスの大文字・小文字を厳密にはチェックしない、寛容な(lenient)パースを行います。これとは別に、EIP-55チェックサムを厳密に検証したい場合のためのオプトインAPIとして `validate_checksum` / `isValidChecksum`
|
|
283
|
+
`parse` / `parseHashportLink` はアドレスの大文字・小文字を厳密にはチェックしない、寛容な(lenient)パースを行います。これとは別に、EIP-55チェックサムを厳密に検証したい場合のためのオプトインAPIとして `validate_checksum` / `isValidChecksum` を用意しています(`parse_eip681` / `parseEip681` は、大文字小文字が混在するアドレスに対しては常にチェックサムを検証します)。
|
|
148
284
|
|
|
149
285
|
```rust
|
|
150
286
|
use hpw_convert_eip681::validate_checksum;
|
package/errors.d.ts
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
// wasm-bindgenが自動生成する`.d.ts`は関数のOk/戻り値側のみを反映し、
|
|
2
|
+
// 「この関数はこの形の値をthrowする」ということを表現できない。
|
|
3
|
+
// `parseHashportLink`・`parseEip681`・`ParsedLink.prototype.toHashportLink`
|
|
4
|
+
// (およびこのクレート内でthrowしうる他のexport)は失敗時にこのタグ付き
|
|
5
|
+
// ユニオン型をした素のJS値をthrowする。`.kind`で分岐したい箇所では、
|
|
6
|
+
// この型を `import type { HpwParseError } from "hpw-convert-eip681"` で
|
|
7
|
+
// インポートすること(npmパッケージでは `scripts/finalize-package.mjs` が
|
|
8
|
+
// このファイルを `errors.d.ts` として同梱し、メインの型定義から
|
|
9
|
+
// 再エクスポートしている)。
|
|
10
|
+
export type HpwParseError =
|
|
11
|
+
| { kind: "InvalidUrl"; message: string }
|
|
12
|
+
| { kind: "UnsupportedHost"; host: string }
|
|
13
|
+
// EIP-681入力でチェーンIDがない場合は `name: "chain_id"`、
|
|
14
|
+
// 受取人がない場合は `name: "address"` になる。
|
|
15
|
+
| { kind: "MissingParam"; name: string }
|
|
16
|
+
| { kind: "UnsupportedCurrency"; id: string }
|
|
17
|
+
| { kind: "InvalidAddress"; value: string }
|
|
18
|
+
| { kind: "InvalidAmount"; value: string; reason: string }
|
|
19
|
+
// EIP-681 URIとして構文的に不正。`reason` は人間向けの説明。
|
|
20
|
+
| { kind: "InvalidEip681"; reason: string }
|
|
21
|
+
// 非対応のトークンコントラクト。`address` は入力中の生の文字列。
|
|
22
|
+
| { kind: "UnsupportedContract"; address: string }
|
|
23
|
+
// 非対応のチェーンID。`number` の精度を超えうるため10進文字列。
|
|
24
|
+
| { kind: "UnsupportedChain"; chain_id: string }
|
|
25
|
+
// `transfer` 以外の関数。関数呼び出しがない(ネイティブ通貨送金)場合は空文字。
|
|
26
|
+
| { kind: "UnsupportedFunction"; name: string }
|
|
27
|
+
// 意味を黙って捨てることになるため受け付けないパラメータ(例: `value`)。
|
|
28
|
+
| { kind: "UnsupportedParam"; name: string }
|
|
29
|
+
// EIP-681入力での同名パラメータの重複。
|
|
30
|
+
| { kind: "DuplicateParam"; name: string }
|
|
31
|
+
// 送金先として確実に安全でないアドレス。ゼロアドレスなら `"zero_address"`、
|
|
32
|
+
// 対応トークンのコントラクト自身なら `"token_contract"`。両方向のパースと
|
|
33
|
+
// `toHashportLink()` で拒否される。
|
|
34
|
+
| { kind: "UnsafeRecipient"; reason: "zero_address" | "token_contract" };
|
package/hpw_convert_eip681.d.ts
CHANGED
|
@@ -1,25 +1,70 @@
|
|
|
1
1
|
/* tslint:disable */
|
|
2
2
|
/* eslint-disable */
|
|
3
3
|
|
|
4
|
+
/**
|
|
5
|
+
* JSに公開するパース結果。
|
|
6
|
+
*
|
|
7
|
+
* coreの `ParsedLink` をそのまま保持し、getterで都度JS向けの表現に変換する。
|
|
8
|
+
* `toHashportLink()` がcore側の `to_hashport_link` をそのまま呼べるように
|
|
9
|
+
* するため、変換済みの文字列だけでなく元の値を持っておく。
|
|
10
|
+
*/
|
|
4
11
|
export class ParsedLink {
|
|
5
12
|
private constructor();
|
|
6
13
|
free(): void;
|
|
7
14
|
[Symbol.dispose](): void;
|
|
8
15
|
toEip681(): string;
|
|
16
|
+
/**
|
|
17
|
+
* HashPort Wallet決済リンクを生成する。失敗時はタグ付きエラーをthrowする。
|
|
18
|
+
*
|
|
19
|
+
* このライブラリが返す `ParsedLink` は(通貨, チェーン)の組が検証済み
|
|
20
|
+
* なので実際には失敗しないが、パニックではなくthrowにしておく。
|
|
21
|
+
*/
|
|
22
|
+
toHashportLink(): string;
|
|
23
|
+
/**
|
|
24
|
+
* `0x` プレフィックス付き16進文字列の金額。元に金額がなければ `undefined`。
|
|
25
|
+
*/
|
|
9
26
|
readonly amountHex: string | undefined;
|
|
27
|
+
/**
|
|
28
|
+
* 10進文字列の金額(最小単位)。元に金額がなければ `undefined`。
|
|
29
|
+
*/
|
|
10
30
|
readonly amount: string | undefined;
|
|
11
31
|
readonly chainId: number;
|
|
32
|
+
/**
|
|
33
|
+
* チェックサム表記のトークンコントラクトアドレス。
|
|
34
|
+
*/
|
|
12
35
|
readonly currencyContract: string;
|
|
13
36
|
readonly currencySymbol: string;
|
|
14
37
|
readonly linkType: string | undefined;
|
|
15
38
|
readonly toName: string | undefined;
|
|
39
|
+
/**
|
|
40
|
+
* EIP-55チェックサム表記の受取人アドレス。
|
|
41
|
+
*/
|
|
16
42
|
readonly to: string;
|
|
17
43
|
}
|
|
18
44
|
|
|
19
45
|
export function isSupported(url: string): boolean;
|
|
20
46
|
|
|
47
|
+
/**
|
|
48
|
+
* `uri` がこのクレートでパース可能なEIP-681 URIかどうかを返す。
|
|
49
|
+
* `isSupported` のEIP-681版で、throwしない。
|
|
50
|
+
*/
|
|
51
|
+
export function isSupportedEip681(uri: string): boolean;
|
|
52
|
+
|
|
21
53
|
export function isValidChecksum(address: string): boolean;
|
|
22
54
|
|
|
55
|
+
/**
|
|
56
|
+
* EIP-681 URIをパースする。失敗時はタグ付きエラーをthrowする。
|
|
57
|
+
*
|
|
58
|
+
* EIP-681のURIは `to_name`・`type` に相当する情報を持たないため、呼び出し側が
|
|
59
|
+
* `toName`・`linkType` で与える(`toHashportLink()` で生成されるリンクの
|
|
60
|
+
* `to_name`・`type` になる)。wasm-bindgenの `Option<String>` 引数は
|
|
61
|
+
* `undefined`(省略)と `null` を `None`(パラメータなし)に、空文字
|
|
62
|
+
* `""` を `Some("")`(値が空のパラメータとして出力)に対応付ける。
|
|
63
|
+
*/
|
|
64
|
+
export function parseEip681(uri: string, toName?: string | null, linkType?: string | null): ParsedLink;
|
|
65
|
+
|
|
23
66
|
export function parseHashportLink(url: string): ParsedLink;
|
|
24
67
|
|
|
25
68
|
export function start(): void;
|
|
69
|
+
|
|
70
|
+
export type { HpwParseError } from "./errors.js";
|
package/hpw_convert_eip681.js
CHANGED
|
@@ -5,5 +5,5 @@ import { __wbg_set_wasm } from "./hpw_convert_eip681_bg.js";
|
|
|
5
5
|
__wbg_set_wasm(wasm);
|
|
6
6
|
wasm.__wbindgen_start();
|
|
7
7
|
export {
|
|
8
|
-
ParsedLink, isSupported, isValidChecksum, parseHashportLink, start
|
|
8
|
+
ParsedLink, isSupported, isSupportedEip681, isValidChecksum, parseEip681, parseHashportLink, start
|
|
9
9
|
} from "./hpw_convert_eip681_bg.js";
|
package/hpw_convert_eip681_bg.js
CHANGED
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JSに公開するパース結果。
|
|
3
|
+
*
|
|
4
|
+
* coreの `ParsedLink` をそのまま保持し、getterで都度JS向けの表現に変換する。
|
|
5
|
+
* `toHashportLink()` がcore側の `to_hashport_link` をそのまま呼べるように
|
|
6
|
+
* するため、変換済みの文字列だけでなく元の値を持っておく。
|
|
7
|
+
*/
|
|
1
8
|
export class ParsedLink {
|
|
2
9
|
static __wrap(ptr) {
|
|
3
10
|
const obj = Object.create(ParsedLink.prototype);
|
|
@@ -16,6 +23,7 @@ export class ParsedLink {
|
|
|
16
23
|
wasm.__wbg_parsedlink_free(ptr, 0);
|
|
17
24
|
}
|
|
18
25
|
/**
|
|
26
|
+
* `0x` プレフィックス付き16進文字列の金額。元に金額がなければ `undefined`。
|
|
19
27
|
* @returns {string | undefined}
|
|
20
28
|
*/
|
|
21
29
|
get amountHex() {
|
|
@@ -28,6 +36,7 @@ export class ParsedLink {
|
|
|
28
36
|
return v1;
|
|
29
37
|
}
|
|
30
38
|
/**
|
|
39
|
+
* 10進文字列の金額(最小単位)。元に金額がなければ `undefined`。
|
|
31
40
|
* @returns {string | undefined}
|
|
32
41
|
*/
|
|
33
42
|
get amount() {
|
|
@@ -47,6 +56,7 @@ export class ParsedLink {
|
|
|
47
56
|
return ret >>> 0;
|
|
48
57
|
}
|
|
49
58
|
/**
|
|
59
|
+
* チェックサム表記のトークンコントラクトアドレス。
|
|
50
60
|
* @returns {string}
|
|
51
61
|
*/
|
|
52
62
|
get currencyContract() {
|
|
@@ -103,6 +113,31 @@ export class ParsedLink {
|
|
|
103
113
|
wasm.__wbindgen_free(deferred1_0, deferred1_1, 1);
|
|
104
114
|
}
|
|
105
115
|
}
|
|
116
|
+
/**
|
|
117
|
+
* HashPort Wallet決済リンクを生成する。失敗時はタグ付きエラーをthrowする。
|
|
118
|
+
*
|
|
119
|
+
* このライブラリが返す `ParsedLink` は(通貨, チェーン)の組が検証済み
|
|
120
|
+
* なので実際には失敗しないが、パニックではなくthrowにしておく。
|
|
121
|
+
* @returns {string}
|
|
122
|
+
*/
|
|
123
|
+
toHashportLink() {
|
|
124
|
+
let deferred2_0;
|
|
125
|
+
let deferred2_1;
|
|
126
|
+
try {
|
|
127
|
+
const ret = wasm.parsedlink_toHashportLink(this.__wbg_ptr);
|
|
128
|
+
var ptr1 = ret[0];
|
|
129
|
+
var len1 = ret[1];
|
|
130
|
+
if (ret[3]) {
|
|
131
|
+
ptr1 = 0; len1 = 0;
|
|
132
|
+
throw takeFromExternrefTable0(ret[2]);
|
|
133
|
+
}
|
|
134
|
+
deferred2_0 = ptr1;
|
|
135
|
+
deferred2_1 = len1;
|
|
136
|
+
return getStringFromWasm0(ptr1, len1);
|
|
137
|
+
} finally {
|
|
138
|
+
wasm.__wbindgen_free(deferred2_0, deferred2_1, 1);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
106
141
|
/**
|
|
107
142
|
* @returns {string | undefined}
|
|
108
143
|
*/
|
|
@@ -116,6 +151,7 @@ export class ParsedLink {
|
|
|
116
151
|
return v1;
|
|
117
152
|
}
|
|
118
153
|
/**
|
|
154
|
+
* EIP-55チェックサム表記の受取人アドレス。
|
|
119
155
|
* @returns {string}
|
|
120
156
|
*/
|
|
121
157
|
get to() {
|
|
@@ -144,6 +180,19 @@ export function isSupported(url) {
|
|
|
144
180
|
return ret !== 0;
|
|
145
181
|
}
|
|
146
182
|
|
|
183
|
+
/**
|
|
184
|
+
* `uri` がこのクレートでパース可能なEIP-681 URIかどうかを返す。
|
|
185
|
+
* `isSupported` のEIP-681版で、throwしない。
|
|
186
|
+
* @param {string} uri
|
|
187
|
+
* @returns {boolean}
|
|
188
|
+
*/
|
|
189
|
+
export function isSupportedEip681(uri) {
|
|
190
|
+
const ptr0 = passStringToWasm0(uri, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
|
|
191
|
+
const len0 = WASM_VECTOR_LEN;
|
|
192
|
+
const ret = wasm.isSupportedEip681(ptr0, len0);
|
|
193
|
+
return ret !== 0;
|
|
194
|
+
}
|
|
195
|
+
|
|
147
196
|
/**
|
|
148
197
|
* @param {string} address
|
|
149
198
|
* @returns {boolean}
|
|
@@ -155,6 +204,33 @@ export function isValidChecksum(address) {
|
|
|
155
204
|
return ret !== 0;
|
|
156
205
|
}
|
|
157
206
|
|
|
207
|
+
/**
|
|
208
|
+
* EIP-681 URIをパースする。失敗時はタグ付きエラーをthrowする。
|
|
209
|
+
*
|
|
210
|
+
* EIP-681のURIは `to_name`・`type` に相当する情報を持たないため、呼び出し側が
|
|
211
|
+
* `toName`・`linkType` で与える(`toHashportLink()` で生成されるリンクの
|
|
212
|
+
* `to_name`・`type` になる)。wasm-bindgenの `Option<String>` 引数は
|
|
213
|
+
* `undefined`(省略)と `null` を `None`(パラメータなし)に、空文字
|
|
214
|
+
* `""` を `Some("")`(値が空のパラメータとして出力)に対応付ける。
|
|
215
|
+
* @param {string} uri
|
|
216
|
+
* @param {string | null} [toName]
|
|
217
|
+
* @param {string | null} [linkType]
|
|
218
|
+
* @returns {ParsedLink}
|
|
219
|
+
*/
|
|
220
|
+
export function parseEip681(uri, toName, linkType) {
|
|
221
|
+
const ptr0 = passStringToWasm0(uri, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
|
|
222
|
+
const len0 = WASM_VECTOR_LEN;
|
|
223
|
+
var ptr1 = isLikeNone(toName) ? 0 : passStringToWasm0(toName, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
|
|
224
|
+
var len1 = WASM_VECTOR_LEN;
|
|
225
|
+
var ptr2 = isLikeNone(linkType) ? 0 : passStringToWasm0(linkType, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
|
|
226
|
+
var len2 = WASM_VECTOR_LEN;
|
|
227
|
+
const ret = wasm.parseEip681(ptr0, len0, ptr1, len1, ptr2, len2);
|
|
228
|
+
if (ret[2]) {
|
|
229
|
+
throw takeFromExternrefTable0(ret[1]);
|
|
230
|
+
}
|
|
231
|
+
return ParsedLink.__wrap(ret[0]);
|
|
232
|
+
}
|
|
233
|
+
|
|
158
234
|
/**
|
|
159
235
|
* @param {string} url
|
|
160
236
|
* @returns {ParsedLink}
|
|
@@ -172,7 +248,7 @@ export function parseHashportLink(url) {
|
|
|
172
248
|
export function start() {
|
|
173
249
|
wasm.start();
|
|
174
250
|
}
|
|
175
|
-
export function
|
|
251
|
+
export function __wbg___wbindgen_throw_41e9ee4f547fc59a(arg0, arg1) {
|
|
176
252
|
throw new Error(getStringFromWasm0(arg0, arg1));
|
|
177
253
|
}
|
|
178
254
|
export function __wbg_error_757e9472f8410341(arg0, arg1) {
|
|
@@ -190,7 +266,7 @@ export function __wbg_new_227d7c05414eb861() {
|
|
|
190
266
|
const ret = new Error();
|
|
191
267
|
return ret;
|
|
192
268
|
}
|
|
193
|
-
export function
|
|
269
|
+
export function __wbg_new_617a8cdb8bb1130e() {
|
|
194
270
|
const ret = new Object();
|
|
195
271
|
return ret;
|
|
196
272
|
}
|
|
@@ -242,6 +318,10 @@ function getUint8ArrayMemory0() {
|
|
|
242
318
|
return cachedUint8ArrayMemory0;
|
|
243
319
|
}
|
|
244
320
|
|
|
321
|
+
function isLikeNone(x) {
|
|
322
|
+
return x === undefined || x === null;
|
|
323
|
+
}
|
|
324
|
+
|
|
245
325
|
function passStringToWasm0(arg, malloc, realloc) {
|
|
246
326
|
if (realloc === undefined) {
|
|
247
327
|
const buf = cachedTextEncoder.encode(arg);
|
|
Binary file
|
package/package.json
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"collaborators": [
|
|
5
5
|
"Osumi Akari"
|
|
6
6
|
],
|
|
7
|
-
"version": "0.
|
|
7
|
+
"version": "0.6.0",
|
|
8
8
|
"license": "MIT",
|
|
9
9
|
"repository": {
|
|
10
10
|
"type": "git",
|
|
@@ -16,7 +16,8 @@
|
|
|
16
16
|
"hpw_convert_eip681_bg.js",
|
|
17
17
|
"hpw_convert_eip681.d.ts",
|
|
18
18
|
"LICENSE",
|
|
19
|
-
"README.md"
|
|
19
|
+
"README.md",
|
|
20
|
+
"errors.d.ts"
|
|
20
21
|
],
|
|
21
22
|
"main": "hpw_convert_eip681.js",
|
|
22
23
|
"types": "hpw_convert_eip681.d.ts",
|
|
@@ -24,5 +25,5 @@
|
|
|
24
25
|
"./hpw_convert_eip681.js",
|
|
25
26
|
"./snippets/*"
|
|
26
27
|
],
|
|
27
|
-
"description": "Unofficial, unaffiliated converter: HashPort Wallet JPYC payment links
|
|
28
|
+
"description": "Unofficial, unaffiliated bidirectional converter: HashPort Wallet JPYC payment links <-> EIP-681 URIs. Not endorsed by or affiliated with HashPort."
|
|
28
29
|
}
|