FavorletApp2App 1.1.0

FavorletApp2App 1.1.0

evahpirazzi 维护。



  • fingerlabs

概要

FAVORLET 是一种旨在最大化 NFT 应用性的 NFT 专用钱包。它提供针对 NFT 的各种功能,并连接区块链上的 NFT 与现实世界,从而创造新的 NFT 体验。如果您想在正在开发的应用程序中使用区块链进行交互,则可以通过 FAVORLET 的 app2app SDK 实现这一点。

功能

  • 钱包连接 (connectWallet)
  • 消息签名 (signMessage)
  • 硬币传输 (sendCoin)
  • 执行合约函数 (executeContract) (1.0.1 以下)
  • 执行合约函数 (executeContractWithEncoded) (1.0.2 以下)

FAVORLET 的 app2app 提供四种功能。 钱包连接 是将用户的钱包地址检索到原生应用程序中的功能。一旦有了钱包地址,就可以查询区块链上存在的钱包相关数据。 消息签名 是在不同应用程序中指定消息进行签名,用于验证钱包的所有权或作为认证/批准的功能。 硬币传输 是传输链平台硬币的功能。通过指定接收钱包地址和数量来进行传输。 执行合约函数 是执行指定合约函数的功能,根据函数的不同可以执行各种功能。

工作流程

  • 请求阶段 (Request)
  • 执行阶段 (Execute)
  • 结果阶段 (Receipt)

FAVORLET 的 app2app 以 请求-执行-结果 的 3 个步骤工作。 请求阶段 是在本地应用程序中定义要执行的操作的阶段。在上文所述的 4 个功能中,可以选择一个作为操作。 执行阶段 是 FAVORLET 执行请求阶段中定义的操作的阶段。传递给 FAVORLET 的请求 ID 后,它将执行该操作。 结果阶段 是从 FAVORLET 获取执行操作的结果的阶段。也就是说,可以简单地整理如下。

  1. 使用本地应用程序中的请求函数指定操作,然后接收请求 ID。
  2. 使用 execute 函数将请求 ID 传递给 FAVORLET,然后 FAVORLET 会跳转到该操作。
  3. 在操作完成后,使用 receipt 函数返回本地应用程序以获取结果数据。

探索示例应用程序

要执行示例应用程序,请先 Clone favorlet-app2app-sdk-ios 存储库,然后转到 /Example 目录并输入以下命令。

pod install

在 XCode 中打开 /Example/FavorletApp2App.xcworkspace 文件。UI 使用 SwiftUI 在 ContentView 中构建,app2app 集成功能在 ContentViewModel 中实现。

开始

要求

  • iOS 15 以上。

设置 SDK

依赖项设置

仅支持 Cocoapods 部署 iOS app2app SDK,因此需要在本地应用程序的 Podfile 文件中添加如下依赖项设置后运行命令。

Podfile

pod 'FavorletApp2App', '~> 1.0.2'

pod install

使用 SDK

公共项

支持的链 ID

网络名 链 ID
克拉顿主网络 8217
克拉顿测试网络(巴奥巴布) 1001
以太坊主网络 1
以太坊测试网络(Goerli) 5
波卡主网络 137
波卡测试网络(孟买) 80001
币安智能链主网络 56
币安智能链测试网络 97

App2AppAction

  • CONNECT_WALLET : 钱包连接。
  • SIGN_MESSAGE : 消息签名。
  • SEND_COIN : 硬币传输。
  • EXECUTE_CONTRACT : 执行合约函数。 (1.0.1 以下)
  • EXECUTE_CONTRACT_WITH_ENCODED : 执行合约函数(1.0.2 以下)

App2AppStatus

  • REQUESTED : 向 app2app 请求将执行的动作数据的状态。
  • EXECUTED : FAVORLET 执行请求的动作的状态。
  • REVERTED : FAVORLET 执行动作失败的状态。
  • CANCELED : FAVORLET 取消请求的动作的状态。
  • SUCCEED : FAVORLET 执行动作并在区块链上成功的状态。
  • FAILED : FAVORLET 执行动作但区块链失败的。

创建 App2AppComponent

let app2AppComponent = App2AppComponent()

app2app SDK的所有功能必须通过App2AppComponent来使用。除了App2AppComponent的执行函数之外,请求和结果函数都是通过Swift Concurrency实现的异步函数。因此,在原生前端调用该函数时,必须使用await关键字来调用。

示例

...
do {
    try await self.app2AppComponent.receipt(...)
} catch {
    ...
}
...

请求函数调用

对于app2app的每个功能,所需参数必须通过以下示例中的数据对象传输,并且在正常调用时可以返回请求ID。

