@ carbox3/cx3- ife (中文(简体) )
官方浏览器脚本( O)CX3 IIFE 数据用于 碳X3 绿色链。 。 。 .
一个 <script> 文件添加 window.cx3 (别名) window.CX3)到网页。 该页面连接了访客的 CX3 钱包(浏览器扩展名,或用QR代码的手机应用),拥有钱包标志并发送交易,并通过您自己的服务器上的一个小代理读取链条数据. 没有建设步骤和依赖性.
网络状态 : CarbonX3绿色链目前作为一个开发网络(devnet)运行. Devnet CX3,令牌和合约是没有货币价值的测试数据,在devnet被重置后可能会被清除.
对于Node.js服务器则使用SDK: @carbonx3/cx3.js。 。 。 .
特征
- 钱包连接和签名 通过 CX3Wallet 扩展:私人密钥从未到达页面.
- 电话钱包通过 QR 代码数字 :
cx3.connectPhone()显示一个 QR 代码; 访客用 CX3 钱包应用程序扫描并批准 。 从那时起,每封寄件都得到批准,并在电话上签名,钥匙从不离开. 包含一个内置对话框,或者用cx3.qrSvg()。 。 。 . - 通过您的同源代理读取:余额,符号目录,转账,钱包的符号和活性,CarbonFi池,ABI和WIT.
- 合同助手数字 :
cx3.contract(address).balanceOf(owner), (中文(简体) ),.transfer(to, amount), (中文(简体) ),.call(...), (中文(简体) ),.send(...)。 。 。 . - 私人纪念品: 发件人和收件人在钱包请求批准前接受检查.
- 交易跟踪数字 :
tx.wait()民意调查直到交易得到确认或永远失败. 一个待发(从块排出或从块中掉出)的发件被跟踪到最后,因此页面从不要求第二次签名. - 钱包活动数字 :
cx3.on("accountsChanged", fn)当用户删除钱包中的您网站时, 告诉页面, 因此它会再次显示“ 连接钱包 ” , 而无需重新加载 . - 浏览器中没有证书数字 :
setRpc滴数Authorization财务报告和审定财务报表X-Api-Key信头且没有登录选项 .
安装
从 CDN (推荐)
每个版本都有自己的固定地址. 装入您页面测试的确切版本 :
<script src="https://cdn.jsdelivr.net/npm/@carbonx3/[email protected]/min/cx3-0.2.9.min.js"
integrity="sha384-erEAYMO5XonBabdhCYNtLWkrGwnht9Me0rKYwq0GlF31pNaOabEzWp645FAkQHtE"
crossorigin="anonymous"></script>
这个 integrity 值使浏览器拒绝文件,如果一个字节不同。 相同文件在 unpkg 上 : https://unpkg.com/@carbonx3/[email protected]/min/cx3-0.2.9.min.js。 。 。 .
自办
下载 cx3-0.2.9.min.js,放在页面旁边并装入:
<script src="cx3-0.2.9.min.js"></script>
带着捆绑机
npm install @carbonx3/cx3-iife
import "@carbonx3/cx3-iife"; // sets window.cx3
文件是纯浏览器脚本:它指定 window.cx3 并且不出口任何东西.
所需资源
- 现代浏览器( A)
fetch, (中文(简体) ),Promise) (中文(简体) ). - CX3 钱包 0.1.74 或以后用于连接、签署和
accountsChanged。扩展在开发期间连接到每个https网站和您自己的机器;用户批准每个网站一次,每次发送或签名再次询问。 Iframes 没有钱包(cx3.wait()决定false) (中文(简体) ). - CX3 钱包应用程序 (Android) 0.2.91 或以后的电话钱包(
connectPhone) (中文(简体) ). - 开发者符号 (您的申请是OAuth2的证明,由您的代理持有). 虽然它有效,但每个钱包都可以连接到您的页面; 由 :
setRpc钱包询问GET <proxy>/api/v1/whoami?address=…当您源代码连接时,一个缺失、无效或被撤销的令牌会停止连接. - 更多信息:您服务器上持有您申请证书的同源代理(见下文).
快开始
<button type="button" id="connect">Connect wallet</button>
<p id="address"></p>
<script src="https://cdn.jsdelivr.net/npm/@carbonx3/[email protected]/min/cx3-0.2.9.min.js"
integrity="sha384-erEAYMO5XonBabdhCYNtLWkrGwnht9Me0rKYwq0GlF31pNaOabEzWp645FAkQHtE"
crossorigin="anonymous"></script>
<script>
const cx3 = window.cx3;
cx3.setRpc(location.origin + "/my-dapp", { apiPrefix: "/api/v1" }); // your proxy
document.getElementById("connect").onclick = async () => {
if (!(await cx3.wait(2500))) {
document.getElementById("address").textContent = "CX3Wallet not found";
return;
}
const me = await cx3.connect();
document.getElementById("address").textContent = me;
const balance = await cx3.getBalance(me);
const page = await cx3.listContracts({ limit: 50 });
console.log(balance, page.contracts);
};
// The user removed this site in CX3Wallet (Settings → Connected Sites → Remove)
cx3.on("accountsChanged", (accounts) => {
if (accounts.length === 0) document.getElementById("address").textContent = "";
});
</script>
您的代理( 申请资格 )
一页从不持有证书。 在 CX3WebUI 设置 API 应用程序 并保留客户端身份和客户端在您的服务器上的秘密。 代理交易他们到 POST https://cx3api.carbonx3.com/oauth/token (单位:千美元)grant_type=client_credentials) 对于一个一小时的访问符,缓存它,并用 Authorization: Bearer <token>。页面既不看到秘密,也不看到标志.
代理回复在 apiPrefix (默认) /api/v1)并仅转发您页面使用的路径 :
window.cx3 调用 | 代理路径 | 网关路径 |
|---|---|---|
getBalance | GET getBalanceAndNonce?address= | GET /wallet/getBalanceAndNonce?address= |
listContracts | GET contracts?limit=&offset= | GET /contracts/list |
listTransfers | GET contracts/{address}/transfers | GET /contracts/:address/transfers |
getAbi • 妇女 getContractInfo | GET contracts/{address}/abi • 妇女 GET contract/{address} | GET /contracts/:address/abi • 妇女 GET /contracts/:address |
call, (中文(简体) ), balanceOf | POST contract/call | POST /contracts/:address/call |
bindApiKey | GET whoami?address= | GET /wallet/api-key/bind?address= |
waitForTransaction • 妇女 getStatus | GET tx/{hash}/status • 妇女 GET getLastBlock | GET /tx/:hash/status • 妇女 GET /getLastBlock |
getWit | GET contracts/{address}/wit | GET /dapp/v1/contracts/:address/wit |
getTokens • 妇女 getActivity | GET accounts/{address}/tokens • 妇女 /activity | GET /dapp/v1/accounts/:address/tokens • 妇女 /activity |
getDexPairs • 妇女 getLpBalance | GET dex/pairs • 妇女 dex/pairs/{id}/lp/{address} | GET /dapp/v1/dex/pairs • 妇女 /dex/pairs/:id/lp/:address |
connectPhone | POST link/pair • 妇女 GET link/pair/{32 hex} • 妇女 POST link/pair/{32 hex}/bind | POST /wallet-link/pair • 妇女 GET /wallet-link/pair/:id • 妇女 POST /wallet-link/pair/:id/bind |
restorePhone, (中文(简体) ), disconnect (电话) | GET link • 妇女 DELETE link | GET /wallet-link/link • 妇女 DELETE /wallet-link/link |
| 与电话一起发送 | POST link/sign • 妇女 GET link/sign/{24 hex} • 妇女 DELETE link/sign/{24 hex} | POST /wallet-link/link/sign • 妇女 GET 编号 : DELETE /wallet-link/link/sign/:id |
| 一份合同 发送电话签署 | POST contract-send/{address} | POST /dapp/v1/contracts/:address/send |
网关的合同发送 最多25秒 的块,和脚本给予 contract-send 35秒(其他呼叫12秒),所以给路径一个超过25秒的代理超时,并传递网关状态代码和JSON机身不变(202,409,503和504携带) requestId, (中文(简体) ), txHash 财务报告和审定财务报表 hint) (中文(简体) ). 两种地位路线(/tx/:hash/status, (中文(简体) ), /dapp/v1/tx/:hash/status)回答一个丢弃的发送为 pending 与 dropped 财务报告和审定财务报表 finalAfter。 。 。 .
用扩展写字从不通过代理:钱包符号并发送. 通过电话,应用标志和中继带去请求(见下文). 一个完整的 PHP 代理示例在 CX3 IIFE 指南。 。 。 .
API 密码
window.cx3 | 它会做什么 |
|---|---|
VERSION | 剧本版本,例如:. "0.2.9" |
setRpc(url, { apiPrefix }) 编号 : getRpc() | 设置/ 读取您的代理服务器的基址 |
wait(maxMs) | 等待 CX3Wallet 准备好( 默认 2500 ms); 解析 true 编号 : false |
isAvailable() 编号 : wallet() | 钱包在那里 / 注射 window.carbonx3 |
connect() 编号 : accounts() 编号 : disconnect() | 连接扩展名( 集) cx3.address),列表账户,删除会话(有电话:结束链接) |
connectPhone({ onQr, signal, texts }) | 通过 QR 代码( 内建对话框, 或) 对 CX3 钱包应用 onQr(uri, expiresAt) 电话地址 |
restorePhone() | 重新装入后: 如果链接仍在运行中, 此标签中较早时链接的电话; 地址或 "" |
via | 哪个钱包标志 : "extension", (中文(简体) ), "phone" 或者说 "" |
qrSvg(text, { size, margin, dark, light, label }) 编号 : qrMatrix(text) | QR 编码为 <svg> 元素 / 作为布尔数行 |
on("accountsChanged", fn) 编号 : off("accountsChanged", fn) | fn(accounts) 获得 [] 当用户从钱包(连接站点 去除站点),扩展或电话app中移除您的站点; cx3.address 已经清除。 在不重新装入的情况下再次显示"连接钱包" 。 需求 CX3Wallet 0.69+ |
address | 连接地址( 小写) 或 "" |
request(method, params) | 原始钱包请求( R)cx3_*(中文(简体) ) |
getBalance(address?) | 原生 CX3 余额 |
listContracts({ limit, offset, viewer, owner, standard, live }) | 托肯目录(最多500个) |
listTransfers(address, { limit, offset }) | 代币转帐 |
getTokens(address?) 编号 : getActivity(address?, { limit, before }) | 钱包有余额的符号 / 它的历史 |
getDexPairs() 编号 : getLpBalance(pairId, address?) | CarbonFi 池/ 一个钱包的 LP 余额 |
call(address, method, params, sender?) | 只读合同电话 |
getAbi(address) 编号 : getWit(address) | CX3WASM合同的ABI / WIT |
getStatus() | 链头 { height, hash, timestamp } |
getContractInfo(address) | 书记官处记录 |
isPrivateToken(address) 编号 : isTokenAuthorized(token, wallet) | 私人代币支票 |
contract(address) | 帮助者 : balanceOf, (中文(简体) ), transfer, (中文(简体) ), call, (中文(简体) ), send, (中文(简体) ), transfers, (中文(简体) ), isPrivate, (中文(简体) ), isAuthorized |
sendTransaction({ to, amount }, opts?) | 原生 CX3 传输,在钱包中签名; amount 在CX3中,最多6个小数(电话: opts.onSeen() 当应用程序收到请求时) |
contractSend(address, method, params, opts?) | 合同交易,在钱包中签名(opts.privateCheck, (中文(简体) ), opts.onSeen(中文(简体) ) |
waitForTransaction(hash, { timeoutMs, intervalMs, finalAfter }) 编号 : tx.wait() | 投票直到确认或失败:默认为30 s,或直到 finalAfter 每1 s(每5 s),每1 s(每5 s),每1 s. timeoutMs 是你自己的极限 |
bindApiKey(address?) | 连接的钱包是你的吗? 你的应用程序属于它吗? 只针对所有者的页面; 访问者的钱包答案 wallet_mismatch 还可以使用该应用程序 |
参数取名为JSON,而不是ABI调用数据: contract(token).transfer(to, amount) 发送 { to, amount }。金额是合同所期望的原始整数字符串("1000000000000000000" 以 18 小数表示 1 个符号.
发送
await cx3.connect();
const tx = await cx3.contract("0x…token").transfer("0x…recipient", "1000000");
await tx.wait(); // confirmed, or throws TX_FAILED / TX_TRACK_TIMEOUT
const native = await cx3.sendTransaction({ to: "0x…recipient", amount: "10" });
await native.wait();
钱包显示收件人,金额和费用,用户批准或拒绝每次发送.
发送答案 txHash, (中文(简体) ), status, (中文(简体) ), dropped, (中文(简体) ), finalAfter, (中文(简体) ), requestId 财务报告和审定财务报表 hint数字 :
- 待定没有失败.
status实值"pending"(或"submitted"当交易被排入队列但尚未排入块时, 重复相同的签名发送) :TX_TIMEOUT(节点的25秒等先结束) 或从它的块中发出节点(HTTP 202,dropped: true) (中文(简体) ).success留下来true,以及tx.wait()跟着它. - 已丢弃信件 . 直至
finalAfter(时间,签名后12分钟左右)另一个验证员可能仍然包括一个被丢弃的发件,所以tx.wait()一直等到那个时候 之后 状态说failed财务报告和审定财务报表tx.wait()拒绝方式TX_FAILED。 。 。 . TX_TRACK_TIMEOUT表示待定,没有失败(err.dropped, (中文(简体) ),err.finalAfter) (中文(简体) ). 在用户仍然可以运行时再不要要求其签下同样的付款:新签名是第二笔交易.
电话钱包( QR 代码)
没有浏览器扩展的访客可以在手机上使用CX3钱包应用. 页面显示一个QR代码,用户在app(QR扫描器)中扫描并批准连接. 配对通过你的代理到CarbonX3网关的中继,所以你的开发者令牌决定了该手机所看到的应用:该应用显示您的应用程序名称和站点.
cx3.setRpc(location.origin + "/my-dapp", { apiPrefix: "/api/v1" }); // your proxy, with the link routes
// the built-in dialog: QR code, "Waiting For Approval In The App", Cancel
const me = await cx3.connectPhone(); // cx3.via === "phone", cx3.address === me
// sends now go to the phone: the user approves them in the app
const tx = await cx3.contract("0x…token").transfer("0x…recipient", "1000000", {
onSeen: () => console.log("the app received the request")
});
await tx.wait();
您自己的对话框而不是内置的对话框 :
const box = document.getElementById("qr");
const stop = { cancelled: false }; // set stop.cancelled = true (or pass an AbortSignal) to give up
const me = await cx3.connectPhone({
signal: stop,
onQr: (uri, expiresAt) => {
box.replaceChildren(cx3.qrSvg(uri, { size: 220 })); // an <svg>: no images, no inline styles
}
});
- 重新装入后 :
await cx3.restorePhone()提供手机的地址, 而其链接仍在运行( 链接密钥在sessionStorage,或""。 。 。 . - 当用户删除应用程序中的您的站点时 : 脚本每隔几秒钟检查一次链接,然后呼叫您
accountsChanged听众[],如同扩展. cx3.disconnect()也结束网关上的链接 .cx3.connect()(分机)从一个连接的电话接管.- 内置对话框文本 :
connectPhone({ texts: { title, hint, preparing, waiting, valid, cancel } })例如在另一种语言中。 对话框通过 DOM 样式,所以一个内容- 安全政策没有'unsafe-inline'允许它. - 您的代理服务器 转发
link/…财务报告和审定财务报表contract-send/…上表中的路径,带有X-CX3-Pair-Key财务报告和审定财务报表X-CX3-Link-Key脚本寄出的信头,以及DELETE页:1link财务报告和审定财务报表link/sign/{id}。对齐的origin应当由您的服务器设置(它是应用程序显示的站点),而不是取自浏览器.
私人纪念品
在钱包申请批准之前 transfer, (中文(简体) ), transferFrom 或者说 mint ,脚本则询问发件人和收件人是否获得授权。 如果不是,电话就拒绝 PRIVATE_TOKEN_SENDER 或者说 PRIVATE_TOKEN_RECIPIENT 钱包没有显示什么. { privateCheck: false } 由于最后的论点跳过检查;合同仍然决定链条.
getTokens() 仅列出公共指使符: 网关只提供钱包的私人指使符, 仅提供钱包自己签名的证明, CX3Wallet 发送到自己的列表中, 从未到页面.
错误
| 条件 | 结果 |
|---|---|
没有 setRpc | Error: RPC not set (CX3.setRpc) |
| 没有钱包 | Error: CX3Wallet not found |
| 没有有效证书的代理 | HTTP 401 (韩语) oauth_required (或 api_key_required(中文(简体) ) |
| 应用程序已撤销 | HTTP 401 (韩语) invalid_token |
| 范围太小 | HTTP 403 (韩语) insufficient_scope |
| 不是应用程序的钱包 | wallet_mismatch |
| 合同中缺少的方法 | METHOD_NOT_FOUND |
call 写入方法 | CALL_REQUIRES_VIEW (使用时 contractSend(中文(简体) ) |
| 私人代号, 钱包未授权 | PRIVATE_TOKEN_SENDER 编号 : PRIVATE_TOKEN_RECIPIENT |
交易失败( 仅在交易结束之后才发送) finalAfter(中文(简体) ) | TX_FAILED |
tx.wait() 交易仍未完成时停止(不是失败) | TX_TRACK_TIMEOUT |
| QR 代码已过期( 5分钟) / 对话框已关闭 / 中继答差 | PAIR_EXPIRED 编号 : PAIR_CANCELLED 编号 : PAIR_INVALID |
| 在电话应用中被拒绝 / 在大约2分钟内没有回复 | USER_REJECTED 编号 : REQUEST_EXPIRED |
| 应用程序已移除网站( 页面已取消连接) | REQUEST_ENDED |
| 电话发送的收件人或数量差 / 小数超过 6 (CX3 有 6) | INVALID_RECIPIENT 编号 : INVALID_AMOUNT 编号 : INVALID_AMOUNT_PRECISION |
| 电话合同发送: 已排队, 不在节点的 25 s 的块内( 有散列等待, 不是错误) | TX_TIMEOUT |
电话合同发送:网关无法记录(503);没有发送, err.retry() 稍后再次发送相同的签名请求 | LEDGER_UNAVAILABLE 编号 : LEDGER_FULL |
| 电话合同发送:已经收到这份签名请求(409);其结果尚未确定,不再签署 | REPLAYED_REQUEST |
电话合同发送:35s没有答复/没有连接(结果打开; err.retry()(中文(简体) ) | RPC_TIMEOUT 编号 : NETWORK_ERROR |
| 链条拒绝交易:其数据太大或巢穴过深,或其非ce不是下一个 | DATA_TOO_LARGE 编号 : DATA_TOO_DEEP 编号 : INVALID_NONCE_ORDER |
| 链条拒绝天然气限值:低于最低限值,或高于合同发送的最大限值 | GAS_LIMIT_TOO_LOW 编号 : GAS_LIMIT_EXCEEDED |
编码错误将代码带入 err.code。合同发送的错误,连同电话或扩展,也有 err.status (HTTP), (韩语), err.requestId, (中文(简体) ), err.hint, (中文(简体) ), err.txHash 财务报告和审定财务报表 err.body (网关的答案);a TX_TIMEOUT 表示其散列名称不是两个路径上的错误,而是待决tx. err.retry() 是否只有再次发送相同的签名请求是安全的(没有发送,或者没有回答):网关按它的请求 id 键,所以它永远不会成为第二次交易,并且在签名后被接受几分钟.
显示错误文本 textContent永远 innerHTML。 。 。 .
文档
许可证
UNLICENSED:Mersolution科技有限公司的专有软件. 使用取决于 CX3 脚本使用术语 (项目03):你可以从自己的服务器或CDN上装入与CarbonX3 Green Chain连接的应用程序,包括商业应用程序,并不加修改地为它们服务 integrity 散列;您不得自行修改、出售或重印,也不得与其他网络使用.
第三方代码: QR编码器基于 JavaScript 的 QR 代码生成器,版权 (c) 2009 Kazuhiko Arase,麻省理工学院许可证;其通知留在档案中。 "QR代码"是DENSO WAVE INCORPORATED的注册商标.