# WINkLink 价格服务

# 介绍

智能合约经常需要对真实世界的代币资产价格做响应,在 DeFi 领域更是如此,资产价格必须和真实世界价格高度对应, 否则用户和开发者可能承受合约被套利或攻击带来的损失。

WINkLink 价格服务专注于数字货币价格对, 为 DApp 提供准确稳定的外部世界数字货币价格信息。

WINkLink 官方提供了聚合多个 WINkLink 预言机节点价格数据的方案,最终得到稳定的价格服务,称作喂价合约(Price Feed Contract).

本文介绍如何使用和部署 WINkLink 价格服务合约。

# 获取最新价格

消费者合约中获取最新价格数据需要引入 AggregatorInterface, 该接口定义了喂价服务对外提供的接口。

pragma solidity ^0.5.0;

interface AggregatorInterface {
    function latestAnswer() external view returns (int256);
    function latestTimestamp() external view returns (uint256);
    function latestRound() external view returns (uint256);
    function getAnswer(uint256 roundId) external view returns (int256);
    function getTimestamp(uint256 roundId) external view returns (uint256);
}

contract PriceConsumer {
    AggregatorInterface internal priceFeed;

    /**
     * Price Aggregator Address: TYZxQSHAhxGgUWzxYEZAohvWc9cQWXtNBt
     */
    constructor() public {
        priceFeed = AggregatorInterface(0xF7e52418572834722ED87E9425d673FEdBD55a0e);
    }

    /**
     * Returns the latest price
     */
    function getLatestPrice() public view returns (int) {
        // If the round is not complete yet, timestamp is 0
        require(priceFeed.latestTimestamp() > 0, "Round not complete");
        return priceFeed.latestAnswer();
    }
}

# 历史价格

AggregatorInterface 接口函数列表,通过 getAnswer(uint256 roundId) 可以获取历史价格信息。对应的时间戳通过 getTimestamp(uint256 roundId) 获得。

# 喂价合约

# 主网

Pair Contract Address (Proxy)
BTC-TRX TX4rin6u2SaF3TqANqRgzfSCGi95azQNVY
BTC-USD TQoijQ1iZKRgJsAAWNPMu6amgtCJ3WMUV7
BTT-TRX TS26cn4GmmipyGTcgvRRwqL6AyEU6vK4rw
BTT-USD TBAAW545oJ6iTxqzezGvagrSUzCpz1S8eR
BTTOLD-TRX TUjTmKMxGmH78t5DmY7YsfJFoGw6XyX9VZ
BTTOLD-USD TEEnwU47Fgx4Ehii7Xs9bLWK3XKo4fs6sV
BUSD-TRX TNjd3CCfdbpYZVNz6Tzf7LtjU3wT4Pit8w
BUSD-USD TTwxWVbsLfQTBLqWiremnZtzddeUCYDC8r
ETH-TRX TXZ9AUk6nC2454NSDGUWvPB72JxSNJrezX
ETH-USD TR2yWYWovJaSM7TfZq7L7sT7ZRugdJJQmL
JST-TRX TC19QPF2mjP1ZhXxD8JNKJs4ksxMZkCuNP
JST-USD TE5rKoDzKmpVAQp1sn7x6V8biivR3d5r47
LIVE-USD TNdLmxVhdj1H1yGjhhSp33cMaAJKjyTAM4
LTC-TRX TVJPFXKMysYsRWEXJ3JkSnAUPucinUFUB6
LTC-USD TGxGL85kN3W5sGdBiobgWabWFcMEtoqRJJ
NFT-TRX TKtc1V6QAY1Gpy511QjzXkLUphG8Dre8CY
NFT-USD TEC8b2oL6sAQFMiea73tTgjtTLwyV1GuZU
STRX-TRX TW9bNueyJZA9iZnNXGYkJuPJJ7KFN3o5qw
SUN-TRX TLLyqXr5cbYEMjzeThe1esss1SVBbxxubu
SUN-USD TRMgzSPsuWEcVpd5hv19XtLeCk8Z799sZa
SUNOLD-TRX TWAob1YsNzh7bfgkjfAD9MAdarcoSWScWw
SUNOLD-USD TEEuSdqyv2NFREtNoUXMTDSmJVK3KCuLac
TRX-USD TR5HtpPK4gX4RFC4DCBUHfFgsGkGFEzSAb
TUSD-TRX TLXMULb1SRpv841Q54C4DhWkmmGfRA2rUH
TUSD-USD TBc3yBP8xcyQ1E3hDTUhRxToMrgekLH2kh
USDC-TRX TNTm5ezUGHxYc9Mvst58yYTAjxDmqWWGZc
USDC-USD TNu3zS55MP4KnBBP6Maw1nHSzRpc3CXAxm
USDD-TRX TWW4P2pck8rFcxx3H8NfnH4qhNPu1V35Pb
USDD-USD TJ7jEgoYVaeymVfYZ3bS57dYArwVDS1mhW
USDJ-TRX TCBKyYMP4YQFHxYznuUaResHDTaEWLuJNW
USDJ-USD TB1MyT7pDCNg8w7cSW1QvYKs4WPzErzP5k
USDT-TRX TUfV7S4RYtdmBvtHzedfFPVsK9nvndtETp
USDT-USD TKePc46n5CiUCR8LL788TFeKA4kjvNnuem
WIN-TRX TQvCG1U2jGTVwXLqvFWR27LDtEJZVgRbEg
WIN-USD TSCef3LT3jpLwwXCWhZe3hZoMsYk1ZLif2
WSTUSDT-TRX TKcTU5vCPqBBfuULEGXg9kkLx6Tzs2Zo3x