钱包连接

let request = App2AppConnectWalletRequest(
    action: App2AppAction.CONNECT_WALLET.value,    // 액션.
    chainId: 8217,                                 // 체인ID. (Optional - 지정하지 않을 경우 nil)
    blockChainApp: App2AppBlockChainApp(           // 네이티브 앱 정보.
        name: "App2App Sample",                    // 네이티브 앱 이름. (FAVORLET app2app 연동화면에 표시될 앱 이름)
        successAppLink: nil,                       // 현재는 미지원.
        failAppLink: nil                           // 현재는 미지원.
    )
)
let response = try await self.app2AppComponent.requestConnectWallet(request)
let requestId = response.requestId ?? ""

消息签名

let request = App2AppSignMessageRequest(
    action: App2AppAction.SIGN_MESSAGE.value,
    chainId: 8217,
    blockChainApp: App2AppBlockChainApp(
        name: "App2App Sample",
        successAppLink: nil,
        failAppLink: nil
    ),
    signMessage: App2AppSignMessage(  // 메시지 서명에 필요한 데이터.
        from: "0x123...456",          // 서명할 지갑 주소.
        value: "favorlet"             // 메시지 원문.
    )
)
let response = try await self.app2AppComponent.requestSignMessage(request)
let requestId = response.requestId ?? ""

硬币发送

let request = App2AppSendCoinRequest(
    action: App2AppAction.SEND_COIN.value,
    chainId: 8217,
    blockChainApp: App2AppBlockChainApp(
        name: "App2App Sample",
        successAppLink: nil,
        failAppLink: nil
    ),
    transactions: [                        // 실행할 트랜잭션 리스트. (단, 현재는 1개의 트랜잭션만 처리.)
        App2AppTransaction(
            from: "0x123...456",           // 트랜잭션을 전송할 지갑 주소.
            to: "0x123...123",             // 컨트랙트 주소.
            value: "1000000000000000000"   // 보낼 코인 수량. (단위: peb)
        )
    ]
)
let response = try await self.app2AppComponent.requestSendCoin(request)
let requestId = response.requestId ?? ""

合同函数执行 (1.0.2及以上)

从传递现有的functionName, ABI, parameters数据的方式更改为传递编码过的函数数据。
- 编码的函数数据示例) 0x095ea7b30000000000000000000000001f6d738ec0cf07a451af55b73bc610edb20c546c0000000000000000000000000000000000000000000000000000000000000000
- 以web3swift为标准) 参考Web3+Contract.swift中的createReadOperation()函数中编码的部分。

contract.method(method, parameters: parameters, extraData: extraData) else { return nil }

  let request = App2AppExecuteContractRequest(
    action: App2AppAction.EXECUTE_CONTRACT.value,
    chainId: 8217,
    blockChainApp: App2AppBlockChainApp(
        name: "App2App Sample",
        successAppLink: nil,               
        failAppLink: nil
    ),
    transactions: [                        // 실행할 트랜잭션 리스트. (단, 현재는 1개의 트랜잭션만 처리.)
        App2AppTransaction(
            from: "0x123...456",           // 트랜잭션을 전송할 지갑 주소.
            to: "0x654...321",             // 컨트랙트 주소.
            value: "0",                    // 보낼 코인 수량. (단위: peb) 단, non-payable 함수인 경우에는 0으로 지정해야 함.
            data = "0xa9059cbb...0000",    // 인코딩된 함수데이터.
            gasLimit = "10000"             // 가스 리밋값. (Optional - 이 값을 지정해서 보낼 경우, FAVORLET 에서는 이 값으로 설정)
        )
    )
)
let response = try await self.app2AppComponent.requestExecuteContract(request)
let requestId = response.requestId ?? ""

❗️ 兼容现有的合约执行 (executeContract) 仅支持1.0.1及以下版本

