NAV Navbar

NEO Dapi简介

NEO Dapi 是一种NEO环境中通用的Dapi标准,其由NEL与O3和其他NEO社区成员一同维护。

提供Dapi的程序有各种形态,有NEL的Teemo Chrome 插件钱包,也有O3钱包以及其他形态。

我们力求Dapi在总体上是一致且互相兼容的,但是每个Dapi提供者(程序)会根据其自身特性稍有不同。

这里我们将提供开发者Dapi调用方法(部分会比较侧重NEL的Teemo Chrome 插件钱包)

Teemo 插件钱包

Teemo是NEL开发的一款Chrome插件钱包,该钱包力求Dapp开发者在前端开发Dapp时用时最少,将全部精力用在Dapp开发本身上,而不是用在NEO的交互对接上。

插件钱包的另一个特点是安全性,它将用户钱包私钥保护在插件内部,Dapp无法直接访问到。而且每次使用私钥签名(发送交易),都需要用户授权。事实上,未授权的Dapp连用户地址都看不到。如此一来,用户只需认准一个钱包,就可以放心地尝试任何新奇的Dapp,而不用担心安全问题。

Teemo 资源

Teemo Github

Teemo 安装与开发

安装与体验

开发版安装

克隆项目

git clone https://github.com/NewEconoLab/TeemoWallet.git

打开Chrome(最新版) Chrome菜单-更多工具-扩展程序

切换到开发者模式

点击“加载已解压的扩展程序”-选择**TeemoWallet\dist文件夹