# Nile 测试网

  • WIN 代币合约地址: TNDSHKGBmgRx9mDYA9CnxPx55nu672yQw2
  • WinkMid 合约地址: TLDU7C8K3Gd3pXrAj9gtpVVNRHZHuHHZ8P

价格服务合约地址列表:

Pair Nile (Proxy)
BTC-TRX TFETSL1Yc8dCJM7z6uBkHhAsPbqP5UaCDE
BTC-USD TAX8Pm3FgN74za72TFZrn5gPBxJTKgnnpE
BTT-TRX TKbeHN2hdrgSShG6iF3mDsJTu9fFzNrHjo
BTT-USD TJdzg4wqBt4JkP1ehbYQufg1cLjbomT2j7
BTTOLD-TRX TETkTRbnyB4ptWiK9qXgiyFxQQ9d8ZacT6
BTTOLD-USD TRpRfFzubR7oheDCwHRbwJRfeFa85L6tWE
BUSD-TRX TDBQRjnrdrDKcgPDyLuP11UC8CV8hwZGxe
BUSD-USD TAiAAKcD4FtNhcJ8q9ZpkpnvSJ5R9XqYVx
ETH-TRX TSVJwLrhWBF7K6BkEG6hStjMxQJXAzBABQ
ETH-USD TQGyY3mWTTzKKBLBg3wQTSbAGqBnGqYSzX
JST-TRX TSf6ZwFrDg5Jvyci1PnRHrrZvPpCCKNTjj
JST-USD TJ7SizJiCAjMPAri1CFAxzg4xCRLycumMj
LIVE-USD TPxNjLNrn3WAwoyGQgqJyw3dLo9E79mUdH
LTC-TRX TWProfbHdGBCf7HVNys5KAbVT4vhUwpu22
LTC-USD TRSFTb2seuQxQqUsyeJ8Wg8XhX1e2g3T19
NFT-TRX TWP99RnyMVKFjzuu9XT5J21qBZu8DwhCum
NFT-USD TX5KVe4sp24w5HJ4nfk2ZstRhV8RTFm67W
STRX-TRX TEbUQ4gohuK5wdtKmpnGd2kvyzhhznJDCx
SUN-TRX TTxxeWGpSDV3zPDxnYXzG1ue7RpTYTvDpY
SUN-USD TJjENuVH7TD8RJdGtj22ac6Bt1ktpBGURR
SUNOLD-TRX TNfn4qt4QJ7LAndM2aWbxrGGH8CRGvzxui
SUNOLD-USD TMKzWKMA1gSwjYSL6VpfCUXLuwPKdjEsQ2
TRX-USD TCeXRh9vcb78j2Eb2oJk4YwwnoHQDT64T1
TUSD-TRX TM1bvBzHkRrQqvvHGi1CC1Heb8ESWreiNW
TUSD-USD TUuxMFxv6qPn1ymZoYY45SSK1hhEVAvyKz
USDC-TRX TWio8JqYx2aey49ua2ohLoyBPbVVWos8RB
USDC-USD TF5a2qhfxtWzUQnAocPoxgKXLe1vEE8oER
USDD-TRX TFr7TWdb5RWPNCfecr3HNfnCmNNL8qvgmJ
USDD-USD TX264fxRmdhNfUgkruk9orzAVvtCehyowq
USDJ-TRX TDJtnT7JRNqmNaqY1mK9i1xWN4GnX1UfGd
USDJ-USD TKZUQTYAhH1LTG67QmhX4HxTWZdvLfH9d1
USDT-TRX TJL5M1QqL7oF2ceazAFJ2ump9jf87jUqnK
USDT-USD TT2ETLY1Mmx2DKYT9S6fMvKGPqbWH3LDEJ
WIN-TRX TP7aHYuXUkKPKsojs9BNJDVyAJeQ2KtfCj
WIN-USD TYYMqsRNZTwsiFkRtn2NewvXT9GnnsPBH9
WSTUSDT-TRX TZGEUihByCHG79Hbpider6pGZfY9S8ct6P

