@aurigami/sdk 1.6.4 → 1.6.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/ChangeLog.md +159 -0
  2. package/dist/SDK.d.ts +4 -7
  3. package/dist/abis/index.d.ts +14 -0
  4. package/dist/consts/constants.d.ts +2 -2
  5. package/dist/consts/dummy.d.ts +1 -2
  6. package/dist/contracts/{airdrop-lottery.d.ts → Airdrop.d.ts} +0 -5
  7. package/dist/contracts/MoneyMarket.d.ts +3 -4
  8. package/dist/contracts/Multicall.d.ts +1 -1
  9. package/dist/contracts/Papermill.d.ts +2 -7
  10. package/dist/contracts/Staking.d.ts +2 -5
  11. package/dist/contracts/index.d.ts +2 -1
  12. package/dist/contracts/misc.d.ts +26 -0
  13. package/dist/entities/auriEnv.d.ts +13 -0
  14. package/dist/entities/index.d.ts +1 -0
  15. package/dist/entities/tokenAmount.d.ts +1 -1
  16. package/dist/helpers/priceFetcher.d.ts +1 -1
  17. package/dist/helpers/transfer-event-query.d.ts +2 -2
  18. package/dist/index.d.ts +1 -1
  19. package/dist/sdk.cjs.development.js +579 -104416
  20. package/dist/sdk.cjs.development.js.map +1 -1
  21. package/dist/sdk.cjs.production.min.js +1 -1
  22. package/dist/sdk.cjs.production.min.js.map +1 -1
  23. package/dist/sdk.esm.js +582 -104421
  24. package/dist/sdk.esm.js.map +1 -1
  25. package/package.json +7 -6
  26. package/src/SDK.ts +23 -330
  27. package/src/abis/index.ts +30 -0
  28. package/src/consts/constants.ts +15 -16
  29. package/src/consts/dummy.ts +4 -14
  30. package/src/contracts/Airdrop.ts +80 -0
  31. package/src/contracts/MoneyMarket.ts +56 -160
  32. package/src/contracts/Multicall.ts +5 -10
  33. package/src/contracts/Papermill.ts +32 -113
  34. package/src/contracts/Referral.ts +4 -7
  35. package/src/contracts/Staking.ts +18 -59
  36. package/src/contracts/index.ts +2 -1
  37. package/src/contracts/misc.ts +281 -0
  38. package/src/entities/BlockchainEntity.ts +2 -6
  39. package/src/entities/auriEnv.ts +39 -0
  40. package/src/entities/index.ts +1 -0
  41. package/src/entities/token.ts +1 -1
  42. package/src/entities/tokenAmount.ts +4 -12
  43. package/src/helpers/aurora-api-helpers.ts +3 -6
  44. package/src/helpers/helpers.ts +5 -17
  45. package/src/helpers/priceFetcher.ts +21 -62
  46. package/src/helpers/transfer-event-query.ts +4 -6
  47. package/src/index.ts +1 -1
  48. package/src/types/index.ts +1 -1
  49. package/src/abis/Faucet.json +0 -157
  50. package/src/abis/IUniswapV2Pair.json +0 -663
  51. package/src/abis/Oracle.json +0 -247
  52. package/src/abis/dummy.json +0 -3
  53. package/src/contracts/airdrop-lottery.ts +0 -320
  54. package/src/misc/airdrop_misc/auTokensInfo.json +0 -34
  55. package/src/misc/airdrop_misc/whitelist.json +0 -102629
@@ -1,34 +1,22 @@
1
+ import AuriLensABI from '@aurigami/contracts/artifacts/contracts/AuriLens.sol/AuriLens.json';
2
+ import { IUniswapV2Pair, PriceOracle } from '@aurigami/contracts/typechain';
3
+ import axios from 'axios';
1
4
  import BigNumber from 'bignumber.js';
2
- import { Contract, providers, BigNumber as BN, ethers } from 'ethers';
5
+ import { BigNumber as BN, Contract, providers } from 'ethers';
6
+ import { AuriOracleABI, IUniswapV2PairABI } from '../abis';
3
7
  import {
4
8
  DECIMAL_PRECISION,
5
9
  HARDCODE_PRICE_TOKENS,
6
10
  networkAddresses,
7
11
  PRICE_WHITELISTED,
8
12
  } from '../consts/constants';
