@@ -3,6 +3,9 @@ import { Contract } from "ethers";
33import { Character } from "./types" ;
44import { getUnicodeData } from "./unicode-data" ;
55
6+ // roughly the number of characters we can set within the gas limit
7+ const BATCH_SIZE = 125 ;
8+
69const charToParameter = ( c : Character ) =>
710 Object . values ( {
811 name : c . name ,
@@ -25,7 +28,14 @@ export const initializeUnicodeData = async (contract: Contract) => {
2528 const characters = await getUnicodeData ( ) ;
2629
2730 const total = characters . length ;
31+ const numBatches = total / BATCH_SIZE ;
2832 let count = 0 ;
33+ let failed = false ;
34+ let batch = {
35+ codes : [ ] ,
36+ data : [ ] ,
37+ } ;
38+
2939 for ( let char of characters ) {
3040 // keep track of progress
3141 count ++ ;
@@ -38,11 +48,42 @@ export const initializeUnicodeData = async (contract: Contract) => {
3848
3949 // set each character
4050 const data = charToParameter ( char ) ;
51+
52+ // @ts -ignore
53+ batch . codes = [ ...batch . codes , char . code ] ;
54+ // @ts -ignore
55+ batch . data = [ ...batch . data , data ] ;
56+
57+ if ( batch . codes . length < BATCH_SIZE ) {
58+ continue ;
59+ }
60+
4161 try {
42- await contract . set ( char . code , data ) ;
62+ await contract . setBatch ( batch . codes , batch . data ) ;
63+ // reset
64+ batch = {
65+ codes : [ ] ,
66+ data : [ ] ,
67+ } ;
4368 } catch ( err ) {
44- console . log ( "failed to set:" , char ) ;
69+ console . log ( err ) ;
70+ console . log ( "failed to set batch:" , batch ) ;
71+ failed = true ;
4572 break ;
4673 }
4774 }
75+
76+ // set final batch if it exists
77+ if ( ! batch . codes . length || failed ) return ;
78+
79+ try {
80+ await contract . setBatch ( batch . codes , batch . data ) ;
81+ // reset
82+ batch = {
83+ codes : [ ] ,
84+ data : [ ] ,
85+ } ;
86+ } catch ( err ) {
87+ console . log ( "failed to set final batch:" , batch ) ;
88+ }
4889} ;
0 commit comments