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 获取执行操作的结果的阶段。也就是说,可以简单地整理如下。
- 使用本地应用程序中的请求函数指定操作,然后接收请求 ID。
- 使用 execute 函数将请求 ID 传递给 FAVORLET,然后 FAVORLET 会跳转到该操作。
- 在操作完成后,使用 receipt 函数返回本地应用程序以获取结果数据。
要执行示例应用程序,请先 Clone favorlet-app2app-sdk-ios 存储库,然后转到 /Example 目录并输入以下命令。
pod install
在 XCode 中打开 /Example/FavorletApp2App.xcworkspace 文件。UI 使用 SwiftUI 在 ContentView 中构建,app2app 集成功能在 ContentViewModel 中实现。
- iOS 15 以上。
仅支持 Cocoapods 部署 iOS app2app SDK,因此需要在本地应用程序的 Podfile 文件中添加如下依赖项设置后运行命令。
pod 'FavorletApp2App', '~> 1.0.2'
pod install
网络名 | 链 ID |
---|---|
克拉顿主网络 | 8217 |
克拉顿测试网络(巴奥巴布) | 1001 |
以太坊主网络 | 1 |
以太坊测试网络(Goerli) | 5 |
波卡主网络 | 137 |
波卡测试网络(孟买) | 80001 |
币安智能链主网络 | 56 |
币安智能链测试网络 | 97 |
- CONNECT_WALLET : 钱包连接。
- SIGN_MESSAGE : 消息签名。
- SEND_COIN : 硬币传输。
EXECUTE_CONTRACT : 执行合约函数。(1.0.1 以下)- EXECUTE_CONTRACT_WITH_ENCODED : 执行合约函数(1.0.2 以下)
- REQUESTED : 向 app2app 请求将执行的动作数据的状态。
- EXECUTED : FAVORLET 执行请求的动作的状态。
- REVERTED : FAVORLET 执行动作失败的状态。
- CANCELED : FAVORLET 取消请求的动作的状态。
- SUCCEED : FAVORLET 执行动作并在区块链上成功的状态。
- FAILED : FAVORLET 执行动作但区块链失败的。
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 ?? ""
- 编码的函数数据示例) 0x095ea7b30000000000000000000000001f6d738ec0cf07a451af55b73bc610edb20c546c0000000000000000000000000000000000000000000000000000000000000000
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 ?? ""
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)
结果数据如下所示构建。
- 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"
}
}
- 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"
}
}
- 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以下)
- 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
- 设计考虑了处理多个交易,但当前仅处理一个交易。
- 如果请求多个交易,FAVORLET只处理第一个交易。
- 除了现有的克莱顿主网(8217)之外,还支持以下定义的链。
- 克莱顿主网(8217)
- 克莱顿测试网Baobab(1001)
- 以太坊主网(1)
- 以太坊测试网Goerli(5)
- 波卡主网(137)
- 波卡测试网Mumbai(80001)
- 币安智能链主网(56)
- 币安智能链测试网(97)
- 在ConnectWallet中,ChainId值不再是必需的,而是改为可选。
- 因此,如果不指定ChainId进行ConnectWallet,将传递FAVORLET中选择的ChainId给Receipt。
- 指定gasLimit来请求时,FAVORLET将使用该值设置。
- 不指定gasLimit来请求时,FAVORLET将设置。