Swift

zcash-swift-payment-uri

ZIP-321 定义的 Zcash Payment URIs 的 Swift 原型

什么是 Zcash Payment URIs?

引用自 ZIP-321

[...] 一种支付请求 URI 的标准格式。 识别这种格式的钱包允许用户仅通过点击网页上的链接或扫描二维码来构建交易。

Payment URIs 允许用户以 "标准化" URI 的形式表达他们的支付意图,这些 URI 可以被生态系统中的多个应用程序解析

例子 zcash:?address=tmEZhbWHTpdKMw5it8YDspUXSMGQyFwovpU&amount=123.456&address.1=ztestsapling10yy2ex5dcqkclhc7z7yrnjq2z6feyjad56ptwlfgmy77dmaqqrl9gyhprdx59qgmsnyfska2kez&amount.1=0.789&memo.1=VGhpcyBpcyBhIHVuaWNvZGUgbWVtbyDinKjwn6aE8J-PhvCfjok

项目路线图

1. ZIP-321 构造

2. ZIP-321 解析

3. ZIP-321 内置验证

入门

请求向 Zcash 地址付款

不指定除接收者地址以外的任何其他信息的付款请求。

zcash:ztestsapling10yy2ex5dcqkclhc7z7yrnjq2z6feyjad56ptwlfgmy77dmaqqrl9gyhprdx59qgmsnyfska2kez

let recipient = RecipientAddress(value: "ztestsapling10yy2ex5dcqkclhc7z7yrnjq2z6feyjad56ptwlfgmy77dmaqqrl9gyhprdx59qgmsnyfska2kez")!

ZIP321.request(recipient)

请求付款,指定金额和其他参数。

期望的 Payment URI zcash:ztestsapling10yy2ex5dcqkclhc7z7yrnjq2z6feyjad56ptwlfgmy77dmaqqrl9gyhprdx59qgmsnyfska2kez?amount=1&memo=VGhpcyBpcyBhIHNpbXBsZSBtZW1vLg&message=Thank%20you%20for%20your%20purchase

 let recipient = RecipientAddress(value: "ztestsapling10yy2ex5dcqkclhc7z7yrnjq2z6feyjad56ptwlfgmy77dmaqqrl9gyhprdx59qgmsnyfska2kez")!

let payment = Payment(
    recipientAddress: recipient,
    amount: try Amount(value: 1),
    memo: try MemoBytes(utf8String: "This is a simple memo."),
    label: nil,
    message: "Thank you for your purchase",
    otherParams: nil
)

let paymentURI = ZIP321.request(payment, formattingOptions: .useEmptyParamIndex(omitAddressLabel: true))

请求向多个接收者付款

期望的 Payment URI: zcash:?address=tmEZhbWHTpdKMw5it8YDspUXSMGQyFwovpU&amount=123.456&address.1=ztestsapling10yy2ex5dcqkclhc7z7yrnjq2z6feyjad56ptwlfgmy77dmaqqrl9gyhprdx59qgmsnyfska2kez&amount.1=0.789&memo.1=VGhpcyBpcyBhIHVuaWNvZGUgbWVtbyDinKjwn6aE8J-PhvCfjok

此支付请求使用带有空 paramindex 和数字索引的 paramlabel。 此 Request String 生成 API 允许调用者指定他们选择的参数和索引格式。

let address0 = "tmEZhbWHTpdKMw5it8YDspUXSMGQyFwovpU"

let recipient0 = RecipientAddress(value: address0)!

let payment0 = Payment(
    recipientAddress: recipient0,
    amount: try Amount(value: 123.456),
    memo: nil,
    label: nil,
    message: nil,
    otherParams: nil
)

let address1 = "ztestsapling10yy2ex5dcqkclhc7z7yrnjq2z6feyjad56ptwlfgmy77dmaqqrl9gyhprdx59qgmsnyfska2kez"

let recipient1 = RecipientAddress(value: address1)!

let payment1 = Payment(
    recipientAddress: recipient1,
    amount: try Amount(value: 0.789),
    memo: try MemoBytes(utf8String: "This is a unicode memo ✨🦄🏆🎉"),
    label: nil,
    message: nil,
    otherParams: nil
)

let paymentRequest = PaymentRequest(payments: [payment0, payment1])

let paymentURIString = ZIP321.uriString(from: paymentRequest, formattingOptions: .useEmptyParamIndex(omitAddressLabel: false))

解析 Zcash 支付 URI

用法:

给定一个可能的 Zcash Payment URI

let possibleURI = "zcash:ztestsapling10yy2ex5dcqkclhc7z7yrnjq2z6feyjad56ptwlfgmy77dmaqqrl9gyhprdx59qgmsnyfska2kez?amount=1&memo=VGhpcyBpcyBhIHNpbXBsZSBtZW1vLg&message=Thank%20you%20for%20your%20purchase"

let paymentRequest = try ZIP321.request(from: possibleURI)

这将返回一个包含解析失败信息的错误,或者在本例中

ParserResult.request(
    PaymentRequest(payments: [
        Payment(
            recipientAddress: recipient,
            amount: try Amount(value: 1),
            memo: try MemoBytes(utf8String: "This is a simple memo."),
            label: nil,
            message: "Thank you for your purchase",
            otherParams: nil
        )
    ]
    )
)

支持旧版 Zcash 支付 URI zcash:[address]

解析器支持类似于 Bitcoin URIs 的透明 ZEC 钱包的旧版 URI。

let uri = ZIP321.request("zcash:tmEZhbWHTpdKMw5it8YDspUXSMGQyFwovpU")

返回一个

ParserResult.legacy(recipient)

其中接收者地址包含地址。

许可证

本项目遵循 MIT 许可证。 有关更多详细信息,请参阅 LICENSE.md