# 申请新交易对

如果您需要 WINkLink 提供新的交易对,请填写并提交申请表单 (opens new window)

# 部署价格服务

开发者也可以部署自己的价格服务,自定义价格来源和最少响应预言机个数。

生产环境情况下,应该需要多个预言机节点来喂价,然后通过聚合得到一个最终的价格。 但在测试的流程下,我们暂且只设置一个节点来喂价。简化测试展示流程。

# 部署喂价合约

TronUser 合约是 WINkLink 官方推出的聚合价格服务合约模板,该合约实现了 AggregatorInterface 接口,开发者可以直接使用。

合约代码位于 TronUser.sol (opens new window)

部署 TronUser 合约时需要在构造函数提供 WIN 代币地址和 WinkMid 合约地址。例如 Nile 测试网中,需要提供 (TNDSHKGBmgRx9mDYA9CnxPx55nu672yQw2, TFbci8j8Ja3hMLPsupsuYcUMsgXniG1TWb).

# 添加预言机节点以及 job ID

TronUser 合约部署完毕后,合约 owner 需要为其设置所聚合请求的预言机服务列表。使用如下接口:

function updateRequestDetails(uint128 _paymentAmount, uint128 _minimumResponses, address[] _oracles, bytes32[] _jobIds)

其中 _paymentAmount 表示每次更新调用所支付代币数量。

_oracles_jobIds 是一对等长列表,每组对应一个 WINkLink 预言机 job 唯一标识。

_minimumResponses 表示需要的最少响应预言机个数,必须大于等于 _oracles 长度。 例如可以设置要求至少 5/10 个预言机响应后,本次更新值才有效。

示例调用 updateRequestDetails(10, 1, ["TR9jYcLWAcQfbKcP5oau1ccSbeW7mdnqg8"], ["db22ccf4b4a14d0cae2a0757632e425d"]).

# 为合约转入 WIN 代币

TronUser 合约需要使用 transferAndCall 调用 Oracle 合约,所以合约账户需要有足够的 WIN 代币。 可以通过转账或测试网水龙头为合约转入若干 WIN 代币。

# 调用喂价合约

# 更新价格 requestRateUpdate

使用如下接口请求 WINkLink 预言机节点从外部数据源获取最新价格:

function requestRateUpdate() returns (bytes32)

接口返回 requestID. 通过 requestID 可以取消更新价格请求。

# 获取最新价格 latestAnswer

使用 AggregatorInterface 中的 latestAnswer() 调用可以获取最新价格。

TronScan 的合约信息页面可以直接调用该方法获得最新值。