9
- import OracleABI from '../abis/Oracle.json';
10
- import {
11
- isSameAddress,
12
- decimalFactor,
13
- getDecimal,
14
- assert,
15
- devLog,
16
- } from './helpers';
17
- import { IUniswapV2Pair, PriceOracle } from '@aurigami/contracts/typechain';
18
13
  import { TokenAmount } from '../entities/tokenAmount';
19
14
  import { Address, TokenValuation } from '../types';
20
- import IUniswapV2PairABI from '../abis/IUniswapV2Pair.json';
21
- import AuriLensABI from '@aurigami/contracts/artifacts/contracts/AuriLens.sol/AuriLens.json';
22
- import axios from 'axios';
15
+ import { assert, decimalFactor, devLog, getDecimal, isSameAddress } from './helpers';
23
16
 
24
- const hardcodePLYPrice = true;
25
- export async function fetchPriceFromCoingeckoAPI(
26
- id: string
27
- ): Promise<BigNumber> {
17
+ export async function fetchPriceFromCoingeckoAPI(id: string): Promise<BigNumber> {
28
18
  const price = await axios
29
- .get(
30
- `https://api.coingecko.com/api/v3/simple/price?ids=${id}&vs_currencies=usd`
31
- )
19
+ .get(`https://api.coingecko.com/api/v3/simple/price?ids=${id}&vs_currencies=usd`)
32
20
  .then((res: any) => {
33
21
  return res.data;
34
22
  });
@@ -62,11 +50,7 @@ export async function fetchLPPositions(
62
50
  reserve1: BN;
63
51
  totalSupply: BN;
64
52
  }> {
65
- const LPContract = new Contract(
66
- LPAddress,
67
- IUniswapV2PairABI.abi,
68
- provider
69
- ) as IUniswapV2Pair;
53
+ const LPContract = new Contract(LPAddress, IUniswapV2PairABI.abi, provider) as IUniswapV2Pair;
70
54
  var promises: any[] = [];
71
55
  promises.push(LPContract.token0());
72
56
  promises.push(LPContract.token1());
@@ -99,10 +83,7 @@ export async function fetchLPPrice(
99
83
  // Should NOT call `fetchPrice`, it will cause an infinite loop
100
84
  // because the token can be PLY. To calculate PLY price, we need to
101
85
  // call `fetchPrice` again...
102
- const tokenPrice: BigNumber = await _fetchPrice(
103
- tokenReverse.address,
104
- provider
105
- );
86
+ const tokenPrice: BigNumber = await _fetchPrice(tokenReverse.address, provider);
106
87
  const tokenDecimal = getDecimal(tokenReverse.address);
107
88
 
108
89
  // reserveUSD will be divided by 10^tokenDecimal later for more precision
@@ -137,9 +118,7 @@ export async function fetchLPPrice(
137
118
  }
138
119
 
139
120
  function processPriceFromOracle(rawPrice: BN, underlyingDecimal: number) {
140
- return new BigNumber(rawPrice.toString()).div(
141
- decimalFactor(36 - underlyingDecimal)
142
- );
121
+ return new BigNumber(rawPrice.toString()).div(decimalFactor(36 - underlyingDecimal));
143
122
  }
144
123
  export async function fetchPriceFromOracle(
145
124
  auTokenAddress: Address,
@@ -148,16 +127,14 @@ export async function fetchPriceFromOracle(
148
127
  ): Promise<BigNumber> {
149
128
  const oracleContract: PriceOracle = new Contract(
150
129
  networkAddresses.misc.oracle,
151
- OracleABI.abi,
130
+ AuriOracleABI.abi,
152
131
  provider
153
132
  ) as PriceOracle;
154
133
  const rawPrice = await oracleContract.getUnderlyingPrice(auTokenAddress);
155
134
  return processPriceFromOracle(rawPrice, underlyingDecimal);
156
135
  }
157
136
 
158
- export async function fetchUnderlyingTokensPrices(
159
- provider: providers.Provider
160
- ): Promise<
137
+ export async function fetchUnderlyingTokensPrices(provider: providers.Provider): Promise<
161
138
  {
162
139
  auToken: string;
163
140
  underlyingPrice: BigNumber;
@@ -168,9 +145,7 @@ export async function fetchUnderlyingTokensPrices(
168
145
  AuriLensABI.abi,
169
146
  provider
170
147
  );
171
- const auTokenAddresses = networkAddresses.auTokens.map(
172
- (auToken) => auToken.address
173
- );
148
+ const auTokenAddresses = networkAddresses.auTokens.map((auToken) => auToken.address);
174
149
  const underlyingDecimals = networkAddresses.auTokens.map((auToken) =>
175
150
  getDecimal(auToken.underlying)
176
151
  );
@@ -178,10 +153,7 @@ export async function fetchUnderlyingTokensPrices(
178
153
  return rawPrices.map((res: any, ind: number) => {
179
154
  return {
180
155
  auToken: res.auToken,
181
- underlyingPrice: processPriceFromOracle(
182
- res.underlyingPrice,
183
- underlyingDecimals[ind]
184
- ),
156
+ underlyingPrice: processPriceFromOracle(res.underlyingPrice, underlyingDecimals[ind]),
185
157
  };
186
158
  });
187
159
  }
@@ -211,30 +183,21 @@ function shouldFetchFromCoingecko(address: string) {
211
183
  /**
212
184
  * Fetch price from Oracle or Coingecko
213
185
  */
214
- async function _fetchPrice(
215
- address: Address,
216
- provider: providers.Provider
217
- ): Promise<BigNumber> {
186
+ async function _fetchPrice(address: Address, provider: providers.Provider): Promise<BigNumber> {
218
187
  assert(
219
188
  PRICE_WHITELISTED.has(address.toLocaleLowerCase()),
220
189
  `Address ${address} is not whitelisted for price fetching`
221
190
  );
222
191
 
223
- if (isSameAddress(address, networkAddresses.tokens.stNEAR))
224
- return fetchStNEARPrice();
225
- if (shouldFetchFromCoingecko(address))
226
- return fetchPriceFromCoingecko(address);
192
+ if (isSameAddress(address, networkAddresses.tokens.stNEAR)) return fetchStNEARPrice();
193
+ if (shouldFetchFromCoingecko(address)) return fetchPriceFromCoingecko(address);
227
194
 
228
195
  const matchingAuToken = networkAddresses.auTokens.find((auToken) => {
229
196
  return isSameAddress(auToken.underlying, address);
230
197
  });
231
198
 
232
199
  if (matchingAuToken !== undefined) {
233
- return fetchPriceFromOracle(
234
- matchingAuToken.address,
235
- getDecimal(address),
236
- provider
237
- );
200
+ return fetchPriceFromOracle(matchingAuToken.address, getDecimal(address), provider);
238
201
  } else {
239
202
  throw Error(`Unable to fetch price for ${address}`);
240
203
  }
@@ -256,16 +219,12 @@ export async function fetchPrice(
256
219
  return _fetchPrice(address, provider);
257
220
  }
258
221
 
259
- export async function fetchPLYPrice(
260
- provider: providers.Provider
261
- ): Promise<BigNumber> {
222
+ export async function fetchPLYPrice(provider: providers.Provider): Promise<BigNumber> {
262
223
  //TODO: Fetch PLY price from CEX?
263
224
  return fetchToken0PriceByLP(networkAddresses.tokens.PLYWNEAR, provider);
264
225
  }
265
226
 
266
- export async function fetchPULPPrice(
267
- provider: providers.Provider
268
- ): Promise<BigNumber> {
227
+ export async function fetchPULPPrice(provider: providers.Provider): Promise<BigNumber> {
269
228
  //TODO: Calculate PULP price
270
229
  return new BigNumber(0);
271
230
  }
@@ -1,8 +1,8 @@
1
- import { BlockchainEntityRead } from '../entities/BlockchainEntity';
2
- import { NetworkConnection } from '../types';
3
- import { AuToken } from '@aurigami/contracts/typechain';
4
1
  import AuTokenABI from '@aurigami/contracts/artifacts/contracts/AuToken.sol/AuToken.json';
2
+ import { AuToken } from '@aurigami/contracts/typechain';
5
3
  import { BigNumber as BN, Contract } from 'ethers';
4
+ import { BlockchainEntityRead } from '../entities/BlockchainEntity';
5
+ import { NetworkConnection } from '../types';
6
6
 
7
7
  type SimpleTransfer = {
8
8
  from: string;
@@ -39,9 +39,7 @@ export class TransferEventQuery extends BlockchainEntityRead {
39
39
 
40
40
  const events = (
41
41
  await Promise.all(
42
- filters.map((filter) =>
43
- this.auToken.queryFilter(filter, fromBlock, toBlock)
44
- )
42
+ filters.map((filter) => this.auToken.queryFilter(filter, fromBlock, toBlock))
45
43
  )
46
44
  ).flat();
47
45
 
package/src/index.ts CHANGED
@@ -9,5 +9,5 @@ export * from './consts';
9
9
  export * from './contracts';
10
10
  export * from './entities';
11
11
  export * from './helpers';
12
- export * from './types';
13
12
  export * from './SDK';
13
+ export * from './types';
@@ -1,4 +1,4 @@
1
- import type { BigNumber, providers, Signer } from 'ethers';
1
+ import type { providers, Signer } from 'ethers';
2
2
  import { TokenAmount } from '../entities/tokenAmount';
3
3
 
4
4
  export enum ComptrollerRewardType {
@@ -1,157 +0,0 @@
1
- {
2
- "_format": "hh-sol-artifact-1",
3
- "contractName": "Faucet",
4
- "sourceName": "contracts/mock/Faucet.sol",
5
- "abi": [
6
- {
7
- "inputs": [
8
- {
9
- "components": [
10
- {
11
- "internalType": "address",
12
- "name": "token",
13
- "type": "address"
14
- },
15
- {
16
- "internalType": "uint256",
17
- "name": "dripAmount",
18
- "type": "uint256"
19
- }
20
- ],
21
- "internalType": "struct Faucet.TokenConfig[]",
22
- "name": "_testTokensConfigs",
23
- "type": "tuple[]"
24
- }
25
- ],
26
- "stateMutability": "nonpayable",
27
- "type": "constructor"
28
- },
29
- {
30
- "anonymous": false,
31
- "inputs": [
32
- {
33
- "indexed": true,
34
- "internalType": "address",
35
- "name": "previousOwner",
36
- "type": "address"
37
- },
38
- {
39
- "indexed": true,
40
- "internalType": "address",
41
- "name": "newOwner",
42
- "type": "address"
43
- }
44
- ],
45
- "name": "OwnershipTransferred",
46
- "type": "event"
47
- },
48
- {
49
- "inputs": [],
50
- "name": "drip",
51
- "outputs": [],
52
- "stateMutability": "nonpayable",
53
- "type": "function"
54
- },
55
- {
56
- "inputs": [
57
- {
58
- "internalType": "address",
59
- "name": "",
60
- "type": "address"
61
- }
62
- ],
63
- "name": "dripAmounts",
64
- "outputs": [
65
- {
66
- "internalType": "uint256",
67
- "name": "",
68
- "type": "uint256"
69
- }
70
- ],
71
- "stateMutability": "view",
72
- "type": "function"
73
- },
74
- {
75
- "inputs": [],
76
- "name": "owner",
77
- "outputs": [
78
- {
79
- "internalType": "address",
80
- "name": "",
81
- "type": "address"
82
- }
83
- ],
84
- "stateMutability": "view",
85
- "type": "function"
86
- },
87
- {
88
- "inputs": [],
89
- "name": "renounceOwnership",
90
- "outputs": [],
91
- "stateMutability": "nonpayable",
92
- "type": "function"
93
- },
94
- {
95
- "inputs": [
96
- {
97
- "internalType": "uint256",
98
- "name": "",
99
- "type": "uint256"
100
- }
101
- ],
102
- "name": "testTokens",
103
- "outputs": [
104
- {
105
- "internalType": "address",
106
- "name": "",
107
- "type": "address"
108
- }
109
- ],
110
- "stateMutability": "view",
111
- "type": "function"
112
- },
113
- {
114
- "inputs": [
115
- {
116
- "internalType": "address",
117
- "name": "newOwner",
118
- "type": "address"
119
- }
120
- ],
121
- "name": "transferOwnership",
122
- "outputs": [],
123
- "stateMutability": "nonpayable",
124
- "type": "function"
125
- },
126
- {
127
- "inputs": [
128
- {
129
- "components": [
130
- {
131
- "internalType": "address",
132
- "name": "token",
133
- "type": "address"
134
- },
135
- {
136
- "internalType": "uint256",
137
- "name": "dripAmount",
138
- "type": "uint256"
139
- }
140
- ],
141
- "internalType": "struct Faucet.TokenConfig[]",
142
- "name": "_testTokensConfigs",
143
- "type": "tuple[]"
144
- }
145
- ],
146
- "name": "updateTokenConfigs",
147
- "outputs": [],
148
- "stateMutability": "nonpayable",
149
- "type": "function"
150
- }
151
- ],
152
- "bytecode": "0x60806040523480156200001157600080fd5b5060405162000c4038038062000c40833981016040819052620000349162000272565b6200003f33620000f9565b60005b8151811015620000f1576200007d82828151811062000065576200006562000363565b6020026020010151600001516200014960201b60201c565b81818151811062000092576200009262000363565b60200260200101516020015160026000848481518110620000b757620000b762000363565b602090810291909101810151516001600160a01b031682528101919091526040016000205580620000e88162000379565b91505062000042565b5050620003a3565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60005b600154811015620001ac57816001600160a01b03166001828154811062000177576200017762000363565b6000918252602090912001546001600160a01b0316141562000197575050565b80620001a38162000379565b9150506200014c565b506001805480820182556000919091527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60180546001600160a01b0319166001600160a01b0392909216919091179055565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b0381118282101715620002395762000239620001fe565b60405290565b604051601f8201601f191681016001600160401b03811182821017156200026a576200026a620001fe565b604052919050565b600060208083850312156200028657600080fd5b82516001600160401b03808211156200029e57600080fd5b818501915085601f830112620002b357600080fd5b815181811115620002c857620002c8620001fe565b620002d8848260051b016200023f565b818152848101925060069190911b830184019087821115620002f957600080fd5b928401925b81841015620003585760408489031215620003195760008081fd5b6200032362000214565b84516001600160a01b03811681146200033c5760008081fd5b81528486015186820152835260409093019291840191620002fe565b979650505050505050565b634e487b7160e01b600052603260045260246000fd5b60006000198214156200039c57634e487b7160e01b600052601160045260246000fd5b5060010190565b61088d80620003b36000396000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c80639f678cca1161005b5780639f678cca146100c9578063b9293286146100d1578063e980416a146100e4578063f2fde38b1461011257600080fd5b8063715018a614610082578063741f83ef1461008c5780638da5cb5b1461009f575b600080fd5b61008a610125565b005b61008a61009a366004610697565b610190565b6000546001600160a01b03165b6040516001600160a01b0390911681526020015b60405180910390f35b61008a61028b565b6100ac6100df36600461076b565b6103a2565b6101046100f2366004610784565b60026020526000908152604090205481565b6040519081526020016100c0565b61008a610120366004610784565b6103cc565b6000546001600160a01b031633146101845760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b61018e60006104a7565b565b6000546001600160a01b031633146101ea5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161017b565b60005b81518110156102875761021c82828151811061020b5761020b6107a6565b60200260200101516000015161050f565b81818151811061022e5761022e6107a6565b60200260200101516020015160026000848481518110610250576102506107a6565b602090810291909101810151516001600160a01b03168252810191909152604001600020558061027f816107d5565b9150506101ed565b5050565b60005b60015481101561039f57600181815481106102ab576102ab6107a6565b6000918252602082200154600180546001600160a01b039092169263a9059cbb92339260029291879081106102e2576102e26107a6565b6000918252602080832091909101546001600160a01b039081168452908301939093526040918201902054905160e085901b7fffffffff0000000000000000000000000000000000000000000000000000000016815292909116600483015260248201526044016020604051808303816000875af1158015610368573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061038c9190610835565b5080610397816107d5565b91505061028e565b50565b600181815481106103b257600080fd5b6000918252602090912001546001600160a01b0316905081565b6000546001600160a01b031633146104265760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161017b565b6001600160a01b0381166104a25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161017b565b61039f815b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60005b60015481101561056a57816001600160a01b031660018281548110610539576105396107a6565b6000918252602090912001546001600160a01b03161415610558575050565b80610562816107d5565b915050610512565b506001805480820182556000919091527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715610626576106266105d4565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715610673576106736105d4565b604052919050565b80356001600160a01b038116811461069257600080fd5b919050565b600060208083850312156106aa57600080fd5b823567ffffffffffffffff808211156106c257600080fd5b818501915085601f8301126106d657600080fd5b8135818111156106e8576106e86105d4565b6106f6848260051b0161062c565b818152848101925060069190911b83018401908782111561071657600080fd5b928401925b8184101561076057604084890312156107345760008081fd5b61073c610603565b6107458561067b565b8152848601358682015283526040909301929184019161071b565b979650505050505050565b60006020828403121561077d57600080fd5b5035919050565b60006020828403121561079657600080fd5b61079f8261067b565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561082e577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b60006020828403121561084757600080fd5b8151801515811461079f57600080fdfea26469706673582212200b56248e3867f8c6afaf02091fa7b57d47168960cfdfc133122e492377adaa3264736f6c634300080b0033",
153
- "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061007d5760003560e01c80639f678cca1161005b5780639f678cca146100c9578063b9293286146100d1578063e980416a146100e4578063f2fde38b1461011257600080fd5b8063715018a614610082578063741f83ef1461008c5780638da5cb5b1461009f575b600080fd5b61008a610125565b005b61008a61009a366004610697565b610190565b6000546001600160a01b03165b6040516001600160a01b0390911681526020015b60405180910390f35b61008a61028b565b6100ac6100df36600461076b565b6103a2565b6101046100f2366004610784565b60026020526000908152604090205481565b6040519081526020016100c0565b61008a610120366004610784565b6103cc565b6000546001600160a01b031633146101845760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b61018e60006104a7565b565b6000546001600160a01b031633146101ea5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161017b565b60005b81518110156102875761021c82828151811061020b5761020b6107a6565b60200260200101516000015161050f565b81818151811061022e5761022e6107a6565b60200260200101516020015160026000848481518110610250576102506107a6565b602090810291909101810151516001600160a01b03168252810191909152604001600020558061027f816107d5565b9150506101ed565b5050565b60005b60015481101561039f57600181815481106102ab576102ab6107a6565b6000918252602082200154600180546001600160a01b039092169263a9059cbb92339260029291879081106102e2576102e26107a6565b6000918252602080832091909101546001600160a01b039081168452908301939093526040918201902054905160e085901b7fffffffff0000000000000000000000000000000000000000000000000000000016815292909116600483015260248201526044016020604051808303816000875af1158015610368573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061038c9190610835565b5080610397816107d5565b91505061028e565b50565b600181815481106103b257600080fd5b6000918252602090912001546001600160a01b0316905081565b6000546001600160a01b031633146104265760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161017b565b6001600160a01b0381166104a25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161017b565b61039f815b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60005b60015481101561056a57816001600160a01b031660018281548110610539576105396107a6565b6000918252602090912001546001600160a01b03161415610558575050565b80610562816107d5565b915050610512565b506001805480820182556000919091527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715610626576106266105d4565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715610673576106736105d4565b604052919050565b80356001600160a01b038116811461069257600080fd5b919050565b600060208083850312156106aa57600080fd5b823567ffffffffffffffff808211156106c257600080fd5b818501915085601f8301126106d657600080fd5b8135818111156106e8576106e86105d4565b6106f6848260051b0161062c565b818152848101925060069190911b83018401908782111561071657600080fd5b928401925b8184101561076057604084890312156107345760008081fd5b61073c610603565b6107458561067b565b8152848601358682015283526040909301929184019161071b565b979650505050505050565b60006020828403121561077d57600080fd5b5035919050565b60006020828403121561079657600080fd5b61079f8261067b565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561082e577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b60006020828403121561084757600080fd5b8151801515811461079f57600080fdfea26469706673582212200b56248e3867f8c6afaf02091fa7b57d47168960cfdfc133122e492377adaa3264736f6c634300080b0033",
154
- "linkReferences": {},
155
- "deployedLinkReferences": {}
156
- }
157
-