可以将**TeemoWallet\test 文件夹配置为一个网站(比如http://localhost/)。你也可以直接浏览 https://teemo.nel.group/test/,免去自己部署

打开这个网站,即可测试事件和所有方法。这个网站同时也是一个开发示例

稳定版安装

Github Release

下载release ZIP包并解压,其他步骤和开发版相同

动手开发

window.addEventListener('Teemo.NEO.READY',(data:CustomEvent)=>{
    console.log("Teemo READY ");
    console.log(JSON.stringify(data.detail))

    const main = new Main();
    main.start();//监听到这个事件后,才能开始插件的相关方法调用
})

Teemo的Dapi在调用前无需事先引用任何JS或NPM包,和Teemo交互的JS代码会自动注入到你的页面中,但是这个注入可能并不总是在你的第一句Dapi调用代码前完成。

为了总是能够正常和Teemo交互,我们强烈建议在任何Dapi方法被使用前,首先捕获“Teemo.NEO.READY”事件,此事件代表Teemo交互JS已经注入到你的页面。

如果你采用TS(TypeScript)进行开发,可能还需要在你的目录中添加https://github.com/NewEconoLab/TeemoWallet/blob/master/dist/js/inject.d.ts,它将帮助tsc引擎识别Dapi方法和类型。

读类型方法

读方法不改变链数据. 它帮助你为你的用户查询信息, 也为你的Dapp提供必要的信息:

getProvider_获得提供者信息

Teemo.NEO.getProvider()
.then((provider: Provider) => {
  const {
    name,
    website,
    version,
    compatibility,
    extra,
  } = provider;

  const {
    theme,
    currency,
  } = extra;

  console.log('Provider name: ' + name);
  console.log('Provider website: ' + website);
  console.log('Provider dAPI version: ' + version);
  console.log('Provider dAPI compatibility: ' + JSON.stringify(compatibility));
  console.log('Provider UI theme: ' + theme);
  console.log('Provider Base currency: ' + currency);
})
.catch(({type: string, description: string, data: any}) => {
  switch(type) {
    case NO_PROVIDER:
      console.log('No provider available.');
      break;
    case CONNECTION_DENIED:
      console.log('The user rejected the request to connect with your dApp.');
      break;
  }
});

返回示例

{
  "name": "TeemoWallet",
  "version": "0.1",
  "website": "nel.group",
  "compatibility": [
    "typescript",
    "javascript"
  ],
  "extra": {
    "theme": "",
    "currency": ""
  }
}

返回Dapi提供者(插件钱包)的信息,包括名字、版本、NEP信息以及扩展信息。

输入参数

无需输入参数

成功的返回

参数名 类型 说明
name String 钱包(Dapi提供者)的名称
website String 钱包(Dapi提供者)的官方网址
version String 钱包(Dapi提供者)提供Dapi的版本
compatibility String[] 钱包(Dapi提供者)支持的NEP协议列表
extra Object 钱包(Dapi提供者)的附加属性
扩展
参数名 类型 说明
theme string 钱包(Dapi提供者)的UI风格
currency string 用户设置的基础货币

失败的返回

参数名 类型 说明
type String 错误的类型
description String? 错误的说明
data String? 错误的相关数据

getNetworks_获取网络参数

dapi.NEO.getNetworks()
.then(response => {
  const {
    networks,
    defaultNetwork,
  } = response.networks;

  console.log('Networks: ' + networks);
  // eg. ["TestNet", "TestNet", "PrivateNet"]

  console.log('Default network: ' + defaultNetwork);
  // eg. "TestNet"
})
.catch(({type: string, description: string, data: any}) => {
  switch(type) {
    case NO_PROVIDER:
      console.log('No provider available.');
      break;
    case CONNECTION_DENIED:
      console.log('The user rejected the request to connect with your dApp');
      break;
  }
});

返回示例

{
  networks: ["TestNet", "TestNet", "PrivateNet"],
  defaultNetwork: "TestNet",
}

返回钱包(Dapi提供者)允许的网络类型, 并返回目前用户选择的网络.

输入参数

无需输入参数

成功的返回

参数名 类型 说明
networks String[] 一个允许的网络类型的列表
defaultNetwork String 目前钱包设置的网络类型

失败的返回

参数名 类型 说明
type String 错误的类型
description String? 错误的说明
data String? 错误的相关数据

getAccount_获取账户信息

Teemo.NEO.getAccount()
.then((account: Account) => {
  const {
    address,
    label,
  } = account;

  console.log('Account address: ' + address);
  console.log('Account label: ' + label);
})
.catch(({type: string, description: string, data: any}) => {
  switch(type) {
    case NO_PROVIDER:
      console.log('No provider available.');
      break;
    case CONNECTION_DENIED:
      console.log('The user rejected the request to connect with your dApp');
      break;
  }
});

返回示例

{
  address: 'AeysVbKWiLSuSDhg7DTzUdDyYYKfgjojru',
  label: 'My Spending Wallet'
}

返回当前钱包(Dapi提供者)被选中(使用中)的账户信息.

成功的返回

参数名 类型 说明
address String 当前钱包(Dapi提供者)被选中(使用中)的NEO地址
label String 当前钱包(Dapi提供者)被选中(使用中)的用户设定名称

失败的返回

参数名 类型 说明
type String 错误的类型
description String? 错误的说明
data String? 错误的相关数据

getBalance_获取资产余额

Teemo.NEO.getBalance({
  params: {  
    "address": "ASBhJFN3XiDu38EdEQyMY3N2XwGh1gd5WW",  
    "assets": ["602c79718b16e442de58778e148d0b1084e3b2dffd5de6b7b16cee7969282de7"]
  },
  network: 'TestNet',
})
.then((results: BalanceResults) => {
  Object.keys(results).forEach(address => {
    const balances = results[address];
    balances.forEach(balance => {
      const { assetID, symbol, amount } = balance

      console.log('Address: ' + address);
      console.log('Asset ID: ' + assetID);
      console.log('Asset symbol: ' + symbol);
      console.log('Amount: ' + amount);
    });
  });
})
.catch(({type: string, description: string, data: any}) => {
  switch(type) {
    case NO_PROVIDER:
      console.log('No provider available.');
      break;
    case CONNECTION_DENIED:
      console.log('The user rejected the request to connect with your dApp');
      break;
  }
});

单地址特定资产请求

// 输入
{
  params: {
    address: 'AeysVbKWiLSuSDhg7DTzUdDyYYKfgjojru',
    assets: ["602c79718b16e442de58778e148d0b1084e3b2dffd5de6b7b16cee7969282de7"]
  },
  network: 'TestNet',
}

// 输出
{
  AeysVbKWiLSuSDhg7DTzUdDyYYKfgjojru: [
    {
      assetID: '602c79718b16e442de58778e148d0b1084e3b2dffd5de6b7b16cee7969282de7',
      symbol: 'GAS',
      amount: '0.00000233',
    }
  ],
}

单地址全部资产(设置显示)请求

// 输入
{
  params: {
    address: 'AeysVbKWiLSuSDhg7DTzUdDyYYKfgjojru',
  },
  network: 'TestNet',
}

// 输出
{
  AeysVbKWiLSuSDhg7DTzUdDyYYKfgjojru: [
    {
      assetID: 'c56f33fc6ecfcd0c225c4ab356fee59390af8560be0e930faebe74a6daff7c9b',
      symbol: 'NEO',
      amount: '10',
    },
    {
      assetID: '602c79718b16e442de58778e148d0b1084e3b2dffd5de6b7b16cee7969282de7',
      symbol: 'GAS',
      amount: '777.0001',
    },
    {
      assetID: '74f2dc36a68fdc4682034178eb2220729231db76',
      symbol: 'CGAS',
      amount: '0.00000233',
    },
    {
      assetID: 'fc732edee1efdf968c23c20a9628eaa5a6ccb934',
      symbol: 'NNC',
      amount: '2000',
    }
  ]
}

多地址请求

// 输入
{
  params: [
    {
      address: 'AeysVbKWiLSuSDhg7DTzUdDyYYKfgjojru',
    },
    {
      address: 'AbKNY45nRDy6B65YPVz1B6YXiTnzRqU2uQ',
      asset: ["602c79718b16e442de58778e148d0b1084e3b2dffd5de6b7b16cee7969282de7"],
    },
  ],
  network: 'TestNet',
}

// output
{
  AeysVbKWiLSuSDhg7DTzUdDyYYKfgjojru: [
    {
      assetID: 'c56f33fc6ecfcd0c225c4ab356fee59390af8560be0e930faebe74a6daff7c9b',
      symbol: 'NEO',
      amount: '10',
    },
    {
      assetID: '602c79718b16e442de58778e148d0b1084e3b2dffd5de6b7b16cee7969282de7',
      symbol: 'GAS',
      amount: '777.0001',
    },
    {
      assetID: '74f2dc36a68fdc4682034178eb2220729231db76',
      symbol: 'CGAS',
      amount: '0.00000233',
    },
    {
      assetID: 'fc732edee1efdf968c23c20a9628eaa5a6ccb934',
      symbol: 'NNC',
      amount: '2000',
    }
  ],
  AbKNY45nRDy6B65YPVz1B6YXiTnzRqU2uQ: [
    {
      assetID: '602c79718b16e442de58778e148d0b1084e3b2dffd5de6b7b16cee7969282de7',
      symbol: 'GAS',
      amount: '11000',
    }
  ]
}

允许Dapp为用户查询资产余额, 此方法同时支持全局(UTXO)资产和合约(NEP-5)资产

输入参数

参数 类型 说明
params BalanceRequest or BalanceRequest[] 一个BalanceRequest结构或者一个BalanceRequest结构组
network String 从GetNetworks获取的网络名称

BalanceRequest 余额请求结构

参数 类型 说明
address String 希望获取余额的地址
assets String[] 一个资产ID或一个资产ID组
fetchUTXO? boolean 这是一个可选的参数,表示是否需要返回UTXO(Teemo暂时不支持)

成功的返回

参数 类型 说明
address_1 BalanceResponse[] 键是地址,比如"AeysVbKWiLSuSDhg7DTzUdDyYYKfgjojru"
address_2 BalanceResponse[] 键是地址,比如"AbKNY45nRDy6B65YPVz1B6YXiTnzRqU2uQ"
address_n BalanceResponse[] 键是地址,比如"AUdawyrLMskxXMUE8osX9mSLKz8R7777kE"

余额返回结构

参数 类型 说明
assetID String 资产ID
symbol String 资产的单位名称
amount String 资产的余额
unspent UTXO[]? 未使用的UTXO(如果入参fetchUTXO为true)(Teemo暂时不支持)

UTXO结构

参数 类型 说明
asset String 资产ID
createdAtBlock String UTXO创建的块高度
index Int UTXO创建交易中的output中的排序号
txid String UTXO所在交易的txid
value String UTXO的金额

getStorage_获取存储区值

Teemo.NEO.getStorage({
    "scriptHash":"03febccf81ac85e3d795bc5cbd4e84e907812aa3",
    "key":"5065746572",
    "network":"TestNet"
})
.then(res => {
  const value = res.result;
  console.log('Storage value: ' + value);
})
.catch(({type: string, description: string, data: any}) => {
  switch(type) {
    case NO_PROVIDER:
      console.log('No provider available.');
      break;
    case CONNECTION_REFUSED:
      console.log('Connection dApp not connected. Please call the "connect" function.');
      break;
    case RPC_ERROR:
      console.log('There was an error when broadcasting this transaction to the network.');
      break;
  }
});

返回示例

{
  result: '4c696e'
}

返回合约私有化存储区的值

输入参数

参数名 类型 说明
scriptHash String 私有化存储区数据所属的合约Hash
key String 需要查询的数据所对应的唯一键(需要转化为hex string)
network String 网络类别选择

成功的返回

参数名 类型 说明
result String 私有化存储区数据的hex string表示

失败的返回

参数名 类型 说明
type String 错误的类型
description String? 错误的说明
data String? 错误的相关数据

invokeRead_只读模拟执行合约调用

Teemo.NEO.invokeRead({
  scriptHash: '505663a29d83663a838eee091249abd167e928f5',
  operation: 'calculatorAdd',
  arguments: [
    {
      type: 'integer',
      value: 2
    },
    {
      type: 'integer',
      value: 10
    }
  ],
  network: 'TestNet'
})
.then((result: Object) => {
  console.log('Read invocation result: ' + JSON.stringigy(result));
})
.catch(({type: string, description: string, data: any}) => {
  switch(type) {
    case NO_PROVIDER:
      console.log('No provider available.');
      break;
    case CONNECTION_REFUSED:
      console.log('Connection dApp not connected. Please call the "connect" function.');
      break;
   case RPC_ERROR:
    console.log('There was an error when broadcasting this transaction to the network.');
    break;
  }
});

返回示例

{
  script: '8h89fh398f42f.....89hf2894hf9834',
  state: 'HALT, BREAK',
  gas_consumed: '0.13',
  stack: [
    {
      type: 'Integer',
      value: '1337'
    }
  ]
}

以只读模式模拟执行合约方法

输入参数

参数名 类型 说明
scriptHash String 需要执行的合约的Hash
operation String 需要执行的合约的方法名
args Argument[] Argument合约参数组
network String 网络类别选择

Argument参数结构

参数名 类型 说明
type String 合约参数的类型
value String 合约参数的值

成功的返回

结果将从CLI RPC接口直接返回

参数名 类型 说明
script String 调用合约的脚本
state String 执行状态结果
gas_consumed String 预估的系统费需求(不包括写操作的费用)
stack Argument[] 具体的返回数据组

失败的返回

参数名 类型 说明
type String 错误的类型
description String? 错误的说明
data String? 错误的相关数据

invokeReadGroup_只读模拟执行合约调用组

Teemo.NEO.invokeReadGroup({
  "group":[
      {
          "scriptHash": "fc732edee1efdf968c23c20a9628eaa5a6ccb934",
          "operation": "totalSupply",
          "arguments": [],
          "network": "TestNet"
      },
      {
          "scriptHash": "fc732edee1efdf968c23c20a9628eaa5a6ccb934",
          "operation": "name",
          "arguments": [],
          "network": "TestNet"
      },
      {
          "scriptHash": "fc732edee1efdf968c23c20a9628eaa5a6ccb934",
          "operation": "symbol",
          "arguments":[],
          "network": "TestNet"
      },
      {
          "scriptHash": "fc732edee1efdf968c23c20a9628eaa5a6ccb934",
          "operation": "decimals",
          "arguments": [],
          "network": "TestNet"
      }
  ]
})
.then((result: Object) => {
  console.log('Read invocation result: ' + JSON.stringigy(result));
})
.catch(({type: string, description: string, data: any}) => {
  switch(type) {
    case NO_PROVIDER:
      console.log('No provider available.');
      break;
    case CONNECTION_REFUSED:
      console.log('Connection dApp not connected. Please call the "connect" function.');
      break;
   case RPC_ERROR:
    console.log('There was an error when broadcasting this transaction to the network.');
    break;
  }
});

返回示例

{
  "script": '8h89fh398f42f.....89hf2894hf9834',
  "state": "HALT, BREAK",
  "gas_consumed": "0.648",
  "stack": [
    {
      "type": "ByteArray",
      "value": "00e8764817"
    },
    {
      "type": "ByteArray",
      "value": "4e454f204e616d6520437265646974"
    },
    {
      "type": "ByteArray",
      "value": "4e4e43"
    },
    {
      "type": "Integer",
      "value": "2"
    }
  ]
}

以只读模式模拟执行合约方法组,可以一次性获取合约中多个信息,比如一次性获取NEP5所有基本信息

输入参数

参数名 类型 说明
group invokeRead[] invokeRead入参数组

invokeRead入参结构

参数名 类型 说明
scriptHash String 调用的合约Hash
operation String 需要执行的合约的方法名
args Argument[] Argument合约参数组
network String 网络类别选择

Argument参数结构

参数名 类型 说明
type String 合约参数的类型
value String 合约参数的值

成功的返回

结果将从CLI RPC接口直接返回

参数名 类型 说明
script String 调用合约的脚本
state String 执行状态结果
gas_consumed String 预估的系统费需求(不包括写操作的费用)
stack Argument[] 具体的返回数据组

失败的返回

参数名 类型 说明
type String 错误的类型
description String? 错误的说明
data String? 错误的相关数据

getBlock_获取块数据

Teemo.NEO.getBlock({
            blockHeight:1112,
            network:"TestNet",
        }) 
.then(result=>{
    console.log(result);
    document.getElementById("getBlock_R").innerText = JSON.stringify(result, null, 2);
    resolve();
})
.catch(error=>{
    console.log(error);
    reject();
})

返回示例

{
  "hash": "0xb4864e0cadb79cedc11f58b2a73e9669b784e6f3eef12dcc834bad6540043c5b",
  "size": 686,
  "version": 0,
  "previousblockhash": "0xe44d7b49ca1849633713eb3266e70d63dd4ce7c17d5ea69a33101cdeb94e2bb3",
  "merkleroot": "0x6e16a374409b9e47fbf6bba2966312b350e8c85137badb99d0991baa3a380513",
  "time": 1494421978,
  "index": 1112,
  "nonce": "ffd3824d7059d835",
  "nextconsensus": "AdyQbbn6ENjqWDa5JNYMwN3ikNcA4JeZdk",
  "script": {
    "invocation": "40bcc2d6213bb9e6b0b2f4ad026fb0e93b26699637d047cdb2bd2cd9625058689b8a9b1db5e9ee4806872465f782b30344ed73d3f106384cfe8001ccd202f33ac640710ed0a89eed529e8ea8193853e3dc7169f1c287f3cd66d5667e720b3b6ba1d60c071a9a2d0d69217f6154953cc4a242d579612eeedd8a1172f73d16f9b66acd40fadd8a94368d184e91fd2949e1cc01d27bbb3590d49330cf88a584163c3c83f9dc7c8d530cc14d7cb83f592cc6eaacfa34d40d777c536ae1bde646413f429925405ef0ba5cf018d84ea857073d19062fb18528506c0ab14540612b939ef09647b227f107002032f38b5f34f085602648927e7080c55bb777559e530b6c2042798640562bcd08de9cb9ac9c72fee14b99b60afa7549fd319e76d76dee4d1ecdd5393454ba4a2009c7454396836b200f3a6ef88b0fc720d741f915185f9adb36d356f8",
    "verification": "55210209e7fd41dfb5c2f8dc72eb30358ac100ea8c72da18847befe06eade68cebfcb9210327da12b5c40200e9f65569476bbff2218da4f32548ff43b6387ec1416a231ee821034ff5ceeac41acf22cd5ed2da17a6df4dd8358fcb2bfb1a43208ad0feaab2746b21026ce35b29147ad09e4afe4ec4a7319095f08198fa8babbe3c56e970b143528d2221038dddc06ce687677a53d54f096d2591ba2302068cf123c1f2d75c2dddc542557921039dafd8571a641058ccc832c5e2111ea39b09c0bde36050914384f7a48bce9bf92102d02b1873a0863cd042cc717da31cea0d7cf9db32b74d4c72c01b0011503e2e2257ae"
  },
  "tx": [
    {
      "txid": "0x6e16a374409b9e47fbf6bba2966312b350e8c85137badb99d0991baa3a380513",
      "size": 10,
      "type": "MinerTransaction",
      "version": 0,
      "attributes": [],
      "vin": [],
      "vout": [],
      "sys_fee": "0",
      "net_fee": "0",
      "scripts": [],
      "nonce": 1884936245
    }
  ],
  "confirmations": 2607282,
  "nextblockhash": "0x2bc8072546971a6b87d154544cd823327efa880e608267de8029b4ce2926593a"
}

根据块高度获取区块信息

输入参数

参数名 类型 说明
blockHeight Number 块高度
network String 网络类别选择

成功的返回

结果将从CLI RPC接口直接返回

参数名 类型 说明
hash String 块Hash
size Number 块大小(字节)
version Number 块执行的版本号
previousblockhash String 上一块Hash
merkleroot String 默克尔根
time Number 块生成时间戳
index Number 块索引(高度)
nonce String 块伪随机数
nextconsensus String 下一个主记账人
script String 块调用签名认证信息
tx TX[] 块包含的交易组
confirmations Number 确认数(此块之后的块数)
nextblockhash String 下一个块Hash

失败的返回

参数名 类型 说明
type String 错误的类型
description String? 错误的说明
data String? 错误的相关数据

getTransaction_获取交易信息

Teemo.NEO.getTransaction({
            txid:'0c13d46dd72a47b61baf9b14cf787a8325f14cb1bfd5eafb7d407852e53299c6',
            network:"TestNet"
        }) 
.then(result=>{
    console.log(result);
    document.getElementById("getTransaction_R").innerText = JSON.stringify(result, null, 2);
    resolve();
})
.catch(error=>{
    console.log(error);
    reject();
})

返回示例

{
  "txid": "0x0c13d46dd72a47b61baf9b14cf787a8325f14cb1bfd5eafb7d407852e53299c6",
  "size": 203,
  "type": "InvocationTransaction",
  "version": 0,
  "attributes": [
    {
      "usage": "Script",
      "data": "55d6d86bdec15db437aca45b4e8705333f1fdb07"
    }
  ],
  "vin": [],
  "vout": [],
  "sys_fee": "0",
  "net_fee": "0",
  "scripts": [
    {
      "invocation": "40091fac773afb2a988e62f0652066e0a730b30a943c953b20b2396a0482501a626e34522d2def050c6651c1000cd7b638397f0ab068d878935986e3e027d096fd",
      "verification": "2103ea379c3fa408d71a4021ec77112478f790c698177352d81575328901ae0ee0e4ac"
    }
  ],
  "script": "0233117504201104431455d6d86bdec15db437aca45b4e8705333f1fdb070a736e656f5f707269636553c10873657454797065426797210e7c98582151ceb37f9748c9a1d27d9ae6fd",
  "gas": "0",
  "blockhash": "0x03e55a9ca7e205bf94b0dbf3c22a47af5b0a7d7233cb296067d0121e6cd08229",
  "confirmations": 64041,
  "blocktime": 1555303134
}

根据TXID获取交易信息

输入参数

参数名 类型 说明
txid String 交易Hash
network String 网络类别选择

成功的返回

结果将从CLI RPC接口直接返回

参数名 类型 说明
txid String 交易Hash
size Number 交易大小(字节)
type String 交易类型
version Number 交易执行的版本
attributes attribute[] 交易附加属性组
vin UTXOinput[] UTXO输入组
vout UTXOouttput[] UTXO输出组
sys_fee String 交易系统费
net_fee String 交易网络费
scripts script[] 交易签名认证信息组
script String 交易调用脚本
gas String 交易消耗GAS
blockhash String 交易所在块Hash
confirmations Number 交易确认数
blocktime Number 交易所在块时间戳

失败的返回

参数名 类型 说明
type String 错误的类型
description String? 错误的说明
data String? 错误的相关数据

getApplicationLog_获取调用交易执行日志

Teemo.NEO.getApplicationLog({
            txid:'0c13d46dd72a47b61baf9b14cf787a8325f14cb1bfd5eafb7d407852e53299c6',
            network:"TestNet"
        }) // 获得余额的方法
.then(result=>{
    console.log(result);
    document.getElementById("getApplicationLog_R").innerText = JSON.stringify(result, null, 2);
    resolve();
})
.catch(error=>{
    console.log(error);
    reject();
})

返回示例

{
  "txid": "0x0c13d46dd72a47b61baf9b14cf787a8325f14cb1bfd5eafb7d407852e53299c6",
  "executions": [
    {
      "trigger": "Application",
      "contract": "0xad23d4ccc2e8d4f2747ab15c35f2852761b8df51",
      "vmstate": "HALT, BREAK",
      "gas_consumed": "9.509",
      "stack": [
        {
          "type": "Integer",
          "value": "1"
        }
      ],
      "notifications": [
        {
          "contract": "0xfde69a7dd2a1c948977fb3ce512158987c0e2197",
          "state": {
            "type": "Array",
            "value": [
              {
                "type": "ByteArray",
                "value": "6f7261636c654f70657261746f72"
              },
              {
                "type": "ByteArray",
                "value": "55d6d86bdec15db437aca45b4e8705333f1fdb07"
              },
              {
                "type": "ByteArray",
                "value": "736e656f5f7072696365"
              },
              {
                "type": "ByteArray",
                "value": ""
              },
              {
                "type": "ByteArray",
                "value": "20110443"
              },
              {
                "type": "Integer",
                "value": "2"
              }
            ]
          }
        },
        {
          "contract": "0xfde69a7dd2a1c948977fb3ce512158987c0e2197",
          "state": {
            "type": "Array",
            "value": [
              {
                "type": "ByteArray",
                "value": "6f7261636c654f70657261746f72"
              },
              {
                "type": "ByteArray",
                "value": "55d6d86bdec15db437aca45b4e8705333f1fdb07"
              },
              {
                "type": "ByteArray",
                "value": "736e656f5f7072696365"
              },
              {
                "type": "ByteArray",
                "value": ""
              },
              {
                "type": "Integer",
                "value": "1127710905"
              },
              {
                "type": "Integer",
                "value": "5"
              }
            ]
          }
        }
      ]
    }
  ]
}

根据TXID获取调用交易执行日志

输入参数

参数名 类型 说明
txid String 交易Hash
network String 网络类别选择

成功的返回

结果将从CLI RPC接口直接返回

参数名 类型 说明
txid String 交易Hash
executions execution[] 交易执行情组
executions.trigger String 交易执行触发器种类
executions.contract String 交易执行合约Hash
executions.vmstate String 交易执行状态(VM是否中途奔溃)
executions.gas_consumed String 交易执行耗费GAS
executions.stack TypeValue[] 交易执行输出堆栈(合约返回值)
executions.notifications notification[] 交易执行通知组

notification结构

参数名 类型 说明
contract String 交易执行通知所在的合约Hash
state TypeValue 交易执行通知数据体

失败的返回

参数名 类型 说明
type String 错误的类型
description String? 错误的说明
data String? 错误的相关数据

写类型方法

写类型方法会修改区块状态,并且需要用户私钥签名(需要用户显式允许)

send 发送转账交易

Teemo.NEO.send({
  fromAddress: 'ATaWxfUAiBcQixNPq6TvKHEHPQum9bx79d',
  toAddress: 'ATaWxfUAiBcQixNPq6TvKHEHPQum9bx79d',
  asset: '602c79718b16e442de58778e148d0b1084e3b2dffd5de6b7b16cee7969282de7',
  amount: '0.0001',
  remark: 'Hash puppy clothing purchase. Invoice#abc123',
  fee: '0.0001',
  network: 'MainNet'
})
.then(({txid, nodeUrl}: SendOutput) => {
  console.log('Send transaction success!');
  console.log('Transaction ID: ' + txid);
  console.log('RPC node URL: ' + nodeUrl);
})
.catch(({type: string, description: string, data: any}) => {
  switch(type) {
    case NO_PROVIDER:
      console.log('No provider available.');
      break;
    case SEND_ERROR:
      console.log('There was an error when broadcasting this transaction to the network.');
      break;
    case MALFORMED_INPUT:
      console.log('The receiver address provided is not valid.');
      break;
    case CANCELED:
      console.log('The user has canceled this transaction.');
      break;
    case INSUFFICIENT_FUNDS:
      console.log('The user has insufficient funds to execute this transaction.');
      break;
  }
});

示例返回

{
  txid: 'ed54fb38dff371be6e3f96e4880405758c07fe6dd1295eb136fe15f311e9ff77',
  nodeUrl: 'http://seed7.ngd.network:10332',
}

本方法可以用于在NEO区块链上进行转账操作,同时支持全局资产(UTXO资产)和合约资产(NEP-5资产),该方法需要用户确认(会有一个确认页面弹出)。

输入参数

参数 类型 说明
fromAddress String 转账的发送方地址。需要用此地址的私钥进行签名(用户拥有此地址)
toAddress String 转账的接收方地址。
asset String 资产的ID,如GAS为602c79718b16e442de58778e148d0b1084e3b2dffd5de6b7b16cee7969282de7,或NNC为fc732edee1efdf968c23c20a9628eaa5a6ccb934
amount String 转账的金额。钱包(Dapi提供者)将自动为您处理资产精度,只需输入浮点数。
remark String? 交易的备注, 备注将会被记录到链上
fee String? 网络手续费,目前的定义为网络费低于0.0001GAS的交易视作免费交易,其共识优先级低于付费交易。如果为0,用户还可以在确认页添加网络费
network String 网络类别的选择,信息来自getNetworks方法

成功的返回

参数 类型 说明
txid String 发送的交易体的hash
nodeURL String 发送交易体的NEO节点的URL地址

失败的返回

参数名 类型 说明
type String 错误的类型
description String? 错误的说明
data String? 错误的相关数据

Invoke 发送合约调用交易

Teemo.NEO.invoke({
  "scriptHash":"74f2dc36a68fdc4682034178eb2220729231db76",
  "operation":"transfer",
  "arguments":[
      {
        "type":"Address",
        "value":"AHDV7M54NHukq8f76QQtBTbrCqKJrBH9UF"
      },
      {
        "type":"Address",
        "value":"AbU7BUQHW9sa69pTac7pPR3cq4gQHYC1DH"
      },
      {
        "type":"Integer",
        "value":"100000"
      }
  ],
  "fee":"0.001",
  "description":"NNC转账",
  "network":"TestNet"
})
.then(({txid, nodeUrl}: InvokeOutput) => {
  console.log('Invoke transaction success!');
  console.log('Transaction ID: ' + txid);
  console.log('RPC node URL: ' + nodeUrl);
})
.catch(({type: string, description: string, data: any}) => {
  switch(type) {
    case NO_PROVIDER:
      console.log('No provider available.');
      break;
    case RPC_ERROR:
      console.log('There was an error when broadcasting this transaction to the network.');
      break;
    case CANCELED:
      console.log('The user has canceled this transaction.');
      break;
  }
});

返回示例

{
  txid: 'ed54fb38dff371be6e3f96e4880405758c07fe6dd1295eb136fe15f311e9ff77',
  nodeUrl: 'http://seed7.ngd.network:10332',
}:

本方法构造合约调用交易并发送。合约调用交易是使用智能合约写方法(改变私有化存储区的操作)的唯一途径,无论是执行NEP-5转账还是参与一次NNS竞拍,都需要构造合约调用交易。

输入参数

参数 类型 说明
scriptHash String 所需调用合约的Hash
operation String 所需调用合约的方法名. 可以从合约的ABI文件或者合约开发者的文档获得
args Argument[] 一个合约方法输入参数的数组
description String 对于此次操作的简要说明,该说明将会显示在钱包的确认页面帮助用户理解(说明暂时不会存储在链上)
fee String? 网络手续费,目前的定义为网络费低于0.0001GAS的交易视作免费交易,其共识优先级低于付费交易。如果为0,用户还可以在确认页添加网络费
network String 网络类别的选择,信息来自getNetworks方法
attachedAssets AttachedAssets? 合约附加资产,在代币销售方法会需要
assetIntentOverrides AssetIntentOverrides 指定附加资产UTXO,如果使用此项,fee和attachedAssets将被忽略(Teemo暂不支持)
triggerContractVerification Boolean? 添加指令调用合约的鉴权触发器(Teemo暂不支持)

Argument参数结构

参数名 类型 说明
type String 合约参数的类型
value String 合约参数的值

AttachedAssets 附加资产

参数名 类型 说明
NEO String? 附加NEO的数量
GAS String? 附加GAS的数量

AssetIntentOverrides 附加资产UTXO覆盖 (Teemo暂不支持)

参数名 类型 说明
inputs AssetInput[] 一个 UTXO inputs 的数组
outputs AssetOutput[] 一个 UTXO outputs 的数组

AssetInput 附加资产UTXO输入 (Teemo暂不支持)

参数名 类型 说明
txid String 交易的ID将被作为UTXO的输入使用
index String Index of the UTXO, can be found from transaction details

AssetOutput 附加资产UTXO输出 (Teemo暂不支持)

参数名 类型 说明
asset String 资产ID
value String 资产金额
address String 转账的接收方的地址

成功的返回

参数 类型 说明
txid String 发送的交易体的hash
nodeURL String 发送交易体的NEO节点的URL地址

失败的返回

参数名 类型 说明
type String 错误的类型
description String? 错误的说明
data String? 错误的相关数据

InvokeGroup 发送合约调用交易组

Teemo.NEO.invokeGroup({
  "merge": true,
  "group": [
    {
      "scriptHash": "74f2dc36a68fdc4682034178eb2220729231db76",
      "operation": "transfer",
      "arguments": [
        {
          "type": "Address",
          "value": "AHDV7M54NHukq8f76QQtBTbrCqKJrBH9UF"
        },
        {
          "type": "Address",
          "value": "AbU7BUQHW9sa69pTac7pPR3cq4gQHYC1DH"
        },
        {
          "type": "Integer",
          "value": "100000"
        }
      ],
      "description": "NNC转账",
      "fee": "0",
      "network": "TestNet"
    },
    {
      "scriptHash": "00d00d0ac467a5b7b2ad04052de154bb9fe8c2ff",
      "operation": "setmoneyin",
      "arguments": [
        {
          "type": "Hook_Txid",
          "value": 0
        },
        {
          "type": "Hash160",
          "value": "74f2dc36a68fdc4682034178eb2220729231db76"
        }
      ],
      "description": "充值确认",
      "fee": "0.001",
      "network": "TestNet"
    }
  ]
})
.then(({txid, nodeUrl}: InvokeOutput) => {
  console.log('Invoke transaction success!');
  console.log('Transaction ID: ' + txid);
  console.log('RPC node URL: ' + nodeUrl);
})
.catch(({type: string, description: string, data: any}) => {
  switch(type) {
    case NO_PROVIDER:
      console.log('No provider available.');
      break;
    case RPC_ERROR:
      console.log('There was an error when broadcasting this transaction to the network.');
      break;
    case CANCELED:
      console.log('The user has canceled this transaction.');
      break;
  }
});

返回示例

//merge=true
[
  {
    "txid": "0cba61b8779f3343ff39fbecee596395b06490bce7245412ee788c8620813b63",
    "nodeUrl": "https://api.nel.group/api"
  }
]

//merge=false
[
  {
    "txid": "045e1612d2dd2edf29d6bb45657329bacc299072655691f9cc0f486fb649a30d",
    "nodeUrl": "https://api.nel.group/api"
  },
  {
    "txid": "4747e2b50cbd853c13b24e67d59225816f152a13ee281345751eb51bf811355c",
    "nodeUrl": "https://api.nel.group/api"
  }
]

本方法构造合约调用交易组并发送,并且内涵两种模式:聚合模式和非聚合模式:

聚合模式:钱包将输入的每个Invoke合约调用操作按照顺序统一构造进入 一个单一的 合约调用交易体,使得多个合约方法能够在一个交易中执行完成。该模式适合多个不同合约的小操作(耗费GAS少的)合并一个交易。聚合模式需要注意,是否聚合后会是的脚本执行超过10GAS。聚合模式下,交易的总的fee为各Invoke元素中fee之和。

非聚合模式:钱包将输入的每个Inovke合约调用操作按照顺序构造为 多个独立的 合约调用交易体,只有前一个交易被确认已经共识(上链)才会发送下一个交易。该模式适合一系列关联的合约操作,按先后逻辑关系自动搭接执行。

Hook_Txid:此类型为InvokeGroup方法特有,意为将上一个交易的txid作为下一个交易的输入参数,同时支持聚合模式和非聚合模式。但是有以下限制:

  1. Hook_Txid不能出现在第一个Invoke元素
  2. Hook_Txid的value必须是0,意为只能取第一个交易的txid
  3. 使用Hook_Txid时,在聚合模式下,最多只能定义两个Invoke元素

输入参数

参数名 类型 说明
merge Boolean 选择是否采用聚合模式
group Invoke[] Invoke结构的数组

Invoke结构

参数 类型 说明
scriptHash String 所需调用合约的Hash
operation String 所需调用合约的方法名. 可以从合约的ABI文件或者合约开发者的文档获得
args Argument[] 一个合约方法输入参数的数组
description String 对于此次操作的简要说明,该说明将会显示在钱包的确认页面帮助用户理解(说明暂时不会存储在链上)
fee String? 网络手续费,目前的定义为网络费低于0.0001GAS的交易视作免费交易,其共识优先级低于付费交易。如果为0,用户还可以在确认页添加网络费
network String 网络类别的选择,信息来自getNetworks方法
attachedAssets AttachedAssets? 合约附加资产,在代币销售方法会需要
assetIntentOverrides AssetIntentOverrides 指定附加资产UTXO,如果使用此项,fee和attachedAssets将被忽略(Teemo暂不支持)
triggerContractVerification Boolean? 添加指令调用合约的鉴权触发器(Teemo暂不支持)
Argument参数结构
参数名 类型 说明
type String 合约参数的类型
value String 合约参数的值

AttachedAssets 附加资产

参数名 类型 说明
NEO String? 附加NEO的数量
GAS String? 附加GAS的数量

成功的返回

参数 类型 说明
[] Array invoke返回结构的数组

invoke返回结构

参数 类型 说明
txid String 发送的交易体的hash
nodeURL String 发送交易体的NEO节点的URL地址

失败的返回

参数名 类型 说明
type String 错误的类型
description String? 错误的说明
data String? 错误的相关数据

工具类方法

该类方法旨在帮助Dapp验证、转换NEO的各种类型数据,简化Dapp的开发中与NEO相关的代码。转换大多以将getApplicationLog的合约数据信息转换为人类易于理解的、Dapp需要显示的形式为设计初衷。

validateAddress_验证地址正确性

Teemo.NEO.TOOLS.validateAddress("ASBhJFN3XiDu38EdEQyMY3N2XwGh1gd5WW")
.then(result=>{
    console.log(result);
    console.log("地址验证:"+ result);
    document.getElementById("validateAddress_R").innerText = JSON.stringify(result, null, 2);
    resolve();
})
.catch(error=>{
    console.log("==============进入了异常流程");
    console.log(error);
    document.getElementById("validateAddress_R").innerText = JSON.stringify(error, null, 2);
    reject();
})

返回示例

true | false

验证输入的地址是否为一个合法的NEO地址

输入参数

参数名 类型 说明
address String 需要验证的地址

成功的返回

参数名 类型 说明
result Boolen 验证的布尔型结果

失败的返回

参数名 类型 说明
type String 错误的类型
description String? 错误的说明
data String? 错误的相关数据

getAddressFromScriptHash_转换ScriptHash为地址

Teemo.NEO.TOOLS.getAddressFromScriptHash("72329a15ef9f2ea76cbc8dbc082c72316d87e1ae")
.then(result=>{
    console.log(result);
    console.log("Address:"+ result);
    document.getElementById("getAddressFromScriptHash_R").innerText = JSON.stringify(result, null, 2);
    resolve();
})
.catch(error=>{
    console.log("==============进入了异常流程");
    console.log(error);
    document.getElementById("getAddressFromScriptHash_R").innerText = JSON.stringify(error, null, 2);
    reject();
})

返回示例

"ASBhJFN3XiDu38EdEQyMY3N2XwGh1gd5WW"

将输入的scriptHash转换为NEO地址

输入参数

参数名 类型 说明
scriptHash String 需要转换的的scriptHash

成功的返回

参数名 类型 说明
result String 转换输出的NEO地址

失败的返回

参数名 类型 说明
type String 错误的类型
description String? 错误的说明
data String? 错误的相关数据

reverseHexstr_hex字符串翻转

Teemo.NEO.TOOLS.reverseHexstr("03febccf81ac85e3d795bc5cbd4e84e907812aa3")
.then(result=>{
    console.log(result);
    document.getElementById("reverseHexstr_R").innerText = JSON.stringify(result, null, 2);
    resolve();
})
.catch(error=>{
    console.log("==============进入了异常流程"); 
    console.log(error);
    document.getElementById("reverseHexstr_R").innerText = JSON.stringify(error, null, 2);
    reject();
})

返回示例

"a32a8107e9844ebd5cbc95d7e385ac81cfbcfe03"

将输入的hexStr进行翻转处理

输入参数

参数名 类型 说明
hexStr String 十六进制byte字符串

成功的返回

参数名 类型 说明
result String 翻转后十六进制byte字符串

失败的返回

参数名 类型 说明
type String 错误的类型
description String? 错误的说明
data String? 错误的相关数据

getStringFromHexstr_转换hex字符串为字符串

Teemo.NEO.TOOLS.getStringFromHexstr("746573742064656d6f")
.then(result=>{
    console.log(result);
    document.getElementById("getStringFromHexstr_R").innerText = JSON.stringify(result, null, 2);
    resolve();
})
.catch(error=>{
    console.log("==============进入了异常流程");
    console.log(error);
    document.getElementById("getStringFromHexstr_R").innerText = JSON.stringify(error, null, 2);
    reject();
})

返回示例

"test demo"

将输入的hexStr转换为UTF8字符串

输入参数

参数名 类型 说明
hexStr String 十六进制byte字符串

成功的返回

参数名 类型 说明
result String 转换后UTF8字符串

失败的返回

参数名 类型 说明
type String 错误的类型
description String? 错误的说明
data String? 错误的相关数据

getBigIntegerFromHexstr_转换hex字符串为大整数

Teemo.NEO.TOOLS.getBigIntegerFromHexstr("3fb83001")
.then(result=>{
    console.log(result);
    console.log("BigInterger"+ result);
    document.getElementById("getBigIntegerFromHexstr_R").innerText = JSON.stringify(result, null, 2);
    resolve();
})
.catch(error=>{
    console.log("==============进入了异常流程");
    console.log(error);
    document.getElementById("getBigIntegerFromHexstr_R").innerText = JSON.stringify(error, null, 2);
    reject();
})

返回示例

"19970111"

将输入的hexStr转换为大整数字符串

输入参数

参数名 类型 说明
hexStr String 十六进制byte字符串

成功的返回

参数名 类型 说明
result String 转换后大整数字符串

失败的返回

参数名 类型 说明
type String 错误的类型
description String? 错误的说明
data String? 错误的相关数据

getBigIntegerFromAssetAmount_转换数值金额为大整数

Teemo.NEO.TOOLS.getBigIntegerFromAssetAmount({
        "amount":"12345.67890000",
        "assetID":"74f2dc36a68fdc4682034178eb2220729231db76",
        "network":"TestNet"
    })
.then(result=>{
    console.log(result);
    console.log("Decimals"+ result);
    document.getElementById("getDecimalsFromAssetAmount_R").innerText = JSON.stringify(result, null, 2);
    resolve();
})
.catch(error=>{
    console.log("==============进入了异常流程");
    console.log(error);
    document.getElementById("getDecimalsFromAssetAmount_R").innerText = JSON.stringify(error, null, 2);
    reject();
})

返回示例

"1234567890000"

根据资产精度定义,将输入的金额数值转换为大整数字符串

输入参数

参数名 类型 说明
amount String 需要转换的金额数值
assetID String 需要转换的资产ID
network String 需要转换的网络选择

成功的返回

参数名 类型 说明
result String 转换后大整数字符串

失败的返回

参数名 类型 说明
type String 错误的类型
description String? 错误的说明
data String? 错误的相关数据

getDecimalsStrFromAssetAmount_转换大整数金额为数值

Teemo.NEO.TOOLS.getDecimalsStrFromAssetAmount({
        "amount":"1234567890000",
        "assetID":"74f2dc36a68fdc4682034178eb2220729231db76",
        "network":"TestNet"
    })
.then(result=>{
    console.log(result);
    console.log("BigInteger",result);
    document.getElementById("getBigIntegerFromAssetAmount_R").innerText = JSON.stringify(result, null, 2);
    resolve();
})
.catch(error=>{
    console.log("==============进入了异常流程");
    console.log(error);
    document.getElementById("getBigIntegerFromAssetAmount_R").innerText = JSON.stringify(error, null, 2);
    reject();
})

返回示例

"12345.6789"

根据资产精度定义,将输入的金额大整数字符串转换为数值

输入参数

参数名 类型 说明
amount String 需要转换的金额大整数字符串
assetID String 需要转换的资产ID
network String 需要转换的网络选择

成功的返回

参数名 类型 说明
result String 转换后金额数值

失败的返回

参数名 类型 说明
type String 错误的类型
description String? 错误的说明
data String? 错误的相关数据

NNS方法

该类方法帮助Dapp便捷处理与NNS相关的事物

getNamehashFromDomain_转换域名为Namehash

Teemo.NEO.NNS.getNamehashFromDomain("test222.neo")
.then(result=>{
    console.log(result);
    document.getElementById("getNamehashFromDomain_R").innerText = JSON.stringify(result, null, 2);
    resolve();
})
.catch(error=>{
    console.log("==============进入了异常流程");

    console.log(error);
    document.getElementById("getNamehashFromDomain_R").innerText = JSON.stringify(error, null, 2);
    reject();
})

返回示例

"68bea578a5565e0a4cb37811cda13d092cd6681f0687261f22b085586577b7b1"

将输入的NNS域名转换为NameHash

输入参数

参数名 类型 说明
domain String 要转换的NNS域名

成功的返回

参数名 类型 说明
result String 转换后的NameHash

失败的返回

参数名 类型 说明
type String 错误的类型
description String? 错误的说明
data String? 错误的相关数据

getAddressFromDomain_NNS域名解析

Teemo.NEO.NNS.getAddressFromDomain({
            "domain":"test222.neo",
            "network":"TestNet"
        })
.then(result=>{
    console.log(result);
    console.log("BigInteger",result);
    document.getElementById("getAddressFromDomain_R").innerText = JSON.stringify(result, null, 2);
    resolve();
})
.catch(error=>{
    console.log("==============进入了异常流程");
    console.log(error);
    document.getElementById("getAddressFromDomain_R").innerText = JSON.stringify(error, null, 2);
    reject();
})

返回示例

{
  "address": "AHDV7M54NHukq8f76QQtBTbrCqKJrBH9UF",
  "TTL": "1568428640"
}

将输入的NNS域名解析为NEO地址

输入参数

参数名 类型 说明
domain String 要解析的NNS域名
network String 网络类型选择

成功的返回

参数名 类型 说明
address String NNS域名的NEO地址解析结果
TTL String NNS域名的到期时间戳

失败的返回

参数名 类型 说明
type String 错误的类型
description String? 错误的说明
data String? 错误的相关数据

getDomainFromAddress_NNS域名反向解析

Teemo.NEO.NNS.getDomainFromAddress({
            "address":"AHDV7M54NHukq8f76QQtBTbrCqKJrBH9UF",
            "network":"TestNet"
        })
.then(result=>{
    console.log(result);
    console.log("BigInteger",result);
    document.getElementById("getDomainFromAddress_R").innerText = JSON.stringify(result, null, 2);
    resolve();
})
.catch(error=>{
    console.log("==============进入了异常流程");
    console.log(error);
    document.getElementById("getDomainFromAddress_R").innerText = JSON.stringify(error, null, 2);
    reject();
})

返回示例

{
  "namehash": "68bea578a5565e0a4cb37811cda13d092cd6681f0687261f22b085586577b7b1",
  "fullDomainName": "test222.neo",
  "TTL": "1568428640"
}

将输入的NEO地址反向解析为NNS域名

输入参数

参数名 类型 说明
address String 要反向解析的NEO地址
network String 网络类型选择

成功的返回

参数名 类型 说明
namehash String 反向解析得到的NNS NameHash
fullDomainName String 反向解析得到的NNS域名字符串
TTL String NNS域名所有者设置反向解析时的NNS到期时间戳

失败的返回

参数名 类型 说明
type String 错误的类型
description String? 错误的说明
data String? 错误的相关数据

事件

事件是一种钱包(Dapi提供者)主动通知方式,被授权的Dapp能够在事件发生时被动的捕获事件和相关数据,并据此调整Dapp的行为模式。

READY 准备完成事件

当钱包的通信js注入Dapp页面完成,页面就会收到“准备完成事件”。钱包的所有方法,都应该在这个事件发生后开始调用。收到此事件同时,会获得一个getProvider方法的返回数据。

完整事件名

Teemo.NEO.READY

事件数据

参数名 类型 说明
name String 钱包(Dapi提供者)的名称
website String 钱包(Dapi提供者)的官方网址
version String 钱包(Dapi提供者)提供Dapi的版本
compatibility String[] 钱包(Dapi提供者)支持的NEP协议列表
extra Object 钱包(Dapi提供者)的附加属性
扩展
参数名 类型 说明
theme string 钱包(Dapi提供者)的UI风格
currency string 用户设置的基础货币

ACCOUNT_CHANGED 地址变更事件

当钱包的使用者,在钱包管理界面中更换地址时,会触发此事件。收到此事件同时,会获得一个getAccount方法的返回数据。

完整事件名

Teemo.NEO.ACCOUNT_CHANGED

事件数据

参数名 类型 说明
address String 当前钱包(Dapi提供者)被选中(使用中)的NEO地址
label String 当前钱包(Dapi提供者)被选中(使用中)的用户设定名称

CONNECTED 已连接事件

Dapp在首次请求钱包的任何方法前,都需要用户确认是否同意授权Dapp访问钱包。如果用户同意,Dapp将收到此事件。收到此事件同时,会获得一个getAccount方法的返回数据。

另一种情况,如果钱包从非登录(锁定)状态变为登录(解锁)状态,Dapp也将收到此事件。

完整事件名

Teemo.NEO.CONNECTED

事件数据

参数名 类型 说明
address String 连接时钱包选择的地址
label String 连接时钱包选择的账户标签

DISCONNECTED 连接断开事件

当钱包和Dapp断开连接时会收到此事件,例如退出登录操作会触发这一事件。这个事件没有附带数据。

完整事件名

Teemo.NEO.DISCONNECTED

NETWORK_CHANGED 网络变更事件

当钱包的使用者,在钱包管理界面中更换网络时,会触发此事件。收到此事件同时,会获得一个getNetworks方法的返回数据。

完整事件名

Teemo.NEO.NETWORK_CHANGED

事件数据

参数名 类型 说明
networks String[] 一个允许的网络类型的列表
defaultNetwork String 目前钱包设置的网络类型

BLOCK_HEIGHT_CHANGED 块高度变更事件

当所在网络区块高度变更时(出块时),将触发此事件,Dapp可根据此事件执行相应动作。本事件数据包含,新块高度、块Hash、块时间戳和块包含TXID表

完整事件名

Teemo.NEO.BLOCK_HEIGHT_CHANGED

事件数据

参数名 类型 说明
network String 网络类型
blockHeight Number 新块索引值(高度)
blockTime Number 新块时间戳
blockHash String 新块Hash
tx TXID[] 新块包含的TXID组

TRANSACTION_CONFIRMED 交易共识(确认)事件

当通过钱包(Dapi提供者)发出的交易被共识(确认)时,将触发此事件。Dapp可根据此事件执行相应动作。

完整事件名

Teemo.NEO.TRANSACTION_CONFIRMED

事件数据

参数名 类型 说明
TXID String 交易Hash
blockHeight Number 交易所在块索引值(高度)
blockTime Number 交易所在块时间戳

事件方法

捕获事件

window.addEventListener('Teemo.NEO.READY',(data:CustomEvent)=>{
    console.log("Teemo READY ");
    console.log(JSON.stringify(data.detail))

    const main = new Main();
    main.start();//监听到这个事件后,才能开始插件的相关方法调用
})

在Dapp页面采用标准JS 事件获取方法window.addEventListener获取钱包的自定义事件和事件数据,并在收到事件和数据后进行相应逻辑处理。

注意,事件都是异步的。

错误

这里我们定义了一些常见错误,提示Dapp改正方向

错误类型 定义
NO_PROVIDER 无法找到dAPI的实例(钱包未安装)
CONNECTION_DENIED dAPI提供程序拒绝处理此请求
RPC_ERROR 提交请求时发生RPC错误(CLI节点错误)
MALFORMED_INPUT 诸如地址之类的输入不是有效的NEO地址
CANCELED 用户取消或拒绝dapps请求
INSUFFICIENT_FUNDS 用户没有足够的余额来执行请求的操作