let request = App2AppExecuteContractRequest( action: App2AppAction.EXECUTE_CONTRACT.value, chainId: 8217, blockChainApp: App2AppBlockChainApp( name: "App2App Sample", successAppLink: nil,
failAppLink: nil ), transactions: [ // 要执行的交易列表. (目前仅处理一个交易.) App2AppTransaction( from: "0x123...456", // 发送交易的地址. to: "0x654...321", // 合约地址. abi: "{"inputs":[{"internalType":"address","name":"src","type":"address"},{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"wad","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function","signature":"0x23b872dd"}", // 要执行函数的ABI. value: "0", // 发送的币数量. (单位: peb) 对于非付费函数,应指定为0. params: "["0x123...456", "0x654...321", 122]", // 要执行函数所需的参数. JSONArray 字符串构造. functionName: "transferFrom", // 要执行函数名. gasLimit = "10000" // 气力限制值. (可选 - 如果指定此值,FAVORLET 将使用此值设置) ) ) let response = try await self.app2AppComponent.requestExecuteContract(request) let requestId = response.requestId ?? ""

执行函数调用

通过调用请求函数返回的请求ID通过执行函数传递给FAVORLET。在原生前端调用执行函数时,FAVORLET会执行并切换到FAVORLET的app2app界面。

self.app2AppComponent.execute(requestId: requestId)

结果函数调用

FAVORLET正常执行操作后,会返回到原生前端。此时,可以通过结果函数获取操作的执行结果。

let response = try await app2AppComponent.receipt(requestId: app2appRequestId)

结果数据如下所示构建。

钱包连接 (connectWallet)

  • requestId (String) : 请求ID.
  • expiredAt (Int) : 请求过期时间.
  • action (String) : 操作.
  • connectWallet (App2AppReceiptResponse.ConnectWallet) : 连接的钱包信息.
    • status (String) : 状态.
    • address (String) : 连接的地址.

示例

{
  "requestId": "96a1f659-3cc4-42db-aa87-7ade549df66d",
  "expiredAt": 1664340943,
  "action": "connectWallet",
  "connectWallet": {
    "status": "succeed",
    "address": "0x123...123"
  }
}

消息签名 (signMessage)

  • requestId (String) : 请求ID.
  • expiredAt (Int) : 请求过期时间.
  • action (String) : 操作.
  • signMessage (App2AppReceiptResponse.SignMessage) : 消息签名信息.
    • status (String) : 状态.
    • signature (String) : 消息哈希值.

示例

{
  "requestId": "879855c2-fd2e-4ac9-bc11-2939b7ca9697",
  "expiredAt": 1664341330,
  "action": "signMessage",
  "signMessage": {
    "status": "succeed",
    "signature": "0xasdkasldjwqevnwrejkqwkeqlwkejq"
  }
}

硬币传输 (sendCoin)

  • requestId (String) : 请求ID.
  • expiredAt (Int) : 请求过期时间.
  • action (String) : 操作.
  • transactions (List<App2AppReceiptResponse.Transaction>) : 硬币传输交易信息.
    • status (String) : 状态.
    • txHash (String) : 交易哈希.

示例

  {
    "requestId": "19a58b08-4c0d-4552-8174-c9a767668f43",
    "expiredAt": 1664341165,
    "action" : "sendCoin",
    "transactions": [
        {
            "status": "succeed",
            "txHash": "0x123...123"
        }
    ]
}

#### 合约函数执行 (executeContract) (1.0.1以下)

执行合约函数 (executeContractWithEncoded) (1.0.2 以下)

  • requestId (String) : 请求ID.
  • expiredAt (Int) : 请求过期时间.
  • action (String) : 操作.
  • transactions (List<App2AppReceiptResponse.Transaction>) : 合约函数执行相关的交易信息.
    • status (String) : 状态.
    • txHash (String) : 交易哈希.

示例

  {
    "requestId": "278183ab-d3cb-4563-b0d4-ece1a2559f03",
    "expiredAt": 1664341448,
    "action": "executeContractWithEncoded",
    "transactions": [
        {
            "status": "succeed",
            "txHash": "0x123...123"
        }
    ]
}

约束条件

截至2023.04.13

app2app交易

  • 设计考虑了处理多个交易,但当前仅处理一个交易。
  • 如果请求多个交易,FAVORLET只处理第一个交易。

变更记录

1.0.2 (23.04.13)

删除现有的合约函数执行 (executeContract)

添加新的合约函数执行 (executeContractWithEncoded)

1.0.1 (23.01.20)

多链支持

  • 除了现有的克莱顿主网(8217)之外,还支持以下定义的链。
  • 克莱顿主网(8217)
  • 克莱顿测试网Baobab(1001)
  • 以太坊主网(1)
  • 以太坊测试网Goerli(5)
  • 波卡主网(137)
  • 波卡测试网Mumbai(80001)
  • 币安智能链主网(56)
  • 币安智能链测试网(97)

处理ChainId可选

  • 在ConnectWallet中,ChainId值不再是必需的,而是改为可选。
  • 因此,如果不指定ChainId进行ConnectWallet,将传递FAVORLET中选择的ChainId给Receipt。

在ExecuteContract中添加gasLimit选项

  • 指定gasLimit来请求时,FAVORLET将使用该值设置。
  • 不指定gasLimit来请求时,FAVORLET将设置。